@mgamadeus/ddd-agents 0.1.0-alpha.22 → 0.1.0-alpha.24

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 (164) hide show
  1. package/README.md +3 -2
  2. package/dist/chat.js +87 -893
  3. package/dist/chat.js.map +1 -1
  4. package/dist/chunks/ConversationMessageInputComposerWidgets-BxyaFBA6.js +631 -0
  5. package/dist/chunks/ConversationMessageInputComposerWidgets-BxyaFBA6.js.map +1 -0
  6. package/dist/chunks/{WebSearchResultsConversationWidget-BvnLWHyi.js → WebSearchResultsConversationWidget-as3p5bHw.js} +147 -1125
  7. package/dist/chunks/WebSearchResultsConversationWidget-as3p5bHw.js.map +1 -0
  8. package/dist/chunks/{canvas-behaviours-BRFR1ALE.js → canvas-behaviours-AvzKSYyv.js} +4 -4
  9. package/dist/chunks/{canvas-behaviours-BRFR1ALE.js.map → canvas-behaviours-AvzKSYyv.js.map} +1 -1
  10. package/dist/chunks/canvas-reducers-Bfp_i7lc.js +88 -0
  11. package/dist/chunks/canvas-reducers-Bfp_i7lc.js.map +1 -0
  12. package/dist/chunks/{canvasBodies-9SuF6NAB.js → canvasBodies-Cvu3l38p.js} +12 -6
  13. package/dist/chunks/canvasBodies-Cvu3l38p.js.map +1 -0
  14. package/dist/chunks/canvasStorage-EvQsGdto.js +65 -0
  15. package/dist/chunks/canvasStorage-EvQsGdto.js.map +1 -0
  16. package/dist/chunks/contract-BxmMxYPF.js +96 -0
  17. package/dist/chunks/contract-BxmMxYPF.js.map +1 -0
  18. package/dist/chunks/conversation-BEF0aesf.js +31 -0
  19. package/dist/chunks/conversation-BEF0aesf.js.map +1 -0
  20. package/dist/chunks/entity-detail-name-3A82gDAp.js +15 -0
  21. package/dist/chunks/entity-detail-name-3A82gDAp.js.map +1 -0
  22. package/dist/chunks/icon-names-Di6c4zLo.js +86 -0
  23. package/dist/chunks/icon-names-Di6c4zLo.js.map +1 -0
  24. package/dist/chunks/index-7Qc_3GbG.js +1046 -0
  25. package/dist/chunks/index-7Qc_3GbG.js.map +1 -0
  26. package/dist/chunks/{ConversationMarkdown-W7NHglmL.js → widget-click-signal-sources-DulRkNvZ.js} +54 -7
  27. package/dist/chunks/widget-click-signal-sources-DulRkNvZ.js.map +1 -0
  28. package/dist/chunks/{widget-image-readiness-signal-DeOuL89j.js → widget-image-readiness-signal-D3ci53xr.js} +2 -2
  29. package/dist/chunks/{widget-image-readiness-signal-DeOuL89j.js.map → widget-image-readiness-signal-D3ci53xr.js.map} +1 -1
  30. package/dist/chunks/{widget-name-resolver-DyIY6Zu4.js → widget-name-resolver-BGN3HpoG.js} +80 -117
  31. package/dist/chunks/widget-name-resolver-BGN3HpoG.js.map +1 -0
  32. package/dist/chunks/{withPollingChangeSubscription-BLDAWF-o.js → withPollingChangeSubscription-B16htQGd.js} +2 -2
  33. package/dist/chunks/{withPollingChangeSubscription-BLDAWF-o.js.map → withPollingChangeSubscription-B16htQGd.js.map} +1 -1
  34. package/dist/client-testing.js +91 -2
  35. package/dist/client-testing.js.map +1 -1
  36. package/dist/client.js +1 -1
  37. package/dist/contract.js +8 -27
  38. package/dist/contract.js.map +1 -1
  39. package/dist/files/chat/Conversation.module.scss +268 -0
  40. package/dist/files/chat/ConversationViewBody/ConversationViewBody.module.scss +336 -0
  41. package/dist/files/chat/_conversation-tokens.scss +37 -0
  42. package/dist/files/image-render/WidgetImageRender.module.scss +22 -0
  43. package/dist/files/kit/ComposedViewConversationWidget.md +59 -0
  44. package/dist/files/kit/components/data/data.preview-fixtures.json +3298 -0
  45. package/dist/files/kit/components/embedding/widget.preview-fixtures.json +147 -0
  46. package/dist/files/kit/components/entity/entity-link.preview-fixtures.json +340 -0
  47. package/dist/files/kit/components/form/form.preview-fixtures.json +319 -0
  48. package/dist/files/kit/components/inputs/button.preview-fixtures.json +301 -0
  49. package/dist/files/kit/components/inputs/checkbox.preview-fixtures.json +35 -0
  50. package/dist/files/kit/components/inputs/date-picker.preview-fixtures.json +36 -0
  51. package/dist/files/kit/components/inputs/input.preview-fixtures.json +55 -0
  52. package/dist/files/kit/components/inputs/radio-group.preview-fixtures.json +76 -0
  53. package/dist/files/kit/components/inputs/select.preview-fixtures.json +314 -0
  54. package/dist/files/kit/components/inputs/slider.preview-fixtures.json +178 -0
  55. package/dist/files/kit/components/inputs/tabs.preview-fixtures.json +304 -0
  56. package/dist/files/kit/components/inputs/textarea.preview-fixtures.json +37 -0
  57. package/dist/files/kit/components/layout/layout.preview-fixtures.json +892 -0
  58. package/dist/files/kit/components/map/map.preview-fixtures.json +339 -0
  59. package/dist/files/kit/components/media/image-group.preview-fixtures.json +228 -0
  60. package/dist/files/kit/components/media/image.preview-fixtures.json +61 -0
  61. package/dist/files/kit/components/media/video-card/video-card.preview-fixtures.json +121 -0
  62. package/dist/files/kit/components/media/video.preview-fixtures.json +68 -0
  63. package/dist/files/kit/components/rich/code.preview-fixtures.json +105 -0
  64. package/dist/files/kit/components/rich/diagram.preview-fixtures.json +89 -0
  65. package/dist/files/kit/components/rich/math.preview-fixtures.json +152 -0
  66. package/dist/files/kit/components/rich/svg.preview-fixtures.json +243 -0
  67. package/dist/files/kit/components/text/badge.preview-fixtures.json +44 -0
  68. package/dist/files/kit/components/text/caption.preview-fixtures.json +31 -0
  69. package/dist/files/kit/components/text/favicon.preview-fixtures.json +69 -0
  70. package/dist/files/kit/components/text/label.preview-fixtures.json +48 -0
  71. package/dist/files/kit/components/text/link.preview-fixtures.json +103 -0
  72. package/dist/files/kit/components/text/markdown.preview-fixtures.json +29 -0
  73. package/dist/files/kit/components/text/source-ref.preview-fixtures.json +51 -0
  74. package/dist/files/kit/components/text/text.preview-fixtures.json +106 -0
  75. package/dist/files/kit/components/text/title.preview-fixtures.json +172 -0
  76. package/dist/files/kit/composed-view-widget-contract.json +88 -0
  77. package/dist/files/kit/composed-view.preview-fixtures.json +376 -0
  78. package/dist/files/renderer/conversation-widget-layout.module.scss +47 -0
  79. package/dist/files/renderer/widget-tree/composed-node-schema.json +3428 -0
  80. package/dist/files/styles/_conversation-widget-container.scss +6 -0
  81. package/dist/files/styles/_media.scss +50 -0
  82. package/dist/files/styles/_spacings.scss +23 -0
  83. package/dist/files/styles/_surfaces.scss +28 -0
  84. package/dist/files/widgets/ClockConversationWidget/ClockConversationWidget.md +53 -0
  85. package/dist/files/widgets/ClockConversationWidget/clock.preview-fixtures.json +76 -0
  86. package/dist/files/widgets/ConceptExplainerConversationWidget/ConceptExplainerConversationWidget.md +86 -0
  87. package/dist/files/widgets/ConceptExplainerConversationWidget/concept-explainer.preview-fixtures.json +23 -0
  88. package/dist/files/widgets/ConversationSearchResultsConversationWidget/ConversationSearchResultsConversationWidget.md +59 -0
  89. package/dist/files/widgets/ConversationSearchResultsConversationWidget/conversation-search-results.preview-fixtures.json +85 -0
  90. package/dist/files/widgets/CurrencyConverterConversationWidget/CurrencyConverterConversationWidget.md +51 -0
  91. package/dist/files/widgets/CurrencyConverterConversationWidget/currency-converter.preview-fixtures.json +73 -0
  92. package/dist/files/widgets/CustomVisualizationConversationWidget/CustomVisualizationConversationWidget.md +83 -0
  93. package/dist/files/widgets/CustomVisualizationConversationWidget/custom-visualization.preview-fixtures.json +227 -0
  94. package/dist/files/widgets/CustomVisualizationConversationWidget/sandbox-frame/custom-visualization-frame.html +188 -0
  95. package/dist/files/widgets/EntityMentionConversationWidget/EntityMentionConversationWidget.md +55 -0
  96. package/dist/files/widgets/EntityMentionConversationWidget/entity-mention.preview-fixtures.json +55 -0
  97. package/dist/files/widgets/MultiChoiceConversationWidget/MultiChoiceConversationWidget.md +61 -0
  98. package/dist/files/widgets/MultiChoiceConversationWidget/multi-choice-widget-contract.json +43 -0
  99. package/dist/files/widgets/MultiChoiceConversationWidget/multi-choice.preview-fixtures.json +103 -0
  100. package/dist/files/widgets/QuickRepliesConversationWidget/QuickRepliesConversationWidget.md +65 -0
  101. package/dist/files/widgets/QuickRepliesConversationWidget/quick-replies-widget-contract.json +43 -0
  102. package/dist/files/widgets/QuickRepliesConversationWidget/quick-replies.preview-fixtures.json +45 -0
  103. package/dist/files/widgets/SuggestedActions/SuggestedActions.md +60 -0
  104. package/dist/files/widgets/SuggestedActions/suggested-actions.preview-fixtures.json +19 -0
  105. package/dist/files/widgets/ToolTraceConversationWidget/ToolTraceConversationWidget.md +48 -0
  106. package/dist/files/widgets/ToolTraceConversationWidget/tool-trace.preview-fixtures.json +32 -0
  107. package/dist/files/widgets/WebSearchResultsConversationWidget/WebSearchResultsConversationWidget.md +49 -0
  108. package/dist/files/widgets/WebSearchResultsConversationWidget/web-search-results.preview-fixtures.json +57 -0
  109. package/dist/files/widgets/WritingDraftConversationWidget/WritingDraftConversationWidget.md +66 -0
  110. package/dist/files/widgets/WritingDraftConversationWidget/writing-draft.preview-fixtures.json +129 -0
  111. package/dist/image-render.js +11 -10
  112. package/dist/image-render.js.map +1 -1
  113. package/dist/index.js +32 -27
  114. package/dist/index.js.map +1 -1
  115. package/dist/kit.js +11 -2
  116. package/dist/kit.js.map +1 -1
  117. package/dist/preview.js +47 -18
  118. package/dist/preview.js.map +1 -1
  119. package/dist/provider.js +71 -0
  120. package/dist/provider.js.map +1 -0
  121. package/dist/renderer.js +142 -62
  122. package/dist/renderer.js.map +1 -1
  123. package/dist/styles.css +86 -38
  124. package/dist/types/client/testing/test-conversation-widgets.d.ts +25 -0
  125. package/dist/types/client/testing/widget-hydration-stand-ins.d.ts +42 -0
  126. package/dist/types/entries/chat.d.ts +12 -0
  127. package/dist/types/entries/client-testing.d.ts +4 -0
  128. package/dist/types/entries/contract.d.ts +1 -0
  129. package/dist/types/entries/index.d.ts +4 -3
  130. package/dist/types/entries/kit.d.ts +7 -0
  131. package/dist/types/entries/preview.d.ts +2 -0
  132. package/dist/types/entries/provider.d.ts +1 -0
  133. package/dist/types/entries/renderer.d.ts +19 -1
  134. package/dist/types/entries/widgets.d.ts +13 -0
  135. package/dist/types/kit/components/data/apex-chart-component.d.ts +3 -0
  136. package/dist/types/kit/components/data/chart-model.d.ts +164 -0
  137. package/dist/types/kit/components/data/data-value-format.d.ts +44 -0
  138. package/dist/types/kit/components/data/use-chart-palette.d.ts +9 -0
  139. package/dist/types/kit/components/data/use-number-locale.d.ts +5 -0
  140. package/dist/types/kit/components/map/use-google-maps-auth-failure.d.ts +18 -0
  141. package/dist/types/kit/entity-detail/entity-detail-bodies.d.ts +2 -0
  142. package/dist/types/provider/index.d.ts +1 -0
  143. package/dist/types/renderer/_access/ConversationWidgetGateSkeleton.d.ts +6 -0
  144. package/dist/types/renderer/_agent-space/use-conversation-widget-agent-space-fallback.d.ts +16 -0
  145. package/dist/types/renderer/canvas/entity-detail-instance.d.ts +5 -3
  146. package/dist/types/renderer/canvas/use-anchor-widget-agent-space-key.d.ts +17 -0
  147. package/dist/types/renderer/conversationWidgetRegistry.d.ts +6 -0
  148. package/dist/types/renderer/read-conversation-widget-variant.d.ts +22 -0
  149. package/dist/types/renderer/widget-hydration/use-widget-hydration.d.ts +5 -0
  150. package/dist/types/widgets/EntityMentionConversationWidget/stories/EntityMentionAskFlowStory.d.ts +8 -0
  151. package/dist/types/widgets/_shared/CardFooter.d.ts +6 -0
  152. package/dist/types/widgets/_shared/WidgetLabel.d.ts +8 -0
  153. package/dist/types/widgets/_shared/entity-update-channel.d.ts +17 -0
  154. package/dist/types/widgets/_shared/use-element-visible.d.ts +6 -0
  155. package/dist/widgets.js +120 -27
  156. package/dist/widgets.js.map +1 -1
  157. package/package.json +74 -1
  158. package/public-api.json +779 -0
  159. package/dist/chunks/ConversationMarkdown-W7NHglmL.js.map +0 -1
  160. package/dist/chunks/WebSearchResultsConversationWidget-BvnLWHyi.js.map +0 -1
  161. package/dist/chunks/canvasBodies-9SuF6NAB.js.map +0 -1
  162. package/dist/chunks/decide-canvas-open-Ct-wnNEJ.js +0 -20
  163. package/dist/chunks/decide-canvas-open-Ct-wnNEJ.js.map +0 -1
  164. package/dist/chunks/widget-name-resolver-DyIY6Zu4.js.map +0 -1
package/dist/renderer.js CHANGED
@@ -1,10 +1,17 @@
1
1
  "use client";
2
- import { C, a } from "./chunks/ConversationMarkdown-W7NHglmL.js";
3
- import { j, k, l, m, n, o, p, q, s, t, u, v } from "./chunks/widget-name-resolver-DyIY6Zu4.js";
4
- import { ac, ad, ae, af, ag, ah, ai, aj, ak, al, am, an, ao, ap, aq, ar, as, at, au, av, aw, ax, Z, ay, ab, az, aA, aB, aC, aD, aE } from "./chunks/WebSearchResultsConversationWidget-BvnLWHyi.js";
5
- import { C as C2, a as a2, b, c, D, d, e, g, i, p as p2 } from "./chunks/canvas-behaviours-BRFR1ALE.js";
6
- import { c as c2 } from "./chunks/canvasBodies-9SuF6NAB.js";
7
- import { c as c3 } from "./chunks/canvas-feature-flags-BmmxC3bz.js";
2
+ import { C, a, W, b, d, g, i, p, r } from "./chunks/widget-click-signal-sources-DulRkNvZ.js";
3
+ import { m as findWidgetFenceByPayloadHash, n as findWidgetFencesInMarkdown } from "./chunks/widget-name-resolver-BGN3HpoG.js";
4
+ import { o, p as p2, q, t, v, w, j, x, y, z, B, D, F, G } from "./chunks/widget-name-resolver-BGN3HpoG.js";
5
+ import { d as useResolvedConversationWidgetAgentSpaceKey, p as payloadHashOfInstanceId } from "./chunks/WebSearchResultsConversationWidget-as3p5bHw.js";
6
+ import { C as C2, e, f, h, i as i2, R, S, W as W2, j as j2, k, m, n, o as o2, q as q2, t as t2, v as v2, g as g2, w as w2, x as x2, y as y2, z as z2, A, b as b2, B as B2, s, D as D2, u, E, F as F2, G as G2, H, I, J } from "./chunks/WebSearchResultsConversationWidget-as3p5bHw.js";
7
+ import { C as C3, a as a2, b as b3, d as d2, D as D3, c, e as e2, g as g3, i as i3, p as p3 } from "./chunks/canvas-behaviours-AvzKSYyv.js";
8
+ import { c as c2, u as u2 } from "./chunks/canvasBodies-Cvu3l38p.js";
9
+ import { jsxs, jsx } from "react/jsx-runtime";
10
+ import { l as Skeleton } from "./chunks/index-7Qc_3GbG.js";
11
+ import { a9, aa, ab, ac, ad } from "./chunks/index-7Qc_3GbG.js";
12
+ import { useMemo } from "react";
13
+ import { a as a3, b as b4, c as c3, d as d3, e as e3 } from "./chunks/canvas-reducers-Bfp_i7lc.js";
14
+ import { c as c4 } from "./chunks/canvas-feature-flags-BmmxC3bz.js";
8
15
  const pickSection = (payloadValue, fallback) => {
9
16
  return payloadValue ?? fallback.data ?? void 0;
10
17
  };
@@ -20,9 +27,9 @@ const mergeSectionValues = (payloadValue, hydratedValue) => {
20
27
  }
21
28
  const defined = {};
22
29
  for (const key of Object.keys(payloadValue)) {
23
- const v2 = payloadValue[key];
24
- if (v2 !== void 0) {
25
- defined[key] = v2;
30
+ const v3 = payloadValue[key];
31
+ if (v3 !== void 0) {
32
+ defined[key] = v3;
26
33
  }
27
34
  }
28
35
  return { ...hydratedValue, ...defined };
@@ -47,69 +54,142 @@ const isSectionIncomplete = (payloadValue, fallback, requiredKeys) => {
47
54
  return payloadValue[k2] === void 0;
48
55
  });
49
56
  };
57
+ const ConversationWidgetGateSkeleton = () => /* @__PURE__ */ jsxs("div", { "data-testid": "ConversationWidgetGateSkeleton", children: [
58
+ /* @__PURE__ */ jsx(Skeleton, { height: "20px", width: "40%" }),
59
+ /* @__PURE__ */ jsx(Skeleton, { height: "64px", width: "100%", borderRadius: "8px" })
60
+ ] });
61
+ const ANOTHER_AGENT_SPACE_EMPTY_FALLBACK = { data: null, isLoading: false, error: null };
62
+ const useConversationWidgetAgentSpaceFallback = (agentSpaceKeyAttribute, activeFallback) => {
63
+ const { anotherAgentSpaceKey, isAnotherAgentSpace } = useResolvedConversationWidgetAgentSpaceKey(agentSpaceKeyAttribute);
64
+ return {
65
+ anotherAgentSpaceKey,
66
+ isAnotherAgentSpace,
67
+ fallback: isAnotherAgentSpace ? ANOTHER_AGENT_SPACE_EMPTY_FALLBACK : activeFallback
68
+ };
69
+ };
70
+ const useAnchorWidgetFenceAgentSpaceKey = (canvas, anchorMessageMarkdown, widgetName) => useMemo(() => {
71
+ if (canvas.anchor.kind !== "message" || anchorMessageMarkdown === null) return void 0;
72
+ const payloadHash = payloadHashOfInstanceId(canvas.instanceId);
73
+ const fence = payloadHash !== void 0 ? findWidgetFenceByPayloadHash(anchorMessageMarkdown, widgetName, payloadHash) : findWidgetFencesInMarkdown(anchorMessageMarkdown).find((candidate) => candidate.name === widgetName);
74
+ return fence?.agentSpaceKey;
75
+ }, [canvas.anchor, canvas.instanceId, anchorMessageMarkdown, widgetName]);
76
+ const useAnchorWidgetAgentSpaceKey = (canvas, anchorMessageMarkdown, widgetName, chatAgentSpaceKey) => {
77
+ const fenceAgentSpaceKey = useAnchorWidgetFenceAgentSpaceKey(canvas, anchorMessageMarkdown, widgetName);
78
+ const { anotherAgentSpaceKey, activeAgentSpaceKey } = useResolvedConversationWidgetAgentSpaceKey(fenceAgentSpaceKey);
79
+ if (canvas.anchor.kind === "page") return canvas.anchor.agentSpaceKey;
80
+ return anotherAgentSpaceKey ?? chatAgentSpaceKey ?? activeAgentSpaceKey;
81
+ };
82
+ const readPayloadVariant = (rawPayload) => {
83
+ try {
84
+ const parsed = JSON.parse(rawPayload);
85
+ if (parsed && (parsed.variant === "compact" || parsed.variant === "full")) {
86
+ return parsed.variant;
87
+ }
88
+ } catch {
89
+ }
90
+ return void 0;
91
+ };
92
+ const withConversationWidgetVariant = (base, rawPayload) => {
93
+ if (!base) {
94
+ return base;
95
+ }
96
+ const variant = readPayloadVariant(rawPayload);
97
+ return variant ? { ...base, variant } : base;
98
+ };
50
99
  export {
51
- ac as AgentsWidgetHydrationStateContainer,
52
- C2 as CANVAS_BOXED_INSET_PX,
100
+ a9 as AgentsWidgetHydrationStateContainer,
101
+ C3 as CANVAS_BOXED_INSET_PX,
53
102
  a2 as CANVAS_FILLS_SCREEN_WIDTH_PERCENT,
54
- b as CANVAS_MIN_WIDTH_PX,
55
- c as CHAT_COLUMN_MIN_WIDTH_PX,
103
+ b3 as CANVAS_MIN_WIDTH_PX,
104
+ d2 as CHAT_COLUMN_MIN_WIDTH_PX,
56
105
  C as ConversationMarkdown,
57
- ad as ConversationWidgetContext,
58
- j as ConversationWidgetErrorBoundary,
59
- k as ConversationWidgetFeatureGate,
106
+ C2 as ConversationWidgetActions,
107
+ e as ConversationWidgetAgentSpaceFrame,
108
+ f as ConversationWidgetAgentSpaceHeader,
109
+ h as ConversationWidgetContext,
110
+ o as ConversationWidgetErrorBoundary,
111
+ p2 as ConversationWidgetFeatureGate,
112
+ ConversationWidgetGateSkeleton,
60
113
  a as ConversationWidgetHost,
61
- D as DEFAULT_CANVAS_WIDTH_PERCENT,
62
- ae as ReadOnlyConversationWidgetProvider,
63
- af as StandaloneConversationWidgetProvider,
64
- ag as WidgetHydrationReducer,
65
- ah as WidgetHydrationSlice,
66
- ai as WidgetRenderReportContext,
67
- l as addComposedNodeSchemaApplicationPart,
68
- d as canvasBehaviourOf,
114
+ i2 as ConversationWidgetRenderContext,
115
+ D3 as DEFAULT_CANVAS_WIDTH_PERCENT,
116
+ R as ReadOnlyConversationWidgetProvider,
117
+ S as StandaloneConversationWidgetProvider,
118
+ W as WIDGET_RENDER_REPORT_SIGNAL_SOURCE,
119
+ aa as WidgetHydrationReducer,
120
+ ab as WidgetHydrationSlice,
121
+ W2 as WidgetRenderReportContext,
122
+ q as addComposedNodeSchemaApplicationPart,
123
+ a3 as applyClearCanvas,
124
+ b4 as applyCloseCanvas,
125
+ c3 as applyOpenCanvas,
126
+ d3 as applyResetCanvasForNewTurn,
127
+ e3 as applySetCanvasCreatedEntityId,
128
+ j2 as buildWidgetAgentSpaceKeyProps,
129
+ b as buildWidgetRenderReportSignal,
130
+ c as canvasBehaviourOf,
69
131
  c2 as canvasBodies,
70
- c3 as canvasFeatureFlagOf,
71
- aj as canvasInstanceIdForActiveAgentSpace,
72
- ak as canvasInstanceIdForAgentSpace,
73
- al as canvasInstanceIdForEntity,
74
- am as canvasInstanceIdForMessage,
75
- an as canvasInstanceIdForMessagePayload,
76
- e as canvasWidthPercentOf,
77
- m as closestWidgetNames,
78
- n as composedNodeSchema,
79
- o as conversationWidgetRegistry,
80
- ao as createAgentsWidgetHydrationStateStore,
81
- ap as defaultConversationWidgetCallbacks,
82
- aq as entityIdOfInstanceId,
83
- p as getComposedNodeSchema,
84
- q as getConversationWidgetRegistryRevision,
85
- g as getDeclaredCanvasIds,
86
- ar as getDefaultAgentsStateStore,
87
- as as getWidgetHydrator,
88
- at as hasWidgetHydrator,
89
- au as isCanvasAnchorLoaded,
90
- i as isCanvasId,
132
+ c4 as canvasFeatureFlagOf,
133
+ k as canvasInstanceIdForActiveAgentSpace,
134
+ m as canvasInstanceIdForAgentSpace,
135
+ n as canvasInstanceIdForEntity,
136
+ o2 as canvasInstanceIdForMessage,
137
+ q2 as canvasInstanceIdForMessagePayload,
138
+ e2 as canvasWidthPercentOf,
139
+ t as closestWidgetNames,
140
+ v as composedNodeSchema,
141
+ w as composedViewTreeToWire,
142
+ j as conversationWidgetRegistry,
143
+ ac as createAgentsWidgetHydrationStateStore,
144
+ d as deepLinkableWidgetNameForCanvas,
145
+ t2 as defaultConversationWidgetCallbacks,
146
+ v2 as entityIdOfInstanceId,
147
+ findWidgetFenceByPayloadHash,
148
+ findWidgetFencesInMarkdown,
149
+ x as getComposedNodeSchema,
150
+ y as getConversationWidgetRegistryRevision,
151
+ g3 as getDeclaredCanvasIds,
152
+ ad as getDefaultAgentsStateStore,
153
+ g as getWidgetClickSignalSources,
154
+ g2 as getWidgetHydrator,
155
+ w2 as hasWidgetHydrator,
156
+ x2 as isCanvasAnchorLoaded,
157
+ i3 as isCanvasId,
91
158
  isSectionIncomplete,
92
159
  isSectionLoading,
160
+ i as isWidgetClickSignalSource,
93
161
  mergeSection,
94
162
  mergeSectionValues,
95
- av as messageAnchor,
96
- p2 as packageCanvasBehaviours,
97
- aw as pageAnchor,
98
- ax as payloadHashOfInstanceId,
163
+ y2 as messageAnchor,
164
+ p3 as packageCanvasBehaviours,
165
+ z2 as pageAnchor,
166
+ p as parseWidgetRenderReportSignal,
167
+ payloadHashOfInstanceId,
99
168
  pickSection,
100
- s as readComposedViewTree,
101
- t as readConversationWidgetRegistrations,
102
- Z as registerWidgetHydrator,
103
- u as resolveCanonicalWidgetName,
104
- v as resolveWidgetName,
105
- ay as sameCanvasAnchor,
106
- ab as sameCanvasIdentity,
169
+ z as readComposedViewTree,
170
+ B as readConversationWidgetRegistrations,
171
+ D as readOpenEntityActionTarget,
172
+ A as readWidgetAgentSpaceKeyAttribute,
173
+ b2 as registerWidgetHydrator,
174
+ F as resolveCanonicalWidgetName,
175
+ r as resolveDeepLinkableWidget,
176
+ G as resolveWidgetName,
177
+ B2 as sameCanvasAnchor,
178
+ s as sameCanvasIdentity,
107
179
  sectionCoversKeys,
108
- az as shortStringHash,
109
- aA as useConversationWidgetContext,
110
- aB as useReportWidgetRenderStatus,
111
- aC as useWidgetHydration,
112
- aD as useWidgetMemory,
113
- aE as useWidgetRenderReporter
180
+ D2 as shortStringHash,
181
+ u as unregisterWidgetHydrator,
182
+ useAnchorWidgetAgentSpaceKey,
183
+ useAnchorWidgetFenceAgentSpaceKey,
184
+ u2 as useAnchorWidgetPayload,
185
+ useConversationWidgetAgentSpaceFallback,
186
+ E as useConversationWidgetContext,
187
+ F2 as useIsEmailWidgetRender,
188
+ G2 as useReportWidgetRenderStatus,
189
+ useResolvedConversationWidgetAgentSpaceKey,
190
+ H as useWidgetHydration,
191
+ I as useWidgetMemory,
192
+ J as useWidgetRenderReporter,
193
+ withConversationWidgetVariant
114
194
  };
115
195
  //# sourceMappingURL=renderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sources":["../src/renderer/widget-hydration/section-hydration.ts"],"sourcesContent":["export interface SectionHydrationResult<T> {\n data: T | null;\n isLoading: boolean;\n error?: string | null;\n}\n\nexport type SectionHydrator<T> = () => SectionHydrationResult<T>;\n\n/**\n * Prefer payload-provided value; fall back to a hydrator result; undefined otherwise.\n * Callers should call the fallback hook unconditionally (React hook rules) and pass\n * its result here.\n */\nexport const pickSection = <T>(payloadValue: T | undefined, fallback: SectionHydrationResult<T>): T | undefined => {\n return payloadValue ?? fallback.data ?? undefined;\n};\n\n/**\n * True when payload is missing the value AND the fallback is still loading.\n */\nexport const isSectionLoading = <T>(payloadValue: T | undefined, fallback: SectionHydrationResult<T>): boolean => {\n return payloadValue === undefined && fallback.isLoading;\n};\n\n/**\n * Field-level merge of two section values. Payload fields (when defined) win\n * over hydrated fields; undefined payload fields are filled from the hydrated\n * value. Use when the agent sends partial section data (e.g. only a CTA) and\n * the client hydrates the remaining fields.\n */\nexport const mergeSectionValues = <T extends object>(\n payloadValue: T | undefined,\n hydratedValue: T | undefined,\n): T | undefined => {\n if (!hydratedValue) {\n return payloadValue;\n }\n if (!payloadValue) {\n return hydratedValue;\n }\n\n const defined: Partial<T> = {};\n for (const key of Object.keys(payloadValue) as Array<keyof T>) {\n const v = payloadValue[key];\n if (v !== undefined) {\n defined[key] = v;\n }\n }\n return { ...hydratedValue, ...defined } as T;\n};\n\n/**\n * Field-level merge for object sections. Payload fields (when defined) win over\n * fallback fields. Undefined payload fields are filled from the fallback. Use\n * this when the agent sends partial section data (e.g. only a CTA) and the\n * client needs to hydrate the remaining fields from app state.\n */\nexport const mergeSection = <T extends object>(\n payloadValue: T | undefined,\n fallback: SectionHydrationResult<T>,\n): T | undefined => {\n return mergeSectionValues(payloadValue, fallback.data ?? undefined);\n};\n\n/**\n * True when the payload provides every field in `requiredKeys` — the section\n * can render straight from the agent payload without waiting for hydration.\n */\nexport const sectionCoversKeys = <T extends object>(\n payloadValue: T | undefined,\n requiredKeys: ReadonlyArray<keyof T>,\n): boolean => {\n if (!payloadValue) {\n return false;\n }\n return requiredKeys.every((k) => payloadValue[k] !== undefined);\n};\n\n/**\n * True when the fallback is still loading AND the payload has not provided\n * every expected field (listed in `requiredKeys`). Use together with\n * `mergeSection` to decide whether to show a skeleton for the section.\n */\nexport const isSectionIncomplete = <T extends object>(\n payloadValue: T | undefined,\n fallback: SectionHydrationResult<T>,\n requiredKeys: ReadonlyArray<keyof T>,\n): boolean => {\n if (!fallback.isLoading) {\n return false;\n }\n if (!payloadValue) {\n return true;\n }\n return requiredKeys.some((k) => {\n return (payloadValue as T)[k] === undefined;\n });\n};\n"],"names":["v","k"],"mappings":";;;;;;;AAaO,MAAM,cAAc,CAAI,cAA6B,aAAuD;AACjH,SAAO,gBAAgB,SAAS,QAAQ;AAC1C;AAKO,MAAM,mBAAmB,CAAI,cAA6B,aAAiD;AAChH,SAAO,iBAAiB,UAAa,SAAS;AAChD;AAQO,MAAM,qBAAqB,CAChC,cACA,kBACkB;AAClB,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,UAAsB,CAAA;AAC5B,aAAW,OAAO,OAAO,KAAK,YAAY,GAAqB;AAC7D,UAAMA,KAAI,aAAa,GAAG;AAC1B,QAAIA,OAAM,QAAW;AACnB,cAAQ,GAAG,IAAIA;AAAA,IACjB;AAAA,EACF;AACA,SAAO,EAAE,GAAG,eAAe,GAAG,QAAA;AAChC;AAQO,MAAM,eAAe,CAC1B,cACA,aACkB;AAClB,SAAO,mBAAmB,cAAc,SAAS,QAAQ,MAAS;AACpE;AAMO,MAAM,oBAAoB,CAC/B,cACA,iBACY;AACZ,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AACA,SAAO,aAAa,MAAM,CAACC,OAAM,aAAaA,EAAC,MAAM,MAAS;AAChE;AAOO,MAAM,sBAAsB,CACjC,cACA,UACA,iBACY;AACZ,MAAI,CAAC,SAAS,WAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AACA,SAAO,aAAa,KAAK,CAACA,OAAM;AAC9B,WAAQ,aAAmBA,EAAC,MAAM;AAAA,EACpC,CAAC;AACH;"}
1
+ {"version":3,"file":"renderer.js","sources":["../src/renderer/widget-hydration/section-hydration.ts","../src/renderer/_access/ConversationWidgetGateSkeleton.tsx","../src/renderer/_agent-space/use-conversation-widget-agent-space-fallback.ts","../src/renderer/canvas/use-anchor-widget-agent-space-key.ts","../src/renderer/read-conversation-widget-variant.ts"],"sourcesContent":["export interface SectionHydrationResult<T> {\n data: T | null;\n isLoading: boolean;\n error?: string | null;\n}\n\nexport type SectionHydrator<T> = () => SectionHydrationResult<T>;\n\n/**\n * Prefer payload-provided value; fall back to a hydrator result; undefined otherwise.\n * Callers should call the fallback hook unconditionally (React hook rules) and pass\n * its result here.\n */\nexport const pickSection = <T>(payloadValue: T | undefined, fallback: SectionHydrationResult<T>): T | undefined => {\n return payloadValue ?? fallback.data ?? undefined;\n};\n\n/**\n * True when payload is missing the value AND the fallback is still loading.\n */\nexport const isSectionLoading = <T>(payloadValue: T | undefined, fallback: SectionHydrationResult<T>): boolean => {\n return payloadValue === undefined && fallback.isLoading;\n};\n\n/**\n * Field-level merge of two section values. Payload fields (when defined) win\n * over hydrated fields; undefined payload fields are filled from the hydrated\n * value. Use when the agent sends partial section data (e.g. only a CTA) and\n * the client hydrates the remaining fields.\n */\nexport const mergeSectionValues = <T extends object>(\n payloadValue: T | undefined,\n hydratedValue: T | undefined,\n): T | undefined => {\n if (!hydratedValue) {\n return payloadValue;\n }\n if (!payloadValue) {\n return hydratedValue;\n }\n\n const defined: Partial<T> = {};\n for (const key of Object.keys(payloadValue) as Array<keyof T>) {\n const v = payloadValue[key];\n if (v !== undefined) {\n defined[key] = v;\n }\n }\n return { ...hydratedValue, ...defined } as T;\n};\n\n/**\n * Field-level merge for object sections. Payload fields (when defined) win over\n * fallback fields. Undefined payload fields are filled from the fallback. Use\n * this when the agent sends partial section data (e.g. only a CTA) and the\n * client needs to hydrate the remaining fields from app state.\n */\nexport const mergeSection = <T extends object>(\n payloadValue: T | undefined,\n fallback: SectionHydrationResult<T>,\n): T | undefined => {\n return mergeSectionValues(payloadValue, fallback.data ?? undefined);\n};\n\n/**\n * True when the payload provides every field in `requiredKeys` — the section\n * can render straight from the agent payload without waiting for hydration.\n */\nexport const sectionCoversKeys = <T extends object>(\n payloadValue: T | undefined,\n requiredKeys: ReadonlyArray<keyof T>,\n): boolean => {\n if (!payloadValue) {\n return false;\n }\n return requiredKeys.every((k) => payloadValue[k] !== undefined);\n};\n\n/**\n * True when the fallback is still loading AND the payload has not provided\n * every expected field (listed in `requiredKeys`). Use together with\n * `mergeSection` to decide whether to show a skeleton for the section.\n */\nexport const isSectionIncomplete = <T extends object>(\n payloadValue: T | undefined,\n fallback: SectionHydrationResult<T>,\n requiredKeys: ReadonlyArray<keyof T>,\n): boolean => {\n if (!fallback.isLoading) {\n return false;\n }\n if (!payloadValue) {\n return true;\n }\n return requiredKeys.some((k) => {\n return (payloadValue as T)[k] === undefined;\n });\n};\n","import { Skeleton } from \"../../provider/components\";\nimport React from \"react\";\n\n/**\n * Neutral loading state shown by ConversationWidgetFeatureGate while another agent space's feature\n * flags are being fetched. The gate can't know the gated widget's own skeleton, so this\n * is a generic widget-sized placeholder.\n */\nexport const ConversationWidgetGateSkeleton = () => (\n <div data-testid=\"ConversationWidgetGateSkeleton\">\n <Skeleton height=\"20px\" width=\"40%\" />\n <Skeleton height=\"64px\" width=\"100%\" borderRadius=\"8px\" />\n </div>\n);\n","import { SectionHydrationResult } from \"../widget-hydration\";\nimport { useResolvedConversationWidgetAgentSpaceKey } from \"./use-resolved-conversation-widget-agent-space-key\";\n\n/**\n * The empty fallback of a widget of another agent space: such a widget must not merge what the app holds for the\n * ACTIVE agent space into its own data.\n */\nconst ANOTHER_AGENT_SPACE_EMPTY_FALLBACK = { data: null, isLoading: false, error: null } as const;\n\n/**\n * Resolves the widget's agent space and picks the fallback every snapshot widget needs with it.\n *\n * - Active agent space → the caller's live `activeFallback`, so `mergeSection` keeps merging the app's fresher data.\n * - Another agent space → a static empty result, so the widget's own data passes through `mergeSection` unmixed.\n *\n * Pass the result of the active-fallback hook in directly:\n * useConversationWidgetAgentSpaceFallback(agentSpaceKeyAttribute, useSomeActiveHydration())\n * The hook order is the same on every render.\n */\nexport const useConversationWidgetAgentSpaceFallback = <T>(\n agentSpaceKeyAttribute: string | number | undefined,\n activeFallback: SectionHydrationResult<T>,\n): {\n anotherAgentSpaceKey: number | undefined;\n isAnotherAgentSpace: boolean;\n fallback: SectionHydrationResult<T>;\n} => {\n const { anotherAgentSpaceKey, isAnotherAgentSpace } = useResolvedConversationWidgetAgentSpaceKey(agentSpaceKeyAttribute);\n return {\n anotherAgentSpaceKey,\n isAnotherAgentSpace,\n fallback: isAnotherAgentSpace ? (ANOTHER_AGENT_SPACE_EMPTY_FALLBACK as SectionHydrationResult<T>) : activeFallback,\n };\n};\n","import { useMemo } from \"react\";\nimport { useResolvedConversationWidgetAgentSpaceKey } from \"../_agent-space/use-resolved-conversation-widget-agent-space-key\";\nimport type { CanvasState } from \"./canvas-state\";\nimport { payloadHashOfInstanceId } from \"./canvas-state\";\nimport { findWidgetFenceByPayloadHash, findWidgetFencesInMarkdown } from \"./find-widget-fences-in-markdown\";\n\n/**\n * The key of the agent space the fence of the anchor message names — unresolved, exactly what the inline widget\n * receives as its prop. Undefined for a page anchor, a missing anchor message or a fence that names no agent space.\n * For a body whose inline widget resolves the key itself, so both resolve it the same way.\n */\nexport const useAnchorWidgetFenceAgentSpaceKey = (\n canvas: CanvasState,\n anchorMessageMarkdown: string | null,\n widgetName: string,\n): string | undefined =>\n useMemo(() => {\n if (canvas.anchor.kind !== \"message\" || anchorMessageMarkdown === null) return undefined;\n const payloadHash = payloadHashOfInstanceId(canvas.instanceId);\n const fence =\n payloadHash !== undefined\n ? findWidgetFenceByPayloadHash(anchorMessageMarkdown, widgetName, payloadHash)\n : findWidgetFencesInMarkdown(anchorMessageMarkdown).find((candidate) => candidate.name === widgetName);\n return fence?.agentSpaceKey;\n }, [canvas.anchor, canvas.instanceId, anchorMessageMarkdown, widgetName]);\n\n/**\n * The agent space a message-anchored canvas body works on, resolved the way its inline widget resolves it: the agent\n * space the fence names when it is ANOTHER one than the active one, else the chat's agent space (`chatAgentSpaceKey`,\n * passed by the shell), else the active one. For a page anchor: the anchor's agent space.\n *\n * A fence that names the ACTIVE agent space is dropped here in favour of the chat's agent space — the order of the\n * inline widgets that compute `anotherAgentSpaceKey ?? chatAgentSpaceKey`. A widget whose inline render lets the\n * fence win reads {@link useAnchorWidgetFenceAgentSpaceKey} instead.\n */\nexport const useAnchorWidgetAgentSpaceKey = (\n canvas: CanvasState,\n anchorMessageMarkdown: string | null,\n widgetName: string,\n chatAgentSpaceKey: number | undefined,\n): number | undefined => {\n const fenceAgentSpaceKey = useAnchorWidgetFenceAgentSpaceKey(canvas, anchorMessageMarkdown, widgetName);\n const { anotherAgentSpaceKey, activeAgentSpaceKey } = useResolvedConversationWidgetAgentSpaceKey(fenceAgentSpaceKey);\n if (canvas.anchor.kind === \"page\") return canvas.anchor.agentSpaceKey;\n return anotherAgentSpaceKey ?? chatAgentSpaceKey ?? activeAgentSpaceKey;\n};\n","/**\n * Density flag shared by snapshot widgets. Lives on the payload, but it\n * is a PRESENTATION choice the agent makes — independent of whether the widget's data\n * came from the agent's payload or from live hydration.\n */\nexport type ConversationWidgetVariant = \"compact\" | \"full\";\n\ninterface WithVariant {\n variant?: ConversationWidgetVariant;\n}\n\n/**\n * Read just the `variant` flag out of a raw widget payload string, even when the\n * rest of the payload is incomplete (so the agent can request a density with a\n * minimal `{\"variant\":\"compact\"}` and let the data hydrate).\n */\nexport const readPayloadVariant = (rawPayload: string): ConversationWidgetVariant | undefined => {\n try {\n const parsed = JSON.parse(rawPayload) as { variant?: unknown };\n if (parsed && (parsed.variant === \"compact\" || parsed.variant === \"full\")) {\n return parsed.variant;\n }\n } catch {\n // Non-JSON or empty payload — no variant to read.\n }\n return undefined;\n};\n\n/**\n * Overlay the agent's requested `variant` onto the resolved widget data. The agent's\n * payload variant always wins; when the payload omits it the resolved data's own\n * variant (or the widget default) stands.\n */\nexport const withConversationWidgetVariant = <T extends WithVariant>(\n base: T | undefined,\n rawPayload: string,\n): T | undefined => {\n if (!base) {\n return base;\n }\n const variant = readPayloadVariant(rawPayload);\n return variant ? { ...base, variant } : base;\n};\n"],"names":["v","k"],"mappings":";;;;;;;;;;;;;;AAaO,MAAM,cAAc,CAAI,cAA6B,aAAuD;AACjH,SAAO,gBAAgB,SAAS,QAAQ;AAC1C;AAKO,MAAM,mBAAmB,CAAI,cAA6B,aAAiD;AAChH,SAAO,iBAAiB,UAAa,SAAS;AAChD;AAQO,MAAM,qBAAqB,CAChC,cACA,kBACkB;AAClB,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,UAAsB,CAAA;AAC5B,aAAW,OAAO,OAAO,KAAK,YAAY,GAAqB;AAC7D,UAAMA,KAAI,aAAa,GAAG;AAC1B,QAAIA,OAAM,QAAW;AACnB,cAAQ,GAAG,IAAIA;AAAA,IACjB;AAAA,EACF;AACA,SAAO,EAAE,GAAG,eAAe,GAAG,QAAA;AAChC;AAQO,MAAM,eAAe,CAC1B,cACA,aACkB;AAClB,SAAO,mBAAmB,cAAc,SAAS,QAAQ,MAAS;AACpE;AAMO,MAAM,oBAAoB,CAC/B,cACA,iBACY;AACZ,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AACA,SAAO,aAAa,MAAM,CAACC,OAAM,aAAaA,EAAC,MAAM,MAAS;AAChE;AAOO,MAAM,sBAAsB,CACjC,cACA,UACA,iBACY;AACZ,MAAI,CAAC,SAAS,WAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AACA,SAAO,aAAa,KAAK,CAACA,OAAM;AAC9B,WAAQ,aAAmBA,EAAC,MAAM;AAAA,EACpC,CAAC;AACH;ACzFO,MAAM,iCAAiC,MAC5C,qBAAC,OAAA,EAAI,eAAY,kCACf,UAAA;AAAA,EAAA,oBAAC,UAAA,EAAS,QAAO,QAAO,OAAM,OAAM;AAAA,sBACnC,UAAA,EAAS,QAAO,QAAO,OAAM,QAAO,cAAa,MAAA,CAAM;AAAA,EAAA,CAC1D;ACLF,MAAM,qCAAqC,EAAE,MAAM,MAAM,WAAW,OAAO,OAAO,KAAA;AAY3E,MAAM,0CAA0C,CACrD,wBACA,mBAKG;AACH,QAAM,EAAE,sBAAsB,wBAAwB,2CAA2C,sBAAsB;AACvH,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,sBAAuB,qCAAmE;AAAA,EAAA;AAExG;ACtBO,MAAM,oCAAoC,CAC/C,QACA,uBACA,eAEA,QAAQ,MAAM;AACZ,MAAI,OAAO,OAAO,SAAS,aAAa,0BAA0B,KAAM,QAAO;AAC/E,QAAM,cAAc,wBAAwB,OAAO,UAAU;AAC7D,QAAM,QACJ,gBAAgB,SACZ,6BAA6B,uBAAuB,YAAY,WAAW,IAC3E,2BAA2B,qBAAqB,EAAE,KAAK,CAAC,cAAc,UAAU,SAAS,UAAU;AACzG,SAAO,OAAO;AAChB,GAAG,CAAC,OAAO,QAAQ,OAAO,YAAY,uBAAuB,UAAU,CAAC;AAWnE,MAAM,+BAA+B,CAC1C,QACA,uBACA,YACA,sBACuB;AACvB,QAAM,qBAAqB,kCAAkC,QAAQ,uBAAuB,UAAU;AACtG,QAAM,EAAE,sBAAsB,wBAAwB,2CAA2C,kBAAkB;AACnH,MAAI,OAAO,OAAO,SAAS,OAAQ,QAAO,OAAO,OAAO;AACxD,SAAO,wBAAwB,qBAAqB;AACtD;AC7BO,MAAM,qBAAqB,CAAC,eAA8D;AAC/F,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,UAAU;AACpC,QAAI,WAAW,OAAO,YAAY,aAAa,OAAO,YAAY,SAAS;AACzE,aAAO,OAAO;AAAA,IAChB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAOO,MAAM,gCAAgC,CAC3C,MACA,eACkB;AAClB,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,UAAU,mBAAmB,UAAU;AAC7C,SAAO,UAAU,EAAE,GAAG,MAAM,YAAY;AAC1C;"}
package/dist/styles.css CHANGED
@@ -5134,6 +5134,25 @@ thead + tbody .agents_row_VBlQR-:first-child {
5134
5134
  font-style: normal;
5135
5135
  font-weight: 600;
5136
5136
  text-decoration: underline;
5137
+ }html, body {
5138
+ margin: 0;
5139
+ padding: 0;
5140
+ }
5141
+
5142
+ .agents_root_prMo3u {
5143
+ container-type: inline-size;
5144
+ container-name: chatPane;
5145
+ width: var(--agents-widget-image-width);
5146
+ display: flow-root;
5147
+ overflow: visible;
5148
+ pointer-events: none;
5149
+ color: var(--agents-fg);
5150
+ background: var(--agents-bg);
5151
+ }
5152
+ .agents_root_prMo3u, .agents_root_prMo3u * {
5153
+ animation: none !important;
5154
+ transition: none !important;
5155
+ caret-color: transparent !important;
5137
5156
  }.agents_row_3Kb6Jj {
5138
5157
  display: grid;
5139
5158
  grid-template-columns: auto minmax(0, 1fr) auto;
@@ -5197,25 +5216,43 @@ thead + tbody .agents_row_VBlQR-:first-child {
5197
5216
  display: flex;
5198
5217
  flex-direction: column;
5199
5218
  gap: 0.25rem;
5200
- }html, body {
5201
- margin: 0;
5202
- padding: 0;
5219
+ }.agents_widgetLabel_WecWAw {
5220
+ text-transform: uppercase;
5221
+ letter-spacing: 0.08em;
5222
+ }.agents_cardFooter_mobDKj {
5223
+ display: flex;
5224
+ justify-content: space-between;
5225
+ align-items: center;
5226
+ gap: 0.75rem;
5227
+ margin-top: auto;
5203
5228
  }
5204
5229
 
5205
- .agents_root_prMo3u {
5206
- container-type: inline-size;
5207
- container-name: chatPane;
5208
- width: var(--agents-widget-image-width);
5209
- display: flow-root;
5210
- overflow: visible;
5211
- pointer-events: none;
5212
- color: var(--agents-fg);
5213
- background: var(--agents-bg);
5230
+ @container chatPane (max-width: 900px) {
5231
+ .agents_cardFooter_mobDKj {
5232
+ flex-wrap: wrap;
5233
+ }
5234
+ }.agents_stripReveal_6XAjCM {
5235
+ display: grid;
5236
+ grid-template-rows: 0fr;
5237
+ transition: grid-template-rows 250ms ease, opacity 200ms ease;
5238
+ opacity: 0;
5214
5239
  }
5215
- .agents_root_prMo3u, .agents_root_prMo3u * {
5216
- animation: none !important;
5217
- transition: none !important;
5218
- caret-color: transparent !important;
5240
+
5241
+ .agents_stripRevealOpen_sWkJwh {
5242
+ grid-template-rows: 1fr;
5243
+ opacity: 1;
5244
+ }
5245
+
5246
+ .agents_stripRevealInner_C2VlV7 {
5247
+ min-height: 0;
5248
+ overflow: hidden;
5249
+ }
5250
+
5251
+ .agents_strip_rKQFvx {
5252
+ display: flex;
5253
+ flex-wrap: wrap;
5254
+ gap: 0.5rem;
5255
+ padding: 0.5rem 0.5rem 0.25rem 0;
5219
5256
  }.agents_page_5VMDeD {
5220
5257
  display: flex;
5221
5258
  flex-wrap: wrap;
@@ -5286,6 +5323,39 @@ thead + tbody .agents_row_VBlQR-:first-child {
5286
5323
  flex-direction: column;
5287
5324
  gap: 0.125rem;
5288
5325
  min-width: 0;
5326
+ }.agents_page_C2OHtV {
5327
+ display: flex;
5328
+ flex-direction: column;
5329
+ gap: 1rem;
5330
+ width: 100%;
5331
+ padding: 1.5rem;
5332
+ background: var(--agents-bg-var);
5333
+ }
5334
+
5335
+ .agents_panel_GY8e08 {
5336
+ display: flex;
5337
+ flex-direction: column;
5338
+ gap: 0.25rem;
5339
+ padding: 1rem;
5340
+ border-radius: 1rem;
5341
+ background: var(--agents-bg-surface);
5342
+ box-shadow: 0 0.125rem 0.125rem rgba(var(--agents-shadow-rgb), 0.08), 0 0.25rem 0.5rem rgba(var(--agents-shadow-rgb), 0.05), 0 0.5rem 1.5rem rgba(var(--agents-shadow-rgb), 0.03);
5343
+ }
5344
+
5345
+ .agents_footer_NcyZo- {
5346
+ display: flex;
5347
+ justify-content: flex-end;
5348
+ margin-top: 0.5rem;
5349
+ }
5350
+
5351
+ .agents_composer_u-IY2N {
5352
+ display: flex;
5353
+ flex-direction: column;
5354
+ gap: 0.5rem;
5355
+ padding: 1rem;
5356
+ border-radius: 1rem;
5357
+ background: var(--agents-bg-surface);
5358
+ box-shadow: 0 0.125rem 0.125rem rgba(var(--agents-shadow-rgb), 0.08), 0 0.25rem 0.5rem rgba(var(--agents-shadow-rgb), 0.05), 0 0.5rem 1.5rem rgba(var(--agents-shadow-rgb), 0.03);
5289
5359
  }.agents_history_BIbikt {
5290
5360
  display: flex;
5291
5361
  flex-direction: column;
@@ -5744,28 +5814,6 @@ thead + tbody .agents_row_VBlQR-:first-child {
5744
5814
  white-space: nowrap;
5745
5815
  visibility: hidden;
5746
5816
  pointer-events: none;
5747
- }.agents_stripReveal_6XAjCM {
5748
- display: grid;
5749
- grid-template-rows: 0fr;
5750
- transition: grid-template-rows 250ms ease, opacity 200ms ease;
5751
- opacity: 0;
5752
- }
5753
-
5754
- .agents_stripRevealOpen_sWkJwh {
5755
- grid-template-rows: 1fr;
5756
- opacity: 1;
5757
- }
5758
-
5759
- .agents_stripRevealInner_C2VlV7 {
5760
- min-height: 0;
5761
- overflow: hidden;
5762
- }
5763
-
5764
- .agents_strip_rKQFvx {
5765
- display: flex;
5766
- flex-wrap: wrap;
5767
- gap: 0.5rem;
5768
- padding: 0.5rem 0.5rem 0.25rem 0;
5769
5817
  }.agents_narrow_vtbLHb {
5770
5818
  width: 60%;
5771
5819
  margin-left: auto;
@@ -0,0 +1,25 @@
1
+ import { type ConversationWidgetEntry } from "../../renderer/conversationWidgetRegistry";
2
+ export interface TestConversationWidgetsOptions {
3
+ /**
4
+ * Keeps the registered widgets beside the test widgets (a test widget replaces the registered one of its wire name).
5
+ * Default false: the registry holds the test widgets only, so an app's registrations made with its environment land
6
+ * nowhere while the installation lasts.
7
+ */
8
+ keepRegisteredWidgets?: boolean;
9
+ }
10
+ /**
11
+ * The registry entries a spec renders against, and the way back: `restore()` puts the entries the registry held before
12
+ * the installation. Everything that reads the registry — the widget host, the name resolver, the markdown renderer, an
13
+ * embedded widget — sees the test widgets while it lasts.
14
+ */
15
+ export declare class TestConversationWidgetsInstallation {
16
+ protected readonly previousWidgets: ConversationWidgetEntry[];
17
+ constructor(widgets: readonly ConversationWidgetEntry[], options?: TestConversationWidgetsOptions);
18
+ /** Puts the entries back that the registry held before the installation. */
19
+ restore(): void;
20
+ }
21
+ /**
22
+ * Renders a spec against widgets of its own instead of mocking the registry module: the test widgets take the
23
+ * registry's place (or join it, `keepRegisteredWidgets`) until `restore()`.
24
+ */
25
+ export declare const installTestConversationWidgets: (widgets: readonly ConversationWidgetEntry[], options?: TestConversationWidgetsOptions) => TestConversationWidgetsInstallation;
@@ -0,0 +1,42 @@
1
+ import type { RegisteredWidget, WidgetHydratorContext } from "../../renderer/widget-hydration/widget-hydration.types";
2
+ /**
3
+ * What a stand-in answers for one hydration: the data itself (a copy is handed out), `{ __status: <code> }` for a
4
+ * failed read (the widget observes `error`), or `{ __pending: true }` for a read that never ends (`loading`). The same
5
+ * shape as a preview fixture's `hydration` entry.
6
+ */
7
+ export type WidgetHydrationStandInAnswer = unknown | {
8
+ __status: number;
9
+ __body?: unknown;
10
+ } | {
11
+ __pending: true;
12
+ };
13
+ /**
14
+ * Hydration answered by a spec instead of mocking `useWidgetHydration`: every registered hydrator is replaced by one
15
+ * that answers from `answers` — by the hydration's derived key first, then by its type — and otherwise runs the real
16
+ * hydrator. A key that names no registered hydrator gets a stand-in hydrator of that type, so a widget hydrates even
17
+ * when the spec did not import the app's hydrator module. The widget runs its live code path (`useWidgetHydration`
18
+ * with the provider's state store); the answer arrives asynchronously, as a real read does. `restore()` puts the
19
+ * real hydrators back, removes the added ones and abandons every read started through the stand-ins that has not
20
+ * settled yet: the hydration hook keeps one in-flight read per key beyond a store and a mount, so a read left pending
21
+ * would otherwise hold every later mount of the same key in loading.
22
+ */
23
+ export declare class WidgetHydrationStandIns {
24
+ protected readonly answers: Readonly<Record<string, WidgetHydrationStandInAnswer>>;
25
+ protected readonly replacedHydrators: Map<string, RegisteredWidget<unknown, unknown>>;
26
+ protected readonly addedTypes: string[];
27
+ /** The hydration key of every read started through the stand-ins that has not settled yet, by its rejection. */
28
+ protected readonly unsettledReadKeys: Map<(reason: Error) => void, string>;
29
+ constructor(answers: Readonly<Record<string, WidgetHydrationStandInAnswer>>);
30
+ /**
31
+ * Puts the real hydrators back, removes the stand-ins added for types nothing had registered, and aborts and
32
+ * forgets the reads still pending, so the next mount of their keys reads anew.
33
+ */
34
+ restore(): void;
35
+ protected replaceHydrator(type: string, registered: RegisteredWidget<unknown, unknown>): void;
36
+ /** One read, abandoned by `restore()` while it has not settled. */
37
+ protected answer(type: string, derivedKey: string, payload: unknown, context: WidgetHydratorContext, registered: RegisteredWidget<unknown, unknown> | undefined): Promise<unknown>;
38
+ /** The answer for one read: the derived key's entry, else the type's, else the real hydrator (none: a failed read). */
39
+ protected readAnswer(type: string, derivedKey: string, payload: unknown, context: WidgetHydratorContext, registered: RegisteredWidget<unknown, unknown> | undefined): Promise<unknown>;
40
+ }
41
+ /** Installs hydration stand-ins (`WidgetHydrationStandIns`); call `restore()` on the result after the spec. */
42
+ export declare const installWidgetHydrationStandIns: (answers: Readonly<Record<string, WidgetHydrationStandInAnswer>>) => WidgetHydrationStandIns;
@@ -17,5 +17,17 @@ export { ConversationErrorCard, type ConversationErrorCardProps } from "../chat/
17
17
  export { ConversationMessageInputAttachmentsErrorBox } from "../chat/ConversationMessageInput/ConversationMessageInputAttachments/ConversationMessageInputAttachmentsErrorBox";
18
18
  export { ConversationMessageInputAttachmentsPreviewStrip } from "../chat/ConversationMessageInput/ConversationMessageInputAttachments/ConversationMessageInputAttachmentsPreviewStrip";
19
19
  export { normalizeServerMessageToMarkdown } from "../chat/normalize-server-message-to-markdown";
20
+ export { PHONE_CALL_LIFECYCLE_SIGNAL_SOURCES, SIGNAL_SOURCES_THAT_OWE_NO_WORK, } from "../chat/last-wire-message-is-unanswered-user-message";
20
21
  export { ConversationWidgetProvider, type ConversationWidgetProviderProps } from "../renderer/ConversationWidgetContext";
21
22
  export { CanvasRestoreOnMount, type CanvasRestoreOnMountProps } from "../renderer/canvas/CanvasRestoreOnMount";
23
+ export { ConversationDeepLinkedWidget, type ConversationDeepLinkedWidgetProps, } from "../renderer/ConversationDeepLinkedWidget";
24
+ export { CanvasPane } from "../chat/CanvasPane/CanvasPane";
25
+ export { ConversationMessageList } from "../chat/ConversationMessageList/ConversationMessageList";
26
+ export { ConversationMessageUser, type ConversationMessageUserProps, type ConversationMessageUserTheme, } from "../chat/ConversationMessage/ConversationMessageUser/ConversationMessageUser";
27
+ export { ConversationMessageWidgets, type ConversationMessageWidgetsProps, } from "../chat/ConversationMessage/ConversationMessageWidgets/ConversationMessageWidgets";
28
+ export { ConversationMessageSystem, type ConversationMessageSystemProps, } from "../chat/ConversationMessage/ConversationMessageSystem/ConversationMessageSystem";
29
+ export { ConversationMessageInput, MAX_MESSAGE_LENGTH, type ConversationMessageInputHandle, type ConversationMessageInputProps, } from "../chat/ConversationMessageInput/ConversationMessageInput";
30
+ export type { ConversationMessageInputAttachmentPreview, ConversationMessageInputAttachmentUploadStatus, } from "../chat/ConversationMessageInput/ConversationMessageInputAttachments/ConversationMessageInputAttachmentPreviewCard";
31
+ export type { AssistantServerMessagePayload } from "../chat/normalize-server-message-to-markdown";
32
+ export { useActivityTicker, SUCCESS_BEAT_MS } from "../chat/controller/use-activity-ticker";
33
+ export { formatElapsedClock, isStepStillRunning, type ActivityTickerLine } from "../chat/controller/activity-ticker";
@@ -1 +1,5 @@
1
1
  export * from "../client/testing/createInMemoryAgentsConversationClient";
2
+ export { installWidgetHydrationStandIns, WidgetHydrationStandIns, type WidgetHydrationStandInAnswer, } from "../client/testing/widget-hydration-stand-ins";
3
+ export { installTestConversationWidgets, TestConversationWidgetsInstallation, type TestConversationWidgetsOptions, } from "../client/testing/test-conversation-widgets";
4
+ export { resetGoogleMapsAuthFailureForTests, simulateGoogleMapsAuthFailure, } from "../kit/components/map/use-google-maps-auth-failure";
5
+ export { clearStoredCanvas, readStoredCanvas, storeOpenCanvas, type StoredCanvasPointer, } from "../renderer/canvas/canvasStorage";
@@ -1 +1,2 @@
1
1
  export * from "../contract/conversation";
2
+ export { buildChangedMessagesRequest } from "../chat/controller/changed-messages-request";
@@ -4,6 +4,7 @@ export { registerConversationWidgets, type ConversationWidgetEntry, } from "../r
4
4
  export { registerCanvasBodies } from "../renderer/canvas/canvasBodies";
5
5
  export { registerCanvasFeatureFlags } from "../renderer/canvas/canvas-feature-flags";
6
6
  export { registerWidgetHydrator } from "../renderer/widget-hydration/widget-hydration.registry";
7
- export { registerComposedViewDataSourceFetcher } from "../renderer/widget-tree/composed-view-data-sources";
8
- export { registerEntityDetailBodies } from "../kit/entity-detail/entity-detail-bodies";
9
- export { registerConceptExplainerTypes } from "../widgets/ConceptExplainerConversationWidget/shared/concept-explainer-types";
7
+ export { registerComposedViewDataSourceFetcher, type ComposedViewDataSourceFetcher, } from "../renderer/widget-tree/composed-view-data-sources";
8
+ export { getEntityDetailBody, readEntityDetailBodyDefinitions, registerEntityDetailBodies, type EntityDetailBodyDefinition, } from "../kit/entity-detail/entity-detail-bodies";
9
+ export { readConceptExplainerTypeDefinitions, registerConceptExplainerTypes, } from "../widgets/ConceptExplainerConversationWidget/shared/concept-explainer-types";
10
+ export type { ConceptExplainerTypeDefinition } from "../widgets/ConceptExplainerConversationWidget/shared/concept-explainer-type";
@@ -2,3 +2,10 @@ export { ComposedViewConversationWidget } from "../kit/ComposedViewConversationW
2
2
  export { ComposedViewRenderer } from "../kit/ComposedViewRenderer";
3
3
  export * from "../kit/composed-view-component-types";
4
4
  export * from "../kit/composed-view-tones";
5
+ export { ModelText, type ModelTextProps } from "../kit/ModelText/ModelText";
6
+ export { EmbeddedConversationWidget, type EmbeddedConversationWidgetProps, } from "../kit/components/embedding/EmbeddedConversationWidget";
7
+ export { ApexChart } from "../kit/components/data/apex-chart-component";
8
+ export { useChartPalette } from "../kit/components/data/use-chart-palette";
9
+ export { useNumberLocale } from "../kit/components/data/use-number-locale";
10
+ export type { EntityDetailBodyProps } from "../kit/entity-detail/entity-detail-bodies";
11
+ export { EntityDetailNameReportContext, useReportEntityDetailName } from "../kit/entity-detail/entity-detail-name";
@@ -6,3 +6,5 @@ export { publishWidgetPreviewSignal, readWidgetPreviewSignalGlobalNames, WIDGET_
6
6
  export { installWidgetPreviewRequests, isPendingResponse, widgetPreviewRequestKey } from "../preview/widget-preview-requests";
7
7
  export { installWidgetPreviewHydration } from "../preview/widget-preview-hydration";
8
8
  export { buildPreviewComposedViewComponents } from "../preview/preview-stub-components";
9
+ export { EntityMentionAskFlowStory } from "../widgets/EntityMentionConversationWidget/stories/EntityMentionAskFlowStory";
10
+ export { mapFixtureToDeclaredAgentSpaceKeyFieldName } from "../renderer/_agent-space/declared-agent-space-key-field-name";
@@ -0,0 +1 @@
1
+ export * from "../provider";
@@ -8,8 +8,26 @@ export { conversationWidgetRegistry, getConversationWidgetRegistryRevision, read
8
8
  export { closestWidgetNames, resolveCanonicalWidgetName, resolveWidgetName } from "../renderer/widget-name-resolver";
9
9
  export * from "../renderer/render-report/widget-render-report";
10
10
  export * from "../renderer/widget-hydration";
11
+ export { unregisterWidgetHydrator } from "../renderer/widget-hydration/widget-hydration.registry";
11
12
  export * from "../renderer/canvas/canvas-behaviours";
12
13
  export * from "../renderer/canvas/canvas-state";
13
14
  export { canvasBodies, canvasFeatureFlagOf, type CanvasBodyProps } from "../renderer/canvas/canvasBodies";
14
- export { readComposedViewTree } from "../renderer/widget-tree/composed-view-tree";
15
+ export { readOpenEntityActionTarget, type OpenEntityActionTarget, } from "../renderer/canvas/entity-detail-instance";
16
+ export { composedViewTreeToWire, readComposedViewTree } from "../renderer/widget-tree/composed-view-tree";
15
17
  export { addComposedNodeSchemaApplicationPart, composedNodeSchema, getComposedNodeSchema, type ComposedNodeSchema, type ComposedNodeSchemaApplicationPart, } from "../renderer/widget-tree/composed-node-schema";
18
+ export { ConversationWidgetRenderContext, useIsEmailWidgetRender } from "../renderer/ConversationWidgetRenderContext";
19
+ export { ConversationWidgetActions } from "../renderer/ConversationWidgetActions/ConversationWidgetActions";
20
+ export { ConversationWidgetGateSkeleton } from "../renderer/_access/ConversationWidgetGateSkeleton";
21
+ export { ConversationWidgetAgentSpaceFrame } from "../renderer/_agent-space/ConversationWidgetAgentSpaceFrame";
22
+ export { ConversationWidgetAgentSpaceHeader, type ConversationWidgetAgentSpaceHeaderProps, } from "../renderer/_agent-space/ConversationWidgetAgentSpaceHeader";
23
+ export { useConversationWidgetAgentSpaceFallback } from "../renderer/_agent-space/use-conversation-widget-agent-space-fallback";
24
+ export { useResolvedConversationWidgetAgentSpaceKey, type ResolvedConversationWidgetAgentSpaceKey, } from "../renderer/_agent-space/use-resolved-conversation-widget-agent-space-key";
25
+ export { buildWidgetAgentSpaceKeyProps, readWidgetAgentSpaceKeyAttribute, type WidgetAgentSpaceKeyAttribute, } from "../renderer/_agent-space/widget-agent-space-key-attribute";
26
+ export { findWidgetFenceByPayloadHash, findWidgetFencesInMarkdown, type WidgetFenceInMessage, } from "../renderer/canvas/find-widget-fences-in-markdown";
27
+ export { useAnchorWidgetAgentSpaceKey, useAnchorWidgetFenceAgentSpaceKey } from "../renderer/canvas/use-anchor-widget-agent-space-key";
28
+ export { useAnchorWidgetPayload } from "../renderer/canvas/use-anchor-widget-payload";
29
+ export { applyClearCanvas, applyCloseCanvas, applyOpenCanvas, applyResetCanvasForNewTurn, applySetCanvasCreatedEntityId, type CanvasCreatedEntity, type CanvasSliceState, } from "../renderer/canvas/canvas-reducers";
30
+ export { withConversationWidgetVariant, type ConversationWidgetVariant } from "../renderer/read-conversation-widget-variant";
31
+ export { buildWidgetRenderReportSignal, parseWidgetRenderReportSignal, WIDGET_RENDER_REPORT_SIGNAL_SOURCE, type ParsedWidgetRenderReport, type WidgetRenderBlockReport, } from "../renderer/render-report/widget-render-report-collector";
32
+ export { deepLinkableWidgetNameForCanvas, resolveDeepLinkableWidget } from "../renderer/resolve-deep-linkable-widget";
33
+ export { getWidgetClickSignalSources, isWidgetClickSignalSource } from "../renderer/widget-click-signal-sources";
@@ -14,3 +14,16 @@ export { ToolTraceConversationWidget } from "../widgets/ToolTraceConversationWid
14
14
  export { WebSearchResultsConversationWidget } from "../widgets/WebSearchResultsConversationWidget/WebSearchResultsConversationWidget";
15
15
  export { WritingDraftConversationWidget } from "../widgets/WritingDraftConversationWidget/WritingDraftConversationWidget";
16
16
  export * from "../widgets/_shared/modern";
17
+ export type { CanvasWidgetCardCanvas } from "../widgets/CanvasWidgetCard/CanvasWidgetCard";
18
+ export { CANVAS_VIABLE_MIN_WIDTH, useCanvasViable } from "../widgets/CanvasWidgetCard/use-canvas-viable";
19
+ export { WidgetLabel } from "../widgets/_shared/WidgetLabel";
20
+ export { CardFooter } from "../widgets/_shared/CardFooter";
21
+ export { DonePill } from "../widgets/_shared/DonePill";
22
+ export { SkeletonCircle, SkeletonLine, SkeletonPill, SkeletonWidgetLabel } from "../widgets/_shared/skeleton-primitives";
23
+ export { pickAllowed, pickAllowedValue, pickReviewExternalId, pickSafeAlias, pickSafeAliases, pickText, } from "../widgets/_shared/widget-payload-validation";
24
+ export { createEntityUpdateChannel, type EntityUpdate } from "../widgets/_shared/entity-update-channel";
25
+ export { useElementVisible } from "../widgets/_shared/use-element-visible";
26
+ export { normalizeSearchHitExcerpt } from "../widgets/ConversationSearchResultsConversationWidget/shared/search-hit-excerpt";
27
+ export type { ConceptExplainerStep, ConceptExplainerStepsInput, ConceptExplainerText, ConceptExplainerValues, ConceptExplainerValuesReading, ConceptExplainerVariant, ConceptExplainerVisualProps, } from "../widgets/ConceptExplainerConversationWidget/shared/concept-explainer-type";
28
+ export { readConceptExplainerNumber, readConceptExplainerValue, } from "../widgets/ConceptExplainerConversationWidget/shared/concept-explainer-widget-payload";
29
+ export { formatConceptExplainerNumber } from "../widgets/ConceptExplainerConversationWidget/shared/use-concept-explainer-language";
@@ -0,0 +1,3 @@
1
+ import type { ComponentType } from "react";
2
+ import type { Props as ReactApexChartProps } from "react-apexcharts";
3
+ export declare const ApexChart: ComponentType<ReactApexChartProps>;