@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":"ImageAssetTool.js","sources":["../../../../src/chat/Tool/image-asset/ImageAssetTool.tsx"],"sourcesContent":["import { AttentionTriangle } from '@reforma/icons/14';\nimport { ProgressLoader } from '@reforma/icons/assets';\nimport { getToolName } from 'ai';\n\nimport { Box } from '../../../Box';\nimport { For } from '../../../For';\nimport { Image } from '../../../Image';\nimport { Lightbox, type LightboxOpen } from '../../../Lightbox';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { getToolFailureRowState, isToolInvocationInProgress, TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport {\n ToolShellCard,\n} from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport { FailedToolTitleTooltip } from '../shell/ToolShellStatusIcon';\nimport styles from './ImageAssetTool.module.css';\n\nimport type { CSSProperties } from 'react';\nimport type { ToolRendererProps } from '../types';\n\ntype ImageCredit = {\n name: string;\n profileUrl: string;\n unsplashUrl: string;\n};\n\ntype ImageAsset = {\n url?: string;\n path?: string;\n publicPath?: string;\n previewUrl?: string;\n mediaType?: string;\n alt?: string;\n credit?: ImageCredit;\n};\n\ntype ImageAssetSuccess = {\n ok: true;\n alt?: string;\n query?: string;\n images: ImageAsset[];\n};\n\ntype ImageAssetFailure = {\n ok: false;\n error: string;\n alt?: string;\n query?: string;\n};\n\nconst IMAGE_TOOL_NAMES = new Set(['ImageGen', 'SearchImage', 'ImportAsset']);\n\nfunction parseOutput(output: unknown): ImageAssetSuccess | ImageAssetFailure | undefined {\n if (typeof output !== 'object' || output === null || !('ok' in output)) {\n return undefined;\n }\n\n return output as ImageAssetSuccess | ImageAssetFailure;\n}\n\n/** Absolute asset URL, or chat `previewUrl` + site `publicPath` (filesystem saves). */\nfunction previewSrc(image: ImageAsset, host?: string): string | undefined {\n const absolute = image.url?.trim() || image.previewUrl?.trim();\n\n if (absolute) {\n return absolute;\n }\n\n const publicPath = image.publicPath?.trim();\n\n if (!publicPath || !host) {\n return undefined;\n }\n\n try {\n return new URL(publicPath, host).href;\n }\n catch {\n return undefined;\n }\n}\n\nfunction titlesFor(toolName: string, count: number): { idle: string; progress: string } {\n if (toolName === 'SearchImage') {\n if (count > 1) {\n return { progress: `Finding ${ count } photos`, idle: `Found ${ count } photos` };\n }\n\n return { progress: 'Finding photos', idle: 'Found photos' };\n }\n\n if (toolName === 'ImportAsset') {\n return { progress: 'Importing file', idle: 'Imported file' };\n }\n\n if (count > 1) {\n return { progress: `Generating ${ count } images`, idle: `Generated ${ count } images` };\n }\n\n return { progress: 'Generating image', idle: 'Generated image' };\n}\n\nfunction failureTitle(toolName: string): string {\n if (toolName === 'SearchImage') {\n return 'Couldn\\'t find photos';\n }\n\n if (toolName === 'ImportAsset') {\n return 'Couldn\\'t import file';\n }\n\n return 'Couldn\\'t generate the image';\n}\n\nfunction CreditCaption({ credit }: { credit: ImageCredit }) {\n const profileHref = credit.profileUrl.trim();\n const unsplashHref = credit.unsplashUrl.trim() || 'https://unsplash.com';\n\n return (\n <Text variant=\"xs\" className={ styles.credit }>\n Photo by\n { ' ' }\n <Show\n when={ profileHref }\n fallback={ <span>{ credit.name }</span> }\n >\n {href => (\n <a\n className={ styles.creditLink }\n href={ href }\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n { credit.name }\n </a>\n )}\n </Show>\n { ' / ' }\n <a\n className={ styles.creditLink }\n href={ unsplashHref }\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n Unsplash\n </a>\n </Text>\n );\n}\n\ntype ToolInput = {\n alt?: string;\n query?: string;\n count?: unknown;\n prompts?: Array<{ alt?: string }>;\n};\n\nexport type ImageAssetFanSlot = {\n key: string;\n src?: string;\n alt: string;\n};\n\nfunction uniqueLines(values: Array<string | undefined>): string[] {\n const seen = new Set<string>();\n const lines: string[] = [];\n\n for (const value of values) {\n const line = value?.trim();\n\n if (!line || seen.has(line)) {\n continue;\n }\n\n seen.add(line);\n lines.push(line);\n }\n\n return lines;\n}\n\n/** Per-image alts, one each. Falls back to a joined ` · ` string by splitting it. */\nfunction captionLines(args: {\n images: ImageAsset[];\n prompts?: Array<{ alt?: string }>;\n fallback: string;\n}): string[] {\n const fromImages = uniqueLines(args.images.map(image => image.alt));\n\n if (fromImages.length > 0) {\n return fromImages;\n }\n\n const fromPrompts = uniqueLines((args.prompts ?? []).map(item => item.alt));\n\n if (fromPrompts.length > 0) {\n return fromPrompts;\n }\n\n if (args.fallback.includes(' · ')) {\n return uniqueLines(args.fallback.split(' · '));\n }\n\n return args.fallback ? [args.fallback] : [];\n}\n\nfunction requestedCount(input: ToolInput | undefined): number {\n const prompts = input?.prompts?.length ?? 0;\n const count = typeof input?.count === 'number' && input.count > 0 ? input.count : 0;\n\n return Math.max(prompts, count, 1);\n}\n\nfunction uniqueCredits(images: readonly ImageAsset[]): ImageCredit[] {\n const seen = new Set<string>();\n const credits: ImageCredit[] = [];\n\n for (const image of images) {\n if (!image.credit) {\n continue;\n }\n\n const key = image.credit.profileUrl || image.credit.name;\n\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n credits.push(image.credit);\n }\n\n return credits;\n}\n\nfunction FanFace({ slot }: { slot: ImageAssetFanSlot }) {\n if (!slot.src) {\n return null;\n }\n\n const src = slot.src;\n\n return (\n <Lightbox alt={ slot.alt } src={ src }>\n {(open: LightboxOpen) => (\n <Pressable\n aria-label={ `View ${ slot.alt }` }\n className={ styles.fanHit }\n onPress={ open }\n >\n <Image alt=\"\" className={ styles.fanImage } src={ src } />\n </Pressable>\n )}\n </Lightbox>\n );\n}\n\nexport function ImageAssetThumbFan({\n badge,\n slots,\n}: {\n badge?: 'loader' | 'error';\n slots: readonly ImageAssetFanSlot[];\n}) {\n return (\n <div\n className={ styles.fan }\n data-count={ slots.length }\n style={ { '--n': slots.length } as CSSProperties }\n >\n <For each={ slots }>\n {(slot, index, { isLast }) => (\n <div\n key={ slot.key }\n className={ styles.fanCard }\n style={ { '--i': index } as CSSProperties }\n >\n <FanFace slot={ slot } />\n <Show when={ isLast && badge === 'loader' }>\n <ProgressLoader aria-hidden className={ styles.loader } size={ 14 } />\n </Show>\n <Show when={ isLast && badge === 'error' }>\n <AttentionTriangle aria-hidden className={ styles.errorMark } size={ 16 } />\n </Show>\n </div>\n )}\n </For>\n </div>\n );\n}\n\nexport function ImageAssetCardTitle({\n failed,\n idle,\n live,\n progress,\n stalled,\n statusDetail,\n}: {\n failed: boolean;\n idle: string;\n live: boolean;\n progress: string;\n stalled: boolean;\n statusDetail?: string;\n}) {\n if (stalled) {\n return (\n <Text className={ styles.title } color=\"danger\">\n { TOOL_INTERRUPTED_MESSAGE }\n </Text>\n );\n }\n\n if (live) {\n return (\n <Shimmer as=\"span\" className={ styles.title } duration={ 1 }>\n { progress }\n </Shimmer>\n );\n }\n\n if (failed) {\n return (\n <FailedToolTitleTooltip statusDetail={ statusDetail }>\n <Text className={ styles.title } color=\"secondary\" decoration=\"line-through\">\n { idle }\n </Text>\n </FailedToolTitleTooltip>\n );\n }\n\n return <Text className={ styles.title }>{ idle }</Text>;\n}\n\n/** Card for ImageGen / SearchImage — thumb row, or a plain shell row when nothing came back. */\nexport function ImageAssetTool({ part }: ToolRendererProps) {\n const toolName = getToolName(part);\n const { previewUrl } = useChat();\n const { live, stalled } = useToolProgress(part.state);\n\n if (!IMAGE_TOOL_NAMES.has(toolName)) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const done = state === 'output-available';\n const output = done ? parseOutput(part.output) : undefined;\n const success = (output?.ok === true) ? output : undefined;\n const error = (output?.ok === false) ? output.error : failure.tooltip;\n const images = success?.images ?? [];\n const input = (typeof part.input === 'object' && part.input !== null)\n ? part.input as ToolInput\n : undefined;\n\n const outputAlt = (output && 'alt' in output && typeof output.alt === 'string')\n ? output.alt\n : undefined;\n const outputQuery = (output && 'query' in output && typeof output.query === 'string')\n ? output.query\n : undefined;\n // Prefer short alt (ImageGen); stock search falls back to search query — never the gen prompt.\n const fallback = (\n success?.alt\n || outputAlt\n || input?.alt\n || success?.query\n || outputQuery\n || input?.query\n || ''\n ).trim();\n\n const inProgress = isToolInvocationInProgress(state);\n const failedEmpty = !inProgress && images.length === 0;\n const total = images.length > 0 ? images.length : requestedCount(input);\n const titles = titlesFor(toolName, total);\n const lines = uniqueLines([\n ...captionLines({\n images,\n prompts: input?.prompts,\n fallback,\n }),\n ...images.flatMap(image => (previewSrc(image, previewUrl) ? [] : [image.path])),\n ]);\n const credits = uniqueCredits(images);\n const slots: ImageAssetFanSlot[] = failedEmpty\n ? [{ key: 'failed', alt: failureTitle(toolName) }]\n : images.length > 0\n ? images.map((image, index) => {\n const src = previewSrc(image, previewUrl);\n\n return {\n key: src || image.path || `image-${ index }`,\n src,\n alt: image.alt?.trim() || lines[index] || `Image ${ index + 1 }`,\n };\n })\n : Array.from({ length: total }, (_, index) => ({\n key: `placeholder-${ index }`,\n alt: lines[index] || titles.progress,\n }));\n\n return (\n <ToolShellCard\n aria-busy={ live }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"image-asset-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 ? failureTitle(toolName) : titles.idle }\n live={ live }\n progress={ titles.progress }\n stalled={ stalled }\n statusDetail={ error }\n />\n <Show when={ lines.length === 1 }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { lines[0] }\n </Text>\n </Show>\n <Show when={ lines.length > 1 }>\n <ul className={ styles.captions }>\n <For each={ lines }>\n {line => (\n <li key={ line }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { line }\n </Text>\n </li>\n )}\n </For>\n </ul>\n </Show>\n <Show when={ credits.length > 0 }>\n <div className={ styles.credits }>\n <For each={ credits }>\n {credit => (\n <CreditCaption\n key={ credit.profileUrl || credit.name }\n credit={ credit }\n />\n )}\n </For>\n </div>\n </Show>\n </Box>\n </Box>\n </ToolShellCard>\n );\n}\n"],"names":["IMAGE_TOOL_NAMES","parseOutput","output","previewSrc","image","host","absolute","publicPath","titlesFor","toolName","count","failureTitle","CreditCaption","credit","profileHref","unsplashHref","Text","styles","Show","href","_jsx","uniqueLines","values","seen","lines","value","line","captionLines","args","fromImages","fromPrompts","item","requestedCount","input","prompts","uniqueCredits","images","credits","key","FanFace","slot","src","Lightbox","open","Pressable","Image","ImageAssetThumbFan","badge","slots","For","index","isLast","ProgressLoader","AttentionTriangle","ImageAssetCardTitle","failed","idle","live","progress","stalled","statusDetail","TOOL_INTERRUPTED_MESSAGE","Shimmer","FailedToolTitleTooltip","ImageAssetTool","part","getToolName","previewUrl","useChat","useToolProgress","state","failure","getToolFailureRowState","success","error","outputAlt","outputQuery","fallback","failedEmpty","isToolInvocationInProgress","total","titles","_","ToolShellCard","shellStyles","Box","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,MAAMA,IAAmB,oBAAI,IAAI,CAAC,YAAY,eAAe,aAAa,CAAC;AAC3E,SAASC,EAAYC,GAAQ;AAC3B,MAAI,SAAOA,KAAW,YAAYA,MAAW,QAAQ,EAAE,QAAQA;AAG/D,WAAOA;AACT;AAGA,SAASC,EAAWC,GAAOC,GAAM;AAC/B,QAAMC,IAAWF,EAAM,KAAK,UAAUA,EAAM,YAAY,KAAA;AACxD,MAAIE;AACF,WAAOA;AAET,QAAMC,IAAaH,EAAM,YAAY,KAAA;AACrC,MAAI,GAACG,KAAc,CAACF;AAGpB,QAAI;AACF,aAAO,IAAI,IAAIE,GAAYF,CAAI,EAAE;AAAA,IACnC,QAAQ;AACN;AAAA,IACF;AACF;AACA,SAASG,EAAUC,GAAUC,GAAO;AAClC,SAAID,MAAa,gBACXC,IAAQ,IACH;AAAA,IACL,UAAU,WAAWA,CAAK;AAAA,IAC1B,MAAM,SAASA,CAAK;AAAA,EAAA,IAGjB;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EAAA,IAGND,MAAa,gBACR;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EAAA,IAGNC,IAAQ,IACH;AAAA,IACL,UAAU,cAAcA,CAAK;AAAA,IAC7B,MAAM,aAAaA,CAAK;AAAA,EAAA,IAGrB;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,EAAA;AAEV;AACA,SAASC,EAAaF,GAAU;AAC9B,SAAIA,MAAa,gBACR,yBAELA,MAAa,gBACR,yBAEF;AACT;AACA,SAASG,EAAc;AAAA,EACrB,QAAAC;AACF,GAAG;AACD,QAAMC,IAAcD,EAAO,WAAW,KAAA,GAChCE,IAAeF,EAAO,YAAY,KAAA,KAAU;AAClD,2BAA0BG,GAAM;AAAA,IAC9B,SAAS;AAAA,IACT,WAAWC,EAAO;AAAA,IAClB,UAAU,CAAC,YAAY,uBAAuBC,GAAM;AAAA,MAClD,MAAMJ;AAAA,MACN,4BAA4B,QAAQ;AAAA,QAClC,UAAUD,EAAO;AAAA,MAAA,CAClB;AAAA,MACD,UAAU,CAAAM,MAAqBC,gBAAAA,EAAK,KAAK;AAAA,QACvC,WAAWH,EAAO;AAAA,QAClB,MAAAE;AAAA,QACA,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,UAAUN,EAAO;AAAA,MAAA,CAClB;AAAA,IAAA,CACF,GAAG,OAAoBO,gBAAAA,EAAK,KAAK;AAAA,MAChC,WAAWH,EAAO;AAAA,MAClB,MAAMF;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,IAAA,CACX,CAAC;AAAA,EAAA,CACH;AACH;AACA,SAASM,EAAYC,GAAQ;AAC3B,QAAMC,wBAAW,IAAA,GACXC,IAAQ,CAAA;AACd,aAAWC,KAASH,GAAQ;AAC1B,UAAMI,IAAOD,GAAO,KAAA;AACpB,IAAI,CAACC,KAAQH,EAAK,IAAIG,CAAI,MAG1BH,EAAK,IAAIG,CAAI,GACbF,EAAM,KAAKE,CAAI;AAAA,EACjB;AACA,SAAOF;AACT;AAGA,SAASG,EAAaC,GAAM;AAC1B,QAAMC,IAAaR,EAAYO,EAAK,OAAO,IAAI,CAAAxB,MAASA,EAAM,GAAG,CAAC;AAClE,MAAIyB,EAAW,SAAS;AACtB,WAAOA;AAET,QAAMC,IAAcT,GAAaO,EAAK,WAAW,IAAI,IAAI,CAAAG,MAAQA,EAAK,GAAG,CAAC;AAC1E,SAAID,EAAY,SAAS,IAChBA,IAELF,EAAK,SAAS,SAAS,KAAK,IACvBP,EAAYO,EAAK,SAAS,MAAM,KAAK,CAAC,IAExCA,EAAK,WAAW,CAACA,EAAK,QAAQ,IAAI,CAAA;AAC3C;AACA,SAASI,GAAeC,GAAO;AAC7B,QAAMC,IAAUD,GAAO,SAAS,UAAU,GACpCvB,IAAQ,OAAOuB,GAAO,SAAU,YAAYA,EAAM,QAAQ,IAAIA,EAAM,QAAQ;AAClF,SAAO,KAAK,IAAIC,GAASxB,GAAO,CAAC;AACnC;AACA,SAASyB,GAAcC,GAAQ;AAC7B,QAAMb,wBAAW,IAAA,GACXc,IAAU,CAAA;AAChB,aAAWjC,KAASgC,GAAQ;AAC1B,QAAI,CAAChC,EAAM;AACT;AAEF,UAAMkC,IAAMlC,EAAM,OAAO,cAAcA,EAAM,OAAO;AACpD,IAAImB,EAAK,IAAIe,CAAG,MAGhBf,EAAK,IAAIe,CAAG,GACZD,EAAQ,KAAKjC,EAAM,MAAM;AAAA,EAC3B;AACA,SAAOiC;AACT;AACA,SAASE,GAAQ;AAAA,EACf,MAAAC;AACF,GAAG;AACD,MAAI,CAACA,EAAK;AACR,WAAO;AAET,QAAMC,IAAMD,EAAK;AACjB,2BAAyBE,GAAU;AAAA,IACjC,KAAKF,EAAK;AAAA,IACV,KAAAC;AAAA,IACA,UAAU,CAAAE,MAAqBvB,gBAAAA,EAAKwB,GAAW;AAAA,MAC7C,cAAc,QAAQJ,EAAK,GAAG;AAAA,MAC9B,WAAWvB,EAAO;AAAA,MAClB,SAAS0B;AAAA,MACT,4BAA4BE,GAAO;AAAA,QACjC,KAAK;AAAA,QACL,WAAW5B,EAAO;AAAA,QAClB,KAAAwB;AAAA,MAAA,CACD;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACH;AACO,SAASK,GAAmB;AAAA,EACjC,OAAAC;AAAA,EACA,OAAAC;AACF,GAAG;AACD,2BAAyB,OAAO;AAAA,IAC9B,WAAW/B,EAAO;AAAA,IAClB,cAAc+B,EAAM;AAAA,IACpB,OAAO;AAAA,MACL,OAAOA,EAAM;AAAA,IAAA;AAAA,IAEf,4BAA4BC,GAAK;AAAA,MAC/B,MAAMD;AAAA,MACN,UAAU,CAACR,GAAMU,GAAO;AAAA,QACtB,QAAAC;AAAA,MAAA,wBACuB,OAAO;AAAA,QAC9B,WAAWlC,EAAO;AAAA,QAClB,OAAO;AAAA,UACL,OAAOiC;AAAA,QAAA;AAAA,QAET,UAAU,CAAc9B,gBAAAA,EAAKmB,IAAS;AAAA,UACpC,MAAAC;AAAA,QAAA,CACD,GAAgBpB,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMiC,KAAUJ,MAAU;AAAA,UAC1B,4BAA4BK,GAAgB;AAAA,YAC1C,eAAe;AAAA,YACf,WAAWnC,EAAO;AAAA,YAClB,MAAM;AAAA,UAAA,CACP;AAAA,QAAA,CACF,GAAgBG,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMiC,KAAUJ,MAAU;AAAA,UAC1B,4BAA4BM,GAAmB;AAAA,YAC7C,eAAe;AAAA,YACf,WAAWpC,EAAO;AAAA,YAClB,MAAM;AAAA,UAAA,CACP;AAAA,QAAA,CACF,CAAC;AAAA,MAAA,GACDuB,EAAK,GAAG;AAAA,IAAA,CACZ;AAAA,EAAA,CACF;AACH;AACO,SAASc,GAAoB;AAAA,EAClC,QAAAC;AAAA,EACA,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,cAAAC;AACF,GAAG;AACD,SAAID,sBACuB3C,GAAM;AAAA,IAC7B,WAAWC,EAAO;AAAA,IAClB,OAAO;AAAA,IACP,UAAU4C;AAAA,EAAA,CACX,IAECJ,sBACuBK,GAAS;AAAA,IAChC,IAAI;AAAA,IACJ,WAAW7C,EAAO;AAAA,IAClB,UAAU;AAAA,IACV,UAAUyC;AAAA,EAAA,CACX,IAECH,sBACuBQ,GAAwB;AAAA,IAC/C,cAAAH;AAAA,IACA,4BAA4B5C,GAAM;AAAA,MAChC,WAAWC,EAAO;AAAA,MAClB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,UAAUuC;AAAA,IAAA,CACX;AAAA,EAAA,CACF,sBAEsBxC,GAAM;AAAA,IAC7B,WAAWC,EAAO;AAAA,IAClB,UAAUuC;AAAA,EAAA,CACX;AACH;AAGO,SAASQ,GAAe;AAAA,EAC7B,MAAAC;AACF,GAAG;AACD,QAAMxD,IAAWyD,EAAYD,CAAI,GAC3B;AAAA,IACJ,YAAAE;AAAA,EAAA,IACEC,EAAA,GACE;AAAA,IACJ,MAAAX;AAAA,IACA,SAAAE;AAAA,EAAA,IACEU,EAAgBJ,EAAK,KAAK;AAC9B,MAAI,CAACjE,EAAiB,IAAIS,CAAQ;AAChC,WAAO;AAET,QAAM6D,IAAQL,EAAK,OACbM,IAAUC,EAAuBP,CAAI,GAErC/D,IADOoE,MAAU,qBACDrE,EAAYgE,EAAK,MAAM,IAAI,QAC3CQ,IAAUvE,GAAQ,OAAO,KAAOA,IAAS,QACzCwE,IAAQxE,GAAQ,OAAO,KAAQA,EAAO,QAAQqE,EAAQ,SACtDnC,IAASqC,GAAS,UAAU,CAAA,GAC5BxC,IAAQ,OAAOgC,EAAK,SAAU,YAAYA,EAAK,UAAU,OAAOA,EAAK,QAAQ,QAC7EU,IAAYzE,KAAU,SAASA,KAAU,OAAOA,EAAO,OAAQ,WAAWA,EAAO,MAAM,QACvF0E,IAAc1E,KAAU,WAAWA,KAAU,OAAOA,EAAO,SAAU,WAAWA,EAAO,QAAQ,QAE/F2E,KAAYJ,GAAS,OAAOE,KAAa1C,GAAO,OAAOwC,GAAS,SAASG,KAAe3C,GAAO,SAAS,IAAI,KAAA,GAE5G6C,IAAc,CADDC,EAA2BT,CAAK,KAChBlC,EAAO,WAAW,GAC/C4C,IAAQ5C,EAAO,SAAS,IAAIA,EAAO,SAASJ,GAAeC,CAAK,GAChEgD,IAASzE,EAAUC,GAAUuE,CAAK,GAClCxD,IAAQH,EAAY,CAAC,GAAGM,EAAa;AAAA,IACzC,QAAAS;AAAA,IACA,SAASH,GAAO;AAAA,IAChB,UAAA4C;AAAA,EAAA,CACD,GAAG,GAAGzC,EAAO,QAAQ,OAASjC,EAAWC,GAAO+D,CAAU,IAAI,CAAA,IAAK,CAAC/D,EAAM,IAAI,CAAC,CAAC,CAAC,GAC5EiC,IAAUF,GAAcC,CAAM,GAC9BY,IAAQ8B,IAAc,CAAC;AAAA,IAC3B,KAAK;AAAA,IACL,KAAKnE,EAAaF,CAAQ;AAAA,EAAA,CAC3B,IAAI2B,EAAO,SAAS,IAAIA,EAAO,IAAI,CAAChC,GAAO8C,MAAU;AACpD,UAAMT,IAAMtC,EAAWC,GAAO+D,CAAU;AACxC,WAAO;AAAA,MACL,KAAK1B,KAAOrC,EAAM,QAAQ,SAAS8C,CAAK;AAAA,MACxC,KAAAT;AAAA,MACA,KAAKrC,EAAM,KAAK,UAAUoB,EAAM0B,CAAK,KAAK,SAASA,IAAQ,CAAC;AAAA,IAAA;AAAA,EAEhE,CAAC,IAAI,MAAM,KAAK;AAAA,IACd,QAAQ8B;AAAA,EAAA,GACP,CAACE,GAAGhC,OAAW;AAAA,IAChB,KAAK,eAAeA,CAAK;AAAA,IACzB,KAAK1B,EAAM0B,CAAK,KAAK+B,EAAO;AAAA,EAAA,EAC5B;AACF,2BAAyBE,GAAe;AAAA,IACtC,aAAa1B;AAAA,IACb,WAAW2B,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,CAAcjE,gBAAAA,EAAK0B,IAAoB;AAAA,QAC/C,OAAOW,IAAO,WAAWqB,IAAc,UAAU;AAAA,QACjD,OAAA9B;AAAA,MAAA,CACD,GAAgBsC,gBAAAA,EAAMD,GAAK;AAAA,QAC1B,KAAK;AAAA,QACL,MAAM;AAAA,QACN,UAAU,CAAcjE,gBAAAA,EAAKkC,IAAqB;AAAA,UAChD,QAAQ,CAACwB,KAAe,EAAQJ;AAAA,UAChC,MAAMI,IAAcnE,EAAaF,CAAQ,IAAIwE,EAAO;AAAA,UACpD,MAAAxB;AAAA,UACA,UAAUwB,EAAO;AAAA,UACjB,SAAAtB;AAAA,UACA,cAAce;AAAA,QAAA,CACf,GAAgBtD,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMM,EAAM,WAAW;AAAA,UACvB,4BAA4BR,GAAM;AAAA,YAChC,WAAWC,EAAO;AAAA,YAClB,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAUO,EAAM,CAAC;AAAA,UAAA,CAClB;AAAA,QAAA,CACF,GAAgBJ,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMM,EAAM,SAAS;AAAA,UACrB,4BAA4B,MAAM;AAAA,YAChC,WAAWP,EAAO;AAAA,YAClB,4BAA4BgC,GAAK;AAAA,cAC/B,MAAMzB;AAAA,cACN,UAAU,CAAAE,MAAqBN,gBAAAA,EAAK,MAAM;AAAA,gBACxC,4BAA4BJ,GAAM;AAAA,kBAChC,WAAWC,EAAO;AAAA,kBAClB,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,UAAUS;AAAA,gBAAA,CACX;AAAA,cAAA,GACAA,CAAI;AAAA,YAAA,CACR;AAAA,UAAA,CACF;AAAA,QAAA,CACF,GAAgBN,gBAAAA,EAAKF,GAAM;AAAA,UAC1B,MAAMmB,EAAQ,SAAS;AAAA,UACvB,4BAA4B,OAAO;AAAA,YACjC,WAAWpB,EAAO;AAAA,YAClB,4BAA4BgC,GAAK;AAAA,cAC/B,MAAMZ;AAAA,cACN,UAAU,CAAAxB,MAAuBO,gBAAAA,EAAKR,GAAe;AAAA,gBACnD,QAAAC;AAAA,cAAA,GACCA,EAAO,cAAcA,EAAO,IAAI;AAAA,YAAA,CACpC;AAAA,UAAA,CACF;AAAA,QAAA,CACF,CAAC;AAAA,MAAA,CACH,CAAC;AAAA,IAAA,CACH;AAAA,EAAA,CACF;AACH;"}
|
|
1
|
+
{"version":3,"file":"ImageAssetTool.js","sources":["../../../../src/chat/Tool/image-asset/ImageAssetTool.tsx"],"sourcesContent":["import { AttentionTriangle } from '@reforma/icons/14';\nimport { ProgressLoader } from '@reforma/icons/assets';\nimport { getToolName } from '@reforma/types';\n\nimport { Box } from '../../../Box';\nimport { For } from '../../../For';\nimport { Image } from '../../../Image';\nimport { Lightbox, type LightboxOpen } from '../../../Lightbox';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { getToolFailureRowState, isToolInvocationInProgress, TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport {\n ToolShellCard,\n} from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport { FailedToolTitleTooltip } from '../shell/ToolShellStatusIcon';\nimport styles from './ImageAssetTool.module.css';\n\nimport type { CSSProperties } from 'react';\nimport type { ToolRendererProps } from '../types';\n\ntype ImageCredit = {\n name: string;\n profileUrl: string;\n unsplashUrl: string;\n};\n\ntype ImageAsset = {\n url?: string;\n path?: string;\n publicPath?: string;\n previewUrl?: string;\n mediaType?: string;\n alt?: string;\n credit?: ImageCredit;\n};\n\ntype ImageAssetSuccess = {\n ok: true;\n alt?: string;\n query?: string;\n images: ImageAsset[];\n};\n\ntype ImageAssetFailure = {\n ok: false;\n error: string;\n alt?: string;\n query?: string;\n};\n\nconst IMAGE_TOOL_NAMES = new Set(['ImageGen', 'SearchImage', 'ImportAsset']);\n\nfunction parseOutput(output: unknown): ImageAssetSuccess | ImageAssetFailure | undefined {\n if (typeof output !== 'object' || output === null || !('ok' in output)) {\n return undefined;\n }\n\n return output as ImageAssetSuccess | ImageAssetFailure;\n}\n\n/** Absolute asset URL, or chat `previewUrl` + site `publicPath` (filesystem saves). */\nfunction previewSrc(image: ImageAsset, host?: string): string | undefined {\n const absolute = image.url?.trim() || image.previewUrl?.trim();\n\n if (absolute) {\n return absolute;\n }\n\n const publicPath = image.publicPath?.trim();\n\n if (!publicPath || !host) {\n return undefined;\n }\n\n try {\n return new URL(publicPath, host).href;\n }\n catch {\n return undefined;\n }\n}\n\nfunction titlesFor(toolName: string, count: number): { idle: string; progress: string } {\n if (toolName === 'SearchImage') {\n if (count > 1) {\n return { progress: `Finding ${ count } photos`, idle: `Found ${ count } photos` };\n }\n\n return { progress: 'Finding photos', idle: 'Found photos' };\n }\n\n if (toolName === 'ImportAsset') {\n return { progress: 'Importing file', idle: 'Imported file' };\n }\n\n if (count > 1) {\n return { progress: `Generating ${ count } images`, idle: `Generated ${ count } images` };\n }\n\n return { progress: 'Generating image', idle: 'Generated image' };\n}\n\nfunction failureTitle(toolName: string): string {\n if (toolName === 'SearchImage') {\n return 'Couldn\\'t find photos';\n }\n\n if (toolName === 'ImportAsset') {\n return 'Couldn\\'t import file';\n }\n\n return 'Couldn\\'t generate the image';\n}\n\nfunction CreditCaption({ credit }: { credit: ImageCredit }) {\n const profileHref = credit.profileUrl.trim();\n const unsplashHref = credit.unsplashUrl.trim() || 'https://unsplash.com';\n\n return (\n <Text variant=\"xs\" className={ styles.credit }>\n Photo by\n { ' ' }\n <Show\n when={ profileHref }\n fallback={ <span>{ credit.name }</span> }\n >\n {href => (\n <a\n className={ styles.creditLink }\n href={ href }\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n { credit.name }\n </a>\n )}\n </Show>\n { ' / ' }\n <a\n className={ styles.creditLink }\n href={ unsplashHref }\n rel=\"noreferrer\"\n target=\"_blank\"\n >\n Unsplash\n </a>\n </Text>\n );\n}\n\ntype ToolInput = {\n alt?: string;\n query?: string;\n count?: unknown;\n prompts?: Array<{ alt?: string }>;\n};\n\nexport type ImageAssetFanSlot = {\n key: string;\n src?: string;\n alt: string;\n};\n\nfunction uniqueLines(values: Array<string | undefined>): string[] {\n const seen = new Set<string>();\n const lines: string[] = [];\n\n for (const value of values) {\n const line = value?.trim();\n\n if (!line || seen.has(line)) {\n continue;\n }\n\n seen.add(line);\n lines.push(line);\n }\n\n return lines;\n}\n\n/** Per-image alts, one each. Falls back to a joined ` · ` string by splitting it. */\nfunction captionLines(args: {\n images: ImageAsset[];\n prompts?: Array<{ alt?: string }>;\n fallback: string;\n}): string[] {\n const fromImages = uniqueLines(args.images.map(image => image.alt));\n\n if (fromImages.length > 0) {\n return fromImages;\n }\n\n const fromPrompts = uniqueLines((args.prompts ?? []).map(item => item.alt));\n\n if (fromPrompts.length > 0) {\n return fromPrompts;\n }\n\n if (args.fallback.includes(' · ')) {\n return uniqueLines(args.fallback.split(' · '));\n }\n\n return args.fallback ? [args.fallback] : [];\n}\n\nfunction requestedCount(input: ToolInput | undefined): number {\n const prompts = input?.prompts?.length ?? 0;\n const count = typeof input?.count === 'number' && input.count > 0 ? input.count : 0;\n\n return Math.max(prompts, count, 1);\n}\n\nfunction uniqueCredits(images: readonly ImageAsset[]): ImageCredit[] {\n const seen = new Set<string>();\n const credits: ImageCredit[] = [];\n\n for (const image of images) {\n if (!image.credit) {\n continue;\n }\n\n const key = image.credit.profileUrl || image.credit.name;\n\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n credits.push(image.credit);\n }\n\n return credits;\n}\n\nfunction FanFace({ slot }: { slot: ImageAssetFanSlot }) {\n if (!slot.src) {\n return null;\n }\n\n const src = slot.src;\n\n return (\n <Lightbox alt={ slot.alt } src={ src }>\n {(open: LightboxOpen) => (\n <Pressable\n aria-label={ `View ${ slot.alt }` }\n className={ styles.fanHit }\n onPress={ open }\n >\n <Image alt=\"\" className={ styles.fanImage } src={ src } />\n </Pressable>\n )}\n </Lightbox>\n );\n}\n\nexport function ImageAssetThumbFan({\n badge,\n slots,\n}: {\n badge?: 'loader' | 'error';\n slots: readonly ImageAssetFanSlot[];\n}) {\n return (\n <div\n className={ styles.fan }\n data-count={ slots.length }\n style={ { '--n': slots.length } as CSSProperties }\n >\n <For each={ slots }>\n {(slot, index, { isLast }) => (\n <div\n key={ slot.key }\n className={ styles.fanCard }\n style={ { '--i': index } as CSSProperties }\n >\n <FanFace slot={ slot } />\n <Show when={ isLast && badge === 'loader' }>\n <ProgressLoader aria-hidden className={ styles.loader } size={ 14 } />\n </Show>\n <Show when={ isLast && badge === 'error' }>\n <AttentionTriangle aria-hidden className={ styles.errorMark } size={ 16 } />\n </Show>\n </div>\n )}\n </For>\n </div>\n );\n}\n\nexport function ImageAssetCardTitle({\n failed,\n idle,\n live,\n progress,\n stalled,\n statusDetail,\n}: {\n failed: boolean;\n idle: string;\n live: boolean;\n progress: string;\n stalled: boolean;\n statusDetail?: string;\n}) {\n if (stalled) {\n return (\n <Text className={ styles.title } color=\"danger\">\n { TOOL_INTERRUPTED_MESSAGE }\n </Text>\n );\n }\n\n if (live) {\n return (\n <Shimmer as=\"span\" className={ styles.title } duration={ 1 }>\n { progress }\n </Shimmer>\n );\n }\n\n if (failed) {\n return (\n <FailedToolTitleTooltip statusDetail={ statusDetail }>\n <Text className={ styles.title } color=\"secondary\" decoration=\"line-through\">\n { idle }\n </Text>\n </FailedToolTitleTooltip>\n );\n }\n\n return <Text className={ styles.title }>{ idle }</Text>;\n}\n\n/** Card for ImageGen / SearchImage — thumb row, or a plain shell row when nothing came back. */\nexport function ImageAssetTool({ part }: ToolRendererProps) {\n const toolName = getToolName(part);\n const { previewUrl } = useChat();\n const { live, stalled } = useToolProgress(part.state);\n\n if (!IMAGE_TOOL_NAMES.has(toolName)) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const done = state === 'output-available';\n const output = done ? parseOutput(part.output) : undefined;\n const success = (output?.ok === true) ? output : undefined;\n const error = (output?.ok === false) ? output.error : failure.tooltip;\n const images = success?.images ?? [];\n const input = (typeof part.input === 'object' && part.input !== null)\n ? part.input as ToolInput\n : undefined;\n\n const outputAlt = (output && 'alt' in output && typeof output.alt === 'string')\n ? output.alt\n : undefined;\n const outputQuery = (output && 'query' in output && typeof output.query === 'string')\n ? output.query\n : undefined;\n // Prefer short alt (ImageGen); stock search falls back to search query — never the gen prompt.\n const fallback = (\n success?.alt\n || outputAlt\n || input?.alt\n || success?.query\n || outputQuery\n || input?.query\n || ''\n ).trim();\n\n const inProgress = isToolInvocationInProgress(state);\n const failedEmpty = !inProgress && images.length === 0;\n const total = images.length > 0 ? images.length : requestedCount(input);\n const titles = titlesFor(toolName, total);\n const lines = uniqueLines([\n ...captionLines({\n images,\n prompts: input?.prompts,\n fallback,\n }),\n ...images.flatMap(image => (previewSrc(image, previewUrl) ? [] : [image.path])),\n ]);\n const credits = uniqueCredits(images);\n const slots: ImageAssetFanSlot[] = failedEmpty\n ? [{ key: 'failed', alt: failureTitle(toolName) }]\n : images.length > 0\n ? images.map((image, index) => {\n const src = previewSrc(image, previewUrl);\n\n return {\n key: src || image.path || `image-${ index }`,\n src,\n alt: image.alt?.trim() || lines[index] || `Image ${ index + 1 }`,\n };\n })\n : Array.from({ length: total }, (_, index) => ({\n key: `placeholder-${ index }`,\n alt: lines[index] || titles.progress,\n }));\n\n return (\n <ToolShellCard\n aria-busy={ live }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"image-asset-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 ? failureTitle(toolName) : titles.idle }\n live={ live }\n progress={ titles.progress }\n stalled={ stalled }\n statusDetail={ error }\n />\n <Show when={ lines.length === 1 }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { lines[0] }\n </Text>\n </Show>\n <Show when={ lines.length > 1 }>\n <ul className={ styles.captions }>\n <For each={ lines }>\n {line => (\n <li key={ line }>\n <Text className={ styles.caption } color=\"secondary\" variant=\"sm\">\n { line }\n </Text>\n </li>\n )}\n </For>\n </ul>\n </Show>\n <Show when={ credits.length > 0 }>\n <div className={ styles.credits }>\n <For each={ credits }>\n {credit => (\n <CreditCaption\n key={ credit.profileUrl || credit.name }\n credit={ credit }\n />\n )}\n </For>\n </div>\n </Show>\n </Box>\n </Box>\n </ToolShellCard>\n );\n}\n"],"names":["IMAGE_TOOL_NAMES","parseOutput","output","previewSrc","image","host","absolute","publicPath","titlesFor","toolName","count","failureTitle","CreditCaption","credit","profileHref","unsplashHref","Text","styles","Show","href","_jsx","uniqueLines","values","seen","lines","value","line","captionLines","args","fromImages","fromPrompts","item","requestedCount","input","prompts","uniqueCredits","images","credits","key","FanFace","slot","src","Lightbox","open","Pressable","Image","ImageAssetThumbFan","badge","slots","For","index","isLast","ProgressLoader","AttentionTriangle","ImageAssetCardTitle","failed","idle","live","progress","stalled","statusDetail","TOOL_INTERRUPTED_MESSAGE","Shimmer","FailedToolTitleTooltip","ImageAssetTool","part","getToolName","previewUrl","useChat","useToolProgress","state","failure","getToolFailureRowState","success","error","outputAlt","outputQuery","fallback","failedEmpty","isToolInvocationInProgress","total","titles","_","ToolShellCard","shellStyles","Box","_jsxs"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Box as u } from "@reforma/icons/14";
|
|
2
|
-
import { isToolUIPart as f, getToolName as g } from "
|
|
2
|
+
import { isToolUIPart as f, getToolName as g } 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 h, isToolInvocationInProgress as p } from "../helpers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstallDependenciesTool.js","sources":["../../../../src/chat/Tool/install-dependencies/InstallDependenciesTool.tsx"],"sourcesContent":["import { Box } from '@reforma/icons/14';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"InstallDependenciesTool.js","sources":["../../../../src/chat/Tool/install-dependencies/InstallDependenciesTool.tsx"],"sourcesContent":["import { Box } 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 { InstallDepsToolInput, InstallDepsToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\nconst labels = {\n inProgress: 'Installing dependencies',\n pending: 'Install dependencies',\n background: 'Installing in background',\n success: 'Installed dependencies',\n installFailed: 'Install failed',\n devRestartFailed: 'Dev server restart failed',\n} as const;\n\nfunction packagesFromInput(input: unknown): string[] {\n if (input == null || typeof input !== 'object') {\n return [];\n }\n\n const packages = (input as InstallDepsToolInput).packages;\n\n return Array.isArray(packages)\n ? packages.filter((pkg): pkg is string => typeof pkg === 'string' && pkg.length > 0)\n : [];\n}\n\nfunction outputError(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as InstallDepsToolOutput).error;\n\n if (typeof error === 'string' && error.length > 0) {\n return error;\n }\n\n return undefined;\n}\n\nfunction installDependenciesTitle(\n state: string,\n input: unknown,\n output: unknown,\n useFailureLabel: boolean\n): string {\n if (useFailureLabel) {\n return labels.installFailed;\n }\n\n const parsedError = outputError(output);\n\n if (parsedError) {\n const stage = (output as InstallDepsToolOutput).stage;\n\n return stage === 'dev-restart' ? labels.devRestartFailed : labels.installFailed;\n }\n\n if (\n (input != null && typeof input === 'object' && (input as InstallDepsToolInput).background === true)\n || (output != null && typeof output === 'object' && (output as InstallDepsToolOutput).status === 'running')\n ) {\n return labels.background;\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/** InstallDeps: status row, with named packages on a gray line under it. */\nexport function InstallDepsTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'InstallDeps') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available' ? outputError(part.output) : undefined;\n const title = installDependenciesTitle(part.state, part.input, part.output, failure.useFailureLabel);\n const packages = packagesFromInput(part.input);\n\n return (\n <ToolShell data-slot=\"install-dependencies-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n failed={ logicalError ? true : undefined }\n title={ title }\n titleInProgress={ labels.inProgress }\n icon={ <Box aria-hidden /> }\n />\n\n <Show when={ packages.length > 0 }>\n <ToolShellFooter>\n <Text color=\"secondary\" truncate>{ packages.join(', ') }</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ logicalError && !failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{logicalError}</Text>\n </ToolShellFooter>\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["labels","packagesFromInput","input","packages","pkg","outputError","output","error","installDependenciesTitle","state","useFailureLabel","isToolInvocationInProgress","InstallDepsTool","part","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","title","ToolShell","_jsx","ToolShellHeader","Box","Show","ToolShellFooter","Text"],"mappings":";;;;;;;AAOA,MAAMA,IAAS;AAAA,EACb,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,eAAe;AAAA,EACf,kBAAkB;AACpB;AACA,SAASC,EAAkBC,GAAO;AAChC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO,CAAA;AAET,QAAMC,IAAWD,EAAM;AACvB,SAAO,MAAM,QAAQC,CAAQ,IAAIA,EAAS,OAAO,CAAAC,MAAO,OAAOA,KAAQ,YAAYA,EAAI,SAAS,CAAC,IAAI,CAAA;AACvG;AACA,SAASC,EAAYC,GAAQ;AAC3B,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC;AAEF,QAAMC,IAAQD,EAAO;AACrB,MAAI,OAAOC,KAAU,YAAYA,EAAM,SAAS;AAC9C,WAAOA;AAGX;AACA,SAASC,EAAyBC,GAAOP,GAAOI,GAAQI,GAAiB;AACvE,SAAIA,IACKV,EAAO,gBAEIK,EAAYC,CAAM,IAEtBA,EAAO,UACJ,gBAAgBN,EAAO,mBAAmBA,EAAO,gBAEhEE,KAAS,QAAQ,OAAOA,KAAU,YAAYA,EAAM,eAAe,MAAQI,KAAU,QAAQ,OAAOA,KAAW,YAAYA,EAAO,WAAW,YACxIN,EAAO,aAEZS,MAAU,qBACLT,EAAO,UAEZW,EAA2BF,CAAK,IAC3BT,EAAO,aAETA,EAAO;AAChB;AAGO,SAASY,EAAgB;AAAA,EAC9B,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAUC,EAAuBJ,CAAI,GACrCK,IAAeL,EAAK,UAAU,qBAAqBR,EAAYQ,EAAK,MAAM,IAAI,QAC9EM,IAAQX,EAAyBK,EAAK,OAAOA,EAAK,OAAOA,EAAK,QAAQG,EAAQ,eAAe,GAC7Fb,IAAWF,EAAkBY,EAAK,KAAK;AAC7C,2BAA0BO,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKC,GAAiB;AAAA,MAC5C,OAAOT,EAAK;AAAA,MACZ,cAAcG,EAAQ;AAAA,MACtB,QAAQE,IAAe,KAAO;AAAA,MAC9B,OAAAC;AAAA,MACA,iBAAiBnB,EAAO;AAAA,MACxB,wBAAwBuB,GAAK;AAAA,QAC3B,eAAe;AAAA,MAAA,CAChB;AAAA,IAAA,CACF,GAAgBF,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMrB,EAAS,SAAS;AAAA,MACxB,4BAA4BsB,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,UAAUvB,EAAS,KAAK,IAAI;AAAA,QAAA,CAC7B;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBkB,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMN,KAAgB,CAACF,EAAQ;AAAA,MAC/B,4BAA4BS,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUR;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKG,GAAM;AAAA,MAC1B,MAAMR,EAAQ;AAAA,MACd,4BAA4BS,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUV,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isToolUIPart as g, getToolName as u } from "
|
|
1
|
+
import { isToolUIPart as g, getToolName as u } from "@reforma/types";
|
|
2
2
|
import { useChat as m } from "../../ChatContext.js";
|
|
3
3
|
import { getToolFailureRowState as f } from "../helpers.js";
|
|
4
4
|
import { IntegrationActionIcon as p, IntegrationActionCard as c } from "../integration-card/IntegrationActionCard.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstallPlugin.js","sources":["../../../../src/chat/Tool/install-plugin/InstallPlugin.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"InstallPlugin.js","sources":["../../../../src/chat/Tool/install-plugin/InstallPlugin.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { useChat } from '../../ChatContext';\nimport { getToolFailureRowState } from '../helpers';\nimport { IntegrationActionCard, IntegrationActionIcon } from '../integration-card/IntegrationActionCard';\nimport { ToolShell, ToolShellHeader } from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction installPluginId(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n\n const id = (input as { id?: unknown }).id;\n\n return typeof id === 'string' ? id.trim() || undefined : undefined;\n}\n\n/** InstallPlugin: Skip / Install plaque while confirming; compact work-log row otherwise. */\nexport function InstallPlugin({ part, onToolApprovalResponse }: ToolRendererProps) {\n const { integrationsCatalog, pluginsCatalog } = useChat();\n\n if (!isToolUIPart(part) || getToolName(part) !== 'InstallPlugin') {\n return null;\n }\n\n const id = installPluginId(part.input);\n const row = id\n ? integrationsCatalog?.find(item => item.id === id)\n ?? pluginsCatalog?.integrations.find(item => item.id === id || item.serverId === id)\n : undefined;\n const name = row?.name ?? id ?? 'Plugin';\n\n if (part.state !== 'approval-requested') {\n const failure = getToolFailureRowState(part);\n\n return (\n <ToolShell data-slot=\"install-plugin-tool\">\n <ToolShellHeader\n state={ part.state }\n statusDetail={ failure.tooltip }\n title={ `Installed ${ name }` }\n titleInProgress={ `Installing ${ name }` }\n icon={ (\n <IntegrationActionIcon\n logo={ row?.logo }\n logoSmall={ row?.logoSmall }\n brandColor={ row?.brandColor }\n brandColorDark={ row?.brandColorDark }\n size={ 14 }\n framed={ false }\n />\n ) }\n />\n </ToolShell>\n );\n }\n\n const approvalId = part.approval?.id;\n\n return (\n <IntegrationActionCard\n data-slot=\"install-plugin-tool\"\n name={ name }\n description={\n (row && 'description' in row ? row.description.trim() : '')\n || 'Install this plugin'\n }\n logo={ row?.logo }\n brandColor={ row?.brandColor }\n brandColorDark={ row?.brandColorDark }\n primaryLabel=\"Install\"\n isPrimaryDisabled={ !approvalId }\n onSkip={ () => {\n if (!approvalId) {\n return;\n }\n\n onToolApprovalResponse?.({\n id: approvalId,\n approved: false,\n });\n } }\n onPrimary={ () => {\n if (!approvalId) {\n return;\n }\n\n onToolApprovalResponse?.({\n id: approvalId,\n approved: true,\n });\n } }\n />\n );\n}\n"],"names":["installPluginId","input","id","InstallPlugin","part","onToolApprovalResponse","integrationsCatalog","pluginsCatalog","useChat","isToolUIPart","getToolName","row","item","name","failure","getToolFailureRowState","ToolShell","ToolShellHeader","IntegrationActionIcon","approvalId","IntegrationActionCard"],"mappings":";;;;;;AAMA,SAASA,EAAgBC,GAAO;AAC9B,MAAI,CAACA,KAAS,OAAOA,KAAU;AAC7B;AAEF,QAAMC,IAAKD,EAAM;AACjB,SAAO,OAAOC,KAAO,YAAWA,EAAG,KAAA,KAAU;AAC/C;AAGO,SAASC,EAAc;AAAA,EAC5B,MAAAC;AAAA,EACA,wBAAAC;AACF,GAAG;AACD,QAAM;AAAA,IACJ,qBAAAC;AAAA,IACA,gBAAAC;AAAA,EAAA,IACEC,EAAA;AACJ,MAAI,CAACC,EAAaL,CAAI,KAAKM,EAAYN,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMF,IAAKF,EAAgBI,EAAK,KAAK,GAC/BO,IAAMT,IAAKI,GAAqB,KAAK,CAAAM,MAAQA,EAAK,OAAOV,CAAE,KAAKK,GAAgB,aAAa,KAAK,OAAQK,EAAK,OAAOV,KAAMU,EAAK,aAAaV,CAAE,IAAI,QACpJW,IAAOF,GAAK,QAAQT,KAAM;AAChC,MAAIE,EAAK,UAAU,sBAAsB;AACvC,UAAMU,IAAUC,EAAuBX,CAAI;AAC3C,6BAAyBY,GAAW;AAAA,MAClC,aAAa;AAAA,MACb,4BAA4BC,GAAiB;AAAA,QAC3C,OAAOb,EAAK;AAAA,QACZ,cAAcU,EAAQ;AAAA,QACtB,OAAO,aAAaD,CAAI;AAAA,QACxB,iBAAiB,cAAcA,CAAI;AAAA,QACnC,wBAAwBK,GAAuB;AAAA,UAC7C,MAAMP,GAAK;AAAA,UACX,WAAWA,GAAK;AAAA,UAChB,YAAYA,GAAK;AAAA,UACjB,gBAAgBA,GAAK;AAAA,UACrB,MAAM;AAAA,UACN,QAAQ;AAAA,QAAA,CACT;AAAA,MAAA,CACF;AAAA,IAAA,CACF;AAAA,EACH;AACA,QAAMQ,IAAaf,EAAK,UAAU;AAClC,2BAAyBgB,GAAuB;AAAA,IAC9C,aAAa;AAAA,IACb,MAAAP;AAAA,IACA,cAAcF,KAAO,iBAAiBA,IAAMA,EAAI,YAAY,SAAS,OAAO;AAAA,IAC5E,MAAMA,GAAK;AAAA,IACX,YAAYA,GAAK;AAAA,IACjB,gBAAgBA,GAAK;AAAA,IACrB,cAAc;AAAA,IACd,mBAAmB,CAACQ;AAAA,IACpB,QAAQ,MAAM;AACZ,MAAKA,KAGLd,IAAyB;AAAA,QACvB,IAAIc;AAAA,QACJ,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,IACA,WAAW,MAAM;AACf,MAAKA,KAGLd,IAAyB;AAAA,QACvB,IAAIc;AAAA,QACJ,UAAU;AAAA,MAAA,CACX;AAAA,IACH;AAAA,EAAA,CACD;AACH;"}
|
|
@@ -12,6 +12,8 @@ export type IntegrationActionCardProps = {
|
|
|
12
12
|
spacious?: boolean;
|
|
13
13
|
/** Replaces the catalog mark. */
|
|
14
14
|
icon?: ReactNode;
|
|
15
|
+
/** Shown after the name in the spacious layout. */
|
|
16
|
+
badge?: ReactNode;
|
|
15
17
|
onSkip?: () => void;
|
|
16
18
|
onPrimary?: () => void;
|
|
17
19
|
isPending?: boolean;
|
|
@@ -23,5 +25,5 @@ export declare function IntegrationActionIcon({ logo, logoSmall, brandColor, bra
|
|
|
23
25
|
framed?: boolean;
|
|
24
26
|
}): import("react").JSX.Element;
|
|
25
27
|
/** Filled HITL row: catalog mark + name + description + Skip / primary. */
|
|
26
|
-
export declare function IntegrationActionCard({ name, description, logo, brandColor, brandColorDark, primaryLabel, skipLabel, spacious, icon, onSkip, onPrimary, isPending, isPrimaryDisabled, 'data-slot': dataSlot, }: IntegrationActionCardProps): import("react").JSX.Element;
|
|
28
|
+
export declare function IntegrationActionCard({ name, description, logo, brandColor, brandColorDark, primaryLabel, skipLabel, spacious, icon, badge, onSkip, onPrimary, isPending, isPrimaryDisabled, 'data-slot': dataSlot, }: IntegrationActionCardProps): import("react").JSX.Element;
|
|
27
29
|
//# sourceMappingURL=IntegrationActionCard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntegrationActionCard.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/integration-card/IntegrationActionCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAY3D,MAAM,MAAM,0BAA0B,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EAClC,IAAI,EACJ,SAAS,EACT,UAAU,EACV,cAAc,EACd,IAAgB,EAChB,MAAa,GAChB,EAAE,IAAI,CAAC,0BAA0B,EAAE,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,gBAAgB,CAAC,GAAG;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,+BA6BA;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,EAClC,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAkB,EAClB,QAAgB,EAChB,IAAI,EACJ,MAAM,EACN,SAAS,EACT,SAAiB,EACjB,iBAAyB,EACzB,WAAW,EAAE,QAAQ,GACxB,EAAE,0BAA0B,+
|
|
1
|
+
{"version":3,"file":"IntegrationActionCard.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/integration-card/IntegrationActionCard.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAY3D,MAAM,MAAM,0BAA0B,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,mDAAmD;IACnD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EAClC,IAAI,EACJ,SAAS,EACT,UAAU,EACV,cAAc,EACd,IAAgB,EAChB,MAAa,GAChB,EAAE,IAAI,CAAC,0BAA0B,EAAE,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,gBAAgB,CAAC,GAAG;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,+BA6BA;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,EAClC,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAkB,EAClB,QAAgB,EAChB,IAAI,EACJ,KAAK,EACL,MAAM,EACN,SAAS,EACT,SAAiB,EACjB,iBAAyB,EACzB,WAAW,EAAE,QAAQ,GACxB,EAAE,0BAA0B,+BAuF5B"}
|
|
@@ -1,150 +1,156 @@
|
|
|
1
|
-
import { Mcp as
|
|
2
|
-
import { isHttpUrl as
|
|
1
|
+
import { Mcp as k } from "@reforma/icons/14";
|
|
2
|
+
import { isHttpUrl as N } from "@reforma/lib";
|
|
3
3
|
import "react";
|
|
4
|
-
import { Box as
|
|
5
|
-
import { Button as
|
|
4
|
+
import { Box as s } from "../../../Box/Box.js";
|
|
5
|
+
import { Button as b } from "../../../Button/Button.js";
|
|
6
6
|
import { Card as j } from "../../../Card/Card.js";
|
|
7
|
-
import { Image as
|
|
8
|
-
import { Show as
|
|
9
|
-
import { Text as
|
|
10
|
-
import
|
|
11
|
-
import { jsxs as
|
|
12
|
-
const
|
|
13
|
-
function
|
|
14
|
-
logo:
|
|
15
|
-
logoSmall:
|
|
7
|
+
import { Image as z } from "../../../Image/Image.js";
|
|
8
|
+
import { Show as u } from "../../../Show/Show.js";
|
|
9
|
+
import { Text as f } from "../../../Text/Text.js";
|
|
10
|
+
import m from "./IntegrationActionCard.module.css.js";
|
|
11
|
+
import { jsxs as e, jsx as r } from "react/jsx-runtime";
|
|
12
|
+
const A = 20;
|
|
13
|
+
function W({
|
|
14
|
+
logo: i,
|
|
15
|
+
logoSmall: n,
|
|
16
16
|
brandColor: c,
|
|
17
17
|
brandColorDark: o,
|
|
18
|
-
size:
|
|
18
|
+
size: a = A,
|
|
19
19
|
framed: l = !0
|
|
20
20
|
}) {
|
|
21
|
-
const
|
|
22
|
-
return /* @__PURE__ */
|
|
23
|
-
className: l ?
|
|
21
|
+
const h = !l && n && N(n) ? n : void 0, t = h ?? (i && N(i) ? i : void 0), d = !!((c || o) && !h);
|
|
22
|
+
return /* @__PURE__ */ r("span", {
|
|
23
|
+
className: l ? m.icon : m.compact,
|
|
24
24
|
style: {
|
|
25
25
|
...l ? {} : {
|
|
26
|
-
"--catalog-icon-size": `${
|
|
26
|
+
"--catalog-icon-size": `${a}px`
|
|
27
27
|
},
|
|
28
|
-
...
|
|
28
|
+
...d && c ? {
|
|
29
29
|
"--catalog-brand": c
|
|
30
30
|
} : {},
|
|
31
|
-
...
|
|
31
|
+
...d && o ? {
|
|
32
32
|
"--catalog-brand-dark": o
|
|
33
33
|
} : {}
|
|
34
34
|
},
|
|
35
|
-
children: /* @__PURE__ */
|
|
36
|
-
when:
|
|
37
|
-
fallback: /* @__PURE__ */
|
|
38
|
-
size:
|
|
35
|
+
children: /* @__PURE__ */ r(u, {
|
|
36
|
+
when: t,
|
|
37
|
+
fallback: /* @__PURE__ */ r(k, {
|
|
38
|
+
size: a,
|
|
39
39
|
"aria-hidden": !0
|
|
40
40
|
}),
|
|
41
|
-
children: (
|
|
42
|
-
src:
|
|
41
|
+
children: (p) => /* @__PURE__ */ r(z, {
|
|
42
|
+
src: p,
|
|
43
43
|
alt: "",
|
|
44
|
-
width:
|
|
45
|
-
height:
|
|
44
|
+
width: a,
|
|
45
|
+
height: a
|
|
46
46
|
})
|
|
47
47
|
})
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
|
-
function
|
|
51
|
-
name:
|
|
52
|
-
description:
|
|
50
|
+
function F({
|
|
51
|
+
name: i,
|
|
52
|
+
description: n,
|
|
53
53
|
logo: c,
|
|
54
54
|
brandColor: o,
|
|
55
|
-
brandColorDark:
|
|
55
|
+
brandColorDark: a,
|
|
56
56
|
primaryLabel: l,
|
|
57
|
-
skipLabel:
|
|
58
|
-
spacious:
|
|
59
|
-
icon:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
57
|
+
skipLabel: h = "Skip",
|
|
58
|
+
spacious: t = !1,
|
|
59
|
+
icon: d,
|
|
60
|
+
badge: p,
|
|
61
|
+
onSkip: v,
|
|
62
|
+
onPrimary: w,
|
|
63
|
+
isPending: g = !1,
|
|
63
64
|
isPrimaryDisabled: B = !1,
|
|
64
|
-
"data-slot":
|
|
65
|
+
"data-slot": x
|
|
65
66
|
}) {
|
|
66
|
-
const
|
|
67
|
-
when:
|
|
68
|
-
fallback: /* @__PURE__ */
|
|
67
|
+
const I = /* @__PURE__ */ r(u, {
|
|
68
|
+
when: d,
|
|
69
|
+
fallback: /* @__PURE__ */ r(W, {
|
|
69
70
|
logo: c,
|
|
70
71
|
brandColor: o,
|
|
71
|
-
brandColorDark:
|
|
72
|
+
brandColorDark: a
|
|
72
73
|
}),
|
|
73
|
-
children:
|
|
74
|
-
}),
|
|
75
|
-
when:
|
|
76
|
-
children: /* @__PURE__ */
|
|
74
|
+
children: d
|
|
75
|
+
}), y = /* @__PURE__ */ r(u, {
|
|
76
|
+
when: v && w,
|
|
77
|
+
children: /* @__PURE__ */ e(s, {
|
|
77
78
|
direction: "row",
|
|
78
79
|
gap: "sm",
|
|
79
|
-
justify:
|
|
80
|
-
className:
|
|
81
|
-
children: [/* @__PURE__ */
|
|
82
|
-
size:
|
|
83
|
-
variant: "ghost",
|
|
80
|
+
justify: t ? "end" : void 0,
|
|
81
|
+
className: m.actions,
|
|
82
|
+
children: [/* @__PURE__ */ r(b, {
|
|
83
|
+
size: t ? "md" : "sm",
|
|
84
|
+
variant: t ? "bordered" : "ghost",
|
|
84
85
|
color: "secondary",
|
|
85
|
-
isDisabled:
|
|
86
|
-
onPress:
|
|
87
|
-
children:
|
|
88
|
-
}), /* @__PURE__ */
|
|
89
|
-
size:
|
|
86
|
+
isDisabled: g,
|
|
87
|
+
onPress: v,
|
|
88
|
+
children: h
|
|
89
|
+
}), /* @__PURE__ */ r(b, {
|
|
90
|
+
size: t ? "md" : "sm",
|
|
90
91
|
variant: "filled",
|
|
91
92
|
color: "contrast",
|
|
92
|
-
isPending:
|
|
93
|
-
isDisabled:
|
|
94
|
-
onPress:
|
|
93
|
+
isPending: g,
|
|
94
|
+
isDisabled: g || B,
|
|
95
|
+
onPress: w,
|
|
95
96
|
children: l
|
|
96
97
|
})]
|
|
97
98
|
})
|
|
98
99
|
});
|
|
99
|
-
return
|
|
100
|
+
return t ? /* @__PURE__ */ e(j, {
|
|
100
101
|
variant: "filled",
|
|
101
102
|
size: "lg",
|
|
102
103
|
direction: "column",
|
|
103
104
|
align: "stretch",
|
|
104
105
|
gap: "xl",
|
|
105
106
|
fullWidth: !0,
|
|
106
|
-
className:
|
|
107
|
-
"data-slot":
|
|
108
|
-
children: [/* @__PURE__ */
|
|
107
|
+
className: m.root,
|
|
108
|
+
"data-slot": x,
|
|
109
|
+
children: [/* @__PURE__ */ e(s, {
|
|
109
110
|
gap: "lg",
|
|
110
|
-
children: [
|
|
111
|
+
children: [I, /* @__PURE__ */ e(s, {
|
|
111
112
|
gap: "xs",
|
|
112
|
-
children: [/* @__PURE__ */
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
113
|
+
children: [/* @__PURE__ */ e(s, {
|
|
114
|
+
direction: "row",
|
|
115
|
+
align: "center",
|
|
116
|
+
gap: "sm",
|
|
117
|
+
children: [/* @__PURE__ */ r(f, {
|
|
118
|
+
variant: "heading-4",
|
|
119
|
+
children: i
|
|
120
|
+
}), p]
|
|
121
|
+
}), /* @__PURE__ */ r(f, {
|
|
116
122
|
variant: "md",
|
|
117
123
|
color: "secondary",
|
|
118
|
-
children:
|
|
124
|
+
children: n
|
|
119
125
|
})]
|
|
120
126
|
})]
|
|
121
|
-
}),
|
|
122
|
-
}) : /* @__PURE__ */
|
|
127
|
+
}), y]
|
|
128
|
+
}) : /* @__PURE__ */ e(j, {
|
|
123
129
|
variant: "filled",
|
|
124
130
|
size: "sm",
|
|
125
131
|
direction: "row",
|
|
126
132
|
align: "center",
|
|
127
133
|
gap: "md",
|
|
128
134
|
fullWidth: !0,
|
|
129
|
-
className:
|
|
130
|
-
"data-slot":
|
|
131
|
-
children: [
|
|
135
|
+
className: m.root,
|
|
136
|
+
"data-slot": x,
|
|
137
|
+
children: [I, /* @__PURE__ */ e(s, {
|
|
132
138
|
grow: !0,
|
|
133
|
-
children: [/* @__PURE__ */
|
|
139
|
+
children: [/* @__PURE__ */ r(f, {
|
|
134
140
|
variant: "heading-5",
|
|
135
141
|
truncate: !0,
|
|
136
|
-
children:
|
|
137
|
-
}), /* @__PURE__ */
|
|
142
|
+
children: i
|
|
143
|
+
}), /* @__PURE__ */ r(f, {
|
|
138
144
|
variant: "md",
|
|
139
145
|
color: "secondary",
|
|
140
146
|
truncate: !0,
|
|
141
|
-
children:
|
|
147
|
+
children: n
|
|
142
148
|
})]
|
|
143
|
-
}),
|
|
149
|
+
}), y]
|
|
144
150
|
});
|
|
145
151
|
}
|
|
146
152
|
export {
|
|
147
|
-
|
|
148
|
-
|
|
153
|
+
F as IntegrationActionCard,
|
|
154
|
+
W as IntegrationActionIcon
|
|
149
155
|
};
|
|
150
156
|
//# sourceMappingURL=IntegrationActionCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IntegrationActionCard.js","sources":["../../../../src/chat/Tool/integration-card/IntegrationActionCard.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { isHttpUrl } from '@reforma/lib';\nimport { type CSSProperties, type ReactNode } from 'react';\n\nimport { Box } from '../../../Box';\nimport { Button } from '../../../Button';\nimport { Card } from '../../../Card';\nimport { Image } from '../../../Image';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport styles from './IntegrationActionCard.module.css';\n\nconst ICON_SIZE = 20;\n\nexport type IntegrationActionCardProps = {\n name: string;\n description: string;\n logo?: string;\n logoSmall?: string;\n brandColor?: string;\n brandColorDark?: string;\n primaryLabel?: string;\n skipLabel?: string;\n /** Taller card: wrapping copy and room for a long skip label. */\n spacious?: boolean;\n /** Replaces the catalog mark. */\n icon?: ReactNode;\n onSkip?: () => void;\n onPrimary?: () => void;\n isPending?: boolean;\n isPrimaryDisabled?: boolean;\n 'data-slot'?: string;\n};\n\nexport function IntegrationActionIcon({\n logo,\n logoSmall,\n brandColor,\n brandColorDark,\n size = ICON_SIZE,\n framed = true,\n}: Pick<IntegrationActionCardProps, 'logo' | 'logoSmall' | 'brandColor' | 'brandColorDark'> & {\n size?: number;\n framed?: boolean;\n}) {\n const small = !framed && logoSmall && isHttpUrl(logoSmall) ? logoSmall : undefined;\n const src = small ?? ((logo && isHttpUrl(logo)) ? logo : undefined);\n const plated = Boolean((brandColor || brandColorDark) && !small);\n\n return (\n <span\n className={ framed ? styles.icon : styles.compact }\n style={ {\n ...(!framed ? { '--catalog-icon-size': `${ size }px` } : {}),\n ...(plated && brandColor ? { '--catalog-brand': brandColor } : {}),\n ...(plated && brandColorDark ? { '--catalog-brand-dark': brandColorDark } : {}),\n } as CSSProperties }\n >\n <Show\n when={ src }\n fallback={ <Mcp size={ size } aria-hidden /> }\n >\n { href => (\n <Image\n src={ href }\n alt=\"\"\n width={ size }\n height={ size }\n />\n ) }\n </Show>\n </span>\n );\n}\n\n/** Filled HITL row: catalog mark + name + description + Skip / primary. */\nexport function IntegrationActionCard({\n name,\n description,\n logo,\n brandColor,\n brandColorDark,\n primaryLabel,\n skipLabel = 'Skip',\n spacious = false,\n icon,\n onSkip,\n onPrimary,\n isPending = false,\n isPrimaryDisabled = false,\n 'data-slot': dataSlot,\n}: IntegrationActionCardProps) {\n const mark = (\n <Show\n when={ icon }\n fallback={ (\n <IntegrationActionIcon\n logo={ logo }\n brandColor={ brandColor }\n brandColorDark={ brandColorDark }\n />\n ) }\n >\n { icon }\n </Show>\n );\n const actions = (\n <Show when={ onSkip && onPrimary }>\n <Box direction=\"row\" gap=\"sm\" justify={ spacious ? 'end' : undefined } className={ styles.actions }>\n <Button\n size={ spacious ? 'md' : 'sm' }\n variant
|
|
1
|
+
{"version":3,"file":"IntegrationActionCard.js","sources":["../../../../src/chat/Tool/integration-card/IntegrationActionCard.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { isHttpUrl } from '@reforma/lib';\nimport { type CSSProperties, type ReactNode } from 'react';\n\nimport { Box } from '../../../Box';\nimport { Button } from '../../../Button';\nimport { Card } from '../../../Card';\nimport { Image } from '../../../Image';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport styles from './IntegrationActionCard.module.css';\n\nconst ICON_SIZE = 20;\n\nexport type IntegrationActionCardProps = {\n name: string;\n description: string;\n logo?: string;\n logoSmall?: string;\n brandColor?: string;\n brandColorDark?: string;\n primaryLabel?: string;\n skipLabel?: string;\n /** Taller card: wrapping copy and room for a long skip label. */\n spacious?: boolean;\n /** Replaces the catalog mark. */\n icon?: ReactNode;\n /** Shown after the name in the spacious layout. */\n badge?: ReactNode;\n onSkip?: () => void;\n onPrimary?: () => void;\n isPending?: boolean;\n isPrimaryDisabled?: boolean;\n 'data-slot'?: string;\n};\n\nexport function IntegrationActionIcon({\n logo,\n logoSmall,\n brandColor,\n brandColorDark,\n size = ICON_SIZE,\n framed = true,\n}: Pick<IntegrationActionCardProps, 'logo' | 'logoSmall' | 'brandColor' | 'brandColorDark'> & {\n size?: number;\n framed?: boolean;\n}) {\n const small = !framed && logoSmall && isHttpUrl(logoSmall) ? logoSmall : undefined;\n const src = small ?? ((logo && isHttpUrl(logo)) ? logo : undefined);\n const plated = Boolean((brandColor || brandColorDark) && !small);\n\n return (\n <span\n className={ framed ? styles.icon : styles.compact }\n style={ {\n ...(!framed ? { '--catalog-icon-size': `${ size }px` } : {}),\n ...(plated && brandColor ? { '--catalog-brand': brandColor } : {}),\n ...(plated && brandColorDark ? { '--catalog-brand-dark': brandColorDark } : {}),\n } as CSSProperties }\n >\n <Show\n when={ src }\n fallback={ <Mcp size={ size } aria-hidden /> }\n >\n { href => (\n <Image\n src={ href }\n alt=\"\"\n width={ size }\n height={ size }\n />\n ) }\n </Show>\n </span>\n );\n}\n\n/** Filled HITL row: catalog mark + name + description + Skip / primary. */\nexport function IntegrationActionCard({\n name,\n description,\n logo,\n brandColor,\n brandColorDark,\n primaryLabel,\n skipLabel = 'Skip',\n spacious = false,\n icon,\n badge,\n onSkip,\n onPrimary,\n isPending = false,\n isPrimaryDisabled = false,\n 'data-slot': dataSlot,\n}: IntegrationActionCardProps) {\n const mark = (\n <Show\n when={ icon }\n fallback={ (\n <IntegrationActionIcon\n logo={ logo }\n brandColor={ brandColor }\n brandColorDark={ brandColorDark }\n />\n ) }\n >\n { icon }\n </Show>\n );\n const actions = (\n <Show when={ onSkip && onPrimary }>\n <Box direction=\"row\" gap=\"sm\" justify={ spacious ? 'end' : undefined } className={ styles.actions }>\n <Button\n size={ spacious ? 'md' : 'sm' }\n variant={ spacious ? 'bordered' : 'ghost' }\n color=\"secondary\"\n isDisabled={ isPending }\n onPress={ onSkip }\n >\n { skipLabel }\n </Button>\n <Button\n size={ spacious ? 'md' : 'sm' }\n variant=\"filled\"\n color=\"contrast\"\n isPending={ isPending }\n isDisabled={ isPending || isPrimaryDisabled }\n onPress={ onPrimary }\n >\n { primaryLabel }\n </Button>\n </Box>\n </Show>\n );\n\n if (spacious) {\n return (\n <Card\n variant=\"filled\"\n size=\"lg\"\n direction=\"column\"\n align=\"stretch\"\n gap=\"xl\"\n fullWidth\n className={ styles.root }\n data-slot={ dataSlot }\n >\n <Box gap=\"lg\">\n { mark }\n <Box gap=\"xs\">\n <Box direction=\"row\" align=\"center\" gap=\"sm\">\n <Text variant=\"heading-4\">{ name }</Text>\n { badge }\n </Box>\n <Text variant=\"md\" color=\"secondary\">{ description }</Text>\n </Box>\n </Box>\n { actions }\n </Card>\n );\n }\n\n return (\n <Card\n variant=\"filled\"\n size=\"sm\"\n direction=\"row\"\n align=\"center\"\n gap=\"md\"\n fullWidth\n className={ styles.root }\n data-slot={ dataSlot }\n >\n { mark }\n <Box grow>\n <Text variant=\"heading-5\" truncate>{ name }</Text>\n <Text variant=\"md\" color=\"secondary\" truncate>{ description }</Text>\n </Box>\n { actions }\n </Card>\n );\n}\n"],"names":["ICON_SIZE","IntegrationActionIcon","logo","logoSmall","brandColor","brandColorDark","size","framed","small","isHttpUrl","src","plated","styles","Show","Mcp","href","_jsx","Image","IntegrationActionCard","name","description","primaryLabel","skipLabel","spacious","icon","badge","onSkip","onPrimary","isPending","isPrimaryDisabled","dataSlot","mark","actions","Box","Button","Card","_jsxs","Text"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isToolUIPart as l, getToolName as s } from "
|
|
1
|
+
import { isToolUIPart as l, getToolName as s } from "@reforma/types";
|
|
2
2
|
import { chipItemFromPath as n } from "../../Chip/helpers/chipPath.js";
|
|
3
3
|
import { isToolInvocationInProgress as c, getToolFailureRowState as m } from "../helpers.js";
|
|
4
4
|
import { parseListDirectoryOutput as a } from "./listDirectoryOutput.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalizeListDirectoryTools.js","sources":["../../../../src/chat/Tool/list-directory/normalizeListDirectoryTools.ts"],"sourcesContent":["import { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"normalizeListDirectoryTools.js","sources":["../../../../src/chat/Tool/list-directory/normalizeListDirectoryTools.ts"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { chipItemFromPath, type ChipItem } from '../../Chip';\nimport { getToolFailureRowState, isToolInvocationInProgress, type ToolFailureRowState } from '../helpers';\nimport { parseListDirectoryOutput } from './listDirectoryOutput';\n\nimport type { ReformaUIMessagePart } from '../../Message/types';\nimport type { ToolRendererProps } from '../types';\n\nexport type ListDirectoryToolUIPart = Extract<ReformaUIMessagePart, { type: 'tool-ListDirectory' }>;\n\nexport function isListDirectoryToolUIPart(\n part: ToolRendererProps['part'] | ReformaUIMessagePart\n): part is ListDirectoryToolUIPart {\n return isToolUIPart(part) && getToolName(part) === 'ListDirectory';\n}\n\nexport type ListDirectoryDirectoryEntry = {\n id: string;\n chipItems: ChipItem[];\n paths: string[];\n done: boolean;\n};\n\nexport type NormalizedListDirectoryToolsView = {\n directories: ListDirectoryDirectoryEntry[];\n /** SDK state of the last merged part (message order). */\n state: ListDirectoryToolUIPart['state'];\n failure: ToolFailureRowState;\n statusDetail?: string;\n problemText?: string;\n};\n\nfunction directoryEntryFromPart(part: ListDirectoryToolUIPart): ListDirectoryDirectoryEntry {\n const input = part.input as { path?: string } | undefined;\n const item = chipItemFromPath(input?.path || './');\n const chipItems = item ? [{ ...item, type: 'folder' as const, id: part.toolCallId }] : [];\n const done = part.state === 'output-available';\n const parsed = done ? parseListDirectoryOutput(part.output) : { paths: [] as string[] };\n\n return {\n id: part.toolCallId,\n chipItems,\n paths: parsed.paths,\n done,\n };\n}\n\nfunction aggregateListDirectoryFailure(parts: readonly ListDirectoryToolUIPart[]): 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\nfunction statusDetailFromParts(\n parts: readonly ListDirectoryToolUIPart[],\n failure: ToolFailureRowState\n): string | undefined {\n if (failure.useFailureLabel) {\n return failure.tooltip;\n }\n\n for (const part of parts) {\n if (part.state !== 'output-available') {\n continue;\n }\n\n const parsed = parseListDirectoryOutput(part.output);\n\n if (parsed.error) {\n return parsed.error;\n }\n }\n\n return undefined;\n}\n\nfunction problemTextFromParts(\n parts: readonly ListDirectoryToolUIPart[],\n failure: ToolFailureRowState\n): string | undefined {\n const hasExecutionError = parts.some((part) => {\n if (part.state !== 'output-available') {\n return false;\n }\n\n return parseListDirectoryOutput(part.output).error !== undefined;\n });\n\n return hasExecutionError ? undefined : failure.problemText;\n}\n\n/** Merges one or more ListDirectory tool parts into a single summary row view. */\nexport function normalizeListDirectoryToolParts(\n parts: readonly ListDirectoryToolUIPart[]\n): NormalizedListDirectoryToolsView {\n const directories = parts.map(part => directoryEntryFromPart(part));\n const failure = aggregateListDirectoryFailure(parts);\n const state = parts[parts.length - 1]?.state ?? 'output-available';\n\n return {\n directories,\n state,\n failure,\n statusDetail: statusDetailFromParts(parts, failure),\n problemText: problemTextFromParts(parts, failure),\n };\n}\n"],"names":["isListDirectoryToolUIPart","part","isToolUIPart","getToolName","directoryEntryFromPart","input","item","chipItemFromPath","chipItems","done","parsed","parseListDirectoryOutput","aggregateListDirectoryFailure","parts","isToolInvocationInProgress","getToolFailureRowState","row","statusDetailFromParts","failure","problemTextFromParts","normalizeListDirectoryToolParts","directories","state"],"mappings":";;;;AAIO,SAASA,EAA0BC,GAAM;AAC9C,SAAOC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AACrD;AACA,SAASG,EAAuBH,GAAM;AACpC,QAAMI,IAAQJ,EAAK,OACbK,IAAOC,EAAiBF,GAAO,QAAQ,IAAI,GAC3CG,IAAYF,IAAO,CAAC;AAAA,IACxB,GAAGA;AAAA,IACH,MAAM;AAAA,IACN,IAAIL,EAAK;AAAA,EAAA,CACV,IAAI,CAAA,GACCQ,IAAOR,EAAK,UAAU,oBACtBS,IAASD,IAAOE,EAAyBV,EAAK,MAAM,IAAI;AAAA,IAC5D,OAAO,CAAA;AAAA,EAAC;AAEV,SAAO;AAAA,IACL,IAAIA,EAAK;AAAA,IACT,WAAAO;AAAA,IACA,OAAOE,EAAO;AAAA,IACd,MAAAD;AAAA,EAAA;AAEJ;AACA,SAASG,EAA8BC,GAAO;AAC5C,SAAIA,EAAM,KAAK,CAAAZ,MAAQa,EAA2Bb,EAAK,KAAK,CAAC,IACpD;AAAA,IACL,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA,IAGbY,EAAM,KAAK,CAAAZ,MAAQA,EAAK,UAAU,kBAAkB,IAC/C;AAAA,IACL,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA,IAGDY,EAAM,IAAI,CAAAZ,MAAQc,EAAuBd,CAAI,CAAC,EAAE,KAAK,CAAAe,MAAOA,EAAI,eAAe,KAC7E;AAAA,IAChB,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa;AAAA,EAAA;AAEjB;AACA,SAASC,EAAsBJ,GAAOK,GAAS;AAC7C,MAAIA,EAAQ;AACV,WAAOA,EAAQ;AAEjB,aAAWjB,KAAQY,GAAO;AACxB,QAAIZ,EAAK,UAAU;AACjB;AAEF,UAAMS,IAASC,EAAyBV,EAAK,MAAM;AACnD,QAAIS,EAAO;AACT,aAAOA,EAAO;AAAA,EAElB;AAEF;AACA,SAASS,EAAqBN,GAAOK,GAAS;AAO5C,SAN0BL,EAAM,KAAK,CAAAZ,MAC/BA,EAAK,UAAU,qBACV,KAEFU,EAAyBV,EAAK,MAAM,EAAE,UAAU,MACxD,IAC0B,SAAYiB,EAAQ;AACjD;AAGO,SAASE,EAAgCP,GAAO;AACrD,QAAMQ,IAAcR,EAAM,IAAI,CAAAZ,MAAQG,EAAuBH,CAAI,CAAC,GAC5DiB,IAAUN,EAA8BC,CAAK,GAC7CS,IAAQT,EAAMA,EAAM,SAAS,CAAC,GAAG,SAAS;AAChD,SAAO;AAAA,IACL,aAAAQ;AAAA,IACA,OAAAC;AAAA,IACA,SAAAJ;AAAA,IACA,cAAcD,EAAsBJ,GAAOK,CAAO;AAAA,IAClD,aAAaC,EAAqBN,GAAOK,CAAO;AAAA,EAAA;AAEpD;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Mcp as p } from "@reforma/icons/14";
|
|
2
2
|
import { humanizeString as u } from "@reforma/lib";
|
|
3
|
-
import { isToolUIPart as s, getToolName as f } from "
|
|
3
|
+
import { isToolUIPart as s, getToolName as f } from "@reforma/types";
|
|
4
4
|
import { DefaultTool as T } from "../default/Default.js";
|
|
5
5
|
import { parsePrefixedMcpToolName as d, parseCallDynamicToolInput as C } from "./parseCallDynamicToolInput.js";
|
|
6
6
|
import { jsx as i } from "react/jsx-runtime";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CallDynamicTool.js","sources":["../../../../src/chat/Tool/mcp-tools/CallDynamicTool.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { humanizeString } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"CallDynamicTool.js","sources":["../../../../src/chat/Tool/mcp-tools/CallDynamicTool.tsx"],"sourcesContent":["import { Mcp } from '@reforma/icons/14';\nimport { humanizeString } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { DefaultTool } from '../default/Default';\nimport { parseCallDynamicToolInput, parsePrefixedMcpToolName } from './parseCallDynamicToolInput';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction titleWords(raw: string): string {\n return humanizeString(raw)\n .split(' ')\n .filter(Boolean)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/** @internal */\nexport function callDynamicToolTitle(toolName: string, namespace?: string): string {\n const tool = titleWords(toolName);\n\n if (!namespace) {\n return `Run ${ tool }`;\n }\n\n const ns = titleWords(namespace);\n const label = tool.split(' ')[0]?.toLowerCase() === ns.toLowerCase() ? tool : `${ ns } ${ tool }`;\n\n return `Run ${ label }`;\n}\n\n/** CallDynamicTool: render like a native tool — MCP icon, proxied tool name, and inner MCP args only. */\nexport function CallDynamicTool({ part, onToolApprovalResponse }: ToolRendererProps) {\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const name = getToolName(part);\n const prefixed = name === 'CallDynamicTool' ? null : parsePrefixedMcpToolName(name);\n const parsed = name === 'CallDynamicTool'\n ? parseCallDynamicToolInput(part.input)\n : prefixed\n ? { toolName: prefixed.tool, namespace: prefixed.namespace, mcpInput: part.input }\n : undefined;\n\n if (!parsed) {\n return null;\n }\n\n const { toolName, namespace, mcpInput } = parsed;\n\n return (\n <DefaultTool\n part={ part }\n titleOverride={ callDynamicToolTitle(toolName, namespace) }\n inputOverride={ mcpInput }\n leadingIcon={ <Mcp aria-hidden /> }\n onToolApprovalResponse={ onToolApprovalResponse }\n />\n );\n}\n"],"names":["titleWords","raw","humanizeString","word","callDynamicToolTitle","toolName","namespace","tool","ns","CallDynamicTool","part","onToolApprovalResponse","isToolUIPart","name","getToolName","prefixed","parsePrefixedMcpToolName","parsed","parseCallDynamicToolInput","mcpInput","DefaultTool","Mcp"],"mappings":";;;;;;AAMA,SAASA,EAAWC,GAAK;AACvB,SAAOC,EAAeD,CAAG,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,CAAAE,MAAQA,EAAK,OAAO,CAAC,EAAE,gBAAgBA,EAAK,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AAC1H;AAGO,SAASC,EAAqBC,GAAUC,GAAW;AACxD,QAAMC,IAAOP,EAAWK,CAAQ;AAChC,MAAI,CAACC;AACH,WAAO,OAAOC,CAAI;AAEpB,QAAMC,IAAKR,EAAWM,CAAS;AAE/B,SAAO,OADOC,EAAK,MAAM,GAAG,EAAE,CAAC,GAAG,YAAA,MAAkBC,EAAG,gBAAgBD,IAAO,GAAGC,CAAE,IAAID,CAAI,EACxE;AACrB;AAGO,SAASE,EAAgB;AAAA,EAC9B,MAAAC;AAAA,EACA,wBAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaF,CAAI;AACpB,WAAO;AAET,QAAMG,IAAOC,EAAYJ,CAAI,GACvBK,IAAWF,MAAS,oBAAoB,OAAOG,EAAyBH,CAAI,GAC5EI,IAASJ,MAAS,oBAAoBK,EAA0BR,EAAK,KAAK,IAAIK,IAAW;AAAA,IAC7F,UAAUA,EAAS;AAAA,IACnB,WAAWA,EAAS;AAAA,IACpB,UAAUL,EAAK;AAAA,EAAA,IACb;AACJ,MAAI,CAACO;AACH,WAAO;AAET,QAAM;AAAA,IACJ,UAAAZ;AAAA,IACA,WAAAC;AAAA,IACA,UAAAa;AAAA,EAAA,IACEF;AACJ,2BAAyBG,GAAa;AAAA,IACpC,MAAAV;AAAA,IACA,eAAeN,EAAqBC,GAAUC,CAAS;AAAA,IACvD,eAAea;AAAA,IACf,+BAA+BE,GAAK;AAAA,MAClC,eAAe;AAAA,IAAA,CAChB;AAAA,IACD,wBAAAV;AAAA,EAAA,CACD;AACH;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Mcp as n } from "@reforma/icons/14";
|
|
2
|
-
import { isToolUIPart as r, getToolName as s } from "
|
|
2
|
+
import { isToolUIPart as r, getToolName as s } from "@reforma/types";
|
|
3
3
|
import { getToolFailureRowState as a } from "../helpers.js";
|
|
4
4
|
import { ToolShell as m, ToolShellHeader as c } from "../shell/ToolShell.js";
|
|
5
5
|
import { jsx as e } from "react/jsx-runtime";
|