@reforma/components 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 +1 -1
- package/dist/chat/Tool/bash/BashTool.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":"GlobTool.js","sources":["../../../../src/chat/Tool/glob/GlobTool.tsx"],"sourcesContent":["import { Search } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"GlobTool.js","sources":["../../../../src/chat/Tool/glob/GlobTool.tsx"],"sourcesContent":["import { Search } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolPathListPopover,\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\n\nimport type { ToolRendererProps } from '../types';\n\nfunction globPatternsFromInput(input: unknown): string[] {\n if (input == null || typeof input !== 'object') {\n return [];\n }\n\n const pattern = (input as { pattern?: unknown }).pattern;\n\n if (!Array.isArray(pattern)) {\n return [];\n }\n\n return pattern.filter((p): p is string => typeof p === 'string' && p.length > 0);\n}\n\nfunction globResultsFromOutput(output: unknown): string[] {\n if (output == null || typeof output !== 'object') {\n return [];\n }\n\n const raw = (output as { results?: unknown }).results;\n\n if (!Array.isArray(raw)) {\n return [];\n }\n\n return raw.filter((p): p is string => typeof p === 'string');\n}\n\n/** Glob: pattern in the header. Click the row to list files that were found. */\nexport function GlobTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Glob') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const patterns = globPatternsFromInput(part.input);\n const done = state === 'output-available';\n const paths = done && !failure.useFailureLabel\n ? [ ...new Set(globResultsFromOutput(part.output)) ]\n : [];\n const title = done && !failure.useFailureLabel\n ? `Found ${ plural(paths.length, 'file', 'files') }`\n : 'Found files';\n const header = (\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress=\"Finding files\"\n icon={ <Search aria-hidden /> }\n disclosure={ paths.length > 0 }\n >\n <Show when={ patterns.length > 0 }>\n <ToolSummaryBadges labels={ patterns } aria-label=\"Pattern\" />\n </Show>\n </ToolShellHeader>\n );\n\n return (\n <ToolShell data-slot=\"glob-tool\">\n <Show\n when={ paths.length > 0 }\n fallback={ header }\n >\n <ToolPathListPopover\n trigger={ header }\n paths={ paths }\n />\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["globPatternsFromInput","input","pattern","p","globResultsFromOutput","output","raw","GlobTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","patterns","done","paths","title","plural","header","ToolShellHeader","Search","Show","ToolSummaryBadges","ToolShell","_jsx","ToolPathListPopover","ToolShellFooter","Text"],"mappings":";;;;;;;;;;AAQA,SAASA,EAAsBC,GAAO;AACpC,MAAIA,KAAS,QAAQ,OAAOA,KAAU;AACpC,WAAO,CAAA;AAET,QAAMC,IAAUD,EAAM;AACtB,SAAK,MAAM,QAAQC,CAAO,IAGnBA,EAAQ,OAAO,CAAAC,MAAK,OAAOA,KAAM,YAAYA,EAAE,SAAS,CAAC,IAFvD,CAAA;AAGX;AACA,SAASC,EAAsBC,GAAQ;AACrC,MAAIA,KAAU,QAAQ,OAAOA,KAAW;AACtC,WAAO,CAAA;AAET,QAAMC,IAAMD,EAAO;AACnB,SAAK,MAAM,QAAQC,CAAG,IAGfA,EAAI,OAAO,CAAAH,MAAK,OAAOA,KAAM,QAAQ,IAFnC,CAAA;AAGX;AAGO,SAASI,EAAS;AAAA,EACvB,MAAAC;AACF,GAAG;AACD,MAAI,CAACC,EAAaD,CAAI,KAAKE,EAAYF,CAAI,MAAM;AAC/C,WAAO;AAET,QAAMG,IAAQH,EAAK,OACbI,IAAUC,EAAuBL,CAAI,GACrCM,IAAWd,EAAsBQ,EAAK,KAAK,GAC3CO,IAAOJ,MAAU,oBACjBK,IAAQD,KAAQ,CAACH,EAAQ,kBAAkB,CAAC,GAAG,IAAI,IAAIR,EAAsBI,EAAK,MAAM,CAAC,CAAC,IAAI,CAAA,GAC9FS,IAAQF,KAAQ,CAACH,EAAQ,kBAAkB,SAASM,EAAOF,EAAM,QAAQ,QAAQ,OAAO,CAAC,KAAK,eAC9FG,sBAA2BC,GAAiB;AAAA,IAChD,OAAAT;AAAA,IACA,cAAcC,EAAQ;AAAA,IACtB,OAAAK;AAAA,IACA,iBAAiB;AAAA,IACjB,wBAAwBI,GAAQ;AAAA,MAC9B,eAAe;AAAA,IAAA,CAChB;AAAA,IACD,YAAYL,EAAM,SAAS;AAAA,IAC3B,4BAA4BM,GAAM;AAAA,MAChC,MAAMR,EAAS,SAAS;AAAA,MACxB,4BAA4BS,GAAmB;AAAA,QAC7C,QAAQT;AAAA,QACR,cAAc;AAAA,MAAA,CACf;AAAA,IAAA,CACF;AAAA,EAAA,CACF;AACD,2BAA0BU,GAAW;AAAA,IACnC,aAAa;AAAA,IACb,UAAU,CAAcC,gBAAAA,EAAKH,GAAM;AAAA,MACjC,MAAMN,EAAM,SAAS;AAAA,MACrB,UAAUG;AAAA,MACV,4BAA4BO,GAAqB;AAAA,QAC/C,SAASP;AAAA,QACT,OAAAH;AAAA,MAAA,CACD;AAAA,IAAA,CACF,GAAgBS,gBAAAA,EAAKH,GAAM;AAAA,MAC1B,MAAMV,EAAQ;AAAA,MACd,4BAA4Be,GAAiB;AAAA,QAC3C,4BAA4BC,GAAM;AAAA,UAChC,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAUhB,EAAQ;AAAA,QAAA,CACnB;AAAA,MAAA,CACF;AAAA,IAAA,CACF,CAAC;AAAA,EAAA,CACH;AACH;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Search as d } from "@reforma/icons/14";
|
|
2
2
|
import { plural as m } from "@reforma/lib";
|
|
3
|
-
import { isToolUIPart as g, getToolName as y } from "
|
|
3
|
+
import { isToolUIPart as g, getToolName as y } from "@reforma/types";
|
|
4
4
|
import { Show as l } from "../../../Show/Show.js";
|
|
5
5
|
import { Text as b } from "../../../Text/Text.js";
|
|
6
6
|
import { getToolFailureRowState as x } from "../helpers.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GrepTool.js","sources":["../../../../src/chat/Tool/grep/GrepTool.tsx"],"sourcesContent":["import { Search } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '
|
|
1
|
+
{"version":3,"file":"GrepTool.js","sources":["../../../../src/chat/Tool/grep/GrepTool.tsx"],"sourcesContent":["import { Search } from '@reforma/icons/14';\nimport { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { getToolFailureRowState } from '../helpers';\nimport {\n ToolPathListPopover,\n ToolShell,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport styles from './GrepTool.module.css';\n\nimport type { GrepToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\ntype GrepHit = {\n path: string;\n line?: number;\n text?: string;\n};\n\nfunction grepPatternFromInput(input: unknown): string {\n if (input == null || typeof input !== 'object') {\n return '';\n }\n\n const pattern = (input as { pattern?: unknown }).pattern;\n\n return typeof pattern === 'string' ? pattern : '';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction parseContentLine(raw: string): { line?: number; text: string } {\n const match = /^(\\d+):(.*)$/.exec(raw);\n\n if (!match?.[1]) {\n return { text: raw };\n }\n\n const line = Number.parseInt(match[1], 10);\n\n if (!Number.isFinite(line) || line <= 0) {\n return { text: raw };\n }\n\n return { line, text: match[2] };\n}\n\nfunction fileHits(files: unknown): GrepHit[] {\n if (!Array.isArray(files) || !files.every((file): file is string => typeof file === 'string')) {\n return [];\n }\n\n return [...files].sort().map(path => ({ path }));\n}\n\nfunction contentHits(results: unknown): GrepHit[] {\n if (!isRecord(results)) {\n return [];\n }\n\n const hits: GrepHit[] = [];\n\n for (const path of Object.keys(results).sort()) {\n const lines = results[path];\n\n if (!Array.isArray(lines)) {\n continue;\n }\n\n for (const line of lines) {\n if (typeof line !== 'string' || line.length === 0) {\n continue;\n }\n\n hits.push({ path, ...parseContentLine(line) });\n }\n }\n\n return hits;\n}\n\nfunction countHits(counts: unknown): GrepHit[] {\n if (!isRecord(counts)) {\n return [];\n }\n\n const hits: GrepHit[] = [];\n\n for (const path of Object.keys(counts).sort()) {\n const count = counts[path];\n\n if (typeof count !== 'number' || count <= 0) {\n continue;\n }\n\n hits.push({\n path,\n text: plural(count, 'match', 'matches'),\n });\n }\n\n return hits;\n}\n\nfunction grepHits(output: unknown): GrepHit[] {\n if (!isRecord(output)) {\n return [];\n }\n\n const raw = output as GrepToolOutput;\n\n if (raw.output_mode === 'files_with_matches') {\n return fileHits(raw.files);\n }\n\n if (raw.output_mode === 'count') {\n return countHits(raw.counts);\n }\n\n if (raw.output_mode === 'content') {\n return contentHits(raw.results);\n }\n\n const files = fileHits(raw.files);\n\n if (files.length > 0) {\n return files;\n }\n\n const content = contentHits(raw.results);\n\n if (content.length > 0) {\n return content;\n }\n\n return countHits(raw.counts);\n}\n\nfunction grepFilePaths(output: unknown): string[] {\n return [ ...new Set(grepHits(output).map(hit => hit.path)) ];\n}\n\n/** Grep: pattern in the header. Click the row to list files that matched. */\nexport function GrepTool({ part }: ToolRendererProps) {\n if (!isToolUIPart(part) || getToolName(part) !== 'Grep') {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const pattern = grepPatternFromInput(part.input);\n const done = state === 'output-available';\n const paths = done && !failure.useFailureLabel ? grepFilePaths(part.output) : [];\n const title = done && !failure.useFailureLabel\n ? `Found in ${ plural(paths.length, 'file', 'files') }`\n : 'Searched';\n const header = (\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ title }\n titleInProgress=\"Grepping\"\n icon={ <Search aria-hidden /> }\n disclosure={ paths.length > 0 }\n >\n <Show when={ pattern }>\n <ToolSummaryBadges\n className={ styles.pattern }\n labels={ [pattern] }\n aria-label=\"Pattern\"\n />\n </Show>\n </ToolShellHeader>\n );\n\n return (\n <ToolShell data-slot=\"grep-tool\">\n <Show\n when={ paths.length > 0 }\n fallback={ header }\n >\n <ToolPathListPopover\n trigger={ header }\n paths={ paths }\n />\n </Show>\n\n <Show when={ failure.problemText }>\n <ToolShellFooter>\n <Text color=\"danger\" variant=\"xs\">{failure.problemText}</Text>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["grepPatternFromInput","input","pattern","isRecord","value","parseContentLine","raw","match","line","fileHits","files","file","path","contentHits","results","hits","lines","countHits","counts","count","plural","grepHits","output","content","grepFilePaths","hit","GrepTool","part","isToolUIPart","getToolName","state","failure","getToolFailureRowState","done","paths","title","header","ToolShellHeader","Search","Show","ToolSummaryBadges","styles","ToolShell","_jsx","ToolPathListPopover","ToolShellFooter","Text"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/chat/Tool/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/chat/Tool/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAQ7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAExD,MAAM,MAAM,qBAAqB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,mEAAmE;AACnE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAqC9F;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQ1E;AAED,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,qBAAqB,GAC7B,IAAI,CAGN;AAED,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAkB/E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CA8BvE;AAED,uGAAuG;AACvG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAU3F;AAUD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAQ1G;AAED,sHAAsH;AACtH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,CAalF;AAmCD,sGAAsG;AACtG,MAAM,MAAM,mBAAmB,GAAG;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,+GAA+G;IAC/G,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,mGAAmG;IACnG,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,GAAG,mBAAmB,CA0BhG;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO/D;AAED,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,gCAAgC,CAAC;AAEtE;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,UAAO,GAAG,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,OAAO,EACpB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GACrC,OAAO,CAUT;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC,CAAC;AAExG,iFAAiF;AACjF,wBAAgB,mCAAmC,CAC/C,IAAI,EAAE,eAAe,GACtB,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA0CpC;AAED,sDAAsD;AACtD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,eAAe,GAAG,qBAAqB,CAQ1F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getToolName as m } from "
|
|
1
|
+
import { getToolName as m } from "@reforma/types";
|
|
2
2
|
import { editToolLineCounts as v, writeToolLineCounts as y } from "./edit/formatEditDiff.js";
|
|
3
3
|
import { parseEditWriteToolInput as c } from "./edit/parseEditWriteInput.js";
|
|
4
4
|
function l(t) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../src/chat/Tool/helpers.ts"],"sourcesContent":["import { getToolName } from 'ai';\n\nimport { parseCreateDirectoryInput } from './create-directory/parseCreateDirectoryInput';\nimport { editToolLineCounts, writeToolLineCounts } from './edit/formatEditDiff';\nimport { parseEditWriteToolInput } from './edit/parseEditWriteInput';\nimport { parseRemoveFileInput } from './remove-file/parseRemoveFileInput';\n\nimport type { EditToolOutput, WriteToolOutput } from '@reforma/types/sandbox';\nimport type { DynamicToolUIPart, ToolUIPart } from 'ai';\n\nexport type EditingLineCountDelta = { added: number; removed: number };\n\n/** Stable key for matching tool paths (trim, forward slashes, strip a leading `./`). */\nexport function toolPathKey(path: string): string {\n const t = path.trim().replace(/\\\\/g, '/');\n\n if (!t || t === '.') {\n return t;\n }\n\n return t.startsWith('./') ? t.slice(2) : t;\n}\n\n/** Per-file removed line counts from RemoveFile `results` rows. */\nexport function removeFileLineCountsByPath(output: unknown): Map<string, EditingLineCountDelta> {\n const map = new Map<string, EditingLineCountDelta>();\n\n if (output == null || typeof output !== 'object') {\n return map;\n }\n\n const results = (output as { results?: unknown }).results;\n\n if (!Array.isArray(results)) {\n return map;\n }\n\n for (const entry of results) {\n if (entry == null || typeof entry !== 'object') {\n continue;\n }\n\n const row = entry as { path?: unknown; removed?: unknown; lines?: unknown };\n\n if (row.removed !== true || typeof row.lines !== 'number') {\n continue;\n }\n\n const pathRaw = typeof row.path === 'string' ? row.path : '';\n const key = toolPathKey(pathRaw);\n\n if (!key) {\n continue;\n }\n\n const prev = map.get(key) ?? { added: 0, removed: 0 };\n\n map.set(key, { added: prev.added, removed: prev.removed + row.lines });\n }\n\n return map;\n}\n\n/** Total lines removed across RemoveFile `results` rows. */\nexport function removeFileLinesRemoved(output: unknown): number | undefined {\n let total = 0;\n\n for (const delta of removeFileLineCountsByPath(output).values()) {\n total += delta.removed;\n }\n\n return total > 0 ? total : undefined;\n}\n\nexport function mergeLineCountDelta(\n target: EditingLineCountDelta,\n delta: EditingLineCountDelta\n): void {\n target.added += delta.added;\n target.removed += delta.removed;\n}\n\n/** Paths for edit-file dedupe (Edit, Write, RemoveFile, CreateDirectory) */\nexport function pathsFromEditingTool(toolName: string, input: unknown): string[] {\n if (toolName === 'Edit' || toolName === 'Write') {\n const { path } = parseEditWriteToolInput(input);\n\n return path ? [path] : [];\n }\n\n if (toolName === 'RemoveFile') {\n return parseRemoveFileInput(input).filePaths;\n }\n\n if (toolName === 'CreateDirectory') {\n const { path } = parseCreateDirectoryInput(input);\n\n return path ? [path] : [];\n }\n\n return [];\n}\n\nexport function normalizeErrorString(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n const t = value.trim();\n\n return t !== '' ? t : undefined;\n }\n\n if (value instanceof Error) {\n const t = value.message.trim();\n\n return t !== '' ? t : undefined;\n }\n\n if (typeof value === 'object') {\n const o = value as Record<string, unknown>;\n\n if (typeof o.message === 'string') {\n const t = o.message.trim();\n\n if (t !== '') {\n return t;\n }\n }\n }\n\n return undefined;\n}\n\n/** User-visible error/denial line for compact tool summaries (`ReadFilesTool`, sandbox info tools). */\nexport function getToolProblemText(part: ToolUIPart | DynamicToolUIPart): string | undefined {\n if (part.state === 'output-error') {\n return normalizeErrorString(part.errorText);\n }\n\n if (part.state === 'output-denied') {\n return part.approval?.reason?.trim() || 'You declined this action';\n }\n\n return undefined;\n}\n\nconst CALL_TOOL_CONTENT_TYPES = new Set([\n 'text',\n 'image',\n 'audio',\n 'resource',\n 'resource_link',\n]);\n\nexport function isCallToolContentBlock(value: unknown): value is Record<string, unknown> & { type: string } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const type = (value as { type?: unknown }).type;\n\n return typeof type === 'string' && CALL_TOOL_CONTENT_TYPES.has(type);\n}\n\n/** MCP `CallToolResult.content` / `parts` — `undefined` if this is not an envelope. Empty array is a valid result. */\nexport function callToolResultContentBlocks(output: unknown): unknown[] | undefined {\n if (output == null || typeof output !== 'object' || Array.isArray(output)) {\n return undefined;\n }\n\n const { parts, content } = output as { parts?: unknown; content?: unknown };\n const blocks = parts ?? content;\n\n if (!Array.isArray(blocks) || !blocks.every(isCallToolContentBlock)) {\n return undefined;\n }\n\n return blocks;\n}\n\n/** MCP `CallToolResult.isError` — tool ran, application failure inside `output`. */\nfunction isCallToolResultError(output: unknown): boolean {\n return callToolResultContentBlocks(output) !== undefined\n && (output as { isError?: unknown }).isError === true;\n}\n\n/** User-facing text from MCP `content[]` / `parts[]` when `isError` is set. */\nfunction callToolResultErrorText(output: unknown): string | undefined {\n const blocks = callToolResultContentBlocks(output);\n\n if (blocks == null) {\n return undefined;\n }\n\n const texts: string[] = [];\n\n for (const item of blocks) {\n const part = item as { type?: unknown; text?: unknown };\n\n if (part.type !== 'text' || typeof part.text !== 'string') {\n continue;\n }\n\n const t = part.text.trim();\n\n if (t !== '') {\n texts.push(t);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n') : undefined;\n}\n\n/** Error/denial row for compact tools: header status icon + tooltip instead of inline danger text. */\nexport type ToolFailureRowState = {\n useFailureLabel: boolean;\n /** Detail for {@link ToolShellHeader} / {@link ToolShellCardHeader} `statusDetail`; error or denial reason. */\n tooltip: string | undefined;\n /** Pass to `ToolShellFooter` — suppressed when `useFailureLabel` (tooltip carries the message). */\n problemText: string | undefined;\n};\n\nexport function getToolFailureRowState(part: ToolUIPart | DynamicToolUIPart): ToolFailureRowState {\n const isOutputError = part.state === 'output-error';\n const isEnvelopeError = part.state === 'output-available' && isCallToolResultError(part.output);\n const isOutputDenied = part.state === 'output-denied';\n const isApprovalDenied = part.state === 'approval-responded' && part.approval?.approved === false;\n const useFailureLabel = isOutputError || isEnvelopeError || isOutputDenied || isApprovalDenied;\n\n let tooltip: string | undefined;\n\n if (isOutputError) {\n tooltip = normalizeErrorString(part.errorText);\n }\n else if (isEnvelopeError) {\n tooltip = callToolResultErrorText(part.output) ?? 'This action failed';\n }\n else if (isOutputDenied || isApprovalDenied) {\n tooltip = part.approval?.reason?.trim() || 'You declined this action';\n }\n\n const problemText = useFailureLabel ? undefined : getToolProblemText(part);\n\n return {\n useFailureLabel,\n tooltip,\n problemText,\n };\n}\n\n/**\n * Terminal AI SDK tool states — invocation finished (success, error, or denial).\n */\nexport function isToolInvocationTerminal(state: string): boolean {\n return (\n state === 'approval-responded'\n || state === 'output-available'\n || state === 'output-error'\n || state === 'output-denied'\n );\n}\n\n/** Default copy when a tool is left non-terminal after the stream ends. */\nexport const TOOL_INTERRUPTED_MESSAGE = 'Tool call was not completed';\n\n/**\n * Tool still running for UI (shimmer / spinner).\n * Non-terminal AI SDK state, and optionally gated on an active stream\n * (`isStreaming` defaults to true so call sites without turn context keep prior behavior).\n */\nexport function isToolInvocationInProgress(state: string, isStreaming = true): boolean {\n return isStreaming && !isToolInvocationTerminal(state);\n}\n\n/**\n * Non-terminal after the run ended — will never finish.\n * Excludes approval wait; pass `awaitingUser` for client tools like AskUserQuestion.\n */\nexport function isToolInvocationStalled(\n state: string,\n isStreaming: boolean,\n options?: { awaitingUser?: boolean }\n): boolean {\n if (options?.awaitingUser || isStreaming || isToolInvocationTerminal(state)) {\n return false;\n }\n\n if (state === 'approval-requested') {\n return false;\n }\n\n return true;\n}\n\nexport type EditingToolPart = Extract<Parameters<typeof getToolName>[0], { state: 'output-available' }>;\n\n/** Map path key → +/− lines for one completed Edit / Write / RemoveFile part. */\nexport function lineCountsByPathFromEditingToolPart(\n part: EditingToolPart\n): Map<string, EditingLineCountDelta> {\n const empty = new Map<string, EditingLineCountDelta>();\n\n const toolName = getToolName(part);\n\n if (toolName === 'Edit') {\n const output = part.output as EditToolOutput;\n\n if (!Array.isArray(output?.hunks)) {\n return empty;\n }\n\n const { path } = parseEditWriteToolInput(part.input);\n const key = toolPathKey(path);\n\n if (!key) {\n return empty;\n }\n\n const counts = editToolLineCounts(output);\n\n return new Map([[key, { added: counts.added, removed: counts.removed }]]);\n }\n\n if (toolName === 'Write') {\n const { path } = parseEditWriteToolInput(part.input);\n const key = toolPathKey(path);\n\n if (!key) {\n return empty;\n }\n\n const counts = writeToolLineCounts(part.output as WriteToolOutput);\n\n return new Map([[key, { added: counts.added, removed: counts.removed ?? 0 }]]);\n }\n\n if (toolName === 'RemoveFile') {\n return removeFileLineCountsByPath(part.output);\n }\n\n return empty;\n}\n\n/** Aggregate +/− lines for Edit, Write, RemoveFile */\nexport function lineCountsFromEditingToolPart(part: EditingToolPart): EditingLineCountDelta {\n const total: EditingLineCountDelta = { added: 0, removed: 0 };\n\n for (const delta of lineCountsByPathFromEditingToolPart(part).values()) {\n mergeLineCountDelta(total, delta);\n }\n\n return total;\n}\n"],"names":["toolPathKey","path","t","removeFileLineCountsByPath","output","map","results","entry","row","pathRaw","key","prev","removeFileLinesRemoved","total","delta","mergeLineCountDelta","target","normalizeErrorString","value","o","getToolProblemText","part","CALL_TOOL_CONTENT_TYPES","isCallToolContentBlock","type","callToolResultContentBlocks","parts","content","blocks","isCallToolResultError","callToolResultErrorText","texts","item","getToolFailureRowState","isOutputError","isEnvelopeError","isOutputDenied","isApprovalDenied","useFailureLabel","tooltip","problemText","isToolInvocationTerminal","state","TOOL_INTERRUPTED_MESSAGE","isToolInvocationInProgress","isStreaming","isToolInvocationStalled","options","lineCountsByPathFromEditingToolPart","empty","toolName","getToolName","parseEditWriteToolInput","counts","editToolLineCounts","writeToolLineCounts","lineCountsFromEditingToolPart"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../src/chat/Tool/helpers.ts"],"sourcesContent":["import { getToolName } from '@reforma/types';\n\nimport { parseCreateDirectoryInput } from './create-directory/parseCreateDirectoryInput';\nimport { editToolLineCounts, writeToolLineCounts } from './edit/formatEditDiff';\nimport { parseEditWriteToolInput } from './edit/parseEditWriteInput';\nimport { parseRemoveFileInput } from './remove-file/parseRemoveFileInput';\n\nimport type { EditToolOutput, WriteToolOutput } from '@reforma/types/sandbox';\nimport type { DynamicToolUIPart, ToolUIPart } from 'ai';\n\nexport type EditingLineCountDelta = { added: number; removed: number };\n\n/** Stable key for matching tool paths (trim, forward slashes, strip a leading `./`). */\nexport function toolPathKey(path: string): string {\n const t = path.trim().replace(/\\\\/g, '/');\n\n if (!t || t === '.') {\n return t;\n }\n\n return t.startsWith('./') ? t.slice(2) : t;\n}\n\n/** Per-file removed line counts from RemoveFile `results` rows. */\nexport function removeFileLineCountsByPath(output: unknown): Map<string, EditingLineCountDelta> {\n const map = new Map<string, EditingLineCountDelta>();\n\n if (output == null || typeof output !== 'object') {\n return map;\n }\n\n const results = (output as { results?: unknown }).results;\n\n if (!Array.isArray(results)) {\n return map;\n }\n\n for (const entry of results) {\n if (entry == null || typeof entry !== 'object') {\n continue;\n }\n\n const row = entry as { path?: unknown; removed?: unknown; lines?: unknown };\n\n if (row.removed !== true || typeof row.lines !== 'number') {\n continue;\n }\n\n const pathRaw = typeof row.path === 'string' ? row.path : '';\n const key = toolPathKey(pathRaw);\n\n if (!key) {\n continue;\n }\n\n const prev = map.get(key) ?? { added: 0, removed: 0 };\n\n map.set(key, { added: prev.added, removed: prev.removed + row.lines });\n }\n\n return map;\n}\n\n/** Total lines removed across RemoveFile `results` rows. */\nexport function removeFileLinesRemoved(output: unknown): number | undefined {\n let total = 0;\n\n for (const delta of removeFileLineCountsByPath(output).values()) {\n total += delta.removed;\n }\n\n return total > 0 ? total : undefined;\n}\n\nexport function mergeLineCountDelta(\n target: EditingLineCountDelta,\n delta: EditingLineCountDelta\n): void {\n target.added += delta.added;\n target.removed += delta.removed;\n}\n\n/** Paths for edit-file dedupe (Edit, Write, RemoveFile, CreateDirectory) */\nexport function pathsFromEditingTool(toolName: string, input: unknown): string[] {\n if (toolName === 'Edit' || toolName === 'Write') {\n const { path } = parseEditWriteToolInput(input);\n\n return path ? [path] : [];\n }\n\n if (toolName === 'RemoveFile') {\n return parseRemoveFileInput(input).filePaths;\n }\n\n if (toolName === 'CreateDirectory') {\n const { path } = parseCreateDirectoryInput(input);\n\n return path ? [path] : [];\n }\n\n return [];\n}\n\nexport function normalizeErrorString(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n const t = value.trim();\n\n return t !== '' ? t : undefined;\n }\n\n if (value instanceof Error) {\n const t = value.message.trim();\n\n return t !== '' ? t : undefined;\n }\n\n if (typeof value === 'object') {\n const o = value as Record<string, unknown>;\n\n if (typeof o.message === 'string') {\n const t = o.message.trim();\n\n if (t !== '') {\n return t;\n }\n }\n }\n\n return undefined;\n}\n\n/** User-visible error/denial line for compact tool summaries (`ReadFilesTool`, sandbox info tools). */\nexport function getToolProblemText(part: ToolUIPart | DynamicToolUIPart): string | undefined {\n if (part.state === 'output-error') {\n return normalizeErrorString(part.errorText);\n }\n\n if (part.state === 'output-denied') {\n return part.approval?.reason?.trim() || 'You declined this action';\n }\n\n return undefined;\n}\n\nconst CALL_TOOL_CONTENT_TYPES = new Set([\n 'text',\n 'image',\n 'audio',\n 'resource',\n 'resource_link',\n]);\n\nexport function isCallToolContentBlock(value: unknown): value is Record<string, unknown> & { type: string } {\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return false;\n }\n\n const type = (value as { type?: unknown }).type;\n\n return typeof type === 'string' && CALL_TOOL_CONTENT_TYPES.has(type);\n}\n\n/** MCP `CallToolResult.content` / `parts` — `undefined` if this is not an envelope. Empty array is a valid result. */\nexport function callToolResultContentBlocks(output: unknown): unknown[] | undefined {\n if (output == null || typeof output !== 'object' || Array.isArray(output)) {\n return undefined;\n }\n\n const { parts, content } = output as { parts?: unknown; content?: unknown };\n const blocks = parts ?? content;\n\n if (!Array.isArray(blocks) || !blocks.every(isCallToolContentBlock)) {\n return undefined;\n }\n\n return blocks;\n}\n\n/** MCP `CallToolResult.isError` — tool ran, application failure inside `output`. */\nfunction isCallToolResultError(output: unknown): boolean {\n return callToolResultContentBlocks(output) !== undefined\n && (output as { isError?: unknown }).isError === true;\n}\n\n/** User-facing text from MCP `content[]` / `parts[]` when `isError` is set. */\nfunction callToolResultErrorText(output: unknown): string | undefined {\n const blocks = callToolResultContentBlocks(output);\n\n if (blocks == null) {\n return undefined;\n }\n\n const texts: string[] = [];\n\n for (const item of blocks) {\n const part = item as { type?: unknown; text?: unknown };\n\n if (part.type !== 'text' || typeof part.text !== 'string') {\n continue;\n }\n\n const t = part.text.trim();\n\n if (t !== '') {\n texts.push(t);\n }\n }\n\n return texts.length > 0 ? texts.join('\\n') : undefined;\n}\n\n/** Error/denial row for compact tools: header status icon + tooltip instead of inline danger text. */\nexport type ToolFailureRowState = {\n useFailureLabel: boolean;\n /** Detail for {@link ToolShellHeader} / {@link ToolShellCardHeader} `statusDetail`; error or denial reason. */\n tooltip: string | undefined;\n /** Pass to `ToolShellFooter` — suppressed when `useFailureLabel` (tooltip carries the message). */\n problemText: string | undefined;\n};\n\nexport function getToolFailureRowState(part: ToolUIPart | DynamicToolUIPart): ToolFailureRowState {\n const isOutputError = part.state === 'output-error';\n const isEnvelopeError = part.state === 'output-available' && isCallToolResultError(part.output);\n const isOutputDenied = part.state === 'output-denied';\n const isApprovalDenied = part.state === 'approval-responded' && part.approval?.approved === false;\n const useFailureLabel = isOutputError || isEnvelopeError || isOutputDenied || isApprovalDenied;\n\n let tooltip: string | undefined;\n\n if (isOutputError) {\n tooltip = normalizeErrorString(part.errorText);\n }\n else if (isEnvelopeError) {\n tooltip = callToolResultErrorText(part.output) ?? 'This action failed';\n }\n else if (isOutputDenied || isApprovalDenied) {\n tooltip = part.approval?.reason?.trim() || 'You declined this action';\n }\n\n const problemText = useFailureLabel ? undefined : getToolProblemText(part);\n\n return {\n useFailureLabel,\n tooltip,\n problemText,\n };\n}\n\n/**\n * Terminal AI SDK tool states — invocation finished (success, error, or denial).\n */\nexport function isToolInvocationTerminal(state: string): boolean {\n return (\n state === 'approval-responded'\n || state === 'output-available'\n || state === 'output-error'\n || state === 'output-denied'\n );\n}\n\n/** Default copy when a tool is left non-terminal after the stream ends. */\nexport const TOOL_INTERRUPTED_MESSAGE = 'Tool call was not completed';\n\n/**\n * Tool still running for UI (shimmer / spinner).\n * Non-terminal AI SDK state, and optionally gated on an active stream\n * (`isStreaming` defaults to true so call sites without turn context keep prior behavior).\n */\nexport function isToolInvocationInProgress(state: string, isStreaming = true): boolean {\n return isStreaming && !isToolInvocationTerminal(state);\n}\n\n/**\n * Non-terminal after the run ended — will never finish.\n * Excludes approval wait; pass `awaitingUser` for client tools like AskUserQuestion.\n */\nexport function isToolInvocationStalled(\n state: string,\n isStreaming: boolean,\n options?: { awaitingUser?: boolean }\n): boolean {\n if (options?.awaitingUser || isStreaming || isToolInvocationTerminal(state)) {\n return false;\n }\n\n if (state === 'approval-requested') {\n return false;\n }\n\n return true;\n}\n\nexport type EditingToolPart = Extract<Parameters<typeof getToolName>[0], { state: 'output-available' }>;\n\n/** Map path key → +/− lines for one completed Edit / Write / RemoveFile part. */\nexport function lineCountsByPathFromEditingToolPart(\n part: EditingToolPart\n): Map<string, EditingLineCountDelta> {\n const empty = new Map<string, EditingLineCountDelta>();\n\n const toolName = getToolName(part);\n\n if (toolName === 'Edit') {\n const output = part.output as EditToolOutput;\n\n if (!Array.isArray(output?.hunks)) {\n return empty;\n }\n\n const { path } = parseEditWriteToolInput(part.input);\n const key = toolPathKey(path);\n\n if (!key) {\n return empty;\n }\n\n const counts = editToolLineCounts(output);\n\n return new Map([[key, { added: counts.added, removed: counts.removed }]]);\n }\n\n if (toolName === 'Write') {\n const { path } = parseEditWriteToolInput(part.input);\n const key = toolPathKey(path);\n\n if (!key) {\n return empty;\n }\n\n const counts = writeToolLineCounts(part.output as WriteToolOutput);\n\n return new Map([[key, { added: counts.added, removed: counts.removed ?? 0 }]]);\n }\n\n if (toolName === 'RemoveFile') {\n return removeFileLineCountsByPath(part.output);\n }\n\n return empty;\n}\n\n/** Aggregate +/− lines for Edit, Write, RemoveFile */\nexport function lineCountsFromEditingToolPart(part: EditingToolPart): EditingLineCountDelta {\n const total: EditingLineCountDelta = { added: 0, removed: 0 };\n\n for (const delta of lineCountsByPathFromEditingToolPart(part).values()) {\n mergeLineCountDelta(total, delta);\n }\n\n return total;\n}\n"],"names":["toolPathKey","path","t","removeFileLineCountsByPath","output","map","results","entry","row","pathRaw","key","prev","removeFileLinesRemoved","total","delta","mergeLineCountDelta","target","normalizeErrorString","value","o","getToolProblemText","part","CALL_TOOL_CONTENT_TYPES","isCallToolContentBlock","type","callToolResultContentBlocks","parts","content","blocks","isCallToolResultError","callToolResultErrorText","texts","item","getToolFailureRowState","isOutputError","isEnvelopeError","isOutputDenied","isApprovalDenied","useFailureLabel","tooltip","problemText","isToolInvocationTerminal","state","TOOL_INTERRUPTED_MESSAGE","isToolInvocationInProgress","isStreaming","isToolInvocationStalled","options","lineCountsByPathFromEditingToolPart","empty","toolName","getToolName","parseEditWriteToolInput","counts","editToolLineCounts","writeToolLineCounts","lineCountsFromEditingToolPart"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AttentionTriangle as x } from "@reforma/icons/14";
|
|
2
2
|
import { ProgressLoader as E } from "@reforma/icons/assets";
|
|
3
|
-
import { getToolName as G } from "
|
|
3
|
+
import { getToolName as G } from "@reforma/types";
|
|
4
4
|
import { Box as A } from "../../../Box/Box.js";
|
|
5
5
|
import { For as N } from "../../../For/For.js";
|
|
6
6
|
import { Image as _ } from "../../../Image/Image.js";
|
|
@@ -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":"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"}
|
|
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"}
|