@agent-native/toolkit 0.212.1 → 0.214.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 (209) hide show
  1. package/agent-native.eject.json +9 -0
  2. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/components.js +10 -4
  4. package/dist/app/agentkit/react/components.js.map +1 -1
  5. package/dist/app/agentkit/react/context.d.ts +13 -1
  6. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  7. package/dist/app/agentkit/react/context.js +3 -1
  8. package/dist/app/agentkit/react/context.js.map +1 -1
  9. package/dist/app/agentkit/react/index.d.ts +1 -0
  10. package/dist/app/agentkit/react/index.d.ts.map +1 -1
  11. package/dist/app/agentkit/react/index.js +1 -0
  12. package/dist/app/agentkit/react/index.js.map +1 -1
  13. package/dist/app/agentkit/react/message-content-order.d.ts +21 -0
  14. package/dist/app/agentkit/react/message-content-order.d.ts.map +1 -0
  15. package/dist/app/agentkit/react/message-content-order.js +173 -0
  16. package/dist/app/agentkit/react/message-content-order.js.map +1 -0
  17. package/dist/app/agentkit/react/root.d.ts +3 -1
  18. package/dist/app/agentkit/react/root.d.ts.map +1 -1
  19. package/dist/app/agentkit/react/root.js +2 -2
  20. package/dist/app/agentkit/react/root.js.map +1 -1
  21. package/dist/app/agentkit/react/styles.css +2 -2
  22. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  23. package/dist/app/chat/AgentKitAssistantChat.js +7 -2
  24. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  25. package/dist/app/chat/AgentPanel.d.ts +14 -2
  26. package/dist/app/chat/AgentPanel.d.ts.map +1 -1
  27. package/dist/app/chat/AgentPanel.js +22 -5
  28. package/dist/app/chat/AgentPanel.js.map +1 -1
  29. package/dist/app/chat/chat/surface-types.d.ts +8 -0
  30. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  31. package/dist/app/chat/chat/surface-types.js.map +1 -1
  32. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
  33. package/dist/app/chat/chat/widgets/DataChartRenderer.js +127 -30
  34. package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
  35. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts +3 -2
  36. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
  37. package/dist/app/chat/chat/widgets/DataChartWidget.js +14 -9
  38. package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
  39. package/dist/app/chat/chat/widgets/DataInsightsWidget.js +1 -1
  40. package/dist/app/chat/chat/widgets/DataInsightsWidget.js.map +1 -1
  41. package/dist/app/chat/chat/widgets/DataTableWidget.d.ts +3 -2
  42. package/dist/app/chat/chat/widgets/DataTableWidget.d.ts.map +1 -1
  43. package/dist/app/chat/chat/widgets/DataTableWidget.js +10 -66
  44. package/dist/app/chat/chat/widgets/DataTableWidget.js.map +1 -1
  45. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +11 -0
  46. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -0
  47. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +131 -0
  48. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -0
  49. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js +2 -2
  50. package/dist/app/chat/chat/widgets/builtin-tool-renderers.js.map +1 -1
  51. package/dist/app/chat/mcp-apps/McpAppRenderer.d.ts.map +1 -1
  52. package/dist/app/chat/mcp-apps/McpAppRenderer.js +6 -5
  53. package/dist/app/chat/mcp-apps/McpAppRenderer.js.map +1 -1
  54. package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts +2 -0
  55. package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts.map +1 -0
  56. package/dist/app/chat/mcp-apps/mcp-app-theme.js +11 -0
  57. package/dist/app/chat/mcp-apps/mcp-app-theme.js.map +1 -0
  58. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  59. package/dist/app/i18n/catalogs/ar-SA.js +10 -0
  60. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  61. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  62. package/dist/app/i18n/catalogs/de-DE.js +10 -0
  63. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  64. package/dist/app/i18n/catalogs/en-US.d.ts +10 -0
  65. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  66. package/dist/app/i18n/catalogs/en-US.js +10 -0
  67. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  68. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  69. package/dist/app/i18n/catalogs/es-ES.js +10 -0
  70. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  71. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  72. package/dist/app/i18n/catalogs/fr-FR.js +10 -0
  73. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  74. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  75. package/dist/app/i18n/catalogs/hi-IN.js +10 -0
  76. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  77. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  78. package/dist/app/i18n/catalogs/ja-JP.js +10 -0
  79. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  80. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  81. package/dist/app/i18n/catalogs/ko-KR.js +10 -0
  82. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  83. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  84. package/dist/app/i18n/catalogs/pt-BR.js +10 -0
  85. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  86. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  87. package/dist/app/i18n/catalogs/zh-CN.js +10 -0
  88. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  89. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  90. package/dist/app/i18n/catalogs/zh-TW.js +10 -0
  91. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  92. package/dist/app/org/AuthenticationSection.d.ts +3 -0
  93. package/dist/app/org/AuthenticationSection.d.ts.map +1 -1
  94. package/dist/app/org/AuthenticationSection.js +9 -3
  95. package/dist/app/org/AuthenticationSection.js.map +1 -1
  96. package/dist/app/org/pages/OrgAuthenticationPage.d.ts.map +1 -1
  97. package/dist/app/org/pages/OrgAuthenticationPage.js +2 -2
  98. package/dist/app/org/pages/OrgAuthenticationPage.js.map +1 -1
  99. package/dist/app/providers/AppProviders.d.ts +2 -1
  100. package/dist/app/providers/AppProviders.d.ts.map +1 -1
  101. package/dist/app/providers/AppProviders.js +4 -3
  102. package/dist/app/providers/AppProviders.js.map +1 -1
  103. package/dist/app/providers/ThemeFamilySync.d.ts +2 -0
  104. package/dist/app/providers/ThemeFamilySync.d.ts.map +1 -0
  105. package/dist/app/providers/ThemeFamilySync.js +6 -0
  106. package/dist/app/providers/ThemeFamilySync.js.map +1 -0
  107. package/dist/app/settings/account/PreferencesSettings.d.ts.map +1 -1
  108. package/dist/app/settings/account/PreferencesSettings.js +2 -1
  109. package/dist/app/settings/account/PreferencesSettings.js.map +1 -1
  110. package/dist/app/settings/account/ThemeFamilySettings.d.ts +2 -0
  111. package/dist/app/settings/account/ThemeFamilySettings.d.ts.map +1 -0
  112. package/dist/app/settings/account/ThemeFamilySettings.js +31 -0
  113. package/dist/app/settings/account/ThemeFamilySettings.js.map +1 -0
  114. package/dist/app/settings/account/search-entries.d.ts.map +1 -1
  115. package/dist/app/settings/account/search-entries.js +6 -0
  116. package/dist/app/settings/account/search-entries.js.map +1 -1
  117. package/dist/app/shared/DefaultSpinner.d.ts.map +1 -1
  118. package/dist/app/shared/DefaultSpinner.js +4 -5
  119. package/dist/app/shared/DefaultSpinner.js.map +1 -1
  120. package/dist/app/shared/ErrorBoundary.d.ts +1 -0
  121. package/dist/app/shared/ErrorBoundary.d.ts.map +1 -1
  122. package/dist/app/shared/ErrorBoundary.js +27 -12
  123. package/dist/app/shared/ErrorBoundary.js.map +1 -1
  124. package/dist/app/shared/PoweredByBadge.d.ts.map +1 -1
  125. package/dist/app/shared/PoweredByBadge.js +8 -49
  126. package/dist/app/shared/PoweredByBadge.js.map +1 -1
  127. package/dist/app/styles/agent-conversation.css +0 -23
  128. package/dist/app/styles/agent-native.css +1 -1
  129. package/dist/app/styles/theme-families.css +66 -0
  130. package/dist/composer/ComposerContextBanner.d.ts +22 -0
  131. package/dist/composer/ComposerContextBanner.d.ts.map +1 -0
  132. package/dist/composer/ComposerContextBanner.js +9 -0
  133. package/dist/composer/ComposerContextBanner.js.map +1 -0
  134. package/dist/composer/ComposerModePicker.d.ts +26 -0
  135. package/dist/composer/ComposerModePicker.d.ts.map +1 -0
  136. package/dist/composer/ComposerModePicker.js +14 -0
  137. package/dist/composer/ComposerModePicker.js.map +1 -0
  138. package/dist/composer/index.d.ts +2 -0
  139. package/dist/composer/index.d.ts.map +1 -1
  140. package/dist/composer/index.js +2 -0
  141. package/dist/composer/index.js.map +1 -1
  142. package/dist/styles.css +1 -0
  143. package/package.json +3 -3
  144. package/src/app/agentkit/react/components.spec.tsx +12 -0
  145. package/src/app/agentkit/react/components.tsx +41 -22
  146. package/src/app/agentkit/react/context.tsx +17 -0
  147. package/src/app/agentkit/react/index.ts +1 -0
  148. package/src/app/agentkit/react/lifecycle.spec.tsx +116 -1
  149. package/src/app/agentkit/react/message-content-order.spec.ts +190 -0
  150. package/src/app/agentkit/react/message-content-order.ts +246 -0
  151. package/src/app/agentkit/react/root.tsx +4 -0
  152. package/src/app/agentkit/react/styles.css +2 -2
  153. package/src/app/chat/AgentKitAssistantChat.spec.tsx +19 -0
  154. package/src/app/chat/AgentKitAssistantChat.tsx +10 -1
  155. package/src/app/chat/AgentPanel.header.spec.ts +72 -14
  156. package/src/app/chat/AgentPanel.tsx +97 -53
  157. package/src/app/chat/chat/surface-types.ts +8 -0
  158. package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +217 -0
  159. package/src/app/chat/chat/widgets/DataChartRenderer.tsx +306 -68
  160. package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +329 -0
  161. package/src/app/chat/chat/widgets/DataChartWidget.ssr.spec.tsx +25 -0
  162. package/src/app/chat/chat/widgets/DataChartWidget.tsx +48 -33
  163. package/src/app/chat/chat/widgets/DataInsightsWidget.tsx +2 -2
  164. package/src/app/chat/chat/widgets/DataTableWidget.spec.tsx +37 -3
  165. package/src/app/chat/chat/widgets/DataTableWidget.tsx +22 -86
  166. package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +301 -0
  167. package/src/app/chat/chat/widgets/builtin-tool-renderers.tsx +5 -5
  168. package/src/app/chat/mcp-apps/McpAppRenderer.tsx +10 -5
  169. package/src/app/chat/mcp-apps/mcp-app-theme.spec.ts +30 -0
  170. package/src/app/chat/mcp-apps/mcp-app-theme.ts +11 -0
  171. package/src/app/i18n/catalogs/ar-SA.ts +12 -0
  172. package/src/app/i18n/catalogs/de-DE.ts +13 -0
  173. package/src/app/i18n/catalogs/en-US.ts +12 -0
  174. package/src/app/i18n/catalogs/es-ES.ts +14 -0
  175. package/src/app/i18n/catalogs/fr-FR.ts +14 -0
  176. package/src/app/i18n/catalogs/hi-IN.ts +12 -0
  177. package/src/app/i18n/catalogs/ja-JP.ts +12 -0
  178. package/src/app/i18n/catalogs/ko-KR.ts +12 -0
  179. package/src/app/i18n/catalogs/pt-BR.ts +13 -0
  180. package/src/app/i18n/catalogs/zh-CN.ts +11 -0
  181. package/src/app/i18n/catalogs/zh-TW.ts +12 -0
  182. package/src/app/org/AuthenticationSection.spec.tsx +62 -0
  183. package/src/app/org/AuthenticationSection.tsx +47 -1
  184. package/src/app/org/pages/OrgAuthenticationPage.tsx +4 -0
  185. package/src/app/org/pages/OrgSettingsPages.spec.tsx +3 -0
  186. package/src/app/providers/AppProviders.spec.tsx +71 -0
  187. package/src/app/providers/AppProviders.tsx +10 -0
  188. package/src/app/providers/ThemeFamilySync.tsx +6 -0
  189. package/src/app/settings/account/PreferencesSettings.spec.tsx +13 -2
  190. package/src/app/settings/account/PreferencesSettings.tsx +8 -0
  191. package/src/app/settings/account/ThemeFamilySettings.tsx +61 -0
  192. package/src/app/settings/account/search-entries.ts +6 -0
  193. package/src/app/shared/DefaultSpinner.spec.tsx +14 -0
  194. package/src/app/shared/DefaultSpinner.tsx +4 -5
  195. package/src/app/shared/ErrorBoundary.spec.tsx +45 -2
  196. package/src/app/shared/ErrorBoundary.tsx +37 -12
  197. package/src/app/shared/PoweredByBadge.spec.tsx +16 -0
  198. package/src/app/shared/PoweredByBadge.tsx +8 -50
  199. package/src/app/styles/agent-conversation.css +0 -23
  200. package/src/app/styles/agent-native.css +1 -1
  201. package/src/app/styles/agent-native.spec.ts +18 -0
  202. package/src/app/styles/theme-families.css +66 -0
  203. package/src/app/styles/theme-families.spec.ts +29 -0
  204. package/src/composer/ComposerContextBanner.spec.tsx +74 -0
  205. package/src/composer/ComposerContextBanner.tsx +72 -0
  206. package/src/composer/ComposerModePicker.spec.tsx +101 -0
  207. package/src/composer/ComposerModePicker.tsx +98 -0
  208. package/src/composer/index.ts +9 -0
  209. package/src/styles.css +1 -0
@@ -0,0 +1,72 @@
1
+ import { IconPlus, IconSparkles, IconX } from "@tabler/icons-react";
2
+ import type { ReactNode } from "react";
3
+
4
+ import { Button } from "../ui/button.js";
5
+ import { cn } from "../utils.js";
6
+
7
+ interface ComposerContextBannerBaseProps {
8
+ /** Localized name for the banner's content. */
9
+ ariaLabel: string;
10
+ children: ReactNode;
11
+ /** Localized label for the action that opens or adds context. */
12
+ addContextLabel: string;
13
+ onAddContext: () => void;
14
+ icon?: ReactNode;
15
+ className?: string;
16
+ }
17
+
18
+ export type ComposerContextBannerProps = ComposerContextBannerBaseProps &
19
+ (
20
+ | { dismissLabel?: never; onDismiss?: never }
21
+ | { dismissLabel: string; onDismiss: () => void }
22
+ );
23
+
24
+ /** Shared informational banner that hosts can place in `composerContextBannerSlot`. */
25
+ export function ComposerContextBanner({
26
+ ariaLabel,
27
+ children,
28
+ addContextLabel,
29
+ onAddContext,
30
+ dismissLabel,
31
+ onDismiss,
32
+ icon,
33
+ className,
34
+ }: ComposerContextBannerProps) {
35
+ return (
36
+ <aside
37
+ aria-label={ariaLabel}
38
+ data-agent-composer-slot="context-banner"
39
+ className={cn(
40
+ "agent-composer-context-banner mx-auto mb-2 flex w-full max-w-3xl items-center gap-1.5 rounded-lg border border-border bg-background px-2.5 py-2 text-xs text-muted-foreground",
41
+ className,
42
+ )}
43
+ >
44
+ <span className="shrink-0 text-primary">
45
+ {icon ?? <IconSparkles aria-hidden="true" className="size-4" />}
46
+ </span>
47
+ <span className="min-w-0 flex-1">{children}</span>
48
+ <Button
49
+ className="shrink-0"
50
+ onClick={onAddContext}
51
+ size="xs"
52
+ type="button"
53
+ variant="outline"
54
+ >
55
+ {addContextLabel}
56
+ <IconPlus aria-hidden="true" />
57
+ </Button>
58
+ {onDismiss ? (
59
+ <Button
60
+ aria-label={dismissLabel}
61
+ className="shrink-0"
62
+ onClick={onDismiss}
63
+ size="icon-xs"
64
+ type="button"
65
+ variant="ghost"
66
+ >
67
+ <IconX aria-hidden="true" />
68
+ </Button>
69
+ ) : null}
70
+ </aside>
71
+ );
72
+ }
@@ -0,0 +1,101 @@
1
+ // @vitest-environment happy-dom
2
+
3
+ import React, { act, useState } from "react";
4
+ import { createRoot, type Root } from "react-dom/client";
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
+
7
+ import { ComposerModePicker } from "./ComposerModePicker.js";
8
+
9
+ (
10
+ globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }
11
+ ).IS_REACT_ACT_ENVIRONMENT = true;
12
+
13
+ let container: HTMLDivElement;
14
+ let root: Root;
15
+
16
+ beforeEach(() => {
17
+ container = document.createElement("div");
18
+ document.body.appendChild(container);
19
+ root = createRoot(container);
20
+ });
21
+
22
+ afterEach(() => {
23
+ act(() => root.unmount());
24
+ container.remove();
25
+ document.body.querySelectorAll('[role="menu"]').forEach((element) => {
26
+ if (!container.contains(element)) element.remove();
27
+ });
28
+ });
29
+
30
+ function ModePickerHarness({
31
+ onChange,
32
+ }: {
33
+ onChange: (value: string) => void;
34
+ }) {
35
+ const [value, setValue] = useState("ask");
36
+ return (
37
+ <ComposerModePicker
38
+ ariaLabel="Ask mode"
39
+ options={[
40
+ { value: "ask", label: "Ask", description: "Answer with context." },
41
+ { value: "default", label: "Default" },
42
+ ]}
43
+ value={value}
44
+ onValueChange={(next) => {
45
+ onChange(next);
46
+ setValue(next);
47
+ }}
48
+ />
49
+ );
50
+ }
51
+
52
+ describe("ComposerModePicker", () => {
53
+ it("shows the selected host option and updates it through the shared menu", async () => {
54
+ const onChange = vi.fn();
55
+ await act(async () =>
56
+ root.render(<ModePickerHarness onChange={onChange} />),
57
+ );
58
+
59
+ const trigger = container.querySelector<HTMLButtonElement>(
60
+ '[data-agent-composer-slot="mode-picker"]',
61
+ )!;
62
+ expect(trigger.getAttribute("aria-label")).toBe("Ask mode: Ask");
63
+
64
+ await act(async () => {
65
+ trigger.dispatchEvent(
66
+ new MouseEvent("pointerdown", { bubbles: true, button: 0 }),
67
+ );
68
+ trigger.dispatchEvent(new MouseEvent("click", { bubbles: true }));
69
+ await Promise.resolve();
70
+ });
71
+
72
+ const defaultOption = Array.from(
73
+ document.body.querySelectorAll<HTMLElement>('[role="menuitemradio"]'),
74
+ ).find((option) => option.textContent?.trim() === "Default");
75
+ expect(defaultOption).toBeDefined();
76
+ await act(async () => defaultOption!.click());
77
+
78
+ expect(onChange).toHaveBeenCalledWith("default");
79
+ expect(trigger.textContent).toContain("Default");
80
+ expect(trigger.getAttribute("aria-label")).toBe("Ask mode: Default");
81
+ });
82
+
83
+ it("keeps an unavailable selected value visible instead of choosing another mode", async () => {
84
+ await act(async () =>
85
+ root.render(
86
+ <ComposerModePicker
87
+ ariaLabel="Ask mode"
88
+ options={[{ value: "ask", label: "Ask" }]}
89
+ value="custom"
90
+ onValueChange={() => {}}
91
+ />,
92
+ ),
93
+ );
94
+
95
+ const trigger = container.querySelector<HTMLButtonElement>(
96
+ '[data-agent-composer-slot="mode-picker"]',
97
+ );
98
+ expect(trigger?.textContent).toContain("custom");
99
+ expect(trigger?.getAttribute("aria-label")).toBe("Ask mode: custom");
100
+ });
101
+ });
@@ -0,0 +1,98 @@
1
+ import { IconChevronDown } from "@tabler/icons-react";
2
+ import type { ReactNode } from "react";
3
+
4
+ import {
5
+ DropdownMenu,
6
+ DropdownMenuContent,
7
+ DropdownMenuRadioGroup,
8
+ DropdownMenuRadioItem,
9
+ DropdownMenuTrigger,
10
+ } from "../ui/dropdown-menu.js";
11
+ import { cn } from "../utils.js";
12
+
13
+ export interface ComposerModeOption {
14
+ /** Stable host-defined mode identifier. */
15
+ value: string;
16
+ /** Localized visible label supplied by the host. */
17
+ label: string;
18
+ /** Optional localized explanation shown in the menu. */
19
+ description?: string;
20
+ /** Optional host-provided icon. */
21
+ icon?: ReactNode;
22
+ disabled?: boolean;
23
+ }
24
+
25
+ export interface ComposerModePickerProps {
26
+ /** Localized accessible name for this choice, such as "Ask mode". */
27
+ ariaLabel: string;
28
+ value: string;
29
+ options: readonly ComposerModeOption[];
30
+ onValueChange: (value: string) => void;
31
+ className?: string;
32
+ }
33
+
34
+ /**
35
+ * A shared, host-configurable mode picker for composer modes that are not part
36
+ * of the framework's built-in Act/Plan execution setting.
37
+ */
38
+ export function ComposerModePicker({
39
+ ariaLabel,
40
+ value,
41
+ options,
42
+ onValueChange,
43
+ className,
44
+ }: ComposerModePickerProps) {
45
+ const selectedOption = options.find((option) => option.value === value);
46
+ const selectedLabel = selectedOption?.label ?? value;
47
+
48
+ return (
49
+ <DropdownMenu>
50
+ <DropdownMenuTrigger asChild>
51
+ <button
52
+ type="button"
53
+ aria-label={`${ariaLabel}: ${selectedLabel}`}
54
+ data-agent-composer-slot="mode-picker"
55
+ className={cn(
56
+ "agent-composer-mode-picker inline-flex h-7 max-w-48 shrink-0 items-center gap-1 rounded-md px-2 text-xs font-medium text-muted-foreground hover:bg-accent/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
57
+ className,
58
+ )}
59
+ >
60
+ {selectedOption?.icon}
61
+ <span className="min-w-0 truncate">{selectedLabel}</span>
62
+ <IconChevronDown
63
+ aria-hidden="true"
64
+ className="size-3 shrink-0 opacity-60"
65
+ />
66
+ </button>
67
+ </DropdownMenuTrigger>
68
+ <DropdownMenuContent
69
+ side="top"
70
+ align="start"
71
+ collisionPadding={8}
72
+ className="agent-composer-mode-picker-menu min-w-48"
73
+ >
74
+ <DropdownMenuRadioGroup value={value} onValueChange={onValueChange}>
75
+ {options.map((option) => (
76
+ <DropdownMenuRadioItem
77
+ key={option.value}
78
+ value={option.value}
79
+ indicator="check"
80
+ disabled={option.disabled}
81
+ className="agent-composer-mode-picker-option pe-3"
82
+ >
83
+ {option.icon}
84
+ <span className="min-w-0 flex-1">
85
+ <span className="block truncate">{option.label}</span>
86
+ {option.description ? (
87
+ <span className="mt-0.5 block whitespace-normal text-xs text-muted-foreground">
88
+ {option.description}
89
+ </span>
90
+ ) : null}
91
+ </span>
92
+ </DropdownMenuRadioItem>
93
+ ))}
94
+ </DropdownMenuRadioGroup>
95
+ </DropdownMenuContent>
96
+ </DropdownMenu>
97
+ );
98
+ }
@@ -1,4 +1,13 @@
1
1
  export { FileReference } from "./extensions/FileReference.js";
2
+ export {
3
+ ComposerContextBanner,
4
+ type ComposerContextBannerProps,
5
+ } from "./ComposerContextBanner.js";
6
+ export {
7
+ ComposerModePicker,
8
+ type ComposerModeOption,
9
+ type ComposerModePickerProps,
10
+ } from "./ComposerModePicker.js";
2
11
  export {
3
12
  useComposerDefaultActions,
4
13
  mergeComposerMenuItems,
package/src/styles.css CHANGED
@@ -18,6 +18,7 @@
18
18
  */
19
19
  @import "./theme/resource-icons.css";
20
20
  @import "./app-shell/prompt-home.css";
21
+ @import "./app/styles/theme-families.css";
21
22
  @import "./app/styles/agent-native.css";
22
23
 
23
24
  @source "./**/*.{js,ts,tsx}";