@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.
- package/agent-native.eject.json +9 -0
- package/dist/app/agentkit/react/components.d.ts.map +1 -1
- package/dist/app/agentkit/react/components.js +10 -4
- package/dist/app/agentkit/react/components.js.map +1 -1
- package/dist/app/agentkit/react/context.d.ts +13 -1
- package/dist/app/agentkit/react/context.d.ts.map +1 -1
- package/dist/app/agentkit/react/context.js +3 -1
- package/dist/app/agentkit/react/context.js.map +1 -1
- package/dist/app/agentkit/react/index.d.ts +1 -0
- package/dist/app/agentkit/react/index.d.ts.map +1 -1
- package/dist/app/agentkit/react/index.js +1 -0
- package/dist/app/agentkit/react/index.js.map +1 -1
- package/dist/app/agentkit/react/message-content-order.d.ts +21 -0
- package/dist/app/agentkit/react/message-content-order.d.ts.map +1 -0
- package/dist/app/agentkit/react/message-content-order.js +173 -0
- package/dist/app/agentkit/react/message-content-order.js.map +1 -0
- package/dist/app/agentkit/react/root.d.ts +3 -1
- package/dist/app/agentkit/react/root.d.ts.map +1 -1
- package/dist/app/agentkit/react/root.js +2 -2
- package/dist/app/agentkit/react/root.js.map +1 -1
- package/dist/app/agentkit/react/styles.css +2 -2
- package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.js +7 -2
- package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
- package/dist/app/chat/AgentPanel.d.ts +14 -2
- package/dist/app/chat/AgentPanel.d.ts.map +1 -1
- package/dist/app/chat/AgentPanel.js +22 -5
- package/dist/app/chat/AgentPanel.js.map +1 -1
- package/dist/app/chat/chat/surface-types.d.ts +8 -0
- package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
- package/dist/app/chat/chat/surface-types.js.map +1 -1
- package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
- package/dist/app/chat/chat/widgets/DataChartRenderer.js +127 -30
- package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
- package/dist/app/chat/chat/widgets/DataChartWidget.d.ts +3 -2
- package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
- package/dist/app/chat/chat/widgets/DataChartWidget.js +14 -9
- package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
- package/dist/app/chat/chat/widgets/DataInsightsWidget.js +1 -1
- package/dist/app/chat/chat/widgets/DataInsightsWidget.js.map +1 -1
- package/dist/app/chat/chat/widgets/DataTableWidget.d.ts +3 -2
- package/dist/app/chat/chat/widgets/DataTableWidget.d.ts.map +1 -1
- package/dist/app/chat/chat/widgets/DataTableWidget.js +10 -66
- package/dist/app/chat/chat/widgets/DataTableWidget.js.map +1 -1
- package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +11 -0
- package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -0
- package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +131 -0
- package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -0
- package/dist/app/chat/chat/widgets/builtin-tool-renderers.js +2 -2
- package/dist/app/chat/chat/widgets/builtin-tool-renderers.js.map +1 -1
- package/dist/app/chat/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/app/chat/mcp-apps/McpAppRenderer.js +6 -5
- package/dist/app/chat/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts +2 -0
- package/dist/app/chat/mcp-apps/mcp-app-theme.d.ts.map +1 -0
- package/dist/app/chat/mcp-apps/mcp-app-theme.js +11 -0
- package/dist/app/chat/mcp-apps/mcp-app-theme.js.map +1 -0
- package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.js +10 -0
- package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.js +10 -0
- package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
- package/dist/app/i18n/catalogs/en-US.d.ts +10 -0
- package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/en-US.js +10 -0
- package/dist/app/i18n/catalogs/en-US.js.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.js +10 -0
- package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.js +10 -0
- package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.js +10 -0
- package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.js +10 -0
- package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.js +10 -0
- package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.js +10 -0
- package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.js +10 -0
- package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.js +10 -0
- package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
- package/dist/app/org/AuthenticationSection.d.ts +3 -0
- package/dist/app/org/AuthenticationSection.d.ts.map +1 -1
- package/dist/app/org/AuthenticationSection.js +9 -3
- package/dist/app/org/AuthenticationSection.js.map +1 -1
- package/dist/app/org/pages/OrgAuthenticationPage.d.ts.map +1 -1
- package/dist/app/org/pages/OrgAuthenticationPage.js +2 -2
- package/dist/app/org/pages/OrgAuthenticationPage.js.map +1 -1
- package/dist/app/providers/AppProviders.d.ts +2 -1
- package/dist/app/providers/AppProviders.d.ts.map +1 -1
- package/dist/app/providers/AppProviders.js +4 -3
- package/dist/app/providers/AppProviders.js.map +1 -1
- package/dist/app/providers/ThemeFamilySync.d.ts +2 -0
- package/dist/app/providers/ThemeFamilySync.d.ts.map +1 -0
- package/dist/app/providers/ThemeFamilySync.js +6 -0
- package/dist/app/providers/ThemeFamilySync.js.map +1 -0
- package/dist/app/settings/account/PreferencesSettings.d.ts.map +1 -1
- package/dist/app/settings/account/PreferencesSettings.js +2 -1
- package/dist/app/settings/account/PreferencesSettings.js.map +1 -1
- package/dist/app/settings/account/ThemeFamilySettings.d.ts +2 -0
- package/dist/app/settings/account/ThemeFamilySettings.d.ts.map +1 -0
- package/dist/app/settings/account/ThemeFamilySettings.js +31 -0
- package/dist/app/settings/account/ThemeFamilySettings.js.map +1 -0
- package/dist/app/settings/account/search-entries.d.ts.map +1 -1
- package/dist/app/settings/account/search-entries.js +6 -0
- package/dist/app/settings/account/search-entries.js.map +1 -1
- package/dist/app/shared/DefaultSpinner.d.ts.map +1 -1
- package/dist/app/shared/DefaultSpinner.js +4 -5
- package/dist/app/shared/DefaultSpinner.js.map +1 -1
- package/dist/app/shared/ErrorBoundary.d.ts +1 -0
- package/dist/app/shared/ErrorBoundary.d.ts.map +1 -1
- package/dist/app/shared/ErrorBoundary.js +27 -12
- package/dist/app/shared/ErrorBoundary.js.map +1 -1
- package/dist/app/shared/PoweredByBadge.d.ts.map +1 -1
- package/dist/app/shared/PoweredByBadge.js +8 -49
- package/dist/app/shared/PoweredByBadge.js.map +1 -1
- package/dist/app/styles/agent-conversation.css +0 -23
- package/dist/app/styles/agent-native.css +1 -1
- package/dist/app/styles/theme-families.css +66 -0
- package/dist/composer/ComposerContextBanner.d.ts +22 -0
- package/dist/composer/ComposerContextBanner.d.ts.map +1 -0
- package/dist/composer/ComposerContextBanner.js +9 -0
- package/dist/composer/ComposerContextBanner.js.map +1 -0
- package/dist/composer/ComposerModePicker.d.ts +26 -0
- package/dist/composer/ComposerModePicker.d.ts.map +1 -0
- package/dist/composer/ComposerModePicker.js +14 -0
- package/dist/composer/ComposerModePicker.js.map +1 -0
- package/dist/composer/index.d.ts +2 -0
- package/dist/composer/index.d.ts.map +1 -1
- package/dist/composer/index.js +2 -0
- package/dist/composer/index.js.map +1 -1
- package/dist/styles.css +1 -0
- package/package.json +3 -3
- package/src/app/agentkit/react/components.spec.tsx +12 -0
- package/src/app/agentkit/react/components.tsx +41 -22
- package/src/app/agentkit/react/context.tsx +17 -0
- package/src/app/agentkit/react/index.ts +1 -0
- package/src/app/agentkit/react/lifecycle.spec.tsx +116 -1
- package/src/app/agentkit/react/message-content-order.spec.ts +190 -0
- package/src/app/agentkit/react/message-content-order.ts +246 -0
- package/src/app/agentkit/react/root.tsx +4 -0
- package/src/app/agentkit/react/styles.css +2 -2
- package/src/app/chat/AgentKitAssistantChat.spec.tsx +19 -0
- package/src/app/chat/AgentKitAssistantChat.tsx +10 -1
- package/src/app/chat/AgentPanel.header.spec.ts +72 -14
- package/src/app/chat/AgentPanel.tsx +97 -53
- package/src/app/chat/chat/surface-types.ts +8 -0
- package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +217 -0
- package/src/app/chat/chat/widgets/DataChartRenderer.tsx +306 -68
- package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +329 -0
- package/src/app/chat/chat/widgets/DataChartWidget.ssr.spec.tsx +25 -0
- package/src/app/chat/chat/widgets/DataChartWidget.tsx +48 -33
- package/src/app/chat/chat/widgets/DataInsightsWidget.tsx +2 -2
- package/src/app/chat/chat/widgets/DataTableWidget.spec.tsx +37 -3
- package/src/app/chat/chat/widgets/DataTableWidget.tsx +22 -86
- package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +301 -0
- package/src/app/chat/chat/widgets/builtin-tool-renderers.tsx +5 -5
- package/src/app/chat/mcp-apps/McpAppRenderer.tsx +10 -5
- package/src/app/chat/mcp-apps/mcp-app-theme.spec.ts +30 -0
- package/src/app/chat/mcp-apps/mcp-app-theme.ts +11 -0
- package/src/app/i18n/catalogs/ar-SA.ts +12 -0
- package/src/app/i18n/catalogs/de-DE.ts +13 -0
- package/src/app/i18n/catalogs/en-US.ts +12 -0
- package/src/app/i18n/catalogs/es-ES.ts +14 -0
- package/src/app/i18n/catalogs/fr-FR.ts +14 -0
- package/src/app/i18n/catalogs/hi-IN.ts +12 -0
- package/src/app/i18n/catalogs/ja-JP.ts +12 -0
- package/src/app/i18n/catalogs/ko-KR.ts +12 -0
- package/src/app/i18n/catalogs/pt-BR.ts +13 -0
- package/src/app/i18n/catalogs/zh-CN.ts +11 -0
- package/src/app/i18n/catalogs/zh-TW.ts +12 -0
- package/src/app/org/AuthenticationSection.spec.tsx +62 -0
- package/src/app/org/AuthenticationSection.tsx +47 -1
- package/src/app/org/pages/OrgAuthenticationPage.tsx +4 -0
- package/src/app/org/pages/OrgSettingsPages.spec.tsx +3 -0
- package/src/app/providers/AppProviders.spec.tsx +71 -0
- package/src/app/providers/AppProviders.tsx +10 -0
- package/src/app/providers/ThemeFamilySync.tsx +6 -0
- package/src/app/settings/account/PreferencesSettings.spec.tsx +13 -2
- package/src/app/settings/account/PreferencesSettings.tsx +8 -0
- package/src/app/settings/account/ThemeFamilySettings.tsx +61 -0
- package/src/app/settings/account/search-entries.ts +6 -0
- package/src/app/shared/DefaultSpinner.spec.tsx +14 -0
- package/src/app/shared/DefaultSpinner.tsx +4 -5
- package/src/app/shared/ErrorBoundary.spec.tsx +45 -2
- package/src/app/shared/ErrorBoundary.tsx +37 -12
- package/src/app/shared/PoweredByBadge.spec.tsx +16 -0
- package/src/app/shared/PoweredByBadge.tsx +8 -50
- package/src/app/styles/agent-conversation.css +0 -23
- package/src/app/styles/agent-native.css +1 -1
- package/src/app/styles/agent-native.spec.ts +18 -0
- package/src/app/styles/theme-families.css +66 -0
- package/src/app/styles/theme-families.spec.ts +29 -0
- package/src/composer/ComposerContextBanner.spec.tsx +74 -0
- package/src/composer/ComposerContextBanner.tsx +72 -0
- package/src/composer/ComposerModePicker.spec.tsx +101 -0
- package/src/composer/ComposerModePicker.tsx +98 -0
- package/src/composer/index.ts +9 -0
- 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
|
+
}
|
package/src/composer/index.ts
CHANGED
|
@@ -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,
|