@reforma/components 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/RichInput/RichInput.d.ts +1 -1
  2. package/dist/RichInput/RichInput.d.ts.map +1 -1
  3. package/dist/RichInput/RichInput.js +126 -123
  4. package/dist/RichInput/RichInput.js.map +1 -1
  5. package/dist/chat/ComposerBanner/ComposerBanner.d.ts +6 -1
  6. package/dist/chat/ComposerBanner/ComposerBanner.d.ts.map +1 -1
  7. package/dist/chat/ComposerBanner/ComposerBanner.js +60 -40
  8. package/dist/chat/ComposerBanner/ComposerBanner.js.map +1 -1
  9. package/dist/chat/ComposerBanner/ComposerBanner.module.css +1 -1
  10. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js +13 -9
  11. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js.map +1 -1
  12. package/dist/chat/Conversation/ConversationPendingLoader.d.ts.map +1 -1
  13. package/dist/chat/Conversation/ConversationPendingLoader.js +1 -1
  14. package/dist/chat/Conversation/ConversationPendingLoader.js.map +1 -1
  15. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts +1 -1
  16. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts.map +1 -1
  17. package/dist/chat/Message/normalize/normalizeMessageParts.js +1 -1
  18. package/dist/chat/Message/normalize/normalizeMessageParts.js.map +1 -1
  19. package/dist/chat/Message/parts/MessagePart.d.ts.map +1 -1
  20. package/dist/chat/Message/parts/MessagePart.js +1 -1
  21. package/dist/chat/Message/parts/MessagePart.js.map +1 -1
  22. package/dist/chat/Message/parts/backgroundResultPart.js +1 -1
  23. package/dist/chat/Message/parts/backgroundResultPart.js.map +1 -1
  24. package/dist/chat/Message/parts/collectMessageSources.d.ts +1 -1
  25. package/dist/chat/Message/parts/collectMessageSources.d.ts.map +1 -1
  26. package/dist/chat/Message/parts/collectMessageSources.js +1 -1
  27. package/dist/chat/Message/parts/collectMessageSources.js.map +1 -1
  28. package/dist/chat/Message/parts/contextCompactionPart.js +1 -1
  29. package/dist/chat/Message/parts/contextCompactionPart.js.map +1 -1
  30. package/dist/chat/Message/segments/analyzeGroupedSegment.js +5 -5
  31. package/dist/chat/Message/segments/analyzeGroupedSegment.js.map +1 -1
  32. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js +1 -1
  33. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js.map +1 -1
  34. package/dist/chat/Message/turn/workedCollapse.js +1 -1
  35. package/dist/chat/Message/turn/workedCollapse.js.map +1 -1
  36. package/dist/chat/Tool/Tool.js +1 -1
  37. package/dist/chat/Tool/Tool.js.map +1 -1
  38. package/dist/chat/Tool/agent/AgentTool.d.ts.map +1 -1
  39. package/dist/chat/Tool/agent/AgentTool.js +73 -73
  40. package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
  41. package/dist/chat/Tool/bash/BashTool.d.ts.map +1 -1
  42. package/dist/chat/Tool/bash/BashTool.js +1 -1
  43. package/dist/chat/Tool/bash/BashTool.js.map +1 -1
  44. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js +1 -1
  45. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js.map +1 -1
  46. package/dist/chat/Tool/default/Default.d.ts.map +1 -1
  47. package/dist/chat/Tool/default/Default.js +1 -1
  48. package/dist/chat/Tool/default/Default.js.map +1 -1
  49. package/dist/chat/Tool/dev-server/DevServerRestartTool.js +1 -1
  50. package/dist/chat/Tool/dev-server/DevServerRestartTool.js.map +1 -1
  51. package/dist/chat/Tool/dev-server/DevServerStatusTool.js +1 -1
  52. package/dist/chat/Tool/dev-server/DevServerStatusTool.js.map +1 -1
  53. package/dist/chat/Tool/edit/EditTool.js +1 -1
  54. package/dist/chat/Tool/edit/EditTool.js.map +1 -1
  55. package/dist/chat/Tool/fetch/FetchTool.js +1 -1
  56. package/dist/chat/Tool/fetch/FetchTool.js.map +1 -1
  57. package/dist/chat/Tool/fileChangesFromToolParts.js +1 -1
  58. package/dist/chat/Tool/fileChangesFromToolParts.js.map +1 -1
  59. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js +1 -1
  60. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js.map +1 -1
  61. package/dist/chat/Tool/get-errors/GetErrorsTool.js +1 -1
  62. package/dist/chat/Tool/get-errors/GetErrorsTool.js.map +1 -1
  63. package/dist/chat/Tool/glob/GlobTool.js +1 -1
  64. package/dist/chat/Tool/glob/GlobTool.js.map +1 -1
  65. package/dist/chat/Tool/grep/GrepTool.js +1 -1
  66. package/dist/chat/Tool/grep/GrepTool.js.map +1 -1
  67. package/dist/chat/Tool/helpers.d.ts +1 -1
  68. package/dist/chat/Tool/helpers.d.ts.map +1 -1
  69. package/dist/chat/Tool/helpers.js +1 -1
  70. package/dist/chat/Tool/helpers.js.map +1 -1
  71. package/dist/chat/Tool/image-asset/ImageAssetTool.js +1 -1
  72. package/dist/chat/Tool/image-asset/ImageAssetTool.js.map +1 -1
  73. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js +1 -1
  74. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js.map +1 -1
  75. package/dist/chat/Tool/install-plugin/InstallPlugin.js +1 -1
  76. package/dist/chat/Tool/install-plugin/InstallPlugin.js.map +1 -1
  77. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts +3 -1
  78. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts.map +1 -1
  79. package/dist/chat/Tool/integration-card/IntegrationActionCard.js +88 -82
  80. package/dist/chat/Tool/integration-card/IntegrationActionCard.js.map +1 -1
  81. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js +1 -1
  82. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js.map +1 -1
  83. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js +1 -1
  84. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js.map +1 -1
  85. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js +1 -1
  86. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js.map +1 -1
  87. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js +1 -1
  88. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js.map +1 -1
  89. package/dist/chat/Tool/mcp-tools/McpAuth.js +1 -1
  90. package/dist/chat/Tool/mcp-tools/McpAuth.js.map +1 -1
  91. package/dist/chat/Tool/memory/MemoryTool.js +1 -1
  92. package/dist/chat/Tool/memory/MemoryTool.js.map +1 -1
  93. package/dist/chat/Tool/move-file/MoveFileTool.js +1 -1
  94. package/dist/chat/Tool/move-file/MoveFileTool.js.map +1 -1
  95. package/dist/chat/Tool/plan/CreatePlanTool.js +1 -1
  96. package/dist/chat/Tool/plan/CreatePlanTool.js.map +1 -1
  97. package/dist/chat/Tool/preamble/PreambleTool.js +1 -1
  98. package/dist/chat/Tool/preamble/PreambleTool.js.map +1 -1
  99. package/dist/chat/Tool/project-build/BuildTool.js +1 -1
  100. package/dist/chat/Tool/project-build/BuildTool.js.map +1 -1
  101. package/dist/chat/Tool/project-env/ProjectEnvTool.js +1 -1
  102. package/dist/chat/Tool/project-env/ProjectEnvTool.js.map +1 -1
  103. package/dist/chat/Tool/read/normalizeReadTools.js +1 -1
  104. package/dist/chat/Tool/read/normalizeReadTools.js.map +1 -1
  105. package/dist/chat/Tool/read-lints/ReadLintsTool.js +1 -1
  106. package/dist/chat/Tool/read-lints/ReadLintsTool.js.map +1 -1
  107. package/dist/chat/Tool/remove-file/RemoveFileTool.js +1 -1
  108. package/dist/chat/Tool/remove-file/RemoveFileTool.js.map +1 -1
  109. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js +1 -1
  110. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js.map +1 -1
  111. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js +3 -3
  112. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js.map +1 -1
  113. package/dist/chat/Tool/skill/SkillTool.js +1 -1
  114. package/dist/chat/Tool/skill/SkillTool.js.map +1 -1
  115. package/dist/chat/Tool/waiting/WaitingTool.js +1 -1
  116. package/dist/chat/Tool/waiting/WaitingTool.js.map +1 -1
  117. package/dist/chat/Tool/web-search/WebSearchTool.js +1 -1
  118. package/dist/chat/Tool/web-search/WebSearchTool.js.map +1 -1
  119. package/package.json +4 -4
@@ -1,5 +1,5 @@
1
1
  import { Layers as f } from "@reforma/icons/14";
2
- import { isToolUIPart as g, getToolName as m } from "ai";
2
+ import { isToolUIPart as g, getToolName as m } from "@reforma/types";
3
3
  import { Show as s } from "../../../Show/Show.js";
4
4
  import { Text as a } from "../../../Text/Text.js";
5
5
  import { getToolFailureRowState as v, isToolInvocationInProgress as h } from "../helpers.js";
@@ -1 +1 @@
1
- {"version":3,"file":"BuildTool.js","sources":["../../../../src/chat/Tool/project-build/BuildTool.tsx"],"sourcesContent":["import { Layers } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { BuildToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n inProgress: 'Building project',\n pending: 'Build project',\n success: 'Project built',\n failed: 'Build failed',\n devStartFailed: 'Dev server did not start',\n} as const;\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as BuildToolOutput).error;\n\n return typeof error === 'string' && error.length > 0 ? error : undefined;\n}\n\nfunction outputLog(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const logTail = (output as BuildToolOutput).logTail;\n\n return typeof logTail === 'string' && logTail.length > 0 ? logTail : undefined;\n}\n\nfunction buildTitle(state: string, output: unknown, useFailureLabel: boolean): string {\n if (useFailureLabel) {\n return labels.failed;\n }\n\n const parsed = output != null && typeof output === 'object' ? output as BuildToolOutput : undefined;\n\n if (parsed?.stage === 'dev-start' && parsed.ok === true) {\n return labels.devStartFailed;\n }\n\n if (outputError(output) || parsed?.ok === false) {\n return labels.failed;\n }\n\n if (state === 'output-available') {\n return labels.success;\n }\n\n if (isToolInvocationInProgress(state)) {\n return labels.inProgress;\n }\n\n return labels.pending;\n}\n\n/** Build: production build row. The log tail is the failure detail. */\nexport function BuildTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Build') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const logTail = part.state === 'output-available' ? outputLog(part.output) : undefined;\n const title = buildTitle(part.state, part.output, failure.useFailureLabel);\n const detail = logTail ?? logicalError;\n\n return (\n <ToolShell data-slot=\"build-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip ?? logicalError }\n title={ title }\n titleInProgress={ labels.inProgress }\n icon={ <Layers aria-hidden /> }\n />\n\n <Show when={ detail && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\" whitespace=\"pre-line\">{detail}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["labels","outputError","output","error","outputLog","logTail","buildTitle","state","useFailureLabel","parsed","isToolInvocationInProgress","BuildTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","detail","ToolShell","_jsx","ToolShellHeader","Layers","Show","ToolShellFooter","Text"],"mappings":";;;;;;;AAOA,MAAMA,IAAS;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,gBAAgB;AAClB;AACA,SAASC,EAAYC,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMC,IAAQD,EAAO;AACrB,SAAO,OAAOC,KAAU,YAAYA,EAAM,SAAS,IAAIA,IAAQ;AACjE;AACA,SAASC,EAAUF,GAAQ;AACzB,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMG,IAAUH,EAAO;AACvB,SAAO,OAAOG,KAAY,YAAYA,EAAQ,SAAS,IAAIA,IAAU;AACvE;AACA,SAASC,EAAWC,GAAOL,GAAQM,GAAiB;AAClD,MAAIA;AACF,WAAOR,EAAO;AAEhB,QAAMS,IAASP,KAAU,QAAQ,OAAOA,KAAW,WAAWA,IAAS;AACvE,SAAIO,GAAQ,UAAU,eAAeA,EAAO,OAAO,KAC1CT,EAAO,iBAEZC,EAAYC,CAAM,KAAKO,GAAQ,OAAO,KACjCT,EAAO,SAEZO,MAAU,qBACLP,EAAO,UAEZU,EAA2BH,CAAK,IAC3BP,EAAO,aAETA,EAAO;AAChB;AAGO,SAASW,EAAU;AAAA,EACxB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAeL,EAAK,UAAU,qBAAqBX,EAAYW,EAAK,MAAM,IAAI,QAC9EP,IAAUO,EAAK,UAAU,qBAAqBR,EAAUQ,EAAK,MAAM,IAAI,QACvEM,IAAQZ,EAAWM,EAAK,OAAOA,EAAK,QAAQG,EAAQ,eAAe,GACnEI,IAASd,KAAWY;AAC1B,2BAA0BG,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOV,EAAK;AAAA,MACZ,cAAcG,EAAQ,WAAWE;AAAA,MACjC,OAAAC;AAAA,MACA,iBAAiBlB,EAAO;AAAA,MACxB,wBAAwBuB,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBF,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAML,KAAU,CAACJ,EAAQ;AAAA,MACzB,4BAA4BU,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAUP;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBE,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMT,EAAQ;AAAA,MACd,4BAA4BU,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUX,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"BuildTool.js","sources":["../../../../src/chat/Tool/project-build/BuildTool.tsx"],"sourcesContent":["import { Layers } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { BuildToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n inProgress: 'Building project',\n pending: 'Build project',\n success: 'Project built',\n failed: 'Build failed',\n devStartFailed: 'Dev server did not start',\n} as const;\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as BuildToolOutput).error;\n\n return typeof error === 'string' && error.length > 0 ? error : undefined;\n}\n\nfunction outputLog(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const logTail = (output as BuildToolOutput).logTail;\n\n return typeof logTail === 'string' && logTail.length > 0 ? logTail : undefined;\n}\n\nfunction buildTitle(state: string, output: unknown, useFailureLabel: boolean): string {\n if (useFailureLabel) {\n return labels.failed;\n }\n\n const parsed = output != null && typeof output === 'object' ? output as BuildToolOutput : undefined;\n\n if (parsed?.stage === 'dev-start' && parsed.ok === true) {\n return labels.devStartFailed;\n }\n\n if (outputError(output) || parsed?.ok === false) {\n return labels.failed;\n }\n\n if (state === 'output-available') {\n return labels.success;\n }\n\n if (isToolInvocationInProgress(state)) {\n return labels.inProgress;\n }\n\n return labels.pending;\n}\n\n/** Build: production build row. The log tail is the failure detail. */\nexport function BuildTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Build') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const logTail = part.state === 'output-available' ? outputLog(part.output) : undefined;\n const title = buildTitle(part.state, part.output, failure.useFailureLabel);\n const detail = logTail ?? logicalError;\n\n return (\n <ToolShell data-slot=\"build-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip ?? logicalError }\n title={ title }\n titleInProgress={ labels.inProgress }\n icon={ <Layers aria-hidden /> }\n />\n\n <Show when={ detail && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\" whitespace=\"pre-line\">{detail}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["labels","outputError","output","error","outputLog","logTail","buildTitle","state","useFailureLabel","parsed","isToolInvocationInProgress","BuildTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","detail","ToolShell","_jsx","ToolShellHeader","Layers","Show","ToolShellFooter","Text"],"mappings":";;;;;;;AAOA,MAAMA,IAAS;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,gBAAgB;AAClB;AACA,SAASC,EAAYC,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMC,IAAQD,EAAO;AACrB,SAAO,OAAOC,KAAU,YAAYA,EAAM,SAAS,IAAIA,IAAQ;AACjE;AACA,SAASC,EAAUF,GAAQ;AACzB,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMG,IAAUH,EAAO;AACvB,SAAO,OAAOG,KAAY,YAAYA,EAAQ,SAAS,IAAIA,IAAU;AACvE;AACA,SAASC,EAAWC,GAAOL,GAAQM,GAAiB;AAClD,MAAIA;AACF,WAAOR,EAAO;AAEhB,QAAMS,IAASP,KAAU,QAAQ,OAAOA,KAAW,WAAWA,IAAS;AACvE,SAAIO,GAAQ,UAAU,eAAeA,EAAO,OAAO,KAC1CT,EAAO,iBAEZC,EAAYC,CAAM,KAAKO,GAAQ,OAAO,KACjCT,EAAO,SAEZO,MAAU,qBACLP,EAAO,UAEZU,EAA2BH,CAAK,IAC3BP,EAAO,aAETA,EAAO;AAChB;AAGO,SAASW,EAAU;AAAA,EACxB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAeL,EAAK,UAAU,qBAAqBX,EAAYW,EAAK,MAAM,IAAI,QAC9EP,IAAUO,EAAK,UAAU,qBAAqBR,EAAUQ,EAAK,MAAM,IAAI,QACvEM,IAAQZ,EAAWM,EAAK,OAAOA,EAAK,QAAQG,EAAQ,eAAe,GACnEI,IAASd,KAAWY;AAC1B,2BAA0BG,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOV,EAAK;AAAA,MACZ,cAAcG,EAAQ,WAAWE;AAAA,MACjC,OAAAC;AAAA,MACA,iBAAiBlB,EAAO;AAAA,MACxB,wBAAwBuB,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBF,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAML,KAAU,CAACJ,EAAQ;AAAA,MACzB,4BAA4BU,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAUP;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBE,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMT,EAAQ;AAAA,MACd,4BAA4BU,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUX,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Terminal as c } from "@reforma/icons/14";
2
- import { isToolUIPart as g, getToolName as b } from "ai";
2
+ import { isToolUIPart as g, getToolName as b } from "@reforma/types";
3
3
  import { Show as s } from "../../../Show/Show.js";
4
4
  import { Text as m } from "../../../Text/Text.js";
5
5
  import { getToolFailureRowState as f, isToolInvocationInProgress as S } from "../helpers.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectEnvTool.js","sources":["../../../../src/chat/Tool/project-env/ProjectEnvTool.tsx"],"sourcesContent":["import { Terminal } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { ProjectEnvToolInput, ProjectEnvToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction asInput(input: unknown): ProjectEnvToolInput | undefined {\n if (input == null || typeof input !== 'object') {\n return undefined;\n }\n\n const action = (input as ProjectEnvToolInput).action;\n\n if (action !== 'list' && action !== 'set' && action !== 'remove') {\n return undefined;\n }\n\n return input as ProjectEnvToolInput;\n}\n\nfunction asOutput(output: unknown): ProjectEnvToolOutput | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n return output as ProjectEnvToolOutput;\n}\n\nfunction outputError(output: ProjectEnvToolOutput | undefined): string | undefined {\n const error = output?.error;\n\n return typeof error === 'string' && error.length > 0 ? error : undefined;\n}\n\nfunction variableKey(\n input: ProjectEnvToolInput | undefined,\n output: ProjectEnvToolOutput | undefined\n): string | undefined {\n const key = output?.key ?? input?.key;\n\n if (typeof key !== 'string') {\n return undefined;\n }\n\n const trimmed = key.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction projectEnvTitles(\n state: string,\n input: ProjectEnvToolInput | undefined,\n output: ProjectEnvToolOutput | undefined,\n useFailureLabel: boolean\n): { title: string; titleInProgress: string } {\n const action = input?.action;\n const key = variableKey(input, output);\n const failed = useFailureLabel || Boolean(outputError(output));\n\n if (action === 'list') {\n if (failed) {\n return {\n title: 'Couldn\\'t list environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (state === 'output-available') {\n const count = output?.variables?.length;\n\n if (count === 0) {\n return {\n title: 'No environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (count === 1) {\n return {\n title: 'Listed 1 environment variable',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (count != null) {\n return {\n title: `Listed ${ count } environment variables`,\n titleInProgress: 'Listing environment variables',\n };\n }\n }\n\n return {\n title: 'List environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (action === 'remove') {\n if (failed) {\n return {\n title: key ? `Couldn't remove ${ key }` : 'Couldn\\'t remove environment variable',\n titleInProgress: key ? `Removing ${ key }` : 'Removing environment variable',\n };\n }\n\n return {\n title: state === 'output-available'\n ? (key ? `Removed ${ key }` : 'Removed environment variable')\n : (key ? `Remove ${ key }` : 'Remove environment variable'),\n titleInProgress: key ? `Removing ${ key }` : 'Removing environment variable',\n };\n }\n\n if (failed) {\n return {\n title: key ? `Couldn't save ${ key }` : 'Couldn\\'t save environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (state === 'output-available' && output?.created) {\n return {\n title: key ? `Added ${ key }` : 'Added environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (state === 'output-available' && output?.updated) {\n return {\n title: key ? `Updated ${ key }` : 'Updated environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (isToolInvocationInProgress(state)) {\n return {\n title: key ? `Set ${ key }` : 'Set environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n return {\n title: key ? `Set ${ key }` : 'Set environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n}\n\n/** ProjectEnv: label-only row for list / set / remove. Never shows values. */\nexport function ProjectEnvTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'ProjectEnv') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const input = asInput(part.input);\n const output = part.state === 'output-available' ? asOutput(part.output) : undefined;\n const logicalError = outputError(output);\n const { title, titleInProgress } = projectEnvTitles(\n part.state,\n input,\n output,\n failure.useFailureLabel\n );\n\n return (\n <ToolShell data-slot=\"project-env-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n failed={ logicalError ? true : undefined }\n title={ title }\n titleInProgress={ titleInProgress }\n icon={ <Terminal aria-hidden /> }\n />\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":["asInput","input","action","asOutput","output","outputError","error","variableKey","key","trimmed","projectEnvTitles","state","useFailureLabel","failed","count","isToolInvocationInProgress","ProjectEnvTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","titleInProgress","ToolShell","_jsx","ToolShellHeader","Terminal","Show","ToolShellFooter","Text"],"mappings":"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"}
1
+ {"version":3,"file":"ProjectEnvTool.js","sources":["../../../../src/chat/Tool/project-env/ProjectEnvTool.tsx"],"sourcesContent":["import { Terminal } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { ProjectEnvToolInput, ProjectEnvToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction asInput(input: unknown): ProjectEnvToolInput | undefined {\n if (input == null || typeof input !== 'object') {\n return undefined;\n }\n\n const action = (input as ProjectEnvToolInput).action;\n\n if (action !== 'list' && action !== 'set' && action !== 'remove') {\n return undefined;\n }\n\n return input as ProjectEnvToolInput;\n}\n\nfunction asOutput(output: unknown): ProjectEnvToolOutput | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n return output as ProjectEnvToolOutput;\n}\n\nfunction outputError(output: ProjectEnvToolOutput | undefined): string | undefined {\n const error = output?.error;\n\n return typeof error === 'string' && error.length > 0 ? error : undefined;\n}\n\nfunction variableKey(\n input: ProjectEnvToolInput | undefined,\n output: ProjectEnvToolOutput | undefined\n): string | undefined {\n const key = output?.key ?? input?.key;\n\n if (typeof key !== 'string') {\n return undefined;\n }\n\n const trimmed = key.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction projectEnvTitles(\n state: string,\n input: ProjectEnvToolInput | undefined,\n output: ProjectEnvToolOutput | undefined,\n useFailureLabel: boolean\n): { title: string; titleInProgress: string } {\n const action = input?.action;\n const key = variableKey(input, output);\n const failed = useFailureLabel || Boolean(outputError(output));\n\n if (action === 'list') {\n if (failed) {\n return {\n title: 'Couldn\\'t list environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (state === 'output-available') {\n const count = output?.variables?.length;\n\n if (count === 0) {\n return {\n title: 'No environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (count === 1) {\n return {\n title: 'Listed 1 environment variable',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (count != null) {\n return {\n title: `Listed ${ count } environment variables`,\n titleInProgress: 'Listing environment variables',\n };\n }\n }\n\n return {\n title: 'List environment variables',\n titleInProgress: 'Listing environment variables',\n };\n }\n\n if (action === 'remove') {\n if (failed) {\n return {\n title: key ? `Couldn't remove ${ key }` : 'Couldn\\'t remove environment variable',\n titleInProgress: key ? `Removing ${ key }` : 'Removing environment variable',\n };\n }\n\n return {\n title: state === 'output-available'\n ? (key ? `Removed ${ key }` : 'Removed environment variable')\n : (key ? `Remove ${ key }` : 'Remove environment variable'),\n titleInProgress: key ? `Removing ${ key }` : 'Removing environment variable',\n };\n }\n\n if (failed) {\n return {\n title: key ? `Couldn't save ${ key }` : 'Couldn\\'t save environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (state === 'output-available' && output?.created) {\n return {\n title: key ? `Added ${ key }` : 'Added environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (state === 'output-available' && output?.updated) {\n return {\n title: key ? `Updated ${ key }` : 'Updated environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n if (isToolInvocationInProgress(state)) {\n return {\n title: key ? `Set ${ key }` : 'Set environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n }\n\n return {\n title: key ? `Set ${ key }` : 'Set environment variable',\n titleInProgress: key ? `Setting ${ key }` : 'Setting environment variable',\n };\n}\n\n/** ProjectEnv: label-only row for list / set / remove. Never shows values. */\nexport function ProjectEnvTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'ProjectEnv') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const input = asInput(part.input);\n const output = part.state === 'output-available' ? asOutput(part.output) : undefined;\n const logicalError = outputError(output);\n const { title, titleInProgress } = projectEnvTitles(\n part.state,\n input,\n output,\n failure.useFailureLabel\n );\n\n return (\n <ToolShell data-slot=\"project-env-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n failed={ logicalError ? true : undefined }\n title={ title }\n titleInProgress={ titleInProgress }\n icon={ <Terminal aria-hidden /> }\n />\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":["asInput","input","action","asOutput","output","outputError","error","variableKey","key","trimmed","projectEnvTitles","state","useFailureLabel","failed","count","isToolInvocationInProgress","ProjectEnvTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","titleInProgress","ToolShell","_jsx","ToolShellHeader","Terminal","Show","ToolShellFooter","Text"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { getToolName as s } from "ai";
1
+ import { getToolName as s } from "@reforma/types";
2
2
  import { chipItemFromPath as f } from "../../Chip/helpers/chipPath.js";
3
3
  import { isToolInvocationInProgress as c, getToolFailureRowState as m } from "../helpers.js";
4
4
  function a({
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeReadTools.js","sources":["../../../../src/chat/Tool/read/normalizeReadTools.ts"],"sourcesContent":["import { getToolName } from 'ai';\n\nimport { chipItemFromPath, type ChipItem } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress, type ToolFailureRowState } from '../helpers';\n\nimport type { ToolUIPart } from 'ai';\n\nexport type ReadToolUIPart = ToolUIPart & { type: 'tool-Read' };\n\nexport type NormalizedReadToolsView = {\n chipItems: ChipItem[];\n /** SDK state of the last merged part (message order). */\n state: ReadToolUIPart['state'];\n failure: ToolFailureRowState;\n};\n\ntype ReadWindowSuffixInput = {\n offset: number;\n limit: number;\n fileName: string;\n totalLines?: number;\n};\n\nfunction readWindowBounds({\n offset,\n limit,\n totalLines,\n}: ReadWindowSuffixInput): { startInclusive: number; endInclusive: number } | null {\n if (!Number.isInteger(offset) || !Number.isInteger(limit) || offset < 1 || limit < 1) {\n return null;\n }\n\n const rawEndInclusive = offset + limit - 1;\n let endInclusive = rawEndInclusive;\n let startInclusive = offset;\n\n if (totalLines !== undefined && Number.isFinite(totalLines)) {\n const total = Math.trunc(totalLines);\n\n if (total >= 1) {\n endInclusive = Math.min(rawEndInclusive, total);\n startInclusive = Math.min(offset, total);\n }\n }\n\n return { startInclusive, endInclusive };\n}\n\n/** True when the read starts at line/page 1 and runs through the last line/page. */\nfunction isReadFromStartThroughLastLine(input: ReadWindowSuffixInput): boolean {\n if (input.offset !== 1 || input.totalLines === undefined || !Number.isFinite(input.totalLines)) {\n return false;\n }\n\n const total = Math.trunc(input.totalLines);\n const bounds = readWindowBounds(input);\n\n if (!bounds || total < 1) {\n return false;\n }\n\n return bounds.startInclusive === 1 && bounds.endInclusive >= total;\n}\n\n/** Chip suffix for a partial read window, e.g. ` (1-200)`; omitted for full-file reads from the start. */\nexport function readWindowChipSuffix(input: ReadWindowSuffixInput): string | null {\n if (isReadFromStartThroughLastLine(input)) {\n return null;\n }\n\n const bounds = readWindowBounds(input);\n\n if (!bounds) {\n return null;\n }\n\n const { startInclusive, endInclusive } = bounds;\n const range = `${ startInclusive }-${ endInclusive }`;\n\n return ` (${ range })`;\n}\n\nfunction parseReadToolWindowFromPart(part: ReadToolUIPart): ReadWindowSuffixInput | null {\n if (getToolName(part) !== 'Read') {\n return null;\n }\n\n const raw = part.input;\n\n if (raw === undefined || typeof raw === 'string') {\n return null;\n }\n\n const input = raw as { path?: string; offset?: unknown; limit?: unknown };\n\n if (input.offset === undefined || input.limit === undefined) {\n return null;\n }\n\n const offset = typeof input.offset === 'number' ? input.offset : Number(input.offset);\n const limit = typeof input.limit === 'number' ? input.limit : Number(input.limit);\n\n if (!Number.isInteger(offset) || !Number.isInteger(limit) || offset < 1 || limit < 1) {\n return null;\n }\n\n const fileName = input.path?.trim() ?? '';\n\n if (!fileName) {\n return null;\n }\n\n let totalLines: number | undefined;\n\n if (part.state === 'output-available' && part.output !== undefined && typeof part.output === 'object') {\n const t = (part.output as { total?: unknown }).total;\n\n if (typeof t === 'number' && Number.isFinite(t)) {\n totalLines = t;\n }\n }\n\n return { offset, limit, fileName, totalLines };\n}\n\nexport function readPathsFromPart(part: ReadToolUIPart): string[] {\n const input = part.input as { path?: string } | undefined;\n const path = input?.path?.trim() ?? '';\n\n return path ? [path] : [];\n}\n\nfunction chipItemsFromReadPart(part: ReadToolUIPart): ChipItem[] {\n const readWindow = parseReadToolWindowFromPart(part);\n const suffix = readWindow ? readWindowChipSuffix(readWindow) : null;\n\n return readPathsFromPart(part).flatMap((rawPath, index) => {\n const item = chipItemFromPath(rawPath);\n\n if (!item?.path || !item.label) {\n return [];\n }\n\n return [{\n id: `${ part.toolCallId }-${ index }`,\n path: item.path,\n label: item.label,\n tooltip: item.tooltip,\n ...(suffix ? { suffix } : {}),\n }];\n });\n}\n\nfunction aggregateReadToolFailure(parts: readonly ReadToolUIPart[]): ToolFailureRowState {\n if (parts.some(part => isToolInvocationInProgress(part.state))) {\n return { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n }\n\n if (parts.some(part => part.state === 'output-available')) {\n return { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n }\n\n const failure = parts.map(part => getToolFailureRowState(part)).find(row => row.useFailureLabel);\n\n return failure ?? { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n}\n\n/** Merges one or more Read tool parts into a single summary row view. */\nexport function normalizeReadToolParts(parts: readonly ReadToolUIPart[]): NormalizedReadToolsView {\n const chipItems = parts.flatMap(part => chipItemsFromReadPart(part));\n const failure = aggregateReadToolFailure(parts);\n const state = parts[parts.length - 1]?.state ?? 'output-available';\n\n return { chipItems, state, failure };\n}\n"],"names":["readWindowBounds","offset","limit","totalLines","rawEndInclusive","endInclusive","startInclusive","total","isReadFromStartThroughLastLine","input","bounds","readWindowChipSuffix","parseReadToolWindowFromPart","part","getToolName","raw","fileName","t","readPathsFromPart","path","chipItemsFromReadPart","readWindow","suffix","rawPath","index","item","chipItemFromPath","aggregateReadToolFailure","parts","isToolInvocationInProgress","getToolFailureRowState","row","normalizeReadToolParts","chipItems","failure","state"],"mappings":"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"}
1
+ {"version":3,"file":"normalizeReadTools.js","sources":["../../../../src/chat/Tool/read/normalizeReadTools.ts"],"sourcesContent":["import { getToolName } from '@reforma/types';\n\nimport { chipItemFromPath, type ChipItem } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress, type ToolFailureRowState } from '../helpers';\n\nimport type { ToolUIPart } from 'ai';\n\nexport type ReadToolUIPart = ToolUIPart & { type: 'tool-Read' };\n\nexport type NormalizedReadToolsView = {\n chipItems: ChipItem[];\n /** SDK state of the last merged part (message order). */\n state: ReadToolUIPart['state'];\n failure: ToolFailureRowState;\n};\n\ntype ReadWindowSuffixInput = {\n offset: number;\n limit: number;\n fileName: string;\n totalLines?: number;\n};\n\nfunction readWindowBounds({\n offset,\n limit,\n totalLines,\n}: ReadWindowSuffixInput): { startInclusive: number; endInclusive: number } | null {\n if (!Number.isInteger(offset) || !Number.isInteger(limit) || offset < 1 || limit < 1) {\n return null;\n }\n\n const rawEndInclusive = offset + limit - 1;\n let endInclusive = rawEndInclusive;\n let startInclusive = offset;\n\n if (totalLines !== undefined && Number.isFinite(totalLines)) {\n const total = Math.trunc(totalLines);\n\n if (total >= 1) {\n endInclusive = Math.min(rawEndInclusive, total);\n startInclusive = Math.min(offset, total);\n }\n }\n\n return { startInclusive, endInclusive };\n}\n\n/** True when the read starts at line/page 1 and runs through the last line/page. */\nfunction isReadFromStartThroughLastLine(input: ReadWindowSuffixInput): boolean {\n if (input.offset !== 1 || input.totalLines === undefined || !Number.isFinite(input.totalLines)) {\n return false;\n }\n\n const total = Math.trunc(input.totalLines);\n const bounds = readWindowBounds(input);\n\n if (!bounds || total < 1) {\n return false;\n }\n\n return bounds.startInclusive === 1 && bounds.endInclusive >= total;\n}\n\n/** Chip suffix for a partial read window, e.g. ` (1-200)`; omitted for full-file reads from the start. */\nexport function readWindowChipSuffix(input: ReadWindowSuffixInput): string | null {\n if (isReadFromStartThroughLastLine(input)) {\n return null;\n }\n\n const bounds = readWindowBounds(input);\n\n if (!bounds) {\n return null;\n }\n\n const { startInclusive, endInclusive } = bounds;\n const range = `${ startInclusive }-${ endInclusive }`;\n\n return ` (${ range })`;\n}\n\nfunction parseReadToolWindowFromPart(part: ReadToolUIPart): ReadWindowSuffixInput | null {\n if (getToolName(part) !== 'Read') {\n return null;\n }\n\n const raw = part.input;\n\n if (raw === undefined || typeof raw === 'string') {\n return null;\n }\n\n const input = raw as { path?: string; offset?: unknown; limit?: unknown };\n\n if (input.offset === undefined || input.limit === undefined) {\n return null;\n }\n\n const offset = typeof input.offset === 'number' ? input.offset : Number(input.offset);\n const limit = typeof input.limit === 'number' ? input.limit : Number(input.limit);\n\n if (!Number.isInteger(offset) || !Number.isInteger(limit) || offset < 1 || limit < 1) {\n return null;\n }\n\n const fileName = input.path?.trim() ?? '';\n\n if (!fileName) {\n return null;\n }\n\n let totalLines: number | undefined;\n\n if (part.state === 'output-available' && part.output !== undefined && typeof part.output === 'object') {\n const t = (part.output as { total?: unknown }).total;\n\n if (typeof t === 'number' && Number.isFinite(t)) {\n totalLines = t;\n }\n }\n\n return { offset, limit, fileName, totalLines };\n}\n\nexport function readPathsFromPart(part: ReadToolUIPart): string[] {\n const input = part.input as { path?: string } | undefined;\n const path = input?.path?.trim() ?? '';\n\n return path ? [path] : [];\n}\n\nfunction chipItemsFromReadPart(part: ReadToolUIPart): ChipItem[] {\n const readWindow = parseReadToolWindowFromPart(part);\n const suffix = readWindow ? readWindowChipSuffix(readWindow) : null;\n\n return readPathsFromPart(part).flatMap((rawPath, index) => {\n const item = chipItemFromPath(rawPath);\n\n if (!item?.path || !item.label) {\n return [];\n }\n\n return [{\n id: `${ part.toolCallId }-${ index }`,\n path: item.path,\n label: item.label,\n tooltip: item.tooltip,\n ...(suffix ? { suffix } : {}),\n }];\n });\n}\n\nfunction aggregateReadToolFailure(parts: readonly ReadToolUIPart[]): ToolFailureRowState {\n if (parts.some(part => isToolInvocationInProgress(part.state))) {\n return { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n }\n\n if (parts.some(part => part.state === 'output-available')) {\n return { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n }\n\n const failure = parts.map(part => getToolFailureRowState(part)).find(row => row.useFailureLabel);\n\n return failure ?? { useFailureLabel: false, tooltip: undefined, problemText: undefined };\n}\n\n/** Merges one or more Read tool parts into a single summary row view. */\nexport function normalizeReadToolParts(parts: readonly ReadToolUIPart[]): NormalizedReadToolsView {\n const chipItems = parts.flatMap(part => chipItemsFromReadPart(part));\n const failure = aggregateReadToolFailure(parts);\n const state = parts[parts.length - 1]?.state ?? 'output-available';\n\n return { chipItems, state, failure };\n}\n"],"names":["readWindowBounds","offset","limit","totalLines","rawEndInclusive","endInclusive","startInclusive","total","isReadFromStartThroughLastLine","input","bounds","readWindowChipSuffix","parseReadToolWindowFromPart","part","getToolName","raw","fileName","t","readPathsFromPart","path","chipItemsFromReadPart","readWindow","suffix","rawPath","index","item","chipItemFromPath","aggregateReadToolFailure","parts","isToolInvocationInProgress","getToolFailureRowState","row","normalizeReadToolParts","chipItems","failure","state"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Done as c, AttentionTriangle as d } from "@reforma/icons/14";
2
2
  import { plural as u } from "@reforma/lib";
3
- import { isToolUIPart as m, getToolName as f } from "ai";
3
+ import { isToolUIPart as m, getToolName as f } from "@reforma/types";
4
4
  import { Show as h } from "../../../Show/Show.js";
5
5
  import { getToolFailureRowState as g } from "../helpers.js";
6
6
  import { ToolShell as p, ToolShellHeader as L, ToolShellContent as T } from "../shell/ToolShell.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ReadLintsTool.js","sources":["../../../../src/chat/Tool/read-lints/ReadLintsTool.tsx"],"sourcesContent":["import { AttentionTriangle, Done } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellContent, ToolShellHeader } from '../shell';\nimport { ReadLintsDiagnosticsList } from './ReadLintsDiagnosticsList';\n\nimport type { ReadLintsDiagnostic, ReadLintsToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction readLintsDiagnostics(output: unknown): ReadLintsDiagnostic[] {\n if (output == null || typeof output !== 'object') {\n return [];\n }\n\n const diagnostics = (output as ReadLintsToolOutput).diagnostics;\n\n return Array.isArray(diagnostics) ? diagnostics : [];\n}\n\n/** ReadLints: collapsible diagnostic list when the check found issues. */\nexport function ReadLintsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'ReadLints') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const done = part.state === 'output-available';\n const diagnostics = done ? readLintsDiagnostics(part.output) : [];\n const count = diagnostics.length;\n const clean = done && count === 0 && !failure.useFailureLabel;\n const canExpand = count > 0;\n const title = failure.useFailureLabel\n ? 'Lint check failed'\n : clean\n ? 'No linter errors'\n : canExpand\n ? plural(count, 'linter error', 'linter errors')\n : undefined;\n\n return (\n <ToolShell\n collapsible={ canExpand }\n data-slot=\"read-lints-tool\"\n >\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress=\"Checking lints\"\n icon={ clean ? <Done aria-hidden /> : <AttentionTriangle aria-hidden /> }\n />\n\n <Show when={ canExpand }>\n <ToolShellContent>\n <ReadLintsDiagnosticsList diagnostics={ diagnostics } />\n </ToolShellContent>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["readLintsDiagnostics","output","diagnostics","ReadLintsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","done","count","clean","canExpand","title","plural","ToolShell","_jsx","ToolShellHeader","Done","AttentionTriangle","Show","ToolShellContent","ReadLintsDiagnosticsList"],"mappings":";;;;;;;;AAQA,SAASA,EAAqBC,GAAQ;AACpC,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC,WAAO,CAAA;AAET,QAAMC,IAAcD,EAAO;AAC3B,SAAO,MAAM,QAAQC,CAAW,IAAIA,IAAc,CAAA;AACpD;AAGO,SAASC,EAAc;AAAA,EAC5B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAOL,EAAK,UAAU,oBACtBF,IAAcO,IAAOT,EAAqBI,EAAK,MAAM,IAAI,CAAA,GACzDM,IAAQR,EAAY,QACpBS,IAAQF,KAAQC,MAAU,KAAK,CAACH,EAAQ,iBACxCK,IAAYF,IAAQ,GACpBG,IAAQN,EAAQ,kBAAkB,sBAAsBI,IAAQ,qBAAqBC,IAAYE,EAAOJ,GAAO,gBAAgB,eAAe,IAAI;AACxJ,2BAA0BK,GAAW;AAAA,IACnC,aAAaH;AAAA,IACb,aAAa;AAAA,IACb,UAAU,CAAcI,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOb,EAAK;AAAA,MACZ,cAAcG,EAAQ;AAAA,MACtB,OAAAM;AAAA,MACA,iBAAiB;AAAA,MACjB,MAAMF,IAAqBK,gBAAAA,EAAKE,GAAM;AAAA,QACpC,eAAe;AAAA,MAAA,CAChB,IAAiBF,gBAAAA,EAAKG,GAAmB;AAAA,QACxC,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBH,gBAAAA,EAAKI,GAAM;AAAA,MAC1B,MAAMR;AAAA,MACN,4BAA4BS,GAAkB;AAAA,QAC5C,4BAA4BC,GAA0B;AAAA,UACpD,aAAApB;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"ReadLintsTool.js","sources":["../../../../src/chat/Tool/read-lints/ReadLintsTool.tsx"],"sourcesContent":["import { AttentionTriangle, Done } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellContent, ToolShellHeader } from '../shell';\nimport { ReadLintsDiagnosticsList } from './ReadLintsDiagnosticsList';\n\nimport type { ReadLintsDiagnostic, ReadLintsToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction readLintsDiagnostics(output: unknown): ReadLintsDiagnostic[] {\n if (output == null || typeof output !== 'object') {\n return [];\n }\n\n const diagnostics = (output as ReadLintsToolOutput).diagnostics;\n\n return Array.isArray(diagnostics) ? diagnostics : [];\n}\n\n/** ReadLints: collapsible diagnostic list when the check found issues. */\nexport function ReadLintsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'ReadLints') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const done = part.state === 'output-available';\n const diagnostics = done ? readLintsDiagnostics(part.output) : [];\n const count = diagnostics.length;\n const clean = done && count === 0 && !failure.useFailureLabel;\n const canExpand = count > 0;\n const title = failure.useFailureLabel\n ? 'Lint check failed'\n : clean\n ? 'No linter errors'\n : canExpand\n ? plural(count, 'linter error', 'linter errors')\n : undefined;\n\n return (\n <ToolShell\n collapsible={ canExpand }\n data-slot=\"read-lints-tool\"\n >\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress=\"Checking lints\"\n icon={ clean ? <Done aria-hidden /> : <AttentionTriangle aria-hidden /> }\n />\n\n <Show when={ canExpand }>\n <ToolShellContent>\n <ReadLintsDiagnosticsList diagnostics={ diagnostics } />\n </ToolShellContent>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["readLintsDiagnostics","output","diagnostics","ReadLintsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","done","count","clean","canExpand","title","plural","ToolShell","_jsx","ToolShellHeader","Done","AttentionTriangle","Show","ToolShellContent","ReadLintsDiagnosticsList"],"mappings":";;;;;;;;AAQA,SAASA,EAAqBC,GAAQ;AACpC,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC,WAAO,CAAA;AAET,QAAMC,IAAcD,EAAO;AAC3B,SAAO,MAAM,QAAQC,CAAW,IAAIA,IAAc,CAAA;AACpD;AAGO,SAASC,EAAc;AAAA,EAC5B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAOL,EAAK,UAAU,oBACtBF,IAAcO,IAAOT,EAAqBI,EAAK,MAAM,IAAI,CAAA,GACzDM,IAAQR,EAAY,QACpBS,IAAQF,KAAQC,MAAU,KAAK,CAACH,EAAQ,iBACxCK,IAAYF,IAAQ,GACpBG,IAAQN,EAAQ,kBAAkB,sBAAsBI,IAAQ,qBAAqBC,IAAYE,EAAOJ,GAAO,gBAAgB,eAAe,IAAI;AACxJ,2BAA0BK,GAAW;AAAA,IACnC,aAAaH;AAAA,IACb,aAAa;AAAA,IACb,UAAU,CAAcI,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOb,EAAK;AAAA,MACZ,cAAcG,EAAQ;AAAA,MACtB,OAAAM;AAAA,MACA,iBAAiB;AAAA,MACjB,MAAMF,IAAqBK,gBAAAA,EAAKE,GAAM;AAAA,QACpC,eAAe;AAAA,MAAA,CAChB,IAAiBF,gBAAAA,EAAKG,GAAmB;AAAA,QACxC,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBH,gBAAAA,EAAKI,GAAM;AAAA,MAC1B,MAAMR;AAAA,MACN,4BAA4BS,GAAkB;AAAA,QAC5C,4BAA4BC,GAA0B;AAAA,UACpD,aAAApB;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,6 +1,6 @@
1
1
  import { Trash as s } from "@reforma/icons/14";
2
2
  import { plural as u, cn as a } from "@reforma/lib";
3
- import { isToolUIPart as p, getToolName as f } from "ai";
3
+ import { isToolUIPart as p, getToolName as f } from "@reforma/types";
4
4
  import { Box as c } from "../../../Box/Box.js";
5
5
  import { For as h } from "../../../For/For.js";
6
6
  import { Pressable as d } from "react-aria-components";
@@ -1 +1 @@
1
- {"version":3,"file":"RemoveFileTool.js","sources":["../../../../src/chat/Tool/remove-file/RemoveFileTool.tsx"],"sourcesContent":["import { Trash } from '@reforma/icons/14';\nimport { cn, plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Box } from '../../../Box';\nimport { For } from '../../../For';\nimport { Pressable } from '../../../Pressable';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { Chip, ChipContent, chipItemFromPath } from '../../Chip';\nimport chipStyles from '../../Chip/Chip.module.css';\nimport { getToolFailureRowState, removeFileLinesRemoved } from '../helpers';\nimport { ToolLineCounts, ToolPathListPopover, ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { parseRemoveFileInput } from './parseRemoveFileInput';\nimport styles from './RemoveFileTool.module.css';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction pathsFromRemoveOutput(output: unknown): string[] {\n if (output == null || typeof output !== 'object') {\n return [];\n }\n\n const results = (output as { results?: unknown }).results;\n\n if (!Array.isArray(results)) {\n return [];\n }\n\n return results.flatMap((row) => {\n if (row == null || typeof row !== 'object') {\n return [];\n }\n\n const path = (row as { path?: unknown }).path;\n\n return typeof path === 'string' && path.trim() !== '' ? [path] : [];\n });\n}\n\nfunction RemoveFilePaths({ paths }: { paths: readonly string[] }) {\n if (paths.length > 1) {\n return (\n <ToolPathListPopover\n trigger={ (\n <Pressable>\n <button\n type=\"button\"\n className={ cn(chipStyles.chip, styles.count) }\n data-chip\n data-interactive\n >\n <ChipContent\n item={{ label: plural(paths.length, 'file', 'files') }}\n icon={ null }\n tooltip={ false }\n />\n </button>\n </Pressable>\n ) }\n paths={ paths }\n />\n );\n }\n\n return (\n <Box direction=\"row\" gap=\"xs\" wrap>\n <For each={ [...paths] }>\n { (path, index) => {\n const item = chipItemFromPath(path);\n\n if (!item) {\n return null;\n }\n\n return (\n <Chip\n key={ item.id ?? index }\n item={ item }\n />\n );\n } }\n </For>\n </Box>\n );\n}\n\n/** RemoveFile: one path stays a chip. Several collapse to a count that opens the list. */\nexport function RemoveFileTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'RemoveFile') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const outputPaths = pathsFromRemoveOutput(part.output);\n const paths = outputPaths.length > 0\n ? outputPaths\n : parseRemoveFileInput(part.input).filePaths;\n\n const linesRemoved = state === 'output-available'\n ? removeFileLinesRemoved(part.output)\n : undefined;\n\n return (\n <ToolShell data-slot=\"remove-file-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Removed\"\n titleInProgress=\"Removing\"\n icon={ <Trash aria-hidden /> }\n >\n <RemoveFilePaths paths={ paths } />\n\n <ToolLineCounts removed={ linesRemoved } />\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["pathsFromRemoveOutput","output","results","row","path","RemoveFilePaths","paths","ToolPathListPopover","Pressable","cn","chipStyles","styles","ChipContent","plural","Box","For","index","item","chipItemFromPath","Chip","RemoveFileTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","outputPaths","parseRemoveFileInput","linesRemoved","removeFileLinesRemoved","ToolShell","_jsxs","ToolShellHeader","Trash","_jsx","ToolLineCounts","Show","ToolShellFooter","Text"],"mappings":";;;;;;;;;;;;;;;;;;;AAeA,SAASA,EAAsBC,GAAQ;AACrC,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC,WAAO,CAAA;AAET,QAAMC,IAAUD,EAAO;AACvB,SAAK,MAAM,QAAQC,CAAO,IAGnBA,EAAQ,QAAQ,CAAAC,MAAO;AAC5B,QAAIA,KAAO,QAAQ,OAAOA,KAAQ;AAChC,aAAO,CAAA;AAET,UAAMC,IAAOD,EAAI;AACjB,WAAO,OAAOC,KAAS,YAAYA,EAAK,KAAA,MAAW,KAAK,CAACA,CAAI,IAAI,CAAA;AAAA,EACnE,CAAC,IARQ,CAAA;AASX;AACA,SAASC,EAAgB;AAAA,EACvB,OAAAC;AACF,GAAG;AACD,SAAIA,EAAM,SAAS,sBACQC,GAAqB;AAAA,IAC5C,2BAA2BC,GAAW;AAAA,MACpC,4BAA4B,UAAU;AAAA,QACpC,MAAM;AAAA,QACN,WAAWC,EAAGC,EAAW,MAAMC,EAAO,KAAK;AAAA,QAC3C,aAAa;AAAA,QACb,oBAAoB;AAAA,QACpB,4BAA4BC,GAAa;AAAA,UACvC,MAAM;AAAA,YACJ,OAAOC,EAAOP,EAAM,QAAQ,QAAQ,OAAO;AAAA,UAAA;AAAA,UAE7C,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACV;AAAA,MAAA,CACF;AAAA,IAAA,CACF;AAAA,IACD,OAAAA;AAAA,EAAA,CACD,sBAEsBQ,GAAK;AAAA,IAC5B,WAAW;AAAA,IACX,KAAK;AAAA,IACL,MAAM;AAAA,IACN,4BAA4BC,GAAK;AAAA,MAC/B,MAAM,CAAC,GAAGT,CAAK;AAAA,MACf,UAAU,CAACF,GAAMY,MAAU;AACzB,cAAMC,IAAOC,EAAiBd,CAAI;AAClC,eAAKa,sBAGoBE,GAAM;AAAA,UAC7B,MAAAF;AAAA,QAAA,GACCA,EAAK,MAAMD,CAAK,IAJV;AAAA,MAKX;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;AAGO,SAASI,EAAe;AAAA,EAC7B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQH,EAAK,OACbI,IAAUC,EAAuBL,CAAI,GACrCM,IAAc3B,EAAsBqB,EAAK,MAAM,GAC/Cf,IAAQqB,EAAY,SAAS,IAAIA,IAAcC,EAAqBP,EAAK,KAAK,EAAE,WAChFQ,IAAeL,MAAU,qBAAqBM,EAAuBT,EAAK,MAAM,IAAI;AAC1F,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAMC,GAAiB;AAAA,MAC7C,OAAAT;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBS,GAAO;AAAA,QAC7B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,UAAU,CAAcC,gBAAAA,EAAK9B,GAAiB;AAAA,QAC5C,OAAAC;AAAA,MAAA,CACD,GAAgB6B,gBAAAA,EAAKC,GAAgB;AAAA,QACpC,SAASP;AAAA,MAAA,CACV,CAAC;AAAA,IAAA,CACH,GAAgBM,gBAAAA,EAAKE,GAAM;AAAA,MAC1B,MAAMZ,EAAQ;AAAA,MACd,4BAA4Ba,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUd,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"RemoveFileTool.js","sources":["../../../../src/chat/Tool/remove-file/RemoveFileTool.tsx"],"sourcesContent":["import { Trash } from '@reforma/icons/14';\nimport { cn, plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Box } from '../../../Box';\nimport { For } from '../../../For';\nimport { Pressable } from '../../../Pressable';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { Chip, ChipContent, chipItemFromPath } from '../../Chip';\nimport chipStyles from '../../Chip/Chip.module.css';\nimport { getToolFailureRowState, removeFileLinesRemoved } from '../helpers';\nimport { ToolLineCounts, ToolPathListPopover, ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { parseRemoveFileInput } from './parseRemoveFileInput';\nimport styles from './RemoveFileTool.module.css';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction pathsFromRemoveOutput(output: unknown): string[] {\n if (output == null || typeof output !== 'object') {\n return [];\n }\n\n const results = (output as { results?: unknown }).results;\n\n if (!Array.isArray(results)) {\n return [];\n }\n\n return results.flatMap((row) => {\n if (row == null || typeof row !== 'object') {\n return [];\n }\n\n const path = (row as { path?: unknown }).path;\n\n return typeof path === 'string' && path.trim() !== '' ? [path] : [];\n });\n}\n\nfunction RemoveFilePaths({ paths }: { paths: readonly string[] }) {\n if (paths.length > 1) {\n return (\n <ToolPathListPopover\n trigger={ (\n <Pressable>\n <button\n type=\"button\"\n className={ cn(chipStyles.chip, styles.count) }\n data-chip\n data-interactive\n >\n <ChipContent\n item={{ label: plural(paths.length, 'file', 'files') }}\n icon={ null }\n tooltip={ false }\n />\n </button>\n </Pressable>\n ) }\n paths={ paths }\n />\n );\n }\n\n return (\n <Box direction=\"row\" gap=\"xs\" wrap>\n <For each={ [...paths] }>\n { (path, index) => {\n const item = chipItemFromPath(path);\n\n if (!item) {\n return null;\n }\n\n return (\n <Chip\n key={ item.id ?? index }\n item={ item }\n />\n );\n } }\n </For>\n </Box>\n );\n}\n\n/** RemoveFile: one path stays a chip. Several collapse to a count that opens the list. */\nexport function RemoveFileTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'RemoveFile') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const outputPaths = pathsFromRemoveOutput(part.output);\n const paths = outputPaths.length > 0\n ? outputPaths\n : parseRemoveFileInput(part.input).filePaths;\n\n const linesRemoved = state === 'output-available'\n ? removeFileLinesRemoved(part.output)\n : undefined;\n\n return (\n <ToolShell data-slot=\"remove-file-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Removed\"\n titleInProgress=\"Removing\"\n icon={ <Trash aria-hidden /> }\n >\n <RemoveFilePaths paths={ paths } />\n\n <ToolLineCounts removed={ linesRemoved } />\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["pathsFromRemoveOutput","output","results","row","path","RemoveFilePaths","paths","ToolPathListPopover","Pressable","cn","chipStyles","styles","ChipContent","plural","Box","For","index","item","chipItemFromPath","Chip","RemoveFileTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","outputPaths","parseRemoveFileInput","linesRemoved","removeFileLinesRemoved","ToolShell","_jsxs","ToolShellHeader","Trash","_jsx","ToolLineCounts","Show","ToolShellFooter","Text"],"mappings":";;;;;;;;;;;;;;;;;;;AAeA,SAASA,EAAsBC,GAAQ;AACrC,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC,WAAO,CAAA;AAET,QAAMC,IAAUD,EAAO;AACvB,SAAK,MAAM,QAAQC,CAAO,IAGnBA,EAAQ,QAAQ,CAAAC,MAAO;AAC5B,QAAIA,KAAO,QAAQ,OAAOA,KAAQ;AAChC,aAAO,CAAA;AAET,UAAMC,IAAOD,EAAI;AACjB,WAAO,OAAOC,KAAS,YAAYA,EAAK,KAAA,MAAW,KAAK,CAACA,CAAI,IAAI,CAAA;AAAA,EACnE,CAAC,IARQ,CAAA;AASX;AACA,SAASC,EAAgB;AAAA,EACvB,OAAAC;AACF,GAAG;AACD,SAAIA,EAAM,SAAS,sBACQC,GAAqB;AAAA,IAC5C,2BAA2BC,GAAW;AAAA,MACpC,4BAA4B,UAAU;AAAA,QACpC,MAAM;AAAA,QACN,WAAWC,EAAGC,EAAW,MAAMC,EAAO,KAAK;AAAA,QAC3C,aAAa;AAAA,QACb,oBAAoB;AAAA,QACpB,4BAA4BC,GAAa;AAAA,UACvC,MAAM;AAAA,YACJ,OAAOC,EAAOP,EAAM,QAAQ,QAAQ,OAAO;AAAA,UAAA;AAAA,UAE7C,MAAM;AAAA,UACN,SAAS;AAAA,QAAA,CACV;AAAA,MAAA,CACF;AAAA,IAAA,CACF;AAAA,IACD,OAAAA;AAAA,EAAA,CACD,sBAEsBQ,GAAK;AAAA,IAC5B,WAAW;AAAA,IACX,KAAK;AAAA,IACL,MAAM;AAAA,IACN,4BAA4BC,GAAK;AAAA,MAC/B,MAAM,CAAC,GAAGT,CAAK;AAAA,MACf,UAAU,CAACF,GAAMY,MAAU;AACzB,cAAMC,IAAOC,EAAiBd,CAAI;AAClC,eAAKa,sBAGoBE,GAAM;AAAA,UAC7B,MAAAF;AAAA,QAAA,GACCA,EAAK,MAAMD,CAAK,IAJV;AAAA,MAKX;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACH;AAGO,SAASI,EAAe;AAAA,EAC7B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQH,EAAK,OACbI,IAAUC,EAAuBL,CAAI,GACrCM,IAAc3B,EAAsBqB,EAAK,MAAM,GAC/Cf,IAAQqB,EAAY,SAAS,IAAIA,IAAcC,EAAqBP,EAAK,KAAK,EAAE,WAChFQ,IAAeL,MAAU,qBAAqBM,EAAuBT,EAAK,MAAM,IAAI;AAC1F,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAMC,GAAiB;AAAA,MAC7C,OAAAT;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBS,GAAO;AAAA,QAC7B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,UAAU,CAAcC,gBAAAA,EAAK9B,GAAiB;AAAA,QAC5C,OAAAC;AAAA,MAAA,CACD,GAAgB6B,gBAAAA,EAAKC,GAAgB;AAAA,QACpC,SAASP;AAAA,MAAA,CACV,CAAC;AAAA,IAAA,CACH,GAAgBM,gBAAAA,EAAKE,GAAM;AAAA,MAC1B,MAAMZ,EAAQ;AAAA,MACd,4BAA4Ba,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUd,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,7 +1,7 @@
1
1
  import { Check as P, Close as w } from "@reforma/icons/12";
2
2
  import { CreatingYourProject as y } from "@reforma/icons/14";
3
3
  import { readErrorMessage as h } from "@reforma/lib/errors";
4
- import { isToolUIPart as N, getToolName as F } from "ai";
4
+ import { isToolUIPart as N, getToolName as F } from "@reforma/types";
5
5
  import { observer as I } from "mobx-react-lite";
6
6
  import { For as C } from "../../../For/For.js";
7
7
  import { Show as c } from "../../../Show/Show.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ScaffoldProjectTool.js","sources":["../../../../src/chat/Tool/scaffold-project/ScaffoldProjectTool.tsx"],"sourcesContent":["import { Check, Close } from '@reforma/icons/12';\nimport { CreatingYourProject } from '@reforma/icons/14';\nimport { readErrorMessage } from '@reforma/lib/errors';\nimport { getToolName, isToolUIPart } from 'ai';\nimport { observer } from 'mobx-react-lite';\n\nimport { For } from '../../../For';\nimport { Show } from '../../../Show';\nimport { Spinner } from '../../../Spinner';\nimport { Text } from '../../../Text';\nimport { useMessageTurn } from '../../Message/turn/messageTurnContext';\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport styles from './ScaffoldProjectTool.module.css';\n\nimport type {\n ScaffoldProjectProgressMetadata,\n ScaffoldProjectProgressStage,\n ScaffoldProjectToolOutput,\n ToolMetadata,\n} from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n pending: 'Setting up your project…',\n success: 'Project initialized',\n failed: 'Couldn’t set up project',\n} as const;\n\nconst progressSteps = [\n { id: 'git-sync', label: 'Syncing repository' },\n { id: 'prepare', label: 'Preparing project' },\n { id: 'install', label: 'Installing dependencies' },\n { id: 'dev-server', label: 'Starting dev server' },\n] as const;\n\n/** Backend stages → UI step index (`template` and `prepare` share one row). */\nconst progressStepIndex: Record<ScaffoldProjectProgressStage, number> = {\n 'git-sync': 0,\n template: 1,\n prepare: 1,\n install: 2,\n 'dev-server': 3,\n};\n\ntype StepStatus = 'complete' | 'active' | 'failed';\ntype ProgressMode = 'running' | 'failed' | 'complete';\n\nfunction scaffoldProgressStage(meta?: ToolMetadata): ScaffoldProjectProgressStage | undefined {\n return (meta?.patch as ScaffoldProjectProgressMetadata | undefined)?.stage;\n}\n\nfunction stepStatus(index: number, currentIndex: number, mode: ProgressMode): StepStatus {\n if (mode === 'complete' || index < currentIndex) {\n return 'complete';\n }\n\n if (mode === 'failed') {\n return 'failed';\n }\n\n return 'active';\n}\n\nfunction StepMarker({ status }: { status: StepStatus }) {\n if (status === 'complete') {\n return <Check />;\n }\n\n if (status === 'failed') {\n return <Close />;\n }\n\n return <Spinner size=\"xxs\" aria-hidden />;\n}\n\nfunction ScaffoldProgress({\n currentIndex,\n mode,\n}: {\n currentIndex: number;\n mode: ProgressMode;\n}) {\n const steps = mode === 'complete'\n ? progressSteps\n : progressSteps.slice(0, currentIndex + 1);\n\n return (\n <div className={ styles.progress } role=\"list\" aria-label=\"Project setup progress\">\n <For each={ steps }>\n { (step, index) => {\n const status = stepStatus(index, currentIndex, mode);\n\n return (\n <div\n key={ step.id }\n className={ styles.step }\n data-status={ status }\n role=\"listitem\"\n aria-current={ status === 'active' ? 'step' : undefined }\n >\n <span className={ styles.marker } aria-hidden>\n <StepMarker status={ status } />\n </span>\n <Text variant=\"xs\">{step.label}</Text>\n </div>\n );\n } }\n </For>\n </div>\n );\n}\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n return readErrorMessage((output as ScaffoldProjectToolOutput).error);\n}\n\nfunction outputFailureDetail(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const parsed = output as ScaffoldProjectToolOutput;\n const parts: string[] = [];\n\n if (parsed.cause && parsed.cause !== parsed.error) {\n parts.push(readErrorMessage(parsed.cause) ?? parsed.cause);\n }\n\n if (parsed.details?.stderrTail) {\n parts.push(parsed.details.stderrTail.trim());\n }\n\n // Machine code only when there is no human message to show.\n if (parsed.code && !parts.length && !readErrorMessage(parsed.error)) {\n parts.push(parsed.code);\n }\n\n return parts.length > 0 ? parts.join('\\n') : undefined;\n}\n\nfunction scaffoldProjectTitle(\n state: string,\n output: unknown,\n useFailureLabel: boolean\n): string {\n if (useFailureLabel || outputError(output)) {\n return labels.failed;\n }\n\n if (state === 'output-available') {\n return labels.success;\n }\n\n return labels.pending;\n}\n\n/** ScaffoldProject setup progress: reveal while running, full checklist on success. */\nexport const ScaffoldProjectTool = observer(({ part }: ToolRendererProps) => {\n const turn = useMessageTurn();\n const { live, stalled } = useToolProgress(part.state);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'ScaffoldProject') {\n return null;\n }\n\n const meta = turn?.getToolMeta?.(part.toolCallId);\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const failureDetail = part.state === 'output-available' ? outputFailureDetail(part.output) : undefined;\n const progressStage = scaffoldProgressStage(meta);\n const failed = Boolean(logicalError || failure.problemText || failure.useFailureLabel || stalled);\n const succeeded = part.state === 'output-available' && !failed;\n const mode: ProgressMode = succeeded\n ? 'complete'\n : failed\n ? 'failed'\n : 'running';\n const showProgress = succeeded\n || (progressStage != null && (live || failed));\n\n return (\n <ToolShell className={ styles.card } data-slot=\"scaffold-project-tool\">\n <ToolShellHeader\n className={ styles.header }\n state={ part.state }\n statusDetail={ failure.tooltip ?? failureDetail ?? logicalError }\n title={ scaffoldProjectTitle(part.state, part.output, failure.useFailureLabel || stalled) }\n titleInProgress={ labels.pending }\n titleInterrupted={ labels.failed }\n icon={ <CreatingYourProject aria-hidden /> }\n />\n\n <Show when={ showProgress }>\n <ScaffoldProgress\n currentIndex={ progressStage ? progressStepIndex[progressStage] : 0 }\n mode={ mode }\n />\n </Show>\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter className={ styles.error }>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n <Show when={ failureDetail }>\n <Text color=\"danger\" variant=\"xs\" whitespace=\"pre-line\">{failureDetail}</Text>\n </Show>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n});\n"],"names":["labels","progressSteps","progressStepIndex","scaffoldProgressStage","meta","stepStatus","index","currentIndex","mode","StepMarker","status","_jsx","Check","Close","Spinner","ScaffoldProgress","steps","styles","For","step","Text","outputError","output","readErrorMessage","outputFailureDetail","parsed","parts","scaffoldProjectTitle","state","useFailureLabel","ScaffoldProjectTool","observer","part","turn","useMessageTurn","live","stalled","useToolProgress","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","failureDetail","progressStage","failed","succeeded","showProgress","ToolShell","ToolShellHeader","CreatingYourProject","Show","ToolShellFooter"],"mappings":"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"}
1
+ {"version":3,"file":"ScaffoldProjectTool.js","sources":["../../../../src/chat/Tool/scaffold-project/ScaffoldProjectTool.tsx"],"sourcesContent":["import { Check, Close } from '@reforma/icons/12';\nimport { CreatingYourProject } from '@reforma/icons/14';\nimport { readErrorMessage } from '@reforma/lib/errors';\nimport { getToolName, isToolUIPart } from '@reforma/types';\nimport { observer } from 'mobx-react-lite';\n\nimport { For } from '../../../For';\nimport { Show } from '../../../Show';\nimport { Spinner } from '../../../Spinner';\nimport { Text } from '../../../Text';\nimport { useMessageTurn } from '../../Message/turn/messageTurnContext';\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport styles from './ScaffoldProjectTool.module.css';\n\nimport type {\n ScaffoldProjectProgressMetadata,\n ScaffoldProjectProgressStage,\n ScaffoldProjectToolOutput,\n ToolMetadata,\n} from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n pending: 'Setting up your project…',\n success: 'Project initialized',\n failed: 'Couldn’t set up project',\n} as const;\n\nconst progressSteps = [\n { id: 'git-sync', label: 'Syncing repository' },\n { id: 'prepare', label: 'Preparing project' },\n { id: 'install', label: 'Installing dependencies' },\n { id: 'dev-server', label: 'Starting dev server' },\n] as const;\n\n/** Backend stages → UI step index (`template` and `prepare` share one row). */\nconst progressStepIndex: Record<ScaffoldProjectProgressStage, number> = {\n 'git-sync': 0,\n template: 1,\n prepare: 1,\n install: 2,\n 'dev-server': 3,\n};\n\ntype StepStatus = 'complete' | 'active' | 'failed';\ntype ProgressMode = 'running' | 'failed' | 'complete';\n\nfunction scaffoldProgressStage(meta?: ToolMetadata): ScaffoldProjectProgressStage | undefined {\n return (meta?.patch as ScaffoldProjectProgressMetadata | undefined)?.stage;\n}\n\nfunction stepStatus(index: number, currentIndex: number, mode: ProgressMode): StepStatus {\n if (mode === 'complete' || index < currentIndex) {\n return 'complete';\n }\n\n if (mode === 'failed') {\n return 'failed';\n }\n\n return 'active';\n}\n\nfunction StepMarker({ status }: { status: StepStatus }) {\n if (status === 'complete') {\n return <Check />;\n }\n\n if (status === 'failed') {\n return <Close />;\n }\n\n return <Spinner size=\"xxs\" aria-hidden />;\n}\n\nfunction ScaffoldProgress({\n currentIndex,\n mode,\n}: {\n currentIndex: number;\n mode: ProgressMode;\n}) {\n const steps = mode === 'complete'\n ? progressSteps\n : progressSteps.slice(0, currentIndex + 1);\n\n return (\n <div className={ styles.progress } role=\"list\" aria-label=\"Project setup progress\">\n <For each={ steps }>\n { (step, index) => {\n const status = stepStatus(index, currentIndex, mode);\n\n return (\n <div\n key={ step.id }\n className={ styles.step }\n data-status={ status }\n role=\"listitem\"\n aria-current={ status === 'active' ? 'step' : undefined }\n >\n <span className={ styles.marker } aria-hidden>\n <StepMarker status={ status } />\n </span>\n <Text variant=\"xs\">{step.label}</Text>\n </div>\n );\n } }\n </For>\n </div>\n );\n}\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n return readErrorMessage((output as ScaffoldProjectToolOutput).error);\n}\n\nfunction outputFailureDetail(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const parsed = output as ScaffoldProjectToolOutput;\n const parts: string[] = [];\n\n if (parsed.cause && parsed.cause !== parsed.error) {\n parts.push(readErrorMessage(parsed.cause) ?? parsed.cause);\n }\n\n if (parsed.details?.stderrTail) {\n parts.push(parsed.details.stderrTail.trim());\n }\n\n // Machine code only when there is no human message to show.\n if (parsed.code && !parts.length && !readErrorMessage(parsed.error)) {\n parts.push(parsed.code);\n }\n\n return parts.length > 0 ? parts.join('\\n') : undefined;\n}\n\nfunction scaffoldProjectTitle(\n state: string,\n output: unknown,\n useFailureLabel: boolean\n): string {\n if (useFailureLabel || outputError(output)) {\n return labels.failed;\n }\n\n if (state === 'output-available') {\n return labels.success;\n }\n\n return labels.pending;\n}\n\n/** ScaffoldProject setup progress: reveal while running, full checklist on success. */\nexport const ScaffoldProjectTool = observer(({ part }: ToolRendererProps) => {\n const turn = useMessageTurn();\n const { live, stalled } = useToolProgress(part.state);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'ScaffoldProject') {\n return null;\n }\n\n const meta = turn?.getToolMeta?.(part.toolCallId);\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const failureDetail = part.state === 'output-available' ? outputFailureDetail(part.output) : undefined;\n const progressStage = scaffoldProgressStage(meta);\n const failed = Boolean(logicalError || failure.problemText || failure.useFailureLabel || stalled);\n const succeeded = part.state === 'output-available' && !failed;\n const mode: ProgressMode = succeeded\n ? 'complete'\n : failed\n ? 'failed'\n : 'running';\n const showProgress = succeeded\n || (progressStage != null && (live || failed));\n\n return (\n <ToolShell className={ styles.card } data-slot=\"scaffold-project-tool\">\n <ToolShellHeader\n className={ styles.header }\n state={ part.state }\n statusDetail={ failure.tooltip ?? failureDetail ?? logicalError }\n title={ scaffoldProjectTitle(part.state, part.output, failure.useFailureLabel || stalled) }\n titleInProgress={ labels.pending }\n titleInterrupted={ labels.failed }\n icon={ <CreatingYourProject aria-hidden /> }\n />\n\n <Show when={ showProgress }>\n <ScaffoldProgress\n currentIndex={ progressStage ? progressStepIndex[progressStage] : 0 }\n mode={ mode }\n />\n </Show>\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter className={ styles.error }>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n <Show when={ failureDetail }>\n <Text color=\"danger\" variant=\"xs\" whitespace=\"pre-line\">{failureDetail}</Text>\n </Show>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n});\n"],"names":["labels","progressSteps","progressStepIndex","scaffoldProgressStage","meta","stepStatus","index","currentIndex","mode","StepMarker","status","_jsx","Check","Close","Spinner","ScaffoldProgress","steps","styles","For","step","Text","outputError","output","readErrorMessage","outputFailureDetail","parsed","parts","scaffoldProjectTitle","state","useFailureLabel","ScaffoldProjectTool","observer","part","turn","useMessageTurn","live","stalled","useToolProgress","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","failureDetail","progressStage","failed","succeeded","showProgress","ToolShell","ToolShellHeader","CreatingYourProject","Show","ToolShellFooter"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { isScreenshotTool as x } from "@reforma/types/sandbox";
2
- import { getToolName as E } from "ai";
1
+ import { getToolName as x } from "@reforma/types";
2
+ import { isScreenshotTool as E } from "@reforma/types/sandbox";
3
3
  import { Box as u } from "../../../Box/Box.js";
4
4
  import { Show as k } from "../../../Show/Show.js";
5
5
  import { Text as w } from "../../../Text/Text.js";
@@ -28,7 +28,7 @@ function _({
28
28
  live: r,
29
29
  stalled: g
30
30
  } = D(o.state);
31
- if (!x(E(o)))
31
+ if (!E(x(o)))
32
32
  return null;
33
33
  const i = o.state, v = C(o), l = i === "output-available", c = o.output, y = l && c?.ok === !0 ? c : void 0, a = (l ? G(o.output) : void 0) ?? v.tooltip, m = N(o.input), S = I(i), s = y?.attachments ?? [], e = !S && s.length === 0, T = e ? [{
34
34
  key: "failed",
@@ -1 +1 @@
1
- {"version":3,"file":"CaptureScreenshotTool.js","sources":["../../../../src/chat/Tool/screenshot/CaptureScreenshotTool.tsx"],"sourcesContent":["import { isScreenshotTool } from '@reforma/types/sandbox';\nimport { getToolName } from 'ai';\n\nimport { Box } from '../../../Box';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport {\n ImageAssetCardTitle,\n ImageAssetThumbFan,\n type ImageAssetFanSlot,\n} from '../image-asset';\nimport styles from '../image-asset/ImageAssetTool.module.css';\nimport { ToolShellCard } from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport {\n screenshotAttachmentLabel,\n screenshotPageAddress,\n} from './parseCaptureScreenshotTool';\n\nimport type { AttachmentData, CaptureScreenshotOutput } from '@reforma/types';\nimport type { ToolRendererProps } from '../types';\n\nconst PROGRESS = 'Capturing screenshot';\nconst IDLE = 'Captured';\nconst FAILED = 'Couldn\\'t capture the screenshot';\n\nfunction screenshotSrc(attachment: AttachmentData): string | undefined {\n const src = attachment.preview?.trim() || attachment.url?.trim();\n\n return src || undefined;\n}\n\nfunction captureScreenshotErrorFromOutput(output: unknown): string | undefined {\n if (typeof output !== 'object' || output === null || !('ok' in output) || output.ok !== false) {\n return undefined;\n }\n\n const error = (output as { error?: unknown }).error;\n\n return typeof error === 'string' ? (error.trim() || undefined) : undefined;\n}\n\n/** PageScreenshot: same thumb card as ImageGen, with the page address as the caption. */\nexport function CaptureScreenshotTool({ part }: ToolRendererProps) {\n const { live, stalled } = useToolProgress(part.state);\n\n if (!isScreenshotTool(getToolName(part))) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const done = state === 'output-available';\n const output = part.output as CaptureScreenshotOutput | undefined;\n const success = (done && output?.ok === true) ? output : undefined;\n const outputError = done ? captureScreenshotErrorFromOutput(part.output) : undefined;\n const error = outputError ?? failure.tooltip;\n const address = screenshotPageAddress(part.input);\n const inProgress = isToolInvocationInProgress(state);\n const shots = success?.attachments ?? [];\n const failedEmpty = !inProgress && shots.length === 0;\n const slots: ImageAssetFanSlot[] = failedEmpty\n ? [{ key: 'failed', alt: FAILED }]\n : shots.length > 0\n ? shots.map((attachment, index) => {\n const src = screenshotSrc(attachment);\n\n return {\n key: src || attachment.id || `shot-${ index }`,\n src,\n alt: screenshotAttachmentLabel(attachment),\n };\n })\n : [{ key: 'pending', alt: PROGRESS }];\n\n return (\n <ToolShellCard\n aria-busy={ live }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"capture-screenshot-tool\"\n >\n <Box direction=\"row\" fullWidth gap=\"md\" padding=\"md\">\n <ImageAssetThumbFan\n badge={ live ? 'loader' : failedEmpty ? 'error' : undefined }\n slots={ slots }\n />\n <Box gap=\"xxs\" grow>\n <ImageAssetCardTitle\n failed={ !failedEmpty && Boolean(error) }\n idle={ failedEmpty ? FAILED : IDLE }\n live={ live }\n progress={ PROGRESS }\n stalled={ stalled }\n statusDetail={ error }\n />\n <Show when={ address }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { address }\n </Text>\n </Show>\n </Box>\n </Box>\n </ToolShellCard>\n );\n}\n"],"names":["PROGRESS","IDLE","FAILED","screenshotSrc","attachment","captureScreenshotErrorFromOutput","output","error","CaptureScreenshotTool","part","live","stalled","useToolProgress","isScreenshotTool","getToolName","state","failure","getToolFailureRowState","done","success","address","screenshotPageAddress","inProgress","isToolInvocationInProgress","shots","failedEmpty","slots","index","src","screenshotAttachmentLabel","ToolShellCard","shellStyles","Box","_jsx","ImageAssetThumbFan","_jsxs","ImageAssetCardTitle","Show","Text","styles"],"mappings":";;;;;;;;;;;;;AAaA,MAAMA,IAAW,wBACXC,IAAO,YACPC,IAAS;AACf,SAASC,EAAcC,GAAY;AAEjC,SADYA,EAAW,SAAS,UAAUA,EAAW,KAAK,KAAA,KAC5C;AAChB;AACA,SAASC,EAAiCC,GAAQ;AAChD,MAAI,OAAOA,KAAW,YAAYA,MAAW,QAAQ,EAAE,QAAQA,MAAWA,EAAO,OAAO;AACtF;AAEF,QAAMC,IAAQD,EAAO;AACrB,SAAO,OAAOC,KAAU,YAAWA,EAAM,KAAA,KAAU;AACrD;AAGO,SAASC,EAAsB;AAAA,EACpC,MAAAC;AACF,GAAG;AACD,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA,SAAAC;AAAA,EAAA,IACEC,EAAgBH,EAAK,KAAK;AAC9B,MAAI,CAACI,EAAiBC,EAAYL,CAAI,CAAC;AACrC,WAAO;AAET,QAAMM,IAAQN,EAAK,OACbO,IAAUC,EAAuBR,CAAI,GACrCS,IAAOH,MAAU,oBACjBT,IAASG,EAAK,QACdU,IAAUD,KAAQZ,GAAQ,OAAO,KAAOA,IAAS,QAEjDC,KADcW,IAAOb,EAAiCI,EAAK,MAAM,IAAI,WAC9CO,EAAQ,SAC/BI,IAAUC,EAAsBZ,EAAK,KAAK,GAC1Ca,IAAaC,EAA2BR,CAAK,GAC7CS,IAAQL,GAAS,eAAe,CAAA,GAChCM,IAAc,CAACH,KAAcE,EAAM,WAAW,GAC9CE,IAAQD,IAAc,CAAC;AAAA,IAC3B,KAAK;AAAA,IACL,KAAKvB;AAAA,EAAA,CACN,IAAIsB,EAAM,SAAS,IAAIA,EAAM,IAAI,CAACpB,GAAYuB,MAAU;AACvD,UAAMC,IAAMzB,EAAcC,CAAU;AACpC,WAAO;AAAA,MACL,KAAKwB,KAAOxB,EAAW,MAAM,QAAQuB,CAAK;AAAA,MAC1C,KAAAC;AAAA,MACA,KAAKC,EAA0BzB,CAAU;AAAA,IAAA;AAAA,EAE7C,CAAC,IAAI,CAAC;AAAA,IACJ,KAAK;AAAA,IACL,KAAKJ;AAAA,EAAA,CACN;AACD,2BAAyB8B,GAAe;AAAA,IACtC,aAAapB;AAAA,IACb,WAAWqB,EAAY;AAAA,IACvB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,4BAA6BC,GAAK;AAAA,MAChC,WAAW;AAAA,MACX,WAAW;AAAA,MACX,KAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU,CAAcC,gBAAAA,EAAKC,GAAoB;AAAA,QAC/C,OAAOxB,IAAO,WAAWe,IAAc,UAAU;AAAA,QACjD,OAAAC;AAAA,MAAA,CACD,GAAgBS,gBAAAA,EAAMH,GAAK;AAAA,QAC1B,KAAK;AAAA,QACL,MAAM;AAAA,QACN,UAAU,CAAcC,gBAAAA,EAAKG,GAAqB;AAAA,UAChD,QAAQ,CAACX,KAAe,EAAQlB;AAAA,UAChC,MAAMkB,IAAcvB,IAASD;AAAA,UAC7B,MAAAS;AAAA,UACA,UAAUV;AAAA,UACV,SAAAW;AAAA,UACA,cAAcJ;AAAA,QAAA,CACf,GAAgB0B,gBAAAA,EAAKI,GAAM;AAAA,UAC1B,MAAMjB;AAAA,UACN,4BAA4BkB,GAAM;AAAA,YAChC,WAAWC,EAAO;AAAA,YAClB,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAUnB;AAAA,UAAA,CACX;AAAA,QAAA,CACF,CAAC;AAAA,MAAA,CACH,CAAC;AAAA,IAAA,CACH;AAAA,EAAA,CACF;AACH;"}
1
+ {"version":3,"file":"CaptureScreenshotTool.js","sources":["../../../../src/chat/Tool/screenshot/CaptureScreenshotTool.tsx"],"sourcesContent":["import { getToolName } from '@reforma/types';\nimport { isScreenshotTool } from '@reforma/types/sandbox';\n\nimport { Box } from '../../../Box';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport {\n ImageAssetCardTitle,\n ImageAssetThumbFan,\n type ImageAssetFanSlot,\n} from '../image-asset';\nimport styles from '../image-asset/ImageAssetTool.module.css';\nimport { ToolShellCard } from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport {\n screenshotAttachmentLabel,\n screenshotPageAddress,\n} from './parseCaptureScreenshotTool';\n\nimport type { AttachmentData, CaptureScreenshotOutput } from '@reforma/types';\nimport type { ToolRendererProps } from '../types';\n\nconst PROGRESS = 'Capturing screenshot';\nconst IDLE = 'Captured';\nconst FAILED = 'Couldn\\'t capture the screenshot';\n\nfunction screenshotSrc(attachment: AttachmentData): string | undefined {\n const src = attachment.preview?.trim() || attachment.url?.trim();\n\n return src || undefined;\n}\n\nfunction captureScreenshotErrorFromOutput(output: unknown): string | undefined {\n if (typeof output !== 'object' || output === null || !('ok' in output) || output.ok !== false) {\n return undefined;\n }\n\n const error = (output as { error?: unknown }).error;\n\n return typeof error === 'string' ? (error.trim() || undefined) : undefined;\n}\n\n/** PageScreenshot: same thumb card as ImageGen, with the page address as the caption. */\nexport function CaptureScreenshotTool({ part }: ToolRendererProps) {\n const { live, stalled } = useToolProgress(part.state);\n\n if (!isScreenshotTool(getToolName(part))) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const done = state === 'output-available';\n const output = part.output as CaptureScreenshotOutput | undefined;\n const success = (done && output?.ok === true) ? output : undefined;\n const outputError = done ? captureScreenshotErrorFromOutput(part.output) : undefined;\n const error = outputError ?? failure.tooltip;\n const address = screenshotPageAddress(part.input);\n const inProgress = isToolInvocationInProgress(state);\n const shots = success?.attachments ?? [];\n const failedEmpty = !inProgress && shots.length === 0;\n const slots: ImageAssetFanSlot[] = failedEmpty\n ? [{ key: 'failed', alt: FAILED }]\n : shots.length > 0\n ? shots.map((attachment, index) => {\n const src = screenshotSrc(attachment);\n\n return {\n key: src || attachment.id || `shot-${ index }`,\n src,\n alt: screenshotAttachmentLabel(attachment),\n };\n })\n : [{ key: 'pending', alt: PROGRESS }];\n\n return (\n <ToolShellCard\n aria-busy={ live }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"capture-screenshot-tool\"\n >\n <Box direction=\"row\" fullWidth gap=\"md\" padding=\"md\">\n <ImageAssetThumbFan\n badge={ live ? 'loader' : failedEmpty ? 'error' : undefined }\n slots={ slots }\n />\n <Box gap=\"xxs\" grow>\n <ImageAssetCardTitle\n failed={ !failedEmpty && Boolean(error) }\n idle={ failedEmpty ? FAILED : IDLE }\n live={ live }\n progress={ PROGRESS }\n stalled={ stalled }\n statusDetail={ error }\n />\n <Show when={ address }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { address }\n </Text>\n </Show>\n </Box>\n </Box>\n </ToolShellCard>\n );\n}\n"],"names":["PROGRESS","IDLE","FAILED","screenshotSrc","attachment","captureScreenshotErrorFromOutput","output","error","CaptureScreenshotTool","part","live","stalled","useToolProgress","isScreenshotTool","getToolName","state","failure","getToolFailureRowState","done","success","address","screenshotPageAddress","inProgress","isToolInvocationInProgress","shots","failedEmpty","slots","index","src","screenshotAttachmentLabel","ToolShellCard","shellStyles","Box","_jsx","ImageAssetThumbFan","_jsxs","ImageAssetCardTitle","Show","Text","styles"],"mappings":";;;;;;;;;;;;;AAaA,MAAMA,IAAW,wBACXC,IAAO,YACPC,IAAS;AACf,SAASC,EAAcC,GAAY;AAEjC,SADYA,EAAW,SAAS,UAAUA,EAAW,KAAK,KAAA,KAC5C;AAChB;AACA,SAASC,EAAiCC,GAAQ;AAChD,MAAI,OAAOA,KAAW,YAAYA,MAAW,QAAQ,EAAE,QAAQA,MAAWA,EAAO,OAAO;AACtF;AAEF,QAAMC,IAAQD,EAAO;AACrB,SAAO,OAAOC,KAAU,YAAWA,EAAM,KAAA,KAAU;AACrD;AAGO,SAASC,EAAsB;AAAA,EACpC,MAAAC;AACF,GAAG;AACD,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA,SAAAC;AAAA,EAAA,IACEC,EAAgBH,EAAK,KAAK;AAC9B,MAAI,CAACI,EAAiBC,EAAYL,CAAI,CAAC;AACrC,WAAO;AAET,QAAMM,IAAQN,EAAK,OACbO,IAAUC,EAAuBR,CAAI,GACrCS,IAAOH,MAAU,oBACjBT,IAASG,EAAK,QACdU,IAAUD,KAAQZ,GAAQ,OAAO,KAAOA,IAAS,QAEjDC,KADcW,IAAOb,EAAiCI,EAAK,MAAM,IAAI,WAC9CO,EAAQ,SAC/BI,IAAUC,EAAsBZ,EAAK,KAAK,GAC1Ca,IAAaC,EAA2BR,CAAK,GAC7CS,IAAQL,GAAS,eAAe,CAAA,GAChCM,IAAc,CAACH,KAAcE,EAAM,WAAW,GAC9CE,IAAQD,IAAc,CAAC;AAAA,IAC3B,KAAK;AAAA,IACL,KAAKvB;AAAA,EAAA,CACN,IAAIsB,EAAM,SAAS,IAAIA,EAAM,IAAI,CAACpB,GAAYuB,MAAU;AACvD,UAAMC,IAAMzB,EAAcC,CAAU;AACpC,WAAO;AAAA,MACL,KAAKwB,KAAOxB,EAAW,MAAM,QAAQuB,CAAK;AAAA,MAC1C,KAAAC;AAAA,MACA,KAAKC,EAA0BzB,CAAU;AAAA,IAAA;AAAA,EAE7C,CAAC,IAAI,CAAC;AAAA,IACJ,KAAK;AAAA,IACL,KAAKJ;AAAA,EAAA,CACN;AACD,2BAAyB8B,GAAe;AAAA,IACtC,aAAapB;AAAA,IACb,WAAWqB,EAAY;AAAA,IACvB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,4BAA6BC,GAAK;AAAA,MAChC,WAAW;AAAA,MACX,WAAW;AAAA,MACX,KAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU,CAAcC,gBAAAA,EAAKC,GAAoB;AAAA,QAC/C,OAAOxB,IAAO,WAAWe,IAAc,UAAU;AAAA,QACjD,OAAAC;AAAA,MAAA,CACD,GAAgBS,gBAAAA,EAAMH,GAAK;AAAA,QAC1B,KAAK;AAAA,QACL,MAAM;AAAA,QACN,UAAU,CAAcC,gBAAAA,EAAKG,GAAqB;AAAA,UAChD,QAAQ,CAACX,KAAe,EAAQlB;AAAA,UAChC,MAAMkB,IAAcvB,IAASD;AAAA,UAC7B,MAAAS;AAAA,UACA,UAAUV;AAAA,UACV,SAAAW;AAAA,UACA,cAAcJ;AAAA,QAAA,CACf,GAAgB0B,gBAAAA,EAAKI,GAAM;AAAA,UAC1B,MAAMjB;AAAA,UACN,4BAA4BkB,GAAM;AAAA,YAChC,WAAWC,EAAO;AAAA,YAClB,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAUnB;AAAA,UAAA,CACX;AAAA,QAAA,CACF,CAAC;AAAA,MAAA,CACH,CAAC;AAAA,IAAA,CACH;AAAA,EAAA,CACF;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Book as a } from "@reforma/icons/14";
2
- import { isToolUIPart as m, getToolName as s } from "ai";
2
+ import { isToolUIPart as m, getToolName as s } from "@reforma/types";
3
3
  import { Show as d } from "../../../Show/Show.js";
4
4
  import { Text as u } from "../../../Text/Text.js";
5
5
  import { getToolFailureRowState as c } from "../helpers.js";
@@ -1 +1 @@
1
- {"version":3,"file":"SkillTool.js","sources":["../../../../src/chat/Tool/skill/SkillTool.tsx"],"sourcesContent":["import { Book } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\n// import { MessageText } from '../../Message/streamdown/MessageText';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n // ToolHoverCard,\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport { skillErrorFromOutput, skillNameFromInput } from './parseSkillTool';\n// import { skillContentFromOutput } from './parseSkillTool';\n// import styles from './SkillTool.module.css';\n\nimport type { ToolRendererProps } from '../types';\n\n/** Skill: badge with skill name. */\nexport function SkillTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Skill') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const name = skillNameFromInput(part.input);\n const done = state === 'output-available';\n const logicalError = done ? skillErrorFromOutput(part.output) : undefined;\n\n // Skill playbook preview (hover card) — hidden from users for now.\n // const content = done ? skillContentFromOutput(part.output) : undefined;\n // const showPreview = done && content != null && logicalError == null;\n\n const nameBadges = (\n <ToolSummaryBadges labels={ name ? [name] : [] } aria-label=\"Skill\" />\n );\n\n return (\n <ToolShell data-slot=\"skill-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Loaded skill\"\n titleInProgress=\"Loading skill\"\n icon={ <Book aria-hidden /> }\n >\n {/* <Show when={ showPreview }>\n <ToolHoverCard trigger={ nameBadges } scrollableClassName={ styles.scrollable }>\n <div className={ styles.preview }>\n <MessageText mode=\"static\">{content}</MessageText>\n </div>\n </ToolHoverCard>\n </Show>\n\n <Show when={ !showPreview }>\n {nameBadges}\n </Show> */}\n\n {nameBadges}\n </ToolShellHeader>\n\n <Show when={ 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":["SkillTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","name","skillNameFromInput","logicalError","skillErrorFromOutput","nameBadges","ToolSummaryBadges","ToolShell","_jsx","ToolShellHeader","Book","Show","ToolShellFooter","Text"],"mappings":";;;;;;;;;AAcO,SAASA,EAAU;AAAA,EACxB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQH,EAAK,OACbI,IAAUC,EAAuBL,CAAI,GACrCM,IAAOC,EAAmBP,EAAK,KAAK,GAEpCQ,IADOL,MAAU,qBACKM,EAAqBT,EAAK,MAAM,IAAI,QAM1DU,sBAA+BC,GAAmB;AAAA,IACtD,QAAQL,IAAO,CAACA,CAAI,IAAI,CAAA;AAAA,IACxB,cAAc;AAAA,EAAA,CACf;AACD,2BAA0BM,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAX;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBW,GAAM;AAAA,QAC5B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,UAAUL;AAAA,IAAA,CACX,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMR,KAAgBJ,EAAQ;AAAA,MAC9B,4BAA4Ba,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUV,KAAgBJ,EAAQ;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"SkillTool.js","sources":["../../../../src/chat/Tool/skill/SkillTool.tsx"],"sourcesContent":["import { Book } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\n// import { MessageText } from '../../Message/streamdown/MessageText';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n // ToolHoverCard,\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport { skillErrorFromOutput, skillNameFromInput } from './parseSkillTool';\n// import { skillContentFromOutput } from './parseSkillTool';\n// import styles from './SkillTool.module.css';\n\nimport type { ToolRendererProps } from '../types';\n\n/** Skill: badge with skill name. */\nexport function SkillTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Skill') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const name = skillNameFromInput(part.input);\n const done = state === 'output-available';\n const logicalError = done ? skillErrorFromOutput(part.output) : undefined;\n\n // Skill playbook preview (hover card) — hidden from users for now.\n // const content = done ? skillContentFromOutput(part.output) : undefined;\n // const showPreview = done && content != null && logicalError == null;\n\n const nameBadges = (\n <ToolSummaryBadges labels={ name ? [name] : [] } aria-label=\"Skill\" />\n );\n\n return (\n <ToolShell data-slot=\"skill-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Loaded skill\"\n titleInProgress=\"Loading skill\"\n icon={ <Book aria-hidden /> }\n >\n {/* <Show when={ showPreview }>\n <ToolHoverCard trigger={ nameBadges } scrollableClassName={ styles.scrollable }>\n <div className={ styles.preview }>\n <MessageText mode=\"static\">{content}</MessageText>\n </div>\n </ToolHoverCard>\n </Show>\n\n <Show when={ !showPreview }>\n {nameBadges}\n </Show> */}\n\n {nameBadges}\n </ToolShellHeader>\n\n <Show when={ 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":["SkillTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","name","skillNameFromInput","logicalError","skillErrorFromOutput","nameBadges","ToolSummaryBadges","ToolShell","_jsx","ToolShellHeader","Book","Show","ToolShellFooter","Text"],"mappings":";;;;;;;;;AAcO,SAASA,EAAU;AAAA,EACxB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQH,EAAK,OACbI,IAAUC,EAAuBL,CAAI,GACrCM,IAAOC,EAAmBP,EAAK,KAAK,GAEpCQ,IADOL,MAAU,qBACKM,EAAqBT,EAAK,MAAM,IAAI,QAM1DU,sBAA+BC,GAAmB;AAAA,IACtD,QAAQL,IAAO,CAACA,CAAI,IAAI,CAAA;AAAA,IACxB,cAAc;AAAA,EAAA,CACf;AACD,2BAA0BM,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAX;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBW,GAAM;AAAA,QAC5B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,UAAUL;AAAA,IAAA,CACX,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMR,KAAgBJ,EAAQ;AAAA,MAC9B,4BAA4Ba,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUV,KAAgBJ,EAAQ;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1,5 +1,5 @@
1
1
  import { Oclock as h } from "@reforma/icons/14";
2
- import { isToolUIPart as g, getToolName as p } from "ai";
2
+ import { isToolUIPart as g, getToolName as p } from "@reforma/types";
3
3
  import { observer as T } from "mobx-react-lite";
4
4
  import { useState as w, useEffect as v } from "react";
5
5
  import { Show as a } from "../../../Show/Show.js";
@@ -1 +1 @@
1
- {"version":3,"file":"WaitingTool.js","sources":["../../../../src/chat/Tool/waiting/WaitingTool.tsx"],"sourcesContent":["import { Oclock } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\nimport { observer } from 'mobx-react-lite';\nimport { useEffect, useState } from 'react';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useMessageTurn } from '../../Message/turn/messageTurnContext';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { WaitingToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction waitingEndsAt(value: unknown): number | undefined {\n if (value == null || typeof value !== 'object') {\n return undefined;\n }\n\n const endsAt = (value as WaitingToolOutput).endsAt;\n\n if (typeof endsAt !== 'number' || !Number.isFinite(endsAt)) {\n return undefined;\n }\n\n return endsAt;\n}\n\n/** Waiting: clock icon + remaining seconds from the server `endsAt` unix ms. */\nexport const WaitingTool = observer(({ part }: ToolRendererProps) => {\n const turn = useMessageTurn();\n const [now, setNow] = useState(() => Date.now());\n const isWaiting = isToolUIPart(part) && getToolName(part) === 'Waiting';\n const live = isWaiting && isToolInvocationInProgress(part.state);\n const endsAt = isWaiting\n ? (waitingEndsAt(part.output) ?? waitingEndsAt(turn?.getToolMeta?.(part.toolCallId)?.patch))\n : undefined;\n\n useEffect(() => {\n if (!live) {\n return;\n }\n\n const id = setInterval(() => setNow(Date.now()), 250);\n\n return () => clearInterval(id);\n }, [live]);\n\n if (!isWaiting) {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const remaining = (live && endsAt != null)\n ? Math.max(0, Math.ceil((endsAt - now) / 1000))\n : undefined;\n\n return (\n <ToolShell data-slot=\"waiting-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title=\"Waiting\"\n titleInProgress=\"Waiting\"\n icon={ <Oclock aria-hidden /> }\n >\n <Show when={ remaining != null }>\n <Text color=\"secondary\" whitespace=\"nowrap\">\n {`${ remaining }s`}\n </Text>\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n});\n"],"names":["waitingEndsAt","value","endsAt","WaitingTool","observer","part","turn","useMessageTurn","now","setNow","useState","isWaiting","isToolUIPart","getToolName","live","isToolInvocationInProgress","useEffect","id","failure","getToolFailureRowState","remaining","ToolShell","_jsx","ToolShellHeader","Oclock","Show","Text","ToolShellFooter"],"mappings":";;;;;;;;;;AAUA,SAASA,EAAcC,GAAO;AAC5B,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC;AAEF,QAAMC,IAASD,EAAM;AACrB,MAAI,SAAOC,KAAW,YAAY,CAAC,OAAO,SAASA,CAAM;AAGzD,WAAOA;AACT;AAGO,MAAMC,IAAcC,EAAS,CAAC;AAAA,EACnC,MAAAC;AACF,MAAM;AACJ,QAAMC,IAAOC,EAAA,GACP,CAACC,GAAKC,CAAM,IAAIC,EAAS,MAAM,KAAK,KAAK,GACzCC,IAAYC,EAAaP,CAAI,KAAKQ,EAAYR,CAAI,MAAM,WACxDS,IAAOH,KAAaI,EAA2BV,EAAK,KAAK,GACzDH,IAASS,IAAYX,EAAcK,EAAK,MAAM,KAAKL,EAAcM,GAAM,cAAcD,EAAK,UAAU,GAAG,KAAK,IAAI;AAQtH,MAPAW,EAAU,MAAM;AACd,QAAI,CAACF;AACH;AAEF,UAAMG,IAAK,YAAY,MAAMR,EAAO,KAAK,IAAA,CAAK,GAAG,GAAG;AACpD,WAAO,MAAM,cAAcQ,CAAE;AAAA,EAC/B,GAAG,CAACH,CAAI,CAAC,GACL,CAACH;AACH,WAAO;AAET,QAAMO,IAAUC,EAAuBd,CAAI,GACrCe,IAAYN,KAAQZ,KAAU,OAAO,KAAK,IAAI,GAAG,KAAK,MAAMA,IAASM,KAAO,GAAI,CAAC,IAAI;AAC3F,2BAA0Ba,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOlB,EAAK;AAAA,MACZ,cAAca,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBM,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAML,KAAa;AAAA,QACnB,4BAA4BM,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU,GAAGN,CAAS;AAAA,QAAA,CACvB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBE,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMP,EAAQ;AAAA,MACd,4BAA4BS,GAAiB;AAAA,QAC3C,4BAA4BD,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUR,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH,CAAC;"}
1
+ {"version":3,"file":"WaitingTool.js","sources":["../../../../src/chat/Tool/waiting/WaitingTool.tsx"],"sourcesContent":["import { Oclock } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\nimport { observer } from 'mobx-react-lite';\nimport { useEffect, useState } from 'react';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useMessageTurn } from '../../Message/turn/messageTurnContext';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\n\nimport type { WaitingToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction waitingEndsAt(value: unknown): number | undefined {\n if (value == null || typeof value !== 'object') {\n return undefined;\n }\n\n const endsAt = (value as WaitingToolOutput).endsAt;\n\n if (typeof endsAt !== 'number' || !Number.isFinite(endsAt)) {\n return undefined;\n }\n\n return endsAt;\n}\n\n/** Waiting: clock icon + remaining seconds from the server `endsAt` unix ms. */\nexport const WaitingTool = observer(({ part }: ToolRendererProps) => {\n const turn = useMessageTurn();\n const [now, setNow] = useState(() => Date.now());\n const isWaiting = isToolUIPart(part) && getToolName(part) === 'Waiting';\n const live = isWaiting && isToolInvocationInProgress(part.state);\n const endsAt = isWaiting\n ? (waitingEndsAt(part.output) ?? waitingEndsAt(turn?.getToolMeta?.(part.toolCallId)?.patch))\n : undefined;\n\n useEffect(() => {\n if (!live) {\n return;\n }\n\n const id = setInterval(() => setNow(Date.now()), 250);\n\n return () => clearInterval(id);\n }, [live]);\n\n if (!isWaiting) {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const remaining = (live && endsAt != null)\n ? Math.max(0, Math.ceil((endsAt - now) / 1000))\n : undefined;\n\n return (\n <ToolShell data-slot=\"waiting-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title=\"Waiting\"\n titleInProgress=\"Waiting\"\n icon={ <Oclock aria-hidden /> }\n >\n <Show when={ remaining != null }>\n <Text color=\"secondary\" whitespace=\"nowrap\">\n {`${ remaining }s`}\n </Text>\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n});\n"],"names":["waitingEndsAt","value","endsAt","WaitingTool","observer","part","turn","useMessageTurn","now","setNow","useState","isWaiting","isToolUIPart","getToolName","live","isToolInvocationInProgress","useEffect","id","failure","getToolFailureRowState","remaining","ToolShell","_jsx","ToolShellHeader","Oclock","Show","Text","ToolShellFooter"],"mappings":";;;;;;;;;;AAUA,SAASA,EAAcC,GAAO;AAC5B,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC;AAEF,QAAMC,IAASD,EAAM;AACrB,MAAI,SAAOC,KAAW,YAAY,CAAC,OAAO,SAASA,CAAM;AAGzD,WAAOA;AACT;AAGO,MAAMC,IAAcC,EAAS,CAAC;AAAA,EACnC,MAAAC;AACF,MAAM;AACJ,QAAMC,IAAOC,EAAA,GACP,CAACC,GAAKC,CAAM,IAAIC,EAAS,MAAM,KAAK,KAAK,GACzCC,IAAYC,EAAaP,CAAI,KAAKQ,EAAYR,CAAI,MAAM,WACxDS,IAAOH,KAAaI,EAA2BV,EAAK,KAAK,GACzDH,IAASS,IAAYX,EAAcK,EAAK,MAAM,KAAKL,EAAcM,GAAM,cAAcD,EAAK,UAAU,GAAG,KAAK,IAAI;AAQtH,MAPAW,EAAU,MAAM;AACd,QAAI,CAACF;AACH;AAEF,UAAMG,IAAK,YAAY,MAAMR,EAAO,KAAK,IAAA,CAAK,GAAG,GAAG;AACpD,WAAO,MAAM,cAAcQ,CAAE;AAAA,EAC/B,GAAG,CAACH,CAAI,CAAC,GACL,CAACH;AACH,WAAO;AAET,QAAMO,IAAUC,EAAuBd,CAAI,GACrCe,IAAYN,KAAQZ,KAAU,OAAO,KAAK,IAAI,GAAG,KAAK,MAAMA,IAASM,KAAO,GAAI,CAAC,IAAI;AAC3F,2BAA0Ba,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOlB,EAAK;AAAA,MACZ,cAAca,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBM,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAML,KAAa;AAAA,QACnB,4BAA4BM,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU,GAAGN,CAAS;AAAA,QAAA,CACvB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBE,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMP,EAAQ;AAAA,MACd,4BAA4BS,GAAiB;AAAA,QAC3C,4BAA4BD,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUR,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH,CAAC;"}
@@ -1,5 +1,5 @@
1
1
  import { Globe as m } from "@reforma/icons/14";
2
- import { isToolUIPart as n, getToolName as s } from "ai";
2
+ import { isToolUIPart as n, getToolName as s } from "@reforma/types";
3
3
  import { Show as i } from "../../../Show/Show.js";
4
4
  import { Text as h } from "../../../Text/Text.js";
5
5
  import { getToolFailureRowState as c } from "../helpers.js";
@@ -1 +1 @@
1
- {"version":3,"file":"WebSearchTool.js","sources":["../../../../src/chat/Tool/web-search/WebSearchTool.tsx"],"sourcesContent":["import { Globe } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport { isWebSearchToolName, webSearchSummaryFromPart } from './parseWebSearchTool';\n\nimport type { ToolRendererProps } from '../types';\n\n/** Provider web search: action badge only (URLs live in the message Sources footer). */\nexport function WebSearchTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || !isWebSearchToolName(getToolName(part))) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const done = state === 'output-available';\n const summary = webSearchSummaryFromPart(part.input, done ? part.output : undefined);\n\n return (\n <ToolShell data-slot=\"web-search-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ summary.title }\n titleInProgress={ summary.titleInProgress }\n icon={ <Globe aria-hidden /> }\n >\n <Show when={ summary.labels.length > 0 }>\n <ToolSummaryBadges\n labels={ summary.labels }\n aria-label={ summary['aria-label'] }\n />\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["WebSearchTool","part","isToolUIPart","isWebSearchToolName","getToolName","state","failure","getToolFailureRowState","done","summary","webSearchSummaryFromPart","ToolShell","_jsx","ToolShellHeader","Globe","Show","ToolSummaryBadges","ToolShellFooter","Text"],"mappings":";;;;;;;;;AASO,SAASA,EAAc;AAAA,EAC5B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAK,CAACE,EAAoBC,EAAYH,CAAI,CAAC;AAC/D,WAAO;AAET,QAAMI,IAAQJ,EAAK,OACbK,IAAUC,EAAuBN,CAAI,GACrCO,IAAOH,MAAU,oBACjBI,IAAUC,EAAyBT,EAAK,OAAOO,IAAOP,EAAK,SAAS,MAAS;AACnF,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAR;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAOG,EAAQ;AAAA,MACf,iBAAiBA,EAAQ;AAAA,MACzB,wBAAwBK,GAAO;AAAA,QAC7B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAMN,EAAQ,OAAO,SAAS;AAAA,QAC9B,4BAA4BO,GAAmB;AAAA,UAC7C,QAAQP,EAAQ;AAAA,UAChB,cAAcA,EAAQ,YAAY;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMT,EAAQ;AAAA,MACd,4BAA4BW,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"WebSearchTool.js","sources":["../../../../src/chat/Tool/web-search/WebSearchTool.tsx"],"sourcesContent":["import { Globe } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport { isWebSearchToolName, webSearchSummaryFromPart } from './parseWebSearchTool';\n\nimport type { ToolRendererProps } from '../types';\n\n/** Provider web search: action badge only (URLs live in the message Sources footer). */\nexport function WebSearchTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || !isWebSearchToolName(getToolName(part))) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const done = state === 'output-available';\n const summary = webSearchSummaryFromPart(part.input, done ? part.output : undefined);\n\n return (\n <ToolShell data-slot=\"web-search-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ summary.title }\n titleInProgress={ summary.titleInProgress }\n icon={ <Globe aria-hidden /> }\n >\n <Show when={ summary.labels.length > 0 }>\n <ToolSummaryBadges\n labels={ summary.labels }\n aria-label={ summary['aria-label'] }\n />\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["WebSearchTool","part","isToolUIPart","isWebSearchToolName","getToolName","state","failure","getToolFailureRowState","done","summary","webSearchSummaryFromPart","ToolShell","_jsx","ToolShellHeader","Globe","Show","ToolSummaryBadges","ToolShellFooter","Text"],"mappings":";;;;;;;;;AASO,SAASA,EAAc;AAAA,EAC5B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAK,CAACE,EAAoBC,EAAYH,CAAI,CAAC;AAC/D,WAAO;AAET,QAAMI,IAAQJ,EAAK,OACbK,IAAUC,EAAuBN,CAAI,GACrCO,IAAOH,MAAU,oBACjBI,IAAUC,EAAyBT,EAAK,OAAOO,IAAOP,EAAK,SAAS,MAAS;AACnF,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAR;AAAA,MACA,cAAcC,EAAQ;AAAA,MACtB,OAAOG,EAAQ;AAAA,MACf,iBAAiBA,EAAQ;AAAA,MACzB,wBAAwBK,GAAO;AAAA,QAC7B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAM;AAAA,QAChC,MAAMN,EAAQ,OAAO,SAAS;AAAA,QAC9B,4BAA4BO,GAAmB;AAAA,UAC7C,QAAQP,EAAQ;AAAA,UAChB,cAAcA,EAAQ,YAAY;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMT,EAAQ;AAAA,MACd,4BAA4BW,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@reforma/components",
3
3
  "description": "A components library for Reforma",
4
4
  "type": "module",
5
- "version": "0.4.1",
5
+ "version": "0.5.0",
6
6
  "license": "UNLICENSED",
7
7
  "author": "Reforma, Inc. <dev@reforma.ai>",
8
8
  "repository": {
@@ -69,10 +69,10 @@
69
69
  "@openuidev/react-lang": "^1.0.1",
70
70
  "@react-aria/dnd": "^3.11.6",
71
71
  "@react-stately/utils": "^3.11.0",
72
- "@reforma/constants": "1.0.1",
72
+ "@reforma/constants": "1.1.0",
73
73
  "@reforma/icons": "0.1.0",
74
- "@reforma/lib": "0.1.6",
75
- "@reforma/types": "1.4.0",
74
+ "@reforma/lib": "0.1.7",
75
+ "@reforma/types": "1.5.0",
76
76
  "@shikijs/transformers": "^4.0.2",
77
77
  "@streamdown/cjk": "1.0.3",
78
78
  "@streamdown/code": "1.1.1",