@elabs-ai/components-ai 4.0.0 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/README.md +62 -12
  2. package/dist/{_audio-player-media-chrome-KA5DY54G.js → _audio-player-media-chrome-T3XVXWRZ.js} +8 -4
  3. package/dist/_audio-player-media-chrome-T3XVXWRZ.js.map +1 -0
  4. package/dist/{_flow-boundary-D63PJ65S.js → _flow-boundary-SHNWLQG5.js} +32 -43
  5. package/dist/_flow-boundary-SHNWLQG5.js.map +1 -0
  6. package/dist/{_persona-rive-RFR2EUWP.js → _persona-rive-JEG44YHX.js} +9 -5
  7. package/dist/_persona-rive-JEG44YHX.js.map +1 -0
  8. package/dist/index.d.ts +1152 -218
  9. package/dist/index.js +5601 -3241
  10. package/dist/index.js.map +1 -1
  11. package/package.json +30 -15
  12. package/src/__contract__/audio-visualizer.contract.test.tsx +49 -0
  13. package/src/__contract__/chat-shell.contract.test.tsx +49 -0
  14. package/src/__contract__/grouped-parts.contract.test.tsx +49 -0
  15. package/src/__contract__/image.contract.test.tsx +49 -0
  16. package/src/__contract__/markdown-view.contract.test.tsx +49 -0
  17. package/src/__contract__/message-feedback.contract.test.tsx +49 -0
  18. package/src/__contract__/message-form.contract.test.tsx +49 -0
  19. package/src/__contract__/message-table.contract.test.tsx +49 -0
  20. package/src/__contract__/model-provider-logo.contract.test.tsx +49 -0
  21. package/src/__contract__/persona.contract.test.tsx +49 -0
  22. package/src/__contract__/prompt-input-effort.contract.test.tsx +49 -0
  23. package/src/__contract__/prompt-input-mode.contract.test.tsx +49 -0
  24. package/src/_audio-player-media-chrome.tsx +102 -15
  25. package/src/_chat-shell-rail.tsx +2 -2
  26. package/src/_flow-boundary.tsx +68 -49
  27. package/src/_lazy-boundary-conformance.ts +38 -0
  28. package/src/_lazy-cjk.test.ts +43 -0
  29. package/src/_lazy-cjk.ts +73 -0
  30. package/src/_lazy-engine-boundary.tsx +61 -0
  31. package/src/_lazy-math.test.ts +63 -0
  32. package/src/_lazy-math.ts +90 -0
  33. package/src/_lazy-mermaid-absent.test.ts +53 -0
  34. package/src/_lazy-mermaid.test.ts +15 -0
  35. package/src/_lazy-mermaid.ts +24 -1
  36. package/src/_mermaid-error-panel.test.tsx +50 -0
  37. package/src/_mermaid-error-panel.tsx +66 -0
  38. package/src/_persona-rive.tsx +62 -10
  39. package/src/_streamdown-i18n.ts +94 -22
  40. package/src/_streamdown-safety.ts +170 -0
  41. package/src/_theme-scope-store.test.ts +83 -0
  42. package/src/_theme-scope-store.ts +103 -0
  43. package/src/agent-event.stories.tsx +97 -0
  44. package/src/agent-event.test.tsx +145 -0
  45. package/src/agent-event.tsx +187 -0
  46. package/src/agent-timeline.stories.tsx +9 -1
  47. package/src/agent.test.tsx +47 -0
  48. package/src/agent.tsx +43 -24
  49. package/src/agentic-workspace.stories.tsx +27 -20
  50. package/src/artifact.tsx +17 -14
  51. package/src/asset-preview.test.tsx +40 -0
  52. package/src/asset-preview.tsx +83 -12
  53. package/src/attachments.tsx +7 -4
  54. package/src/audio-player.test.tsx +78 -0
  55. package/src/audio-player.tsx +243 -56
  56. package/src/audio-visualizer.stories.tsx +126 -0
  57. package/src/audio-visualizer.test.tsx +438 -0
  58. package/src/audio-visualizer.tsx +367 -0
  59. package/src/canvas.stories.tsx +150 -1
  60. package/src/chat-shell.stories.tsx +18 -3
  61. package/src/chat.stories.tsx +16 -2
  62. package/src/code-block.stories.tsx +9 -1
  63. package/src/code-block.test.tsx +100 -1
  64. package/src/code-block.tsx +166 -103
  65. package/src/commit.tsx +30 -41
  66. package/src/composer.stories.tsx +372 -9
  67. package/src/composer.test.tsx +357 -6
  68. package/src/composer.tsx +217 -35
  69. package/src/confirmation.stories.tsx +72 -1
  70. package/src/confirmation.test.tsx +216 -2
  71. package/src/confirmation.tsx +264 -4
  72. package/src/context-panel.stories.tsx +9 -1
  73. package/src/context-panel.tsx +3 -2
  74. package/src/conversation.stories.tsx +86 -2
  75. package/src/conversation.test.tsx +66 -0
  76. package/src/conversation.tsx +52 -9
  77. package/src/diff-view.stories.tsx +196 -0
  78. package/src/diff-view.test.tsx +238 -0
  79. package/src/diff-view.tsx +697 -0
  80. package/src/environment-variables.tsx +20 -37
  81. package/src/file-tree.test.tsx +21 -0
  82. package/src/file-tree.tsx +12 -2
  83. package/src/gallery.tsx +4 -2
  84. package/src/index.ts +14 -4
  85. package/src/inline-citation.tsx +5 -5
  86. package/src/jsx-preview.stories.tsx +2 -2
  87. package/src/jsx-preview.tsx +151 -43
  88. package/src/markdown-view.stories.tsx +92 -1
  89. package/src/markdown-view.test.tsx +237 -2
  90. package/src/markdown-view.tsx +157 -6
  91. package/src/message-compare.stories.tsx +175 -0
  92. package/src/message-compare.test.tsx +207 -0
  93. package/src/message-compare.tsx +453 -0
  94. package/src/message-form.stories.tsx +65 -4
  95. package/src/message-form.test.tsx +8 -2
  96. package/src/message-form.tsx +15 -7
  97. package/src/message-table.stories.tsx +2 -2
  98. package/src/message-table.test.tsx +7 -0
  99. package/src/message-table.tsx +8 -4
  100. package/src/message.stories.tsx +9 -1
  101. package/src/message.test.tsx +247 -1
  102. package/src/message.tsx +125 -15
  103. package/src/microcopy.test.tsx +40 -0
  104. package/src/{model-selector.stories.tsx → model-provider-logo.stories.tsx} +17 -8
  105. package/src/model-provider-logo.test.tsx +109 -0
  106. package/src/model-provider-logo.tsx +183 -0
  107. package/src/open-in-chat.tsx +50 -29
  108. package/src/package-info.tsx +12 -12
  109. package/src/permission-mode-select.stories.tsx +82 -0
  110. package/src/permission-mode-select.test.tsx +100 -0
  111. package/src/permission-mode-select.tsx +137 -0
  112. package/src/persona-missing-peer.test.tsx +54 -0
  113. package/src/persona.tsx +68 -22
  114. package/src/plan.stories.tsx +166 -0
  115. package/src/plan.test.tsx +267 -0
  116. package/src/plan.tsx +182 -20
  117. package/src/prompt-input-effort.stories.tsx +123 -0
  118. package/src/prompt-input-effort.test.tsx +83 -0
  119. package/src/prompt-input-effort.tsx +136 -0
  120. package/src/prompt-input-mode.stories.tsx +108 -0
  121. package/src/prompt-input-mode.test.tsx +99 -0
  122. package/src/prompt-input-mode.tsx +169 -0
  123. package/src/prompt-input-slash.stories.tsx +211 -0
  124. package/src/prompt-input-slash.test.tsx +262 -0
  125. package/src/prompt-input-slash.tsx +541 -0
  126. package/src/prompt-input.stories.tsx +2 -2
  127. package/src/prompt-input.test.tsx +67 -1
  128. package/src/prompt-input.tsx +42 -4
  129. package/src/queue.tsx +4 -4
  130. package/src/reasoning.tsx +42 -17
  131. package/src/sandbox.stories.tsx +9 -1
  132. package/src/sandbox.tsx +3 -3
  133. package/src/schema-display.test.tsx +56 -0
  134. package/src/schema-display.tsx +71 -37
  135. package/src/selection-toolbar.stories.tsx +9 -1
  136. package/src/session-header.stories.tsx +128 -0
  137. package/src/session-header.test.tsx +138 -0
  138. package/src/session-header.tsx +243 -0
  139. package/src/session-status-bar.stories.tsx +73 -0
  140. package/src/session-status-bar.test.tsx +94 -0
  141. package/src/session-status-bar.tsx +165 -0
  142. package/src/snippet.stories.tsx +9 -1
  143. package/src/snippet.test.tsx +6 -2
  144. package/src/snippet.tsx +14 -34
  145. package/src/speech-input.test.tsx +109 -0
  146. package/src/speech-input.tsx +31 -3
  147. package/src/stack-trace.tsx +24 -36
  148. package/src/streamdown-i18n.test.tsx +24 -1
  149. package/src/task.stories.tsx +13 -3
  150. package/src/templates-ai-assistant.stories.tsx +21 -1
  151. package/src/test-results.tsx +47 -27
  152. package/src/token-usage.stories.tsx +24 -0
  153. package/src/token-usage.test.tsx +92 -0
  154. package/src/{context.tsx → token-usage.tsx} +73 -59
  155. package/src/tool-result-card.stories.tsx +9 -1
  156. package/src/tool.stories.tsx +13 -3
  157. package/src/tool.test.tsx +65 -0
  158. package/src/tool.tsx +73 -30
  159. package/src/transcription.tsx +1 -1
  160. package/src/turn-status.stories.tsx +124 -0
  161. package/src/turn-status.test.tsx +74 -0
  162. package/src/turn-status.tsx +174 -0
  163. package/src/use-audio-level.ts +104 -0
  164. package/src/voice-selector.tsx +5 -5
  165. package/src/web-preview.test.tsx +51 -1
  166. package/src/web-preview.tsx +46 -10
  167. package/dist/_audio-player-media-chrome-KA5DY54G.js.map +0 -1
  168. package/dist/_flow-boundary-D63PJ65S.js.map +0 -1
  169. package/dist/_interactive-terminal-xterm-ATJ5EW3G.js +0 -11
  170. package/dist/_interactive-terminal-xterm-ATJ5EW3G.js.map +0 -1
  171. package/dist/_persona-rive-RFR2EUWP.js.map +0 -1
  172. package/src/_interactive-terminal-xterm.ts +0 -32
  173. package/src/blocks-ai-composer.stories.tsx +0 -83
  174. package/src/context.stories.tsx +0 -16
  175. package/src/interactive-terminal.stories.tsx +0 -165
  176. package/src/interactive-terminal.test.tsx +0 -448
  177. package/src/interactive-terminal.tsx +0 -444
  178. package/src/model-selector.test.tsx +0 -55
  179. package/src/model-selector.tsx +0 -225
  180. package/src/terminal.tsx +0 -244
package/dist/index.d.ts CHANGED
@@ -1,22 +1,20 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentProps, ReactNode, HTMLAttributes, RefObject, FormEvent, PropsWithChildren, ImgHTMLAttributes, FC, ElementType, JSX } from 'react';
3
3
  import * as _elabs_ai_components_ui from '@elabs-ai/components-ui';
4
- import { AccordionItem, Accordion, TimelineItemProps, Status, TimelineRootProps, Button, FileSource, HoverCard, HoverCardContent, HoverCardTrigger, CollapsibleContent, CollapsibleTrigger, Badge, HeadingLevel, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Collapsible, Avatar, InputGroupButton, DropdownMenuItem, DropdownMenu, DropdownMenuContent, TooltipContent, Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, InputGroupAddon, InputGroupTextarea, Alert, AlertDescription, AlertTitle, Switch, Carousel, ProseHeadingLevel, ButtonGroup, Popover, PopoverContent, Dialog, DialogContent, CommandDialog, CommandShortcut, DialogTrigger, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, ScrollArea, TabsContent, Tabs, TabsList, TabsTrigger, InputGroup, InputGroupInput, InputGroupText, Input } from '@elabs-ai/components-ui';
5
- import { Tool as Tool$1, FileUIPart, SourceDocumentUIPart, Experimental_SpeechResult, ChatStatus, ToolUIPart, LanguageModelUsage, UIMessage, Experimental_GeneratedImage, DynamicToolUIPart, Experimental_TranscriptionResult } from 'ai';
4
+ import { AccordionItem, Accordion, TimelineItemProps, Status, TimelineRootProps, AgentEventPhase, AgentEventOutcome, CheckSummary, CheckResult, Button, FileSource, HoverCard, HoverCardContent, HoverCardTrigger, CollapsibleContent, CollapsibleTrigger, Badge, HeadingLevel, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Collapsible, Avatar, InputGroupButton, DropdownMenuItem, DropdownMenu, DropdownMenuContent, TooltipContent, Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, InputGroupAddon, InputGroupTextarea, EffortLevel, OperatingMode, SlashCommand, Alert, AlertDescription, ApprovalOption, Textarea, AlertTitle, DiffLine, Switch, Carousel, ProseHeadingLevel, ButtonGroup, Popover, PopoverContent, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, StatusBadge, ScrollArea, TabsContent, Tabs, TabsList, TabsTrigger, SessionCapability, SessionWhatsNewItem, SessionQuickAction, InputGroup, InputGroupInput, InputGroupText, Dialog, DialogContent, CommandDialog, CommandShortcut, DialogTrigger, Input } from '@elabs-ai/components-ui';
5
+ import * as ai from 'ai';
6
+ import { Tool as Tool$1, FileUIPart, SourceDocumentUIPart, Experimental_SpeechResult, ChatStatus, ToolUIPart, UIMessage, Experimental_GeneratedImage, LanguageModelUsage, DynamicToolUIPart, Experimental_TranscriptionResult } from 'ai';
6
7
  import { LucideIcon, LucideProps, FileIcon } from 'lucide-react';
7
- import { MediaController, MediaControlBar, MediaDurationDisplay, MediaMuteButton, MediaPlayButton, MediaSeekBackwardButton, MediaSeekForwardButton, MediaTimeDisplay, MediaTimeRange, MediaVolumeRange } from 'media-chrome/react';
8
8
  import { ReactFlowProps, ConnectionLineComponent, Controls as Controls$1, EdgeProps, Panel as Panel$1, NodeToolbar as NodeToolbar$1 } from '@xyflow/react';
9
9
  import { BundledLanguage, ThemedToken } from 'shiki';
10
10
  import { StickToBottom } from 'use-stick-to-bottom';
11
11
  import * as class_variance_authority_types from 'class-variance-authority/types';
12
12
  import { VariantProps } from 'class-variance-authority';
13
- import { ITheme } from '@xterm/xterm';
14
13
  import { TProps } from 'react-jsx-parser';
15
14
  import { MermaidConfig, DiagramPlugin } from '@streamdown/mermaid';
16
15
  import { Streamdown } from 'streamdown';
17
16
  import { z } from 'zod';
18
17
  import { Transition } from 'motion/react';
19
- import { RiveParameters } from '@rive-app/react-webgl2';
20
18
 
21
19
  type AgentProps = ComponentProps<"div">;
22
20
  declare const Agent: react.MemoExoticComponent<({ className, ...props }: AgentProps) => react.JSX.Element>;
@@ -74,6 +72,28 @@ interface AgentStepProps extends Omit<TimelineItemProps, "children" | "descripti
74
72
  */
75
73
  declare const AgentStep: react.NamedExoticComponent<AgentStepProps & react.RefAttributes<HTMLLIElement>>;
76
74
 
75
+ interface AgentEventProps extends Omit<AgentStepProps, "name" | "status" | "children" | "icon" | "timestamp"> {
76
+ /** The runtime event name, verbatim as the runtime emits it — e.g. `"user_prompt_submit"`, `"pre_tool_use"`, `"stop"`. */
77
+ label: string;
78
+ /** When this event fired relative to the action it gates. See `AgentEventPhase`. */
79
+ phase?: AgentEventPhase;
80
+ /** The event's verdict. @default "ok" */
81
+ outcome?: AgentEventOutcome;
82
+ /** Wall-clock duration of the event, in milliseconds. Rendered with the shared `formatElapsed`. */
83
+ durationMs?: number;
84
+ /** Gate checks the event ran: individual verdicts, or a count summary. */
85
+ checks?: CheckSummary | CheckResult[];
86
+ /** Optional leading glyph on the title row (Lucide). @default Webhook */
87
+ icon?: LucideIcon;
88
+ }
89
+ /**
90
+ * One lifecycle/hook event line on the `AgentTimeline` rail — an `AgentStep`
91
+ * variant, never a second spine. Composes `AgentStep` exactly as `TaskItem`
92
+ * does in `./agent-timeline`, so it rides the same `TimelineRoot`/`TimelineItem`
93
+ * primitives every other trace entry uses.
94
+ */
95
+ declare const AgentEvent: react.ForwardRefExoticComponent<AgentEventProps & react.RefAttributes<HTMLLIElement>>;
96
+
77
97
  type ArtifactProps = HTMLAttributes<HTMLDivElement> & {
78
98
  /**
79
99
  * The artifact body has not arrived yet (loading-states.md loading signal).
@@ -336,7 +356,133 @@ declare const AttachmentHoverCardContent: ({ align, className, ...props }: Attac
336
356
  type AttachmentEmptyProps = HTMLAttributes<HTMLDivElement>;
337
357
  declare const AttachmentEmpty: ({ className, children, ...props }: AttachmentEmptyProps) => react.JSX.Element;
338
358
 
339
- type AudioPlayerProps = Omit<ComponentProps<typeof MediaController>, "audio">;
359
+ /**
360
+ * media-chrome lives behind a dynamic import — it declares no `sideEffects`, so
361
+ * a static import would put the whole custom-element library in every consumer's
362
+ * entry chunk, `AudioPlayer` rendered or not. Every value import lives in
363
+ * `_audio-player-media-chrome.tsx`. See ADR 0019 and `pnpm heavy-deps:check`.
364
+ *
365
+ * All ten parts resolve from the SAME module specifier, so they share one chunk:
366
+ * once `AudioPlayer` has loaded it, the controls inside it resolve from cache.
367
+ *
368
+ * Issue #101: `media-chrome` is an OPTIONAL peer, so no PUBLIC export's type
369
+ * may structurally reference `media-chrome/react`'s own types (previously
370
+ * `ComponentProps<typeof MediaController>` and nine siblings, imported as
371
+ * TYPE-only above) — doing so names `media-chrome/react`'s module specifier in
372
+ * this package's generated root `.d.ts` and hands a `skipLibCheck: false`
373
+ * consumer who has correctly omitted the peer a `TS2307` just for importing
374
+ * the barrel — not just for using `AudioPlayer`. `AudioPlayerPartProps` below
375
+ * is an OWNED base type: `media-chrome/react`'s wrapper
376
+ * (`media-chrome/react`'s `createComponent`, from the `ce-la-react` helper it
377
+ * is built on) types every part as `Omit<HTMLAttributes<I>, …> &
378
+ * Partial<the element's own instance members>` — i.e. ordinary HTML attributes
379
+ * plus a handful of optional custom attributes. `AudioPlayerPartProps` itself
380
+ * stays ordinary HTML attributes only; the PRIMITIVE-typed (`string` /
381
+ * `boolean` / `number`) extra instance members of `<media-controller>` and
382
+ * `<media-seek-forward-button>` — the two elements measured by the round-2
383
+ * validator — are mirrored one-by-one on `AudioPlayerProps` and
384
+ * `AudioPlayerSeekForwardButtonProps` below (each a single declaration line
385
+ * referencing nothing peer-owned, the same technique `seekOffset` already
386
+ * used). What stays narrowed to `AudioPlayerPartProps` alone are the
387
+ * PEER/COMPLEX-typed members (`MediaStore`, `AttributeTokenList`,
388
+ * `MediaTooltip`, `TooltipPlacement`, DOM-element and `HTMLMediaElement`
389
+ * callbacks, methods) and every member of the other eight parts — restoring
390
+ * those would re-import the peer type graph this fix exists to avoid. See the
391
+ * CHANGELOG's "Breaking (types)" entry for the exact narrowed set.
392
+ * `AudioPlayerPartProps` is therefore NOT a full replica of media-chrome's
393
+ * surface, only the base every part actually uses and re-exports (the same
394
+ * scoping `TerminalColorTheme` uses for xterm's `ITheme` in
395
+ * `packages/terminal/src/interactive-terminal.tsx`, also issue #101). The ten
396
+ * conformance assertions at the bottom of `_audio-player-media-chrome.tsx`
397
+ * (which still imports the real peer types — that module is reached only
398
+ * through `lazy()` and never sits in the barrel's declaration graph) prove
399
+ * every owned type here stays assignable to its real media-chrome counterpart;
400
+ * a peer version bump that narrows a prop incompatibly fails
401
+ * `pnpm --filter @elabs-ai/components-ai typecheck` locally instead of
402
+ * reaching a consumer as silent drift.
403
+ *
404
+ * Deliberately no `ref` field: `ComponentProps<typeof MediaController>` (and
405
+ * its nine siblings) included one via `RefAttributes<I>`, but `RefObject<T>`'s
406
+ * mutable `current` makes ref types INVARIANT in `T` — a `Ref<HTMLElement>`
407
+ * can never be assignable to a real element's own `Ref<MediaController>` (the
408
+ * custom element subclass carries private/extra members `HTMLElement` lacks),
409
+ * so keeping it would make every owned type fail its own conformance
410
+ * assertion below. This IS a real-world break for a React 19 consumer: none
411
+ * of the ten parts this package renders is wrapped in `forwardRef`, but
412
+ * `MediaController` (and its siblings) are genuine `forwardRef` components,
413
+ * and React 19's ref-as-prop carries a `ref` straight through an ordinary
414
+ * function component's `{...props}` spread to the real underlying element —
415
+ * see the CHANGELOG's "Breaking (types)" entry for the measured detail. It is
416
+ * inert only under React 18.
417
+ */
418
+ type AudioPlayerPartProps = HTMLAttributes<HTMLElement>;
419
+ /**
420
+ * The primitive-typed (`string`/`boolean`/`number`) extra instance members of
421
+ * `media-chrome/react`'s `MediaController` — restored per issue #101's round-2
422
+ * validation (R2): each is a single declaration line mirroring the real peer
423
+ * type's name and shape, referencing nothing peer-owned, so it costs nothing
424
+ * against the `.d.ts` leak this fix exists to prevent. Deliberately EXCLUDED:
425
+ * `audio` (already narrowed out — `_audio-player-media-chrome.tsx`'s
426
+ * conformance assertion Omits it from the real `ComponentProps`, since this
427
+ * package renders its own `<AudioPlayerElement>` instead of passing one
428
+ * through), and every PEER/COMPLEX-typed member (`mediaStore`, `hotkeys`
429
+ * (`AttributeTokenList`), `media`/`fullscreenElement` (DOM elements),
430
+ * `mediaStateReceivers`, `associatedElementSubscriptions`, every
431
+ * `HTMLMediaElement` callback and every method) — those stay narrowed to
432
+ * `AudioPlayerPartProps` alone; restoring them would re-import the peer type
433
+ * graph. See `_audio-player-media-chrome.tsx`'s
434
+ * `_AudioPlayerPropsConformance` assertion, which fails typecheck if this
435
+ * interface ever drifts wider than the real element's own props.
436
+ *
437
+ * Doc comments below are inferred from each member's name and media-chrome's
438
+ * public attribute-naming convention (`no*` = boolean opt-out of the
439
+ * corresponding default-on behavior) — media-chrome ships no per-property doc
440
+ * comments in its own `.d.ts` or README to copy from. Treat them as a reading
441
+ * aid, not an authoritative spec; verify against media-chrome's source before
442
+ * relying on exact semantics.
443
+ */
444
+ interface AudioPlayerProps extends AudioPlayerPartProps {
445
+ /** Seconds of inactivity before controls hide; a string because it mirrors the HTML attribute value. */
446
+ autohide?: string;
447
+ /** Also autohide while the pointer is over the control elements themselves, not just the media. */
448
+ autohideOverControls?: boolean;
449
+ /** Breakpoint definitions (space-separated `name:width` pairs) driving `breakpointsComputed`. */
450
+ breakpoints?: string;
451
+ /** Whether the controller has computed its current breakpoint(s) at least once. */
452
+ breakpointsComputed?: boolean;
453
+ /** Fallback duration (seconds) to display before the real media duration is known. */
454
+ defaultDuration?: number;
455
+ /** Default stream type ("on-demand" or "live") before the media has resolved its own. */
456
+ defaultStreamType?: string;
457
+ /** Whether subtitles/captions are enabled by default. */
458
+ defaultSubtitles?: boolean;
459
+ /** Disables the controller's built-in tap/gesture handling (e.g. tap-to-play, double-tap-to-seek). */
460
+ gesturesDisabled?: boolean;
461
+ /** Whether hotkey keyboard control is currently active on the controller. */
462
+ keyboardControl?: boolean;
463
+ /** Space-separated list of hotkey names currently in use, for conflict detection with other listeners. */
464
+ keysUsed?: string;
465
+ /** Seconds behind the live edge still considered "at" live, for a live stream's seek range. */
466
+ liveEdgeOffset?: number;
467
+ /** Disables the controller's autohide-controls-on-inactivity behavior entirely. */
468
+ noAutohide?: boolean;
469
+ /** Disables automatically seeking back to the live edge after a manual seek on a live stream. */
470
+ noAutoSeekToLive?: boolean;
471
+ /** Opts out of the controller creating its own default internal media store. */
472
+ noDefaultStore?: boolean;
473
+ /** Disables the controller's built-in keyboard hotkeys entirely. */
474
+ noHotkeys?: boolean;
475
+ /** Opts out of remembering the user's mute preference across sessions. */
476
+ noMutedPref?: boolean;
477
+ /** Opts out of remembering the user's subtitles-language preference across sessions. */
478
+ noSubtitlesLangPref?: boolean;
479
+ /** Opts out of remembering the user's volume preference across sessions. */
480
+ noVolumePref?: boolean;
481
+ /** The language the controller resolved for its UI text, after applying any language preference. */
482
+ resolvedLang?: string;
483
+ /** Whether the user has interacted with the controller yet (affects autoplay-adjacent UI). */
484
+ userInteractive?: boolean;
485
+ }
340
486
  declare const AudioPlayer: ({ className, ...props }: AudioPlayerProps) => react.JSX.Element;
341
487
  type AudioPlayerElementProps = Omit<ComponentProps<"audio">, "src"> & ({
342
488
  data: Experimental_SpeechResult["audio"];
@@ -344,25 +490,104 @@ type AudioPlayerElementProps = Omit<ComponentProps<"audio">, "src"> & ({
344
490
  src: string;
345
491
  });
346
492
  declare const AudioPlayerElement: ({ ...props }: AudioPlayerElementProps) => react.JSX.Element;
347
- type AudioPlayerControlBarProps = ComponentProps<typeof MediaControlBar>;
493
+ type AudioPlayerControlBarProps = AudioPlayerPartProps;
348
494
  declare const AudioPlayerControlBar: (props: AudioPlayerControlBarProps) => react.JSX.Element;
349
- type AudioPlayerPlayButtonProps = ComponentProps<typeof MediaPlayButton>;
495
+ type AudioPlayerPlayButtonProps = AudioPlayerPartProps;
350
496
  declare const AudioPlayerPlayButton: (props: AudioPlayerPlayButtonProps) => react.JSX.Element;
351
- type AudioPlayerSeekBackwardButtonProps = ComponentProps<typeof MediaSeekBackwardButton>;
497
+ interface AudioPlayerSeekBackwardButtonProps extends AudioPlayerPartProps {
498
+ /** Skip distance in seconds. Mirrors the element's own default (10). */
499
+ seekOffset?: number;
500
+ }
352
501
  declare const AudioPlayerSeekBackwardButton: (props: AudioPlayerSeekBackwardButtonProps) => react.JSX.Element;
353
- type AudioPlayerSeekForwardButtonProps = ComponentProps<typeof MediaSeekForwardButton>;
502
+ /**
503
+ * Primitive-typed extra members restored per issue #101's round-2 validation
504
+ * (R2) — same technique and same inferred-from-naming caveat as
505
+ * `AudioPlayerProps` above. Deliberately still narrowed out:
506
+ * `keysUsed` (here typed `string[]`, unlike the controller's own `string`
507
+ * member of the same name — an array is not primitive) and the DOM/method
508
+ * members `disable`/`enable`/`handleClick`/`tooltipEl`/`tooltipPlacement`.
509
+ */
510
+ interface AudioPlayerSeekForwardButtonProps extends AudioPlayerPartProps {
511
+ /** Whether the button is disabled. */
512
+ disabled?: boolean;
513
+ /** ID of the `<media-controller>` element this button controls, when it is not an ancestor. */
514
+ mediaController?: string;
515
+ /** The media's current playback time (seconds), as reflected by the controller's media store. */
516
+ mediaCurrentTime?: number;
517
+ /** Skip distance in seconds. Mirrors the element's own default (10). */
518
+ seekOffset?: number;
519
+ /** Suppresses the built-in hover tooltip on this button. */
520
+ noTooltip?: boolean;
521
+ /** Prevents the button's default click handling (for a consumer that wants to fully own the behavior). */
522
+ preventClick?: boolean;
523
+ }
354
524
  declare const AudioPlayerSeekForwardButton: (props: AudioPlayerSeekForwardButtonProps) => react.JSX.Element;
355
- type AudioPlayerTimeDisplayProps = ComponentProps<typeof MediaTimeDisplay>;
525
+ type AudioPlayerTimeDisplayProps = AudioPlayerPartProps;
356
526
  declare const AudioPlayerTimeDisplay: (props: AudioPlayerTimeDisplayProps) => react.JSX.Element;
357
- type AudioPlayerTimeRangeProps = ComponentProps<typeof MediaTimeRange>;
527
+ type AudioPlayerTimeRangeProps = AudioPlayerPartProps;
358
528
  declare const AudioPlayerTimeRange: (props: AudioPlayerTimeRangeProps) => react.JSX.Element;
359
- type AudioPlayerDurationDisplayProps = ComponentProps<typeof MediaDurationDisplay>;
529
+ type AudioPlayerDurationDisplayProps = AudioPlayerPartProps;
360
530
  declare const AudioPlayerDurationDisplay: (props: AudioPlayerDurationDisplayProps) => react.JSX.Element;
361
- type AudioPlayerMuteButtonProps = ComponentProps<typeof MediaMuteButton>;
531
+ type AudioPlayerMuteButtonProps = AudioPlayerPartProps;
362
532
  declare const AudioPlayerMuteButton: (props: AudioPlayerMuteButtonProps) => react.JSX.Element;
363
- type AudioPlayerVolumeRangeProps = ComponentProps<typeof MediaVolumeRange>;
533
+ type AudioPlayerVolumeRangeProps = AudioPlayerPartProps;
364
534
  declare const AudioPlayerVolumeRange: (props: AudioPlayerVolumeRangeProps) => react.JSX.Element;
365
535
 
536
+ /**
537
+ * brand-ui is a presentation layer (D5, docs/DECISIONS.md §D5): this component
538
+ * never calls `getUserMedia`, never owns an `AudioContext`, and starts nothing
539
+ * on mount. It draws whatever `levels` a parent — who already has a
540
+ * `MediaStream`/`AnalyserNode` — passes it, frame by frame. The analyser
541
+ * plumbing, when a consumer genuinely wants it, is the separate, opt-in
542
+ * `useAudioLevel` export in `./use-audio-level` — never something this
543
+ * component reaches for itself. See issue #21.
544
+ */
545
+ type AudioVisualizerVariant = "bars" | "wave";
546
+ type AudioVisualizerLevelState = "idle" | "silent" | "active";
547
+ interface AudioVisualizerProps extends Omit<ComponentProps<"div">, "children"> {
548
+ /**
549
+ * Normalized 0–1 amplitude samples for the CURRENT frame — one per bar (or
550
+ * per sample point for `variant="wave"`). Update this from your own
551
+ * analyser polling loop (or the opt-in `useAudioLevel` hook) on every frame
552
+ * you want reflected; the component never touches the microphone itself.
553
+ * Any length works — samples are resampled to `barCount`.
554
+ */
555
+ levels?: number[];
556
+ /** No stream connected yet — renders the idle baseline instead of `levels`. */
557
+ loading?: boolean;
558
+ /** `"bars"` (default) — a bar chart. `"wave"` — a filled envelope through the
559
+ * current samples. Both encode level as HEIGHT, never as hue alone. */
560
+ variant?: AudioVisualizerVariant;
561
+ /** Multiplies each level before clamping to [0, 1] — turn up for a quiet input. */
562
+ sensitivity?: number;
563
+ /** Number of bars/points drawn. */
564
+ barCount?: number;
565
+ /** Average level, 0–1, at/above which the status text reads "active". */
566
+ silenceThreshold?: number;
567
+ /**
568
+ * Visually-hidden text announced when the discretized level state changes.
569
+ * Defaults to a localized label ("No input detected" / "Microphone
570
+ * active" / …). Pass `null` when the consuming surface already renders its
571
+ * own live region, so assistive tech is not told twice.
572
+ */
573
+ statusLabel?: ReactNode | null;
574
+ }
575
+ /**
576
+ * Live mic-level / waveform meter. Canvas-drawn (one element, no per-bar DOM,
577
+ * so a `levels` prop updating every frame never costs React a 32-element
578
+ * reconciliation) and driven entirely by the `levels` prop — see the module
579
+ * doc comment for the presentation-layer boundary this enforces.
580
+ *
581
+ * The canvas is decorative (`aria-hidden`); the level itself is announced
582
+ * through a throttled `role="status"` text alternative — see `statusLabel`.
583
+ *
584
+ * Reduced motion: under `prefers-reduced-motion` (or while `loading`) the
585
+ * component skips its internal smoothing animation entirely and paints the
586
+ * raw `levels` directly on every prop change — a static bar chart of the
587
+ * current levels, never a freeze mid-interpolation.
588
+ */
589
+ declare const AudioVisualizer: react.ForwardRefExoticComponent<Omit<AudioVisualizerProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
590
+
366
591
  type CanvasProps = ReactFlowProps & {
367
592
  children?: ReactNode;
368
593
  };
@@ -477,7 +702,7 @@ interface TokenizedCode {
477
702
  fg: string;
478
703
  bg: string;
479
704
  }
480
- declare const highlightCode: (code: string, language: BundledLanguage, callback?: (result: TokenizedCode) => void, el?: Element | null) => TokenizedCode | null;
705
+ declare const highlightCode: (code: string, language: BundledLanguage, callback?: (result: TokenizedCode) => void, el?: Element | null, skipCache?: boolean) => TokenizedCode | null;
481
706
  declare const CodeBlockContainer: ({ className, language, style, ...props }: HTMLAttributes<HTMLDivElement> & {
482
707
  language: string;
483
708
  }) => react.JSX.Element;
@@ -485,11 +710,12 @@ declare const CodeBlockHeader: ({ children, className, ...props }: HTMLAttribute
485
710
  declare const CodeBlockTitle: ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => react.JSX.Element;
486
711
  declare const CodeBlockFilename: ({ children, className, ...props }: HTMLAttributes<HTMLSpanElement>) => react.JSX.Element;
487
712
  declare const CodeBlockActions: ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => react.JSX.Element;
488
- declare const CodeBlockContent: ({ code, language, showLineNumbers, wrap, }: {
713
+ declare const CodeBlockContent: ({ code, language, showLineNumbers, wrap, isStreaming, }: {
489
714
  code: string;
490
715
  language: BundledLanguage;
491
716
  showLineNumbers?: boolean;
492
717
  wrap?: boolean;
718
+ isStreaming?: boolean;
493
719
  }) => react.JSX.Element;
494
720
  declare const CodeBlock: ({ code, language, showLineNumbers, wrap, isStreaming, className, children, ...props }: CodeBlockProps) => react.JSX.Element;
495
721
  type CodeBlockCopyButtonProps = ComponentProps<typeof Button> & {
@@ -541,7 +767,7 @@ type CommitCopyButtonProps = ComponentProps<typeof Button> & {
541
767
  onError?: (error: Error) => void;
542
768
  timeout?: number;
543
769
  };
544
- declare const CommitCopyButton: ({ hash, onCopy, onError, timeout, children, className, ...props }: CommitCopyButtonProps) => react.JSX.Element;
770
+ declare const CommitCopyButton: ({ hash, onCopy, onError, timeout, children, className, "aria-label": ariaLabel, ...props }: CommitCopyButtonProps) => react.JSX.Element;
545
771
  type CommitContentProps = ComponentProps<typeof CollapsibleContent>;
546
772
  declare const CommitContent: ({ className, children, ...props }: CommitContentProps) => react.JSX.Element;
547
773
  type CommitFilesProps = HTMLAttributes<HTMLDivElement>;
@@ -799,6 +1025,189 @@ declare const PromptInputCommandItem: ({ className, ...props }: PromptInputComma
799
1025
  type PromptInputCommandSeparatorProps = ComponentProps<typeof CommandSeparator>;
800
1026
  declare const PromptInputCommandSeparator: ({ className, ...props }: PromptInputCommandSeparatorProps) => react.JSX.Element;
801
1027
 
1028
+ type PromptInputEffortProps = Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
1029
+ /** Ordered low → high. The order IS the semantics — render in this order. */
1030
+ levels: EffortLevel[];
1031
+ /** Controlled selected level id. Omit for the uncontrolled default (`levels[0]`). */
1032
+ value?: string;
1033
+ /** Fires with the chosen level's id. */
1034
+ onValueChange?: (id: string) => void;
1035
+ /**
1036
+ * Accessible name for the whole scale (e.g. "Reasoning effort", "Thinking
1037
+ * budget") — required because the NAME of the scale is as much the
1038
+ * consumer's vocabulary as its levels are; this component has no default
1039
+ * to fall back to.
1040
+ */
1041
+ "aria-label": string;
1042
+ };
1043
+ /**
1044
+ * PromptInputEffort — an ORDERED reasoning-effort/budget control.
1045
+ *
1046
+ * Renders `levels` as a row of same-shape squares that GROW in size, low to
1047
+ * high — the size ramp encodes the order on its own, before any selection is
1048
+ * made. Selecting a level fills every square up to and including it (solid
1049
+ * fill + coloured border) and leaves the rest hollow (outline only): the
1050
+ * indicator's FILL is the second, non-colour channel required by a
1051
+ * greyscale-legibility read — the size ramp and the solid/hollow shape both
1052
+ * survive a greyscale render, so the level is recoverable without colour.
1053
+ * The current level's name is additionally rendered as text.
1054
+ *
1055
+ * Built on Radix (`RadioGroup`/`RadioGroupItem` from `@elabs-ai/components-ui`,
1056
+ * `role="radiogroup"` of `role="radio"`s) for arrow-key navigation, roving
1057
+ * focus and an accessible-name announcement on the checked item — no
1058
+ * hand-rolled key handling.
1059
+ */
1060
+ declare const PromptInputEffort: react.ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
1061
+ /** Ordered low → high. The order IS the semantics — render in this order. */
1062
+ levels: EffortLevel[];
1063
+ /** Controlled selected level id. Omit for the uncontrolled default (`levels[0]`). */
1064
+ value?: string;
1065
+ /** Fires with the chosen level's id. */
1066
+ onValueChange?: (id: string) => void;
1067
+ /**
1068
+ * Accessible name for the whole scale (e.g. "Reasoning effort", "Thinking
1069
+ * budget") — required because the NAME of the scale is as much the
1070
+ * consumer's vocabulary as its levels are; this component has no default
1071
+ * to fall back to.
1072
+ */
1073
+ "aria-label": string;
1074
+ } & react.RefAttributes<HTMLDivElement>>;
1075
+
1076
+ type PromptInputModeProps = Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
1077
+ /** The app's own operating modes, low to high ceremony or however it orders them. */
1078
+ modes: OperatingMode[];
1079
+ /** Controlled selected mode id. Omit for the uncontrolled default (`modes[0]`). */
1080
+ value?: string;
1081
+ /** Fires with the chosen mode's id. */
1082
+ onValueChange?: (id: string) => void;
1083
+ /**
1084
+ * Accessible name for the trigger control, read alongside the current
1085
+ * mode's label. Optional — the trigger already carries the current mode's
1086
+ * visible text as its name, so this only adds context (e.g. "Operating
1087
+ * mode: Auto" instead of just "Auto").
1088
+ */
1089
+ "aria-label"?: string;
1090
+ };
1091
+ /**
1092
+ * PromptInputMode — a composer control for an app-defined operating mode
1093
+ * (how autonomously the agent may act on the next turn).
1094
+ *
1095
+ * A `DropdownMenu` of `modes`, radio-selected so exactly one is active at a
1096
+ * time; the trigger shows the current mode's icon + label. Ships no mode
1097
+ * vocabulary — `modes` is entirely prop-driven, so `auto`/`plan`/whatever a
1098
+ * given agent calls its modes lives in the consuming app, not here.
1099
+ *
1100
+ * Built on Radix (`DropdownMenu` + `DropdownMenuRadioGroup`/`RadioItem` from
1101
+ * `@elabs-ai/components-ui`) for keyboard navigation, roving focus and a
1102
+ * `menuitemradio` role whose `aria-checked` announces the current selection —
1103
+ * no hand-rolled key handling.
1104
+ */
1105
+ declare const PromptInputMode: react.ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "onChange"> & {
1106
+ /** The app's own operating modes, low to high ceremony or however it orders them. */
1107
+ modes: OperatingMode[];
1108
+ /** Controlled selected mode id. Omit for the uncontrolled default (`modes[0]`). */
1109
+ value?: string;
1110
+ /** Fires with the chosen mode's id. */
1111
+ onValueChange?: (id: string) => void;
1112
+ /**
1113
+ * Accessible name for the trigger control, read alongside the current
1114
+ * mode's label. Optional — the trigger already carries the current mode's
1115
+ * visible text as its name, so this only adds context (e.g. "Operating
1116
+ * mode: Auto" instead of just "Auto").
1117
+ */
1118
+ "aria-label"?: string;
1119
+ } & react.RefAttributes<HTMLDivElement>>;
1120
+
1121
+ interface PromptInputSlashProps extends Omit<HTMLAttributes<HTMLDivElement>, "onSelect" | "children"> {
1122
+ /** The registered commands the palette offers. */
1123
+ commands: SlashCommand[];
1124
+ /** The composer's current text — must match what the wrapped textarea renders. */
1125
+ value: string;
1126
+ /** Ref to the composer's `<textarea>` (usually the one `PromptInputSlashTextarea` renders). */
1127
+ textareaRef: RefObject<HTMLTextAreaElement | null>;
1128
+ /**
1129
+ * Only trigger at the start of a line (index 0, or right after `"\n"`).
1130
+ * `false` falls back to `MentionInput`'s word-boundary rule.
1131
+ * @default true
1132
+ */
1133
+ lineStartOnly?: boolean;
1134
+ /** Which commands survive the current query. @default defaultSlashCommandFilter */
1135
+ filter?: (command: SlashCommand, query: string) => boolean;
1136
+ /**
1137
+ * A command was chosen — apply the spliced `{ text, caret }` to your own
1138
+ * controlled value (the same shape `replaceTriggerRun` returns). The
1139
+ * splice inserts `"/" + command.name + " "` in place of the typed query.
1140
+ */
1141
+ onValueChange: (next: {
1142
+ text: string;
1143
+ caret: number;
1144
+ }) => void;
1145
+ /** A command was chosen (fires alongside, not instead of, `onValueChange`). */
1146
+ onSelect?: (command: SlashCommand) => void;
1147
+ /** The popup opened or closed. */
1148
+ onOpenChange?: (open: boolean) => void;
1149
+ children: ReactNode;
1150
+ }
1151
+ /**
1152
+ * PromptInputSlash — wrap the composer's textarea (rendered via
1153
+ * `PromptInputSlashTextarea`) to add a `/`-triggered command palette.
1154
+ *
1155
+ * ```tsx
1156
+ * const textareaRef = useRef<HTMLTextAreaElement>(null);
1157
+ * const [text, setText] = useState("");
1158
+ *
1159
+ * <PromptInputSlash
1160
+ * commands={commands}
1161
+ * value={text}
1162
+ * textareaRef={textareaRef}
1163
+ * onValueChange={({ text }) => setText(text)}
1164
+ * >
1165
+ * <PromptInputSlashTextarea value={text} onChange={(e) => setText(e.target.value)} />
1166
+ * </PromptInputSlash>
1167
+ * ```
1168
+ */
1169
+ declare const PromptInputSlash: react.ForwardRefExoticComponent<PromptInputSlashProps & react.RefAttributes<HTMLDivElement>>;
1170
+ type PromptInputSlashTextareaProps = PromptInputTextareaProps;
1171
+ /**
1172
+ * The composer's `<textarea>`, carrying the combobox semantics the palette
1173
+ * needs. A thin wrapper around `PromptInputTextarea` — every prop you'd pass
1174
+ * that component still works; this one additionally merges in the palette's
1175
+ * `ref`, caret tracking and `aria-activedescendant`.
1176
+ *
1177
+ * Must be rendered inside a `<PromptInputSlash>`.
1178
+ */
1179
+ declare const PromptInputSlashTextarea: react.ForwardRefExoticComponent<Omit<Omit<_elabs_ai_components_ui.TextareaProps & react.RefAttributes<HTMLTextAreaElement>, "ref"> & react.RefAttributes<HTMLTextAreaElement>, "ref"> & react.RefAttributes<HTMLTextAreaElement>>;
1180
+
1181
+ /**
1182
+ * The slice of `PromptInputModeProps` a `Composer` owns — the vocabulary and
1183
+ * the controlled/uncontrolled seam, never the DOM props of the wrapper div.
1184
+ *
1185
+ * `defaultValue` is deliberately absent: `PromptInputMode` has no uncontrolled
1186
+ * initial-value seam (its uncontrolled default is `modes[0]`), and the
1187
+ * `defaultValue` it inherits from `HTMLAttributes<HTMLDivElement>` is the DOM
1188
+ * attribute, which would type-check and then do nothing. Omit `value` for the
1189
+ * uncontrolled default; pass `value` + `onValueChange` to drive it.
1190
+ */
1191
+ type ComposerModeProps = Pick<PromptInputModeProps, "modes" | "value" | "onValueChange" | "aria-label">;
1192
+ /**
1193
+ * The slice of `PromptInputEffortProps` a `Composer` owns. `aria-label` stays
1194
+ * REQUIRED, exactly as on the primitive: the name of the scale ("Reasoning
1195
+ * effort", "Thinking budget") is as much the consumer's vocabulary as its
1196
+ * levels are, so `Composer` has no default to invent either. `defaultValue` is
1197
+ * absent for the same reason it is on `ComposerModeProps`.
1198
+ */
1199
+ type ComposerEffortProps = Pick<PromptInputEffortProps, "levels" | "value" | "onValueChange" | "aria-label">;
1200
+ /**
1201
+ * One shortcut-hint row entry: the physical key(s) plus what they do, shown
1202
+ * as a `Kbd` chip beside a plain-text label — never inside a control's own
1203
+ * name (see `ComposerProps.shortcuts`).
1204
+ */
1205
+ interface ComposerShortcut {
1206
+ /** Rendered inside a `Kbd` chip, e.g. `"Enter"`, `"Shift+Enter"`. */
1207
+ keys: string;
1208
+ /** What the key does, in a word or two, e.g. `"send"`, `"newline"`. */
1209
+ label: string;
1210
+ }
802
1211
  interface ComposerProps {
803
1212
  /** Submit handler — receives the assembled message (text + attachments). */
804
1213
  onSubmit?: PromptInputProps["onSubmit"];
@@ -810,18 +1219,72 @@ interface ComposerProps {
810
1219
  * `null` to hide the strip entirely.
811
1220
  */
812
1221
  status?: ReactNode;
813
- /** Model-selector pill label. Default `"Claude Opus 4"`; pass `null` to hide it. */
814
- model?: ReactNode;
815
1222
  /**
816
- * Override the left-hand tool cluster (attach + model pill) — e.g. to add a
817
- * web-search or connect-data control. Render `PromptInputButton`s /
818
- * `PromptInputActionMenu` here; when set, `showAttach`/`model` are ignored.
1223
+ * The model control, rendered first in the tools cluster after `attach`.
1224
+ * Pass a `<ModelPicker>` from `@elabs-ai/components-ui` (it is sized to sit
1225
+ * in a composer footer) — or anything else. Default: nothing renders.
1226
+ *
1227
+ * This replaces the old `model` prop, which rendered a static, non-interactive
1228
+ * pill defaulted to a hard-coded model name. A composer that shows a model
1229
+ * name it cannot change is a lie about what the control does; the slot now
1230
+ * takes the real picker instead.
1231
+ */
1232
+ modelPicker?: ReactNode;
1233
+ /**
1234
+ * App-defined operating mode control — renders a `PromptInputMode` in the
1235
+ * tools cluster. Omitted, nothing renders. `brand-ui` ships no mode
1236
+ * vocabulary: `modes` is entirely yours.
1237
+ */
1238
+ mode?: ComposerModeProps;
1239
+ /**
1240
+ * Ordered reasoning-effort control — renders a `PromptInputEffort` in the
1241
+ * tools cluster. Omitted, nothing renders. `levels` is ordered low → high
1242
+ * and is entirely yours; `aria-label` names the scale.
1243
+ */
1244
+ effort?: ComposerEffortProps;
1245
+ /**
1246
+ * Slash-command palette. When set (and non-empty) the textarea becomes a
1247
+ * `PromptInputSlashTextarea` wrapped in a `PromptInputSlash`, so typing `/`
1248
+ * at the start of a line opens a filtered command list — nothing else about
1249
+ * the composer changes.
1250
+ *
1251
+ * Note this makes the textarea REACT-CONTROLLED (the palette needs to read
1252
+ * and splice the text), which is why `Composer` clears its own copy of the
1253
+ * text on submit: `PromptInput`'s `form.reset()` reaches the DOM node, not
1254
+ * React state.
1255
+ */
1256
+ slashCommands?: PromptInputSlashProps["commands"];
1257
+ /** Fires with the chosen slash command (alongside the text splice). */
1258
+ onSlashCommand?: PromptInputSlashProps["onSelect"];
1259
+ /**
1260
+ * Override the DEFAULT tool buttons (today: the attach button) — e.g. to add
1261
+ * a web-search or connect-data control. Render `PromptInputButton`s /
1262
+ * `PromptInputActionMenu` here; when set, `showAttach` is ignored.
1263
+ *
1264
+ * The explicit `modelPicker` / `mode` / `effort` slots are NOT part of this
1265
+ * override — they render after whatever this puts in the cluster, so passing
1266
+ * `tools` can never silently swallow a control you asked for by name.
819
1267
  */
820
1268
  tools?: ReactNode;
821
1269
  /** Send-button state, forwarded to `PromptInputSubmit` (ready/submitted/streaming/error). */
822
1270
  sendStatus?: ComponentProps<typeof PromptInputSubmit>["status"];
823
1271
  /** Stop handler used while the send button shows the generating state. */
824
1272
  onStop?: ComponentProps<typeof PromptInputSubmit>["onStop"];
1273
+ /**
1274
+ * Keyboard-shortcut hints shown as a row beneath the input well — plain
1275
+ * `Kbd` + label pairs, e.g. `[{ keys: "Enter", label: "send" }]`. Omitted,
1276
+ * nothing renders (opt-in, like every other Composer slot); the row is
1277
+ * never invented, since the real bindings are the host app's.
1278
+ */
1279
+ shortcuts?: ComposerShortcut[];
1280
+ /**
1281
+ * A second, busy-only hint appended to `shortcuts` (#107) — shown ONLY
1282
+ * once the composer is actually generating (`sendStatus` is `"submitted"`
1283
+ * or `"streaming"`) AND a real `onStop` handler is set, so the hint never
1284
+ * describes an affordance that isn't there. Mirrors
1285
+ * `TerminalComposer`'s `canCancel = busy && Boolean(onStop)` shape.
1286
+ */
1287
+ cancelShortcut?: ComposerShortcut;
825
1288
  /**
826
1289
  * Extra props spread onto the send button — `disabled`, `aria-label`,
827
1290
  * `variant`, `id`, `className`. `status` and `onStop` are excluded because
@@ -837,7 +1300,8 @@ interface ComposerProps {
837
1300
  * user's text destroyed, with nothing to restore from. Disabling the control
838
1301
  * is what actually prevents it: `PromptInputTextarea`'s Enter handler checks
839
1302
  * `submitControl?.disabled` and bails before `requestSubmit()`, so the Enter
840
- * path is closed too, not just the click.
1303
+ * path is closed too, not just the click. It holds with a slash palette open
1304
+ * as well — the palette's own Enter handling only ever inserts a command.
841
1305
  *
842
1306
  * Leave it UNSET rather than passing `false` when you have no opinion —
843
1307
  * `PromptInputSubmit` resolves `disabled ?? autoDisabled`, so a literal
@@ -870,9 +1334,9 @@ interface ComposerProps {
870
1334
  * Composer — the standard brand-ui AI chat input.
871
1335
  *
872
1336
  * A rounded two-tone "double card": a status strip wrapping a recessed
873
- * `PromptInput` well (sharp top, theme-rounded bottom), a model pill, voice,
874
- * and a circular send. Built on the real `PromptInput`, so it drops into a
875
- * `ChatShell` footer or stands alone as an empty-state composer. `tone`
1337
+ * `PromptInput` well (sharp top, theme-rounded bottom), a tools cluster,
1338
+ * voice, and a circular send. Built on the real `PromptInput`, so it drops
1339
+ * into a `ChatShell` footer or stands alone as an empty-state composer. `tone`
876
1340
  * (default `"surface"`, unchanged) picks the arrangement: `"surface"` keeps
877
1341
  * the original outer `bg-card` frame around the standard muted well;
878
1342
  * `"card"` (#254) swaps to an outer `bg-surface-muted` frame around a
@@ -881,10 +1345,16 @@ interface ComposerProps {
881
1345
  * `tone` prop doc on `PromptInput`. Semantic tokens only; theme-aware radii
882
1346
  * (`rounded-xl` frame / `rounded-b-lg` well); reads in every theme.
883
1347
  *
884
- * This is the canonical chat input — reach for it instead of hand-rolling a
885
- * `PromptInput` footer.
1348
+ * **Composer is the chat input. Every control the `PromptInput` family ships
1349
+ * is reachable from a `Composer` prop; drop to `PromptInput` only for a
1350
+ * bespoke shell.** `modelPicker`, `mode`, `effort` and `slashCommands` are the
1351
+ * four slots that make that true — they render `ModelPicker`,
1352
+ * `PromptInputMode`, `PromptInputEffort` and `PromptInputSlash` respectively,
1353
+ * in the footer order `attach · modelPicker · mode · effort │ voice · send`
1354
+ * (the same left-to-right arrangement `TerminalComposer` uses, so the chat and
1355
+ * console skins agree).
886
1356
  */
887
- declare function Composer({ onSubmit, placeholder, status, model, tools, sendStatus, onStop, submitProps, suggestions, onSuggestionClick, showVoice, showAttach, tone, className, }: ComposerProps): react.JSX.Element;
1357
+ declare function Composer({ onSubmit, placeholder, status, modelPicker, mode, effort, slashCommands, onSlashCommand, tools, sendStatus, onStop, submitProps, shortcuts, cancelShortcut, suggestions, onSuggestionClick, showVoice, showAttach, tone, className, }: ComposerProps): react.JSX.Element;
888
1358
 
889
1359
  type ToolUIPartApproval = {
890
1360
  id: string;
@@ -962,50 +1432,88 @@ declare const ApprovalCardApprove: (props: ConfirmationApproveProps) => react.JS
962
1432
  type ApprovalCardApproveProps = ConfirmationApproveProps;
963
1433
  declare const ApprovalCardDeny: (props: ConfirmationDenyProps) => react.JSX.Element;
964
1434
  type ApprovalCardDenyProps = ConfirmationDenyProps;
1435
+ /**
1436
+ * `ApprovalScope`, `ApprovalOption` and `APPROVAL_SCOPE_DESCRIPTION_KEYS`
1437
+ * moved to `@elabs-ai/components-ui` (`lib/approval-option.ts`) — the
1438
+ * terminal CLI look-alike family's own permission row (issue #117) reuses
1439
+ * the same model, and `@elabs-ai/components-ai`/`@elabs-ai/components-terminal`
1440
+ * are layer-2 DAG siblings that may not import each other (T0; see
1441
+ * docs/decisions/2026-09-01-brainless-adoption-architecture.md § 4). Imported
1442
+ * above.
1443
+ */
1444
+ interface ApprovalCardOptionsProps extends ComponentProps<"div"> {
1445
+ options: ApprovalOption[];
1446
+ value?: string;
1447
+ defaultValue?: string;
1448
+ onValueChange?: (id: string) => void;
1449
+ /**
1450
+ * Fires when an option is selected — by click, or by ANY keyboard move
1451
+ * within the radio group (Home/End/arrow keys select immediately, per the
1452
+ * native/ARIA radiogroup pattern Radix implements; there is no separate
1453
+ * "highlight vs commit" step). Reports the full resolved `ApprovalOption`
1454
+ * plus whatever reason text is currently held by a sibling
1455
+ * `ApprovalCardReason` — type a reason BEFORE choosing an option to have it
1456
+ * included in this call.
1457
+ */
1458
+ onConfirm?: (option: ApprovalOption, reason?: string) => void;
1459
+ }
1460
+ /**
1461
+ * ApprovalCardOptions — the N-option, scoped decision (#103). Renders through
1462
+ * `@elabs-ai/components-ui`'s `RadioGroup` (Radix) for roving focus, arrow-key
1463
+ * wrap, Home/End and announcement — never a hand-rolled
1464
+ * `parentElement.children[i]` focus walk. Composed inside `ApprovalCardRequest`,
1465
+ * alongside the existing `ApprovalCardTitle`/`ApprovalCardDescription`.
1466
+ */
1467
+ declare const ApprovalCardOptions: react.ForwardRefExoticComponent<Omit<ApprovalCardOptionsProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
1468
+ type ApprovalCardTargetProps = ComponentProps<"div">;
1469
+ /**
1470
+ * ApprovalCardTarget — the preview slot for WHAT is being approved: a
1471
+ * command, a path, or a richer node such as a `DiffView` (#102). Accepts
1472
+ * arbitrary children — this file never imports `DiffView`, the composition
1473
+ * happens entirely in the consumer's tree. Ungated by state (unlike
1474
+ * `ApprovalCardRequest`/`Accepted`/`Rejected`): the subject of a decision
1475
+ * stays visible after it resolves, not only while pending.
1476
+ */
1477
+ declare const ApprovalCardTarget: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1478
+ type ApprovalCardReasonProps = Omit<ComponentProps<typeof Textarea>, "value" | "defaultValue" | "onChange">;
1479
+ /**
1480
+ * ApprovalCardReason — the deny-with-reason input, wired to the `reason`
1481
+ * field that already exists on `ToolUIPartApproval` and was previously
1482
+ * unreachable from the UI. Shares its value with `ApprovalCardOptions`
1483
+ * through `Confirmation`'s own context (not a prop threaded between the two
1484
+ * sibling parts) — type here BEFORE choosing an option to have the text
1485
+ * included in that option's `onConfirm` call.
1486
+ */
1487
+ declare const ApprovalCardReason: react.ForwardRefExoticComponent<Omit<ApprovalCardReasonProps, "ref"> & react.RefAttributes<HTMLTextAreaElement>>;
965
1488
 
966
1489
  declare const Connection: ConnectionLineComponent;
967
1490
 
968
- type ModelId = string;
969
- interface ContextSchema {
970
- usedTokens: number;
971
- maxTokens: number;
972
- usage?: LanguageModelUsage;
973
- modelId?: ModelId;
974
- }
975
- type ContextProps = ComponentProps<typeof HoverCard> & ContextSchema;
976
- declare const Context: ({ usedTokens, maxTokens, usage, modelId, ...props }: ContextProps) => react.JSX.Element;
977
- type ContextTriggerProps = ComponentProps<typeof Button>;
978
- declare const ContextTrigger: ({ children, ...props }: ContextTriggerProps) => react.JSX.Element;
979
- type ContextContentProps = ComponentProps<typeof HoverCardContent>;
980
- declare const ContextContent: ({ className, ...props }: ContextContentProps) => react.JSX.Element;
981
- type ContextContentHeaderProps = ComponentProps<"div">;
982
- declare const ContextContentHeader: ({ children, className, ...props }: ContextContentHeaderProps) => react.JSX.Element;
983
- type ContextContentBodyProps = ComponentProps<"div">;
984
- declare const ContextContentBody: ({ children, className, ...props }: ContextContentBodyProps) => react.JSX.Element;
985
- type ContextContentFooterProps = ComponentProps<"div">;
986
- declare const ContextContentFooter: ({ children, className, ...props }: ContextContentFooterProps) => react.JSX.Element;
987
- type ContextInputUsageProps = ComponentProps<"div">;
988
- declare const ContextInputUsage: ({ className, children, ...props }: ContextInputUsageProps) => string | number | bigint | true | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
989
- type ContextOutputUsageProps = ComponentProps<"div">;
990
- declare const ContextOutputUsage: ({ className, children, ...props }: ContextOutputUsageProps) => string | number | bigint | true | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
991
- type ContextReasoningUsageProps = ComponentProps<"div">;
992
- declare const ContextReasoningUsage: ({ className, children, ...props }: ContextReasoningUsageProps) => string | number | bigint | true | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
993
- type ContextCacheUsageProps = ComponentProps<"div">;
994
- declare const ContextCacheUsage: ({ className, children, ...props }: ContextCacheUsageProps) => string | number | bigint | true | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
995
-
996
1491
  type ControlsProps = ComponentProps<typeof Controls$1>;
997
1492
  declare const Controls: (props: ControlsProps) => react.JSX.Element;
998
1493
 
999
- type ConversationProps = ComponentProps<typeof StickToBottom>;
1000
- declare const Conversation: ({ className, ...props }: ConversationProps) => react.JSX.Element;
1494
+ type ConversationProps = ComponentProps<typeof StickToBottom> & {
1495
+ /**
1496
+ * The assistant response is still arriving (loading-states.md
1497
+ * `isStreaming`). `role="log"` otherwise announces every incoming token to
1498
+ * assistive tech as it streams in — deafening. While `true`, `aria-live`
1499
+ * is suppressed (`"off"`) and `aria-busy` is set; once streaming ends,
1500
+ * `aria-live` returns to `"polite"` so the settled content is what
1501
+ * actually gets announced.
1502
+ * @default false
1503
+ */
1504
+ isStreaming?: boolean;
1505
+ };
1506
+ declare const Conversation: ({ className, isStreaming, ...props }: ConversationProps) => react.JSX.Element;
1001
1507
  type ConversationContentProps = ComponentProps<typeof StickToBottom.Content>;
1002
- declare const ConversationContent: ({ className, ...props }: ConversationContentProps) => react.JSX.Element;
1508
+ declare const ConversationContent: ({ className, scrollClassName, ...props }: ConversationContentProps) => react.JSX.Element;
1003
1509
  type ConversationEmptyStateProps = ComponentProps<"div"> & {
1004
1510
  title?: string;
1005
1511
  description?: string;
1006
1512
  icon?: React.ReactNode;
1513
+ /** Primary / secondary action(s) below the description (e.g. suggested prompts). */
1514
+ actions?: React.ReactNode;
1007
1515
  };
1008
- declare const ConversationEmptyState: ({ className, title, description, icon, children, ...props }: ConversationEmptyStateProps) => react.JSX.Element;
1516
+ declare const ConversationEmptyState: ({ className, title, description, icon, actions, children, ...props }: ConversationEmptyStateProps) => react.JSX.Element;
1009
1517
  type ConversationScrollButtonProps = ComponentProps<typeof Button>;
1010
1518
  declare const ConversationScrollButton: ({ className, ...props }: ConversationScrollButtonProps) => false | react.JSX.Element;
1011
1519
  type ConversationDownloadProps = Omit<ComponentProps<typeof Button>, "onClick"> & {
@@ -1016,6 +1524,48 @@ type ConversationDownloadProps = Omit<ComponentProps<typeof Button>, "onClick">
1016
1524
  declare const messagesToMarkdown: (messages: UIMessage[], formatMessage?: (message: UIMessage, index: number) => string) => string;
1017
1525
  declare const ConversationDownload: ({ messages, filename, formatMessage, className, children, ...props }: ConversationDownloadProps) => react.JSX.Element;
1018
1526
 
1527
+ interface DiffViewProps extends Omit<ComponentProps<"div">, "children"> {
1528
+ /** The diff, as a flat, ordered line list. */
1529
+ lines: DiffLine[];
1530
+ /** File path shown in the header. */
1531
+ file?: string;
1532
+ /** One-line summary shown beside the file name. */
1533
+ summary?: string;
1534
+ /** Added / removed line counts shown in the header. */
1535
+ stats?: {
1536
+ additions: number;
1537
+ deletions: number;
1538
+ };
1539
+ /** `inline` = unified single column; `split` = side-by-side. @default "inline" */
1540
+ variant?: "inline" | "split";
1541
+ /**
1542
+ * Full-screen reading surface: a scrollable region with a scroll-position
1543
+ * indicator, a key legend (↑/↓, Page Up/Down, Home/End), and a named
1544
+ * `role="region"`. Absorbs the upstream `CodexDiff` pager shape — this
1545
+ * prop, not a second component.
1546
+ */
1547
+ pager?: boolean;
1548
+ /** Shiki language id for intra-line syntax colour. Omit to render plain text. */
1549
+ language?: BundledLanguage;
1550
+ /** Collapse a run of consecutive `context` lines longer than this behind a "show more" control. */
1551
+ contextLines?: number;
1552
+ /** Hard cap on rendered lines. Extra lines are simply not rendered. */
1553
+ maxLines?: number;
1554
+ /** No renderable diff yet (loading-states.md) — layout-shaped skeleton rows at the real row height. */
1555
+ loading?: boolean;
1556
+ /** Lines are still arriving (loading-states.md) — render what exists; never an error surface. */
1557
+ isStreaming?: boolean;
1558
+ }
1559
+ /**
1560
+ * The row's fill-rung tint — the THIRD, redundant cue (accessibility.md /
1561
+ * styling-and-tokens.md). Never the only signal: every `add`/`del` row also
1562
+ * carries a marker glyph (shape) and an `sr-only` polarity word (name).
1563
+ */
1564
+ declare const diffRowVariants: (props?: ({
1565
+ type?: "meta" | "del" | "add" | "context" | "hunk" | null | undefined;
1566
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
1567
+ declare const DiffView: react.ForwardRefExoticComponent<Omit<DiffViewProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
1568
+
1019
1569
  declare const Edge: {
1020
1570
  Animated: (props: EdgeProps) => react.JSX.Element;
1021
1571
  Temporary: (props: EdgeProps) => react.JSX.Element;
@@ -1052,7 +1602,7 @@ type EnvironmentVariableCopyButtonProps = ComponentProps<typeof Button> & {
1052
1602
  timeout?: number;
1053
1603
  copyFormat?: "name" | "value" | "export";
1054
1604
  };
1055
- declare const EnvironmentVariableCopyButton: ({ onCopy, onError, timeout, copyFormat, children, className, ...props }: EnvironmentVariableCopyButtonProps) => react.JSX.Element;
1605
+ declare const EnvironmentVariableCopyButton: ({ onCopy, onError, timeout, copyFormat, children, className, "aria-label": ariaLabel, ...props }: EnvironmentVariableCopyButtonProps) => react.JSX.Element;
1056
1606
  type EnvironmentVariableRequiredProps = ComponentProps<typeof Badge>;
1057
1607
  declare const EnvironmentVariableRequired: ({ className, children, ...props }: EnvironmentVariableRequiredProps) => react.JSX.Element;
1058
1608
 
@@ -1319,7 +1869,7 @@ type ImageProps = Experimental_GeneratedImage & Omit<ImgHTMLAttributes<HTMLImage
1319
1869
  showSkeleton?: boolean;
1320
1870
  };
1321
1871
  /** `<img>` wrapper for an AI-SDK generated image, with a decode-aware skeleton. */
1322
- declare const Image: react.ForwardRefExoticComponent<Experimental_GeneratedImage & Omit<ImgHTMLAttributes<HTMLImageElement>, "src"> & {
1872
+ declare const Image: react.ForwardRefExoticComponent<ai.GeneratedFile & Omit<ImgHTMLAttributes<HTMLImageElement>, "src"> & {
1323
1873
  /**
1324
1874
  * Show a Skeleton placeholder (loading-states.md) until the img element
1325
1875
  * finishes decoding, so the base64 payload does not pop in. Requires
@@ -1396,78 +1946,6 @@ declare const InlineCitationSource: ({ title, url, description, className, child
1396
1946
  type InlineCitationQuoteProps = ComponentProps<"blockquote">;
1397
1947
  declare const InlineCitationQuote: ({ children, className, ...props }: InlineCitationQuoteProps) => react.JSX.Element;
1398
1948
 
1399
- interface InteractiveTerminalHandle {
1400
- /** Process → screen. ANSI passthrough (colors, cursor movement, clears, …). */
1401
- write(data: string): void;
1402
- /** Clears the viewport + scrollback. */
1403
- clear(): void;
1404
- /** Re-fits cols/rows to the current container size. */
1405
- fit(): void;
1406
- /** Focuses the terminal's input surface. */
1407
- focus(): void;
1408
- }
1409
- interface InteractiveTerminalProps extends Omit<HTMLAttributes<HTMLDivElement>, "onResize"> {
1410
- /** Keystrokes + paste → process. The PTY/process stays consumer-owned. */
1411
- onData?: (data: string) => void;
1412
- /** Fires whenever the container resizes and cols/rows are refit. */
1413
- onResize?: (size: {
1414
- cols: number;
1415
- rows: number;
1416
- }) => void;
1417
- /** Degrades to a read-only log: writes still render, stdin is disabled. */
1418
- readOnly?: boolean;
1419
- /** Terminal font size in px. Defaults to `13` (matches `CodeEditor`). */
1420
- fontSize?: number;
1421
- /** Accessible name for the terminal's real focusable surface. Required. */
1422
- "aria-label": string;
1423
- }
1424
- /**
1425
- * Builds xterm's `ITheme` from the active theme's semantic tokens, resolved
1426
- * off `rootEl` (defaults to `<html>`, where `data-theme` lives).
1427
- *
1428
- * ANSI mapping (documented so the intent is auditable, not guessed at):
1429
- * - background/foreground → `--card`/`--foreground` (the terminal reads as a
1430
- * raised panel, matching the existing `Terminal` log's bordered-box look).
1431
- * - cursor → `--primary`; cursorAccent → the background, so glyphs stay
1432
- * legible under a solid block cursor.
1433
- * - selectionBackground → a low-alpha `--primary` wash.
1434
- * - red/green/yellow/blue → the AA-tuned `-text` variants (`--destructive-text`,
1435
- * `--success-text`, `--warning-text`, `--info-text`) — these are the ones
1436
- * tuned to read as TEXT on a surface, which is exactly what ANSI color codes
1437
- * paint. `bright*` variants use the more saturated fill tokens
1438
- * (`--destructive`, `--success`, `--warning`, `--info`).
1439
- * - magenta/cyan → `--chart-4`/`--chart-2` (no dedicated fill/text pair, so the
1440
- * `bright*` siblings are the same hue pushed AWAY from the background).
1441
- * - black/white are `background`/`foreground` RUNGS, not the tokens
1442
- * themselves: `black` = the terminal's own background (the common "ANSI
1443
- * black" convention — invisible ink), `brightBlack` = `--border-strong`
1444
- * (a dim ink for comments/hashes), `white` = `--muted-foreground` (a dimmer
1445
- * ink), `brightWhite` = `--foreground` (full ink).
1446
- *
1447
- * EVERY slot above except `black` then passes through `readableInk()` — the AA
1448
- * floor (#386). The mapping picks the token that carries the right MEANING; the
1449
- * floor guarantees the resulting ink is legible on this terminal's actual
1450
- * background. Several of these tokens are mark/fill rungs (≥3:1 only), so
1451
- * without the floor EVERY palette this repo ships had sub-AA ANSI slots —
1452
- * measured from `themes.css`: `:root` 7 (worst 2.39:1), `light` 4 (worst
1453
- * 2.91:1), `dark` 1 (3.16:1). Re-derived on every
1454
- * run by `interactive-terminal.test.tsx`, which parses those palettes out of
1455
- * `themes.css` rather than hard-coding them. Keep new slots inside `ink(...)`;
1456
- * a raw token assigned straight to an ANSI slot is the bug.
1457
- */
1458
- declare function buildInteractiveTerminalTheme(rootEl?: Element | null): ITheme;
1459
- /**
1460
- * A token-themed, PTY-ready terminal emulator wrapped as a brand-ui component.
1461
- * Wraps xterm.js + `FitAddon`; the process itself is consumer-owned — this
1462
- * component only renders ANSI output and emits `onData`/`onResize`.
1463
- *
1464
- * Keyboard: the terminal's real focusable surface is xterm's own input
1465
- * textarea (reachable by Tab like any control). Tab/Shift-Tab and Escape are
1466
- * explicitly let through (`attachCustomKeyEventHandler`) so focus can always
1467
- * leave the terminal — there is no keyboard trap.
1468
- */
1469
- declare const InteractiveTerminal: react.ForwardRefExoticComponent<InteractiveTerminalProps & react.RefAttributes<InteractiveTerminalHandle>>;
1470
-
1471
1949
  /**
1472
1950
  * The readiness of the preview, derived from the input (see loading-states.md):
1473
1951
  * - `idle` — nothing requested yet (empty input, never rendered). Renders nothing.
@@ -1577,15 +2055,103 @@ declare const createLazyMermaidPlugin: (options?: {
1577
2055
  */
1578
2056
  declare const lazyMermaid: DiagramPlugin;
1579
2057
 
1580
- interface MarkdownViewProps extends Omit<ComponentProps<typeof Streamdown>, "components" | "plugins"> {
2058
+ type StreamdownComponents = NonNullable<ComponentProps<typeof Streamdown>["components"]>;
2059
+ type StreamdownPlugins = ComponentProps<typeof Streamdown>["plugins"];
2060
+ interface MarkdownViewProps extends Omit<ComponentProps<typeof Streamdown>, "components" | "plugins" | "rehypePlugins"> {
1581
2061
  /**
1582
2062
  * The prose level a markdown `#` maps to; deeper headings shift with it
1583
2063
  * (capped at 6). Default `1` (the full reading scale). Pass `2` in narrow
1584
2064
  * embeds (a context rail) so headings stay on the constrained rung.
1585
2065
  */
1586
2066
  baseHeadingLevel?: ProseHeadingLevel;
2067
+ /**
2068
+ * Per-element renderer overrides, MERGED over the internal Prose* map
2069
+ * (#10) — a consumer entry wins for its key; every key the consumer does
2070
+ * NOT set keeps rendering through `buildProseComponents()`. This is the
2071
+ * seam for rendering inline citations: override `a` (or a custom node
2072
+ * type) to swap a `[1](url)`-style marker for an `InlineCitation` chip
2073
+ * while headings/lists/etc. keep the branded prose styling.
2074
+ *
2075
+ * Deliberately a MERGE, not a replace: sanitisation is unaffected either
2076
+ * way (see `plugins` below), but a wholesale replace would silently drop
2077
+ * the branded styling from every element the consumer didn't think to
2078
+ * re-declare — a citation override should not have to also re-implement
2079
+ * headings/lists/code to keep them on-brand.
2080
+ *
2081
+ * **Known constraint: a `components` change alone does not force a
2082
+ * re-render of already-rendered markdown (#10).** Streamdown memoizes on
2083
+ * `children`/`plugins`/theme/etc but NOT on `components`
2084
+ * (`streamdown@2.5.0`'s top-level `memo` comparator omits it), so if the
2085
+ * SAME markdown string is still current when an override's closed-over
2086
+ * data changes — e.g. an inline-citation chip that resolves its title
2087
+ * asynchronously — the new render function is captured but nothing
2088
+ * schedules Streamdown to call it again. Don't rely on a `components`
2089
+ * closure to reflect state that arrives after the initial render; instead
2090
+ * have the overriding component read that state itself (a shared context,
2091
+ * a store keyed by citation id, or an internal `useState`/subscription
2092
+ * inside the override) so IT re-renders independently of `MarkdownView`'s
2093
+ * own render pass — the pattern `InlineCitation`/`InlineCitationCard`
2094
+ * already use.
2095
+ */
2096
+ components?: StreamdownComponents;
2097
+ /**
2098
+ * Streamdown plugin-slot overrides (`cjk`/`code`/`math`/`mermaid`/
2099
+ * `renderers`), MERGED per key over the internal defaults (the reactive,
2100
+ * brand-token-derived `code` plugin and i18n-aware `cjk`/`math`/`mermaid`
2101
+ * set — see `_streamdown-i18n.ts`).
2102
+ *
2103
+ * **This narrow `plugins` prop can only APPEND — it can never displace
2104
+ * Streamdown's default `rehypePlugins` chain** (`rehype-raw` →
2105
+ * `rehype-sanitize` → `rehype-harden`). `MarkdownView` never sets
2106
+ * `rehypePlugins` itself, and nothing in `PluginConfig` removes or replaces
2107
+ * a member of that pipeline, so the sanitiser cannot be turned off through
2108
+ * this prop. But two of the five slots are **not** upstream of it and must
2109
+ * be treated as trusted code:
2110
+ * - **`math.rehypePlugin` runs AFTER `rehype-sanitize`/`rehype-harden`**
2111
+ * (appended to the end of the rehype pipeline, verified against
2112
+ * `streamdown@2.5.0`'s `dist/chunk-BO2N2NFS.js`) — its output is never
2113
+ * re-sanitised.
2114
+ * - **`mermaid` never enters the rehype/remark pipeline at all.** Its
2115
+ * `getMermaid().render()` result is written via
2116
+ * `dangerouslySetInnerHTML` (streamdown's only such sink). brand-ui's own
2117
+ * `useStreamdownPlugins()` default pins `securityLevel: "strict"`
2118
+ * (`_lazy-mermaid.ts`); a replacement `mermaid` plugin must sanitise its
2119
+ * own SVG output the same way.
2120
+ * - `cjk` (remark-stage only — its output is re-sanitised downstream by
2121
+ * the rehype pipeline like any other remark result), `code` (feeds only
2122
+ * `shikiTheme`, no HTML injection) and `renderers` (ordinary React
2123
+ * components rendered with the fenced block's raw `code` string as a
2124
+ * `string` prop, the same trusted-component boundary as a `components`
2125
+ * override) do not bypass sanitisation.
2126
+ *
2127
+ * **`rehypePlugins` is NOT exposed on this component (#36, fixed).** Unlike
2128
+ * `plugins`, a caller-supplied `rehypePlugins` array would REPLACE
2129
+ * Streamdown's default rehype pipeline wholesale rather than extending it,
2130
+ * silently dropping `rehype-raw`/`rehype-sanitize`/`rehype-harden` and
2131
+ * letting a plain markdown string execute script in the host page — so
2132
+ * `MarkdownViewProps` `Omit`s it at the type level AND
2133
+ * `stripSanitizerOverrides()` deletes it at runtime before the `{...props}`
2134
+ * spread below, even if a JS consumer or a cast reaches this component with
2135
+ * it set. If you need to widen sanitisation, use
2136
+ * `allowedTags`/`literalTagContent`, which MERGE into the sanitize schema
2137
+ * instead of replacing the pipeline. See
2138
+ * `packages/ai/src/_streamdown-safety.ts`.
2139
+ *
2140
+ * **`remarkPlugins` IS supported** (PR #74 review, round 1 — the original
2141
+ * #36 fix over-reached and removed it too). The remark stage runs strictly
2142
+ * upstream of the rehype chain, and Streamdown builds its rehype list
2143
+ * without reading `remarkPlugins`, so everything a remark plugin emits is
2144
+ * still sanitised downstream — measured across raw-`html` mdast nodes,
2145
+ * `data.hName`/`hChildren` hast elements, `hProperties` event handlers,
2146
+ * `javascript:` link URLs and smuggled `raw` hast children. Note the
2147
+ * ordinary (non-security) footgun: your array REPLACES Streamdown's own
2148
+ * remark defaults (`remark-gfm`, `codeMeta`), so spread
2149
+ * `Object.values(defaultRemarkPlugins)` from `streamdown` back in if you
2150
+ * want to keep GFM tables/strikethrough.
2151
+ */
2152
+ plugins?: StreamdownPlugins;
1587
2153
  }
1588
- declare const MarkdownView: ({ baseHeadingLevel, className, children, ...props }: MarkdownViewProps) => react.JSX.Element;
2154
+ declare const MarkdownView: ({ baseHeadingLevel, className, children, components: componentOverrides, plugins: pluginOverrides, ...props }: MarkdownViewProps) => react.JSX.Element;
1589
2155
 
1590
2156
  type MessageProps = HTMLAttributes<HTMLDivElement> & {
1591
2157
  from: UIMessage["role"];
@@ -1685,7 +2251,7 @@ type MessageBranchProps = HTMLAttributes<HTMLDivElement> & {
1685
2251
  };
1686
2252
  declare const MessageBranch: ({ branch: branchProp, defaultBranch, onBranchChange, className, ...props }: MessageBranchProps) => react.JSX.Element;
1687
2253
  type MessageBranchContentProps = HTMLAttributes<HTMLDivElement>;
1688
- declare const MessageBranchContent: ({ children, ...props }: MessageBranchContentProps) => react.JSX.Element[];
2254
+ declare const MessageBranchContent: ({ children, id, ...props }: MessageBranchContentProps) => react.JSX.Element[];
1689
2255
  type MessageBranchSelectorProps = ComponentProps<typeof ButtonGroup>;
1690
2256
  declare const MessageBranchSelector: ({ className, ...props }: MessageBranchSelectorProps) => react.JSX.Element | null;
1691
2257
  type MessageBranchPreviousProps = ComponentProps<typeof Button>;
@@ -1694,7 +2260,19 @@ type MessageBranchNextProps = ComponentProps<typeof Button>;
1694
2260
  declare const MessageBranchNext: ({ children, ...props }: MessageBranchNextProps) => react.JSX.Element;
1695
2261
  type MessageBranchPageProps = HTMLAttributes<HTMLSpanElement>;
1696
2262
  declare const MessageBranchPage: ({ className, ...props }: MessageBranchPageProps) => react.JSX.Element;
1697
- type MessageResponseProps = ComponentProps<typeof Streamdown> & {
2263
+ /**
2264
+ * `rehypePlugins` is NOT exposed on `MessageResponse` (#36, fixed). This
2265
+ * renders untrusted, streamed model output — the type-level `Omit` below plus
2266
+ * a runtime `stripSanitizerOverrides()` call before the `{...props}` spread
2267
+ * onto `<Streamdown>` keep Streamdown's default sanitiser chain (rehype-raw →
2268
+ * rehype-sanitize → rehype-harden) non-overridable, even through a JS consumer
2269
+ * or a force-cast.
2270
+ *
2271
+ * `remarkPlugins` IS supported: the remark stage runs upstream of that chain
2272
+ * and cannot bypass it (PR #74 review, round 1). See `MarkdownView`'s TSDoc and
2273
+ * `packages/ai/src/_streamdown-safety.ts` for the full security model.
2274
+ */
2275
+ type MessageResponseProps = Omit<ComponentProps<typeof Streamdown>, "rehypePlugins"> & {
1698
2276
  /**
1699
2277
  * No content has arrived yet (loading-states.md `loading`) — renders
1700
2278
  * skeleton lines at the body line-height instead of `<Streamdown>`, so the
@@ -1702,11 +2280,112 @@ type MessageResponseProps = ComponentProps<typeof Streamdown> & {
1702
2280
  * @default false
1703
2281
  */
1704
2282
  loading?: boolean;
2283
+ /**
2284
+ * Custom renderers for markdown elements. **Semantics differ from
2285
+ * `MarkdownView`:** `components` here REPLACES (not merges) per key against
2286
+ * Streamdown's own defaults, since `MessageResponse` has no internal
2287
+ * component map to merge with. See `MarkdownView` for merge-over-defaults
2288
+ * semantics and `#10` for details.
2289
+ */
2290
+ components?: ComponentProps<typeof Streamdown>["components"];
2291
+ /**
2292
+ * Streamdown plugin-slot overrides (`cjk`/`code`/`math`/`mermaid`/
2293
+ * `renderers`), **merged** per key over the internal defaults, so a
2294
+ * consumer's entry wins for its key; every key the consumer does not set
2295
+ * keeps the reactive, i18n-aware internal default. Same semantics as
2296
+ * `MarkdownView` (#10 fix round).
2297
+ *
2298
+ * **This narrow `plugins` prop can only APPEND — it can never displace
2299
+ * Streamdown's default `rehypePlugins` chain** (`rehype-raw` →
2300
+ * `rehype-sanitize` → `rehype-harden`). `MessageResponse` never sets
2301
+ * `rehypePlugins` itself, and nothing in `PluginConfig` removes a member of
2302
+ * that pipeline. But two of the five slots are **not** upstream of it and
2303
+ * must be treated as TRUSTED CODE (#76):
2304
+ * - **`math.rehypePlugin` runs AFTER `rehype-sanitize`/`rehype-harden`** —
2305
+ * it is appended to the end of the rehype pipeline (verified against
2306
+ * `streamdown@2.5.0`'s `dist/chunk-BO2N2NFS.js`), so its output is never
2307
+ * re-sanitised. Replacing it emits a dev-only `console.warn`; the plugin
2308
+ * still runs (the seam is deliberate, not a hole to close). The sharp
2309
+ * edge in practice is KaTeX's `trust` option — it disables KaTeX's own
2310
+ * sanitisation, so leave it off for model-authored content.
2311
+ * - **`mermaid` never enters the rehype/remark pipeline at all.** Its
2312
+ * render output is written via `dangerouslySetInnerHTML` (streamdown's
2313
+ * only such sink); brand-ui's default pins mermaid's strict security
2314
+ * level, and a replacement must sanitise its own SVG. Also dev-warned.
2315
+ * - `cjk` (remark-stage, re-sanitised downstream), `code` (feeds
2316
+ * `shikiTheme` only) and `renderers` (ordinary React components) do not
2317
+ * bypass sanitisation and are never warned about.
2318
+ *
2319
+ * See `docs/CSP-AND-NETWORK.md` §1 and
2320
+ * `packages/ai/src/_streamdown-safety.ts`; `MarkdownView`'s TSDoc carries
2321
+ * the same model for the sibling surface.
2322
+ */
2323
+ plugins?: ComponentProps<typeof Streamdown>["plugins"];
1705
2324
  };
1706
- declare const MessageResponse: react.MemoExoticComponent<({ className, loading, ...props }: MessageResponseProps) => react.JSX.Element>;
2325
+ declare const MessageResponse: react.MemoExoticComponent<({ className, loading, plugins: pluginOverrides, ...props }: MessageResponseProps) => react.JSX.Element>;
1707
2326
  type MessageToolbarProps = ComponentProps<"div">;
1708
2327
  declare const MessageToolbar: ({ className, children, ...props }: MessageToolbarProps) => react.JSX.Element;
1709
2328
 
2329
+ /** The minimum a column needs to identify itself — mainly its accessible name. */
2330
+ interface MessageCompareModel {
2331
+ /** Rendered in the column header AND used as the region's `aria-label`. */
2332
+ name: string;
2333
+ /** Optional stable id, e.g. for analytics — not used for layout or a11y. */
2334
+ id?: string;
2335
+ }
2336
+ /** `MessageCompare` supports 2-4 side-by-side responses (issue #23). */
2337
+ type MessageCompareColumnsCount = 2 | 3 | 4;
2338
+ type MessageCompareProps = Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
2339
+ /** `MessageCompareColumn` elements — 2 to 4. */
2340
+ children: ReactNode;
2341
+ columns: MessageCompareColumnsCount;
2342
+ /** Controlled sync-scroll flag. Omit for the uncontrolled default (off). */
2343
+ syncScroll?: boolean;
2344
+ /** Uncontrolled initial value. @default false */
2345
+ defaultSyncScroll?: boolean;
2346
+ onSyncScrollChange?: (value: boolean) => void;
2347
+ /** aria-label for the narrow-viewport tab strip. Defaults to microcopy. */
2348
+ tabsLabel?: string;
2349
+ };
2350
+ /**
2351
+ * Responsive side-by-side comparison of 2-4 `MessageCompareColumn`s. Desktop:
2352
+ * resizable columns (`ResizablePanelGroup`). Under `md`: a `Tabs` strip, per
2353
+ * the issue's named narrow-viewport treatment.
2354
+ */
2355
+ declare const MessageCompare: react.ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
2356
+ /** `MessageCompareColumn` elements — 2 to 4. */
2357
+ children: ReactNode;
2358
+ columns: MessageCompareColumnsCount;
2359
+ /** Controlled sync-scroll flag. Omit for the uncontrolled default (off). */
2360
+ syncScroll?: boolean;
2361
+ /** Uncontrolled initial value. @default false */
2362
+ defaultSyncScroll?: boolean;
2363
+ onSyncScrollChange?: (value: boolean) => void;
2364
+ /** aria-label for the narrow-viewport tab strip. Defaults to microcopy. */
2365
+ tabsLabel?: string;
2366
+ } & react.RefAttributes<HTMLDivElement>>;
2367
+ type MessageCompareColumnProps = Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
2368
+ /** Identifies the column — its `name` becomes the region's accessible name. */
2369
+ model: MessageCompareModel;
2370
+ /** In-flight state for this column's OWN response, independent of siblings. */
2371
+ status?: ChatStatus;
2372
+ /** The consumer's own `Message`/`MessageResponse` composition for this column. */
2373
+ children?: ReactNode;
2374
+ };
2375
+ /**
2376
+ * One labelled, independently-scrolling response column. `role="region"` +
2377
+ * `aria-label={model.name}` so a screen-reader user can tell which answer
2378
+ * they're in (issue #23 a11y requirement).
2379
+ */
2380
+ declare const MessageCompareColumn: react.ForwardRefExoticComponent<Omit<HTMLAttributes<HTMLDivElement>, "children"> & {
2381
+ /** Identifies the column — its `name` becomes the region's accessible name. */
2382
+ model: MessageCompareModel;
2383
+ /** In-flight state for this column's OWN response, independent of siblings. */
2384
+ status?: ChatStatus;
2385
+ /** The consumer's own `Message`/`MessageResponse` composition for this column. */
2386
+ children?: ReactNode;
2387
+ } & react.RefAttributes<HTMLDivElement>>;
2388
+
1710
2389
  interface MessageEditContextValue {
1711
2390
  editing: boolean;
1712
2391
  draft: string;
@@ -2522,7 +3201,6 @@ declare const formSpecSchema: z.ZodObject<{
2522
3201
  /** Submit button label. @default "Submit" */
2523
3202
  submitLabel: z.ZodOptional<z.ZodString>;
2524
3203
  }, "strip", z.ZodTypeAny, {
2525
- formName: string;
2526
3204
  fields: ({
2527
3205
  name: string;
2528
3206
  type: "string";
@@ -2583,11 +3261,11 @@ declare const formSpecSchema: z.ZodObject<{
2583
3261
  required?: boolean | undefined;
2584
3262
  description?: string | undefined;
2585
3263
  })[];
3264
+ formName: string;
2586
3265
  title?: string | undefined;
2587
3266
  description?: string | undefined;
2588
3267
  submitLabel?: string | undefined;
2589
3268
  }, {
2590
- formName: string;
2591
3269
  fields: ({
2592
3270
  name: string;
2593
3271
  type: "string";
@@ -2648,6 +3326,7 @@ declare const formSpecSchema: z.ZodObject<{
2648
3326
  required?: boolean | undefined;
2649
3327
  description?: string | undefined;
2650
3328
  })[];
3329
+ formName: string;
2651
3330
  title?: string | undefined;
2652
3331
  description?: string | undefined;
2653
3332
  submitLabel?: string | undefined;
@@ -2719,6 +3398,8 @@ interface MessageFormProviderProps {
2719
3398
  /** In-flight submit: controls disabled, the submit button shows a spinner. */
2720
3399
  submitting?: boolean;
2721
3400
  /** The spec is still streaming in (renders a skeleton when no fields yet). */
3401
+ isStreaming?: boolean;
3402
+ /** @deprecated Use `isStreaming`. */
2722
3403
  streaming?: boolean;
2723
3404
  children: ReactNode;
2724
3405
  }
@@ -2726,7 +3407,7 @@ interface MessageFormProviderProps {
2726
3407
  * Lifts the form values. Controlled (pass `values`) or uncontrolled.
2727
3408
  * Derives `isControlled = values !== undefined` and never flips modes.
2728
3409
  */
2729
- declare function MessageFormProvider({ spec, values: valuesProp, onChange, onSubmit, disabled, submitted, submitting, streaming, children, }: MessageFormProviderProps): react.JSX.Element;
3410
+ declare function MessageFormProvider({ spec, values: valuesProp, onChange, onSubmit, disabled, submitted, submitting, isStreaming, streaming, children, }: MessageFormProviderProps): react.JSX.Element;
2730
3411
  interface MessageFormFieldProps extends Omit<HTMLAttributes<HTMLDivElement>, "children"> {
2731
3412
  /** The field's `name` (its key in the spec + values). */
2732
3413
  name: string;
@@ -2788,6 +3469,8 @@ interface MessageFormProps extends Omit<HTMLAttributes<HTMLDivElement>, "onSubmi
2788
3469
  /** In-flight submit: controls disabled, spinner on submit. */
2789
3470
  submitting?: boolean;
2790
3471
  /** The spec is still streaming (renders a skeleton when no fields yet). */
3472
+ isStreaming?: boolean;
3473
+ /** @deprecated Use `isStreaming`. */
2791
3474
  streaming?: boolean;
2792
3475
  }
2793
3476
  /**
@@ -2830,11 +3513,11 @@ declare const columnSpecSchema: z.ZodObject<{
2830
3513
  }, "strip", z.ZodTypeAny, {
2831
3514
  key: string;
2832
3515
  label?: string | undefined;
2833
- format?: "number" | "text" | "percent" | "currency" | "date" | "badge" | undefined;
3516
+ format?: "number" | "text" | "percent" | "currency" | "badge" | "date" | undefined;
2834
3517
  }, {
2835
3518
  key: string;
2836
3519
  label?: string | undefined;
2837
- format?: "number" | "text" | "percent" | "currency" | "date" | "badge" | undefined;
3520
+ format?: "number" | "text" | "percent" | "currency" | "badge" | "date" | undefined;
2838
3521
  }>;
2839
3522
  type ColumnSpec = z.infer<typeof columnSpecSchema>;
2840
3523
  /** A single row: an object keyed by column `key`. */
@@ -2857,11 +3540,11 @@ declare const tableSpecSchema: z.ZodObject<{
2857
3540
  }, "strip", z.ZodTypeAny, {
2858
3541
  key: string;
2859
3542
  label?: string | undefined;
2860
- format?: "number" | "text" | "percent" | "currency" | "date" | "badge" | undefined;
3543
+ format?: "number" | "text" | "percent" | "currency" | "badge" | "date" | undefined;
2861
3544
  }, {
2862
3545
  key: string;
2863
3546
  label?: string | undefined;
2864
- format?: "number" | "text" | "percent" | "currency" | "date" | "badge" | undefined;
3547
+ format?: "number" | "text" | "percent" | "currency" | "badge" | "date" | undefined;
2865
3548
  }>, "many">;
2866
3549
  /** Row objects keyed by column `key`. */
2867
3550
  rows: z.ZodArray<z.ZodRecord<z.ZodString, z.ZodUnknown>, "many">;
@@ -2871,7 +3554,7 @@ declare const tableSpecSchema: z.ZodObject<{
2871
3554
  columns: {
2872
3555
  key: string;
2873
3556
  label?: string | undefined;
2874
- format?: "number" | "text" | "percent" | "currency" | "date" | "badge" | undefined;
3557
+ format?: "number" | "text" | "percent" | "currency" | "badge" | "date" | undefined;
2875
3558
  }[];
2876
3559
  rows: Record<string, unknown>[];
2877
3560
  title?: string | undefined;
@@ -2880,7 +3563,7 @@ declare const tableSpecSchema: z.ZodObject<{
2880
3563
  columns: {
2881
3564
  key: string;
2882
3565
  label?: string | undefined;
2883
- format?: "number" | "text" | "percent" | "currency" | "date" | "badge" | undefined;
3566
+ format?: "number" | "text" | "percent" | "currency" | "badge" | "date" | undefined;
2884
3567
  }[];
2885
3568
  rows: Record<string, unknown>[];
2886
3569
  title?: string | undefined;
@@ -2960,6 +3643,8 @@ interface MessageTableProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"
2960
3643
  /** Per-cell render override for custom composition. */
2961
3644
  renderCell?: RenderCell;
2962
3645
  /** The spec is still streaming (columns-but-no-rows shows skeleton rows). */
3646
+ isStreaming?: boolean;
3647
+ /** @deprecated Use `isStreaming`. */
2963
3648
  streaming?: boolean;
2964
3649
  }
2965
3650
  /**
@@ -3023,30 +3708,6 @@ declare const MicSelectorLabel: ({ device, className, ...props }: MicSelectorLab
3023
3708
  type MicSelectorValueProps = ComponentProps<"span">;
3024
3709
  declare const MicSelectorValue: ({ className, ...props }: MicSelectorValueProps) => react.JSX.Element;
3025
3710
 
3026
- type ModelSelectorProps = ComponentProps<typeof Dialog>;
3027
- declare const ModelSelector: (props: ModelSelectorProps) => react.JSX.Element;
3028
- type ModelSelectorTriggerProps = ComponentProps<typeof DialogTrigger>;
3029
- declare const ModelSelectorTrigger: (props: ModelSelectorTriggerProps) => react.JSX.Element;
3030
- type ModelSelectorContentProps = ComponentProps<typeof DialogContent> & {
3031
- title?: ReactNode;
3032
- };
3033
- declare const ModelSelectorContent: ({ className, children, title, ...props }: ModelSelectorContentProps) => react.JSX.Element;
3034
- type ModelSelectorDialogProps = ComponentProps<typeof CommandDialog>;
3035
- declare const ModelSelectorDialog: (props: ModelSelectorDialogProps) => react.JSX.Element;
3036
- type ModelSelectorInputProps = ComponentProps<typeof CommandInput>;
3037
- declare const ModelSelectorInput: ({ className, ...props }: ModelSelectorInputProps) => react.JSX.Element;
3038
- type ModelSelectorListProps = ComponentProps<typeof CommandList>;
3039
- declare const ModelSelectorList: (props: ModelSelectorListProps) => react.JSX.Element;
3040
- type ModelSelectorEmptyProps = ComponentProps<typeof CommandEmpty>;
3041
- declare const ModelSelectorEmpty: (props: ModelSelectorEmptyProps) => react.JSX.Element;
3042
- type ModelSelectorGroupProps = ComponentProps<typeof CommandGroup>;
3043
- declare const ModelSelectorGroup: (props: ModelSelectorGroupProps) => react.JSX.Element;
3044
- type ModelSelectorItemProps = ComponentProps<typeof CommandItem>;
3045
- declare const ModelSelectorItem: (props: ModelSelectorItemProps) => react.JSX.Element;
3046
- type ModelSelectorShortcutProps = ComponentProps<typeof CommandShortcut>;
3047
- declare const ModelSelectorShortcut: (props: ModelSelectorShortcutProps) => react.JSX.Element;
3048
- type ModelSelectorSeparatorProps = ComponentProps<typeof CommandSeparator>;
3049
- declare const ModelSelectorSeparator: (props: ModelSelectorSeparatorProps) => react.JSX.Element;
3050
3711
  /**
3051
3712
  * Where provider logos are fetched from by default.
3052
3713
  *
@@ -3054,11 +3715,11 @@ declare const ModelSelectorSeparator: (props: ModelSelectorSeparatorProps) => re
3054
3715
  * Self-host the SVGs and pass `src` (or set a `fallback`) — see
3055
3716
  * `docs/CSP-AND-NETWORK.md`.
3056
3717
  */
3057
- declare const MODEL_SELECTOR_LOGO_BASE_URL = "https://models.dev/logos";
3058
- type ModelSelectorLogoProps = Omit<ComponentProps<"img">, "alt"> & {
3718
+ declare const MODEL_PROVIDER_LOGO_BASE_URL = "https://models.dev/logos";
3719
+ type ModelProviderLogoProps = Omit<ComponentProps<"img">, "alt"> & {
3059
3720
  /**
3060
3721
  * Override the logo URL — point at a self-hosted or bundled asset when a CSP
3061
- * blocks `models.dev`. Defaults to `${MODEL_SELECTOR_LOGO_BASE_URL}/<provider>.svg`.
3722
+ * blocks `models.dev`. Defaults to `${MODEL_PROVIDER_LOGO_BASE_URL}/<provider>.svg`.
3062
3723
  */
3063
3724
  src?: string;
3064
3725
  /**
@@ -3069,11 +3730,21 @@ type ModelSelectorLogoProps = Omit<ComponentProps<"img">, "alt"> & {
3069
3730
  fallback?: ReactNode;
3070
3731
  provider: "moonshotai-cn" | "lucidquery" | "moonshotai" | "zai-coding-plan" | "alibaba" | "xai" | "vultr" | "nvidia" | "upstage" | "groq" | "github-copilot" | "mistral" | "vercel" | "nebius" | "deepseek" | "alibaba-cn" | "google-vertex-anthropic" | "venice" | "chutes" | "cortecs" | "github-models" | "togetherai" | "azure" | "baseten" | "huggingface" | "opencode" | "fastrouter" | "google" | "google-vertex" | "cloudflare-workers-ai" | "inception" | "wandb" | "openai" | "zhipuai-coding-plan" | "perplexity" | "openrouter" | "zenmux" | "v0" | "iflowcn" | "synthetic" | "deepinfra" | "zhipuai" | "submodel" | "zai" | "inference" | "requesty" | "morph" | "lmstudio" | "anthropic" | "aihubmix" | "fireworks-ai" | "modelscope" | "llama" | "scaleway" | "amazon-bedrock" | "cerebras" | (string & {});
3071
3732
  };
3072
- declare const ModelSelectorLogo: ({ provider, className, src, fallback, onError, ...props }: ModelSelectorLogoProps) => react.JSX.Element;
3073
- type ModelSelectorLogoGroupProps = ComponentProps<"div">;
3074
- declare const ModelSelectorLogoGroup: ({ className, ...props }: ModelSelectorLogoGroupProps) => react.JSX.Element;
3075
- type ModelSelectorNameProps = ComponentProps<"span">;
3076
- declare const ModelSelectorName: ({ className, ...props }: ModelSelectorNameProps) => react.JSX.Element;
3733
+ /**
3734
+ * The mark of an AI model provider (`anthropic`, `openai`, `google`, …), sized
3735
+ * for a row in a model list.
3736
+ *
3737
+ * **`ModelProviderLogo` vs `ServiceLogo` (`@elabs-ai/components-icons`).** An AI
3738
+ * provider mark with a zero-config remote default — name the provider and a logo
3739
+ * appears, no registration step — is this component. Any other third-party
3740
+ * service mark, resolved from a registry the app supplies and never fetched, is
3741
+ * `ServiceLogo`. The two are not interchangeable: `ServiceLogo` has no
3742
+ * per-instance `src` and no `onError`, and this one reaches a remote origin by
3743
+ * default (see `docs/CSP-AND-NETWORK.md`).
3744
+ */
3745
+ declare const ModelProviderLogo: ({ provider, className, src, fallback, onError, ...props }: ModelProviderLogoProps) => react.JSX.Element;
3746
+ type ModelProviderLogoGroupProps = ComponentProps<"div">;
3747
+ declare const ModelProviderLogoGroup: ({ className, ...props }: ModelProviderLogoGroupProps) => react.JSX.Element;
3077
3748
 
3078
3749
  interface BrandMotionConfigProps {
3079
3750
  children: ReactNode;
@@ -3175,6 +3846,47 @@ declare const PackageInfoDependency: ({ name, version, className, children, ...p
3175
3846
  type PanelProps = ComponentProps<typeof Panel$1>;
3176
3847
  declare const Panel: (props: PanelProps) => react.JSX.Element;
3177
3848
 
3849
+ /**
3850
+ * PermissionModeSelect — the standing-permission-policy chooser (#104).
3851
+ *
3852
+ * Distinct from `Confirmation`/`ApprovalCard` (#103): those render ONE
3853
+ * per-call decision ("may I run this command?"). This renders the POLICY
3854
+ * that governs how many of those per-call decisions ever occur ("how much
3855
+ * may you do without asking?"). The two stay separate components with a
3856
+ * documented relationship rather than one growing a boolean "policy mode"
3857
+ * prop — see `.claude/rules/component-api.md` ("Avoid boolean-prop
3858
+ * proliferation").
3859
+ *
3860
+ * The mode vocabulary is entirely app-defined: no agent's mode names are
3861
+ * hardcoded in this file or in `PermissionMode`/`PermissionModeSelectProps`.
3862
+ * `consequence` is a REQUIRED field — a mode whose effect is unstated is
3863
+ * exactly the failure this component exists to prevent (three unlabelled
3864
+ * radio buttons).
3865
+ *
3866
+ * Built on `@elabs-ai/components-ui`'s `RadioGroup` (Radix) for roving
3867
+ * focus / arrow-key navigation / Space-Enter selection / announcement — this
3868
+ * component does not hand-roll any of that. The in-force mode is marked in
3869
+ * TEXT: a "Current" badge lives inside the `<Label>` associated with that
3870
+ * mode's radio input, so it is part of the control's accessible name and
3871
+ * recoverable in greyscale — never colour alone (WCAG 1.4.1).
3872
+ */
3873
+ interface PermissionMode {
3874
+ id: string;
3875
+ label: string;
3876
+ /** What this mode actually permits — required, not optional. */
3877
+ consequence: string;
3878
+ keyHint?: string;
3879
+ }
3880
+ interface PermissionModeSelectProps extends ComponentProps<"div"> {
3881
+ modes: PermissionMode[];
3882
+ value?: string;
3883
+ defaultValue?: string;
3884
+ onValueChange?: (id: string) => void;
3885
+ /** The mode currently in force, marked distinctly from the highlighted one. */
3886
+ currentId?: string;
3887
+ }
3888
+ declare const PermissionModeSelect: react.ForwardRefExoticComponent<Omit<PermissionModeSelectProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
3889
+
3178
3890
  /**
3179
3891
  * Persona artwork sources — a plain data module shared by `persona.tsx` (the
3180
3892
  * public shell) and `_persona-rive.tsx` (the lazily-loaded Rive half), so
@@ -3223,6 +3935,21 @@ declare const PERSONA_SOURCES: {
3223
3935
  };
3224
3936
  type PersonaVariant = keyof typeof PERSONA_SOURCES;
3225
3937
 
3938
+ /**
3939
+ * Owned mirror of `@rive-app/webgl2`'s `Event` (the parameter type every
3940
+ * `RiveParameters` callback receives) — see the module doc comment above.
3941
+ * `data` is deliberately widened to `unknown` rather than replicating Rive's
3942
+ * `RiveEventPayload`/`LoopEvent`/`RiveFile` union: no callback in this package
3943
+ * (or, realistically, a consumer's) narrows it, and `unknown` remains a safe,
3944
+ * structurally-compatible supertype of the real union for the conformance
3945
+ * assertion in `_persona-rive.tsx`.
3946
+ */
3947
+ interface PersonaRiveEvent {
3948
+ type: string;
3949
+ data?: unknown;
3950
+ }
3951
+ /** Owned mirror of `@rive-app/webgl2`'s `EventCallback`. */
3952
+ type PersonaRiveEventCallback = (event: PersonaRiveEvent) => void;
3226
3953
  interface PersonaProps {
3227
3954
  className?: string;
3228
3955
  /**
@@ -3231,12 +3958,12 @@ interface PersonaProps {
3231
3958
  * so a blocked fetch never leaves an empty box.
3232
3959
  */
3233
3960
  fallback?: ReactNode;
3234
- onLoad?: RiveParameters["onLoad"];
3235
- onLoadError?: RiveParameters["onLoadError"];
3236
- onPause?: RiveParameters["onPause"];
3237
- onPlay?: RiveParameters["onPlay"];
3961
+ onLoad?: PersonaRiveEventCallback;
3962
+ onLoadError?: PersonaRiveEventCallback;
3963
+ onPause?: PersonaRiveEventCallback;
3964
+ onPlay?: PersonaRiveEventCallback;
3238
3965
  onReady?: () => void;
3239
- onStop?: RiveParameters["onStop"];
3966
+ onStop?: PersonaRiveEventCallback;
3240
3967
  /**
3241
3968
  * Override the `.riv` artwork URL — point at a self-hosted copy when a CSP
3242
3969
  * blocks the default origin. Defaults to `PERSONA_SOURCES[variant].source`.
@@ -3255,21 +3982,35 @@ interface PersonaProps {
3255
3982
  }
3256
3983
  declare const Persona: FC<PersonaProps>;
3257
3984
 
3985
+ /**
3986
+ * The plan's decision status (#108). Additive: a `Plan` rendered with no
3987
+ * `status` behaves exactly as before (no ARIA region, no rail, no status
3988
+ * line) — every prop below this point is opt-in.
3989
+ */
3990
+ type PlanStatus = "streaming" | "awaiting" | "approved" | "changes-requested";
3258
3991
  type PlanProps = ComponentProps<typeof Collapsible> & {
3259
3992
  isStreaming?: boolean;
3993
+ /**
3994
+ * The plan's decision status. Omit it to keep today's display-only
3995
+ * behaviour. When both `status` and `isStreaming` are given, `status`
3996
+ * wins (a `status="approved"` plan never shimmers, even if `isStreaming`
3997
+ * is still `true`).
3998
+ */
3999
+ status?: PlanStatus;
3260
4000
  };
3261
- declare const Plan: ({ className, isStreaming, children, ...props }: PlanProps) => react.JSX.Element;
4001
+ declare const Plan: ({ className, isStreaming, status, role, children, ...props }: PlanProps) => react.JSX.Element;
3262
4002
  type PlanHeaderProps = ComponentProps<typeof CardHeader>;
3263
4003
  declare const PlanHeader: ({ className, ...props }: PlanHeaderProps) => react.JSX.Element;
3264
4004
  type PlanTitleProps = Omit<ComponentProps<typeof CardTitle>, "children"> & {
3265
4005
  children: string;
3266
4006
  };
3267
- declare const PlanTitle: ({ children, ...props }: PlanTitleProps) => react.JSX.Element;
4007
+ declare const PlanTitle: ({ id, children, ...props }: PlanTitleProps) => react.JSX.Element;
3268
4008
  type PlanDescriptionProps = Omit<ComponentProps<typeof CardDescription>, "children"> & {
3269
4009
  children: string;
3270
4010
  };
3271
4011
  declare const PlanDescription: ({ className, children, ...props }: PlanDescriptionProps) => react.JSX.Element;
3272
4012
  type PlanActionProps = ComponentProps<typeof CardAction>;
4013
+ /** The header's layout slot (e.g. a menu trigger) — unrelated to the decision actions below. */
3273
4014
  declare const PlanAction: (props: PlanActionProps) => react.JSX.Element;
3274
4015
  type PlanContentProps = ComponentProps<typeof CardContent>;
3275
4016
  declare const PlanContent: ({ className, ...props }: PlanContentProps) => react.JSX.Element;
@@ -3277,6 +4018,29 @@ type PlanFooterProps = ComponentProps<"div">;
3277
4018
  declare const PlanFooter: (props: PlanFooterProps) => react.JSX.Element;
3278
4019
  type PlanTriggerProps = ComponentProps<typeof CollapsibleTrigger>;
3279
4020
  declare const PlanTrigger: ({ className, ...props }: PlanTriggerProps) => react.JSX.Element;
4021
+ type PlanStatusLineProps = Omit<ComponentProps<typeof StatusBadge>, "status"> & {
4022
+ children?: ReactNode;
4023
+ };
4024
+ /**
4025
+ * The decision status line (#108) — text + glyph, never rail colour alone.
4026
+ * Renders nothing while `status` is unset or `"streaming"` (nothing has been
4027
+ * decided yet); shows the outcome once the plan is awaiting a decision or
4028
+ * settled.
4029
+ */
4030
+ declare const PlanStatusLine: ({ className, children, ...props }: PlanStatusLineProps) => react.JSX.Element | null;
4031
+ type PlanDecisionActionProps = ComponentProps<typeof Button>;
4032
+ type PlanApproveProps = PlanDecisionActionProps;
4033
+ /**
4034
+ * The proceed action — presets the filled primary variant so the primary path
4035
+ * can't drift to a quieter variant (same reasoning as `ConfirmationApprove`).
4036
+ */
4037
+ declare const PlanApprove: (props: PlanApproveProps) => react.JSX.Element;
4038
+ type PlanRequestChangesProps = PlanDecisionActionProps;
4039
+ /** Sends the plan back for revision — a quieter, non-primary action. */
4040
+ declare const PlanRequestChanges: (props: PlanRequestChangesProps) => react.JSX.Element;
4041
+ type PlanCommentProps = PlanDecisionActionProps;
4042
+ /** Leaves feedback without settling the decision — the quietest action. */
4043
+ declare const PlanComment: (props: PlanCommentProps) => react.JSX.Element;
3280
4044
 
3281
4045
  interface QueueMessagePart {
3282
4046
  type: string;
@@ -3490,6 +4254,85 @@ interface SelectionToolbarProps extends HTMLAttributes<HTMLDivElement> {
3490
4254
  */
3491
4255
  declare const SelectionToolbar: react.ForwardRefExoticComponent<SelectionToolbarProps & react.RefAttributes<HTMLDivElement>>;
3492
4256
 
4257
+ interface SessionHeaderProps extends ComponentProps<"div"> {
4258
+ /**
4259
+ * Session/agent name, e.g. "Codex". Anchors the card — every other section
4260
+ * is independently optional and renders nothing when omitted.
4261
+ */
4262
+ title?: string;
4263
+ /** Active model, e.g. "gpt-5.1-codex". */
4264
+ model?: string;
4265
+ /** Working directory / project path. Truncates instead of overflowing. */
4266
+ workspace?: string;
4267
+ /** Build/version string, e.g. "v2.4.0". */
4268
+ version?: string;
4269
+ /** What this session can reach. */
4270
+ capabilities?: SessionCapability[];
4271
+ /** Recent changes, shown as a short list. */
4272
+ whatsNew?: SessionWhatsNewItem[];
4273
+ /** Shortcut actions, rendered as real buttons with optional shortcut hints. */
4274
+ quickActions?: SessionQuickAction[];
4275
+ /**
4276
+ * Semantic heading level for `title`. Default `2` (a session header
4277
+ * typically sits above a `ChatGreeting`'s level-1 headline, or inside a
4278
+ * page that already owns its own `<h1>`).
4279
+ */
4280
+ level?: HeadingLevel;
4281
+ }
4282
+ /**
4283
+ * SessionHeader — the launch card for an empty agent session: model,
4284
+ * workspace, version, capabilities, what's new, and quick actions with
4285
+ * shortcut hints. Pair it above `ChatGreeting` (or inside `ChatShell`'s
4286
+ * `header` slot) for the standard first-run agent session state.
4287
+ *
4288
+ * Distinct from `ChatGreeting`, which is the centered display-scale greeting
4289
+ * for a general assistant chat — `SessionHeader` answers different questions
4290
+ * (what workspace am I in, what model, what can this thing reach, what
4291
+ * changed) that a greeting has no home for.
4292
+ *
4293
+ * **Every section is independently optional.** With only `title` supplied,
4294
+ * the card renders the identity row alone — no empty section scaffolding,
4295
+ * no stray separators.
4296
+ */
4297
+ declare const SessionHeader: react.ForwardRefExoticComponent<Omit<SessionHeaderProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
4298
+
4299
+ interface SessionStatusBarConnections {
4300
+ /** Number of integrations/MCP servers currently connected. */
4301
+ connected: number;
4302
+ /** Total number of configured integrations/MCP servers. */
4303
+ total: number;
4304
+ /** Renders a spinner in place of the connection icon while establishing. */
4305
+ connecting?: boolean;
4306
+ }
4307
+ interface SessionStatusBarProps extends ComponentProps<"div"> {
4308
+ /** Current workspace/project name. */
4309
+ workspace?: string;
4310
+ /** Current git branch. */
4311
+ branch?: string;
4312
+ /** Active model id/label. */
4313
+ model?: string;
4314
+ /** Integration/MCP connection progress; renders a spinner while connecting. */
4315
+ connections?: SessionStatusBarConnections;
4316
+ /**
4317
+ * Docks another component alongside the ambient segments — most often
4318
+ * `<TokenUsage />` (`@elabs-ai/components-ai`), so token usage/cost keeps
4319
+ * its one owner (`token-usage.tsx`, tokenlens) instead of being re-implemented
4320
+ * here. Rendered flush to the end of the bar.
4321
+ */
4322
+ children?: ReactNode;
4323
+ }
4324
+ /**
4325
+ * SessionStatusBar — the ambient session row: workspace, branch, model, and
4326
+ * integration-connection progress (#105). Every segment is independently
4327
+ * optional and renders only when its prop is supplied; with nothing supplied
4328
+ * the bar renders nothing at all, not an empty shell.
4329
+ *
4330
+ * Docks `Context` (or any other node) via `children` rather than
4331
+ * re-implementing token-usage/cost maths — `context.tsx` stays the one owner
4332
+ * of that calculation (tokenlens).
4333
+ */
4334
+ declare const SessionStatusBar: react.ForwardRefExoticComponent<Omit<SessionStatusBarProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
4335
+
3493
4336
  interface TextShimmerProps {
3494
4337
  children: string;
3495
4338
  as?: ElementType;
@@ -3618,7 +4461,7 @@ type StackTraceCopyButtonProps = ComponentProps<typeof Button> & {
3618
4461
  onError?: (error: Error) => void;
3619
4462
  timeout?: number;
3620
4463
  };
3621
- declare const StackTraceCopyButton: react.MemoExoticComponent<({ onCopy, onError, timeout, className, children, ...props }: StackTraceCopyButtonProps) => react.JSX.Element>;
4464
+ declare const StackTraceCopyButton: react.MemoExoticComponent<({ onCopy, onError, timeout, className, children, "aria-label": ariaLabel, ...props }: StackTraceCopyButtonProps) => react.JSX.Element>;
3622
4465
  type StackTraceExpandButtonProps = ComponentProps<"div">;
3623
4466
  declare const StackTraceExpandButton: react.MemoExoticComponent<({ className, ...props }: StackTraceExpandButtonProps) => react.JSX.Element>;
3624
4467
  type StackTraceContentProps = ComponentProps<typeof CollapsibleContent> & {
@@ -3691,32 +4534,6 @@ declare const TaskTrigger: ({ children, className, title, ...props }: TaskTrigge
3691
4534
  type TaskContentProps = ComponentProps<typeof CollapsibleContent>;
3692
4535
  declare const TaskContent: ({ children, className, ...props }: TaskContentProps) => react.JSX.Element;
3693
4536
 
3694
- type TerminalHeaderProps = HTMLAttributes<HTMLDivElement>;
3695
- declare const TerminalHeader: ({ className, children, ...props }: TerminalHeaderProps) => react.JSX.Element;
3696
- type TerminalTitleProps = HTMLAttributes<HTMLDivElement>;
3697
- declare const TerminalTitle: ({ className, children, ...props }: TerminalTitleProps) => react.JSX.Element;
3698
- type TerminalStatusProps = HTMLAttributes<HTMLDivElement>;
3699
- declare const TerminalStatus: ({ className, children, ...props }: TerminalStatusProps) => react.JSX.Element | null;
3700
- type TerminalActionsProps = HTMLAttributes<HTMLDivElement>;
3701
- declare const TerminalActions: ({ className, children, ...props }: TerminalActionsProps) => react.JSX.Element;
3702
- type TerminalCopyButtonProps = ComponentProps<typeof Button> & {
3703
- onCopy?: () => void;
3704
- onError?: (error: Error) => void;
3705
- timeout?: number;
3706
- };
3707
- declare const TerminalCopyButton: ({ onCopy, onError, timeout, children, className, ...props }: TerminalCopyButtonProps) => react.JSX.Element;
3708
- type TerminalClearButtonProps = ComponentProps<typeof Button>;
3709
- declare const TerminalClearButton: ({ children, className, ...props }: TerminalClearButtonProps) => react.JSX.Element | null;
3710
- type TerminalContentProps = HTMLAttributes<HTMLDivElement>;
3711
- declare const TerminalContent: ({ className, children, ...props }: TerminalContentProps) => react.JSX.Element;
3712
- type TerminalProps = HTMLAttributes<HTMLDivElement> & {
3713
- output: string;
3714
- isStreaming?: boolean;
3715
- autoScroll?: boolean;
3716
- onClear?: () => void;
3717
- };
3718
- declare const Terminal: ({ output, isStreaming, autoScroll, onClear, className, children, ...props }: TerminalProps) => react.JSX.Element;
3719
-
3720
4537
  type TestResultsHeaderProps = HTMLAttributes<HTMLDivElement>;
3721
4538
  declare const TestResultsHeader: ({ className, children, ...props }: TestResultsHeaderProps) => react.JSX.Element;
3722
4539
  type TestResultsDurationProps = HTMLAttributes<HTMLSpanElement>;
@@ -3801,6 +4618,34 @@ declare const TestErrorMessage: ({ className, children, ...props }: TestErrorMes
3801
4618
  type TestErrorStackProps = HTMLAttributes<HTMLPreElement>;
3802
4619
  declare const TestErrorStack: ({ className, children, ...props }: TestErrorStackProps) => react.JSX.Element;
3803
4620
 
4621
+ type ModelId = string;
4622
+ interface TokenUsageSchema {
4623
+ usedTokens: number;
4624
+ maxTokens: number;
4625
+ usage?: LanguageModelUsage;
4626
+ modelId?: ModelId;
4627
+ }
4628
+ type TokenUsageProps = ComponentProps<typeof HoverCard> & TokenUsageSchema;
4629
+ declare const TokenUsage: ({ usedTokens, maxTokens, usage, modelId, ...props }: TokenUsageProps) => react.JSX.Element;
4630
+ type TokenUsageTriggerProps = ComponentProps<typeof Button>;
4631
+ declare const TokenUsageTrigger: ({ children, ...props }: TokenUsageTriggerProps) => react.JSX.Element;
4632
+ type TokenUsageContentProps = ComponentProps<typeof HoverCardContent>;
4633
+ declare const TokenUsageContent: ({ className, ...props }: TokenUsageContentProps) => react.JSX.Element;
4634
+ type TokenUsageContentHeaderProps = ComponentProps<"div">;
4635
+ declare const TokenUsageContentHeader: ({ children, className, ...props }: TokenUsageContentHeaderProps) => react.JSX.Element;
4636
+ type TokenUsageContentBodyProps = ComponentProps<"div">;
4637
+ declare const TokenUsageContentBody: ({ children, className, ...props }: TokenUsageContentBodyProps) => react.JSX.Element;
4638
+ type TokenUsageContentFooterProps = ComponentProps<"div">;
4639
+ declare const TokenUsageContentFooter: ({ children, className, ...props }: TokenUsageContentFooterProps) => react.JSX.Element;
4640
+ type TokenUsageInputProps = ComponentProps<"div">;
4641
+ declare const TokenUsageInput: ({ className, children, ...props }: TokenUsageInputProps) => string | number | bigint | true | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
4642
+ type TokenUsageOutputProps = ComponentProps<"div">;
4643
+ declare const TokenUsageOutput: ({ className, children, ...props }: TokenUsageOutputProps) => string | number | bigint | true | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
4644
+ type TokenUsageReasoningProps = ComponentProps<"div">;
4645
+ declare const TokenUsageReasoning: ({ className, children, ...props }: TokenUsageReasoningProps) => string | number | bigint | true | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
4646
+ type TokenUsageCacheProps = ComponentProps<"div">;
4647
+ declare const TokenUsageCache: ({ className, children, ...props }: TokenUsageCacheProps) => string | number | bigint | true | Iterable<react.ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<react.ReactNode> | null | undefined> | react.JSX.Element | null;
4648
+
3804
4649
  type ToolProps = ComponentProps<typeof Collapsible>;
3805
4650
  declare const Tool: ({ className, ...props }: ToolProps) => react.JSX.Element;
3806
4651
  type ToolPart = ToolUIPart | DynamicToolUIPart;
@@ -3939,6 +4784,86 @@ type TranscriptionSegmentProps = ComponentProps<"button"> & {
3939
4784
  type TranscriptionSegment = Experimental_TranscriptionResult["segments"][number];
3940
4785
  declare const TranscriptionSegment: ({ segment, index, className, onClick, ...props }: TranscriptionSegmentProps) => react.JSX.Element;
3941
4786
 
4787
+ interface TurnStatusTokens {
4788
+ input?: number;
4789
+ output?: number;
4790
+ }
4791
+ interface TurnStatusProps extends Omit<ComponentProps<"div">, "children"> {
4792
+ /**
4793
+ * What the turn is doing right now, e.g. `"Working…"`, `"Editing files…"`.
4794
+ * Caller-supplied and rendered verbatim — `TurnStatus` never invents this
4795
+ * text, so it carries no default and needs no translation key of its own.
4796
+ */
4797
+ label?: string;
4798
+ /** Elapsed time in the current turn, in milliseconds. Rendered via `formatElapsed`. */
4799
+ elapsedMs?: number;
4800
+ /** Token counts for the turn so far. */
4801
+ tokens?: TurnStatusTokens;
4802
+ /** 1-based index of the current turn. */
4803
+ turn?: number;
4804
+ /** Total number of turns, when known. */
4805
+ turnTotal?: number;
4806
+ /**
4807
+ * `"working"` (default) renders the live stats + stop control and keeps
4808
+ * announcing `label` changes. `"settled"` renders the completed-turn line
4809
+ * instead and stops announcing (the elapsed/tokens/turn stats and the stop
4810
+ * control are hidden — the turn is over).
4811
+ */
4812
+ status?: "working" | "settled";
4813
+ /** Renders a focusable stop button, reachable by keyboard, while `status="working"`. */
4814
+ onStop?: () => void;
4815
+ /** Renders a "scroll to bottom" affordance. */
4816
+ showScrollToBottom?: boolean;
4817
+ onScrollToBottom?: () => void;
4818
+ }
4819
+ /**
4820
+ * TurnStatus — the in-turn footer: a working/settled label, elapsed time,
4821
+ * token counts, turn progress, and a stop affordance, all in one place (#105).
4822
+ *
4823
+ * Exactly ONE `role="status" aria-live="polite"` region is rendered — a
4824
+ * visually-hidden node that announces `label` while working and the
4825
+ * completed-turn line once `status="settled"`. The ticking elapsed time and
4826
+ * token/turn counts are plain (non-live) visible text: they update every
4827
+ * render without re-announcing on every tick, which would flood assistive
4828
+ * tech (see `.claude/rules/loading-states.md`). This mirrors `Persona`'s
4829
+ * visible-content/`sr-only`-announcement split.
4830
+ */
4831
+ declare const TurnStatus: react.ForwardRefExoticComponent<Omit<TurnStatusProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
4832
+
4833
+ /**
4834
+ * The OPT-IN analyser-plumbing hook for `AudioVisualizer` (issue #21). It is a
4835
+ * separate export a consumer may ignore entirely — `AudioVisualizer` itself
4836
+ * never imports or calls this. brand-ui is a presentation layer (D5): this
4837
+ * hook never calls `getUserMedia` and never creates an `AudioContext` until a
4838
+ * `MediaStream` the CONSUMER already obtained is actually passed in.
4839
+ */
4840
+ interface UseAudioLevelOptions {
4841
+ /** `AnalyserNode.fftSize` — controls how many frequency bins `levels` has
4842
+ * (`fftSize / 2`). Must be a power of two in [32, 32768]. */
4843
+ fftSize?: number;
4844
+ /** `AnalyserNode.smoothingTimeConstant` (0–1) — the analyser's OWN frame-to-frame
4845
+ * smoothing, independent of `AudioVisualizer`'s reduced-motion smoothing. */
4846
+ smoothingTimeConstant?: number;
4847
+ }
4848
+ interface UseAudioLevelResult {
4849
+ /** Normalized 0–1 frequency-bin samples for the current frame — feed this
4850
+ * directly to `<AudioVisualizer levels={levels} />`. Empty while `stream`
4851
+ * is `null`/`undefined` or the Web Audio API is unavailable. */
4852
+ levels: number[];
4853
+ /** The mean of `levels` — a single 0–1 scalar for a simple level meter. */
4854
+ level: number;
4855
+ }
4856
+ /**
4857
+ * Polls a `MediaStream` the caller already obtained (their own `getUserMedia`
4858
+ * call — this hook never requests one) via a Web Audio `AnalyserNode`, on a
4859
+ * `requestAnimationFrame` loop, and returns normalized levels.
4860
+ *
4861
+ * Pass `null`/`undefined` for `stream` (e.g. before the user grants mic
4862
+ * permission) and the hook is a no-op returning empty levels — safe to call
4863
+ * unconditionally, including with no stream ever provided at all.
4864
+ */
4865
+ declare function useAudioLevel(stream: MediaStream | null | undefined, options?: UseAudioLevelOptions): UseAudioLevelResult;
4866
+
3942
4867
  interface VoiceSelectorContextValue {
3943
4868
  value: string | undefined;
3944
4869
  setValue: (value: string | undefined) => void;
@@ -4030,8 +4955,17 @@ type WebPreviewBodyProps = Omit<ComponentProps<"iframe">, "loading"> & {
4030
4955
  * @default false
4031
4956
  */
4032
4957
  loading?: boolean | ReactNode;
4958
+ /**
4959
+ * Adds `allow-same-origin` to the iframe sandbox. **Opt-in, off by
4960
+ * default**: combined with `allow-scripts`, a same-origin previewed page
4961
+ * can script its way out of the sandbox restrictions entirely (its own
4962
+ * `<iframe>` reads as unsandboxed once it shares the origin). Only enable
4963
+ * this for content you trust to be same-origin-safe.
4964
+ * @default false
4965
+ */
4966
+ allowSameOrigin?: boolean;
4033
4967
  };
4034
- declare const WebPreviewBody: ({ className, loading, src, ...props }: WebPreviewBodyProps) => react.JSX.Element;
4968
+ declare const WebPreviewBody: ({ className, loading, src, allowSameOrigin, ...props }: WebPreviewBodyProps) => react.JSX.Element;
4035
4969
  type WebPreviewConsoleProps = ComponentProps<"div"> & {
4036
4970
  logs?: {
4037
4971
  level: "log" | "warn" | "error";
@@ -4076,4 +5010,4 @@ interface ChatShellProps {
4076
5010
  */
4077
5011
  declare function ChatShell({ children, composer, header, aside, variant, className, }: ChatShellProps): react.JSX.Element;
4078
5012
 
4079
- export { Agent, AgentContent, type AgentContentProps, AgentHeader, type AgentHeaderProps, AgentInstructions, type AgentInstructionsProps, AgentMessage, type AgentMessageEmphasis, type AgentMessageProps, AgentOutput, type AgentOutputProps, type AgentProps, AgentStep, type AgentStepProps, AgentTimeline, type AgentTimelineProps, AgentTool, type AgentToolProps, AgentTools, type AgentToolsProps, ApprovalCard, ApprovalCardAccepted, type ApprovalCardAcceptedProps, ApprovalCardAction, type ApprovalCardActionProps, ApprovalCardActions, type ApprovalCardActionsProps, ApprovalCardApprove, type ApprovalCardApproveProps, ApprovalCardDeny, type ApprovalCardDenyProps, ApprovalCardDescription, type ApprovalCardDescriptionProps, type ApprovalCardProps, ApprovalCardRejected, type ApprovalCardRejectedProps, ApprovalCardRequest, type ApprovalCardRequestProps, ApprovalCardTitle, type ApprovalCardTitleProps, Artifact, ArtifactAction, type ArtifactActionProps, ArtifactActions, type ArtifactActionsProps, ArtifactClose, type ArtifactCloseProps, ArtifactContent, type ArtifactContentProps, ArtifactDescription, type ArtifactDescriptionProps, ArtifactHeader, type ArtifactHeaderProps, type ArtifactProps, ArtifactTitle, type ArtifactTitleProps, AssetPreview, type AssetPreviewMode, type AssetPreviewProps, type AssetPreviewRenderer, Attachment, type AttachmentData, AttachmentEmpty, type AttachmentEmptyProps, AttachmentHoverCard, AttachmentHoverCardContent, type AttachmentHoverCardContentProps, type AttachmentHoverCardProps, AttachmentHoverCardTrigger, type AttachmentHoverCardTriggerProps, AttachmentInfo, type AttachmentInfoProps, type AttachmentMediaCategory, AttachmentPreview, type AttachmentPreviewProps, type AttachmentProps, AttachmentRemove, type AttachmentRemoveProps, type AttachmentVariant, Attachments, type AttachmentsContext, type AttachmentsProps, AudioPlayer, AudioPlayerControlBar, type AudioPlayerControlBarProps, AudioPlayerDurationDisplay, type AudioPlayerDurationDisplayProps, AudioPlayerElement, type AudioPlayerElementProps, AudioPlayerMuteButton, type AudioPlayerMuteButtonProps, AudioPlayerPlayButton, type AudioPlayerPlayButtonProps, type AudioPlayerProps, AudioPlayerSeekBackwardButton, type AudioPlayerSeekBackwardButtonProps, AudioPlayerSeekForwardButton, type AudioPlayerSeekForwardButtonProps, AudioPlayerTimeDisplay, type AudioPlayerTimeDisplayProps, AudioPlayerTimeRange, type AudioPlayerTimeRangeProps, AudioPlayerVolumeRange, type AudioPlayerVolumeRangeProps, type BadgeTone, type BooleanFieldSpec, BrandMotionConfig, type BrandMotionConfigProps, Canvas, type CanvasProps, type CellFormat, ChainOfThought, ChainOfThoughtContent, type ChainOfThoughtContentProps, ChainOfThoughtHeader, type ChainOfThoughtHeaderProps, ChainOfThoughtImage, type ChainOfThoughtImageProps, type ChainOfThoughtProps, ChainOfThoughtSearchResult, type ChainOfThoughtSearchResultProps, ChainOfThoughtSearchResults, type ChainOfThoughtSearchResultsProps, ChainOfThoughtStep, type ChainOfThoughtStepProps, ChatGreeting, type ChatGreetingProps, ChatShell, type ChatShellProps, Checkpoint, CheckpointIcon, type CheckpointIconProps, type CheckpointProps, CheckpointTrigger, type CheckpointTriggerProps, CodeBlock, CodeBlockActions, CodeBlockContainer, CodeBlockContent, CodeBlockCopyButton, type CodeBlockCopyButtonProps, CodeBlockFilename, CodeBlockHeader, CodeBlockLanguageSelector, CodeBlockLanguageSelectorContent, type CodeBlockLanguageSelectorContentProps, CodeBlockLanguageSelectorItem, type CodeBlockLanguageSelectorItemProps, type CodeBlockLanguageSelectorProps, CodeBlockLanguageSelectorTrigger, type CodeBlockLanguageSelectorTriggerProps, CodeBlockLanguageSelectorValue, type CodeBlockLanguageSelectorValueProps, type CodeBlockProps, CodeBlockTitle, type ColumnSpec, Commit, CommitActions, type CommitActionsProps, CommitAuthor, CommitAuthorAvatar, type CommitAuthorAvatarProps, type CommitAuthorProps, CommitContent, type CommitContentProps, CommitCopyButton, type CommitCopyButtonProps, CommitFile, CommitFileAdditions, type CommitFileAdditionsProps, CommitFileChanges, type CommitFileChangesProps, CommitFileDeletions, type CommitFileDeletionsProps, CommitFileIcon, type CommitFileIconProps, CommitFileInfo, type CommitFileInfoProps, CommitFilePath, type CommitFilePathProps, type CommitFileProps, CommitFileStatus, type CommitFileStatusProps, CommitFiles, type CommitFilesProps, CommitHash, type CommitHashProps, CommitHeader, type CommitHeaderProps, CommitInfo, type CommitInfoProps, CommitMessage, type CommitMessageProps, CommitMetadata, type CommitMetadataProps, type CommitProps, CommitSeparator, type CommitSeparatorProps, CommitTimestamp, type CommitTimestampProps, Composer, type ComposerProps, Confirmation, ConfirmationAccepted, type ConfirmationAcceptedProps, ConfirmationAction, type ConfirmationActionProps, ConfirmationActions, type ConfirmationActionsProps, ConfirmationApprove, type ConfirmationApproveProps, ConfirmationDeny, type ConfirmationDenyProps, ConfirmationDescription, type ConfirmationDescriptionProps, type ConfirmationProps, ConfirmationRejected, type ConfirmationRejectedProps, ConfirmationRequest, type ConfirmationRequestProps, ConfirmationTitle, type ConfirmationTitleProps, Connection, Context, type ContextAsset, type ContextAssetType, ContextCacheUsage, type ContextCacheUsageProps, ContextContent, ContextContentBody, type ContextContentBodyProps, ContextContentFooter, type ContextContentFooterProps, ContextContentHeader, type ContextContentHeaderProps, type ContextContentProps, ContextInputUsage, type ContextInputUsageProps, ContextOutputUsage, type ContextOutputUsageProps, ContextPanel, ContextPanelBody, type ContextPanelBodyProps, type ContextPanelContextValue, ContextPanelDetail, type ContextPanelDetailProps, ContextPanelHeader, type ContextPanelHeaderProps, type ContextPanelProps, ContextPanelProvider, type ContextPanelProviderProps, ContextPanelSection, type ContextPanelSectionProps, ContextPanelTrigger, type ContextPanelTriggerProps, type ContextPanelView, type ContextProps, ContextReasoningUsage, type ContextReasoningUsageProps, ContextTrigger, type ContextTriggerProps, Controls, type ControlsProps, Conversation, ConversationContent, type ConversationContentProps, ConversationDownload, type ConversationDownloadProps, ConversationEmptyState, type ConversationEmptyStateProps, type ConversationProps, ConversationScrollButton, type ConversationScrollButtonProps, EMPTY_CELL, Edge, type EnumFieldSpec, type EnumOption, EnvironmentVariable, EnvironmentVariableCopyButton, type EnvironmentVariableCopyButtonProps, EnvironmentVariableGroup, type EnvironmentVariableGroupProps, EnvironmentVariableName, type EnvironmentVariableNameProps, type EnvironmentVariableProps, EnvironmentVariableRequired, type EnvironmentVariableRequiredProps, EnvironmentVariableValue, type EnvironmentVariableValueProps, EnvironmentVariables, EnvironmentVariablesContent, type EnvironmentVariablesContentProps, EnvironmentVariablesHeader, type EnvironmentVariablesHeaderProps, type EnvironmentVariablesProps, EnvironmentVariablesTitle, type EnvironmentVariablesTitleProps, EnvironmentVariablesToggle, type EnvironmentVariablesToggleProps, EvidenceChip, type EvidenceChipProps, type FeedbackType, type FieldSpec, FileTree, FileTreeActions, type FileTreeActionsProps, FileTreeFile, type FileTreeFileProps, FileTreeFolder, type FileTreeFolderProps, FileTreeIcon, type FileTreeIconProps, FileTreeName, type FileTreeNameProps, type FileTreeProps, type FileTreeVariant, type FormSpec, type FormSubmitState, type FormValue, type FormValues, Gallery, type GalleryImage, type GalleryMetaItem, type GalleryProps, type GetPartStatus, type GroupBy, type GroupByContext, type GroupKey, type GroupPartByTypeOptions, type GroupStatus, type GroupablePart, type GroupedNode, type GroupedPartRenderArgs, type GroupedPartRenderer, GroupedParts, type GroupedPartsProps, Image, type ImageProps, InlineCitation, InlineCitationCard, InlineCitationCardBody, type InlineCitationCardBodyProps, type InlineCitationCardProps, InlineCitationCardTrigger, type InlineCitationCardTriggerProps, InlineCitationCarousel, InlineCitationCarouselContent, type InlineCitationCarouselContentProps, InlineCitationCarouselHeader, type InlineCitationCarouselHeaderProps, InlineCitationCarouselIndex, type InlineCitationCarouselIndexProps, InlineCitationCarouselItem, type InlineCitationCarouselItemProps, InlineCitationCarouselNext, type InlineCitationCarouselNextProps, InlineCitationCarouselPrev, type InlineCitationCarouselPrevProps, type InlineCitationCarouselProps, type InlineCitationProps, InlineCitationQuote, type InlineCitationQuoteProps, InlineCitationSource, type InlineCitationSourceProps, type InlineCitationSourceRef, InlineCitationText, type InlineCitationTextProps, type IntegerFieldSpec, InteractiveTerminal, type InteractiveTerminalHandle, type InteractiveTerminalProps, JSXPreview, JSXPreviewContent, type JSXPreviewContentProps, JSXPreviewError, type JSXPreviewErrorProps, type JSXPreviewProps, JSXPreviewSkeleton, type JSXPreviewSkeletonProps, type JSXPreviewStatus, LocalReferencedSourcesContext, MODEL_SELECTOR_LOGO_BASE_URL, MarkdownView, type MarkdownViewProps, Message, MessageAction, type MessageActionProps, MessageActions, type MessageActionsProps, MessageAvatar, type MessageAvatarProps, MessageBranch, MessageBranchContent, type MessageBranchContentProps, MessageBranchNext, type MessageBranchNextProps, MessageBranchPage, type MessageBranchPageProps, MessageBranchPrevious, type MessageBranchPreviousProps, type MessageBranchProps, MessageBranchSelector, type MessageBranchSelectorProps, MessageContent, type MessageContentProps, MessageEdit, MessageEditContent, type MessageEditContentProps, MessageEditForm, type MessageEditFormProps, type MessageEditProps, MessageEditProvider, type MessageEditProviderProps, MessageEditTrigger, type MessageEditTriggerProps, MessageFeedback, type MessageFeedbackProps, MessageForm, MessageFormDescription, type MessageFormDescriptionProps, MessageFormFallback, type MessageFormFallbackProps, MessageFormField, type MessageFormFieldProps, MessageFormFields, type MessageFormFieldsProps, type MessageFormProps, MessageFormProvider, type MessageFormProviderProps, MessageFormRoot, type MessageFormRootProps, MessageFormSubmit, type MessageFormSubmitProps, MessageFormTitle, type MessageFormTitleProps, MessageHeader, type MessageHeaderProps, type MessageProps, MessageResponse, type MessageResponseProps, MessageTable, MessageTableFallback, type MessageTableFallbackProps, type MessageTableProps, MessageToolbar, type MessageToolbarProps, MicSelector, MicSelectorContent, type MicSelectorContentProps, MicSelectorEmpty, type MicSelectorEmptyProps, MicSelectorInput, type MicSelectorInputProps, MicSelectorItem, type MicSelectorItemProps, MicSelectorLabel, type MicSelectorLabelProps, MicSelectorList, type MicSelectorListProps, type MicSelectorProps, MicSelectorTrigger, type MicSelectorTriggerProps, MicSelectorValue, type MicSelectorValueProps, ModelSelector, ModelSelectorContent, type ModelSelectorContentProps, ModelSelectorDialog, type ModelSelectorDialogProps, ModelSelectorEmpty, type ModelSelectorEmptyProps, ModelSelectorGroup, type ModelSelectorGroupProps, ModelSelectorInput, type ModelSelectorInputProps, ModelSelectorItem, type ModelSelectorItemProps, ModelSelectorList, type ModelSelectorListProps, ModelSelectorLogo, ModelSelectorLogoGroup, type ModelSelectorLogoGroupProps, type ModelSelectorLogoProps, ModelSelectorName, type ModelSelectorNameProps, type ModelSelectorProps, ModelSelectorSeparator, type ModelSelectorSeparatorProps, ModelSelectorShortcut, type ModelSelectorShortcutProps, ModelSelectorTrigger, type ModelSelectorTriggerProps, type MultiEnumFieldSpec, Node, NodeAction, type NodeActionProps, NodeContent, type NodeContentProps, NodeDescription, type NodeDescriptionProps, NodeFooter, type NodeFooterProps, NodeHeader, type NodeHeaderProps, type NodeProps, NodeTitle, type NodeTitleProps, NodeToolbar, type NodeToolbarProps, type NormalizedFormSpec, type NormalizedTableSpec, type NumberFieldSpec, OpenIn, OpenInChatGPT, type OpenInChatGPTProps, OpenInClaude, type OpenInClaudeProps, OpenInContent, type OpenInContentProps, OpenInCursor, type OpenInCursorProps, OpenInItem, type OpenInItemProps, OpenInLabel, type OpenInLabelProps, type OpenInProps, OpenInScira, type OpenInSciraProps, OpenInSeparator, type OpenInSeparatorProps, OpenInT3, type OpenInT3Props, OpenInTrigger, type OpenInTriggerProps, OpenInv0, type OpenInv0Props, PERSONA_SOURCES, PRODUCED_ASSET_ICONS, PackageInfo, PackageInfoChangeType, type PackageInfoChangeTypeProps, PackageInfoContent, type PackageInfoContentProps, PackageInfoDependencies, type PackageInfoDependenciesProps, PackageInfoDependency, type PackageInfoDependencyProps, PackageInfoDescription, type PackageInfoDescriptionProps, PackageInfoHeader, type PackageInfoHeaderProps, PackageInfoName, type PackageInfoNameProps, type PackageInfoProps, PackageInfoVersion, type PackageInfoVersionProps, Panel, type PanelProps, type PartDisplay, type PartGroupNode, Persona, type PersonaProps, type PersonaState, type PersonaVariant, Plan, PlanAction, type PlanActionProps, PlanContent, type PlanContentProps, PlanDescription, type PlanDescriptionProps, PlanFooter, type PlanFooterProps, PlanHeader, type PlanHeaderProps, type PlanProps, PlanTitle, type PlanTitleProps, PlanTrigger, type PlanTriggerProps, ProducedAssetTree, type ProducedAssetTreeProps, PromptInput, PromptInputActionAddAttachments, type PromptInputActionAddAttachmentsProps, PromptInputActionAddScreenshot, type PromptInputActionAddScreenshotProps, PromptInputActionMenu, PromptInputActionMenuContent, type PromptInputActionMenuContentProps, PromptInputActionMenuItem, type PromptInputActionMenuItemProps, type PromptInputActionMenuProps, PromptInputActionMenuTrigger, type PromptInputActionMenuTriggerProps, PromptInputBody, type PromptInputBodyProps, PromptInputButton, type PromptInputButtonProps, type PromptInputButtonTooltip, PromptInputCommand, PromptInputCommandEmpty, type PromptInputCommandEmptyProps, PromptInputCommandGroup, type PromptInputCommandGroupProps, PromptInputCommandInput, type PromptInputCommandInputProps, PromptInputCommandItem, type PromptInputCommandItemProps, PromptInputCommandList, type PromptInputCommandListProps, type PromptInputCommandProps, PromptInputCommandSeparator, type PromptInputCommandSeparatorProps, type PromptInputControllerProps, PromptInputFooter, type PromptInputFooterProps, PromptInputHeader, type PromptInputHeaderProps, PromptInputHoverCard, PromptInputHoverCardContent, type PromptInputHoverCardContentProps, type PromptInputHoverCardProps, PromptInputHoverCardTrigger, type PromptInputHoverCardTriggerProps, type PromptInputMessage, type PromptInputProps, PromptInputProvider, type PromptInputProviderProps, PromptInputSelect, PromptInputSelectContent, type PromptInputSelectContentProps, PromptInputSelectItem, type PromptInputSelectItemProps, type PromptInputSelectProps, PromptInputSelectTrigger, type PromptInputSelectTriggerProps, PromptInputSelectValue, type PromptInputSelectValueProps, PromptInputStop, type PromptInputStopProps, PromptInputSubmit, type PromptInputSubmitAction, type PromptInputSubmitProps, PromptInputTab, PromptInputTabBody, type PromptInputTabBodyProps, PromptInputTabItem, type PromptInputTabItemProps, PromptInputTabLabel, type PromptInputTabLabelProps, type PromptInputTabProps, PromptInputTabsList, type PromptInputTabsListProps, PromptInputTextarea, type PromptInputTextareaProps, PromptInputTools, type PromptInputToolsProps, Queue, QueueItem, QueueItemAction, type QueueItemActionProps, QueueItemActions, type QueueItemActionsProps, QueueItemAttachment, type QueueItemAttachmentProps, QueueItemContent, type QueueItemContentProps, QueueItemDescription, type QueueItemDescriptionProps, QueueItemFile, type QueueItemFileProps, QueueItemImage, type QueueItemImageProps, QueueItemIndicator, type QueueItemIndicatorProps, type QueueItemProps, QueueList, type QueueListProps, type QueueMessage, type QueueMessagePart, type QueueProps, QueueSection, QueueSectionContent, type QueueSectionContentProps, QueueSectionLabel, type QueueSectionLabelProps, type QueueSectionProps, QueueSectionTrigger, type QueueSectionTriggerProps, type QueueTodo, Reasoning, ReasoningContent, type ReasoningContentProps, type ReasoningProps, ReasoningTrigger, type ReasoningTriggerProps, type ReferencedSourcesContext, type RenderCell, Sandbox, SandboxContent, type SandboxContentProps, SandboxHeader, type SandboxHeaderProps, type SandboxProps, type SandboxRootProps, SandboxTabContent, type SandboxTabContentProps, SandboxTabs, SandboxTabsBar, type SandboxTabsBarProps, SandboxTabsList, type SandboxTabsListProps, type SandboxTabsProps, SandboxTabsTrigger, type SandboxTabsTriggerProps, SchemaDisplay, SchemaDisplayBody, type SchemaDisplayBodyProps, SchemaDisplayContent, type SchemaDisplayContentProps, SchemaDisplayDescription, type SchemaDisplayDescriptionProps, SchemaDisplayExample, type SchemaDisplayExampleProps, SchemaDisplayHeader, type SchemaDisplayHeaderProps, SchemaDisplayMethod, type SchemaDisplayMethodProps, SchemaDisplayParameter, type SchemaDisplayParameterProps, SchemaDisplayParameters, type SchemaDisplayParametersProps, SchemaDisplayPath, type SchemaDisplayPathProps, SchemaDisplayProperty, type SchemaDisplayPropertyProps, type SchemaDisplayProps, SchemaDisplayRequest, type SchemaDisplayRequestProps, SchemaDisplayResponse, type SchemaDisplayResponseProps, type SelectionSnapshot, SelectionToolbar, type SelectionToolbarProps, Shimmer, Snippet, SnippetAddon, type SnippetAddonProps, SnippetCopyButton, type SnippetCopyButtonProps, SnippetInput, type SnippetInputProps, type SnippetProps, SnippetText, type SnippetTextProps, Source, SourceList, type SourceListItem, type SourceListProps, type SourceProps, Sources, SourcesContent, type SourcesContentProps, type SourcesProps, SourcesTrigger, type SourcesTriggerProps, SpeechInput, type SpeechInputProps, StackTrace, StackTraceActions, type StackTraceActionsProps, StackTraceContent, type StackTraceContentProps, StackTraceCopyButton, type StackTraceCopyButtonProps, StackTraceError, StackTraceErrorMessage, type StackTraceErrorMessageProps, type StackTraceErrorProps, StackTraceErrorType, type StackTraceErrorTypeProps, StackTraceExpandButton, type StackTraceExpandButtonProps, StackTraceFrames, type StackTraceFramesProps, StackTraceHeader, type StackTraceHeaderProps, type StackTraceProps, StreamingSuggestions, type StreamingSuggestionsProps, type StringFieldSpec, Suggestion, SuggestionLoading, type SuggestionLoadingProps, type SuggestionProps, Suggestions, type SuggestionsProps, type TableRowData, type TableSort, type TableSpec, Task, TaskContent, type TaskContentProps, TaskItem, TaskItemFile, type TaskItemFileProps, type TaskItemProps, type TaskProps, TaskTrigger, type TaskTriggerProps, Terminal, TerminalActions, type TerminalActionsProps, TerminalClearButton, type TerminalClearButtonProps, TerminalContent, type TerminalContentProps, TerminalCopyButton, type TerminalCopyButtonProps, TerminalHeader, type TerminalHeaderProps, type TerminalProps, TerminalStatus, type TerminalStatusProps, TerminalTitle, type TerminalTitleProps, Test, TestDuration, type TestDurationProps, TestError, TestErrorMessage, type TestErrorMessageProps, type TestErrorProps, TestErrorStack, type TestErrorStackProps, TestName, type TestNameProps, type TestProps, TestResults, TestResultsContent, type TestResultsContentProps, TestResultsDuration, type TestResultsDurationProps, TestResultsHeader, type TestResultsHeaderProps, TestResultsMeta, type TestResultsMetaProps, TestResultsProgress, type TestResultsProgressProps, type TestResultsProps, TestResultsSummary, type TestResultsSummaryProps, TestStatus, type TestStatusProps, TestSuite, TestSuiteContent, type TestSuiteContentProps, TestSuiteName, type TestSuiteNameProps, type TestSuiteProps, TestSuiteStats, type TestSuiteStatsProps, type TextInputContext, type TextShimmerProps, Tool, ToolContent, type ToolContentProps, ToolDetails, type ToolDetailsProps, ToolHeader, type ToolHeaderProps, ToolInput, type ToolInputProps, ToolOutput, type ToolOutputProps, type ToolPart, type ToolProps, ToolResultCard, type ToolResultCardProps, Toolbar, type ToolbarProps, Transcription, type TranscriptionProps, TranscriptionSegment, type TranscriptionSegmentProps, UserMessage, type UserMessageProps, VoiceSelector, VoiceSelectorAccent, type VoiceSelectorAccentProps, VoiceSelectorAge, type VoiceSelectorAgeProps, VoiceSelectorAttributes, type VoiceSelectorAttributesProps, VoiceSelectorBullet, type VoiceSelectorBulletProps, VoiceSelectorContent, type VoiceSelectorContentProps, VoiceSelectorDescription, type VoiceSelectorDescriptionProps, VoiceSelectorDialog, type VoiceSelectorDialogProps, VoiceSelectorEmpty, type VoiceSelectorEmptyProps, VoiceSelectorGender, type VoiceSelectorGenderProps, VoiceSelectorGroup, type VoiceSelectorGroupProps, VoiceSelectorInput, type VoiceSelectorInputProps, VoiceSelectorItem, type VoiceSelectorItemProps, VoiceSelectorList, type VoiceSelectorListProps, VoiceSelectorName, type VoiceSelectorNameProps, VoiceSelectorPreview, type VoiceSelectorPreviewProps, type VoiceSelectorProps, VoiceSelectorSeparator, type VoiceSelectorSeparatorProps, VoiceSelectorShortcut, type VoiceSelectorShortcutProps, VoiceSelectorTrigger, type VoiceSelectorTriggerProps, WebPreview, WebPreviewBody, type WebPreviewBodyProps, WebPreviewConsole, type WebPreviewConsoleProps, type WebPreviewContextValue, WebPreviewNavigation, WebPreviewNavigationButton, type WebPreviewNavigationButtonProps, type WebPreviewNavigationProps, type WebPreviewProps, WebPreviewUrl, type WebPreviewUrlProps, agentMessageVariants, badgeToneForValue, booleanFieldSchema, buildInteractiveTerminalTheme, buildPartGroups, cellFormatSchema, columnSpecSchema, compareCellValues, createLazyMermaidPlugin, defaultPartStatus, enumFieldSchema, enumOptionSchema, fieldLabel, fieldSpecSchema, formSpecSchema, formatCellValue, getAttachmentLabel, getMediaCategory, getStatusBadge, groupPartByType, highlightCode, initialFormValues, inlineCitationSourceLabel, integerFieldSchema, isEmptyCell, isGroupNode, isNumericFormat, lazyMermaid, messageActionsVariants, messageFeedbackVariants, messagesToMarkdown, multiEnumFieldSchema, normalizeFormSpec, normalizeTableSpec, numberFieldSchema, optionLabel, optionValue, partsFingerprint, preloadMermaid, readSelectionWithin, rollupStatus, statusFromToolState, stringFieldSchema, tableSpecSchema, useAssetPreviewRenderer, useAttachmentContext, useAttachmentsContext, useAudioDevices, useContextPanel, useJSXPreview, useMessageEdit, usePromptInputAttachments, usePromptInputController, usePromptInputReferencedSources, useProviderAttachments, useReasoning, useVoiceSelector, validateField, validateForm };
5013
+ export { Agent, AgentContent, type AgentContentProps, AgentEvent, type AgentEventProps, AgentHeader, type AgentHeaderProps, AgentInstructions, type AgentInstructionsProps, AgentMessage, type AgentMessageEmphasis, type AgentMessageProps, AgentOutput, type AgentOutputProps, type AgentProps, AgentStep, type AgentStepProps, AgentTimeline, type AgentTimelineProps, AgentTool, type AgentToolProps, AgentTools, type AgentToolsProps, ApprovalCard, ApprovalCardAccepted, type ApprovalCardAcceptedProps, ApprovalCardAction, type ApprovalCardActionProps, ApprovalCardActions, type ApprovalCardActionsProps, ApprovalCardApprove, type ApprovalCardApproveProps, ApprovalCardDeny, type ApprovalCardDenyProps, ApprovalCardDescription, type ApprovalCardDescriptionProps, ApprovalCardOptions, type ApprovalCardOptionsProps, type ApprovalCardProps, ApprovalCardReason, type ApprovalCardReasonProps, ApprovalCardRejected, type ApprovalCardRejectedProps, ApprovalCardRequest, type ApprovalCardRequestProps, ApprovalCardTarget, type ApprovalCardTargetProps, ApprovalCardTitle, type ApprovalCardTitleProps, Artifact, ArtifactAction, type ArtifactActionProps, ArtifactActions, type ArtifactActionsProps, ArtifactClose, type ArtifactCloseProps, ArtifactContent, type ArtifactContentProps, ArtifactDescription, type ArtifactDescriptionProps, ArtifactHeader, type ArtifactHeaderProps, type ArtifactProps, ArtifactTitle, type ArtifactTitleProps, AssetPreview, type AssetPreviewMode, type AssetPreviewProps, type AssetPreviewRenderer, Attachment, type AttachmentData, AttachmentEmpty, type AttachmentEmptyProps, AttachmentHoverCard, AttachmentHoverCardContent, type AttachmentHoverCardContentProps, type AttachmentHoverCardProps, AttachmentHoverCardTrigger, type AttachmentHoverCardTriggerProps, AttachmentInfo, type AttachmentInfoProps, type AttachmentMediaCategory, AttachmentPreview, type AttachmentPreviewProps, type AttachmentProps, AttachmentRemove, type AttachmentRemoveProps, type AttachmentVariant, Attachments, type AttachmentsContext, type AttachmentsProps, AudioPlayer, AudioPlayerControlBar, type AudioPlayerControlBarProps, AudioPlayerDurationDisplay, type AudioPlayerDurationDisplayProps, AudioPlayerElement, type AudioPlayerElementProps, AudioPlayerMuteButton, type AudioPlayerMuteButtonProps, type AudioPlayerPartProps, AudioPlayerPlayButton, type AudioPlayerPlayButtonProps, type AudioPlayerProps, AudioPlayerSeekBackwardButton, type AudioPlayerSeekBackwardButtonProps, AudioPlayerSeekForwardButton, type AudioPlayerSeekForwardButtonProps, AudioPlayerTimeDisplay, type AudioPlayerTimeDisplayProps, AudioPlayerTimeRange, type AudioPlayerTimeRangeProps, AudioPlayerVolumeRange, type AudioPlayerVolumeRangeProps, AudioVisualizer, type AudioVisualizerLevelState, type AudioVisualizerProps, type AudioVisualizerVariant, type BadgeTone, type BooleanFieldSpec, BrandMotionConfig, type BrandMotionConfigProps, Canvas, type CanvasProps, type CellFormat, ChainOfThought, ChainOfThoughtContent, type ChainOfThoughtContentProps, ChainOfThoughtHeader, type ChainOfThoughtHeaderProps, ChainOfThoughtImage, type ChainOfThoughtImageProps, type ChainOfThoughtProps, ChainOfThoughtSearchResult, type ChainOfThoughtSearchResultProps, ChainOfThoughtSearchResults, type ChainOfThoughtSearchResultsProps, ChainOfThoughtStep, type ChainOfThoughtStepProps, ChatGreeting, type ChatGreetingProps, ChatShell, type ChatShellProps, Checkpoint, CheckpointIcon, type CheckpointIconProps, type CheckpointProps, CheckpointTrigger, type CheckpointTriggerProps, CodeBlock, CodeBlockActions, CodeBlockContainer, CodeBlockContent, CodeBlockCopyButton, type CodeBlockCopyButtonProps, CodeBlockFilename, CodeBlockHeader, CodeBlockLanguageSelector, CodeBlockLanguageSelectorContent, type CodeBlockLanguageSelectorContentProps, CodeBlockLanguageSelectorItem, type CodeBlockLanguageSelectorItemProps, type CodeBlockLanguageSelectorProps, CodeBlockLanguageSelectorTrigger, type CodeBlockLanguageSelectorTriggerProps, CodeBlockLanguageSelectorValue, type CodeBlockLanguageSelectorValueProps, type CodeBlockProps, CodeBlockTitle, type ColumnSpec, Commit, CommitActions, type CommitActionsProps, CommitAuthor, CommitAuthorAvatar, type CommitAuthorAvatarProps, type CommitAuthorProps, CommitContent, type CommitContentProps, CommitCopyButton, type CommitCopyButtonProps, CommitFile, CommitFileAdditions, type CommitFileAdditionsProps, CommitFileChanges, type CommitFileChangesProps, CommitFileDeletions, type CommitFileDeletionsProps, CommitFileIcon, type CommitFileIconProps, CommitFileInfo, type CommitFileInfoProps, CommitFilePath, type CommitFilePathProps, type CommitFileProps, CommitFileStatus, type CommitFileStatusProps, CommitFiles, type CommitFilesProps, CommitHash, type CommitHashProps, CommitHeader, type CommitHeaderProps, CommitInfo, type CommitInfoProps, CommitMessage, type CommitMessageProps, CommitMetadata, type CommitMetadataProps, type CommitProps, CommitSeparator, type CommitSeparatorProps, CommitTimestamp, type CommitTimestampProps, Composer, type ComposerEffortProps, type ComposerModeProps, type ComposerProps, type ComposerShortcut, Confirmation, ConfirmationAccepted, type ConfirmationAcceptedProps, ConfirmationAction, type ConfirmationActionProps, ConfirmationActions, type ConfirmationActionsProps, ConfirmationApprove, type ConfirmationApproveProps, ConfirmationDeny, type ConfirmationDenyProps, ConfirmationDescription, type ConfirmationDescriptionProps, type ConfirmationProps, ConfirmationRejected, type ConfirmationRejectedProps, ConfirmationRequest, type ConfirmationRequestProps, ConfirmationTitle, type ConfirmationTitleProps, Connection, type ContextAsset, type ContextAssetType, ContextPanel, ContextPanelBody, type ContextPanelBodyProps, type ContextPanelContextValue, ContextPanelDetail, type ContextPanelDetailProps, ContextPanelHeader, type ContextPanelHeaderProps, type ContextPanelProps, ContextPanelProvider, type ContextPanelProviderProps, ContextPanelSection, type ContextPanelSectionProps, ContextPanelTrigger, type ContextPanelTriggerProps, type ContextPanelView, Controls, type ControlsProps, Conversation, ConversationContent, type ConversationContentProps, ConversationDownload, type ConversationDownloadProps, ConversationEmptyState, type ConversationEmptyStateProps, type ConversationProps, ConversationScrollButton, type ConversationScrollButtonProps, DiffView, type DiffViewProps, EMPTY_CELL, Edge, type EnumFieldSpec, type EnumOption, EnvironmentVariable, EnvironmentVariableCopyButton, type EnvironmentVariableCopyButtonProps, EnvironmentVariableGroup, type EnvironmentVariableGroupProps, EnvironmentVariableName, type EnvironmentVariableNameProps, type EnvironmentVariableProps, EnvironmentVariableRequired, type EnvironmentVariableRequiredProps, EnvironmentVariableValue, type EnvironmentVariableValueProps, EnvironmentVariables, EnvironmentVariablesContent, type EnvironmentVariablesContentProps, EnvironmentVariablesHeader, type EnvironmentVariablesHeaderProps, type EnvironmentVariablesProps, EnvironmentVariablesTitle, type EnvironmentVariablesTitleProps, EnvironmentVariablesToggle, type EnvironmentVariablesToggleProps, EvidenceChip, type EvidenceChipProps, type FeedbackType, type FieldSpec, FileTree, FileTreeActions, type FileTreeActionsProps, FileTreeFile, type FileTreeFileProps, FileTreeFolder, type FileTreeFolderProps, FileTreeIcon, type FileTreeIconProps, FileTreeName, type FileTreeNameProps, type FileTreeProps, type FileTreeVariant, type FormSpec, type FormSubmitState, type FormValue, type FormValues, Gallery, type GalleryImage, type GalleryMetaItem, type GalleryProps, type GetPartStatus, type GroupBy, type GroupByContext, type GroupKey, type GroupPartByTypeOptions, type GroupStatus, type GroupablePart, type GroupedNode, type GroupedPartRenderArgs, type GroupedPartRenderer, GroupedParts, type GroupedPartsProps, Image, type ImageProps, InlineCitation, InlineCitationCard, InlineCitationCardBody, type InlineCitationCardBodyProps, type InlineCitationCardProps, InlineCitationCardTrigger, type InlineCitationCardTriggerProps, InlineCitationCarousel, InlineCitationCarouselContent, type InlineCitationCarouselContentProps, InlineCitationCarouselHeader, type InlineCitationCarouselHeaderProps, InlineCitationCarouselIndex, type InlineCitationCarouselIndexProps, InlineCitationCarouselItem, type InlineCitationCarouselItemProps, InlineCitationCarouselNext, type InlineCitationCarouselNextProps, InlineCitationCarouselPrev, type InlineCitationCarouselPrevProps, type InlineCitationCarouselProps, type InlineCitationProps, InlineCitationQuote, type InlineCitationQuoteProps, InlineCitationSource, type InlineCitationSourceProps, type InlineCitationSourceRef, InlineCitationText, type InlineCitationTextProps, type IntegerFieldSpec, JSXPreview, JSXPreviewContent, type JSXPreviewContentProps, JSXPreviewError, type JSXPreviewErrorProps, type JSXPreviewProps, JSXPreviewSkeleton, type JSXPreviewSkeletonProps, type JSXPreviewStatus, LocalReferencedSourcesContext, MODEL_PROVIDER_LOGO_BASE_URL, MarkdownView, type MarkdownViewProps, Message, MessageAction, type MessageActionProps, MessageActions, type MessageActionsProps, MessageAvatar, type MessageAvatarProps, MessageBranch, MessageBranchContent, type MessageBranchContentProps, MessageBranchNext, type MessageBranchNextProps, MessageBranchPage, type MessageBranchPageProps, MessageBranchPrevious, type MessageBranchPreviousProps, type MessageBranchProps, MessageBranchSelector, type MessageBranchSelectorProps, MessageCompare, MessageCompareColumn, type MessageCompareColumnProps, type MessageCompareColumnsCount, type MessageCompareModel, type MessageCompareProps, MessageContent, type MessageContentProps, MessageEdit, MessageEditContent, type MessageEditContentProps, MessageEditForm, type MessageEditFormProps, type MessageEditProps, MessageEditProvider, type MessageEditProviderProps, MessageEditTrigger, type MessageEditTriggerProps, MessageFeedback, type MessageFeedbackProps, MessageForm, MessageFormDescription, type MessageFormDescriptionProps, MessageFormFallback, type MessageFormFallbackProps, MessageFormField, type MessageFormFieldProps, MessageFormFields, type MessageFormFieldsProps, type MessageFormProps, MessageFormProvider, type MessageFormProviderProps, MessageFormRoot, type MessageFormRootProps, MessageFormSubmit, type MessageFormSubmitProps, MessageFormTitle, type MessageFormTitleProps, MessageHeader, type MessageHeaderProps, type MessageProps, MessageResponse, type MessageResponseProps, MessageTable, MessageTableFallback, type MessageTableFallbackProps, type MessageTableProps, MessageToolbar, type MessageToolbarProps, MicSelector, MicSelectorContent, type MicSelectorContentProps, MicSelectorEmpty, type MicSelectorEmptyProps, MicSelectorInput, type MicSelectorInputProps, MicSelectorItem, type MicSelectorItemProps, MicSelectorLabel, type MicSelectorLabelProps, MicSelectorList, type MicSelectorListProps, type MicSelectorProps, MicSelectorTrigger, type MicSelectorTriggerProps, MicSelectorValue, type MicSelectorValueProps, ModelProviderLogo, ModelProviderLogoGroup, type ModelProviderLogoGroupProps, type ModelProviderLogoProps, type MultiEnumFieldSpec, Node, NodeAction, type NodeActionProps, NodeContent, type NodeContentProps, NodeDescription, type NodeDescriptionProps, NodeFooter, type NodeFooterProps, NodeHeader, type NodeHeaderProps, type NodeProps, NodeTitle, type NodeTitleProps, NodeToolbar, type NodeToolbarProps, type NormalizedFormSpec, type NormalizedTableSpec, type NumberFieldSpec, OpenIn, OpenInChatGPT, type OpenInChatGPTProps, OpenInClaude, type OpenInClaudeProps, OpenInContent, type OpenInContentProps, OpenInCursor, type OpenInCursorProps, OpenInItem, type OpenInItemProps, OpenInLabel, type OpenInLabelProps, type OpenInProps, OpenInScira, type OpenInSciraProps, OpenInSeparator, type OpenInSeparatorProps, OpenInT3, type OpenInT3Props, OpenInTrigger, type OpenInTriggerProps, OpenInv0, type OpenInv0Props, PERSONA_SOURCES, PRODUCED_ASSET_ICONS, PackageInfo, PackageInfoChangeType, type PackageInfoChangeTypeProps, PackageInfoContent, type PackageInfoContentProps, PackageInfoDependencies, type PackageInfoDependenciesProps, PackageInfoDependency, type PackageInfoDependencyProps, PackageInfoDescription, type PackageInfoDescriptionProps, PackageInfoHeader, type PackageInfoHeaderProps, PackageInfoName, type PackageInfoNameProps, type PackageInfoProps, PackageInfoVersion, type PackageInfoVersionProps, Panel, type PanelProps, type PartDisplay, type PartGroupNode, type PermissionMode, PermissionModeSelect, type PermissionModeSelectProps, Persona, type PersonaProps, type PersonaRiveEvent, type PersonaRiveEventCallback, type PersonaState, type PersonaVariant, Plan, PlanAction, type PlanActionProps, PlanApprove, type PlanApproveProps, PlanComment, type PlanCommentProps, PlanContent, type PlanContentProps, type PlanDecisionActionProps, PlanDescription, type PlanDescriptionProps, PlanFooter, type PlanFooterProps, PlanHeader, type PlanHeaderProps, type PlanProps, PlanRequestChanges, type PlanRequestChangesProps, type PlanStatus, PlanStatusLine, type PlanStatusLineProps, PlanTitle, type PlanTitleProps, PlanTrigger, type PlanTriggerProps, ProducedAssetTree, type ProducedAssetTreeProps, PromptInput, PromptInputActionAddAttachments, type PromptInputActionAddAttachmentsProps, PromptInputActionAddScreenshot, type PromptInputActionAddScreenshotProps, PromptInputActionMenu, PromptInputActionMenuContent, type PromptInputActionMenuContentProps, PromptInputActionMenuItem, type PromptInputActionMenuItemProps, type PromptInputActionMenuProps, PromptInputActionMenuTrigger, type PromptInputActionMenuTriggerProps, PromptInputBody, type PromptInputBodyProps, PromptInputButton, type PromptInputButtonProps, type PromptInputButtonTooltip, PromptInputCommand, PromptInputCommandEmpty, type PromptInputCommandEmptyProps, PromptInputCommandGroup, type PromptInputCommandGroupProps, PromptInputCommandInput, type PromptInputCommandInputProps, PromptInputCommandItem, type PromptInputCommandItemProps, PromptInputCommandList, type PromptInputCommandListProps, type PromptInputCommandProps, PromptInputCommandSeparator, type PromptInputCommandSeparatorProps, type PromptInputControllerProps, PromptInputEffort, type PromptInputEffortProps, PromptInputFooter, type PromptInputFooterProps, PromptInputHeader, type PromptInputHeaderProps, PromptInputHoverCard, PromptInputHoverCardContent, type PromptInputHoverCardContentProps, type PromptInputHoverCardProps, PromptInputHoverCardTrigger, type PromptInputHoverCardTriggerProps, type PromptInputMessage, PromptInputMode, type PromptInputModeProps, type PromptInputProps, PromptInputProvider, type PromptInputProviderProps, PromptInputSelect, PromptInputSelectContent, type PromptInputSelectContentProps, PromptInputSelectItem, type PromptInputSelectItemProps, type PromptInputSelectProps, PromptInputSelectTrigger, type PromptInputSelectTriggerProps, PromptInputSelectValue, type PromptInputSelectValueProps, PromptInputSlash, type PromptInputSlashProps, PromptInputSlashTextarea, type PromptInputSlashTextareaProps, PromptInputStop, type PromptInputStopProps, PromptInputSubmit, type PromptInputSubmitAction, type PromptInputSubmitProps, PromptInputTab, PromptInputTabBody, type PromptInputTabBodyProps, PromptInputTabItem, type PromptInputTabItemProps, PromptInputTabLabel, type PromptInputTabLabelProps, type PromptInputTabProps, PromptInputTabsList, type PromptInputTabsListProps, PromptInputTextarea, type PromptInputTextareaProps, PromptInputTools, type PromptInputToolsProps, Queue, QueueItem, QueueItemAction, type QueueItemActionProps, QueueItemActions, type QueueItemActionsProps, QueueItemAttachment, type QueueItemAttachmentProps, QueueItemContent, type QueueItemContentProps, QueueItemDescription, type QueueItemDescriptionProps, QueueItemFile, type QueueItemFileProps, QueueItemImage, type QueueItemImageProps, QueueItemIndicator, type QueueItemIndicatorProps, type QueueItemProps, QueueList, type QueueListProps, type QueueMessage, type QueueMessagePart, type QueueProps, QueueSection, QueueSectionContent, type QueueSectionContentProps, QueueSectionLabel, type QueueSectionLabelProps, type QueueSectionProps, QueueSectionTrigger, type QueueSectionTriggerProps, type QueueTodo, Reasoning, ReasoningContent, type ReasoningContentProps, type ReasoningProps, ReasoningTrigger, type ReasoningTriggerProps, type ReferencedSourcesContext, type RenderCell, Sandbox, SandboxContent, type SandboxContentProps, SandboxHeader, type SandboxHeaderProps, type SandboxProps, type SandboxRootProps, SandboxTabContent, type SandboxTabContentProps, SandboxTabs, SandboxTabsBar, type SandboxTabsBarProps, SandboxTabsList, type SandboxTabsListProps, type SandboxTabsProps, SandboxTabsTrigger, type SandboxTabsTriggerProps, SchemaDisplay, SchemaDisplayBody, type SchemaDisplayBodyProps, SchemaDisplayContent, type SchemaDisplayContentProps, SchemaDisplayDescription, type SchemaDisplayDescriptionProps, SchemaDisplayExample, type SchemaDisplayExampleProps, SchemaDisplayHeader, type SchemaDisplayHeaderProps, SchemaDisplayMethod, type SchemaDisplayMethodProps, SchemaDisplayParameter, type SchemaDisplayParameterProps, SchemaDisplayParameters, type SchemaDisplayParametersProps, SchemaDisplayPath, type SchemaDisplayPathProps, SchemaDisplayProperty, type SchemaDisplayPropertyProps, type SchemaDisplayProps, SchemaDisplayRequest, type SchemaDisplayRequestProps, SchemaDisplayResponse, type SchemaDisplayResponseProps, type SelectionSnapshot, SelectionToolbar, type SelectionToolbarProps, SessionHeader, type SessionHeaderProps, SessionStatusBar, type SessionStatusBarConnections, type SessionStatusBarProps, Shimmer, Snippet, SnippetAddon, type SnippetAddonProps, SnippetCopyButton, type SnippetCopyButtonProps, SnippetInput, type SnippetInputProps, type SnippetProps, SnippetText, type SnippetTextProps, Source, SourceList, type SourceListItem, type SourceListProps, type SourceProps, Sources, SourcesContent, type SourcesContentProps, type SourcesProps, SourcesTrigger, type SourcesTriggerProps, SpeechInput, type SpeechInputProps, StackTrace, StackTraceActions, type StackTraceActionsProps, StackTraceContent, type StackTraceContentProps, StackTraceCopyButton, type StackTraceCopyButtonProps, StackTraceError, StackTraceErrorMessage, type StackTraceErrorMessageProps, type StackTraceErrorProps, StackTraceErrorType, type StackTraceErrorTypeProps, StackTraceExpandButton, type StackTraceExpandButtonProps, StackTraceFrames, type StackTraceFramesProps, StackTraceHeader, type StackTraceHeaderProps, type StackTraceProps, StreamingSuggestions, type StreamingSuggestionsProps, type StringFieldSpec, Suggestion, SuggestionLoading, type SuggestionLoadingProps, type SuggestionProps, Suggestions, type SuggestionsProps, type TableRowData, type TableSort, type TableSpec, Task, TaskContent, type TaskContentProps, TaskItem, TaskItemFile, type TaskItemFileProps, type TaskItemProps, type TaskProps, TaskTrigger, type TaskTriggerProps, Test, TestDuration, type TestDurationProps, TestError, TestErrorMessage, type TestErrorMessageProps, type TestErrorProps, TestErrorStack, type TestErrorStackProps, TestName, type TestNameProps, type TestProps, TestResults, TestResultsContent, type TestResultsContentProps, TestResultsDuration, type TestResultsDurationProps, TestResultsHeader, type TestResultsHeaderProps, TestResultsMeta, type TestResultsMetaProps, TestResultsProgress, type TestResultsProgressProps, type TestResultsProps, TestResultsSummary, type TestResultsSummaryProps, TestStatus, type TestStatusProps, TestSuite, TestSuiteContent, type TestSuiteContentProps, TestSuiteName, type TestSuiteNameProps, type TestSuiteProps, TestSuiteStats, type TestSuiteStatsProps, type TextInputContext, type TextShimmerProps, TokenUsage, TokenUsageCache, type TokenUsageCacheProps, TokenUsageContent, TokenUsageContentBody, type TokenUsageContentBodyProps, TokenUsageContentFooter, type TokenUsageContentFooterProps, TokenUsageContentHeader, type TokenUsageContentHeaderProps, type TokenUsageContentProps, TokenUsageInput, type TokenUsageInputProps, TokenUsageOutput, type TokenUsageOutputProps, type TokenUsageProps, TokenUsageReasoning, type TokenUsageReasoningProps, TokenUsageTrigger, type TokenUsageTriggerProps, Tool, ToolContent, type ToolContentProps, ToolDetails, type ToolDetailsProps, ToolHeader, type ToolHeaderProps, ToolInput, type ToolInputProps, ToolOutput, type ToolOutputProps, type ToolPart, type ToolProps, ToolResultCard, type ToolResultCardProps, Toolbar, type ToolbarProps, Transcription, type TranscriptionProps, TranscriptionSegment, type TranscriptionSegmentProps, TurnStatus, type TurnStatusProps, type TurnStatusTokens, type UseAudioLevelOptions, type UseAudioLevelResult, UserMessage, type UserMessageProps, VoiceSelector, VoiceSelectorAccent, type VoiceSelectorAccentProps, VoiceSelectorAge, type VoiceSelectorAgeProps, VoiceSelectorAttributes, type VoiceSelectorAttributesProps, VoiceSelectorBullet, type VoiceSelectorBulletProps, VoiceSelectorContent, type VoiceSelectorContentProps, VoiceSelectorDescription, type VoiceSelectorDescriptionProps, VoiceSelectorDialog, type VoiceSelectorDialogProps, VoiceSelectorEmpty, type VoiceSelectorEmptyProps, VoiceSelectorGender, type VoiceSelectorGenderProps, VoiceSelectorGroup, type VoiceSelectorGroupProps, VoiceSelectorInput, type VoiceSelectorInputProps, VoiceSelectorItem, type VoiceSelectorItemProps, VoiceSelectorList, type VoiceSelectorListProps, VoiceSelectorName, type VoiceSelectorNameProps, VoiceSelectorPreview, type VoiceSelectorPreviewProps, type VoiceSelectorProps, VoiceSelectorSeparator, type VoiceSelectorSeparatorProps, VoiceSelectorShortcut, type VoiceSelectorShortcutProps, VoiceSelectorTrigger, type VoiceSelectorTriggerProps, WebPreview, WebPreviewBody, type WebPreviewBodyProps, WebPreviewConsole, type WebPreviewConsoleProps, type WebPreviewContextValue, WebPreviewNavigation, WebPreviewNavigationButton, type WebPreviewNavigationButtonProps, type WebPreviewNavigationProps, type WebPreviewProps, WebPreviewUrl, type WebPreviewUrlProps, agentMessageVariants, badgeToneForValue, booleanFieldSchema, buildPartGroups, cellFormatSchema, columnSpecSchema, compareCellValues, createLazyMermaidPlugin, defaultPartStatus, diffRowVariants, enumFieldSchema, enumOptionSchema, fieldLabel, fieldSpecSchema, formSpecSchema, formatCellValue, getAttachmentLabel, getMediaCategory, getStatusBadge, groupPartByType, highlightCode, initialFormValues, inlineCitationSourceLabel, integerFieldSchema, isEmptyCell, isGroupNode, isNumericFormat, lazyMermaid, messageActionsVariants, messageFeedbackVariants, messagesToMarkdown, multiEnumFieldSchema, normalizeFormSpec, normalizeTableSpec, numberFieldSchema, optionLabel, optionValue, partsFingerprint, preloadMermaid, readSelectionWithin, rollupStatus, statusFromToolState, stringFieldSchema, tableSpecSchema, useAssetPreviewRenderer, useAttachmentContext, useAttachmentsContext, useAudioDevices, useAudioLevel, useContextPanel, useJSXPreview, useMessageEdit, usePromptInputAttachments, usePromptInputController, usePromptInputReferencedSources, useProviderAttachments, useReasoning, useVoiceSelector, validateField, validateForm };