@agent-native/core 0.55.0 → 0.56.1

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 (106) hide show
  1. package/README.md +7 -7
  2. package/dist/action-ui.d.ts +17 -0
  3. package/dist/action-ui.d.ts.map +1 -0
  4. package/dist/action-ui.js +23 -0
  5. package/dist/action-ui.js.map +1 -0
  6. package/dist/action.d.ts +8 -1
  7. package/dist/action.d.ts.map +1 -1
  8. package/dist/action.js +3 -0
  9. package/dist/action.js.map +1 -1
  10. package/dist/agent/production-agent.d.ts +2 -0
  11. package/dist/agent/production-agent.d.ts.map +1 -1
  12. package/dist/agent/production-agent.js +7 -1
  13. package/dist/agent/production-agent.js.map +1 -1
  14. package/dist/agent/thread-data-builder.d.ts +4 -0
  15. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  16. package/dist/agent/thread-data-builder.js +4 -0
  17. package/dist/agent/thread-data-builder.js.map +1 -1
  18. package/dist/agent/types.d.ts +2 -0
  19. package/dist/agent/types.d.ts.map +1 -1
  20. package/dist/agent/types.js.map +1 -1
  21. package/dist/client/AssistantChat.d.ts.map +1 -1
  22. package/dist/client/AssistantChat.js +6 -4
  23. package/dist/client/AssistantChat.js.map +1 -1
  24. package/dist/client/chat/index.d.ts +5 -3
  25. package/dist/client/chat/index.d.ts.map +1 -1
  26. package/dist/client/chat/index.js +4 -3
  27. package/dist/client/chat/index.js.map +1 -1
  28. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  29. package/dist/client/chat/run-recovery.js +9 -5
  30. package/dist/client/chat/run-recovery.js.map +1 -1
  31. package/dist/client/chat/runtime.d.ts +354 -0
  32. package/dist/client/chat/runtime.d.ts.map +1 -0
  33. package/dist/client/chat/runtime.js +2 -0
  34. package/dist/client/chat/runtime.js.map +1 -0
  35. package/dist/client/chat/tool-call-display.d.ts +4 -1
  36. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  37. package/dist/client/chat/tool-call-display.js +6 -5
  38. package/dist/client/chat/tool-call-display.js.map +1 -1
  39. package/dist/client/chat/tool-render-registry.d.ts +11 -0
  40. package/dist/client/chat/tool-render-registry.d.ts.map +1 -1
  41. package/dist/client/chat/tool-render-registry.js +47 -1
  42. package/dist/client/chat/tool-render-registry.js.map +1 -1
  43. package/dist/client/chat/widgets/builtin-tool-renderers.js +73 -18
  44. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  45. package/dist/client/chat/widgets/data-widget-types.d.ts +1 -51
  46. package/dist/client/chat/widgets/data-widget-types.d.ts.map +1 -1
  47. package/dist/client/chat/widgets/data-widget-types.js +1 -92
  48. package/dist/client/chat/widgets/data-widget-types.js.map +1 -1
  49. package/dist/client/chat-view-transition.d.ts +12 -0
  50. package/dist/client/chat-view-transition.d.ts.map +1 -1
  51. package/dist/client/chat-view-transition.js +16 -0
  52. package/dist/client/chat-view-transition.js.map +1 -1
  53. package/dist/client/index.d.ts +5 -3
  54. package/dist/client/index.d.ts.map +1 -1
  55. package/dist/client/index.js +4 -3
  56. package/dist/client/index.js.map +1 -1
  57. package/dist/client/route-state.d.ts.map +1 -1
  58. package/dist/client/route-state.js +2 -15
  59. package/dist/client/route-state.js.map +1 -1
  60. package/dist/client/sse-event-processor.d.ts +3 -0
  61. package/dist/client/sse-event-processor.d.ts.map +1 -1
  62. package/dist/client/sse-event-processor.js +2 -0
  63. package/dist/client/sse-event-processor.js.map +1 -1
  64. package/dist/data-widgets/index.d.ts +326 -0
  65. package/dist/data-widgets/index.d.ts.map +1 -0
  66. package/dist/data-widgets/index.js +232 -0
  67. package/dist/data-widgets/index.js.map +1 -0
  68. package/dist/deploy/build.d.ts.map +1 -1
  69. package/dist/deploy/build.js +14 -0
  70. package/dist/deploy/build.js.map +1 -1
  71. package/dist/index.browser.d.ts +2 -0
  72. package/dist/index.browser.d.ts.map +1 -1
  73. package/dist/index.browser.js +2 -0
  74. package/dist/index.browser.js.map +1 -1
  75. package/dist/index.d.ts +2 -0
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +2 -0
  78. package/dist/index.js.map +1 -1
  79. package/dist/provider-api/corpus-jobs.d.ts +160 -0
  80. package/dist/provider-api/corpus-jobs.d.ts.map +1 -1
  81. package/dist/provider-api/corpus-jobs.js +44 -0
  82. package/dist/provider-api/corpus-jobs.js.map +1 -1
  83. package/dist/provider-api/index.d.ts +39 -0
  84. package/dist/provider-api/index.d.ts.map +1 -1
  85. package/dist/provider-api/index.js +53 -0
  86. package/dist/provider-api/index.js.map +1 -1
  87. package/dist/server/action-discovery.d.ts.map +1 -1
  88. package/dist/server/action-discovery.js +5 -0
  89. package/dist/server/action-discovery.js.map +1 -1
  90. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  91. package/dist/server/agent-chat-plugin.js +5 -0
  92. package/dist/server/agent-chat-plugin.js.map +1 -1
  93. package/dist/styles/agent-native.css +9 -2
  94. package/dist/vite/client.d.ts.map +1 -1
  95. package/dist/vite/client.js +1 -0
  96. package/dist/vite/client.js.map +1 -1
  97. package/docs/content/actions.md +52 -0
  98. package/docs/content/components.md +24 -1
  99. package/docs/content/drop-in-agent.md +9 -2
  100. package/docs/content/faq.md +5 -4
  101. package/docs/content/getting-started.md +39 -88
  102. package/docs/content/key-concepts.md +22 -22
  103. package/docs/content/mcp-apps.md +1 -1
  104. package/docs/content/native-chat-ui.md +210 -0
  105. package/docs/content/what-is-agent-native.md +2 -2
  106. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"tool-call-display.js","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: tool-payload formatting helpers, ToolCallDisplay, ToolCallFallback,\n// and ReconnectStreamMessage used by AssistantChat.\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport type { ToolCallMessagePartProps } from \"@assistant-ui/react\";\nimport type { AgentMcpAppPayload } from \"../../mcp-client/app-result.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport { humanizeToolName } from \"../tool-display.js\";\nimport {\n BashCell,\n EditCell,\n WriteCell,\n FilesChangedSummary,\n} from \"../tool-cells/index.js\";\nimport { AgentTaskCard } from \"../AgentTaskCard.js\";\nimport { ConnectBuilderCard } from \"../ConnectBuilderCard.js\";\nimport { McpAppRenderer } from \"../mcp-apps/McpAppRenderer.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport { cn } from \"../utils.js\";\nimport \"./widgets/builtin-tool-renderers.js\";\nimport { resolveToolRenderer } from \"./tool-render-registry.js\";\nimport {\n SmoothMarkdownText,\n HighlightedCodeBlock,\n markdownComponents,\n markdownModule,\n remarkGfmFn,\n markdownUrlTransform,\n} from \"./markdown-renderer.js\";\nimport {\n IconLoader2,\n IconCircleX,\n IconCheck,\n IconSquareFilled,\n IconChevronDown,\n IconCopy,\n IconSearch,\n IconArrowsMaximize,\n IconArrowsMinimize,\n IconShieldCheck,\n IconX,\n} from \"@tabler/icons-react\";\n\n// Exported so AssistantChatInner can provide a context value.\nexport const ChatRunningContext = React.createContext(false);\n\n/**\n * Human-in-the-loop approval bridge. `AssistantChatInner` provides a value that\n * re-issues the turn approving a specific paused tool call (opt-in\n * `needsApproval` actions). When null, the Approve button is not rendered.\n * Deny is handled locally in the affordance, so it needs no bridge.\n */\nexport type ApprovalContextValue = {\n /** Re-issue the turn so the server runs the approved call. */\n onApprove: (approvalKey: string) => void;\n};\nexport const ApprovalContext = React.createContext<ApprovalContextValue | null>(\n null,\n);\n\n// ─── Tool-payload formatting ──────────────────────────────────────────────────\n\ntype ToolDetailSection = \"input\" | \"result\";\nexport type ToolDetailPayload = {\n section: ToolDetailSection;\n title: string;\n text: string;\n copyText: string;\n lang: string;\n};\n\nfunction stringifyToolValue(value: unknown, pretty = false): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, pretty ? 2 : 0);\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction looksLikeSql(text: string): boolean {\n return /^\\s*(select|with|insert|update|delete|merge|create|alter|drop|explain|declare|begin)\\b/i.test(\n text,\n );\n}\n\nfunction parseJsonText(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\nfunction inferToolTextLanguage(\n text: string,\n key?: string,\n toolName?: string,\n): string {\n const keyName = (key ?? \"\").toLowerCase();\n const tool = (toolName ?? \"\").toLowerCase();\n if (\n keyName === \"sql\" ||\n keyName.endsWith(\"sql\") ||\n keyName === \"query\" ||\n tool.includes(\"bigquery\") ||\n tool.includes(\"db-query\") ||\n looksLikeSql(text)\n ) {\n return \"sql\";\n }\n return parseJsonText(text) ? \"json\" : \"text\";\n}\n\nfunction formatToolTextValue(\n value: unknown,\n key?: string,\n toolName?: string,\n): { text: string; lang: string } {\n if (typeof value === \"string\") {\n const parsed = parseJsonText(value);\n if (parsed) {\n return { text: JSON.stringify(parsed, null, 2), lang: \"json\" };\n }\n return {\n text: value,\n lang: inferToolTextLanguage(value, key, toolName),\n };\n }\n return { text: stringifyToolValue(value, true), lang: \"json\" };\n}\n\nexport function toolInputPayload(\n toolName: string,\n args: Record<string, unknown>,\n): ToolDetailPayload | null {\n const entries = Object.entries(args);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n const formatted = formatToolTextValue(value, key, toolName);\n const normalizedKey = key.toLowerCase();\n const keyLabel =\n normalizedKey === \"sql\" || normalizedKey.endsWith(\"sql\") ? \"SQL\" : key;\n return {\n section: \"input\",\n title: `Input - ${keyLabel}`,\n text: formatted.text,\n copyText:\n typeof value === \"string\" ? value : stringifyToolValue(value, true),\n lang: formatted.lang,\n };\n }\n return {\n section: \"input\",\n title: \"Input\",\n text: JSON.stringify(args, null, 2),\n copyText: JSON.stringify(args, null, 2),\n lang: \"json\",\n };\n}\n\nexport function toolResultPayload(\n result: string | undefined,\n): ToolDetailPayload | null {\n if (result === undefined) return null;\n const formatted = formatToolTextValue(result);\n return {\n section: \"result\",\n title: \"Result\",\n text: formatted.text,\n copyText: result,\n lang: formatted.lang,\n };\n}\n\n// ─── Search highlight helpers ─────────────────────────────────────────────────\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction countTextMatches(text: string, query: string): number {\n const needle = query.trim();\n if (!needle) return 0;\n return Array.from(text.matchAll(new RegExp(escapeRegExp(needle), \"gi\")))\n .length;\n}\n\nfunction renderHighlightedSearchText(\n text: string,\n query: string,\n): React.ReactNode {\n const needle = query.trim();\n if (!needle) return text;\n const regex = new RegExp(escapeRegExp(needle), \"gi\");\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text))) {\n if (match.index > lastIndex) {\n parts.push(text.slice(lastIndex, match.index));\n }\n parts.push(<mark key={`${match.index}-${match[0]}`}>{match[0]}</mark>);\n lastIndex = match.index + match[0].length;\n if (match[0].length === 0) regex.lastIndex += 1;\n }\n if (lastIndex < text.length) parts.push(text.slice(lastIndex));\n return parts;\n}\n\n// ─── ToolDetailViewer ──────────────────────────────────────────────────────────\n\nfunction ToolDetailViewer({ payload }: { payload: ToolDetailPayload }) {\n const [expanded, setExpanded] = useState(false);\n const [searchOpen, setSearchOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const matchCount = useMemo(\n () => countTextMatches(payload.text, search),\n [payload.text, search],\n );\n\n useEffect(() => {\n return () => {\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n };\n }, []);\n\n const copyValue = useCallback(async () => {\n try {\n if (await writeClipboardText(payload.copyText)) {\n setCopied(true);\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n copyResetRef.current = setTimeout(() => setCopied(false), 1200);\n }\n } catch {\n // Clipboard failures should not interrupt chat rendering.\n }\n }, [payload.copyText]);\n\n return (\n <div className=\"rounded-md border border-border/50 bg-background/60\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-2 border-b border-border/50 px-2.5 py-1.5\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-[11px] font-medium text-foreground/85\">\n {payload.title}\n </span>\n {payload.lang !== \"text\" && (\n <span className=\"shrink-0 rounded border border-border/60 px-1 py-0.5 font-mono text-[9px] uppercase leading-none text-muted-foreground\">\n {payload.lang}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => setSearchOpen((v) => !v)}\n aria-label={`Search ${payload.title.toLowerCase()}`}\n aria-pressed={searchOpen}\n className={cn(\n \"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\",\n searchOpen && \"bg-accent text-foreground\",\n )}\n >\n <IconSearch size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={expanded ? \"Shrink code viewer\" : \"Expand code viewer\"}\n aria-pressed={expanded}\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {expanded ? (\n <IconArrowsMinimize size={12} />\n ) : (\n <IconArrowsMaximize size={12} />\n )}\n </button>\n <button\n type=\"button\"\n onClick={copyValue}\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-1.5 font-sans text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {copied ? <IconCheck size={12} /> : <IconCopy size={12} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n {searchOpen && (\n <div className=\"flex items-center gap-2 border-b border-border/50 px-2.5 py-2\">\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Find\"\n className=\"h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none placeholder:text-muted-foreground focus:ring-1 focus:ring-ring\"\n />\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {search.trim() ? matchCount : \"\"}\n </span>\n </div>\n )}\n <div\n className={cn(\n \"agent-tool-code overflow-auto font-mono text-[11px] leading-relaxed text-foreground\",\n expanded ? \"max-h-[70vh]\" : \"max-h-72\",\n )}\n >\n {search.trim() ? (\n <pre>\n <code>{renderHighlightedSearchText(payload.text, search)}</code>\n </pre>\n ) : (\n <HighlightedCodeBlock code={payload.text} lang={payload.lang} />\n )}\n </div>\n </div>\n );\n}\n\n// ─── Human-in-the-loop approval affordance ────────────────────────────────────\n\n/**\n * Inline Approve/Deny prompt rendered when a `needsApproval` action paused the\n * turn. Approve re-issues the turn with the call's `approvalKey`; Deny dismisses\n * the prompt locally (the action stays un-run).\n */\nfunction ApprovalAffordance({\n toolName,\n approval,\n}: {\n toolName: string;\n approval: { approvalKey: string; dismissed?: boolean };\n}) {\n const ctx = React.useContext(ApprovalContext);\n const [approved, setApproved] = useState(false);\n const [denied, setDenied] = useState(false);\n\n // Once approved, the turn is re-issued; collapse to a quiet note so the user\n // can't double-fire the approval.\n if (approved) {\n return (\n <div className=\"mt-1.5 text-xs text-muted-foreground\">\n Approved. Re-running {toolName}...\n </div>\n );\n }\n // Deny is local-only: the action simply stays un-run.\n if (denied) {\n return (\n <div className=\"mt-1.5 text-xs text-muted-foreground\">\n Denied. {toolName} did not run.\n </div>\n );\n }\n return (\n <div className=\"mt-1.5 flex items-center gap-2 rounded-md border border-border bg-muted/40 px-2.5 py-1.5\">\n <IconShieldCheck className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"mr-auto text-xs text-muted-foreground\">\n Approve to run {toolName}?\n </span>\n {ctx && (\n <button\n type=\"button\"\n onClick={() => {\n setApproved(true);\n ctx.onApprove(approval.approvalKey);\n }}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n )}\n >\n <IconCheck className=\"h-3.5 w-3.5\" />\n Approve\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setDenied(true)}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium transition-colors\",\n \"text-foreground hover:bg-muted\",\n )}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n Deny\n </button>\n </div>\n );\n}\n\n// ─── ToolCallDisplay ──────────────────────────────────────────────────────────\n\nexport function ToolCallDisplay({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n isRunning,\n structuredMeta,\n approval,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n isRunning: boolean;\n structuredMeta?: Record<string, unknown>;\n approval?: { approvalKey: string; dismissed?: boolean };\n}) {\n // Delegate to bespoke cells when structured metadata is present.\n // These must be separate components so hook order in ToolCallDisplayGeneric\n // is always stable (no conditional hook calls).\n const toolKind = structuredMeta?.toolKind as string | undefined;\n if (toolKind === \"bash\") {\n return (\n <BashCell\n meta={\n structuredMeta as unknown as Parameters<typeof BashCell>[0][\"meta\"]\n }\n output={result}\n isRunning={isRunning}\n />\n );\n }\n if (toolKind === \"edit\") {\n return (\n <EditCell\n meta={\n structuredMeta as unknown as Parameters<typeof EditCell>[0][\"meta\"]\n }\n isRunning={isRunning}\n />\n );\n }\n if (toolKind === \"write\") {\n return (\n <WriteCell\n meta={\n structuredMeta as unknown as Parameters<typeof WriteCell>[0][\"meta\"]\n }\n isRunning={isRunning}\n />\n );\n }\n return (\n <ToolCallDisplayGeneric\n toolName={toolName}\n argsText={argsText}\n args={args}\n result={result}\n mcpApp={mcpApp}\n isRunning={isRunning}\n approval={approval}\n />\n );\n}\n\nfunction ToolCallDisplayGeneric({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n isRunning,\n approval,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n isRunning: boolean;\n approval?: { approvalKey: string; dismissed?: boolean };\n}) {\n const streamRef = useRef<HTMLDivElement>(null);\n\n const isAgentCall = toolName.startsWith(\"agent:\");\n const [expanded, setExpanded] = useState(isAgentCall);\n const agentName = isAgentCall ? toolName.slice(6) : null;\n const isAgentError = isAgentCall && result === \"Error calling agent\";\n const agentStreamText = isAgentCall ? (argsText ?? \"\") : \"\";\n const hasStreamText = agentStreamText.length > 0;\n const hasArgs = !isAgentCall && Object.keys(args).length > 0;\n\n // NOTE: All hooks must be above any conditional returns\n useEffect(() => {\n if (isAgentCall && isRunning && streamRef.current) {\n streamRef.current.scrollTop = streamRef.current.scrollHeight;\n }\n }, [agentStreamText, isAgentCall, isRunning]);\n\n // Render connect-builder as ConnectBuilderCard once the result is available\n if (toolName === \"connect-builder\" && result) {\n try {\n const parsed = JSON.parse(result);\n if (parsed?.kind === \"connect-builder-card\") {\n return (\n <ConnectBuilderCard\n configured={!!parsed.configured}\n builderEnabled={parsed.builderEnabled !== false}\n // Ignore saved cliAuthUrl values from older tool results. They\n // contain signed callback state and can expire while a chat sits\n // open; the card's hook fetches a fresh signed URL on mount/click.\n connectUrl={parsed.connectUrl || \"\"}\n orgName={parsed.orgName ?? null}\n prompt={typeof parsed.prompt === \"string\" ? parsed.prompt : \"\"}\n />\n );\n }\n } catch {\n // fall through to default pill rendering\n }\n }\n\n // Render agent-teams spawn as AgentTaskCard once the result is available\n if (\n toolName === \"agent-teams\" &&\n (args as Record<string, string>)?.action === \"spawn\" &&\n result\n ) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.taskId && parsed.threadId) {\n return (\n <AgentTaskCard\n taskId={parsed.taskId}\n threadId={parsed.threadId}\n description={\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"Sub-agent task\"\n }\n onOpen={(tid) => {\n window.dispatchEvent(\n new CustomEvent(\"agent-task-open\", {\n detail: {\n threadId: tid,\n description:\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"\",\n name: parsed.name || \"\",\n },\n }),\n );\n }}\n />\n );\n }\n } catch {\n // Fall through to default pill rendering\n }\n }\n\n const parsedResult = result ? parseJsonText(result) : null;\n const nativeToolContext = {\n toolName,\n args,\n resultText: result,\n resultJson: parsedResult,\n isRunning,\n };\n const NativeToolRenderer = isAgentCall\n ? null\n : resolveToolRenderer(nativeToolContext);\n if (NativeToolRenderer) {\n return <NativeToolRenderer context={nativeToolContext} />;\n }\n\n const inputPayload = hasArgs ? toolInputPayload(toolName, args) : null;\n const resultPayload = toolResultPayload(result);\n\n const displayName = isAgentCall\n ? isRunning\n ? `Asking ${agentName}...`\n : isAgentError\n ? `Error asking ${agentName}`\n : `Asked ${agentName}`\n : humanizeToolName(toolName);\n\n const canExpand = isAgentCall\n ? hasStreamText\n : hasArgs || result !== undefined;\n const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;\n\n return (\n <div className=\"my-1 overflow-hidden\">\n {mcpApp && <McpAppRenderer app={mcpApp} className=\"mb-1.5\" />}\n <button\n onClick={() => canExpand && setExpanded(!isExpanded)}\n aria-expanded={canExpand ? isExpanded : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden\",\n isRunning\n ? \"bg-muted text-muted-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-accent\",\n )}\n >\n <span className=\"shrink-0\">\n {isRunning ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : isAgentError ? (\n <IconCircleX className=\"h-3 w-3 text-destructive\" />\n ) : result !== undefined ? (\n <IconCheck className=\"h-3 w-3 text-emerald-500\" />\n ) : (\n <IconSquareFilled className=\"h-3 w-3 text-muted-foreground\" />\n )}\n </span>\n <span className=\"truncate min-w-0\">\n <span className=\"font-medium\">{displayName}</span>\n </span>\n {canExpand && (\n <IconChevronDown\n className={cn(\n \"ml-auto h-3 w-3 shrink-0 opacity-40\",\n isExpanded && \"rotate-180\",\n )}\n />\n )}\n </button>\n {isExpanded && isAgentCall && hasStreamText && (\n <div\n ref={streamRef}\n className=\"mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none\"\n >\n {markdownModule?.default && remarkGfmFn ? (\n <markdownModule.default\n remarkPlugins={[remarkGfmFn]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {agentStreamText}\n </markdownModule.default>\n ) : (\n <span style={{ whiteSpace: \"pre-wrap\" }}>{agentStreamText}</span>\n )}\n </div>\n )}\n {isExpanded && !isAgentCall && (hasArgs || result !== undefined) && (\n <div className=\"mt-1 space-y-2 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground\">\n {inputPayload && <ToolDetailViewer payload={inputPayload} />}\n {resultPayload && <ToolDetailViewer payload={resultPayload} />}\n </div>\n )}\n {approval && (\n <ApprovalAffordance toolName={toolName} approval={approval} />\n )}\n </div>\n );\n}\n\n// ─── ToolCallFallback ──────────────────────────────────────────────────────────\n\nexport function ToolCallFallback({\n toolName,\n args,\n argsText,\n result,\n ...rest\n}: ToolCallMessagePartProps & {\n mcpApp?: AgentMcpAppPayload;\n structuredMeta?: Record<string, unknown>;\n approval?: { approvalKey: string; dismissed?: boolean };\n}) {\n const chatRunning = React.useContext(ChatRunningContext);\n const isRunning = result === undefined && chatRunning;\n return (\n <ToolCallDisplay\n toolName={toolName}\n args={args as Record<string, unknown>}\n argsText={argsText}\n result={\n typeof result === \"string\"\n ? result\n : result !== undefined\n ? JSON.stringify(result)\n : undefined\n }\n mcpApp={rest.mcpApp}\n structuredMeta={rest.structuredMeta}\n isRunning={isRunning}\n approval={rest.approval}\n />\n );\n}\n\n// ─── ReconnectStreamMessage ────────────────────────────────────────────────────\n// Renders the agent's in-progress response during reconnection (outside\n// assistant-ui's runtime). Uses the same visual styling as normal messages.\n\nexport function ReconnectStreamMessage({\n content,\n}: {\n content: ContentPart[];\n}) {\n const chatRunning = React.useContext(ChatRunningContext);\n\n return (\n <div className=\"flex justify-start\">\n <div className=\"max-w-[95%] text-sm leading-relaxed text-foreground space-y-1\">\n {content.map((part, i) => {\n if (part.type === \"text\") {\n return (\n <SmoothMarkdownText\n key={`reconnect-text-${i}`}\n text={part.text}\n streaming={chatRunning}\n resetKey={`reconnect-text-${i}`}\n statusType={chatRunning ? \"running\" : \"complete\"}\n />\n );\n }\n if (part.type === \"tool-call\") {\n return (\n <ToolCallDisplay\n key={`reconnect-tool-${i}`}\n toolName={part.toolName}\n argsText={part.argsText}\n args={part.args}\n result={part.result}\n mcpApp={part.mcpApp}\n structuredMeta={part.structuredMeta}\n isRunning={part.result === undefined && chatRunning}\n approval={part.approval}\n />\n );\n }\n return null;\n })}\n </div>\n </div>\n );\n}\n\n// ─── Re-export for AssistantMessage ───────────────────────────────────────────\n// AssistantMessage in AssistantChat.tsx uses FilesChangedSummary directly, so\n// re-export it so AssistantChat.tsx can import from one place.\nexport { FilesChangedSummary };\n"]}
1
+ {"version":3,"file":"tool-call-display.js","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: tool-payload formatting helpers, ToolCallDisplay, ToolCallFallback,\n// and ReconnectStreamMessage used by AssistantChat.\n\nimport React, {\n useState,\n useEffect,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport type { ToolCallMessagePartProps } from \"@assistant-ui/react\";\nimport type { ActionChatUIConfig } from \"../../action-ui.js\";\nimport type { AgentMcpAppPayload } from \"../../mcp-client/app-result.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport { humanizeToolName } from \"../tool-display.js\";\nimport {\n BashCell,\n EditCell,\n WriteCell,\n FilesChangedSummary,\n} from \"../tool-cells/index.js\";\nimport { AgentTaskCard } from \"../AgentTaskCard.js\";\nimport { ConnectBuilderCard } from \"../ConnectBuilderCard.js\";\nimport { McpAppRenderer } from \"../mcp-apps/McpAppRenderer.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport { cn } from \"../utils.js\";\nimport \"./widgets/builtin-tool-renderers.js\";\nimport { resolveToolRenderer } from \"./tool-render-registry.js\";\nimport {\n SmoothMarkdownText,\n HighlightedCodeBlock,\n markdownComponents,\n markdownModule,\n remarkGfmFn,\n markdownUrlTransform,\n} from \"./markdown-renderer.js\";\nimport {\n IconLoader2,\n IconCircleX,\n IconCheck,\n IconSquareFilled,\n IconChevronDown,\n IconCopy,\n IconSearch,\n IconArrowsMaximize,\n IconArrowsMinimize,\n IconShieldCheck,\n IconX,\n} from \"@tabler/icons-react\";\n\n// Exported so AssistantChatInner can provide a context value.\nexport const ChatRunningContext = React.createContext(false);\n\n/**\n * Human-in-the-loop approval bridge. `AssistantChatInner` provides a value that\n * re-issues the turn approving a specific paused tool call (opt-in\n * `needsApproval` actions). When null, the Approve button is not rendered.\n * Deny is handled locally in the affordance, so it needs no bridge.\n */\nexport type ApprovalContextValue = {\n /** Re-issue the turn so the server runs the approved call. */\n onApprove: (approvalKey: string) => void;\n};\nexport const ApprovalContext = React.createContext<ApprovalContextValue | null>(\n null,\n);\n\n// ─── Tool-payload formatting ──────────────────────────────────────────────────\n\ntype ToolDetailSection = \"input\" | \"result\";\nexport type ToolDetailPayload = {\n section: ToolDetailSection;\n title: string;\n text: string;\n copyText: string;\n lang: string;\n};\n\nfunction stringifyToolValue(value: unknown, pretty = false): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, pretty ? 2 : 0);\n } catch {\n return String(value ?? \"\");\n }\n}\n\nfunction looksLikeSql(text: string): boolean {\n return /^\\s*(select|with|insert|update|delete|merge|create|alter|drop|explain|declare|begin)\\b/i.test(\n text,\n );\n}\n\nfunction parseJsonText(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed || !/^[{[]/.test(trimmed)) return null;\n try {\n return JSON.parse(trimmed);\n } catch {\n return null;\n }\n}\n\nfunction inferToolTextLanguage(\n text: string,\n key?: string,\n toolName?: string,\n): string {\n const keyName = (key ?? \"\").toLowerCase();\n const tool = (toolName ?? \"\").toLowerCase();\n if (\n keyName === \"sql\" ||\n keyName.endsWith(\"sql\") ||\n keyName === \"query\" ||\n tool.includes(\"bigquery\") ||\n tool.includes(\"db-query\") ||\n looksLikeSql(text)\n ) {\n return \"sql\";\n }\n return parseJsonText(text) ? \"json\" : \"text\";\n}\n\nfunction formatToolTextValue(\n value: unknown,\n key?: string,\n toolName?: string,\n): { text: string; lang: string } {\n if (typeof value === \"string\") {\n const parsed = parseJsonText(value);\n if (parsed) {\n return { text: JSON.stringify(parsed, null, 2), lang: \"json\" };\n }\n return {\n text: value,\n lang: inferToolTextLanguage(value, key, toolName),\n };\n }\n return { text: stringifyToolValue(value, true), lang: \"json\" };\n}\n\nexport function toolInputPayload(\n toolName: string,\n args: Record<string, unknown>,\n): ToolDetailPayload | null {\n const entries = Object.entries(args);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n const formatted = formatToolTextValue(value, key, toolName);\n const normalizedKey = key.toLowerCase();\n const keyLabel =\n normalizedKey === \"sql\" || normalizedKey.endsWith(\"sql\") ? \"SQL\" : key;\n return {\n section: \"input\",\n title: `Input - ${keyLabel}`,\n text: formatted.text,\n copyText:\n typeof value === \"string\" ? value : stringifyToolValue(value, true),\n lang: formatted.lang,\n };\n }\n return {\n section: \"input\",\n title: \"Input\",\n text: JSON.stringify(args, null, 2),\n copyText: JSON.stringify(args, null, 2),\n lang: \"json\",\n };\n}\n\nexport function toolResultPayload(\n result: string | undefined,\n): ToolDetailPayload | null {\n if (result === undefined) return null;\n const formatted = formatToolTextValue(result);\n return {\n section: \"result\",\n title: \"Result\",\n text: formatted.text,\n copyText: result,\n lang: formatted.lang,\n };\n}\n\n// ─── Search highlight helpers ─────────────────────────────────────────────────\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction countTextMatches(text: string, query: string): number {\n const needle = query.trim();\n if (!needle) return 0;\n return Array.from(text.matchAll(new RegExp(escapeRegExp(needle), \"gi\")))\n .length;\n}\n\nfunction renderHighlightedSearchText(\n text: string,\n query: string,\n): React.ReactNode {\n const needle = query.trim();\n if (!needle) return text;\n const regex = new RegExp(escapeRegExp(needle), \"gi\");\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text))) {\n if (match.index > lastIndex) {\n parts.push(text.slice(lastIndex, match.index));\n }\n parts.push(<mark key={`${match.index}-${match[0]}`}>{match[0]}</mark>);\n lastIndex = match.index + match[0].length;\n if (match[0].length === 0) regex.lastIndex += 1;\n }\n if (lastIndex < text.length) parts.push(text.slice(lastIndex));\n return parts;\n}\n\n// ─── ToolDetailViewer ──────────────────────────────────────────────────────────\n\nfunction ToolDetailViewer({ payload }: { payload: ToolDetailPayload }) {\n const [expanded, setExpanded] = useState(false);\n const [searchOpen, setSearchOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [copied, setCopied] = useState(false);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const matchCount = useMemo(\n () => countTextMatches(payload.text, search),\n [payload.text, search],\n );\n\n useEffect(() => {\n return () => {\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n };\n }, []);\n\n const copyValue = useCallback(async () => {\n try {\n if (await writeClipboardText(payload.copyText)) {\n setCopied(true);\n if (copyResetRef.current) clearTimeout(copyResetRef.current);\n copyResetRef.current = setTimeout(() => setCopied(false), 1200);\n }\n } catch {\n // Clipboard failures should not interrupt chat rendering.\n }\n }, [payload.copyText]);\n\n return (\n <div className=\"rounded-md border border-border/50 bg-background/60\">\n <div className=\"flex min-h-9 flex-wrap items-center gap-2 border-b border-border/50 px-2.5 py-1.5\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-[11px] font-medium text-foreground/85\">\n {payload.title}\n </span>\n {payload.lang !== \"text\" && (\n <span className=\"shrink-0 rounded border border-border/60 px-1 py-0.5 font-mono text-[9px] uppercase leading-none text-muted-foreground\">\n {payload.lang}\n </span>\n )}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => setSearchOpen((v) => !v)}\n aria-label={`Search ${payload.title.toLowerCase()}`}\n aria-pressed={searchOpen}\n className={cn(\n \"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\",\n searchOpen && \"bg-accent text-foreground\",\n )}\n >\n <IconSearch size={12} />\n </button>\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-label={expanded ? \"Shrink code viewer\" : \"Expand code viewer\"}\n aria-pressed={expanded}\n className=\"inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {expanded ? (\n <IconArrowsMinimize size={12} />\n ) : (\n <IconArrowsMaximize size={12} />\n )}\n </button>\n <button\n type=\"button\"\n onClick={copyValue}\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-1.5 font-sans text-[11px] text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n {copied ? <IconCheck size={12} /> : <IconCopy size={12} />}\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n </div>\n {searchOpen && (\n <div className=\"flex items-center gap-2 border-b border-border/50 px-2.5 py-2\">\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Find\"\n className=\"h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-xs text-foreground outline-none placeholder:text-muted-foreground focus:ring-1 focus:ring-ring\"\n />\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {search.trim() ? matchCount : \"\"}\n </span>\n </div>\n )}\n <div\n className={cn(\n \"agent-tool-code overflow-auto font-mono text-[11px] leading-relaxed text-foreground\",\n expanded ? \"max-h-[70vh]\" : \"max-h-72\",\n )}\n >\n {search.trim() ? (\n <pre>\n <code>{renderHighlightedSearchText(payload.text, search)}</code>\n </pre>\n ) : (\n <HighlightedCodeBlock code={payload.text} lang={payload.lang} />\n )}\n </div>\n </div>\n );\n}\n\n// ─── Human-in-the-loop approval affordance ────────────────────────────────────\n\n/**\n * Inline Approve/Deny prompt rendered when a `needsApproval` action paused the\n * turn. Approve re-issues the turn with the call's `approvalKey`; Deny dismisses\n * the prompt locally (the action stays un-run).\n */\nfunction ApprovalAffordance({\n toolName,\n approval,\n}: {\n toolName: string;\n approval: { approvalKey: string; dismissed?: boolean };\n}) {\n const ctx = React.useContext(ApprovalContext);\n const [approved, setApproved] = useState(false);\n const [denied, setDenied] = useState(false);\n\n // Once approved, the turn is re-issued; collapse to a quiet note so the user\n // can't double-fire the approval.\n if (approved) {\n return (\n <div className=\"mt-1.5 text-xs text-muted-foreground\">\n Approved. Re-running {toolName}...\n </div>\n );\n }\n // Deny is local-only: the action simply stays un-run.\n if (denied) {\n return (\n <div className=\"mt-1.5 text-xs text-muted-foreground\">\n Denied. {toolName} did not run.\n </div>\n );\n }\n return (\n <div className=\"mt-1.5 flex items-center gap-2 rounded-md border border-border bg-muted/40 px-2.5 py-1.5\">\n <IconShieldCheck className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"mr-auto text-xs text-muted-foreground\">\n Approve to run {toolName}?\n </span>\n {ctx && (\n <button\n type=\"button\"\n onClick={() => {\n setApproved(true);\n ctx.onApprove(approval.approvalKey);\n }}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium transition-colors\",\n \"bg-foreground text-background hover:bg-foreground/90\",\n )}\n >\n <IconCheck className=\"h-3.5 w-3.5\" />\n Approve\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setDenied(true)}\n className={cn(\n \"inline-flex items-center gap-1 rounded-md border border-border px-2.5 py-1 text-xs font-medium transition-colors\",\n \"text-foreground hover:bg-muted\",\n )}\n >\n <IconX className=\"h-3.5 w-3.5\" />\n Deny\n </button>\n </div>\n );\n}\n\n// ─── ToolCallDisplay ──────────────────────────────────────────────────────────\n\nexport function ToolCallDisplay({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n chatUI,\n isRunning,\n structuredMeta,\n approval,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n isRunning: boolean;\n structuredMeta?: Record<string, unknown>;\n approval?: { approvalKey: string; dismissed?: boolean };\n}) {\n // Delegate to bespoke cells when structured metadata is present.\n // These must be separate components so hook order in ToolCallDisplayGeneric\n // is always stable (no conditional hook calls).\n const toolKind = structuredMeta?.toolKind as string | undefined;\n if (toolKind === \"bash\") {\n return (\n <BashCell\n meta={\n structuredMeta as unknown as Parameters<typeof BashCell>[0][\"meta\"]\n }\n output={result}\n isRunning={isRunning}\n />\n );\n }\n if (toolKind === \"edit\") {\n return (\n <EditCell\n meta={\n structuredMeta as unknown as Parameters<typeof EditCell>[0][\"meta\"]\n }\n isRunning={isRunning}\n />\n );\n }\n if (toolKind === \"write\") {\n return (\n <WriteCell\n meta={\n structuredMeta as unknown as Parameters<typeof WriteCell>[0][\"meta\"]\n }\n isRunning={isRunning}\n />\n );\n }\n return (\n <ToolCallDisplayGeneric\n toolName={toolName}\n argsText={argsText}\n args={args}\n result={result}\n mcpApp={mcpApp}\n chatUI={chatUI}\n isRunning={isRunning}\n approval={approval}\n />\n );\n}\n\nfunction ToolCallDisplayGeneric({\n toolName,\n argsText,\n args,\n result,\n mcpApp,\n chatUI,\n isRunning,\n approval,\n}: {\n toolName: string;\n argsText?: string;\n args: Record<string, unknown>;\n result?: string;\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n isRunning: boolean;\n approval?: { approvalKey: string; dismissed?: boolean };\n}) {\n const streamRef = useRef<HTMLDivElement>(null);\n\n const isAgentCall = toolName.startsWith(\"agent:\");\n const [expanded, setExpanded] = useState(isAgentCall);\n const agentName = isAgentCall ? toolName.slice(6) : null;\n const isAgentError = isAgentCall && result === \"Error calling agent\";\n const agentStreamText = isAgentCall ? (argsText ?? \"\") : \"\";\n const hasStreamText = agentStreamText.length > 0;\n const hasArgs = !isAgentCall && Object.keys(args).length > 0;\n\n // NOTE: All hooks must be above any conditional returns\n useEffect(() => {\n if (isAgentCall && isRunning && streamRef.current) {\n streamRef.current.scrollTop = streamRef.current.scrollHeight;\n }\n }, [agentStreamText, isAgentCall, isRunning]);\n\n // Render connect-builder as ConnectBuilderCard once the result is available\n if (toolName === \"connect-builder\" && result) {\n try {\n const parsed = JSON.parse(result);\n if (parsed?.kind === \"connect-builder-card\") {\n return (\n <ConnectBuilderCard\n configured={!!parsed.configured}\n builderEnabled={parsed.builderEnabled !== false}\n // Ignore saved cliAuthUrl values from older tool results. They\n // contain signed callback state and can expire while a chat sits\n // open; the card's hook fetches a fresh signed URL on mount/click.\n connectUrl={parsed.connectUrl || \"\"}\n orgName={parsed.orgName ?? null}\n prompt={typeof parsed.prompt === \"string\" ? parsed.prompt : \"\"}\n />\n );\n }\n } catch {\n // fall through to default pill rendering\n }\n }\n\n // Render agent-teams spawn as AgentTaskCard once the result is available\n if (\n toolName === \"agent-teams\" &&\n (args as Record<string, string>)?.action === \"spawn\" &&\n result\n ) {\n try {\n const parsed = JSON.parse(result);\n if (parsed.taskId && parsed.threadId) {\n return (\n <AgentTaskCard\n taskId={parsed.taskId}\n threadId={parsed.threadId}\n description={\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"Sub-agent task\"\n }\n onOpen={(tid) => {\n window.dispatchEvent(\n new CustomEvent(\"agent-task-open\", {\n detail: {\n threadId: tid,\n description:\n parsed.description ||\n (args as Record<string, string>)?.task ||\n \"\",\n name: parsed.name || \"\",\n },\n }),\n );\n }}\n />\n );\n }\n } catch {\n // Fall through to default pill rendering\n }\n }\n\n const parsedResult = result ? parseJsonText(result) : null;\n const nativeToolContext = {\n toolName,\n args,\n resultText: result,\n resultJson: parsedResult,\n isRunning,\n chatUI,\n };\n const NativeToolRenderer = isAgentCall\n ? null\n : resolveToolRenderer(nativeToolContext);\n if (NativeToolRenderer) {\n return <NativeToolRenderer context={nativeToolContext} />;\n }\n\n const inputPayload = hasArgs ? toolInputPayload(toolName, args) : null;\n const resultPayload = toolResultPayload(result);\n\n const displayName = isAgentCall\n ? isRunning\n ? `Asking ${agentName}...`\n : isAgentError\n ? `Error asking ${agentName}`\n : `Asked ${agentName}`\n : humanizeToolName(toolName);\n\n const canExpand = isAgentCall\n ? hasStreamText\n : hasArgs || result !== undefined;\n const isExpanded = isAgentCall ? hasStreamText && expanded : expanded;\n\n return (\n <div className=\"my-1 overflow-hidden\">\n {mcpApp && <McpAppRenderer app={mcpApp} className=\"mb-1.5\" />}\n <button\n onClick={() => canExpand && setExpanded(!isExpanded)}\n aria-expanded={canExpand ? isExpanded : undefined}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-1.5 text-xs font-mono w-full text-left overflow-hidden\",\n isRunning\n ? \"bg-muted text-muted-foreground\"\n : \"bg-muted text-muted-foreground hover:bg-accent\",\n )}\n >\n <span className=\"shrink-0\">\n {isRunning ? (\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n ) : isAgentError ? (\n <IconCircleX className=\"h-3 w-3 text-destructive\" />\n ) : result !== undefined ? (\n <IconCheck className=\"h-3 w-3 text-emerald-500\" />\n ) : (\n <IconSquareFilled className=\"h-3 w-3 text-muted-foreground\" />\n )}\n </span>\n <span className=\"truncate min-w-0\">\n <span className=\"font-medium\">{displayName}</span>\n </span>\n {canExpand && (\n <IconChevronDown\n className={cn(\n \"ml-auto h-3 w-3 shrink-0 opacity-40\",\n isExpanded && \"rotate-180\",\n )}\n />\n )}\n </button>\n {isExpanded && isAgentCall && hasStreamText && (\n <div\n ref={streamRef}\n className=\"mt-1 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground break-words max-h-48 overflow-y-auto agent-markdown prose prose-sm prose-invert max-w-none\"\n >\n {markdownModule?.default && remarkGfmFn ? (\n <markdownModule.default\n remarkPlugins={[remarkGfmFn]}\n components={markdownComponents}\n urlTransform={markdownUrlTransform}\n >\n {agentStreamText}\n </markdownModule.default>\n ) : (\n <span style={{ whiteSpace: \"pre-wrap\" }}>{agentStreamText}</span>\n )}\n </div>\n )}\n {isExpanded && !isAgentCall && (hasArgs || result !== undefined) && (\n <div className=\"mt-1 space-y-2 rounded-md bg-muted/50 px-3 py-2 text-xs text-muted-foreground\">\n {inputPayload && <ToolDetailViewer payload={inputPayload} />}\n {resultPayload && <ToolDetailViewer payload={resultPayload} />}\n </div>\n )}\n {approval && (\n <ApprovalAffordance toolName={toolName} approval={approval} />\n )}\n </div>\n );\n}\n\n// ─── ToolCallFallback ──────────────────────────────────────────────────────────\n\nexport function ToolCallFallback({\n toolName,\n args,\n argsText,\n result,\n ...rest\n}: ToolCallMessagePartProps & {\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n structuredMeta?: Record<string, unknown>;\n approval?: { approvalKey: string; dismissed?: boolean };\n}) {\n const chatRunning = React.useContext(ChatRunningContext);\n const isRunning = result === undefined && chatRunning;\n return (\n <ToolCallDisplay\n toolName={toolName}\n args={args as Record<string, unknown>}\n argsText={argsText}\n result={\n typeof result === \"string\"\n ? result\n : result !== undefined\n ? JSON.stringify(result)\n : undefined\n }\n mcpApp={rest.mcpApp}\n chatUI={rest.chatUI}\n structuredMeta={rest.structuredMeta}\n isRunning={isRunning}\n approval={rest.approval}\n />\n );\n}\n\n// ─── ReconnectStreamMessage ────────────────────────────────────────────────────\n// Renders the agent's in-progress response during reconnection (outside\n// assistant-ui's runtime). Uses the same visual styling as normal messages.\n\nexport function ReconnectStreamMessage({\n content,\n}: {\n content: ContentPart[];\n}) {\n const chatRunning = React.useContext(ChatRunningContext);\n\n return (\n <div className=\"flex justify-start\">\n <div className=\"max-w-[95%] text-sm leading-relaxed text-foreground space-y-1\">\n {content.map((part, i) => {\n if (part.type === \"text\") {\n return (\n <SmoothMarkdownText\n key={`reconnect-text-${i}`}\n text={part.text}\n streaming={chatRunning}\n resetKey={`reconnect-text-${i}`}\n statusType={chatRunning ? \"running\" : \"complete\"}\n />\n );\n }\n if (part.type === \"tool-call\") {\n return (\n <ToolCallDisplay\n key={`reconnect-tool-${i}`}\n toolName={part.toolName}\n argsText={part.argsText}\n args={part.args}\n result={part.result}\n mcpApp={part.mcpApp}\n chatUI={part.chatUI}\n structuredMeta={part.structuredMeta}\n isRunning={part.result === undefined && chatRunning}\n approval={part.approval}\n />\n );\n }\n return null;\n })}\n </div>\n </div>\n );\n}\n\n// ─── Re-export for AssistantMessage ───────────────────────────────────────────\n// AssistantMessage in AssistantChat.tsx uses FilesChangedSummary directly, so\n// re-export it so AssistantChat.tsx can import from one place.\nexport { FilesChangedSummary };\n"]}
@@ -1,10 +1,12 @@
1
1
  import type { ComponentType } from "react";
2
+ import type { ActionChatUIConfig } from "../../action-ui.js";
2
3
  export interface ToolRendererContext {
3
4
  toolName: string;
4
5
  args: Record<string, unknown>;
5
6
  resultText?: string;
6
7
  resultJson: unknown;
7
8
  isRunning: boolean;
9
+ chatUI?: ActionChatUIConfig;
8
10
  }
9
11
  export interface ToolRendererProps {
10
12
  context: ToolRendererContext;
@@ -16,8 +18,17 @@ export interface ToolRendererRegistration {
16
18
  match: ToolRendererMatch;
17
19
  Component: ToolRendererComponent;
18
20
  }
21
+ export interface ActionChatRendererRegistration {
22
+ id: string;
23
+ renderer: string;
24
+ Component: ToolRendererComponent;
25
+ }
19
26
  export declare function registerToolRenderer(registration: ToolRendererRegistration): () => void;
20
27
  export declare function registerReservedToolRenderer(registration: ToolRendererRegistration): () => void;
28
+ export declare function registerReservedFallbackToolRenderer(registration: ToolRendererRegistration): () => void;
29
+ export declare function registerFallbackToolRenderer(registration: ToolRendererRegistration): () => void;
30
+ export declare function registerActionChatRenderer(registration: ActionChatRendererRegistration): () => void;
31
+ export declare function registerReservedActionChatRenderer(registration: ActionChatRendererRegistration): () => void;
21
32
  export declare function resolveToolRenderer(context: ToolRendererContext): ToolRendererComponent | null;
22
33
  export declare function clearToolRenderersForTests(): void;
23
34
  export declare function clearReservedToolRenderersForTests(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-render-registry.d.ts","sourceRoot":"","sources":["../../../src/client/chat/tool-render-registry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAErE,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,CAAC,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAgBD,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,wBAAwB,GACrC,MAAM,IAAI,CAEZ;AAED,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,wBAAwB,GACrC,MAAM,IAAI,CAEZ;AAYD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,GAC3B,qBAAqB,GAAG,IAAI,CAO9B;AAED,wBAAgB,0BAA0B,SAEzC;AAED,wBAAgB,kCAAkC,SAEjD"}
1
+ {"version":3,"file":"tool-render-registry.d.ts","sourceRoot":"","sources":["../../../src/client/chat/tool-render-registry.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAErE,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,CAAC,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC;AAEhD,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,MAAM,WAAW,8BAA8B;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAiBD,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,wBAAwB,GACrC,MAAM,IAAI,CAEZ;AAED,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,wBAAwB,GACrC,MAAM,IAAI,CAEZ;AAED,wBAAgB,oCAAoC,CAClD,YAAY,EAAE,wBAAwB,GACrC,MAAM,IAAI,CAEZ;AAED,wBAAgB,4BAA4B,CAC1C,YAAY,EAAE,wBAAwB,GACrC,MAAM,IAAI,CAEZ;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,8BAA8B,GAC3C,MAAM,IAAI,CAEZ;AAED,wBAAgB,kCAAkC,CAChD,YAAY,EAAE,8BAA8B,GAC3C,MAAM,IAAI,CAEZ;AAYD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,GAC3B,qBAAqB,GAAG,IAAI,CAiC9B;AAED,wBAAgB,0BAA0B,SAIzC;AAED,wBAAgB,kCAAkC,SAIjD"}
@@ -1,5 +1,9 @@
1
1
  const reservedRegistrations = [];
2
2
  const registrations = [];
3
+ const reservedFallbackRegistrations = [];
4
+ const fallbackRegistrations = [];
5
+ const reservedActionChatRegistrations = [];
6
+ const actionChatRegistrations = [];
3
7
  function registerIn(list, registration) {
4
8
  list.push(registration);
5
9
  return () => {
@@ -14,6 +18,18 @@ export function registerToolRenderer(registration) {
14
18
  export function registerReservedToolRenderer(registration) {
15
19
  return registerIn(reservedRegistrations, registration);
16
20
  }
21
+ export function registerReservedFallbackToolRenderer(registration) {
22
+ return registerIn(reservedFallbackRegistrations, registration);
23
+ }
24
+ export function registerFallbackToolRenderer(registration) {
25
+ return registerIn(fallbackRegistrations, registration);
26
+ }
27
+ export function registerActionChatRenderer(registration) {
28
+ return registerIn(actionChatRegistrations, registration);
29
+ }
30
+ export function registerReservedActionChatRenderer(registration) {
31
+ return registerIn(reservedActionChatRegistrations, registration);
32
+ }
17
33
  function matchesToolRenderer(registration, context) {
18
34
  if (typeof registration.match === "string") {
19
35
  return registration.match === context.toolName;
@@ -21,7 +37,33 @@ function matchesToolRenderer(registration, context) {
21
37
  return registration.match(context);
22
38
  }
23
39
  export function resolveToolRenderer(context) {
24
- for (const registration of [...reservedRegistrations, ...registrations]) {
40
+ for (const registration of reservedRegistrations) {
41
+ if (matchesToolRenderer(registration, context)) {
42
+ return registration.Component;
43
+ }
44
+ }
45
+ const renderer = context.chatUI?.renderer;
46
+ if (renderer) {
47
+ for (const registration of [
48
+ ...reservedActionChatRegistrations,
49
+ ...actionChatRegistrations,
50
+ ]) {
51
+ if (registration.renderer === renderer) {
52
+ return registration.Component;
53
+ }
54
+ }
55
+ }
56
+ for (const registration of registrations) {
57
+ if (matchesToolRenderer(registration, context)) {
58
+ return registration.Component;
59
+ }
60
+ }
61
+ for (const registration of reservedFallbackRegistrations) {
62
+ if (matchesToolRenderer(registration, context)) {
63
+ return registration.Component;
64
+ }
65
+ }
66
+ for (const registration of fallbackRegistrations) {
25
67
  if (matchesToolRenderer(registration, context)) {
26
68
  return registration.Component;
27
69
  }
@@ -30,8 +72,12 @@ export function resolveToolRenderer(context) {
30
72
  }
31
73
  export function clearToolRenderersForTests() {
32
74
  registrations.length = 0;
75
+ fallbackRegistrations.length = 0;
76
+ actionChatRegistrations.length = 0;
33
77
  }
34
78
  export function clearReservedToolRenderersForTests() {
35
79
  reservedRegistrations.length = 0;
80
+ reservedFallbackRegistrations.length = 0;
81
+ reservedActionChatRegistrations.length = 0;
36
82
  }
37
83
  //# sourceMappingURL=tool-render-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-render-registry.js","sourceRoot":"","sources":["../../../src/client/chat/tool-render-registry.tsx"],"names":[],"mappings":"AA0BA,MAAM,qBAAqB,GAA+B,EAAE,CAAC;AAC7D,MAAM,aAAa,GAA+B,EAAE,CAAC;AAErD,SAAS,UAAU,CACjB,IAAgC,EAChC,YAAsC;IAEtC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACV,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAC9D,IAAI,KAAK,IAAI,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,YAAsC;IAEtC,OAAO,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,YAAsC;IAEtC,OAAO,UAAU,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAAsC,EACtC,OAA4B;IAE5B,IAAI,OAAO,YAAY,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,YAAY,CAAC,KAAK,KAAK,OAAO,CAAC,QAAQ,CAAC;IACjD,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAA4B;IAE5B,KAAK,MAAM,YAAY,IAAI,CAAC,GAAG,qBAAqB,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC;QACxE,IAAI,mBAAmB,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC;YAC/C,OAAO,YAAY,CAAC,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kCAAkC;IAChD,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import type { ComponentType } from \"react\";\n\nexport interface ToolRendererContext {\n toolName: string;\n args: Record<string, unknown>;\n resultText?: string;\n resultJson: unknown;\n isRunning: boolean;\n}\n\nexport interface ToolRendererProps {\n context: ToolRendererContext;\n}\n\nexport type ToolRendererComponent = ComponentType<ToolRendererProps>;\n\nexport type ToolRendererMatch =\n | string\n | ((context: ToolRendererContext) => boolean);\n\nexport interface ToolRendererRegistration {\n id: string;\n match: ToolRendererMatch;\n Component: ToolRendererComponent;\n}\n\nconst reservedRegistrations: ToolRendererRegistration[] = [];\nconst registrations: ToolRendererRegistration[] = [];\n\nfunction registerIn(\n list: ToolRendererRegistration[],\n registration: ToolRendererRegistration,\n) {\n list.push(registration);\n return () => {\n const index = list.findIndex((item) => item === registration);\n if (index >= 0) list.splice(index, 1);\n };\n}\n\nexport function registerToolRenderer(\n registration: ToolRendererRegistration,\n): () => void {\n return registerIn(registrations, registration);\n}\n\nexport function registerReservedToolRenderer(\n registration: ToolRendererRegistration,\n): () => void {\n return registerIn(reservedRegistrations, registration);\n}\n\nfunction matchesToolRenderer(\n registration: ToolRendererRegistration,\n context: ToolRendererContext,\n): boolean {\n if (typeof registration.match === \"string\") {\n return registration.match === context.toolName;\n }\n return registration.match(context);\n}\n\nexport function resolveToolRenderer(\n context: ToolRendererContext,\n): ToolRendererComponent | null {\n for (const registration of [...reservedRegistrations, ...registrations]) {\n if (matchesToolRenderer(registration, context)) {\n return registration.Component;\n }\n }\n return null;\n}\n\nexport function clearToolRenderersForTests() {\n registrations.length = 0;\n}\n\nexport function clearReservedToolRenderersForTests() {\n reservedRegistrations.length = 0;\n}\n"]}
1
+ {"version":3,"file":"tool-render-registry.js","sourceRoot":"","sources":["../../../src/client/chat/tool-render-registry.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentType } from \"react\";\nimport type { ActionChatUIConfig } from \"../../action-ui.js\";\n\nexport interface ToolRendererContext {\n toolName: string;\n args: Record<string, unknown>;\n resultText?: string;\n resultJson: unknown;\n isRunning: boolean;\n chatUI?: ActionChatUIConfig;\n}\n\nexport interface ToolRendererProps {\n context: ToolRendererContext;\n}\n\nexport type ToolRendererComponent = ComponentType<ToolRendererProps>;\n\nexport type ToolRendererMatch =\n | string\n | ((context: ToolRendererContext) => boolean);\n\nexport interface ToolRendererRegistration {\n id: string;\n match: ToolRendererMatch;\n Component: ToolRendererComponent;\n}\n\nexport interface ActionChatRendererRegistration {\n id: string;\n renderer: string;\n Component: ToolRendererComponent;\n}\n\nconst reservedRegistrations: ToolRendererRegistration[] = [];\nconst registrations: ToolRendererRegistration[] = [];\nconst reservedFallbackRegistrations: ToolRendererRegistration[] = [];\nconst fallbackRegistrations: ToolRendererRegistration[] = [];\nconst reservedActionChatRegistrations: ActionChatRendererRegistration[] = [];\nconst actionChatRegistrations: ActionChatRendererRegistration[] = [];\n\nfunction registerIn<T>(list: T[], registration: T) {\n list.push(registration);\n return () => {\n const index = list.findIndex((item) => item === registration);\n if (index >= 0) list.splice(index, 1);\n };\n}\n\nexport function registerToolRenderer(\n registration: ToolRendererRegistration,\n): () => void {\n return registerIn(registrations, registration);\n}\n\nexport function registerReservedToolRenderer(\n registration: ToolRendererRegistration,\n): () => void {\n return registerIn(reservedRegistrations, registration);\n}\n\nexport function registerReservedFallbackToolRenderer(\n registration: ToolRendererRegistration,\n): () => void {\n return registerIn(reservedFallbackRegistrations, registration);\n}\n\nexport function registerFallbackToolRenderer(\n registration: ToolRendererRegistration,\n): () => void {\n return registerIn(fallbackRegistrations, registration);\n}\n\nexport function registerActionChatRenderer(\n registration: ActionChatRendererRegistration,\n): () => void {\n return registerIn(actionChatRegistrations, registration);\n}\n\nexport function registerReservedActionChatRenderer(\n registration: ActionChatRendererRegistration,\n): () => void {\n return registerIn(reservedActionChatRegistrations, registration);\n}\n\nfunction matchesToolRenderer(\n registration: ToolRendererRegistration,\n context: ToolRendererContext,\n): boolean {\n if (typeof registration.match === \"string\") {\n return registration.match === context.toolName;\n }\n return registration.match(context);\n}\n\nexport function resolveToolRenderer(\n context: ToolRendererContext,\n): ToolRendererComponent | null {\n for (const registration of reservedRegistrations) {\n if (matchesToolRenderer(registration, context)) {\n return registration.Component;\n }\n }\n const renderer = context.chatUI?.renderer;\n if (renderer) {\n for (const registration of [\n ...reservedActionChatRegistrations,\n ...actionChatRegistrations,\n ]) {\n if (registration.renderer === renderer) {\n return registration.Component;\n }\n }\n }\n for (const registration of registrations) {\n if (matchesToolRenderer(registration, context)) {\n return registration.Component;\n }\n }\n for (const registration of reservedFallbackRegistrations) {\n if (matchesToolRenderer(registration, context)) {\n return registration.Component;\n }\n }\n for (const registration of fallbackRegistrations) {\n if (matchesToolRenderer(registration, context)) {\n return registration.Component;\n }\n }\n return null;\n}\n\nexport function clearToolRenderersForTests() {\n registrations.length = 0;\n fallbackRegistrations.length = 0;\n actionChatRegistrations.length = 0;\n}\n\nexport function clearReservedToolRenderersForTests() {\n reservedRegistrations.length = 0;\n reservedFallbackRegistrations.length = 0;\n reservedActionChatRegistrations.length = 0;\n}\n"]}
@@ -1,27 +1,82 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { DATA_CHART_WIDGET, DATA_INSIGHTS_WIDGET, DATA_TABLE_WIDGET, normalizeDataWidgetKind, normalizeDataWidgetResult, } from "./data-widget-types.js";
3
+ import { ACTION_CHAT_UI_DATA_CHART_RENDERER, ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER, ACTION_CHAT_UI_DATA_TABLE_RENDERER, ACTION_CHAT_UI_DATA_WIDGET_RENDERER, } from "../../../action-ui.js";
3
4
  import { DataChartWidget } from "./DataChartWidget.js";
4
5
  import { DataInsightsWidget } from "./DataInsightsWidget.js";
5
6
  import { DataTableWidget } from "./DataTableWidget.js";
6
- import { registerReservedToolRenderer } from "../tool-render-registry.js";
7
- registerReservedToolRenderer({
7
+ import { registerReservedActionChatRenderer, registerReservedFallbackToolRenderer, } from "../tool-render-registry.js";
8
+ function isRecord(value) {
9
+ return !!value && typeof value === "object" && !Array.isArray(value);
10
+ }
11
+ function normalizeActionDataWidgetResult(context) {
12
+ const result = normalizeDataWidgetResult(context.resultJson);
13
+ if (result)
14
+ return result;
15
+ if (!isRecord(context.resultJson))
16
+ return null;
17
+ const renderer = context.chatUI?.renderer;
18
+ if (renderer === ACTION_CHAT_UI_DATA_TABLE_RENDERER) {
19
+ return normalizeDataWidgetResult({
20
+ widget: DATA_TABLE_WIDGET,
21
+ table: isRecord(context.resultJson.table)
22
+ ? context.resultJson.table
23
+ : context.resultJson,
24
+ display: isRecord(context.resultJson.display)
25
+ ? context.resultJson.display
26
+ : undefined,
27
+ });
28
+ }
29
+ if (renderer === ACTION_CHAT_UI_DATA_CHART_RENDERER) {
30
+ return normalizeDataWidgetResult({
31
+ widget: DATA_CHART_WIDGET,
32
+ chartSeries: isRecord(context.resultJson.chartSeries)
33
+ ? context.resultJson.chartSeries
34
+ : context.resultJson,
35
+ display: isRecord(context.resultJson.display)
36
+ ? context.resultJson.display
37
+ : undefined,
38
+ });
39
+ }
40
+ if (renderer === ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER) {
41
+ return normalizeDataWidgetResult({
42
+ ...context.resultJson,
43
+ widget: DATA_INSIGHTS_WIDGET,
44
+ });
45
+ }
46
+ return null;
47
+ }
48
+ function renderDataWidget(context) {
49
+ const result = normalizeActionDataWidgetResult(context) ??
50
+ normalizeDataWidgetResult(context.resultJson);
51
+ if (!result)
52
+ return null;
53
+ const widget = normalizeDataWidgetKind(result.widget);
54
+ if (widget === DATA_TABLE_WIDGET && result.table) {
55
+ return (_jsx(DataTableWidget, { table: result.table, action: result.display?.primaryAction }));
56
+ }
57
+ if (widget === DATA_CHART_WIDGET && result.chartSeries) {
58
+ return _jsx(DataChartWidget, { chart: result.chartSeries });
59
+ }
60
+ if (widget === DATA_INSIGHTS_WIDGET) {
61
+ return _jsx(DataInsightsWidget, { result: result });
62
+ }
63
+ return null;
64
+ }
65
+ for (const [id, renderer] of [
66
+ ["core.data-table", ACTION_CHAT_UI_DATA_TABLE_RENDERER],
67
+ ["core.data-chart", ACTION_CHAT_UI_DATA_CHART_RENDERER],
68
+ ["core.data-insights", ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER],
69
+ ["core.data-widget", ACTION_CHAT_UI_DATA_WIDGET_RENDERER],
70
+ ]) {
71
+ registerReservedActionChatRenderer({
72
+ id,
73
+ renderer,
74
+ Component: ({ context }) => renderDataWidget(context),
75
+ });
76
+ }
77
+ registerReservedFallbackToolRenderer({
8
78
  id: "core.data-widgets",
9
79
  match: (context) => normalizeDataWidgetResult(context.resultJson) !== null,
10
- Component: ({ context }) => {
11
- const result = normalizeDataWidgetResult(context.resultJson);
12
- if (!result)
13
- return null;
14
- const widget = normalizeDataWidgetKind(result.widget);
15
- if (widget === DATA_TABLE_WIDGET && result.table) {
16
- return _jsx(DataTableWidget, { table: result.table });
17
- }
18
- if (widget === DATA_CHART_WIDGET && result.chartSeries) {
19
- return _jsx(DataChartWidget, { chart: result.chartSeries });
20
- }
21
- if (widget === DATA_INSIGHTS_WIDGET) {
22
- return _jsx(DataInsightsWidget, { result: result });
23
- }
24
- return null;
25
- },
80
+ Component: ({ context }) => renderDataWidget(context),
26
81
  });
27
82
  //# sourceMappingURL=builtin-tool-renderers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-tool-renderers.js","sourceRoot":"","sources":["../../../../src/client/chat/widgets/builtin-tool-renderers.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAE1E,4BAA4B,CAAC;IAC3B,EAAE,EAAE,mBAAmB;IACvB,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI;IAC1E,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;QACzB,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,MAAM,GAAG,uBAAuB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,iBAAiB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjD,OAAO,KAAC,eAAe,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,GAAI,CAAC;QAClD,CAAC;QACD,IAAI,MAAM,KAAK,iBAAiB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvD,OAAO,KAAC,eAAe,IAAC,KAAK,EAAE,MAAM,CAAC,WAAW,GAAI,CAAC;QACxD,CAAC;QACD,IAAI,MAAM,KAAK,oBAAoB,EAAE,CAAC;YACpC,OAAO,KAAC,kBAAkB,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC,CAAC","sourcesContent":["import {\n DATA_CHART_WIDGET,\n DATA_INSIGHTS_WIDGET,\n DATA_TABLE_WIDGET,\n normalizeDataWidgetKind,\n normalizeDataWidgetResult,\n} from \"./data-widget-types.js\";\nimport { DataChartWidget } from \"./DataChartWidget.js\";\nimport { DataInsightsWidget } from \"./DataInsightsWidget.js\";\nimport { DataTableWidget } from \"./DataTableWidget.js\";\nimport { registerReservedToolRenderer } from \"../tool-render-registry.js\";\n\nregisterReservedToolRenderer({\n id: \"core.data-widgets\",\n match: (context) => normalizeDataWidgetResult(context.resultJson) !== null,\n Component: ({ context }) => {\n const result = normalizeDataWidgetResult(context.resultJson);\n if (!result) return null;\n const widget = normalizeDataWidgetKind(result.widget);\n if (widget === DATA_TABLE_WIDGET && result.table) {\n return <DataTableWidget table={result.table} />;\n }\n if (widget === DATA_CHART_WIDGET && result.chartSeries) {\n return <DataChartWidget chart={result.chartSeries} />;\n }\n if (widget === DATA_INSIGHTS_WIDGET) {\n return <DataInsightsWidget result={result} />;\n }\n return null;\n },\n});\n"]}
1
+ {"version":3,"file":"builtin-tool-renderers.js","sourceRoot":"","sources":["../../../../src/client/chat/widgets/builtin-tool-renderers.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DATA_CHART_WIDGET,\n DATA_INSIGHTS_WIDGET,\n DATA_TABLE_WIDGET,\n normalizeDataWidgetKind,\n normalizeDataWidgetResult,\n type DataWidgetResult,\n} from \"./data-widget-types.js\";\nimport {\n ACTION_CHAT_UI_DATA_CHART_RENDERER,\n ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER,\n ACTION_CHAT_UI_DATA_TABLE_RENDERER,\n ACTION_CHAT_UI_DATA_WIDGET_RENDERER,\n} from \"../../../action-ui.js\";\nimport { DataChartWidget } from \"./DataChartWidget.js\";\nimport { DataInsightsWidget } from \"./DataInsightsWidget.js\";\nimport { DataTableWidget } from \"./DataTableWidget.js\";\nimport {\n registerReservedActionChatRenderer,\n registerReservedFallbackToolRenderer,\n type ToolRendererContext,\n} from \"../tool-render-registry.js\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction normalizeActionDataWidgetResult(\n context: ToolRendererContext,\n): DataWidgetResult | null {\n const result = normalizeDataWidgetResult(context.resultJson);\n if (result) return result;\n if (!isRecord(context.resultJson)) return null;\n\n const renderer = context.chatUI?.renderer;\n if (renderer === ACTION_CHAT_UI_DATA_TABLE_RENDERER) {\n return normalizeDataWidgetResult({\n widget: DATA_TABLE_WIDGET,\n table: isRecord(context.resultJson.table)\n ? context.resultJson.table\n : context.resultJson,\n display: isRecord(context.resultJson.display)\n ? context.resultJson.display\n : undefined,\n });\n }\n if (renderer === ACTION_CHAT_UI_DATA_CHART_RENDERER) {\n return normalizeDataWidgetResult({\n widget: DATA_CHART_WIDGET,\n chartSeries: isRecord(context.resultJson.chartSeries)\n ? context.resultJson.chartSeries\n : context.resultJson,\n display: isRecord(context.resultJson.display)\n ? context.resultJson.display\n : undefined,\n });\n }\n if (renderer === ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER) {\n return normalizeDataWidgetResult({\n ...context.resultJson,\n widget: DATA_INSIGHTS_WIDGET,\n });\n }\n\n return null;\n}\n\nfunction renderDataWidget(context: ToolRendererContext) {\n const result =\n normalizeActionDataWidgetResult(context) ??\n normalizeDataWidgetResult(context.resultJson);\n if (!result) return null;\n const widget = normalizeDataWidgetKind(result.widget);\n if (widget === DATA_TABLE_WIDGET && result.table) {\n return (\n <DataTableWidget\n table={result.table}\n action={result.display?.primaryAction}\n />\n );\n }\n if (widget === DATA_CHART_WIDGET && result.chartSeries) {\n return <DataChartWidget chart={result.chartSeries} />;\n }\n if (widget === DATA_INSIGHTS_WIDGET) {\n return <DataInsightsWidget result={result} />;\n }\n return null;\n}\n\nfor (const [id, renderer] of [\n [\"core.data-table\", ACTION_CHAT_UI_DATA_TABLE_RENDERER],\n [\"core.data-chart\", ACTION_CHAT_UI_DATA_CHART_RENDERER],\n [\"core.data-insights\", ACTION_CHAT_UI_DATA_INSIGHTS_RENDERER],\n [\"core.data-widget\", ACTION_CHAT_UI_DATA_WIDGET_RENDERER],\n] as const) {\n registerReservedActionChatRenderer({\n id,\n renderer,\n Component: ({ context }) => renderDataWidget(context),\n });\n}\n\nregisterReservedFallbackToolRenderer({\n id: \"core.data-widgets\",\n match: (context) => normalizeDataWidgetResult(context.resultJson) !== null,\n Component: ({ context }) => renderDataWidget(context),\n});\n"]}
@@ -1,52 +1,2 @@
1
- export declare const DATA_TABLE_WIDGET = "data-table";
2
- export declare const DATA_CHART_WIDGET = "data-chart";
3
- export declare const DATA_INSIGHTS_WIDGET = "data-insights";
4
- export type DataWidgetKind = typeof DATA_TABLE_WIDGET | typeof DATA_CHART_WIDGET | typeof DATA_INSIGHTS_WIDGET;
5
- export interface DataTableColumn {
6
- key: string;
7
- label: string;
8
- align?: "left" | "right";
9
- }
10
- export interface DataTableWidget {
11
- title?: string;
12
- columns: DataTableColumn[];
13
- rows: Array<Record<string, unknown>>;
14
- totalRows?: number;
15
- sampledRows?: number;
16
- truncated?: boolean;
17
- }
18
- export interface DataChartSeriesDefinition {
19
- key: string;
20
- label: string;
21
- color?: string;
22
- }
23
- export interface DataChartWidget {
24
- type: "bar" | "line" | "area";
25
- title?: string;
26
- xKey: string;
27
- series: DataChartSeriesDefinition[];
28
- data: Array<Record<string, unknown>>;
29
- sampled?: boolean;
30
- }
31
- export interface DataWidgetResult {
32
- widget: DataWidgetKind;
33
- widgetId?: string;
34
- title?: string;
35
- summary?: Record<string, unknown>;
36
- table?: DataTableWidget;
37
- chartSeries?: DataChartWidget;
38
- display?: {
39
- title?: string;
40
- description?: string;
41
- primaryAction?: {
42
- label: string;
43
- href: string;
44
- };
45
- };
46
- }
47
- export declare function normalizeDataWidgetKind(value: unknown): DataWidgetKind | null;
48
- export declare function isDataTableWidget(value: unknown): value is DataTableWidget;
49
- export declare function isDataChartWidget(value: unknown): value is DataChartWidget;
50
- export declare function normalizeDataWidgetResult(value: unknown): DataWidgetResult | null;
51
- export declare function isDataWidgetResult(value: unknown): value is DataWidgetResult;
1
+ export * from "../../../data-widgets/index.js";
52
2
  //# sourceMappingURL=data-widget-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-widget-types.d.ts","sourceRoot":"","sources":["../../../../src/client/chat/widgets/data-widget-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,MAAM,MAAM,cAAc,GACtB,OAAO,iBAAiB,GACxB,OAAO,iBAAiB,GACxB,OAAO,oBAAoB,CAAC;AAEhC,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,yBAAyB,EAAE,CAAC;IACpC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE;YACd,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAgBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAK7E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAgB1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAgB1E;AAsBD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,gBAAgB,GAAG,IAAI,CAsBzB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAE5E"}
1
+ {"version":3,"file":"data-widget-types.d.ts","sourceRoot":"","sources":["../../../../src/client/chat/widgets/data-widget-types.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC"}