@reforma/components 0.4.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/RichInput/RichInput.d.ts +1 -1
- package/dist/RichInput/RichInput.d.ts.map +1 -1
- package/dist/RichInput/RichInput.js +126 -123
- package/dist/RichInput/RichInput.js.map +1 -1
- package/dist/SortableList/SortableList.d.ts +9 -3
- package/dist/SortableList/SortableList.d.ts.map +1 -1
- package/dist/SortableList/SortableList.js +178 -163
- package/dist/SortableList/SortableList.js.map +1 -1
- package/dist/chat/ComposerBanner/ComposerBanner.d.ts +6 -1
- package/dist/chat/ComposerBanner/ComposerBanner.d.ts.map +1 -1
- package/dist/chat/ComposerBanner/ComposerBanner.js +60 -40
- package/dist/chat/ComposerBanner/ComposerBanner.js.map +1 -1
- package/dist/chat/ComposerBanner/ComposerBanner.module.css +1 -1
- package/dist/chat/ComposerBanner/ComposerBanner.module.css.js +13 -9
- package/dist/chat/ComposerBanner/ComposerBanner.module.css.js.map +1 -1
- package/dist/chat/Conversation/ConversationPendingLoader.d.ts.map +1 -1
- package/dist/chat/Conversation/ConversationPendingLoader.js +1 -1
- package/dist/chat/Conversation/ConversationPendingLoader.js.map +1 -1
- package/dist/chat/Message/normalize/normalizeMessageParts.d.ts +1 -1
- package/dist/chat/Message/normalize/normalizeMessageParts.d.ts.map +1 -1
- package/dist/chat/Message/normalize/normalizeMessageParts.js +1 -1
- package/dist/chat/Message/normalize/normalizeMessageParts.js.map +1 -1
- package/dist/chat/Message/parts/MessagePart.d.ts.map +1 -1
- package/dist/chat/Message/parts/MessagePart.js +1 -1
- package/dist/chat/Message/parts/MessagePart.js.map +1 -1
- package/dist/chat/Message/parts/backgroundResultPart.js +1 -1
- package/dist/chat/Message/parts/backgroundResultPart.js.map +1 -1
- package/dist/chat/Message/parts/collectMessageSources.d.ts +1 -1
- package/dist/chat/Message/parts/collectMessageSources.d.ts.map +1 -1
- package/dist/chat/Message/parts/collectMessageSources.js +1 -1
- package/dist/chat/Message/parts/collectMessageSources.js.map +1 -1
- package/dist/chat/Message/parts/contextCompactionPart.js +1 -1
- package/dist/chat/Message/parts/contextCompactionPart.js.map +1 -1
- package/dist/chat/Message/segments/analyzeGroupedSegment.js +5 -5
- package/dist/chat/Message/segments/analyzeGroupedSegment.js.map +1 -1
- package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js +1 -1
- package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js.map +1 -1
- package/dist/chat/Message/turn/workedCollapse.js +1 -1
- package/dist/chat/Message/turn/workedCollapse.js.map +1 -1
- package/dist/chat/Tool/Tool.js +1 -1
- package/dist/chat/Tool/Tool.js.map +1 -1
- package/dist/chat/Tool/agent/AgentTool.d.ts.map +1 -1
- package/dist/chat/Tool/agent/AgentTool.js +73 -73
- package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
- package/dist/chat/Tool/bash/BashTool.d.ts.map +1 -1
- package/dist/chat/Tool/bash/BashTool.js +42 -48
- package/dist/chat/Tool/bash/BashTool.js.map +1 -1
- package/dist/chat/Tool/bash/BashTool.module.css +1 -1
- package/dist/chat/Tool/bash/BashTool.module.css.js +6 -8
- package/dist/chat/Tool/bash/BashTool.module.css.js.map +1 -1
- package/dist/chat/Tool/create-directory/CreateDirectoryTool.js +1 -1
- package/dist/chat/Tool/create-directory/CreateDirectoryTool.js.map +1 -1
- package/dist/chat/Tool/default/Default.d.ts.map +1 -1
- package/dist/chat/Tool/default/Default.js +1 -1
- package/dist/chat/Tool/default/Default.js.map +1 -1
- package/dist/chat/Tool/dev-server/DevServerRestartTool.js +1 -1
- package/dist/chat/Tool/dev-server/DevServerRestartTool.js.map +1 -1
- package/dist/chat/Tool/dev-server/DevServerStatusTool.js +1 -1
- package/dist/chat/Tool/dev-server/DevServerStatusTool.js.map +1 -1
- package/dist/chat/Tool/edit/EditTool.js +1 -1
- package/dist/chat/Tool/edit/EditTool.js.map +1 -1
- package/dist/chat/Tool/fetch/FetchTool.js +1 -1
- package/dist/chat/Tool/fetch/FetchTool.js.map +1 -1
- package/dist/chat/Tool/fileChangesFromToolParts.js +1 -1
- package/dist/chat/Tool/fileChangesFromToolParts.js.map +1 -1
- package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js +1 -1
- package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js.map +1 -1
- package/dist/chat/Tool/get-errors/GetErrorsTool.js +1 -1
- package/dist/chat/Tool/get-errors/GetErrorsTool.js.map +1 -1
- package/dist/chat/Tool/glob/GlobTool.js +1 -1
- package/dist/chat/Tool/glob/GlobTool.js.map +1 -1
- package/dist/chat/Tool/grep/GrepTool.js +1 -1
- package/dist/chat/Tool/grep/GrepTool.js.map +1 -1
- package/dist/chat/Tool/helpers.d.ts +1 -1
- package/dist/chat/Tool/helpers.d.ts.map +1 -1
- package/dist/chat/Tool/helpers.js +1 -1
- package/dist/chat/Tool/helpers.js.map +1 -1
- package/dist/chat/Tool/image-asset/ImageAssetTool.js +1 -1
- package/dist/chat/Tool/image-asset/ImageAssetTool.js.map +1 -1
- package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js +1 -1
- package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js.map +1 -1
- package/dist/chat/Tool/install-plugin/InstallPlugin.js +1 -1
- package/dist/chat/Tool/install-plugin/InstallPlugin.js.map +1 -1
- package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts +3 -1
- package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts.map +1 -1
- package/dist/chat/Tool/integration-card/IntegrationActionCard.js +88 -82
- package/dist/chat/Tool/integration-card/IntegrationActionCard.js.map +1 -1
- package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js +1 -1
- package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js.map +1 -1
- package/dist/chat/Tool/mcp-tools/CallDynamicTool.js +1 -1
- package/dist/chat/Tool/mcp-tools/CallDynamicTool.js.map +1 -1
- package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js +1 -1
- package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js.map +1 -1
- package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js +1 -1
- package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js.map +1 -1
- package/dist/chat/Tool/mcp-tools/McpAuth.js +1 -1
- package/dist/chat/Tool/mcp-tools/McpAuth.js.map +1 -1
- package/dist/chat/Tool/memory/MemoryTool.js +1 -1
- package/dist/chat/Tool/memory/MemoryTool.js.map +1 -1
- package/dist/chat/Tool/move-file/MoveFileTool.js +1 -1
- package/dist/chat/Tool/move-file/MoveFileTool.js.map +1 -1
- package/dist/chat/Tool/plan/CreatePlanTool.js +1 -1
- package/dist/chat/Tool/plan/CreatePlanTool.js.map +1 -1
- package/dist/chat/Tool/preamble/PreambleTool.js +1 -1
- package/dist/chat/Tool/preamble/PreambleTool.js.map +1 -1
- package/dist/chat/Tool/project-build/BuildTool.js +1 -1
- package/dist/chat/Tool/project-build/BuildTool.js.map +1 -1
- package/dist/chat/Tool/project-env/ProjectEnvTool.js +1 -1
- package/dist/chat/Tool/project-env/ProjectEnvTool.js.map +1 -1
- package/dist/chat/Tool/read/normalizeReadTools.js +1 -1
- package/dist/chat/Tool/read/normalizeReadTools.js.map +1 -1
- package/dist/chat/Tool/read-lints/ReadLintsTool.js +1 -1
- package/dist/chat/Tool/read-lints/ReadLintsTool.js.map +1 -1
- package/dist/chat/Tool/remove-file/RemoveFileTool.js +1 -1
- package/dist/chat/Tool/remove-file/RemoveFileTool.js.map +1 -1
- package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js +1 -1
- package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js.map +1 -1
- package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js +3 -3
- package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js.map +1 -1
- package/dist/chat/Tool/skill/SkillTool.js +1 -1
- package/dist/chat/Tool/skill/SkillTool.js.map +1 -1
- package/dist/chat/Tool/waiting/WaitingTool.js +1 -1
- package/dist/chat/Tool/waiting/WaitingTool.js.map +1 -1
- package/dist/chat/Tool/web-search/WebSearchTool.js +1 -1
- package/dist/chat/Tool/web-search/WebSearchTool.js.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetDynamicToolsTool.js","sources":["../../../../src/chat/Tool/mcp-tools/GetDynamicToolsTool.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"GetDynamicToolsTool.js","sources":["../../../../src/chat/Tool/mcp-tools/GetDynamicToolsTool.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { getToolFailureRowState } from '../helpers';\nimport { ToolShell, ToolShellHeader } from '../shell';\n\nimport type { GetDynamicToolsToolInput } from '@reforma/types';\nimport type { ToolRendererProps } from '../types';\n\nfunction namespaceFromInput(input: unknown): string {\n if (input == null || typeof input !== 'object') {\n return '';\n }\n\n const namespace = (input as GetDynamicToolsToolInput).namespace;\n\n return typeof namespace === 'string' ? namespace.trim() : '';\n}\n\n/** GetDynamicTools: compact catalog discovery row (no tool output in the UI). */\nexport function GetDynamicToolsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'GetDynamicTools') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const namespace = namespaceFromInput(part.input);\n const subject = namespace ? `${ namespace } tools` : 'tools';\n\n return (\n <ToolShell data-slot=\"get-dynamic-tools-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ `Listed ${ subject }` }\n titleInProgress={ `Listing ${ subject }` }\n icon={ <Mcp aria-hidden /> }\n />\n </ToolShell>\n );\n}\n"],"names":["namespaceFromInput","input","namespace","GetDynamicToolsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","subject","ToolShell","ToolShellHeader","Mcp"],"mappings":";;;;;AAKA,SAASA,EAAmBC,GAAO;AACjC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO;AAET,QAAMC,IAAYD,EAAM;AACxB,SAAO,OAAOC,KAAc,WAAWA,EAAU,SAAS;AAC5D;AAGO,SAASC,EAAoB;AAAA,EAClC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCF,IAAYF,EAAmBI,EAAK,KAAK,GACzCK,IAAUP,IAAY,GAAGA,CAAS,WAAW;AACnD,2BAAyBQ,GAAW;AAAA,IAClC,aAAa;AAAA,IACb,4BAA4BC,GAAiB;AAAA,MAC3C,OAAOP,EAAK;AAAA,MACZ,cAAcG,EAAQ;AAAA,MACtB,OAAO,UAAUE,CAAO;AAAA,MACxB,iBAAiB,WAAWA,CAAO;AAAA,MACnC,wBAAwBG,GAAK;AAAA,QAC3B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACH;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Book as c, Mcp as u } from "@reforma/icons/14";
|
|
2
|
-
import { isToolUIPart as a, getToolName as n } from "
|
|
2
|
+
import { isToolUIPart as a, getToolName as n } from "@reforma/types";
|
|
3
3
|
import { Show as m } from "../../../Show/Show.js";
|
|
4
4
|
import { Text as d } from "../../../Text/Text.js";
|
|
5
5
|
import { getToolFailureRowState as p } from "../helpers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GetMcpResourcesTool.js","sources":["../../../../src/chat/Tool/mcp-tools/GetMcpResourcesTool.tsx"],"sourcesContent":["import { Book, Mcp } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"GetMcpResourcesTool.js","sources":["../../../../src/chat/Tool/mcp-tools/GetMcpResourcesTool.tsx"],"sourcesContent":["import { Book, Mcp } 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 {\n mcpResourceBadgeLabel,\n mcpResourceErrorFromOutput,\n parseGetMcpResourcesInput,\n} from './parseGetMcpResources';\n\nimport type { ToolRendererProps } from '../types';\n\n/** GetMcpResources: list row or Skill-like read row. Body stays out of the UI. */\nexport function GetMcpResourcesTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'GetMcpResources') {\n return null;\n }\n\n const { isRead } = parseGetMcpResourcesInput(part.input);\n const failure = getToolFailureRowState(part);\n const done = part.state === 'output-available';\n const logicalError = done ? mcpResourceErrorFromOutput(part.output) : undefined;\n const badge = mcpResourceBadgeLabel(part.input, done ? part.output : undefined);\n\n return (\n <ToolShell data-slot=\"get-mcp-resources-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ isRead ? 'Read resource' : 'Listed MCP resources' }\n titleInProgress={ isRead ? 'Reading resource' : 'Listing MCP resources' }\n icon={ isRead ? <Book aria-hidden /> : <Mcp aria-hidden /> }\n >\n <ToolSummaryBadges\n labels={ badge ? [badge] : [] }\n aria-label={ isRead ? 'Resource' : 'MCP server' }\n />\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":["GetMcpResourcesTool","part","isToolUIPart","getToolName","isRead","parseGetMcpResourcesInput","failure","getToolFailureRowState","done","logicalError","mcpResourceErrorFromOutput","badge","mcpResourceBadgeLabel","ToolShell","_jsx","ToolShellHeader","Book","Mcp","ToolSummaryBadges","Show","ToolShellFooter","Text"],"mappings":";;;;;;;;;AASO,SAASA,EAAoB;AAAA,EAClC,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAM;AAAA,IACJ,QAAAG;AAAA,EAAA,IACEC,EAA0BJ,EAAK,KAAK,GAClCK,IAAUC,EAAuBN,CAAI,GACrCO,IAAOP,EAAK,UAAU,oBACtBQ,IAAeD,IAAOE,EAA2BT,EAAK,MAAM,IAAI,QAChEU,IAAQC,EAAsBX,EAAK,OAAOO,IAAOP,EAAK,SAAS,MAAS;AAC9E,2BAA0BY,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOd,EAAK;AAAA,MACZ,cAAcK,EAAQ;AAAA,MACtB,OAAOF,IAAS,kBAAkB;AAAA,MAClC,iBAAiBA,IAAS,qBAAqB;AAAA,MAC/C,MAAMA,IAAsBU,gBAAAA,EAAKE,GAAM;AAAA,QACrC,eAAe;AAAA,MAAA,CAChB,IAAiBF,gBAAAA,EAAKG,GAAK;AAAA,QAC1B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA4BC,GAAmB;AAAA,QAC7C,QAAQP,IAAQ,CAACA,CAAK,IAAI,CAAA;AAAA,QAC1B,cAAcP,IAAS,aAAa;AAAA,MAAA,CACrC;AAAA,IAAA,CACF,GAAgBU,gBAAAA,EAAKK,GAAM;AAAA,MAC1B,MAAMV,KAAgBH,EAAQ;AAAA,MAC9B,4BAA4Bc,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUZ,KAAgBH,EAAQ;AAAA,QAAA,CACnC;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isToolUIPart as p, getToolName as f } from "
|
|
1
|
+
import { isToolUIPart as p, getToolName as f } from "@reforma/types";
|
|
2
2
|
import { useState as u } from "react";
|
|
3
3
|
import { useChat as c } from "../../ChatContext.js";
|
|
4
4
|
import { IntegrationActionCard as v } from "../integration-card/IntegrationActionCard.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpAuth.js","sources":["../../../../src/chat/Tool/mcp-tools/McpAuth.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"McpAuth.js","sources":["../../../../src/chat/Tool/mcp-tools/McpAuth.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\nimport { useState } from 'react';\n\nimport { useChat } from '../../ChatContext';\nimport { IntegrationActionCard } from '../integration-card/IntegrationActionCard';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction mcpAuthServer(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n\n const server = (input as { server?: unknown }).server;\n\n return typeof server === 'string' ? server.trim() || undefined : undefined;\n}\n\n/** McpAuth: Skip / Login plaque. Hidden after the user responds. */\nexport function McpAuth({ part, onToolApprovalResponse }: ToolRendererProps) {\n const { pluginsCatalog, onIntegrationLogin } = useChat();\n const [loggingIn, setLoggingIn] = useState(false);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'McpAuth' || part.state !== 'approval-requested') {\n return null;\n }\n\n const server = mcpAuthServer(part.input);\n const row = server\n ? pluginsCatalog?.integrations.find(item => item.serverId === server || item.id === server)\n : undefined;\n const integrationId = row?.id ?? server;\n const name = row?.name ?? server ?? 'MCP';\n const approvalId = part.approval?.id;\n\n return (\n <IntegrationActionCard\n data-slot=\"mcp-auth-tool\"\n name={ name }\n description=\"Login required\"\n logo={ row?.logo }\n brandColor={ row?.brandColor }\n brandColorDark={ row?.brandColorDark }\n primaryLabel=\"Login\"\n isPending={ loggingIn }\n isPrimaryDisabled={ !onIntegrationLogin || !integrationId || !approvalId }\n onSkip={ () => {\n if (!approvalId) {\n return;\n }\n\n onToolApprovalResponse?.({\n id: approvalId,\n approved: false,\n });\n } }\n onPrimary={ () => {\n if (!integrationId || !approvalId) {\n return;\n }\n\n setLoggingIn(true);\n void Promise.resolve(\n onIntegrationLogin?.({ integrationId, approvalId })\n ).finally(() => {\n setLoggingIn(false);\n });\n } }\n />\n );\n}\n"],"names":["mcpAuthServer","input","server","McpAuth","part","onToolApprovalResponse","pluginsCatalog","onIntegrationLogin","useChat","loggingIn","setLoggingIn","useState","isToolUIPart","getToolName","row","item","integrationId","name","approvalId","IntegrationActionCard"],"mappings":";;;;;AAKA,SAASA,EAAcC,GAAO;AAC5B,MAAI,CAACA,KAAS,OAAOA,KAAU;AAC7B;AAEF,QAAMC,IAASD,EAAM;AACrB,SAAO,OAAOC,KAAW,YAAWA,EAAO,KAAA,KAAU;AACvD;AAGO,SAASC,EAAQ;AAAA,EACtB,MAAAC;AAAA,EACA,wBAAAC;AACF,GAAG;AACD,QAAM;AAAA,IACJ,gBAAAC;AAAA,IACA,oBAAAC;AAAA,EAAA,IACEC,EAAA,GACE,CAACC,GAAWC,CAAY,IAAIC,EAAS,EAAK;AAChD,MAAI,CAACC,EAAaR,CAAI,KAAKS,EAAYT,CAAI,MAAM,aAAaA,EAAK,UAAU;AAC3E,WAAO;AAET,QAAMF,IAASF,EAAcI,EAAK,KAAK,GACjCU,IAAMZ,IAASI,GAAgB,aAAa,KAAK,CAAAS,MAAQA,EAAK,aAAab,KAAUa,EAAK,OAAOb,CAAM,IAAI,QAC3Gc,IAAgBF,GAAK,MAAMZ,GAC3Be,IAAOH,GAAK,QAAQZ,KAAU,OAC9BgB,IAAad,EAAK,UAAU;AAClC,2BAAyBe,GAAuB;AAAA,IAC9C,aAAa;AAAA,IACb,MAAAF;AAAA,IACA,aAAa;AAAA,IACb,MAAMH,GAAK;AAAA,IACX,YAAYA,GAAK;AAAA,IACjB,gBAAgBA,GAAK;AAAA,IACrB,cAAc;AAAA,IACd,WAAWL;AAAA,IACX,mBAAmB,CAACF,KAAsB,CAACS,KAAiB,CAACE;AAAA,IAC7D,QAAQ,MAAM;AACZ,MAAKA,KAGLb,IAAyB;AAAA,QACvB,IAAIa;AAAA,QACJ,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,IACA,WAAW,MAAM;AACf,MAAI,CAACF,KAAiB,CAACE,MAGvBR,EAAa,EAAI,GACZ,QAAQ,QAAQH,IAAqB;AAAA,QACxC,eAAAS;AAAA,QACA,YAAAE;AAAA,MAAA,CACD,CAAC,EAAE,QAAQ,MAAM;AAChB,QAAAR,EAAa,EAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EAAA,CACD;AACH;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { MemoryCard as a } from "@reforma/icons/14";
|
|
2
|
-
import { isToolUIPart as c, getToolName as d } from "
|
|
2
|
+
import { isToolUIPart as c, getToolName as d } from "@reforma/types";
|
|
3
3
|
import { Show as n } from "../../../Show/Show.js";
|
|
4
4
|
import { Text as f } from "../../../Text/Text.js";
|
|
5
5
|
import { MessageText as u } from "../../Message/streamdown/MessageText.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryTool.js","sources":["../../../../src/chat/Tool/memory/MemoryTool.tsx"],"sourcesContent":["import { MemoryCard } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"MemoryTool.js","sources":["../../../../src/chat/Tool/memory/MemoryTool.tsx"],"sourcesContent":["import { MemoryCard } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { MessageText } from '../../Message/streamdown/MessageText';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction field(input: unknown, key: string): string | undefined {\n if (input == null || typeof input !== 'object') {\n return undefined;\n }\n\n const value = (input as Record<string, unknown>)[key];\n\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\n/** Remember / Forget. Header like reasoning; body is only the fact text. */\nexport function MemoryTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const name = getToolName(part);\n const isRemember = name === 'Remember';\n const isForget = name === 'Forget';\n\n if (!isRemember && !isForget) {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const detail = isRemember ? field(part.input, 'fact') : field(part.input, 'text');\n\n return (\n <ToolShell collapsible={ Boolean(detail) } data-slot=\"memory-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title=\"Memory updated\"\n icon={ <MemoryCard aria-hidden /> }\n />\n\n <Show when={ detail }>\n { fact => (\n <ToolShellContent>\n <MessageText className=\"color-secondary-muted-text\" mode=\"static\">\n {fact}\n </MessageText>\n </ToolShellContent>\n ) }\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["field","input","key","value","MemoryTool","part","isToolUIPart","name","getToolName","isRemember","failure","getToolFailureRowState","detail","ToolShell","_jsx","ToolShellHeader","MemoryCard","Show","fact","ToolShellContent","MessageText","ToolShellFooter","Text"],"mappings":";;;;;;;;AAQA,SAASA,EAAMC,GAAOC,GAAK;AACzB,MAAID,KAAS,QAAQ,OAAOA,KAAU;AACpC;AAEF,QAAME,IAAQF,EAAMC,CAAG;AACvB,SAAO,OAAOC,KAAU,YAAYA,EAAM,SAASA,EAAM,SAAS;AACpE;AAGO,SAASC,EAAW;AAAA,EACzB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI;AACpB,WAAO;AAET,QAAME,IAAOC,EAAYH,CAAI,GACvBI,IAAaF,MAAS;AAE5B,MAAI,CAACE,KAAc,EADFF,MAAS;AAExB,WAAO;AAET,QAAMG,IAAUC,EAAuBN,CAAI,GACrCO,IAASH,IAAaT,EAAMK,EAAK,OAAO,MAAM,IAAIL,EAAMK,EAAK,OAAO,MAAM;AAChF,2BAA0BQ,GAAW;AAAA,IACnC,aAAa,EAAQD;AAAA,IACrB,aAAa;AAAA,IACb,UAAU,CAAcE,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOV,EAAK;AAAA,MACZ,cAAcK,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,wBAAwBM,GAAY;AAAA,QAClC,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBF,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAML;AAAA,MACN,UAAU,CAAAM,MAAqBJ,gBAAAA,EAAKK,GAAkB;AAAA,QACpD,4BAA4BC,GAAa;AAAA,UACvC,WAAW;AAAA,UACX,MAAM;AAAA,UACN,UAAUF;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBJ,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMP,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,5 +1,5 @@
|
|
|
1
1
|
import { Nowrap as v } from "@reforma/icons/14";
|
|
2
|
-
import { isToolUIPart as u, getToolName as T } from "
|
|
2
|
+
import { isToolUIPart as u, getToolName as T } from "@reforma/types";
|
|
3
3
|
import { Box as w } from "../../../Box/Box.js";
|
|
4
4
|
import { Show as s } from "../../../Show/Show.js";
|
|
5
5
|
import { Text as c } from "../../../Text/Text.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MoveFileTool.js","sources":["../../../../src/chat/Tool/move-file/MoveFileTool.tsx"],"sourcesContent":["import { Nowrap } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"MoveFileTool.js","sources":["../../../../src/chat/Tool/move-file/MoveFileTool.tsx"],"sourcesContent":["import { Nowrap } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Box } from '../../../Box';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { Chip, chipItemFromPath } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress } from '../helpers';\nimport { ToolShell, ToolShellFooter, ToolShellHeader } from '../shell';\nimport { parseMoveFileInput } from './parseMoveFileInput';\n\nimport type { ToolRendererProps } from '../types';\n\n/** MoveFile: label + from → to path chips (one `Chip` per path for separate aria-labels). */\nexport function MoveFileTool({ part, onOpenPath }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'MoveFile') {\n return null;\n }\n\n const state = part.state;\n const inProgress = isToolInvocationInProgress(state);\n const failure = getToolFailureRowState(part);\n\n const { fromPath, toPath } = parseMoveFileInput(part.input);\n\n const fromChip = chipItemFromPath(fromPath);\n const toChip = chipItemFromPath(toPath);\n\n return (\n <ToolShell data-slot=\"move-file-tool\">\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title=\"Moved\"\n titleInProgress=\"Moving\"\n icon={ <Nowrap aria-hidden /> }\n >\n <Show when={ !inProgress }>\n { fromChip && toChip && (\n <Box direction=\"row\" gap=\"sm\" align=\"center\" wrap=\"wrap\">\n <Chip\n aria-label=\"Move from\"\n item={ fromChip }\n />\n\n <Text color=\"secondary\" whitespace=\"nowrap\" aria-hidden>\n →\n </Text>\n\n <Chip\n aria-label=\"Move to\"\n item={ toChip }\n onAction={ onOpenPath }\n />\n </Box>\n ) }\n\n { fromChip && !toChip && (\n <Chip\n aria-label=\"Move from\"\n item={ fromChip }\n />\n ) }\n\n { !fromChip && toChip && (\n <Chip\n aria-label=\"Move to\"\n item={ toChip }\n onAction={ onOpenPath }\n />\n )}\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["MoveFileTool","part","onOpenPath","isToolUIPart","getToolName","state","inProgress","isToolInvocationInProgress","failure","getToolFailureRowState","fromPath","toPath","parseMoveFileInput","fromChip","chipItemFromPath","toChip","ToolShell","_jsx","ToolShellHeader","Nowrap","Show","Box","Chip","Text","ToolShellFooter"],"mappings":";;;;;;;;;;;AAWO,SAASA,EAAa;AAAA,EAC3B,MAAAC;AAAA,EACA,YAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaF,CAAI,KAAKG,EAAYH,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMI,IAAQJ,EAAK,OACbK,IAAaC,EAA2BF,CAAK,GAC7CG,IAAUC,EAAuBR,CAAI,GACrC;AAAA,IACJ,UAAAS;AAAA,IACA,QAAAC;AAAA,EAAA,IACEC,EAAmBX,EAAK,KAAK,GAC3BY,IAAWC,EAAiBJ,CAAQ,GACpCK,IAASD,EAAiBH,CAAM;AACtC,2BAA0BK,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAAb;AAAA,MACA,cAAcG,EAAQ;AAAA,MACtB,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,wBAAwBW,GAAQ;AAAA,QAC9B,eAAe;AAAA,MAAA,CAChB;AAAA,MACD,4BAA6BC,GAAM;AAAA,QACjC,MAAM,CAACd;AAAA,QACP,UAAU,CAACO,KAAYE,uBAA6BM,GAAK;AAAA,UACvD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,MAAM;AAAA,UACN,UAAU,CAAcJ,gBAAAA,EAAKK,GAAM;AAAA,YACjC,cAAc;AAAA,YACd,MAAMT;AAAA,UAAA,CACP,GAAgBI,gBAAAA,EAAKM,GAAM;AAAA,YAC1B,OAAO;AAAA,YACP,YAAY;AAAA,YACZ,eAAe;AAAA,YACf,UAAU;AAAA,UAAA,CACX,GAAgBN,gBAAAA,EAAKK,GAAM;AAAA,YAC1B,cAAc;AAAA,YACd,MAAMP;AAAA,YACN,UAAUb;AAAA,UAAA,CACX,CAAC;AAAA,QAAA,CACH,GAAGW,KAAY,CAACE,uBAA4BO,GAAM;AAAA,UACjD,cAAc;AAAA,UACd,MAAMT;AAAA,QAAA,CACP,GAAG,CAACA,KAAYE,uBAA4BO,GAAM;AAAA,UACjD,cAAc;AAAA,UACd,MAAMP;AAAA,UACN,UAAUb;AAAA,QAAA,CACX,CAAC;AAAA,MAAA,CACH;AAAA,IAAA,CACF,GAAgBe,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMZ,EAAQ;AAAA,MACd,4BAA4BgB,GAAiB;AAAA,QAC3C,4BAA4BD,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUf,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Plan as T, ArrowUpRight as y } from "@reforma/icons/14";
|
|
2
|
-
import { isToolUIPart as B, getToolName as N } from "
|
|
2
|
+
import { isToolUIPart as B, getToolName as N } from "@reforma/types";
|
|
3
3
|
import { Button as w } from "../../../Button/Button.js";
|
|
4
4
|
import { Show as i } from "../../../Show/Show.js";
|
|
5
5
|
import { Text as g } from "../../../Text/Text.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreatePlanTool.js","sources":["../../../../src/chat/Tool/plan/CreatePlanTool.tsx"],"sourcesContent":["import { ArrowUpRight, Plan as PlanIcon } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"CreatePlanTool.js","sources":["../../../../src/chat/Tool/plan/CreatePlanTool.tsx"],"sourcesContent":["import { ArrowUpRight, Plan as PlanIcon } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Button } from '../../../Button';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { Chip } from '../../Chip';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolShell,\n ToolShellCard,\n ToolShellCardContent,\n ToolShellCardFooter,\n ToolShellCardHeader,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport styles from './CreatePlanTool.module.css';\n\nimport type {\n CreatePlanToolInput,\n CreatePlanToolOutput,\n ReadPlanToolOutput,\n} from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nfunction fieldString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction planCardTitle(name: string | undefined, failed: boolean, live: boolean): string {\n if (failed) {\n return 'Plan failed';\n }\n\n if (name) {\n return name;\n }\n\n return live ? 'Creating plan' : 'Created plan';\n}\n\nconst PLAN_TOOLS = new Set(['ReadPlan', 'CreatePlan']);\n\n/** ReadPlan is a compact row; CreatePlan is a card. Open opens the plan panel. */\nexport function CreatePlanTool({ part }: ToolRendererProps) {\n const { onOpenPlan, onBuildPlan } = useChat();\n const failure = getToolFailureRowState(part);\n const { live } = useToolProgress(part.state);\n\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const toolName = getToolName(part);\n\n if (!PLAN_TOOLS.has(toolName)) {\n return null;\n }\n\n const input = part.input as CreatePlanToolInput | undefined;\n const output = part.state === 'output-available'\n ? part.output as CreatePlanToolOutput | ReadPlanToolOutput | undefined\n : undefined;\n const name = fieldString(output?.name)\n ?? fieldString((input && 'name' in input) ? input.name : undefined);\n const overview = fieldString((input && 'overview' in input) ? input.overview : undefined)\n ?? fieldString((output && 'overview' in output) ? output.overview : undefined);\n const failed = failure.useFailureLabel;\n const isInputStreaming = part.state === 'input-streaming';\n\n if (toolName === 'ReadPlan') {\n return (\n <ToolShell data-slot=\"read-plan-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title=\"Read plan\"\n titleInProgress=\"Reading plan\"\n icon={ <PlanIcon aria-hidden /> }\n >\n <Show when={ name }>\n { planName => (\n <Chip\n aria-label={ planName }\n item={ { label: planName, icon: 'nav' } }\n onAction={ (onOpenPlan && !failed) ? () => onOpenPlan() : undefined }\n />\n ) }\n </Show>\n </ToolShellHeader>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n }\n\n const canOpen = Boolean(onOpenPlan && !failed && !isInputStreaming);\n const canBuild = Boolean(onBuildPlan && !failed && !isInputStreaming);\n const errorText = failure.problemText;\n const bodyText = failed ? errorText : overview;\n\n return (\n <ToolShellCard\n collapsible={ false }\n className={ shellStyles.tool }\n data-slot=\"create-plan-tool\"\n >\n <ToolShellCardHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ planCardTitle(name, failed, live) }\n icon={ <PlanIcon aria-hidden /> }\n />\n\n <Show when={ !isInputStreaming && bodyText }>\n { text => (\n <ToolShellCardContent className={ styles.content }>\n <Text\n color={ failed ? 'danger' : 'secondary' }\n variant=\"sm\"\n wrap=\"anywhere\"\n >\n {text}\n </Text>\n </ToolShellCardContent>\n ) }\n </Show>\n\n <Show when={ canOpen || canBuild }>\n <ToolShellCardFooter className={ styles.footer }>\n <Show when={ canBuild }>\n <Button\n size=\"xs\"\n color=\"contrast\"\n onPress={ () => onBuildPlan?.() }\n >\n Build\n </Button>\n </Show>\n\n <Show when={ canOpen }>\n <Button\n className=\"ml-auto\"\n size=\"xs\"\n variant=\"filling\"\n onPress={ () => onOpenPlan?.() }\n >\n <ArrowUpRight aria-hidden />\n Open\n </Button>\n </Show>\n </ToolShellCardFooter>\n </Show>\n </ToolShellCard>\n );\n}\n"],"names":["fieldString","value","trimmed","planCardTitle","name","failed","live","PLAN_TOOLS","CreatePlanTool","part","onOpenPlan","onBuildPlan","useChat","failure","getToolFailureRowState","useToolProgress","isToolUIPart","toolName","getToolName","input","output","overview","isInputStreaming","ToolShell","_jsx","ToolShellHeader","PlanIcon","Show","planName","Chip","ToolShellFooter","Text","canOpen","canBuild","errorText","bodyText","ToolShellCard","shellStyles","ToolShellCardHeader","text","ToolShellCardContent","styles","ToolShellCardFooter","Button","ArrowUpRight"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreambleTool.js","sources":["../../../../src/chat/Tool/preamble/PreambleTool.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"PreambleTool.js","sources":["../../../../src/chat/Tool/preamble/PreambleTool.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { MessageText } from '../../Message/streamdown/MessageText';\n\nimport type { PreambleToolInput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\n/** User-facing status note — renders like assistant prose (markdown), not a tool shell. */\nexport function PreambleTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Preamble') {\n return null;\n }\n\n const content = (part.input as PreambleToolInput | undefined)?.content?.trim();\n\n if (!content) {\n return null;\n }\n\n const streaming = part.state === 'input-streaming' || part.state === 'input-available';\n\n return (\n <MessageText\n mode={ streaming ? 'streaming' : 'static' }\n >\n {content}\n </MessageText>\n );\n}\n"],"names":["PreambleTool","part","isToolUIPart","getToolName","content","streaming","MessageText"],"mappings":";;;AAIO,SAASA,EAAa;AAAA,EAC3B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUH,EAAK,OAAO,SAAS,KAAA;AACrC,MAAI,CAACG;AACH,WAAO;AAET,QAAMC,IAAYJ,EAAK,UAAU,qBAAqBA,EAAK,UAAU;AACrE,2BAAyBK,GAAa;AAAA,IACpC,MAAMD,IAAY,cAAc;AAAA,IAChC,UAAUD;AAAA,EAAA,CACX;AACH;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Layers as f } from "@reforma/icons/14";
|
|
2
|
-
import { isToolUIPart as g, getToolName as m } from "
|
|
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 '
|
|
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 "
|
|
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 '
|
|
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 "
|
|
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 '
|
|
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 "
|
|
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 '
|
|
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 "
|
|
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 '
|
|
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 "
|
|
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 {
|
|
2
|
-
import {
|
|
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(
|
|
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",
|