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

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 (143) hide show
  1. package/README.md +3 -2
  2. package/dist/chat.js +22 -72
  3. package/dist/chat.js.map +1 -1
  4. package/dist/chunks/{ConversationMarkdown-W7NHglmL.js → ConversationMarkdown-CJhAnuVa.js} +110 -8
  5. package/dist/chunks/ConversationMarkdown-CJhAnuVa.js.map +1 -0
  6. package/dist/chunks/{WebSearchResultsConversationWidget-BvnLWHyi.js → WebSearchResultsConversationWidget-DRBQvycE.js} +140 -1125
  7. package/dist/chunks/WebSearchResultsConversationWidget-DRBQvycE.js.map +1 -0
  8. package/dist/chunks/{canvasBodies-9SuF6NAB.js → canvasBodies-DLjDkviP.js} +9 -6
  9. package/dist/chunks/canvasBodies-DLjDkviP.js.map +1 -0
  10. package/dist/chunks/{canvas-behaviours-BRFR1ALE.js → decide-canvas-open-DBWoWtAC.js} +18 -2
  11. package/dist/chunks/decide-canvas-open-DBWoWtAC.js.map +1 -0
  12. package/dist/chunks/entity-detail-name-3A82gDAp.js +15 -0
  13. package/dist/chunks/entity-detail-name-3A82gDAp.js.map +1 -0
  14. package/dist/chunks/icon-names-Di6c4zLo.js +86 -0
  15. package/dist/chunks/icon-names-Di6c4zLo.js.map +1 -0
  16. package/dist/chunks/index-7Qc_3GbG.js +1046 -0
  17. package/dist/chunks/index-7Qc_3GbG.js.map +1 -0
  18. package/dist/chunks/{widget-image-readiness-signal-DeOuL89j.js → widget-image-readiness-signal-D3ci53xr.js} +2 -2
  19. package/dist/chunks/{widget-image-readiness-signal-DeOuL89j.js.map → widget-image-readiness-signal-D3ci53xr.js.map} +1 -1
  20. package/dist/chunks/{widget-name-resolver-DyIY6Zu4.js → widget-name-resolver-C8SfpiR5.js} +48 -116
  21. package/dist/chunks/widget-name-resolver-C8SfpiR5.js.map +1 -0
  22. package/dist/client-testing.js +68 -1
  23. package/dist/client-testing.js.map +1 -1
  24. package/dist/files/chat/Conversation.module.scss +268 -0
  25. package/dist/files/chat/ConversationViewBody/ConversationViewBody.module.scss +336 -0
  26. package/dist/files/chat/_conversation-tokens.scss +37 -0
  27. package/dist/files/image-render/WidgetImageRender.module.scss +22 -0
  28. package/dist/files/kit/ComposedViewConversationWidget.md +59 -0
  29. package/dist/files/kit/components/data/data.preview-fixtures.json +3298 -0
  30. package/dist/files/kit/components/embedding/widget.preview-fixtures.json +147 -0
  31. package/dist/files/kit/components/entity/entity-link.preview-fixtures.json +340 -0
  32. package/dist/files/kit/components/form/form.preview-fixtures.json +319 -0
  33. package/dist/files/kit/components/inputs/button.preview-fixtures.json +301 -0
  34. package/dist/files/kit/components/inputs/checkbox.preview-fixtures.json +35 -0
  35. package/dist/files/kit/components/inputs/date-picker.preview-fixtures.json +36 -0
  36. package/dist/files/kit/components/inputs/input.preview-fixtures.json +55 -0
  37. package/dist/files/kit/components/inputs/radio-group.preview-fixtures.json +76 -0
  38. package/dist/files/kit/components/inputs/select.preview-fixtures.json +314 -0
  39. package/dist/files/kit/components/inputs/slider.preview-fixtures.json +178 -0
  40. package/dist/files/kit/components/inputs/tabs.preview-fixtures.json +304 -0
  41. package/dist/files/kit/components/inputs/textarea.preview-fixtures.json +37 -0
  42. package/dist/files/kit/components/layout/layout.preview-fixtures.json +892 -0
  43. package/dist/files/kit/components/map/map.preview-fixtures.json +339 -0
  44. package/dist/files/kit/components/media/image-group.preview-fixtures.json +228 -0
  45. package/dist/files/kit/components/media/image.preview-fixtures.json +61 -0
  46. package/dist/files/kit/components/media/video-card/video-card.preview-fixtures.json +121 -0
  47. package/dist/files/kit/components/media/video.preview-fixtures.json +68 -0
  48. package/dist/files/kit/components/rich/code.preview-fixtures.json +105 -0
  49. package/dist/files/kit/components/rich/diagram.preview-fixtures.json +89 -0
  50. package/dist/files/kit/components/rich/math.preview-fixtures.json +152 -0
  51. package/dist/files/kit/components/rich/svg.preview-fixtures.json +243 -0
  52. package/dist/files/kit/components/text/badge.preview-fixtures.json +44 -0
  53. package/dist/files/kit/components/text/caption.preview-fixtures.json +31 -0
  54. package/dist/files/kit/components/text/favicon.preview-fixtures.json +69 -0
  55. package/dist/files/kit/components/text/label.preview-fixtures.json +48 -0
  56. package/dist/files/kit/components/text/link.preview-fixtures.json +103 -0
  57. package/dist/files/kit/components/text/markdown.preview-fixtures.json +29 -0
  58. package/dist/files/kit/components/text/source-ref.preview-fixtures.json +51 -0
  59. package/dist/files/kit/components/text/text.preview-fixtures.json +106 -0
  60. package/dist/files/kit/components/text/title.preview-fixtures.json +172 -0
  61. package/dist/files/kit/composed-view-widget-contract.json +88 -0
  62. package/dist/files/kit/composed-view.preview-fixtures.json +376 -0
  63. package/dist/files/renderer/conversation-widget-layout.module.scss +47 -0
  64. package/dist/files/renderer/widget-tree/composed-node-schema.json +3428 -0
  65. package/dist/files/styles/_conversation-widget-container.scss +6 -0
  66. package/dist/files/styles/_media.scss +50 -0
  67. package/dist/files/styles/_spacings.scss +23 -0
  68. package/dist/files/styles/_surfaces.scss +28 -0
  69. package/dist/files/widgets/ClockConversationWidget/ClockConversationWidget.md +53 -0
  70. package/dist/files/widgets/ClockConversationWidget/clock.preview-fixtures.json +76 -0
  71. package/dist/files/widgets/ConceptExplainerConversationWidget/ConceptExplainerConversationWidget.md +86 -0
  72. package/dist/files/widgets/ConceptExplainerConversationWidget/concept-explainer.preview-fixtures.json +23 -0
  73. package/dist/files/widgets/ConversationSearchResultsConversationWidget/ConversationSearchResultsConversationWidget.md +59 -0
  74. package/dist/files/widgets/ConversationSearchResultsConversationWidget/conversation-search-results.preview-fixtures.json +85 -0
  75. package/dist/files/widgets/CurrencyConverterConversationWidget/CurrencyConverterConversationWidget.md +51 -0
  76. package/dist/files/widgets/CurrencyConverterConversationWidget/currency-converter.preview-fixtures.json +73 -0
  77. package/dist/files/widgets/CustomVisualizationConversationWidget/CustomVisualizationConversationWidget.md +83 -0
  78. package/dist/files/widgets/CustomVisualizationConversationWidget/custom-visualization.preview-fixtures.json +227 -0
  79. package/dist/files/widgets/CustomVisualizationConversationWidget/sandbox-frame/custom-visualization-frame.html +188 -0
  80. package/dist/files/widgets/EntityMentionConversationWidget/EntityMentionConversationWidget.md +55 -0
  81. package/dist/files/widgets/EntityMentionConversationWidget/entity-mention.preview-fixtures.json +55 -0
  82. package/dist/files/widgets/MultiChoiceConversationWidget/MultiChoiceConversationWidget.md +61 -0
  83. package/dist/files/widgets/MultiChoiceConversationWidget/multi-choice-widget-contract.json +43 -0
  84. package/dist/files/widgets/MultiChoiceConversationWidget/multi-choice.preview-fixtures.json +103 -0
  85. package/dist/files/widgets/QuickRepliesConversationWidget/QuickRepliesConversationWidget.md +65 -0
  86. package/dist/files/widgets/QuickRepliesConversationWidget/quick-replies-widget-contract.json +43 -0
  87. package/dist/files/widgets/QuickRepliesConversationWidget/quick-replies.preview-fixtures.json +45 -0
  88. package/dist/files/widgets/SuggestedActions/SuggestedActions.md +60 -0
  89. package/dist/files/widgets/SuggestedActions/suggested-actions.preview-fixtures.json +19 -0
  90. package/dist/files/widgets/ToolTraceConversationWidget/ToolTraceConversationWidget.md +48 -0
  91. package/dist/files/widgets/ToolTraceConversationWidget/tool-trace.preview-fixtures.json +32 -0
  92. package/dist/files/widgets/WebSearchResultsConversationWidget/WebSearchResultsConversationWidget.md +49 -0
  93. package/dist/files/widgets/WebSearchResultsConversationWidget/web-search-results.preview-fixtures.json +57 -0
  94. package/dist/files/widgets/WritingDraftConversationWidget/WritingDraftConversationWidget.md +66 -0
  95. package/dist/files/widgets/WritingDraftConversationWidget/writing-draft.preview-fixtures.json +129 -0
  96. package/dist/image-render.js +11 -10
  97. package/dist/image-render.js.map +1 -1
  98. package/dist/index.js +32 -28
  99. package/dist/index.js.map +1 -1
  100. package/dist/kit.js +11 -2
  101. package/dist/kit.js.map +1 -1
  102. package/dist/preview.js +7 -6
  103. package/dist/provider.js +71 -0
  104. package/dist/provider.js.map +1 -0
  105. package/dist/renderer.js +138 -63
  106. package/dist/renderer.js.map +1 -1
  107. package/dist/styles.css +32 -17
  108. package/dist/types/client/testing/test-conversation-widgets.d.ts +25 -0
  109. package/dist/types/client/testing/widget-hydration-stand-ins.d.ts +33 -0
  110. package/dist/types/entries/chat.d.ts +10 -0
  111. package/dist/types/entries/client-testing.d.ts +2 -0
  112. package/dist/types/entries/index.d.ts +4 -3
  113. package/dist/types/entries/kit.d.ts +7 -0
  114. package/dist/types/entries/preview.d.ts +1 -0
  115. package/dist/types/entries/provider.d.ts +1 -0
  116. package/dist/types/entries/renderer.d.ts +16 -0
  117. package/dist/types/entries/widgets.d.ts +13 -0
  118. package/dist/types/kit/components/data/apex-chart-component.d.ts +3 -0
  119. package/dist/types/kit/components/data/chart-model.d.ts +164 -0
  120. package/dist/types/kit/components/data/data-value-format.d.ts +44 -0
  121. package/dist/types/kit/components/data/use-chart-palette.d.ts +9 -0
  122. package/dist/types/kit/components/data/use-number-locale.d.ts +5 -0
  123. package/dist/types/provider/index.d.ts +1 -0
  124. package/dist/types/renderer/_access/ConversationWidgetGateSkeleton.d.ts +6 -0
  125. package/dist/types/renderer/_agent-space/use-conversation-widget-agent-space-fallback.d.ts +16 -0
  126. package/dist/types/renderer/canvas/use-anchor-widget-agent-space-key.d.ts +17 -0
  127. package/dist/types/renderer/conversationWidgetRegistry.d.ts +6 -0
  128. package/dist/types/renderer/read-conversation-widget-variant.d.ts +22 -0
  129. package/dist/types/widgets/_shared/CardFooter.d.ts +6 -0
  130. package/dist/types/widgets/_shared/WidgetLabel.d.ts +8 -0
  131. package/dist/types/widgets/_shared/entity-update-channel.d.ts +17 -0
  132. package/dist/types/widgets/_shared/use-element-visible.d.ts +6 -0
  133. package/dist/widgets.js +120 -27
  134. package/dist/widgets.js.map +1 -1
  135. package/package.json +74 -1
  136. package/public-api.json +761 -0
  137. package/dist/chunks/ConversationMarkdown-W7NHglmL.js.map +0 -1
  138. package/dist/chunks/WebSearchResultsConversationWidget-BvnLWHyi.js.map +0 -1
  139. package/dist/chunks/canvas-behaviours-BRFR1ALE.js.map +0 -1
  140. package/dist/chunks/canvasBodies-9SuF6NAB.js.map +0 -1
  141. package/dist/chunks/decide-canvas-open-Ct-wnNEJ.js +0 -20
  142. package/dist/chunks/decide-canvas-open-Ct-wnNEJ.js.map +0 -1
  143. package/dist/chunks/widget-name-resolver-DyIY6Zu4.js.map +0 -1
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: WritingDraft
3
+ emitter: agent
4
+ summary: Editable draft of a text the owner sends or publishes — an e-mail, letter, post, reply or message; the text lives ONLY in the block, your line names it. An optional recipient and subject, the body as formatted text; the owner edits it in place, copies it and opens an e-mail draft in their own mail program. Nothing is sent from the widget.
5
+ description: Shows a text the agent drafted for the owner to send or publish themselves, the way ChatGPT's writing block does — a kind label (e-mail, letter, post, reply, message draft) and the headline, for an e-mail or a letter the recipient and subject rows, then the text formatted from Markdown (paragraphs, emphasis, lists, quotes, safe http links; no images, no raw HTML). The owner can edit the recipient, the subject and the text in place, go back to the original draft, copy the text as plain text, and for an e-mail open it in their own mail program through a mailto link with recipient, subject and text. Every edit stays in the browser — the widget sends nothing to the agent and nothing to anyone else, and says so while the owner edits. In a report e-mail it shows the draft read-only. DATA-COMPLETE, inline, not answerable.
6
+ ---
7
+
8
+ # WritingDraftConversationWidget
9
+
10
+ ## Description
11
+ A drafted text the owner will send or publish themselves: an e-mail to a supplier, a letter to a landlord, a post for
12
+ the shop window, a reply to a customer's message. The widget shows the kind label with the model's `title` under it
13
+ (only when it says more than the subject) above the card; the card reads like the message itself — for an e-mail or
14
+ a letter the recipient and subject as a mail header ("No recipient yet" muted when there is none), a hairline, then the
15
+ text formatted from Markdown — the safe subset of the kit's `Markdown` node: paragraphs, emphasis, lists, quotes, http(s) links in a new
16
+ tab; images, other link schemes and raw HTML are dropped. A post shows its character count at the bottom right.
17
+ The actions are small pills centred under the card, outside it.
18
+
19
+ The owner can:
20
+ - **Edit** — the recipient, the subject and the text turn into fields in the same card; "Done" shows the formatted
21
+ text again, "Discard changes" restores the model's version. A line in the card says the changes stay on this
22
+ screen and the assistant does not see them; an "Edited by you" marker shows while the text differs.
23
+ - **Copy** — the text as plain text (no Markdown syntax), the owner's edit included.
24
+ - **Open in mail** (e-mail drafts only) — a `mailto:` link with the recipient (only real e-mail addresses),
25
+ the subject and the plain text. A text longer than a mail link carries reliably (~1,900 characters) opens the mail
26
+ without the text and the widget tells the owner to copy it.
27
+
28
+ Nothing is sent and nothing is reported: the widget is **not answerable** (no reaction sentence, no signal) and awaits
29
+ nothing. No tool or gate reads what the owner did on it, and there is no send tool behind it — when the owner wants
30
+ the assistant to rework their edited version, they paste or describe it in the chat. A review reply, a social post or
31
+ any text one of our tools saves or publishes goes through that tool and its own widget, never through this one.
32
+
33
+ States: a block without a text renders one muted line and reports `empty` (`NO_DATA`); a payload that is not a JSON
34
+ object, or a `body` that is no text (an object, a list), renders one muted line and reports `failed` (`INVALID_PROP`). There is no loading state — nothing is fetched.
35
+ In a report e-mail the draft renders read-only, without the actions.
36
+
37
+ ## Data structure — DATA-COMPLETE (the whole draft in the block)
38
+ ```ts
39
+ interface WritingDraftPayload {
40
+ kind?: "email" | "letter" | "post" | "reply" | "message" | "other"; // OMIT → a plain "Text draft"
41
+ title?: string; // the headline in the owner's language — "Anfrage an Bäckerei Müller"; OMIT → the subject
42
+ recipient?: string; // an e-mail address ("info@baeckerei-mueller.de", several comma-separated) or a name
43
+ subject?: string; // the subject line of an e-mail or a letter
44
+ body: string; // the draft text as Markdown (paragraphs with blank lines, **bold**, lists); at most 20,000 characters
45
+ }
46
+ ```
47
+ Accepted aliases (weak models rename fields): `variant` / `draftType` for `kind` (`e-mail`, `mail`, `social`, `sms`
48
+ … are mapped); `to` / `recipients` (a list) / `addressee` for `recipient`; `content`, `text`, `markdown`, `message`
49
+ for `body`, also ChatGPT's `content: {"format": "markdown", "text": "…"}`; `heading` for `title`. A recipient written as
50
+ "not specified" / "unknown" counts as none. Never put three backticks into the text — they end the widget block.
51
+
52
+ E-mail draft:
53
+ ```widget
54
+ { "type": "WritingDraft", "kind": "email", "recipient": "info@baeckerei-mueller.de", "subject": "Kurze Anfrage", "body": "Guten Tag,\n\nich interessiere mich für Ihr Angebot und hätte gerne einige weitere Informationen zu Preisen, Verfügbarkeit und Konditionen.\n\nKönnten Sie mir die entsprechenden Unterlagen zusenden?\n\nVielen Dank und freundliche Grüße" }
55
+ ```
56
+ Post draft:
57
+ ```widget
58
+ { "type": "WritingDraft", "kind": "post", "title": "Post zur Wiedereröffnung", "body": "**Wir sind wieder da!** Ab Montag, 3. November, haben wir wieder für euch geöffnet." }
59
+ ```
60
+
61
+ ## When to use
62
+ - When the owner asks for a text they will send or publish themselves — an e-mail, a letter, a message, a post or a reply ("Schreib mir eine E-Mail an meinen Lieferanten"): ONE WritingDraft with the whole text in `body` (Markdown), the `kind`, and for an e-mail the `recipient` (an e-mail address when the owner gave one) and the `subject`.
63
+ - Write a SHORT one-line prose intro FIRST ("Hier ist ein Entwurf für deine Anfrage:"), then the widget on its own line; do not paste the draft a second time in prose.
64
+ - Write the draft in the language of its reader, with the facts the owner gave — no invented prices, dates or names, no "[placeholder]" where the owner already said the detail; ask when a fact is missing.
65
+ - The widget sends nothing: a review reply, a post or a message that one of our tools saves or publishes goes through that tool and its own widget, never through a WritingDraft.
66
+ - Not for code, data, a table or a one-sentence answer.
@@ -0,0 +1,129 @@
1
+ {
2
+ "wireName": "WritingDraft",
3
+ "fixtures": [
4
+ {
5
+ "name": "default",
6
+ "description": "The e-mail draft of ref 47 (ChatGPT WritingArtifact variant=email): headline, recipient and subject rows, the text; the owner opens the editor, changes the text, finishes, and goes back to the original.",
7
+ "payload": {
8
+ "kind": "email",
9
+ "subject": "Kurze Anfrage",
10
+ "recipient": "not specified",
11
+ "body": "Guten Tag,\n\nich interessiere mich für Ihr Angebot und hätte gerne einige weitere Informationen zu Preisen, Verfügbarkeit und Konditionen.\n\nKönnten Sie mir die entsprechenden Unterlagen zusenden?\n\nVielen Dank und freundliche Grüße"
12
+ },
13
+ "locale": "de",
14
+ "expectedState": "data",
15
+ "width": 528,
16
+ "interactions": [
17
+ {
18
+ "name": "edit",
19
+ "click": {
20
+ "selector": "[data-testid='writing-draft-edit']"
21
+ }
22
+ },
23
+ {
24
+ "name": "type-recipient",
25
+ "fill": {
26
+ "selector": "[data-testid='writing-draft-recipient-input'] input",
27
+ "value": "info@dentallabor-kassel.de"
28
+ }
29
+ },
30
+ {
31
+ "name": "type-text",
32
+ "fill": {
33
+ "selector": "[data-testid='writing-draft-body-input'] textarea:not([aria-hidden='true'])",
34
+ "value": "Guten Tag,\n\nwir benötigen bis Freitag ein Angebot für zwei Keramikkronen.\n\nVielen Dank und freundliche Grüße\nDr. Lena Hoffmann"
35
+ }
36
+ },
37
+ {
38
+ "name": "done",
39
+ "click": {
40
+ "selector": "[data-testid='writing-draft-done']"
41
+ }
42
+ },
43
+ {
44
+ "name": "reset",
45
+ "click": {
46
+ "selector": "[data-testid='writing-draft-reset']"
47
+ }
48
+ }
49
+ ],
50
+ "dataSet": "kassel-dental-practice"
51
+ },
52
+ {
53
+ "name": "email-with-recipient",
54
+ "description": "An e-mail with a real address and Markdown formatting (bold, a list, a link) from the dental practice: the open-in-mail action is offered.",
55
+ "payload": {
56
+ "kind": "email",
57
+ "title": "Terminerinnerung an Prophylaxe-Patienten",
58
+ "recipient": "patienten@zahnarzt-hoffmann-kassel.de",
59
+ "subject": "Ihre Prophylaxe im November",
60
+ "body": "Liebe Patientinnen und Patienten,\n\nim **November** bieten wir Prophylaxe-Wochen an:\n\n- professionelle Zahnreinigung in 60 Minuten\n- Termine auch am Samstagvormittag\n- Erinnerung per SMS am Vortag\n\nTermine buchen Sie unter [zahnarzt-hoffmann-kassel.de](https://zahnarzt-hoffmann-kassel.de).\n\nIhre Zahnarztpraxis Dr. Lena Hoffmann\nWilhelmshöher Allee 120, 34119 Kassel"
61
+ },
62
+ "locale": "de",
63
+ "expectedState": "data",
64
+ "width": 528,
65
+ "dataSet": "kassel-dental-practice"
66
+ },
67
+ {
68
+ "name": "post",
69
+ "description": "A social post draft in English: no recipient or subject rows, no mail action; copy and edit only.",
70
+ "payload": {
71
+ "kind": "post",
72
+ "title": "Prophylaxe weeks post",
73
+ "body": "**Prophylaxis weeks in November!** Book a professional cleaning at Zahnarztpraxis Dr. Lena Hoffmann on Wilhelmshöher Allee — Saturday mornings included."
74
+ },
75
+ "locale": "en",
76
+ "expectedState": "data",
77
+ "width": 528,
78
+ "dataSet": "kassel-dental-practice"
79
+ },
80
+ {
81
+ "name": "chatgpt-shape",
82
+ "description": "ChatGPT's own WritingArtifact field names as a weak model would copy them (variant, content.text, to): read through the aliases.",
83
+ "payload": {
84
+ "variant": "E-Mail",
85
+ "subject": "Termin nächste Woche",
86
+ "to": [
87
+ "info@dentallabor-kassel.de"
88
+ ],
89
+ "content": {
90
+ "format": "markdown",
91
+ "text": "Hallo Herr Weber,\n\npasst Ihnen Dienstag um 10 Uhr für die Abholung der Abformungen?\n\nBeste Grüße\nDr. Lena Hoffmann"
92
+ }
93
+ },
94
+ "locale": "de",
95
+ "expectedState": "data",
96
+ "width": 528,
97
+ "dataSet": "kassel-dental-practice"
98
+ },
99
+ {
100
+ "name": "empty",
101
+ "description": "A block without a text: one muted line, reported empty (NO_DATA).",
102
+ "payload": {
103
+ "kind": "email",
104
+ "subject": "Kurze Anfrage"
105
+ },
106
+ "locale": "de",
107
+ "expectedState": "empty",
108
+ "width": 528,
109
+ "dataSet": "kassel-dental-practice"
110
+ },
111
+ {
112
+ "name": "unreadable-body",
113
+ "description": "A body written as an object instead of a text: one muted line, reported failed (INVALID_PROP).",
114
+ "payload": {
115
+ "kind": "letter",
116
+ "body": {
117
+ "paragraphs": [
118
+ "Sehr geehrte Damen und Herren,",
119
+ "…"
120
+ ]
121
+ }
122
+ },
123
+ "locale": "de",
124
+ "expectedState": "error",
125
+ "width": 528,
126
+ "dataSet": "kassel-dental-practice"
127
+ }
128
+ ]
129
+ }
@@ -1,13 +1,14 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import React, { useRef, useEffect } from "react";
4
- import { v as resolveWidgetName, o as conversationWidgetRegistry } from "./chunks/widget-name-resolver-DyIY6Zu4.js";
5
- import { w } from "./chunks/widget-name-resolver-DyIY6Zu4.js";
6
- import { aY as ConversationWidgetRenderContext, aZ as WidgetImageReadinessContext, ae as ReadOnlyConversationWidgetProvider, a_ as WidgetImageRenderContext, a$ as WidgetImageLiveHydrationContext, b0 as buildWidgetAgentSpaceKeyProps, O as getGoogleMapWidgetNames, U as getWidgetImageCaptureReadPathPrefix } from "./chunks/WebSearchResultsConversationWidget-BvnLWHyi.js";
7
- import { b1, b2, b3 } from "./chunks/WebSearchResultsConversationWidget-BvnLWHyi.js";
8
- import { r as readWidgetImageReadiness, p as publishWidgetImageReadiness } from "./chunks/widget-image-readiness-signal-DeOuL89j.js";
9
- import { W, a } from "./chunks/widget-image-readiness-signal-DeOuL89j.js";
4
+ import { z as resolveWidgetName, j as conversationWidgetRegistry } from "./chunks/widget-name-resolver-C8SfpiR5.js";
5
+ import { B } from "./chunks/widget-name-resolver-C8SfpiR5.js";
6
+ import { h as ConversationWidgetRenderContext, J as WidgetImageReadinessContext, R as ReadOnlyConversationWidgetProvider, K as WidgetImageRenderContext, L as WidgetImageLiveHydrationContext, i as buildWidgetAgentSpaceKeyProps } from "./chunks/WebSearchResultsConversationWidget-DRBQvycE.js";
7
+ import { N, O, P } from "./chunks/WebSearchResultsConversationWidget-DRBQvycE.js";
8
+ import { r as readWidgetImageReadiness, p as publishWidgetImageReadiness } from "./chunks/widget-image-readiness-signal-D3ci53xr.js";
9
+ import { W, a } from "./chunks/widget-image-readiness-signal-D3ci53xr.js";
10
10
  import axios from "axios";
11
+ import { O as getGoogleMapWidgetNames, U as getWidgetImageCaptureReadPathPrefix } from "./chunks/index-7Qc_3GbG.js";
11
12
  const root = "agents_root_prMo3u";
12
13
  const styles = {
13
14
  root
@@ -322,13 +323,13 @@ export {
322
323
  installLiveWidgetRequests,
323
324
  isGoogleMapCapture,
324
325
  publishWidgetImageReadiness,
325
- w as readComposedViewDataTimes,
326
- b1 as readFrozenHydration,
326
+ B as readComposedViewDataTimes,
327
+ N as readFrozenHydration,
327
328
  readWidgetImageReadiness,
328
329
  a as readWidgetImageReadinessGlobalNames,
329
330
  registerStaticWidgetImageComponents,
330
331
  staticWidgetImageComponents,
331
- b2 as useWidgetImageLiveHydration,
332
- b3 as useWidgetImageRender
332
+ O as useWidgetImageLiveHydration,
333
+ P as useWidgetImageRender
333
334
  };
334
335
  //# sourceMappingURL=image-render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-render.js","sources":["../src/image-render/WidgetImageRender.tsx","../src/image-render/widget-image-readiness.ts","../src/image-render/frozen-widget-requests.ts","../src/image-render/widget-image-google-map.ts","../src/image-render/live-widget-requests.ts"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { conversationWidgetRegistry } from \"../renderer/conversationWidgetRegistry\";\nimport { resolveWidgetName } from \"../renderer/widget-name-resolver\";\nimport { buildWidgetAgentSpaceKeyProps } from \"../renderer/_agent-space/widget-agent-space-key-attribute\";\nimport { ReadOnlyConversationWidgetProvider } from \"../renderer/ConversationWidgetContext\";\nimport { ConversationWidgetRenderContext } from \"../renderer/ConversationWidgetRenderContext\";\nimport {\n WidgetImageRenderContext,\n WidgetImageLiveHydrationContext,\n WidgetImageReadinessContext,\n} from \"./WidgetImageRenderContext\";\nimport type { WidgetImageRenderBootstrap } from \"./widget-image-render.types\";\nimport type { createWidgetImageReadiness } from \"./widget-image-readiness\";\nimport styles from \"./WidgetImageRender.module.scss\";\n\n/**\n * Capture-only components by wire name: a frozen render shows the widget's visual from its complete snapshot, without\n * mounting the live fetch / OAuth / polling wrappers. An app adds its own with `registerStaticWidgetImageComponents`.\n */\nexport const staticWidgetImageComponents: Record<string, React.ComponentType<Record<string, unknown>>> = {};\n\n/** Adds an app's capture-only components (wire name → component). Runs outside React, before the first render. */\nexport const registerStaticWidgetImageComponents = (\n components: Readonly<Record<string, React.ComponentType<Record<string, unknown>>>>,\n): void => {\n Object.assign(staticWidgetImageComponents, components);\n};\n\ntype Readiness = ReturnType<typeof createWidgetImageReadiness>;\ntype HostProps = { bootstrap: WidgetImageRenderBootstrap; readiness: Readiness };\n\n// React error boundaries require a class. Never log customer payloads or send telemetry from capture.\nexport class WidgetImageCaptureBoundary extends React.Component<\n { children: React.ReactNode; fail: Readiness[\"fail\"] },\n { failed: boolean }\n> {\n state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n componentDidCatch() {\n this.props.fail(\"WIDGET_RENDER_FAILED\");\n }\n render() {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * The static image render of one widget (the e-mail capture): the registered widget in its e-mail presentation, inside\n * the read-only widget context, with the capture's frozen or live hydration. A frozen render takes the widget's static\n * capture component when the app registered one (`registerStaticWidgetImageComponents`). The app mounts it inside its\n * own store and theme (`WidgetImageCaptureBoundary` around it).\n */\nexport const WidgetImageRender = (props: HostProps) => {\n const { bootstrap, readiness } = props;\n const ref = useRef<HTMLDivElement>(null);\n const name = resolveWidgetName(bootstrap.input.widgetName);\n const entry = conversationWidgetRegistry.widgets.find((widget) => widget.name === name);\n useEffect(() => {\n if (!entry) readiness.fail(\"UNKNOWN_WIDGET\");\n else if (ref.current) return readiness.observe(ref.current);\n }, [entry, readiness]);\n if (!entry) return null;\n const Component =\n bootstrap.input.mode === \"live\" ? entry.component : (staticWidgetImageComponents[name ?? \"\"] ?? entry.component);\n return (\n <div ref={ref} className={styles.root} inert>\n <ConversationWidgetRenderContext.Provider value=\"email\">\n <WidgetImageReadinessContext.Provider value={readiness}>\n <ReadOnlyConversationWidgetProvider agentSpaceKey={bootstrap.siteId}>\n <WidgetImageRenderContext.Provider value={bootstrap.input.hydration}>\n <WidgetImageLiveHydrationContext.Provider value={bootstrap.input.mode === \"live\"}>\n <Component\n {...bootstrap.input.props}\n {...buildWidgetAgentSpaceKeyProps(bootstrap.siteId)}\n interactive={false}\n fresh={false}\n justDelivered={false}\n openedByPage={false}\n />\n </WidgetImageLiveHydrationContext.Provider>\n </WidgetImageRenderContext.Provider>\n </ReadOnlyConversationWidgetProvider>\n </WidgetImageReadinessContext.Provider>\n </ConversationWidgetRenderContext.Provider>\n </div>\n );\n};\n\n/** The slice the capture reads its hydration state from; any store that carries it (the capture's, a spec's). */\ninterface StoreWithWidgetHydration {\n getState: () => { AIExtensionsWidgetHydration: { widgets: Record<string, { status: string }> } };\n subscribe: (listener: () => void) => () => void;\n}\n\n/**\n * Holds the capture's readiness open while any widget hydration is idle or loading, and fails it on a hydration error.\n * Every shared hydrator counts — a widget's own, and each `$source` binding of a `ComposedView` tree, which reads through\n * the same slice (`ComposedViewDataSource:<name>`), so the shot waits for the tree's mail-time rows.\n */\nexport const followWidgetHydrationReadiness = (store: StoreWithWidgetHydration, readiness: Readiness) =>\n store.subscribe(() => {\n const widgets = Object.values(store.getState().AIExtensionsWidgetHydration.widgets);\n if (widgets.some((widget) => widget.status === \"error\")) readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n readiness.setHydrationPending(widgets.some((widget) => widget.status === \"loading\" || widget.status === \"idle\"));\n });\n","import { publishWidgetImageReadiness, readWidgetImageReadiness } from \"./widget-image-readiness-signal\";\nimport type { WidgetImageRenderBootstrap, WidgetImageReadiness } from \"./widget-image-render.types\";\n\nconst MAX_TIMER_DELAY_MS = 2 ** 31 - 1;\n\nexport const createWidgetImageReadiness = (bootstrap: WidgetImageRenderBootstrap) => {\n let failed = readWidgetImageReadiness()?.state === \"failed\";\n let requestsPending = 0;\n let hydrationPending = false;\n let notifyChanged = () => {};\n let observed: HTMLElement | null = null;\n const identity = {\n version: 1 as const,\n snapshot_id: bootstrap.snapshotId,\n attempt_id: bootstrap.attemptId,\n input_sha256: bootstrap.inputSha256,\n render_version: bootstrap.renderVersion,\n };\n const publish = (state: WidgetImageReadiness[\"state\"], extra: Partial<WidgetImageReadiness> = {}) => {\n publishWidgetImageReadiness({ ...identity, state, ...extra });\n // Mirror outside the observed widget subtree for browser checks without changing screenshot pixels.\n document.documentElement.dataset.widgetImageState = state;\n document.documentElement.dataset.widgetImageError = extra.error_code ?? \"\";\n };\n if (!failed) publish(\"loading\");\n const measure = (element: HTMLElement) => {\n const { x, y, width, height } = element.getBoundingClientRect();\n return { x, y, width, height };\n };\n // A failed state still reports the widget box so the renderer can capture it when the caller suppresses errors.\n const fail = (code: string) => {\n if (failed || readWidgetImageReadiness()?.state === \"failed\") return;\n failed = true;\n const rect = observed ? measure(observed) : undefined;\n publish(\"failed\", rect && rect.width > 0 && rect.height > 0 ? { error_code: code, rect } : { error_code: code });\n };\n const isFailed = () => failed || readWidgetImageReadiness()?.state === \"failed\";\n const frame = () => new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n\n const ready = async (element: HTMLElement, isCurrent: () => boolean = () => true) => {\n observed = element;\n try {\n // Effects and their state updates must commit before inspecting the final content.\n await frame();\n await frame();\n await document.fonts.ready;\n document.fonts.forEach((font) => {\n if (font.status === \"error\") throw new Error(\"FONT_FAILED\");\n });\n const images = Array.from(element.querySelectorAll(\"img\"));\n await Promise.all(\n images.map(async (img) => {\n // Empty decorative image slots have nothing to download or decode.\n if (!img.currentSrc && !img.getAttribute(\"src\") && !img.getAttribute(\"srcset\") && img.alt === \"\") return;\n if (img.loading !== \"eager\") img.loading = \"eager\";\n await img.decode();\n if (!img.naturalWidth) throw new Error(\"ASSET_FAILED\");\n }),\n );\n await frame();\n await frame();\n if (isFailed() || !isCurrent()) return;\n if (requestsPending > 0 || hydrationPending) return;\n if (Date.now() >= bootstrap.expiresAt * 1000) return fail(\"TOKEN_EXPIRED\");\n // Determinate bars visualize scores too; only indeterminate bars imply loading.\n if (\n element.querySelector(\n '[aria-busy=\"true\"], [role=\"progressbar\"]:not([aria-valuenow]), [class*=\"Skeleton\"], [class*=\"skeleton\"]',\n )\n ) {\n if (bootstrap.input.mode === \"live\") return;\n return fail(\"WIDGET_STILL_LOADING\");\n }\n const rect = element.getBoundingClientRect();\n const width = bootstrap.input.width ?? 528;\n const maxHeight = bootstrap.input.maxHeight ?? 1200;\n if (!element.textContent?.trim() && !element.querySelector(\"img,svg,canvas\")) return fail(\"EMPTY_WIDGET\");\n if (\n rect.width <= 0 ||\n rect.height <= 0 ||\n rect.width > width + 1 ||\n rect.height > maxHeight ||\n rect.x < 0 ||\n rect.y < 0 ||\n element.scrollWidth > Math.ceil(rect.width) ||\n element.scrollHeight > Math.ceil(rect.height)\n ) {\n return fail(\"WIDGET_BOUNDS_EXCEEDED\");\n }\n // The capture viewport may be smaller than the widget; the renderer sizes its viewport/clip from this rect.\n publish(\"ready\", { rect: measure(element) });\n } catch {\n if (isCurrent()) fail(\"REQUIRED_ASSET_FAILED\");\n }\n };\n const observe = (element: HTMLElement) => {\n observed = element;\n let revision = 0;\n let timer: ReturnType<typeof setTimeout>;\n let disposed = false;\n const changed = () => {\n if (disposed || isFailed()) return;\n revision += 1;\n const expected = revision;\n publish(\"loading\");\n clearTimeout(timer);\n // Frozen hydrators resolve synchronously; legacy frozen GET effects and chart layout may commit later.\n timer = setTimeout(() => void ready(element, () => !disposed && expected === revision), 250);\n };\n const observer = new MutationObserver(changed);\n notifyChanged = changed;\n observer.observe(element, { childList: true, subtree: true, attributes: true, characterData: true });\n const resize = new ResizeObserver(changed);\n resize.observe(element);\n changed();\n const remaining = bootstrap.expiresAt * 1000 - Date.now();\n // Browsers fire delays above 2^31-1 ms immediately; long-lived URLs cannot expire within the render deadline.\n const expiry =\n remaining <= MAX_TIMER_DELAY_MS ? setTimeout(() => fail(\"TOKEN_EXPIRED\"), Math.max(0, remaining)) : undefined;\n const deadline = setTimeout(() => {\n if (readWidgetImageReadiness()?.state !== \"ready\") fail(\"RENDER_DEADLINE_EXCEEDED\");\n }, 60000);\n return () => {\n disposed = true;\n observer.disconnect();\n resize.disconnect();\n clearTimeout(timer);\n if (expiry !== undefined) clearTimeout(expiry);\n clearTimeout(deadline);\n notifyChanged = () => {};\n };\n };\n const beginRequest = () => {\n requestsPending += 1;\n if (!isFailed()) publish(\"loading\");\n notifyChanged();\n return () => {\n requestsPending -= 1;\n notifyChanged();\n };\n };\n const setHydrationPending = (pending: boolean) => {\n if (hydrationPending === pending) return;\n hydrationPending = pending;\n if (!isFailed()) publish(\"loading\");\n notifyChanged();\n };\n return { ready, observe, fail, isFailed, beginRequest, setHydrationPending };\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\n\n/** The capture page serves supplied GET results in memory. It never lends the render token to the SDK. */\nexport const installFrozenWidgetRequests = (responses: Record<string, unknown>, fail: (code: string) => void) => {\n const originalAdapter = axios.defaults.adapter;\n axios.defaults.adapter = async (config: AxiosRequestConfig) => {\n const url = new URL(axios.getUri(config), window.location.origin);\n url.searchParams.sort();\n const key = `${(config.method ?? \"get\").toUpperCase()} ${url.pathname}${url.search}`;\n if ((config.method ?? \"get\").toLowerCase() !== \"get\" || !Object.prototype.hasOwnProperty.call(responses, key)) {\n fail(\"MISSING_FROZEN_RESPONSE\");\n throw new Error(\"MISSING_FROZEN_RESPONSE\");\n }\n return { data: structuredClone(responses[key]), status: 200, statusText: \"OK\", config, headers: {} };\n };\n return () => {\n axios.defaults.adapter = originalAdapter;\n };\n};\n","import { getGoogleMapWidgetNames } from \"../provider/environment\";\n\n/** The deepest tree the walk follows — the backend decodes a block with the same depth (`json_decode(…, 32)`). */\nconst MAX_TREE_DEPTH = 32;\n\nconst isMapNodeInValue = (value: unknown, depth: number, googleMapWidgetNames: readonly string[]): boolean => {\n if (depth > MAX_TREE_DEPTH || typeof value !== \"object\" || value === null) return false;\n if (Array.isArray(value)) return value.some((element) => isMapNodeInValue(element, depth + 1, googleMapWidgetNames));\n const wireObject = value as Record<string, unknown>;\n if (wireObject.type === \"Map\") return true;\n if (wireObject.type === \"Widget\" && typeof wireObject.widget === \"string\") {\n const embeddedWidgetName = wireObject.widget.replace(/Directive$/, \"\");\n if (googleMapWidgetNames.includes(embeddedWidgetName)) return true;\n }\n return Object.values(wireObject).some((nested) => isMapNodeInValue(nested, depth + 1, googleMapWidgetNames));\n};\n\n/**\n * Whether a capture renders a Google map and so may load the Maps SDK (the narrow CSP and transport exception).\n * The twin of the backend's check that opens the page's CSP: the app's map widgets themselves\n * (`AgentsEnvironment.googleMapWidgetNames`), and a `ComposedView` whose tree holds a `Map` node or embeds one of them.\n * The payload is read as written; a payload that does not parse renders no map.\n */\nexport const isGoogleMapCapture = (widgetName: string, props: Record<string, unknown>): boolean => {\n const googleMapWidgetNames = getGoogleMapWidgetNames();\n if (googleMapWidgetNames.includes(widgetName)) return true;\n if (widgetName !== \"ComposedView\" || typeof props.payload !== \"string\") return false;\n try {\n return isMapNodeInValue((JSON.parse(props.payload) as Record<string, unknown>)?.view, 0, googleMapWidgetNames);\n } catch {\n return false;\n }\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\nimport type { WidgetImageRenderBootstrap } from \"./widget-image-render.types\";\nimport type { createWidgetImageReadiness } from \"./widget-image-readiness\";\nimport { isGoogleMapCapture } from \"./widget-image-google-map\";\nimport { getWidgetImageCaptureReadPathPrefix } from \"../provider/environment\";\n\nconst STATIC_ASSET_PATH =\n /^\\/react\\/(?:app-build|widget-image-build)\\/assets\\/(?:[\\w-]+\\/)*[\\w.-]+\\.(?:svg|png|jpe?g|webp|gif)$/;\n\n/** Loaded only by the capture entry. SDK signatures stay unchanged; no ambient credentials are sent. */\nexport const installLiveWidgetRequests = (\n bootstrap: WidgetImageRenderBootstrap,\n readiness: ReturnType<typeof createWidgetImageReadiness>,\n) => {\n const originalAdapter = axios.defaults.adapter;\n const originalFetch = window.fetch;\n const fetchRead = originalFetch.bind(window);\n // Captured widgets may import shared telemetry/helpers. They cannot bypass the scoped adapter. Two reads pass:\n // static bundle images (useDynamicImport fetches icons such as review-source logos) and, for map captures only,\n // the Google Maps SDK (a map widget, or a ComposedView tree holding a map).\n window.fetch = async (input, init) => {\n const request = new Request(typeof input === \"string\" ? new URL(input, window.location.origin).href : input, init);\n const url = new URL(request.url, window.location.origin);\n const unavailable = readiness.isFailed() || Date.now() >= bootstrap.expiresAt * 1000;\n const isStaticAsset =\n url.origin === window.location.origin &&\n STATIC_ASSET_PATH.test(url.pathname) &&\n url.search === \"\" &&\n request.method === \"GET\";\n if (isStaticAsset && !unavailable) {\n const finish = readiness.beginRequest();\n try {\n return await fetchRead(url.toString(), {\n credentials: \"omit\",\n redirect: \"error\",\n referrerPolicy: \"no-referrer\",\n });\n } finally {\n finish();\n }\n }\n const isMap = isGoogleMapCapture(bootstrap.input.widgetName, bootstrap.input.props);\n const isGoogleMapRequest =\n url.protocol === \"https:\" &&\n ((url.hostname === \"maps.googleapis.com\" &&\n (url.pathname.startsWith(\"/maps/\") || url.pathname.startsWith(\"/$rpc/\"))) ||\n (url.hostname === \"maps.gstatic.com\" && url.pathname.startsWith(\"/mapfiles/\")));\n if (!isMap || !isGoogleMapRequest || ![\"GET\", \"POST\"].includes(request.method) || unavailable) {\n readiness.fail(\"UNSCOPED_REQUEST\");\n throw new Error(\"Unscoped render request\");\n }\n const headers = new Headers();\n for (const name of [\"content-type\", \"x-goog-api-key\", \"x-goog-api-client\", \"x-user-agent\"]) {\n const value = request.headers.get(name);\n if (value) headers.set(name, value);\n }\n const finish = readiness.beginRequest();\n try {\n const response = await fetchRead(request, {\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n redirect: \"error\",\n headers,\n });\n if (!response.ok) throw new Error(\"Map request failed\");\n return response;\n } catch {\n readiness.fail(\"MAP_ASSET_FAILED\");\n throw new Error(\"Map request failed\");\n } finally {\n finish();\n }\n };\n axios.defaults.adapter = async (config: AxiosRequestConfig) => {\n const finish = readiness.beginRequest();\n try {\n const url = new URL(axios.getUri(config), window.location.origin);\n if (\n !bootstrap.authToken ||\n url.origin !== window.location.origin ||\n !url.pathname.startsWith(getWidgetImageCaptureReadPathPrefix()) ||\n (config.method ?? \"get\").toLowerCase() !== \"get\" ||\n config.data !== undefined ||\n readiness.isFailed() ||\n Date.now() >= bootstrap.expiresAt * 1000\n )\n throw new Error(\"RENDER_READ_DENIED\");\n // The ordinary helper propagates debug/noCache from the page; capture requests never do.\n url.searchParams.delete(\"debug\");\n url.searchParams.delete(\"noCache\");\n const response = await fetchRead(url.toString(), {\n method: \"GET\",\n credentials: \"omit\",\n cache: \"no-store\",\n redirect: \"error\",\n referrerPolicy: \"no-referrer\",\n signal: config.signal as AbortSignal | undefined,\n headers: {\n Authorization: `Bearer ${bootstrap.authToken}`,\n jwtSource: \"internal_requests\",\n Accept: \"application/json\",\n },\n });\n if (!response.ok) throw new Error(\"RENDER_READ_FAILED\");\n const data = await response.json();\n return { data, status: response.status, statusText: \"OK\", config: {}, headers: {} };\n } catch {\n readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n // HttpStore logs errors and submits telemetry for status 500. Never expose the URL,\n // request headers, auth token or remote exception body to those shared interceptors.\n throw { message: \"Widget hydration failed\", response: { status: 0, data: { error: \"Widget hydration failed\" } } };\n } finally {\n finish();\n }\n };\n return () => {\n axios.defaults.adapter = originalAdapter;\n window.fetch = originalFetch;\n };\n};\n"],"names":["finish"],"mappings":"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"}
1
+ {"version":3,"file":"image-render.js","sources":["../src/image-render/WidgetImageRender.tsx","../src/image-render/widget-image-readiness.ts","../src/image-render/frozen-widget-requests.ts","../src/image-render/widget-image-google-map.ts","../src/image-render/live-widget-requests.ts"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { conversationWidgetRegistry } from \"../renderer/conversationWidgetRegistry\";\nimport { resolveWidgetName } from \"../renderer/widget-name-resolver\";\nimport { buildWidgetAgentSpaceKeyProps } from \"../renderer/_agent-space/widget-agent-space-key-attribute\";\nimport { ReadOnlyConversationWidgetProvider } from \"../renderer/ConversationWidgetContext\";\nimport { ConversationWidgetRenderContext } from \"../renderer/ConversationWidgetRenderContext\";\nimport {\n WidgetImageRenderContext,\n WidgetImageLiveHydrationContext,\n WidgetImageReadinessContext,\n} from \"./WidgetImageRenderContext\";\nimport type { WidgetImageRenderBootstrap } from \"./widget-image-render.types\";\nimport type { createWidgetImageReadiness } from \"./widget-image-readiness\";\nimport styles from \"./WidgetImageRender.module.scss\";\n\n/**\n * Capture-only components by wire name: a frozen render shows the widget's visual from its complete snapshot, without\n * mounting the live fetch / OAuth / polling wrappers. An app adds its own with `registerStaticWidgetImageComponents`.\n */\nexport const staticWidgetImageComponents: Record<string, React.ComponentType<Record<string, unknown>>> = {};\n\n/** Adds an app's capture-only components (wire name → component). Runs outside React, before the first render. */\nexport const registerStaticWidgetImageComponents = (\n components: Readonly<Record<string, React.ComponentType<Record<string, unknown>>>>,\n): void => {\n Object.assign(staticWidgetImageComponents, components);\n};\n\ntype Readiness = ReturnType<typeof createWidgetImageReadiness>;\ntype HostProps = { bootstrap: WidgetImageRenderBootstrap; readiness: Readiness };\n\n// React error boundaries require a class. Never log customer payloads or send telemetry from capture.\nexport class WidgetImageCaptureBoundary extends React.Component<\n { children: React.ReactNode; fail: Readiness[\"fail\"] },\n { failed: boolean }\n> {\n state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n componentDidCatch() {\n this.props.fail(\"WIDGET_RENDER_FAILED\");\n }\n render() {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * The static image render of one widget (the e-mail capture): the registered widget in its e-mail presentation, inside\n * the read-only widget context, with the capture's frozen or live hydration. A frozen render takes the widget's static\n * capture component when the app registered one (`registerStaticWidgetImageComponents`). The app mounts it inside its\n * own store and theme (`WidgetImageCaptureBoundary` around it).\n */\nexport const WidgetImageRender = (props: HostProps) => {\n const { bootstrap, readiness } = props;\n const ref = useRef<HTMLDivElement>(null);\n const name = resolveWidgetName(bootstrap.input.widgetName);\n const entry = conversationWidgetRegistry.widgets.find((widget) => widget.name === name);\n useEffect(() => {\n if (!entry) readiness.fail(\"UNKNOWN_WIDGET\");\n else if (ref.current) return readiness.observe(ref.current);\n }, [entry, readiness]);\n if (!entry) return null;\n const Component =\n bootstrap.input.mode === \"live\" ? entry.component : (staticWidgetImageComponents[name ?? \"\"] ?? entry.component);\n return (\n <div ref={ref} className={styles.root} inert>\n <ConversationWidgetRenderContext.Provider value=\"email\">\n <WidgetImageReadinessContext.Provider value={readiness}>\n <ReadOnlyConversationWidgetProvider agentSpaceKey={bootstrap.siteId}>\n <WidgetImageRenderContext.Provider value={bootstrap.input.hydration}>\n <WidgetImageLiveHydrationContext.Provider value={bootstrap.input.mode === \"live\"}>\n <Component\n {...bootstrap.input.props}\n {...buildWidgetAgentSpaceKeyProps(bootstrap.siteId)}\n interactive={false}\n fresh={false}\n justDelivered={false}\n openedByPage={false}\n />\n </WidgetImageLiveHydrationContext.Provider>\n </WidgetImageRenderContext.Provider>\n </ReadOnlyConversationWidgetProvider>\n </WidgetImageReadinessContext.Provider>\n </ConversationWidgetRenderContext.Provider>\n </div>\n );\n};\n\n/** The slice the capture reads its hydration state from; any store that carries it (the capture's, a spec's). */\ninterface StoreWithWidgetHydration {\n getState: () => { AIExtensionsWidgetHydration: { widgets: Record<string, { status: string }> } };\n subscribe: (listener: () => void) => () => void;\n}\n\n/**\n * Holds the capture's readiness open while any widget hydration is idle or loading, and fails it on a hydration error.\n * Every shared hydrator counts — a widget's own, and each `$source` binding of a `ComposedView` tree, which reads through\n * the same slice (`ComposedViewDataSource:<name>`), so the shot waits for the tree's mail-time rows.\n */\nexport const followWidgetHydrationReadiness = (store: StoreWithWidgetHydration, readiness: Readiness) =>\n store.subscribe(() => {\n const widgets = Object.values(store.getState().AIExtensionsWidgetHydration.widgets);\n if (widgets.some((widget) => widget.status === \"error\")) readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n readiness.setHydrationPending(widgets.some((widget) => widget.status === \"loading\" || widget.status === \"idle\"));\n });\n","import { publishWidgetImageReadiness, readWidgetImageReadiness } from \"./widget-image-readiness-signal\";\nimport type { WidgetImageRenderBootstrap, WidgetImageReadiness } from \"./widget-image-render.types\";\n\nconst MAX_TIMER_DELAY_MS = 2 ** 31 - 1;\n\nexport const createWidgetImageReadiness = (bootstrap: WidgetImageRenderBootstrap) => {\n let failed = readWidgetImageReadiness()?.state === \"failed\";\n let requestsPending = 0;\n let hydrationPending = false;\n let notifyChanged = () => {};\n let observed: HTMLElement | null = null;\n const identity = {\n version: 1 as const,\n snapshot_id: bootstrap.snapshotId,\n attempt_id: bootstrap.attemptId,\n input_sha256: bootstrap.inputSha256,\n render_version: bootstrap.renderVersion,\n };\n const publish = (state: WidgetImageReadiness[\"state\"], extra: Partial<WidgetImageReadiness> = {}) => {\n publishWidgetImageReadiness({ ...identity, state, ...extra });\n // Mirror outside the observed widget subtree for browser checks without changing screenshot pixels.\n document.documentElement.dataset.widgetImageState = state;\n document.documentElement.dataset.widgetImageError = extra.error_code ?? \"\";\n };\n if (!failed) publish(\"loading\");\n const measure = (element: HTMLElement) => {\n const { x, y, width, height } = element.getBoundingClientRect();\n return { x, y, width, height };\n };\n // A failed state still reports the widget box so the renderer can capture it when the caller suppresses errors.\n const fail = (code: string) => {\n if (failed || readWidgetImageReadiness()?.state === \"failed\") return;\n failed = true;\n const rect = observed ? measure(observed) : undefined;\n publish(\"failed\", rect && rect.width > 0 && rect.height > 0 ? { error_code: code, rect } : { error_code: code });\n };\n const isFailed = () => failed || readWidgetImageReadiness()?.state === \"failed\";\n const frame = () => new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n\n const ready = async (element: HTMLElement, isCurrent: () => boolean = () => true) => {\n observed = element;\n try {\n // Effects and their state updates must commit before inspecting the final content.\n await frame();\n await frame();\n await document.fonts.ready;\n document.fonts.forEach((font) => {\n if (font.status === \"error\") throw new Error(\"FONT_FAILED\");\n });\n const images = Array.from(element.querySelectorAll(\"img\"));\n await Promise.all(\n images.map(async (img) => {\n // Empty decorative image slots have nothing to download or decode.\n if (!img.currentSrc && !img.getAttribute(\"src\") && !img.getAttribute(\"srcset\") && img.alt === \"\") return;\n if (img.loading !== \"eager\") img.loading = \"eager\";\n await img.decode();\n if (!img.naturalWidth) throw new Error(\"ASSET_FAILED\");\n }),\n );\n await frame();\n await frame();\n if (isFailed() || !isCurrent()) return;\n if (requestsPending > 0 || hydrationPending) return;\n if (Date.now() >= bootstrap.expiresAt * 1000) return fail(\"TOKEN_EXPIRED\");\n // Determinate bars visualize scores too; only indeterminate bars imply loading.\n if (\n element.querySelector(\n '[aria-busy=\"true\"], [role=\"progressbar\"]:not([aria-valuenow]), [class*=\"Skeleton\"], [class*=\"skeleton\"]',\n )\n ) {\n if (bootstrap.input.mode === \"live\") return;\n return fail(\"WIDGET_STILL_LOADING\");\n }\n const rect = element.getBoundingClientRect();\n const width = bootstrap.input.width ?? 528;\n const maxHeight = bootstrap.input.maxHeight ?? 1200;\n if (!element.textContent?.trim() && !element.querySelector(\"img,svg,canvas\")) return fail(\"EMPTY_WIDGET\");\n if (\n rect.width <= 0 ||\n rect.height <= 0 ||\n rect.width > width + 1 ||\n rect.height > maxHeight ||\n rect.x < 0 ||\n rect.y < 0 ||\n element.scrollWidth > Math.ceil(rect.width) ||\n element.scrollHeight > Math.ceil(rect.height)\n ) {\n return fail(\"WIDGET_BOUNDS_EXCEEDED\");\n }\n // The capture viewport may be smaller than the widget; the renderer sizes its viewport/clip from this rect.\n publish(\"ready\", { rect: measure(element) });\n } catch {\n if (isCurrent()) fail(\"REQUIRED_ASSET_FAILED\");\n }\n };\n const observe = (element: HTMLElement) => {\n observed = element;\n let revision = 0;\n let timer: ReturnType<typeof setTimeout>;\n let disposed = false;\n const changed = () => {\n if (disposed || isFailed()) return;\n revision += 1;\n const expected = revision;\n publish(\"loading\");\n clearTimeout(timer);\n // Frozen hydrators resolve synchronously; legacy frozen GET effects and chart layout may commit later.\n timer = setTimeout(() => void ready(element, () => !disposed && expected === revision), 250);\n };\n const observer = new MutationObserver(changed);\n notifyChanged = changed;\n observer.observe(element, { childList: true, subtree: true, attributes: true, characterData: true });\n const resize = new ResizeObserver(changed);\n resize.observe(element);\n changed();\n const remaining = bootstrap.expiresAt * 1000 - Date.now();\n // Browsers fire delays above 2^31-1 ms immediately; long-lived URLs cannot expire within the render deadline.\n const expiry =\n remaining <= MAX_TIMER_DELAY_MS ? setTimeout(() => fail(\"TOKEN_EXPIRED\"), Math.max(0, remaining)) : undefined;\n const deadline = setTimeout(() => {\n if (readWidgetImageReadiness()?.state !== \"ready\") fail(\"RENDER_DEADLINE_EXCEEDED\");\n }, 60000);\n return () => {\n disposed = true;\n observer.disconnect();\n resize.disconnect();\n clearTimeout(timer);\n if (expiry !== undefined) clearTimeout(expiry);\n clearTimeout(deadline);\n notifyChanged = () => {};\n };\n };\n const beginRequest = () => {\n requestsPending += 1;\n if (!isFailed()) publish(\"loading\");\n notifyChanged();\n return () => {\n requestsPending -= 1;\n notifyChanged();\n };\n };\n const setHydrationPending = (pending: boolean) => {\n if (hydrationPending === pending) return;\n hydrationPending = pending;\n if (!isFailed()) publish(\"loading\");\n notifyChanged();\n };\n return { ready, observe, fail, isFailed, beginRequest, setHydrationPending };\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\n\n/** The capture page serves supplied GET results in memory. It never lends the render token to the SDK. */\nexport const installFrozenWidgetRequests = (responses: Record<string, unknown>, fail: (code: string) => void) => {\n const originalAdapter = axios.defaults.adapter;\n axios.defaults.adapter = async (config: AxiosRequestConfig) => {\n const url = new URL(axios.getUri(config), window.location.origin);\n url.searchParams.sort();\n const key = `${(config.method ?? \"get\").toUpperCase()} ${url.pathname}${url.search}`;\n if ((config.method ?? \"get\").toLowerCase() !== \"get\" || !Object.prototype.hasOwnProperty.call(responses, key)) {\n fail(\"MISSING_FROZEN_RESPONSE\");\n throw new Error(\"MISSING_FROZEN_RESPONSE\");\n }\n return { data: structuredClone(responses[key]), status: 200, statusText: \"OK\", config, headers: {} };\n };\n return () => {\n axios.defaults.adapter = originalAdapter;\n };\n};\n","import { getGoogleMapWidgetNames } from \"../provider/environment\";\n\n/** The deepest tree the walk follows — the backend decodes a block with the same depth (`json_decode(…, 32)`). */\nconst MAX_TREE_DEPTH = 32;\n\nconst isMapNodeInValue = (value: unknown, depth: number, googleMapWidgetNames: readonly string[]): boolean => {\n if (depth > MAX_TREE_DEPTH || typeof value !== \"object\" || value === null) return false;\n if (Array.isArray(value)) return value.some((element) => isMapNodeInValue(element, depth + 1, googleMapWidgetNames));\n const wireObject = value as Record<string, unknown>;\n if (wireObject.type === \"Map\") return true;\n if (wireObject.type === \"Widget\" && typeof wireObject.widget === \"string\") {\n const embeddedWidgetName = wireObject.widget.replace(/Directive$/, \"\");\n if (googleMapWidgetNames.includes(embeddedWidgetName)) return true;\n }\n return Object.values(wireObject).some((nested) => isMapNodeInValue(nested, depth + 1, googleMapWidgetNames));\n};\n\n/**\n * Whether a capture renders a Google map and so may load the Maps SDK (the narrow CSP and transport exception).\n * The twin of the backend's check that opens the page's CSP: the app's map widgets themselves\n * (`AgentsEnvironment.googleMapWidgetNames`), and a `ComposedView` whose tree holds a `Map` node or embeds one of them.\n * The payload is read as written; a payload that does not parse renders no map.\n */\nexport const isGoogleMapCapture = (widgetName: string, props: Record<string, unknown>): boolean => {\n const googleMapWidgetNames = getGoogleMapWidgetNames();\n if (googleMapWidgetNames.includes(widgetName)) return true;\n if (widgetName !== \"ComposedView\" || typeof props.payload !== \"string\") return false;\n try {\n return isMapNodeInValue((JSON.parse(props.payload) as Record<string, unknown>)?.view, 0, googleMapWidgetNames);\n } catch {\n return false;\n }\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\nimport type { WidgetImageRenderBootstrap } from \"./widget-image-render.types\";\nimport type { createWidgetImageReadiness } from \"./widget-image-readiness\";\nimport { isGoogleMapCapture } from \"./widget-image-google-map\";\nimport { getWidgetImageCaptureReadPathPrefix } from \"../provider/environment\";\n\nconst STATIC_ASSET_PATH =\n /^\\/react\\/(?:app-build|widget-image-build)\\/assets\\/(?:[\\w-]+\\/)*[\\w.-]+\\.(?:svg|png|jpe?g|webp|gif)$/;\n\n/** Loaded only by the capture entry. SDK signatures stay unchanged; no ambient credentials are sent. */\nexport const installLiveWidgetRequests = (\n bootstrap: WidgetImageRenderBootstrap,\n readiness: ReturnType<typeof createWidgetImageReadiness>,\n) => {\n const originalAdapter = axios.defaults.adapter;\n const originalFetch = window.fetch;\n const fetchRead = originalFetch.bind(window);\n // Captured widgets may import shared telemetry/helpers. They cannot bypass the scoped adapter. Two reads pass:\n // static bundle images (useDynamicImport fetches icons such as review-source logos) and, for map captures only,\n // the Google Maps SDK (a map widget, or a ComposedView tree holding a map).\n window.fetch = async (input, init) => {\n const request = new Request(typeof input === \"string\" ? new URL(input, window.location.origin).href : input, init);\n const url = new URL(request.url, window.location.origin);\n const unavailable = readiness.isFailed() || Date.now() >= bootstrap.expiresAt * 1000;\n const isStaticAsset =\n url.origin === window.location.origin &&\n STATIC_ASSET_PATH.test(url.pathname) &&\n url.search === \"\" &&\n request.method === \"GET\";\n if (isStaticAsset && !unavailable) {\n const finish = readiness.beginRequest();\n try {\n return await fetchRead(url.toString(), {\n credentials: \"omit\",\n redirect: \"error\",\n referrerPolicy: \"no-referrer\",\n });\n } finally {\n finish();\n }\n }\n const isMap = isGoogleMapCapture(bootstrap.input.widgetName, bootstrap.input.props);\n const isGoogleMapRequest =\n url.protocol === \"https:\" &&\n ((url.hostname === \"maps.googleapis.com\" &&\n (url.pathname.startsWith(\"/maps/\") || url.pathname.startsWith(\"/$rpc/\"))) ||\n (url.hostname === \"maps.gstatic.com\" && url.pathname.startsWith(\"/mapfiles/\")));\n if (!isMap || !isGoogleMapRequest || ![\"GET\", \"POST\"].includes(request.method) || unavailable) {\n readiness.fail(\"UNSCOPED_REQUEST\");\n throw new Error(\"Unscoped render request\");\n }\n const headers = new Headers();\n for (const name of [\"content-type\", \"x-goog-api-key\", \"x-goog-api-client\", \"x-user-agent\"]) {\n const value = request.headers.get(name);\n if (value) headers.set(name, value);\n }\n const finish = readiness.beginRequest();\n try {\n const response = await fetchRead(request, {\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n redirect: \"error\",\n headers,\n });\n if (!response.ok) throw new Error(\"Map request failed\");\n return response;\n } catch {\n readiness.fail(\"MAP_ASSET_FAILED\");\n throw new Error(\"Map request failed\");\n } finally {\n finish();\n }\n };\n axios.defaults.adapter = async (config: AxiosRequestConfig) => {\n const finish = readiness.beginRequest();\n try {\n const url = new URL(axios.getUri(config), window.location.origin);\n if (\n !bootstrap.authToken ||\n url.origin !== window.location.origin ||\n !url.pathname.startsWith(getWidgetImageCaptureReadPathPrefix()) ||\n (config.method ?? \"get\").toLowerCase() !== \"get\" ||\n config.data !== undefined ||\n readiness.isFailed() ||\n Date.now() >= bootstrap.expiresAt * 1000\n )\n throw new Error(\"RENDER_READ_DENIED\");\n // The ordinary helper propagates debug/noCache from the page; capture requests never do.\n url.searchParams.delete(\"debug\");\n url.searchParams.delete(\"noCache\");\n const response = await fetchRead(url.toString(), {\n method: \"GET\",\n credentials: \"omit\",\n cache: \"no-store\",\n redirect: \"error\",\n referrerPolicy: \"no-referrer\",\n signal: config.signal as AbortSignal | undefined,\n headers: {\n Authorization: `Bearer ${bootstrap.authToken}`,\n jwtSource: \"internal_requests\",\n Accept: \"application/json\",\n },\n });\n if (!response.ok) throw new Error(\"RENDER_READ_FAILED\");\n const data = await response.json();\n return { data, status: response.status, statusText: \"OK\", config: {}, headers: {} };\n } catch {\n readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n // HttpStore logs errors and submits telemetry for status 500. Never expose the URL,\n // request headers, auth token or remote exception body to those shared interceptors.\n throw { message: \"Widget hydration failed\", response: { status: 0, data: { error: \"Widget hydration failed\" } } };\n } finally {\n finish();\n }\n };\n return () => {\n axios.defaults.adapter = originalAdapter;\n window.fetch = originalFetch;\n };\n};\n"],"names":["finish"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,16 +1,18 @@
1
1
  "use client";
2
- import { A, i, g, h } from "./chunks/widget-name-resolver-DyIY6Zu4.js";
3
- import { r, a } from "./chunks/canvasBodies-9SuF6NAB.js";
2
+ import { h, i } from "./chunks/widget-name-resolver-C8SfpiR5.js";
3
+ import { r, a, b } from "./chunks/canvasBodies-DLjDkviP.js";
4
4
  import { r as r2 } from "./chunks/canvas-feature-flags-BmmxC3bz.js";
5
- import { A as A2, B, C, a as a2, D, b, c, d, G, H, e, I, f, L, M, g as g2, h as h2, i as i2, P, R, j, S, k, l, m, n, o, p, T, q, r as r3, s, t, u, W, v, w, x, y, z, E, F, J, K, N, O, Q, U, V, X, Y, Z, _, $, a0, a1, a2 as a22, a3, a4, a5, a6, a7, a8, a9, aa } from "./chunks/WebSearchResultsConversationWidget-BvnLWHyi.js";
5
+ import { r as r3, a as a2, b as b2 } from "./chunks/WebSearchResultsConversationWidget-DRBQvycE.js";
6
+ import { A, i as i2 } from "./chunks/icon-names-Di6c4zLo.js";
7
+ import { A as A2, B, C, a as a3, D, b as b3, c, d, G, H, e, I, f, L, M, g, h as h2, i as i3, P, R, j, S, k, l, m, n, o, p, T, q, r as r4, s, t, u, W, v, w, x, y, z, E, F, J, K, N, O, Q, U, V, X, Y, Z, _, $, a0, a1, a2 as a22, a3 as a32, a4, a5, a6, a7, a8 } from "./chunks/index-7Qc_3GbG.js";
6
8
  export {
7
9
  A as AGENTS_ICON_NAMES,
8
10
  A2 as AgentsProvider,
9
11
  B as Button,
10
12
  C as Checkbox,
11
- a2 as ConversationSearchResultsList,
13
+ a3 as ConversationSearchResultsList,
12
14
  D as DEFAULT_AGENTS_TEXTS,
13
- b as DEFAULT_WIDGET_IMAGE_CAPTURE_READ_PATH_PREFIX,
15
+ b3 as DEFAULT_WIDGET_IMAGE_CAPTURE_READ_PATH_PREFIX,
14
16
  c as DEFAULT_WIDGET_SELF_HYDRATION_KEY_FIELD_NAME,
15
17
  d as DateInput,
16
18
  G as GlowFrame,
@@ -20,9 +22,9 @@ export {
20
22
  f as InteractiveSurface,
21
23
  L as LoadingSpinner,
22
24
  M as Map,
23
- g2 as MapMarker,
25
+ g as MapMarker,
24
26
  h2 as Markdown,
25
- i2 as ModalLayer,
27
+ i3 as ModalLayer,
26
28
  P as ProgressBar,
27
29
  R as RadioGroup,
28
30
  j as RangeSlider,
@@ -35,7 +37,7 @@ export {
35
37
  p as StatusChip,
36
38
  T as Tabs,
37
39
  q as Text,
38
- r3 as TextArea,
40
+ r4 as TextArea,
39
41
  s as TextInput,
40
42
  t as Tooltip,
41
43
  u as TrendDelta,
@@ -54,27 +56,29 @@ export {
54
56
  Q as getSandboxLegacyAliases,
55
57
  U as getWidgetImageCaptureReadPathPrefix,
56
58
  V as getWidgetSelfHydrationKeyFieldName,
57
- i as isAgentsIconName,
59
+ i2 as isAgentsIconName,
58
60
  X as openImageGallery,
59
- r as registerCanvasBodies,
61
+ r3 as readConceptExplainerTypeDefinitions,
62
+ r as readEntityDetailBodyDefinitions,
63
+ a as registerCanvasBodies,
60
64
  r2 as registerCanvasFeatureFlags,
61
- g as registerComposedViewDataSourceFetcher,
62
- Y as registerConceptExplainerTypes,
63
- h as registerConversationWidgets,
64
- a as registerEntityDetailBodies,
65
- Z as registerWidgetHydrator,
66
- _ as reportRunningTurn,
67
- $ as reportWidgetCrash,
68
- a0 as setAgentsEnvironment,
69
- a1 as translateText,
70
- a22 as useAgentsActiveAgentSpaceKey,
71
- a3 as useAgentsBudgetLimit,
72
- a4 as useAgentsComponents,
73
- a5 as useAgentsEnvironment,
74
- a6 as useAgentsMapsLoader,
75
- a7 as useAgentsOwnerSettings,
76
- a8 as useAgentsStateDispatch,
77
- a9 as useAgentsStateSelector,
78
- aa as useAgentsTexts
65
+ h as registerComposedViewDataSourceFetcher,
66
+ a2 as registerConceptExplainerTypes,
67
+ i as registerConversationWidgets,
68
+ b as registerEntityDetailBodies,
69
+ b2 as registerWidgetHydrator,
70
+ Y as reportRunningTurn,
71
+ Z as reportWidgetCrash,
72
+ _ as setAgentsEnvironment,
73
+ $ as translateText,
74
+ a0 as useAgentsActiveAgentSpaceKey,
75
+ a1 as useAgentsBudgetLimit,
76
+ a22 as useAgentsComponents,
77
+ a32 as useAgentsEnvironment,
78
+ a4 as useAgentsMapsLoader,
79
+ a5 as useAgentsOwnerSettings,
80
+ a6 as useAgentsStateDispatch,
81
+ a7 as useAgentsStateSelector,
82
+ a8 as useAgentsTexts
79
83
  };
80
84
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
package/dist/kit.js CHANGED
@@ -1,13 +1,22 @@
1
1
  "use client";
2
- import { C, a, b, c, d, e, r, f } from "./chunks/widget-name-resolver-DyIY6Zu4.js";
2
+ import { A, C, a, b, c, d, e, E, r, f, u, g } from "./chunks/widget-name-resolver-C8SfpiR5.js";
3
+ import { M } from "./chunks/WebSearchResultsConversationWidget-DRBQvycE.js";
4
+ import { E as E2, u as u2 } from "./chunks/entity-detail-name-3A82gDAp.js";
3
5
  export {
6
+ A as ApexChart,
4
7
  C as COMPOSED_VIEW_TONES,
5
8
  a as COMPOSED_VIEW_TONE_ALIASES,
6
9
  b as COMPOSED_VIEW_TONE_GRAPHIC_COLOR,
7
10
  c as COMPOSED_VIEW_TONE_TEXT_COLOR,
8
11
  d as ComposedViewConversationWidget,
9
12
  e as ComposedViewRenderer,
13
+ E as EmbeddedConversationWidget,
14
+ E2 as EntityDetailNameReportContext,
15
+ M as ModelText,
10
16
  r as readComposedViewTone,
11
- f as readOptionalComposedViewTone
17
+ f as readOptionalComposedViewTone,
18
+ u as useChartPalette,
19
+ g as useNumberLocale,
20
+ u2 as useReportEntityDetailName
12
21
  };
13
22
  //# sourceMappingURL=kit.js.map
package/dist/kit.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"kit.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"kit.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/dist/preview.js CHANGED
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { aF as WidgetSurface, q as Text, V as getWidgetSelfHydrationKeyFieldName, c as DEFAULT_WIDGET_SELF_HYDRATION_KEY_FIELD_NAME, b4 as readWidgetAgentSpaceKeyAttribute, ai as WidgetRenderReportContext, b0 as buildWidgetAgentSpaceKeyProps, af as StandaloneConversationWidgetProvider, aY as ConversationWidgetRenderContext, a_ as WidgetImageRenderContext, bh as CANVAS_VIABLE_MIN_WIDTH, Q as getSandboxLegacyAliases, bi as listWidgetHydratorTypes, as as getWidgetHydrator, bj as unregisterWidgetHydrator, Z as registerWidgetHydrator } from "./chunks/WebSearchResultsConversationWidget-BvnLWHyi.js";
3
+ import { q as Text, V as getWidgetSelfHydrationKeyFieldName, c as DEFAULT_WIDGET_SELF_HYDRATION_KEY_FIELD_NAME, Q as getSandboxLegacyAliases } from "./chunks/index-7Qc_3GbG.js";
4
4
  import { useRef, useState, useMemo, useEffect, useCallback } from "react";
5
- import { J as buildComposedViewComponentRegistry, K as composedViewComponents, v as resolveWidgetName, o as conversationWidgetRegistry, j as ConversationWidgetErrorBoundary, L as ComposedViewComponentsContext } from "./chunks/widget-name-resolver-DyIY6Zu4.js";
6
- import { c as canvasBodies } from "./chunks/canvasBodies-9SuF6NAB.js";
7
- import { d as canvasBehaviourOf } from "./chunks/canvas-behaviours-BRFR1ALE.js";
8
- import { d as decideCanvasOpen } from "./chunks/decide-canvas-open-Ct-wnNEJ.js";
9
- import { p as publishWidgetImageReadiness } from "./chunks/widget-image-readiness-signal-DeOuL89j.js";
5
+ import { N as buildComposedViewComponentRegistry, O as composedViewComponents, z as resolveWidgetName, j as conversationWidgetRegistry, n as ConversationWidgetErrorBoundary, P as ComposedViewComponentsContext } from "./chunks/widget-name-resolver-C8SfpiR5.js";
6
+ import { Q as WidgetSurface, z as readWidgetAgentSpaceKeyAttribute, W as WidgetRenderReportContext, i as buildWidgetAgentSpaceKeyProps, S as StandaloneConversationWidgetProvider, h as ConversationWidgetRenderContext, K as WidgetImageRenderContext, V as CANVAS_VIABLE_MIN_WIDTH, l as listWidgetHydratorTypes, g as getWidgetHydrator, u as unregisterWidgetHydrator, b as registerWidgetHydrator } from "./chunks/WebSearchResultsConversationWidget-DRBQvycE.js";
7
+ import { c as canvasBodies } from "./chunks/canvasBodies-DLjDkviP.js";
8
+ import { f as decideCanvasOpen, d as canvasBehaviourOf } from "./chunks/decide-canvas-open-DBWoWtAC.js";
9
+ import { p as publishWidgetImageReadiness } from "./chunks/widget-image-readiness-signal-D3ci53xr.js";
10
10
  import axios from "axios";
11
11
  const page = "agents_page_5VMDeD";
12
12
  const chatColumn = "agents_chatColumn_FWcgdJ";
@@ -723,6 +723,7 @@ export {
723
723
  installWidgetPreviewHydration,
724
724
  installWidgetPreviewRequests,
725
725
  isPendingResponse,
726
+ mapFixtureToDeclaredAgentSpaceKeyFieldName,
726
727
  observeWidgetPreviewState,
727
728
  publishWidgetPreviewSignal,
728
729
  readWidgetPreviewSignalGlobalNames,
@@ -0,0 +1,71 @@
1
+ "use client";
2
+ import { A, i } from "./chunks/icon-names-Di6c4zLo.js";
3
+ import { A as A2, B, C, a, D, b, c, d, G, H, e, I, f, L, M, g, h, i as i2, P, R, j, S, k, l, m, n, o, p, T, q, r, s, t, u, W, v, w, x, y, z, E, F, J, K, N, O, Q, U, V, X, Y, Z, _, $, a0, a1, a2, a3, a4, a5, a6, a7, a8 } from "./chunks/index-7Qc_3GbG.js";
4
+ export {
5
+ A as AGENTS_ICON_NAMES,
6
+ A2 as AgentsProvider,
7
+ B as Button,
8
+ C as Checkbox,
9
+ a as ConversationSearchResultsList,
10
+ D as DEFAULT_AGENTS_TEXTS,
11
+ b as DEFAULT_WIDGET_IMAGE_CAPTURE_READ_PATH_PREFIX,
12
+ c as DEFAULT_WIDGET_SELF_HYDRATION_KEY_FIELD_NAME,
13
+ d as DateInput,
14
+ G as GlowFrame,
15
+ H as HeroRow,
16
+ e as HeroValue,
17
+ I as Icon,
18
+ f as InteractiveSurface,
19
+ L as LoadingSpinner,
20
+ M as Map,
21
+ g as MapMarker,
22
+ h as Markdown,
23
+ i2 as ModalLayer,
24
+ P as ProgressBar,
25
+ R as RadioGroup,
26
+ j as RangeSlider,
27
+ S as SegmentBar,
28
+ k as Select,
29
+ l as Skeleton,
30
+ m as SkeletonText,
31
+ n as SplitView,
32
+ o as StatusBadge,
33
+ p as StatusChip,
34
+ T as Tabs,
35
+ q as Text,
36
+ r as TextArea,
37
+ s as TextInput,
38
+ t as Tooltip,
39
+ u as TrendDelta,
40
+ W as WidgetFeatureGate,
41
+ v as WidgetText,
42
+ w as appendAnotherAgentSpaceToOwnerText,
43
+ x as buildUnnamedAgentSpaceLabel,
44
+ y as buildWidgetOfAnotherAgentSpaceExplanation,
45
+ z as classNames,
46
+ E as escapePlainTextForText,
47
+ F as getAgentDisplayName,
48
+ J as getAgentsEnvironment,
49
+ K as getFurtherCanvasBehaviours,
50
+ N as getFurtherWidgetClickSignalSources,
51
+ O as getGoogleMapWidgetNames,
52
+ Q as getSandboxLegacyAliases,
53
+ U as getWidgetImageCaptureReadPathPrefix,
54
+ V as getWidgetSelfHydrationKeyFieldName,
55
+ i as isAgentsIconName,
56
+ X as openImageGallery,
57
+ Y as reportRunningTurn,
58
+ Z as reportWidgetCrash,
59
+ _ as setAgentsEnvironment,
60
+ $ as translateText,
61
+ a0 as useAgentsActiveAgentSpaceKey,
62
+ a1 as useAgentsBudgetLimit,
63
+ a2 as useAgentsComponents,
64
+ a3 as useAgentsEnvironment,
65
+ a4 as useAgentsMapsLoader,
66
+ a5 as useAgentsOwnerSettings,
67
+ a6 as useAgentsStateDispatch,
68
+ a7 as useAgentsStateSelector,
69
+ a8 as useAgentsTexts
70
+ };
71
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}