@runtypelabs/persona 4.23.2 → 4.24.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 (156) hide show
  1. package/dist/animations/glyph-cycle.d.cts +1 -1
  2. package/dist/animations/glyph-cycle.d.ts +1 -1
  3. package/dist/animations/{types-CI7OckWI.d.cts → types-Db61aI9J.d.cts} +2 -0
  4. package/dist/animations/{types-CI7OckWI.d.ts → types-Db61aI9J.d.ts} +2 -0
  5. package/dist/animations/wipe.d.cts +1 -1
  6. package/dist/animations/wipe.d.ts +1 -1
  7. package/dist/animations-extra.d.cts +2 -0
  8. package/dist/animations-extra.d.ts +2 -0
  9. package/dist/approval-ui-3NMYNXBD.js +1 -0
  10. package/dist/approval-ui.cjs +2 -2
  11. package/dist/approval-ui.d.cts +215 -37
  12. package/dist/approval-ui.d.ts +215 -37
  13. package/dist/approval-ui.js +2 -2
  14. package/dist/{artifacts-ui-F4N6VMKF.js → artifacts-ui-IGB5YKLO.js} +4 -4
  15. package/dist/artifacts-ui.d.cts +210 -25
  16. package/dist/artifacts-ui.d.ts +210 -25
  17. package/dist/{chunk-NIKYKSNZ.js → chunk-7CO4T5KB.js} +1 -1
  18. package/dist/codegen.cjs +11 -11
  19. package/dist/codegen.js +13 -13
  20. package/dist/context-mentions.d.cts +210 -25
  21. package/dist/context-mentions.d.ts +210 -25
  22. package/dist/event-stream-view.d.cts +210 -25
  23. package/dist/event-stream-view.d.ts +210 -25
  24. package/dist/forms-ui.d.cts +245 -27
  25. package/dist/forms-ui.d.ts +245 -27
  26. package/dist/history-view.d.cts +2 -0
  27. package/dist/history-view.d.ts +2 -0
  28. package/dist/index.cjs +70 -69
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.cts +270 -39
  31. package/dist/index.d.ts +270 -39
  32. package/dist/index.global.js +57 -54
  33. package/dist/index.global.js.map +1 -1
  34. package/dist/index.js +70 -69
  35. package/dist/index.js.map +1 -1
  36. package/dist/install.global.js +1 -1
  37. package/dist/install.global.js.map +1 -1
  38. package/dist/launcher.global.js +2 -2
  39. package/dist/launcher.global.js.map +1 -1
  40. package/dist/session-reconnect.d.cts +210 -25
  41. package/dist/session-reconnect.d.ts +210 -25
  42. package/dist/smart-dom-reader.d.cts +210 -25
  43. package/dist/smart-dom-reader.d.ts +210 -25
  44. package/dist/theme-editor-preview.cjs +74 -73
  45. package/dist/theme-editor-preview.d.cts +217 -25
  46. package/dist/theme-editor-preview.d.ts +217 -25
  47. package/dist/theme-editor-preview.js +51 -50
  48. package/dist/theme-editor.cjs +10 -10
  49. package/dist/theme-editor.d.cts +230 -27
  50. package/dist/theme-editor.d.ts +230 -27
  51. package/dist/theme-editor.js +10 -10
  52. package/dist/theme-reference.cjs +1 -1
  53. package/dist/theme-reference.d.cts +1522 -11
  54. package/dist/theme-reference.d.ts +1522 -11
  55. package/dist/theme-reference.js +1 -1
  56. package/dist/widget.css +1 -1
  57. package/package.json +3 -2
  58. package/src/__fixtures__/defaults-parity.v4.json +776 -0
  59. package/src/approval-ui-entry.ts +0 -1
  60. package/src/approval-ui-loader.ts +5 -4
  61. package/src/approval-ui.ts +0 -1
  62. package/src/client-identity-proof.test.ts +193 -0
  63. package/src/client-session-warm.test.ts +216 -0
  64. package/src/client-visitor-history.test.ts +6 -0
  65. package/src/client.ts +122 -30
  66. package/src/codegen.test.ts +24 -0
  67. package/src/components/activity-row.test.ts +100 -0
  68. package/src/components/activity-row.ts +136 -0
  69. package/src/components/approval-actions.test.ts +8 -5
  70. package/src/components/approval-actions.ts +19 -6
  71. package/src/components/approval-bubble.test.ts +56 -9
  72. package/src/components/approval-bubble.ts +36 -41
  73. package/src/components/composer-builder.ts +5 -2
  74. package/src/components/composer-parts.ts +10 -2
  75. package/src/components/header-builder.test.ts +32 -0
  76. package/src/components/header-builder.ts +7 -4
  77. package/src/components/header-layouts.test.ts +12 -0
  78. package/src/components/header-layouts.ts +3 -2
  79. package/src/components/launcher.ts +11 -2
  80. package/src/components/message-bubble.test.ts +22 -0
  81. package/src/components/message-bubble.ts +7 -3
  82. package/src/components/panel.test.ts +52 -1
  83. package/src/components/panel.ts +47 -8
  84. package/src/components/pill-composer-builder.test.ts +2 -0
  85. package/src/components/pill-composer-builder.ts +0 -1
  86. package/src/components/reasoning-bubble.ts +29 -17
  87. package/src/components/suggestions.test.ts +1 -0
  88. package/src/components/suggestions.ts +0 -16
  89. package/src/components/tool-bubble.ts +131 -114
  90. package/src/components/tool-details.test.ts +87 -0
  91. package/src/components/tool-details.ts +102 -0
  92. package/src/components/welcome.test.ts +8 -0
  93. package/src/components/welcome.ts +4 -2
  94. package/src/defaults-parity.test.ts +158 -0
  95. package/src/defaults.test.ts +69 -0
  96. package/src/defaults.ts +128 -49
  97. package/src/generated/runtype-openapi-contract.ts +2 -2
  98. package/src/index-core.ts +2 -0
  99. package/src/install.test.ts +24 -0
  100. package/src/install.ts +3 -1
  101. package/src/launcher-global.ts +2 -1
  102. package/src/launcher-variants.test.ts +52 -0
  103. package/src/runtime/init-update-reset.test.ts +21 -0
  104. package/src/session.ts +29 -6
  105. package/src/styles/widget-styles.test.ts +19 -0
  106. package/src/styles/widget.css +295 -23
  107. package/src/theme-editor/index.ts +2 -0
  108. package/src/theme-editor/preview-utils.test.ts +8 -0
  109. package/src/theme-editor/preview-utils.ts +7 -3
  110. package/src/theme-editor/sections.test.ts +31 -0
  111. package/src/theme-editor/sections.ts +55 -1
  112. package/src/theme-editor/state-preferences.test.ts +49 -0
  113. package/src/theme-editor/state.ts +73 -15
  114. package/src/theme-reference.test.ts +20 -0
  115. package/src/theme-reference.ts +11 -5
  116. package/src/tool-call-display-defaults.test.ts +33 -1
  117. package/src/types/theme.ts +80 -3
  118. package/src/types.ts +136 -22
  119. package/src/ui.activity-row.test.ts +91 -0
  120. package/src/ui.approval-plugin.test.ts +63 -0
  121. package/src/ui.composer-compact.test.ts +24 -2
  122. package/src/ui.composer-placement.test.ts +23 -0
  123. package/src/ui.detached-panel.test.ts +33 -6
  124. package/src/ui.docked.test.ts +19 -0
  125. package/src/ui.header-update-stability.test.ts +25 -0
  126. package/src/ui.identity-proof.test.ts +58 -0
  127. package/src/ui.launcher-teaser.test.ts +25 -0
  128. package/src/ui.message-width.test.ts +17 -2
  129. package/src/ui.reasoning-display.test.ts +92 -0
  130. package/src/ui.rebuild-composer.test.ts +20 -3
  131. package/src/ui.scroll.test.ts +32 -0
  132. package/src/ui.session-init.test.ts +312 -0
  133. package/src/ui.status-indicator.test.ts +82 -0
  134. package/src/ui.suggest-replies.test.ts +11 -0
  135. package/src/ui.ts +363 -74
  136. package/src/ui.v5-defaults.test.ts +144 -0
  137. package/src/ui.welcome.test.ts +92 -3
  138. package/src/utils/__snapshots__/tokens-parity.test.ts.snap +811 -140
  139. package/src/utils/code-generators.ts +14 -0
  140. package/src/utils/composer-compact.test.ts +0 -2
  141. package/src/utils/composer-compact.ts +2 -4
  142. package/src/utils/composer-placement.ts +2 -3
  143. package/src/utils/config-merge.test.ts +81 -5
  144. package/src/utils/config-merge.ts +13 -3
  145. package/src/utils/defaults-provenance.ts +67 -0
  146. package/src/utils/dock.ts +7 -1
  147. package/src/utils/launcher-variant.ts +16 -0
  148. package/src/utils/panel-config.ts +97 -0
  149. package/src/utils/status-indicator.ts +39 -0
  150. package/src/utils/theme.test.ts +182 -0
  151. package/src/utils/theme.ts +131 -18
  152. package/src/utils/tokens.test.ts +122 -1
  153. package/src/utils/tokens.ts +177 -17
  154. package/src/welcome.test.ts +23 -0
  155. package/src/welcome.ts +16 -9
  156. package/dist/approval-ui-K7R5Q5OC.js +0 -1
@@ -21,6 +21,7 @@ interface ResolvedWelcomeConfig {
21
21
  * Optional on the interface, always populated by `resolveWelcomeConfig`:
22
22
  * a plugin literal built against an older minor must still type-check.
23
23
  */
24
+ layout?: "top" | "centered";
24
25
  anchor?: AgentWidgetWelcomeAnchor;
25
26
  /** Percentage string; validated, falls back to "44%". */
26
27
  anchorComposerTop?: string;
@@ -792,6 +793,8 @@ interface InputTokens extends ComponentTokenSet {
792
793
  backdropFilter?: string;
793
794
  }
794
795
  interface LauncherTokens extends ComponentTokenSet {
796
+ /** Distance from the viewport edges. Circle default: 20px; pill: 24px. */
797
+ offset?: string;
795
798
  size: string;
796
799
  iconSize: string;
797
800
  shadow: TokenReference<'shadow'>;
@@ -814,6 +817,15 @@ interface PanelTokens extends ComponentTokenSet {
814
817
  inset?: string;
815
818
  /** Background of the region revealed behind a detached panel. */
816
819
  canvasBackground?: string;
820
+ /** Chrome defaults by rendered panel mode. */
821
+ modes?: Partial<Record<'floating' | 'inline' | 'sidebar' | 'docked' | 'mobile', {
822
+ /** Full border shorthand (for example, `"1px solid var(--persona-border)"`). */
823
+ border?: string;
824
+ /** Box-shadow token reference or raw CSS shadow. */
825
+ shadow?: string;
826
+ /** Corner radius token reference or raw CSS radius. */
827
+ borderRadius?: TokenReference<'radius'>;
828
+ }>>;
817
829
  }
818
830
  /** Per-element text styling shared by themable text surfaces. */
819
831
  interface TextStyleTokens {
@@ -840,10 +852,16 @@ interface HeaderTokens extends ComponentTokenSet {
840
852
  */
841
853
  border?: TokenReference<'color'>;
842
854
  borderRadius: TokenReference<'radius'>;
855
+ /** Standard-header padding. @default "20px 24px" */
856
+ padding?: string;
857
+ /** Minimal-header padding. Explicitly wins over `padding`. @default "16px 24px" */
858
+ minimalPadding?: string;
843
859
  /** Background of the rounded avatar tile next to the title (Lucide / emoji / image). */
844
860
  iconBackground: TokenReference<'color'>;
845
861
  /** Foreground (glyph stroke or emoji text) on the header avatar tile. */
846
862
  iconForeground: TokenReference<'color'>;
863
+ /** Header identity glyph size as a fraction of its icon box. @default "0.6" */
864
+ iconScale?: string;
847
865
  /**
848
866
  * Legacy alias of `title.color`; `title.color` wins when both are set.
849
867
  * Unset, the title takes `foreground`, then the primary color.
@@ -882,6 +900,14 @@ interface HeaderTokens extends ComponentTokenSet {
882
900
  * sibling. @default "1.5"
883
901
  */
884
902
  controlStrokeWidth?: string;
903
+ /** Header control corner radius. Per-control radius overrides win. */
904
+ controlBorderRadius?: string;
905
+ /** Default control hover/focus fill. Explicit button backgrounds win. */
906
+ controlHoverBackground?: TokenReference<'color'>;
907
+ /** Default control hover/focus icon color. Explicit button colors win. */
908
+ controlHoverForeground?: TokenReference<'color'>;
909
+ /** Keyboard focus outline; unset preserves the browser default. */
910
+ controlFocusOutline?: string;
885
911
  /** Box-shadow on the header (e.g., a fade shadow to replace the default border). */
886
912
  shadow?: string;
887
913
  /** Override the header bottom border (e.g., `none`). */
@@ -1056,6 +1082,12 @@ interface MessageGeometryTokens {
1056
1082
  lineHeight?: string;
1057
1083
  }
1058
1084
  interface MessageTokens {
1085
+ /** Height of the optional transcript top fade. Default 18px. */
1086
+ topFadeHeight?: string;
1087
+ /** Vertical gap between transcript turns. @default "12px" */
1088
+ gap?: string;
1089
+ /** Gap between turns in fullscreen mode; falls back to `gap`. */
1090
+ fullscreenGap?: string;
1059
1091
  user: MessageGeometryTokens & {
1060
1092
  background: TokenReference<'color'>;
1061
1093
  text: TokenReference<'color'>;
@@ -1069,6 +1101,8 @@ interface MessageTokens {
1069
1101
  borderRadius: TokenReference<'radius'>;
1070
1102
  /** Assistant bubble border color (CSS color). */
1071
1103
  border?: TokenReference<'color'>;
1104
+ /** Border width; set to 0px for a flat assistant response. @default "1px" */
1105
+ borderWidth?: string;
1072
1106
  /** Assistant bubble box-shadow (token ref or raw CSS, e.g. `none`). */
1073
1107
  shadow?: string;
1074
1108
  };
@@ -1187,12 +1221,40 @@ interface AttachmentTokens {
1187
1221
  };
1188
1222
  }
1189
1223
  /** Tool-call row chrome (collapsible tool bubbles). */
1190
- interface ToolBubbleTokens {
1224
+ interface ActivityTokens {
1225
+ /** Minimum activity row height. */
1226
+ rowHeight?: string;
1227
+ /** Group child indentation; falls back to indent when unset. V5: 0px. */
1228
+ groupIndent?: string;
1229
+ /** Extra vertical gap between grouped rows. V5: 0px. */
1230
+ groupGap?: string;
1231
+ /** Padding around expanded group children. V5: 0px. */
1232
+ groupPadding?: string;
1233
+ /** Gap between consecutive activity entries. V5: 0px. */
1234
+ transcriptGap?: string;
1235
+ /** Gap from activity to an assistant response. V5: 12px. */
1236
+ responseGap?: string;
1237
+ /** Expanded body padding. V5: 4px 0. */
1238
+ bodyPadding?: string;
1239
+ /** Expanded reasoning text size. V5: 13px. */
1240
+ bodySize?: string;
1241
+ /** Expanded reasoning line height. V5: 1.5. */
1242
+ bodyLineHeight?: string;
1243
+ /** Expanded reasoning font weight. V5: 400. */
1244
+ bodyFontWeight?: string;
1245
+ /** Gap between expanded detail sections. V5: 8px. */
1246
+ sectionGap?: string;
1247
+ labelSize?: string;
1248
+ iconSize?: string;
1249
+ indent?: string;
1250
+ bodySurface?: TokenReference<'color'>;
1251
+ }
1252
+ interface ToolBubbleTokens extends ActivityTokens {
1191
1253
  /** Box-shadow for tool bubbles (token ref or raw CSS, e.g. `none`). */
1192
1254
  shadow: string;
1193
1255
  }
1194
1256
  /** Reasoning / “thinking” row chrome. */
1195
- interface ReasoningBubbleTokens {
1257
+ interface ReasoningBubbleTokens extends ActivityTokens {
1196
1258
  shadow: string;
1197
1259
  }
1198
1260
  /** One event-stream badge chip: fill + text pair. The chip border derives
@@ -1326,6 +1388,10 @@ interface ComposerChromeTokens {
1326
1388
  shadow: string;
1327
1389
  /** Border color of the composer form. @default semantic.colors.border */
1328
1390
  borderColor?: TokenReference<'color'>;
1391
+ /** Focused form border color; falls back to borderColor. V5: a stronger neutral border. */
1392
+ focusBorderColor?: TokenReference<'color'>;
1393
+ /** Outer focus ring (CSS outline shorthand). V4: none; V5: a thin neutral ring. */
1394
+ focusRing?: string;
1329
1395
  /** Inner padding of the composer form (raw CSS shorthand). @default "0.75rem 1rem" */
1330
1396
  padding?: string;
1331
1397
  /** Gap between the textarea row and the actions row. @default "0.5rem" */
@@ -1344,12 +1410,18 @@ interface ComposerChromeTokens {
1344
1410
  controlSize?: string;
1345
1411
  /** Glyph box inside those controls. @default "24px" */
1346
1412
  controlIconSize?: string;
1413
+ /** Send/stop glyph size. Explicit sendButton.iconSize wins. V5: 18px. */
1414
+ sendIconSize?: string;
1415
+ /** Icon-mode submit button radius. V4 inherits the primary button; V5: 9999px. */
1416
+ sendButtonRadius?: string;
1417
+ /** Footer top border (CSS shorthand). V4: 1px solid divider; V5: none. */
1418
+ footerBorder?: string;
1347
1419
  /**
1348
1420
  * Background painted behind an overlaid composer footer
1349
1421
  * (`composer.placement: "overlay"`). Any CSS `background` value, gradients
1350
1422
  * included — same convention as the shadow tokens. Inert under
1351
1423
  * `placement: "block"`.
1352
- * @default "transparent"
1424
+ * @default "transparent" (V4); a theme-aware 24px fade (V5)
1353
1425
  */
1354
1426
  overlayBand?: string;
1355
1427
  /** Segmented mode-group track. */
@@ -1525,6 +1597,8 @@ interface ScrollToBottomTokens extends ComponentTokenSet {
1525
1597
  }
1526
1598
  /** Visual tokens shared by one suggestion presentation variant. */
1527
1599
  interface SuggestionVariantTokens extends ComponentTokenSet {
1600
+ /** Label weight. V4: 500; V5: 400. */
1601
+ fontWeight?: string;
1528
1602
  /** Space inside one item, between its icon and its copy. */
1529
1603
  gap?: string;
1530
1604
  /** Space between suggestion items in the container. */
@@ -1573,6 +1647,7 @@ interface ComponentTokens {
1573
1647
  voice: VoiceTokens;
1574
1648
  approval: ApprovalTokens;
1575
1649
  attachment: AttachmentTokens;
1650
+ activity?: ActivityTokens;
1576
1651
  toolBubble: ToolBubbleTokens;
1577
1652
  reasoningBubble: ReasoningBubbleTokens;
1578
1653
  /** Event-stream inspector badge chips. */
@@ -4436,6 +4511,14 @@ type AgentWidgetToolCallCollapsedMode = "tool-call" | "tool-name" | "tool-previe
4436
4511
  */
4437
4512
  type AgentWidgetToolCallLoadingAnimation = "none" | "pulse" | "shimmer" | "shimmer-color" | "rainbow";
4438
4513
  type AgentWidgetToolCallDisplayFeature = {
4514
+ /** Activity chrome. Defaults to card in V4 and row with future.v5Defaults. */
4515
+ variant?: "card" | "row";
4516
+ /** Row status icons: always, active/attention-needed only, or never. V5 defaults to active; V4 to always. */
4517
+ iconVisibility?: "always" | "active" | "never";
4518
+ /** Row variant: open when the first content chunk arrives. Default false in V5; true in V4. */
4519
+ autoExpand?: boolean;
4520
+ /** Row variant: collapse once after completion, in ms; false disables. Default 1000. */
4521
+ autoCollapseDelay?: number | false;
4439
4522
  /**
4440
4523
  * Controls what collapsed tool call rows show in their header/summary area.
4441
4524
  * @default "tool-call"
@@ -4466,9 +4549,10 @@ type AgentWidgetToolCallDisplayFeature = {
4466
4549
  * Controls how a grouped tool sequence is rendered.
4467
4550
  * - `"stack"`: show the group summary and each child tool row.
4468
4551
  * - `"summary"`: show one consolidated summary row only.
4552
+ * - `"collapsible"`: expandable activity group (V5 default).
4469
4553
  * @default "stack"
4470
4554
  */
4471
- groupedMode?: "stack" | "summary";
4555
+ groupedMode?: "stack" | "summary" | "collapsible";
4472
4556
  /**
4473
4557
  * What happens to a tool call row once it completes.
4474
4558
  *
@@ -4499,6 +4583,14 @@ type AgentWidgetToolCallDisplayFeature = {
4499
4583
  /** See `features.toolCallDisplay.completedVisibility`. */
4500
4584
  type AgentWidgetToolCallCompletedVisibility = "kept" | "removed";
4501
4585
  type AgentWidgetReasoningDisplayFeature = {
4586
+ /** Activity chrome. Defaults to card in V4 and row with future.v5Defaults. */
4587
+ variant?: "card" | "row";
4588
+ /** Row status icons: always, active/attention-needed only, or never. V5 defaults to active; V4 to always. */
4589
+ iconVisibility?: "always" | "active" | "never";
4590
+ /** Row variant: open when the first content chunk arrives. Default false in V5; true in V4. */
4591
+ autoExpand?: boolean;
4592
+ /** Row variant: collapse once after completion, in ms; false disables. Default 1000. */
4593
+ autoCollapseDelay?: number | false;
4502
4594
  /**
4503
4595
  * When true, active collapsed reasoning rows can render a lightweight preview block.
4504
4596
  * @default false
@@ -5194,8 +5286,8 @@ interface AgentWidgetHistoryFeature {
5194
5286
  * otherwise `"browser"`) and narrows it to what the provider advertises, so a
5195
5287
  * browser-only provider is never asked for a scope it cannot serve. An
5196
5288
  * explicit `features.history.scope` is a hard request and still fails closed
5197
- * with `unsupported_scope`. `getIdentityProof` is never called for a supplied
5198
- * provider, and `HistoryOperationContext` carries only the resolved scope;
5289
+ * with `unsupported_scope`. History operations on a supplied provider never
5290
+ * call `getIdentityProof`, and `HistoryOperationContext` carries only the resolved scope;
5199
5291
  * report your own identity through `getIdentityStatus()` /
5200
5292
  * `subscribeIdentityStatus()`, which is what the scope banner and its retry
5201
5293
  * affordance read.
@@ -5579,7 +5671,7 @@ type EventStreamConfig = {
5579
5671
  /**
5580
5672
  * Fields to extract from event payloads for description text.
5581
5673
  * The first matching field value is displayed after the badge.
5582
- * @default ["flowName", "stepName", "name", "tool", "toolName"]
5674
+ * @default ["flowName", "stepName", "reasoningText", "text", "name", "tool", "toolName"]
5583
5675
  */
5584
5676
  descriptionFields?: string[];
5585
5677
  /**
@@ -5790,6 +5882,8 @@ type AgentWidgetComposerBarPeekConfig = {
5790
5882
  streamAnimation?: AgentWidgetStreamAnimationFeature;
5791
5883
  };
5792
5884
  type AgentWidgetLauncherConfig = {
5885
+ /** Collapsed launcher shape. V4 defaults to pill; V5 defaults to circle. */
5886
+ variant?: "pill" | "circle";
5793
5887
  enabled?: boolean;
5794
5888
  title?: string;
5795
5889
  subtitle?: string;
@@ -6533,9 +6627,9 @@ type AgentWidgetComposerConfig = {
6533
6627
  /**
6534
6628
  * Where the composer footer sits relative to the transcript.
6535
6629
  *
6536
- * - `"block"` (default): the footer is a flex sibling below the scroll body.
6630
+ * - `"block"` (V4 default): the footer is a flex sibling below the scroll body.
6537
6631
  * Nothing scrolls behind it.
6538
- * - `"overlay"`: the footer is absolutely overlaid on the scroll body, so the
6632
+ * - `"overlay"` (V5 default): the footer is absolutely overlaid on the scroll body, so the
6539
6633
  * transcript scrolls behind it (the chatgpt.com / claude.ai model, where the
6540
6634
  * composer is sticky inside the scroller). The widget reserves the footer's
6541
6635
  * live height as bottom padding on the scroll body and on a plugin welcome
@@ -6547,7 +6641,7 @@ type AgentWidgetComposerConfig = {
6547
6641
  * included) and `theme.components.input.backdropFilter`.
6548
6642
  *
6549
6643
  * Ignored in composer-bar mount mode, which owns its own geometry.
6550
- * @default "block"
6644
+ * @default "block" (V4), "overlay" (V5)
6551
6645
  */
6552
6646
  placement?: ComposerPlacement;
6553
6647
  /**
@@ -6561,8 +6655,9 @@ type AgentWidgetComposerConfig = {
6561
6655
  *
6562
6656
  * `"single-row"` describes the IDLE composer only. It composes with the
6563
6657
  * compact state, so a wrapped draft, chips, attachment previews, a quote, a
6564
- * pending card, or live dictation all fall back to the stacked card, exactly
6565
- * as `data-persona-composer-compact` does today.
6658
+ * pending card all fall back to the stacked card, exactly
6659
+ * as `data-persona-composer-compact` does today. Recording alone does not
6660
+ * expand the composer; dictated text expands it when it wraps.
6566
6661
  *
6567
6662
  * Ignored in composer-bar mount mode, whose pill is already one row.
6568
6663
  * @default "stacked"
@@ -6604,7 +6699,14 @@ type AgentWidgetClearChatConfig = {
6604
6699
  showTooltip?: boolean;
6605
6700
  };
6606
6701
  type AgentWidgetStatusIndicatorConfig = {
6702
+ /** Show the indicator. Explicit false also hides transient connection states. */
6607
6703
  visible?: boolean;
6704
+ /**
6705
+ * "always" shows status beneath the composer; "transient" shows connecting,
6706
+ * reconnecting, and error status above it, hiding normal idle/streaming status.
6707
+ * Available in both defaults states. Default: "always" in v4, "transient" in v5.
6708
+ */
6709
+ mode?: "always" | "transient";
6608
6710
  /** Text alignment. Default: 'right'. */
6609
6711
  align?: 'left' | 'center' | 'right';
6610
6712
  idleText?: string;
@@ -7388,7 +7490,8 @@ type AgentWidgetResolvedSuggestion = {
7388
7490
  };
7389
7491
  /** Presentation keys shared by every suggestion surface. */
7390
7492
  type AgentWidgetSuggestionSurfaceConfig = {
7391
- /** Item density. Defaults to `card` for starters and `chip` for follow-ups. */
7493
+ /** Item density. V4 starters: card. V5 starters: chip, or card in fullscreen.
7494
+ * Follow-ups default to chip. */
7392
7495
  variant?: AgentWidgetSuggestionVariant;
7393
7496
  /** Default click behavior, overridable per item. Defaults to `send`. */
7394
7497
  behavior?: AgentWidgetSuggestionBehavior;
@@ -7399,7 +7502,7 @@ type AgentWidgetSuggestionSurfaceConfig = {
7399
7502
  * own stacking.
7400
7503
  */
7401
7504
  overflow?: "scroll" | "wrap";
7402
- /** Maximum visible items. Defaults to 4. */
7505
+ /** Maximum visible items. Defaults to 4, or 3 for V5 non-fullscreen starters. */
7403
7506
  maxItems?: number;
7404
7507
  };
7405
7508
  type AgentWidgetStarterSuggestionsConfig = AgentWidgetSuggestionSurfaceConfig & {
@@ -7453,8 +7556,8 @@ type AgentWidgetSuggestionsConfig = {
7453
7556
  type AgentWidgetWelcomeVariant = "card" | "hero" | "none";
7454
7557
  /**
7455
7558
  * When the welcome surface goes away. `"never"` is the default for `"card"`;
7456
- * `"on-first-message"` is the default for `"hero"` and cannot be overridden
7457
- * there.
7559
+ * `"on-first-message"` is forced for legacy V4 `"hero"`. V5 defaults every
7560
+ * variant to `"on-first-message"`. Explicit layout opts into overridable dismissal.
7458
7561
  */
7459
7562
  type AgentWidgetWelcomeDismiss = "never" | "on-first-message";
7460
7563
  /**
@@ -7508,7 +7611,10 @@ type AgentWidgetWelcomeAlign = "start" | "center";
7508
7611
  * host-set value from a filled-in default.
7509
7612
  */
7510
7613
  interface AgentWidgetWelcomeConfig {
7511
- /** Card or hero title. Defaults to "Hello 👋". */
7614
+ /** Vertical placement: V4 defaults to top; V5 to centered. Fullscreen centered
7615
+ * welcomes also raise the empty composer unless `anchor` is explicitly set. */
7616
+ layout?: "top" | "centered";
7617
+ /** Card or hero title. V4: "Hello 👋". V5: "What can I help with?". */
7512
7618
  title?: string;
7513
7619
  /**
7514
7620
  * Small muted line above the title, e.g. a section name. Omitted when unset
@@ -7521,19 +7627,22 @@ interface AgentWidgetWelcomeConfig {
7521
7627
  icon?: AgentWidgetWelcomeIcon;
7522
7628
  /**
7523
7629
  * Horizontal alignment of the kicker, title, subtitle, and starter
7524
- * suggestions. Unset follows the variant: `card` starts, `hero` centers.
7630
+ * suggestions. Centered layouts default to center. Otherwise unset follows
7631
+ * the variant: `card` starts, `hero` centers.
7525
7632
  */
7526
7633
  align?: AgentWidgetWelcomeAlign;
7527
7634
  /** @default "card" */
7528
7635
  variant?: AgentWidgetWelcomeVariant;
7529
- /** @default "never" for `card`, always `"on-first-message"` for `hero`. */
7636
+ /** V4: never for card, forced on-first-message for hero. V5: on-first-message
7637
+ * for all variants; explicit values win. Explicit layout also allows overriding
7638
+ * the legacy hero dismissal in V4. */
7530
7639
  dismiss?: AgentWidgetWelcomeDismiss;
7531
7640
  /**
7532
7641
  * Vertical anchoring of the greeting-plus-composer pair in the EMPTY
7533
7642
  * conversation only. On the first message the pair drops to the bottom
7534
7643
  * (animated; see `data-persona-conversation-state`).
7535
7644
  *
7536
- * - `"bottom"` (default): the composer stays pinned at the bottom.
7645
+ * - `"bottom"`: the composer stays pinned at the bottom.
7537
7646
  * - `"center"`: greeting and composer float together so the composer's top
7538
7647
  * edge lands at `anchorComposerTop` of the panel column, and the welcome
7539
7648
  * surface is end-anchored `composerGap` above it.
@@ -7541,7 +7650,8 @@ interface AgentWidgetWelcomeConfig {
7541
7650
  * Composes with either `composer.placement`. Ignored in composer-bar mount
7542
7651
  * mode. `renderWelcome` plugin content inherits the anchor: the widget
7543
7652
  * positions the overlay host and reserves the composer zone.
7544
- * @default "bottom"
7653
+ * Defaults to bottom, except centered fullscreen layouts, which center the
7654
+ * measured greeting/composer group when no anchor override is supplied.
7545
7655
  */
7546
7656
  anchor?: AgentWidgetWelcomeAnchor;
7547
7657
  /**
@@ -8033,6 +8143,9 @@ type AgentWidgetLayoutConfig = {
8033
8143
  * `launcher.composerBar.contentMaxWidth`)
8034
8144
  */
8035
8145
  contentMaxWidth?: string;
8146
+ /** Fade the transcript's top edge when content is scrolled above it.
8147
+ * Defaults to false in V4 and true with future.v5Defaults. */
8148
+ topFade?: boolean;
8036
8149
  };
8037
8150
  /**
8038
8151
  * Token types for marked renderer methods
@@ -8646,7 +8759,30 @@ type AgentWidgetLoadingIndicatorConfig = {
8646
8759
  */
8647
8760
  renderIdle?: (context: IdleIndicatorRenderContext) => HTMLElement | null;
8648
8761
  };
8762
+ /** Built-in `sessionInit` triggers. See {@link AgentWidgetConfig.sessionInit}. */
8763
+ type AgentWidgetSessionInitTrigger = 'input' | 'focus' | 'mount' | 'send';
8764
+ /**
8765
+ * Custom `sessionInit` trigger. Runs when the widget mounts in client token mode,
8766
+ * and again if `update()` swaps in a different function. Call `warm()` whenever
8767
+ * the visitor shows intent (it is safe to call repeatedly). Return a cleanup to
8768
+ * run when the widget is destroyed or the hook is replaced.
8769
+ */
8770
+ type AgentWidgetSessionInitHook = (context: {
8771
+ /** Fire-and-forget early session init; latched and error-swallowing. */
8772
+ warm: () => void;
8773
+ /** The widget's mount element. */
8774
+ mount: HTMLElement;
8775
+ }) => void | (() => void);
8649
8776
  type AgentWidgetConfig = {
8777
+ /** Opt in to upcoming major-version defaults without changing explicit settings. */
8778
+ future?: {
8779
+ /**
8780
+ * Use the v5 default styling as it rolls out in 4.x. Every affected setting
8781
+ * remains independently configurable. Explicit options and theme tokens win.
8782
+ * @default false
8783
+ */
8784
+ v5Defaults?: boolean;
8785
+ };
8650
8786
  apiUrl?: string;
8651
8787
  flowId?: string;
8652
8788
  /**
@@ -8801,6 +8937,46 @@ type AgentWidgetConfig = {
8801
8937
  * ```
8802
8938
  */
8803
8939
  onSessionExpired?: () => void;
8940
+ /**
8941
+ * When the widget calls `/v1/client/init` in client token mode, ahead of the
8942
+ * first send. Ignored outside client token mode.
8943
+ *
8944
+ * - `'input'` (default): on the composer's first user keystroke that leaves
8945
+ * non-empty text. Programmatic value changes (restored drafts,
8946
+ * `setMessage()`, history recall) do not count.
8947
+ * - `'focus'`: when the visitor focuses the composer by pointer or Tab (and
8948
+ * on first input, as a fallback). Programmatic focus, such as
8949
+ * `autoFocusInput` on open or mount, does not count.
8950
+ * - `'mount'`: as soon as the widget mounts (the behavior before this option
8951
+ * existed). Use it when a server-configured welcome message, which arrives
8952
+ * with the init response, must show before the visitor types.
8953
+ * - `'send'`: no early init; the first send initializes the session.
8954
+ * - A function: custom trigger. Called on mount (and when `update()` swaps
8955
+ * in a different function) with a `warm` callback to call whenever you
8956
+ * decide (e.g. on hover); may return a cleanup that runs on destroy or
8957
+ * replacement. Replaces the built-in triggers.
8958
+ *
8959
+ * The early init is fire-and-forget: it runs at most once per session
8960
+ * lifetime (re-armed after expiry or a new conversation), sends exactly the
8961
+ * same request the send would, and swallows errors. A failure resurfaces
8962
+ * when the send retries init. A send during an in-flight early init reuses
8963
+ * it, so only one `/v1/client/init` is issued. When visitor history is
8964
+ * enabled the widget still initializes on mount to restore the conversation.
8965
+ * Hosts can also trigger it imperatively with `controller.warmSession()`.
8966
+ *
8967
+ * @default 'input'
8968
+ *
8969
+ * @example
8970
+ * ```typescript
8971
+ * config: {
8972
+ * clientToken: 'ct_live_...',
8973
+ * sessionInit: ({ warm, mount }) => {
8974
+ * mount.addEventListener('pointerenter', warm, { once: true });
8975
+ * }
8976
+ * }
8977
+ * ```
8978
+ */
8979
+ sessionInit?: AgentWidgetSessionInitTrigger | AgentWidgetSessionInitHook;
8804
8980
  /**
8805
8981
  * Get stored session ID for session resumption (client token mode only).
8806
8982
  * Called when initializing a new session to check if there's a previous session_id
@@ -8833,13 +9009,20 @@ type AgentWidgetConfig = {
8833
9009
  */
8834
9010
  setStoredSessionId?: (sessionId: string) => void;
8835
9011
  /**
8836
- * Called immediately before any cross-device history request and before a
9012
+ * With identityProvider, called before every client-token chat POST, including retries, independently of history.
9013
+ * Also called immediately before any cross-device history request and before a
8837
9014
  * conversationId resume of a conversation discovered on another device.
8838
- * Return a fresh end-user access token (rt_eu_… / JWT). Null uses exact-browser
8839
- * scope only for a never-bound visitor; a previously bound visitor fails closed
8840
- * until resetHistoryIdentity() runs. Never cached by the widget.
9015
+ * Return a fresh end-user access token (rt_eu_… / JWT). Null stops identity-enabled chat.
9016
+ * For history only, null uses exact-browser scope for a never-bound visitor;
9017
+ * a bound visitor fails closed until resetHistoryIdentity(). Never cached.
8841
9018
  */
8842
9019
  getIdentityProof?: () => string | null | Promise<string | null>;
9020
+ /**
9021
+ * Provider name registered with Runtype, for example "clerk". Enables per-request
9022
+ * chat identity through getIdentityProof without enabling history. A missing or
9023
+ * failed proof stops the turn; omitting this preserves history-only callbacks.
9024
+ */
9025
+ identityProvider?: string;
8843
9026
  /**
8844
9027
  * Read the persisted active conversation id (client token mode only).
8845
9028
  * Called only after the internal stored-state bootstrap gate resolves.
@@ -9524,6 +9707,8 @@ type AgentWidgetReasoning = {
9524
9707
  durationMs?: number;
9525
9708
  };
9526
9709
  type AgentWidgetToolCall = {
9710
+ /** Optional approval state for activity-row status chrome. */
9711
+ approvalStatus?: "pending" | "approved" | "denied" | "timeout";
9527
9712
  id: string;
9528
9713
  name?: string;
9529
9714
  status: "pending" | "running" | "complete";
@@ -10160,6 +10345,13 @@ type Controller = {
10160
10345
  startNewConversation: (opts?: {
10161
10346
  focus?: boolean;
10162
10347
  }) => Promise<void>;
10348
+ /**
10349
+ * Client token mode: start `/v1/client/init` now, ahead of the first send
10350
+ * (e.g. when the visitor hovers your own "Chat with us" button).
10351
+ * Fire-and-forget, at most once per session lifetime, errors swallowed; the
10352
+ * send reuses the in-flight init. No-op in other modes. See `sessionInit`.
10353
+ */
10354
+ warmSession: () => void;
10163
10355
  /** Permanently delete one server record; the active one is replaced. */
10164
10356
  deleteConversation: (conversationId: string) => Promise<void>;
10165
10357
  /**