@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.
Files changed (119) hide show
  1. package/dist/RichInput/RichInput.d.ts +1 -1
  2. package/dist/RichInput/RichInput.d.ts.map +1 -1
  3. package/dist/RichInput/RichInput.js +126 -123
  4. package/dist/RichInput/RichInput.js.map +1 -1
  5. package/dist/chat/ComposerBanner/ComposerBanner.d.ts +6 -1
  6. package/dist/chat/ComposerBanner/ComposerBanner.d.ts.map +1 -1
  7. package/dist/chat/ComposerBanner/ComposerBanner.js +60 -40
  8. package/dist/chat/ComposerBanner/ComposerBanner.js.map +1 -1
  9. package/dist/chat/ComposerBanner/ComposerBanner.module.css +1 -1
  10. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js +13 -9
  11. package/dist/chat/ComposerBanner/ComposerBanner.module.css.js.map +1 -1
  12. package/dist/chat/Conversation/ConversationPendingLoader.d.ts.map +1 -1
  13. package/dist/chat/Conversation/ConversationPendingLoader.js +1 -1
  14. package/dist/chat/Conversation/ConversationPendingLoader.js.map +1 -1
  15. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts +1 -1
  16. package/dist/chat/Message/normalize/normalizeMessageParts.d.ts.map +1 -1
  17. package/dist/chat/Message/normalize/normalizeMessageParts.js +1 -1
  18. package/dist/chat/Message/normalize/normalizeMessageParts.js.map +1 -1
  19. package/dist/chat/Message/parts/MessagePart.d.ts.map +1 -1
  20. package/dist/chat/Message/parts/MessagePart.js +1 -1
  21. package/dist/chat/Message/parts/MessagePart.js.map +1 -1
  22. package/dist/chat/Message/parts/backgroundResultPart.js +1 -1
  23. package/dist/chat/Message/parts/backgroundResultPart.js.map +1 -1
  24. package/dist/chat/Message/parts/collectMessageSources.d.ts +1 -1
  25. package/dist/chat/Message/parts/collectMessageSources.d.ts.map +1 -1
  26. package/dist/chat/Message/parts/collectMessageSources.js +1 -1
  27. package/dist/chat/Message/parts/collectMessageSources.js.map +1 -1
  28. package/dist/chat/Message/parts/contextCompactionPart.js +1 -1
  29. package/dist/chat/Message/parts/contextCompactionPart.js.map +1 -1
  30. package/dist/chat/Message/segments/analyzeGroupedSegment.js +5 -5
  31. package/dist/chat/Message/segments/analyzeGroupedSegment.js.map +1 -1
  32. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js +1 -1
  33. package/dist/chat/Message/segments/recentStreamingPhaseToolGroups.js.map +1 -1
  34. package/dist/chat/Message/turn/workedCollapse.js +1 -1
  35. package/dist/chat/Message/turn/workedCollapse.js.map +1 -1
  36. package/dist/chat/Tool/Tool.js +1 -1
  37. package/dist/chat/Tool/Tool.js.map +1 -1
  38. package/dist/chat/Tool/agent/AgentTool.d.ts.map +1 -1
  39. package/dist/chat/Tool/agent/AgentTool.js +73 -73
  40. package/dist/chat/Tool/agent/AgentTool.js.map +1 -1
  41. package/dist/chat/Tool/bash/BashTool.d.ts.map +1 -1
  42. package/dist/chat/Tool/bash/BashTool.js +1 -1
  43. package/dist/chat/Tool/bash/BashTool.js.map +1 -1
  44. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js +1 -1
  45. package/dist/chat/Tool/create-directory/CreateDirectoryTool.js.map +1 -1
  46. package/dist/chat/Tool/default/Default.d.ts.map +1 -1
  47. package/dist/chat/Tool/default/Default.js +1 -1
  48. package/dist/chat/Tool/default/Default.js.map +1 -1
  49. package/dist/chat/Tool/dev-server/DevServerRestartTool.js +1 -1
  50. package/dist/chat/Tool/dev-server/DevServerRestartTool.js.map +1 -1
  51. package/dist/chat/Tool/dev-server/DevServerStatusTool.js +1 -1
  52. package/dist/chat/Tool/dev-server/DevServerStatusTool.js.map +1 -1
  53. package/dist/chat/Tool/edit/EditTool.js +1 -1
  54. package/dist/chat/Tool/edit/EditTool.js.map +1 -1
  55. package/dist/chat/Tool/fetch/FetchTool.js +1 -1
  56. package/dist/chat/Tool/fetch/FetchTool.js.map +1 -1
  57. package/dist/chat/Tool/fileChangesFromToolParts.js +1 -1
  58. package/dist/chat/Tool/fileChangesFromToolParts.js.map +1 -1
  59. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js +1 -1
  60. package/dist/chat/Tool/get-background-result/GetBackgroundResultTool.js.map +1 -1
  61. package/dist/chat/Tool/get-errors/GetErrorsTool.js +1 -1
  62. package/dist/chat/Tool/get-errors/GetErrorsTool.js.map +1 -1
  63. package/dist/chat/Tool/glob/GlobTool.js +1 -1
  64. package/dist/chat/Tool/glob/GlobTool.js.map +1 -1
  65. package/dist/chat/Tool/grep/GrepTool.js +1 -1
  66. package/dist/chat/Tool/grep/GrepTool.js.map +1 -1
  67. package/dist/chat/Tool/helpers.d.ts +1 -1
  68. package/dist/chat/Tool/helpers.d.ts.map +1 -1
  69. package/dist/chat/Tool/helpers.js +1 -1
  70. package/dist/chat/Tool/helpers.js.map +1 -1
  71. package/dist/chat/Tool/image-asset/ImageAssetTool.js +1 -1
  72. package/dist/chat/Tool/image-asset/ImageAssetTool.js.map +1 -1
  73. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js +1 -1
  74. package/dist/chat/Tool/install-dependencies/InstallDependenciesTool.js.map +1 -1
  75. package/dist/chat/Tool/install-plugin/InstallPlugin.js +1 -1
  76. package/dist/chat/Tool/install-plugin/InstallPlugin.js.map +1 -1
  77. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts +3 -1
  78. package/dist/chat/Tool/integration-card/IntegrationActionCard.d.ts.map +1 -1
  79. package/dist/chat/Tool/integration-card/IntegrationActionCard.js +88 -82
  80. package/dist/chat/Tool/integration-card/IntegrationActionCard.js.map +1 -1
  81. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js +1 -1
  82. package/dist/chat/Tool/list-directory/normalizeListDirectoryTools.js.map +1 -1
  83. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js +1 -1
  84. package/dist/chat/Tool/mcp-tools/CallDynamicTool.js.map +1 -1
  85. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js +1 -1
  86. package/dist/chat/Tool/mcp-tools/GetDynamicToolsTool.js.map +1 -1
  87. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js +1 -1
  88. package/dist/chat/Tool/mcp-tools/GetMcpResourcesTool.js.map +1 -1
  89. package/dist/chat/Tool/mcp-tools/McpAuth.js +1 -1
  90. package/dist/chat/Tool/mcp-tools/McpAuth.js.map +1 -1
  91. package/dist/chat/Tool/memory/MemoryTool.js +1 -1
  92. package/dist/chat/Tool/memory/MemoryTool.js.map +1 -1
  93. package/dist/chat/Tool/move-file/MoveFileTool.js +1 -1
  94. package/dist/chat/Tool/move-file/MoveFileTool.js.map +1 -1
  95. package/dist/chat/Tool/plan/CreatePlanTool.js +1 -1
  96. package/dist/chat/Tool/plan/CreatePlanTool.js.map +1 -1
  97. package/dist/chat/Tool/preamble/PreambleTool.js +1 -1
  98. package/dist/chat/Tool/preamble/PreambleTool.js.map +1 -1
  99. package/dist/chat/Tool/project-build/BuildTool.js +1 -1
  100. package/dist/chat/Tool/project-build/BuildTool.js.map +1 -1
  101. package/dist/chat/Tool/project-env/ProjectEnvTool.js +1 -1
  102. package/dist/chat/Tool/project-env/ProjectEnvTool.js.map +1 -1
  103. package/dist/chat/Tool/read/normalizeReadTools.js +1 -1
  104. package/dist/chat/Tool/read/normalizeReadTools.js.map +1 -1
  105. package/dist/chat/Tool/read-lints/ReadLintsTool.js +1 -1
  106. package/dist/chat/Tool/read-lints/ReadLintsTool.js.map +1 -1
  107. package/dist/chat/Tool/remove-file/RemoveFileTool.js +1 -1
  108. package/dist/chat/Tool/remove-file/RemoveFileTool.js.map +1 -1
  109. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js +1 -1
  110. package/dist/chat/Tool/scaffold-project/ScaffoldProjectTool.js.map +1 -1
  111. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js +3 -3
  112. package/dist/chat/Tool/screenshot/CaptureScreenshotTool.js.map +1 -1
  113. package/dist/chat/Tool/skill/SkillTool.js +1 -1
  114. package/dist/chat/Tool/skill/SkillTool.js.map +1 -1
  115. package/dist/chat/Tool/waiting/WaitingTool.js +1 -1
  116. package/dist/chat/Tool/waiting/WaitingTool.js.map +1 -1
  117. package/dist/chat/Tool/web-search/WebSearchTool.js +1 -1
  118. package/dist/chat/Tool/web-search/WebSearchTool.js.map +1 -1
  119. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"analyzeGroupedSegment.js","sources":["../../../../src/chat/Message/segments/analyzeGroupedSegment.ts"],"sourcesContent":["import { plural } from '@reforma/lib';\nimport { isScreenshotTool } from '@reforma/types/sandbox';\nimport { getToolName, isToolUIPart } from 'ai';\n\nimport { parseCallDynamicToolInput, parsePrefixedMcpToolName } from '../../Tool/mcp-tools/parseCallDynamicToolInput';\nimport { readPathsFromPart } from '../../Tool/read/normalizeReadTools';\nimport { mcpGroupedSegmentRole } from './groupedSegmentMcpTools';\nimport {\n GROUPED_SEGMENT_EDIT_TOOLS,\n isGroupedSegmentBuildTool,\n isGroupedSegmentCommandTool,\n isGroupedSegmentFilePathTool,\n isGroupedSegmentImageTool,\n isGroupedSegmentInstallTool,\n isGroupedSegmentLintTool,\n isGroupedSegmentRestartTool,\n isGroupedSegmentSearchTool,\n} from './groupedSegmentTools';\n\nimport type { ReadToolUIPart } from '../../Tool/read/normalizeReadTools';\nimport type { MessagePartGroup } from '../normalize/normalizeMessageParts';\n\nexport type GroupedSegmentKind = 'edit' | 'setup' | 'explore' | 'run' | 'other';\n\nexport type LineCounts = {\n added: number;\n removed: number;\n};\n\nexport type PhaseFileStats = {\n editCount: number;\n lineCounts?: LineCounts;\n};\n\nexport type GroupedSegmentActivity = {\n kind: GroupedSegmentKind;\n summary: string;\n label?: string;\n streamLabel?: string;\n};\n\nfunction groupedSegmentKind(\n hasEdits: boolean,\n hasSetup: boolean,\n hasExplore: boolean,\n hasCommands: boolean\n): GroupedSegmentKind {\n if (hasEdits) {\n return 'edit';\n }\n\n if (hasExplore) {\n return 'explore';\n }\n\n if (hasCommands) {\n return 'run';\n }\n\n if (hasSetup) {\n return 'setup';\n }\n\n return 'other';\n}\n\nfunction addToSet(set: Set<string>, paths: readonly string[]) {\n for (const path of paths) {\n if (path) {\n set.add(path);\n }\n }\n}\n\n/** Directory listed by ListDirectory (`path` input; root when omitted). */\nfunction listDirectoryPathsFromPart(part: { input?: unknown }): string[] {\n if (part.input == null || typeof part.input !== 'object') {\n return ['.'];\n }\n\n const path = (part.input as { path?: unknown }).path;\n\n if (typeof path !== 'string' || !path.trim()) {\n return ['.'];\n }\n\n return [path.trim()];\n}\n\n/** Images in successful ImageGen / SearchImage `images[]` output. */\nfunction imageCountFromPart(part: { state: string; output?: unknown }): number {\n if (part.state === 'output-available') {\n const output = part.output;\n\n if (typeof output === 'object' && output != null && 'images' in output && Array.isArray(output.images)) {\n return output.images.length;\n }\n }\n\n return 0;\n}\n\nfunction formatGroupedSegmentSummary(\n kind: GroupedSegmentKind,\n counts: {\n readCount: number;\n searchCount: number;\n commandCount: number;\n screenshotCount: number;\n imageCount: number;\n editCount: number;\n subagentCount: number;\n hasInstall: boolean;\n hasRestart: boolean;\n hasBuild: boolean;\n }\n): string {\n const parts: string[] = [];\n\n if (kind === 'edit') {\n if (counts.editCount) {\n parts.push(plural(counts.editCount, 'file', 'files'));\n }\n\n if (counts.readCount) {\n parts.push(plural(counts.readCount, 'explored', 'explored'));\n }\n }\n else if (kind === 'explore' || kind === 'setup' || kind === 'run') {\n if (counts.readCount) {\n parts.push(plural(counts.readCount, 'file', 'files'));\n }\n }\n\n if (counts.subagentCount) {\n parts.push(plural(counts.subagentCount, 'subagent', 'subagents'));\n }\n\n if (counts.screenshotCount) {\n parts.push(plural(counts.screenshotCount, 'screenshot', 'screenshots'));\n }\n\n if (counts.imageCount) {\n parts.push(plural(counts.imageCount, 'image', 'images'));\n }\n\n if (counts.searchCount) {\n parts.push(plural(counts.searchCount, 'search', 'searches'));\n }\n\n if (counts.commandCount) {\n parts.push(plural(counts.commandCount, 'command', 'commands'));\n }\n\n if (counts.hasInstall) {\n parts.push('installed deps');\n }\n\n if (counts.hasRestart) {\n parts.push('restarted server');\n }\n\n if (counts.hasBuild) {\n parts.push('built project');\n }\n\n return parts.join(', ');\n}\n\nfunction applyMcpGroupedSegmentRole(\n server: string | undefined,\n tool: string,\n state: {\n hasExplore: boolean;\n hasSetup: boolean;\n searchCount: number;\n }\n): void {\n const role = mcpGroupedSegmentRole(server, tool);\n\n if (role === 'lint') {\n state.hasSetup = true;\n\n return;\n }\n\n state.hasExplore = true;\n state.searchCount++;\n}\n\n/** Rolls up grouped workspace tools into Explored/Edited/Setup summary lines. */\nexport function analyzeGroupedSegment(\n groups: readonly MessagePartGroup[],\n fileStats?: PhaseFileStats\n): GroupedSegmentActivity {\n const readPaths = new Set<string>();\n const state = {\n searchCount: 0,\n commandCount: 0,\n screenshotCount: 0,\n imageCount: 0,\n subagentCount: 0,\n hasEdits: false,\n hasSetup: false,\n hasInstall: false,\n hasRestart: false,\n hasBuild: false,\n hasExplore: false,\n hasCommands: false,\n };\n\n for (const group of groups) {\n if (group.kind !== 'single') {\n continue;\n }\n\n const { part } = group;\n\n if (!isToolUIPart(part)) {\n continue;\n }\n\n const name = getToolName(part);\n\n if (name === 'CallDynamicTool') {\n const { namespace, toolName } = parseCallDynamicToolInput(part.input);\n\n if (isGroupedSegmentImageTool(toolName)) {\n const images = imageCountFromPart(part);\n\n if (images > 0) {\n state.hasExplore = true;\n state.imageCount += images;\n }\n\n continue;\n }\n\n applyMcpGroupedSegmentRole(namespace, toolName, state);\n\n continue;\n }\n\n const prefixedMcp = parsePrefixedMcpToolName(name);\n\n if (prefixedMcp) {\n applyMcpGroupedSegmentRole(prefixedMcp.namespace, prefixedMcp.tool, state);\n\n continue;\n }\n\n if (GROUPED_SEGMENT_EDIT_TOOLS.has(name)) {\n state.hasEdits = true;\n }\n else if (isGroupedSegmentFilePathTool(name)) {\n state.hasExplore = true;\n\n const paths = name === 'ListDirectory'\n ? listDirectoryPathsFromPart(part)\n : readPathsFromPart(part as ReadToolUIPart);\n\n addToSet(readPaths, paths);\n }\n else if (name === 'Agent') {\n state.hasExplore = true;\n state.subagentCount++;\n }\n else if (isGroupedSegmentCommandTool(name)) {\n state.hasCommands = true;\n state.commandCount++;\n }\n else if (isGroupedSegmentSearchTool(name)) {\n state.hasExplore = true;\n state.searchCount++;\n }\n else if (isScreenshotTool(name)) {\n state.hasExplore = true;\n state.screenshotCount++;\n }\n else if (isGroupedSegmentImageTool(name)) {\n const images = imageCountFromPart(part);\n\n if (images > 0) {\n state.hasExplore = true;\n state.imageCount += images;\n }\n }\n else if (isGroupedSegmentLintTool(name)) {\n state.hasSetup = true;\n }\n else if (isGroupedSegmentInstallTool(name)) {\n state.hasSetup = true;\n state.hasInstall = true;\n }\n else if (isGroupedSegmentRestartTool(name)) {\n state.hasSetup = true;\n state.hasRestart = true;\n }\n else if (isGroupedSegmentBuildTool(name)) {\n state.hasSetup = true;\n state.hasBuild = true;\n }\n }\n\n const editCount = fileStats?.editCount ?? 0;\n\n if (editCount > 0) {\n state.hasEdits = true;\n }\n\n const kind = groupedSegmentKind(state.hasEdits, state.hasSetup, state.hasExplore, state.hasCommands);\n\n const activity: GroupedSegmentActivity = {\n kind,\n summary: formatGroupedSegmentSummary(kind, {\n readCount: readPaths.size,\n searchCount: state.searchCount,\n commandCount: state.commandCount,\n screenshotCount: state.screenshotCount,\n imageCount: state.imageCount,\n editCount,\n subagentCount: state.subagentCount,\n hasInstall: state.hasInstall,\n hasRestart: state.hasRestart,\n hasBuild: state.hasBuild,\n }),\n };\n\n return activity;\n}\n"],"names":["groupedSegmentKind","hasEdits","hasSetup","hasExplore","hasCommands","addToSet","set","paths","path","listDirectoryPathsFromPart","part","imageCountFromPart","output","formatGroupedSegmentSummary","kind","counts","parts","plural","applyMcpGroupedSegmentRole","server","tool","state","mcpGroupedSegmentRole","analyzeGroupedSegment","groups","fileStats","readPaths","group","isToolUIPart","name","getToolName","namespace","toolName","parseCallDynamicToolInput","isGroupedSegmentImageTool","images","prefixedMcp","parsePrefixedMcpToolName","GROUPED_SEGMENT_EDIT_TOOLS","isGroupedSegmentFilePathTool","readPathsFromPart","isGroupedSegmentCommandTool","isGroupedSegmentSearchTool","isScreenshotTool","isGroupedSegmentLintTool","isGroupedSegmentInstallTool","isGroupedSegmentRestartTool","isGroupedSegmentBuildTool","editCount"],"mappings":"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"}
1
+ {"version":3,"file":"analyzeGroupedSegment.js","sources":["../../../../src/chat/Message/segments/analyzeGroupedSegment.ts"],"sourcesContent":["import { plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\nimport { isScreenshotTool } from '@reforma/types/sandbox';\n\nimport { parseCallDynamicToolInput, parsePrefixedMcpToolName } from '../../Tool/mcp-tools/parseCallDynamicToolInput';\nimport { readPathsFromPart } from '../../Tool/read/normalizeReadTools';\nimport { mcpGroupedSegmentRole } from './groupedSegmentMcpTools';\nimport {\n GROUPED_SEGMENT_EDIT_TOOLS,\n isGroupedSegmentBuildTool,\n isGroupedSegmentCommandTool,\n isGroupedSegmentFilePathTool,\n isGroupedSegmentImageTool,\n isGroupedSegmentInstallTool,\n isGroupedSegmentLintTool,\n isGroupedSegmentRestartTool,\n isGroupedSegmentSearchTool,\n} from './groupedSegmentTools';\n\nimport type { ReadToolUIPart } from '../../Tool/read/normalizeReadTools';\nimport type { MessagePartGroup } from '../normalize/normalizeMessageParts';\n\nexport type GroupedSegmentKind = 'edit' | 'setup' | 'explore' | 'run' | 'other';\n\nexport type LineCounts = {\n added: number;\n removed: number;\n};\n\nexport type PhaseFileStats = {\n editCount: number;\n lineCounts?: LineCounts;\n};\n\nexport type GroupedSegmentActivity = {\n kind: GroupedSegmentKind;\n summary: string;\n label?: string;\n streamLabel?: string;\n};\n\nfunction groupedSegmentKind(\n hasEdits: boolean,\n hasSetup: boolean,\n hasExplore: boolean,\n hasCommands: boolean\n): GroupedSegmentKind {\n if (hasEdits) {\n return 'edit';\n }\n\n if (hasExplore) {\n return 'explore';\n }\n\n if (hasCommands) {\n return 'run';\n }\n\n if (hasSetup) {\n return 'setup';\n }\n\n return 'other';\n}\n\nfunction addToSet(set: Set<string>, paths: readonly string[]) {\n for (const path of paths) {\n if (path) {\n set.add(path);\n }\n }\n}\n\n/** Directory listed by ListDirectory (`path` input; root when omitted). */\nfunction listDirectoryPathsFromPart(part: { input?: unknown }): string[] {\n if (part.input == null || typeof part.input !== 'object') {\n return ['.'];\n }\n\n const path = (part.input as { path?: unknown }).path;\n\n if (typeof path !== 'string' || !path.trim()) {\n return ['.'];\n }\n\n return [path.trim()];\n}\n\n/** Images in successful ImageGen / SearchImage `images[]` output. */\nfunction imageCountFromPart(part: { state: string; output?: unknown }): number {\n if (part.state === 'output-available') {\n const output = part.output;\n\n if (typeof output === 'object' && output != null && 'images' in output && Array.isArray(output.images)) {\n return output.images.length;\n }\n }\n\n return 0;\n}\n\nfunction formatGroupedSegmentSummary(\n kind: GroupedSegmentKind,\n counts: {\n readCount: number;\n searchCount: number;\n commandCount: number;\n screenshotCount: number;\n imageCount: number;\n editCount: number;\n subagentCount: number;\n hasInstall: boolean;\n hasRestart: boolean;\n hasBuild: boolean;\n }\n): string {\n const parts: string[] = [];\n\n if (kind === 'edit') {\n if (counts.editCount) {\n parts.push(plural(counts.editCount, 'file', 'files'));\n }\n\n if (counts.readCount) {\n parts.push(plural(counts.readCount, 'explored', 'explored'));\n }\n }\n else if (kind === 'explore' || kind === 'setup' || kind === 'run') {\n if (counts.readCount) {\n parts.push(plural(counts.readCount, 'file', 'files'));\n }\n }\n\n if (counts.subagentCount) {\n parts.push(plural(counts.subagentCount, 'subagent', 'subagents'));\n }\n\n if (counts.screenshotCount) {\n parts.push(plural(counts.screenshotCount, 'screenshot', 'screenshots'));\n }\n\n if (counts.imageCount) {\n parts.push(plural(counts.imageCount, 'image', 'images'));\n }\n\n if (counts.searchCount) {\n parts.push(plural(counts.searchCount, 'search', 'searches'));\n }\n\n if (counts.commandCount) {\n parts.push(plural(counts.commandCount, 'command', 'commands'));\n }\n\n if (counts.hasInstall) {\n parts.push('installed deps');\n }\n\n if (counts.hasRestart) {\n parts.push('restarted server');\n }\n\n if (counts.hasBuild) {\n parts.push('built project');\n }\n\n return parts.join(', ');\n}\n\nfunction applyMcpGroupedSegmentRole(\n server: string | undefined,\n tool: string,\n state: {\n hasExplore: boolean;\n hasSetup: boolean;\n searchCount: number;\n }\n): void {\n const role = mcpGroupedSegmentRole(server, tool);\n\n if (role === 'lint') {\n state.hasSetup = true;\n\n return;\n }\n\n state.hasExplore = true;\n state.searchCount++;\n}\n\n/** Rolls up grouped workspace tools into Explored/Edited/Setup summary lines. */\nexport function analyzeGroupedSegment(\n groups: readonly MessagePartGroup[],\n fileStats?: PhaseFileStats\n): GroupedSegmentActivity {\n const readPaths = new Set<string>();\n const state = {\n searchCount: 0,\n commandCount: 0,\n screenshotCount: 0,\n imageCount: 0,\n subagentCount: 0,\n hasEdits: false,\n hasSetup: false,\n hasInstall: false,\n hasRestart: false,\n hasBuild: false,\n hasExplore: false,\n hasCommands: false,\n };\n\n for (const group of groups) {\n if (group.kind !== 'single') {\n continue;\n }\n\n const { part } = group;\n\n if (!isToolUIPart(part)) {\n continue;\n }\n\n const name = getToolName(part);\n\n if (name === 'CallDynamicTool') {\n const { namespace, toolName } = parseCallDynamicToolInput(part.input);\n\n if (isGroupedSegmentImageTool(toolName)) {\n const images = imageCountFromPart(part);\n\n if (images > 0) {\n state.hasExplore = true;\n state.imageCount += images;\n }\n\n continue;\n }\n\n applyMcpGroupedSegmentRole(namespace, toolName, state);\n\n continue;\n }\n\n const prefixedMcp = parsePrefixedMcpToolName(name);\n\n if (prefixedMcp) {\n applyMcpGroupedSegmentRole(prefixedMcp.namespace, prefixedMcp.tool, state);\n\n continue;\n }\n\n if (GROUPED_SEGMENT_EDIT_TOOLS.has(name)) {\n state.hasEdits = true;\n }\n else if (isGroupedSegmentFilePathTool(name)) {\n state.hasExplore = true;\n\n const paths = name === 'ListDirectory'\n ? listDirectoryPathsFromPart(part)\n : readPathsFromPart(part as ReadToolUIPart);\n\n addToSet(readPaths, paths);\n }\n else if (name === 'Agent') {\n state.hasExplore = true;\n state.subagentCount++;\n }\n else if (isGroupedSegmentCommandTool(name)) {\n state.hasCommands = true;\n state.commandCount++;\n }\n else if (isGroupedSegmentSearchTool(name)) {\n state.hasExplore = true;\n state.searchCount++;\n }\n else if (isScreenshotTool(name)) {\n state.hasExplore = true;\n state.screenshotCount++;\n }\n else if (isGroupedSegmentImageTool(name)) {\n const images = imageCountFromPart(part);\n\n if (images > 0) {\n state.hasExplore = true;\n state.imageCount += images;\n }\n }\n else if (isGroupedSegmentLintTool(name)) {\n state.hasSetup = true;\n }\n else if (isGroupedSegmentInstallTool(name)) {\n state.hasSetup = true;\n state.hasInstall = true;\n }\n else if (isGroupedSegmentRestartTool(name)) {\n state.hasSetup = true;\n state.hasRestart = true;\n }\n else if (isGroupedSegmentBuildTool(name)) {\n state.hasSetup = true;\n state.hasBuild = true;\n }\n }\n\n const editCount = fileStats?.editCount ?? 0;\n\n if (editCount > 0) {\n state.hasEdits = true;\n }\n\n const kind = groupedSegmentKind(state.hasEdits, state.hasSetup, state.hasExplore, state.hasCommands);\n\n const activity: GroupedSegmentActivity = {\n kind,\n summary: formatGroupedSegmentSummary(kind, {\n readCount: readPaths.size,\n searchCount: state.searchCount,\n commandCount: state.commandCount,\n screenshotCount: state.screenshotCount,\n imageCount: state.imageCount,\n editCount,\n subagentCount: state.subagentCount,\n hasInstall: state.hasInstall,\n hasRestart: state.hasRestart,\n hasBuild: state.hasBuild,\n }),\n };\n\n return activity;\n}\n"],"names":["groupedSegmentKind","hasEdits","hasSetup","hasExplore","hasCommands","addToSet","set","paths","path","listDirectoryPathsFromPart","part","imageCountFromPart","output","formatGroupedSegmentSummary","kind","counts","parts","plural","applyMcpGroupedSegmentRole","server","tool","state","mcpGroupedSegmentRole","analyzeGroupedSegment","groups","fileStats","readPaths","group","isToolUIPart","name","getToolName","namespace","toolName","parseCallDynamicToolInput","isGroupedSegmentImageTool","images","prefixedMcp","parsePrefixedMcpToolName","GROUPED_SEGMENT_EDIT_TOOLS","isGroupedSegmentFilePathTool","readPathsFromPart","isGroupedSegmentCommandTool","isGroupedSegmentSearchTool","isScreenshotTool","isGroupedSegmentLintTool","isGroupedSegmentInstallTool","isGroupedSegmentRestartTool","isGroupedSegmentBuildTool","editCount"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { isToolUIPart as s } from "ai";
1
+ import { isToolUIPart as s } from "@reforma/types";
2
2
  import { isToolInvocationInProgress as l } from "../../Tool/helpers.js";
3
3
  function a(t) {
4
4
  return t.kind === "single" && s(t.part);
@@ -1 +1 @@
1
- {"version":3,"file":"recentStreamingPhaseToolGroups.js","sources":["../../../../src/chat/Message/segments/recentStreamingPhaseToolGroups.ts"],"sourcesContent":["import { isToolUIPart } from 'ai';\n\nimport { isToolInvocationInProgress } from '../../Tool/helpers';\n\nimport type { MessagePartGroup } from '../normalize/normalizeMessageParts';\n\nfunction isWorkspaceToolGroup(group: MessagePartGroup): boolean {\n return group.kind === 'single' && isToolUIPart(group.part);\n}\n\n/** Visible streaming row: tool, commentary text, or reasoning. */\nfunction isStreamingPhaseRow(group: MessagePartGroup): boolean {\n return group.kind === 'reasoning' || group.kind === 'single';\n}\n\n/** Outside suffix start (`groups.length` = none). In-progress peels last 2 rows; else last tool. */\nfunction streamingOutsidePhaseStart(groups: readonly MessagePartGroup[]): number {\n let lastTool = -1;\n let lastRow = -1;\n let prevRow = -1;\n\n for (let i = 0; i < groups.length; i++) {\n if (isWorkspaceToolGroup(groups[i])) {\n lastTool = i;\n }\n\n if (isStreamingPhaseRow(groups[i])) {\n prevRow = lastRow;\n lastRow = i;\n }\n }\n\n if (lastTool < 0) {\n return groups.length;\n }\n\n const tail = groups[lastTool];\n const inProgress = tail.kind === 'single'\n && isToolUIPart(tail.part)\n && isToolInvocationInProgress(tail.part.state);\n\n if (inProgress) {\n return prevRow < 0 ? lastRow : prevRow;\n }\n\n return lastTool;\n}\n\n/** Panel prefix + outside suffix; outside stays put when the phase expands. */\nexport function splitStreamingPhaseGroups(\n groups: readonly MessagePartGroup[],\n streamActive: boolean\n) {\n const outsideStart = streamActive ? streamingOutsidePhaseStart(groups) : groups.length;\n\n return {\n panelGroups: groups.slice(0, outsideStart),\n outsideGroups: groups.slice(outsideStart),\n outsideStart,\n };\n}\n\n/** React key that stays put when groups insert/reorder ahead of a tool. */\nexport function phaseGroupKey(group: MessagePartGroup, index: number): string {\n if (group.kind === 'single' && isToolUIPart(group.part)) {\n return group.part.toolCallId;\n }\n\n return `${ group.kind }-${ index }`;\n}\n"],"names":["isWorkspaceToolGroup","group","isToolUIPart","isStreamingPhaseRow","streamingOutsidePhaseStart","groups","lastTool","lastRow","prevRow","tail","isToolInvocationInProgress","splitStreamingPhaseGroups","streamActive","outsideStart","phaseGroupKey","index"],"mappings":";;AAEA,SAASA,EAAqBC,GAAO;AACnC,SAAOA,EAAM,SAAS,YAAYC,EAAaD,EAAM,IAAI;AAC3D;AAGA,SAASE,EAAoBF,GAAO;AAClC,SAAOA,EAAM,SAAS,eAAeA,EAAM,SAAS;AACtD;AAGA,SAASG,EAA2BC,GAAQ;AAC1C,MAAIC,IAAW,IACXC,IAAU,IACVC,IAAU;AACd,WAAS,IAAI,GAAG,IAAIH,EAAO,QAAQ;AACjC,IAAIL,EAAqBK,EAAO,CAAC,CAAC,MAChCC,IAAW,IAETH,EAAoBE,EAAO,CAAC,CAAC,MAC/BG,IAAUD,GACVA,IAAU;AAGd,MAAID,IAAW;AACb,WAAOD,EAAO;AAEhB,QAAMI,IAAOJ,EAAOC,CAAQ;AAE5B,SADmBG,EAAK,SAAS,YAAYP,EAAaO,EAAK,IAAI,KAAKC,EAA2BD,EAAK,KAAK,KAAK,IAEzGD,IAAU,IAAID,IAAUC,IAE1BF;AACT;AAGO,SAASK,EAA0BN,GAAQO,GAAc;AAC9D,QAAMC,IAAeD,IAAeR,EAA2BC,CAAM,IAAIA,EAAO;AAChF,SAAO;AAAA,IACL,aAAaA,EAAO,MAAM,GAAGQ,CAAY;AAAA,IACzC,eAAeR,EAAO,MAAMQ,CAAY;AAAA,IACxC,cAAAA;AAAA,EAAA;AAEJ;AAGO,SAASC,EAAcb,GAAOc,GAAO;AAC1C,SAAId,EAAM,SAAS,YAAYC,EAAaD,EAAM,IAAI,IAC7CA,EAAM,KAAK,aAEb,GAAGA,EAAM,IAAI,IAAIc,CAAK;AAC/B;"}
1
+ {"version":3,"file":"recentStreamingPhaseToolGroups.js","sources":["../../../../src/chat/Message/segments/recentStreamingPhaseToolGroups.ts"],"sourcesContent":["import { isToolUIPart } from '@reforma/types';\n\nimport { isToolInvocationInProgress } from '../../Tool/helpers';\n\nimport type { MessagePartGroup } from '../normalize/normalizeMessageParts';\n\nfunction isWorkspaceToolGroup(group: MessagePartGroup): boolean {\n return group.kind === 'single' && isToolUIPart(group.part);\n}\n\n/** Visible streaming row: tool, commentary text, or reasoning. */\nfunction isStreamingPhaseRow(group: MessagePartGroup): boolean {\n return group.kind === 'reasoning' || group.kind === 'single';\n}\n\n/** Outside suffix start (`groups.length` = none). In-progress peels last 2 rows; else last tool. */\nfunction streamingOutsidePhaseStart(groups: readonly MessagePartGroup[]): number {\n let lastTool = -1;\n let lastRow = -1;\n let prevRow = -1;\n\n for (let i = 0; i < groups.length; i++) {\n if (isWorkspaceToolGroup(groups[i])) {\n lastTool = i;\n }\n\n if (isStreamingPhaseRow(groups[i])) {\n prevRow = lastRow;\n lastRow = i;\n }\n }\n\n if (lastTool < 0) {\n return groups.length;\n }\n\n const tail = groups[lastTool];\n const inProgress = tail.kind === 'single'\n && isToolUIPart(tail.part)\n && isToolInvocationInProgress(tail.part.state);\n\n if (inProgress) {\n return prevRow < 0 ? lastRow : prevRow;\n }\n\n return lastTool;\n}\n\n/** Panel prefix + outside suffix; outside stays put when the phase expands. */\nexport function splitStreamingPhaseGroups(\n groups: readonly MessagePartGroup[],\n streamActive: boolean\n) {\n const outsideStart = streamActive ? streamingOutsidePhaseStart(groups) : groups.length;\n\n return {\n panelGroups: groups.slice(0, outsideStart),\n outsideGroups: groups.slice(outsideStart),\n outsideStart,\n };\n}\n\n/** React key that stays put when groups insert/reorder ahead of a tool. */\nexport function phaseGroupKey(group: MessagePartGroup, index: number): string {\n if (group.kind === 'single' && isToolUIPart(group.part)) {\n return group.part.toolCallId;\n }\n\n return `${ group.kind }-${ index }`;\n}\n"],"names":["isWorkspaceToolGroup","group","isToolUIPart","isStreamingPhaseRow","streamingOutsidePhaseStart","groups","lastTool","lastRow","prevRow","tail","isToolInvocationInProgress","splitStreamingPhaseGroups","streamActive","outsideStart","phaseGroupKey","index"],"mappings":";;AAEA,SAASA,EAAqBC,GAAO;AACnC,SAAOA,EAAM,SAAS,YAAYC,EAAaD,EAAM,IAAI;AAC3D;AAGA,SAASE,EAAoBF,GAAO;AAClC,SAAOA,EAAM,SAAS,eAAeA,EAAM,SAAS;AACtD;AAGA,SAASG,EAA2BC,GAAQ;AAC1C,MAAIC,IAAW,IACXC,IAAU,IACVC,IAAU;AACd,WAAS,IAAI,GAAG,IAAIH,EAAO,QAAQ;AACjC,IAAIL,EAAqBK,EAAO,CAAC,CAAC,MAChCC,IAAW,IAETH,EAAoBE,EAAO,CAAC,CAAC,MAC/BG,IAAUD,GACVA,IAAU;AAGd,MAAID,IAAW;AACb,WAAOD,EAAO;AAEhB,QAAMI,IAAOJ,EAAOC,CAAQ;AAE5B,SADmBG,EAAK,SAAS,YAAYP,EAAaO,EAAK,IAAI,KAAKC,EAA2BD,EAAK,KAAK,KAAK,IAEzGD,IAAU,IAAID,IAAUC,IAE1BF;AACT;AAGO,SAASK,EAA0BN,GAAQO,GAAc;AAC9D,QAAMC,IAAeD,IAAeR,EAA2BC,CAAM,IAAIA,EAAO;AAChF,SAAO;AAAA,IACL,aAAaA,EAAO,MAAM,GAAGQ,CAAY;AAAA,IACzC,eAAeR,EAAO,MAAMQ,CAAY;AAAA,IACxC,cAAAA;AAAA,EAAA;AAEJ;AAGO,SAASC,EAAcb,GAAOc,GAAO;AAC1C,SAAId,EAAM,SAAS,YAAYC,EAAaD,EAAM,IAAI,IAC7CA,EAAM,KAAK,aAEb,GAAGA,EAAM,IAAI,IAAIc,CAAK;AAC/B;"}
@@ -1,4 +1,4 @@
1
- import { isTextUIPart as l } from "ai";
1
+ import { isTextUIPart as l } from "@reforma/types";
2
2
  import { segmentRequiresUserAction as s, lastVisiblePartFromGroups as f } from "../normalize/normalizeMessageParts.js";
3
3
  function a(r, e) {
4
4
  if (e.streaming || e.cancelled || r.length < 2 || r.some((i) => s(i.groups)))
@@ -1 +1 @@
1
- {"version":3,"file":"workedCollapse.js","sources":["../../../../src/chat/Message/turn/workedCollapse.ts"],"sourcesContent":["import { isTextUIPart } from 'ai';\n\nimport {\n lastVisiblePartFromGroups,\n segmentRequiresUserAction,\n} from '../normalize/normalizeMessageParts';\n\nimport type { MessageSegment } from '../normalize/normalizeMessageParts';\n\nexport type FinishedWorkSplit = {\n work: readonly MessageSegment[];\n answer: MessageSegment;\n};\n\n/**\n * Finished turn whose last visible part is text: tuck every segment before that\n * answer under one disclosure. Streaming, cancelled, and \"still waiting\" turns stay open.\n */\nexport function splitFinishedWork(\n segments: readonly MessageSegment[],\n flags: { streaming: boolean; cancelled: boolean }\n): FinishedWorkSplit | null {\n if (flags.streaming || flags.cancelled || segments.length < 2) {\n return null;\n }\n\n if (segments.some(segment => segmentRequiresUserAction(segment.groups))) {\n return null;\n }\n\n const answer = segments[segments.length - 1];\n\n if (!answer || answer.layout !== 'ungrouped') {\n return null;\n }\n\n const tail = lastVisiblePartFromGroups(answer.groups);\n\n if (!tail || !isTextUIPart(tail) || tail.state === 'streaming' || !tail.text.trim()) {\n return null;\n }\n\n return {\n work: segments.slice(0, -1),\n answer,\n };\n}\n\n/** \"Worked for 25s\" / \"Worked for 2m\". \"Worked\" when the turn has no timestamps. */\nexport function workedForLabel(startedAt: number | undefined, endedAt: number | undefined): string {\n if (\n startedAt == null\n || endedAt == null\n || !Number.isFinite(startedAt)\n || !Number.isFinite(endedAt)\n || endedAt < startedAt\n ) {\n return 'Worked';\n }\n\n const seconds = Math.max(1, Math.round((endedAt - startedAt) / 1000));\n\n if (seconds < 60) {\n return `Worked for ${ seconds }s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remSeconds = seconds % 60;\n\n if (minutes < 60) {\n return remSeconds === 0\n ? `Worked for ${ minutes }m`\n : `Worked for ${ minutes }m ${ remSeconds }s`;\n }\n\n const hours = Math.floor(minutes / 60);\n const remMinutes = minutes % 60;\n\n return remMinutes === 0\n ? `Worked for ${ hours }h`\n : `Worked for ${ hours }h ${ remMinutes }m`;\n}\n"],"names":["splitFinishedWork","segments","flags","segment","segmentRequiresUserAction","answer","tail","lastVisiblePartFromGroups","isTextUIPart","workedForLabel","startedAt","endedAt","seconds","minutes","remSeconds","hours","remMinutes"],"mappings":";;AAMO,SAASA,EAAkBC,GAAUC,GAAO;AAIjD,MAHIA,EAAM,aAAaA,EAAM,aAAaD,EAAS,SAAS,KAGxDA,EAAS,KAAK,CAAAE,MAAWC,EAA0BD,EAAQ,MAAM,CAAC;AACpE,WAAO;AAET,QAAME,IAASJ,EAASA,EAAS,SAAS,CAAC;AAC3C,MAAI,CAACI,KAAUA,EAAO,WAAW;AAC/B,WAAO;AAET,QAAMC,IAAOC,EAA0BF,EAAO,MAAM;AACpD,SAAI,CAACC,KAAQ,CAACE,EAAaF,CAAI,KAAKA,EAAK,UAAU,eAAe,CAACA,EAAK,KAAK,SACpE,OAEF;AAAA,IACL,MAAML,EAAS,MAAM,GAAG,EAAE;AAAA,IAC1B,QAAAI;AAAA,EAAA;AAEJ;AAGO,SAASI,EAAeC,GAAWC,GAAS;AACjD,MAAID,KAAa,QAAQC,KAAW,QAAQ,CAAC,OAAO,SAASD,CAAS,KAAK,CAAC,OAAO,SAASC,CAAO,KAAKA,IAAUD;AAChH,WAAO;AAET,QAAME,IAAU,KAAK,IAAI,GAAG,KAAK,OAAOD,IAAUD,KAAa,GAAI,CAAC;AACpE,MAAIE,IAAU;AACZ,WAAO,cAAcA,CAAO;AAE9B,QAAMC,IAAU,KAAK,MAAMD,IAAU,EAAE,GACjCE,IAAaF,IAAU;AAC7B,MAAIC,IAAU;AACZ,WAAOC,MAAe,IAAI,cAAcD,CAAO,MAAM,cAAcA,CAAO,KAAKC,CAAU;AAE3F,QAAMC,IAAQ,KAAK,MAAMF,IAAU,EAAE,GAC/BG,IAAaH,IAAU;AAC7B,SAAOG,MAAe,IAAI,cAAcD,CAAK,MAAM,cAAcA,CAAK,KAAKC,CAAU;AACvF;"}
1
+ {"version":3,"file":"workedCollapse.js","sources":["../../../../src/chat/Message/turn/workedCollapse.ts"],"sourcesContent":["import { isTextUIPart } from '@reforma/types';\n\nimport {\n lastVisiblePartFromGroups,\n segmentRequiresUserAction,\n} from '../normalize/normalizeMessageParts';\n\nimport type { MessageSegment } from '../normalize/normalizeMessageParts';\n\nexport type FinishedWorkSplit = {\n work: readonly MessageSegment[];\n answer: MessageSegment;\n};\n\n/**\n * Finished turn whose last visible part is text: tuck every segment before that\n * answer under one disclosure. Streaming, cancelled, and \"still waiting\" turns stay open.\n */\nexport function splitFinishedWork(\n segments: readonly MessageSegment[],\n flags: { streaming: boolean; cancelled: boolean }\n): FinishedWorkSplit | null {\n if (flags.streaming || flags.cancelled || segments.length < 2) {\n return null;\n }\n\n if (segments.some(segment => segmentRequiresUserAction(segment.groups))) {\n return null;\n }\n\n const answer = segments[segments.length - 1];\n\n if (!answer || answer.layout !== 'ungrouped') {\n return null;\n }\n\n const tail = lastVisiblePartFromGroups(answer.groups);\n\n if (!tail || !isTextUIPart(tail) || tail.state === 'streaming' || !tail.text.trim()) {\n return null;\n }\n\n return {\n work: segments.slice(0, -1),\n answer,\n };\n}\n\n/** \"Worked for 25s\" / \"Worked for 2m\". \"Worked\" when the turn has no timestamps. */\nexport function workedForLabel(startedAt: number | undefined, endedAt: number | undefined): string {\n if (\n startedAt == null\n || endedAt == null\n || !Number.isFinite(startedAt)\n || !Number.isFinite(endedAt)\n || endedAt < startedAt\n ) {\n return 'Worked';\n }\n\n const seconds = Math.max(1, Math.round((endedAt - startedAt) / 1000));\n\n if (seconds < 60) {\n return `Worked for ${ seconds }s`;\n }\n\n const minutes = Math.floor(seconds / 60);\n const remSeconds = seconds % 60;\n\n if (minutes < 60) {\n return remSeconds === 0\n ? `Worked for ${ minutes }m`\n : `Worked for ${ minutes }m ${ remSeconds }s`;\n }\n\n const hours = Math.floor(minutes / 60);\n const remMinutes = minutes % 60;\n\n return remMinutes === 0\n ? `Worked for ${ hours }h`\n : `Worked for ${ hours }h ${ remMinutes }m`;\n}\n"],"names":["splitFinishedWork","segments","flags","segment","segmentRequiresUserAction","answer","tail","lastVisiblePartFromGroups","isTextUIPart","workedForLabel","startedAt","endedAt","seconds","minutes","remSeconds","hours","remMinutes"],"mappings":";;AAMO,SAASA,EAAkBC,GAAUC,GAAO;AAIjD,MAHIA,EAAM,aAAaA,EAAM,aAAaD,EAAS,SAAS,KAGxDA,EAAS,KAAK,CAAAE,MAAWC,EAA0BD,EAAQ,MAAM,CAAC;AACpE,WAAO;AAET,QAAME,IAASJ,EAASA,EAAS,SAAS,CAAC;AAC3C,MAAI,CAACI,KAAUA,EAAO,WAAW;AAC/B,WAAO;AAET,QAAMC,IAAOC,EAA0BF,EAAO,MAAM;AACpD,SAAI,CAACC,KAAQ,CAACE,EAAaF,CAAI,KAAKA,EAAK,UAAU,eAAe,CAACA,EAAK,KAAK,SACpE,OAEF;AAAA,IACL,MAAML,EAAS,MAAM,GAAG,EAAE;AAAA,IAC1B,QAAAI;AAAA,EAAA;AAEJ;AAGO,SAASI,EAAeC,GAAWC,GAAS;AACjD,MAAID,KAAa,QAAQC,KAAW,QAAQ,CAAC,OAAO,SAASD,CAAS,KAAK,CAAC,OAAO,SAASC,CAAO,KAAKA,IAAUD;AAChH,WAAO;AAET,QAAME,IAAU,KAAK,IAAI,GAAG,KAAK,OAAOD,IAAUD,KAAa,GAAI,CAAC;AACpE,MAAIE,IAAU;AACZ,WAAO,cAAcA,CAAO;AAE9B,QAAMC,IAAU,KAAK,MAAMD,IAAU,EAAE,GACjCE,IAAaF,IAAU;AAC7B,MAAIC,IAAU;AACZ,WAAOC,MAAe,IAAI,cAAcD,CAAO,MAAM,cAAcA,CAAO,KAAKC,CAAU;AAE3F,QAAMC,IAAQ,KAAK,MAAMF,IAAU,EAAE,GAC/BG,IAAaH,IAAU;AAC7B,SAAOG,MAAe,IAAI,cAAcD,CAAK,MAAM,cAAcA,CAAK,KAAKC,CAAU;AACvF;"}
@@ -1,4 +1,4 @@
1
- import { isToolUIPart as g, getToolName as s } from "ai";
1
+ import { isToolUIPart as g, getToolName as s } from "@reforma/types";
2
2
  import { useChatHandlers as h } from "../ChatContext.js";
3
3
  import { AgentTool as S } from "./agent/AgentTool.js";
4
4
  import { AskUserQuestionTool as P } from "./ask-user-question/AskUserQuestionTool.js";
@@ -1 +1 @@
1
- {"version":3,"file":"Tool.js","sources":["../../../src/chat/Tool/Tool.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from 'ai';\n\nimport { useChatHandlers } from '../ChatContext';\nimport { AgentTool } from './agent';\nimport { AskUserQuestionTool } from './ask-user-question';\nimport { BashTool } from './bash';\nimport { CheckPageTool } from './check-page';\nimport { ChooseDesignDirectionTool } from './choose-design-direction';\nimport { CreateDirectoryTool } from './create-directory';\nimport { DefaultTool } from './default/Default';\nimport { DevServerRestartTool, DevServerStatusTool } from './dev-server';\nimport { EditTool } from './edit';\nimport { FetchTool } from './fetch';\nimport { GetBackgroundResultTool } from './get-background-result';\nimport { GET_ERRORS_TOOL_NAME, GetErrorsTool, isGetErrorsToolName } from './get-errors';\nimport { GlobTool } from './glob';\nimport { GrepTool } from './grep';\nimport { ImageAssetTool } from './image-asset';\nimport { InstallDepsTool } from './install-dependencies';\nimport { InstallPlugin } from './install-plugin/InstallPlugin';\nimport { ListDirectoryTool } from './list-directory';\nimport { CallDynamicTool, GetDynamicToolsTool, GetMcpResourcesTool, McpAuth, parseCallDynamicToolInput, parsePrefixedMcpToolName } from './mcp-tools';\nimport { MemoryTool } from './memory';\nimport { MoveFileTool } from './move-file';\nimport { CreatePlanTool } from './plan/CreatePlanTool';\nimport { PreambleTool } from './preamble';\nimport { BuildTool } from './project-build';\nimport { ProjectEnvTool } from './project-env';\nimport { ReadFilesTool } from './read';\nimport { ReadLintsTool } from './read-lints';\nimport { RemoveFileTool } from './remove-file';\nimport { ScaffoldProjectTool } from './scaffold-project/ScaffoldProjectTool';\nimport { CaptureScreenshotTool } from './screenshot';\nimport { SkillTool } from './skill';\nimport { WaitingTool } from './waiting/WaitingTool';\nimport { WebSearchTool } from './web-search';\n\nimport type { ToolRendererProps } from './types';\n\ntype ToolRenderer = (props: ToolRendererProps) => ReturnType<typeof DefaultTool>;\n\nconst TOOL_RENDERERS: Record<string, ToolRenderer> = {\n default: DefaultTool,\n Agent: AgentTool,\n CreatePlan: CreatePlanTool,\n EditPlan: EditTool,\n ReadPlan: CreatePlanTool,\n WebSearch: WebSearchTool,\n // Vendor stream / legacy names (canonical local name is `WebSearch`).\n web_search: WebSearchTool,\n google_search: WebSearchTool,\n PageScreenshot: CaptureScreenshotTool,\n CheckPage: CheckPageTool,\n ImageGen: ImageAssetTool,\n SearchImage: ImageAssetTool,\n ImportAsset: ImageAssetTool,\n Fetch: FetchTool,\n Read: ReadFilesTool,\n ReadLints: ReadLintsTool,\n RemoveFile: RemoveFileTool,\n DevServerRestart: DevServerRestartTool,\n DevServerStatus: DevServerStatusTool,\n ScaffoldProject: ScaffoldProjectTool,\n CreateDirectory: CreateDirectoryTool,\n MoveFile: MoveFileTool,\n Preamble: PreambleTool,\n ProjectEnv: ProjectEnvTool,\n GetDynamicTools: GetDynamicToolsTool,\n GetMcpResources: GetMcpResourcesTool,\n CallDynamicTool,\n McpAuth,\n InstallPlugin,\n Glob: GlobTool,\n Grep: GrepTool,\n InstallDeps: InstallDepsTool,\n Skill: SkillTool,\n Remember: MemoryTool,\n Forget: MemoryTool,\n Waiting: WaitingTool,\n ListDirectory: ListDirectoryTool,\n Write: EditTool,\n Edit: EditTool,\n Bash: BashTool,\n Build: BuildTool,\n GetBackgroundResult: GetBackgroundResultTool,\n AskUserQuestion: AskUserQuestionTool,\n ChooseDesignDirection: ChooseDesignDirectionTool,\n [GET_ERRORS_TOOL_NAME]: GetErrorsTool,\n};\n\n/**\n * Deferred builtins arrive as `CallDynamicTool`. Use that tool's own card when one exists.\n * @internal\n */\nexport function renderedToolName(part: ToolRendererProps['part']): string {\n const name = getToolName(part);\n\n if (name !== 'CallDynamicTool') {\n return name;\n }\n\n const { toolName } = parseCallDynamicToolInput(part.input);\n const renderer = TOOL_RENDERERS[toolName];\n\n if (!renderer || renderer === CallDynamicTool) {\n return name;\n }\n\n return toolName;\n}\n\nfunction partForRenderer(part: ToolRendererProps['part']): ToolRendererProps['part'] {\n const name = renderedToolName(part);\n\n if (name === getToolName(part)) {\n return part;\n }\n\n return {\n ...part,\n type: `tool-${ name }`,\n input: parseCallDynamicToolInput(part.input).mcpInput,\n } as ToolRendererProps['part'];\n}\n\n/** Renders one AI SDK tool UI part: routes to a compact tool UI or the default collapsible shell. */\nexport function Tool({\n part,\n onToolApprovalResponse,\n onToolOutput,\n onOpenPath,\n}: ToolRendererProps) {\n const handlers = useChatHandlers({ onToolApprovalResponse, onToolOutput, onOpenPath });\n\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const presented = partForRenderer(part);\n const name = getToolName(presented);\n const ToolRenderer = isGetErrorsToolName(name)\n ? GetErrorsTool\n : TOOL_RENDERERS[name]\n ?? (parsePrefixedMcpToolName(name) ? CallDynamicTool : TOOL_RENDERERS.default);\n\n return (\n <ToolRenderer\n part={ presented }\n { ...handlers }\n />\n );\n}\n"],"names":["TOOL_RENDERERS","DefaultTool","AgentTool","CreatePlanTool","EditTool","WebSearchTool","CaptureScreenshotTool","CheckPageTool","ImageAssetTool","FetchTool","ReadFilesTool","ReadLintsTool","RemoveFileTool","DevServerRestartTool","DevServerStatusTool","ScaffoldProjectTool","CreateDirectoryTool","MoveFileTool","PreambleTool","ProjectEnvTool","GetDynamicToolsTool","GetMcpResourcesTool","CallDynamicTool","McpAuth","InstallPlugin","GlobTool","GrepTool","InstallDepsTool","SkillTool","MemoryTool","WaitingTool","ListDirectoryTool","BashTool","BuildTool","GetBackgroundResultTool","AskUserQuestionTool","ChooseDesignDirectionTool","GET_ERRORS_TOOL_NAME","GetErrorsTool","renderedToolName","part","name","getToolName","toolName","parseCallDynamicToolInput","renderer","partForRenderer","Tool","onToolApprovalResponse","onToolOutput","onOpenPath","handlers","useChatHandlers","isToolUIPart","presented","ToolRenderer","isGetErrorsToolName","parsePrefixedMcpToolName"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAMA,IAAiB;AAAA,EACrB,SAASC;AAAA,EACT,OAAOC;AAAA,EACP,YAAYC;AAAA,EACZ,UAAUC;AAAA,EACV,UAAUD;AAAA,EACV,WAAWE;AAAA;AAAA,EAEX,YAAYA;AAAA,EACZ,eAAeA;AAAA,EACf,gBAAgBC;AAAA,EAChB,WAAWC;AAAA,EACX,UAAUC;AAAA,EACV,aAAaA;AAAA,EACb,aAAaA;AAAA,EACb,OAAOC;AAAA,EACP,MAAMC;AAAA,EACN,WAAWC;AAAA,EACX,YAAYC;AAAA,EACZ,kBAAkBC;AAAA,EAClB,iBAAiBC;AAAA,EACjB,iBAAiBC;AAAA,EACjB,iBAAiBC;AAAA,EACjB,UAAUC;AAAA,EACV,UAAUC;AAAA,EACV,YAAYC;AAAA,EACZ,iBAAiBC;AAAA,EACjB,iBAAiBC;AAAA,EACjB,iBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC;AAAA,EACA,MAAMC;AAAA,EACN,MAAMC;AAAA,EACN,aAAaC;AAAA,EACb,OAAOC;AAAA,EACP,UAAUC;AAAA,EACV,QAAQA;AAAA,EACR,SAASC;AAAA,EACT,eAAeC;AAAA,EACf,OAAO3B;AAAA,EACP,MAAMA;AAAA,EACN,MAAM4B;AAAA,EACN,OAAOC;AAAA,EACP,qBAAqBC;AAAA,EACrB,iBAAiBC;AAAA,EACjB,uBAAuBC;AAAA,EACvB,CAACC,CAAoB,GAAGC;AAC1B;AAMO,SAASC,GAAiBC,GAAM;AACrC,QAAMC,IAAOC,EAAYF,CAAI;AAC7B,MAAIC,MAAS;AACX,WAAOA;AAET,QAAM;AAAA,IACJ,UAAAE;AAAA,EAAA,IACEC,EAA0BJ,EAAK,KAAK,GAClCK,IAAW7C,EAAe2C,CAAQ;AACxC,SAAI,CAACE,KAAYA,MAAavB,IACrBmB,IAEFE;AACT;AACA,SAASG,GAAgBN,GAAM;AAC7B,QAAMC,IAAOF,GAAiBC,CAAI;AAClC,SAAIC,MAASC,EAAYF,CAAI,IACpBA,IAEF;AAAA,IACL,GAAGA;AAAA,IACH,MAAM,QAAQC,CAAI;AAAA,IAClB,OAAOG,EAA0BJ,EAAK,KAAK,EAAE;AAAA,EAAA;AAEjD;AAGO,SAASO,GAAK;AAAA,EACnB,MAAAP;AAAA,EACA,wBAAAQ;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AACF,GAAG;AACD,QAAMC,IAAWC,EAAgB;AAAA,IAC/B,wBAAAJ;AAAA,IACA,cAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,CACD;AACD,MAAI,CAACG,EAAab,CAAI;AACpB,WAAO;AAET,QAAMc,IAAYR,GAAgBN,CAAI,GAChCC,IAAOC,EAAYY,CAAS,GAC5BC,IAAeC,EAAoBf,CAAI,IAAIH,IAAgBtC,EAAeyC,CAAI,MAAMgB,EAAyBhB,CAAI,IAAInB,IAAkBtB,EAAe;AAC5J,2BAAyBuD,GAAc;AAAA,IACrC,MAAMD;AAAA,IACN,GAAGH;AAAA,EAAA,CACJ;AACH;"}
1
+ {"version":3,"file":"Tool.js","sources":["../../../src/chat/Tool/Tool.tsx"],"sourcesContent":["import { getToolName, isToolUIPart } from '@reforma/types';\n\nimport { useChatHandlers } from '../ChatContext';\nimport { AgentTool } from './agent';\nimport { AskUserQuestionTool } from './ask-user-question';\nimport { BashTool } from './bash';\nimport { CheckPageTool } from './check-page';\nimport { ChooseDesignDirectionTool } from './choose-design-direction';\nimport { CreateDirectoryTool } from './create-directory';\nimport { DefaultTool } from './default/Default';\nimport { DevServerRestartTool, DevServerStatusTool } from './dev-server';\nimport { EditTool } from './edit';\nimport { FetchTool } from './fetch';\nimport { GetBackgroundResultTool } from './get-background-result';\nimport { GET_ERRORS_TOOL_NAME, GetErrorsTool, isGetErrorsToolName } from './get-errors';\nimport { GlobTool } from './glob';\nimport { GrepTool } from './grep';\nimport { ImageAssetTool } from './image-asset';\nimport { InstallDepsTool } from './install-dependencies';\nimport { InstallPlugin } from './install-plugin/InstallPlugin';\nimport { ListDirectoryTool } from './list-directory';\nimport { CallDynamicTool, GetDynamicToolsTool, GetMcpResourcesTool, McpAuth, parseCallDynamicToolInput, parsePrefixedMcpToolName } from './mcp-tools';\nimport { MemoryTool } from './memory';\nimport { MoveFileTool } from './move-file';\nimport { CreatePlanTool } from './plan/CreatePlanTool';\nimport { PreambleTool } from './preamble';\nimport { BuildTool } from './project-build';\nimport { ProjectEnvTool } from './project-env';\nimport { ReadFilesTool } from './read';\nimport { ReadLintsTool } from './read-lints';\nimport { RemoveFileTool } from './remove-file';\nimport { ScaffoldProjectTool } from './scaffold-project/ScaffoldProjectTool';\nimport { CaptureScreenshotTool } from './screenshot';\nimport { SkillTool } from './skill';\nimport { WaitingTool } from './waiting/WaitingTool';\nimport { WebSearchTool } from './web-search';\n\nimport type { ToolRendererProps } from './types';\n\ntype ToolRenderer = (props: ToolRendererProps) => ReturnType<typeof DefaultTool>;\n\nconst TOOL_RENDERERS: Record<string, ToolRenderer> = {\n default: DefaultTool,\n Agent: AgentTool,\n CreatePlan: CreatePlanTool,\n EditPlan: EditTool,\n ReadPlan: CreatePlanTool,\n WebSearch: WebSearchTool,\n // Vendor stream / legacy names (canonical local name is `WebSearch`).\n web_search: WebSearchTool,\n google_search: WebSearchTool,\n PageScreenshot: CaptureScreenshotTool,\n CheckPage: CheckPageTool,\n ImageGen: ImageAssetTool,\n SearchImage: ImageAssetTool,\n ImportAsset: ImageAssetTool,\n Fetch: FetchTool,\n Read: ReadFilesTool,\n ReadLints: ReadLintsTool,\n RemoveFile: RemoveFileTool,\n DevServerRestart: DevServerRestartTool,\n DevServerStatus: DevServerStatusTool,\n ScaffoldProject: ScaffoldProjectTool,\n CreateDirectory: CreateDirectoryTool,\n MoveFile: MoveFileTool,\n Preamble: PreambleTool,\n ProjectEnv: ProjectEnvTool,\n GetDynamicTools: GetDynamicToolsTool,\n GetMcpResources: GetMcpResourcesTool,\n CallDynamicTool,\n McpAuth,\n InstallPlugin,\n Glob: GlobTool,\n Grep: GrepTool,\n InstallDeps: InstallDepsTool,\n Skill: SkillTool,\n Remember: MemoryTool,\n Forget: MemoryTool,\n Waiting: WaitingTool,\n ListDirectory: ListDirectoryTool,\n Write: EditTool,\n Edit: EditTool,\n Bash: BashTool,\n Build: BuildTool,\n GetBackgroundResult: GetBackgroundResultTool,\n AskUserQuestion: AskUserQuestionTool,\n ChooseDesignDirection: ChooseDesignDirectionTool,\n [GET_ERRORS_TOOL_NAME]: GetErrorsTool,\n};\n\n/**\n * Deferred builtins arrive as `CallDynamicTool`. Use that tool's own card when one exists.\n * @internal\n */\nexport function renderedToolName(part: ToolRendererProps['part']): string {\n const name = getToolName(part);\n\n if (name !== 'CallDynamicTool') {\n return name;\n }\n\n const { toolName } = parseCallDynamicToolInput(part.input);\n const renderer = TOOL_RENDERERS[toolName];\n\n if (!renderer || renderer === CallDynamicTool) {\n return name;\n }\n\n return toolName;\n}\n\nfunction partForRenderer(part: ToolRendererProps['part']): ToolRendererProps['part'] {\n const name = renderedToolName(part);\n\n if (name === getToolName(part)) {\n return part;\n }\n\n return {\n ...part,\n type: `tool-${ name }`,\n input: parseCallDynamicToolInput(part.input).mcpInput,\n } as ToolRendererProps['part'];\n}\n\n/** Renders one AI SDK tool UI part: routes to a compact tool UI or the default collapsible shell. */\nexport function Tool({\n part,\n onToolApprovalResponse,\n onToolOutput,\n onOpenPath,\n}: ToolRendererProps) {\n const handlers = useChatHandlers({ onToolApprovalResponse, onToolOutput, onOpenPath });\n\n if (!isToolUIPart(part)) {\n return null;\n }\n\n const presented = partForRenderer(part);\n const name = getToolName(presented);\n const ToolRenderer = isGetErrorsToolName(name)\n ? GetErrorsTool\n : TOOL_RENDERERS[name]\n ?? (parsePrefixedMcpToolName(name) ? CallDynamicTool : TOOL_RENDERERS.default);\n\n return (\n <ToolRenderer\n part={ presented }\n { ...handlers }\n />\n );\n}\n"],"names":["TOOL_RENDERERS","DefaultTool","AgentTool","CreatePlanTool","EditTool","WebSearchTool","CaptureScreenshotTool","CheckPageTool","ImageAssetTool","FetchTool","ReadFilesTool","ReadLintsTool","RemoveFileTool","DevServerRestartTool","DevServerStatusTool","ScaffoldProjectTool","CreateDirectoryTool","MoveFileTool","PreambleTool","ProjectEnvTool","GetDynamicToolsTool","GetMcpResourcesTool","CallDynamicTool","McpAuth","InstallPlugin","GlobTool","GrepTool","InstallDepsTool","SkillTool","MemoryTool","WaitingTool","ListDirectoryTool","BashTool","BuildTool","GetBackgroundResultTool","AskUserQuestionTool","ChooseDesignDirectionTool","GET_ERRORS_TOOL_NAME","GetErrorsTool","renderedToolName","part","name","getToolName","toolName","parseCallDynamicToolInput","renderer","partForRenderer","Tool","onToolApprovalResponse","onToolOutput","onOpenPath","handlers","useChatHandlers","isToolUIPart","presented","ToolRenderer","isGetErrorsToolName","parsePrefixedMcpToolName"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAMA,IAAiB;AAAA,EACrB,SAASC;AAAA,EACT,OAAOC;AAAA,EACP,YAAYC;AAAA,EACZ,UAAUC;AAAA,EACV,UAAUD;AAAA,EACV,WAAWE;AAAA;AAAA,EAEX,YAAYA;AAAA,EACZ,eAAeA;AAAA,EACf,gBAAgBC;AAAA,EAChB,WAAWC;AAAA,EACX,UAAUC;AAAA,EACV,aAAaA;AAAA,EACb,aAAaA;AAAA,EACb,OAAOC;AAAA,EACP,MAAMC;AAAA,EACN,WAAWC;AAAA,EACX,YAAYC;AAAA,EACZ,kBAAkBC;AAAA,EAClB,iBAAiBC;AAAA,EACjB,iBAAiBC;AAAA,EACjB,iBAAiBC;AAAA,EACjB,UAAUC;AAAA,EACV,UAAUC;AAAA,EACV,YAAYC;AAAA,EACZ,iBAAiBC;AAAA,EACjB,iBAAiBC;AAAA,EACjB,iBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC;AAAA,EACA,MAAMC;AAAA,EACN,MAAMC;AAAA,EACN,aAAaC;AAAA,EACb,OAAOC;AAAA,EACP,UAAUC;AAAA,EACV,QAAQA;AAAA,EACR,SAASC;AAAA,EACT,eAAeC;AAAA,EACf,OAAO3B;AAAA,EACP,MAAMA;AAAA,EACN,MAAM4B;AAAA,EACN,OAAOC;AAAA,EACP,qBAAqBC;AAAA,EACrB,iBAAiBC;AAAA,EACjB,uBAAuBC;AAAA,EACvB,CAACC,CAAoB,GAAGC;AAC1B;AAMO,SAASC,GAAiBC,GAAM;AACrC,QAAMC,IAAOC,EAAYF,CAAI;AAC7B,MAAIC,MAAS;AACX,WAAOA;AAET,QAAM;AAAA,IACJ,UAAAE;AAAA,EAAA,IACEC,EAA0BJ,EAAK,KAAK,GAClCK,IAAW7C,EAAe2C,CAAQ;AACxC,SAAI,CAACE,KAAYA,MAAavB,IACrBmB,IAEFE;AACT;AACA,SAASG,GAAgBN,GAAM;AAC7B,QAAMC,IAAOF,GAAiBC,CAAI;AAClC,SAAIC,MAASC,EAAYF,CAAI,IACpBA,IAEF;AAAA,IACL,GAAGA;AAAA,IACH,MAAM,QAAQC,CAAI;AAAA,IAClB,OAAOG,EAA0BJ,EAAK,KAAK,EAAE;AAAA,EAAA;AAEjD;AAGO,SAASO,GAAK;AAAA,EACnB,MAAAP;AAAA,EACA,wBAAAQ;AAAA,EACA,cAAAC;AAAA,EACA,YAAAC;AACF,GAAG;AACD,QAAMC,IAAWC,EAAgB;AAAA,IAC/B,wBAAAJ;AAAA,IACA,cAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,CACD;AACD,MAAI,CAACG,EAAab,CAAI;AACpB,WAAO;AAET,QAAMc,IAAYR,GAAgBN,CAAI,GAChCC,IAAOC,EAAYY,CAAS,GAC5BC,IAAeC,EAAoBf,CAAI,IAAIH,IAAgBtC,EAAeyC,CAAI,MAAMgB,EAAyBhB,CAAI,IAAInB,IAAkBtB,EAAe;AAC5J,2BAAyBuD,GAAc;AAAA,IACrC,MAAMD;AAAA,IACN,GAAGH;AAAA,EAAA,CACJ;AACH;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AgentTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/agent/AgentTool.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AA8IlD,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAChC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC3C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAW3E;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CA0BpG;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,GAAG,SAAS,CAcrB;AAiFD,mDAAmD;AACnD,eAAO,MAAM,SAAS,cAAuB,iBAAiB;8BAAjB,iBAAiB;CA6C5D,CAAC"}
1
+ {"version":3,"file":"AgentTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/agent/AgentTool.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AA8IlD,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAChC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC3C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAW3E;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CA0BpG;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,GAAG,SAAS,CAcrB;AAiFD,mDAAmD;AACnD,eAAO,MAAM,SAAS,cAAuB,iBAAiB;8BAAjB,iBAAiB;CA8C5D,CAAC"}
@@ -1,33 +1,33 @@
1
- import { Message as x } from "@reforma/icons/14";
2
- import { ProgressLoader as I } from "@reforma/icons/assets";
3
- import { humanizeString as k, basename as T, plural as w } from "@reforma/lib";
4
- import { isToolUIPart as N, getToolName as F } from "ai";
1
+ import { Message as I } from "@reforma/icons/14";
2
+ import { ProgressLoader as x } from "@reforma/icons/assets";
3
+ import { humanizeString as w, basename as T, plural as N } from "@reforma/lib";
4
+ import { isToolUIPart as B, getToolName as F } from "@reforma/types";
5
5
  import { observer as U } from "mobx-react-lite";
6
6
  import { Box as C } from "../../../Box/Box.js";
7
- import { Pressable as B } from "react-aria-components";
8
- import { Shimmer as G } from "../../../Shimmer/Shimmer.js";
7
+ import { Pressable as G } from "react-aria-components";
8
+ import { Shimmer as M } from "../../../Shimmer/Shimmer.js";
9
9
  import { Show as g } from "../../../Show/Show.js";
10
10
  import { Text as m } from "../../../Text/Text.js";
11
- import { useChat as M } from "../../ChatContext.js";
12
- import { useMessageTurn as O } from "../../Message/turn/messageTurnContext.js";
13
- import { getToolFailureRowState as j, TOOL_INTERRUPTED_MESSAGE as W } from "../helpers.js";
14
- import { ToolShellCard as _ } from "../shell/ToolShellCard.js";
15
- import { useToolProgress as D } from "../shell/toolProgress.js";
16
- import V from "../shell/ToolShellCard.module.css.js";
11
+ import { useChat as O } from "../../ChatContext.js";
12
+ import { useMessageTurn as j } from "../../Message/turn/messageTurnContext.js";
13
+ import { getToolFailureRowState as W, TOOL_INTERRUPTED_MESSAGE as _ } from "../helpers.js";
14
+ import { ToolShellCard as D } from "../shell/ToolShellCard.js";
15
+ import { useToolProgress as V } from "../shell/toolProgress.js";
16
+ import z from "../shell/ToolShellCard.module.css.js";
17
17
  import h from "./AgentTool.module.css.js";
18
18
  import { jsx as o, jsxs as S } from "react/jsx-runtime";
19
- const z = {
19
+ const Y = {
20
20
  research: "Explore",
21
21
  shell: "Shell",
22
22
  verify: "Verify",
23
23
  plan: "Plan"
24
- }, Y = {
24
+ }, q = {
25
25
  research: "Exploring",
26
26
  shell: "Running",
27
27
  verify: "Verifying",
28
28
  plan: "Planning"
29
29
  };
30
- function q(e) {
30
+ function H(e) {
31
31
  if (e == null || typeof e != "object")
32
32
  return;
33
33
  const t = e.error;
@@ -37,20 +37,20 @@ function R(e) {
37
37
  for (const t of [e.output, e.input]) {
38
38
  if (t == null || typeof t != "object")
39
39
  continue;
40
- const r = t.name;
41
- if (typeof r == "string" && r.trim().length > 0)
42
- return r.trim();
40
+ const n = t.name;
41
+ if (typeof n == "string" && n.trim().length > 0)
42
+ return n.trim();
43
43
  }
44
44
  }
45
45
  function p(e) {
46
- const t = e?.trim() || "research", r = z[t];
47
- return r || t.charAt(0).toUpperCase() + t.slice(1);
46
+ const t = e?.trim() || "research", n = Y[t];
47
+ return n || t.charAt(0).toUpperCase() + t.slice(1);
48
48
  }
49
- function H(e) {
50
- const t = e?.trim() || "research", r = p(e);
49
+ function J(e, t) {
50
+ const n = e?.trim() || "research", r = p(e);
51
51
  return {
52
- live: Y[t] ?? `Running ${r}`,
53
- done: `Ran ${r} agent`
52
+ live: q[n] ?? `Running ${r}`,
53
+ done: t ? `Started ${r} agent in background` : `Ran ${r} agent`
54
54
  };
55
55
  }
56
56
  function i(e) {
@@ -59,22 +59,22 @@ function i(e) {
59
59
  const t = e.trim();
60
60
  return t.length > 0 ? t : void 0;
61
61
  }
62
- function J(e) {
62
+ function K(e) {
63
63
  const t = i(e.path);
64
64
  if (t)
65
65
  return T(t);
66
66
  if (!Array.isArray(e.paths))
67
67
  return;
68
- const r = e.paths.filter((n) => typeof n == "string" && n.trim().length > 0);
69
- if (r.length === 1)
70
- return T(r[0]);
71
- if (r.length > 1)
72
- return w(r.length, "file", "files");
68
+ const n = e.paths.filter((r) => typeof r == "string" && r.trim().length > 0);
69
+ if (n.length === 1)
70
+ return T(n[0]);
71
+ if (n.length > 1)
72
+ return N(n.length, "file", "files");
73
73
  }
74
74
  function d(e, t) {
75
- return (r) => `${e} ${J(r) ?? t}`;
75
+ return (n) => `${e} ${K(n) ?? t}`;
76
76
  }
77
- const K = {
77
+ const Q = {
78
78
  Read: d("Reading", "file"),
79
79
  Write: d("Writing", "file"),
80
80
  Edit: d("Editing", "file"),
@@ -105,16 +105,16 @@ const K = {
105
105
  EditPlan: () => "Editing plan",
106
106
  ReadPlan: () => "Reading plan"
107
107
  };
108
- function be(e, t) {
109
- const r = R(e), n = p(r), a = t?.needsUser === !0, c = i(e.output?.childThreadId) ?? i(t?.childThreadId);
108
+ function Te(e, t) {
109
+ const n = R(e), r = p(n), a = t?.needsUser === !0, c = i(e.output?.childThreadId) ?? i(t?.childThreadId);
110
110
  return {
111
- text: a ? `${n} · Waiting for you` : `${n} Agent working`,
112
- label: n,
111
+ text: a ? `${r} · Waiting for you` : `${r} Agent working`,
112
+ label: r,
113
113
  childThreadId: c,
114
114
  waiting: a
115
115
  };
116
116
  }
117
- function Q(e) {
117
+ function X(e) {
118
118
  if (!e)
119
119
  return;
120
120
  if (e.type === "text")
@@ -124,10 +124,10 @@ function Q(e) {
124
124
  const t = i(e.toolName);
125
125
  if (!t)
126
126
  return;
127
- const r = e.input, n = r != null && typeof r == "object" && !Array.isArray(r) ? r : {};
128
- return K[t]?.(n) ?? `Using ${i(e.title) ?? k(t)}`;
127
+ const n = e.input, r = n != null && typeof n == "object" && !Array.isArray(n) ? n : {};
128
+ return Q[t]?.(r) ?? `Using ${i(e.title) ?? w(t)}`;
129
129
  }
130
- function X(e) {
130
+ function Z(e) {
131
131
  if (!(e.failed || e.stalled)) {
132
132
  if (e.needsUser)
133
133
  return "Waiting for you";
@@ -135,26 +135,26 @@ function X(e) {
135
135
  return e.activity ?? "Starting…";
136
136
  }
137
137
  }
138
- function Z({
138
+ function ee({
139
139
  title: e,
140
140
  activity: t,
141
- errorText: r,
142
- running: n,
141
+ errorText: n,
142
+ running: r,
143
143
  stalled: a,
144
144
  onOpen: c
145
145
  }) {
146
- const l = a ? W : e, u = /* @__PURE__ */ S(C, {
146
+ const l = a ? _ : e, u = /* @__PURE__ */ S(C, {
147
147
  align: "center",
148
148
  direction: "row",
149
149
  fullWidth: !0,
150
150
  gap: "md",
151
151
  padding: "md",
152
152
  children: [/* @__PURE__ */ o(g, {
153
- when: n,
154
- fallback: /* @__PURE__ */ o(x, {
153
+ when: r,
154
+ fallback: /* @__PURE__ */ o(I, {
155
155
  "aria-hidden": !0
156
156
  }),
157
- children: /* @__PURE__ */ o(I, {
157
+ children: /* @__PURE__ */ o(x, {
158
158
  "aria-hidden": !0,
159
159
  size: 14
160
160
  })
@@ -162,20 +162,20 @@ function Z({
162
162
  gap: "xxs",
163
163
  grow: !0,
164
164
  children: [/* @__PURE__ */ o(g, {
165
- when: n,
165
+ when: r,
166
166
  fallback: /* @__PURE__ */ o(m, {
167
167
  className: h.title,
168
168
  color: a ? "danger" : void 0,
169
169
  children: l
170
170
  }),
171
- children: /* @__PURE__ */ o(G, {
171
+ children: /* @__PURE__ */ o(M, {
172
172
  as: "span",
173
173
  className: h.title,
174
174
  duration: 1,
175
175
  children: l
176
176
  })
177
177
  }), /* @__PURE__ */ o(g, {
178
- when: n ? t : void 0,
178
+ when: r ? t : void 0,
179
179
  children: (s) => /* @__PURE__ */ o(m, {
180
180
  color: "secondary",
181
181
  truncate: !0,
@@ -183,7 +183,7 @@ function Z({
183
183
  children: s
184
184
  })
185
185
  }), /* @__PURE__ */ o(g, {
186
- when: r,
186
+ when: n,
187
187
  children: (s) => /* @__PURE__ */ o(m, {
188
188
  color: "danger",
189
189
  variant: "xs",
@@ -192,15 +192,15 @@ function Z({
192
192
  })]
193
193
  })]
194
194
  });
195
- return /* @__PURE__ */ o(_, {
196
- "aria-busy": n || void 0,
197
- className: V.tool,
195
+ return /* @__PURE__ */ o(D, {
196
+ "aria-busy": r || void 0,
197
+ className: z.tool,
198
198
  collapsible: !1,
199
199
  "data-slot": "agent-tool",
200
200
  children: /* @__PURE__ */ o(g, {
201
201
  when: c,
202
202
  fallback: u,
203
- children: (s) => /* @__PURE__ */ o(B, {
203
+ children: (s) => /* @__PURE__ */ o(G, {
204
204
  "aria-label": t ? `${l}. ${t}` : l,
205
205
  className: h.hit,
206
206
  onPress: s,
@@ -209,37 +209,37 @@ function Z({
209
209
  })
210
210
  });
211
211
  }
212
- const Te = U(({
212
+ const Ce = U(({
213
213
  part: e
214
214
  }) => {
215
- const t = O(), {
216
- onOpenSubagent: r
217
- } = M(), n = t?.getToolMeta?.(e.toolCallId)?.patch, a = n?.needsUser === !0, {
215
+ const t = j(), {
216
+ onOpenSubagent: n
217
+ } = O(), r = t?.getToolMeta?.(e.toolCallId)?.patch, a = r?.needsUser === !0, {
218
218
  live: c,
219
219
  stalled: l
220
- } = D(e.state, a);
221
- if (!N(e) || F(e) !== "Agent")
220
+ } = V(e.state, a);
221
+ if (!B(e) || F(e) !== "Agent")
222
222
  return null;
223
- const u = j(e), s = e.state === "output-available" ? q(e.output) : void 0, f = u.useFailureLabel || !!s, v = R(e), A = p(v), y = H(v), L = Q(n), P = X({
223
+ const u = W(e), s = e.state === "output-available" ? H(e.output) : void 0, f = u.useFailureLabel || !!s, v = R(e), A = p(v), L = e.state === "output-available" && !!e.output?.jobId, b = J(v, L), P = X(r), $ = Z({
224
224
  live: c,
225
225
  failed: f,
226
226
  stalled: l,
227
227
  needsUser: a,
228
- activity: L
229
- }), b = i(e.output?.childThreadId) ?? i(n?.childThreadId), E = !!(b && r && !f), $ = s ?? u.problemText ?? u.tooltip;
230
- return /* @__PURE__ */ o(Z, {
231
- activity: P,
232
- errorText: $,
233
- onOpen: E ? () => r?.(b, A) : void 0,
228
+ activity: P
229
+ }), y = i(e.output?.childThreadId) ?? i(r?.childThreadId), k = !!(y && n && !f), E = s ?? u.problemText ?? u.tooltip;
230
+ return /* @__PURE__ */ o(ee, {
231
+ activity: $,
232
+ errorText: E,
233
+ onOpen: k ? () => n?.(y, A) : void 0,
234
234
  running: c && !f && !l,
235
235
  stalled: l,
236
- title: c && !f && !l ? y.live : y.done
236
+ title: c && !f && !l ? b.live : b.done
237
237
  });
238
238
  });
239
239
  export {
240
- Te as AgentTool,
241
- X as agentStatusLine,
242
- Q as subagentActivityLabel,
243
- be as subagentComposerCopy
240
+ Ce as AgentTool,
241
+ Z as agentStatusLine,
242
+ X as subagentActivityLabel,
243
+ Te as subagentComposerCopy
244
244
  };
245
245
  //# sourceMappingURL=AgentTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AgentTool.js","sources":["../../../../src/chat/Tool/agent/AgentTool.tsx"],"sourcesContent":["import { Message } from '@reforma/icons/14';\nimport { ProgressLoader } from '@reforma/icons/assets';\nimport { basename, humanizeString, plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from 'ai';\nimport { observer } from 'mobx-react-lite';\n\nimport { Box } from '../../../Box';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { useMessageTurn } from '../../Message/turn/messageTurnContext';\nimport { getToolFailureRowState, TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport { ToolShellCard } from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport styles from './AgentTool.module.css';\n\nimport type { AgentToolInput, AgentToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\n/** User-facing labels for known subagent ids (fallback: capitalized id). */\nconst SUBAGENT_LABELS: Record<string, string> = {\n research: 'Explore',\n shell: 'Shell',\n verify: 'Verify',\n plan: 'Plan',\n};\n\nconst SUBAGENT_LIVE: Record<string, string> = {\n research: 'Exploring',\n shell: 'Running',\n verify: 'Verifying',\n plan: 'Planning',\n};\n\nfunction agentErrorFromOutput(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as AgentToolOutput).error;\n\n return (typeof error === 'string' && error.trim().length > 0) ? error.trim() : undefined;\n}\n\nfunction agentNameFromPart(part: { input?: unknown; output?: unknown }): string | undefined {\n for (const source of [part.output, part.input]) {\n if (source == null || typeof source !== 'object') {\n continue;\n }\n\n const name = (source as AgentToolInput | AgentToolOutput).name;\n\n if (typeof name === 'string' && name.trim().length > 0) {\n return name.trim();\n }\n }\n\n return undefined;\n}\n\nfunction subagentLabel(name: string | undefined): string {\n const id = name?.trim() || 'research';\n const mapped = SUBAGENT_LABELS[id];\n\n if (mapped) {\n return mapped;\n }\n\n return id.charAt(0).toUpperCase() + id.slice(1);\n}\n\nfunction agentPhaseCopy(name: string | undefined): { live: string; done: string } {\n const id = name?.trim() || 'research';\n const label = subagentLabel(name);\n\n return {\n live: SUBAGENT_LIVE[id] ?? `Running ${ label }`,\n done: `Ran ${ label } agent`,\n };\n}\n\nfunction fieldString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction fileLabel(input: Record<string, unknown>): string | undefined {\n const path = fieldString(input.path);\n\n if (path) {\n return basename(path);\n }\n\n if (!Array.isArray(input.paths)) {\n return undefined;\n }\n\n const files = input.paths.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n\n if (files.length === 1) {\n return basename(files[0]);\n }\n\n if (files.length > 1) {\n return plural(files.length, 'file', 'files');\n }\n\n return undefined;\n}\n\nfunction fileActivity(verb: string, fallback: string) {\n return (input: Record<string, unknown>) => `${ verb } ${ fileLabel(input) ?? fallback }`;\n}\n\nconst TOOL_ACTIVITY: Record<string, (input: Record<string, unknown>) => string | undefined> = {\n Read: fileActivity('Reading', 'file'),\n Write: fileActivity('Writing', 'file'),\n Edit: fileActivity('Editing', 'file'),\n ListDirectory: fileActivity('Listing', 'files'),\n CreateDirectory: fileActivity('Creating', 'folder'),\n MoveFile: fileActivity('Moving', 'file'),\n RemoveFile: fileActivity('Removing', 'file'),\n Grep: input => `Grepping ${ fieldString(input.pattern) ?? 'code' }`,\n Glob: input => `Finding ${ fieldString(input.glob) ?? 'files' }`,\n GetBackgroundResult: () => 'Background task',\n Bash: (input) => {\n const command = fieldString(input.command);\n\n return command ? `Running ${ command }` : 'Running command';\n },\n Fetch: input => `Fetching ${ fieldString(input.url) ?? 'page' }`,\n Skill: input => `Loading ${ fieldString(input.name) ?? 'skill' }`,\n GetMcpResources: (input) => {\n const uri = fieldString(input.uri);\n\n if (uri) {\n const tail = uri.replace(/\\/+$/, '').split('/').pop()?.trim();\n\n return `Reading ${ tail || uri }`;\n }\n\n return 'Listing MCP resources';\n },\n Preamble: input => fieldString(input.content),\n ReadLints: () => 'Checking lints',\n PageScreenshot: () => 'Capturing screenshot',\n CheckPage: () => 'Checking pages',\n DevServerStatus: () => 'Checking project',\n ImportAsset: () => 'Importing asset',\n CreatePlan: () => 'Creating plan',\n EditPlan: () => 'Editing plan',\n ReadPlan: () => 'Reading plan',\n};\n\n/** One composer strip: who is running, and the child thread Show opens. */\nexport function subagentComposerCopy(\n part: { input?: unknown; output?: unknown },\n patch: Record<string, unknown> | undefined\n): { text: string; label: string; childThreadId?: string; waiting: boolean } {\n const name = agentNameFromPart(part);\n const label = subagentLabel(name);\n const waiting = patch?.needsUser === true;\n const childThreadId = fieldString((part.output as AgentToolOutput | undefined)?.childThreadId)\n ?? fieldString(patch?.childThreadId);\n const text = waiting\n ? `${ label } · Waiting for you`\n : `${ label } Agent working`;\n\n return { text, label, childThreadId, waiting };\n}\n\n/** Live subtitle for a tool — same copy for Agent rows and the compact rail task. */\nexport function subagentActivityLabel(patch: Record<string, unknown> | undefined): string | undefined {\n if (!patch) {\n return undefined;\n }\n\n if (patch.type === 'text') {\n return 'Finishing reply';\n }\n\n if (patch.type === 'reasoning') {\n return 'Thinking…';\n }\n\n const toolName = fieldString(patch.toolName);\n\n if (!toolName) {\n return undefined;\n }\n\n const rawInput = patch.input;\n const input = (rawInput != null && typeof rawInput === 'object' && !Array.isArray(rawInput))\n ? rawInput as Record<string, unknown>\n : {};\n\n return TOOL_ACTIVITY[toolName]?.(input)\n ?? `Using ${ fieldString(patch.title) ?? humanizeString(toolName) }`;\n}\n\n/** Live/waiting subtitle. Done rows stay quiet — no empty \"Completed\". */\nexport function agentStatusLine(input: {\n live: boolean;\n failed: boolean;\n stalled?: boolean;\n needsUser?: boolean;\n activity?: string;\n}): string | undefined {\n if (input.failed || input.stalled) {\n return undefined;\n }\n\n if (input.needsUser) {\n return 'Waiting for you';\n }\n\n if (!input.live) {\n return undefined;\n }\n\n return input.activity ?? 'Starting…';\n}\n\n/** Subagent card. Running: loader, shimmer title, gray activity. Finished: same frame, quiet title. */\nfunction AgentCard({\n title,\n activity,\n errorText,\n running,\n stalled,\n onOpen,\n}: {\n title: string;\n activity?: string;\n errorText?: string;\n running: boolean;\n stalled: boolean;\n onOpen?: () => void;\n}) {\n const heading = stalled ? TOOL_INTERRUPTED_MESSAGE : title;\n const copy = (\n <Box align=\"center\" direction=\"row\" fullWidth gap=\"md\" padding=\"md\">\n <Show\n when={ running }\n fallback={ <Message aria-hidden /> }\n >\n <ProgressLoader aria-hidden size={ 14 } />\n </Show>\n <Box gap=\"xxs\" grow>\n <Show\n when={ running }\n fallback={ (\n <Text className={ styles.title } color={ stalled ? 'danger' : undefined }>\n { heading }\n </Text>\n ) }\n >\n <Shimmer as=\"span\" className={ styles.title } duration={ 1 }>\n { heading }\n </Shimmer>\n </Show>\n <Show when={ running ? activity : undefined }>\n { line => (\n <Text color=\"secondary\" truncate variant=\"sm\">\n { line }\n </Text>\n ) }\n </Show>\n <Show when={ errorText }>\n { line => (\n <Text color=\"danger\" variant=\"xs\">{ line }</Text>\n ) }\n </Show>\n </Box>\n </Box>\n );\n\n return (\n <ToolShellCard\n aria-busy={ running || undefined }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"agent-tool\"\n >\n <Show\n when={ onOpen }\n fallback={ copy }\n >\n { open => (\n <Pressable\n aria-label={ activity ? `${ heading }. ${ activity }` : heading }\n className={ styles.hit }\n onPress={ open }\n >\n { copy }\n </Pressable>\n ) }\n </Show>\n </ToolShellCard>\n );\n}\n\n/** Agent subagent card. Opens the child thread. */\nexport const AgentTool = observer(({ part }: ToolRendererProps) => {\n const turn = useMessageTurn();\n const { onOpenSubagent } = useChat();\n const patch = turn?.getToolMeta?.(part.toolCallId)?.patch;\n const needsUser = patch?.needsUser === true;\n const { live, stalled } = useToolProgress(part.state, needsUser);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'Agent') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available'\n ? agentErrorFromOutput(part.output)\n : undefined;\n const failed = failure.useFailureLabel || Boolean(logicalError);\n const agentName = agentNameFromPart(part);\n const label = subagentLabel(agentName);\n const phase = agentPhaseCopy(agentName);\n const activity = subagentActivityLabel(patch);\n const statusLine = agentStatusLine({\n live,\n failed,\n stalled,\n needsUser,\n activity,\n });\n const childThreadId = fieldString((part.output as AgentToolOutput | undefined)?.childThreadId)\n ?? fieldString(patch?.childThreadId);\n const canOpen = Boolean(childThreadId && onOpenSubagent && !failed);\n const errorText = logicalError ?? failure.problemText ?? failure.tooltip;\n const openChild = canOpen\n ? () => onOpenSubagent?.(childThreadId!, label)\n : undefined;\n\n return (\n <AgentCard\n activity={ statusLine }\n errorText={ errorText }\n onOpen={ openChild }\n running={ live && !failed && !stalled }\n stalled={ stalled }\n title={ live && !failed && !stalled ? phase.live : phase.done }\n />\n );\n});\n"],"names":["SUBAGENT_LABELS","SUBAGENT_LIVE","agentErrorFromOutput","output","error","agentNameFromPart","part","source","name","subagentLabel","id","mapped","agentPhaseCopy","label","fieldString","value","trimmed","fileLabel","input","path","basename","files","item","plural","fileActivity","verb","fallback","TOOL_ACTIVITY","command","uri","subagentComposerCopy","patch","waiting","childThreadId","subagentActivityLabel","toolName","rawInput","humanizeString","agentStatusLine","AgentCard","title","activity","errorText","running","stalled","onOpen","heading","TOOL_INTERRUPTED_MESSAGE","copy","Box","_jsx","Show","Message","ProgressLoader","_jsxs","Text","styles","Shimmer","line","ToolShellCard","shellStyles","open","Pressable","AgentTool","observer","turn","useMessageTurn","onOpenSubagent","useChat","needsUser","live","useToolProgress","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","failed","agentName","phase","statusLine","canOpen"],"mappings":"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"}
1
+ {"version":3,"file":"AgentTool.js","sources":["../../../../src/chat/Tool/agent/AgentTool.tsx"],"sourcesContent":["import { Message } from '@reforma/icons/14';\nimport { ProgressLoader } from '@reforma/icons/assets';\nimport { basename, humanizeString, plural } from '@reforma/lib';\nimport { getToolName, isToolUIPart } from '@reforma/types';\nimport { observer } from 'mobx-react-lite';\n\nimport { Box } from '../../../Box';\nimport { Pressable } from '../../../Pressable';\nimport { Shimmer } from '../../../Shimmer';\nimport { Show } from '../../../Show';\nimport { Text } from '../../../Text';\nimport { useChat } from '../../ChatContext';\nimport { useMessageTurn } from '../../Message/turn/messageTurnContext';\nimport { getToolFailureRowState, TOOL_INTERRUPTED_MESSAGE } from '../helpers';\nimport { ToolShellCard } from '../shell';\nimport { useToolProgress } from '../shell/toolProgress';\nimport shellStyles from '../shell/ToolShellCard.module.css';\nimport styles from './AgentTool.module.css';\n\nimport type { AgentToolInput, AgentToolOutput } from '@reforma/types/sandbox';\nimport type { ToolRendererProps } from '../types';\n\n/** User-facing labels for known subagent ids (fallback: capitalized id). */\nconst SUBAGENT_LABELS: Record<string, string> = {\n research: 'Explore',\n shell: 'Shell',\n verify: 'Verify',\n plan: 'Plan',\n};\n\nconst SUBAGENT_LIVE: Record<string, string> = {\n research: 'Exploring',\n shell: 'Running',\n verify: 'Verifying',\n plan: 'Planning',\n};\n\nfunction agentErrorFromOutput(output: unknown): string | undefined {\n if (output == null || typeof output !== 'object') {\n return undefined;\n }\n\n const error = (output as AgentToolOutput).error;\n\n return (typeof error === 'string' && error.trim().length > 0) ? error.trim() : undefined;\n}\n\nfunction agentNameFromPart(part: { input?: unknown; output?: unknown }): string | undefined {\n for (const source of [part.output, part.input]) {\n if (source == null || typeof source !== 'object') {\n continue;\n }\n\n const name = (source as AgentToolInput | AgentToolOutput).name;\n\n if (typeof name === 'string' && name.trim().length > 0) {\n return name.trim();\n }\n }\n\n return undefined;\n}\n\nfunction subagentLabel(name: string | undefined): string {\n const id = name?.trim() || 'research';\n const mapped = SUBAGENT_LABELS[id];\n\n if (mapped) {\n return mapped;\n }\n\n return id.charAt(0).toUpperCase() + id.slice(1);\n}\n\nfunction agentPhaseCopy(name: string | undefined, background: boolean): { live: string; done: string } {\n const id = name?.trim() || 'research';\n const label = subagentLabel(name);\n\n return {\n live: SUBAGENT_LIVE[id] ?? `Running ${ label }`,\n done: background ? `Started ${ label } agent in background` : `Ran ${ label } agent`,\n };\n}\n\nfunction fieldString(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const trimmed = value.trim();\n\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction fileLabel(input: Record<string, unknown>): string | undefined {\n const path = fieldString(input.path);\n\n if (path) {\n return basename(path);\n }\n\n if (!Array.isArray(input.paths)) {\n return undefined;\n }\n\n const files = input.paths.filter((item): item is string => typeof item === 'string' && item.trim().length > 0);\n\n if (files.length === 1) {\n return basename(files[0]);\n }\n\n if (files.length > 1) {\n return plural(files.length, 'file', 'files');\n }\n\n return undefined;\n}\n\nfunction fileActivity(verb: string, fallback: string) {\n return (input: Record<string, unknown>) => `${ verb } ${ fileLabel(input) ?? fallback }`;\n}\n\nconst TOOL_ACTIVITY: Record<string, (input: Record<string, unknown>) => string | undefined> = {\n Read: fileActivity('Reading', 'file'),\n Write: fileActivity('Writing', 'file'),\n Edit: fileActivity('Editing', 'file'),\n ListDirectory: fileActivity('Listing', 'files'),\n CreateDirectory: fileActivity('Creating', 'folder'),\n MoveFile: fileActivity('Moving', 'file'),\n RemoveFile: fileActivity('Removing', 'file'),\n Grep: input => `Grepping ${ fieldString(input.pattern) ?? 'code' }`,\n Glob: input => `Finding ${ fieldString(input.glob) ?? 'files' }`,\n GetBackgroundResult: () => 'Background task',\n Bash: (input) => {\n const command = fieldString(input.command);\n\n return command ? `Running ${ command }` : 'Running command';\n },\n Fetch: input => `Fetching ${ fieldString(input.url) ?? 'page' }`,\n Skill: input => `Loading ${ fieldString(input.name) ?? 'skill' }`,\n GetMcpResources: (input) => {\n const uri = fieldString(input.uri);\n\n if (uri) {\n const tail = uri.replace(/\\/+$/, '').split('/').pop()?.trim();\n\n return `Reading ${ tail || uri }`;\n }\n\n return 'Listing MCP resources';\n },\n Preamble: input => fieldString(input.content),\n ReadLints: () => 'Checking lints',\n PageScreenshot: () => 'Capturing screenshot',\n CheckPage: () => 'Checking pages',\n DevServerStatus: () => 'Checking project',\n ImportAsset: () => 'Importing asset',\n CreatePlan: () => 'Creating plan',\n EditPlan: () => 'Editing plan',\n ReadPlan: () => 'Reading plan',\n};\n\n/** One composer strip: who is running, and the child thread Show opens. */\nexport function subagentComposerCopy(\n part: { input?: unknown; output?: unknown },\n patch: Record<string, unknown> | undefined\n): { text: string; label: string; childThreadId?: string; waiting: boolean } {\n const name = agentNameFromPart(part);\n const label = subagentLabel(name);\n const waiting = patch?.needsUser === true;\n const childThreadId = fieldString((part.output as AgentToolOutput | undefined)?.childThreadId)\n ?? fieldString(patch?.childThreadId);\n const text = waiting\n ? `${ label } · Waiting for you`\n : `${ label } Agent working`;\n\n return { text, label, childThreadId, waiting };\n}\n\n/** Live subtitle for a tool — same copy for Agent rows and the compact rail task. */\nexport function subagentActivityLabel(patch: Record<string, unknown> | undefined): string | undefined {\n if (!patch) {\n return undefined;\n }\n\n if (patch.type === 'text') {\n return 'Finishing reply';\n }\n\n if (patch.type === 'reasoning') {\n return 'Thinking…';\n }\n\n const toolName = fieldString(patch.toolName);\n\n if (!toolName) {\n return undefined;\n }\n\n const rawInput = patch.input;\n const input = (rawInput != null && typeof rawInput === 'object' && !Array.isArray(rawInput))\n ? rawInput as Record<string, unknown>\n : {};\n\n return TOOL_ACTIVITY[toolName]?.(input)\n ?? `Using ${ fieldString(patch.title) ?? humanizeString(toolName) }`;\n}\n\n/** Live/waiting subtitle. Done rows stay quiet — no empty \"Completed\". */\nexport function agentStatusLine(input: {\n live: boolean;\n failed: boolean;\n stalled?: boolean;\n needsUser?: boolean;\n activity?: string;\n}): string | undefined {\n if (input.failed || input.stalled) {\n return undefined;\n }\n\n if (input.needsUser) {\n return 'Waiting for you';\n }\n\n if (!input.live) {\n return undefined;\n }\n\n return input.activity ?? 'Starting…';\n}\n\n/** Subagent card. Running: loader, shimmer title, gray activity. Finished: same frame, quiet title. */\nfunction AgentCard({\n title,\n activity,\n errorText,\n running,\n stalled,\n onOpen,\n}: {\n title: string;\n activity?: string;\n errorText?: string;\n running: boolean;\n stalled: boolean;\n onOpen?: () => void;\n}) {\n const heading = stalled ? TOOL_INTERRUPTED_MESSAGE : title;\n const copy = (\n <Box align=\"center\" direction=\"row\" fullWidth gap=\"md\" padding=\"md\">\n <Show\n when={ running }\n fallback={ <Message aria-hidden /> }\n >\n <ProgressLoader aria-hidden size={ 14 } />\n </Show>\n <Box gap=\"xxs\" grow>\n <Show\n when={ running }\n fallback={ (\n <Text className={ styles.title } color={ stalled ? 'danger' : undefined }>\n { heading }\n </Text>\n ) }\n >\n <Shimmer as=\"span\" className={ styles.title } duration={ 1 }>\n { heading }\n </Shimmer>\n </Show>\n <Show when={ running ? activity : undefined }>\n { line => (\n <Text color=\"secondary\" truncate variant=\"sm\">\n { line }\n </Text>\n ) }\n </Show>\n <Show when={ errorText }>\n { line => (\n <Text color=\"danger\" variant=\"xs\">{ line }</Text>\n ) }\n </Show>\n </Box>\n </Box>\n );\n\n return (\n <ToolShellCard\n aria-busy={ running || undefined }\n className={ shellStyles.tool }\n collapsible={ false }\n data-slot=\"agent-tool\"\n >\n <Show\n when={ onOpen }\n fallback={ copy }\n >\n { open => (\n <Pressable\n aria-label={ activity ? `${ heading }. ${ activity }` : heading }\n className={ styles.hit }\n onPress={ open }\n >\n { copy }\n </Pressable>\n ) }\n </Show>\n </ToolShellCard>\n );\n}\n\n/** Agent subagent card. Opens the child thread. */\nexport const AgentTool = observer(({ part }: ToolRendererProps) => {\n const turn = useMessageTurn();\n const { onOpenSubagent } = useChat();\n const patch = turn?.getToolMeta?.(part.toolCallId)?.patch;\n const needsUser = patch?.needsUser === true;\n const { live, stalled } = useToolProgress(part.state, needsUser);\n\n if (!isToolUIPart(part) || getToolName(part) !== 'Agent') {\n return null;\n }\n\n const failure = getToolFailureRowState(part);\n const logicalError = part.state === 'output-available'\n ? agentErrorFromOutput(part.output)\n : undefined;\n const failed = failure.useFailureLabel || Boolean(logicalError);\n const agentName = agentNameFromPart(part);\n const label = subagentLabel(agentName);\n const background = part.state === 'output-available' && Boolean((part.output as AgentToolOutput | undefined)?.jobId);\n const phase = agentPhaseCopy(agentName, background);\n const activity = subagentActivityLabel(patch);\n const statusLine = agentStatusLine({\n live,\n failed,\n stalled,\n needsUser,\n activity,\n });\n const childThreadId = fieldString((part.output as AgentToolOutput | undefined)?.childThreadId)\n ?? fieldString(patch?.childThreadId);\n const canOpen = Boolean(childThreadId && onOpenSubagent && !failed);\n const errorText = logicalError ?? failure.problemText ?? failure.tooltip;\n const openChild = canOpen\n ? () => onOpenSubagent?.(childThreadId!, label)\n : undefined;\n\n return (\n <AgentCard\n activity={ statusLine }\n errorText={ errorText }\n onOpen={ openChild }\n running={ live && !failed && !stalled }\n stalled={ stalled }\n title={ live && !failed && !stalled ? phase.live : phase.done }\n />\n );\n});\n"],"names":["SUBAGENT_LABELS","SUBAGENT_LIVE","agentErrorFromOutput","output","error","agentNameFromPart","part","source","name","subagentLabel","id","mapped","agentPhaseCopy","background","label","fieldString","value","trimmed","fileLabel","input","path","basename","files","item","plural","fileActivity","verb","fallback","TOOL_ACTIVITY","command","uri","subagentComposerCopy","patch","waiting","childThreadId","subagentActivityLabel","toolName","rawInput","humanizeString","agentStatusLine","AgentCard","title","activity","errorText","running","stalled","onOpen","heading","TOOL_INTERRUPTED_MESSAGE","copy","Box","_jsx","Show","Message","ProgressLoader","_jsxs","Text","styles","Shimmer","line","ToolShellCard","shellStyles","open","Pressable","AgentTool","observer","turn","useMessageTurn","onOpenSubagent","useChat","needsUser","live","useToolProgress","isToolUIPart","getToolName","failure","getToolFailureRowState","logicalError","failed","agentName","phase","statusLine","canOpen"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BashTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqKlD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,sCAkFhD"}
1
+ {"version":3,"file":"BashTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqKlD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,sCAkFhD"}
@@ -1,5 +1,5 @@
1
1
  import { Completed as k, Oclock as x, Terminal as y } from "@reforma/icons/14";
2
- import { isStaticToolUIPart as S, getToolName as w } from "ai";
2
+ import { isStaticToolUIPart as S, getToolName as w } from "@reforma/types";
3
3
  import { useMemo as l } from "react";
4
4
  import { Show as T } from "../../../Show/Show.js";
5
5
  import { TerminalContent as C } from "../../../Terminal/Terminal.js";