@usetheo/ui 0.1.0-next.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 (133) hide show
  1. package/CHANGELOG.md +227 -0
  2. package/LICENSE +201 -0
  3. package/README.md +347 -0
  4. package/dist/fonts/LICENSE-GEIST.txt +92 -0
  5. package/dist/fonts/geist-400.woff2 +0 -0
  6. package/dist/fonts/geist-500.woff2 +0 -0
  7. package/dist/fonts/geist-600.woff2 +0 -0
  8. package/dist/fonts/geist-mono-400.woff2 +0 -0
  9. package/dist/fonts/geist-mono-500.woff2 +0 -0
  10. package/dist/fonts/geist-mono-600.woff2 +0 -0
  11. package/dist/fonts-cdn.css +28 -0
  12. package/dist/fonts.css +75 -0
  13. package/dist/index.d.ts +3063 -0
  14. package/dist/index.js +7746 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/styles.css +88 -0
  17. package/dist/tokens.css +230 -0
  18. package/package.json +520 -0
  19. package/registry/index.json +700 -0
  20. package/registry/r/agent-composer.json +22 -0
  21. package/registry/r/agent-editor.json +27 -0
  22. package/registry/r/agent-error-card.json +22 -0
  23. package/registry/r/agent-event.json +24 -0
  24. package/registry/r/agent-handoff.json +22 -0
  25. package/registry/r/agent-profile.json +23 -0
  26. package/registry/r/agent-starting-state.json +22 -0
  27. package/registry/r/agent-stream.json +27 -0
  28. package/registry/r/agent-streaming.json +22 -0
  29. package/registry/r/agent-timeline.json +22 -0
  30. package/registry/r/agent-types.json +15 -0
  31. package/registry/r/approval-card.json +25 -0
  32. package/registry/r/artifact-preview.json +22 -0
  33. package/registry/r/attachment-chip.json +24 -0
  34. package/registry/r/audit-log-entry.json +23 -0
  35. package/registry/r/auto-compact-notice.json +22 -0
  36. package/registry/r/avatar.json +23 -0
  37. package/registry/r/badge.json +22 -0
  38. package/registry/r/browser-controls.json +22 -0
  39. package/registry/r/build-log-stream.json +19 -0
  40. package/registry/r/button.json +23 -0
  41. package/registry/r/capability-indicator.json +23 -0
  42. package/registry/r/card.json +22 -0
  43. package/registry/r/chat-composer.json +23 -0
  44. package/registry/r/chat-message.json +21 -0
  45. package/registry/r/chat-thread.json +20 -0
  46. package/registry/r/chat-types.json +15 -0
  47. package/registry/r/checkbox.json +23 -0
  48. package/registry/r/cn.json +19 -0
  49. package/registry/r/command-palette.json +25 -0
  50. package/registry/r/context-card.json +23 -0
  51. package/registry/r/context-window-bar.json +20 -0
  52. package/registry/r/cost-meter.json +22 -0
  53. package/registry/r/created-files-card.json +23 -0
  54. package/registry/r/cron-job-card.json +22 -0
  55. package/registry/r/cron-jobs-list.json +23 -0
  56. package/registry/r/deployment-row.json +23 -0
  57. package/registry/r/dialog.json +23 -0
  58. package/registry/r/diff-viewer.json +20 -0
  59. package/registry/r/domain-config.json +25 -0
  60. package/registry/r/empty-state.json +20 -0
  61. package/registry/r/env-var-editor.json +25 -0
  62. package/registry/r/folder-context-card.json +23 -0
  63. package/registry/r/folder-selector.json +22 -0
  64. package/registry/r/form-field.json +23 -0
  65. package/registry/r/hook-config.json +22 -0
  66. package/registry/r/hook-event-log.json +22 -0
  67. package/registry/r/input.json +19 -0
  68. package/registry/r/intent-selector.json +24 -0
  69. package/registry/r/label.json +22 -0
  70. package/registry/r/lane-board.json +20 -0
  71. package/registry/r/live-region-context.json +16 -0
  72. package/registry/r/login-split.json +20 -0
  73. package/registry/r/mcp-server-card.json +22 -0
  74. package/registry/r/mcp-server-list.json +23 -0
  75. package/registry/r/memory-editor.json +23 -0
  76. package/registry/r/mention-menu.json +23 -0
  77. package/registry/r/metrics-panel.json +22 -0
  78. package/registry/r/mode-types.json +15 -0
  79. package/registry/r/model-card.json +23 -0
  80. package/registry/r/model-selector.json +23 -0
  81. package/registry/r/permission-matrix.json +22 -0
  82. package/registry/r/permission-modal.json +24 -0
  83. package/registry/r/permission-types.json +15 -0
  84. package/registry/r/preview-env-card.json +25 -0
  85. package/registry/r/preview-panel.json +21 -0
  86. package/registry/r/progress-checklist.json +23 -0
  87. package/registry/r/project-card.json +25 -0
  88. package/registry/r/project-switcher.json +22 -0
  89. package/registry/r/quick-action-chips.json +21 -0
  90. package/registry/r/radio-group.json +23 -0
  91. package/registry/r/recent-folders-list.json +22 -0
  92. package/registry/r/rollback-ui.json +24 -0
  93. package/registry/r/rule-card.json +23 -0
  94. package/registry/r/rule-editor.json +28 -0
  95. package/registry/r/rule-types.json +18 -0
  96. package/registry/r/run-stats.json +22 -0
  97. package/registry/r/running-tasks-panel.json +22 -0
  98. package/registry/r/safe-href.json +16 -0
  99. package/registry/r/scroll-area.json +22 -0
  100. package/registry/r/select.json +23 -0
  101. package/registry/r/session-list-item.json +20 -0
  102. package/registry/r/session-timeline.json +22 -0
  103. package/registry/r/sheet.json +24 -0
  104. package/registry/r/sidebar.json +19 -0
  105. package/registry/r/skeleton.json +19 -0
  106. package/registry/r/skill-card.json +24 -0
  107. package/registry/r/skill-editor.json +28 -0
  108. package/registry/r/skills-list.json +23 -0
  109. package/registry/r/social-auth-row.json +21 -0
  110. package/registry/r/steps-rail.json +20 -0
  111. package/registry/r/sub-agent-dispatch.json +22 -0
  112. package/registry/r/switch.json +22 -0
  113. package/registry/r/system-prompt-editor.json +22 -0
  114. package/registry/r/tabs.json +22 -0
  115. package/registry/r/tailwind-preset.json +19 -0
  116. package/registry/r/task-header.json +24 -0
  117. package/registry/r/task-plan.json +22 -0
  118. package/registry/r/task-types.json +15 -0
  119. package/registry/r/terminal-panel.json +22 -0
  120. package/registry/r/textarea.json +19 -0
  121. package/registry/r/theme-provider.json +59 -0
  122. package/registry/r/theme-script.json +18 -0
  123. package/registry/r/theo-ui-provider.json +20 -0
  124. package/registry/r/toast.json +30 -0
  125. package/registry/r/token-usage-chart.json +20 -0
  126. package/registry/r/tokens.json +21 -0
  127. package/registry/r/tool-call-card.json +23 -0
  128. package/registry/r/tool-call.json +22 -0
  129. package/registry/r/tool-result.json +20 -0
  130. package/registry/r/tools-list.json +23 -0
  131. package/registry/r/tooltip.json +22 -0
  132. package/registry/r/topnav.json +22 -0
  133. package/registry/r/types.json +15 -0
@@ -0,0 +1,3063 @@
1
+ import { ClassValue } from 'clsx';
2
+ import * as react from 'react';
3
+ import { ReactNode, JSX, ComponentPropsWithoutRef, ComponentProps, ButtonHTMLAttributes, HTMLAttributes, InputHTMLAttributes, ComponentType, SVGProps, TextareaHTMLAttributes, ElementType, OutputHTMLAttributes } from 'react';
4
+ import * as class_variance_authority_types from 'class-variance-authority/types';
5
+ import * as ToastPrimitive from '@radix-ui/react-toast';
6
+ import { VariantProps } from 'class-variance-authority';
7
+ import * as react_jsx_runtime from 'react/jsx-runtime';
8
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
9
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
10
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
11
+ import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
12
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
13
+ import * as LabelPrimitive from '@radix-ui/react-label';
14
+ import * as SelectPrimitive from '@radix-ui/react-select';
15
+ import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
16
+ import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
17
+ import * as SwitchPrimitive from '@radix-ui/react-switch';
18
+ import * as lucide_react from 'lucide-react';
19
+
20
+ /**
21
+ * Merge Tailwind classes with conflict resolution.
22
+ * Standard utility across all @usetheo/ui components.
23
+ */
24
+ declare function cn(...inputs: ClassValue[]): string;
25
+
26
+ /**
27
+ * Theo UI — Theme types.
28
+ *
29
+ * A Theme is a frozen bundle of CSS-var values that the runtime can swap by
30
+ * setting `data-theme="<name>"` on `<html>`. The structure mirrors what lives
31
+ * in tokens.css so themes can be merged without ambiguity.
32
+ */
33
+ type ThemeMode = "light" | "dark";
34
+ interface ColorScale {
35
+ background: string;
36
+ foreground: string;
37
+ card: string;
38
+ "card-foreground": string;
39
+ popover: string;
40
+ "popover-foreground": string;
41
+ primary: string;
42
+ "primary-deep": string;
43
+ "primary-glow": string;
44
+ "primary-foreground": string;
45
+ secondary: string;
46
+ "secondary-foreground": string;
47
+ accent: string;
48
+ "accent-deep": string;
49
+ "accent-foreground": string;
50
+ muted: string;
51
+ "muted-foreground": string;
52
+ border: string;
53
+ input: string;
54
+ ring: string;
55
+ success: string;
56
+ "success-foreground": string;
57
+ warning: string;
58
+ "warning-foreground": string;
59
+ destructive: string;
60
+ "destructive-foreground": string;
61
+ info: string;
62
+ "info-foreground": string;
63
+ }
64
+ interface ThemeFonts {
65
+ /** Display headlines (h1-h3, hero text). */
66
+ display: string;
67
+ /** Body / UI text. */
68
+ body: string;
69
+ /** Code, mono, paths, timestamps. */
70
+ mono: string;
71
+ }
72
+ interface Theme {
73
+ /** Stable id, used in `data-theme`. */
74
+ name: string;
75
+ /** Human-readable label for theme switchers. */
76
+ label: string;
77
+ /** Optional short description shown in switchers. */
78
+ description?: string;
79
+ fonts: ThemeFonts;
80
+ light: ColorScale;
81
+ dark: ColorScale;
82
+ /**
83
+ * Optional URL(s) to fetch before applying. The provider injects a `<link>`
84
+ * tag once per URL to load remote fonts. Already-injected URLs are deduped.
85
+ */
86
+ fontUrls?: string[];
87
+ }
88
+
89
+ interface ThemeContextValue {
90
+ /** Active theme (full descriptor). */
91
+ theme: Theme;
92
+ /** Active mode: light or dark. */
93
+ mode: ThemeMode;
94
+ /** All available themes. */
95
+ themes: Theme[];
96
+ /** Swap the active theme by name. */
97
+ setTheme: (name: string) => void;
98
+ /** Set light/dark explicitly. */
99
+ setMode: (mode: ThemeMode) => void;
100
+ /** Toggle light <> dark. */
101
+ toggleMode: () => void;
102
+ /** Register an additional theme at runtime. */
103
+ registerTheme: (theme: Theme) => void;
104
+ }
105
+ interface ThemeProviderProps {
106
+ children: ReactNode;
107
+ /**
108
+ * Theme to start with. Must match the `name` of an entry in `themes`.
109
+ * Defaults to `"violet-forge"` for backward compat — if you don't pass
110
+ * `violet-forge` in `themes`, set this prop explicitly.
111
+ */
112
+ defaultTheme?: string;
113
+ /** Mode to start with. Defaults to `"dark"` (library is dark-first). */
114
+ defaultMode?: ThemeMode;
115
+ /**
116
+ * Available themes. **Required**: ThemeProvider does not auto-include any
117
+ * built-in theme since v0.1.0-next.0 — pass `builtinThemes` for all three
118
+ * Violet Forge defaults, or your own array for a slimmer bundle.
119
+ *
120
+ * Migration: consumers previously calling `<ThemeProvider>` without this
121
+ * prop now must pass `themes={builtinThemes}` (or use `<TheoUIProvider>`
122
+ * which defaults to `builtinThemes` for you).
123
+ */
124
+ themes: Theme[];
125
+ /**
126
+ * Persist selection in localStorage under this key. Pass `null` to disable.
127
+ * Default: "theo-ui:theme".
128
+ */
129
+ storageKey?: string | null;
130
+ }
131
+ /**
132
+ * ThemeProvider — central registry + runtime switcher for Theo themes.
133
+ *
134
+ * Behavior:
135
+ * 1. On mount, injects a `<style id="theo-ui-theme-vars">` element with
136
+ * one CSS block per theme (`[data-theme="<name>"] { --token: ... }`).
137
+ * 2. Sets `data-theme` and `data-mode` on `<html>` so any element nested
138
+ * below inherits the right tokens (the Tailwind config consumes them).
139
+ * 3. Lazy-loads theme font URLs by injecting `<link rel="stylesheet">`.
140
+ * 4. Optionally persists choice in localStorage.
141
+ */
142
+ declare function ThemeProvider({ children, defaultTheme, defaultMode, themes: themesProp, storageKey, }: ThemeProviderProps): JSX.Element;
143
+ /**
144
+ * useTheme — access theme state from any component inside <ThemeProvider>.
145
+ * Throws if used outside the provider — fail-fast.
146
+ */
147
+ declare function useTheme(): ThemeContextValue;
148
+
149
+ /**
150
+ * ThemeScript — inline `<script>` for SSR-safe theme initialization.
151
+ *
152
+ * Renders a synchronous script that runs BEFORE React hydration. It reads the
153
+ * persisted theme + mode from localStorage (or falls back to the defaults) and
154
+ * sets `data-theme` / `data-mode` on `<html>`, plus the `.dark` class when
155
+ * mode is dark. This eliminates FOUC and avoids hydration mismatch warnings
156
+ * when the user's persisted choice differs from the SSR defaults.
157
+ *
158
+ * Place this in `<head>` ABOVE `<body>`. The component does not need to live
159
+ * inside `<ThemeProvider>`.
160
+ *
161
+ * Security: every interpolated value is passed through `safe()`, which both
162
+ * `JSON.stringify`s the value AND escapes `<` to `<`. The `<` escape is
163
+ * REQUIRED because `JSON.stringify` alone does NOT escape `/`, so a payload
164
+ * like `"</script><script>alert(1)</script>"` would otherwise break out of
165
+ * the inline `<script>` tag even though it stays inside a JS string literal.
166
+ * (The browser tokenizes `</script>` at the HTML layer before JS parses.)
167
+ *
168
+ * Example (Next.js App Router): see docs/design-system.md → SSR section.
169
+ * Pass `defaultTheme` and `defaultMode` to align with the consumer's
170
+ * preferred initial state. Always wrap the root in `<html
171
+ * suppressHydrationWarning>` to silence the expected one-render diff.
172
+ */
173
+
174
+ interface ThemeScriptProps {
175
+ /** Theme name to apply when no persisted value exists. Default `"violet-forge"`. */
176
+ defaultTheme?: string;
177
+ /** Mode to apply when no persisted value exists. Default `"dark"`. */
178
+ defaultMode?: ThemeMode;
179
+ /**
180
+ * localStorage namespace. Must match the `storageKey` passed to
181
+ * `<ThemeProvider>`. Default `"theo-ui:theme"`. Pass `null` to disable
182
+ * persistence reads (the script will always apply defaults).
183
+ */
184
+ storageKey?: string | null;
185
+ }
186
+ declare function ThemeScript({ defaultTheme, defaultMode, storageKey, }: ThemeScriptProps): JSX.Element;
187
+
188
+ interface ThemeSwitcherProps {
189
+ className?: string;
190
+ /** If true, renders mode toggle inline next to the theme menu. */
191
+ showModeToggle?: boolean;
192
+ }
193
+ /**
194
+ * ThemeSwitcher — drop-in theme + mode picker.
195
+ *
196
+ * Two affordances:
197
+ * - Palette dropdown lists all registered themes with the active marked.
198
+ * - Optional sun/moon button toggles light/dark.
199
+ *
200
+ * Stateless wrt itself — pulls state from `useTheme()`.
201
+ */
202
+ declare function ThemeSwitcher({ className, showModeToggle }: ThemeSwitcherProps): JSX.Element;
203
+
204
+ /**
205
+ * Violet Forge — the default Theo theme.
206
+ *
207
+ * Identity: Theo violet primary (#7C3AED), burnt sienna accent (#C96442),
208
+ * Vercel-style neutral surfaces (pure white light / charcoal dark),
209
+ * Geist Sans + Geist Mono throughout.
210
+ *
211
+ * Source of truth for `data-theme` overrides. Values mirror
212
+ * src/styles/tokens.css for the default `:root`.
213
+ */
214
+ declare const violetForge: Theme;
215
+
216
+ /**
217
+ * Classic Paper — light-primary with deep-navy dark mirror; Inter + JetBrains Mono.
218
+ *
219
+ * Identity: warm paper background, deep navy foreground, indigo primary
220
+ * (closer to traditional dashboard SaaS), Inter throughout. Maximizes
221
+ * legibility and familiarity — use when reading endurance > differentiation.
222
+ *
223
+ * Provides a full `dark` palette mirror so consumers toggling `.dark` still
224
+ * get a coherent surface (it is not "light-only" by accident).
225
+ */
226
+ declare const classicPaper: Theme;
227
+
228
+ /**
229
+ * Aurora Terminal — dark-first, cyan-aurora primary, Geist Mono everywhere.
230
+ *
231
+ * Identity: deep oceanic background, cyan-aurora primary, aurora-pink accent.
232
+ * Headers use Geist with heavier tracking; body uses Geist Mono for full
233
+ * "developer console" feel. Suits CLI/devtools showcase.
234
+ */
235
+ declare const auroraTerminal: Theme;
236
+
237
+ /**
238
+ * All themes bundled with Theo UI. Pass to `<ThemeProvider themes={builtinThemes}>`
239
+ * if you want all of them available out of the box.
240
+ */
241
+ declare const builtinThemes: Theme[];
242
+
243
+ /**
244
+ * Toast — transient notification built on Radix Toast.
245
+ *
246
+ * Composition: app mounts <Toaster /> once. Components call `toast(...)` via
247
+ * the `useToast()` hook (see toaster.tsx). The look is theme-aware: status
248
+ * icon coloured by --primary/--success/--warning/--destructive; the body
249
+ * card uses --popover surface.
250
+ *
251
+ * Variants:
252
+ * - default (neutral)
253
+ * - info (primary tint)
254
+ * - success (deploy ok, action completed)
255
+ * - warning (queued, permission requested)
256
+ * - destructive (failed, fatal)
257
+ */
258
+ declare const toastVariants: (props?: ({
259
+ variant?: "success" | "warning" | "destructive" | "info" | "default" | null | undefined;
260
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
261
+ type ToastVariant = NonNullable<VariantProps<typeof toastVariants>["variant"]>;
262
+ interface ToastProps extends ComponentPropsWithoutRef<typeof ToastPrimitive.Root>, VariantProps<typeof toastVariants> {
263
+ }
264
+ declare const Toast: react.ForwardRefExoticComponent<ToastProps & react.RefAttributes<HTMLLIElement>> & {
265
+ Title: react.ForwardRefExoticComponent<Omit<ToastPrimitive.ToastTitleProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
266
+ Description: react.ForwardRefExoticComponent<Omit<ToastPrimitive.ToastDescriptionProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
267
+ Close: react.ForwardRefExoticComponent<Omit<ToastPrimitive.ToastCloseProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
268
+ Action: react.ForwardRefExoticComponent<Omit<ToastPrimitive.ToastActionProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
269
+ Provider: react.FC<ToastPrimitive.ToastProviderProps>;
270
+ Viewport: react.ForwardRefExoticComponent<ToastPrimitive.ToastViewportProps & react.RefAttributes<HTMLOListElement>>;
271
+ };
272
+
273
+ interface ToastDescriptor {
274
+ id: string;
275
+ title?: ReactNode;
276
+ description?: ReactNode;
277
+ variant?: ToastVariant;
278
+ /** Auto-dismiss in ms. Default 5000. Pass `null` for sticky. */
279
+ duration?: number | null;
280
+ action?: {
281
+ label: ReactNode;
282
+ onClick: () => void;
283
+ };
284
+ }
285
+ interface ToastContextValue {
286
+ toast: (descriptor: Omit<ToastDescriptor, "id">) => string;
287
+ dismiss: (id: string) => void;
288
+ }
289
+ interface ToasterProps {
290
+ children: ReactNode;
291
+ /** Toast viewport position. Default bottom-right. */
292
+ position?: "top-right" | "top-left" | "bottom-right" | "bottom-left";
293
+ className?: string;
294
+ }
295
+ /**
296
+ * Toaster — mount once at the app root. Wraps children in a Radix Toast
297
+ * Provider + Viewport and exposes the `useToast()` hook for descendants.
298
+ */
299
+ declare function Toaster({ children, position, className }: ToasterProps): JSX.Element;
300
+ /**
301
+ * useToast — fire toasts from anywhere inside <Toaster>.
302
+ *
303
+ * Example:
304
+ * const { toast } = useToast();
305
+ * toast({ title: "Deployed", variant: "success" });
306
+ */
307
+ declare function useToast(): ToastContextValue;
308
+
309
+ /**
310
+ * TheoUIProvider — primary entry point composing `<ThemeProvider>` and
311
+ * `<Toaster>` in the correct order with sensible defaults.
312
+ *
313
+ * Recommended for consumer apps to avoid hand-wiring the provider stack.
314
+ * Equivalent to:
315
+ *
316
+ * <ThemeProvider themes={builtinThemes} {...theme}>
317
+ * <Toaster {...toaster}>{children}</Toaster>
318
+ * </ThemeProvider>
319
+ *
320
+ * Notes:
321
+ * - Since v0.1.0-next.0, `<ThemeProvider>` requires the `themes` prop
322
+ * (T2.5 decoupling). `<TheoUIProvider>` defaults it to `builtinThemes`
323
+ * to preserve "works out of the box" DX. Pass `theme.themes` to override.
324
+ * - The `"use client"` directive is required for Next.js App Router (RSC)
325
+ * because `<ThemeProvider>` uses React state and effects internally.
326
+ * - `<Tooltip>` provider stays per-instance (Radix recommendation) — this
327
+ * wrapper does NOT introduce a global tooltip context.
328
+ * - `<ThemeProvider>` and `<Toaster>` remain independently exported for
329
+ * consumers who want bespoke control.
330
+ *
331
+ * SSR:
332
+ * - Place `<ThemeScript>` in `<head>` to avoid FOUC + hydration mismatch.
333
+ * - Wrap `<html lang="en" suppressHydrationWarning>`.
334
+ *
335
+ * @example
336
+ * import { TheoUIProvider } from "@usetheo/ui";
337
+ *
338
+ * export default function App({ children }) {
339
+ * return <TheoUIProvider>{children}</TheoUIProvider>;
340
+ * }
341
+ */
342
+ interface TheoUIProviderProps {
343
+ children: ReactNode;
344
+ /** Pass-through props for the inner `<ThemeProvider>`. Optional. */
345
+ theme?: Omit<ComponentProps<typeof ThemeProvider>, "children" | "themes"> & {
346
+ /** Override the default theme set (defaults to `builtinThemes`). */
347
+ themes?: ComponentProps<typeof ThemeProvider>["themes"];
348
+ };
349
+ /** Pass-through props for the inner `<Toaster>`. */
350
+ toaster?: Omit<ComponentProps<typeof Toaster>, "children">;
351
+ }
352
+ declare function TheoUIProvider({ children, theme, toaster }: TheoUIProviderProps): JSX.Element;
353
+ declare namespace TheoUIProvider {
354
+ var displayName: string;
355
+ }
356
+
357
+ type MessageRole = "user" | "assistant" | "system";
358
+ interface Attachment {
359
+ id: string;
360
+ name: string;
361
+ size?: string;
362
+ type?: string;
363
+ }
364
+ interface Message {
365
+ id: string;
366
+ role: MessageRole;
367
+ content: string | ReactNode;
368
+ timestamp?: string;
369
+ /**
370
+ * Model that produced this message (assistant role only).
371
+ * e.g. "Opus 4.6", "Sonnet 4.6", "GPT-5.4".
372
+ */
373
+ model?: string;
374
+ attachments?: Attachment[];
375
+ }
376
+
377
+ type AgentEventType = "command" | "file_read" | "file_write" | "edit" | "lint" | "typecheck" | "build" | "tool";
378
+ type AgentEventStatus = "pending" | "running" | "success" | "failed";
379
+ interface AgentEvent$1 {
380
+ id: string;
381
+ type: AgentEventType;
382
+ label: string;
383
+ /** File path when the event is file-related. */
384
+ path?: string;
385
+ /** Diff stats for edit/write events. */
386
+ diff?: {
387
+ added: number;
388
+ removed: number;
389
+ };
390
+ status: AgentEventStatus;
391
+ timestamp?: string;
392
+ /** Optional expandable detail (e.g. command output, diff snippet). */
393
+ detail?: ReactNode;
394
+ }
395
+
396
+ type PermissionOperation = "read" | "write" | "delete";
397
+ type PermissionDecision = "denied" | "allowed_once" | "always_allowed";
398
+ interface PermissionRequest {
399
+ /** Absolute path to the resource (file or folder). */
400
+ path: string;
401
+ /** Operations the agent wants to perform on the resource. */
402
+ operations: PermissionOperation[];
403
+ }
404
+
405
+ type TaskStatus = "idle" | "permission_required" | "starting" | "running" | "verifying" | "completed" | "failed";
406
+ type TaskStepStatus = "pending" | "running" | "done" | "skipped";
407
+ interface TaskStep {
408
+ id: string;
409
+ label: string;
410
+ status: TaskStepStatus;
411
+ /** 0..1 progress for in-flight steps. */
412
+ progress?: number;
413
+ }
414
+
415
+ /**
416
+ * Button — primitive action element in the Violet Forge design system.
417
+ *
418
+ * Variants:
419
+ * - primary Theo violet fill, glow on hover (signature)
420
+ * - secondary surface with hairline border
421
+ * - accent burnt-sienna fill, celebratory actions
422
+ * - ghost transparent, hover lifts surface
423
+ * - link text-only, primary color, underline on hover
424
+ * - destructive for irreversible actions
425
+ *
426
+ * Sizes: sm (32px) · md (40px, default) · lg (48px) · icon (square 40px)
427
+ *
428
+ * `asChild` swaps the root for the consumer's element (Radix Slot pattern).
429
+ */
430
+ declare const buttonVariants: (props?: ({
431
+ variant?: "primary" | "secondary" | "accent" | "destructive" | "link" | "ghost" | null | undefined;
432
+ size?: "sm" | "md" | "lg" | "icon" | null | undefined;
433
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
434
+ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
435
+ asChild?: boolean;
436
+ }
437
+ declare const Button: react.ForwardRefExoticComponent<ButtonProps & react.RefAttributes<HTMLButtonElement>>;
438
+
439
+ /**
440
+ * Badge — small status / tag indicator.
441
+ *
442
+ * Variants:
443
+ * - default muted surface, hairline border
444
+ * - primary violet outline + soft violet bg
445
+ * - accent burnt sienna (celebration / pro / beta)
446
+ * - success deploy succeeded
447
+ * - warning attention needed
448
+ * - destructive failed
449
+ * - outline transparent, just border
450
+ *
451
+ * Status dots are inlined via `<Badge.Dot />` for things like "Building…",
452
+ * "Running", "Failed" rows in deployment lists.
453
+ */
454
+ declare const badgeVariants: (props?: ({
455
+ variant?: "primary" | "accent" | "success" | "warning" | "destructive" | "default" | "outline" | null | undefined;
456
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
457
+ interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
458
+ }
459
+ declare const Badge: react.ForwardRefExoticComponent<BadgeProps & react.RefAttributes<HTMLSpanElement>>;
460
+ interface BadgeDotProps extends HTMLAttributes<HTMLSpanElement> {
461
+ pulse?: boolean;
462
+ tone?: "primary" | "accent" | "success" | "warning" | "destructive" | "muted";
463
+ }
464
+ declare const Dot: react.ForwardRefExoticComponent<BadgeDotProps & react.RefAttributes<HTMLSpanElement>>;
465
+ declare const BadgeWithDot: typeof Badge & {
466
+ Dot: typeof Dot;
467
+ };
468
+
469
+ interface TitleProps extends HTMLAttributes<HTMLHeadingElement> {
470
+ /**
471
+ * When true, renders the child element with the Card.Title styles applied
472
+ * (Radix Slot pattern). Use to swap the default `<h3>` for `<h1>` / `<h2>`
473
+ * when the heading hierarchy requires it.
474
+ */
475
+ asChild?: boolean;
476
+ }
477
+ declare const Card: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>> & {
478
+ Header: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
479
+ Title: react.ForwardRefExoticComponent<TitleProps & react.RefAttributes<HTMLHeadingElement>>;
480
+ Description: react.ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & react.RefAttributes<HTMLParagraphElement>>;
481
+ Body: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
482
+ Footer: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
483
+ };
484
+
485
+ interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
486
+ }
487
+ /**
488
+ * Input — text input primitive.
489
+ *
490
+ * Violet Forge specifics:
491
+ * - height 40px (h-10) matching default Button md.
492
+ * - rounded-md (6px) — slightly less than buttons to differentiate.
493
+ * - focus uses violet ring (--ring).
494
+ * - placeholder uses --muted-foreground.
495
+ */
496
+ declare const Input: react.ForwardRefExoticComponent<InputProps & react.RefAttributes<HTMLInputElement>>;
497
+
498
+ interface ContentProps$1 extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {
499
+ hideCloseButton?: boolean;
500
+ }
501
+ declare const Dialog: react.FC<DialogPrimitive.DialogProps> & {
502
+ Trigger: react.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & react.RefAttributes<HTMLButtonElement>>;
503
+ Close: react.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & react.RefAttributes<HTMLButtonElement>>;
504
+ Content: react.ForwardRefExoticComponent<ContentProps$1 & react.RefAttributes<HTMLDivElement>>;
505
+ Overlay: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
506
+ Header: {
507
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
508
+ displayName: string;
509
+ };
510
+ Body: {
511
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
512
+ displayName: string;
513
+ };
514
+ Footer: {
515
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
516
+ displayName: string;
517
+ };
518
+ Title: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & react.RefAttributes<HTMLHeadingElement>, "ref"> & react.RefAttributes<HTMLHeadingElement>>;
519
+ Description: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & react.RefAttributes<HTMLParagraphElement>, "ref"> & react.RefAttributes<HTMLParagraphElement>>;
520
+ };
521
+
522
+ declare const Tabs: react.ForwardRefExoticComponent<TabsPrimitive.TabsProps & react.RefAttributes<HTMLDivElement>> & {
523
+ List: react.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsListProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
524
+ Trigger: react.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsTriggerProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
525
+ Content: react.ForwardRefExoticComponent<Omit<TabsPrimitive.TabsContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
526
+ };
527
+
528
+ /**
529
+ * Tooltip — built on Radix Tooltip.
530
+ *
531
+ * Visual: dark surface in light mode (and inverse in dark) with rounded-md,
532
+ * shadow-md, text-body-sm. 8px delay-show default.
533
+ *
534
+ * Wrap your app in <Tooltip.Provider> once (or use the default delayDuration here).
535
+ */
536
+ declare const Provider: react.FC<TooltipPrimitive.TooltipProviderProps>;
537
+ declare const Root: react.FC<TooltipPrimitive.TooltipProps>;
538
+ declare const Trigger: react.ForwardRefExoticComponent<TooltipPrimitive.TooltipTriggerProps & react.RefAttributes<HTMLButtonElement>>;
539
+ declare const Content$1: react.ForwardRefExoticComponent<Omit<TooltipPrimitive.TooltipContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
540
+ interface TooltipProps extends ComponentPropsWithoutRef<typeof TooltipPrimitive.Root> {
541
+ label: ReactNode;
542
+ side?: "top" | "right" | "bottom" | "left";
543
+ align?: "start" | "center" | "end";
544
+ children: ReactNode;
545
+ }
546
+ /**
547
+ * Shorthand: <Tooltip label="…"><Button>…</Button></Tooltip>
548
+ * Wraps Provider + Root + Trigger asChild + Content for the common case.
549
+ * For advanced usage (controlled state, custom content), use Tooltip.Root etc. directly.
550
+ */
551
+ declare const Tooltip: ({ label, side, align, delayDuration, children, ...rootProps }: TooltipProps) => ReturnType<typeof Provider>;
552
+ declare const TooltipWithStatics: typeof Tooltip & {
553
+ Provider: typeof Provider;
554
+ Root: typeof Root;
555
+ Trigger: typeof Trigger;
556
+ Content: typeof Content$1;
557
+ };
558
+
559
+ /**
560
+ * ScrollArea — custom scroller with Violet Forge styling.
561
+ *
562
+ * Built on Radix ScrollArea so the native scrollbar is always hidden and the
563
+ * custom thumb stays consistent across Chrome/Firefox/Safari/macOS-trackpad.
564
+ *
565
+ * Visual:
566
+ * - track is transparent, only the thumb is visible.
567
+ * - thumb is `--primary` at 25% opacity by default; on hover, 45% with violet glow.
568
+ * - active drag bumps to 60%.
569
+ * - the rounded full pill thumb plays well with the brutalist border language
570
+ * but stays subtle (1.5px wide on rest, 3px on hover).
571
+ *
572
+ * Modes (via `type`):
573
+ * - "hover" (default) — scrollbar fades in on hover/focus, otherwise hidden.
574
+ * - "always" — scrollbar always visible.
575
+ * - "auto" — scrollbar visible only when content overflows.
576
+ * - "scroll" — Radix-managed: visible only while scrolling.
577
+ */
578
+ interface ScrollAreaProps extends ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {
579
+ /**
580
+ * Optional override for which scrollbar(s) to render.
581
+ * Defaults: vertical only. Set to "both" for grids/tables with overflow-x.
582
+ */
583
+ orientation?: "vertical" | "horizontal" | "both";
584
+ /**
585
+ * Thickness of the scrollbar. Default "thin" (2.5px → 3.5px on hover).
586
+ * Use "regular" (8px) for content where the scrollbar should be a more prominent target.
587
+ */
588
+ size?: "thin" | "regular";
589
+ }
590
+ interface ScrollBarProps extends ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> {
591
+ size?: "thin" | "regular";
592
+ }
593
+ declare const ScrollArea: react.ForwardRefExoticComponent<ScrollAreaProps & react.RefAttributes<HTMLDivElement>> & {
594
+ Bar: react.ForwardRefExoticComponent<ScrollBarProps & react.RefAttributes<HTMLDivElement>>;
595
+ };
596
+
597
+ /**
598
+ * Skeleton — placeholder block shown while content is loading.
599
+ *
600
+ * Uses --muted as base + a subtle shimmer that respects the violet theme.
601
+ * Compose multiple Skeletons to mirror your component layout while loading.
602
+ *
603
+ * Accessibility (LOW-004): the default `role="status"` + `aria-live="polite"`
604
+ * announces "Loading" to screen readers. In loops or grids where many
605
+ * Skeletons mount simultaneously, this can be noisy. Override per-instance
606
+ * with `aria-live="off"` and/or `aria-hidden` when only one container-level
607
+ * loading announcement is desired:
608
+ *
609
+ * <div role="status" aria-live="polite" aria-label="Loading deployments">
610
+ * {placeholders.map(id => (
611
+ * <Skeleton key={id} aria-live="off" aria-hidden="true" className="h-8" />
612
+ * ))}
613
+ * </div>
614
+ */
615
+ declare const Skeleton: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
616
+
617
+ /**
618
+ * Avatar — user/team avatar with safe fallback to initials.
619
+ *
620
+ * Composition:
621
+ * <Avatar size="md">
622
+ * <Avatar.Image src="…" alt="…" />
623
+ * <Avatar.Fallback>AA</Avatar.Fallback>
624
+ * </Avatar>
625
+ *
626
+ * Built on Radix Avatar (handles image load failures → fallback automatically).
627
+ * Sizes scale on the root; fallback inherits the size's text scale.
628
+ */
629
+ declare const avatarVariants: (props?: ({
630
+ size?: "sm" | "md" | "lg" | "xs" | "xl" | null | undefined;
631
+ tone?: "primary" | "accent" | "muted" | null | undefined;
632
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
633
+ interface AvatarProps extends ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>, VariantProps<typeof avatarVariants> {
634
+ }
635
+ declare const Avatar: react.ForwardRefExoticComponent<AvatarProps & react.RefAttributes<HTMLSpanElement>> & {
636
+ Image: react.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & react.RefAttributes<HTMLImageElement>, "ref"> & react.RefAttributes<HTMLImageElement>>;
637
+ Fallback: react.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & react.RefAttributes<HTMLSpanElement>, "ref"> & react.RefAttributes<HTMLSpanElement>>;
638
+ };
639
+
640
+ /**
641
+ * Label — form field label built on Radix Label.
642
+ *
643
+ * Behaviors:
644
+ * - Clicking the label focuses the associated `htmlFor` input.
645
+ * - Adds a small red asterisk when `required` is set.
646
+ * - Inherits disabled visuals from the wrapper (`peer-disabled`).
647
+ */
648
+ interface LabelProps extends ComponentPropsWithoutRef<typeof LabelPrimitive.Root> {
649
+ required?: boolean;
650
+ }
651
+ declare const Label: react.ForwardRefExoticComponent<LabelProps & react.RefAttributes<HTMLLabelElement>>;
652
+
653
+ interface FormFieldProps extends HTMLAttributes<HTMLDivElement> {
654
+ /** Optional explicit id override. */
655
+ id?: string;
656
+ /** Marks the field as invalid; switches Hint → Error and toggles aria. */
657
+ invalid?: boolean;
658
+ }
659
+ interface FormFieldLabelProps extends ComponentPropsWithoutRef<typeof LabelPrimitive.Root> {
660
+ required?: boolean;
661
+ }
662
+ declare const FormField: react.ForwardRefExoticComponent<FormFieldProps & react.RefAttributes<HTMLDivElement>> & {
663
+ Label: react.ForwardRefExoticComponent<FormFieldLabelProps & react.RefAttributes<HTMLLabelElement>>;
664
+ Control: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
665
+ Hint: react.ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & react.RefAttributes<HTMLParagraphElement>>;
666
+ Error: react.ForwardRefExoticComponent<HTMLAttributes<HTMLParagraphElement> & react.RefAttributes<HTMLParagraphElement>>;
667
+ };
668
+
669
+ /**
670
+ * IconComponent — shape compatible with both lucide-react icons and custom React SVG components.
671
+ *
672
+ * Centralizing this here avoids TS2322 noise from `exactOptionalPropertyTypes` when mapping
673
+ * icons through Record<...> structures.
674
+ */
675
+ type IconComponent = ComponentType<SVGProps<SVGSVGElement> & {
676
+ className?: string;
677
+ }>;
678
+
679
+ interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
680
+ /** Icon shown above the title. */
681
+ icon?: IconComponent;
682
+ title: ReactNode;
683
+ description?: ReactNode;
684
+ /** Optional action slot (typically <Button>). */
685
+ action?: ReactNode;
686
+ /** Hint shown above the title (e.g. uppercase eyebrow). */
687
+ eyebrow?: ReactNode;
688
+ /** Bordered dashed surface (placeholder vibe). Default true. */
689
+ dashed?: boolean;
690
+ }
691
+ /**
692
+ * EmptyState — visual placeholder for empty lists / first-run screens.
693
+ *
694
+ * Composition: icon + eyebrow + title + description + action. All slots are
695
+ * optional except title.
696
+ */
697
+ declare const EmptyState: react.ForwardRefExoticComponent<EmptyStateProps & react.RefAttributes<HTMLDivElement>>;
698
+
699
+ /**
700
+ * Select — styled wrapper around Radix Select.
701
+ *
702
+ * Composition:
703
+ * <Select value={value} onValueChange={setValue}>
704
+ * <Select.Trigger>
705
+ * <Select.Value placeholder="Pick…" />
706
+ * </Select.Trigger>
707
+ * <Select.Content>
708
+ * <Select.Group>
709
+ * <Select.Label>Group</Select.Label>
710
+ * <Select.Item value="a">A</Select.Item>
711
+ * </Select.Group>
712
+ * </Select.Content>
713
+ * </Select>
714
+ *
715
+ * Trigger matches Input height + violet focus ring. Content uses popover
716
+ * surface with check on the selected item.
717
+ */
718
+ declare const SelectTrigger: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectTriggerProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
719
+ declare const SelectContent: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectContentProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
720
+ declare const SelectLabel: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
721
+ declare const SelectItem: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectItemProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
722
+ declare const SelectSeparator: react.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
723
+ declare const Select: typeof SelectPrimitive.Root & {
724
+ Trigger: typeof SelectTrigger;
725
+ Value: typeof SelectPrimitive.Value;
726
+ Content: typeof SelectContent;
727
+ Group: typeof SelectPrimitive.Group;
728
+ Label: typeof SelectLabel;
729
+ Item: typeof SelectItem;
730
+ Separator: typeof SelectSeparator;
731
+ };
732
+
733
+ /**
734
+ * Checkbox — built on Radix Checkbox.
735
+ *
736
+ * Supports tri-state via `checked="indeterminate"`. Violet fill when on,
737
+ * border-only when off. Themed via tokens (--primary, --background).
738
+ */
739
+ declare const Checkbox: react.ForwardRefExoticComponent<Omit<CheckboxPrimitive.CheckboxProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
740
+
741
+ declare const RadioGroup: react.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>> & {
742
+ Item: react.ForwardRefExoticComponent<Omit<RadioGroupPrimitive.RadioGroupItemProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
743
+ };
744
+
745
+ /**
746
+ * Switch — built on Radix Switch. Used for binary toggles (autoaccept,
747
+ * dark mode preview, feature flags).
748
+ *
749
+ * Off-state uses --muted, on-state uses --primary with a subtle glow shadow
750
+ * to mark "this is active" in the violet brand language.
751
+ */
752
+ declare const Switch: react.ForwardRefExoticComponent<Omit<SwitchPrimitive.SwitchProps & react.RefAttributes<HTMLButtonElement>, "ref"> & react.RefAttributes<HTMLButtonElement>>;
753
+
754
+ interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
755
+ }
756
+ /**
757
+ * Textarea — multi-line input mirror of Input.
758
+ *
759
+ * Matches Input visuals (violet focus ring, --input border, --card bg).
760
+ * Default minimum height of 96px; consumer can override via className.
761
+ */
762
+ declare const Textarea: react.ForwardRefExoticComponent<TextareaProps & react.RefAttributes<HTMLTextAreaElement>>;
763
+
764
+ interface ContextWindowBarProps extends HTMLAttributes<HTMLDivElement> {
765
+ /** Tokens currently used in the context window. */
766
+ used: number;
767
+ /** Model's total context capacity (e.g. 200_000, 1_000_000). */
768
+ total: number;
769
+ /** Optional secondary label rendered on the right (e.g. model name). */
770
+ trailing?: ReactNode;
771
+ /** Optional title shown above the bar. */
772
+ label?: ReactNode;
773
+ /** Compact mode hides numbers and label; just the bar. */
774
+ compact?: boolean;
775
+ /**
776
+ * Override warning thresholds (0..1). Defaults: warn 0.7, danger 0.9.
777
+ */
778
+ warnAt?: number;
779
+ dangerAt?: number;
780
+ }
781
+ /**
782
+ * ContextWindowBar — shows how much of the model's context window has been
783
+ * consumed. Color transitions: success → warning → destructive past thresholds.
784
+ *
785
+ * Critical for transparency: a user should always be able to glance at this
786
+ * and know if the conversation is about to hit the cap.
787
+ */
788
+ declare const ContextWindowBar: react.ForwardRefExoticComponent<ContextWindowBarProps & react.RefAttributes<HTMLDivElement>>;
789
+
790
+ type CapabilityState = "enabled" | "disabled" | "blocked" | "active";
791
+ interface Capability {
792
+ id: string;
793
+ /** Visible label. */
794
+ label: ReactNode;
795
+ /** Optional icon override. */
796
+ icon?: IconComponent;
797
+ /** Default state. */
798
+ state?: CapabilityState;
799
+ /** Tooltip / longer description. */
800
+ hint?: ReactNode;
801
+ }
802
+ interface CapabilityIndicatorProps extends HTMLAttributes<HTMLDivElement> {
803
+ capabilities: Capability[];
804
+ }
805
+ declare const CapabilityIndicator: react.ForwardRefExoticComponent<CapabilityIndicatorProps & react.RefAttributes<HTMLUListElement>>;
806
+ /** Common capability presets — re-use these so apps don't reinvent labels. */
807
+ declare const capabilityPresets: {
808
+ read: {
809
+ readonly id: "read";
810
+ readonly label: "Read files";
811
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
812
+ };
813
+ write: {
814
+ readonly id: "write";
815
+ readonly label: "Write files";
816
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
817
+ };
818
+ delete: {
819
+ readonly id: "delete";
820
+ readonly label: "Delete files";
821
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
822
+ };
823
+ bash: {
824
+ readonly id: "bash";
825
+ readonly label: "Run shell";
826
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
827
+ };
828
+ network: {
829
+ readonly id: "network";
830
+ readonly label: "Network";
831
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
832
+ };
833
+ deploy: {
834
+ readonly id: "deploy";
835
+ readonly label: "Deploy";
836
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
837
+ };
838
+ llm: {
839
+ readonly id: "llm";
840
+ readonly label: "Sub-agents";
841
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
842
+ };
843
+ };
844
+
845
+ type ToolEnablement = "enabled" | "ask" | "denied";
846
+ interface ToolEntry {
847
+ id: string;
848
+ name: string;
849
+ description?: ReactNode;
850
+ icon?: IconComponent;
851
+ enablement?: ToolEnablement;
852
+ /**
853
+ * Source of the tool: built-in, plugin/skill, or MCP server name.
854
+ */
855
+ source?: string;
856
+ /** Optional badge text (e.g. "destructive", "experimental"). */
857
+ badge?: ReactNode;
858
+ }
859
+ interface ToolsListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onChange"> {
860
+ tools: ToolEntry[];
861
+ /** Title above the list. */
862
+ title?: ReactNode;
863
+ /**
864
+ * Fires when the consumer toggles a tool's enablement state.
865
+ * Cycle: enabled → ask → denied → enabled.
866
+ */
867
+ onEnablementChange?: (id: string, next: ToolEnablement) => void;
868
+ }
869
+ /**
870
+ * ToolsList — surface every tool the agent could call, with its enablement
871
+ * state. Click the chip to cycle: Allowed → Ask → Denied.
872
+ */
873
+ declare const ToolsList: react.ForwardRefExoticComponent<ToolsListProps & react.RefAttributes<HTMLDivElement>>;
874
+
875
+ type PermissionDecisionKind = "allow" | "ask" | "deny";
876
+ interface PermissionRule {
877
+ id: string;
878
+ /** Tool the rule applies to. Use "*" for any. */
879
+ tool: string;
880
+ /** Glob path it applies to. Use "*" for any. */
881
+ path: string;
882
+ decision: PermissionDecisionKind;
883
+ /** Optional rationale shown as helper text. */
884
+ note?: string;
885
+ }
886
+ interface PermissionMatrixProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
887
+ rules: PermissionRule[];
888
+ title?: ReactNode;
889
+ /**
890
+ * Available tools shown in the add form. Pass `undefined` (or omit) — or an
891
+ * empty array — to hide the add form entirely. The form only renders when
892
+ * `onAdd` is provided AND `toolOptions` has at least one entry.
893
+ */
894
+ toolOptions?: string[];
895
+ onAdd?: (rule: Omit<PermissionRule, "id">) => void;
896
+ onRemove?: (id: string) => void;
897
+ onDecisionChange?: (id: string, decision: PermissionDecisionKind) => void;
898
+ }
899
+ /**
900
+ * PermissionMatrix — tool × path × decision grid for fine-grained access
901
+ * control. Used as the "permissions" tab in the agent settings.
902
+ *
903
+ * One PermissionRule per row. Click the decision pill to cycle Allow → Ask → Deny.
904
+ *
905
+ * Design decision (2026-05-14): PermissionMatrix stays in `primitives/`
906
+ * — not `composites/` — even though it renders inputs and a select. The native
907
+ * `<input>` / `<select>` elements use Theo design tokens directly (border-input,
908
+ * ring, font-mono) so visual parity with `Input` / `Select` primitives is
909
+ * preserved. Reason for keeping it primitive: a consumer installing
910
+ * `permission-matrix` from the registry gets a single self-contained file with
911
+ * no transitive Theo dependencies — opposite trade-off from `EnvVarEditor`
912
+ * which is intentionally a composite. Both shapes are valid; we ship one of
913
+ * each so consumers can pick the dependency profile that fits their app.
914
+ */
915
+ declare const PermissionMatrix: react.ForwardRefExoticComponent<PermissionMatrixProps & react.RefAttributes<HTMLDivElement>>;
916
+
917
+ /**
918
+ * Mode — top-level density / domain the agent session is operating in.
919
+ *
920
+ * `chat` — conversational Q&A, lean UI.
921
+ * `code` — code agent: read/plan/edit/verify inside the repo.
922
+ * `infra` — operate the deployed system: metrics, deploys, logs, rollback.
923
+ *
924
+ * Used everywhere resources can be scoped per-mode (Skills, Agents, Rules,
925
+ * SystemPrompt overrides, Sessions, …). `modes?: Mode[]` on a resource means
926
+ * "only available in these modes"; omitting `modes` means "available
927
+ * globally".
928
+ */
929
+ type Mode = "chat" | "code" | "infra";
930
+ declare const ALL_MODES: ReadonlyArray<Mode>;
931
+ /** Friendly label per mode — render in chips, headers, badges. */
932
+ declare const MODE_LABEL: Record<Mode, string>;
933
+
934
+ type SkillSource = "builtin" | "project" | "user" | "plugin";
935
+ type SkillState = "enabled" | "disabled";
936
+ interface Skill {
937
+ id: string;
938
+ name: string;
939
+ description?: ReactNode;
940
+ /** Where the skill comes from. */
941
+ source: SkillSource;
942
+ /** Optional tools the skill is allowed to use (informational). */
943
+ allowedTools?: string[];
944
+ /** Optional trigger keywords / patterns for discovery. */
945
+ triggers?: string[];
946
+ state?: SkillState;
947
+ /** Modes this skill is visible in. Omit / empty = global (all modes). */
948
+ modes?: Mode[];
949
+ }
950
+ interface SkillCardProps extends Omit<HTMLAttributes<HTMLDivElement>, "onToggle"> {
951
+ skill: Skill;
952
+ onToggle?: (id: string, next: SkillState) => void;
953
+ }
954
+ /**
955
+ * SkillCard — single skill entry showing what it does, where it came from,
956
+ * and which tools it needs. Toggle to enable/disable for the current session.
957
+ */
958
+ declare const SkillCard: react.ForwardRefExoticComponent<SkillCardProps & react.RefAttributes<HTMLDivElement>>;
959
+
960
+ /**
961
+ * Rule — a user-authored behavior instruction injected into the system prompt.
962
+ *
963
+ * Equivalent to a single markdown file under `.claude/rules/` in Claude Code:
964
+ * short imperative text the user writes once and the agent follows always.
965
+ * Rules can be scoped (`global` = applies to every session; `project` = only
966
+ * inside the current workspace) and toggled on/off without deletion.
967
+ */
968
+ type RuleScope = "global" | "project";
969
+ type RuleState = "enabled" | "disabled";
970
+ interface Rule {
971
+ id: string;
972
+ /** Short title shown in the list. */
973
+ title: string;
974
+ /** Markdown body — the actual instruction injected into the prompt. */
975
+ body: string;
976
+ /** Where this rule applies. */
977
+ scope: RuleScope;
978
+ /** Whether the rule is currently active. */
979
+ state: RuleState;
980
+ /** Optional tags for grouping ("testing", "style", "security"). */
981
+ tags?: string[];
982
+ /** Modes this rule applies to. Omit / empty = global (every mode). */
983
+ modes?: Mode[];
984
+ /** ISO timestamp / friendly label of last edit. */
985
+ updatedAt?: string;
986
+ }
987
+
988
+ interface RuleCardProps extends Omit<HTMLAttributes<HTMLElement>, "title" | "onSelect" | "onToggle"> {
989
+ rule: Rule;
990
+ /** Click on the card body — typically opens detail/edit view. */
991
+ onSelect?: (id: string) => void;
992
+ /** Click on the edit pencil. Defaults to onSelect if omitted. */
993
+ onEdit?: (id: string) => void;
994
+ /** Click on the trash icon. Renders the icon only when provided. */
995
+ onDelete?: (id: string) => void;
996
+ /** Toggle enabled/disabled. Renders the switch-like dot only when provided. */
997
+ onToggle?: (id: string, next: RuleState) => void;
998
+ }
999
+ declare const RuleCard: react.ForwardRefExoticComponent<RuleCardProps & react.RefAttributes<HTMLElement>>;
1000
+
1001
+ interface CostMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1002
+ /** Current cost in USD. */
1003
+ cost: number;
1004
+ /** Optional monthly budget; renders progress bar when present. */
1005
+ budget?: number;
1006
+ /** Optional title (e.g. "This session", "Monthly"). */
1007
+ title?: ReactNode;
1008
+ /** Optional delta vs previous period. */
1009
+ delta?: {
1010
+ value: number;
1011
+ period: string;
1012
+ };
1013
+ /** Compact mode — single-line summary. */
1014
+ compact?: boolean;
1015
+ }
1016
+ /**
1017
+ * CostMeter — gauge for token spend. Two visuals:
1018
+ * - card: title + big number + optional progress bar + optional delta.
1019
+ * - compact: chip "Coins $4.20" for nav bars.
1020
+ */
1021
+ declare const CostMeter: react.ForwardRefExoticComponent<CostMeterProps & react.RefAttributes<HTMLDivElement>>;
1022
+
1023
+ type PlanNodeStatus = "pending" | "running" | "done" | "skipped" | "failed";
1024
+ interface PlanNode {
1025
+ id: string;
1026
+ label: string;
1027
+ status: PlanNodeStatus;
1028
+ /** Optional details / sub-explanation. */
1029
+ detail?: string;
1030
+ /** Sub-nodes (rendered indented). */
1031
+ children?: PlanNode[];
1032
+ }
1033
+ interface TaskNodeProps extends HTMLAttributes<HTMLLIElement> {
1034
+ node: PlanNode;
1035
+ depth?: number;
1036
+ }
1037
+ /**
1038
+ * TaskNode — single row in a task plan. Renders its own children recursively
1039
+ * with increasing indentation.
1040
+ */
1041
+ declare const TaskNode: react.ForwardRefExoticComponent<TaskNodeProps & react.RefAttributes<HTMLLIElement>>;
1042
+ interface TaskPlanProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
1043
+ nodes: PlanNode[];
1044
+ /** Header title. */
1045
+ title?: ReactNode;
1046
+ /** Summary line shown next to the title (e.g. "3 of 7 done"). */
1047
+ summary?: ReactNode;
1048
+ }
1049
+ /**
1050
+ * TaskPlan — hierarchical task plan, à la Claude "plan mode".
1051
+ *
1052
+ * The agent emits a structured plan; the user sees each step progress from
1053
+ * pending → running → done (or failed/skipped). Children render with one
1054
+ * extra indent level and a left border to suggest hierarchy.
1055
+ */
1056
+ declare const TaskPlan: react.ForwardRefExoticComponent<TaskPlanProps & react.RefAttributes<HTMLElement>>;
1057
+
1058
+ interface SystemPromptEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1059
+ /** Vendor / default system prompt (read-only). */
1060
+ defaultPrompt: string;
1061
+ /** Current override; pass empty string for "use default". */
1062
+ override: string;
1063
+ onOverrideChange: (next: string) => void;
1064
+ /** Approximate token count for the active prompt. */
1065
+ tokenEstimate?: number;
1066
+ title?: ReactNode;
1067
+ }
1068
+ /**
1069
+ * SystemPromptEditor — surface the agent's system prompt with a clear
1070
+ * "vendor default" vs "user override" toggle.
1071
+ *
1072
+ * Behavior:
1073
+ * - When override is empty, the textarea shows the default (greyed out,
1074
+ * editable starts blank).
1075
+ * - When user types, override takes effect.
1076
+ * - "Reset to default" wipes the override.
1077
+ *
1078
+ * Critical for transparency: a user must be able to see and edit the prompt.
1079
+ */
1080
+ declare const SystemPromptEditor: react.ForwardRefExoticComponent<SystemPromptEditorProps & react.RefAttributes<HTMLDivElement>>;
1081
+
1082
+ type MemoryScope = "global" | "project" | "session";
1083
+ interface MemoryLayer {
1084
+ scope: MemoryScope;
1085
+ /** File path on disk for transparency. */
1086
+ path: string;
1087
+ /** Markdown content. */
1088
+ content: string;
1089
+ /** Last modified label, e.g. "2m ago". */
1090
+ modifiedAt?: string;
1091
+ }
1092
+ interface MemoryEditorProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1093
+ layers: MemoryLayer[];
1094
+ /** Currently active layer for editing. */
1095
+ activeScope: MemoryScope;
1096
+ onScopeChange: (scope: MemoryScope) => void;
1097
+ onContentChange: (scope: MemoryScope, next: string) => void;
1098
+ title?: ReactNode;
1099
+ }
1100
+ /**
1101
+ * MemoryEditor — three-layer Markdown memory editor (global / project /
1102
+ * session) mirroring Claude Code's CLAUDE.md hierarchy.
1103
+ *
1104
+ * Each scope keeps its own file. Switching scopes via tab updates which
1105
+ * layer is being edited. Path is shown explicitly so users know where the
1106
+ * content lives on disk.
1107
+ */
1108
+ declare const MemoryEditor: react.ForwardRefExoticComponent<MemoryEditorProps & react.RefAttributes<HTMLDivElement>>;
1109
+
1110
+ type HookEvent = "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "Stop" | "SessionStart" | "SessionEnd";
1111
+ interface HookEntry {
1112
+ id: string;
1113
+ event: HookEvent;
1114
+ /** Tool matcher (e.g. "Bash", "Write", "*"). */
1115
+ matcher: string;
1116
+ /** Shell command to run. */
1117
+ command: string;
1118
+ enabled?: boolean;
1119
+ }
1120
+ declare const HOOK_EVENTS: HookEvent[];
1121
+ interface HookConfigProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onToggle"> {
1122
+ hooks: HookEntry[];
1123
+ onAdd?: (hook: Omit<HookEntry, "id">) => void;
1124
+ onRemove?: (id: string) => void;
1125
+ onToggle?: (id: string, enabled: boolean) => void;
1126
+ title?: ReactNode;
1127
+ }
1128
+ /**
1129
+ * HookConfig — editor for lifecycle hooks (PreToolUse, PostToolUse, Stop…).
1130
+ *
1131
+ * Mirrors Claude Code's settings.json hooks but visual. Each row is an
1132
+ * { event × matcher × command } triple with on/off toggle.
1133
+ */
1134
+ declare const HookConfig: react.ForwardRefExoticComponent<HookConfigProps & react.RefAttributes<HTMLDivElement>>;
1135
+
1136
+ type HookEventResult = "ok" | "blocked" | "error";
1137
+ interface HookEventEntry {
1138
+ id: string;
1139
+ /** Hook event (e.g. PreToolUse). */
1140
+ event: string;
1141
+ /** Hook matcher (e.g. Bash). */
1142
+ matcher: string;
1143
+ /** What the hook command was. */
1144
+ command: string;
1145
+ result: HookEventResult;
1146
+ timestamp: string;
1147
+ /** Optional stderr/stdout snippet. */
1148
+ output?: string;
1149
+ /** Optional duration label, e.g. "120ms". */
1150
+ duration?: string;
1151
+ }
1152
+ interface HookEventLogProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1153
+ events: HookEventEntry[];
1154
+ title?: ReactNode;
1155
+ }
1156
+ /**
1157
+ * HookEventLog — chronological list of hook firings, with result tone, the
1158
+ * command that ran, and an optional output preview.
1159
+ */
1160
+ declare const HookEventLog: react.ForwardRefExoticComponent<HookEventLogProps & react.RefAttributes<HTMLDivElement>>;
1161
+
1162
+ type CronJobStatus = "idle" | "running" | "failed" | "disabled";
1163
+ interface CronJob {
1164
+ id: string;
1165
+ /** Human-readable job name. */
1166
+ name: string;
1167
+ /** Cron expression — e.g. every 4 hours. */
1168
+ schedule: string;
1169
+ /** What gets run (prompt or command). */
1170
+ prompt: string;
1171
+ status: CronJobStatus;
1172
+ /** ISO/string timestamp of last run. */
1173
+ lastRun?: string;
1174
+ /** ISO/string timestamp of next run. */
1175
+ nextRun?: string;
1176
+ /** Optional last-run result line. */
1177
+ lastResult?: ReactNode;
1178
+ }
1179
+ interface CronJobCardProps extends Omit<HTMLAttributes<HTMLElement>, "onToggle"> {
1180
+ job: CronJob;
1181
+ onRunNow?: (id: string) => void;
1182
+ onToggle?: (id: string, enabled: boolean) => void;
1183
+ onRemove?: (id: string) => void;
1184
+ }
1185
+ /**
1186
+ * CronJobCard — one scheduled agent job. Shows cron expression, prompt,
1187
+ * status, last/next run. Inline actions: run now, pause, delete.
1188
+ */
1189
+ declare const CronJobCard: react.ForwardRefExoticComponent<CronJobCardProps & react.RefAttributes<HTMLElement>>;
1190
+
1191
+ type MCPServerStatus = "connected" | "degraded" | "disconnected" | "starting";
1192
+ interface MCPServer {
1193
+ id: string;
1194
+ /** Friendly name, e.g. "postgres". */
1195
+ name: string;
1196
+ /** Transport endpoint (stdio command or URL). */
1197
+ endpoint: string;
1198
+ status: MCPServerStatus;
1199
+ /** Tools exposed by the server. */
1200
+ tools: string[];
1201
+ /** Optional resources exposed. */
1202
+ resources?: string[];
1203
+ /** Diagnostic message when degraded/disconnected. */
1204
+ message?: ReactNode;
1205
+ /** Auto-restart toggle hint. */
1206
+ autoRestart?: boolean;
1207
+ }
1208
+ interface MCPServerCardProps extends HTMLAttributes<HTMLElement> {
1209
+ server: MCPServer;
1210
+ onRestart?: (id: string) => void;
1211
+ onDisconnect?: (id: string) => void;
1212
+ }
1213
+ /**
1214
+ * MCPServerCard — one MCP server entry showing connection status, the tools
1215
+ * it exposes, and inline controls (restart, disconnect).
1216
+ *
1217
+ * Pairs with claw-code's "degraded startup reporting" — failed servers can
1218
+ * still appear here with a recovery message.
1219
+ */
1220
+ declare const MCPServerCard: react.ForwardRefExoticComponent<MCPServerCardProps & react.RefAttributes<HTMLElement>>;
1221
+
1222
+ interface ModelCapabilityFlag {
1223
+ id: string;
1224
+ label: string;
1225
+ icon?: IconComponent;
1226
+ enabled: boolean;
1227
+ }
1228
+ interface ModelInfo {
1229
+ id: string;
1230
+ /** Display name (e.g. "Opus 4.7"). */
1231
+ name: string;
1232
+ /** Vendor (Anthropic, OpenAI, …). */
1233
+ vendor: string;
1234
+ /** Optional tag (default, fast, smart, beta). */
1235
+ tag?: ReactNode;
1236
+ /** Total context window in tokens. */
1237
+ contextWindow: number;
1238
+ /** Max output tokens per turn. */
1239
+ maxOutput: number;
1240
+ /** USD per million input tokens. */
1241
+ pricePerMInput?: number;
1242
+ /** USD per million output tokens. */
1243
+ pricePerMOutput?: number;
1244
+ /** Knowledge cutoff date label (e.g. "Jan 2026"). */
1245
+ cutoff?: string;
1246
+ /** Capability flags shown as chips. */
1247
+ capabilities?: ModelCapabilityFlag[];
1248
+ /** Short description / positioning. */
1249
+ description?: ReactNode;
1250
+ }
1251
+ interface ModelCardProps extends Omit<HTMLAttributes<HTMLElement>, "onSelect"> {
1252
+ model: ModelInfo;
1253
+ /** Render as the currently-selected variant (violet ring). */
1254
+ selected?: boolean;
1255
+ /** Fires when user clicks to select. */
1256
+ onSelect?: (id: string) => void;
1257
+ }
1258
+ /**
1259
+ * ModelCard — full info on a model: vendor, context, output cap, pricing,
1260
+ * capabilities, knowledge cutoff. Used in the "switch model" surface.
1261
+ */
1262
+ declare const ModelCard: react.ForwardRefExoticComponent<ModelCardProps & react.RefAttributes<HTMLElement>>;
1263
+ /** Pre-canned capability flags. */
1264
+ declare const modelCapabilityPresets: {
1265
+ vision: {
1266
+ readonly id: "vision";
1267
+ readonly label: "Vision";
1268
+ readonly icon: IconComponent;
1269
+ };
1270
+ tools: {
1271
+ readonly id: "tools";
1272
+ readonly label: "Tool use";
1273
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1274
+ };
1275
+ reasoning: {
1276
+ readonly id: "reasoning";
1277
+ readonly label: "Reasoning";
1278
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1279
+ };
1280
+ fineTuning: {
1281
+ readonly id: "ft";
1282
+ readonly label: "Fine-tuning";
1283
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1284
+ };
1285
+ multimodal: {
1286
+ readonly id: "multimodal";
1287
+ readonly label: "Multimodal";
1288
+ readonly icon: react.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & react.RefAttributes<SVGSVGElement>>;
1289
+ };
1290
+ };
1291
+
1292
+ interface AgentProfileDescriptor {
1293
+ id: string;
1294
+ /** Display name, e.g. "Coder", "Planner", "Reviewer". */
1295
+ name: string;
1296
+ /** Avatar initials (2 chars max). Falls back to first 2 letters of name. */
1297
+ initials?: string;
1298
+ /** Optional short description for tooltips and the dropdown. */
1299
+ description?: ReactNode;
1300
+ /**
1301
+ * Identity tone — colors the avatar so users tell agents apart at a glance.
1302
+ */
1303
+ tone?: "primary" | "accent" | "success" | "warning" | "info" | "muted";
1304
+ /** Optional badge text (e.g. "experimental"). */
1305
+ badge?: ReactNode;
1306
+ }
1307
+ interface AgentProfileProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
1308
+ agents: AgentProfileDescriptor[];
1309
+ activeId: string;
1310
+ onChange?: (id: string) => void;
1311
+ }
1312
+ /**
1313
+ * AgentProfile — switcher between multiple agent profiles (coder, planner,
1314
+ * reviewer, etc.). Each profile gets its own tone so the user can spot at a
1315
+ * glance which "persona" is currently driving the session.
1316
+ */
1317
+ declare const AgentProfile: react.ForwardRefExoticComponent<AgentProfileProps & react.RefAttributes<HTMLButtonElement>>;
1318
+
1319
+ type SubAgentState = "spawning" | "running" | "completed" | "failed" | "cancelled";
1320
+ interface SubAgentRun {
1321
+ id: string;
1322
+ /** Profile name (matches AgentProfile.name). */
1323
+ agent: string;
1324
+ /** Short task description given to the sub-agent. */
1325
+ task: string;
1326
+ state: SubAgentState;
1327
+ /** Optional duration label. */
1328
+ duration?: string;
1329
+ /** Optional last status line (preview of the latest event). */
1330
+ lastEvent?: string;
1331
+ /** Optional result summary (one-liner). */
1332
+ result?: ReactNode;
1333
+ }
1334
+ interface SubAgentDispatchProps extends HTMLAttributes<HTMLElement> {
1335
+ run: SubAgentRun;
1336
+ /** When provided, renders a cancel button while the run is in flight. */
1337
+ onCancel?: (id: string) => void;
1338
+ }
1339
+ /**
1340
+ * SubAgentDispatch — visualization for a Task() / sub-agent invocation.
1341
+ *
1342
+ * Shows the agent name, the task summary, current state, an inline event
1343
+ * preview, and an optional result. Use inside the agent timeline to make
1344
+ * delegation visible.
1345
+ */
1346
+ declare const SubAgentDispatch: react.ForwardRefExoticComponent<SubAgentDispatchProps & react.RefAttributes<HTMLElement>>;
1347
+
1348
+ type SessionStatus = "active" | "completed" | "failed" | "aborted";
1349
+ interface SessionSummary {
1350
+ id: string;
1351
+ /** Friendly title (often the first user message). */
1352
+ title: string;
1353
+ /** ISO timestamp / friendly date label. */
1354
+ startedAt: string;
1355
+ duration?: string;
1356
+ status: SessionStatus;
1357
+ /** Agent/model that ran the session. */
1358
+ model?: string;
1359
+ /** Total tokens consumed (formatted, e.g. "35.7k"). */
1360
+ tokens?: string;
1361
+ /** Total cost (USD). */
1362
+ cost?: number;
1363
+ /** Number of messages in the session. */
1364
+ messageCount?: number;
1365
+ }
1366
+ interface SessionTimelineProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1367
+ sessions: SessionSummary[];
1368
+ /** Title above the list. */
1369
+ title?: ReactNode;
1370
+ /** Fires when a row is clicked. */
1371
+ onOpen?: (id: string) => void;
1372
+ }
1373
+ /**
1374
+ * SessionTimeline — historical view of past agent sessions with per-row
1375
+ * tokens / cost / duration / status. Click a row to open the full session.
1376
+ */
1377
+ declare const SessionTimeline: react.ForwardRefExoticComponent<SessionTimelineProps & react.RefAttributes<HTMLDivElement>>;
1378
+
1379
+ type AuditActorKind = "user" | "agent" | "system";
1380
+ type AuditSeverity = "info" | "warning" | "error";
1381
+ interface AuditEntry {
1382
+ id: string;
1383
+ /** Who triggered the action. */
1384
+ actor: {
1385
+ kind: AuditActorKind;
1386
+ name: string;
1387
+ };
1388
+ /** Verb / action label, e.g. "wrote file", "ran command". */
1389
+ action: string;
1390
+ /** Target of the action (file path, command, etc). */
1391
+ target?: ReactNode;
1392
+ /** ISO timestamp / friendly label. */
1393
+ timestamp: string;
1394
+ severity?: AuditSeverity;
1395
+ /** Optional detail block (multi-line). */
1396
+ detail?: ReactNode;
1397
+ }
1398
+ interface AuditLogEntryProps extends HTMLAttributes<HTMLElement> {
1399
+ entry: AuditEntry;
1400
+ }
1401
+ /**
1402
+ * AuditLogEntry — one row in the agent audit log. Tells the user exactly
1403
+ * who did what and when. Severity colors the timestamp and target.
1404
+ */
1405
+ declare const AuditLogEntry: react.ForwardRefExoticComponent<AuditLogEntryProps & react.RefAttributes<HTMLElement>>;
1406
+
1407
+ type LaneState = "started" | "blocked" | "failed" | "finished";
1408
+ interface LaneCard {
1409
+ id: string;
1410
+ /** Card title (e.g. task name). */
1411
+ title: ReactNode;
1412
+ /** Optional description / preview. */
1413
+ description?: ReactNode;
1414
+ /** Optional footer / metadata row. */
1415
+ footer?: ReactNode;
1416
+ }
1417
+ interface Lane {
1418
+ state: LaneState;
1419
+ cards: LaneCard[];
1420
+ }
1421
+ interface LaneBoardProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1422
+ lanes: Lane[];
1423
+ title?: ReactNode;
1424
+ }
1425
+ /**
1426
+ * LaneBoard — kanban-style task board with 4 lanes matching the claw-code
1427
+ * lane event schema (started/blocked/failed/finished). Each card is a
1428
+ * machine-readable task snapshot the agent emits.
1429
+ */
1430
+ declare const LaneBoard: react.ForwardRefExoticComponent<LaneBoardProps & react.RefAttributes<HTMLDivElement>>;
1431
+
1432
+ interface TokenUsagePoint {
1433
+ /** ISO date or friendly label for the x-axis tooltip. */
1434
+ label: string;
1435
+ /** Input tokens for this period (e.g. day). */
1436
+ input: number;
1437
+ /** Output tokens for this period. */
1438
+ output: number;
1439
+ }
1440
+ interface TokenUsageChartProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1441
+ points: TokenUsagePoint[];
1442
+ /** Title above the chart. */
1443
+ title?: ReactNode;
1444
+ /** Chart height in px. Default 160. */
1445
+ height?: number;
1446
+ /** Show legend below the chart. Default true. */
1447
+ showLegend?: boolean;
1448
+ /**
1449
+ * Maximum number of bars to render. When `points.length` exceeds this, the
1450
+ * series is binned (summed in equal-width windows) so the chart stays
1451
+ * legible and SVG node count stays bounded. Default 60.
1452
+ */
1453
+ maxBars?: number;
1454
+ }
1455
+ /**
1456
+ * TokenUsageChart — stacked-bar chart of input vs output tokens over time.
1457
+ *
1458
+ * Pure SVG, no chart lib. Width is fluid; bars adjust to viewBox. Hover any
1459
+ * bar to see the breakdown in the tooltip slot below.
1460
+ */
1461
+ declare const TokenUsageChart: react.ForwardRefExoticComponent<TokenUsageChartProps & react.RefAttributes<HTMLDivElement>>;
1462
+
1463
+ interface AutoCompactNoticeProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
1464
+ /** Optional custom title. */
1465
+ title?: ReactNode;
1466
+ /**
1467
+ * How many turns until the next auto-compaction. Used to render an inline
1468
+ * countdown chip.
1469
+ */
1470
+ turnsRemaining?: number;
1471
+ /** Approx tokens that will be removed/summarized. */
1472
+ tokensToCompact?: number;
1473
+ onCompactNow?: () => void;
1474
+ onDismiss?: () => void;
1475
+ }
1476
+ /**
1477
+ * AutoCompactNotice — inline banner warning the user that the agent is
1478
+ * about to summarize / compact older context. Lets them act early (compact
1479
+ * now) or dismiss.
1480
+ *
1481
+ * Critical for transparency: a user must not be surprised by silent context
1482
+ * loss. This component announces it before it happens.
1483
+ */
1484
+ declare const AutoCompactNotice: react.ForwardRefExoticComponent<AutoCompactNoticeProps & react.RefAttributes<HTMLElement>>;
1485
+
1486
+ interface HandoffParty {
1487
+ /** Display name, e.g. "planner". */
1488
+ name: string;
1489
+ /** Optional avatar initials (max 2 chars). */
1490
+ initials?: string;
1491
+ /** Identity tone matching AgentProfile. */
1492
+ tone?: "primary" | "accent" | "success" | "warning" | "info" | "muted";
1493
+ }
1494
+ interface AgentHandoffProps extends HTMLAttributes<HTMLElement> {
1495
+ from: HandoffParty;
1496
+ to: HandoffParty;
1497
+ /** What is being handed off — short reason / payload preview. */
1498
+ reason: ReactNode;
1499
+ /** Optional metadata footer (e.g. timestamp, token budget). */
1500
+ footer?: ReactNode;
1501
+ }
1502
+ /**
1503
+ * AgentHandoff — visual marker of one agent delegating to another. Pairs
1504
+ * with AgentProfile for the identity tones; place it in the timeline so the
1505
+ * user sees the baton being passed.
1506
+ */
1507
+ declare const AgentHandoff: react.ForwardRefExoticComponent<AgentHandoffProps & react.RefAttributes<HTMLElement>>;
1508
+
1509
+ /**
1510
+ * AgentStreaming — inline "agent is thinking / typing" indicator.
1511
+ *
1512
+ * Renders inside an agent stream while the model is producing a response.
1513
+ * Default visual is 3 violet dots pulsing. If `partial` is provided, renders
1514
+ * the streamed-so-far text with a caret. Optional `model` label on the right.
1515
+ */
1516
+ interface AgentStreamingProps extends HTMLAttributes<HTMLDivElement> {
1517
+ /** Streamed-so-far text. When present, replaces the dots animation. */
1518
+ partial?: ReactNode;
1519
+ /** Optional model name shown as a chip. */
1520
+ model?: ReactNode;
1521
+ }
1522
+ declare const AgentStreaming: react.ForwardRefExoticComponent<AgentStreamingProps & react.RefAttributes<HTMLDivElement>>;
1523
+
1524
+ /**
1525
+ * AgentErrorCard — inline error / blocked-state card for an agent stream.
1526
+ *
1527
+ * Renders when the agent run hits a wall it can't recover from on its own:
1528
+ * rate limit, context overflow, auth lost, tool failure, network error.
1529
+ * Severity is always destructive; the `kind` drives the icon and helps the
1530
+ * consumer wire recovery actions in the footer slot.
1531
+ */
1532
+ type AgentErrorKind = "rate-limit" | "context-overflow" | "auth" | "tool-failure" | "network" | "generic";
1533
+ interface AgentErrorCardProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
1534
+ kind?: AgentErrorKind;
1535
+ title: ReactNode;
1536
+ detail?: ReactNode;
1537
+ /** Recovery action slot (Retry, Reset, Re-auth, etc.). */
1538
+ actions?: ReactNode;
1539
+ timestamp?: ReactNode;
1540
+ }
1541
+ declare const AgentErrorCard: react.ForwardRefExoticComponent<AgentErrorCardProps & react.RefAttributes<HTMLElement>>;
1542
+
1543
+ /**
1544
+ * ToolCallCard — single agent tool invocation rendered inside the stream.
1545
+ *
1546
+ * Visual: row with tool icon + tool name + target/command (mono) + status +
1547
+ * optional chevron. Expandable: when `output` is provided the row becomes a
1548
+ * `<details>` whose body renders the stdout/stderr/result block.
1549
+ *
1550
+ * Distinct from `AgentEvent` in the existing AgentTimeline by being a
1551
+ * stand-alone card that lives inside an AgentStream alongside chat messages.
1552
+ */
1553
+ type ToolCallStatus = "running" | "success" | "failed" | "queued" | "skipped";
1554
+ interface ToolCallCardProps extends HTMLAttributes<HTMLElement> {
1555
+ /** Tool name (matches Theo Code / Claude Code tool registry: Bash, Edit, Read, …). */
1556
+ tool: ReactNode;
1557
+ /** Optional icon for the tool. */
1558
+ icon?: IconComponent;
1559
+ /** Target / command shown in monospace next to the tool name. */
1560
+ target?: ReactNode;
1561
+ status: ToolCallStatus;
1562
+ /** Optional stdout/stderr/result body. When present, the card becomes expandable. */
1563
+ output?: ReactNode;
1564
+ /** Default expanded state. Default: false (collapsed). */
1565
+ defaultExpanded?: boolean;
1566
+ /** Timestamp shown on the right. */
1567
+ timestamp?: ReactNode;
1568
+ }
1569
+ declare function ToolCallCard({ className, tool, icon: Icon, target, status, output, defaultExpanded, timestamp, ...props }: ToolCallCardProps): react_jsx_runtime.JSX.Element;
1570
+
1571
+ interface SectionProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1572
+ title?: ReactNode;
1573
+ }
1574
+ interface ItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type"> {
1575
+ icon?: ElementType;
1576
+ active?: boolean;
1577
+ count?: number | string;
1578
+ as?: "button" | "a";
1579
+ href?: string;
1580
+ }
1581
+ declare const Sidebar: react.ForwardRefExoticComponent<HTMLAttributes<HTMLElement> & react.RefAttributes<HTMLElement>> & {
1582
+ Header: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1583
+ Section: react.ForwardRefExoticComponent<SectionProps & react.RefAttributes<HTMLDivElement>>;
1584
+ Item: react.ForwardRefExoticComponent<ItemProps & react.RefAttributes<HTMLElement>>;
1585
+ Footer: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1586
+ };
1587
+
1588
+ interface BreadcrumbItem {
1589
+ label: ReactNode;
1590
+ href?: string;
1591
+ }
1592
+ interface BreadcrumbsProps extends HTMLAttributes<HTMLElement> {
1593
+ items: BreadcrumbItem[];
1594
+ }
1595
+ interface ModeSwitcherOption {
1596
+ value: string;
1597
+ label: ReactNode;
1598
+ }
1599
+ interface ModeSwitcherProps extends Omit<HTMLAttributes<HTMLDivElement>, "onChange"> {
1600
+ value: string;
1601
+ options: ModeSwitcherOption[];
1602
+ onChange?: (value: string) => void;
1603
+ /**
1604
+ * Accessible label for the radiogroup. Defaults to "Mode".
1605
+ */
1606
+ ariaLabel?: string;
1607
+ }
1608
+ declare const TopNav: react.ForwardRefExoticComponent<HTMLAttributes<HTMLElement> & react.RefAttributes<HTMLElement>> & {
1609
+ Left: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1610
+ Center: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1611
+ Right: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1612
+ Breadcrumbs: react.ForwardRefExoticComponent<BreadcrumbsProps & react.RefAttributes<HTMLElement>>;
1613
+ ModeSwitcher: react.ForwardRefExoticComponent<ModeSwitcherProps & react.RefAttributes<HTMLDivElement>>;
1614
+ };
1615
+
1616
+ /**
1617
+ * Sheet — slide-in side panel built on Radix Dialog.
1618
+ *
1619
+ * Same Radix primitive as Dialog, but Content slides from an edge instead of
1620
+ * fading from center. Used for: workspace overlays (Memory, Observability,
1621
+ * Sub-agents), Settings, contextual filters.
1622
+ *
1623
+ * Composition:
1624
+ * <Sheet>
1625
+ * <Sheet.Trigger>Open</Sheet.Trigger>
1626
+ * <Sheet.Content side="right">
1627
+ * <Sheet.Header>
1628
+ * <Sheet.Title>Memory</Sheet.Title>
1629
+ * <Sheet.Description>Episodes and wiki pages</Sheet.Description>
1630
+ * </Sheet.Header>
1631
+ * <Sheet.Body>…</Sheet.Body>
1632
+ * <Sheet.Footer>…</Sheet.Footer>
1633
+ * </Sheet.Content>
1634
+ * </Sheet>
1635
+ */
1636
+ declare const Overlay: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & react.RefAttributes<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
1637
+ declare const sheetVariants: (props?: ({
1638
+ side?: "right" | "left" | "top" | "bottom" | null | undefined;
1639
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
1640
+ interface ContentProps extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, VariantProps<typeof sheetVariants> {
1641
+ hideCloseButton?: boolean;
1642
+ }
1643
+ declare const Content: react.ForwardRefExoticComponent<ContentProps & react.RefAttributes<HTMLDivElement>>;
1644
+ declare const Header: {
1645
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1646
+ displayName: string;
1647
+ };
1648
+ declare const Body: {
1649
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1650
+ displayName: string;
1651
+ };
1652
+ declare const Footer: {
1653
+ ({ className, ...props }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime.JSX.Element;
1654
+ displayName: string;
1655
+ };
1656
+ declare const Title: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & react.RefAttributes<HTMLHeadingElement>, "ref"> & react.RefAttributes<HTMLHeadingElement>>;
1657
+ declare const Description: react.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & react.RefAttributes<HTMLParagraphElement>, "ref"> & react.RefAttributes<HTMLParagraphElement>>;
1658
+ declare const Sheet: typeof DialogPrimitive.Root & {
1659
+ Trigger: typeof DialogPrimitive.Trigger;
1660
+ Close: typeof DialogPrimitive.Close;
1661
+ Content: typeof Content;
1662
+ Overlay: typeof Overlay;
1663
+ Header: typeof Header;
1664
+ Body: typeof Body;
1665
+ Footer: typeof Footer;
1666
+ Title: typeof Title;
1667
+ Description: typeof Description;
1668
+ };
1669
+
1670
+ /**
1671
+ * ProjectSwitcher — sidebar header for a code agent app.
1672
+ *
1673
+ * Shows the active workspace (folder name) + branch + status dot + a tiny
1674
+ * `ChevronsUpDown` hint when clickable. Used in Sidebar.Header to anchor the
1675
+ * current project context for the session list below.
1676
+ *
1677
+ * <Sidebar.Header className="p-0">
1678
+ * <ProjectSwitcher
1679
+ * workspace="acme-web"
1680
+ * branch="claude/alignment-grid"
1681
+ * status="running"
1682
+ * onClick={openProjectPicker}
1683
+ * />
1684
+ * </Sidebar.Header>
1685
+ *
1686
+ * If `onClick` is omitted, renders as a static `<div>` (no chevron, not focusable).
1687
+ */
1688
+ type ProjectStatus = "idle" | "running" | "error" | "offline";
1689
+ interface ProjectSwitcherProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children"> {
1690
+ /** Workspace / folder name (e.g. "acme-web"). */
1691
+ workspace: ReactNode;
1692
+ /** Optional git branch. Renders inline with a GitBranch icon. */
1693
+ branch?: ReactNode;
1694
+ /** Optional status dot. Defaults to "idle". */
1695
+ status?: ProjectStatus;
1696
+ /** Brand letter / icon shown in the violet tile. Default: first char of workspace if string. */
1697
+ brand?: ReactNode;
1698
+ }
1699
+ declare const ProjectSwitcher: react.ForwardRefExoticComponent<ProjectSwitcherProps & react.RefAttributes<HTMLButtonElement>>;
1700
+
1701
+ /**
1702
+ * SessionListItem — single row in the sidebar's Sessions list for a code agent
1703
+ * app. Richer than the generic `Sidebar.Item`: shows a status dot, the agent
1704
+ * mode last used (chat/code/infra), and a relative timestamp.
1705
+ *
1706
+ * <SessionListItem
1707
+ * title="Build the alignment grid demo"
1708
+ * status="running"
1709
+ * mode="code"
1710
+ * timestamp="2m ago"
1711
+ * active
1712
+ * onClick={() => navigate(`/session/${id}`)}
1713
+ * />
1714
+ *
1715
+ * The status dot maps to the agent run state and animates while running.
1716
+ */
1717
+ type SessionRunStatus = "running" | "queued" | "completed" | "failed" | "cancelled";
1718
+ type SessionMode = "chat" | "code" | "infra";
1719
+ interface SessionListItemProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children" | "title"> {
1720
+ /** Session title (truncated). */
1721
+ title: ReactNode;
1722
+ /** Agent run state. Drives the status dot. */
1723
+ status: SessionRunStatus;
1724
+ /** Last mode the user was viewing this session in. Optional pill. */
1725
+ mode?: SessionMode;
1726
+ /** Relative timestamp string ("2m ago", "yesterday"). */
1727
+ timestamp?: ReactNode;
1728
+ /** Optional unread count (pending agent events, new outputs). */
1729
+ unread?: number;
1730
+ /** Whether this is the currently selected session. */
1731
+ active?: boolean;
1732
+ }
1733
+ declare const SessionListItem: react.ForwardRefExoticComponent<SessionListItemProps & react.RefAttributes<HTMLButtonElement>>;
1734
+
1735
+ interface ChatMessageProps extends HTMLAttributes<HTMLElement> {
1736
+ message: Message;
1737
+ /**
1738
+ * Optional avatar slot rendered before assistant/user content.
1739
+ */
1740
+ avatar?: ReactNode;
1741
+ /**
1742
+ * Optional toolbar (copy, regenerate, etc.) rendered after the content.
1743
+ */
1744
+ actions?: ReactNode;
1745
+ }
1746
+ /**
1747
+ * ChatMessage — single chat turn.
1748
+ *
1749
+ * Visual:
1750
+ * - user → soft surface bubble aligned right, max-width 70%
1751
+ * - assistant → card with violet accent border-left + display-font title for model + body
1752
+ * - system → muted callout with accent-deep border
1753
+ */
1754
+ declare const ChatMessage: react.ForwardRefExoticComponent<ChatMessageProps & react.RefAttributes<HTMLElement>>;
1755
+
1756
+ /**
1757
+ * ChatThread — simple vertical container that applies spacing + scroll.
1758
+ *
1759
+ * No virtualization or stickiness. Wrap with your own scroller for long threads.
1760
+ *
1761
+ * T4.1 (MF-4): declares the outer live region and wraps children in
1762
+ * LiveRegionProvider so nested AgentStreaming / AgentErrorCard / Skeleton
1763
+ * don't add their own aria-live (double-announcement avoided).
1764
+ */
1765
+ declare const ChatThread: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & react.RefAttributes<HTMLDivElement>>;
1766
+
1767
+ interface ModelOption {
1768
+ id: string;
1769
+ label: string;
1770
+ /** Optional vendor hint shown small below the label. */
1771
+ vendor?: string;
1772
+ /** Optional tag e.g. "default", "fast", "smart". */
1773
+ tag?: string;
1774
+ }
1775
+ interface ModelSelectorProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
1776
+ value: string;
1777
+ options: ModelOption[];
1778
+ onChange?: (id: string) => void;
1779
+ }
1780
+ /**
1781
+ * ModelSelector — chip dropdown for picking the active LLM.
1782
+ *
1783
+ * Visual: pill with violet dot + label + chevron. Dropdown uses Radix Menu.
1784
+ */
1785
+ declare const ModelSelector: react.ForwardRefExoticComponent<ModelSelectorProps & react.RefAttributes<HTMLButtonElement>>;
1786
+
1787
+ interface IntentOption {
1788
+ id: string;
1789
+ label: string;
1790
+ /** Optional one-liner shown below the label in the menu. */
1791
+ description?: string;
1792
+ /** Optional icon — defaults to a pencil for the trigger if none. */
1793
+ icon?: IconComponent;
1794
+ }
1795
+ interface IntentSelectorProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "onChange"> {
1796
+ value: string;
1797
+ options: IntentOption[];
1798
+ onChange?: (id: string) => void;
1799
+ }
1800
+ /**
1801
+ * IntentSelector — chip dropdown for picking the agent's intent for the next
1802
+ * turn (e.g. edit / plan / review). Mirrors ModelSelector: pill trigger +
1803
+ * Radix DropdownMenu of options with description and a check on the active.
1804
+ */
1805
+ declare const IntentSelector: react.ForwardRefExoticComponent<IntentSelectorProps & react.RefAttributes<HTMLButtonElement>>;
1806
+
1807
+ interface MentionItem {
1808
+ id: string;
1809
+ /** Primary label shown on the row. */
1810
+ label: ReactNode;
1811
+ /** Secondary one-line description (optional). */
1812
+ description?: ReactNode;
1813
+ /** Optional per-row icon override. */
1814
+ icon?: IconComponent;
1815
+ }
1816
+ /** Trigger character — drives the default header + icon if not overridden. */
1817
+ type MentionTrigger = "/" | "@" | "#";
1818
+ interface MentionMenuProps {
1819
+ /** Whether the panel is open. The consumer (composer) controls this. */
1820
+ open: boolean;
1821
+ /** Trigger character that opened the menu — used for default title + icon. */
1822
+ trigger: MentionTrigger;
1823
+ /** Items to display (already filtered by the consumer). */
1824
+ items: MentionItem[];
1825
+ /** Fires when the user selects an item via click or Enter. */
1826
+ onSelect: (item: MentionItem) => void;
1827
+ /** Fires when the user dismisses (Esc, click outside). */
1828
+ onClose: () => void;
1829
+ /** Title above the list. Defaults to the trigger's domain ("Commands", "Files", "Memories"). */
1830
+ title?: ReactNode;
1831
+ /** Empty-state message when items is empty. */
1832
+ emptyLabel?: ReactNode;
1833
+ /** Override the alignment relative to its anchor. Default: above-left. */
1834
+ className?: string;
1835
+ }
1836
+ /**
1837
+ * MentionMenu — keyboard-navigable popover for slash-command / @file / #memory
1838
+ * triggers inside an agent composer.
1839
+ *
1840
+ * Generic by design: the consumer decides what items appear for each trigger
1841
+ * (commands list, file search, memory lookup, …). MentionMenu owns the visual
1842
+ * presentation, selection highlight, Esc/Enter/Arrow keys.
1843
+ *
1844
+ * Position: absolute, anchored to the closest positioned ancestor — usually
1845
+ * the composer wrapper. Default `bottom-full left-0` (above the composer).
1846
+ */
1847
+ declare function MentionMenu({ open, trigger, items, onSelect, onClose, title, emptyLabel, className, }: MentionMenuProps): react_jsx_runtime.JSX.Element | null;
1848
+
1849
+ interface FolderSelectorProps extends ButtonHTMLAttributes<HTMLButtonElement> {
1850
+ /** Currently selected absolute path. */
1851
+ path: string;
1852
+ /**
1853
+ * Render in compact mode (smaller height, no chevron padding).
1854
+ * Default is the full-width composer variant used in the Files panel.
1855
+ */
1856
+ compact?: boolean;
1857
+ }
1858
+ /**
1859
+ * FolderSelector — chip showing the active working directory.
1860
+ *
1861
+ * Visual: folder icon + monospaced path (truncated middle) + chevron.
1862
+ * Stateless: caller handles the actual folder-picker dialog.
1863
+ */
1864
+ declare const FolderSelector: react.ForwardRefExoticComponent<FolderSelectorProps & react.RefAttributes<HTMLButtonElement>>;
1865
+
1866
+ interface AttachmentChipProps extends HTMLAttributes<HTMLDivElement> {
1867
+ attachment: Attachment;
1868
+ onRemove?: (id: string) => void;
1869
+ }
1870
+ /**
1871
+ * AttachmentChip — file pill shown in chat composer or message attachments row.
1872
+ *
1873
+ * Visual: rounded chip with type-icon + name + size + optional remove button.
1874
+ * Truncates the name with `text-ellipsis`; full name available via title.
1875
+ */
1876
+ declare const AttachmentChip: react.ForwardRefExoticComponent<AttachmentChipProps & react.RefAttributes<HTMLDivElement>>;
1877
+
1878
+ interface QuickAction {
1879
+ id: string;
1880
+ label: ReactNode;
1881
+ /** Icon component (e.g. from lucide-react). */
1882
+ icon?: IconComponent;
1883
+ /** When true, the chip is highlighted as the suggested next action. */
1884
+ primary?: boolean;
1885
+ }
1886
+ interface QuickActionChipsProps extends Omit<HTMLAttributes<HTMLDivElement>, "onSelect"> {
1887
+ actions: QuickAction[];
1888
+ onSelect?: (id: string) => void;
1889
+ }
1890
+ /**
1891
+ * QuickActionChips — row of intent chips below a hero composer.
1892
+ *
1893
+ * Used in Chat Home ("Escrever / Aprender / Código / Assuntos pessoais")
1894
+ * and the Files panel.
1895
+ */
1896
+ declare const QuickActionChips: react.ForwardRefExoticComponent<QuickActionChipsProps & react.RefAttributes<HTMLDivElement>>;
1897
+
1898
+ interface AgentEventProps extends HTMLAttributes<HTMLDivElement> {
1899
+ event: AgentEvent$1;
1900
+ /**
1901
+ * If true, clicking the row toggles `event.detail` visibility.
1902
+ */
1903
+ collapsible?: boolean;
1904
+ /**
1905
+ * Force the collapsible state (for controlled scenarios).
1906
+ */
1907
+ defaultOpen?: boolean;
1908
+ }
1909
+ /**
1910
+ * AgentEvent — single event row in the agent timeline.
1911
+ *
1912
+ * Composition: type icon + label + path + diff stats + status icon + (optional) chevron.
1913
+ * Running events show a spinner via motion-safe:animate-spin (respects
1914
+ * `prefers-reduced-motion`); failed events flash red.
1915
+ *
1916
+ * When `collapsible` is true and `event.detail` is provided, the row renders as
1917
+ * a native `<button>` for correct keyboard and screen-reader semantics.
1918
+ */
1919
+ declare const AgentEvent: react.ForwardRefExoticComponent<AgentEventProps & react.RefAttributes<HTMLDivElement>>;
1920
+
1921
+ interface AgentStartingStateProps extends OutputHTMLAttributes<HTMLOutputElement> {
1922
+ /** Title shown next to the spinner. Default "Starting up…". */
1923
+ label?: ReactNode;
1924
+ /** Optional secondary copy explaining the bootstrap step. */
1925
+ hint?: ReactNode;
1926
+ }
1927
+ /**
1928
+ * AgentStartingState — full-width skeleton shown while the agent boots.
1929
+ *
1930
+ * Visual: violet spinner + label, optional hint below. Wrapped in a soft card.
1931
+ * Uses semantic `<output aria-live="polite">` so screen readers announce the state.
1932
+ */
1933
+ declare const AgentStartingState: react.ForwardRefExoticComponent<AgentStartingStateProps & react.RefAttributes<HTMLOutputElement>>;
1934
+
1935
+ interface RunStatsProps extends HTMLAttributes<HTMLDivElement> {
1936
+ duration?: string;
1937
+ /** Formatted token count, e.g. "35.7k". */
1938
+ tokens?: string;
1939
+ /** Number of files changed in the run. */
1940
+ filesChanged?: number;
1941
+ }
1942
+ /**
1943
+ * RunStats — inline metric row shown after an agent run.
1944
+ *
1945
+ * Visual: muted bullet-separated row with clock + tokens + files-changed icons.
1946
+ * All optional — the component skips entries that aren't provided.
1947
+ */
1948
+ declare const RunStats: react.ForwardRefExoticComponent<RunStatsProps & react.RefAttributes<HTMLDivElement>>;
1949
+
1950
+ interface ToolCallProps extends HTMLAttributes<HTMLDivElement> {
1951
+ /** Tool name e.g. "bash", "read_file", "edit_file". */
1952
+ name?: string;
1953
+ /**
1954
+ * Summary label e.g. "Ran 2 commands", "Read 18 files".
1955
+ */
1956
+ summary: ReactNode;
1957
+ /**
1958
+ * Collapsible payload (e.g. command, stdout, file list).
1959
+ */
1960
+ detail?: ReactNode;
1961
+ defaultOpen?: boolean;
1962
+ /**
1963
+ * If true, hides the wrench icon (useful when grouping by name elsewhere).
1964
+ */
1965
+ hideIcon?: boolean;
1966
+ }
1967
+ /**
1968
+ * ToolCall — collapsible row representing an agent tool invocation.
1969
+ *
1970
+ * Visual: subtle muted container, wrench icon, summary in body text,
1971
+ * chevron rotates on expand. Pairs with `<ToolResult>` for the rendered output.
1972
+ *
1973
+ * Typical usage inside a ChatMessage assistant body:
1974
+ *
1975
+ * <ToolCall summary="Read 18 files" detail={<ToolResult>{output}</ToolResult>} />
1976
+ */
1977
+ declare const ToolCall: react.ForwardRefExoticComponent<ToolCallProps & react.RefAttributes<HTMLDivElement>>;
1978
+
1979
+ type Variant = "text" | "code" | "json";
1980
+ interface ToolResultProps extends HTMLAttributes<HTMLDivElement> {
1981
+ variant?: Variant;
1982
+ /**
1983
+ * Pre-formatted content. For `code`/`json`, the component uses mono font
1984
+ * and preserves whitespace. For `text`, normal body font.
1985
+ */
1986
+ children: ReactNode;
1987
+ }
1988
+ /**
1989
+ * ToolResult — formatted output of a tool invocation.
1990
+ *
1991
+ * Three quick variants: plain text, code (monospace), json (monospace, tinted).
1992
+ * Always rendered as a `<div>` for predictable prop typing; code/json variants
1993
+ * wrap children in `<pre>` internally.
1994
+ */
1995
+ declare const ToolResult: react.ForwardRefExoticComponent<ToolResultProps & react.RefAttributes<HTMLDivElement>>;
1996
+
1997
+ interface ProgressChecklistProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
1998
+ title?: ReactNode;
1999
+ steps: TaskStep[];
2000
+ /**
2001
+ * If true, shows percentage bar for running steps with `progress`.
2002
+ */
2003
+ showProgressBars?: boolean;
2004
+ }
2005
+ /**
2006
+ * ProgressChecklist — right-inspector checklist.
2007
+ *
2008
+ * Visual: vertical list of steps with status dot, label, optional progress bar.
2009
+ * Matches WIREMOCKS §3 / §4 ("Progresso") with checkmarks and pulse on running.
2010
+ */
2011
+ declare const ProgressChecklist: react.ForwardRefExoticComponent<ProgressChecklistProps & react.RefAttributes<HTMLDivElement>>;
2012
+
2013
+ interface FolderEntry {
2014
+ id: string;
2015
+ name: string;
2016
+ kind: "folder" | "file";
2017
+ /**
2018
+ * If true, the entry is expanded (icons + nested children).
2019
+ * Pure visual flag; toggling is the caller's job.
2020
+ */
2021
+ open?: boolean;
2022
+ /**
2023
+ * Optional nested entries when this is a folder.
2024
+ */
2025
+ children?: FolderEntry[];
2026
+ /** Optional adornment after the name (badge, modified indicator). */
2027
+ trailing?: ReactNode;
2028
+ /** Override the icon. */
2029
+ icon?: IconComponent;
2030
+ }
2031
+ interface FolderContextCardProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
2032
+ title?: ReactNode;
2033
+ /**
2034
+ * Root entries shown directly in the card.
2035
+ */
2036
+ entries: FolderEntry[];
2037
+ /**
2038
+ * Fires when an entry row is clicked.
2039
+ */
2040
+ onEntryClick?: (id: string) => void;
2041
+ }
2042
+ /**
2043
+ * FolderContextCard — file/folder tree fragment for the right inspector.
2044
+ *
2045
+ * Visual: 1-level tree with chevron indicating expanded state. Renders nested
2046
+ * children recursively, but does not manage open state — caller controls
2047
+ * `entry.open` and reacts to `onEntryClick`.
2048
+ */
2049
+ declare const FolderContextCard: react.ForwardRefExoticComponent<FolderContextCardProps & react.RefAttributes<HTMLElement>>;
2050
+
2051
+ interface ContextCardProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
2052
+ title?: ReactNode;
2053
+ description?: ReactNode;
2054
+ /** Optional illustration slot (rendered above title). */
2055
+ illustration?: ReactNode;
2056
+ /** Icon for the title row — used when illustration is omitted. */
2057
+ icon?: IconComponent;
2058
+ }
2059
+ /**
2060
+ * ContextCard — generic "informational" card for the right inspector.
2061
+ *
2062
+ * Used as the "Contexto" card on Files screens: illustration / icon, title,
2063
+ * short description. Inert by design — no actions.
2064
+ */
2065
+ declare const ContextCard: react.ForwardRefExoticComponent<ContextCardProps & react.RefAttributes<HTMLElement>>;
2066
+
2067
+ interface CreatedFile {
2068
+ id: string;
2069
+ name: string;
2070
+ /** Optional size for display, e.g. "42 KB". */
2071
+ size?: string;
2072
+ /** Icon override. */
2073
+ icon?: IconComponent;
2074
+ /** Optional destination metadata (e.g. "Google Drive · /Reports"). */
2075
+ destination?: ReactNode;
2076
+ /** Optional URL to open the file. */
2077
+ href?: string;
2078
+ }
2079
+ interface CreatedFilesCardProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
2080
+ title?: ReactNode;
2081
+ files: CreatedFile[];
2082
+ /**
2083
+ * Optional CTA shown at the bottom (e.g. "Move to Google Drive").
2084
+ */
2085
+ cta?: ReactNode;
2086
+ }
2087
+ /**
2088
+ * CreatedFilesCard — surfaces files produced by a completed task.
2089
+ *
2090
+ * From WIREMOCKS §2: each file is a card-like row with icon + name + destination.
2091
+ * Used as social proof of delivery in Task Completed views.
2092
+ */
2093
+ declare const CreatedFilesCard: react.ForwardRefExoticComponent<CreatedFilesCardProps & react.RefAttributes<HTMLElement>>;
2094
+
2095
+ interface ArtifactPreviewProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
2096
+ title: ReactNode;
2097
+ /** Optional source/destination label (e.g. "Google Drive", "Local · ~/reports"). */
2098
+ source?: ReactNode;
2099
+ /**
2100
+ * Tabs at the bottom of the artifact (e.g. "Expense Report | Currency Summary").
2101
+ * Caller controls the active state externally.
2102
+ */
2103
+ tabs?: ReactNode;
2104
+ /** Top toolbar actions. Defaults to refresh + maximize + close. */
2105
+ toolbar?: ReactNode;
2106
+ onMaximize?: () => void;
2107
+ onRefresh?: () => void;
2108
+ onClose?: () => void;
2109
+ }
2110
+ /**
2111
+ * ArtifactPreview — shell for previewing a generated artifact (XLSX, PDF, image…).
2112
+ *
2113
+ * Renders a toolbar + content slot + optional bottom tabs. The actual preview
2114
+ * (spreadsheet, PDF embed, image) is the caller's `children`, so this stays
2115
+ * dependency-free.
2116
+ */
2117
+ declare const ArtifactPreview: react.ForwardRefExoticComponent<ArtifactPreviewProps & react.RefAttributes<HTMLElement>>;
2118
+
2119
+ interface RailStep {
2120
+ id: string | number;
2121
+ label?: ReactNode;
2122
+ /**
2123
+ * Visual state: "complete", "current", "pending".
2124
+ */
2125
+ state?: "complete" | "current" | "pending";
2126
+ }
2127
+ interface StepsRailProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
2128
+ steps: RailStep[];
2129
+ /**
2130
+ * Optional label rendered at the top of the rail (e.g. "STEPS").
2131
+ */
2132
+ title?: ReactNode;
2133
+ }
2134
+ /**
2135
+ * StepsRail — vertical numbered rail with connecting line.
2136
+ *
2137
+ * Mirrors the file-organisation wiremock right rail: 5 numbered dots, current
2138
+ * highlighted, line connecting them.
2139
+ */
2140
+ declare const StepsRail: react.ForwardRefExoticComponent<StepsRailProps & react.RefAttributes<HTMLElement>>;
2141
+
2142
+ interface RecentFolder {
2143
+ id: string;
2144
+ name: ReactNode;
2145
+ path: string;
2146
+ /** When true, the row is highlighted as selected. */
2147
+ active?: boolean;
2148
+ }
2149
+ interface RecentFoldersListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onSelect"> {
2150
+ title?: ReactNode;
2151
+ folders: RecentFolder[];
2152
+ onSelect?: (id: string) => void;
2153
+ }
2154
+ /**
2155
+ * RecentFoldersList — recently-used folders for the Files picker.
2156
+ *
2157
+ * Visual: a stack of rows with folder icon + name + path (smaller, muted),
2158
+ * active row highlighted with violet bg.
2159
+ */
2160
+ declare const RecentFoldersList: react.ForwardRefExoticComponent<RecentFoldersListProps & react.RefAttributes<HTMLDivElement>>;
2161
+
2162
+ type DiffLineKind = "added" | "removed" | "unchanged" | "meta";
2163
+ interface DiffLine {
2164
+ kind: DiffLineKind;
2165
+ /** Original line number (left side); undefined for added lines. */
2166
+ oldNumber?: number;
2167
+ /** New line number (right side); undefined for removed lines. */
2168
+ newNumber?: number;
2169
+ content: string;
2170
+ }
2171
+ interface DiffHunk {
2172
+ id: string;
2173
+ /**
2174
+ * Optional header (e.g. "@@ -42,7 +42,12 @@"). Caller usually formats this.
2175
+ */
2176
+ header?: string;
2177
+ lines: DiffLine[];
2178
+ /**
2179
+ * If true, the hunk is rendered as a collapsed "N unmodified lines" placeholder.
2180
+ */
2181
+ collapsed?: boolean;
2182
+ }
2183
+ interface DiffViewerProps extends HTMLAttributes<HTMLDivElement> {
2184
+ /** Path of the file being diffed. */
2185
+ path: string;
2186
+ /** Diff stats summary. */
2187
+ stats?: {
2188
+ added: number;
2189
+ removed: number;
2190
+ };
2191
+ hunks: DiffHunk[];
2192
+ }
2193
+ /**
2194
+ * DiffViewer — unified diff rendering, no external dep.
2195
+ *
2196
+ * Visual: two gutter columns (old/new line numbers) + sign + monospaced content.
2197
+ * Added/removed rows tinted in success/destructive. Collapsed hunks render as
2198
+ * a single muted row "N unmodified lines".
2199
+ *
2200
+ * For syntax highlighting, the consumer can render `content` via their own
2201
+ * highlighter and pass `unchanged` lines with already-highlighted strings (not
2202
+ * common; usually plain text is enough for the brutalist console aesthetic).
2203
+ */
2204
+ declare const DiffViewer: react.ForwardRefExoticComponent<DiffViewerProps & react.RefAttributes<HTMLDivElement>>;
2205
+
2206
+ interface TerminalLine {
2207
+ id: string;
2208
+ /**
2209
+ * Visual kind: command (prompted), stdout, stderr, ok (success), prompt (active line).
2210
+ */
2211
+ kind?: "command" | "stdout" | "stderr" | "ok" | "prompt";
2212
+ content: ReactNode;
2213
+ }
2214
+ interface TerminalPanelProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
2215
+ title?: ReactNode;
2216
+ lines: TerminalLine[];
2217
+ /**
2218
+ * Optional prompt prefix for commands, defaults to "$".
2219
+ */
2220
+ promptPrefix?: string;
2221
+ /**
2222
+ * Live-region politeness for screen readers. Use `"polite"` when streaming
2223
+ * fresh output so assistive tech announces new lines without interrupting.
2224
+ * Default `"off"` for static / historical views.
2225
+ */
2226
+ live?: "off" | "polite";
2227
+ }
2228
+ /**
2229
+ * TerminalPanel — minimal terminal output viewer.
2230
+ *
2231
+ * Visual: dark card with mono font, "$ " prefix on command lines, color-coded
2232
+ * stdout/stderr/success. No interactivity (read-only) — pair with your own
2233
+ * pty/xterm for live shells if needed.
2234
+ */
2235
+ declare const TerminalPanel: react.ForwardRefExoticComponent<TerminalPanelProps & react.RefAttributes<HTMLDivElement>>;
2236
+
2237
+ type TaskSource = "agent" | "bash" | "tool";
2238
+ type RunningTaskStatus = "running" | "completed" | "failed";
2239
+ interface RunningTaskItem {
2240
+ id: string;
2241
+ label: ReactNode;
2242
+ source: TaskSource;
2243
+ status: RunningTaskStatus;
2244
+ }
2245
+ interface RunningTasksPanelProps extends HTMLAttributes<HTMLElement> {
2246
+ tasks: RunningTaskItem[];
2247
+ }
2248
+ /**
2249
+ * RunningTasksPanel — split list of Running vs Completed tasks.
2250
+ *
2251
+ * Used in the Code workspace right rail to give operational visibility into
2252
+ * what the agent is executing (foreground/background) vs what already finished.
2253
+ */
2254
+ declare const RunningTasksPanel: react.ForwardRefExoticComponent<RunningTasksPanelProps & react.RefAttributes<HTMLElement>>;
2255
+
2256
+ interface BrowserControlsProps extends HTMLAttributes<HTMLDivElement> {
2257
+ url: string;
2258
+ onUrlChange?: (next: string) => void;
2259
+ onBack?: () => void;
2260
+ onForward?: () => void;
2261
+ onReload?: () => void;
2262
+ /**
2263
+ * Disable URL editing (some previews are read-only).
2264
+ */
2265
+ readOnlyUrl?: boolean;
2266
+ }
2267
+ /**
2268
+ * BrowserControls — back/forward/reload + URL bar.
2269
+ *
2270
+ * Used as the top of PreviewPanel in the Code workspace.
2271
+ */
2272
+ declare const BrowserControls: react.ForwardRefExoticComponent<BrowserControlsProps & react.RefAttributes<HTMLDivElement>>;
2273
+
2274
+ type LogLevel = "info" | "warn" | "error" | "success" | "debug";
2275
+ interface LogLine {
2276
+ id: string;
2277
+ timestamp: string;
2278
+ level: LogLevel;
2279
+ message: string;
2280
+ source?: string;
2281
+ }
2282
+ interface BuildLogStreamProps extends HTMLAttributes<HTMLDivElement> {
2283
+ lines: LogLine[];
2284
+ /**
2285
+ * If true, shows level filter chips above the stream.
2286
+ */
2287
+ filterable?: boolean;
2288
+ /**
2289
+ * Controlled filter — which levels are visible. Empty Set = show all.
2290
+ *
2291
+ * Pick one mode: either always pass `visibleLevels` + `onVisibleLevelsChange`
2292
+ * (controlled), or never (uncontrolled). Mixing the two between renders is
2293
+ * not supported and may produce surprising state.
2294
+ */
2295
+ visibleLevels?: Set<LogLevel>;
2296
+ onVisibleLevelsChange?: (levels: Set<LogLevel>) => void;
2297
+ /**
2298
+ * Height of the scrollable region.
2299
+ */
2300
+ height?: string | number;
2301
+ /**
2302
+ * Maximum number of lines rendered. When exceeded, only the tail is shown
2303
+ * and a banner indicates truncation. Defaults to 2000 — set higher with
2304
+ * caution; React reconciliation cost scales linearly.
2305
+ */
2306
+ maxLines?: number;
2307
+ /**
2308
+ * Screen-reader live-region politeness for newly appended lines. Defaults
2309
+ * to `"off"` because build-log streams can be high-volume; opt into
2310
+ * `"polite"` only when running the build in the foreground.
2311
+ */
2312
+ live?: "off" | "polite";
2313
+ }
2314
+ /**
2315
+ * BuildLogStream — terminal-like log viewer with timestamps + level coloring.
2316
+ *
2317
+ * Used in Code workspace and PaaS deployment views. Geist Mono throughout.
2318
+ * Lines fade in via animate-fade-in-up on mount; new lines (when prepended/appended)
2319
+ * are not animated to avoid feedback noise (consumer's responsibility to render
2320
+ * incrementally if needed).
2321
+ */
2322
+ declare const BuildLogStream: react.ForwardRefExoticComponent<BuildLogStreamProps & react.RefAttributes<HTMLDivElement>>;
2323
+
2324
+ interface Metric {
2325
+ /**
2326
+ * Short label, e.g. "Requests/s", "p95 latency", "Error rate".
2327
+ */
2328
+ label: string;
2329
+ /**
2330
+ * Pre-formatted value string, e.g. "1.2k", "182ms", "0.03%".
2331
+ * Consumer formats; the component does not parse.
2332
+ */
2333
+ value: string;
2334
+ /**
2335
+ * Optional unit suffix appended after value with .9 opacity.
2336
+ */
2337
+ unit?: string;
2338
+ /**
2339
+ * Optional change vs comparison period, e.g. "+12%", "-4ms", "+0.01pp".
2340
+ */
2341
+ delta?: string;
2342
+ /**
2343
+ * If true, delta is "good" (success color); if false, "bad" (destructive).
2344
+ * If omitted, delta is rendered in muted (neutral).
2345
+ *
2346
+ * Caller decides semantics — "more requests" is good but "more errors" is bad.
2347
+ */
2348
+ deltaGood?: boolean;
2349
+ /**
2350
+ * Optional sparkline data, 0..1 normalized. Consumer is responsible for normalization.
2351
+ */
2352
+ sparkline?: number[];
2353
+ /**
2354
+ * Optional onClick to drill into the metric.
2355
+ */
2356
+ onClick?: () => void;
2357
+ /**
2358
+ * Optional override for the clickable tile's accessible name. When the
2359
+ * tile is interactive (`onClick` set), defaults to `View <label> details`.
2360
+ * Has no effect when `onClick` is absent (tile is rendered as a non-link
2361
+ * `<div>` with no button semantics). T4.3.
2362
+ */
2363
+ actionLabel?: string;
2364
+ }
2365
+ interface MetricsPanelProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
2366
+ title?: ReactNode;
2367
+ description?: ReactNode;
2368
+ metrics: Metric[];
2369
+ /**
2370
+ * Grid columns. Defaults to auto-fit ~180px min.
2371
+ */
2372
+ columns?: number;
2373
+ }
2374
+ /**
2375
+ * MetricsPanel — grid of metric tiles for observability dashboards.
2376
+ *
2377
+ * Visual: each tile is a soft surface with a big value (font-display),
2378
+ * label uppercase muted, optional delta with arrow icon + tone color,
2379
+ * optional CSS-only sparkline drawn as flexed bars.
2380
+ *
2381
+ * No external chart lib — keeps the registry copy-pasteable.
2382
+ */
2383
+ declare const MetricsPanel: react.ForwardRefExoticComponent<MetricsPanelProps & react.RefAttributes<HTMLDivElement>>;
2384
+
2385
+ interface SocialProvider {
2386
+ id: string;
2387
+ label: ReactNode;
2388
+ /** Icon component (e.g. brand-specific SVG). */
2389
+ icon: IconComponent;
2390
+ }
2391
+ interface SocialAuthRowProps extends Omit<HTMLAttributes<HTMLDivElement>, "onSelect"> {
2392
+ providers: SocialProvider[];
2393
+ onSelect?: (id: string) => void;
2394
+ /**
2395
+ * Stack vertically instead of horizontally (single-column flow).
2396
+ */
2397
+ vertical?: boolean;
2398
+ }
2399
+ /**
2400
+ * SocialAuthRow — row of OAuth provider buttons.
2401
+ *
2402
+ * Stateless; caller wires the redirect on `onSelect`. Buttons share Theo button
2403
+ * styling but with provider icon prominently on the left.
2404
+ */
2405
+ declare const SocialAuthRow: react.ForwardRefExoticComponent<SocialAuthRowProps & react.RefAttributes<HTMLDivElement>>;
2406
+
2407
+ interface LoginSplitProps extends HTMLAttributes<HTMLDivElement> {
2408
+ /** Left pane content — form, brand, etc. */
2409
+ left: ReactNode;
2410
+ /** Right pane content — illustration, marketing, social proof. */
2411
+ right: ReactNode;
2412
+ /**
2413
+ * Optional footer rendered below both panes.
2414
+ */
2415
+ footer?: ReactNode;
2416
+ /**
2417
+ * Reverse the split (form on the right). Default = form left.
2418
+ */
2419
+ reverse?: boolean;
2420
+ }
2421
+ /**
2422
+ * LoginSplit — 50/50 split layout shell.
2423
+ *
2424
+ * Used for the auth flow. Two slots (`left`, `right`); the right pane has a
2425
+ * subtle violet wash so the illustration sits inside Theo identity. Mobile
2426
+ * collapses to single column.
2427
+ */
2428
+ declare const LoginSplit: react.ForwardRefExoticComponent<LoginSplitProps & react.RefAttributes<HTMLDivElement>>;
2429
+
2430
+ interface SkillsListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onToggle"> {
2431
+ skills: Skill[];
2432
+ title?: ReactNode;
2433
+ /** If true, shows a search input above the grid. */
2434
+ searchable?: boolean;
2435
+ onToggle?: (id: string, next: SkillState) => void;
2436
+ }
2437
+ /**
2438
+ * SkillsList — grid of SkillCards with optional search + source filter chips.
2439
+ * Pairs with claw-code's `claw skills` inventory but visual.
2440
+ */
2441
+ declare const SkillsList: react.ForwardRefExoticComponent<SkillsListProps & react.RefAttributes<HTMLDivElement>>;
2442
+
2443
+ /**
2444
+ * SkillEditor — form for creating or editing a Skill.
2445
+ */
2446
+ type SkillDraft = Omit<Skill, "id"> & {
2447
+ id?: string;
2448
+ instructions?: string;
2449
+ };
2450
+ interface SkillEditorProps extends Omit<HTMLAttributes<HTMLFormElement>, "onSubmit" | "onChange"> {
2451
+ initial?: Partial<Skill> & {
2452
+ instructions?: string;
2453
+ };
2454
+ onSave: (draft: SkillDraft) => void;
2455
+ onCancel?: () => void;
2456
+ onDelete?: () => void;
2457
+ }
2458
+ declare function SkillEditor({ className, initial, onSave, onCancel, onDelete, ...formProps }: SkillEditorProps): react_jsx_runtime.JSX.Element;
2459
+
2460
+ /**
2461
+ * RuleEditor — form for creating or editing a Rule (behavior instruction
2462
+ * injected into the system prompt).
2463
+ */
2464
+ type RuleDraft = Omit<Rule, "id" | "updatedAt"> & {
2465
+ id?: string;
2466
+ tags?: string[];
2467
+ };
2468
+ interface RuleEditorProps extends Omit<HTMLAttributes<HTMLFormElement>, "onSubmit" | "onChange"> {
2469
+ initial?: Partial<Rule>;
2470
+ onSave: (draft: RuleDraft) => void;
2471
+ onCancel?: () => void;
2472
+ onDelete?: () => void;
2473
+ }
2474
+ declare function RuleEditor({ className, initial, onSave, onCancel, onDelete, ...formProps }: RuleEditorProps): react_jsx_runtime.JSX.Element;
2475
+
2476
+ interface CronJobsListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onToggle"> {
2477
+ jobs: CronJob[];
2478
+ title?: ReactNode;
2479
+ onAdd?: () => void;
2480
+ onRunNow?: (id: string) => void;
2481
+ onToggle?: (id: string, enabled: boolean) => void;
2482
+ onRemove?: (id: string) => void;
2483
+ }
2484
+ /**
2485
+ * CronJobsList — grid of CronJobCards with a sticky "new job" action.
2486
+ */
2487
+ declare const CronJobsList: react.ForwardRefExoticComponent<CronJobsListProps & react.RefAttributes<HTMLDivElement>>;
2488
+
2489
+ interface MCPServerListProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
2490
+ servers: MCPServer[];
2491
+ title?: ReactNode;
2492
+ onAdd?: () => void;
2493
+ onRestart?: (id: string) => void;
2494
+ onDisconnect?: (id: string) => void;
2495
+ }
2496
+ /**
2497
+ * MCPServerList — grouped MCP server inventory with status filter chips.
2498
+ * Surfaces degraded/disconnected servers prominently so the user can act.
2499
+ */
2500
+ declare const MCPServerList: react.ForwardRefExoticComponent<MCPServerListProps & react.RefAttributes<HTMLDivElement>>;
2501
+
2502
+ /**
2503
+ * AgentEditor — form for creating or editing an Agent persona.
2504
+ */
2505
+ interface AgentDraft extends Omit<AgentProfileDescriptor, "id"> {
2506
+ id?: string;
2507
+ systemPrompt?: string;
2508
+ model?: string;
2509
+ allowedTools?: string[];
2510
+ skillIds?: string[];
2511
+ /** Modes this agent is visible in. Omit / empty = global (all modes). */
2512
+ modes?: Mode[];
2513
+ }
2514
+ interface AgentEditorProps extends Omit<HTMLAttributes<HTMLFormElement>, "onSubmit" | "onChange"> {
2515
+ initial?: Partial<AgentDraft>;
2516
+ models?: Array<{
2517
+ id: string;
2518
+ label: string;
2519
+ }>;
2520
+ skills?: Array<{
2521
+ id: string;
2522
+ label: string;
2523
+ }>;
2524
+ onSave: (draft: AgentDraft) => void;
2525
+ onCancel?: () => void;
2526
+ onDelete?: () => void;
2527
+ }
2528
+ declare function AgentEditor({ className, initial, models, skills, onSave, onCancel, onDelete, ...formProps }: AgentEditorProps): react_jsx_runtime.JSX.Element;
2529
+
2530
+ /**
2531
+ * ApprovalCard — inline pause-and-ask card for an agent stream.
2532
+ *
2533
+ * Used when the agent wants to perform an action that requires the user's
2534
+ * consent (run a destructive command, use a new tool, edit outside the
2535
+ * sandbox, etc.). Renders as a bordered card inside the conversation stream,
2536
+ * pauses the visual flow, and exposes Deny / Approve / Always-allow actions.
2537
+ */
2538
+ declare const cardVariants: (props?: ({
2539
+ severity?: "warning" | "destructive" | "info" | null | undefined;
2540
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
2541
+ type ApprovalSeverity = NonNullable<VariantProps<typeof cardVariants>["severity"]>;
2542
+ interface ApprovalCardProps extends Omit<HTMLAttributes<HTMLElement>, "title">, VariantProps<typeof cardVariants> {
2543
+ /** Short headline ("Run destructive command?"). */
2544
+ title: ReactNode;
2545
+ /** What is being requested (command, file path, tool name…). Renders monospace. */
2546
+ request: ReactNode;
2547
+ /** Optional explanation line under the request. */
2548
+ description?: ReactNode;
2549
+ /** Optional expandable details (e.g. full command, file diff). */
2550
+ details?: ReactNode;
2551
+ /** Pressing the primary "Approve" button. */
2552
+ onApprove?: () => void;
2553
+ /** Pressing "Deny". */
2554
+ onDeny?: () => void;
2555
+ /** Pressing "Always allow" — optional tertiary action. */
2556
+ onAlways?: () => void;
2557
+ /** Customise the icon shown in the corner. */
2558
+ icon?: IconComponent;
2559
+ }
2560
+ declare const ApprovalCard: react.ForwardRefExoticComponent<ApprovalCardProps & react.RefAttributes<HTMLElement>>;
2561
+
2562
+ type ComposerMode = "chat" | "code" | "infra";
2563
+ interface ChatComposerProps extends Omit<HTMLAttributes<HTMLFormElement>, "onSubmit"> {
2564
+ mode?: ComposerMode;
2565
+ value: string;
2566
+ onValueChange: (next: string) => void;
2567
+ onSubmit?: (value: string) => void;
2568
+ /**
2569
+ * If true, the composer is in "agent running" state — Send becomes a Stop button.
2570
+ */
2571
+ running?: boolean;
2572
+ onStop?: () => void;
2573
+ /**
2574
+ * Slot above the textarea — used for the folder selector in Infra mode.
2575
+ */
2576
+ contextSlot?: ReactNode;
2577
+ /**
2578
+ * Slot above the textarea for attachments / chips.
2579
+ */
2580
+ attachmentsSlot?: ReactNode;
2581
+ /**
2582
+ * Slot on the bottom-left of the action row (e.g. custom toggles).
2583
+ * Overrides the default attach button entirely when provided.
2584
+ */
2585
+ leadingActions?: ReactNode;
2586
+ /**
2587
+ * Slot on the bottom-right (e.g. model selector). Send/stop is appended after this.
2588
+ */
2589
+ trailingActions?: ReactNode;
2590
+ /**
2591
+ * Optional attach-file callback. If omitted (and `leadingActions` is also
2592
+ * omitted), no attach button is rendered. This avoids fake affordances per
2593
+ * Quality Gate §7.
2594
+ */
2595
+ onAttach?: () => void;
2596
+ /**
2597
+ * Optional voice-input callback. If omitted, no mic button is rendered.
2598
+ * Same rationale as `onAttach`.
2599
+ */
2600
+ onVoiceInput?: () => void;
2601
+ /**
2602
+ * Accessible label for the textarea. Falls back to a mode-aware default.
2603
+ */
2604
+ textareaLabel?: string;
2605
+ /**
2606
+ * Textarea placeholder. Defaults change by mode.
2607
+ */
2608
+ placeholder?: string;
2609
+ /**
2610
+ * Extra textarea props (rows, maxLength…).
2611
+ */
2612
+ textareaProps?: Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, "value" | "onChange">;
2613
+ }
2614
+ /**
2615
+ * ChatComposer — message input area, shared by Chat / Code / Infra modes.
2616
+ *
2617
+ * Visual:
2618
+ * - chat / infra → soft card with violet ring on focus, generous padding
2619
+ * - code → compact dense form with mono font, slash prefix hint
2620
+ *
2621
+ * Stateless: caller controls `value` + handles `onSubmit`. Submit fires on Enter
2622
+ * (without Shift). Shift+Enter inserts a newline.
2623
+ *
2624
+ * Optional affordances (mic, attach) are opt-in via `onVoiceInput` / `onAttach`
2625
+ * — Quality Gate §7 forbids rendering fake controls without behavior.
2626
+ */
2627
+ declare const ChatComposer: react.ForwardRefExoticComponent<ChatComposerProps & react.RefAttributes<HTMLFormElement>>;
2628
+
2629
+ /**
2630
+ * AgentComposer — ChatComposer + slash-command / @file / #memory triggers.
2631
+ *
2632
+ * Wraps ChatComposer and watches the value for three trigger characters:
2633
+ * `/` → slash commands (`/clear`, `/help`, …)
2634
+ * `@` → file references (`@src/components/Foo.tsx`)
2635
+ * `#` → memory entries (`#alignment-grid`)
2636
+ *
2637
+ * Detection is string-based — no textarea ref required. A trigger is active
2638
+ * iff the value ends with a token of the form `[\s|^]([/@#])[^\s]*` (i.e. a
2639
+ * trigger char preceded by start-of-string or whitespace, with no space
2640
+ * after).
2641
+ *
2642
+ * The consumer provides the candidate items per trigger. On selection the
2643
+ * trailing token is replaced with the chosen value plus a trailing space.
2644
+ */
2645
+ type ItemsProvider = (query: string) => MentionItem[];
2646
+ interface AgentComposerProps extends ComponentProps<typeof ChatComposer> {
2647
+ /** Items shown when `/` is the active trigger. */
2648
+ commands?: MentionItem[] | ItemsProvider;
2649
+ /** Items shown when `@` is the active trigger. */
2650
+ files?: MentionItem[] | ItemsProvider;
2651
+ /** Items shown when `#` is the active trigger. */
2652
+ memories?: MentionItem[] | ItemsProvider;
2653
+ /**
2654
+ * What text gets inserted when an item is picked. Defaults to
2655
+ * `${trigger}${item.label}` (assumes `label` is a string). Override to
2656
+ * insert a token different from the visible label (e.g. include path,
2657
+ * id, …).
2658
+ */
2659
+ resolveInsertText?: (item: MentionItem, trigger: MentionTrigger) => string;
2660
+ /** Optional slot for the empty-state copy per trigger. */
2661
+ emptyLabels?: Partial<Record<MentionTrigger, ReactNode>>;
2662
+ /** Outer wrapper className (the relative positioning anchor for the menu). */
2663
+ containerClassName?: string;
2664
+ }
2665
+ declare function AgentComposer({ value, onValueChange, commands, files, memories, resolveInsertText, emptyLabels, containerClassName, className, textareaProps, ...chatComposerProps }: AgentComposerProps): react_jsx_runtime.JSX.Element;
2666
+
2667
+ /**
2668
+ * AgentStream — the canonical conversation surface for a code agent.
2669
+ *
2670
+ * Interleaves chat messages (user + assistant), tool invocations, approval
2671
+ * gates, errors, and the live streaming indicator. Mirrors how Claude Code
2672
+ * presents work to the user: conversation-centric, tool calls embedded,
2673
+ * approvals pause the flow inline, errors surface where they happen.
2674
+ *
2675
+ * Items are rendered in array order. The consumer fully controls the data;
2676
+ * AgentStream is a pure presentational composite over its child primitives.
2677
+ */
2678
+ interface ToolCallStreamItem {
2679
+ kind: "tool-call";
2680
+ id: string;
2681
+ tool: ReactNode;
2682
+ icon?: IconComponent;
2683
+ target?: ReactNode;
2684
+ status: ToolCallStatus;
2685
+ output?: ReactNode;
2686
+ defaultExpanded?: boolean;
2687
+ timestamp?: ReactNode;
2688
+ }
2689
+ interface ApprovalStreamItem {
2690
+ kind: "approval";
2691
+ id: string;
2692
+ severity?: ApprovalSeverity;
2693
+ title: ReactNode;
2694
+ request: ReactNode;
2695
+ description?: ReactNode;
2696
+ details?: ReactNode;
2697
+ onApprove?: () => void;
2698
+ onDeny?: () => void;
2699
+ onAlways?: () => void;
2700
+ }
2701
+ interface ErrorStreamItem {
2702
+ kind: "error";
2703
+ id: string;
2704
+ errorKind?: AgentErrorKind;
2705
+ title: ReactNode;
2706
+ detail?: ReactNode;
2707
+ actions?: ReactNode;
2708
+ timestamp?: ReactNode;
2709
+ }
2710
+ interface StreamingStreamItem {
2711
+ kind: "streaming";
2712
+ id: string;
2713
+ model?: ReactNode;
2714
+ partial?: ReactNode;
2715
+ }
2716
+ interface MessageStreamItem {
2717
+ kind: "message";
2718
+ id: string;
2719
+ message: Message;
2720
+ }
2721
+ interface CustomStreamItem {
2722
+ kind: "custom";
2723
+ id: string;
2724
+ /** Arbitrary node — escape hatch for inline diff cards, etc. */
2725
+ node: ReactNode;
2726
+ }
2727
+ type AgentStreamItem = MessageStreamItem | ToolCallStreamItem | ApprovalStreamItem | ErrorStreamItem | StreamingStreamItem | CustomStreamItem;
2728
+ interface AgentStreamProps extends HTMLAttributes<HTMLDivElement> {
2729
+ items: AgentStreamItem[];
2730
+ }
2731
+ declare const AgentStream: react.ForwardRefExoticComponent<AgentStreamProps & react.RefAttributes<HTMLDivElement>>;
2732
+
2733
+ interface AgentTimelineProps extends HTMLAttributes<HTMLOListElement> {
2734
+ events: AgentEvent$1[];
2735
+ /**
2736
+ * If true, events with `detail` are collapsible.
2737
+ */
2738
+ collapsible?: boolean;
2739
+ /**
2740
+ * Renders a vertical line connecting events. Default true.
2741
+ */
2742
+ showLine?: boolean;
2743
+ }
2744
+ /**
2745
+ * AgentTimeline — vertical list of agent events.
2746
+ *
2747
+ * Visual: optional thin border-left running through the column, with each
2748
+ * AgentEvent slightly indented from the line. Events animate in via fade-in-up
2749
+ * when first mounted.
2750
+ */
2751
+ declare const AgentTimeline: react.ForwardRefExoticComponent<AgentTimelineProps & react.RefAttributes<HTMLOListElement>>;
2752
+
2753
+ interface TaskHeaderProps extends Omit<HTMLAttributes<HTMLElement>, "title"> {
2754
+ title: ReactNode;
2755
+ status?: TaskStatus;
2756
+ /**
2757
+ * If provided, a chevron is shown next to the title and clicking it fires this callback.
2758
+ * Used as the "expand task metadata" affordance in the Infra shell.
2759
+ */
2760
+ onToggle?: () => void;
2761
+ /** Right-side actions (e.g. cancel task, close panel). */
2762
+ actions?: ReactNode;
2763
+ }
2764
+ /**
2765
+ * TaskHeader — title bar for a task pane.
2766
+ *
2767
+ * Visual: display-md title with chevron + optional status badge with pulse + actions slot.
2768
+ */
2769
+ declare const TaskHeader: react.ForwardRefExoticComponent<TaskHeaderProps & react.RefAttributes<HTMLElement>>;
2770
+
2771
+ interface PermissionModalLabels {
2772
+ /** "Cancel" button. */
2773
+ cancel: ReactNode;
2774
+ /** "Always allow" tertiary button. */
2775
+ always: ReactNode;
2776
+ /** "Allow once" primary button. */
2777
+ allow: ReactNode;
2778
+ /** Inline label rendered before the operation list inside the body card. */
2779
+ requestedOps: ReactNode;
2780
+ }
2781
+ interface PermissionModalProps {
2782
+ open: boolean;
2783
+ onOpenChange: (open: boolean) => void;
2784
+ request: PermissionRequest;
2785
+ /**
2786
+ * Fires when the user picks a decision. The modal does NOT auto-close;
2787
+ * caller decides whether the decision should dismiss the modal.
2788
+ */
2789
+ onDecide: (decision: PermissionDecision) => void;
2790
+ /** Override the modal title. Defaults to "Allow Theo to {ops} files in {path}?". */
2791
+ title?: ReactNode;
2792
+ /** Override the modal description (body lead text). */
2793
+ description?: ReactNode;
2794
+ /** Override the verb used for each operation in the default copy. */
2795
+ operationLabels?: Partial<Record<PermissionOperation, string>>;
2796
+ /** Override button text + inline labels. Useful for i18n. */
2797
+ labels?: Partial<PermissionModalLabels>;
2798
+ }
2799
+ /**
2800
+ * PermissionModal — local-files access prompt built on Dialog.
2801
+ *
2802
+ * Three actions: Cancel (denied), Always allow, Allow once. Per WIREMOCKS §5,
2803
+ * the path is shown in the title (not hidden in body) and destructive
2804
+ * operations are listed inline.
2805
+ *
2806
+ * All visible text can be overridden via `title`, `description`,
2807
+ * `operationLabels`, and `labels`. Defaults are English; pass overrides for
2808
+ * other locales.
2809
+ */
2810
+ declare function PermissionModal({ open, onOpenChange, request, onDecide, title, description, operationLabels, labels, }: PermissionModalProps): react_jsx_runtime.JSX.Element;
2811
+
2812
+ interface PreviewPanelProps extends Omit<HTMLAttributes<HTMLElement>, "content"> {
2813
+ url: string;
2814
+ onUrlChange?: (next: string) => void;
2815
+ onBack?: () => void;
2816
+ onForward?: () => void;
2817
+ onReload?: () => void;
2818
+ /**
2819
+ * Region rendered as the preview body. Typically an <iframe>.
2820
+ */
2821
+ content: ReactNode;
2822
+ /**
2823
+ * Optional logs section rendered below the preview (e.g. dev server output).
2824
+ */
2825
+ logsSlot?: ReactNode;
2826
+ }
2827
+ /**
2828
+ * PreviewPanel — browser preview with controls + integrated logs slot.
2829
+ *
2830
+ * The Code workspace shows live dev-server URL + HMR logs side-by-side; this
2831
+ * panel keeps both in a single card so the user doesn't switch contexts.
2832
+ */
2833
+ declare const PreviewPanel: react.ForwardRefExoticComponent<PreviewPanelProps & react.RefAttributes<HTMLElement>>;
2834
+
2835
+ type DeploymentStatus = "queued" | "building" | "deploying" | "live" | "failed" | "cancelled";
2836
+ interface Deployment {
2837
+ id: string;
2838
+ status: DeploymentStatus;
2839
+ environment: string;
2840
+ branch: string;
2841
+ commitSha: string;
2842
+ commitMessage: string;
2843
+ author?: {
2844
+ name: string;
2845
+ avatarUrl?: string;
2846
+ };
2847
+ duration?: string;
2848
+ timeAgo: string;
2849
+ }
2850
+ interface DeploymentRowProps extends HTMLAttributes<HTMLDivElement> {
2851
+ deployment: Deployment;
2852
+ actions?: ReactNode;
2853
+ }
2854
+ /**
2855
+ * DeploymentRow — one row in a deployment list (table-ish layout).
2856
+ *
2857
+ * Inspired by Vercel/Railway deployment lists. Composes Badge + Badge.Dot for status,
2858
+ * mono font for SHA/branch, muted-foreground for metadata.
2859
+ */
2860
+ declare const DeploymentRow: react.ForwardRefExoticComponent<DeploymentRowProps & react.RefAttributes<HTMLDivElement>>;
2861
+
2862
+ interface Project {
2863
+ id: string;
2864
+ name: string;
2865
+ description?: string;
2866
+ framework?: string;
2867
+ branch: string;
2868
+ commitSha: string;
2869
+ commitMessage?: string;
2870
+ status: DeploymentStatus;
2871
+ url?: string;
2872
+ region?: string;
2873
+ lastDeployedAt: string;
2874
+ }
2875
+ interface ProjectCardProps extends HTMLAttributes<HTMLAnchorElement | HTMLDivElement> {
2876
+ project: Project;
2877
+ href?: string;
2878
+ actions?: ReactNode;
2879
+ /**
2880
+ * Show the project description and commit message. Default true.
2881
+ */
2882
+ detailed?: boolean;
2883
+ }
2884
+ /**
2885
+ * ProjectCard — surface for a project in a project listing.
2886
+ *
2887
+ * Light hover lift (no shadow inflation), violet ring on focus,
2888
+ * status badge with optional pulse, framework + region in muted footer.
2889
+ */
2890
+ declare const ProjectCard: react.ForwardRefExoticComponent<ProjectCardProps & react.RefAttributes<HTMLElement>>;
2891
+
2892
+ type EnvScope = "production" | "staging" | "preview" | "all" | string;
2893
+ interface EnvVar {
2894
+ id: string;
2895
+ key: string;
2896
+ /**
2897
+ * Secret value. If `masked` is true, value is hidden by default.
2898
+ */
2899
+ value: string;
2900
+ masked?: boolean;
2901
+ scope?: EnvScope;
2902
+ /**
2903
+ * Read-only marker (e.g. system-managed vars like THEO_DEPLOY_ID).
2904
+ */
2905
+ readonly?: boolean;
2906
+ }
2907
+ interface EnvVarEditorProps extends HTMLAttributes<HTMLDivElement> {
2908
+ vars: EnvVar[];
2909
+ onAdd?: (entry: Omit<EnvVar, "id">) => void;
2910
+ onRemove?: (id: string) => void;
2911
+ /**
2912
+ * Available scope options for the add form. Defaults to a sensible PaaS set.
2913
+ */
2914
+ scopeOptions?: EnvScope[];
2915
+ }
2916
+ /**
2917
+ * EnvVarEditor — table-like editor for environment variables.
2918
+ *
2919
+ * Mono font on keys/values, mask toggle on secret values, scope badge,
2920
+ * remove + copy actions. Add form sits above the list.
2921
+ *
2922
+ * Stateless: caller controls the list and reacts to onAdd / onRemove.
2923
+ */
2924
+ declare const EnvVarEditor: react.ForwardRefExoticComponent<EnvVarEditorProps & react.RefAttributes<HTMLDivElement>>;
2925
+
2926
+ interface PreviewService {
2927
+ /** Service name e.g. "api", "web", "worker". */
2928
+ name: string;
2929
+ /** Live URL or null if not exposed (worker). */
2930
+ url?: string;
2931
+ status: DeploymentStatus;
2932
+ }
2933
+ interface PreviewEnv {
2934
+ id: string;
2935
+ prNumber: number;
2936
+ prTitle: string;
2937
+ branch: string;
2938
+ author?: {
2939
+ name: string;
2940
+ avatarUrl?: string;
2941
+ };
2942
+ services: PreviewService[];
2943
+ createdAt: string;
2944
+ }
2945
+ interface PreviewEnvCardProps extends HTMLAttributes<HTMLDivElement> {
2946
+ env: PreviewEnv;
2947
+ actions?: ReactNode;
2948
+ }
2949
+ /**
2950
+ * PreviewEnvCard — preview environment card surfacing all services from one PR.
2951
+ *
2952
+ * Theo's killer feature: full-stack preview environments. The card shows:
2953
+ * - PR number + title at the top
2954
+ * - branch + author in the metadata row
2955
+ * - one badge per service with its own status + URL
2956
+ * - bottom action row (Open, Promote, Delete)
2957
+ */
2958
+ declare const PreviewEnvCard: react.ForwardRefExoticComponent<PreviewEnvCardProps & react.RefAttributes<HTMLDivElement>>;
2959
+
2960
+ type DomainStatus = "verified" | "pending" | "invalid";
2961
+ interface Domain {
2962
+ id: string;
2963
+ hostname: string;
2964
+ status: DomainStatus;
2965
+ primary?: boolean;
2966
+ /**
2967
+ * TLS state. If true, certificate is provisioned & valid.
2968
+ */
2969
+ tls?: boolean;
2970
+ /**
2971
+ * DNS record the user must add to verify ownership.
2972
+ */
2973
+ verificationRecord?: {
2974
+ type: "TXT" | "CNAME" | "A";
2975
+ name: string;
2976
+ value: string;
2977
+ };
2978
+ }
2979
+ interface DomainConfigProps extends HTMLAttributes<HTMLDivElement> {
2980
+ domains: Domain[];
2981
+ onAdd?: (hostname: string) => void;
2982
+ onRemove?: (id: string) => void;
2983
+ onSetPrimary?: (id: string) => void;
2984
+ }
2985
+ /**
2986
+ * DomainConfig — manage custom domains for a project.
2987
+ *
2988
+ * Shows: hostname, status, TLS, primary flag, and verification DNS record when pending.
2989
+ * Common in every PaaS dashboard (Vercel, Railway, Render).
2990
+ */
2991
+ declare const DomainConfig: react.ForwardRefExoticComponent<DomainConfigProps & react.RefAttributes<HTMLDivElement>>;
2992
+
2993
+ interface RollbackTarget {
2994
+ id: string;
2995
+ version: string;
2996
+ commitSha: string;
2997
+ commitMessage: string;
2998
+ deployedAt: string;
2999
+ isCurrent?: boolean;
3000
+ /**
3001
+ * Optional duration of the deploy (e.g. "24s") for context.
3002
+ */
3003
+ duration?: string;
3004
+ }
3005
+ interface RollbackUIProps extends HTMLAttributes<HTMLDivElement> {
3006
+ /**
3007
+ * Deployment history, newest first. The current deploy should have `isCurrent: true`.
3008
+ */
3009
+ history: RollbackTarget[];
3010
+ /**
3011
+ * Fires when user confirms rollback to a specific target.
3012
+ */
3013
+ onRollback?: (targetId: string) => void | Promise<void>;
3014
+ }
3015
+ /**
3016
+ * RollbackUI — instant rollback selector showing recent versions.
3017
+ *
3018
+ * The current deploy is marked, every other version offers a "Roll back" button.
3019
+ * On select, the row enters confirm state (Confirm / Cancel buttons inline) before
3020
+ * firing onRollback. This protects against accidental rollbacks while still being one click.
3021
+ */
3022
+ declare const RollbackUI: react.ForwardRefExoticComponent<RollbackUIProps & react.RefAttributes<HTMLDivElement>>;
3023
+
3024
+ interface CommandItem {
3025
+ id: string;
3026
+ label: ReactNode;
3027
+ /** Optional secondary line (path, hint, shortcut). */
3028
+ hint?: ReactNode;
3029
+ /** Optional group name. Items with the same group are visually grouped. */
3030
+ group?: string;
3031
+ /** Optional icon. */
3032
+ icon?: IconComponent;
3033
+ /** Optional searchable plain-text used by the cmdk ranker. Falls back to `label` when string. */
3034
+ searchable?: string;
3035
+ }
3036
+ interface CommandPaletteProps {
3037
+ open: boolean;
3038
+ onOpenChange: (open: boolean) => void;
3039
+ items: CommandItem[];
3040
+ onSelect: (id: string) => void;
3041
+ placeholder?: string;
3042
+ emptyMessage?: ReactNode;
3043
+ /**
3044
+ * Optional custom filter score (0 = no match, > 0 = match). Receives the
3045
+ * `value` (the item's searchable text) and the current `search` query.
3046
+ * Defaults to cmdk's built-in fuzzy ranker which prioritizes substring +
3047
+ * word-boundary + consecutive matches.
3048
+ */
3049
+ filter?: (value: string, search: string) => number;
3050
+ }
3051
+ /**
3052
+ * CommandPalette — Cmd+K-style global launcher with full keyboard navigation.
3053
+ *
3054
+ * Built on `cmdk` (the de-facto shadcn pattern) + Theo Dialog. Provides
3055
+ * out-of-the-box: ArrowUp/ArrowDown navigation, Enter selection, Escape close,
3056
+ * Home/End, active-item highlight via `data-selected`, and fuzzy ranking.
3057
+ *
3058
+ * Stateless: caller owns `open` / `onOpenChange` / `items`. Selecting an item
3059
+ * fires `onSelect(id)` and closes the dialog.
3060
+ */
3061
+ declare function CommandPalette({ open, onOpenChange, items, onSelect, placeholder, emptyMessage, filter, }: CommandPaletteProps): react_jsx_runtime.JSX.Element;
3062
+
3063
+ export { ALL_MODES, AgentComposer, type AgentDraft, AgentEditor, AgentErrorCard, type AgentErrorKind, AgentEvent, type AgentEvent$1 as AgentEventModel, type AgentEventStatus, type AgentEventType, AgentHandoff, AgentProfile, type AgentProfileDescriptor, AgentStartingState, AgentStream, type AgentStreamItem, AgentStreaming, AgentTimeline, ApprovalCard, type ApprovalSeverity, ArtifactPreview, type Attachment, AttachmentChip, type AuditActorKind, type AuditEntry, AuditLogEntry, type AuditSeverity, AutoCompactNotice, Avatar, BadgeWithDot as Badge, type BadgeProps, BrowserControls, BuildLogStream, Button, type ButtonProps, type Capability, CapabilityIndicator, type CapabilityState, Card, ChatComposer, ChatMessage, ChatThread, Checkbox, type ColorScale, type CommandItem, CommandPalette, type ComposerMode, ContextCard, ContextWindowBar, CostMeter, type CreatedFile, CreatedFilesCard, type CronJob, CronJobCard, type CronJobStatus, CronJobsList, type Deployment, DeploymentRow, type DeploymentStatus, Dialog, type DiffHunk, type DiffLine, type DiffLineKind, DiffViewer, type Domain, DomainConfig, type DomainStatus, EmptyState, type EnvScope, type EnvVar, EnvVarEditor, FolderContextCard, type FolderEntry, FolderSelector, FormField, HOOK_EVENTS, type HandoffParty, HookConfig, type HookEntry, type HookEvent, type HookEventEntry, HookEventLog, type HookEventResult, Input, type InputProps, type IntentOption, IntentSelector, Label, type Lane, LaneBoard, type LaneCard, type LaneState, type LogLevel, type LogLine, LoginSplit, type MCPServer, MCPServerCard, MCPServerList, type MCPServerStatus, MODE_LABEL, MemoryEditor, type MemoryLayer, type MemoryScope, type MentionItem, MentionMenu, type MentionTrigger, type Message, type MessageRole, type Metric, MetricsPanel, type Mode, type ModelCapabilityFlag, ModelCard, type ModelInfo, type ModelOption, ModelSelector, type PermissionDecision, type PermissionDecisionKind, PermissionMatrix, PermissionModal, type PermissionOperation, type PermissionRequest, type PermissionRule, type PlanNode, type PlanNodeStatus, type PreviewEnv, PreviewEnvCard, PreviewPanel, type PreviewService, ProgressChecklist, type Project, ProjectCard, type ProjectStatus, ProjectSwitcher, type QuickAction, QuickActionChips, RadioGroup, type RailStep, type RecentFolder, RecentFoldersList, type RollbackTarget, RollbackUI, type Rule, RuleCard, RuleEditor, type RuleScope, type RuleState, RunStats, type RunningTaskItem, type RunningTaskStatus, RunningTasksPanel, ScrollArea, Select, SessionListItem, type SessionMode, type SessionRunStatus, type SessionStatus, type SessionSummary, SessionTimeline, Sheet, Sidebar, Skeleton, type Skill, SkillCard, SkillEditor, type SkillSource, type SkillState, SkillsList, SocialAuthRow, type SocialProvider, StepsRail, SubAgentDispatch, type SubAgentRun, type SubAgentState, Switch, SystemPromptEditor, Tabs, TaskHeader, TaskNode, TaskPlan, type TaskSource, type TaskStatus, type TaskStep, type TaskStepStatus, type TerminalLine, TerminalPanel, Textarea, type TextareaProps, type Theme, type ThemeFonts, type ThemeMode, ThemeProvider, ThemeScript, ThemeSwitcher, TheoUIProvider, type TheoUIProviderProps, Toast, type ToastVariant, Toaster, TokenUsageChart, type TokenUsagePoint, ToolCall, ToolCallCard, type ToolCallStatus, type ToolEnablement, type ToolEntry, ToolResult, ToolsList, TooltipWithStatics as Tooltip, TopNav, auroraTerminal, avatarVariants, badgeVariants, builtinThemes, buttonVariants, capabilityPresets, classicPaper, cn, modelCapabilityPresets, sheetVariants, useTheme, useToast, violetForge };