@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.
Files changed (203) hide show
  1. package/agent-native.eject.json +5 -0
  2. package/dist/app/agentkit/react/chat.d.ts.map +1 -1
  3. package/dist/app/agentkit/react/chat.js +2 -2
  4. package/dist/app/agentkit/react/chat.js.map +1 -1
  5. package/dist/app/agentkit/react/components.d.ts +4 -1
  6. package/dist/app/agentkit/react/components.d.ts.map +1 -1
  7. package/dist/app/agentkit/react/components.js +69 -15
  8. package/dist/app/agentkit/react/components.js.map +1 -1
  9. package/dist/app/agentkit/react/context.d.ts +7 -1
  10. package/dist/app/agentkit/react/context.d.ts.map +1 -1
  11. package/dist/app/agentkit/react/context.js +5 -1
  12. package/dist/app/agentkit/react/context.js.map +1 -1
  13. package/dist/app/agentkit/react/index.d.ts +1 -0
  14. package/dist/app/agentkit/react/index.d.ts.map +1 -1
  15. package/dist/app/agentkit/react/index.js +1 -0
  16. package/dist/app/agentkit/react/index.js.map +1 -1
  17. package/dist/app/agentkit/react/root.d.ts +4 -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 +43 -6
  22. package/dist/app/agentkit/react/transcript-layout.d.ts +51 -0
  23. package/dist/app/agentkit/react/transcript-layout.d.ts.map +1 -0
  24. package/dist/app/agentkit/react/transcript-layout.js +34 -0
  25. package/dist/app/agentkit/react/transcript-layout.js.map +1 -0
  26. package/dist/app/auth/AuthPage.d.ts.map +1 -1
  27. package/dist/app/auth/AuthPage.js +33 -44
  28. package/dist/app/auth/AuthPage.js.map +1 -1
  29. package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
  30. package/dist/app/chat/AgentKitAssistantChat.js +3 -3
  31. package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
  32. package/dist/app/chat/AgentPanel.d.ts +2 -0
  33. package/dist/app/chat/AgentPanel.d.ts.map +1 -1
  34. package/dist/app/chat/AgentPanel.js +6 -2
  35. package/dist/app/chat/AgentPanel.js.map +1 -1
  36. package/dist/app/chat/chat/index.d.ts +2 -0
  37. package/dist/app/chat/chat/index.d.ts.map +1 -1
  38. package/dist/app/chat/chat/index.js.map +1 -1
  39. package/dist/app/chat/chat/surface-types.d.ts +7 -0
  40. package/dist/app/chat/chat/surface-types.d.ts.map +1 -1
  41. package/dist/app/chat/chat/surface-types.js.map +1 -1
  42. package/dist/app/chat/chat/tool-call-display.d.ts +7 -2
  43. package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
  44. package/dist/app/chat/chat/tool-call-display.js +10 -9
  45. package/dist/app/chat/chat/tool-call-display.js.map +1 -1
  46. package/dist/app/chat/chat/widgets/DataChartRenderer.d.ts.map +1 -1
  47. package/dist/app/chat/chat/widgets/DataChartRenderer.js +196 -26
  48. package/dist/app/chat/chat/widgets/DataChartRenderer.js.map +1 -1
  49. package/dist/app/chat/chat/widgets/DataChartWidget.d.ts.map +1 -1
  50. package/dist/app/chat/chat/widgets/DataChartWidget.js +5 -1
  51. package/dist/app/chat/chat/widgets/DataChartWidget.js.map +1 -1
  52. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts +2 -2
  53. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.d.ts.map +1 -1
  54. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js +6 -4
  55. package/dist/app/chat/chat/widgets/DataWidgetDisplayControls.js.map +1 -1
  56. package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
  57. package/dist/app/i18n/catalogs/ar-SA.js +1 -0
  58. package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
  59. package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
  60. package/dist/app/i18n/catalogs/de-DE.js +1 -0
  61. package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
  62. package/dist/app/i18n/catalogs/en-US.d.ts +1 -0
  63. package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
  64. package/dist/app/i18n/catalogs/en-US.js +1 -0
  65. package/dist/app/i18n/catalogs/en-US.js.map +1 -1
  66. package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
  67. package/dist/app/i18n/catalogs/es-ES.js +1 -0
  68. package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
  69. package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
  70. package/dist/app/i18n/catalogs/fr-FR.js +1 -0
  71. package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
  72. package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
  73. package/dist/app/i18n/catalogs/hi-IN.js +1 -0
  74. package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
  75. package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
  76. package/dist/app/i18n/catalogs/ja-JP.js +1 -0
  77. package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
  78. package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
  79. package/dist/app/i18n/catalogs/ko-KR.js +1 -0
  80. package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
  81. package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
  82. package/dist/app/i18n/catalogs/pt-BR.js +1 -0
  83. package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
  84. package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
  85. package/dist/app/i18n/catalogs/zh-CN.js +1 -0
  86. package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
  87. package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
  88. package/dist/app/i18n/catalogs/zh-TW.js +1 -0
  89. package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
  90. package/dist/app/onboarding/GettingStartedCard.d.ts +35 -0
  91. package/dist/app/onboarding/GettingStartedCard.d.ts.map +1 -0
  92. package/dist/app/onboarding/GettingStartedCard.js +38 -0
  93. package/dist/app/onboarding/GettingStartedCard.js.map +1 -0
  94. package/dist/app/onboarding/index.d.ts +1 -0
  95. package/dist/app/onboarding/index.d.ts.map +1 -1
  96. package/dist/app/onboarding/index.js +1 -0
  97. package/dist/app/onboarding/index.js.map +1 -1
  98. package/dist/app/providers/AppProviders.d.ts.map +1 -1
  99. package/dist/app/providers/AppProviders.js +3 -1
  100. package/dist/app/providers/AppProviders.js.map +1 -1
  101. package/dist/app/settings/AccountSettingsCard.d.ts.map +1 -1
  102. package/dist/app/settings/AccountSettingsCard.js +2 -1
  103. package/dist/app/settings/AccountSettingsCard.js.map +1 -1
  104. package/dist/app/settings/index.d.ts +1 -0
  105. package/dist/app/settings/index.d.ts.map +1 -1
  106. package/dist/app/settings/index.js +1 -0
  107. package/dist/app/settings/index.js.map +1 -1
  108. package/dist/app/settings/shell/SettingsShell.d.ts +40 -1
  109. package/dist/app/settings/shell/SettingsShell.d.ts.map +1 -1
  110. package/dist/app/settings/shell/SettingsShell.js +87 -20
  111. package/dist/app/settings/shell/SettingsShell.js.map +1 -1
  112. package/dist/app/settings/shell/bridge.d.ts +5 -3
  113. package/dist/app/settings/shell/bridge.d.ts.map +1 -1
  114. package/dist/app/settings/shell/bridge.js +8 -5
  115. package/dist/app/settings/shell/bridge.js.map +1 -1
  116. package/dist/app/settings/shell/index.d.ts +2 -2
  117. package/dist/app/settings/shell/index.d.ts.map +1 -1
  118. package/dist/app/settings/shell/index.js.map +1 -1
  119. package/dist/app/settings/shell/registry.d.ts +9 -1
  120. package/dist/app/settings/shell/registry.d.ts.map +1 -1
  121. package/dist/app/settings/shell/registry.js +16 -0
  122. package/dist/app/settings/shell/registry.js.map +1 -1
  123. package/dist/app/settings/shell/routing.d.ts +5 -4
  124. package/dist/app/settings/shell/routing.d.ts.map +1 -1
  125. package/dist/app/settings/shell/routing.js +38 -10
  126. package/dist/app/settings/shell/routing.js.map +1 -1
  127. package/dist/app/shared/CommandMenu.d.ts +86 -6
  128. package/dist/app/shared/CommandMenu.d.ts.map +1 -1
  129. package/dist/app/shared/CommandMenu.js +303 -41
  130. package/dist/app/shared/CommandMenu.js.map +1 -1
  131. package/dist/app/shared/ConsentBanner.d.ts +9 -0
  132. package/dist/app/shared/ConsentBanner.d.ts.map +1 -0
  133. package/dist/app/shared/ConsentBanner.js +35 -0
  134. package/dist/app/shared/ConsentBanner.js.map +1 -0
  135. package/dist/composer/ComposerContextBanner.d.ts +3 -1
  136. package/dist/composer/ComposerContextBanner.d.ts.map +1 -1
  137. package/dist/composer/ComposerContextBanner.js +2 -2
  138. package/dist/composer/ComposerContextBanner.js.map +1 -1
  139. package/dist/ui/sonner.d.ts +2 -2
  140. package/dist/ui/sonner.d.ts.map +1 -1
  141. package/dist/ui/sonner.js +2 -2
  142. package/dist/ui/sonner.js.map +1 -1
  143. package/package.json +3 -3
  144. package/src/app/agentkit/react/chat.tsx +2 -0
  145. package/src/app/agentkit/react/components.interaction.spec.tsx +107 -0
  146. package/src/app/agentkit/react/components.spec.tsx +28 -1
  147. package/src/app/agentkit/react/components.tsx +153 -17
  148. package/src/app/agentkit/react/context.tsx +12 -0
  149. package/src/app/agentkit/react/index.ts +1 -0
  150. package/src/app/agentkit/react/lifecycle.spec.tsx +186 -16
  151. package/src/app/agentkit/react/root.tsx +7 -0
  152. package/src/app/agentkit/react/styles.css +43 -6
  153. package/src/app/agentkit/react/transcript-layout.spec.ts +72 -0
  154. package/src/app/agentkit/react/transcript-layout.ts +97 -0
  155. package/src/app/auth/AuthPage.attribution.spec.tsx +6 -0
  156. package/src/app/auth/AuthPage.interaction.spec.tsx +74 -0
  157. package/src/app/auth/AuthPage.tsx +32 -39
  158. package/src/app/chat/AgentKitAssistantChat.spec.tsx +39 -0
  159. package/src/app/chat/AgentKitAssistantChat.tsx +5 -0
  160. package/src/app/chat/AgentPanel.page-header-share.spec.tsx +101 -0
  161. package/src/app/chat/AgentPanel.tsx +14 -2
  162. package/src/app/chat/chat/index.ts +2 -0
  163. package/src/app/chat/chat/surface-types.ts +10 -0
  164. package/src/app/chat/chat/tool-call-display.spec.tsx +83 -0
  165. package/src/app/chat/chat/tool-call-display.tsx +40 -8
  166. package/src/app/chat/chat/widgets/DataChartRenderer.spec.tsx +632 -0
  167. package/src/app/chat/chat/widgets/DataChartRenderer.tsx +308 -51
  168. package/src/app/chat/chat/widgets/DataChartWidget.spec.tsx +126 -23
  169. package/src/app/chat/chat/widgets/DataChartWidget.tsx +10 -0
  170. package/src/app/chat/chat/widgets/DataWidgetDisplayControls.tsx +26 -6
  171. package/src/app/i18n/catalogs/ar-SA.ts +1 -0
  172. package/src/app/i18n/catalogs/de-DE.ts +2 -0
  173. package/src/app/i18n/catalogs/en-US.ts +2 -0
  174. package/src/app/i18n/catalogs/es-ES.ts +2 -0
  175. package/src/app/i18n/catalogs/fr-FR.ts +2 -0
  176. package/src/app/i18n/catalogs/hi-IN.ts +1 -0
  177. package/src/app/i18n/catalogs/ja-JP.ts +2 -0
  178. package/src/app/i18n/catalogs/ko-KR.ts +1 -0
  179. package/src/app/i18n/catalogs/pt-BR.ts +2 -0
  180. package/src/app/i18n/catalogs/zh-CN.ts +1 -0
  181. package/src/app/i18n/catalogs/zh-TW.ts +1 -0
  182. package/src/app/onboarding/GettingStartedCard.tsx +203 -0
  183. package/src/app/onboarding/index.ts +1 -0
  184. package/src/app/providers/AppProviders.tsx +7 -1
  185. package/src/app/settings/AccountSettingsCard.spec.tsx +31 -0
  186. package/src/app/settings/AccountSettingsCard.tsx +8 -0
  187. package/src/app/settings/index.ts +1 -0
  188. package/src/app/settings/shell/SettingsShell.spec.tsx +472 -1
  189. package/src/app/settings/shell/SettingsShell.tsx +245 -31
  190. package/src/app/settings/shell/bridge.spec.ts +12 -0
  191. package/src/app/settings/shell/bridge.ts +17 -4
  192. package/src/app/settings/shell/index.ts +6 -1
  193. package/src/app/settings/shell/registry.ts +33 -1
  194. package/src/app/settings/shell/routing.spec.ts +92 -1
  195. package/src/app/settings/shell/routing.ts +52 -9
  196. package/src/app/shared/CommandMenu.spec.tsx +1662 -1
  197. package/src/app/shared/CommandMenu.tsx +763 -164
  198. package/src/app/shared/ConsentBanner.spec.tsx +141 -0
  199. package/src/app/shared/ConsentBanner.tsx +141 -0
  200. package/src/composer/ComposerContextBanner.spec.tsx +31 -5
  201. package/src/composer/ComposerContextBanner.tsx +7 -2
  202. package/src/ui/sonner.spec.ts +10 -0
  203. 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,+BAsC5B"}
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;AAmBjC,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,EACpC,SAAS,EACT,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,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,UAAU,EACpB,OAAO,EAAE,YAAY,EACrB,IAAI,EAAC,IAAI,EACT,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,SAAS,aAEhB,eAAe,EAChB,KAAC,QAAQ,mBAAa,MAAM,GAAG,IACxB,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"}
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"}
@@ -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
@@ -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;AAI3C,KAAK,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC;AASxD,QAAA,MAAM,OAAO,0CAA2C,YAAY,gCAyCnE,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,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
@@ -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;AAE3C,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,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.214.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.214.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.214.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 } = useAgentKit();
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
- <AgentMessagePartView
3857
- key={item.key}
3858
- value={
3859
- item.type === "widget"
3860
- ? { type: "widget", widget: item.widget }
3861
- : item.part
3862
- }
3863
- threadId={threadId}
3864
- active={message.status === "streaming"}
3865
- resetKey={`${threadId}:${message.id}:${index}`}
3866
- userMessage={message.role === "user"}
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
- {transcriptItems}
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}`}