@agent-native/toolkit 0.214.0 → 0.217.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 +5 -0
- package/dist/app/agentkit/react/chat.d.ts.map +1 -1
- package/dist/app/agentkit/react/chat.js +2 -2
- package/dist/app/agentkit/react/chat.js.map +1 -1
- package/dist/app/agentkit/react/components.d.ts +4 -1
- package/dist/app/agentkit/react/components.d.ts.map +1 -1
- package/dist/app/agentkit/react/components.js +69 -15
- package/dist/app/agentkit/react/components.js.map +1 -1
- package/dist/app/agentkit/react/context.d.ts +7 -1
- package/dist/app/agentkit/react/context.d.ts.map +1 -1
- package/dist/app/agentkit/react/context.js +5 -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/root.d.ts +4 -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 +43 -6
- package/dist/app/agentkit/react/transcript-layout.d.ts +51 -0
- package/dist/app/agentkit/react/transcript-layout.d.ts.map +1 -0
- package/dist/app/agentkit/react/transcript-layout.js +34 -0
- package/dist/app/agentkit/react/transcript-layout.js.map +1 -0
- package/dist/app/auth/AuthPage.d.ts.map +1 -1
- package/dist/app/auth/AuthPage.js +33 -44
- package/dist/app/auth/AuthPage.js.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.js +3 -3
- package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
- package/dist/app/chat/AgentPanel.d.ts +2 -0
- package/dist/app/chat/AgentPanel.d.ts.map +1 -1
- package/dist/app/chat/AgentPanel.js +6 -2
- package/dist/app/chat/AgentPanel.js.map +1 -1
- package/dist/app/chat/chat/index.d.ts +2 -0
- package/dist/app/chat/chat/index.d.ts.map +1 -1
- package/dist/app/chat/chat/index.js.map +1 -1
- package/dist/app/chat/chat/surface-types.d.ts +7 -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/tool-call-display.d.ts +7 -2
- package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
- package/dist/app/chat/chat/tool-call-display.js +10 -9
- package/dist/app/chat/chat/tool-call-display.js.map +1 -1
- package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
- package/dist/app/chat/chat/widgets/DataChartRenderer.js +196 -26
- package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
- package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
- package/dist/app/chat/chat/widgets/DataChartWidget.js +5 -1
- package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
- package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +2 -2
- package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -1
- package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +6 -4
- package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.js +1 -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 +1 -0
- package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
- package/dist/app/i18n/catalogs/en-US.d.ts +1 -0
- package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/en-US.js +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -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 +1 -0
- package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
- package/dist/app/onboarding/GettingStartedCard.d.ts +35 -0
- package/dist/app/onboarding/GettingStartedCard.d.ts.map +1 -0
- package/dist/app/onboarding/GettingStartedCard.js +38 -0
- package/dist/app/onboarding/GettingStartedCard.js.map +1 -0
- package/dist/app/onboarding/index.d.ts +1 -0
- package/dist/app/onboarding/index.d.ts.map +1 -1
- package/dist/app/onboarding/index.js +1 -0
- package/dist/app/onboarding/index.js.map +1 -1
- package/dist/app/providers/AppProviders.d.ts.map +1 -1
- package/dist/app/providers/AppProviders.js +3 -1
- package/dist/app/providers/AppProviders.js.map +1 -1
- package/dist/app/settings/AccountSettingsCard.d.ts.map +1 -1
- package/dist/app/settings/AccountSettingsCard.js +2 -1
- package/dist/app/settings/AccountSettingsCard.js.map +1 -1
- package/dist/app/settings/index.d.ts +1 -0
- package/dist/app/settings/index.d.ts.map +1 -1
- package/dist/app/settings/index.js +1 -0
- package/dist/app/settings/index.js.map +1 -1
- package/dist/app/settings/shell/SettingsShell.d.ts +40 -1
- package/dist/app/settings/shell/SettingsShell.d.ts.map +1 -1
- package/dist/app/settings/shell/SettingsShell.js +87 -20
- package/dist/app/settings/shell/SettingsShell.js.map +1 -1
- package/dist/app/settings/shell/bridge.d.ts +5 -3
- package/dist/app/settings/shell/bridge.d.ts.map +1 -1
- package/dist/app/settings/shell/bridge.js +8 -5
- package/dist/app/settings/shell/bridge.js.map +1 -1
- package/dist/app/settings/shell/index.d.ts +2 -2
- package/dist/app/settings/shell/index.d.ts.map +1 -1
- package/dist/app/settings/shell/index.js.map +1 -1
- package/dist/app/settings/shell/registry.d.ts +9 -1
- package/dist/app/settings/shell/registry.d.ts.map +1 -1
- package/dist/app/settings/shell/registry.js +16 -0
- package/dist/app/settings/shell/registry.js.map +1 -1
- package/dist/app/settings/shell/routing.d.ts +5 -4
- package/dist/app/settings/shell/routing.d.ts.map +1 -1
- package/dist/app/settings/shell/routing.js +38 -10
- package/dist/app/settings/shell/routing.js.map +1 -1
- package/dist/app/shared/CommandMenu.d.ts +86 -6
- package/dist/app/shared/CommandMenu.d.ts.map +1 -1
- package/dist/app/shared/CommandMenu.js +303 -41
- package/dist/app/shared/CommandMenu.js.map +1 -1
- package/dist/app/shared/ConsentBanner.d.ts +9 -0
- package/dist/app/shared/ConsentBanner.d.ts.map +1 -0
- package/dist/app/shared/ConsentBanner.js +35 -0
- package/dist/app/shared/ConsentBanner.js.map +1 -0
- package/dist/composer/ComposerContextBanner.d.ts +3 -1
- package/dist/composer/ComposerContextBanner.d.ts.map +1 -1
- package/dist/composer/ComposerContextBanner.js +2 -2
- package/dist/composer/ComposerContextBanner.js.map +1 -1
- package/dist/ui/sonner.d.ts +2 -2
- package/dist/ui/sonner.d.ts.map +1 -1
- package/dist/ui/sonner.js +2 -2
- package/dist/ui/sonner.js.map +1 -1
- package/package.json +3 -3
- package/src/app/agentkit/react/chat.tsx +2 -0
- package/src/app/agentkit/react/components.interaction.spec.tsx +107 -0
- package/src/app/agentkit/react/components.spec.tsx +28 -1
- package/src/app/agentkit/react/components.tsx +153 -17
- package/src/app/agentkit/react/context.tsx +12 -0
- package/src/app/agentkit/react/index.ts +1 -0
- package/src/app/agentkit/react/lifecycle.spec.tsx +186 -16
- package/src/app/agentkit/react/root.tsx +7 -0
- package/src/app/agentkit/react/styles.css +43 -6
- package/src/app/agentkit/react/transcript-layout.spec.ts +72 -0
- package/src/app/agentkit/react/transcript-layout.ts +97 -0
- package/src/app/auth/AuthPage.attribution.spec.tsx +6 -0
- package/src/app/auth/AuthPage.interaction.spec.tsx +74 -0
- package/src/app/auth/AuthPage.tsx +32 -39
- package/src/app/chat/AgentKitAssistantChat.spec.tsx +39 -0
- package/src/app/chat/AgentKitAssistantChat.tsx +5 -0
- package/src/app/chat/AgentPanel.page-header-share.spec.tsx +101 -0
- package/src/app/chat/AgentPanel.tsx +14 -2
- package/src/app/chat/chat/index.ts +2 -0
- package/src/app/chat/chat/surface-types.ts +10 -0
- package/src/app/chat/chat/tool-call-display.spec.tsx +83 -0
- package/src/app/chat/chat/tool-call-display.tsx +40 -8
- package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +632 -0
- package/src/app/chat/chat/widgets/DataChartRenderer.tsx +308 -51
- package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +126 -23
- package/src/app/chat/chat/widgets/DataChartWidget.tsx +10 -0
- package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +26 -6
- package/src/app/i18n/catalogs/ar-SA.ts +1 -0
- package/src/app/i18n/catalogs/de-DE.ts +2 -0
- package/src/app/i18n/catalogs/en-US.ts +2 -0
- package/src/app/i18n/catalogs/es-ES.ts +2 -0
- package/src/app/i18n/catalogs/fr-FR.ts +2 -0
- package/src/app/i18n/catalogs/hi-IN.ts +1 -0
- package/src/app/i18n/catalogs/ja-JP.ts +2 -0
- package/src/app/i18n/catalogs/ko-KR.ts +1 -0
- package/src/app/i18n/catalogs/pt-BR.ts +2 -0
- package/src/app/i18n/catalogs/zh-CN.ts +1 -0
- package/src/app/i18n/catalogs/zh-TW.ts +1 -0
- package/src/app/onboarding/GettingStartedCard.tsx +203 -0
- package/src/app/onboarding/index.ts +1 -0
- package/src/app/providers/AppProviders.tsx +7 -1
- package/src/app/settings/AccountSettingsCard.spec.tsx +31 -0
- package/src/app/settings/AccountSettingsCard.tsx +8 -0
- package/src/app/settings/index.ts +1 -0
- package/src/app/settings/shell/SettingsShell.spec.tsx +472 -1
- package/src/app/settings/shell/SettingsShell.tsx +245 -31
- package/src/app/settings/shell/bridge.spec.ts +12 -0
- package/src/app/settings/shell/bridge.ts +17 -4
- package/src/app/settings/shell/index.ts +6 -1
- package/src/app/settings/shell/registry.ts +33 -1
- package/src/app/settings/shell/routing.spec.ts +92 -1
- package/src/app/settings/shell/routing.ts +52 -9
- package/src/app/shared/CommandMenu.spec.tsx +1662 -1
- package/src/app/shared/CommandMenu.tsx +763 -164
- package/src/app/shared/ConsentBanner.spec.tsx +141 -0
- package/src/app/shared/ConsentBanner.tsx +141 -0
- package/src/composer/ComposerContextBanner.spec.tsx +31 -5
- package/src/composer/ComposerContextBanner.tsx +7 -2
- package/src/ui/sonner.spec.ts +10 -0
- package/src/ui/sonner.tsx +2 -2
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { getConsentChoice, resolveConsentRegion, setConsentChoice, shouldShowConsentBanner, subscribeConsent, } from "@agent-native/core/client/consent";
|
|
3
|
+
import { useT } from "@agent-native/core/client/i18n";
|
|
4
|
+
import { Button } from "@agent-native/toolkit/ui/button";
|
|
5
|
+
import { Label } from "@agent-native/toolkit/ui/label";
|
|
6
|
+
import { Switch } from "@agent-native/toolkit/ui/switch";
|
|
7
|
+
import { useEffect, useState, useSyncExternalStore } from "react";
|
|
8
|
+
const DEFAULT_PRIVACY_POLICY_HREF = "https://www.agent-native.com/privacy";
|
|
9
|
+
/**
|
|
10
|
+
* The cookie banner for visitors in the consent region. Renders nothing
|
|
11
|
+
* elsewhere, and nothing once the visitor has chosen, until
|
|
12
|
+
* `openConsentSettings()` reopens it.
|
|
13
|
+
*/
|
|
14
|
+
export function ConsentBanner({ privacyPolicyHref = DEFAULT_PRIVACY_POLICY_HREF, }) {
|
|
15
|
+
const t = useT();
|
|
16
|
+
const open = useSyncExternalStore(subscribeConsent, shouldShowConsentBanner, () => false);
|
|
17
|
+
const [managing, setManaging] = useState(false);
|
|
18
|
+
const [performance, setPerformance] = useState(false);
|
|
19
|
+
const [targeting, setTargeting] = useState(false);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
void resolveConsentRegion();
|
|
22
|
+
}, []);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (!open)
|
|
25
|
+
return;
|
|
26
|
+
const stored = getConsentChoice();
|
|
27
|
+
setPerformance(stored?.performance ?? false);
|
|
28
|
+
setTargeting(stored?.targeting ?? false);
|
|
29
|
+
setManaging(false);
|
|
30
|
+
}, [open]);
|
|
31
|
+
if (!open)
|
|
32
|
+
return null;
|
|
33
|
+
return (_jsxs("section", { role: "region", "aria-label": t("consentBanner.label"), "data-agent-native-consent-banner": true, className: "fixed bottom-4 left-4 z-[100] flex w-[min(420px,calc(100vw-2rem))] flex-col gap-3 rounded-lg border bg-popover p-4 text-sm text-popover-foreground shadow-lg", children: [_jsxs("p", { className: "m-0 leading-relaxed", children: [t("consentBanner.message"), " ", _jsx("a", { href: privacyPolicyHref, target: "_blank", rel: "noreferrer", className: "underline underline-offset-2", children: t("consentBanner.privacyPolicy") })] }), managing ? (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx(Label, { htmlFor: "an-consent-necessary", children: t("consentBanner.necessary") }), _jsx(Switch, { id: "an-consent-necessary", checked: true, disabled: true })] }), _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx(Label, { htmlFor: "an-consent-performance", children: t("consentBanner.performance") }), _jsx(Switch, { id: "an-consent-performance", checked: performance, onCheckedChange: setPerformance })] }), _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx(Label, { htmlFor: "an-consent-targeting", children: t("consentBanner.targeting") }), _jsx(Switch, { id: "an-consent-targeting", checked: targeting, onCheckedChange: setTargeting })] })] })) : null, _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { variant: "outline", size: "sm", className: "flex-1", onClick: () => setConsentChoice({ performance: false, targeting: false }), children: t("consentBanner.rejectAll") }), _jsx(Button, { variant: "outline", size: "sm", className: "flex-1", onClick: () => setConsentChoice({ performance: true, targeting: true }), children: t("consentBanner.acceptAll") }), managing ? (_jsx(Button, { variant: "outline", size: "sm", className: "flex-1", onClick: () => setConsentChoice({ performance, targeting }), children: t("consentBanner.save") })) : (_jsx(Button, { variant: "ghost", size: "sm", className: "flex-1", onClick: () => setManaging(true), children: t("consentBanner.manage") }))] })] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=ConsentBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsentBanner.js","sourceRoot":"","sources":["../../../src/app/shared/ConsentBanner.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ interface ComposerContextBannerBaseProps {
|
|
|
6
6
|
/** Localized label for the action that opens or adds context. */
|
|
7
7
|
addContextLabel: string;
|
|
8
8
|
onAddContext: () => void;
|
|
9
|
+
/** Optional decorative icon displayed after the add-context label. */
|
|
10
|
+
addContextIcon?: ReactNode;
|
|
9
11
|
icon?: ReactNode;
|
|
10
12
|
className?: string;
|
|
11
13
|
}
|
|
@@ -17,6 +19,6 @@ export type ComposerContextBannerProps = ComposerContextBannerBaseProps & ({
|
|
|
17
19
|
onDismiss: () => void;
|
|
18
20
|
});
|
|
19
21
|
/** Shared informational banner that hosts can place in `composerContextBannerSlot`. */
|
|
20
|
-
export declare function ComposerContextBanner({ ariaLabel, children, addContextLabel, onAddContext, dismissLabel, onDismiss, icon, className, }: ComposerContextBannerProps): import("react").JSX.Element;
|
|
22
|
+
export declare function ComposerContextBanner({ ariaLabel, children, addContextLabel, onAddContext, addContextIcon, dismissLabel, onDismiss, icon, className, }: ComposerContextBannerProps): import("react").JSX.Element;
|
|
21
23
|
export {};
|
|
22
24
|
//# sourceMappingURL=ComposerContextBanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposerContextBanner.d.ts","sourceRoot":"","sources":["../../src/composer/ComposerContextBanner.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,UAAU,8BAA8B;IACtC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,0BAA0B,GAAG,8BAA8B,GACrE,CACI;IAAE,YAAY,CAAC,EAAE,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAA;CAAE,GAC3C;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,IAAI,CAAA;CAAE,CAClD,CAAC;AAEJ,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,SAAS,GACV,EAAE,0BAA0B,+
|
|
1
|
+
{"version":3,"file":"ComposerContextBanner.d.ts","sourceRoot":"","sources":["../../src/composer/ComposerContextBanner.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,UAAU,8BAA8B;IACtC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,iEAAiE;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,sEAAsE;IACtE,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,0BAA0B,GAAG,8BAA8B,GACrE,CACI;IAAE,YAAY,CAAC,EAAE,KAAK,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,CAAA;CAAE,GAC3C;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,IAAI,CAAA;CAAE,CAClD,CAAC;AAEJ,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,SAAS,GACV,EAAE,0BAA0B,+BAwC5B"}
|
|
@@ -3,7 +3,7 @@ import { IconPlus, IconSparkles, IconX } from "@tabler/icons-react";
|
|
|
3
3
|
import { Button } from "../ui/button.js";
|
|
4
4
|
import { cn } from "../utils.js";
|
|
5
5
|
/** Shared informational banner that hosts can place in `composerContextBannerSlot`. */
|
|
6
|
-
export function ComposerContextBanner({ ariaLabel, children, addContextLabel, onAddContext, dismissLabel, onDismiss, icon, className, }) {
|
|
7
|
-
return (_jsxs("aside", { "aria-label": ariaLabel, "data-agent-composer-slot": "context-banner", className: cn("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", className), children: [_jsx("span", { className: "shrink-0 text-primary", children: icon ?? _jsx(IconSparkles, { "aria-hidden": "true", className: "size-4" }) }), _jsx("span", { className: "min-w-0 flex-1", children: children }), _jsxs(Button, { className: "shrink-0", onClick: onAddContext, size: "xs", type: "button", variant: "outline", children: [addContextLabel, _jsx(IconPlus, { "aria-hidden": "true" })] }), onDismiss ? (_jsx(Button, { "aria-label": dismissLabel, className: "shrink-0", onClick: onDismiss, size: "icon-xs", type: "button", variant: "ghost", children: _jsx(IconX, { "aria-hidden": "true" }) })) : null] }));
|
|
6
|
+
export function ComposerContextBanner({ ariaLabel, children, addContextLabel, onAddContext, addContextIcon, dismissLabel, onDismiss, icon, className, }) {
|
|
7
|
+
return (_jsxs("aside", { "aria-label": ariaLabel, "data-agent-composer-slot": "context-banner", className: cn("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", className), children: [_jsx("span", { className: "shrink-0 text-primary", children: icon ?? _jsx(IconSparkles, { "aria-hidden": "true", className: "size-4" }) }), _jsx("span", { className: "min-w-0 flex-1", children: children }), _jsxs(Button, { className: "shrink-0 px-1.5", onClick: onAddContext, size: "xs", type: "button", variant: "outline", children: [addContextLabel, _jsx("span", { "aria-hidden": "true", children: addContextIcon ?? _jsx(IconPlus, { "aria-hidden": "true" }) })] }), onDismiss ? (_jsx(Button, { "aria-label": dismissLabel, className: "shrink-0", onClick: onDismiss, size: "icon-xs", type: "button", variant: "ghost", children: _jsx(IconX, { "aria-hidden": "true" }) })) : null] }));
|
|
8
8
|
}
|
|
9
9
|
//# sourceMappingURL=ComposerContextBanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposerContextBanner.js","sourceRoot":"","sources":["../../src/composer/ComposerContextBanner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ComposerContextBanner.js","sourceRoot":"","sources":["../../src/composer/ComposerContextBanner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAqBjC,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,SAAS,EACT,IAAI,EACJ,SAAS,GACkB;IAC3B,OAAO,CACL,+BACc,SAAS,8BACI,gBAAgB,EACzC,SAAS,EAAE,EAAE,CACX,+KAA+K,EAC/K,SAAS,CACV,aAED,eAAM,SAAS,EAAC,uBAAuB,YACpC,IAAI,IAAI,KAAC,YAAY,mBAAa,MAAM,EAAC,SAAS,EAAC,QAAQ,GAAG,GAC1D,EACP,eAAM,SAAS,EAAC,gBAAgB,YAAE,QAAQ,GAAQ,EAClD,MAAC,MAAM,IACL,SAAS,EAAC,iBAAiB,EAC3B,OAAO,EAAE,YAAY,EACrB,IAAI,EAAC,IAAI,EACT,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,SAAS,aAEhB,eAAe,EAChB,8BAAkB,MAAM,YACrB,cAAc,IAAI,KAAC,QAAQ,mBAAa,MAAM,GAAG,GAC7C,IACA,EACR,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,MAAM,kBACO,YAAY,EACxB,SAAS,EAAC,UAAU,EACpB,OAAO,EAAE,SAAS,EAClB,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,YAEf,KAAC,KAAK,mBAAa,MAAM,GAAG,GACrB,CACV,CAAC,CAAC,CAAC,IAAI,IACF,CACT,CAAC;AACJ,CAAC"}
|
package/dist/ui/sonner.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Toaster as Sonner } from "sonner";
|
|
1
|
+
import { toast as sonnerToast, Toaster as Sonner } from "sonner";
|
|
2
2
|
type ToasterProps = React.ComponentProps<typeof Sonner>;
|
|
3
3
|
declare const Toaster: ({ className, toastOptions, ...props }: ToasterProps) => import("react").JSX.Element;
|
|
4
|
-
export { Toaster };
|
|
4
|
+
export { Toaster, sonnerToast };
|
|
5
5
|
//# sourceMappingURL=sonner.d.ts.map
|
package/dist/ui/sonner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonner.d.ts","sourceRoot":"","sources":["../../src/ui/sonner.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"sonner.d.ts","sourceRoot":"","sources":["../../src/ui/sonner.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIjE,KAAK,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC;AASxD,QAAA,MAAM,OAAO,0CAA2C,YAAY,gCAyCnE,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/ui/sonner.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useTheme } from "next-themes";
|
|
3
|
-
import { Toaster as Sonner } from "sonner";
|
|
3
|
+
import { toast as sonnerToast, Toaster as Sonner } from "sonner";
|
|
4
4
|
import { cn } from "../utils.js";
|
|
5
5
|
const toastWidthClasses = "group-[.toaster]:!w-[var(--width)] group-[.toaster]:!min-w-[min(20rem,calc(100vw_-_2rem))] group-[.toaster]:!max-w-[var(--width)] group-[.toaster]:!gap-3 group-[.toaster]:!break-normal";
|
|
6
6
|
const toastContentClasses = "group-[.toast]:!min-w-0 group-[.toast]:!flex-1 group-[.toast]:!basis-auto group-[.toast]:break-words";
|
|
@@ -21,5 +21,5 @@ const Toaster = ({ className, toastOptions, ...props }) => {
|
|
|
21
21
|
},
|
|
22
22
|
}, ...props }));
|
|
23
23
|
};
|
|
24
|
-
export { Toaster };
|
|
24
|
+
export { Toaster, sonnerToast };
|
|
25
25
|
//# sourceMappingURL=sonner.js.map
|
package/dist/ui/sonner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonner.js","sourceRoot":"","sources":["../../src/ui/sonner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"sonner.js","sourceRoot":"","sources":["../../src/ui/sonner.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEjE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAIjC,MAAM,iBAAiB,GACrB,0LAA0L,CAAC;AAC7L,MAAM,mBAAmB,GACvB,sGAAsG,CAAC;AACzG,MAAM,kBAAkB,GACtB,4DAA4D,CAAC;AAE/D,MAAM,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,KAAK,EAAgB,EAAE,EAAE;IACtE,MAAM,EAAE,KAAK,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,YAAY,EAAE,UAAU,CAAC;IAE5C,OAAO,CACL,KAAC,MAAM,IACL,KAAK,EAAE,KAA8B,EACrC,SAAS,EAAE,EAAE,CACX,uDAAuD,EACvD,SAAS,CACV,EACD,YAAY,EAAE;YACZ,GAAG,YAAY;YACf,UAAU,EAAE;gBACV,GAAG,UAAU;gBACb,KAAK,EAAE,EAAE,CACP,iBAAiB,EACjB,uIAAuI,EACvI,UAAU,EAAE,KAAK,CAClB;gBACD,KAAK,EAAE,EAAE,CAAC,4BAA4B,EAAE,UAAU,EAAE,KAAK,CAAC;gBAC1D,WAAW,EAAE,EAAE,CACb,iEAAiE,EACjE,UAAU,EAAE,WAAW,CACxB;gBACD,OAAO,EAAE,EAAE,CAAC,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC;gBACrD,YAAY,EAAE,EAAE,CACd,kBAAkB,EAClB,kEAAkE,EAClE,UAAU,EAAE,YAAY,CACzB;gBACD,YAAY,EAAE,EAAE,CACd,kBAAkB,EAClB,8DAA8D,EAC9D,UAAU,EAAE,YAAY,CACzB;aACF;SACF,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/toolkit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.217.0",
|
|
4
4
|
"description": "Reusable app-building UI and helpers for Agent-Native apps.",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -678,7 +678,7 @@
|
|
|
678
678
|
"y-protocols": "^1.0.7",
|
|
679
679
|
"yjs": "^13.6.33",
|
|
680
680
|
"zod": "^4.3.6",
|
|
681
|
-
"@agent-native/agentkit": "^0.
|
|
681
|
+
"@agent-native/agentkit": "^0.217.0"
|
|
682
682
|
},
|
|
683
683
|
"devDependencies": {
|
|
684
684
|
"@excalidraw/excalidraw": "0.18.1",
|
|
@@ -702,7 +702,7 @@
|
|
|
702
702
|
"typescript-7": "npm:typescript@^7.0.2",
|
|
703
703
|
"vite": "8.1.0",
|
|
704
704
|
"vitest": "^4.1.5",
|
|
705
|
-
"@agent-native/core": "^0.
|
|
705
|
+
"@agent-native/core": "^0.217.0"
|
|
706
706
|
},
|
|
707
707
|
"peerDependencies": {
|
|
708
708
|
"@agent-native/core": ">=0.205.1",
|
|
@@ -51,6 +51,7 @@ export function AgentChat(props: AgentChatProps) {
|
|
|
51
51
|
hasRenderedMessages,
|
|
52
52
|
emptyComposerPlacement,
|
|
53
53
|
autoScroll,
|
|
54
|
+
transcriptLayout,
|
|
54
55
|
className,
|
|
55
56
|
...rootProps
|
|
56
57
|
} = props;
|
|
@@ -79,6 +80,7 @@ export function AgentChat(props: AgentChatProps) {
|
|
|
79
80
|
hasRenderedMessages={hasRenderedMessages}
|
|
80
81
|
emptyComposerPlacement={emptyComposerPlacement}
|
|
81
82
|
autoScroll={autoScroll}
|
|
83
|
+
transcriptLayout={transcriptLayout}
|
|
82
84
|
className={className}
|
|
83
85
|
/>
|
|
84
86
|
</AgentKitRoot>
|
|
@@ -235,6 +235,113 @@ describe("AgentInteractionItem replay privacy", () => {
|
|
|
235
235
|
});
|
|
236
236
|
|
|
237
237
|
describe("AgentKitChat interactions", () => {
|
|
238
|
+
it("applies transcript layout values through clamped shared styles", async () => {
|
|
239
|
+
const client = new AgentKitClient({
|
|
240
|
+
transport: {
|
|
241
|
+
async startRun() {
|
|
242
|
+
return { runId: "run-transcript-layout" };
|
|
243
|
+
},
|
|
244
|
+
async *subscribeToRun() {},
|
|
245
|
+
async cancelRun() {},
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
const container = document.createElement("div");
|
|
249
|
+
document.body.appendChild(container);
|
|
250
|
+
const root = createRoot(container);
|
|
251
|
+
const actEnvironment = globalThis as typeof globalThis & {
|
|
252
|
+
IS_REACT_ACT_ENVIRONMENT?: boolean;
|
|
253
|
+
};
|
|
254
|
+
const previousActEnvironment = actEnvironment.IS_REACT_ACT_ENVIRONMENT;
|
|
255
|
+
actEnvironment.IS_REACT_ACT_ENVIRONMENT = true;
|
|
256
|
+
|
|
257
|
+
try {
|
|
258
|
+
await act(async () => {
|
|
259
|
+
root.render(
|
|
260
|
+
<AgentKitProvider controller={client} threadId="thread-layout">
|
|
261
|
+
<AgentKitChat
|
|
262
|
+
transcriptLayout={{
|
|
263
|
+
topInset: 5,
|
|
264
|
+
messageLaneWidth: 730,
|
|
265
|
+
messageLaneOffsetInline: -33,
|
|
266
|
+
messageGap: 12,
|
|
267
|
+
messageLineHeight: 20,
|
|
268
|
+
fontFamily: "IBM Plex Sans",
|
|
269
|
+
userBubbleLineHeight: 18,
|
|
270
|
+
userBubbleMaxWidth: 600,
|
|
271
|
+
userBubbleOffsetInline: -10,
|
|
272
|
+
userBubblePadding: { block: 8, inline: 13 },
|
|
273
|
+
}}
|
|
274
|
+
composerProps={{
|
|
275
|
+
autoFocus: false,
|
|
276
|
+
modelStatusChecksEnabled: false,
|
|
277
|
+
voiceEnabled: false,
|
|
278
|
+
}}
|
|
279
|
+
/>
|
|
280
|
+
</AgentKitProvider>,
|
|
281
|
+
);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
const transcript = container.querySelector<HTMLElement>(
|
|
285
|
+
".agentkit-transcript-content",
|
|
286
|
+
);
|
|
287
|
+
expect(transcript).not.toBeNull();
|
|
288
|
+
expect(
|
|
289
|
+
transcript!.style.getPropertyValue("--agentkit-transcript-top-inset"),
|
|
290
|
+
).toBe("5px");
|
|
291
|
+
expect(
|
|
292
|
+
transcript!.style.getPropertyValue("--agentkit-transcript-lane-width"),
|
|
293
|
+
).toBe("730px");
|
|
294
|
+
expect(
|
|
295
|
+
transcript!.style.getPropertyValue(
|
|
296
|
+
"--agentkit-transcript-lane-offset-inline",
|
|
297
|
+
),
|
|
298
|
+
).toBe("-33px");
|
|
299
|
+
expect(
|
|
300
|
+
transcript!.style.getPropertyValue("--agentkit-transcript-message-gap"),
|
|
301
|
+
).toBe("12px");
|
|
302
|
+
expect(
|
|
303
|
+
transcript!.style.getPropertyValue(
|
|
304
|
+
"--agentkit-transcript-message-line-height",
|
|
305
|
+
),
|
|
306
|
+
).toBe("20px");
|
|
307
|
+
expect(
|
|
308
|
+
transcript!.style.getPropertyValue("--agentkit-transcript-font-family"),
|
|
309
|
+
).toBe("IBM Plex Sans");
|
|
310
|
+
expect(
|
|
311
|
+
transcript!.style.getPropertyValue(
|
|
312
|
+
"--agentkit-user-bubble-line-height",
|
|
313
|
+
),
|
|
314
|
+
).toBe("18px");
|
|
315
|
+
expect(
|
|
316
|
+
transcript!.style.getPropertyValue("--agentkit-user-bubble-max-width"),
|
|
317
|
+
).toBe("600px");
|
|
318
|
+
expect(
|
|
319
|
+
transcript!.style.getPropertyValue(
|
|
320
|
+
"--agentkit-user-bubble-offset-inline",
|
|
321
|
+
),
|
|
322
|
+
).toBe("-10px");
|
|
323
|
+
expect(
|
|
324
|
+
transcript!.style.getPropertyValue(
|
|
325
|
+
"--agentkit-user-bubble-padding-block",
|
|
326
|
+
),
|
|
327
|
+
).toBe("8px");
|
|
328
|
+
expect(
|
|
329
|
+
transcript!.style.getPropertyValue(
|
|
330
|
+
"--agentkit-user-bubble-padding-inline",
|
|
331
|
+
),
|
|
332
|
+
).toBe("13px");
|
|
333
|
+
} finally {
|
|
334
|
+
await act(async () => root.unmount());
|
|
335
|
+
await client.shutdown();
|
|
336
|
+
container.remove();
|
|
337
|
+
if (previousActEnvironment === undefined) {
|
|
338
|
+
delete actEnvironment.IS_REACT_ACT_ENVIRONMENT;
|
|
339
|
+
} else {
|
|
340
|
+
actEnvironment.IS_REACT_ACT_ENVIRONMENT = previousActEnvironment;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
|
|
238
345
|
it("preserves host submission disablement", async () => {
|
|
239
346
|
const client = new AgentKitClient({
|
|
240
347
|
transport: {
|
|
@@ -407,7 +407,32 @@ describe("AgentKitChat", () => {
|
|
|
407
407
|
/\.agentkit-transcript \{[^}]*inline-size: min\(100%, 47rem\);/,
|
|
408
408
|
);
|
|
409
409
|
expect(styles).toMatch(
|
|
410
|
-
/\.agentkit-transcript-content \{[\s\S]*inline-size: min\(100%, 47rem\);[\s\S]*margin-inline: auto;[\s\S]*padding: 1\.5rem 1rem;/,
|
|
410
|
+
/\.agentkit-transcript-content \{[\s\S]*inline-size: min\(100%, var\(--agentkit-transcript-lane-width, 47rem\)\);[\s\S]*margin-inline: auto;[\s\S]*inset-inline-start: clamp\([\s\S]*var\(--agentkit-transcript-lane-offset-inline, 0px\),[\s\S]*padding: 1\.5rem 1rem;[\s\S]*padding-block-start: var\(--agentkit-transcript-top-inset, 1\.5rem\);/,
|
|
411
|
+
);
|
|
412
|
+
expect(styles).toContain(
|
|
413
|
+
"margin-block: 0 var(--agentkit-transcript-message-gap, 1.25rem);",
|
|
414
|
+
);
|
|
415
|
+
expect(styles).toMatch(
|
|
416
|
+
/font-family:\s*var\(\s*--agentkit-transcript-font-family,\s*var\(--font-sans,\s*inherit\)\s*\);/,
|
|
417
|
+
);
|
|
418
|
+
expect(styles).toContain(
|
|
419
|
+
"line-height: var(--agentkit-transcript-message-line-height, 1.52);",
|
|
420
|
+
);
|
|
421
|
+
expect(styles).toContain(
|
|
422
|
+
"--agentkit-user-bubble-line-height,\n var(--agentkit-transcript-message-line-height, 1.52)",
|
|
423
|
+
);
|
|
424
|
+
expect(styles).toContain("var(--agentkit-user-bubble-max-width, 38rem)");
|
|
425
|
+
expect(styles).toContain(
|
|
426
|
+
"var(--agentkit-user-bubble-padding-block, 0.625rem)",
|
|
427
|
+
);
|
|
428
|
+
expect(styles).toContain(
|
|
429
|
+
"var(--agentkit-user-bubble-padding-inline, 0.8125rem)",
|
|
430
|
+
);
|
|
431
|
+
expect(styles).toContain(
|
|
432
|
+
"inset-inline-start: var(--agentkit-user-bubble-offset-inline, 0px);",
|
|
433
|
+
);
|
|
434
|
+
expect(styles).toMatch(
|
|
435
|
+
/max-inline-size: min\([\s\S]*94%,[\s\S]*var\(--agentkit-user-bubble-max-width, 38rem\)/,
|
|
411
436
|
);
|
|
412
437
|
expect(styles).toContain("overflow-anchor: none;");
|
|
413
438
|
expect(styles).toMatch(
|
|
@@ -1773,6 +1798,7 @@ describe("AgentKitChat", () => {
|
|
|
1773
1798
|
client={client}
|
|
1774
1799
|
threadId="thread-slots"
|
|
1775
1800
|
load="manual"
|
|
1801
|
+
transcriptLayout={{ topInset: 7 }}
|
|
1776
1802
|
title="Release room"
|
|
1777
1803
|
toolbar={<button type="button">Share</button>}
|
|
1778
1804
|
labels={{ conversation: "Release conversation" }}
|
|
@@ -1832,6 +1858,7 @@ describe("AgentKitChat", () => {
|
|
|
1832
1858
|
expect(html).toContain(`data-slot="${slot}"`);
|
|
1833
1859
|
}
|
|
1834
1860
|
expect(html).toContain('aria-label="Release room"');
|
|
1861
|
+
expect(html).toContain("--agentkit-transcript-top-inset:7px");
|
|
1835
1862
|
expect(html).toContain("Check the deployment");
|
|
1836
1863
|
expect(html).not.toContain("private context");
|
|
1837
1864
|
expect(html).not.toContain("private slot context");
|
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
import {
|
|
41
41
|
createContext,
|
|
42
42
|
Component,
|
|
43
|
+
Fragment,
|
|
43
44
|
memo,
|
|
44
45
|
useCallback,
|
|
45
46
|
useContext,
|
|
@@ -49,6 +50,7 @@ import {
|
|
|
49
50
|
useRef,
|
|
50
51
|
useState,
|
|
51
52
|
type ComponentType,
|
|
53
|
+
type CSSProperties,
|
|
52
54
|
type ErrorInfo,
|
|
53
55
|
type KeyboardEvent as ReactKeyboardEvent,
|
|
54
56
|
type PointerEvent as ReactPointerEvent,
|
|
@@ -138,6 +140,11 @@ import {
|
|
|
138
140
|
} from "./context.js";
|
|
139
141
|
import { orderMessageContent } from "./message-content-order.js";
|
|
140
142
|
import { AgentStreamingText } from "./streaming-text.js";
|
|
143
|
+
import {
|
|
144
|
+
workedForRowChevronStyle,
|
|
145
|
+
workedForRowSummaryStyle,
|
|
146
|
+
type AgentChatTranscriptLayout,
|
|
147
|
+
} from "./transcript-layout.js";
|
|
141
148
|
|
|
142
149
|
// AgentKit React installs without @agent-native/core, so it repeats core's
|
|
143
150
|
// replay markers. Its specs assert core's attribute names.
|
|
@@ -1465,7 +1472,8 @@ export function AgentActivityGroup({
|
|
|
1465
1472
|
excludeAgentActivities?: boolean;
|
|
1466
1473
|
isCurrentSegment?: boolean;
|
|
1467
1474
|
}) {
|
|
1468
|
-
const { threadId, slots, registry, labels } =
|
|
1475
|
+
const { threadId, slots, registry, labels, formatWorkedForDuration } =
|
|
1476
|
+
useAgentKit();
|
|
1469
1477
|
const thread = useAgentThread();
|
|
1470
1478
|
const runEvents = runId
|
|
1471
1479
|
? thread.events.filter((event) => event.runId === runId)
|
|
@@ -1762,6 +1770,7 @@ export function AgentActivityGroup({
|
|
|
1762
1770
|
}
|
|
1763
1771
|
const hasExpandableActivity = displayGroups.length > 0;
|
|
1764
1772
|
const formatDuration = (ms: number) =>
|
|
1773
|
+
formatWorkedForDuration?.(ms) ??
|
|
1765
1774
|
formatAgentKitDuration(ms, {
|
|
1766
1775
|
hour: labels.durationHourShort,
|
|
1767
1776
|
minute: labels.durationMinuteShort,
|
|
@@ -1908,7 +1917,7 @@ function AgentWorkDisclosure({
|
|
|
1908
1917
|
current?: ReactNode;
|
|
1909
1918
|
children: ReactNode;
|
|
1910
1919
|
}) {
|
|
1911
|
-
const { slots } = useAgentKit();
|
|
1920
|
+
const { slots, workedForRowLayout } = useAgentKit();
|
|
1912
1921
|
const [open, setOpen] = useState(false);
|
|
1913
1922
|
const Summary = slots.workedForSummary;
|
|
1914
1923
|
return (
|
|
@@ -1921,6 +1930,7 @@ function AgentWorkDisclosure({
|
|
|
1921
1930
|
<summary
|
|
1922
1931
|
className="agentkit-activities-summary"
|
|
1923
1932
|
aria-disabled={!expandable}
|
|
1933
|
+
style={workedForRowSummaryStyle(workedForRowLayout)}
|
|
1924
1934
|
onClick={(event) => {
|
|
1925
1935
|
event.preventDefault();
|
|
1926
1936
|
if (!expandable) return;
|
|
@@ -1934,12 +1944,14 @@ function AgentWorkDisclosure({
|
|
|
1934
1944
|
expandable={expandable}
|
|
1935
1945
|
open={open}
|
|
1936
1946
|
current={current}
|
|
1947
|
+
layout={workedForRowLayout}
|
|
1937
1948
|
/>
|
|
1938
1949
|
) : (
|
|
1939
1950
|
<>
|
|
1940
1951
|
<IconChevronRight
|
|
1941
1952
|
aria-hidden="true"
|
|
1942
1953
|
className="agentkit-icon agentkit-summary-chevron"
|
|
1954
|
+
style={workedForRowChevronStyle(workedForRowLayout)}
|
|
1943
1955
|
/>
|
|
1944
1956
|
<span className="agentkit-activities-summary-content">
|
|
1945
1957
|
{label ? (
|
|
@@ -3798,11 +3810,15 @@ export function AgentMessageActions({
|
|
|
3798
3810
|
);
|
|
3799
3811
|
}
|
|
3800
3812
|
|
|
3813
|
+
const AgentKitPostWidgetTextContext =
|
|
3814
|
+
createContext<AgentChatTranscriptLayout["postWidgetText"]>(undefined);
|
|
3815
|
+
|
|
3801
3816
|
export function AgentMessageView({
|
|
3802
3817
|
value: message,
|
|
3803
3818
|
threadId,
|
|
3804
3819
|
}: AgentKitRenderProps<AgentMessage>) {
|
|
3805
3820
|
const { labels, slots, resolveMessageContentOrder } = useAgentKit();
|
|
3821
|
+
const postWidgetText = useContext(AgentKitPostWidgetTextContext);
|
|
3806
3822
|
const thread = useAgentThread(threadId);
|
|
3807
3823
|
const visibleMessage = stripAgentMessageContext(message);
|
|
3808
3824
|
const Supplement = slots.messageSupplement;
|
|
@@ -3843,6 +3859,7 @@ export function AgentMessageView({
|
|
|
3843
3859
|
<Supplement value={visibleMessage} threadId={threadId} />
|
|
3844
3860
|
) : null;
|
|
3845
3861
|
}
|
|
3862
|
+
let hasSeenWidget = false;
|
|
3846
3863
|
return (
|
|
3847
3864
|
<article
|
|
3848
3865
|
className="agentkit-message"
|
|
@@ -3852,20 +3869,39 @@ export function AgentMessageView({
|
|
|
3852
3869
|
aria-busy={message.status === "streaming"}
|
|
3853
3870
|
>
|
|
3854
3871
|
<div className="agentkit-message-content">
|
|
3855
|
-
{orderedContent.map((item, index) =>
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3865
|
-
|
|
3866
|
-
|
|
3867
|
-
|
|
3868
|
-
|
|
3872
|
+
{orderedContent.map((item, index) => {
|
|
3873
|
+
const isWidget =
|
|
3874
|
+
item.type === "widget" ||
|
|
3875
|
+
(item.type === "part" && item.part.type === "widget");
|
|
3876
|
+
const followsWidget =
|
|
3877
|
+
message.role === "assistant" &&
|
|
3878
|
+
postWidgetText !== undefined &&
|
|
3879
|
+
hasSeenWidget &&
|
|
3880
|
+
item.type === "part" &&
|
|
3881
|
+
item.part.type === "text";
|
|
3882
|
+
if (isWidget) hasSeenWidget = true;
|
|
3883
|
+
const content = (
|
|
3884
|
+
<AgentMessagePartView
|
|
3885
|
+
value={
|
|
3886
|
+
item.type === "widget"
|
|
3887
|
+
? { type: "widget", widget: item.widget }
|
|
3888
|
+
: item.part
|
|
3889
|
+
}
|
|
3890
|
+
threadId={threadId}
|
|
3891
|
+
active={message.status === "streaming"}
|
|
3892
|
+
resetKey={`${threadId}:${message.id}:${index}`}
|
|
3893
|
+
userMessage={message.role === "user"}
|
|
3894
|
+
/>
|
|
3895
|
+
);
|
|
3896
|
+
|
|
3897
|
+
return followsWidget ? (
|
|
3898
|
+
<div key={item.key} data-post-widget-text="true">
|
|
3899
|
+
{content}
|
|
3900
|
+
</div>
|
|
3901
|
+
) : (
|
|
3902
|
+
<Fragment key={item.key}>{content}</Fragment>
|
|
3903
|
+
);
|
|
3904
|
+
})}
|
|
3869
3905
|
{attachedAnnotations.length ? (
|
|
3870
3906
|
<div className="agentkit-annotations">
|
|
3871
3907
|
{attachedAnnotations.map((annotation) => (
|
|
@@ -4800,9 +4836,103 @@ export interface AgentKitChatProps {
|
|
|
4800
4836
|
emptyComposerPlacement?: "center" | "bottom";
|
|
4801
4837
|
/** Follow new output until the user deliberately scrolls away. */
|
|
4802
4838
|
autoScroll?: boolean;
|
|
4839
|
+
/** Optional transcript geometry. Omitted values keep the shared defaults. */
|
|
4840
|
+
transcriptLayout?: AgentChatTranscriptLayout;
|
|
4803
4841
|
className?: string;
|
|
4804
4842
|
}
|
|
4805
4843
|
|
|
4844
|
+
type AgentKitTranscriptContentStyle = CSSProperties & {
|
|
4845
|
+
"--agentkit-transcript-top-inset"?: string;
|
|
4846
|
+
"--agentkit-transcript-lane-width"?: string;
|
|
4847
|
+
"--agentkit-transcript-lane-offset-inline"?: string;
|
|
4848
|
+
"--agentkit-transcript-message-gap"?: string;
|
|
4849
|
+
"--agentkit-transcript-message-line-height"?: string;
|
|
4850
|
+
"--agentkit-transcript-font-family"?: string;
|
|
4851
|
+
"--agentkit-transcript-post-widget-text-color"?: string;
|
|
4852
|
+
"--agentkit-transcript-post-widget-paragraph-padding-block"?: string;
|
|
4853
|
+
"--agentkit-user-bubble-line-height"?: string;
|
|
4854
|
+
"--agentkit-user-bubble-max-width"?: string;
|
|
4855
|
+
"--agentkit-user-bubble-offset-inline"?: string;
|
|
4856
|
+
"--agentkit-user-bubble-padding-block"?: string;
|
|
4857
|
+
"--agentkit-user-bubble-padding-inline"?: string;
|
|
4858
|
+
};
|
|
4859
|
+
|
|
4860
|
+
function transcriptLength(value: number | undefined, name: string) {
|
|
4861
|
+
if (value === undefined) return undefined;
|
|
4862
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
4863
|
+
throw new RangeError(
|
|
4864
|
+
`transcriptLayout.${name} must be a non-negative number`,
|
|
4865
|
+
);
|
|
4866
|
+
}
|
|
4867
|
+
return `${value}px`;
|
|
4868
|
+
}
|
|
4869
|
+
|
|
4870
|
+
function transcriptOffset(value: number | undefined, name: string) {
|
|
4871
|
+
if (value === undefined) return undefined;
|
|
4872
|
+
if (!Number.isFinite(value)) {
|
|
4873
|
+
throw new RangeError(`transcriptLayout.${name} must be a finite number`);
|
|
4874
|
+
}
|
|
4875
|
+
return `${value}px`;
|
|
4876
|
+
}
|
|
4877
|
+
|
|
4878
|
+
function transcriptContentStyle(
|
|
4879
|
+
layout?: AgentChatTranscriptLayout,
|
|
4880
|
+
): AgentKitTranscriptContentStyle | undefined {
|
|
4881
|
+
if (!layout) return undefined;
|
|
4882
|
+
return {
|
|
4883
|
+
"--agentkit-transcript-top-inset": transcriptLength(
|
|
4884
|
+
layout.topInset,
|
|
4885
|
+
"topInset",
|
|
4886
|
+
),
|
|
4887
|
+
"--agentkit-transcript-lane-width": transcriptLength(
|
|
4888
|
+
layout.messageLaneWidth,
|
|
4889
|
+
"messageLaneWidth",
|
|
4890
|
+
),
|
|
4891
|
+
"--agentkit-transcript-lane-offset-inline": transcriptOffset(
|
|
4892
|
+
layout.messageLaneOffsetInline,
|
|
4893
|
+
"messageLaneOffsetInline",
|
|
4894
|
+
),
|
|
4895
|
+
"--agentkit-transcript-message-gap": transcriptLength(
|
|
4896
|
+
layout.messageGap,
|
|
4897
|
+
"messageGap",
|
|
4898
|
+
),
|
|
4899
|
+
"--agentkit-transcript-message-line-height": transcriptLength(
|
|
4900
|
+
layout.messageLineHeight,
|
|
4901
|
+
"messageLineHeight",
|
|
4902
|
+
),
|
|
4903
|
+
"--agentkit-transcript-font-family": layout.fontFamily,
|
|
4904
|
+
"--agentkit-transcript-post-widget-text-color":
|
|
4905
|
+
layout.postWidgetText?.tone === "muted"
|
|
4906
|
+
? "var(--agentkit-text-muted)"
|
|
4907
|
+
: undefined,
|
|
4908
|
+
"--agentkit-transcript-post-widget-paragraph-padding-block":
|
|
4909
|
+
transcriptLength(
|
|
4910
|
+
layout.postWidgetText?.paragraphPaddingBlock,
|
|
4911
|
+
"postWidgetText.paragraphPaddingBlock",
|
|
4912
|
+
),
|
|
4913
|
+
"--agentkit-user-bubble-line-height": transcriptLength(
|
|
4914
|
+
layout.userBubbleLineHeight,
|
|
4915
|
+
"userBubbleLineHeight",
|
|
4916
|
+
),
|
|
4917
|
+
"--agentkit-user-bubble-max-width": transcriptLength(
|
|
4918
|
+
layout.userBubbleMaxWidth,
|
|
4919
|
+
"userBubbleMaxWidth",
|
|
4920
|
+
),
|
|
4921
|
+
"--agentkit-user-bubble-offset-inline": transcriptOffset(
|
|
4922
|
+
layout.userBubbleOffsetInline,
|
|
4923
|
+
"userBubbleOffsetInline",
|
|
4924
|
+
),
|
|
4925
|
+
"--agentkit-user-bubble-padding-block": transcriptLength(
|
|
4926
|
+
layout.userBubblePadding?.block,
|
|
4927
|
+
"userBubblePadding.block",
|
|
4928
|
+
),
|
|
4929
|
+
"--agentkit-user-bubble-padding-inline": transcriptLength(
|
|
4930
|
+
layout.userBubblePadding?.inline,
|
|
4931
|
+
"userBubblePadding.inline",
|
|
4932
|
+
),
|
|
4933
|
+
};
|
|
4934
|
+
}
|
|
4935
|
+
|
|
4806
4936
|
const AGENTKIT_TRANSCRIPT_BOTTOM_THRESHOLD = 24;
|
|
4807
4937
|
const AGENTKIT_TRANSCRIPT_SCROLLBAR_IDLE_MS = 900;
|
|
4808
4938
|
const AGENTKIT_TRANSCRIPT_SCROLL_KEYS = new Set([
|
|
@@ -4832,6 +4962,7 @@ export function AgentKitChat({
|
|
|
4832
4962
|
hasRenderedMessages = false,
|
|
4833
4963
|
emptyComposerPlacement = "center",
|
|
4834
4964
|
autoScroll = true,
|
|
4965
|
+
transcriptLayout,
|
|
4835
4966
|
className,
|
|
4836
4967
|
}: AgentKitChatProps) {
|
|
4837
4968
|
const { threadId, slots, registry, labels, onThreadForked } = useAgentKit();
|
|
@@ -5582,12 +5713,17 @@ export function AgentKitChat({
|
|
|
5582
5713
|
<div
|
|
5583
5714
|
ref={transcriptContentRef}
|
|
5584
5715
|
className="agentkit-transcript-content"
|
|
5716
|
+
style={transcriptContentStyle(transcriptLayout)}
|
|
5585
5717
|
>
|
|
5586
5718
|
<AgentKitRegionSlot slot={Transcript} threadId={threadId}>
|
|
5587
5719
|
{!hasConversation && EmptyState ? (
|
|
5588
5720
|
<EmptyState threadId={threadId} />
|
|
5589
5721
|
) : null}
|
|
5590
|
-
|
|
5722
|
+
<AgentKitPostWidgetTextContext.Provider
|
|
5723
|
+
value={transcriptLayout?.postWidgetText}
|
|
5724
|
+
>
|
|
5725
|
+
{transcriptItems}
|
|
5726
|
+
</AgentKitPostWidgetTextContext.Provider>
|
|
5591
5727
|
{approvalEntries.map(([approvalId, request]) => (
|
|
5592
5728
|
<AgentKitSurfaceBoundary
|
|
5593
5729
|
key={`${threadId}:${approvalId}`}
|