@aphrody/m3-ai 3.3.6 → 3.3.7

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 (40) hide show
  1. package/dist/A2APeerInspector.d.ts +1 -1
  2. package/dist/A2APeerInspector.d.ts.map +1 -1
  3. package/dist/A2ATaskTimeline.d.ts +1 -1
  4. package/dist/AgUiEventStream.d.ts +1 -1
  5. package/dist/AgUiEventStream.d.ts.map +1 -1
  6. package/dist/ChatComposer.d.ts +9 -1
  7. package/dist/ChatComposer.d.ts.map +1 -1
  8. package/dist/ConversationList.d.ts +32 -0
  9. package/dist/ConversationList.d.ts.map +1 -0
  10. package/dist/Markdown.d.ts +31 -1
  11. package/dist/Markdown.d.ts.map +1 -1
  12. package/dist/MemoryPanel.d.ts +26 -0
  13. package/dist/MemoryPanel.d.ts.map +1 -0
  14. package/dist/MessageBubble.d.ts +13 -1
  15. package/dist/MessageBubble.d.ts.map +1 -1
  16. package/dist/ModelSelector.d.ts +5 -1
  17. package/dist/ModelSelector.d.ts.map +1 -1
  18. package/dist/ModelUnavailable.d.ts +16 -0
  19. package/dist/ModelUnavailable.d.ts.map +1 -0
  20. package/dist/ToolCall.d.ts.map +1 -1
  21. package/dist/ag-ui.d.ts +13 -0
  22. package/dist/ag-ui.d.ts.map +1 -0
  23. package/dist/chatIcons.d.ts +34 -0
  24. package/dist/chatIcons.d.ts.map +1 -0
  25. package/dist/chatLabels.d.ts +71 -0
  26. package/dist/chatLabels.d.ts.map +1 -0
  27. package/dist/citations.d.ts +57 -0
  28. package/dist/citations.d.ts.map +1 -0
  29. package/dist/index.d.ts +20 -4
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1955 -654
  32. package/dist/index.js.map +20 -13
  33. package/dist/openaiChatStream.d.ts +140 -0
  34. package/dist/openaiChatStream.d.ts.map +1 -0
  35. package/dist/useOpenAIChat.d.ts +30 -0
  36. package/dist/useOpenAIChat.d.ts.map +1 -0
  37. package/package.json +11 -6
  38. package/src/AgUiEventStream.ts +1 -1
  39. package/src/ag-ui.ts +19 -0
  40. package/src/index.ts +1 -1
package/dist/index.js.map CHANGED
@@ -1,32 +1,39 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/types.ts", "../src/ToolCall.tsx", "../src/internal.tsx", "../src/McpAppCard.tsx", "../src/Markdown.tsx", "../src/MessageBubble.tsx", "../src/InlineWorkerCard.tsx", "../src/InlineBranchCard.tsx", "../src/ModelSelector.tsx", "../src/ChatComposer.tsx", "../src/GoogleSpotlightBar.tsx", "../src/GeminiAccountMenu.tsx", "../src/GeminiPersonalContextEdit.tsx", "../src/TaskStatusIcon.tsx", "../src/TaskPriorityIcon.tsx", "../src/TaskRow.tsx", "../src/TaskList.tsx", "../src/TaskDetail.tsx", "../src/TaskCreateForm.tsx", "../src/index.ts", "../src/AgUiEventStream.ts", "../src/A2APeerInspector.tsx", "../src/A2ATaskTimeline.tsx"],
3
+ "sources": ["../src/types.ts", "../src/ToolCall.tsx", "../src/internal.tsx", "../src/McpAppCard.tsx", "../src/Markdown.tsx", "../src/chatLabels.ts", "../src/chatIcons.tsx", "../src/MessageBubble.tsx", "../src/citations.tsx", "../src/InlineWorkerCard.tsx", "../src/InlineBranchCard.tsx", "../src/ModelSelector.tsx", "../src/ChatComposer.tsx", "../src/GoogleSpotlightBar.tsx", "../src/GeminiAccountMenu.tsx", "../src/GeminiPersonalContextEdit.tsx", "../src/TaskStatusIcon.tsx", "../src/TaskPriorityIcon.tsx", "../src/TaskRow.tsx", "../src/TaskList.tsx", "../src/TaskDetail.tsx", "../src/TaskCreateForm.tsx", "../src/AgUiEventStream.ts", "../src/A2APeerInspector.tsx", "../src/A2ATaskTimeline.tsx", "../src/openaiChatStream.ts", "../src/useOpenAIChat.ts", "../src/ConversationList.tsx", "../src/ModelUnavailable.tsx", "../src/MemoryPanel.tsx"],
4
4
  "sourcesContent": [
5
5
  "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/types.ts), MIT.\n\n// Tool execution types\nexport type ToolCallStatus = \"running\" | \"completed\" | \"error\";\n\nexport interface ToolCallPair {\n id: string;\n name: string;\n argsRaw: string;\n args: Record<string, unknown> | null;\n resultRaw: string | null;\n result: Record<string, unknown> | null;\n status: ToolCallStatus;\n /** Human-readable summary provided by live opencode parts */\n title?: string | null;\n}\n\n// Transcript step types — discriminated union matching the real API schema\n\nexport type ActionContent =\n | { type: \"text\"; text: string }\n | { type: \"tool_call\"; id: string; name: string; args: string };\n\nexport type TranscriptStep =\n | { type: \"action\"; content: ActionContent[] }\n | { type: \"user_text\"; text: string }\n | { type: \"system_text\"; text: string }\n | { type: \"tool_result\"; call_id: string; name: string; text: string };\n\n// Paired transcript item for rendering\n\nexport type TranscriptItem = { kind: \"text\"; text: string } | { kind: \"tool\"; pair: ToolCallPair };\n\n// ---------------------------------------------------------------------------\n// Task board types\n// ---------------------------------------------------------------------------\n\nexport type TaskStatus = \"pending_approval\" | \"backlog\" | \"ready\" | \"in_progress\" | \"done\";\nexport type TaskPriority = \"critical\" | \"high\" | \"medium\" | \"low\";\n\nexport interface Subtask {\n title: string;\n completed: boolean;\n}\n\nexport interface Task {\n id: string;\n task_number: number;\n title: string;\n description?: string | null;\n status: TaskStatus;\n priority: TaskPriority;\n owner_agent_id: string;\n assigned_agent_id: string;\n subtasks: Subtask[];\n metadata: unknown;\n worker_id?: string | null;\n created_by: string;\n created_at: string;\n updated_at: string;\n completed_at?: string | null;\n}\n\nexport const TASK_STATUS_ORDER: TaskStatus[] = [\n \"in_progress\",\n \"ready\",\n \"pending_approval\",\n \"backlog\",\n \"done\",\n];\n\nexport const TASK_STATUS_LABEL: Record<TaskStatus, string> = {\n in_progress: \"In Progress\",\n ready: \"Ready\",\n pending_approval: \"Pending Approval\",\n backlog: \"Backlog\",\n done: \"Done\",\n};\n\nexport const TASK_PRIORITY_LABEL: Record<TaskPriority, string> = {\n critical: \"Critical\",\n high: \"High\",\n medium: \"Medium\",\n low: \"Low\",\n};\n\n// Domain objects\nexport interface TaskInfo {\n id: string;\n title: string;\n status: string;\n priority: string;\n assignees: string[];\n conversation_id?: string;\n}\n\nexport interface MemoryInfo {\n id: string;\n type: string;\n content: string;\n source?: string;\n edges?: Array<{ target: string; relation: string }>;\n}\n\nexport interface CronJobInfo {\n id: string;\n name: string;\n schedule: string;\n last_run?: string;\n next_run?: string;\n status: string;\n}\n\nexport interface AgentInfo {\n id: string;\n name: string;\n detail: string;\n status?: string;\n}\n\nexport interface ModelOption {\n id: string;\n name: string;\n provider: string;\n context_window?: number;\n capabilities?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nexport function tryParseJson(text: string): Record<string, unknown> | null {\n if (!text || text.trim().length === 0) return null;\n try {\n const parsed = JSON.parse(text);\n if (typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function isErrorResult(text: string, parsed: Record<string, unknown> | null): boolean {\n if (parsed?.error) return true;\n if (parsed?.status === \"error\") return true;\n if (parsed?.success === false) return true;\n if (typeof parsed?.exit_code === \"number\" && parsed.exit_code !== 0) return true;\n const lower = text.toLowerCase();\n return (\n lower.startsWith(\"error:\") ||\n lower.startsWith(\"error -\") ||\n lower.startsWith(\"failed:\") ||\n lower.startsWith(\"toolset error:\")\n );\n}\n\n// ---------------------------------------------------------------------------\n// Transcript → TranscriptItem[] pairing\n// ---------------------------------------------------------------------------\n\n/**\n * Walk a flat TranscriptStep[] and pair each tool_call with its tool_result\n * via call_id matching, plus emit standalone text steps. Returns an ordered\n * list of renderable items: text blocks and paired tool calls.\n */\nexport function pairTranscriptSteps(steps: TranscriptStep[]): TranscriptItem[] {\n const items: TranscriptItem[] = [];\n const resultsById = new Map<string, { name: string; text: string }>();\n\n // First pass: index all tool_result steps by call_id\n for (const step of steps) {\n if (step.type === \"tool_result\") {\n resultsById.set(step.call_id, { name: step.name, text: step.text });\n }\n }\n\n // Second pass: emit items in order\n for (const step of steps) {\n if (step.type === \"action\") {\n for (const content of step.content) {\n if (content.type === \"text\") {\n items.push({ kind: \"text\", text: content.text });\n } else if (content.type === \"tool_call\") {\n const result = resultsById.get(content.id);\n const parsedArgs = tryParseJson(content.args);\n const parsedResult = result ? tryParseJson(result.text) : null;\n\n const hasError = result ? isErrorResult(result.text, parsedResult) : false;\n\n items.push({\n kind: \"tool\",\n pair: {\n id: content.id,\n name: content.name,\n argsRaw: content.args,\n args: parsedArgs,\n resultRaw: result?.text ?? null,\n result: parsedResult,\n status: result ? (hasError ? \"error\" : \"completed\") : \"running\",\n },\n });\n }\n }\n }\n }\n\n return items;\n}\n",
6
- "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/ToolCall.tsx), MIT, rebuilt on Material Design 3.\n\nimport { useId, useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Icon } from \"@aphrody/m3-primitives\";\nimport type { ToolCallPair, ToolCallStatus } from \"./types\";\nimport { CircularIndicator, StatusChip, expandMotion, focusRing } from \"./internal\";\nimport { McpAppCard } from \"./McpAppCard\";\n\n// ---------------------------------------------------------------------------\n// Tool-specific rendering\n// ---------------------------------------------------------------------------\n\ninterface ToolRenderer {\n summary(pair: ToolCallPair): string | null;\n argsView?(pair: ToolCallPair): React.ReactNode | null;\n resultView?(pair: ToolCallPair): React.ReactNode | null;\n}\n\n/** The first present argument among `keys` (the tools name the same argument differently). */\nfunction firstArg(pair: ToolCallPair, keys: readonly string[]): unknown {\n for (const key of keys) {\n const value = pair.args?.[key];\n if (value !== undefined && value !== null) return value;\n }\n return undefined;\n}\n\nconst pathSummary =\n (pathKeys: readonly string[]): ToolRenderer[\"summary\"] =>\n (pair) => {\n if (pair.title) return pair.title;\n const path = firstArg(pair, pathKeys);\n return path ? truncate(String(path), 60) : null;\n };\n\nconst fileResultView = (pair: ToolCallPair) =>\n pair.resultRaw ? <ResultLine text={truncate(pair.resultRaw, 100)} /> : null;\n\n/** `file_read` and `read`: the path with its optional line window, output in a collapsible block. */\nfunction fileRead(pathKeys: readonly string[]): ToolRenderer {\n return {\n summary: pathSummary(pathKeys),\n argsView(pair) {\n const path = firstArg(pair, pathKeys);\n if (!path) return null;\n const offset = pair.args?.offset;\n const limit = pair.args?.limit;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <p className=\"font-code text-body-small text-on-surface-variant\">\n {String(path)}\n {offset ? ` (from line ${offset})` : \"\"}\n {limit ? ` (${limit} lines)` : \"\"}\n </p>\n </div>\n );\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={30} />;\n },\n };\n}\n\n/** `file_write` and `write`: the path and a preview of the content. */\nfunction fileWrite(pathKeys: readonly string[]): ToolRenderer {\n return {\n summary: pathSummary(pathKeys),\n argsView(pair) {\n const path = firstArg(pair, pathKeys);\n const content = pair.args?.content;\n if (!path && !content) return null;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n {!!path && (\n <p className=\"mb-1 font-code text-body-small text-on-surface-variant\">{String(path)}</p>\n )}\n {!!content && (\n <pre className=\"max-h-40 overflow-auto font-code text-body-small text-outline\">\n {truncate(String(content), 2000)}\n </pre>\n )}\n </div>\n );\n },\n resultView: fileResultView,\n };\n}\n\n/** `file_edit` and `edit`: the path and the old / new text. */\nfunction fileEdit(\n pathKeys: readonly string[],\n oldKeys: readonly string[],\n newKeys: readonly string[],\n): ToolRenderer {\n // Whole class names, so Tailwind's scanner finds them.\n const TONE = { error: \"text-error\", success: \"text-success\" } as const;\n const side = (label: string, tone: keyof typeof TONE, text: unknown) =>\n text ? (\n <div className=\"mt-1\">\n <p className={`text-body-small font-medium ${TONE[tone]}`}>{label}</p>\n <pre className={`max-h-20 overflow-auto font-code text-body-small ${TONE[tone]}`}>\n {truncate(String(text), 500)}\n </pre>\n </div>\n ) : null;\n return {\n summary: pathSummary(pathKeys),\n argsView(pair) {\n const path = firstArg(pair, pathKeys);\n if (!path) return null;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <p className=\"mb-1 font-code text-body-small text-on-surface-variant\">{String(path)}</p>\n {side(\"Old\", \"error\", firstArg(pair, oldKeys))}\n {side(\"New\", \"success\", firstArg(pair, newKeys))}\n </div>\n );\n },\n resultView: fileResultView,\n };\n}\n\nconst toolRenderers: Record<string, ToolRenderer> = {\n file_read: fileRead([\"path\"]),\n file_write: fileWrite([\"path\"]),\n file_edit: fileEdit([\"path\"], [\"old_string\"], [\"new_string\"]),\n\n file_list: {\n summary: pathSummary([\"path\"]),\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={30} />;\n },\n },\n\n set_status: {\n summary(pair) {\n const kind = pair.args?.kind;\n const message = pair.args?.message;\n if (kind === \"outcome\") {\n return message ? `Outcome: ${truncate(String(message), 50)}` : \"Outcome set\";\n }\n return message ? truncate(String(message), 60) : null;\n },\n resultView() {\n return null;\n },\n },\n\n // OpenCode tools\n\n read: fileRead([\"filePath\", \"file_path\"]),\n write: fileWrite([\"filePath\", \"file_path\"]),\n edit: fileEdit([\"filePath\", \"file_path\"], [\"oldString\", \"old_string\"], [\"newString\", \"new_string\"]),\n\n glob: {\n summary(pair) {\n if (pair.title) return pair.title;\n const pattern = pair.args?.pattern;\n return pattern ? truncate(String(pattern), 60) : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n\n grep: {\n summary(pair) {\n if (pair.title) return pair.title;\n const pattern = pair.args?.pattern;\n const include = pair.args?.include;\n if (pattern && include) {\n return `/${pattern}/ in ${include}`;\n }\n return pattern ? `/${truncate(String(pattern), 40)}/` : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n\n webfetch: {\n summary(pair) {\n if (pair.title) return pair.title;\n const url = pair.args?.url;\n return url ? truncate(String(url), 60) : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n\n read_skill: {\n summary(pair) {\n if (pair.title) return pair.title;\n const name = pair.args?.name;\n return name ? String(name) : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={30} />;\n },\n },\n\n web_search: {\n summary(pair) {\n if (pair.title) return pair.title;\n const query = pair.args?.query;\n const resultCount =\n pair.result?.result_count ??\n (Array.isArray(pair.result?.results) ? (pair.result!.results as unknown[]).length : null);\n const queryStr = query ? truncate(String(query), 50) : null;\n if (queryStr && resultCount != null) {\n return `${queryStr} (${resultCount} result${resultCount !== 1 ? \"s\" : \"\"})`;\n }\n return queryStr;\n },\n argsView(pair) {\n const query = pair.args?.query;\n if (!query) return null;\n const count = pair.args?.count;\n const freshness = pair.args?.freshness;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <p className=\"text-body-small text-on-surface-variant\">\n <span className=\"select-none text-outline\">Search: </span>\n {String(query)}\n </p>\n {!!(count || freshness) && (\n <p className=\"mt-0.5 text-body-small text-outline\">\n {count ? `${count} results` : \"\"}\n {count && freshness ? \" · \" : \"\"}\n {freshness ? `${freshness}` : \"\"}\n </p>\n )}\n </div>\n );\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n\n spacebot_docs: {\n summary(pair) {\n if (pair.title) return pair.title;\n const action = pair.args?.action;\n const docId = pair.args?.doc_id;\n if (action === \"read\" && docId) {\n return truncate(String(docId), 50);\n }\n return action ? String(action) : \"list\";\n },\n argsView(pair) {\n const action = pair.args?.action;\n const docId = pair.args?.doc_id;\n const query = pair.args?.query;\n if (!action && !docId) return null;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n {!!docId && (\n <p className=\"font-code text-body-small text-on-surface-variant\">{String(docId)}</p>\n )}\n {!!query && (\n <p className=\"mt-0.5 text-body-small text-outline\">filter: {String(query)}</p>\n )}\n </div>\n );\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={30} />;\n },\n },\n\n todowrite: {\n summary(pair) {\n if (pair.title) return pair.title;\n return \"Update tasks\";\n },\n resultView() {\n return null;\n },\n },\n\n task: {\n summary(pair) {\n if (pair.title) return pair.title;\n const description = pair.args?.description;\n return description ? truncate(String(description), 60) : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n};\n\nconst defaultRenderer: ToolRenderer = {\n summary(pair) {\n if (!pair.argsRaw || pair.argsRaw === \"{}\") return null;\n return truncate(pair.argsRaw, 60);\n },\n};\n\nfunction getRenderer(name: string): ToolRenderer {\n return toolRenderers[name] ?? defaultRenderer;\n}\n\n// ---------------------------------------------------------------------------\n// Shared sub-components\n// ---------------------------------------------------------------------------\n\nfunction ResultLine({ text }: { text: string }) {\n return <p className=\"px-3 py-2 text-body-small text-on-surface-variant\">{text}</p>;\n}\n\nfunction CollapsiblePre({ text, maxLines = 20 }: { text: string; maxLines?: number }) {\n const [expanded, setExpanded] = useState(false);\n const lines = text.split(\"\\n\");\n const needsCollapse = lines.length > maxLines;\n const displayText =\n needsCollapse && !expanded ? lines.slice(0, maxLines).join(\"\\n\") + \"\\n...\" : text;\n\n return (\n <div>\n <pre className=\"max-h-80 overflow-auto whitespace-pre-wrap px-3 py-2 font-code text-body-small text-on-surface-variant\">\n {displayText}\n </pre>\n {needsCollapse && (\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className={clsx(\n \"flex h-8 w-full items-center justify-center gap-1 border-t border-outline-variant px-3 text-label-medium text-primary\",\n \"transition-colors duration-200 ease-standard hover:bg-primary/8 active:bg-primary/10\",\n focusRing,\n )}\n >\n <Icon\n name=\"expand_more\"\n size={18}\n className={clsx(\n \"transition-transform duration-200 ease-standard\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Show less\" : `Show all ${lines.length} lines`}\n </button>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status display helpers\n// ---------------------------------------------------------------------------\n\n/** Material Symbols glyph per status (the running state shows a circular indicator). */\nconst STATUS_ICONS: Record<ToolCallStatus, string> = {\n running: \"pending\",\n completed: \"check_circle\",\n error: \"error\",\n};\n\nconst STATUS_COLORS: Record<ToolCallStatus, string> = {\n running: \"text-primary\",\n completed: \"text-success\",\n error: \"text-error\",\n};\n\nconst STATUS_LABELS: Record<ToolCallStatus, string> = {\n running: \"Running\",\n completed: \"Completed\",\n error: \"Error\",\n};\n\n/** Leading Material Symbol per tool family. */\nfunction toolIcon(name: string): string {\n if (name.startsWith(\"file_\") || name === \"read\" || name === \"write\" || name === \"edit\") {\n return \"description\";\n }\n if (name === \"glob\" || name === \"grep\" || name === \"web_search\") return \"search\";\n if (name === \"webfetch\") return \"language\";\n if (name === \"set_status\") return \"schedule\";\n return \"build\";\n}\n\nfunction formatToolName(name: string): string {\n const overrides: Record<string, string> = {\n webfetch: \"Web Fetch\",\n todowrite: \"Todo\",\n read_skill: \"Read Skill\",\n web_search: \"Web Search\",\n spacebot_docs: \"Docs\",\n };\n if (overrides[name]) return overrides[name];\n\n const stripped = name.replace(/^file_/, \"\");\n\n return stripped\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction toolCategory(name: string): string | null {\n if (name.startsWith(\"file_\")) return \"File\";\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface ToolCallProps {\n pair: ToolCallPair;\n /** Start expanded (uncontrolled). */\n defaultExpanded?: boolean;\n className?: string;\n}\n\n/**\n * A tool invocation as an M3 outlined card: status + tool name header (`text-label-large`),\n * summary, and an expandable body with arguments and result blocks in `font-code`.\n */\nexport function ToolCall({ pair, defaultExpanded = false, className }: ToolCallProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const bodyId = useId();\n const renderer = getRenderer(pair.name);\n const summary = renderer.summary(pair);\n const category = toolCategory(pair.name);\n const displayName = formatToolName(pair.name);\n const isError = pair.status === \"error\";\n\n const args = expanded ? renderArgs(pair, renderer) : null;\n const result = expanded ? renderResult(pair, renderer) : null;\n\n return (\n <div\n data-status={pair.status}\n className={clsx(\n \"m3-tool-call min-w-0 overflow-hidden rounded-medium border bg-surface-container-low text-on-surface\",\n isError ? \"border-error\" : \"border-outline-variant\",\n className,\n )}\n >\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n aria-controls={bodyId}\n className={clsx(\n \"flex min-h-10 w-full items-center gap-2 rounded-medium px-3 py-2 text-left\",\n \"transition-colors duration-200 ease-standard hover:bg-on-surface/8 active:bg-on-surface/10\",\n focusRing,\n )}\n >\n <span\n className={clsx(\n \"flex size-5 shrink-0 items-center justify-center\",\n STATUS_COLORS[pair.status],\n )}\n >\n {pair.status === \"running\" ? (\n <CircularIndicator size={16} label=\"Running\" />\n ) : (\n <Icon\n name={STATUS_ICONS[pair.status]}\n size={18}\n filled\n label={STATUS_LABELS[pair.status]}\n />\n )}\n </span>\n <Icon name={toolIcon(pair.name)} size={18} className=\"shrink-0 text-on-surface-variant\" />\n {category && <span className=\"text-label-medium text-outline\">{category}</span>}\n <span className=\"shrink-0 text-label-large text-on-surface\">{displayName}</span>\n {summary && !expanded ? (\n <span className=\"min-w-0 flex-1 truncate text-body-small text-on-surface-variant\">\n {summary}\n </span>\n ) : (\n <span className=\"flex-1\" />\n )}\n {isError && (\n <StatusChip tone=\"error\" className=\"h-5 px-1.5 text-label-small\">\n error\n </StatusChip>\n )}\n <Icon\n name=\"expand_more\"\n size={20}\n className={clsx(\n \"shrink-0 text-on-surface-variant transition-transform duration-300 ease-emphasized\",\n expanded && \"rotate-180\",\n )}\n />\n </button>\n\n <AnimatePresence initial={false}>\n {expanded ? (\n <motion.div id={bodyId} key=\"body\" {...expandMotion} className=\"overflow-hidden\">\n <div className=\"flex flex-col gap-2 border-t border-outline-variant px-3 py-3\">\n {args}\n {result != null && result !== false ? (\n <div\n className={clsx(\n \"m3-tool-result overflow-hidden rounded-small\",\n isError\n ? \"bg-error-container text-on-error-container [&_.text-on-surface-variant]:text-on-error-container [&_.text-outline]:text-on-error-container/80\"\n : \"bg-surface-container-highest text-on-surface-variant\",\n )}\n >\n {result}\n </div>\n ) : null}\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n );\n}\n\nfunction renderArgs(pair: ToolCallPair, renderer: ToolRenderer): React.ReactNode {\n if (renderer.argsView) {\n const custom = renderer.argsView(pair);\n if (custom) return custom;\n }\n\n if (pair.args && Object.keys(pair.args).length > 0) {\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <div className=\"flex flex-col gap-0.5\">\n {Object.entries(pair.args).map(([key, value]) => (\n <p key={key} className=\"font-code text-body-small\">\n <span className=\"text-outline\">{key}: </span>\n <span className=\"text-on-surface-variant\">{formatArgValue(key, value)}</span>\n </p>\n ))}\n </div>\n </div>\n );\n }\n\n if (pair.argsRaw && pair.argsRaw !== \"{}\" && pair.argsRaw.trim().length > 0) {\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <pre className=\"max-h-40 overflow-auto font-code text-body-small text-on-surface-variant\">\n {pair.argsRaw}\n </pre>\n </div>\n );\n }\n\n return null;\n}\n\nfunction renderResult(pair: ToolCallPair, renderer: ToolRenderer): React.ReactNode {\n if (pair.status === \"running\") {\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 text-body-small text-on-surface-variant\">\n <CircularIndicator size={14} label=\"Running\" />\n Running...\n </div>\n );\n }\n\n if (renderer.resultView) {\n const custom = renderer.resultView(pair);\n if (custom !== undefined) return custom;\n }\n\n if (!pair.resultRaw) return null;\n\n // Check if result contains an interactive MCP-UI resource or app\n const mcpResourceUri = (pair.result?._meta as any)?.ui?.resourceUri || (pair.result?.ui as any)?.resourceUri;\n const mcpHtml = (pair.result as any)?.html || (pair.result as any)?.uiHtml;\n if (mcpResourceUri || mcpHtml) {\n return (\n <div className=\"p-1\">\n <McpAppCard\n toolName={pair.name}\n title={pair.title || pair.name}\n html={typeof mcpHtml === \"string\" ? mcpHtml : undefined}\n toolResourceUri={typeof mcpResourceUri === \"string\" ? mcpResourceUri : undefined}\n toolInput={pair.args || undefined}\n toolResult={pair.result || undefined}\n />\n </div>\n );\n }\n\n if (pair.result && Object.keys(pair.result).length > 0) {\n return (\n <div className=\"px-3 py-2\">\n <div className=\"flex flex-col gap-0.5\">\n {Object.entries(pair.result).map(([key, value]) => (\n <p key={key} className=\"font-code text-body-small\">\n <span className=\"text-outline\">{key}: </span>\n <span className=\"text-on-surface-variant\">\n {typeof value === \"string\" ? truncate(value, 200) : JSON.stringify(value)}\n </span>\n </p>\n ))}\n </div>\n </div>\n );\n }\n\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n}\n\nfunction formatArgValue(key: string, value: unknown): string {\n if (key === \"secret\" && typeof value === \"string\") {\n return \"***\";\n }\n if (typeof value === \"string\") {\n return truncate(value, 100);\n }\n if (typeof value === \"boolean\" || typeof value === \"number\") {\n return String(value);\n }\n return JSON.stringify(value);\n}\n\nfunction truncate(text: string, maxLen: number): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen) + \"...\";\n}\n",
6
+ "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/ToolCall.tsx), MIT, rebuilt on Material Design 3.\n\nimport { useId, useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Icon } from \"@aphrody/m3-primitives\";\nimport type { ToolCallPair, ToolCallStatus } from \"./types\";\nimport { CircularIndicator, StatusChip, expandMotion, focusRing } from \"./internal\";\nimport { McpAppCard } from \"./McpAppCard\";\n\n// ---------------------------------------------------------------------------\n// Tool-specific rendering\n// ---------------------------------------------------------------------------\n\ninterface ToolRenderer {\n summary(pair: ToolCallPair): string | null;\n argsView?(pair: ToolCallPair): React.ReactNode | null;\n resultView?(pair: ToolCallPair): React.ReactNode | null;\n}\n\n/** The first present argument among `keys` (the tools name the same argument differently). */\nfunction firstArg(pair: ToolCallPair, keys: readonly string[]): unknown {\n for (const key of keys) {\n const value = pair.args?.[key];\n if (value !== undefined && value !== null) return value;\n }\n return undefined;\n}\n\nconst pathSummary =\n (pathKeys: readonly string[]): ToolRenderer[\"summary\"] =>\n (pair) => {\n if (pair.title) return pair.title;\n const path = firstArg(pair, pathKeys);\n return path ? truncate(String(path), 60) : null;\n };\n\nconst fileResultView = (pair: ToolCallPair) =>\n pair.resultRaw ? <ResultLine text={truncate(pair.resultRaw, 100)} /> : null;\n\n/** `file_read` and `read`: the path with its optional line window, output in a collapsible block. */\nfunction fileRead(pathKeys: readonly string[]): ToolRenderer {\n return {\n summary: pathSummary(pathKeys),\n argsView(pair) {\n const path = firstArg(pair, pathKeys);\n if (!path) return null;\n const offset = pair.args?.offset;\n const limit = pair.args?.limit;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <p className=\"font-code text-body-small text-on-surface-variant\">\n {String(path)}\n {offset ? ` (from line ${offset})` : \"\"}\n {limit ? ` (${limit} lines)` : \"\"}\n </p>\n </div>\n );\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={30} />;\n },\n };\n}\n\n/** `file_write` and `write`: the path and a preview of the content. */\nfunction fileWrite(pathKeys: readonly string[]): ToolRenderer {\n return {\n summary: pathSummary(pathKeys),\n argsView(pair) {\n const path = firstArg(pair, pathKeys);\n const content = pair.args?.content;\n if (!path && !content) return null;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n {!!path && (\n <p className=\"mb-1 font-code text-body-small text-on-surface-variant\">{String(path)}</p>\n )}\n {!!content && (\n <pre className=\"max-h-40 overflow-auto font-code text-body-small text-outline\">\n {truncate(String(content), 2000)}\n </pre>\n )}\n </div>\n );\n },\n resultView: fileResultView,\n };\n}\n\n/** `file_edit` and `edit`: the path and the old / new text. */\nfunction fileEdit(\n pathKeys: readonly string[],\n oldKeys: readonly string[],\n newKeys: readonly string[],\n): ToolRenderer {\n // Whole class names, so Tailwind's scanner finds them.\n const TONE = { error: \"text-error\", success: \"text-success\" } as const;\n const side = (label: string, tone: keyof typeof TONE, text: unknown) =>\n text ? (\n <div className=\"mt-1\">\n <p className={`text-body-small font-medium ${TONE[tone]}`}>{label}</p>\n <pre className={`max-h-20 overflow-auto font-code text-body-small ${TONE[tone]}`}>\n {truncate(String(text), 500)}\n </pre>\n </div>\n ) : null;\n return {\n summary: pathSummary(pathKeys),\n argsView(pair) {\n const path = firstArg(pair, pathKeys);\n if (!path) return null;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <p className=\"mb-1 font-code text-body-small text-on-surface-variant\">{String(path)}</p>\n {side(\"Old\", \"error\", firstArg(pair, oldKeys))}\n {side(\"New\", \"success\", firstArg(pair, newKeys))}\n </div>\n );\n },\n resultView: fileResultView,\n };\n}\n\nconst toolRenderers: Record<string, ToolRenderer> = {\n file_read: fileRead([\"path\"]),\n file_write: fileWrite([\"path\"]),\n file_edit: fileEdit([\"path\"], [\"old_string\"], [\"new_string\"]),\n\n file_list: {\n summary: pathSummary([\"path\"]),\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={30} />;\n },\n },\n\n set_status: {\n summary(pair) {\n const kind = pair.args?.kind;\n const message = pair.args?.message;\n if (kind === \"outcome\") {\n return message ? `Outcome: ${truncate(String(message), 50)}` : \"Outcome set\";\n }\n return message ? truncate(String(message), 60) : null;\n },\n resultView() {\n return null;\n },\n },\n\n // OpenCode tools\n\n read: fileRead([\"filePath\", \"file_path\"]),\n write: fileWrite([\"filePath\", \"file_path\"]),\n edit: fileEdit(\n [\"filePath\", \"file_path\"],\n [\"oldString\", \"old_string\"],\n [\"newString\", \"new_string\"],\n ),\n\n glob: {\n summary(pair) {\n if (pair.title) return pair.title;\n const pattern = pair.args?.pattern;\n return pattern ? truncate(String(pattern), 60) : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n\n grep: {\n summary(pair) {\n if (pair.title) return pair.title;\n const pattern = pair.args?.pattern;\n const include = pair.args?.include;\n if (pattern && include) {\n return `/${pattern}/ in ${include}`;\n }\n return pattern ? `/${truncate(String(pattern), 40)}/` : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n\n webfetch: {\n summary(pair) {\n if (pair.title) return pair.title;\n const url = pair.args?.url;\n return url ? truncate(String(url), 60) : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n\n read_skill: {\n summary(pair) {\n if (pair.title) return pair.title;\n const name = pair.args?.name;\n return name ? String(name) : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={30} />;\n },\n },\n\n web_search: {\n summary(pair) {\n if (pair.title) return pair.title;\n const query = pair.args?.query;\n const resultCount =\n pair.result?.result_count ??\n (Array.isArray(pair.result?.results) ? (pair.result!.results as unknown[]).length : null);\n const queryStr = query ? truncate(String(query), 50) : null;\n if (queryStr && resultCount != null) {\n return `${queryStr} (${resultCount} result${resultCount !== 1 ? \"s\" : \"\"})`;\n }\n return queryStr;\n },\n argsView(pair) {\n const query = pair.args?.query;\n if (!query) return null;\n const count = pair.args?.count;\n const freshness = pair.args?.freshness;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <p className=\"text-body-small text-on-surface-variant\">\n <span className=\"select-none text-outline\">Search: </span>\n {String(query)}\n </p>\n {!!(count || freshness) && (\n <p className=\"mt-0.5 text-body-small text-outline\">\n {count ? `${count} results` : \"\"}\n {count && freshness ? \" · \" : \"\"}\n {freshness ? `${freshness}` : \"\"}\n </p>\n )}\n </div>\n );\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n\n spacebot_docs: {\n summary(pair) {\n if (pair.title) return pair.title;\n const action = pair.args?.action;\n const docId = pair.args?.doc_id;\n if (action === \"read\" && docId) {\n return truncate(String(docId), 50);\n }\n return action ? String(action) : \"list\";\n },\n argsView(pair) {\n const action = pair.args?.action;\n const docId = pair.args?.doc_id;\n const query = pair.args?.query;\n if (!action && !docId) return null;\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n {!!docId && (\n <p className=\"font-code text-body-small text-on-surface-variant\">{String(docId)}</p>\n )}\n {!!query && (\n <p className=\"mt-0.5 text-body-small text-outline\">filter: {String(query)}</p>\n )}\n </div>\n );\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={30} />;\n },\n },\n\n todowrite: {\n summary(pair) {\n if (pair.title) return pair.title;\n return \"Update tasks\";\n },\n resultView() {\n return null;\n },\n },\n\n task: {\n summary(pair) {\n if (pair.title) return pair.title;\n const description = pair.args?.description;\n return description ? truncate(String(description), 60) : null;\n },\n resultView(pair) {\n if (!pair.resultRaw) return null;\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n },\n },\n};\n\nconst defaultRenderer: ToolRenderer = {\n summary(pair) {\n if (!pair.argsRaw || pair.argsRaw === \"{}\") return null;\n return truncate(pair.argsRaw, 60);\n },\n};\n\nfunction getRenderer(name: string): ToolRenderer {\n return toolRenderers[name] ?? defaultRenderer;\n}\n\n// ---------------------------------------------------------------------------\n// Shared sub-components\n// ---------------------------------------------------------------------------\n\nfunction ResultLine({ text }: { text: string }) {\n return <p className=\"px-3 py-2 text-body-small text-on-surface-variant\">{text}</p>;\n}\n\nfunction CollapsiblePre({ text, maxLines = 20 }: { text: string; maxLines?: number }) {\n const [expanded, setExpanded] = useState(false);\n const lines = text.split(\"\\n\");\n const needsCollapse = lines.length > maxLines;\n const displayText =\n needsCollapse && !expanded ? lines.slice(0, maxLines).join(\"\\n\") + \"\\n...\" : text;\n\n return (\n <div>\n <pre className=\"max-h-80 overflow-auto whitespace-pre-wrap px-3 py-2 font-code text-body-small text-on-surface-variant\">\n {displayText}\n </pre>\n {needsCollapse && (\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n className={clsx(\n \"flex h-8 w-full items-center justify-center gap-1 border-t border-outline-variant px-3 text-label-medium text-primary\",\n \"transition-colors duration-200 ease-standard hover:bg-primary/8 active:bg-primary/10\",\n focusRing,\n )}\n >\n <Icon\n name=\"expand_more\"\n size={18}\n className={clsx(\n \"transition-transform duration-200 ease-standard\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Show less\" : `Show all ${lines.length} lines`}\n </button>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status display helpers\n// ---------------------------------------------------------------------------\n\n/** Material Symbols glyph per status (the running state shows a circular indicator). */\nconst STATUS_ICONS: Record<ToolCallStatus, string> = {\n running: \"pending\",\n completed: \"check_circle\",\n error: \"error\",\n};\n\nconst STATUS_COLORS: Record<ToolCallStatus, string> = {\n running: \"text-primary\",\n completed: \"text-success\",\n error: \"text-error\",\n};\n\nconst STATUS_LABELS: Record<ToolCallStatus, string> = {\n running: \"Running\",\n completed: \"Completed\",\n error: \"Error\",\n};\n\n/** Leading Material Symbol per tool family. */\nfunction toolIcon(name: string): string {\n if (name.startsWith(\"file_\") || name === \"read\" || name === \"write\" || name === \"edit\") {\n return \"description\";\n }\n if (name === \"glob\" || name === \"grep\" || name === \"web_search\") return \"search\";\n if (name === \"webfetch\") return \"language\";\n if (name === \"set_status\") return \"schedule\";\n return \"build\";\n}\n\nfunction formatToolName(name: string): string {\n const overrides: Record<string, string> = {\n webfetch: \"Web Fetch\",\n todowrite: \"Todo\",\n read_skill: \"Read Skill\",\n web_search: \"Web Search\",\n spacebot_docs: \"Docs\",\n };\n if (overrides[name]) return overrides[name];\n\n const stripped = name.replace(/^file_/, \"\");\n\n return stripped\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction toolCategory(name: string): string | null {\n if (name.startsWith(\"file_\")) return \"File\";\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport interface ToolCallProps {\n pair: ToolCallPair;\n /** Start expanded (uncontrolled). */\n defaultExpanded?: boolean;\n className?: string;\n}\n\n/**\n * A tool invocation as an M3 outlined card: status + tool name header (`text-label-large`),\n * summary, and an expandable body with arguments and result blocks in `font-code`.\n */\nexport function ToolCall({ pair, defaultExpanded = false, className }: ToolCallProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const bodyId = useId();\n const renderer = getRenderer(pair.name);\n const summary = renderer.summary(pair);\n const category = toolCategory(pair.name);\n const displayName = formatToolName(pair.name);\n const isError = pair.status === \"error\";\n\n const args = expanded ? renderArgs(pair, renderer) : null;\n const result = expanded ? renderResult(pair, renderer) : null;\n\n return (\n <div\n data-status={pair.status}\n className={clsx(\n \"m3-tool-call min-w-0 overflow-hidden rounded-medium border bg-surface-container-low text-on-surface\",\n isError ? \"border-error\" : \"border-outline-variant\",\n className,\n )}\n >\n <button\n type=\"button\"\n onClick={() => setExpanded(!expanded)}\n aria-expanded={expanded}\n aria-controls={bodyId}\n className={clsx(\n \"flex min-h-10 w-full items-center gap-2 rounded-medium px-3 py-2 text-left\",\n \"transition-colors duration-200 ease-standard hover:bg-on-surface/8 active:bg-on-surface/10\",\n focusRing,\n )}\n >\n <span\n className={clsx(\n \"flex size-5 shrink-0 items-center justify-center\",\n STATUS_COLORS[pair.status],\n )}\n >\n {pair.status === \"running\" ? (\n <CircularIndicator size={16} label=\"Running\" />\n ) : (\n <Icon\n name={STATUS_ICONS[pair.status]}\n size={18}\n filled\n label={STATUS_LABELS[pair.status]}\n />\n )}\n </span>\n <Icon name={toolIcon(pair.name)} size={18} className=\"shrink-0 text-on-surface-variant\" />\n {category && <span className=\"text-label-medium text-outline\">{category}</span>}\n <span className=\"shrink-0 text-label-large text-on-surface\">{displayName}</span>\n {summary && !expanded ? (\n <span className=\"min-w-0 flex-1 truncate text-body-small text-on-surface-variant\">\n {summary}\n </span>\n ) : (\n <span className=\"flex-1\" />\n )}\n {isError && (\n <StatusChip tone=\"error\" className=\"h-5 px-1.5 text-label-small\">\n error\n </StatusChip>\n )}\n <Icon\n name=\"expand_more\"\n size={20}\n className={clsx(\n \"shrink-0 text-on-surface-variant transition-transform duration-300 ease-emphasized\",\n expanded && \"rotate-180\",\n )}\n />\n </button>\n\n <AnimatePresence initial={false}>\n {expanded ? (\n <motion.div id={bodyId} key=\"body\" {...expandMotion} className=\"overflow-hidden\">\n <div className=\"flex flex-col gap-2 border-t border-outline-variant px-3 py-3\">\n {args}\n {result != null && result !== false ? (\n <div\n className={clsx(\n \"m3-tool-result overflow-hidden rounded-small\",\n isError\n ? \"bg-error-container text-on-error-container [&_.text-on-surface-variant]:text-on-error-container [&_.text-outline]:text-on-error-container/80\"\n : \"bg-surface-container-highest text-on-surface-variant\",\n )}\n >\n {result}\n </div>\n ) : null}\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n );\n}\n\nfunction renderArgs(pair: ToolCallPair, renderer: ToolRenderer): React.ReactNode {\n if (renderer.argsView) {\n const custom = renderer.argsView(pair);\n if (custom) return custom;\n }\n\n if (pair.args && Object.keys(pair.args).length > 0) {\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <div className=\"flex flex-col gap-0.5\">\n {Object.entries(pair.args).map(([key, value]) => (\n <p key={key} className=\"font-code text-body-small\">\n <span className=\"text-outline\">{key}: </span>\n <span className=\"text-on-surface-variant\">{formatArgValue(key, value)}</span>\n </p>\n ))}\n </div>\n </div>\n );\n }\n\n if (pair.argsRaw && pair.argsRaw !== \"{}\" && pair.argsRaw.trim().length > 0) {\n return (\n <div className=\"rounded-small bg-surface-container-highest px-3 py-2\">\n <pre className=\"max-h-40 overflow-auto font-code text-body-small text-on-surface-variant\">\n {pair.argsRaw}\n </pre>\n </div>\n );\n }\n\n return null;\n}\n\nfunction renderResult(pair: ToolCallPair, renderer: ToolRenderer): React.ReactNode {\n if (pair.status === \"running\") {\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 text-body-small text-on-surface-variant\">\n <CircularIndicator size={14} label=\"Running\" />\n Running...\n </div>\n );\n }\n\n if (renderer.resultView) {\n const custom = renderer.resultView(pair);\n if (custom !== undefined) return custom;\n }\n\n if (!pair.resultRaw) return null;\n\n // Check if result contains an interactive MCP-UI resource or app\n const mcpResourceUri =\n (pair.result?._meta as any)?.ui?.resourceUri || (pair.result?.ui as any)?.resourceUri;\n const mcpHtml = (pair.result as any)?.html || (pair.result as any)?.uiHtml;\n if (mcpResourceUri || mcpHtml) {\n return (\n <div className=\"p-1\">\n <McpAppCard\n toolName={pair.name}\n title={pair.title || pair.name}\n html={typeof mcpHtml === \"string\" ? mcpHtml : undefined}\n toolResourceUri={typeof mcpResourceUri === \"string\" ? mcpResourceUri : undefined}\n toolInput={pair.args || undefined}\n toolResult={pair.result || undefined}\n />\n </div>\n );\n }\n\n if (pair.result && Object.keys(pair.result).length > 0) {\n return (\n <div className=\"px-3 py-2\">\n <div className=\"flex flex-col gap-0.5\">\n {Object.entries(pair.result).map(([key, value]) => (\n <p key={key} className=\"font-code text-body-small\">\n <span className=\"text-outline\">{key}: </span>\n <span className=\"text-on-surface-variant\">\n {typeof value === \"string\" ? truncate(value, 200) : JSON.stringify(value)}\n </span>\n </p>\n ))}\n </div>\n </div>\n );\n }\n\n return <CollapsiblePre text={pair.resultRaw} maxLines={20} />;\n}\n\nfunction formatArgValue(key: string, value: unknown): string {\n if (key === \"secret\" && typeof value === \"string\") {\n return \"***\";\n }\n if (typeof value === \"string\") {\n return truncate(value, 100);\n }\n if (typeof value === \"boolean\" || typeof value === \"number\") {\n return String(value);\n }\n return JSON.stringify(value);\n}\n\nfunction truncate(text: string, maxLen: number): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen) + \"...\";\n}\n",
7
7
  "// SPDX-License-Identifier: Apache-2.0\n// Shared Material Design 3 building blocks for @aphrody/m3-ai (internal, not exported).\n\nimport { m3Durations, m3Easings } from \"@aphrody/m3-motion\";\nimport { clsx } from \"clsx\";\nimport type { ReactNode } from \"react\";\n\n/** The M3 focus indicator (contract: docs/design/SPACEUI-M3-FUSION.md, \"States\"). */\nexport const focusRing =\n \"outline-none focus-visible:outline-3 focus-visible:outline-secondary focus-visible:outline-offset-2\";\n\n/** Expand / collapse: enter on emphasized decelerate, exit on emphasized accelerate. */\nexport const expandMotion = {\n initial: { height: 0, opacity: 0 },\n animate: {\n height: \"auto\",\n opacity: 1,\n transition: { duration: m3Durations.medium2, ease: m3Easings.emphasizedDecelerate },\n },\n exit: {\n height: 0,\n opacity: 0,\n transition: { duration: m3Durations.short4, ease: m3Easings.emphasizedAccelerate },\n },\n} as const;\n\n/**\n * Indeterminate M3 circular progress indicator (active indicator on `primary` or the current\n * color, 4 dp track gap omitted at small sizes). Replaces the upstream Grid loader.\n */\nexport function CircularIndicator({\n size = 16,\n className,\n label = \"Loading\",\n}: {\n size?: number;\n className?: string;\n label?: string;\n}) {\n const stroke = size <= 16 ? 2 : size <= 24 ? 3 : 4;\n const r = (size - stroke) / 2;\n const c = 2 * Math.PI * r;\n return (\n <span\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 circular indeterminate indicator is an animated SVG arc; a native <progress> cannot render it.\n role=\"progressbar\"\n aria-label={label}\n className={clsx(\"m3-circular-indicator inline-flex shrink-0 text-primary\", className)}\n style={{ width: size, height: size }}\n >\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n className=\"animate-spin\"\n aria-hidden=\"true\"\n >\n <circle\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={`${c * 0.7} ${c}`}\n />\n </svg>\n </span>\n );\n}\n\nexport type ChipTone = \"primary\" | \"success\" | \"error\" | \"warning\" | \"neutral\";\n\nconst chipTones: Record<ChipTone, string> = {\n primary: \"bg-primary-container text-on-primary-container\",\n success: \"bg-success-container text-on-success-container\",\n error: \"bg-error-container text-on-error-container\",\n warning: \"bg-warning-container text-on-warning-container\",\n neutral: \"border border-outline-variant text-on-surface-variant\",\n};\n\n/** Non-interactive M3 assist chip used as a status label (dense, `rounded-small`). */\nexport function StatusChip({\n tone,\n icon,\n children,\n className,\n}: {\n tone: ChipTone;\n icon?: ReactNode;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={clsx(\n \"inline-flex h-6 shrink-0 items-center gap-1 rounded-small px-2 text-label-medium\",\n chipTones[tone],\n className,\n )}\n >\n {icon}\n {children}\n </span>\n );\n}\n",
8
8
  "// SPDX-License-Identifier: Apache-2.0\n/**\n * @aphrody/m3-ai - McpAppCard\n *\n * Material Design 3 Interactive MCP App Container:\n * - Renders generative UI resources produced by MCP tools (SEP-1724 / mcp-ui).\n * - Hosts interactive guest web applications in an isolated sandbox iframe.\n * - Passes reactive M3 theme and color scheme context to the guest app.\n * - Supports expandable full-bleed or embedded card layouts.\n */\n\nimport React, { useState, useRef, useMemo } from \"react\";\nimport { clsx } from \"clsx\";\nimport { AppRenderer, type SandboxConfig, type McpUiHostContext } from \"@aphrody/mcp-ui\";\n\nexport interface McpAppCardProps {\n toolName: string;\n title?: string;\n html?: string;\n toolResourceUri?: string;\n toolInput?: Record<string, unknown>;\n toolResult?: any;\n sandboxUrl?: string;\n isExpandedDefault?: boolean;\n className?: string;\n onAction?: (action: string, payload?: unknown) => void;\n}\n\nexport const McpAppCard: React.FC<McpAppCardProps> = ({\n toolName,\n title,\n html,\n toolResourceUri,\n toolInput,\n toolResult,\n sandboxUrl,\n isExpandedDefault = false,\n className,\n onAction: _onAction,\n}) => {\n const [isExpanded, setIsExpanded] = useState(isExpandedDefault);\n const [hasError, setHasError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Host context with Material Design 3 tokens\n const hostContext: McpUiHostContext = useMemo(() => {\n const isDark =\n typeof window !== \"undefined\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n return {\n theme: isDark ? \"dark\" : \"light\",\n locale: typeof navigator !== \"undefined\" ? navigator.language : \"en-US\",\n displayMode: isExpanded ? \"fullscreen\" : \"inline\",\n };\n }, [isExpanded]);\n\n // Fallback default sandbox proxy URL\n const resolvedSandbox: SandboxConfig = useMemo(() => {\n const url = sandboxUrl ? new URL(sandboxUrl) : new URL(\"https://mcpui.dev/sandbox_proxy.html\");\n return {\n url,\n permissions: \"allow-scripts allow-forms allow-same-origin\",\n };\n }, [sandboxUrl]);\n\n return (\n <div\n ref={containerRef}\n className={clsx(\n \"flex flex-col rounded-3xl border transition-all duration-300 overflow-hidden\",\n \"bg-[var(--md-sys-color-surface-container-low,#f7f2fa)]\",\n \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n \"text-[var(--md-sys-color-on-surface,#1d1b20)]\",\n isExpanded ? \"fixed inset-4 z-50 shadow-2xl\" : \"relative w-full shadow-sm\",\n className,\n )}\n >\n {/* App Card Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-[var(--md-sys-color-outline-variant,#cac4d0)]/40 bg-[var(--md-sys-color-surface-container,#f3edf7)]/60\">\n <div className=\"flex items-center gap-2.5\">\n <div className=\"flex h-7 w-7 items-center justify-center rounded-xl bg-[var(--md-sys-color-primary-container,#eaddff)] text-[var(--md-sys-color-on-primary-container,#21005d)]\">\n <span className=\"material-symbols-outlined text-base\">widgets</span>\n </div>\n\n <div className=\"flex flex-col\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold tracking-tight\">{title || toolName}</span>\n <span className=\"rounded-full bg-[var(--md-sys-color-surface-container-high,#ece6f0)] px-2 py-0.2 text-[10px] font-mono text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n mcp-ui\n </span>\n </div>\n {toolResourceUri && (\n <span className=\"text-[10px] font-mono text-[var(--md-sys-color-outline,#79747e)]\">\n {toolResourceUri}\n </span>\n )}\n </div>\n </div>\n\n {/* Action icons */}\n <div className=\"flex items-center gap-1\">\n <div className=\"flex items-center gap-1 rounded-full bg-emerald-500/10 px-2 py-0.5 text-[10px] font-medium text-emerald-700 dark:text-emerald-400\">\n <span className=\"material-symbols-outlined text-xs\">verified_user</span>\n <span>Sandboxed</span>\n </div>\n\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n title={isExpanded ? \"Collapse\" : \"Expand Fullscreen\"}\n className=\"flex h-7 w-7 items-center justify-center rounded-lg text-[var(--md-sys-color-on-surface-variant,#49454f)] hover:bg-[var(--md-sys-color-surface-container-high,#ece6f0)] transition-colors\"\n >\n <span className=\"material-symbols-outlined text-base\">\n {isExpanded ? \"close_fullscreen\" : \"open_in_full\"}\n </span>\n </button>\n </div>\n </div>\n\n {/* App Frame Content */}\n <div\n className={clsx(\n \"relative w-full overflow-hidden transition-all\",\n isExpanded ? \"flex-1 min-h-[500px]\" : \"h-96\",\n )}\n >\n {hasError ? (\n <div className=\"flex h-full flex-col items-center justify-center p-6 text-center text-xs text-[var(--md-sys-color-error,#b3261e)]\">\n <span className=\"material-symbols-outlined text-3xl mb-1\">error</span>\n <span className=\"font-semibold\">MCP App Render Error</span>\n <p className=\"mt-1 font-mono text-[11px] opacity-80\">{hasError}</p>\n </div>\n ) : html ? (\n <AppRenderer\n toolName={toolName}\n html={html}\n sandbox={resolvedSandbox}\n toolInput={toolInput}\n toolResult={toolResult}\n hostContext={hostContext}\n onError={(err) => setHasError(err.message)}\n />\n ) : (\n <div className=\"flex h-full flex-col items-center justify-center p-6 text-xs text-[var(--md-sys-color-outline,#79747e)]\">\n <span className=\"material-symbols-outlined text-2xl animate-spin mb-1 text-[var(--md-sys-color-primary,#6750a4)]\">\n progress_activity\n </span>\n <span>Awaiting MCP UI Resource ({toolName})...</span>\n </div>\n )}\n </div>\n\n {/* Footer info */}\n {toolInput && (\n <div className=\"flex items-center justify-between px-4 py-2 border-t border-[var(--md-sys-color-outline-variant,#cac4d0)]/30 bg-[var(--md-sys-color-surface-container-lowest,#ffffff)] text-[10px] text-[var(--md-sys-color-outline,#79747e)] font-mono\">\n <span className=\"truncate\">input: {JSON.stringify(toolInput)}</span>\n <span className=\"shrink-0 ml-2\">M3 UI Bridge</span>\n </div>\n )}\n </div>\n );\n};\n",
9
- "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/Markdown.tsx), MIT, rebuilt on Material Design 3.\n\n\"use client\";\n\nimport { Icon } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, isValidElement, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkGfm from \"remark-gfm\";\n\ntype MarkdownSize = \"small\" | \"medium\" | \"large\";\n\ninterface MarkdownProps {\n content: string;\n className?: string;\n /** Body typescale of paragraphs and lists: `text-body-small|medium|large`. Default `medium`. */\n size?: MarkdownSize;\n /**\n * Render raw HTML embedded in the markdown (rehype-raw). Off by default: only enable it for\n * trusted content.\n */\n allowHtml?: boolean;\n}\n\nconst bodyClass: Record<MarkdownSize, string> = {\n small: \"text-body-small\",\n medium: \"text-body-medium\",\n large: \"text-body-large\",\n};\n\nfunction extractText(node: ReactNode): string {\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(extractText).join(\"\");\n if (isValidElement(node)) return extractText((node.props as { children?: ReactNode }).children);\n return \"\";\n}\n\n// ---------------------------------------------------------------------------\n// Language detection & mapping\n// ---------------------------------------------------------------------------\n\nconst LANGUAGE_MAP: Record<string, string> = {\n typescript: \"TypeScript\",\n ts: \"TypeScript\",\n tsx: \"TSX\",\n javascript: \"JavaScript\",\n js: \"JavaScript\",\n jsx: \"JSX\",\n python: \"Python\",\n py: \"Python\",\n rust: \"Rust\",\n rs: \"Rust\",\n bash: \"Bash\",\n sh: \"Bash\",\n shell: \"Bash\",\n zsh: \"Bash\",\n json: \"JSON\",\n jsonc: \"JSONC\",\n sql: \"SQL\",\n html: \"HTML\",\n css: \"CSS\",\n scss: \"SCSS\",\n sass: \"Sass\",\n yaml: \"YAML\",\n yml: \"YAML\",\n markdown: \"Markdown\",\n md: \"Markdown\",\n go: \"Go\",\n golang: \"Go\",\n java: \"Java\",\n c: \"C\",\n cpp: \"C++\",\n \"c++\": \"C++\",\n csharp: \"C#\",\n cs: \"C#\",\n \"c#\": \"C#\",\n ruby: \"Ruby\",\n rb: \"Ruby\",\n php: \"PHP\",\n swift: \"Swift\",\n kotlin: \"Kotlin\",\n kt: \"Kotlin\",\n xml: \"XML\",\n toml: \"TOML\",\n dockerfile: \"Dockerfile\",\n docker: \"Dockerfile\",\n graphql: \"GraphQL\",\n gql: \"GraphQL\",\n wasm: \"WebAssembly\",\n lua: \"Lua\",\n r: \"R\",\n diff: \"Diff\",\n plaintext: \"Text\",\n text: \"Text\",\n txt: \"Text\",\n};\n\nexport function detectLanguage(raw?: string): { raw: string; label: string } {\n if (!raw) return { raw: \"\", label: \"Code\" };\n const cleaned = raw\n .replace(/^language-|^lang-/, \"\")\n .toLowerCase()\n .trim();\n if (LANGUAGE_MAP[cleaned]) {\n return { raw: cleaned, label: LANGUAGE_MAP[cleaned] };\n }\n const label =\n cleaned.length <= 3\n ? cleaned.toUpperCase()\n : cleaned.charAt(0).toUpperCase() + cleaned.slice(1);\n return { raw: cleaned, label };\n}\n\n// ---------------------------------------------------------------------------\n// CodeBlock component\n// ---------------------------------------------------------------------------\n\nexport interface CodeBlockProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onCopy\"> {\n code?: string;\n language?: string;\n onCopy?: (code: string) => void;\n children?: ReactNode;\n}\n\nexport function CodeBlock({\n code: explicitCode,\n language: explicitLang,\n onCopy,\n className,\n children,\n ...restProps\n}: CodeBlockProps) {\n // Strip node passed by ReactMarkdown to avoid rendering node=\"[object Object]\" in DOM\n const { node: _node, ...props } = restProps as Record<string, any>;\n\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n const childElement = isValidElement(children) ? children : null;\n const childProps = childElement\n ? (childElement.props as { className?: string; children?: ReactNode })\n : null;\n\n const rawLangMatch =\n explicitLang ??\n className?.match(/language-([a-zA-Z0-9_+#-]+)/)?.[1] ??\n childProps?.className?.match(/language-([a-zA-Z0-9_+#-]+)/)?.[1];\n\n const { raw: rawLang, label: languageLabel } = detectLanguage(rawLangMatch);\n\n const rawCode =\n explicitCode ??\n (childProps?.children ? extractText(childProps.children) : extractText(children));\n\n const codeContent = rawCode;\n const codeToCopy = rawCode.replace(/\\n$/, \"\");\n\n const handleCopy = async () => {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(codeToCopy);\n }\n } catch {\n // Ignore clipboard API failures in non-secure or test environments\n }\n onCopy?.(codeToCopy);\n setCopied(true);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, 2000);\n };\n\n return (\n <div\n className={clsx(\n \"my-3 overflow-hidden rounded-medium border border-outline-variant bg-surface-container-highest\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center justify-between border-b border-outline-variant bg-surface-container px-3 py-1.5\">\n <span className=\"inline-flex items-center rounded-extra-small bg-surface-container-high px-2 py-0.5 text-label-small font-medium text-on-surface-variant border border-outline-variant/60\">\n {languageLabel}\n </span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className={clsx(\n \"inline-flex items-center gap-1.5 rounded-small px-2 py-1 text-label-small font-medium transition-colors duration-200\",\n copied\n ? \"text-success\"\n : \"text-on-surface-variant hover:bg-on-surface/8 hover:text-on-surface active:bg-on-surface/12\",\n \"focus-visible:outline-2 focus-visible:outline-primary\",\n )}\n aria-label={copied ? \"Copied\" : \"Copy code\"}\n title={copied ? \"Copied!\" : \"Copy code\"}\n >\n <Icon\n name={copied ? \"check\" : \"content_copy\"}\n size={16}\n className={copied ? \"text-success\" : undefined}\n />\n <span>{copied ? \"Copied!\" : \"Copy\"}</span>\n </button>\n </div>\n <pre className=\"overflow-x-auto p-3 font-code text-body-small text-on-surface bg-surface-container-highest [&_code]:bg-transparent [&_code]:p-0 [&_code]:text-[length:inherit]\">\n <code className={rawLang ? `language-${rawLang}` : undefined}>{codeContent}</code>\n </pre>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Math formula rendering & typography\n// ---------------------------------------------------------------------------\n\nconst GREEK_AND_SYMBOLS: Record<string, string> = {\n // Greek letters (lowercase)\n alpha: \"α\",\n beta: \"β\",\n gamma: \"γ\",\n delta: \"δ\",\n epsilon: \"ε\",\n zeta: \"ζ\",\n eta: \"η\",\n theta: \"θ\",\n iota: \"ι\",\n kappa: \"κ\",\n lambda: \"λ\",\n mu: \"μ\",\n nu: \"ν\",\n xi: \"ξ\",\n pi: \"π\",\n rho: \"ρ\",\n sigma: \"σ\",\n tau: \"τ\",\n upsilon: \"υ\",\n phi: \"φ\",\n chi: \"χ\",\n psi: \"ψ\",\n omega: \"ω\",\n // Greek letters (uppercase)\n Gamma: \"Γ\",\n Delta: \"Δ\",\n Theta: \"Θ\",\n Lambda: \"Λ\",\n Xi: \"Ξ\",\n Pi: \"Π\",\n Sigma: \"Σ\",\n Phi: \"Φ\",\n Psi: \"Ψ\",\n Omega: \"Ω\",\n // Operators & Relations\n times: \"×\",\n div: \"÷\",\n pm: \"±\",\n mp: \"∓\",\n le: \"≤\",\n leq: \"≤\",\n ge: \"≥\",\n geq: \"≥\",\n approx: \"≈\",\n neq: \"≠\",\n ne: \"≠\",\n infty: \"∞\",\n cdot: \"·\",\n circ: \"°\",\n partial: \"∂\",\n nabla: \"∇\",\n sum: \"∑\",\n prod: \"∏\",\n int: \"∫\",\n sqrt: \"√\",\n in: \"∈\",\n notin: \"∉\",\n subset: \"⊂\",\n subseteq: \"⊆\",\n cup: \"∪\",\n cap: \"∩\",\n to: \"→\",\n rightarrow: \"→\",\n leftarrow: \"←\",\n leftrightarrow: \"↔\",\n Rightarrow: \"⇒\",\n Leftarrow: \"⇐\",\n Leftrightarrow: \"⇔\",\n forall: \"∀\",\n exists: \"∃\",\n};\n\nfunction formatSubSup(text: string): ReactNode {\n const parts = text.split(\n /(\\^\\{[^}]+\\}|\\^[-+]?[a-zA-Z0-9\\u0370-\\u03FF\\u2100-\\u214F]|_\\{[^}]+\\}|_[-+]?[a-zA-Z0-9\\u0370-\\u03FF\\u2100-\\u214F])/g,\n );\n if (parts.length === 1) return text;\n\n const occurrences = new Map<string, number>();\n return parts.map((part) => {\n const occurrence = occurrences.get(part) ?? 0;\n occurrences.set(part, occurrence + 1);\n const key = `${part}:${occurrence}`;\n if (part.startsWith(\"^\")) {\n const val = part.startsWith(\"^{\") && part.endsWith(\"}\") ? part.slice(2, -1) : part.slice(1);\n return (\n <sup key={key} className=\"text-[0.75em] leading-none\">\n {val}\n </sup>\n );\n }\n if (part.startsWith(\"_\")) {\n const val = part.startsWith(\"_{\") && part.endsWith(\"}\") ? part.slice(2, -1) : part.slice(1);\n return (\n <sub key={key} className=\"text-[0.75em] leading-none\">\n {val}\n </sub>\n );\n }\n return part;\n });\n}\n\nexport function formatMathContent(math: string): ReactNode {\n // Step 1: Replace LaTeX symbol commands \\name (or \\\\name)\n const text = math.replace(/\\\\+([a-zA-Z]+)/g, (match, name) => {\n return GREEK_AND_SYMBOLS[name] ?? match;\n });\n\n // Step 2: Handle \\frac{num}{den}\n const fracRegex = /\\\\+frac\\{([^{}]+)\\}\\{([^{}]+)\\}/g;\n if (fracRegex.test(text)) {\n const parts: ReactNode[] = [];\n let lastIndex = 0;\n text.replace(fracRegex, (match, num, den, offset) => {\n if (offset > lastIndex) {\n parts.push(formatSubSup(text.slice(lastIndex, offset)));\n }\n parts.push(\n <span\n key={`frac-${offset}`}\n className=\"inline-flex flex-col items-center align-middle mx-1 text-center text-[0.85em] leading-none not-italic\"\n >\n <span className=\"border-b border-current px-0.5 pb-0.5\">{formatSubSup(num)}</span>\n <span className=\"px-0.5 pt-0.5\">{formatSubSup(den)}</span>\n </span>,\n );\n lastIndex = offset + match.length;\n return match;\n });\n if (lastIndex < text.length) {\n parts.push(formatSubSup(text.slice(lastIndex)));\n }\n return parts;\n }\n\n return formatSubSup(text);\n}\n\nexport interface InlineMathProps extends React.HTMLAttributes<HTMLSpanElement> {\n math: string;\n}\n\nexport function InlineMath({ math, className, ...props }: InlineMathProps) {\n return (\n <span\n className={clsx(\n \"inline-flex items-center px-1 font-serif italic font-medium text-primary\",\n className,\n )}\n {...props}\n >\n {formatMathContent(math)}\n </span>\n );\n}\n\nexport interface BlockMathProps extends React.HTMLAttributes<HTMLDivElement> {\n math: string;\n}\n\nexport function BlockMath({ math, className, ...props }: BlockMathProps) {\n return (\n <div\n className={clsx(\n \"my-3 flex justify-center overflow-x-auto rounded-medium bg-surface-container-low/40 px-4 py-2 text-title-medium font-serif italic font-medium text-primary\",\n className,\n )}\n {...props}\n >\n {formatMathContent(math)}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Remark plugin for recognizing $...$ and $$...$$ expressions\n// ---------------------------------------------------------------------------\n\nfunction transformBlocks(parent: any) {\n if (!parent.children) return;\n const newChildren: any[] = [];\n for (const child of parent.children) {\n if (child.type === \"paragraph\" && Array.isArray(child.children)) {\n const hasBlockMath = child.children.some(\n (c: any) => c.type === \"text\" && /\\$\\$[\\s\\S]+?\\$\\$/.test(c.value),\n );\n if (hasBlockMath) {\n let currentParagraphChildren: any[] = [];\n for (const item of child.children) {\n if (item.type === \"text\" && /\\$\\$[\\s\\S]+?\\$\\$/.test(item.value)) {\n const parts = item.value.split(/(\\$\\$[\\s\\S]+?\\$\\$)/g);\n for (const part of parts) {\n if (part.startsWith(\"$$\") && part.endsWith(\"$$\") && part.length >= 4) {\n if (currentParagraphChildren.length > 0) {\n newChildren.push({\n type: \"paragraph\",\n children: currentParagraphChildren,\n });\n currentParagraphChildren = [];\n }\n const mathVal = part.slice(2, -2).trim();\n newChildren.push({\n type: \"mathBlock\",\n data: {\n hName: \"div\",\n hProperties: { className: \"math-block\", \"data-math\": mathVal },\n hChildren: [{ type: \"text\", value: mathVal }],\n },\n children: [{ type: \"text\", value: mathVal }],\n });\n } else if (part.trim().length > 0) {\n currentParagraphChildren.push({ type: \"text\", value: part });\n }\n }\n } else {\n currentParagraphChildren.push(item);\n }\n }\n if (currentParagraphChildren.length > 0) {\n newChildren.push({\n type: \"paragraph\",\n children: currentParagraphChildren,\n });\n }\n continue;\n }\n }\n transformBlocks(child);\n newChildren.push(child);\n }\n parent.children = newChildren;\n}\n\nfunction transformInlines(node: any) {\n if (!node.children) return;\n const newChildren: any[] = [];\n for (const child of node.children) {\n if (child.type === \"text\" && typeof child.value === \"string\" && child.value.includes(\"$\")) {\n const parts = child.value.split(/((?<!\\\\)\\$(?!\\s)[^$\\n]+?(?<!\\s)\\$(?!\\d))/g);\n for (const part of parts) {\n if (\n part.startsWith(\"$\") &&\n part.endsWith(\"$\") &&\n !part.startsWith(\"$$\") &&\n part.length > 2\n ) {\n const mathVal = part.slice(1, -1).trim();\n newChildren.push({\n type: \"mathInline\",\n data: {\n hName: \"span\",\n hProperties: { className: \"math-inline\", \"data-math\": mathVal },\n hChildren: [{ type: \"text\", value: mathVal }],\n },\n children: [{ type: \"text\", value: mathVal }],\n });\n } else if (part) {\n newChildren.push({ type: \"text\", value: part });\n }\n }\n } else {\n transformInlines(child);\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n}\n\nfunction transformMathTree(tree: any) {\n transformBlocks(tree);\n transformInlines(tree);\n}\n\nexport function remarkMathPlugin() {\n return transformMathTree;\n}\n\n// ---------------------------------------------------------------------------\n// Element overrides mapping markdown onto M3 typescale and color roles\n// ---------------------------------------------------------------------------\n\nfunction m3Components(size: MarkdownSize): Components {\n const body = bodyClass[size];\n return {\n h1: ({ node: _node, className, children, ...props }) => (\n <h1\n className={clsx(\"mt-4 mb-2 text-headline-small text-on-surface first:mt-0\", className)}\n {...props}\n >\n {children}\n </h1>\n ),\n h2: ({ node: _node, className, children, ...props }) => (\n <h2\n className={clsx(\"mt-4 mb-2 text-title-large text-on-surface first:mt-0\", className)}\n {...props}\n >\n {children}\n </h2>\n ),\n h3: ({ node: _node, className, children, ...props }) => (\n <h3\n className={clsx(\"mt-3 mb-1.5 text-title-medium text-on-surface first:mt-0\", className)}\n {...props}\n >\n {children}\n </h3>\n ),\n h4: ({ node: _node, className, children, ...props }) => (\n <h4\n className={clsx(\"mt-3 mb-1 text-title-small text-on-surface first:mt-0\", className)}\n {...props}\n >\n {children}\n </h4>\n ),\n h5: ({ node: _node, className, children, ...props }) => (\n <h5\n className={clsx(\"mt-3 mb-1 text-title-small text-on-surface-variant first:mt-0\", className)}\n {...props}\n >\n {children}\n </h5>\n ),\n h6: ({ node: _node, className, children, ...props }) => (\n <h6\n className={clsx(\"mt-3 mb-1 text-label-large text-on-surface-variant first:mt-0\", className)}\n {...props}\n >\n {children}\n </h6>\n ),\n p: ({ node: _node, className, ...props }) => (\n <p className={clsx(\"my-2 first:mt-0 last:mb-0\", body, className)} {...props} />\n ),\n a: ({ node: _node, className, children, ...props }) => (\n <a\n className={clsx(\n \"text-primary underline underline-offset-2 hover:decoration-2\",\n \"rounded-extra-small outline-none focus-visible:outline-3 focus-visible:outline-secondary focus-visible:outline-offset-2\",\n className,\n )}\n {...props}\n >\n {children}\n </a>\n ),\n strong: ({ node: _node, className, ...props }) => (\n <strong className={clsx(\"font-semibold text-on-surface\", className)} {...props} />\n ),\n ul: ({ node: _node, className, ...props }) => (\n <ul\n className={clsx(\"my-2 list-disc pl-6 marker:text-on-surface-variant\", body, className)}\n {...props}\n />\n ),\n ol: ({ node: _node, className, ...props }) => (\n <ol\n className={clsx(\"my-2 list-decimal pl-6 marker:text-on-surface-variant\", body, className)}\n {...props}\n />\n ),\n li: ({ node: _node, className, ...props }) => (\n <li className={clsx(\"my-1\", className)} {...props} />\n ),\n blockquote: ({ node: _node, className, ...props }) => (\n <blockquote\n className={clsx(\n \"my-3 border-l-4 border-outline-variant pl-4 text-on-surface-variant\",\n className,\n )}\n {...props}\n />\n ),\n code: ({ node: _node, className, ...props }) => (\n <code\n className={clsx(\n \"rounded-extra-small bg-surface-container-highest px-1 py-0.5 font-code text-[0.9em] text-on-surface\",\n className,\n )}\n {...props}\n />\n ),\n pre: ({ node: _node, children, className, style }) => (\n <CodeBlock className={className} style={style}>\n {children}\n </CodeBlock>\n ),\n hr: ({ node: _node, className, ...props }) => (\n <hr className={clsx(\"my-4 border-outline-variant\", className)} {...props} />\n ),\n table: ({ node: _node, className, ...props }) => (\n <div className=\"my-3 overflow-x-auto rounded-small border border-outline-variant\">\n <table className={clsx(\"w-full border-collapse\", body, className)} {...props} />\n </div>\n ),\n thead: ({ node: _node, className, ...props }) => (\n <thead className={clsx(\"bg-surface-container\", className)} {...props} />\n ),\n th: ({ node: _node, className, ...props }) => (\n <th\n className={clsx(\n \"border-b border-outline-variant px-3 py-2 text-left text-title-small text-on-surface\",\n className,\n )}\n {...props}\n />\n ),\n td: ({ node: _node, className, ...props }) => (\n <td\n className={clsx(\"border-t border-outline-variant px-3 py-2 text-on-surface\", className)}\n {...props}\n />\n ),\n img: ({ node: _node, className, alt, ...props }) => (\n <img\n className={clsx(\"my-2 max-w-full rounded-medium\", className)}\n alt={alt ?? \"\"}\n {...props}\n />\n ),\n input: ({ node: _node, className, ...props }) => (\n <input className={clsx(\"mr-2 accent-primary\", className)} {...props} />\n ),\n div: ({ node: _node, className, children, ...props }) => {\n if (className?.includes(\"math-block\")) {\n const math = (props as Record<string, any>)[\"data-math\"] ?? extractText(children);\n return <BlockMath math={math} className={className} />;\n }\n return (\n <div className={className} {...props}>\n {children}\n </div>\n );\n },\n span: ({ node: _node, className, children, ...props }) => {\n if (className?.includes(\"math-inline\")) {\n const math = (props as Record<string, any>)[\"data-math\"] ?? extractText(children);\n return <InlineMath math={math} className={className} />;\n }\n return (\n <span className={className} {...props}>\n {children}\n </span>\n );\n },\n };\n}\n\nconst Markdown = forwardRef<HTMLDivElement, MarkdownProps>(\n ({ content, className, size = \"medium\", allowHtml = false }, ref) => {\n return (\n <div\n ref={ref}\n className={clsx(\"markdown min-w-0 text-on-surface\", bodyClass[size], className)}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMathPlugin]}\n rehypePlugins={allowHtml ? [rehypeRaw] : undefined}\n components={m3Components(size)}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n },\n);\n\nMarkdown.displayName = \"Markdown\";\n\nexport { Markdown };\nexport type { MarkdownProps };\n",
10
- "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/MessageBubble.tsx), MIT, rebuilt on Material Design 3.\n\n\"use client\";\n\nimport { CircleButton } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\n\nimport { Markdown } from \"./Markdown\";\n\nexport interface MessageBubbleProps {\n content: string;\n isUser: boolean;\n isStreaming?: boolean;\n onCopy?: (content: string) => void;\n onDislike?: (content: string) => void;\n onFork?: () => void;\n variant?: \"default\" | \"codex\";\n className?: string;\n}\n\n/**\n * One chat turn. The user turn is an M3 bubble, the assistant turn is plain markdown\n * on the surface, as in M3 / Codex conversations.\n */\nexport function MessageBubble({\n content,\n isUser,\n isStreaming = false,\n onCopy,\n onDislike,\n onFork,\n variant = \"default\",\n className,\n}: MessageBubbleProps) {\n const isCodex = variant === \"codex\";\n\n return (\n <div\n className={clsx(\"group flex flex-col py-1.5 w-full\", isUser ? \"items-end\" : \"items-start\", className)}\n >\n <div\n className={clsx(\n \"min-w-0\",\n isUser\n ? isCodex\n ? \"max-w-[75%] rounded-[28px] bg-surface-container-high px-5 py-3 text-body-large text-on-surface shadow-xs\"\n : \"max-w-[80%] rounded-large rounded-br-extra-small bg-secondary-container px-4 py-2.5 text-body-large text-on-secondary-container\"\n : \"w-full max-w-full bg-transparent text-body-large text-on-surface\",\n )}\n aria-busy={isStreaming || undefined}\n >\n {isUser ? (\n <div className=\"whitespace-pre-wrap break-words\">{content}</div>\n ) : (\n <Markdown content={content} size=\"large\" className=\"break-words font-sans\" />\n )}\n </div>\n {!isUser && (onCopy || onDislike || onFork) ? (\n <div className=\"mt-1.5 flex items-center gap-1 opacity-0 transition-opacity duration-200 ease-standard group-focus-within:opacity-100 group-hover:opacity-100\">\n {onCopy && (\n <CircleButton\n icon=\"content_copy\"\n variant=\"standard\"\n size=\"sm\"\n onClick={() => onCopy(content)}\n aria-label={isStreaming ? \"Copy Streaming Message\" : \"Copy Message\"}\n title={isStreaming ? \"Copy streaming message\" : \"Copier\"}\n />\n )}\n {onDislike && (\n <CircleButton\n icon=\"thumb_down\"\n variant=\"standard\"\n size=\"sm\"\n onClick={() => onDislike(content)}\n aria-label=\"Dislike\"\n title=\"Je n'aime pas\"\n />\n )}\n {onFork && (\n <CircleButton\n icon=\"call_split\"\n variant=\"standard\"\n size=\"sm\"\n onClick={onFork}\n aria-label=\"Fork\"\n title=\"Bifurquer à partir de ce tour\"\n />\n )}\n </div>\n ) : null}\n </div>\n );\n}\n",
9
+ "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/Markdown.tsx), MIT, rebuilt on Material Design 3.\n\n\"use client\";\n\nimport { clsx } from \"clsx\";\nimport { forwardRef, isValidElement, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport ReactMarkdown, { type Components } from \"react-markdown\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkGfm from \"remark-gfm\";\n\nimport { type ChatLabels, resolveChatLabels } from \"./chatLabels\";\nimport { ChatIcon } from \"./chatIcons\";\n\ntype MarkdownSize = \"small\" | \"medium\" | \"large\";\n\ninterface MarkdownProps {\n content: string;\n className?: string;\n /** Body typescale of paragraphs and lists: `text-body-small|medium|large`. Default `medium`. */\n size?: MarkdownSize;\n /**\n * Render raw HTML embedded in the markdown (rehype-raw). Off by default: only enable it for\n * trusted content.\n */\n allowHtml?: boolean;\n /** Element overrides merged over the M3 renderers (e.g. citation links). */\n components?: Components;\n /**\n * Called on every link activation. Call `event.preventDefault()` to handle it yourself (e.g.\n * open the system browser from a Tauri webview).\n */\n onLinkClick?: MarkdownLinkHandler;\n /** Replaces the link element entirely. */\n renderLink?: MarkdownLinkRenderer;\n /** Visible strings of the code blocks; English defaults. */\n labels?: Partial<ChatLabels>;\n}\n\n/** Link activation callback of {@link Markdown}. */\nexport type MarkdownLinkHandler = (\n href: string,\n event: React.MouseEvent<HTMLAnchorElement>,\n) => void;\n\n/** Custom link renderer of {@link Markdown}. */\nexport type MarkdownLinkRenderer = (link: {\n href: string;\n children: React.ReactNode;\n external: boolean;\n}) => React.ReactNode;\n\n/** Whether `href` leaves the page: an absolute URL with a scheme, or protocol-relative. */\nexport function isExternalHref(href: string | undefined): boolean {\n if (!href) return false;\n return /^[a-z][a-z0-9+.-]*:/i.test(href) || href.startsWith(\"//\");\n}\n\n/** Safe defaults of an external link: a new browsing context without opener or referrer. */\nexport const externalLinkProps = { target: \"_blank\", rel: \"noopener noreferrer\" } as const;\n\nconst bodyClass: Record<MarkdownSize, string> = {\n small: \"text-body-small\",\n medium: \"text-body-medium\",\n large: \"text-body-large\",\n};\n\nfunction extractText(node: ReactNode): string {\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(extractText).join(\"\");\n if (isValidElement(node)) return extractText((node.props as { children?: ReactNode }).children);\n return \"\";\n}\n\n// ---------------------------------------------------------------------------\n// Language detection & mapping\n// ---------------------------------------------------------------------------\n\nconst LANGUAGE_MAP: Record<string, string> = {\n typescript: \"TypeScript\",\n ts: \"TypeScript\",\n tsx: \"TSX\",\n javascript: \"JavaScript\",\n js: \"JavaScript\",\n jsx: \"JSX\",\n python: \"Python\",\n py: \"Python\",\n rust: \"Rust\",\n rs: \"Rust\",\n bash: \"Bash\",\n sh: \"Bash\",\n shell: \"Bash\",\n zsh: \"Bash\",\n json: \"JSON\",\n jsonc: \"JSONC\",\n sql: \"SQL\",\n html: \"HTML\",\n css: \"CSS\",\n scss: \"SCSS\",\n sass: \"Sass\",\n yaml: \"YAML\",\n yml: \"YAML\",\n markdown: \"Markdown\",\n md: \"Markdown\",\n go: \"Go\",\n golang: \"Go\",\n java: \"Java\",\n c: \"C\",\n cpp: \"C++\",\n \"c++\": \"C++\",\n csharp: \"C#\",\n cs: \"C#\",\n \"c#\": \"C#\",\n ruby: \"Ruby\",\n rb: \"Ruby\",\n php: \"PHP\",\n swift: \"Swift\",\n kotlin: \"Kotlin\",\n kt: \"Kotlin\",\n xml: \"XML\",\n toml: \"TOML\",\n dockerfile: \"Dockerfile\",\n docker: \"Dockerfile\",\n graphql: \"GraphQL\",\n gql: \"GraphQL\",\n wasm: \"WebAssembly\",\n lua: \"Lua\",\n r: \"R\",\n diff: \"Diff\",\n plaintext: \"Text\",\n text: \"Text\",\n txt: \"Text\",\n};\n\nexport function detectLanguage(raw?: string): { raw: string; label: string } {\n if (!raw) return { raw: \"\", label: \"Code\" };\n const cleaned = raw\n .replace(/^language-|^lang-/, \"\")\n .toLowerCase()\n .trim();\n if (LANGUAGE_MAP[cleaned]) {\n return { raw: cleaned, label: LANGUAGE_MAP[cleaned] };\n }\n const label =\n cleaned.length <= 3\n ? cleaned.toUpperCase()\n : cleaned.charAt(0).toUpperCase() + cleaned.slice(1);\n return { raw: cleaned, label };\n}\n\n// ---------------------------------------------------------------------------\n// CodeBlock component\n// ---------------------------------------------------------------------------\n\nexport interface CodeBlockProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onCopy\"> {\n code?: string;\n language?: string;\n onCopy?: (code: string) => void;\n children?: ReactNode;\n /** `copy`, `copyCode`, `copied`; English defaults. */\n labels?: Partial<ChatLabels>;\n}\n\nexport function CodeBlock({\n code: explicitCode,\n language: explicitLang,\n onCopy,\n className,\n children,\n labels,\n ...restProps\n}: CodeBlockProps) {\n const l = resolveChatLabels(labels);\n // Strip node passed by ReactMarkdown to avoid rendering node=\"[object Object]\" in DOM\n const { node: _node, ...props } = restProps as Record<string, any>;\n\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n const childElement = isValidElement(children) ? children : null;\n const childProps = childElement\n ? (childElement.props as { className?: string; children?: ReactNode })\n : null;\n\n const rawLangMatch =\n explicitLang ??\n className?.match(/language-([a-zA-Z0-9_+#-]+)/)?.[1] ??\n childProps?.className?.match(/language-([a-zA-Z0-9_+#-]+)/)?.[1];\n\n const { raw: rawLang, label: languageLabel } = detectLanguage(rawLangMatch);\n\n const rawCode =\n explicitCode ??\n (childProps?.children ? extractText(childProps.children) : extractText(children));\n\n const codeContent = rawCode;\n const codeToCopy = rawCode.replace(/\\n$/, \"\");\n\n const handleCopy = async () => {\n try {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(codeToCopy);\n }\n } catch {\n // Ignore clipboard API failures in non-secure or test environments\n }\n onCopy?.(codeToCopy);\n setCopied(true);\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => {\n setCopied(false);\n }, 2000);\n };\n\n return (\n <div\n className={clsx(\n \"my-3 overflow-hidden rounded-medium border border-outline-variant bg-surface-container-highest\",\n className,\n )}\n {...props}\n >\n <div className=\"flex items-center justify-between border-b border-outline-variant bg-surface-container px-3 py-1.5\">\n <span className=\"inline-flex items-center rounded-extra-small bg-surface-container-high px-2 py-0.5 text-label-small font-medium text-on-surface-variant border border-outline-variant/60\">\n {languageLabel}\n </span>\n <button\n type=\"button\"\n onClick={handleCopy}\n className={clsx(\n \"inline-flex items-center gap-1.5 rounded-small px-2 py-1 text-label-small font-medium transition-colors duration-200\",\n copied\n ? \"text-success\"\n : \"text-on-surface-variant hover:bg-on-surface/8 hover:text-on-surface active:bg-on-surface/12\",\n \"focus-visible:outline-2 focus-visible:outline-primary\",\n )}\n aria-label={copied ? l.copied : l.copyCode}\n title={copied ? l.copied : l.copyCode}\n >\n <ChatIcon\n name={copied ? \"check\" : \"content_copy\"}\n size={16}\n className={copied ? \"text-success\" : undefined}\n />\n <span>{copied ? l.copied : l.copy}</span>\n </button>\n </div>\n <pre className=\"overflow-x-auto p-3 font-code text-body-small text-on-surface bg-surface-container-highest [&_code]:bg-transparent [&_code]:p-0 [&_code]:text-[length:inherit]\">\n <code className={rawLang ? `language-${rawLang}` : undefined}>{codeContent}</code>\n </pre>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Math formula rendering & typography\n// ---------------------------------------------------------------------------\n\nconst GREEK_AND_SYMBOLS: Record<string, string> = {\n // Greek letters (lowercase)\n alpha: \"α\",\n beta: \"β\",\n gamma: \"γ\",\n delta: \"δ\",\n epsilon: \"ε\",\n zeta: \"ζ\",\n eta: \"η\",\n theta: \"θ\",\n iota: \"ι\",\n kappa: \"κ\",\n lambda: \"λ\",\n mu: \"μ\",\n nu: \"ν\",\n xi: \"ξ\",\n pi: \"π\",\n rho: \"ρ\",\n sigma: \"σ\",\n tau: \"τ\",\n upsilon: \"υ\",\n phi: \"φ\",\n chi: \"χ\",\n psi: \"ψ\",\n omega: \"ω\",\n // Greek letters (uppercase)\n Gamma: \"Γ\",\n Delta: \"Δ\",\n Theta: \"Θ\",\n Lambda: \"Λ\",\n Xi: \"Ξ\",\n Pi: \"Π\",\n Sigma: \"Σ\",\n Phi: \"Φ\",\n Psi: \"Ψ\",\n Omega: \"Ω\",\n // Operators & Relations\n times: \"×\",\n div: \"÷\",\n pm: \"±\",\n mp: \"∓\",\n le: \"≤\",\n leq: \"≤\",\n ge: \"≥\",\n geq: \"≥\",\n approx: \"≈\",\n neq: \"≠\",\n ne: \"≠\",\n infty: \"∞\",\n cdot: \"·\",\n circ: \"°\",\n partial: \"∂\",\n nabla: \"∇\",\n sum: \"∑\",\n prod: \"∏\",\n int: \"∫\",\n sqrt: \"√\",\n in: \"∈\",\n notin: \"∉\",\n subset: \"⊂\",\n subseteq: \"⊆\",\n cup: \"∪\",\n cap: \"∩\",\n to: \"→\",\n rightarrow: \"→\",\n leftarrow: \"←\",\n leftrightarrow: \"↔\",\n Rightarrow: \"⇒\",\n Leftarrow: \"⇐\",\n Leftrightarrow: \"⇔\",\n forall: \"∀\",\n exists: \"∃\",\n};\n\nfunction formatSubSup(text: string): ReactNode {\n const parts = text.split(\n /(\\^\\{[^}]+\\}|\\^[-+]?[a-zA-Z0-9\\u0370-\\u03FF\\u2100-\\u214F]|_\\{[^}]+\\}|_[-+]?[a-zA-Z0-9\\u0370-\\u03FF\\u2100-\\u214F])/g,\n );\n if (parts.length === 1) return text;\n\n const occurrences = new Map<string, number>();\n return parts.map((part) => {\n const occurrence = occurrences.get(part) ?? 0;\n occurrences.set(part, occurrence + 1);\n const key = `${part}:${occurrence}`;\n if (part.startsWith(\"^\")) {\n const val = part.startsWith(\"^{\") && part.endsWith(\"}\") ? part.slice(2, -1) : part.slice(1);\n return (\n <sup key={key} className=\"text-[0.75em] leading-none\">\n {val}\n </sup>\n );\n }\n if (part.startsWith(\"_\")) {\n const val = part.startsWith(\"_{\") && part.endsWith(\"}\") ? part.slice(2, -1) : part.slice(1);\n return (\n <sub key={key} className=\"text-[0.75em] leading-none\">\n {val}\n </sub>\n );\n }\n return part;\n });\n}\n\nexport function formatMathContent(math: string): ReactNode {\n // Step 1: Replace LaTeX symbol commands \\name (or \\\\name)\n const text = math.replace(/\\\\+([a-zA-Z]+)/g, (match, name) => {\n return GREEK_AND_SYMBOLS[name] ?? match;\n });\n\n // Step 2: Handle \\frac{num}{den}\n const fracRegex = /\\\\+frac\\{([^{}]+)\\}\\{([^{}]+)\\}/g;\n if (fracRegex.test(text)) {\n const parts: ReactNode[] = [];\n let lastIndex = 0;\n text.replace(fracRegex, (match, num, den, offset) => {\n if (offset > lastIndex) {\n parts.push(formatSubSup(text.slice(lastIndex, offset)));\n }\n parts.push(\n <span\n key={`frac-${offset}`}\n className=\"inline-flex flex-col items-center align-middle mx-1 text-center text-[0.85em] leading-none not-italic\"\n >\n <span className=\"border-b border-current px-0.5 pb-0.5\">{formatSubSup(num)}</span>\n <span className=\"px-0.5 pt-0.5\">{formatSubSup(den)}</span>\n </span>,\n );\n lastIndex = offset + match.length;\n return match;\n });\n if (lastIndex < text.length) {\n parts.push(formatSubSup(text.slice(lastIndex)));\n }\n return parts;\n }\n\n return formatSubSup(text);\n}\n\nexport interface InlineMathProps extends React.HTMLAttributes<HTMLSpanElement> {\n math: string;\n}\n\nexport function InlineMath({ math, className, ...props }: InlineMathProps) {\n return (\n <span\n className={clsx(\n \"inline-flex items-center px-1 font-serif italic font-medium text-primary\",\n className,\n )}\n {...props}\n >\n {formatMathContent(math)}\n </span>\n );\n}\n\nexport interface BlockMathProps extends React.HTMLAttributes<HTMLDivElement> {\n math: string;\n}\n\nexport function BlockMath({ math, className, ...props }: BlockMathProps) {\n return (\n <div\n className={clsx(\n \"my-3 flex justify-center overflow-x-auto rounded-medium bg-surface-container-low/40 px-4 py-2 text-title-medium font-serif italic font-medium text-primary\",\n className,\n )}\n {...props}\n >\n {formatMathContent(math)}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Remark plugin for recognizing $...$ and $$...$$ expressions\n// ---------------------------------------------------------------------------\n\nfunction transformBlocks(parent: any) {\n if (!parent.children) return;\n const newChildren: any[] = [];\n for (const child of parent.children) {\n if (child.type === \"paragraph\" && Array.isArray(child.children)) {\n const hasBlockMath = child.children.some(\n (c: any) => c.type === \"text\" && /\\$\\$[\\s\\S]+?\\$\\$/.test(c.value),\n );\n if (hasBlockMath) {\n let currentParagraphChildren: any[] = [];\n for (const item of child.children) {\n if (item.type === \"text\" && /\\$\\$[\\s\\S]+?\\$\\$/.test(item.value)) {\n const parts = item.value.split(/(\\$\\$[\\s\\S]+?\\$\\$)/g);\n for (const part of parts) {\n if (part.startsWith(\"$$\") && part.endsWith(\"$$\") && part.length >= 4) {\n if (currentParagraphChildren.length > 0) {\n newChildren.push({\n type: \"paragraph\",\n children: currentParagraphChildren,\n });\n currentParagraphChildren = [];\n }\n const mathVal = part.slice(2, -2).trim();\n newChildren.push({\n type: \"mathBlock\",\n data: {\n hName: \"div\",\n hProperties: { className: \"math-block\", \"data-math\": mathVal },\n hChildren: [{ type: \"text\", value: mathVal }],\n },\n children: [{ type: \"text\", value: mathVal }],\n });\n } else if (part.trim().length > 0) {\n currentParagraphChildren.push({ type: \"text\", value: part });\n }\n }\n } else {\n currentParagraphChildren.push(item);\n }\n }\n if (currentParagraphChildren.length > 0) {\n newChildren.push({\n type: \"paragraph\",\n children: currentParagraphChildren,\n });\n }\n continue;\n }\n }\n transformBlocks(child);\n newChildren.push(child);\n }\n parent.children = newChildren;\n}\n\nfunction transformInlines(node: any) {\n if (!node.children) return;\n const newChildren: any[] = [];\n for (const child of node.children) {\n if (child.type === \"text\" && typeof child.value === \"string\" && child.value.includes(\"$\")) {\n const parts = child.value.split(/((?<!\\\\)\\$(?!\\s)[^$\\n]+?(?<!\\s)\\$(?!\\d))/g);\n for (const part of parts) {\n if (\n part.startsWith(\"$\") &&\n part.endsWith(\"$\") &&\n !part.startsWith(\"$$\") &&\n part.length > 2\n ) {\n const mathVal = part.slice(1, -1).trim();\n newChildren.push({\n type: \"mathInline\",\n data: {\n hName: \"span\",\n hProperties: { className: \"math-inline\", \"data-math\": mathVal },\n hChildren: [{ type: \"text\", value: mathVal }],\n },\n children: [{ type: \"text\", value: mathVal }],\n });\n } else if (part) {\n newChildren.push({ type: \"text\", value: part });\n }\n }\n } else {\n transformInlines(child);\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n}\n\nfunction transformMathTree(tree: any) {\n transformBlocks(tree);\n transformInlines(tree);\n}\n\nexport function remarkMathPlugin() {\n return transformMathTree;\n}\n\n// ---------------------------------------------------------------------------\n// Element overrides mapping markdown onto M3 typescale and color roles\n// ---------------------------------------------------------------------------\n\ninterface LinkOptions {\n onLinkClick?: MarkdownLinkHandler;\n renderLink?: MarkdownLinkRenderer;\n labels?: Partial<ChatLabels>;\n}\n\nfunction m3Components(size: MarkdownSize, link: LinkOptions = {}): Components {\n const body = bodyClass[size];\n return {\n h1: ({ node: _node, className, children, ...props }) => (\n <h1\n className={clsx(\"mt-4 mb-2 text-headline-small text-on-surface first:mt-0\", className)}\n {...props}\n >\n {children}\n </h1>\n ),\n h2: ({ node: _node, className, children, ...props }) => (\n <h2\n className={clsx(\"mt-4 mb-2 text-title-large text-on-surface first:mt-0\", className)}\n {...props}\n >\n {children}\n </h2>\n ),\n h3: ({ node: _node, className, children, ...props }) => (\n <h3\n className={clsx(\"mt-3 mb-1.5 text-title-medium text-on-surface first:mt-0\", className)}\n {...props}\n >\n {children}\n </h3>\n ),\n h4: ({ node: _node, className, children, ...props }) => (\n <h4\n className={clsx(\"mt-3 mb-1 text-title-small text-on-surface first:mt-0\", className)}\n {...props}\n >\n {children}\n </h4>\n ),\n h5: ({ node: _node, className, children, ...props }) => (\n <h5\n className={clsx(\"mt-3 mb-1 text-title-small text-on-surface-variant first:mt-0\", className)}\n {...props}\n >\n {children}\n </h5>\n ),\n h6: ({ node: _node, className, children, ...props }) => (\n <h6\n className={clsx(\"mt-3 mb-1 text-label-large text-on-surface-variant first:mt-0\", className)}\n {...props}\n >\n {children}\n </h6>\n ),\n p: ({ node: _node, className, ...props }) => (\n <p className={clsx(\"my-2 first:mt-0 last:mb-0\", body, className)} {...props} />\n ),\n a: ({ node: _node, className, children, href, onClick, ...props }) => {\n const external = isExternalHref(href);\n if (link.renderLink) return <>{link.renderLink({ href: href ?? \"\", children, external })}</>;\n return (\n <a\n className={clsx(\n \"text-primary underline underline-offset-2 hover:decoration-2\",\n \"rounded-extra-small outline-none focus-visible:outline-3 focus-visible:outline-secondary focus-visible:outline-offset-2\",\n className,\n )}\n href={href}\n {...(external ? externalLinkProps : {})}\n onClick={(event) => {\n onClick?.(event);\n if (href) link.onLinkClick?.(href, event);\n }}\n {...props}\n >\n {children}\n </a>\n );\n },\n strong: ({ node: _node, className, ...props }) => (\n <strong className={clsx(\"font-semibold text-on-surface\", className)} {...props} />\n ),\n ul: ({ node: _node, className, ...props }) => (\n <ul\n className={clsx(\"my-2 list-disc pl-6 marker:text-on-surface-variant\", body, className)}\n {...props}\n />\n ),\n ol: ({ node: _node, className, ...props }) => (\n <ol\n className={clsx(\"my-2 list-decimal pl-6 marker:text-on-surface-variant\", body, className)}\n {...props}\n />\n ),\n li: ({ node: _node, className, ...props }) => (\n <li className={clsx(\"my-1\", className)} {...props} />\n ),\n blockquote: ({ node: _node, className, ...props }) => (\n <blockquote\n className={clsx(\n \"my-3 border-l-4 border-outline-variant pl-4 text-on-surface-variant\",\n className,\n )}\n {...props}\n />\n ),\n code: ({ node: _node, className, ...props }) => (\n <code\n className={clsx(\n \"rounded-extra-small bg-surface-container-highest px-1 py-0.5 font-code text-[0.9em] text-on-surface\",\n className,\n )}\n {...props}\n />\n ),\n pre: ({ node: _node, children, className, style }) => (\n <CodeBlock className={className} style={style} labels={link.labels}>\n {children}\n </CodeBlock>\n ),\n hr: ({ node: _node, className, ...props }) => (\n <hr className={clsx(\"my-4 border-outline-variant\", className)} {...props} />\n ),\n table: ({ node: _node, className, ...props }) => (\n <div className=\"my-3 overflow-x-auto rounded-small border border-outline-variant\">\n <table className={clsx(\"w-full border-collapse\", body, className)} {...props} />\n </div>\n ),\n thead: ({ node: _node, className, ...props }) => (\n <thead className={clsx(\"bg-surface-container\", className)} {...props} />\n ),\n th: ({ node: _node, className, ...props }) => (\n <th\n className={clsx(\n \"border-b border-outline-variant px-3 py-2 text-left text-title-small text-on-surface\",\n className,\n )}\n {...props}\n />\n ),\n td: ({ node: _node, className, ...props }) => (\n <td\n className={clsx(\"border-t border-outline-variant px-3 py-2 text-on-surface\", className)}\n {...props}\n />\n ),\n img: ({ node: _node, className, alt, ...props }) => (\n <img\n className={clsx(\"my-2 max-w-full rounded-medium\", className)}\n alt={alt ?? \"\"}\n {...props}\n />\n ),\n input: ({ node: _node, className, ...props }) => (\n <input className={clsx(\"mr-2 accent-primary\", className)} {...props} />\n ),\n div: ({ node: _node, className, children, ...props }) => {\n if (className?.includes(\"math-block\")) {\n const math = (props as Record<string, any>)[\"data-math\"] ?? extractText(children);\n return <BlockMath math={math} className={className} />;\n }\n return (\n <div className={className} {...props}>\n {children}\n </div>\n );\n },\n span: ({ node: _node, className, children, ...props }) => {\n if (className?.includes(\"math-inline\")) {\n const math = (props as Record<string, any>)[\"data-math\"] ?? extractText(children);\n return <InlineMath math={math} className={className} />;\n }\n return (\n <span className={className} {...props}>\n {children}\n </span>\n );\n },\n };\n}\n\nconst Markdown = forwardRef<HTMLDivElement, MarkdownProps>(\n (\n {\n content,\n className,\n size = \"medium\",\n allowHtml = false,\n components,\n onLinkClick,\n renderLink,\n labels,\n },\n ref,\n ) => {\n const base = m3Components(size, { onLinkClick, renderLink, labels });\n return (\n <div\n ref={ref}\n className={clsx(\"markdown min-w-0 text-on-surface\", bodyClass[size], className)}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMathPlugin]}\n rehypePlugins={allowHtml ? [rehypeRaw] : undefined}\n components={components ? { ...base, ...components } : base}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n },\n);\n\nMarkdown.displayName = \"Markdown\";\n\nexport { Markdown };\nexport type { MarkdownProps };\n",
10
+ "// SPDX-License-Identifier: Apache-2.0\n// Injectable labels of the chat surface: every visible string (aria-label included) of the chat\n// components comes from this dictionary. French, English and Japanese are complete; a partial\n// dictionary falls back key by key on the English defaults.\n\n/** Every visible string of the chat components. `{name}` placeholders go through `formatLabel`. */\nexport interface ChatLabels {\n // Composer\n composerPlaceholder: string;\n send: string;\n stop: string;\n openVoice: string;\n projects: string;\n // Model selector\n models: string;\n selectModel: string;\n searchModels: string;\n noModels: string;\n /** `{count}`: context window, already formatted. */\n contextTokens: string;\n // Message actions\n copyMessage: string;\n copyStreamingMessage: string;\n dislike: string;\n fork: string;\n assistantThinking: string;\n // Code blocks\n copy: string;\n copyCode: string;\n copied: string;\n // Conversations\n conversations: string;\n newConversation: string;\n searchConversations: string;\n noConversations: string;\n noSearchResults: string;\n untitledConversation: string;\n renameConversation: string;\n deleteConversation: string;\n // Model state\n modelUnavailable: string;\n modelDownloading: string;\n modelLoading: string;\n /** `{percent}`: integer 0..100. */\n progressPercent: string;\n retry: string;\n // Citations and refusal\n sources: string;\n /** `{n}`: citation number. */\n citation: string;\n openSource: string;\n refusalTitle: string;\n refusalBody: string;\n // Memory\n memory: string;\n memoryEmpty: string;\n memoryLoading: string;\n deleteMemory: string;\n clearMemory: string;\n clearMemoryConfirm: string;\n confirm: string;\n cancel: string;\n // Generic\n loading: string;\n errorGeneric: string;\n}\n\n/** English labels: the fallback of every key. */\nexport const chatLabelsEn: ChatLabels = {\n composerPlaceholder: \"Ask something...\",\n send: \"Send\",\n stop: \"Stop\",\n openVoice: \"Open Voice Input\",\n projects: \"Projects\",\n models: \"Models\",\n selectModel: \"Select model...\",\n searchModels: \"Search models...\",\n noModels: \"No models found\",\n contextTokens: \"{count} tokens\",\n copyMessage: \"Copy Message\",\n copyStreamingMessage: \"Copy Streaming Message\",\n dislike: \"Dislike\",\n fork: \"Fork\",\n assistantThinking: \"Thinking\",\n copy: \"Copy\",\n copyCode: \"Copy code\",\n copied: \"Copied!\",\n conversations: \"Conversations\",\n newConversation: \"New conversation\",\n searchConversations: \"Search conversations\",\n noConversations: \"No conversations yet\",\n noSearchResults: \"No matching conversation\",\n untitledConversation: \"Untitled conversation\",\n renameConversation: \"Rename conversation\",\n deleteConversation: \"Delete conversation\",\n modelUnavailable: \"Model unavailable\",\n modelDownloading: \"Downloading the model\",\n modelLoading: \"Loading the model\",\n progressPercent: \"{percent}%\",\n retry: \"Retry\",\n sources: \"Sources\",\n citation: \"Source {n}\",\n openSource: \"Open source\",\n refusalTitle: \"Not established in the sources\",\n refusalBody: \"The available sources do not support an answer to this question.\",\n memory: \"Memory\",\n memoryEmpty: \"No memories saved\",\n memoryLoading: \"Loading memories\",\n deleteMemory: \"Delete memory\",\n clearMemory: \"Clear all memories\",\n clearMemoryConfirm: \"Delete every saved memory? This cannot be undone.\",\n confirm: \"Confirm\",\n cancel: \"Cancel\",\n loading: \"Loading\",\n errorGeneric: \"Something went wrong\",\n};\n\n/** French labels. */\nexport const chatLabelsFr: ChatLabels = {\n composerPlaceholder: \"Posez une question...\",\n send: \"Envoyer\",\n stop: \"Arrêter\",\n openVoice: \"Saisie vocale\",\n projects: \"Projets\",\n models: \"Modèles\",\n selectModel: \"Choisir un modèle...\",\n searchModels: \"Rechercher un modèle...\",\n noModels: \"Aucun modèle trouvé\",\n contextTokens: \"{count} jetons\",\n copyMessage: \"Copier le message\",\n copyStreamingMessage: \"Copier le message en cours\",\n dislike: \"Je n'aime pas\",\n fork: \"Bifurquer à partir de ce tour\",\n assistantThinking: \"Réflexion\",\n copy: \"Copier\",\n copyCode: \"Copier le code\",\n copied: \"Copié !\",\n conversations: \"Conversations\",\n newConversation: \"Nouvelle conversation\",\n searchConversations: \"Rechercher une conversation\",\n noConversations: \"Aucune conversation pour l'instant\",\n noSearchResults: \"Aucune conversation ne correspond\",\n untitledConversation: \"Conversation sans titre\",\n renameConversation: \"Renommer la conversation\",\n deleteConversation: \"Supprimer la conversation\",\n modelUnavailable: \"Modèle indisponible\",\n modelDownloading: \"Téléchargement du modèle\",\n modelLoading: \"Chargement du modèle\",\n progressPercent: \"{percent} %\",\n retry: \"Réessayer\",\n sources: \"Sources\",\n citation: \"Source {n}\",\n openSource: \"Ouvrir la source\",\n refusalTitle: \"Non établi dans les sources\",\n refusalBody: \"Les sources disponibles ne permettent pas de répondre à cette question.\",\n memory: \"Mémoire\",\n memoryEmpty: \"Aucun souvenir enregistré\",\n memoryLoading: \"Chargement des souvenirs\",\n deleteMemory: \"Supprimer ce souvenir\",\n clearMemory: \"Effacer tous les souvenirs\",\n clearMemoryConfirm: \"Supprimer tous les souvenirs enregistrés ? Cette action est définitive.\",\n confirm: \"Confirmer\",\n cancel: \"Annuler\",\n loading: \"Chargement\",\n errorGeneric: \"Une erreur est survenue\",\n};\n\n/** Japanese labels. */\nexport const chatLabelsJa: ChatLabels = {\n composerPlaceholder: \"質問を入力...\",\n send: \"送信\",\n stop: \"停止\",\n openVoice: \"音声入力\",\n projects: \"プロジェクト\",\n models: \"モデル\",\n selectModel: \"モデルを選択...\",\n searchModels: \"モデルを検索...\",\n noModels: \"モデルが見つかりません\",\n contextTokens: \"{count} トークン\",\n copyMessage: \"メッセージをコピー\",\n copyStreamingMessage: \"生成中のメッセージをコピー\",\n dislike: \"低評価\",\n fork: \"このターンから分岐\",\n assistantThinking: \"思考中\",\n copy: \"コピー\",\n copyCode: \"コードをコピー\",\n copied: \"コピーしました\",\n conversations: \"会話\",\n newConversation: \"新しい会話\",\n searchConversations: \"会話を検索\",\n noConversations: \"まだ会話はありません\",\n noSearchResults: \"一致する会話はありません\",\n untitledConversation: \"無題の会話\",\n renameConversation: \"会話の名前を変更\",\n deleteConversation: \"会話を削除\",\n modelUnavailable: \"モデルを利用できません\",\n modelDownloading: \"モデルをダウンロード中\",\n modelLoading: \"モデルを読み込み中\",\n progressPercent: \"{percent}%\",\n retry: \"再試行\",\n sources: \"出典\",\n citation: \"出典 {n}\",\n openSource: \"出典を開く\",\n refusalTitle: \"出典では確認できません\",\n refusalBody: \"利用できる出典では、この質問に回答できません。\",\n memory: \"メモリー\",\n memoryEmpty: \"保存されたメモリーはありません\",\n memoryLoading: \"メモリーを読み込み中\",\n deleteMemory: \"メモリーを削除\",\n clearMemory: \"すべてのメモリーを消去\",\n clearMemoryConfirm: \"保存されたすべてのメモリーを削除しますか?この操作は元に戻せません。\",\n confirm: \"確認\",\n cancel: \"キャンセル\",\n loading: \"読み込み中\",\n errorGeneric: \"エラーが発生しました\",\n};\n\n/** The fallback dictionary (English). */\nexport const defaultChatLabels: ChatLabels = chatLabelsEn;\n\n/** The complete dictionaries by language tag. */\nexport const chatLabelsByLang = { fr: chatLabelsFr, en: chatLabelsEn, ja: chatLabelsJa } as const;\n\n/** Complete a partial dictionary with the defaults; empty strings fall back too. */\nexport function resolveChatLabels(\n partial?: Partial<ChatLabels>,\n base: ChatLabels = defaultChatLabels,\n): ChatLabels {\n if (!partial) return base;\n const out = { ...base };\n for (const key of Object.keys(partial) as (keyof ChatLabels)[]) {\n const value = partial[key];\n if (typeof value === \"string\" && value.length > 0) out[key] = value;\n }\n return out;\n}\n\n/** Replace `{name}` placeholders of a label. Unknown placeholders stay as written. */\nexport function formatLabel(template: string, values: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) =>\n name in values ? String(values[name]) : match,\n );\n}\n",
11
+ "// SPDX-License-Identifier: Apache-2.0\n// Inline Material Symbols (Outlined, weight 400) used by the chat components, so they render\n// without the Material Symbols icon font. Paths from @material-symbols/svg-400 0.47.6\n// (Google Material Symbols, Apache-2.0).\n\nimport { clsx } from \"clsx\";\n\nconst CHAT_ICON_PATHS = {\n arrow_upward: [\n \"0 -960 960 960\",\n \"M450-160v-526L202-438l-42-42 320-320 320 320-42 42-248-248v526h-60Z\",\n ],\n auto_awesome_filled: [\n \"0 96 960 960\",\n \"m772 421-43-100-104-46 104-45 43-95 43 95 104 45-104 46-43 100Zm0 595-43-96-104-45 104-45 43-101 43 101 104 45-104 45-43 96ZM333 862l-92-197-201-90 201-90 92-196 93 196 200 90-200 90-93 197Z\",\n ],\n auto_awesome: [\n \"0 -960 960 960\",\n \"m772-635-43-100-104-46 104-45 43-95 43 95 104 45-104 46-43 100Zm0 595-43-96-104-45 104-45 43-101 43 101 104 45-104 45-43 96ZM333-194l-92-197-201-90 201-90 92-196 93 196 200 90-200 90-93 197Zm0-148 48-96 98-43-98-43-48-96-47 96-99 43 99 43 47 96Zm0-139Z\",\n ],\n call_split: [\n \"0 -960 960 960\",\n \"M452-160v-306L220-698v123h-60v-225h225v60H263l249 249v331h-60Zm113-364-42-42 174-174H575v-60h225v225h-60v-123L565-524Z\",\n ],\n check: [\"0 -960 960 960\", \"M378-246 154-470l43-43 181 181 384-384 43 43-427 427Z\"],\n cloud_off: [\n \"0 -960 960 960\",\n \"M818-56 703-171H248q-88 0-148-59T40-377q0-80 50.5-134T217-577q2-14 6.5-31.5T236-640L70-806l42-42L861-99l-43 43ZM248-231h397L285-591q-11 15-14.5 34t-3.5 37h-19q-62 0-105 39.5t-43 101q0 61.5 43 105T248-231Zm216-181Zm390 210-47-47q25-17 39-38t14-50q0-43-31-73.5T755-441h-67v-81q0-88-61-147.5T478.47-729q-28.47 0-60.97 9T358-691l-42-42q36-29 77.5-42.5T478-789q111 0 190.5 79T748-520v21q72-1 122 45t50 117q0 35-16.5 73.5T854-202ZM583-470Z\",\n ],\n content_copy: [\n \"0 -960 960 960\",\n \"M300-200q-24 0-42-18t-18-42v-560q0-24 18-42t42-18h440q24 0 42 18t18 42v560q0 24-18 42t-42 18H300Zm0-60h440v-560H300v560ZM180-80q-24 0-42-18t-18-42v-620h60v620h500v60H180Zm120-180v-560 560Z\",\n ],\n delete: [\n \"0 -960 960 960\",\n \"M261-120q-24.75 0-42.37-17.63Q201-155.25 201-180v-570h-41v-60h188v-30h264v30h188v60h-41v570q0 24-18 42t-42 18H261Zm438-630H261v570h438v-570ZM367-266h60v-399h-60v399Zm166 0h60v-399h-60v399ZM261-750v570-570Z\",\n ],\n edit: [\n \"0 -960 960 960\",\n \"M180-180h44l472-471-44-44-472 471v44Zm-60 60v-128l575-574q8-8 19-12.5t23-4.5q11 0 22 4.5t20 12.5l44 44q9 9 13 20t4 22q0 11-4.5 22.5T823-694L248-120H120Zm659-617-41-41 41 41Zm-105 64-22-22 44 44-22-22Z\",\n ],\n edit_square: [\n \"0 -960 960 960\",\n \"M180-120q-24 0-42-18t-18-42v-600q0-24 18-42t42-18h405l-60 60H180v600h600v-348l60-60v408q0 24-18 42t-42 18H180Zm300-360ZM360-360v-170l382-382q9-9 20-13t22-4q11 0 22.32 4.5Q817.63-920 827-911l83 84q8.61 8.96 13.3 19.78 4.7 10.83 4.7 22.02 0 11.2-4.5 22.7T910-742L530-360H360Zm508-425-84-84 84 84ZM420-420h85l253-253-43-42-43-42-252 251v86Zm295-295-43-42 43 42 43 42-43-42Z\",\n ],\n expand_more: [\"0 -960 960 960\", \"M480-345 240-585l43-43 197 198 197-197 43 43-240 239Z\"],\n info: [\n \"0 -960 960 960\",\n \"M453-280h60v-240h-60v240Zm50.5-323.2q9.5-9.2 9.5-22.8 0-14.45-9.48-24.22-9.48-9.78-23.5-9.78t-23.52 9.78Q447-640.45 447-626q0 13.6 9.48 22.8 9.48 9.2 23.5 9.2t23.52-9.2ZM480.27-80q-82.74 0-155.5-31.5Q252-143 197.5-197.5t-86-127.34Q80-397.68 80-480.5t31.5-155.66Q143-709 197.5-763t127.34-85.5Q397.68-880 480.5-880t155.66 31.5Q709-817 763-763t85.5 127Q880-563 880-480.27q0 82.74-31.5 155.5Q817-252 763-197.68q-54 54.31-127 86Q563-80 480.27-80Zm.23-60Q622-140 721-239.5t99-241Q820-622 721.19-721T480-820q-141 0-240.5 98.81T140-480q0 141 99.5 240.5t241 99.5Zm-.5-340Z\",\n ],\n mic: [\n \"0 -960 960 960\",\n \"M408-453.92q-29-30.91-29-75.08v-251q0-41.67 29.44-70.83Q437.88-880 479.94-880t71.56 29.17Q581-821.67 581-780v251q0 44.17-29 75.08Q523-423 480-423t-72-30.92ZM480-651Zm-30 531v-136q-106-11-178-89t-72-184h60q0 91 64.29 153t155.5 62q91.21 0 155.71-62Q700-438 700-529h60q0 106-72 184t-178 89v136h-60Zm59.5-376.5Q521-510 521-529v-251q0-17-11.79-28.5T480-820q-17.42 0-29.21 11.5T439-780v251q0 19 11.5 32.5T480-483q18 0 29.5-13.5Z\",\n ],\n open_in_new: [\n \"0 -960 960 960\",\n \"M180-120q-24 0-42-18t-18-42v-600q0-24 18-42t42-18h279v60H180v600h600v-279h60v279q0 24-18 42t-42 18H180Zm202-219-42-43 398-398H519v-60h321v321h-60v-218L382-339Z\",\n ],\n refresh: [\n \"0 -960 960 960\",\n \"M480-160q-133 0-226.5-93.5T160-480q0-133 93.5-226.5T480-800q85 0 149 34.5T740-671v-129h60v254H546v-60h168q-38-60-97-97t-137-37q-109 0-184.5 75.5T220-480q0 109 75.5 184.5T480-220q83 0 152-47.5T728-393h62q-29 105-115 169t-195 64Z\",\n ],\n search: [\n \"0 -960 960 960\",\n \"M796-121 533-384q-30 26-70 40.5T378-329q-108 0-183-75t-75-181q0-106 75-181t182-75q106 0 180.5 75T632-585q0 43-14 83t-42 75l264 262-44 44ZM377-389q81 0 138-57.5T572-585q0-81-57-138.5T377-781q-82 0-139.5 57.5T180-585q0 81 57.5 138.5T377-389Z\",\n ],\n stop_filled: [\"0 -960 960 960\", \"M240-240v-480h480v480H240Z\"],\n stop: [\"0 -960 960 960\", \"M300-660v360-360Zm-60 420v-480h480v480H240Zm60-60h360v-360H300v360Z\"],\n thumb_down: [\n \"0 -960 960 960\",\n \"M242-840h444v512L408-40l-39-31q-6-5-9-14t-3-22v-10l45-211H103q-24 0-42-18t-18-42v-81.84q0-7.16-1.5-14.66T43-499l126-290q8.88-21.25 29.59-36.13Q219.31-840 242-840Zm384 60H229L103-481v93h373l-53 249 203-214v-427Zm0 427v-427 427Zm60 25v-60h133v-392H686v-60h193v512H686Z\",\n ],\n} as const satisfies Record<string, readonly [string, string]>;\n\nexport type ChatIconName = keyof typeof CHAT_ICON_PATHS;\n\n/** Names of the bundled chat icons. */\nexport const chatIconNames = Object.keys(CHAT_ICON_PATHS) as ChatIconName[];\n\nexport interface ChatIconProps {\n name: ChatIconName;\n /** Size in px. Default 24. */\n size?: number;\n className?: string;\n}\n\n/** A decorative inline SVG Material Symbol painted with `currentColor`. */\nexport function ChatIcon({ name, size = 24, className }: ChatIconProps) {\n const [viewBox, d] = CHAT_ICON_PATHS[name];\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox={viewBox}\n width={size}\n height={size}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n data-m3-icon={name}\n className={clsx(\"m3-icon shrink-0\", className)}\n >\n <path d={d} />\n </svg>\n );\n}\n",
12
+ "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/MessageBubble.tsx), MIT, rebuilt on Material Design 3.\n\n\"use client\";\n\nimport { CircleButton } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\n\nimport { type ChatLabels, resolveChatLabels } from \"./chatLabels\";\nimport { type Citation, CitationList, CitedMarkdown, RefusalNotice } from \"./citations\";\nimport { ChatIcon } from \"./chatIcons\";\nimport { Markdown, type MarkdownLinkHandler } from \"./Markdown\";\n\nexport interface MessageBubbleProps {\n content: string;\n isUser: boolean;\n isStreaming?: boolean;\n onCopy?: (content: string) => void;\n onDislike?: (content: string) => void;\n onFork?: () => void;\n variant?: \"default\" | \"codex\";\n className?: string;\n /** Visible strings (aria-labels, titles); English defaults. */\n labels?: Partial<ChatLabels>;\n /** Grounded answer: `[n]` markers become citation chips and the sources are listed below. */\n citations?: readonly Citation[];\n /** The backend refused to answer: a refusal notice replaces an empty answer. */\n refusal?: boolean;\n onCitationSelect?: (citation: Citation) => void;\n /** Link activation in the answer (e.g. open the system browser from Tauri). */\n onLinkClick?: MarkdownLinkHandler;\n}\n\n/**\n * One chat turn. The user turn is an M3 bubble, the assistant turn is plain markdown\n * on the surface, as in M3 / Codex conversations.\n */\nexport function MessageBubble({\n content,\n isUser,\n isStreaming = false,\n onCopy,\n onDislike,\n onFork,\n variant = \"default\",\n className,\n labels,\n citations,\n refusal = false,\n onCitationSelect,\n onLinkClick,\n}: MessageBubbleProps) {\n const isCodex = variant === \"codex\";\n const l = resolveChatLabels(labels);\n const cited = !isUser && citations && citations.length > 0 ? citations : null;\n\n return (\n <div\n className={clsx(\n \"group flex flex-col py-1.5 w-full\",\n isUser ? \"items-end\" : \"items-start\",\n className,\n )}\n >\n <div\n className={clsx(\n \"min-w-0\",\n isUser\n ? isCodex\n ? \"max-w-[75%] rounded-[28px] bg-surface-container-high px-5 py-3 text-body-large text-on-surface shadow-xs\"\n : \"max-w-[80%] rounded-large rounded-br-extra-small bg-secondary-container px-4 py-2.5 text-body-large text-on-secondary-container\"\n : \"w-full max-w-full bg-transparent text-body-large text-on-surface\",\n )}\n aria-busy={isStreaming || undefined}\n >\n {isUser ? (\n <div className=\"whitespace-pre-wrap break-words\">{content}</div>\n ) : (\n <>\n {refusal && !content.trim() ? (\n <RefusalNotice labels={labels} />\n ) : cited ? (\n <CitedMarkdown\n content={content}\n citations={cited}\n labels={labels}\n onCitationSelect={onCitationSelect}\n onLinkClick={onLinkClick}\n className=\"break-words font-sans\"\n />\n ) : (\n <Markdown\n content={content}\n size=\"large\"\n labels={labels}\n onLinkClick={onLinkClick}\n className=\"break-words font-sans\"\n />\n )}\n {refusal && content.trim() ? <RefusalNotice labels={labels} className=\"mt-2\" /> : null}\n {cited && !isStreaming ? (\n <CitationList citations={cited} labels={labels} onSelect={onCitationSelect} />\n ) : null}\n </>\n )}\n </div>\n {!isUser && (onCopy || onDislike || onFork) ? (\n <div className=\"mt-1.5 flex items-center gap-1 opacity-0 transition-opacity duration-200 ease-standard group-focus-within:opacity-100 group-hover:opacity-100\">\n {onCopy && (\n <CircleButton\n icon={<ChatIcon name=\"content_copy\" size={18} />}\n variant=\"standard\"\n size=\"sm\"\n onClick={() => onCopy(content)}\n aria-label={isStreaming ? l.copyStreamingMessage : l.copyMessage}\n title={isStreaming ? l.copyStreamingMessage : l.copyMessage}\n />\n )}\n {onDislike && (\n <CircleButton\n icon={<ChatIcon name=\"thumb_down\" size={18} />}\n variant=\"standard\"\n size=\"sm\"\n onClick={() => onDislike(content)}\n aria-label={l.dislike}\n title={l.dislike}\n />\n )}\n {onFork && (\n <CircleButton\n icon={<ChatIcon name=\"call_split\" size={18} />}\n variant=\"standard\"\n size=\"sm\"\n onClick={onFork}\n aria-label={l.fork}\n title={l.fork}\n />\n )}\n </div>\n ) : null}\n </div>\n );\n}\n",
13
+ "// SPDX-License-Identifier: Apache-2.0\n// Grounded answers: `[n]` markers rendered as citation chips, the numbered source list, and the\n// refusal notice of a backend that declined to answer outside its sources.\n\n\"use client\";\n\nimport { clsx } from \"clsx\";\nimport { useMemo } from \"react\";\nimport type { Components } from \"react-markdown\";\n\nimport { type ChatLabels, formatLabel, resolveChatLabels } from \"./chatLabels\";\nimport { ChatIcon } from \"./chatIcons\";\nimport { focusRing } from \"./internal\";\nimport { Markdown, type MarkdownLinkHandler, externalLinkProps, isExternalHref } from \"./Markdown\";\n\n/** One numbered passage an answer cites (`citations` of a grounded chat response). */\nexport interface Citation {\n /** Marker number used in the text as `[n]`. */\n n: number;\n id?: string;\n title: string;\n url?: string;\n sourceId?: string;\n}\n\nconst CITATION_HREF = \"#citation-\";\nconst CODE_SPANS = /(```[\\s\\S]*?```|`[^`\\n]*`)/;\nconst MARKER = /(?<![\\]\\\\!])\\[(\\d{1,4})\\](?!\\()/g;\n\n/**\n * Rewrite the `[n]` markers of `content` whose number is cited into markdown links\n * `[[n]](#citation-n)`. Code spans and fenced blocks are left untouched, as are markers\n * without a matching citation.\n */\nexport function linkCitationMarkers(content: string, citations: readonly Citation[]): string {\n if (citations.length === 0) return content;\n const known = new Set(citations.map((citation) => citation.n));\n return content\n .split(CODE_SPANS)\n .map((part, index) =>\n index % 2 === 1\n ? part\n : part.replace(MARKER, (match, digits: string) =>\n known.has(Number(digits)) ? `[\\\\[${digits}\\\\]](${CITATION_HREF}${digits})` : match,\n ),\n )\n .join(\"\");\n}\n\n/** The numbers cited in `content`, in order of first appearance. */\nexport function citedNumbers(content: string): number[] {\n const seen: number[] = [];\n for (const part of content.split(CODE_SPANS).filter((_, index) => index % 2 === 0)) {\n for (const match of part.matchAll(MARKER)) {\n const n = Number(match[1]);\n if (!seen.includes(n)) seen.push(n);\n }\n }\n return seen;\n}\n\nexport interface CitationChipProps {\n citation: Citation;\n labels?: Partial<ChatLabels>;\n onSelect?: (citation: Citation) => void;\n className?: string;\n}\n\n/** Inline citation marker: a dense M3 assist chip showing `n`, labelled with the source title. */\nexport function CitationChip({ citation, labels, onSelect, className }: CitationChipProps) {\n const l = resolveChatLabels(labels);\n const label = `${formatLabel(l.citation, { n: citation.n })}: ${citation.title}`;\n const chipClass = clsx(\n \"mx-0.5 inline-flex h-5 min-w-5 items-center justify-center rounded-small px-1 align-baseline\",\n \"bg-secondary-container text-label-small text-on-secondary-container no-underline\",\n \"transition-colors duration-200 ease-standard hover:bg-secondary-container/80\",\n focusRing,\n className,\n );\n if (!onSelect && citation.url) {\n return (\n <a\n href={citation.url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className={chipClass}\n aria-label={label}\n title={citation.title}\n >\n {citation.n}\n </a>\n );\n }\n return (\n <button\n type=\"button\"\n className={chipClass}\n aria-label={label}\n title={citation.title}\n onClick={() => onSelect?.(citation)}\n >\n {citation.n}\n </button>\n );\n}\n\n/** Markdown overrides of `CitedMarkdown`: citation links become chips, other links stay safe. */\nfunction citationComponents(\n citations: readonly Citation[],\n labels: Partial<ChatLabels> | undefined,\n onCitationSelect: ((citation: Citation) => void) | undefined,\n onLinkClick: MarkdownLinkHandler | undefined,\n): Components {\n const byNumber = new Map(citations.map((citation) => [citation.n, citation]));\n return {\n a: ({ node: _node, href, children, onClick, ...props }) => {\n if (href?.startsWith(CITATION_HREF)) {\n const citation = byNumber.get(Number(href.slice(CITATION_HREF.length)));\n if (citation)\n return <CitationChip citation={citation} labels={labels} onSelect={onCitationSelect} />;\n }\n return (\n <a\n href={href}\n {...(isExternalHref(href) ? externalLinkProps : {})}\n onClick={(event) => {\n onClick?.(event);\n if (href) onLinkClick?.(href, event);\n }}\n className={clsx(\n \"rounded-extra-small text-primary underline underline-offset-2 hover:decoration-2\",\n focusRing,\n )}\n {...props}\n >\n {children}\n </a>\n );\n },\n };\n}\n\nexport interface CitedMarkdownProps {\n content: string;\n citations: readonly Citation[];\n labels?: Partial<ChatLabels>;\n /** Called when a marker is activated; without it, markers with a `url` open it. */\n onCitationSelect?: (citation: Citation) => void;\n /** Activation of an ordinary link (not a citation marker); see `Markdown.onLinkClick`. */\n onLinkClick?: MarkdownLinkHandler;\n size?: \"small\" | \"medium\" | \"large\";\n className?: string;\n}\n\n/** Markdown whose `[n]` markers become citation chips. */\nexport function CitedMarkdown({\n content,\n citations,\n labels,\n onCitationSelect,\n onLinkClick,\n size = \"large\",\n className,\n}: CitedMarkdownProps) {\n const components = useMemo(\n () => citationComponents(citations, labels, onCitationSelect, onLinkClick),\n [citations, labels, onCitationSelect, onLinkClick],\n );\n return (\n <Markdown\n content={linkCitationMarkers(content, citations)}\n components={components}\n labels={labels}\n size={size}\n className={className}\n />\n );\n}\n\nexport interface CitationListProps {\n citations: readonly Citation[];\n labels?: Partial<ChatLabels>;\n onSelect?: (citation: Citation) => void;\n className?: string;\n}\n\n/** The numbered sources of an answer, as an M3 list on `surface-container-low`. */\nexport function CitationList({ citations, labels, onSelect, className }: CitationListProps) {\n if (citations.length === 0) return null;\n const l = resolveChatLabels(labels);\n const sorted = [...citations];\n sorted.sort((a, b) => a.n - b.n);\n return (\n <section\n aria-label={l.sources}\n className={clsx(\n \"m3-citation-list mt-2 rounded-medium bg-surface-container-low py-2\",\n className,\n )}\n >\n <h3 className=\"px-4 pb-1 text-label-large text-on-surface-variant\">{l.sources}</h3>\n <ol className=\"m-0 list-none p-0\">\n {sorted.map((citation) => {\n const body = (\n <>\n <span className=\"flex size-6 shrink-0 items-center justify-center rounded-small bg-secondary-container text-label-small text-on-secondary-container\">\n {citation.n}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-body-medium text-on-surface\">\n {citation.title}\n </span>\n {citation.url || onSelect ? (\n <ChatIcon name=\"open_in_new\" size={18} className=\"text-on-surface-variant\" />\n ) : null}\n </>\n );\n const rowClass = clsx(\n \"flex min-h-12 w-full items-center gap-3 px-4 py-1 text-left\",\n \"transition-colors duration-200 ease-standard hover:bg-on-surface/8\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n );\n const name = `${formatLabel(l.citation, { n: citation.n })}: ${citation.title}`;\n return (\n <li\n key={`${citation.n}-${citation.id ?? citation.title}`}\n id={`citation-${citation.n}`}\n >\n {onSelect ? (\n <button\n type=\"button\"\n className={rowClass}\n aria-label={name}\n onClick={() => onSelect(citation)}\n >\n {body}\n </button>\n ) : citation.url ? (\n <a\n href={citation.url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className={rowClass}\n aria-label={`${name} (${l.openSource})`}\n >\n {body}\n </a>\n ) : (\n <div className=\"flex min-h-12 items-center gap-3 px-4 py-1\">{body}</div>\n )}\n </li>\n );\n })}\n </ol>\n </section>\n );\n}\n\nexport interface RefusalNoticeProps {\n labels?: Partial<ChatLabels>;\n /** Backend explanation, shown under the title instead of the generic body. */\n detail?: string;\n className?: string;\n}\n\n/** `refusal: true`: the answer is not established in the sources (M3 tonal note, not an error). */\nexport function RefusalNotice({ labels, detail, className }: RefusalNoticeProps) {\n const l = resolveChatLabels(labels);\n return (\n <div\n role=\"note\"\n className={clsx(\n \"m3-refusal-notice flex items-start gap-3 rounded-medium bg-surface-container-high px-4 py-3\",\n className,\n )}\n >\n <ChatIcon name=\"info\" size={20} className=\"mt-0.5 text-on-surface-variant\" />\n <div className=\"min-w-0\">\n <p className=\"m-0 text-title-small text-on-surface\">{l.refusalTitle}</p>\n <p className=\"m-0 mt-0.5 text-body-medium text-on-surface-variant\">\n {detail || l.refusalBody}\n </p>\n </div>\n </div>\n );\n}\n",
11
14
  "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/InlineWorkerCard.tsx), MIT, rebuilt on Material Design 3.\n\nimport { useId, useMemo, useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Button, Icon } from \"@aphrody/m3-primitives\";\nimport { ToolCall } from \"./ToolCall\";\nimport { Markdown } from \"./Markdown\";\nimport type { TranscriptStep } from \"./types\";\nimport { pairTranscriptSteps } from \"./types\";\nimport { CircularIndicator, StatusChip, type ChipTone, expandMotion, focusRing } from \"./internal\";\n\n/** Collapse runs of 3+ spaces to 2, preventing Markdown 4-space code blocks. */\nfunction stripExcessWhitespace(text: string): string {\n return text.replace(/ {3,}/g, \" \");\n}\n\ninterface InlineWorkerCardProps {\n title: string;\n status: string;\n toolCallCount: number;\n liveStatus?: string | null;\n transcript: TranscriptStep[];\n isTranscriptLoading?: boolean;\n onCopyLogs?: () => void;\n onCancel?: () => void;\n className?: string;\n /** Start expanded (uncontrolled). */\n defaultExpanded?: boolean;\n}\n\nfunction statusTone(status: string): ChipTone {\n switch (status) {\n case \"running\":\n return \"primary\";\n case \"completed\":\n return \"success\";\n case \"failed\":\n case \"error\":\n case \"cancelled\":\n return \"error\";\n default:\n return \"neutral\";\n }\n}\n\n/** A worker run as an M3 filled card: header, status chip, expandable transcript. */\nfunction InlineWorkerCard({\n title,\n status,\n toolCallCount,\n liveStatus,\n transcript,\n isTranscriptLoading,\n onCopyLogs,\n onCancel,\n className,\n defaultExpanded = false,\n}: InlineWorkerCardProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const contentId = useId();\n\n const items = useMemo(() => pairTranscriptSteps(transcript), [transcript]);\n\n const isRunning = status === \"running\";\n const isDone = status === \"completed\";\n const tone = statusTone(status);\n\n return (\n <div className={clsx(\"group flex min-w-0 flex-col items-start\", className)}>\n <div className=\"min-w-0 max-w-full overflow-hidden rounded-medium bg-surface-container text-on-surface\">\n <button\n type=\"button\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n aria-controls={contentId}\n className={clsx(\n \"flex w-full items-start gap-3 rounded-medium px-4 py-3 text-left transition-colors duration-200 ease-standard\",\n \"hover:bg-on-surface/8 active:bg-on-surface/10\",\n focusRing,\n )}\n >\n <div className=\"flex size-8 shrink-0 items-center justify-center\">\n {isRunning ? (\n <CircularIndicator size={20} label=\"Worker running\" />\n ) : isDone ? (\n <div className=\"flex size-8 items-center justify-center rounded-full bg-success-container text-on-success-container\">\n <Icon name=\"check_circle\" size={18} filled />\n </div>\n ) : tone === \"error\" ? (\n <div className=\"flex size-8 items-center justify-center rounded-full bg-error-container text-on-error-container\">\n <Icon name=\"error\" size={18} filled />\n </div>\n ) : (\n <div className=\"flex size-8 items-center justify-center rounded-full bg-surface-container-highest text-on-surface-variant\">\n <Icon name=\"build\" size={18} />\n </div>\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <div className=\"line-clamp-2 min-w-0 flex-1 text-title-small text-on-surface\">\n {title}\n </div>\n <StatusChip tone={tone}>{status}</StatusChip>\n </div>\n <div className=\"mt-1 flex items-center gap-2 text-body-small text-on-surface-variant\">\n <span>{toolCallCount} tool calls</span>\n {liveStatus ? <span className=\"truncate text-outline\">{liveStatus}</span> : null}\n </div>\n </div>\n\n <Icon\n name=\"expand_more\"\n size={20}\n className={clsx(\n \"mt-1.5 shrink-0 text-on-surface-variant transition-transform duration-300 ease-emphasized\",\n expanded ? \"rotate-180\" : \"\",\n )}\n />\n </button>\n\n <AnimatePresence initial={false}>\n {expanded ? (\n <motion.div\n id={contentId}\n key=\"transcript\"\n {...expandMotion}\n className=\"overflow-hidden\"\n >\n <div className=\"flex flex-col gap-2 border-t border-outline-variant px-4 py-3\">\n {isTranscriptLoading ? (\n <div className=\"flex items-center gap-2 text-body-small text-on-surface-variant\">\n <CircularIndicator size={16} label=\"Loading transcript\" />\n Loading worker transcript...\n </div>\n ) : items.length > 0 ? (\n items.map((item) =>\n item.kind === \"tool\" ? (\n <ToolCall key={item.pair.id} pair={item.pair} />\n ) : (\n <Markdown\n key={`text-${item.text}`}\n content={stripExcessWhitespace(item.text)}\n size=\"small\"\n className=\"text-on-surface-variant\"\n />\n ),\n )\n ) : (\n <div className=\"text-body-small text-on-surface-variant\">No tool calls yet.</div>\n )}\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n\n {(onCopyLogs || (onCancel && isRunning)) && (\n <div className=\"mt-1 flex gap-1 opacity-0 transition-opacity duration-200 ease-standard group-focus-within:opacity-100 group-hover:opacity-100\">\n {onCopyLogs && (\n <Button variant=\"text\" size=\"xs\" onClick={onCopyLogs} title=\"Copy logs\">\n <Icon name=\"content_copy\" size={18} />\n Copy\n </Button>\n )}\n {onCancel && isRunning && (\n <Button variant=\"text\" size=\"xs\" onClick={onCancel} title=\"Cancel\">\n <Icon name=\"stop\" size={18} />\n Cancel\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport { InlineWorkerCard };\nexport type { InlineWorkerCardProps };\n",
12
15
  "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/InlineBranchCard.tsx), MIT, rebuilt on Material Design 3.\n\nimport { useId, useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { Icon } from \"@aphrody/m3-primitives\";\nimport { Markdown } from \"./Markdown\";\nimport { CircularIndicator, StatusChip, expandMotion, focusRing } from \"./internal\";\n\ninterface InlineBranchCardProps {\n description: string;\n completedAt: string | null;\n conclusion?: string | null;\n className?: string;\n /** Start expanded (uncontrolled). */\n defaultExpanded?: boolean;\n}\n\n/** A thinking branch as an M3 filled card: header, status chip, expandable conclusion. */\nfunction InlineBranchCard({\n description,\n completedAt,\n conclusion,\n className,\n defaultExpanded = false,\n}: InlineBranchCardProps) {\n const [expanded, setExpanded] = useState(defaultExpanded);\n const isRunning = !completedAt;\n const contentId = useId();\n const canExpand = !!conclusion;\n\n return (\n <div className={clsx(\"group flex min-w-0 flex-col items-start\", className)}>\n <div className=\"min-w-0 max-w-full overflow-hidden rounded-medium bg-surface-container text-on-surface\">\n <button\n type=\"button\"\n onClick={() => canExpand && setExpanded((v) => !v)}\n aria-expanded={canExpand ? expanded : undefined}\n aria-controls={canExpand ? contentId : undefined}\n className={clsx(\n \"flex w-full items-start gap-3 rounded-medium px-4 py-3 text-left transition-colors duration-200 ease-standard\",\n canExpand && \"hover:bg-on-surface/8 active:bg-on-surface/10\",\n focusRing,\n )}\n >\n <div className=\"flex size-8 shrink-0 items-center justify-center\">\n {isRunning ? (\n <CircularIndicator size={20} label=\"Thinking\" />\n ) : (\n <div className=\"flex size-8 items-center justify-center rounded-full bg-primary-container text-on-primary-container\">\n <Icon name=\"alt_route\" size={18} />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1 self-center\">\n <div className=\"flex items-center gap-2\">\n <div className=\"line-clamp-2 min-w-0 flex-1 text-title-small text-on-surface\">\n {description}\n </div>\n <StatusChip tone={isRunning ? \"primary\" : \"success\"}>\n {isRunning ? \"thinking\" : \"done\"}\n </StatusChip>\n </div>\n </div>\n {canExpand && (\n <Icon\n name=\"expand_more\"\n size={20}\n className={clsx(\n \"mt-1.5 shrink-0 text-on-surface-variant transition-transform duration-300 ease-emphasized\",\n expanded ? \"rotate-180\" : \"\",\n )}\n />\n )}\n </button>\n <AnimatePresence initial={false}>\n {expanded && conclusion ? (\n <motion.div\n id={contentId}\n key=\"conclusion\"\n {...expandMotion}\n className=\"overflow-hidden\"\n >\n <div className=\"border-t border-outline-variant px-4 py-3\">\n <Markdown content={conclusion} size=\"small\" className=\"text-on-surface-variant\" />\n </div>\n </motion.div>\n ) : null}\n </AnimatePresence>\n </div>\n </div>\n );\n}\n\nexport { InlineBranchCard };\nexport type { InlineBranchCardProps };\n",
13
- "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/ModelSelector.tsx), MIT, rebuilt on Material Design 3.\n\n\"use client\";\n\nimport {\n Icon,\n Popover,\n usePopover,\n SelectPill,\n type SelectPillProps,\n} from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { focusRing } from \"./internal\";\nimport type { ModelOption } from \"./types\";\n\nexport interface ModelSelectorProps {\n /** Available models */\n models: ModelOption[];\n /** Currently selected model ID */\n value: string;\n /** Called when a model is selected */\n onChange: (value: string) => void;\n /** Placeholder when nothing selected */\n placeholder?: string;\n /** Search placeholder */\n searchPlaceholder?: string;\n /** SelectPill variant */\n variant?: SelectPillProps[\"variant\"];\n /** SelectPill size */\n size?: SelectPillProps[\"size\"];\n /** Controlled popover (optional) */\n popover?: ReturnType<typeof usePopover>;\n /** Additional trigger className */\n className?: string;\n /** Disabled state */\n disabled?: boolean;\n}\n\n/** Group models by provider, keeping the order of first appearance. */\nexport function groupModelsByProvider(\n models: ModelOption[],\n search = \"\",\n): Record<string, ModelOption[]> {\n const q = search.trim().toLowerCase();\n const filtered = q\n ? models.filter((m) => m.name.toLowerCase().includes(q) || m.provider.toLowerCase().includes(q))\n : models;\n\n return filtered.reduce(\n (acc, model) => {\n if (!acc[model.provider]) acc[model.provider] = [];\n acc[model.provider].push(model);\n return acc;\n },\n Object.create(null) as Record<string, ModelOption[]>,\n );\n}\n\nexport interface ModelOptionListProps {\n /** Models grouped by provider (see {@link groupModelsByProvider}). */\n grouped: Record<string, ModelOption[]>;\n /** Currently selected model ID */\n value: string;\n /** Called when a model is picked */\n onSelect: (value: string) => void;\n className?: string;\n}\n\n/**\n * The M3 menu list of the model selector: provider section headers (`text-title-small`),\n * 48 dp two-line items (`text-label-large` + `text-body-small` supporting text), the selected\n * item on `secondary-container`, capabilities as small outlined chips.\n */\nexport function ModelOptionList({ grouped, value, onSelect, className }: ModelOptionListProps) {\n const providers = Object.entries(grouped);\n const models = providers.flatMap(([, providerModels]) => providerModels);\n const [focusedId, setFocusedId] = useState(value);\n const focusId = models.some((model) => model.id === focusedId)\n ? focusedId\n : (models.find((model) => model.id === value)?.id ?? models[0]?.id);\n return (\n <div\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 menu whose options are rich rows (headers, supporting text, chips); a native <select>/<datalist> cannot render them.\n role=\"listbox\"\n aria-label=\"Models\"\n tabIndex={-1}\n onKeyDown={(event) => {\n if (event.defaultPrevented) return;\n const options = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"option\"]'),\n );\n const index = options.indexOf(event.target as HTMLButtonElement);\n if (index < 0) return;\n let next: number;\n switch (event.key) {\n case \"ArrowDown\":\n next = (index + 1) % options.length;\n break;\n case \"ArrowUp\":\n next = (index - 1 + options.length) % options.length;\n break;\n case \"Home\":\n next = 0;\n break;\n case \"End\":\n next = options.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n options[next]!.focus();\n }}\n className={clsx(\"flex flex-col\", className)}\n >\n {providers.map(([provider, providerModels], groupIndex) => (\n <div\n key={provider}\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- provider section of the custom listbox with a visible M3 header row; <optgroup> only exists inside a native <select>.\n role=\"group\"\n aria-label={provider}\n className={clsx(groupIndex > 0 && \"mt-1 border-t border-outline-variant pt-1\")}\n >\n <div className=\"px-3 pt-2 pb-1 text-title-small text-on-surface-variant\">{provider}</div>\n {providerModels.map((model) => {\n const selected = model.id === value;\n return (\n <button\n key={model.id}\n type=\"button\"\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 two-line menu item (label, supporting text, capability chips, check icon); a native <option> can only hold text.\n role=\"option\"\n aria-selected={selected}\n tabIndex={model.id === focusId ? 0 : -1}\n onFocus={() => setFocusedId(model.id)}\n onClick={() => onSelect(model.id)}\n className={clsx(\n \"flex min-h-12 w-full items-center gap-3 px-3 py-2 text-left\",\n \"transition-colors duration-200 ease-standard\",\n selected\n ? \"bg-secondary-container text-on-secondary-container\"\n : \"text-on-surface hover:bg-on-surface/8 active:bg-on-surface/10\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-label-large\">{model.name}</div>\n {model.context_window || model.capabilities?.length ? (\n <div className=\"mt-0.5 flex flex-wrap items-center gap-1\">\n {model.context_window ? (\n <span\n className={clsx(\n \"text-body-small\",\n selected ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n {model.context_window.toLocaleString()} tokens\n </span>\n ) : null}\n {model.capabilities?.map((capability) => (\n <span\n key={capability}\n className={clsx(\n \"inline-flex h-5 items-center rounded-small border border-outline-variant px-1.5 text-label-small\",\n selected ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n {capability}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n {selected && <Icon name=\"check\" size={20} className=\"shrink-0\" />}\n </button>\n );\n })}\n </div>\n ))}\n {providers.length === 0 && (\n <div className=\"px-3 py-3 text-center text-body-small text-on-surface-variant\">\n No models found\n </div>\n )}\n </div>\n );\n}\n\n/**\n * The menu's search field. It mounts with the popover content and takes focus then (replaces\n * `autoFocus`), so typing filters the list as soon as the menu opens.\n */\nfunction ModelSearchField({\n value,\n onChange,\n placeholder,\n}: {\n value: string;\n onChange: (value: string) => void;\n placeholder: string;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n return (\n <div className=\"px-2 pb-2\">\n <label className=\"flex h-10 items-center gap-2 rounded-full bg-surface-container-high px-3 text-on-surface-variant focus-within:bg-surface-container-highest\">\n <Icon name=\"search\" size={20} className=\"shrink-0\" />\n <input\n ref={inputRef}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n aria-label={placeholder}\n className=\"min-w-0 flex-1 bg-transparent text-body-large text-on-surface outline-none placeholder:text-on-surface-variant\"\n />\n </label>\n </div>\n );\n}\n\nexport const ModelSelector = forwardRef<HTMLButtonElement, ModelSelectorProps>(\n (\n {\n models,\n value,\n onChange,\n placeholder = \"Select model...\",\n searchPlaceholder = \"Search models...\",\n variant,\n size,\n popover: externalPopover,\n className,\n disabled,\n },\n ref,\n ) => {\n const internalPopover = usePopover();\n const popover = externalPopover ?? internalPopover;\n const [search, setSearch] = useState(\"\");\n\n const selectedModel = models.find((m) => m.id === value);\n\n const grouped = useMemo(() => groupModelsByProvider(models, search), [models, search]);\n\n return (\n <Popover.Root\n open={popover.open}\n onOpenChange={(open) => {\n popover.setOpen(open);\n if (!open) setSearch(\"\");\n }}\n >\n <Popover.Trigger asChild>\n <SelectPill\n ref={ref}\n variant={variant}\n size={size}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n className={clsx(\"w-full\", className)}\n >\n {selectedModel?.name ?? placeholder}\n </SelectPill>\n </Popover.Trigger>\n <Popover.Content\n align=\"end\"\n sideOffset={8}\n style={{ width: 280 }}\n className=\"overflow-hidden rounded-extra-small! py-2\"\n >\n {/* Search */}\n <ModelSearchField value={search} onChange={setSearch} placeholder={searchPlaceholder} />\n\n {/* Grouped results */}\n <div className=\"max-h-[320px] overflow-y-auto\">\n <ModelOptionList\n grouped={grouped}\n value={value}\n onSelect={(id) => {\n onChange(id);\n popover.setOpen(false);\n setSearch(\"\");\n }}\n />\n </div>\n </Popover.Content>\n </Popover.Root>\n );\n },\n);\n\nModelSelector.displayName = \"ModelSelector\";\n",
14
- "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/ChatComposer.tsx), MIT, rebuilt on Material Design 3.\n\n\"use client\";\n\nimport { CircleButton, Icon, Popover, SelectPill, usePopover } from \"@aphrody/m3-primitives\";\nimport { m3Durations, m3Easings } from \"@aphrody/m3-motion\";\nimport { clsx } from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { type ReactNode } from \"react\";\n\nimport { focusRing } from \"./internal\";\nimport { ModelSelector } from \"./ModelSelector\";\nimport type { ModelOption } from \"./types\";\n\nexport interface ChatComposerProps {\n /** Current draft text */\n draft: string;\n /** Called when draft changes */\n onDraftChange: (value: string) => void;\n /** Called when user hits send (Enter or send button) */\n onSend: () => void;\n /** Placeholder for the textarea */\n placeholder?: string;\n /** Show an optional heading above the composer */\n heading?: ReactNode;\n /** Disable the composer — draft can still change, but send/voice are blocked */\n isSending?: boolean;\n /** Project selector config — omit to hide */\n projectSelector?: {\n value: string;\n options: string[];\n onChange: (project: string) => void;\n popover: ReturnType<typeof usePopover>;\n };\n /** Model selector config — omit to hide */\n modelSelector?: {\n value: string;\n options: ModelOption[];\n onChange: (model: string) => void;\n };\n /** Voice button handler — omit to hide */\n onOpenVoice?: () => void;\n /** Optional content rendered at the far right of the toolbar (before send) */\n toolbarExtra?: ReactNode;\n /** Stop handler: while `isSending`, the send button becomes an M3 `stop` icon button. */\n onStop?: () => void;\n /** Additional className on the composer container */\n className?: string;\n}\n\nconst iconButtonEnter = {\n initial: { scale: 0.6, opacity: 0 },\n animate: {\n scale: 1,\n opacity: 1,\n transition: { duration: m3Durations.short4, ease: m3Easings.emphasizedDecelerate },\n },\n exit: {\n scale: 0.6,\n opacity: 0,\n transition: { duration: m3Durations.short3, ease: m3Easings.emphasizedAccelerate },\n },\n} as const;\n\n/**\n * Generic chat composer on the M3 search-bar anatomy: a `surface-container-high` container with\n * the extra-large (28 dp) shape, a `text-body-large` expanding textarea, an optional project\n * pill, model selector chip, a standard mic icon button and a filled send / stop icon button.\n */\nexport function ChatComposer({\n draft,\n onDraftChange,\n onSend,\n placeholder = \"Ask something...\",\n heading,\n isSending = false,\n projectSelector,\n modelSelector,\n onOpenVoice,\n toolbarExtra,\n onStop,\n className,\n}: ChatComposerProps) {\n const canSend = !isSending && draft.trim().length > 0;\n const showStop = isSending && !!onStop;\n\n return (\n <>\n {heading && (\n <div className=\"mb-3 flex items-center gap-2 px-1 text-title-small text-on-surface-variant\">\n <Icon name=\"auto_awesome\" size={18} filled className=\"text-primary\" />\n {heading}\n </div>\n )}\n\n <div\n className={clsx(\n \"m3-chat-composer rounded-extra-large bg-surface-container-high px-4 pt-3 pb-2 text-on-surface\",\n \"transition-colors duration-200 ease-standard focus-within:bg-surface-container-highest\",\n className,\n )}\n >\n <textarea\n value={draft}\n onChange={(event) => onDraftChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n onSend();\n }\n }}\n placeholder={placeholder}\n aria-label={placeholder}\n rows={2}\n className=\"block w-full resize-none border-0 bg-transparent px-1 text-body-large text-on-surface caret-primary outline-none placeholder:text-on-surface-variant focus:outline-none focus:ring-0\"\n />\n\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {projectSelector ? (\n <div className=\"w-[210px]\">\n <Popover.Root\n open={projectSelector.popover.open}\n onOpenChange={projectSelector.popover.setOpen}\n >\n <Popover.Trigger asChild>\n <SelectPill className=\"w-full\" aria-haspopup=\"listbox\">\n {projectSelector.value}\n </SelectPill>\n </Popover.Trigger>\n <Popover.Content\n align=\"start\"\n sideOffset={8}\n className=\"min-w-[210px] overflow-hidden rounded-extra-small! py-2\"\n >\n <div\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 menu in a popover with icon rows; a native <select>/<datalist> cannot render it.\n role=\"listbox\"\n aria-label=\"Projects\"\n >\n {projectSelector.options.map((option) => {\n const selected = option === projectSelector.value;\n return (\n <button\n key={option}\n type=\"button\"\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 menu item with a check icon and state layer; a native <option> can only hold text.\n role=\"option\"\n aria-selected={selected}\n onClick={() => {\n projectSelector.onChange(option);\n projectSelector.popover.setOpen(false);\n }}\n className={clsx(\n \"flex h-12 w-full items-center gap-3 px-3 text-left text-label-large\",\n \"transition-colors duration-200 ease-standard\",\n selected\n ? \"bg-secondary-container text-on-secondary-container\"\n : \"text-on-surface hover:bg-on-surface/8\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{option}</span>\n {selected && <Icon name=\"check\" size={20} />}\n </button>\n );\n })}\n </div>\n </Popover.Content>\n </Popover.Root>\n </div>\n ) : (\n <div />\n )}\n\n <motion.div layout className=\"flex items-center gap-1\">\n {modelSelector && (\n <div className=\"w-[180px]\">\n <ModelSelector\n models={modelSelector.options}\n value={modelSelector.value}\n onChange={modelSelector.onChange}\n size=\"md\"\n />\n </div>\n )}\n\n {toolbarExtra}\n\n {onOpenVoice && (\n <CircleButton\n icon=\"mic\"\n variant=\"standard\"\n onClick={onOpenVoice}\n disabled={isSending}\n aria-label=\"Open Voice Input\"\n />\n )}\n\n <AnimatePresence initial={false} mode=\"popLayout\">\n {showStop ? (\n <motion.button\n key=\"stop\"\n type=\"button\"\n {...iconButtonEnter}\n onClick={onStop}\n aria-label=\"Stop\"\n className={clsx(\n \"flex size-10 shrink-0 items-center justify-center rounded-full bg-primary text-on-primary\",\n \"transition-colors duration-200 ease-standard hover:bg-primary/92 active:bg-primary/90\",\n focusRing,\n )}\n >\n <Icon name=\"stop\" size={24} filled />\n </motion.button>\n ) : canSend ? (\n <motion.button\n key=\"send\"\n type=\"button\"\n {...iconButtonEnter}\n onClick={onSend}\n aria-label=\"Send\"\n className={clsx(\n \"flex size-10 shrink-0 items-center justify-center rounded-full bg-primary text-on-primary\",\n \"transition-colors duration-200 ease-standard hover:bg-primary/92 active:bg-primary/90\",\n focusRing,\n )}\n >\n <Icon name=\"arrow_upward\" size={24} />\n </motion.button>\n ) : null}\n </AnimatePresence>\n </motion.div>\n </div>\n </div>\n </>\n );\n}\n",
16
+ "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/ModelSelector.tsx), MIT, rebuilt on Material Design 3.\n\n\"use client\";\n\nimport { Popover, usePopover, SelectPill, type SelectPillProps } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { forwardRef, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { type ChatLabels, formatLabel, resolveChatLabels } from \"./chatLabels\";\nimport { ChatIcon } from \"./chatIcons\";\nimport { focusRing } from \"./internal\";\nimport type { ModelOption } from \"./types\";\n\nexport interface ModelSelectorProps {\n /** Available models */\n models: ModelOption[];\n /** Currently selected model ID */\n value: string;\n /** Called when a model is selected */\n onChange: (value: string) => void;\n /** Placeholder when nothing selected */\n placeholder?: string;\n /** Search placeholder */\n searchPlaceholder?: string;\n /** SelectPill variant */\n variant?: SelectPillProps[\"variant\"];\n /** SelectPill size */\n size?: SelectPillProps[\"size\"];\n /** Controlled popover (optional) */\n popover?: ReturnType<typeof usePopover>;\n /** Additional trigger className */\n className?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Visible strings; `placeholder` / `searchPlaceholder` win over them. English defaults. */\n labels?: Partial<ChatLabels>;\n}\n\n/** Group models by provider, keeping the order of first appearance. */\nexport function groupModelsByProvider(\n models: ModelOption[],\n search = \"\",\n): Record<string, ModelOption[]> {\n const q = search.trim().toLowerCase();\n const filtered = q\n ? models.filter((m) => m.name.toLowerCase().includes(q) || m.provider.toLowerCase().includes(q))\n : models;\n\n return filtered.reduce(\n (acc, model) => {\n if (!acc[model.provider]) acc[model.provider] = [];\n acc[model.provider].push(model);\n return acc;\n },\n Object.create(null) as Record<string, ModelOption[]>,\n );\n}\n\nexport interface ModelOptionListProps {\n /** Models grouped by provider (see {@link groupModelsByProvider}). */\n grouped: Record<string, ModelOption[]>;\n /** Currently selected model ID */\n value: string;\n /** Called when a model is picked */\n onSelect: (value: string) => void;\n className?: string;\n labels?: Partial<ChatLabels>;\n}\n\n/**\n * The M3 menu list of the model selector: provider section headers (`text-title-small`),\n * 48 dp two-line items (`text-label-large` + `text-body-small` supporting text), the selected\n * item on `secondary-container`, capabilities as small outlined chips.\n */\nexport function ModelOptionList({\n grouped,\n value,\n onSelect,\n className,\n labels,\n}: ModelOptionListProps) {\n const l = resolveChatLabels(labels);\n const providers = Object.entries(grouped);\n const models = providers.flatMap(([, providerModels]) => providerModels);\n const [focusedId, setFocusedId] = useState(value);\n const focusId = models.some((model) => model.id === focusedId)\n ? focusedId\n : (models.find((model) => model.id === value)?.id ?? models[0]?.id);\n return (\n <div\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 menu whose options are rich rows (headers, supporting text, chips); a native <select>/<datalist> cannot render them.\n role=\"listbox\"\n aria-label={l.models}\n tabIndex={-1}\n onKeyDown={(event) => {\n if (event.defaultPrevented) return;\n const options = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"option\"]'),\n );\n const index = options.indexOf(event.target as HTMLButtonElement);\n if (index < 0) return;\n let next: number;\n switch (event.key) {\n case \"ArrowDown\":\n next = (index + 1) % options.length;\n break;\n case \"ArrowUp\":\n next = (index - 1 + options.length) % options.length;\n break;\n case \"Home\":\n next = 0;\n break;\n case \"End\":\n next = options.length - 1;\n break;\n default:\n return;\n }\n event.preventDefault();\n options[next]!.focus();\n }}\n className={clsx(\"flex flex-col\", className)}\n >\n {providers.map(([provider, providerModels], groupIndex) => (\n <div\n key={provider}\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- provider section of the custom listbox with a visible M3 header row; <optgroup> only exists inside a native <select>.\n role=\"group\"\n aria-label={provider}\n className={clsx(groupIndex > 0 && \"mt-1 border-t border-outline-variant pt-1\")}\n >\n <div className=\"px-3 pt-2 pb-1 text-title-small text-on-surface-variant\">{provider}</div>\n {providerModels.map((model) => {\n const selected = model.id === value;\n return (\n <button\n key={model.id}\n type=\"button\"\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 two-line menu item (label, supporting text, capability chips, check icon); a native <option> can only hold text.\n role=\"option\"\n aria-selected={selected}\n tabIndex={model.id === focusId ? 0 : -1}\n onFocus={() => setFocusedId(model.id)}\n onClick={() => onSelect(model.id)}\n className={clsx(\n \"flex min-h-12 w-full items-center gap-3 px-3 py-2 text-left\",\n \"transition-colors duration-200 ease-standard\",\n selected\n ? \"bg-secondary-container text-on-secondary-container\"\n : \"text-on-surface hover:bg-on-surface/8 active:bg-on-surface/10\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-label-large\">{model.name}</div>\n {model.context_window || model.capabilities?.length ? (\n <div className=\"mt-0.5 flex flex-wrap items-center gap-1\">\n {model.context_window ? (\n <span\n className={clsx(\n \"text-body-small\",\n selected ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n {formatLabel(l.contextTokens, {\n count: model.context_window.toLocaleString(),\n })}\n </span>\n ) : null}\n {model.capabilities?.map((capability) => (\n <span\n key={capability}\n className={clsx(\n \"inline-flex h-5 items-center rounded-small border border-outline-variant px-1.5 text-label-small\",\n selected ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n {capability}\n </span>\n ))}\n </div>\n ) : null}\n </div>\n {selected && <ChatIcon name=\"check\" size={20} />}\n </button>\n );\n })}\n </div>\n ))}\n {providers.length === 0 && (\n <div className=\"px-3 py-3 text-center text-body-small text-on-surface-variant\">\n {l.noModels}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * The menu's search field. It mounts with the popover content and takes focus then (replaces\n * `autoFocus`), so typing filters the list as soon as the menu opens.\n */\nfunction ModelSearchField({\n value,\n onChange,\n placeholder,\n}: {\n value: string;\n onChange: (value: string) => void;\n placeholder: string;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n return (\n <div className=\"px-2 pb-2\">\n <label className=\"flex h-10 items-center gap-2 rounded-full bg-surface-container-high px-3 text-on-surface-variant focus-within:bg-surface-container-highest\">\n <ChatIcon name=\"search\" size={20} />\n <input\n ref={inputRef}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n aria-label={placeholder}\n className=\"min-w-0 flex-1 bg-transparent text-body-large text-on-surface outline-none placeholder:text-on-surface-variant\"\n />\n </label>\n </div>\n );\n}\n\nexport const ModelSelector = forwardRef<HTMLButtonElement, ModelSelectorProps>(\n (\n {\n models,\n value,\n onChange,\n placeholder,\n searchPlaceholder,\n variant,\n size,\n popover: externalPopover,\n className,\n disabled,\n labels,\n },\n ref,\n ) => {\n const l = resolveChatLabels(labels);\n const internalPopover = usePopover();\n const popover = externalPopover ?? internalPopover;\n const [search, setSearch] = useState(\"\");\n\n const selectedModel = models.find((m) => m.id === value);\n\n const grouped = useMemo(() => groupModelsByProvider(models, search), [models, search]);\n\n return (\n <Popover.Root\n open={popover.open}\n onOpenChange={(open) => {\n popover.setOpen(open);\n if (!open) setSearch(\"\");\n }}\n >\n <Popover.Trigger asChild>\n <SelectPill\n ref={ref}\n variant={variant}\n size={size}\n disabled={disabled}\n aria-haspopup=\"listbox\"\n hideCaret\n className={clsx(\"w-full\", className)}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {selectedModel?.name ?? placeholder ?? l.selectModel}\n </span>\n <ChatIcon name=\"expand_more\" size={18} />\n </SelectPill>\n </Popover.Trigger>\n <Popover.Content\n align=\"end\"\n sideOffset={8}\n style={{ width: 280 }}\n className=\"overflow-hidden rounded-extra-small! py-2\"\n >\n {/* Search */}\n <ModelSearchField\n value={search}\n onChange={setSearch}\n placeholder={searchPlaceholder ?? l.searchModels}\n />\n\n {/* Grouped results */}\n <div className=\"max-h-[320px] overflow-y-auto\">\n <ModelOptionList\n grouped={grouped}\n value={value}\n labels={labels}\n onSelect={(id) => {\n onChange(id);\n popover.setOpen(false);\n setSearch(\"\");\n }}\n />\n </div>\n </Popover.Content>\n </Popover.Root>\n );\n },\n);\n\nModelSelector.displayName = \"ModelSelector\";\n",
17
+ "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/ChatComposer.tsx), MIT, rebuilt on Material Design 3.\n\n\"use client\";\n\nimport { CircleButton, Popover, SelectPill, usePopover } from \"@aphrody/m3-primitives\";\nimport { m3Durations, m3Easings } from \"@aphrody/m3-motion\";\nimport { clsx } from \"clsx\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { type ReactNode } from \"react\";\n\nimport { type ChatLabels, resolveChatLabels } from \"./chatLabels\";\nimport { ChatIcon } from \"./chatIcons\";\nimport { focusRing } from \"./internal\";\nimport { ModelSelector } from \"./ModelSelector\";\nimport type { ModelOption } from \"./types\";\n\nexport interface ChatComposerProps {\n /** Current draft text */\n draft: string;\n /** Called when draft changes */\n onDraftChange: (value: string) => void;\n /** Called when user hits send (Enter or send button) */\n onSend: () => void;\n /** Placeholder for the textarea */\n placeholder?: string;\n /** Show an optional heading above the composer */\n heading?: ReactNode;\n /** Disable the composer — draft can still change, but send/voice are blocked */\n isSending?: boolean;\n /**\n * Disable the whole composer (e.g. the model is unavailable): the textarea, send, voice and\n * the selectors are all inert. Distinct from `isSending`, which keeps the draft editable.\n */\n disabled?: boolean;\n /** Project selector config — omit to hide */\n projectSelector?: {\n value: string;\n options: string[];\n onChange: (project: string) => void;\n popover: ReturnType<typeof usePopover>;\n };\n /** Model selector config — omit to hide */\n modelSelector?: {\n value: string;\n options: ModelOption[];\n onChange: (model: string) => void;\n };\n /** Voice button handler — omit to hide */\n onOpenVoice?: () => void;\n /** Optional content rendered at the far right of the toolbar (before send) */\n toolbarExtra?: ReactNode;\n /** Stop handler: while `isSending`, the send button becomes an M3 `stop` icon button. */\n onStop?: () => void;\n /** Additional className on the composer container */\n className?: string;\n /** Visible strings (placeholder, aria-labels); English defaults. `placeholder` wins over it. */\n labels?: Partial<ChatLabels>;\n}\n\nconst iconButtonEnter = {\n initial: { scale: 0.6, opacity: 0 },\n animate: {\n scale: 1,\n opacity: 1,\n transition: { duration: m3Durations.short4, ease: m3Easings.emphasizedDecelerate },\n },\n exit: {\n scale: 0.6,\n opacity: 0,\n transition: { duration: m3Durations.short3, ease: m3Easings.emphasizedAccelerate },\n },\n} as const;\n\n/**\n * Generic chat composer on the M3 search-bar anatomy: a `surface-container-high` container with\n * the extra-large (28 dp) shape, a `text-body-large` expanding textarea, an optional project\n * pill, model selector chip, a standard mic icon button and a filled send / stop icon button.\n */\nexport function ChatComposer({\n draft,\n onDraftChange,\n onSend,\n placeholder,\n heading,\n isSending = false,\n disabled = false,\n projectSelector,\n modelSelector,\n onOpenVoice,\n toolbarExtra,\n onStop,\n className,\n labels,\n}: ChatComposerProps) {\n const l = resolveChatLabels(labels);\n const hint = placeholder ?? l.composerPlaceholder;\n const canSend = !disabled && !isSending && draft.trim().length > 0;\n const showStop = !disabled && isSending && !!onStop;\n\n return (\n <>\n {heading && (\n <div className=\"mb-3 flex items-center gap-2 px-1 text-title-small text-on-surface-variant\">\n <ChatIcon name=\"auto_awesome_filled\" size={18} className=\"text-primary\" />\n {heading}\n </div>\n )}\n\n <div\n className={clsx(\n \"m3-chat-composer rounded-extra-large bg-surface-container-high px-4 pt-3 pb-2 text-on-surface\",\n \"transition-colors duration-200 ease-standard focus-within:bg-surface-container-highest\",\n className,\n )}\n >\n <textarea\n value={draft}\n onChange={(event) => onDraftChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n if (canSend) onSend();\n }\n }}\n placeholder={hint}\n aria-label={hint}\n rows={2}\n disabled={disabled}\n className=\"block w-full resize-none border-0 bg-transparent px-1 text-body-large text-on-surface caret-primary outline-none placeholder:text-on-surface-variant focus:outline-none focus:ring-0\"\n />\n\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n {projectSelector ? (\n <div className=\"w-[210px]\">\n <Popover.Root\n open={projectSelector.popover.open}\n onOpenChange={projectSelector.popover.setOpen}\n >\n <Popover.Trigger asChild>\n <SelectPill\n className=\"w-full\"\n aria-haspopup=\"listbox\"\n disabled={disabled}\n hideCaret\n >\n <span className=\"min-w-0 flex-1 truncate\">{projectSelector.value}</span>\n <ChatIcon name=\"expand_more\" size={18} />\n </SelectPill>\n </Popover.Trigger>\n <Popover.Content\n align=\"start\"\n sideOffset={8}\n className=\"min-w-[210px] overflow-hidden rounded-extra-small! py-2\"\n >\n <div\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 menu in a popover with icon rows; a native <select>/<datalist> cannot render it.\n role=\"listbox\"\n aria-label={l.projects}\n >\n {projectSelector.options.map((option) => {\n const selected = option === projectSelector.value;\n return (\n <button\n key={option}\n type=\"button\"\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 menu item with a check icon and state layer; a native <option> can only hold text.\n role=\"option\"\n aria-selected={selected}\n onClick={() => {\n projectSelector.onChange(option);\n projectSelector.popover.setOpen(false);\n }}\n className={clsx(\n \"flex h-12 w-full items-center gap-3 px-3 text-left text-label-large\",\n \"transition-colors duration-200 ease-standard\",\n selected\n ? \"bg-secondary-container text-on-secondary-container\"\n : \"text-on-surface hover:bg-on-surface/8\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{option}</span>\n {selected && <ChatIcon name=\"check\" size={20} />}\n </button>\n );\n })}\n </div>\n </Popover.Content>\n </Popover.Root>\n </div>\n ) : (\n <div />\n )}\n\n <motion.div layout className=\"flex items-center gap-1\">\n {modelSelector && (\n <div className=\"w-[180px]\">\n <ModelSelector\n models={modelSelector.options}\n value={modelSelector.value}\n onChange={modelSelector.onChange}\n size=\"md\"\n disabled={disabled}\n labels={labels}\n />\n </div>\n )}\n\n {toolbarExtra}\n\n {onOpenVoice && (\n <CircleButton\n icon={<ChatIcon name=\"mic\" size={20} />}\n variant=\"standard\"\n onClick={onOpenVoice}\n disabled={isSending || disabled}\n aria-label={l.openVoice}\n />\n )}\n\n <AnimatePresence initial={false} mode=\"popLayout\">\n {showStop ? (\n <motion.button\n key=\"stop\"\n type=\"button\"\n {...iconButtonEnter}\n onClick={onStop}\n aria-label={l.stop}\n className={clsx(\n \"flex size-10 shrink-0 items-center justify-center rounded-full bg-primary text-on-primary\",\n \"transition-colors duration-200 ease-standard hover:bg-primary/92 active:bg-primary/90\",\n focusRing,\n )}\n >\n <ChatIcon name=\"stop_filled\" size={24} />\n </motion.button>\n ) : canSend ? (\n <motion.button\n key=\"send\"\n type=\"button\"\n {...iconButtonEnter}\n onClick={onSend}\n aria-label={l.send}\n className={clsx(\n \"flex size-10 shrink-0 items-center justify-center rounded-full bg-primary text-on-primary\",\n \"transition-colors duration-200 ease-standard hover:bg-primary/92 active:bg-primary/90\",\n focusRing,\n )}\n >\n <ChatIcon name=\"arrow_upward\" size={24} />\n </motion.button>\n ) : null}\n </AnimatePresence>\n </motion.div>\n </div>\n </div>\n </>\n );\n}\n",
15
18
  "// SPDX-License-Identifier: Apache-2.0\n// Benchmark: assets/ui/google-desktop-spotlight-bar.png (manifest item 1)\n// Dimensions: ~1266x450px, border-radius 32dp (BRAND_CORNER_PROMPT_BAR_PX), Alt + Space capsule\n\n\"use client\";\n\nimport { CircleButton, Icon } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { type ReactNode, useState } from \"react\";\n\nexport interface GoogleSpotlightBarProps {\n /** Placeholder text */\n placeholder?: string;\n /** Active query draft */\n query?: string;\n /** On change callback */\n onQueryChange?: (val: string) => void;\n /** Triggered on submit */\n onSubmit?: (query: string) => void;\n /** File/attachment action handler */\n onAttach?: () => void;\n /** Screen capture / share window handler */\n onScreenCapture?: () => void;\n /** Google Lens multimodal query handler */\n onGoogleLens?: () => void;\n /** User avatar element or image URL */\n avatar?: ReactNode;\n /** Additional container classes */\n className?: string;\n}\n\n/**\n * Floating Spotlight Assistant Bar & Search Capsule (Alt + Space).\n * Benchmark parity: `google-desktop-spotlight-bar.png` (manifest item 1).\n * Features:\n * - Floating translucent frameless capsule with 32dp corner radius (--gemini-corner-prompt-bar).\n * - Soft desktop elevation shadow.\n * - Global shortcut pill indicator ('Alt + Space').\n * - Multimodal action buttons (+ for attach, screen capture, Google Lens).\n */\nexport function GoogleSpotlightBar({\n placeholder = \"Ask anything or start typing...\",\n query: controlledQuery,\n onQueryChange,\n onSubmit,\n onAttach,\n onScreenCapture,\n onGoogleLens,\n avatar,\n className,\n}: GoogleSpotlightBarProps) {\n const [internalQuery, setInternalQuery] = useState(\"\");\n const query = controlledQuery !== undefined ? controlledQuery : internalQuery;\n\n const handleChange = (val: string) => {\n if (controlledQuery === undefined) {\n setInternalQuery(val);\n }\n onQueryChange?.(val);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && query.trim().length > 0) {\n e.preventDefault();\n onSubmit?.(query);\n }\n };\n\n return (\n <search\n aria-label=\"Google Spotlight Assistant\"\n className={clsx(\n \"google-spotlight-capsule relative mx-auto flex w-full max-w-[840px] items-center gap-3\",\n \"rounded-[var(--gemini-corner-prompt-bar,32px)] bg-surface-container-high/90 px-5 py-3.5 backdrop-blur-xl\",\n \"border border-outline-variant/30 text-on-surface shadow-md3-3 transition-all duration-200\",\n \"focus-within:border-primary/50 focus-within:bg-surface-container-highest/95 focus-within:shadow-md3-4\",\n className,\n )}\n >\n {/* Google Colorful G Logo */}\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center\">\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\">\n <path\n fill=\"#4285F4\"\n d=\"M23.745 12.27c0-.7-.06-1.4-.19-2.07H12v4.51h6.6c-.29 1.52-1.14 2.8-2.4 3.64v3.03h3.88c2.27-2.09 3.665-5.17 3.665-9.11z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 24c3.24 0 5.95-1.08 7.93-2.91l-3.88-3.03c-1.08.72-2.45 1.16-4.05 1.16-3.12 0-5.77-2.1-6.72-4.93H1.25v3.13C3.28 21.43 7.33 24 12 24z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.28 14.29c-.25-.72-.38-1.49-.38-2.29s.14-1.57.38-2.29V6.57H1.25C.45 8.16 0 9.98 0 12s.45 3.84 1.25 5.43l4.03-3.14z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 4.75c1.77 0 3.35.61 4.6 1.8l3.42-3.42C17.95 1.19 15.24 0 12 0 7.33 0 3.28 2.57 1.25 6.57l4.03 3.14c.95-2.83 3.6-4.96 6.72-4.96z\"\n />\n </svg>\n </div>\n\n {/* Main multimodal text input */}\n <input\n type=\"text\"\n value={query}\n onChange={(e) => handleChange(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n aria-label={placeholder}\n className=\"block flex-1 border-0 bg-transparent px-1 text-body-large text-on-surface caret-primary outline-none placeholder:text-on-surface-variant focus:outline-none focus:ring-0\"\n />\n\n {/* Multimodal Actions (Attach, Screen, Lens) */}\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {onAttach && (\n <CircleButton\n variant=\"standard\"\n size=\"sm\"\n onClick={onAttach}\n aria-label=\"Add attachments\"\n title=\"Attach file\"\n >\n <Icon name=\"add\" size={20} />\n </CircleButton>\n )}\n\n {onScreenCapture && (\n <CircleButton\n variant=\"standard\"\n size=\"sm\"\n onClick={onScreenCapture}\n aria-label=\"Capture screen\"\n title=\"Share or capture screen\"\n >\n <Icon name=\"screenshot\" size={20} />\n </CircleButton>\n )}\n\n {onGoogleLens && (\n <CircleButton\n variant=\"standard\"\n size=\"sm\"\n onClick={onGoogleLens}\n aria-label=\"Google Lens\"\n title=\"Search with Google Lens\"\n className=\"hover:text-primary\"\n >\n <Icon name=\"center_focus_strong\" size={20} />\n </CircleButton>\n )}\n\n {/* Global Shortcut Pill: Alt + Space */}\n <div\n aria-hidden=\"true\"\n className=\"ml-1 hidden select-none items-center rounded-full bg-surface-container px-2.5 py-1 text-label-small font-medium text-on-surface-variant sm:flex\"\n >\n Alt + Space\n </div>\n\n {/* User avatar if provided */}\n {avatar && <div className=\"ml-1 shrink-0\">{avatar}</div>}\n </div>\n </search>\n );\n}\n",
16
19
  "// SPDX-License-Identifier: Apache-2.0\n// Benchmark: assets/ui/gemini-account-menu.png & gemini-composer-more-uploads.png\n// Anchored account menu and composer actions menu matching Google Gemini Web UI\n\n\"use client\";\n\nimport { Icon, Popover } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport type { ReactNode } from \"react\";\n\nexport interface MenuItem {\n id: string;\n label: string;\n icon?: string;\n shortcut?: string;\n onClick?: () => void;\n destructive?: boolean;\n dividerAfter?: boolean;\n}\n\nexport interface GeminiAccountMenuProps {\n /** User name */\n name: string;\n /** User email */\n email: string;\n /** Avatar image URL or fallback initials */\n avatar?: ReactNode;\n /** Menu open state */\n open: boolean;\n /** Menu open state change */\n onOpenChange: (open: boolean) => void;\n /** Menu items */\n items?: MenuItem[];\n /** Trigger element */\n children: ReactNode;\n /** Additional container class */\n className?: string;\n}\n\nconst EMPTY_MENU_ITEMS: MenuItem[] = [];\n\n/**\n * Gemini Sidebar Footer Account Menu.\n * Benchmark parity: `assets/ui/gemini-account-menu.png` (manifest item 2).\n * Anchored to the sidebar footer avatar/profile card, displaying Google account\n * details and navigation links with M3 typography, icons, and keyboard-reachable rows.\n */\nexport function GeminiAccountMenu({\n name,\n email,\n avatar,\n open,\n onOpenChange,\n items = EMPTY_MENU_ITEMS,\n children,\n className,\n}: GeminiAccountMenuProps) {\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange}>\n <Popover.Trigger asChild>{children}</Popover.Trigger>\n <Popover.Content\n align=\"start\"\n side=\"top\"\n sideOffset={8}\n className={clsx(\n \"gemini-account-menu w-[300px] overflow-hidden rounded-[var(--gemini-corner-card,16px)]\",\n \"border border-outline-variant/40 bg-surface-container p-2 text-on-surface shadow-md3-3\",\n className,\n )}\n >\n {/* User Card Header */}\n <div className=\"flex items-center gap-3 rounded-small bg-surface-container-high p-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary-container text-title-medium text-on-primary-container\">\n {avatar ?? name.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-body-medium font-medium text-on-surface\">{name}</div>\n <div className=\"truncate text-body-small text-on-surface-variant\">{email}</div>\n </div>\n </div>\n\n {/* Action Items List */}\n <div className=\"mt-2 space-y-0.5\" role=\"menu\">\n {items.map((item) => (\n <div key={item.id}>\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={() => {\n item.onClick?.();\n onOpenChange(false);\n }}\n className={clsx(\n \"flex w-full items-center justify-between rounded-small px-3 py-2 text-body-medium transition-colors\",\n \"hover:bg-on-surface/8 active:bg-on-surface/12\",\n item.destructive\n ? \"text-error hover:bg-error/8\"\n : \"text-on-surface hover:text-on-surface\",\n )}\n >\n <div className=\"flex items-center gap-3\">\n {item.icon && (\n <Icon\n name={item.icon}\n size={20}\n className={item.destructive ? \"text-error\" : \"text-on-surface-variant\"}\n />\n )}\n <span>{item.label}</span>\n </div>\n {item.shortcut && (\n <span className=\"text-label-small text-on-surface-variant\">{item.shortcut}</span>\n )}\n </button>\n {item.dividerAfter && <div className=\"my-1 border-t border-outline-variant/30\" />}\n </div>\n ))}\n </div>\n </Popover.Content>\n </Popover.Root>\n );\n}\n\nexport interface ComposerMoreUploadsMenuProps {\n /** Menu open state */\n open: boolean;\n /** Menu open state change */\n onOpenChange: (open: boolean) => void;\n /** Items in upload/add menu */\n items: MenuItem[];\n /** Submenu items (e.g., More uploads / Google Drive / Workspace) */\n submenuItems?: MenuItem[];\n /** Trigger element */\n children: ReactNode;\n}\n\n/**\n * Composer Add & More Uploads Menu.\n * Benchmark parity: `assets/ui/gemini-composer-more-uploads.png` (manifest item 3).\n * Anchored to the '+' trigger of the composer, grouping related upload actions\n * with an optional adjacent secondary submenu.\n */\nexport function ComposerMoreUploadsMenu({\n open,\n onOpenChange,\n items,\n submenuItems,\n children,\n}: ComposerMoreUploadsMenuProps) {\n return (\n <Popover.Root open={open} onOpenChange={onOpenChange}>\n <Popover.Trigger asChild>{children}</Popover.Trigger>\n <Popover.Content\n align=\"start\"\n side=\"top\"\n sideOffset={10}\n className=\"gemini-composer-uploads-menu flex gap-2 rounded-[var(--gemini-corner-card,16px)] border border-outline-variant/30 bg-surface-container p-1.5 shadow-md3-3\"\n >\n {/* Primary Menu */}\n <div className=\"w-[220px] space-y-0.5\" role=\"menu\">\n {items.map((item) => (\n <div key={item.id}>\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={() => {\n item.onClick?.();\n onOpenChange(false);\n }}\n className=\"flex w-full items-center gap-3 rounded-small px-3 py-2 text-body-medium text-on-surface transition-colors hover:bg-on-surface/8\"\n >\n {item.icon && (\n <Icon name={item.icon} size={20} className=\"text-on-surface-variant\" />\n )}\n <span className=\"flex-1 text-left\">{item.label}</span>\n </button>\n {item.dividerAfter && <div className=\"my-1 border-t border-outline-variant/30\" />}\n </div>\n ))}\n </div>\n\n {/* Secondary Submenu if provided */}\n {submenuItems && submenuItems.length > 0 && (\n <div\n className=\"w-[200px] border-l border-outline-variant/20 pl-2 space-y-0.5\"\n role=\"menu\"\n aria-label=\"More uploads\"\n >\n <div className=\"px-2 py-1 text-label-small font-medium text-on-surface-variant uppercase tracking-wider\">\n Cloud & Storage\n </div>\n {submenuItems.map((sub) => (\n <button\n key={sub.id}\n type=\"button\"\n role=\"menuitem\"\n onClick={() => {\n sub.onClick?.();\n onOpenChange(false);\n }}\n className=\"flex w-full items-center gap-3 rounded-small px-3 py-2 text-body-medium text-on-surface transition-colors hover:bg-on-surface/8\"\n >\n {sub.icon && <Icon name={sub.icon} size={20} className=\"text-primary\" />}\n <span className=\"flex-1 text-left\">{sub.label}</span>\n </button>\n ))}\n </div>\n )}\n </Popover.Content>\n </Popover.Root>\n );\n}\n",
17
20
  "// SPDX-License-Identifier: Apache-2.0\n// Benchmark: assets/ui/gemini-personal-context-edit.png\n// Focused multiline context editor dialog for user preferences and saved agent memory\n\n\"use client\";\n\nimport { Button, DialogClose, DialogContent, DialogRoot, Icon } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { useState } from \"react\";\n\nexport interface GeminiPersonalContextEditProps {\n /** Controls open state of the dialog */\n open: boolean;\n /** Open state change callback */\n onOpenChange: (open: boolean) => void;\n /** Current context text */\n initialContext?: string;\n /** Title of the dialog */\n title?: string;\n /** Subtitle/description of context rules */\n description?: string;\n /** Save callback */\n onSave: (context: string) => void | Promise<void>;\n /** Clear/delete context callback */\n onClear?: () => void;\n /** Additional container classes */\n className?: string;\n}\n\n/**\n * Gemini Personal Context & User Memory Editor Dialog.\n * Benchmark parity: `assets/ui/gemini-personal-context-edit.png` (manifest item 4).\n * Features:\n * - Centered dialog over translucent backdrop blur.\n * - Focused multiline context editor with visible focus outline.\n * - Save button is disabled when context is empty or unchanged.\n * - Contextual instructions for how agent uses personal context.\n */\nexport function GeminiPersonalContextEdit({\n open,\n onOpenChange,\n initialContext = \"\",\n title = \"Your personal context\",\n description = \"Help Gemini understand your preferences, interests, and how you want it to respond. This information is saved and applied across your conversations.\",\n onSave,\n onClear,\n className,\n}: GeminiPersonalContextEditProps) {\n const [context, setContext] = useState(initialContext);\n const [isSaving, setIsSaving] = useState(false);\n\n const [previousInputs, setPreviousInputs] = useState({ initialContext, open });\n // Reset the draft before committing a changed source or open state, while preserving the editor node and focus.\n if (previousInputs.initialContext !== initialContext || previousInputs.open !== open) {\n setPreviousInputs({ initialContext, open });\n setContext(initialContext);\n }\n\n const hasChanged = context.trim() !== initialContext.trim();\n const canSave = context.trim().length > 0 && hasChanged && !isSaving;\n\n const handleSave = async () => {\n if (!canSave) return;\n setIsSaving(true);\n try {\n await onSave(context.trim());\n onOpenChange(false);\n } finally {\n setIsSaving(false);\n }\n };\n\n return (\n <DialogRoot open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className={clsx(\n \"gemini-context-edit-dialog w-full max-w-[620px] rounded-[var(--gemini-corner-card,16px)]\",\n \"border border-outline-variant/30 bg-surface p-6 text-on-surface shadow-md3-3\",\n className,\n )}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"space-y-1\">\n <h2 className=\"text-headline-small font-normal text-on-surface flex items-center gap-2\">\n <Icon name=\"psychology\" size={24} className=\"text-primary\" />\n {title}\n </h2>\n <p className=\"text-body-medium text-on-surface-variant leading-relaxed\">\n {description}\n </p>\n </div>\n <DialogClose asChild>\n <button\n type=\"button\"\n className=\"rounded-full p-1.5 text-on-surface-variant hover:bg-on-surface/8 transition-colors\"\n aria-label=\"Close\"\n >\n <Icon name=\"close\" size={20} />\n </button>\n </DialogClose>\n </div>\n\n {/* Text Area Input */}\n <div className=\"mt-5 space-y-2\">\n <div className=\"relative rounded-medium border-2 border-primary/60 bg-surface-container-low transition-all focus-within:border-primary focus-within:ring-2 focus-within:ring-primary/20\">\n <textarea\n value={context}\n onChange={(e) => setContext(e.target.value)}\n placeholder=\"e.g. Always respond in concise bullet points, write modern TypeScript with Bun, favor pure functions...\"\n rows={6}\n aria-label=\"Personal context content\"\n className=\"block w-full resize-y border-0 bg-transparent p-3.5 text-body-medium text-on-surface caret-primary outline-none placeholder:text-on-surface-variant/60\"\n />\n </div>\n <div className=\"flex justify-between px-1 text-label-small text-on-surface-variant\">\n <span>{context.length} characters</span>\n {initialContext.length > 0 && onClear && (\n <button\n type=\"button\"\n onClick={() => {\n setContext(\"\");\n onClear();\n }}\n className=\"text-error hover:underline transition-all\"\n >\n Clear saved context\n </button>\n )}\n </div>\n </div>\n\n {/* Footer Actions */}\n <div className=\"mt-6 flex items-center justify-end gap-3\">\n <DialogClose asChild>\n <Button variant=\"text\" disabled={isSaving}>\n Cancel\n </Button>\n </DialogClose>\n <Button variant=\"filled\" onClick={handleSave} disabled={!canSave} className=\"px-6\">\n {isSaving ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\n </DialogContent>\n </DialogRoot>\n );\n}\n",
18
21
  "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/TaskStatusIcon.tsx), MIT, rebuilt on Material Design 3.\n\nimport { Icon } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\n\nimport type { TaskStatus } from \"./types\";\nimport { TASK_STATUS_LABEL } from \"./types\";\n\n/** Material Symbols glyph and M3 color role per status. */\nconst config: Record<TaskStatus, { icon: string; filled: boolean; color: string }> = {\n done: { icon: \"check_circle\", filled: true, color: \"text-success\" },\n in_progress: { icon: \"clock_loader_40\", filled: true, color: \"text-primary\" },\n ready: { icon: \"radio_button_checked\", filled: false, color: \"text-primary\" },\n pending_approval: { icon: \"schedule\", filled: false, color: \"text-warning\" },\n backlog: { icon: \"radio_button_unchecked\", filled: false, color: \"text-outline\" },\n};\n\nexport interface TaskStatusIconProps {\n status: TaskStatus;\n size?: number;\n className?: string;\n /** Accessible label; defaults to the status label. Pass `\"\"` for a decorative icon. */\n label?: string;\n}\n\nexport function TaskStatusIcon({ status, size = 16, className, label }: TaskStatusIconProps) {\n const { icon, filled, color } = config[status];\n return (\n <Icon\n name={icon}\n size={size}\n filled={filled}\n label={label ?? TASK_STATUS_LABEL[status]}\n data-status={status}\n className={clsx(color, className)}\n />\n );\n}\n",
19
22
  "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/TaskPriorityIcon.tsx), MIT, rebuilt on Material Design 3.\n\nimport { Icon } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\n\nimport type { TaskPriority } from \"./types\";\nimport { TASK_PRIORITY_LABEL } from \"./types\";\n\n/** Material Symbols glyph and M3 color role per priority. */\nconst config: Record<TaskPriority, { icon: string; filled: boolean; color: string }> = {\n critical: { icon: \"priority_high\", filled: true, color: \"text-error\" },\n high: { icon: \"keyboard_double_arrow_up\", filled: false, color: \"text-warning\" },\n medium: { icon: \"drag_handle\", filled: false, color: \"text-primary\" },\n low: { icon: \"keyboard_arrow_down\", filled: false, color: \"text-outline\" },\n};\n\nexport interface TaskPriorityIconProps {\n priority: TaskPriority;\n size?: number;\n className?: string;\n /** Accessible label; defaults to the priority label. Pass `\"\"` for a decorative icon. */\n label?: string;\n}\n\nexport function TaskPriorityIcon({ priority, size = 14, className, label }: TaskPriorityIconProps) {\n const { icon, filled, color } = config[priority];\n return (\n <Icon\n name={icon}\n size={size}\n filled={filled}\n weight={600}\n label={label ?? `${TASK_PRIORITY_LABEL[priority]} priority`}\n data-priority={priority}\n className={clsx(color, className)}\n />\n );\n}\n",
20
- "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/TaskRow.tsx), MIT, rebuilt on Material Design 3.\n\nimport { DropdownMenu, Icon } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\n\nimport { focusRing } from \"./internal\";\nimport { TaskPriorityIcon } from \"./TaskPriorityIcon\";\nimport { TaskStatusIcon } from \"./TaskStatusIcon\";\nimport type { Task, TaskStatus } from \"./types\";\nimport { TASK_STATUS_LABEL, TASK_STATUS_ORDER } from \"./types\";\n\nexport interface TaskRowProps {\n task: Task;\n onClick?: (task: Task) => void;\n isActive?: boolean;\n resolveAgentName?: (agentId: string) => string;\n onStatusChange?: (task: Task, status: TaskStatus) => void;\n onDelete?: (task: Task) => void;\n className?: string;\n}\n\n/** Column template shared with the {@link TaskList} header. */\nexport const TASK_ROW_GRID = \"20px 18px 72px 1fr 56px 96px 40px\";\n\n/** M3 list item height at desktop density (56 dp baseline, two density steps). */\nexport const TASK_ROW_HEIGHT = 48;\n\n/**\n * A task as a dense M3 list item: leading status and priority icons, `text-body-large` headline,\n * `text-body-small` supporting columns, `on-surface` 8 % hover, `secondary-container` selection\n * and a trailing overflow-menu icon button.\n */\nexport function TaskRow({\n task,\n onClick,\n isActive,\n resolveAgentName,\n onStatusChange,\n onDelete,\n className,\n}: TaskRowProps) {\n const completedSubtasks = task.subtasks.filter((s) => s.completed).length;\n const assigneeName = resolveAgentName?.(task.assigned_agent_id) ?? task.assigned_agent_id;\n const hasActions = onStatusChange || onDelete;\n const isRowInteractive = typeof onClick === \"function\";\n\n const rowClassName = clsx(\n \"task-row group grid w-full items-center border-b border-outline-variant text-left\",\n \"transition-colors duration-200 ease-standard\",\n isActive\n ? \"bg-secondary-container text-on-secondary-container\"\n : \"bg-transparent text-on-surface hover:bg-on-surface/8\",\n isRowInteractive && !isActive && \"active:bg-on-surface/10\",\n className,\n );\n const rowStyle: React.CSSProperties = {\n gridTemplateColumns: TASK_ROW_GRID,\n minHeight: TASK_ROW_HEIGHT,\n paddingLeft: 16,\n paddingRight: 8,\n gap: 12,\n };\n\n const mainContent = (\n <>\n <TaskStatusIcon status={task.status} size={20} />\n <TaskPriorityIcon priority={task.priority} size={18} />\n\n <span\n className={clsx(\n \"truncate font-code text-body-small\",\n isActive ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n SPC-{task.task_number}\n </span>\n\n <span className=\"min-w-0 truncate text-body-large\">{task.title}</span>\n\n <span\n className={clsx(\n \"text-right text-body-small\",\n isActive ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n {task.subtasks.length > 0 ? `${completedSubtasks}/${task.subtasks.length}` : \"\"}\n </span>\n\n <span\n className={clsx(\n \"truncate text-right text-body-small\",\n isActive ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n {assigneeName}\n </span>\n </>\n );\n\n const actions = (\n <span className=\"flex items-center justify-center\">\n {hasActions ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n aria-label=\"Task Actions\"\n className={clsx(\n \"flex size-8 items-center justify-center rounded-full text-on-surface-variant\",\n \"opacity-0 transition-[opacity,background-color] duration-200 ease-standard\",\n \"hover:bg-on-surface/8 active:bg-on-surface/10\",\n \"group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100 data-popup-open:opacity-100\",\n focusRing,\n )}\n >\n <Icon name=\"more_vert\" size={20} />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" sideOffset={4}>\n {onStatusChange &&\n TASK_STATUS_ORDER.filter((s) => s !== task.status).map((s) => (\n <DropdownMenu.Item\n key={s}\n onClick={() => {\n onStatusChange(task, s);\n }}\n >\n <TaskStatusIcon status={s} size={20} label=\"\" />\n <span>{TASK_STATUS_LABEL[s]}</span>\n </DropdownMenu.Item>\n ))}\n {onStatusChange && onDelete && <DropdownMenu.Separator />}\n {onDelete && (\n <DropdownMenu.Item\n onClick={() => {\n onDelete(task);\n }}\n className=\"text-error\"\n >\n <Icon name=\"delete\" size={20} />\n <span>Delete</span>\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n ) : null}\n </span>\n );\n\n if (!isRowInteractive) {\n return (\n <div aria-current={isActive ? \"true\" : undefined} className={rowClassName} style={rowStyle}>\n {mainContent}\n {actions}\n </div>\n );\n }\n\n return (\n <div className={rowClassName} style={rowStyle}>\n <button\n type=\"button\"\n aria-current={isActive ? \"true\" : undefined}\n onClick={() => onClick(task)}\n className={clsx(\n \"col-span-6 grid grid-cols-subgrid items-center border-0 bg-transparent p-0 text-left font-inherit\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n )}\n >\n {mainContent}\n </button>\n {actions}\n </div>\n );\n}\n",
23
+ "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/TaskRow.tsx), MIT, rebuilt on Material Design 3.\n\nimport { DropdownMenu, Icon } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\n\nimport { focusRing } from \"./internal\";\nimport { TaskPriorityIcon } from \"./TaskPriorityIcon\";\nimport { TaskStatusIcon } from \"./TaskStatusIcon\";\nimport type { Task, TaskStatus } from \"./types\";\nimport { TASK_STATUS_LABEL, TASK_STATUS_ORDER } from \"./types\";\n\nexport interface TaskRowProps {\n task: Task;\n onClick?: (task: Task) => void;\n isActive?: boolean;\n resolveAgentName?: (agentId: string) => string;\n onStatusChange?: (task: Task, status: TaskStatus) => void;\n onDelete?: (task: Task) => void;\n className?: string;\n}\n\n/** Column template shared with the {@link TaskList} header. */\nexport const TASK_ROW_GRID = \"20px 18px 72px 1fr 56px 96px 40px\";\n\n/** M3 list item height at desktop density (56 dp baseline, two density steps). */\nexport const TASK_ROW_HEIGHT = 48;\n\n/**\n * A task as a dense M3 list item: leading status and priority icons, `text-body-large` headline,\n * `text-body-small` supporting columns, `on-surface` 8 % hover, `secondary-container` selection\n * and a trailing overflow-menu icon button.\n */\nexport function TaskRow({\n task,\n onClick,\n isActive,\n resolveAgentName,\n onStatusChange,\n onDelete,\n className,\n}: TaskRowProps) {\n const completedSubtasks = task.subtasks.filter((s) => s.completed).length;\n const assigneeName = resolveAgentName?.(task.assigned_agent_id) ?? task.assigned_agent_id;\n const hasActions = onStatusChange || onDelete;\n const isRowInteractive = typeof onClick === \"function\";\n\n const rowClassName = clsx(\n \"task-row group grid w-full items-center border-b border-outline-variant text-left\",\n \"transition-colors duration-200 ease-standard\",\n isActive\n ? \"bg-secondary-container text-on-secondary-container\"\n : \"bg-transparent text-on-surface hover:bg-on-surface/8\",\n isRowInteractive && !isActive && \"active:bg-on-surface/10\",\n className,\n );\n const rowStyle: React.CSSProperties = {\n gridTemplateColumns: TASK_ROW_GRID,\n minHeight: TASK_ROW_HEIGHT,\n paddingLeft: 16,\n paddingRight: 8,\n gap: 12,\n };\n\n const mainContent = (\n <>\n <TaskStatusIcon status={task.status} size={20} />\n <TaskPriorityIcon priority={task.priority} size={18} />\n\n <span\n className={clsx(\n \"truncate font-code text-body-small\",\n isActive ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n SPC-{task.task_number}\n </span>\n\n <span className=\"min-w-0 truncate text-body-large\">{task.title}</span>\n\n <span\n className={clsx(\n \"text-right text-body-small\",\n isActive ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n {task.subtasks.length > 0 ? `${completedSubtasks}/${task.subtasks.length}` : \"\"}\n </span>\n\n <span\n className={clsx(\n \"truncate text-right text-body-small\",\n isActive ? \"text-on-secondary-container\" : \"text-on-surface-variant\",\n )}\n >\n {assigneeName}\n </span>\n </>\n );\n\n const actions = (\n <span className=\"flex items-center justify-center\">\n {hasActions ? (\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type=\"button\"\n aria-label=\"Task Actions\"\n className={clsx(\n \"flex size-8 items-center justify-center rounded-full text-on-surface-variant\",\n \"opacity-0 transition-[opacity,background-color] duration-200 ease-standard\",\n \"hover:bg-on-surface/8 active:bg-on-surface/10\",\n \"group-hover:opacity-100 group-focus-within:opacity-100 focus-visible:opacity-100 data-popup-open:opacity-100\",\n focusRing,\n )}\n >\n <Icon name=\"more_vert\" size={20} />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\" sideOffset={4}>\n {onStatusChange &&\n TASK_STATUS_ORDER.filter((s) => s !== task.status).map((s) => (\n <DropdownMenu.Item\n key={s}\n onClick={() => {\n onStatusChange(task, s);\n }}\n >\n <TaskStatusIcon status={s} size={20} label=\"\" />\n <span>{TASK_STATUS_LABEL[s]}</span>\n </DropdownMenu.Item>\n ))}\n {onStatusChange && onDelete && <DropdownMenu.Separator />}\n {onDelete && (\n <DropdownMenu.Item\n onClick={() => {\n onDelete(task);\n }}\n className=\"text-error\"\n >\n <Icon name=\"delete\" size={20} />\n <span>Delete</span>\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n ) : null}\n </span>\n );\n\n if (!isRowInteractive) {\n return (\n <div aria-current={isActive ? \"true\" : undefined} className={rowClassName} style={rowStyle}>\n {mainContent}\n {actions}\n </div>\n );\n }\n\n return (\n <div className={rowClassName} style={rowStyle}>\n <button\n type=\"button\"\n aria-current={isActive ? \"true\" : undefined}\n onClick={() => onClick(task)}\n className={clsx(\n \"col-span-6 grid grid-cols-subgrid items-center border-0 bg-transparent p-0 text-left font-inherit\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n )}\n >\n {mainContent}\n </button>\n {actions}\n </div>\n );\n}\n",
21
24
  "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/TaskList.tsx), MIT, rebuilt on Material Design 3.\n\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger, Icon } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { useMemo } from \"react\";\n\nimport { focusRing } from \"./internal\";\nimport { TASK_ROW_GRID, TaskRow } from \"./TaskRow\";\nimport { TaskStatusIcon } from \"./TaskStatusIcon\";\nimport type { Task, TaskStatus } from \"./types\";\nimport { TASK_STATUS_LABEL, TASK_STATUS_ORDER } from \"./types\";\n\nexport interface TaskListProps {\n tasks: Task[];\n groups?: TaskStatus[];\n collapsedGroups?: Set<TaskStatus>;\n onToggleGroup?: (status: TaskStatus) => void;\n activeTaskId?: string;\n onTaskClick: (task: Task) => void;\n onStatusChange?: (task: Task, status: TaskStatus) => void;\n onDelete?: (task: Task) => void;\n resolveAgentName?: (agentId: string) => string;\n className?: string;\n}\n\nconst GRID_STYLE = {\n gridTemplateColumns: TASK_ROW_GRID,\n paddingLeft: 16,\n paddingRight: 8,\n gap: 12,\n} as const;\n\n/**\n * Tasks grouped by status as an M3 list: a column header in `text-label-medium`, collapsible\n * section headers in `text-title-small`, `outline-variant` dividers.\n */\nexport function TaskList({\n tasks,\n groups = TASK_STATUS_ORDER,\n collapsedGroups,\n onToggleGroup,\n activeTaskId,\n onTaskClick,\n onStatusChange,\n onDelete,\n resolveAgentName,\n className,\n}: TaskListProps) {\n const grouped = useMemo(() => {\n const map = new Map<TaskStatus, Task[]>();\n for (const status of groups) map.set(status, []);\n for (const task of tasks) {\n const bucket = map.get(task.status);\n if (bucket) bucket.push(task);\n }\n return map;\n }, [tasks, groups]);\n\n return (\n <div className={clsx(\"flex flex-col bg-surface text-on-surface\", className)}>\n {/* Column header */}\n <div\n className=\"grid items-center border-b border-outline-variant text-label-medium text-on-surface-variant\"\n style={{ ...GRID_STYLE, height: 32 }}\n >\n <span />\n <span />\n <span>ID</span>\n <span>Title</span>\n <span className=\"text-right\">Subs</span>\n <span className=\"text-right\">Assignee</span>\n <span />\n </div>\n\n {/* Groups */}\n {groups.map((status) => {\n const items = grouped.get(status) ?? [];\n const isOpen = !collapsedGroups?.has(status);\n\n return (\n <Collapsible key={status} open={isOpen} onOpenChange={() => onToggleGroup?.(status)}>\n <CollapsibleTrigger\n className={clsx(\n \"grid w-full items-center rounded-none border-b border-outline-variant bg-surface-container-low\",\n \"text-title-small text-on-surface transition-colors duration-200 ease-standard\",\n \"hover:bg-on-surface/8 active:bg-on-surface/10\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n )}\n style={{ ...GRID_STYLE, height: 40 }}\n >\n <span className=\"flex items-center justify-center text-on-surface-variant\">\n <Icon\n name=\"chevron_right\"\n size={20}\n className={clsx(\n \"shrink-0 transition-transform duration-300 ease-emphasized\",\n isOpen && \"rotate-90\",\n )}\n />\n </span>\n <span className=\"flex items-center justify-center\">\n <TaskStatusIcon status={status} size={18} label=\"\" />\n </span>\n <span className=\"col-span-5 flex items-center gap-1.5 text-left\">\n {TASK_STATUS_LABEL[status]}\n <span className=\"text-body-small text-on-surface-variant\">({items.length})</span>\n </span>\n </CollapsibleTrigger>\n\n <CollapsibleContent>\n {items.length > 0 ? (\n items.map((task) => (\n <TaskRow\n key={task.id}\n task={task}\n isActive={task.id === activeTaskId}\n onClick={onTaskClick}\n onStatusChange={onStatusChange}\n onDelete={onDelete}\n resolveAgentName={resolveAgentName}\n />\n ))\n ) : (\n <div className=\"border-b border-outline-variant px-4 py-3 text-body-small text-on-surface-variant\">\n No tasks\n </div>\n )}\n </CollapsibleContent>\n </Collapsible>\n );\n })}\n </div>\n );\n}\n",
22
25
  "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/TaskDetail.tsx), MIT, rebuilt on Material Design 3.\n\nimport { Button, CircleButton, Icon, Select, SelectOption } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\n\nimport { focusRing } from \"./internal\";\nimport { Markdown } from \"./Markdown\";\nimport { TaskPriorityIcon } from \"./TaskPriorityIcon\";\nimport { TaskStatusIcon } from \"./TaskStatusIcon\";\nimport type { Task, TaskStatus } from \"./types\";\nimport { TASK_PRIORITY_LABEL, TASK_STATUS_LABEL, TASK_STATUS_ORDER } from \"./types\";\n\nexport interface TaskDetailProps {\n task: Task;\n resolveAgentName?: (agentId: string) => string;\n onStatusChange?: (task: Task, status: TaskStatus) => void;\n onSubtaskToggle?: (task: Task, index: number, completed: boolean) => void;\n onDelete?: (task: Task) => void;\n onClose?: () => void;\n className?: string;\n}\n\nfunction formatDate(iso: string) {\n return new Date(iso).toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction Property({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-label-medium text-on-surface-variant\">{label}</span>\n <span className=\"flex min-h-8 items-center gap-1.5 text-body-medium text-on-surface\">\n {children}\n </span>\n </div>\n );\n}\n\n/**\n * A task on an M3 surface: `text-headline-small` title, a property grid, subtasks as an M3 list\n * with checkboxes, markdown description, and actions as M3 buttons (filled for the primary\n * transition, text for the others).\n */\nexport function TaskDetail({\n task,\n resolveAgentName,\n onStatusChange,\n onSubtaskToggle,\n onDelete,\n onClose,\n className,\n}: TaskDetailProps) {\n const ownerName = resolveAgentName?.(task.owner_agent_id) ?? task.owner_agent_id;\n const assigneeName = resolveAgentName?.(task.assigned_agent_id) ?? task.assigned_agent_id;\n const completedCount = task.subtasks.filter((s) => s.completed).length;\n\n return (\n <div className={clsx(\"flex flex-col gap-6 bg-surface p-6 text-on-surface\", className)}>\n {/* Header */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-1 items-center gap-2\">\n <TaskStatusIcon status={task.status} size={20} />\n <TaskPriorityIcon priority={task.priority} size={18} />\n <span className=\"font-code text-body-small text-on-surface-variant\">\n SPC-{task.task_number}\n </span>\n </div>\n {onClose && (\n <CircleButton icon=\"close\" variant=\"standard\" onClick={onClose} aria-label=\"Close\" />\n )}\n </div>\n <h2 className=\"text-headline-small text-on-surface\">{task.title}</h2>\n </div>\n\n {/* Properties */}\n <div className=\"grid grid-cols-2 gap-x-6 gap-y-4 medium:grid-cols-4\">\n <Property label=\"Status\">\n {onStatusChange ? (\n <Select\n value={task.status}\n size=\"md\"\n onChange={(value) => onStatusChange(task, value as TaskStatus)}\n >\n {TASK_STATUS_ORDER.map((s) => (\n <SelectOption key={s} value={s}>\n {TASK_STATUS_LABEL[s]}\n </SelectOption>\n ))}\n </Select>\n ) : (\n TASK_STATUS_LABEL[task.status]\n )}\n </Property>\n <Property label=\"Priority\">\n <TaskPriorityIcon priority={task.priority} size={18} label=\"\" />\n {TASK_PRIORITY_LABEL[task.priority]}\n </Property>\n <Property label=\"Owner\">\n <span className=\"truncate\">{ownerName}</span>\n </Property>\n <Property label=\"Assigned\">\n <span className=\"truncate\">{assigneeName}</span>\n </Property>\n </div>\n\n {/* Subtasks */}\n {task.subtasks.length > 0 && (\n <section className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-title-small text-on-surface\">Subtasks</h3>\n <span className=\"text-body-small text-on-surface-variant\">\n {completedCount}/{task.subtasks.length}\n </span>\n </div>\n <ul className=\"m-0 list-none overflow-hidden rounded-medium border border-outline-variant p-0\">\n {task.subtasks.map((subtask, i) => (\n <li key={subtask.title}>\n <button\n type=\"button\"\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 list item with a leading checkbox: the whole 48 dp row toggles and carries the state layer; a native checkbox input cannot host the row.\n role=\"checkbox\"\n aria-checked={subtask.completed}\n onClick={() => onSubtaskToggle?.(task, i, !subtask.completed)}\n className={clsx(\n \"flex min-h-12 w-full items-center gap-4 px-4 py-2 text-left text-body-large\",\n \"transition-colors duration-200 ease-standard hover:bg-on-surface/8 active:bg-on-surface/10\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n i > 0 && \"border-t border-outline-variant\",\n )}\n >\n <span\n className={clsx(\n \"flex size-[18px] shrink-0 items-center justify-center rounded-[2px] transition-colors duration-200 ease-standard\",\n subtask.completed\n ? \"bg-primary text-on-primary\"\n : \"border-2 border-on-surface-variant\",\n )}\n >\n {subtask.completed && <Icon name=\"check\" size={16} weight={700} />}\n </span>\n <span\n className={clsx(\n \"min-w-0 flex-1\",\n subtask.completed\n ? \"text-on-surface-variant line-through\"\n : \"text-on-surface\",\n )}\n >\n {subtask.title}\n </span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n )}\n\n {/* Description */}\n <section className=\"flex flex-col gap-2\">\n <h3 className=\"text-title-small text-on-surface\">Description</h3>\n {task.description ? (\n <Markdown content={task.description} size=\"medium\" />\n ) : (\n <p className=\"text-body-medium text-on-surface-variant\">No description</p>\n )}\n </section>\n\n {/* Timestamps */}\n <div className=\"flex flex-col gap-1 text-body-small text-on-surface-variant\">\n <span>Created {formatDate(task.created_at)}</span>\n <span>Updated {formatDate(task.updated_at)}</span>\n {task.completed_at && <span>Completed {formatDate(task.completed_at)}</span>}\n </div>\n\n {/* Actions */}\n {(onStatusChange || onDelete) && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {onStatusChange && task.status === \"pending_approval\" && (\n <Button variant=\"filled\" size=\"lg\" onClick={() => onStatusChange(task, \"ready\")}>\n Approve\n </Button>\n )}\n {onStatusChange && task.status === \"backlog\" && (\n <Button variant=\"filled\" size=\"lg\" onClick={() => onStatusChange(task, \"in_progress\")}>\n Execute\n </Button>\n )}\n {onStatusChange && (task.status === \"in_progress\" || task.status === \"ready\") && (\n <Button variant=\"filled\" size=\"lg\" onClick={() => onStatusChange(task, \"done\")}>\n Mark Done\n </Button>\n )}\n {onStatusChange && task.status === \"done\" && (\n <Button variant=\"text\" size=\"lg\" onClick={() => onStatusChange(task, \"ready\")}>\n Reopen\n </Button>\n )}\n {onDelete && (\n <button\n type=\"button\"\n onClick={() => onDelete(task)}\n className={clsx(\n \"inline-flex h-10 items-center justify-center gap-2 rounded-full px-3 text-label-large text-error\",\n \"transition-colors duration-200 ease-standard hover:bg-error/8 active:bg-error/10\",\n focusRing,\n )}\n >\n <Icon name=\"delete\" size={18} />\n Delete\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n",
23
26
  "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/TaskCreateForm.tsx), MIT, rebuilt on Material Design 3.\n\nimport { Button, Input, Select, SelectOption, TextArea } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { useCallback, useEffect, useId, useRef, useState } from \"react\";\n\nimport type { TaskPriority } from \"./types\";\nimport { TASK_PRIORITY_LABEL } from \"./types\";\n\nexport interface TaskCreateFormData {\n title: string;\n description: string;\n priority: TaskPriority;\n}\n\nexport interface TaskCreateFormProps {\n onSubmit: (data: TaskCreateFormData) => void;\n onCancel?: () => void;\n defaultPriority?: TaskPriority;\n isSubmitting?: boolean;\n className?: string;\n}\n\nconst PRIORITIES: TaskPriority[] = [\"critical\", \"high\", \"medium\", \"low\"];\n\n/**\n * Inline task creation on an M3 surface: title and description text fields, a priority select,\n * and M3 actions (filled `Create`, text `Cancel`).\n */\nexport function TaskCreateForm({\n onSubmit,\n onCancel,\n defaultPriority = \"medium\",\n isSubmitting,\n className,\n}: TaskCreateFormProps) {\n const [title, setTitle] = useState(\"\");\n const [description, setDescription] = useState(\"\");\n const [priority, setPriority] = useState<TaskPriority>(defaultPriority);\n const titleInputId = useId();\n const descriptionInputId = useId();\n const titleInputRef = useRef<HTMLInputElement>(null);\n\n // Focus the title when the form mounts (replaces `autoFocus`).\n useEffect(() => {\n titleInputRef.current?.focus();\n }, []);\n\n const canSubmit = title.trim().length > 0 && !isSubmitting;\n\n const handleSubmit = useCallback(() => {\n if (!canSubmit) return;\n onSubmit({ title: title.trim(), description: description.trim(), priority });\n setTitle(\"\");\n setDescription(\"\");\n setPriority(defaultPriority);\n }, [canSubmit, onSubmit, title, description, priority, defaultPriority]);\n\n return (\n <div\n className={clsx(\n \"flex flex-col gap-3 rounded-medium bg-surface-container-low p-4 text-on-surface\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <label htmlFor={titleInputId} className=\"sr-only\">\n Task Title\n </label>\n <Input\n ref={titleInputRef}\n id={titleInputId}\n type=\"text\"\n size=\"lg\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleSubmit();\n if (e.key === \"Escape\") onCancel?.();\n }}\n placeholder=\"Task title...\"\n className=\"min-w-0 flex-1\"\n disabled={isSubmitting}\n />\n <Select\n value={priority}\n size=\"lg\"\n onChange={(value) => setPriority(value as TaskPriority)}\n disabled={isSubmitting}\n >\n {PRIORITIES.map((p) => (\n <SelectOption key={p} value={p}>\n {TASK_PRIORITY_LABEL[p]}\n </SelectOption>\n ))}\n </Select>\n </div>\n <label htmlFor={descriptionInputId} className=\"sr-only\">\n Description\n </label>\n <TextArea\n id={descriptionInputId}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Description (optional)\"\n rows={2}\n className=\"w-full resize-none\"\n disabled={isSubmitting}\n />\n <div className=\"flex items-center justify-end gap-2\">\n {onCancel && (\n <Button variant=\"text\" size=\"lg\" onClick={onCancel} disabled={isSubmitting}>\n Cancel\n </Button>\n )}\n <Button variant=\"filled\" size=\"lg\" disabled={!canSubmit} onClick={handleSubmit}>\n Create\n </Button>\n </div>\n </div>\n );\n}\n",
24
- "// SPDX-License-Identifier: Apache-2.0 AND MIT\n// Derived from SpaceUI (packages/aphrody-spaceui/packages/ai/src/index.ts), MIT, rebuilt on Material Design 3.\n// @aphrody/m3-ai - AI agent interaction components on Material Design 3\n\n// Types\nexport type {\n ToolCallStatus,\n ToolCallPair,\n ActionContent,\n TranscriptStep,\n TranscriptItem,\n TaskInfo,\n MemoryInfo,\n CronJobInfo,\n AgentInfo,\n ModelOption,\n TaskStatus,\n TaskPriority,\n Subtask,\n Task,\n} from \"./types\";\n\nexport {\n pairTranscriptSteps,\n tryParseJson,\n isErrorResult,\n TASK_STATUS_ORDER,\n TASK_STATUS_LABEL,\n TASK_PRIORITY_LABEL,\n} from \"./types\";\n\n// Components\nexport { ToolCall } from \"./ToolCall\";\nexport type { ToolCallProps } from \"./ToolCall\";\nexport { Markdown, CodeBlock, InlineMath, BlockMath } from \"./Markdown\";\nexport type {\n MarkdownProps,\n CodeBlockProps,\n InlineMathProps,\n BlockMathProps,\n} from \"./Markdown\";\nexport { MessageBubble } from \"./MessageBubble\";\nexport type { MessageBubbleProps } from \"./MessageBubble\";\nexport { InlineWorkerCard } from \"./InlineWorkerCard\";\nexport type { InlineWorkerCardProps } from \"./InlineWorkerCard\";\nexport { InlineBranchCard } from \"./InlineBranchCard\";\nexport type { InlineBranchCardProps } from \"./InlineBranchCard\";\nexport { ModelSelector, ModelOptionList, groupModelsByProvider } from \"./ModelSelector\";\nexport type { ModelSelectorProps, ModelOptionListProps } from \"./ModelSelector\";\nexport { ChatComposer } from \"./ChatComposer\";\nexport type { ChatComposerProps } from \"./ChatComposer\";\n\n// Google & Gemini Desktop / Web benchmark components\nexport { GoogleSpotlightBar } from \"./GoogleSpotlightBar\";\nexport type { GoogleSpotlightBarProps } from \"./GoogleSpotlightBar\";\nexport {\n GeminiAccountMenu,\n ComposerMoreUploadsMenu,\n} from \"./GeminiAccountMenu\";\nexport type {\n GeminiAccountMenuProps,\n ComposerMoreUploadsMenuProps,\n MenuItem,\n} from \"./GeminiAccountMenu\";\nexport { GeminiPersonalContextEdit } from \"./GeminiPersonalContextEdit\";\nexport type { GeminiPersonalContextEditProps } from \"./GeminiPersonalContextEdit\";\n\n\n// Task components\nexport { TaskStatusIcon } from \"./TaskStatusIcon\";\nexport type { TaskStatusIconProps } from \"./TaskStatusIcon\";\nexport { TaskPriorityIcon } from \"./TaskPriorityIcon\";\nexport type { TaskPriorityIconProps } from \"./TaskPriorityIcon\";\nexport { TaskRow } from \"./TaskRow\";\nexport type { TaskRowProps } from \"./TaskRow\";\nexport { TaskList } from \"./TaskList\";\nexport type { TaskListProps } from \"./TaskList\";\nexport { TaskDetail } from \"./TaskDetail\";\nexport type { TaskDetailProps } from \"./TaskDetail\";\nexport { TaskCreateForm } from \"./TaskCreateForm\";\nexport type { TaskCreateFormProps, TaskCreateFormData } from \"./TaskCreateForm\";\n\n// AG-UI Protocol & Agent-to-User (A2U) Bridge\nexport { EventType } from \"@aphrody/ag-ui\";\nexport {\n AgUiEventAccumulator,\n agUiEventsToTranscriptSteps,\n agUiEventsToTranscriptItems,\n coordEnvelopeToAgUiEvent,\n agUiEventToCoordEnvelope,\n} from \"./AgUiEventStream\";\nexport type {\n CoordEnvelope,\n EnvelopeKind,\n SubagentTrace,\n AgUiStreamState,\n} from \"./AgUiEventStream\";\n\n// Aphrody A2A (Agent-to-Agent) Fleet UI\nexport { A2APeerInspector } from \"./A2APeerInspector\";\nexport type { A2APeerInspectorProps, AgentPeer, SendEnvelopePayload } from \"./A2APeerInspector\";\nexport { A2ATaskTimeline } from \"./A2ATaskTimeline\";\nexport type { A2ATaskTimelineProps, TimelineStep } from \"./A2ATaskTimeline\";\n\n// MCP-UI Generative Card\nexport { McpAppCard } from \"./McpAppCard\";\nexport type { McpAppCardProps } from \"./McpAppCard\";\n",
25
- "// SPDX-License-Identifier: Apache-2.0\n/**\n * @aphrody/m3-ai - AgUiEventStream\n *\n * Full-duplex Agent-to-User (A2U) streaming and A2A fleet bridge:\n * - Maps AG-UI v1.0 protocol events (text chunks, tool calls, reasoning, state, subagents)\n * into native Material Design 3 TranscriptSteps and TranscriptItems.\n * - Bridges Aphrody A2A CoordEnvelope fleet messages (ask/fact/ack/ping/error) to and from AG-UI events.\n * - Provides reactive state accumulator and streaming parser.\n */\n\nimport {\n EventType,\n type BaseEvent,\n type TextMessageContentEvent,\n type ToolCallStartEvent,\n type ToolCallArgsEvent,\n type ToolCallResultEvent,\n type ReasoningMessageContentEvent,\n type SubagentStartedEvent,\n type SubagentFinishedEvent,\n type SubagentErrorEvent,\n type RunErrorEvent,\n} from \"@aphrody/ag-ui\";\nimport {\n type TranscriptStep,\n type TranscriptItem,\n pairTranscriptSteps,\n tryParseJson,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// A2A Coordination Fleet Types\n// ---------------------------------------------------------------------------\n\nexport type EnvelopeKind = \"ask\" | \"fact\" | \"ack\" | \"ping\" | \"error\";\n\nexport interface CoordEnvelope {\n v?: number;\n ts: string;\n id: string;\n from: string;\n to?: string;\n kind: EnvelopeKind | string;\n topic: string;\n body: string;\n re?: string;\n channel_hint?: string[];\n [key: string]: unknown;\n}\n\nexport interface SubagentTrace {\n id: string;\n name: string;\n status: \"running\" | \"completed\" | \"error\";\n parentRunId?: string;\n error?: string;\n}\n\nexport interface AgUiStreamState {\n status: \"idle\" | \"streaming\" | \"completed\" | \"error\";\n items: TranscriptItem[];\n steps: TranscriptStep[];\n reasoning: string;\n currentText: string;\n error?: string;\n subagents: SubagentTrace[];\n a2uiSurfaces: Map<string, Record<string, unknown>>;\n}\n\n// ---------------------------------------------------------------------------\n// AG-UI Events -> Transcript Steps Mapper\n// ---------------------------------------------------------------------------\n\nexport class AgUiEventAccumulator {\n private steps: TranscriptStep[] = [];\n private activeText: string = \"\";\n private activeReasoning: string = \"\";\n private pendingToolCalls = new Map<string, { name: string; args: string }>();\n private toolCallNames = new Map<string, string>();\n private subagents = new Map<string, SubagentTrace>();\n private a2uiSurfaces = new Map<string, Record<string, unknown>>();\n private isFinished = false;\n private hasError = false;\n private errorMessage?: string;\n\n /**\n * Process a single AG-UI event and update accumulator state.\n */\n public push(event: BaseEvent): void {\n switch (event.type) {\n case EventType.RUN_STARTED: {\n this.isFinished = false;\n this.hasError = false;\n break;\n }\n\n case EventType.TEXT_MESSAGE_CONTENT: {\n const textEvent = event as TextMessageContentEvent;\n if (textEvent.delta) {\n this.activeText += textEvent.delta;\n }\n break;\n }\n\n case EventType.TEXT_MESSAGE_END: {\n if (this.activeText.length > 0) {\n this.steps.push({\n type: \"action\",\n content: [{ type: \"text\", text: this.activeText }],\n });\n this.activeText = \"\";\n }\n break;\n }\n\n case EventType.REASONING_MESSAGE_CONTENT: {\n const reasoningEvent = event as ReasoningMessageContentEvent;\n if (reasoningEvent.delta) {\n this.activeReasoning += reasoningEvent.delta;\n }\n break;\n }\n\n case EventType.TOOL_CALL_START: {\n const tcStart = event as ToolCallStartEvent;\n this.pendingToolCalls.set(tcStart.toolCallId, {\n name: tcStart.toolCallName,\n args: \"\",\n });\n this.toolCallNames.set(tcStart.toolCallId, tcStart.toolCallName);\n break;\n }\n\n case EventType.TOOL_CALL_ARGS: {\n const tcArgs = event as ToolCallArgsEvent;\n const pending = this.pendingToolCalls.get(tcArgs.toolCallId);\n if (pending && tcArgs.delta) {\n pending.args += tcArgs.delta;\n }\n break;\n }\n\n case EventType.TOOL_CALL_END: {\n const tcEnd = event as ToolCallArgsEvent;\n const pending = this.pendingToolCalls.get(tcEnd.toolCallId);\n if (pending) {\n this.steps.push({\n type: \"action\",\n content: [\n {\n type: \"tool_call\",\n id: tcEnd.toolCallId,\n name: pending.name,\n args: pending.args,\n },\n ],\n });\n this.pendingToolCalls.delete(tcEnd.toolCallId);\n }\n break;\n }\n\n case EventType.TOOL_CALL_RESULT: {\n const tcResult = event as ToolCallResultEvent;\n const resultContent = typeof tcResult.content === \"string\"\n ? tcResult.content\n : JSON.stringify(tcResult.content);\n\n // Check if tool result contains A2UI operations\n this.inspectA2uiOperations(tcResult.content);\n\n const toolName = this.toolCallNames.get(tcResult.toolCallId) || (tcResult.metadata?.toolName as string) || \"tool\";\n this.steps.push({\n type: \"tool_result\",\n call_id: tcResult.toolCallId,\n name: toolName,\n text: resultContent,\n });\n break;\n }\n\n case EventType.SUBAGENT_STARTED: {\n const subEvent = event as SubagentStartedEvent;\n this.subagents.set(subEvent.subagentRunId, {\n id: subEvent.subagentRunId,\n name: subEvent.name,\n status: \"running\",\n parentRunId: subEvent.parentSubagentRunId,\n });\n break;\n }\n\n case EventType.SUBAGENT_FINISHED: {\n const subEvent = event as SubagentFinishedEvent;\n const existing = this.subagents.get(subEvent.subagentRunId);\n if (existing) {\n existing.status = \"completed\";\n }\n break;\n }\n\n case EventType.SUBAGENT_ERROR: {\n const subEvent = event as SubagentErrorEvent;\n const existing = this.subagents.get(subEvent.subagentRunId);\n if (existing) {\n existing.status = \"error\";\n existing.error = subEvent.message;\n }\n break;\n }\n\n case EventType.RUN_FINISHED: {\n // Flush any remaining text\n if (this.activeText.length > 0) {\n this.steps.push({\n type: \"action\",\n content: [{ type: \"text\", text: this.activeText }],\n });\n this.activeText = \"\";\n }\n this.isFinished = true;\n break;\n }\n\n case EventType.RUN_ERROR: {\n const errEvent = event as RunErrorEvent;\n this.hasError = true;\n this.errorMessage = errEvent.message;\n this.isFinished = true;\n break;\n }\n\n default:\n // Other AG-UI events (ACTIVITY, STATE_DELTA, etc.) are kept in state\n break;\n }\n }\n\n /**\n * Parse A2UI operations if returned by a tool result\n */\n private inspectA2uiOperations(content: unknown): void {\n if (!content) return;\n const parsed = typeof content === \"string\" ? tryParseJson(content) : content;\n if (parsed && typeof parsed === \"object\" && \"a2ui_operations\" in parsed) {\n const ops = (parsed as { a2ui_operations: Array<Record<string, unknown>> }).a2ui_operations;\n if (Array.isArray(ops)) {\n for (const op of ops) {\n if (op.createSurface && typeof op.createSurface === \"object\") {\n const surface = op.createSurface as { surfaceId: string; catalogId?: string };\n this.a2uiSurfaces.set(surface.surfaceId, {\n surfaceId: surface.surfaceId,\n catalogId: surface.catalogId,\n components: [],\n dataModel: {},\n });\n } else if (op.updateComponents && typeof op.updateComponents === \"object\") {\n const update = op.updateComponents as { surfaceId: string; components: unknown[] };\n const existing = this.a2uiSurfaces.get(update.surfaceId);\n if (existing) {\n existing.components = update.components;\n }\n } else if (op.updateDataModel && typeof op.updateDataModel === \"object\") {\n const update = op.updateDataModel as { surfaceId: string; value: unknown };\n const existing = this.a2uiSurfaces.get(update.surfaceId);\n if (existing) {\n existing.dataModel = update.value;\n }\n }\n }\n }\n }\n }\n\n /**\n * Produces the snapshot of current streaming state.\n */\n public snapshot(): AgUiStreamState {\n // If active text is streaming, include a draft action step\n const currentSteps = [...this.steps];\n if (this.activeText.length > 0) {\n currentSteps.push({\n type: \"action\",\n content: [{ type: \"text\", text: this.activeText }],\n });\n }\n\n const items = pairTranscriptSteps(currentSteps);\n\n let status: AgUiStreamState[\"status\"] = \"idle\";\n if (this.hasError) {\n status = \"error\";\n } else if (this.isFinished) {\n status = \"completed\";\n } else if (currentSteps.length > 0 || this.activeReasoning.length > 0) {\n status = \"streaming\";\n }\n\n return {\n status,\n items,\n steps: currentSteps,\n reasoning: this.activeReasoning,\n currentText: this.activeText,\n error: this.errorMessage,\n subagents: Array.from(this.subagents.values()),\n a2uiSurfaces: new Map(this.a2uiSurfaces),\n };\n }\n\n /**\n * Alias for snapshot() for ergonomics.\n */\n public getState(): AgUiStreamState {\n return this.snapshot();\n }\n}\n\n/**\n * Converts a static list of AG-UI events into TranscriptSteps.\n */\nexport function agUiEventsToTranscriptSteps(events: BaseEvent[]): TranscriptStep[] {\n const acc = new AgUiEventAccumulator();\n for (const event of events) {\n acc.push(event);\n }\n return acc.snapshot().steps;\n}\n\n/**\n * Converts a static list of AG-UI events into paired TranscriptItems.\n */\nexport function agUiEventsToTranscriptItems(events: BaseEvent[]): TranscriptItem[] {\n const acc = new AgUiEventAccumulator();\n for (const event of events) {\n acc.push(event);\n }\n return acc.snapshot().items;\n}\n\n// ---------------------------------------------------------------------------\n// A2A CoordEnvelope <-> AG-UI Event Bidirectional Bridge\n// ---------------------------------------------------------------------------\n\n/**\n * Translates an Aphrody A2A CoordEnvelope mailbox message into an AG-UI BaseEvent.\n */\nexport function coordEnvelopeToAgUiEvent(envelope: CoordEnvelope): BaseEvent {\n switch (envelope.kind) {\n case \"ask\":\n return {\n type: EventType.CUSTOM,\n name: \"a2a_ask\",\n value: {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n topic: envelope.topic,\n body: envelope.body,\n channel_hint: envelope.channel_hint,\n re: envelope.re,\n },\n };\n\n case \"fact\":\n return {\n type: EventType.CUSTOM,\n name: \"a2a_fact\",\n value: {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n topic: envelope.topic,\n body: envelope.body,\n re: envelope.re,\n },\n };\n\n case \"ack\":\n return {\n type: EventType.CUSTOM,\n name: \"a2a_ack\",\n value: {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n topic: envelope.topic,\n re: envelope.re,\n },\n };\n\n case \"error\":\n return {\n type: EventType.RUN_ERROR,\n message: envelope.body || envelope.topic || \"Coordination error\",\n code: envelope.id,\n };\n\n case \"ping\":\n return {\n type: EventType.CUSTOM,\n name: \"a2a_ping\",\n value: {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n },\n };\n\n default:\n return {\n type: EventType.CUSTOM,\n name: `a2a_${envelope.kind}`,\n value: envelope,\n };\n }\n}\n\n/**\n * Translates an AG-UI BaseEvent into an Aphrody A2A CoordEnvelope mailbox message.\n */\nexport function agUiEventToCoordEnvelope(\n event: BaseEvent,\n from: string,\n to: string = \"fleet\",\n): CoordEnvelope {\n const ts = new Date().toISOString();\n const id = `env-${Date.now().toString(16)}`;\n\n if (event.type === EventType.CUSTOM && (event as any).name?.startsWith(\"a2a_\")) {\n const val = (event as any).value || {};\n const kind = (event as any).name.replace(/^a2a_/, \"\");\n return {\n v: 1,\n ts: val.ts || ts,\n id: val.id || id,\n from: val.from || from,\n to: val.to || to,\n kind: (kind as EnvelopeKind),\n topic: val.topic || \"a2a-coordination\",\n body: val.body || \"\",\n re: val.re,\n channel_hint: val.channel_hint,\n };\n }\n\n if (event.type === EventType.RUN_ERROR) {\n const err = event as RunErrorEvent;\n return {\n v: 1,\n ts,\n id,\n from,\n to,\n kind: \"error\",\n topic: \"run-error\",\n body: err.message,\n };\n }\n\n if (event.type === EventType.TOOL_CALL_RESULT) {\n const res = event as ToolCallResultEvent;\n return {\n v: 1,\n ts,\n id,\n from,\n to,\n kind: \"fact\",\n topic: (res.metadata?.toolName as string) || `tool:${res.toolCallId}`,\n body: typeof res.content === \"string\" ? res.content : JSON.stringify(res.content),\n re: res.toolCallId,\n };\n }\n\n // Default envelope mapping for arbitrary events\n return {\n v: 1,\n ts,\n id,\n from,\n to,\n kind: \"fact\",\n topic: `event:${event.type}`,\n body: JSON.stringify(event),\n };\n}\n",
26
- "// SPDX-License-Identifier: Apache-2.0\n/**\n * @aphrody/m3-ai - A2APeerInspector\n *\n * Material Design 3 Agent-to-Agent (A2A 1.0) Fleet Inspector:\n * - Visualizes connected peer agents (codex, claude, agycli, shenron, nie, ocr, rag).\n * - Displays AgentCard interface, capabilities, and active tasks.\n * - Live inspection of .coord mailbox envelopes (ask, fact, ack, ping, error).\n * - File lock & resource claims view (.coord/claims).\n */\n\nimport React, { useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport type { CoordEnvelope, EnvelopeKind } from \"./AgUiEventStream\";\n\nexport interface AgentPeer {\n id: string;\n name: string;\n role: string;\n status: \"idle\" | \"busy\" | \"offline\";\n version?: string;\n skills?: string[];\n activeClaim?: string;\n}\n\nexport interface SendEnvelopePayload {\n from: string;\n to?: string;\n kind: EnvelopeKind | string;\n topic: string;\n body: string;\n re?: string;\n channel_hint?: string[];\n v?: number;\n [key: string]: unknown;\n}\n\nexport interface A2APeerInspectorProps {\n peers?: AgentPeer[];\n envelopes?: CoordEnvelope[];\n selectedPeerId?: string;\n onSelectPeer?: (peerId: string) => void;\n onSendEnvelope?: (envelope: SendEnvelopePayload) => void;\n className?: string;\n}\n\nconst EMPTY_ENVELOPES: CoordEnvelope[] = [];\n\nconst DEFAULT_PEERS: AgentPeer[] = [\n {\n id: \"agy\",\n name: \"Antigravity Core\",\n role: \"Integrator & UI / Rust Lead\",\n status: \"busy\",\n version: \"2.0.0\",\n skills: [\"m3-ui\", \"rust-serial\", \"bun-native\", \"a2a-coord\"],\n activeClaim: \".coord/claims/native-integration.json\",\n },\n {\n id: \"codex\",\n name: \"Codex Peer\",\n role: \"Backend & Systems Worker\",\n status: \"busy\",\n version: \"1.4.0\",\n skills: [\"native-wiring\", \"wsl-probe\", \"kernel-ffi\"],\n },\n {\n id: \"claude\",\n name: \"Claude Peer\",\n role: \"Architecture & Verification\",\n status: \"idle\",\n version: \"3.7.0\",\n skills: [\"design-tokens\", \"docs-audit\", \"review\"],\n },\n {\n id: \"shenron\",\n name: \"Shenron Daemon\",\n role: \"Database & RAG Pipeline Gate\",\n status: \"idle\",\n version: \"2.1.0\",\n skills: [\"rag-index\", \"manga-publish\", \"embeddings\"],\n },\n];\n\nconst KIND_COLORS: Record<EnvelopeKind, { bg: string; text: string; border: string }> = {\n ask: {\n bg: \"bg-[var(--md-sys-color-primary-container,#eaddff)]\",\n text: \"text-[var(--md-sys-color-on-primary-container,#21005d)]\",\n border: \"border-[var(--md-sys-color-primary,#6750a4)]\",\n },\n fact: {\n bg: \"bg-[var(--md-sys-color-tertiary-container,#ffd8e4)]\",\n text: \"text-[var(--md-sys-color-on-tertiary-container,#31111d)]\",\n border: \"border-[var(--md-sys-color-tertiary,#7d5260)]\",\n },\n ack: {\n bg: \"bg-[var(--md-sys-color-secondary-container,#e8def8)]\",\n text: \"text-[var(--md-sys-color-on-secondary-container,#1d192b)]\",\n border: \"border-[var(--md-sys-color-secondary,#625b71)]\",\n },\n ping: {\n bg: \"bg-[var(--md-sys-color-surface-container-high,#ece6f0)]\",\n text: \"text-[var(--md-sys-color-on-surface-variant,#49454f)]\",\n border: \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n },\n error: {\n bg: \"bg-[var(--md-sys-color-error-container,#f9dedc)]\",\n text: \"text-[var(--md-sys-color-on-error-container,#410e0b)]\",\n border: \"border-[var(--md-sys-color-error,#b3261e)]\",\n },\n};\n\nexport const A2APeerInspector: React.FC<A2APeerInspectorProps> = ({\n peers = DEFAULT_PEERS,\n envelopes = EMPTY_ENVELOPES,\n selectedPeerId: controlledPeerId,\n onSelectPeer,\n onSendEnvelope,\n className,\n}) => {\n const [internalSelectedPeerId, setInternalSelectedPeerId] = useState<string>(\n peers[0]?.id || \"agy\",\n );\n const selectedPeerId = controlledPeerId ?? internalSelectedPeerId;\n\n // Form state for composing envelope\n const [composeTopic, setComposeTopic] = useState(\"\");\n const [composeBody, setComposeBody] = useState(\"\");\n const [composeKind, setComposeKind] = useState<EnvelopeKind>(\"ask\");\n\n const currentPeer = peers.find((p) => p.id === selectedPeerId) || peers[0];\n\n const handleSelect = (peerId: string) => {\n setInternalSelectedPeerId(peerId);\n onSelectPeer?.(peerId);\n };\n\n const handleSend = (e: React.FormEvent) => {\n e.preventDefault();\n if (!composeTopic.trim() || !composeBody.trim()) return;\n\n onSendEnvelope?.({\n from: \"agy\",\n to: selectedPeerId,\n kind: composeKind,\n topic: composeTopic.trim(),\n body: composeBody.trim(),\n });\n\n setComposeTopic(\"\");\n setComposeBody(\"\");\n };\n\n const filteredEnvelopes = envelopes.filter(\n (env) => env.from === selectedPeerId || env.to === selectedPeerId || env.to === \"fleet\",\n );\n\n return (\n <div\n className={clsx(\n \"flex flex-col gap-4 rounded-3xl p-5 border\",\n \"bg-[var(--md-sys-color-surface-container-lowest,#ffffff)]\",\n \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n \"text-[var(--md-sys-color-on-surface,#1d1b20)]\",\n className,\n )}\n >\n {/* Header & Peer Chips */}\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"material-symbols-outlined text-xl text-[var(--md-sys-color-primary,#6750a4)]\">\n hub\n </span>\n <h2 className=\"text-base font-semibold tracking-tight\">A2A Fleet Coordinator</h2>\n <span className=\"rounded-full bg-[var(--md-sys-color-surface-container-high,#ece6f0)] px-2 py-0.5 text-xs font-mono text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n v1.0 (JSONL + RPC)\n </span>\n </div>\n <span className=\"text-xs text-[var(--md-sys-color-outline,#79747e)]\">\n {peers.length} active peers\n </span>\n </div>\n\n {/* Peer selection chips */}\n <div className=\"flex items-center gap-2 overflow-x-auto pb-1\">\n {peers.map((peer) => {\n const isSelected = peer.id === selectedPeerId;\n return (\n <button\n key={peer.id}\n type=\"button\"\n onClick={() => handleSelect(peer.id)}\n className={clsx(\n \"flex items-center gap-2 rounded-full px-3.5 py-1.5 text-xs font-medium transition-colors shrink-0\",\n isSelected\n ? \"bg-[var(--md-sys-color-secondary-container,#e8def8)] text-[var(--md-sys-color-on-secondary-container,#1d192b)] shadow-sm\"\n : \"bg-[var(--md-sys-color-surface-container,#f3edf7)] text-[var(--md-sys-color-on-surface-variant,#49454f)] hover:bg-[var(--md-sys-color-surface-container-high,#ece6f0)]\",\n )}\n >\n <span\n className={clsx(\n \"h-2 w-2 rounded-full\",\n peer.status === \"busy\"\n ? \"bg-amber-500 animate-pulse\"\n : peer.status === \"idle\"\n ? \"bg-emerald-500\"\n : \"bg-slate-400\",\n )}\n />\n <span>{peer.name}</span>\n <span className=\"text-[10px] opacity-60\">@{peer.id}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Selected Peer Details Card */}\n {currentPeer && (\n <div className=\"flex flex-col gap-2 rounded-2xl bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] p-4 border border-[var(--md-sys-color-outline-variant,#cac4d0)]/50\">\n <div className=\"flex items-start justify-between\">\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-sm\">{currentPeer.name}</span>\n <span className=\"text-xs text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n ({currentPeer.role})\n </span>\n </div>\n <div className=\"text-xs text-[var(--md-sys-color-outline,#79747e)] mt-0.5\">\n Peer ID: <code className=\"font-mono text-xs\">{currentPeer.id}</code> · Version:{\" \"}\n {currentPeer.version || \"1.0.0\"}\n </div>\n </div>\n {currentPeer.activeClaim && (\n <div className=\"flex items-center gap-1.5 rounded-lg bg-amber-500/10 px-2 py-1 text-xs text-amber-700 dark:text-amber-400 border border-amber-500/20\">\n <span className=\"material-symbols-outlined text-sm\">lock</span>\n <span className=\"font-mono text-[11px]\">{currentPeer.activeClaim}</span>\n </div>\n )}\n </div>\n\n {currentPeer.skills && currentPeer.skills.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {currentPeer.skills.map((skill) => (\n <span\n key={skill}\n className=\"rounded-md bg-[var(--md-sys-color-surface-container-highest,#e6e0e9)] px-2 py-0.5 text-[11px] font-mono text-[var(--md-sys-color-on-surface-variant,#49454f)]\"\n >\n #{skill}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Envelope Stream Section */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n Coordination Envelopes ({filteredEnvelopes.length})\n </h3>\n <span className=\"text-[11px] text-[var(--md-sys-color-outline,#79747e)]\">\n .coord/inbox & .coord/outbox\n </span>\n </div>\n\n {filteredEnvelopes.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center p-6 rounded-2xl bg-[var(--md-sys-color-surface-container-lowest,#ffffff)] border border-dashed border-[var(--md-sys-color-outline-variant,#cac4d0)] text-xs text-[var(--md-sys-color-outline,#79747e)]\">\n <span className=\"material-symbols-outlined text-2xl mb-1 opacity-50\">\n mark_email_read\n </span>\n No pending envelopes for @{selectedPeerId}. Fleet mailbox is synchronized.\n </div>\n ) : (\n <div className=\"flex flex-col gap-2 max-h-60 overflow-y-auto pr-1\">\n {filteredEnvelopes.map((env) => {\n const kind = (env.kind in KIND_COLORS ? env.kind : \"ping\") as EnvelopeKind;\n const style = KIND_COLORS[kind];\n\n return (\n <div\n key={env.id}\n className={clsx(\n \"flex flex-col gap-1.5 rounded-xl p-3 border text-xs transition-shadow\",\n \"bg-[var(--md-sys-color-surface-container-low,#f7f2fa)]\",\n style.border,\n )}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span\n className={clsx(\n \"rounded-md px-1.5 py-0.5 text-[10px] font-bold uppercase\",\n style.bg,\n style.text,\n )}\n >\n {env.kind}\n </span>\n <span className=\"font-semibold\">{env.topic}</span>\n </div>\n <span className=\"text-[10px] font-mono text-[var(--md-sys-color-outline,#79747e)]\">\n {env.from} → {env.to || \"all\"}\n </span>\n </div>\n\n <p className=\"line-clamp-2 text-xs text-[var(--md-sys-color-on-surface-variant,#49454f)] font-mono whitespace-pre-wrap\">\n {env.body}\n </p>\n\n <div className=\"flex items-center justify-between pt-1 border-t border-[var(--md-sys-color-outline-variant,#cac4d0)]/30 text-[10px] text-[var(--md-sys-color-outline,#79747e)] font-mono\">\n <span>id: {env.id}</span>\n {env.re && <span>re: {env.re}</span>}\n <span>{new Date(env.ts).toLocaleTimeString()}</span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Compose Form */}\n <form\n onSubmit={handleSend}\n className=\"flex flex-col gap-2.5 pt-2 border-t border-[var(--md-sys-color-outline-variant,#cac4d0)]/50\"\n >\n <div className=\"flex items-center gap-2\">\n <select\n value={composeKind}\n onChange={(e) => setComposeKind(e.target.value as EnvelopeKind)}\n className=\"rounded-xl border border-[var(--md-sys-color-outline-variant,#cac4d0)] bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] px-2.5 py-1.5 text-xs font-medium text-[var(--md-sys-color-on-surface,#1d1b20)] focus:outline-none focus:ring-1 focus:ring-[var(--md-sys-color-primary,#6750a4)]\"\n >\n <option value=\"ask\">ASK</option>\n <option value=\"fact\">FACT</option>\n <option value=\"ack\">ACK</option>\n <option value=\"ping\">PING</option>\n <option value=\"error\">ERROR</option>\n </select>\n\n <input\n type=\"text\"\n placeholder=\"Topic (e.g. work, claim-check, verification)...\"\n value={composeTopic}\n onChange={(e) => setComposeTopic(e.target.value)}\n className=\"flex-1 rounded-xl border border-[var(--md-sys-color-outline-variant,#cac4d0)] bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] px-3 py-1.5 text-xs text-[var(--md-sys-color-on-surface,#1d1b20)] placeholder-[var(--md-sys-color-outline,#79747e)] focus:outline-none focus:ring-1 focus:ring-[var(--md-sys-color-primary,#6750a4)]\"\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n placeholder={`Message body to @${selectedPeerId}...`}\n value={composeBody}\n onChange={(e) => setComposeBody(e.target.value)}\n className=\"flex-1 rounded-xl border border-[var(--md-sys-color-outline-variant,#cac4d0)] bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] px-3 py-1.5 text-xs text-[var(--md-sys-color-on-surface,#1d1b20)] placeholder-[var(--md-sys-color-outline,#79747e)] focus:outline-none focus:ring-1 focus:ring-[var(--md-sys-color-primary,#6750a4)]\"\n />\n\n <button\n type=\"submit\"\n disabled={!composeTopic.trim() || !composeBody.trim()}\n className={clsx(\n \"flex items-center gap-1.5 rounded-xl px-4 py-1.5 text-xs font-semibold transition-all\",\n composeTopic.trim() && composeBody.trim()\n ? \"bg-[var(--md-sys-color-primary,#6750a4)] text-[var(--md-sys-color-on-primary,#ffffff)] hover:opacity-90 shadow-sm\"\n : \"bg-[var(--md-sys-color-surface-container-high,#ece6f0)] text-[var(--md-sys-color-outline,#79747e)] cursor-not-allowed\",\n )}\n >\n <span>Dispatch</span>\n <span className=\"material-symbols-outlined text-sm\">send</span>\n </button>\n </div>\n </form>\n </div>\n );\n};\n",
27
- "// SPDX-License-Identifier: Apache-2.0\n/**\n * @aphrody/m3-ai - A2ATaskTimeline\n *\n * Material Design 3 Agent-to-Agent Delegation Timeline:\n * - Chronological trace of task handoffs between agents (e.g., user -> agycli -> codex -> claude -> shenron).\n * - Displays delegation phase, envelope kind, file claims, and execution status.\n */\n\nimport React, { useId, useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport type { CoordEnvelope } from \"./AgUiEventStream\";\n\nexport interface TimelineStep {\n id: string;\n from: string;\n to: string;\n title: string;\n description?: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\";\n timestamp: string;\n envelope?: Partial<CoordEnvelope>;\n claim?: string;\n}\n\nexport interface A2ATaskTimelineProps {\n steps?: TimelineStep[];\n currentStepId?: string;\n onSelectStep?: (step: TimelineStep) => void;\n className?: string;\n}\n\nconst DEFAULT_TIMELINE_STEPS: TimelineStep[] = [\n {\n id: \"step-agy-lead\",\n from: \"user\",\n to: \"agy\",\n title: \"Lead Coordination & Monorepo Integration\",\n status: \"completed\",\n timestamp: \"Live\",\n description: \"Coordination active via .coord mailbox and OS resource claims.\",\n },\n {\n id: \"step-workers\",\n from: \"agy\",\n to: \"codex\",\n title: \"Subagent / Peer Parallel Tasks\",\n status: \"running\",\n timestamp: \"Ongoing\",\n description: \"Workers executing disjoint task families under cooperatively acquired locks.\",\n },\n];\n\nexport const A2ATaskTimeline: React.FC<A2ATaskTimelineProps> = ({\n steps = DEFAULT_TIMELINE_STEPS,\n currentStepId,\n onSelectStep,\n className,\n}) => {\n const [expandedStepId, setExpandedStepId] = useState<string | null>(null);\n const timelineId = useId();\n\n const toggleExpand = (id: string) => {\n setExpandedStepId((current) => (current === id ? null : id));\n };\n\n return (\n <div\n className={clsx(\n \"flex flex-col gap-3 rounded-3xl p-5 border\",\n \"bg-[var(--md-sys-color-surface-container-lowest,#ffffff)]\",\n \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n \"text-[var(--md-sys-color-on-surface,#1d1b20)]\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between border-b border-[var(--md-sys-color-outline-variant,#cac4d0)]/40 pb-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"material-symbols-outlined text-lg text-[var(--md-sys-color-primary,#6750a4)]\">\n timeline\n </span>\n <h3 className=\"text-sm font-semibold tracking-tight\">A2A Task Delegation Timeline</h3>\n </div>\n <span className=\"text-xs text-[var(--md-sys-color-outline,#79747e)]\">\n {steps.length} delegation steps\n </span>\n </div>\n\n <div className=\"relative flex flex-col gap-4 pl-4 pt-1\">\n {/* Continuous connector line */}\n <div className=\"absolute left-[27px] top-4 bottom-4 w-0.5 bg-[var(--md-sys-color-outline-variant,#cac4d0)]/60\" />\n\n {steps.map((step) => {\n const isCurrent = step.id === currentStepId;\n const isExpanded = step.id === expandedStepId;\n const detailsId = `${timelineId}-${encodeURIComponent(step.id)}`;\n const date = new Date(step.timestamp);\n const time = Number.isNaN(date.getTime()) ? step.timestamp : date.toLocaleTimeString();\n\n const statusIcon =\n step.status === \"completed\"\n ? \"check_circle\"\n : step.status === \"running\"\n ? \"sync\"\n : step.status === \"error\"\n ? \"error\"\n : \"radio_button_unchecked\";\n\n const statusColor =\n step.status === \"completed\"\n ? \"text-emerald-500\"\n : step.status === \"running\"\n ? \"text-[var(--md-sys-color-primary,#6750a4)] animate-spin motion-reduce:animate-none\"\n : step.status === \"error\"\n ? \"text-rose-500\"\n : \"text-slate-400\";\n\n return (\n <div\n key={step.id}\n className={clsx(\n \"relative flex items-start gap-3 transition-all\",\n isCurrent && \"font-medium\",\n )}\n >\n {/* Step indicator node */}\n <div\n className={clsx(\n \"relative z-10 flex h-7 w-7 items-center justify-center rounded-full border-2 bg-[var(--md-sys-color-surface-container-lowest,#ffffff)]\",\n step.status === \"completed\"\n ? \"border-emerald-500\"\n : step.status === \"running\"\n ? \"border-[var(--md-sys-color-primary,#6750a4)] ring-4 ring-[var(--md-sys-color-primary,#6750a4)]/20\"\n : step.status === \"error\"\n ? \"border-rose-500\"\n : \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n )}\n >\n <span className={clsx(\"material-symbols-outlined text-sm\", statusColor)}>\n {statusIcon}\n </span>\n </div>\n\n {/* Step details card */}\n <div\n className={clsx(\n \"flex-1 cursor-pointer rounded-2xl border p-3 text-xs transition-all\",\n \"bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] hover:bg-[var(--md-sys-color-surface-container,#f3edf7)]\",\n isCurrent\n ? \"border-[var(--md-sys-color-primary,#6750a4)] shadow-sm\"\n : \"border-[var(--md-sys-color-outline-variant,#cac4d0)]/60\",\n )}\n >\n <button\n type=\"button\"\n aria-expanded={step.envelope ? isExpanded : undefined}\n aria-controls={step.envelope ? detailsId : undefined}\n onClick={() => {\n toggleExpand(step.id);\n onSelectStep?.(step);\n }}\n className=\"block w-full rounded-medium text-left outline-none focus-visible:ring-2 focus-visible:ring-primary\"\n >\n <span className=\"flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"font-semibold text-xs text-[var(--md-sys-color-on-surface,#1d1b20)]\">\n {step.title}\n </span>\n <span className=\"rounded-md bg-[var(--md-sys-color-surface-container-highest,#e6e0e9)] px-1.5 py-0.2 text-[10px] font-mono text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n @{step.from} → @{step.to}\n </span>\n </span>\n <span className=\"text-[10px] font-mono text-[var(--md-sys-color-outline,#79747e)]\">\n {time}\n </span>\n </span>\n\n {step.description && (\n <span className=\"mt-1 block text-xs text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n {step.description}\n </span>\n )}\n\n {step.claim && (\n <span className=\"mt-2 flex items-center gap-1.5 text-[11px] font-mono text-amber-700 dark:text-amber-400\">\n <span className=\"material-symbols-outlined text-xs\">lock</span>\n <span>claim: {step.claim}</span>\n </span>\n )}\n </button>\n\n {/* Expanded envelope payload view */}\n {step.envelope && (\n <div\n id={detailsId}\n hidden={!isExpanded}\n className=\"mt-2.5 pt-2 border-t border-[var(--md-sys-color-outline-variant,#cac4d0)]/40 font-mono text-[11px] text-[var(--md-sys-color-on-surface-variant,#49454f)]\"\n >\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"font-semibold\">Kind: {step.envelope.kind}</span>\n <span>·</span>\n <span>Topic: {step.envelope.topic}</span>\n </div>\n {step.envelope.body && (\n <pre className=\"rounded-lg bg-[var(--md-sys-color-surface-container-highest,#e6e0e9)]/50 p-2 overflow-x-auto whitespace-pre-wrap\">\n {step.envelope.body}\n </pre>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n"
27
+ "// SPDX-License-Identifier: Apache-2.0\n/**\n * @aphrody/m3-ai - AgUiEventStream\n *\n * Full-duplex Agent-to-User (A2U) streaming and A2A fleet bridge:\n * - Maps AG-UI v1.0 protocol events (text chunks, tool calls, reasoning, state, subagents)\n * into native Material Design 3 TranscriptSteps and TranscriptItems.\n * - Bridges Aphrody A2A CoordEnvelope fleet messages (ask/fact/ack/ping/error) to and from AG-UI events.\n * - Provides reactive state accumulator and streaming parser.\n */\n\nimport {\n EventType,\n type BaseEvent,\n type TextMessageContentEvent,\n type ToolCallStartEvent,\n type ToolCallArgsEvent,\n type ToolCallResultEvent,\n type ReasoningMessageContentEvent,\n type SubagentStartedEvent,\n type SubagentFinishedEvent,\n type SubagentErrorEvent,\n type RunErrorEvent,\n} from \"./ag-ui\";\nimport {\n type TranscriptStep,\n type TranscriptItem,\n pairTranscriptSteps,\n tryParseJson,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// A2A Coordination Fleet Types\n// ---------------------------------------------------------------------------\n\nexport type EnvelopeKind = \"ask\" | \"fact\" | \"ack\" | \"ping\" | \"error\";\n\nexport interface CoordEnvelope {\n v?: number;\n ts: string;\n id: string;\n from: string;\n to?: string;\n kind: EnvelopeKind | string;\n topic: string;\n body: string;\n re?: string;\n channel_hint?: string[];\n [key: string]: unknown;\n}\n\nexport interface SubagentTrace {\n id: string;\n name: string;\n status: \"running\" | \"completed\" | \"error\";\n parentRunId?: string;\n error?: string;\n}\n\nexport interface AgUiStreamState {\n status: \"idle\" | \"streaming\" | \"completed\" | \"error\";\n items: TranscriptItem[];\n steps: TranscriptStep[];\n reasoning: string;\n currentText: string;\n error?: string;\n subagents: SubagentTrace[];\n a2uiSurfaces: Map<string, Record<string, unknown>>;\n}\n\n// ---------------------------------------------------------------------------\n// AG-UI Events -> Transcript Steps Mapper\n// ---------------------------------------------------------------------------\n\nexport class AgUiEventAccumulator {\n private steps: TranscriptStep[] = [];\n private activeText: string = \"\";\n private activeReasoning: string = \"\";\n private pendingToolCalls = new Map<string, { name: string; args: string }>();\n private toolCallNames = new Map<string, string>();\n private subagents = new Map<string, SubagentTrace>();\n private a2uiSurfaces = new Map<string, Record<string, unknown>>();\n private isFinished = false;\n private hasError = false;\n private errorMessage?: string;\n\n /**\n * Process a single AG-UI event and update accumulator state.\n */\n public push(event: BaseEvent): void {\n switch (event.type) {\n case EventType.RUN_STARTED: {\n this.isFinished = false;\n this.hasError = false;\n break;\n }\n\n case EventType.TEXT_MESSAGE_CONTENT: {\n const textEvent = event as TextMessageContentEvent;\n if (textEvent.delta) {\n this.activeText += textEvent.delta;\n }\n break;\n }\n\n case EventType.TEXT_MESSAGE_END: {\n if (this.activeText.length > 0) {\n this.steps.push({\n type: \"action\",\n content: [{ type: \"text\", text: this.activeText }],\n });\n this.activeText = \"\";\n }\n break;\n }\n\n case EventType.REASONING_MESSAGE_CONTENT: {\n const reasoningEvent = event as ReasoningMessageContentEvent;\n if (reasoningEvent.delta) {\n this.activeReasoning += reasoningEvent.delta;\n }\n break;\n }\n\n case EventType.TOOL_CALL_START: {\n const tcStart = event as ToolCallStartEvent;\n this.pendingToolCalls.set(tcStart.toolCallId, {\n name: tcStart.toolCallName,\n args: \"\",\n });\n this.toolCallNames.set(tcStart.toolCallId, tcStart.toolCallName);\n break;\n }\n\n case EventType.TOOL_CALL_ARGS: {\n const tcArgs = event as ToolCallArgsEvent;\n const pending = this.pendingToolCalls.get(tcArgs.toolCallId);\n if (pending && tcArgs.delta) {\n pending.args += tcArgs.delta;\n }\n break;\n }\n\n case EventType.TOOL_CALL_END: {\n const tcEnd = event as ToolCallArgsEvent;\n const pending = this.pendingToolCalls.get(tcEnd.toolCallId);\n if (pending) {\n this.steps.push({\n type: \"action\",\n content: [\n {\n type: \"tool_call\",\n id: tcEnd.toolCallId,\n name: pending.name,\n args: pending.args,\n },\n ],\n });\n this.pendingToolCalls.delete(tcEnd.toolCallId);\n }\n break;\n }\n\n case EventType.TOOL_CALL_RESULT: {\n const tcResult = event as ToolCallResultEvent;\n const resultContent =\n typeof tcResult.content === \"string\"\n ? tcResult.content\n : JSON.stringify(tcResult.content);\n\n // Check if tool result contains A2UI operations\n this.inspectA2uiOperations(tcResult.content);\n\n const toolName =\n this.toolCallNames.get(tcResult.toolCallId) ||\n (tcResult.metadata?.toolName as string) ||\n \"tool\";\n this.steps.push({\n type: \"tool_result\",\n call_id: tcResult.toolCallId,\n name: toolName,\n text: resultContent,\n });\n break;\n }\n\n case EventType.SUBAGENT_STARTED: {\n const subEvent = event as SubagentStartedEvent;\n this.subagents.set(subEvent.subagentRunId, {\n id: subEvent.subagentRunId,\n name: subEvent.name,\n status: \"running\",\n parentRunId: subEvent.parentSubagentRunId,\n });\n break;\n }\n\n case EventType.SUBAGENT_FINISHED: {\n const subEvent = event as SubagentFinishedEvent;\n const existing = this.subagents.get(subEvent.subagentRunId);\n if (existing) {\n existing.status = \"completed\";\n }\n break;\n }\n\n case EventType.SUBAGENT_ERROR: {\n const subEvent = event as SubagentErrorEvent;\n const existing = this.subagents.get(subEvent.subagentRunId);\n if (existing) {\n existing.status = \"error\";\n existing.error = subEvent.message;\n }\n break;\n }\n\n case EventType.RUN_FINISHED: {\n // Flush any remaining text\n if (this.activeText.length > 0) {\n this.steps.push({\n type: \"action\",\n content: [{ type: \"text\", text: this.activeText }],\n });\n this.activeText = \"\";\n }\n this.isFinished = true;\n break;\n }\n\n case EventType.RUN_ERROR: {\n const errEvent = event as RunErrorEvent;\n this.hasError = true;\n this.errorMessage = errEvent.message;\n this.isFinished = true;\n break;\n }\n\n default:\n // Other AG-UI events (ACTIVITY, STATE_DELTA, etc.) are kept in state\n break;\n }\n }\n\n /**\n * Parse A2UI operations if returned by a tool result\n */\n private inspectA2uiOperations(content: unknown): void {\n if (!content) return;\n const parsed = typeof content === \"string\" ? tryParseJson(content) : content;\n if (parsed && typeof parsed === \"object\" && \"a2ui_operations\" in parsed) {\n const ops = (parsed as { a2ui_operations: Array<Record<string, unknown>> }).a2ui_operations;\n if (Array.isArray(ops)) {\n for (const op of ops) {\n if (op.createSurface && typeof op.createSurface === \"object\") {\n const surface = op.createSurface as { surfaceId: string; catalogId?: string };\n this.a2uiSurfaces.set(surface.surfaceId, {\n surfaceId: surface.surfaceId,\n catalogId: surface.catalogId,\n components: [],\n dataModel: {},\n });\n } else if (op.updateComponents && typeof op.updateComponents === \"object\") {\n const update = op.updateComponents as { surfaceId: string; components: unknown[] };\n const existing = this.a2uiSurfaces.get(update.surfaceId);\n if (existing) {\n existing.components = update.components;\n }\n } else if (op.updateDataModel && typeof op.updateDataModel === \"object\") {\n const update = op.updateDataModel as { surfaceId: string; value: unknown };\n const existing = this.a2uiSurfaces.get(update.surfaceId);\n if (existing) {\n existing.dataModel = update.value;\n }\n }\n }\n }\n }\n }\n\n /**\n * Produces the snapshot of current streaming state.\n */\n public snapshot(): AgUiStreamState {\n // If active text is streaming, include a draft action step\n const currentSteps = [...this.steps];\n if (this.activeText.length > 0) {\n currentSteps.push({\n type: \"action\",\n content: [{ type: \"text\", text: this.activeText }],\n });\n }\n\n const items = pairTranscriptSteps(currentSteps);\n\n let status: AgUiStreamState[\"status\"] = \"idle\";\n if (this.hasError) {\n status = \"error\";\n } else if (this.isFinished) {\n status = \"completed\";\n } else if (currentSteps.length > 0 || this.activeReasoning.length > 0) {\n status = \"streaming\";\n }\n\n return {\n status,\n items,\n steps: currentSteps,\n reasoning: this.activeReasoning,\n currentText: this.activeText,\n error: this.errorMessage,\n subagents: Array.from(this.subagents.values()),\n a2uiSurfaces: new Map(this.a2uiSurfaces),\n };\n }\n\n /**\n * Alias for snapshot() for ergonomics.\n */\n public getState(): AgUiStreamState {\n return this.snapshot();\n }\n}\n\n/**\n * Converts a static list of AG-UI events into TranscriptSteps.\n */\nexport function agUiEventsToTranscriptSteps(events: BaseEvent[]): TranscriptStep[] {\n const acc = new AgUiEventAccumulator();\n for (const event of events) {\n acc.push(event);\n }\n return acc.snapshot().steps;\n}\n\n/**\n * Converts a static list of AG-UI events into paired TranscriptItems.\n */\nexport function agUiEventsToTranscriptItems(events: BaseEvent[]): TranscriptItem[] {\n const acc = new AgUiEventAccumulator();\n for (const event of events) {\n acc.push(event);\n }\n return acc.snapshot().items;\n}\n\n// ---------------------------------------------------------------------------\n// A2A CoordEnvelope <-> AG-UI Event Bidirectional Bridge\n// ---------------------------------------------------------------------------\n\n/**\n * Translates an Aphrody A2A CoordEnvelope mailbox message into an AG-UI BaseEvent.\n */\nexport function coordEnvelopeToAgUiEvent(envelope: CoordEnvelope): BaseEvent {\n switch (envelope.kind) {\n case \"ask\":\n return {\n type: EventType.CUSTOM,\n name: \"a2a_ask\",\n value: {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n topic: envelope.topic,\n body: envelope.body,\n channel_hint: envelope.channel_hint,\n re: envelope.re,\n },\n };\n\n case \"fact\":\n return {\n type: EventType.CUSTOM,\n name: \"a2a_fact\",\n value: {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n topic: envelope.topic,\n body: envelope.body,\n re: envelope.re,\n },\n };\n\n case \"ack\":\n return {\n type: EventType.CUSTOM,\n name: \"a2a_ack\",\n value: {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n topic: envelope.topic,\n re: envelope.re,\n },\n };\n\n case \"error\":\n return {\n type: EventType.RUN_ERROR,\n message: envelope.body || envelope.topic || \"Coordination error\",\n code: envelope.id,\n };\n\n case \"ping\":\n return {\n type: EventType.CUSTOM,\n name: \"a2a_ping\",\n value: {\n id: envelope.id,\n from: envelope.from,\n to: envelope.to,\n },\n };\n\n default:\n return {\n type: EventType.CUSTOM,\n name: `a2a_${envelope.kind}`,\n value: envelope,\n };\n }\n}\n\n/**\n * Translates an AG-UI BaseEvent into an Aphrody A2A CoordEnvelope mailbox message.\n */\nexport function agUiEventToCoordEnvelope(\n event: BaseEvent,\n from: string,\n to: string = \"fleet\",\n): CoordEnvelope {\n const ts = new Date().toISOString();\n const id = `env-${Date.now().toString(16)}`;\n\n if (event.type === EventType.CUSTOM && (event as any).name?.startsWith(\"a2a_\")) {\n const val = (event as any).value || {};\n const kind = (event as any).name.replace(/^a2a_/, \"\");\n return {\n v: 1,\n ts: val.ts || ts,\n id: val.id || id,\n from: val.from || from,\n to: val.to || to,\n kind: kind as EnvelopeKind,\n topic: val.topic || \"a2a-coordination\",\n body: val.body || \"\",\n re: val.re,\n channel_hint: val.channel_hint,\n };\n }\n\n if (event.type === EventType.RUN_ERROR) {\n const err = event as RunErrorEvent;\n return {\n v: 1,\n ts,\n id,\n from,\n to,\n kind: \"error\",\n topic: \"run-error\",\n body: err.message,\n };\n }\n\n if (event.type === EventType.TOOL_CALL_RESULT) {\n const res = event as ToolCallResultEvent;\n return {\n v: 1,\n ts,\n id,\n from,\n to,\n kind: \"fact\",\n topic: (res.metadata?.toolName as string) || `tool:${res.toolCallId}`,\n body: typeof res.content === \"string\" ? res.content : JSON.stringify(res.content),\n re: res.toolCallId,\n };\n }\n\n // Default envelope mapping for arbitrary events\n return {\n v: 1,\n ts,\n id,\n from,\n to,\n kind: \"fact\",\n topic: `event:${event.type}`,\n body: JSON.stringify(event),\n };\n}\n",
28
+ "// SPDX-License-Identifier: Apache-2.0\n/**\n * @aphrody/m3-ai - A2APeerInspector\n *\n * Material Design 3 Agent-to-Agent (A2A 1.0) Fleet Inspector:\n * - Visualizes connected peer agents (codex, claude, agycli, nie, ocr, rag, ...).\n * - Displays AgentCard interface, capabilities, and active tasks.\n * - Live inspection of .coord mailbox envelopes (ask, fact, ack, ping, error).\n * - File lock & resource claims view (.coord/claims).\n */\n\nimport React, { useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport type { CoordEnvelope, EnvelopeKind } from \"./AgUiEventStream\";\n\nexport interface AgentPeer {\n id: string;\n name: string;\n role: string;\n status: \"idle\" | \"busy\" | \"offline\";\n version?: string;\n skills?: string[];\n activeClaim?: string;\n}\n\nexport interface SendEnvelopePayload {\n from: string;\n to?: string;\n kind: EnvelopeKind | string;\n topic: string;\n body: string;\n re?: string;\n channel_hint?: string[];\n v?: number;\n [key: string]: unknown;\n}\n\nexport interface A2APeerInspectorProps {\n peers?: AgentPeer[];\n envelopes?: CoordEnvelope[];\n selectedPeerId?: string;\n onSelectPeer?: (peerId: string) => void;\n onSendEnvelope?: (envelope: SendEnvelopePayload) => void;\n className?: string;\n}\n\nconst EMPTY_ENVELOPES: CoordEnvelope[] = [];\n\nconst DEFAULT_PEERS: AgentPeer[] = [\n {\n id: \"agy\",\n name: \"Antigravity Core\",\n role: \"Integrator & UI / Rust Lead\",\n status: \"busy\",\n version: \"2.0.0\",\n skills: [\"m3-ui\", \"rust-serial\", \"bun-native\", \"a2a-coord\"],\n activeClaim: \".coord/claims/native-integration.json\",\n },\n {\n id: \"codex\",\n name: \"Codex Peer\",\n role: \"Backend & Systems Worker\",\n status: \"busy\",\n version: \"1.4.0\",\n skills: [\"native-wiring\", \"wsl-probe\", \"kernel-ffi\"],\n },\n {\n id: \"claude\",\n name: \"Claude Peer\",\n role: \"Architecture & Verification\",\n status: \"idle\",\n version: \"3.7.0\",\n skills: [\"design-tokens\", \"docs-audit\", \"review\"],\n },\n];\n\nconst KIND_COLORS: Record<EnvelopeKind, { bg: string; text: string; border: string }> = {\n ask: {\n bg: \"bg-[var(--md-sys-color-primary-container,#eaddff)]\",\n text: \"text-[var(--md-sys-color-on-primary-container,#21005d)]\",\n border: \"border-[var(--md-sys-color-primary,#6750a4)]\",\n },\n fact: {\n bg: \"bg-[var(--md-sys-color-tertiary-container,#ffd8e4)]\",\n text: \"text-[var(--md-sys-color-on-tertiary-container,#31111d)]\",\n border: \"border-[var(--md-sys-color-tertiary,#7d5260)]\",\n },\n ack: {\n bg: \"bg-[var(--md-sys-color-secondary-container,#e8def8)]\",\n text: \"text-[var(--md-sys-color-on-secondary-container,#1d192b)]\",\n border: \"border-[var(--md-sys-color-secondary,#625b71)]\",\n },\n ping: {\n bg: \"bg-[var(--md-sys-color-surface-container-high,#ece6f0)]\",\n text: \"text-[var(--md-sys-color-on-surface-variant,#49454f)]\",\n border: \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n },\n error: {\n bg: \"bg-[var(--md-sys-color-error-container,#f9dedc)]\",\n text: \"text-[var(--md-sys-color-on-error-container,#410e0b)]\",\n border: \"border-[var(--md-sys-color-error,#b3261e)]\",\n },\n};\n\nexport const A2APeerInspector: React.FC<A2APeerInspectorProps> = ({\n peers = DEFAULT_PEERS,\n envelopes = EMPTY_ENVELOPES,\n selectedPeerId: controlledPeerId,\n onSelectPeer,\n onSendEnvelope,\n className,\n}) => {\n const [internalSelectedPeerId, setInternalSelectedPeerId] = useState<string>(\n peers[0]?.id || \"agy\",\n );\n const selectedPeerId = controlledPeerId ?? internalSelectedPeerId;\n\n // Form state for composing envelope\n const [composeTopic, setComposeTopic] = useState(\"\");\n const [composeBody, setComposeBody] = useState(\"\");\n const [composeKind, setComposeKind] = useState<EnvelopeKind>(\"ask\");\n\n const currentPeer = peers.find((p) => p.id === selectedPeerId) || peers[0];\n\n const handleSelect = (peerId: string) => {\n setInternalSelectedPeerId(peerId);\n onSelectPeer?.(peerId);\n };\n\n const handleSend = (e: React.FormEvent) => {\n e.preventDefault();\n if (!composeTopic.trim() || !composeBody.trim()) return;\n\n onSendEnvelope?.({\n from: \"agy\",\n to: selectedPeerId,\n kind: composeKind,\n topic: composeTopic.trim(),\n body: composeBody.trim(),\n });\n\n setComposeTopic(\"\");\n setComposeBody(\"\");\n };\n\n const filteredEnvelopes = envelopes.filter(\n (env) => env.from === selectedPeerId || env.to === selectedPeerId || env.to === \"fleet\",\n );\n\n return (\n <div\n className={clsx(\n \"flex flex-col gap-4 rounded-3xl p-5 border\",\n \"bg-[var(--md-sys-color-surface-container-lowest,#ffffff)]\",\n \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n \"text-[var(--md-sys-color-on-surface,#1d1b20)]\",\n className,\n )}\n >\n {/* Header & Peer Chips */}\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"material-symbols-outlined text-xl text-[var(--md-sys-color-primary,#6750a4)]\">\n hub\n </span>\n <h2 className=\"text-base font-semibold tracking-tight\">A2A Fleet Coordinator</h2>\n <span className=\"rounded-full bg-[var(--md-sys-color-surface-container-high,#ece6f0)] px-2 py-0.5 text-xs font-mono text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n v1.0 (JSONL + RPC)\n </span>\n </div>\n <span className=\"text-xs text-[var(--md-sys-color-outline,#79747e)]\">\n {peers.length} active peers\n </span>\n </div>\n\n {/* Peer selection chips */}\n <div className=\"flex items-center gap-2 overflow-x-auto pb-1\">\n {peers.map((peer) => {\n const isSelected = peer.id === selectedPeerId;\n return (\n <button\n key={peer.id}\n type=\"button\"\n onClick={() => handleSelect(peer.id)}\n className={clsx(\n \"flex items-center gap-2 rounded-full px-3.5 py-1.5 text-xs font-medium transition-colors shrink-0\",\n isSelected\n ? \"bg-[var(--md-sys-color-secondary-container,#e8def8)] text-[var(--md-sys-color-on-secondary-container,#1d192b)] shadow-sm\"\n : \"bg-[var(--md-sys-color-surface-container,#f3edf7)] text-[var(--md-sys-color-on-surface-variant,#49454f)] hover:bg-[var(--md-sys-color-surface-container-high,#ece6f0)]\",\n )}\n >\n <span\n className={clsx(\n \"h-2 w-2 rounded-full\",\n peer.status === \"busy\"\n ? \"bg-amber-500 animate-pulse\"\n : peer.status === \"idle\"\n ? \"bg-emerald-500\"\n : \"bg-slate-400\",\n )}\n />\n <span>{peer.name}</span>\n <span className=\"text-[10px] opacity-60\">@{peer.id}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Selected Peer Details Card */}\n {currentPeer && (\n <div className=\"flex flex-col gap-2 rounded-2xl bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] p-4 border border-[var(--md-sys-color-outline-variant,#cac4d0)]/50\">\n <div className=\"flex items-start justify-between\">\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-sm\">{currentPeer.name}</span>\n <span className=\"text-xs text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n ({currentPeer.role})\n </span>\n </div>\n <div className=\"text-xs text-[var(--md-sys-color-outline,#79747e)] mt-0.5\">\n Peer ID: <code className=\"font-mono text-xs\">{currentPeer.id}</code> · Version:{\" \"}\n {currentPeer.version || \"1.0.0\"}\n </div>\n </div>\n {currentPeer.activeClaim && (\n <div className=\"flex items-center gap-1.5 rounded-lg bg-amber-500/10 px-2 py-1 text-xs text-amber-700 dark:text-amber-400 border border-amber-500/20\">\n <span className=\"material-symbols-outlined text-sm\">lock</span>\n <span className=\"font-mono text-[11px]\">{currentPeer.activeClaim}</span>\n </div>\n )}\n </div>\n\n {currentPeer.skills && currentPeer.skills.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5 mt-1\">\n {currentPeer.skills.map((skill) => (\n <span\n key={skill}\n className=\"rounded-md bg-[var(--md-sys-color-surface-container-highest,#e6e0e9)] px-2 py-0.5 text-[11px] font-mono text-[var(--md-sys-color-on-surface-variant,#49454f)]\"\n >\n #{skill}\n </span>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Envelope Stream Section */}\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-xs font-semibold uppercase tracking-wider text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n Coordination Envelopes ({filteredEnvelopes.length})\n </h3>\n <span className=\"text-[11px] text-[var(--md-sys-color-outline,#79747e)]\">\n .coord/inbox & .coord/outbox\n </span>\n </div>\n\n {filteredEnvelopes.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center p-6 rounded-2xl bg-[var(--md-sys-color-surface-container-lowest,#ffffff)] border border-dashed border-[var(--md-sys-color-outline-variant,#cac4d0)] text-xs text-[var(--md-sys-color-outline,#79747e)]\">\n <span className=\"material-symbols-outlined text-2xl mb-1 opacity-50\">\n mark_email_read\n </span>\n No pending envelopes for @{selectedPeerId}. Fleet mailbox is synchronized.\n </div>\n ) : (\n <div className=\"flex flex-col gap-2 max-h-60 overflow-y-auto pr-1\">\n {filteredEnvelopes.map((env) => {\n const kind = (env.kind in KIND_COLORS ? env.kind : \"ping\") as EnvelopeKind;\n const style = KIND_COLORS[kind];\n\n return (\n <div\n key={env.id}\n className={clsx(\n \"flex flex-col gap-1.5 rounded-xl p-3 border text-xs transition-shadow\",\n \"bg-[var(--md-sys-color-surface-container-low,#f7f2fa)]\",\n style.border,\n )}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span\n className={clsx(\n \"rounded-md px-1.5 py-0.5 text-[10px] font-bold uppercase\",\n style.bg,\n style.text,\n )}\n >\n {env.kind}\n </span>\n <span className=\"font-semibold\">{env.topic}</span>\n </div>\n <span className=\"text-[10px] font-mono text-[var(--md-sys-color-outline,#79747e)]\">\n {env.from} → {env.to || \"all\"}\n </span>\n </div>\n\n <p className=\"line-clamp-2 text-xs text-[var(--md-sys-color-on-surface-variant,#49454f)] font-mono whitespace-pre-wrap\">\n {env.body}\n </p>\n\n <div className=\"flex items-center justify-between pt-1 border-t border-[var(--md-sys-color-outline-variant,#cac4d0)]/30 text-[10px] text-[var(--md-sys-color-outline,#79747e)] font-mono\">\n <span>id: {env.id}</span>\n {env.re && <span>re: {env.re}</span>}\n <span>{new Date(env.ts).toLocaleTimeString()}</span>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Compose Form */}\n <form\n onSubmit={handleSend}\n className=\"flex flex-col gap-2.5 pt-2 border-t border-[var(--md-sys-color-outline-variant,#cac4d0)]/50\"\n >\n <div className=\"flex items-center gap-2\">\n <select\n value={composeKind}\n onChange={(e) => setComposeKind(e.target.value as EnvelopeKind)}\n className=\"rounded-xl border border-[var(--md-sys-color-outline-variant,#cac4d0)] bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] px-2.5 py-1.5 text-xs font-medium text-[var(--md-sys-color-on-surface,#1d1b20)] focus:outline-none focus:ring-1 focus:ring-[var(--md-sys-color-primary,#6750a4)]\"\n >\n <option value=\"ask\">ASK</option>\n <option value=\"fact\">FACT</option>\n <option value=\"ack\">ACK</option>\n <option value=\"ping\">PING</option>\n <option value=\"error\">ERROR</option>\n </select>\n\n <input\n type=\"text\"\n placeholder=\"Topic (e.g. work, claim-check, verification)...\"\n value={composeTopic}\n onChange={(e) => setComposeTopic(e.target.value)}\n className=\"flex-1 rounded-xl border border-[var(--md-sys-color-outline-variant,#cac4d0)] bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] px-3 py-1.5 text-xs text-[var(--md-sys-color-on-surface,#1d1b20)] placeholder-[var(--md-sys-color-outline,#79747e)] focus:outline-none focus:ring-1 focus:ring-[var(--md-sys-color-primary,#6750a4)]\"\n />\n </div>\n\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n placeholder={`Message body to @${selectedPeerId}...`}\n value={composeBody}\n onChange={(e) => setComposeBody(e.target.value)}\n className=\"flex-1 rounded-xl border border-[var(--md-sys-color-outline-variant,#cac4d0)] bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] px-3 py-1.5 text-xs text-[var(--md-sys-color-on-surface,#1d1b20)] placeholder-[var(--md-sys-color-outline,#79747e)] focus:outline-none focus:ring-1 focus:ring-[var(--md-sys-color-primary,#6750a4)]\"\n />\n\n <button\n type=\"submit\"\n disabled={!composeTopic.trim() || !composeBody.trim()}\n className={clsx(\n \"flex items-center gap-1.5 rounded-xl px-4 py-1.5 text-xs font-semibold transition-all\",\n composeTopic.trim() && composeBody.trim()\n ? \"bg-[var(--md-sys-color-primary,#6750a4)] text-[var(--md-sys-color-on-primary,#ffffff)] hover:opacity-90 shadow-sm\"\n : \"bg-[var(--md-sys-color-surface-container-high,#ece6f0)] text-[var(--md-sys-color-outline,#79747e)] cursor-not-allowed\",\n )}\n >\n <span>Dispatch</span>\n <span className=\"material-symbols-outlined text-sm\">send</span>\n </button>\n </div>\n </form>\n </div>\n );\n};\n",
29
+ "// SPDX-License-Identifier: Apache-2.0\n/**\n * @aphrody/m3-ai - A2ATaskTimeline\n *\n * Material Design 3 Agent-to-Agent Delegation Timeline:\n * - Chronological trace of task handoffs between agents (e.g., user -> agycli -> codex -> claude -> rag).\n * - Displays delegation phase, envelope kind, file claims, and execution status.\n */\n\nimport React, { useId, useState } from \"react\";\nimport { clsx } from \"clsx\";\nimport type { CoordEnvelope } from \"./AgUiEventStream\";\n\nexport interface TimelineStep {\n id: string;\n from: string;\n to: string;\n title: string;\n description?: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\";\n timestamp: string;\n envelope?: Partial<CoordEnvelope>;\n claim?: string;\n}\n\nexport interface A2ATaskTimelineProps {\n steps?: TimelineStep[];\n currentStepId?: string;\n onSelectStep?: (step: TimelineStep) => void;\n className?: string;\n}\n\nconst DEFAULT_TIMELINE_STEPS: TimelineStep[] = [\n {\n id: \"step-agy-lead\",\n from: \"user\",\n to: \"agy\",\n title: \"Lead Coordination & Monorepo Integration\",\n status: \"completed\",\n timestamp: \"Live\",\n description: \"Coordination active via .coord mailbox and OS resource claims.\",\n },\n {\n id: \"step-workers\",\n from: \"agy\",\n to: \"codex\",\n title: \"Subagent / Peer Parallel Tasks\",\n status: \"running\",\n timestamp: \"Ongoing\",\n description: \"Workers executing disjoint task families under cooperatively acquired locks.\",\n },\n];\n\nexport const A2ATaskTimeline: React.FC<A2ATaskTimelineProps> = ({\n steps = DEFAULT_TIMELINE_STEPS,\n currentStepId,\n onSelectStep,\n className,\n}) => {\n const [expandedStepId, setExpandedStepId] = useState<string | null>(null);\n const timelineId = useId();\n\n const toggleExpand = (id: string) => {\n setExpandedStepId((current) => (current === id ? null : id));\n };\n\n return (\n <div\n className={clsx(\n \"flex flex-col gap-3 rounded-3xl p-5 border\",\n \"bg-[var(--md-sys-color-surface-container-lowest,#ffffff)]\",\n \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n \"text-[var(--md-sys-color-on-surface,#1d1b20)]\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between border-b border-[var(--md-sys-color-outline-variant,#cac4d0)]/40 pb-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"material-symbols-outlined text-lg text-[var(--md-sys-color-primary,#6750a4)]\">\n timeline\n </span>\n <h3 className=\"text-sm font-semibold tracking-tight\">A2A Task Delegation Timeline</h3>\n </div>\n <span className=\"text-xs text-[var(--md-sys-color-outline,#79747e)]\">\n {steps.length} delegation steps\n </span>\n </div>\n\n <div className=\"relative flex flex-col gap-4 pl-4 pt-1\">\n {/* Continuous connector line */}\n <div className=\"absolute left-[27px] top-4 bottom-4 w-0.5 bg-[var(--md-sys-color-outline-variant,#cac4d0)]/60\" />\n\n {steps.map((step) => {\n const isCurrent = step.id === currentStepId;\n const isExpanded = step.id === expandedStepId;\n const detailsId = `${timelineId}-${encodeURIComponent(step.id)}`;\n const date = new Date(step.timestamp);\n const time = Number.isNaN(date.getTime()) ? step.timestamp : date.toLocaleTimeString();\n\n const statusIcon =\n step.status === \"completed\"\n ? \"check_circle\"\n : step.status === \"running\"\n ? \"sync\"\n : step.status === \"error\"\n ? \"error\"\n : \"radio_button_unchecked\";\n\n const statusColor =\n step.status === \"completed\"\n ? \"text-emerald-500\"\n : step.status === \"running\"\n ? \"text-[var(--md-sys-color-primary,#6750a4)] animate-spin motion-reduce:animate-none\"\n : step.status === \"error\"\n ? \"text-rose-500\"\n : \"text-slate-400\";\n\n return (\n <div\n key={step.id}\n className={clsx(\n \"relative flex items-start gap-3 transition-all\",\n isCurrent && \"font-medium\",\n )}\n >\n {/* Step indicator node */}\n <div\n className={clsx(\n \"relative z-10 flex h-7 w-7 items-center justify-center rounded-full border-2 bg-[var(--md-sys-color-surface-container-lowest,#ffffff)]\",\n step.status === \"completed\"\n ? \"border-emerald-500\"\n : step.status === \"running\"\n ? \"border-[var(--md-sys-color-primary,#6750a4)] ring-4 ring-[var(--md-sys-color-primary,#6750a4)]/20\"\n : step.status === \"error\"\n ? \"border-rose-500\"\n : \"border-[var(--md-sys-color-outline-variant,#cac4d0)]\",\n )}\n >\n <span className={clsx(\"material-symbols-outlined text-sm\", statusColor)}>\n {statusIcon}\n </span>\n </div>\n\n {/* Step details card */}\n <div\n className={clsx(\n \"flex-1 cursor-pointer rounded-2xl border p-3 text-xs transition-all\",\n \"bg-[var(--md-sys-color-surface-container-low,#f7f2fa)] hover:bg-[var(--md-sys-color-surface-container,#f3edf7)]\",\n isCurrent\n ? \"border-[var(--md-sys-color-primary,#6750a4)] shadow-sm\"\n : \"border-[var(--md-sys-color-outline-variant,#cac4d0)]/60\",\n )}\n >\n <button\n type=\"button\"\n aria-expanded={step.envelope ? isExpanded : undefined}\n aria-controls={step.envelope ? detailsId : undefined}\n onClick={() => {\n toggleExpand(step.id);\n onSelectStep?.(step);\n }}\n className=\"block w-full rounded-medium text-left outline-none focus-visible:ring-2 focus-visible:ring-primary\"\n >\n <span className=\"flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-1.5\">\n <span className=\"font-semibold text-xs text-[var(--md-sys-color-on-surface,#1d1b20)]\">\n {step.title}\n </span>\n <span className=\"rounded-md bg-[var(--md-sys-color-surface-container-highest,#e6e0e9)] px-1.5 py-0.2 text-[10px] font-mono text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n @{step.from} → @{step.to}\n </span>\n </span>\n <span className=\"text-[10px] font-mono text-[var(--md-sys-color-outline,#79747e)]\">\n {time}\n </span>\n </span>\n\n {step.description && (\n <span className=\"mt-1 block text-xs text-[var(--md-sys-color-on-surface-variant,#49454f)]\">\n {step.description}\n </span>\n )}\n\n {step.claim && (\n <span className=\"mt-2 flex items-center gap-1.5 text-[11px] font-mono text-amber-700 dark:text-amber-400\">\n <span className=\"material-symbols-outlined text-xs\">lock</span>\n <span>claim: {step.claim}</span>\n </span>\n )}\n </button>\n\n {/* Expanded envelope payload view */}\n {step.envelope && (\n <div\n id={detailsId}\n hidden={!isExpanded}\n className=\"mt-2.5 pt-2 border-t border-[var(--md-sys-color-outline-variant,#cac4d0)]/40 font-mono text-[11px] text-[var(--md-sys-color-on-surface-variant,#49454f)]\"\n >\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"font-semibold\">Kind: {step.envelope.kind}</span>\n <span>·</span>\n <span>Topic: {step.envelope.topic}</span>\n </div>\n {step.envelope.body && (\n <pre className=\"rounded-lg bg-[var(--md-sys-color-surface-container-highest,#e6e0e9)]/50 p-2 overflow-x-auto whitespace-pre-wrap\">\n {step.envelope.body}\n </pre>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n",
30
+ "// SPDX-License-Identifier: Apache-2.0\n// Streaming client of an OpenAI-compatible `/v1/chat/completions` endpoint (llama-server,\n// vLLM, the Aphrody gateway...): SSE framing, chunk decoding, tool-call accumulation, a pure\n// reducer for the conversation state, and typed errors that tell \"model unavailable\" apart.\n// Pure module: no React, no DOM; `fetch` is injectable.\n\nimport type { Citation } from \"./citations\";\n\nexport type ChatRole = \"system\" | \"user\" | \"assistant\" | \"tool\";\n\n/** One complete tool call, as OpenAI returns it once every delta is merged. */\nexport interface OpenAIToolCall {\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n}\n\n/** One message of the conversation, in the shape the chat components render. */\nexport interface ChatMessage {\n id: string;\n role: ChatRole;\n content: string;\n /** `reasoning_content` deltas (reasoning models), kept apart from the answer. */\n reasoning?: string;\n toolCalls?: OpenAIToolCall[];\n /** For a `tool` message: the call it answers. */\n toolCallId?: string;\n finishReason?: string | null;\n /** Grounded answer: the numbered passages `[n]` the text refers to. */\n citations?: Citation[];\n /** The backend refused to answer (out of the sources' scope). */\n refusal?: boolean;\n}\n\n/** What one SSE chunk contributes. */\nexport type ChatStreamEvent =\n | { type: \"content\"; text: string }\n | { type: \"reasoning\"; text: string }\n | {\n type: \"tool_call_delta\";\n index: number;\n id?: string;\n name?: string;\n arguments?: string;\n }\n | { type: \"citations\"; citations: Citation[] }\n | { type: \"refusal\"; text?: string }\n | { type: \"finish\"; reason: string }\n | { type: \"done\" };\n\nexport type ChatStreamErrorKind = \"network\" | \"http\" | \"aborted\" | \"parse\" | \"stream\";\n\n/** Typed failure of a chat request. `unavailable` marks a model that cannot answer right now. */\nexport class ChatStreamError extends Error {\n readonly kind: ChatStreamErrorKind;\n readonly status?: number;\n readonly unavailable: boolean;\n\n constructor(\n kind: ChatStreamErrorKind,\n message: string,\n options: { status?: number; cause?: unknown } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"ChatStreamError\";\n this.kind = kind;\n this.status = options.status;\n this.unavailable = kind === \"network\" || isUnavailableStatus(options.status);\n }\n}\n\n/** HTTP statuses that mean \"no model to answer\" rather than \"bad request\". */\nexport function isUnavailableStatus(status: number | undefined): boolean {\n return status === 404 || status === 502 || status === 503 || status === 504;\n}\n\n/**\n * Incremental SSE parser: feed it decoded text in arbitrary pieces, it calls `onData` with the\n * payload of every complete event (multi-line `data:` fields joined by `\\n`). Comments and\n * other fields are ignored.\n */\nexport function createSseParser(onData: (data: string) => void): {\n push(chunk: string): void;\n flush(): void;\n} {\n let buffer = \"\";\n let data: string[] = [];\n const dispatch = () => {\n if (data.length > 0) onData(data.join(\"\\n\"));\n data = [];\n };\n const line = (raw: string) => {\n const text = raw.endsWith(\"\\r\") ? raw.slice(0, -1) : raw;\n if (text === \"\") return dispatch();\n if (text.startsWith(\":\")) return;\n const colon = text.indexOf(\":\");\n const field = colon === -1 ? text : text.slice(0, colon);\n let value = colon === -1 ? \"\" : text.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n if (field === \"data\") data.push(value);\n };\n return {\n push(chunk) {\n buffer += chunk;\n let newline = buffer.indexOf(\"\\n\");\n while (newline !== -1) {\n line(buffer.slice(0, newline));\n buffer = buffer.slice(newline + 1);\n newline = buffer.indexOf(\"\\n\");\n }\n },\n flush() {\n if (buffer.length > 0) line(buffer);\n buffer = \"\";\n dispatch();\n },\n };\n}\n\ninterface RawChunk {\n choices?: {\n delta?: {\n content?: string | null;\n reasoning_content?: string | null;\n refusal?: string | null;\n tool_calls?: {\n index?: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }[];\n };\n finish_reason?: string | null;\n }[];\n citations?: Citation[];\n refusal?: boolean;\n error?: { message?: string } | string;\n}\n\n/**\n * Decode one `data:` payload of a chat-completions stream into events. `[DONE]` yields `done`.\n * A payload carrying `error` throws a `stream` error; malformed JSON throws a `parse` error.\n * Top-level `citations` / `refusal: true` (grounded backends such as Shenron) are passed on.\n */\nexport function parseChatCompletionChunk(payload: string): ChatStreamEvent[] {\n const trimmed = payload.trim();\n if (trimmed === \"\") return [];\n if (trimmed === \"[DONE]\") return [{ type: \"done\" }];\n let chunk: RawChunk;\n try {\n chunk = JSON.parse(trimmed) as RawChunk;\n } catch (cause) {\n throw new ChatStreamError(\"parse\", \"invalid chat-completions chunk\", { cause });\n }\n if (chunk.error) {\n const message = typeof chunk.error === \"string\" ? chunk.error : chunk.error.message;\n throw new ChatStreamError(\"stream\", message || \"stream error\");\n }\n const events: ChatStreamEvent[] = [];\n for (const choice of chunk.choices ?? []) {\n const delta = choice.delta;\n if (delta?.reasoning_content) events.push({ type: \"reasoning\", text: delta.reasoning_content });\n if (delta?.content) events.push({ type: \"content\", text: delta.content });\n if (delta?.refusal) events.push({ type: \"refusal\", text: delta.refusal });\n for (const call of delta?.tool_calls ?? []) {\n events.push({\n type: \"tool_call_delta\",\n index: call.index ?? 0,\n id: call.id,\n name: call.function?.name,\n arguments: call.function?.arguments,\n });\n }\n if (choice.finish_reason) events.push({ type: \"finish\", reason: choice.finish_reason });\n }\n if (Array.isArray(chunk.citations))\n events.push({ type: \"citations\", citations: chunk.citations });\n if (chunk.refusal === true) events.push({ type: \"refusal\" });\n return events;\n}\n\n/** Merge a tool-call delta into the calls accumulated so far (returns a new array). */\nexport function accumulateToolCall(\n calls: readonly OpenAIToolCall[],\n delta: Extract<ChatStreamEvent, { type: \"tool_call_delta\" }>,\n): OpenAIToolCall[] {\n const next = calls.slice();\n const current = next[delta.index] ?? {\n id: \"\",\n type: \"function\" as const,\n function: { name: \"\", arguments: \"\" },\n };\n next[delta.index] = {\n id: delta.id ?? current.id,\n type: \"function\",\n function: {\n name: current.function.name + (delta.name ?? \"\"),\n arguments: current.function.arguments + (delta.arguments ?? \"\"),\n },\n };\n return next;\n}\n\n/** The request body messages, in the OpenAI wire shape. */\nexport function toOpenAIMessages(messages: readonly ChatMessage[]): Record<string, unknown>[] {\n return messages.map((message) => {\n const wire: Record<string, unknown> = { role: message.role, content: message.content };\n if (message.toolCalls?.length) wire.tool_calls = message.toolCalls;\n if (message.toolCallId) wire.tool_call_id = message.toolCallId;\n return wire;\n });\n}\n\nexport interface StreamChatOptions {\n /** API root including `/v1` (e.g. `http://127.0.0.1:8080/v1`). */\n baseUrl: string;\n model?: string;\n messages: readonly ChatMessage[];\n /** Extra body fields (`temperature`, `tools`, `max_tokens`...). */\n body?: Record<string, unknown>;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n fetch?: typeof fetch;\n}\n\n/** `<baseUrl>/chat/completions`, tolerant of a trailing slash. */\nexport function chatCompletionsUrl(baseUrl: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}/chat/completions`;\n}\n\n/**\n * POST a streaming chat completion and yield its events until `[DONE]` or the end of the body.\n *\n * Throws `ChatStreamError`: `network` (fetch rejected: server down), `http` (non-2xx status;\n * `unavailable` for 404/502/503/504), `aborted` (the signal fired), `parse` / `stream`.\n */\nexport async function* streamChatCompletion(\n options: StreamChatOptions,\n): AsyncGenerator<ChatStreamEvent, void, undefined> {\n const doFetch = options.fetch ?? globalThis.fetch;\n let response: Response;\n try {\n response = await doFetch(chatCompletionsUrl(options.baseUrl), {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n ...options.headers,\n },\n body: JSON.stringify({\n ...options.body,\n ...(options.model ? { model: options.model } : {}),\n messages: toOpenAIMessages(options.messages),\n stream: true,\n }),\n signal: options.signal,\n });\n } catch (cause) {\n if (options.signal?.aborted) throw new ChatStreamError(\"aborted\", \"request aborted\", { cause });\n throw new ChatStreamError(\"network\", \"chat endpoint unreachable\", { cause });\n }\n if (!response.ok) {\n let detail = \"\";\n try {\n detail = (await response.text()).slice(0, 500);\n } catch {\n // body unreadable: the status alone is reported\n }\n throw new ChatStreamError(\"http\", detail || `HTTP ${response.status}`, {\n status: response.status,\n });\n }\n if (!response.body) throw new ChatStreamError(\"stream\", \"response has no body\");\n\n const queue: string[] = [];\n const parser = createSseParser((data) => queue.push(data));\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n try {\n for (;;) {\n let result: Awaited<ReturnType<typeof reader.read>>;\n try {\n // oxlint-disable-next-line no-await-in-loop -- SSE chunks are read in order, one at a time.\n result = await reader.read();\n } catch (cause) {\n if (options.signal?.aborted)\n throw new ChatStreamError(\"aborted\", \"request aborted\", { cause });\n throw new ChatStreamError(\"stream\", \"stream interrupted\", { cause });\n }\n if (result.done) {\n parser.push(decoder.decode());\n parser.flush();\n } else {\n parser.push(decoder.decode(result.value, { stream: true }));\n }\n while (queue.length > 0) {\n for (const event of parseChatCompletionChunk(queue.shift()!)) {\n yield event;\n if (event.type === \"done\") return;\n }\n }\n if (result.done) return;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Conversation state ─────────────────────────────────────────────────────────────────────\n\nexport type ChatStatus = \"idle\" | \"streaming\" | \"error\" | \"unavailable\";\n\nexport interface ChatState {\n messages: ChatMessage[];\n status: ChatStatus;\n error: ChatStreamError | null;\n}\n\nexport type ChatAction =\n | { type: \"start\"; user: ChatMessage; assistantId: string }\n | { type: \"event\"; assistantId: string; event: ChatStreamEvent }\n | { type: \"finish\" }\n | { type: \"fail\"; error: ChatStreamError }\n | { type: \"stop\" }\n | { type: \"reset\"; messages?: ChatMessage[] }\n | { type: \"set\"; messages: ChatMessage[] };\n\nexport function initialChatState(messages: ChatMessage[] = []): ChatState {\n return { messages, status: \"idle\", error: null };\n}\n\nfunction applyEvent(message: ChatMessage, event: ChatStreamEvent): ChatMessage {\n switch (event.type) {\n case \"content\":\n return { ...message, content: message.content + event.text };\n case \"reasoning\":\n return { ...message, reasoning: (message.reasoning ?? \"\") + event.text };\n case \"tool_call_delta\":\n return { ...message, toolCalls: accumulateToolCall(message.toolCalls ?? [], event) };\n case \"citations\":\n return { ...message, citations: event.citations };\n case \"refusal\":\n return { ...message, refusal: true };\n case \"finish\":\n return { ...message, finishReason: event.reason };\n case \"done\":\n return message;\n }\n}\n\n/** Pure reducer of a streamed conversation (the state behind `useOpenAIChat`). */\nexport function chatReducer(state: ChatState, action: ChatAction): ChatState {\n switch (action.type) {\n case \"start\":\n return {\n status: \"streaming\",\n error: null,\n messages: [\n ...state.messages,\n action.user,\n { id: action.assistantId, role: \"assistant\", content: \"\" },\n ],\n };\n case \"event\":\n return {\n ...state,\n messages: state.messages.map((message) =>\n message.id === action.assistantId ? applyEvent(message, action.event) : message,\n ),\n };\n case \"finish\":\n case \"stop\":\n return { ...state, status: \"idle\" };\n case \"fail\": {\n // An empty assistant turn left by a failed request is dropped.\n const last = state.messages.at(-1);\n const messages =\n last && last.role === \"assistant\" && !last.content && !last.toolCalls?.length\n ? state.messages.slice(0, -1)\n : state.messages;\n return {\n messages,\n status: action.error.unavailable ? \"unavailable\" : \"error\",\n error: action.error,\n };\n }\n case \"reset\":\n return initialChatState(action.messages ?? []);\n case \"set\":\n return { ...state, messages: action.messages };\n }\n}\n\nlet counter = 0;\n/** Message id: `crypto.randomUUID` when present, else a process-local counter. */\nexport function newMessageId(): string {\n const uuid = globalThis.crypto?.randomUUID?.();\n if (uuid) return uuid;\n counter += 1;\n return `msg-${Date.now().toString(36)}-${counter}`;\n}\n",
31
+ "// SPDX-License-Identifier: Apache-2.0\n// React hook over `streamChatCompletion`: one conversation streamed from an OpenAI-compatible\n// endpoint, with stop, reset and the `unavailable` status of a model that cannot answer.\n\n\"use client\";\n\nimport { useCallback, useEffect, useReducer, useRef } from \"react\";\n\nimport {\n type ChatMessage,\n type ChatStatus,\n ChatStreamError,\n chatReducer,\n initialChatState,\n newMessageId,\n streamChatCompletion,\n} from \"./openaiChatStream\";\n\nexport interface UseOpenAIChatOptions {\n /** API root including `/v1` (e.g. `http://127.0.0.1:8080/v1`). */\n baseUrl: string;\n model?: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n initialMessages?: ChatMessage[];\n /** Messages sent before the conversation on every request (system prompt...). */\n preamble?: ChatMessage[];\n /** Extra body fields (`temperature`, `tools`...). */\n body?: Record<string, unknown>;\n /** Called with the finished assistant message. */\n onFinish?: (message: ChatMessage) => void;\n onError?: (error: ChatStreamError) => void;\n}\n\nexport interface UseOpenAIChatResult {\n messages: ChatMessage[];\n status: ChatStatus;\n error: ChatStreamError | null;\n /** Send a user message and stream the answer. Ignored while streaming. */\n send: (content: string) => Promise<void>;\n /** Abort the running request; the partial answer stays. */\n stop: () => void;\n /** Abort and clear (or replace) the conversation. */\n reset: (messages?: ChatMessage[]) => void;\n setMessages: (messages: ChatMessage[]) => void;\n}\n\nexport function useOpenAIChat(options: UseOpenAIChatOptions): UseOpenAIChatResult {\n const [state, dispatch] = useReducer(chatReducer, options.initialMessages, initialChatState);\n const controller = useRef<AbortController | null>(null);\n const latest = useRef({ options, state });\n\n useEffect(() => {\n latest.current = { options, state };\n });\n useEffect(() => () => controller.current?.abort(), []);\n\n const send = useCallback(async (content: string) => {\n const { options: o, state: s } = latest.current;\n if (s.status === \"streaming\" || controller.current || !content.trim()) return;\n const user: ChatMessage = { id: newMessageId(), role: \"user\", content };\n const assistantId = newMessageId();\n const abort = new AbortController();\n controller.current = abort;\n dispatch({ type: \"start\", user, assistantId });\n let assistant: ChatMessage = { id: assistantId, role: \"assistant\", content: \"\" };\n try {\n for await (const event of streamChatCompletion({\n baseUrl: o.baseUrl,\n model: o.model,\n messages: [...(o.preamble ?? []), ...s.messages, user],\n body: o.body,\n headers: o.headers,\n fetch: o.fetch,\n signal: abort.signal,\n })) {\n dispatch({ type: \"event\", assistantId, event });\n assistant = chatReducer(\n { messages: [assistant], status: \"streaming\", error: null },\n { type: \"event\", assistantId, event },\n ).messages[0]!;\n }\n dispatch({ type: \"finish\" });\n o.onFinish?.(assistant);\n } catch (cause) {\n const error =\n cause instanceof ChatStreamError\n ? cause\n : new ChatStreamError(\"stream\", String(cause), { cause });\n if (error.kind === \"aborted\" || abort.signal.aborted) {\n dispatch({ type: \"stop\" });\n } else {\n dispatch({ type: \"fail\", error });\n o.onError?.(error);\n }\n } finally {\n if (controller.current === abort) controller.current = null;\n }\n }, []);\n\n const stop = useCallback(() => {\n controller.current?.abort();\n controller.current = null;\n dispatch({ type: \"stop\" });\n }, []);\n\n const reset = useCallback((messages?: ChatMessage[]) => {\n controller.current?.abort();\n controller.current = null;\n dispatch({ type: \"reset\", messages });\n }, []);\n\n const setMessages = useCallback((messages: ChatMessage[]) => {\n dispatch({ type: \"set\", messages });\n }, []);\n\n return {\n messages: state.messages,\n status: state.status,\n error: state.error,\n send,\n stop,\n reset,\n setMessages,\n };\n}\n",
32
+ "// SPDX-License-Identifier: Apache-2.0\n// Conversation list on the M3 navigation-drawer anatomy: a `surface-container-low` sheet, a\n// \"new conversation\" FAB-like tonal button, optional search, and 56 dp items whose active one\n// takes the `secondary-container` indicator.\n\n\"use client\";\n\nimport { CircleButton } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { useMemo, useState } from \"react\";\n\nimport { type ChatLabels, resolveChatLabels } from \"./chatLabels\";\nimport { ChatIcon } from \"./chatIcons\";\nimport { CircularIndicator, focusRing } from \"./internal\";\n\nexport interface ConversationSummary {\n id: string;\n title: string;\n /** ISO string, epoch milliseconds or Date. */\n updatedAt: string | number | Date;\n preview?: string;\n}\n\nexport interface ConversationListProps {\n conversations: readonly ConversationSummary[];\n selectedId?: string | null;\n onSelect: (id: string) => void;\n /** Shows the \"new conversation\" button. */\n onNew?: () => void;\n /** Shows a rename icon button on each item. */\n onRename?: (id: string) => void;\n /** Shows a delete icon button on each item. */\n onDelete?: (id: string) => void;\n /** Shows a search field that filters by title and preview. */\n searchable?: boolean;\n loading?: boolean;\n labels?: Partial<ChatLabels>;\n /** BCP 47 locale of the dates (`fr`, `en`, `ja`). */\n locale?: string;\n /** Overrides the date formatting. */\n formatDate?: (updatedAt: Date) => string;\n className?: string;\n}\n\nfunction toDate(value: string | number | Date): Date {\n return value instanceof Date ? value : new Date(value);\n}\n\nfunction isoDate(value: string | number | Date): string | undefined {\n const date = toDate(value);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\n/** Filter conversations by a case-insensitive query on title and preview. */\nexport function filterConversations(\n conversations: readonly ConversationSummary[],\n query: string,\n): ConversationSummary[] {\n const needle = query.trim().toLocaleLowerCase();\n if (!needle) return [...conversations];\n return conversations.filter((conversation) =>\n `${conversation.title}\\n${conversation.preview ?? \"\"}`.toLocaleLowerCase().includes(needle),\n );\n}\n\nexport function ConversationList({\n conversations,\n selectedId,\n onSelect,\n onNew,\n onRename,\n onDelete,\n searchable = false,\n loading = false,\n labels,\n locale,\n formatDate,\n className,\n}: ConversationListProps) {\n const l = resolveChatLabels(labels);\n const [query, setQuery] = useState(\"\");\n const visible = useMemo(() => filterConversations(conversations, query), [conversations, query]);\n const dateFormat = useMemo(\n () => new Intl.DateTimeFormat(locale, { dateStyle: \"short\" }),\n [locale],\n );\n const format = (value: string | number | Date) => {\n const date = toDate(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return formatDate ? formatDate(date) : dateFormat.format(date);\n };\n\n return (\n <nav\n aria-label={l.conversations}\n className={clsx(\n \"m3-conversation-list flex h-full min-h-0 flex-col gap-2 bg-surface-container-low px-3 py-3 text-on-surface\",\n className,\n )}\n >\n <div className=\"flex items-center justify-between gap-2 px-1\">\n <h2 className=\"m-0 text-title-small text-on-surface-variant\">{l.conversations}</h2>\n </div>\n {onNew ? (\n <button\n type=\"button\"\n onClick={onNew}\n className={clsx(\n \"flex h-14 items-center gap-3 rounded-large bg-primary-container px-4 text-label-large text-on-primary-container\",\n \"transition-colors duration-200 ease-standard hover:bg-primary-container/92\",\n focusRing,\n )}\n >\n <ChatIcon name=\"edit_square\" size={24} />\n <span>{l.newConversation}</span>\n </button>\n ) : null}\n {searchable ? (\n <label className=\"flex h-12 items-center gap-3 rounded-extra-large bg-surface-container-high px-4 focus-within:bg-surface-container-highest\">\n <ChatIcon name=\"search\" size={20} className=\"text-on-surface-variant\" />\n <input\n type=\"search\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n placeholder={l.searchConversations}\n aria-label={l.searchConversations}\n className=\"min-w-0 flex-1 border-0 bg-transparent text-body-large text-on-surface caret-primary outline-none placeholder:text-on-surface-variant\"\n />\n </label>\n ) : null}\n {loading ? (\n <div className=\"flex justify-center py-6\">\n <CircularIndicator size={24} label={l.loading} />\n </div>\n ) : visible.length === 0 ? (\n <p className=\"m-0 px-4 py-6 text-center text-body-medium text-on-surface-variant\">\n {query.trim() ? l.noSearchResults : l.noConversations}\n </p>\n ) : (\n <ul className=\"m-0 flex min-h-0 flex-1 list-none flex-col gap-0.5 overflow-y-auto p-0\">\n {visible.map((conversation) => {\n const active = conversation.id === selectedId;\n const title = conversation.title.trim() || l.untitledConversation;\n return (\n <li key={conversation.id} className=\"group relative\">\n <button\n type=\"button\"\n onClick={() => onSelect(conversation.id)}\n aria-current={active ? \"page\" : undefined}\n className={clsx(\n \"flex min-h-14 w-full flex-col justify-center rounded-extra-large px-4 py-2 text-left\",\n \"transition-colors duration-200 ease-standard\",\n active\n ? \"bg-secondary-container text-on-secondary-container\"\n : \"text-on-surface-variant hover:bg-on-surface/8\",\n (onRename || onDelete) && \"pr-24\",\n focusRing,\n \"focus-visible:outline-offset-[-3px]\",\n )}\n >\n <span className=\"flex w-full items-baseline gap-2\">\n <span className=\"min-w-0 flex-1 truncate text-label-large\">{title}</span>\n <time\n className=\"shrink-0 text-label-small opacity-80\"\n dateTime={isoDate(conversation.updatedAt)}\n >\n {format(conversation.updatedAt)}\n </time>\n </span>\n {conversation.preview ? (\n <span className=\"mt-0.5 w-full truncate text-body-small opacity-80\">\n {conversation.preview}\n </span>\n ) : null}\n </button>\n {onRename || onDelete ? (\n <span className=\"absolute top-1/2 right-2 flex -translate-y-1/2 gap-0.5 opacity-0 transition-opacity duration-200 ease-standard group-focus-within:opacity-100 group-hover:opacity-100\">\n {onRename ? (\n <CircleButton\n icon={<ChatIcon name=\"edit\" size={18} />}\n variant=\"standard\"\n size=\"sm\"\n onClick={() => onRename(conversation.id)}\n aria-label={`${l.renameConversation}: ${title}`}\n title={l.renameConversation}\n />\n ) : null}\n {onDelete ? (\n <CircleButton\n icon={<ChatIcon name=\"delete\" size={18} />}\n variant=\"standard\"\n size=\"sm\"\n onClick={() => onDelete(conversation.id)}\n aria-label={`${l.deleteConversation}: ${title}`}\n title={l.deleteConversation}\n />\n ) : null}\n </span>\n ) : null}\n </li>\n );\n })}\n </ul>\n )}\n </nav>\n );\n}\n",
33
+ "// SPDX-License-Identifier: Apache-2.0\n// \"Model unavailable\" state of a local chat: downloading, loading, or down, with an optional\n// determinate M3 linear progress indicator and a retry action.\n\n\"use client\";\n\nimport { clsx } from \"clsx\";\n\nimport { type ChatLabels, formatLabel, resolveChatLabels } from \"./chatLabels\";\nimport { ChatIcon } from \"./chatIcons\";\nimport { CircularIndicator, focusRing } from \"./internal\";\n\nexport type ModelAvailabilityPhase = \"downloading\" | \"loading\" | \"unavailable\";\n\nexport interface ModelUnavailableProps {\n phase?: ModelAvailabilityPhase;\n /** Why the model cannot answer (backend message, already localized by the caller). */\n reason?: string;\n /** Download or load progress, 0..1; omit for an indeterminate state. */\n progress?: number | null;\n onRetry?: () => void;\n labels?: Partial<ChatLabels>;\n className?: string;\n}\n\n/** Clamp a progress fraction to 0..1; non-finite values give `null` (indeterminate). */\nexport function clampProgress(progress: number | null | undefined): number | null {\n if (progress === null || progress === undefined || !Number.isFinite(progress)) return null;\n return Math.min(1, Math.max(0, progress));\n}\n\nexport function ModelUnavailable({\n phase = \"unavailable\",\n reason,\n progress,\n onRetry,\n labels,\n className,\n}: ModelUnavailableProps) {\n const l = resolveChatLabels(labels);\n const value = clampProgress(progress);\n const busy = phase !== \"unavailable\";\n const title =\n phase === \"downloading\"\n ? l.modelDownloading\n : phase === \"loading\"\n ? l.modelLoading\n : l.modelUnavailable;\n const percent = value === null ? null : Math.round(value * 100);\n\n return (\n <div\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- live region wrapping block content (title, progress, action); <output> only holds phrasing content.\n role=\"status\"\n aria-live=\"polite\"\n aria-busy={busy || undefined}\n className={clsx(\n \"m3-model-unavailable flex flex-col gap-3 rounded-large px-4 py-4\",\n busy\n ? \"bg-surface-container-high text-on-surface\"\n : \"bg-error-container text-on-error-container\",\n className,\n )}\n >\n <div className=\"flex items-start gap-3\">\n {busy ? (\n <CircularIndicator size={24} label={title} className=\"mt-0.5\" />\n ) : (\n <ChatIcon name=\"cloud_off\" size={24} className=\"mt-0.5\" />\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"m-0 text-title-medium\">{title}</p>\n {reason ? <p className=\"m-0 mt-1 text-body-medium opacity-90\">{reason}</p> : null}\n </div>\n {percent !== null ? (\n <span className=\"shrink-0 text-label-large\">\n {formatLabel(l.progressPercent, { percent })}\n </span>\n ) : null}\n </div>\n {busy && value !== null ? (\n <div\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role -- M3 linear determinate indicator with a track gap; a native <progress> cannot be styled to the spec.\n role=\"progressbar\"\n aria-label={title}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent ?? undefined}\n className=\"flex h-1 w-full items-center gap-1\"\n >\n <span\n className=\"h-1 rounded-full bg-primary transition-[width] duration-300 ease-standard\"\n style={{ width: `${(value * 100).toFixed(1)}%` }}\n />\n <span className=\"h-1 flex-1 rounded-full bg-secondary-container\" />\n </div>\n ) : null}\n {onRetry && !busy ? (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={onRetry}\n className={clsx(\n \"inline-flex h-10 items-center gap-2 rounded-full bg-error px-6 text-label-large text-on-error\",\n \"transition-colors duration-200 ease-standard hover:bg-error/92\",\n focusRing,\n )}\n >\n <ChatIcon name=\"refresh\" size={18} />\n <span>{l.retry}</span>\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n",
34
+ "// SPDX-License-Identifier: Apache-2.0\n// Memory panel: the agent's saved memories as an M3 list, with per-item deletion and a\n// \"clear all\" action guarded by an inline confirmation (or an injected one).\n\n\"use client\";\n\nimport { CircleButton } from \"@aphrody/m3-primitives\";\nimport { clsx } from \"clsx\";\nimport { useMemo, useState } from \"react\";\n\nimport { type ChatLabels, resolveChatLabels } from \"./chatLabels\";\nimport { ChatIcon } from \"./chatIcons\";\nimport { CircularIndicator, focusRing } from \"./internal\";\n\nexport interface MemoryItem {\n id: string;\n content: string;\n tags?: string[];\n /** ISO string, epoch milliseconds or Date. */\n createdAt: string | number | Date;\n}\n\nexport interface MemoryPanelProps {\n memories: readonly MemoryItem[];\n loading?: boolean;\n onDelete?: (id: string) => void;\n /** Shows \"clear all\". */\n onClear?: () => void;\n /**\n * Replaces the built-in inline confirmation of \"clear all\" (e.g. an app dialog):\n * resolve `true` to clear.\n */\n confirmClear?: () => boolean | Promise<boolean>;\n labels?: Partial<ChatLabels>;\n locale?: string;\n formatDate?: (createdAt: Date) => string;\n className?: string;\n}\n\nconst textButton = clsx(\n \"inline-flex h-10 items-center rounded-full px-3 text-label-large\",\n \"transition-colors duration-200 ease-standard\",\n focusRing,\n);\n\nexport function MemoryPanel({\n memories,\n loading = false,\n onDelete,\n onClear,\n confirmClear,\n labels,\n locale,\n formatDate,\n className,\n}: MemoryPanelProps) {\n const l = resolveChatLabels(labels);\n const [confirming, setConfirming] = useState(false);\n const dateFormat = useMemo(\n () => new Intl.DateTimeFormat(locale, { dateStyle: \"medium\" }),\n [locale],\n );\n const format = (value: string | number | Date) => {\n const date = value instanceof Date ? value : new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return formatDate ? formatDate(date) : dateFormat.format(date);\n };\n\n const requestClear = async () => {\n if (!onClear) return;\n if (confirmClear) {\n if (await confirmClear()) onClear();\n return;\n }\n setConfirming(true);\n };\n\n return (\n <section\n aria-label={l.memory}\n aria-busy={loading || undefined}\n className={clsx(\n \"m3-memory-panel flex min-h-0 flex-col gap-2 rounded-large bg-surface-container-low py-3 text-on-surface\",\n className,\n )}\n >\n <header className=\"flex items-center justify-between gap-2 px-4\">\n <h2 className=\"m-0 text-title-medium\">{l.memory}</h2>\n {onClear && memories.length > 0 && !confirming ? (\n <button\n type=\"button\"\n onClick={() => void requestClear()}\n className={clsx(textButton, \"text-error hover:bg-error/8\")}\n >\n {l.clearMemory}\n </button>\n ) : null}\n </header>\n {confirming ? (\n <div\n role=\"alertdialog\"\n aria-label={l.clearMemory}\n className=\"mx-4 flex flex-col gap-2 rounded-medium bg-error-container px-4 py-3 text-on-error-container\"\n >\n <p className=\"m-0 text-body-medium\">{l.clearMemoryConfirm}</p>\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setConfirming(false)}\n className={clsx(textButton, \"hover:bg-on-error-container/8\")}\n >\n {l.cancel}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n setConfirming(false);\n onClear?.();\n }}\n className={clsx(textButton, \"bg-error px-4 text-on-error hover:bg-error/92\")}\n >\n {l.confirm}\n </button>\n </div>\n </div>\n ) : null}\n {loading ? (\n <div className=\"flex justify-center py-6\">\n <CircularIndicator size={24} label={l.memoryLoading} />\n </div>\n ) : memories.length === 0 ? (\n <p className=\"m-0 px-4 py-6 text-center text-body-medium text-on-surface-variant\">\n {l.memoryEmpty}\n </p>\n ) : (\n <ul className=\"m-0 flex min-h-0 list-none flex-col overflow-y-auto p-0\">\n {memories.map((memory) => (\n <li\n key={memory.id}\n className=\"group flex items-start gap-3 px-4 py-2 transition-colors duration-200 ease-standard hover:bg-on-surface/8\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"m-0 text-body-medium break-words whitespace-pre-wrap text-on-surface\">\n {memory.content}\n </p>\n <div className=\"mt-1 flex flex-wrap items-center gap-1.5\">\n <time className=\"text-label-small text-on-surface-variant\">\n {format(memory.createdAt)}\n </time>\n {memory.tags?.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex h-6 items-center rounded-small border border-outline-variant px-2 text-label-small text-on-surface-variant\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n {onDelete ? (\n <CircleButton\n icon={<ChatIcon name=\"delete\" size={18} />}\n variant=\"standard\"\n size=\"sm\"\n onClick={() => onDelete(memory.id)}\n aria-label={l.deleteMemory}\n title={l.deleteMemory}\n />\n ) : null}\n </li>\n ))}\n </ul>\n )}\n </section>\n );\n}\n"
28
35
  ],
29
- "mappings": "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",
30
- "debugId": "92ED95EDB5C4988E64756E2164756E21",
36
+ "mappings": "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",
37
+ "debugId": "F6F1D6A7A43F22CE64756E2164756E21",
31
38
  "names": []
32
39
  }