@adonis-agora/agent 0.72.0 → 0.74.1

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 (196) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/configure.d.ts +5 -4
  3. package/dist/configure.d.ts.map +1 -1
  4. package/dist/configure.js +8 -4
  5. package/dist/configure.js.map +1 -1
  6. package/dist/providers/agent_provider.d.ts.map +1 -1
  7. package/dist/providers/agent_provider.js +15 -1
  8. package/dist/providers/agent_provider.js.map +1 -1
  9. package/dist/src/a2ui/adapter.d.ts.map +1 -1
  10. package/dist/src/a2ui/adapter.js +1 -0
  11. package/dist/src/a2ui/adapter.js.map +1 -1
  12. package/dist/src/a2ui/core.d.ts.map +1 -1
  13. package/dist/src/a2ui/core.js +11 -1
  14. package/dist/src/a2ui/core.js.map +1 -1
  15. package/dist/src/action-proposal-executor.d.ts.map +1 -1
  16. package/dist/src/action-proposal-executor.js +3 -0
  17. package/dist/src/action-proposal-executor.js.map +1 -1
  18. package/dist/src/ag-ui/adapter.d.ts.map +1 -1
  19. package/dist/src/ag-ui/adapter.js +2 -0
  20. package/dist/src/ag-ui/adapter.js.map +1 -1
  21. package/dist/src/ag-ui/core/encoder.d.ts.map +1 -1
  22. package/dist/src/ag-ui/core/encoder.js +3 -0
  23. package/dist/src/ag-ui/core/encoder.js.map +1 -1
  24. package/dist/src/agent-deps-factory.d.ts +3 -1
  25. package/dist/src/agent-deps-factory.d.ts.map +1 -1
  26. package/dist/src/agent-deps-factory.js +3 -0
  27. package/dist/src/agent-deps-factory.js.map +1 -1
  28. package/dist/src/agent-deps.d.ts +3 -1
  29. package/dist/src/agent-deps.d.ts.map +1 -1
  30. package/dist/src/agent-deps.js.map +1 -1
  31. package/dist/src/agent-loop.d.ts +7 -1
  32. package/dist/src/agent-loop.d.ts.map +1 -1
  33. package/dist/src/agent-loop.js +52 -2
  34. package/dist/src/agent-loop.js.map +1 -1
  35. package/dist/src/agent-service.d.ts +6 -0
  36. package/dist/src/agent-service.d.ts.map +1 -1
  37. package/dist/src/agent-service.js +5 -3
  38. package/dist/src/agent-service.js.map +1 -1
  39. package/dist/src/channels/adapters/evolution_api.d.ts.map +1 -1
  40. package/dist/src/channels/adapters/evolution_api.js +35 -0
  41. package/dist/src/channels/adapters/evolution_api.js.map +1 -1
  42. package/dist/src/channels/adapters/telegram.d.ts.map +1 -1
  43. package/dist/src/channels/adapters/telegram.js +25 -7
  44. package/dist/src/channels/adapters/telegram.js.map +1 -1
  45. package/dist/src/channels/adapters/whatsapp_cloud.d.ts.map +1 -1
  46. package/dist/src/channels/adapters/whatsapp_cloud.js +44 -0
  47. package/dist/src/channels/adapters/whatsapp_cloud.js.map +1 -1
  48. package/dist/src/channels/handler.d.ts +29 -1
  49. package/dist/src/channels/handler.d.ts.map +1 -1
  50. package/dist/src/channels/handler.js +231 -9
  51. package/dist/src/channels/handler.js.map +1 -1
  52. package/dist/src/channels/index.d.ts +2 -2
  53. package/dist/src/channels/index.d.ts.map +1 -1
  54. package/dist/src/channels/index.js.map +1 -1
  55. package/dist/src/channels/types.d.ts +40 -0
  56. package/dist/src/channels/types.d.ts.map +1 -1
  57. package/dist/src/genui/catalog.d.ts +12 -1
  58. package/dist/src/genui/catalog.d.ts.map +1 -1
  59. package/dist/src/genui/catalog.js +18 -1
  60. package/dist/src/genui/catalog.js.map +1 -1
  61. package/dist/src/genui/channels.d.ts +252 -0
  62. package/dist/src/genui/channels.d.ts.map +1 -0
  63. package/dist/src/genui/channels.js +516 -0
  64. package/dist/src/genui/channels.js.map +1 -0
  65. package/dist/src/genui/chart-image.d.ts +46 -0
  66. package/dist/src/genui/chart-image.d.ts.map +1 -0
  67. package/dist/src/genui/chart-image.js +155 -0
  68. package/dist/src/genui/chart-image.js.map +1 -0
  69. package/dist/src/genui/factory.d.ts +23 -1
  70. package/dist/src/genui/factory.d.ts.map +1 -1
  71. package/dist/src/genui/factory.js +13 -1
  72. package/dist/src/genui/factory.js.map +1 -1
  73. package/dist/src/genui/index.d.ts.map +1 -1
  74. package/dist/src/genui/index.js +64 -3
  75. package/dist/src/genui/index.js.map +1 -1
  76. package/dist/src/genui/kit/adonis.d.ts +4 -0
  77. package/dist/src/genui/kit/adonis.d.ts.map +1 -0
  78. package/dist/src/genui/kit/adonis.js +38 -0
  79. package/dist/src/genui/kit/adonis.js.map +1 -0
  80. package/dist/src/genui/kit/bundle.d.ts +25 -0
  81. package/dist/src/genui/kit/bundle.d.ts.map +1 -0
  82. package/dist/src/genui/kit/bundle.js +144 -0
  83. package/dist/src/genui/kit/bundle.js.map +1 -0
  84. package/dist/src/genui/kit/discover.d.ts +41 -0
  85. package/dist/src/genui/kit/discover.d.ts.map +1 -0
  86. package/dist/src/genui/kit/discover.js +100 -0
  87. package/dist/src/genui/kit/discover.js.map +1 -0
  88. package/dist/src/genui/kit/docs.d.ts +22 -0
  89. package/dist/src/genui/kit/docs.d.ts.map +1 -0
  90. package/dist/src/genui/kit/docs.js +237 -0
  91. package/dist/src/genui/kit/docs.js.map +1 -0
  92. package/dist/src/genui/kit/files.d.ts +27 -0
  93. package/dist/src/genui/kit/files.d.ts.map +1 -0
  94. package/dist/src/genui/kit/files.js +126 -0
  95. package/dist/src/genui/kit/files.js.map +1 -0
  96. package/dist/src/genui/kit/index.d.ts +12 -0
  97. package/dist/src/genui/kit/index.d.ts.map +1 -0
  98. package/dist/src/genui/kit/index.js +12 -0
  99. package/dist/src/genui/kit/index.js.map +1 -0
  100. package/dist/src/genui/kit/plugin.d.ts +52 -0
  101. package/dist/src/genui/kit/plugin.d.ts.map +1 -0
  102. package/dist/src/genui/kit/plugin.js +314 -0
  103. package/dist/src/genui/kit/plugin.js.map +1 -0
  104. package/dist/src/genui/kit/write.d.ts +14 -0
  105. package/dist/src/genui/kit/write.d.ts.map +1 -0
  106. package/dist/src/genui/kit/write.js +39 -0
  107. package/dist/src/genui/kit/write.js.map +1 -0
  108. package/dist/src/genui/public.d.ts +7 -3
  109. package/dist/src/genui/public.d.ts.map +1 -1
  110. package/dist/src/genui/public.js +5 -1
  111. package/dist/src/genui/public.js.map +1 -1
  112. package/dist/src/genui/sandbox-jsx.d.ts +29 -0
  113. package/dist/src/genui/sandbox-jsx.d.ts.map +1 -0
  114. package/dist/src/genui/sandbox-jsx.js +656 -0
  115. package/dist/src/genui/sandbox-jsx.js.map +1 -0
  116. package/dist/src/genui/sandbox-kit.d.ts +88 -0
  117. package/dist/src/genui/sandbox-kit.d.ts.map +1 -0
  118. package/dist/src/genui/sandbox-kit.js +89 -0
  119. package/dist/src/genui/sandbox-kit.js.map +1 -0
  120. package/dist/src/genui/sandbox-theme.d.ts +61 -0
  121. package/dist/src/genui/sandbox-theme.d.ts.map +1 -0
  122. package/dist/src/genui/sandbox-theme.js +255 -0
  123. package/dist/src/genui/sandbox-theme.js.map +1 -0
  124. package/dist/src/genui/sandbox.d.ts +73 -2
  125. package/dist/src/genui/sandbox.d.ts.map +1 -1
  126. package/dist/src/genui/sandbox.js +106 -16
  127. package/dist/src/genui/sandbox.js.map +1 -1
  128. package/dist/src/genui/text.d.ts.map +1 -1
  129. package/dist/src/genui/text.js +33 -1
  130. package/dist/src/genui/text.js.map +1 -1
  131. package/dist/src/genui/tools.d.ts +26 -0
  132. package/dist/src/genui/tools.d.ts.map +1 -1
  133. package/dist/src/genui/tools.js +94 -14
  134. package/dist/src/genui/tools.js.map +1 -1
  135. package/dist/src/genui/tree.d.ts +25 -2
  136. package/dist/src/genui/tree.d.ts.map +1 -1
  137. package/dist/src/genui/tree.js +161 -4
  138. package/dist/src/genui/tree.js.map +1 -1
  139. package/dist/src/hooks/genui_kit.d.ts +20 -0
  140. package/dist/src/hooks/genui_kit.d.ts.map +1 -0
  141. package/dist/src/hooks/genui_kit.js +55 -0
  142. package/dist/src/hooks/genui_kit.js.map +1 -0
  143. package/dist/src/index.d.ts +2 -2
  144. package/dist/src/index.d.ts.map +1 -1
  145. package/dist/src/index.js +2 -2
  146. package/dist/src/index.js.map +1 -1
  147. package/dist/src/negotiated-tool-ui.d.ts +27 -0
  148. package/dist/src/negotiated-tool-ui.d.ts.map +1 -1
  149. package/dist/src/negotiated-tool-ui.js +52 -0
  150. package/dist/src/negotiated-tool-ui.js.map +1 -1
  151. package/dist/src/react/core/genui/sandbox-assets.d.ts +32 -0
  152. package/dist/src/react/core/genui/sandbox-assets.d.ts.map +1 -0
  153. package/dist/src/react/core/genui/sandbox-assets.js +174 -0
  154. package/dist/src/react/core/genui/sandbox-assets.js.map +1 -0
  155. package/dist/src/react/core/genui/sandbox.d.ts +9 -0
  156. package/dist/src/react/core/genui/sandbox.d.ts.map +1 -1
  157. package/dist/src/react/core/genui/sandbox.js +119 -19
  158. package/dist/src/react/core/genui/sandbox.js.map +1 -1
  159. package/dist/src/react/core/index.d.ts +1 -1
  160. package/dist/src/react/core/index.d.ts.map +1 -1
  161. package/dist/src/react/core/index.js +1 -1
  162. package/dist/src/react/core/index.js.map +1 -1
  163. package/dist/src/react/core/presentation/phrasing.d.ts +3 -2
  164. package/dist/src/react/core/presentation/phrasing.d.ts.map +1 -1
  165. package/dist/src/react/core/presentation/phrasing.js +4 -27
  166. package/dist/src/react/core/presentation/phrasing.js.map +1 -1
  167. package/dist/src/react/core/presentation/tool-activity.d.ts +8 -0
  168. package/dist/src/react/core/presentation/tool-activity.d.ts.map +1 -1
  169. package/dist/src/react/core/presentation/tool-activity.js +28 -1
  170. package/dist/src/react/core/presentation/tool-activity.js.map +1 -1
  171. package/dist/src/react/core/transcript/model.d.ts +6 -0
  172. package/dist/src/react/core/transcript/model.d.ts.map +1 -1
  173. package/dist/src/react/core/transcript/model.js +6 -1
  174. package/dist/src/react/core/transcript/model.js.map +1 -1
  175. package/dist/src/react/core/transcript/use-chat-transcript.d.ts +5 -0
  176. package/dist/src/react/core/transcript/use-chat-transcript.d.ts.map +1 -1
  177. package/dist/src/react/core/transcript/use-chat-transcript.js +3 -0
  178. package/dist/src/react/core/transcript/use-chat-transcript.js.map +1 -1
  179. package/dist/src/spi/tool.d.ts +7 -0
  180. package/dist/src/spi/tool.d.ts.map +1 -1
  181. package/dist/src/tool-presentation.d.ts +15 -0
  182. package/dist/src/tool-presentation.d.ts.map +1 -1
  183. package/dist/src/tool-presentation.js +48 -0
  184. package/dist/src/tool-presentation.js.map +1 -1
  185. package/dist/src/tool-registry.d.ts.map +1 -1
  186. package/dist/src/tool-registry.js +2 -0
  187. package/dist/src/tool-registry.js.map +1 -1
  188. package/dist/src/types.d.ts +10 -0
  189. package/dist/src/types.d.ts.map +1 -1
  190. package/dist/src/vite/index.d.ts +24 -0
  191. package/dist/src/vite/index.d.ts.map +1 -0
  192. package/dist/src/vite/index.js +29 -0
  193. package/dist/src/vite/index.js.map +1 -0
  194. package/package.json +38 -2
  195. package/skills/agent-setup/SKILL.md +3 -1
  196. package/skills/agent-tools/SKILL.md +5 -3
@@ -0,0 +1,516 @@
1
+ import { defineCatalog, } from './catalog.js';
2
+ import { defineSandbox, sandboxPolicyOf } from './sandbox.js';
3
+ import { componentToText } from './text.js';
4
+ import { GENUI_TREE_COMPONENT } from './tree.js';
5
+ /** The channel a turn runs on when nothing says otherwise: a browser (AG-UI, the HTTP chat, A2UI). */
6
+ export const WEB_CHANNEL = 'web';
7
+ /** The `channels` entry that serves every channel without one of its own. */
8
+ export const DEFAULT_CHANNEL = 'default';
9
+ /** Channels a person reads in a messaging app or a mailbox: the server draws for them. */
10
+ export const MESSAGING_CHANNELS = Object.freeze([
11
+ 'whatsapp',
12
+ 'telegram',
13
+ 'email',
14
+ ]);
15
+ function isRecord(value) {
16
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
17
+ }
18
+ /**
19
+ * THE rule for which channel a turn runs on, read from its page context:
20
+ *
21
+ * - `pageContext.channel` is a string → that channel (an explicit override: `send({ channel })`, a
22
+ * mobile client posting `pageContext: { channel: 'mobile' }`);
23
+ * - `pageContext.channel` is the address a text-channel adapter stamps (`{ name, conversation,
24
+ * kind? }`) → its `kind` (`whatsapp`, `telegram`), else its `name`;
25
+ * - nothing → `web`: what AG-UI, the HTTP chat and A2UI serve (they stamp nothing, so a tool that
26
+ * skips skeletons when `pageContext.channel` is set keeps working).
27
+ */
28
+ export function turnChannel(pageContext) {
29
+ const value = pageContext?.channel;
30
+ if (typeof value === 'string' && value.length > 0)
31
+ return value;
32
+ if (isRecord(value)) {
33
+ if (typeof value.kind === 'string' && value.kind.length > 0)
34
+ return value.kind;
35
+ if (typeof value.name === 'string' && value.name.length > 0)
36
+ return value.name;
37
+ }
38
+ return WEB_CHANNEL;
39
+ }
40
+ /** WhatsApp, Telegram and email are drawn by the server; every other channel by a client. */
41
+ export function isMessagingChannel(channel) {
42
+ return MESSAGING_CHANNELS.includes(channel);
43
+ }
44
+ /** One channel's options, its own entry over `default` over the top level. */
45
+ export function resolveGenuiChannel(base, channels, channel) {
46
+ const name = channel ?? WEB_CHANNEL;
47
+ const messaging = isMessagingChannel(name);
48
+ const entry = channels === undefined ? undefined : (channels[name] ?? channels.default);
49
+ if (entry === undefined) {
50
+ return {
51
+ name,
52
+ messaging,
53
+ configured: false,
54
+ mode: base.mode ?? 'tree',
55
+ ...(base.streaming !== undefined ? { streaming: base.streaming } : {}),
56
+ ...(base.sandbox !== undefined ? { sandbox: base.sandbox } : {}),
57
+ render: name === 'email' ? 'html' : 'native',
58
+ };
59
+ }
60
+ const sandbox = messaging ? false : (entry.sandbox ?? base.sandbox);
61
+ const streaming = entry.streaming ?? base.streaming;
62
+ return {
63
+ name,
64
+ messaging,
65
+ configured: true,
66
+ mode: entry.mode ?? (messaging ? 'per-component' : (base.mode ?? 'tree')),
67
+ ...(streaming !== undefined ? { streaming } : {}),
68
+ ...(sandbox !== undefined ? { sandbox } : {}),
69
+ render: entry.render ?? (name === 'email' ? 'html' : 'native'),
70
+ ...(entry.chartImages !== undefined ? { chartImages: entry.chartImages } : {}),
71
+ ...(entry.instructions !== undefined ? { instructions: entry.instructions } : {}),
72
+ };
73
+ }
74
+ /** Throws on a `channels` entry that names an unknown mode or render. */
75
+ export function assertGenuiChannels(channels) {
76
+ if (channels === undefined)
77
+ return;
78
+ if (!isRecord(channels))
79
+ throw new TypeError('genui: channels must be an object');
80
+ for (const [name, entry] of Object.entries(channels)) {
81
+ if (entry === undefined)
82
+ continue;
83
+ if (!isRecord(entry))
84
+ throw new TypeError(`genui: channels.${name} must be an object`);
85
+ if (entry.mode !== undefined && !['tree', 'per-component', 'text'].includes(String(entry.mode)))
86
+ throw new TypeError(`genui: channels.${name}.mode must be 'tree', 'per-component' or 'text'`);
87
+ if (entry.render !== undefined && !['native', 'text', 'html'].includes(String(entry.render)))
88
+ throw new TypeError(`genui: channels.${name}.render must be 'native', 'text' or 'html'`);
89
+ if (entry.streaming !== undefined &&
90
+ entry.streaming !== 'partial' &&
91
+ entry.streaming !== 'complete')
92
+ throw new TypeError(`genui: channels.${name}.streaming must be 'partial' or 'complete'`);
93
+ }
94
+ }
95
+ function conversionEntry(definition, channel) {
96
+ const channels = definition?.channels;
97
+ return channels === undefined || !Object.hasOwn(channels, channel)
98
+ ? undefined
99
+ : channels[channel];
100
+ }
101
+ /** The component's conversion function for `channel` (`false`: opted out; `undefined`: none). */
102
+ function conversionOf(definition, channel) {
103
+ const entry = conversionEntry(definition, channel);
104
+ if (entry === false || entry === undefined || typeof entry === 'function')
105
+ return entry;
106
+ return typeof entry === 'object' && typeof entry.convert === 'function'
107
+ ? entry.convert
108
+ : undefined;
109
+ }
110
+ /** The conversion's own words for the model (`{ convert, describe }`), if it has them. */
111
+ function conversionDescription(definition, channel) {
112
+ const entry = conversionEntry(definition, channel);
113
+ return typeof entry === 'object' &&
114
+ entry !== null &&
115
+ typeof entry.describe === 'string' &&
116
+ entry.describe.trim() !== ''
117
+ ? entry.describe.trim()
118
+ : undefined;
119
+ }
120
+ /** A sandbox component (it carries a sandbox policy). */
121
+ function isSandbox(definition) {
122
+ return sandboxPolicyOf(definition) !== undefined;
123
+ }
124
+ /**
125
+ * Whether `definition` can be drawn on `channel`. On a web channel every component can (the client's
126
+ * `uiCapabilities` narrow it); on a messaging channel a component can when it has a conversion for
127
+ * it, a chart renderer draws it, or it has a text summary (`fallbackText`) — a component without one
128
+ * would arrive as a JSON dump, so it is not offered. A sandbox never can, and `channels: { x: false }`
129
+ * opts a component out.
130
+ */
131
+ export function canRenderOnChannel(definition, channel) {
132
+ if (definition.internal === true)
133
+ return false;
134
+ if (isSandbox(definition))
135
+ return !channel.messaging && channel.sandbox !== false;
136
+ if (!channel.messaging)
137
+ return conversionOf(definition, channel.name) !== false;
138
+ const conversion = conversionOf(definition, channel.name);
139
+ if (conversion === false)
140
+ return false;
141
+ if (definition.fallbackText !== undefined)
142
+ return true;
143
+ if (channel.render === 'text')
144
+ return false;
145
+ if (typeof conversion === 'function')
146
+ return true;
147
+ return channel.chartImages?.components.includes(definition.name) === true;
148
+ }
149
+ /**
150
+ * The catalog as `channel` may draw it: only what it can render, and its own sandbox (or none). With
151
+ * no `channels` configured the catalog is returned as it is.
152
+ */
153
+ export function channelCatalog(catalog, channel) {
154
+ if (!channel.configured)
155
+ return catalog;
156
+ if (channel.mode === 'text')
157
+ return defineCatalog([], { jsonSchemaValidator: catalog.validator });
158
+ const existing = catalog.components.find(isSandbox);
159
+ const kept = catalog.components.filter((definition) => !isSandbox(definition) && canRenderOnChannel(definition, channel));
160
+ const sandbox = channel.messaging || channel.sandbox === false
161
+ ? undefined
162
+ : channel.sandbox === undefined || channel.sandbox === true
163
+ ? (existing ?? (channel.sandbox === true ? defineSandbox() : undefined))
164
+ : defineSandbox({
165
+ ...(existing !== undefined ? { name: existing.name } : {}),
166
+ ...channel.sandbox,
167
+ });
168
+ return defineCatalog(sandbox === undefined ? kept : [...kept, sandbox], {
169
+ jsonSchemaValidator: catalog.validator,
170
+ });
171
+ }
172
+ const CHANNEL_LABELS = {
173
+ whatsapp: 'WhatsApp',
174
+ telegram: 'Telegram',
175
+ email: 'email',
176
+ };
177
+ /** What a UI tool's description says about the channel the conversation is on. */
178
+ export function channelInstructions(channel) {
179
+ if (!channel.configured)
180
+ return undefined;
181
+ const lines = [];
182
+ if (channel.messaging) {
183
+ const label = CHANNEL_LABELS[channel.name] ?? channel.name;
184
+ lines.push(channel.render === 'html'
185
+ ? `This conversation is read by ${label}: components arrive as formatted messages.`
186
+ : channel.render === 'text'
187
+ ? `This conversation is on ${label}: components arrive as their text summary.`
188
+ : `This conversation is on ${label}: components arrive as ${label} messages (text, reply buttons, lists, images) — no interactive views, no custom layouts.`);
189
+ }
190
+ if (channel.instructions !== undefined)
191
+ lines.push(channel.instructions);
192
+ return lines.length > 0 ? lines.join(' ') : undefined;
193
+ }
194
+ function titleOf(props) {
195
+ return typeof props.title === 'string' && props.title.length > 0 ? props.title : undefined;
196
+ }
197
+ function escapeHtml(text) {
198
+ return text
199
+ .replace(/&/g, '&')
200
+ .replace(/</g, '&lt;')
201
+ .replace(/>/g, '&gt;')
202
+ .replace(/"/g, '&quot;');
203
+ }
204
+ /** Plain text as minimal HTML: paragraphs, line breaks, `*bold*`. */
205
+ export function textToHtml(text) {
206
+ return text
207
+ .split(/\n{2,}/)
208
+ .filter((block) => block.trim() !== '')
209
+ .map((block) => `<p>${escapeHtml(block)
210
+ .replace(/\*\*([^*\n]+)\*\*/g, '<strong>$1</strong>')
211
+ .replace(/\*([^*\n]+)\*/g, '<strong>$1</strong>')
212
+ .replace(/\n/g, '<br>')}</p>`)
213
+ .join('\n');
214
+ }
215
+ async function nodeMessages(catalog, name, props, channel) {
216
+ if (channel.render === 'text')
217
+ return undefined;
218
+ const definition = catalog.get(name);
219
+ const conversion = conversionOf(definition, channel.name);
220
+ if (typeof conversion === 'function') {
221
+ try {
222
+ const converted = await conversion(props, { channel: channel.name });
223
+ if (converted !== null && converted !== undefined)
224
+ return Array.isArray(converted) ? converted : [converted];
225
+ }
226
+ catch {
227
+ /* a failing conversion falls back to the text summary */
228
+ }
229
+ }
230
+ if (channel.chartImages?.components.includes(name) === true) {
231
+ try {
232
+ const image = await channel.chartImages.render(name, props);
233
+ if (image !== null) {
234
+ const title = titleOf(props);
235
+ return [{ image, ...(title !== undefined ? { text: `*${title}*` } : {}) }];
236
+ }
237
+ }
238
+ catch {
239
+ /* no image: the text summary */
240
+ }
241
+ }
242
+ return undefined;
243
+ }
244
+ /**
245
+ * What a pushed component (a tree included) is on a channel the server draws for: one or more
246
+ * messages — its conversions, chart images, and the text summary of everything else, in order.
247
+ * Consecutive text is joined. Never throws: a conversion that fails sends the summary.
248
+ */
249
+ export async function renderChannelMessages(catalog, component, channel) {
250
+ const out = [];
251
+ const pushText = (text, from) => {
252
+ // (`from` names where the text came from: the first component of a run of text.)
253
+ if (text.trim() === '')
254
+ return;
255
+ const last = out.at(-1);
256
+ if (last !== undefined &&
257
+ last.buttons === undefined &&
258
+ last.list === undefined &&
259
+ last.image === undefined &&
260
+ last.html === undefined &&
261
+ last.text !== undefined) {
262
+ last.text = `${last.text}\n\n${text}`;
263
+ return;
264
+ }
265
+ out.push({
266
+ text,
267
+ component: from.name,
268
+ ...(from.id !== undefined ? { componentId: from.id } : {}),
269
+ ...(from.title !== undefined ? { title: from.title } : {}),
270
+ });
271
+ };
272
+ const visit = async (name, props, id, children, depth) => {
273
+ if (depth > 32)
274
+ return;
275
+ const title = titleOf(props);
276
+ const from = {
277
+ name,
278
+ ...(id !== undefined ? { id } : {}),
279
+ ...(title !== undefined ? { title } : {}),
280
+ };
281
+ const native = await nodeMessages(catalog, name, props, channel);
282
+ if (native !== undefined) {
283
+ for (const message of native) {
284
+ if (message.image === undefined &&
285
+ message.buttons === undefined &&
286
+ message.list === undefined &&
287
+ message.html === undefined &&
288
+ typeof message.text === 'string') {
289
+ pushText(message.text, from);
290
+ continue;
291
+ }
292
+ out.push({
293
+ ...message,
294
+ component: name,
295
+ ...(id !== undefined ? { componentId: id } : {}),
296
+ ...(title !== undefined ? { title } : {}),
297
+ });
298
+ }
299
+ }
300
+ else {
301
+ const definition = catalog.get(name);
302
+ const own = definition?.children === true && definition.fallbackText === undefined
303
+ ? ''
304
+ : componentToText(catalog, name, props);
305
+ pushText(own, from);
306
+ }
307
+ for (const child of children ?? [])
308
+ await visit(child.type, child.props, id, child.children, depth + 1);
309
+ };
310
+ if (component.name === GENUI_TREE_COMPONENT) {
311
+ const root = component.props.root;
312
+ if (root !== undefined) {
313
+ await visit(root.type, root.props, component.id, root.children, 0);
314
+ }
315
+ }
316
+ else {
317
+ await visit(component.name, component.props, component.id, undefined, 0);
318
+ }
319
+ if (channel.render === 'html') {
320
+ for (const message of out) {
321
+ if (message.html === undefined && message.text !== undefined)
322
+ message.html = textToHtml(message.text);
323
+ }
324
+ }
325
+ return out;
326
+ }
327
+ /** The UI action a pressed button (or picked list entry) stands for — the user's next turn. */
328
+ export function channelButtonAction(button, from) {
329
+ return {
330
+ source: 'component',
331
+ name: button.action !== undefined && /^[A-Za-z0-9_.:-]{1,64}$/.test(button.action)
332
+ ? button.action
333
+ : 'select',
334
+ context: isRecord(button.value) ? button.value : {},
335
+ text: button.label,
336
+ ...(from.componentId !== undefined ? { componentId: from.componentId } : {}),
337
+ ...(from.title !== undefined ? { title: from.title } : {}),
338
+ timestamp: new Date().toISOString(),
339
+ };
340
+ }
341
+ // ── What the model is told on a channel ───────────────────────────────────────────────────────
342
+ /** What a messaging channel can show at all, in the words the model reads. */
343
+ const CHANNEL_FORMS = {
344
+ whatsapp: 'text, up to 3 reply buttons, a pick-list (a list the user opens and picks one entry from) and images',
345
+ telegram: 'text, buttons under a message and images',
346
+ email: 'formatted text (an email): nothing in it is interactive',
347
+ };
348
+ function channelLabel(channel) {
349
+ return CHANNEL_LABELS[channel.name] ?? channel.name;
350
+ }
351
+ /**
352
+ * The system-prompt block for a turn on a messaging channel (WhatsApp, Telegram, email): that the
353
+ * user is not on a web page, what the channel can show, and — component by component — how each one
354
+ * reaches the user there, from its channel conversion (its `describe`, else what a conversion can
355
+ * send), a chart image, or its text summary. Tool and component descriptions are written for the web
356
+ * ("a table with a Refund button per row"); this is what keeps the model from describing that view
357
+ * on WhatsApp. `undefined` on a web-like channel, or without `channels`.
358
+ */
359
+ export function channelPrompt(catalog, channel) {
360
+ if (!channel.configured || !channel.messaging)
361
+ return undefined;
362
+ const label = channelLabel(channel);
363
+ const forms = CHANNEL_FORMS[channel.name] ?? 'text messages';
364
+ const own = [];
365
+ const asText = [];
366
+ const layouts = [];
367
+ const allText = channel.mode === 'text' || channel.render === 'text';
368
+ for (const definition of catalog.components) {
369
+ if (isSandbox(definition))
370
+ continue;
371
+ const conversion = conversionOf(definition, channel.name);
372
+ if (conversion === false)
373
+ continue;
374
+ const named = definition.title === definition.name
375
+ ? definition.name
376
+ : `${definition.title} (${definition.name})`;
377
+ if (definition.children === true) {
378
+ layouts.push(named);
379
+ continue;
380
+ }
381
+ if (allText) {
382
+ asText.push(named);
383
+ continue;
384
+ }
385
+ const described = conversionDescription(definition, channel.name);
386
+ if (described !== undefined) {
387
+ own.push(`- ${named}: ${described}`);
388
+ }
389
+ else if (typeof conversion === 'function') {
390
+ own.push(channel.render === 'html'
391
+ ? `- ${named}: a formatted section of the email — not the web view.`
392
+ : `- ${named}: a ${label} message of its own (text, maybe with reply buttons, a pick-list or an image) — not the web view; the tool result's \`delivered\` says exactly what was sent.`);
393
+ }
394
+ else if (channel.chartImages?.components.includes(definition.name) === true) {
395
+ own.push(`- ${named}: a picture of the chart (an image, its title as the caption) — nothing in it can be hovered, clicked or filtered.`);
396
+ }
397
+ else {
398
+ asText.push(named);
399
+ }
400
+ }
401
+ const lines = [
402
+ `## Channel: ${label}`,
403
+ `This conversation happens in ${label}, not on a web page. What tools and components show reaches the user as ${label} messages, and ${label} can only show ${forms}. There are no tables, cards, dashboards, charts to interact with, interactive views, or buttons inside a component.`,
404
+ 'Tool and component descriptions may describe the web view (a table, a button per row, a chart to hover). The user does not get that view here. How each component reaches the user here:',
405
+ ...own,
406
+ ...(asText.length > 0
407
+ ? [
408
+ `- As plain text (its summary), with no table, no buttons and nothing to click: ${asText.join(', ')}.`,
409
+ ]
410
+ : []),
411
+ ...(layouts.length > 0
412
+ ? [`- Layouts, sent as their contents one after another: ${layouts.join(', ')}.`]
413
+ : []),
414
+ `When a tool shows something, its result's \`delivered\` says exactly what the user received on ${label}. Describe only that: never mention a table, a button, a link or a view the user did not get, and never point "above"/"below" at one. To act on something, the user picks it from a list or buttons that were sent, or replies with what they want.`,
415
+ ];
416
+ if (channel.instructions !== undefined)
417
+ lines.push(channel.instructions);
418
+ return lines.join('\n');
419
+ }
420
+ function excerpt(text, max = 120) {
421
+ const flat = text.replace(/\s+/g, ' ').trim();
422
+ return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
423
+ }
424
+ function quoted(labels, max = 10) {
425
+ const shown = labels.slice(0, max).map((label) => `"${excerpt(label, 40)}"`);
426
+ return labels.length > max
427
+ ? `${shown.join(', ')} and ${labels.length - max} more`
428
+ : shown.join(', ');
429
+ }
430
+ /** What a channel's own adapters show, for a turn that did not say (WhatsApp Cloud, Telegram). */
431
+ const DEFAULT_CHOICE_LIMITS = {
432
+ whatsapp: { buttons: 3, lists: 10 },
433
+ telegram: { buttons: 8, lists: 30 },
434
+ };
435
+ /**
436
+ * What a channel actually delivered, in words for the model: each message (text, a pick-list and its
437
+ * entries, reply buttons, numbered choices, an image, an email section), and what the user did NOT
438
+ * get. This is what a tool's result carries as `delivered` on a messaging channel, so the model talks
439
+ * about the list the user can pick from — not the table with Refund buttons it would have on the web.
440
+ *
441
+ * Choices follow the channel handler's rule, within `limits` (default: the channel's own adapter's):
442
+ * reply buttons when there is no list (or no lists) and they fit, else a list of at most `lists`
443
+ * rows, else numbered text the user answers by replying.
444
+ */
445
+ export function describeChannelDelivery(messages, channel, limits) {
446
+ const label = channelLabel(channel);
447
+ if (messages.length === 0)
448
+ return `Nothing was shown on ${label} for this.`;
449
+ const { buttons: maxButtons, lists: maxRows } = limits ??
450
+ DEFAULT_CHOICE_LIMITS[channel.name] ?? { buttons: 0, lists: 0 };
451
+ let interactive = false;
452
+ let numbered = false;
453
+ const parts = [];
454
+ for (const message of messages) {
455
+ const text = message.text !== undefined && message.text.trim() !== '' ? message.text : undefined;
456
+ if (message.image !== undefined)
457
+ parts.push(`an image${text !== undefined ? ` captioned "${excerpt(text)}"` : ''}`);
458
+ const choices = message.list?.items ?? message.buttons ?? [];
459
+ // With an image, the text was its caption: the choices follow it on their own.
460
+ const body = message.image === undefined ? text : undefined;
461
+ const lead = body !== undefined ? `a message "${excerpt(body)}"` : 'a message';
462
+ if (choices.length === 0) {
463
+ if (message.image !== undefined)
464
+ continue;
465
+ parts.push(message.html !== undefined && channel.render === 'html'
466
+ ? `a formatted email section${text !== undefined ? ` ("${excerpt(text)}")` : ''}`
467
+ : `a text message "${excerpt(text ?? '')}"`);
468
+ continue;
469
+ }
470
+ const labels = choices.map((choice) => choice.label);
471
+ const asButtons = message.list === undefined || maxRows === 0;
472
+ if (asButtons && choices.length <= maxButtons) {
473
+ interactive = true;
474
+ parts.push(`${lead} with ${choices.length} reply ${choices.length === 1 ? 'button' : 'buttons'}: ${quoted(labels)} — pressing one comes back as the user's next message`);
475
+ }
476
+ else if (maxRows > 0) {
477
+ interactive = true;
478
+ const rows = labels.slice(0, maxRows);
479
+ const cut = labels.length > rows.length ? ` (only the first ${rows.length} of ${labels.length})` : '';
480
+ const button = message.list?.button ?? 'Options';
481
+ parts.push(`${lead} with a pick-list${message.list?.title !== undefined ? ` "${excerpt(message.list.title, 40)}"` : ''} (opened with "${excerpt(button, 30)}") of ${rows.length} ${rows.length === 1 ? 'entry' : 'entries'}${cut}: ${quoted(rows)} — picking one comes back as the user's next message`);
482
+ }
483
+ else {
484
+ numbered = true;
485
+ parts.push(`${lead} with ${labels.length} numbered ${labels.length === 1 ? 'choice' : 'choices'} as text: ${quoted(labels)} — the user answers by replying with one`);
486
+ }
487
+ }
488
+ if (parts.length === 0)
489
+ return `Nothing was shown on ${label} for this.`;
490
+ const listed = parts.length === 1 ? parts[0] : parts.map((part, index) => `${index + 1}) ${part}`).join('; ');
491
+ return [
492
+ `Shown on ${label} as ${listed}.`,
493
+ interactive
494
+ ? 'That is all the user got: no table, no web view, and no buttons other than the ones listed.'
495
+ : numbered
496
+ ? 'That is all the user got: no table, no web view, no buttons and nothing to click — they answer by replying with a message.'
497
+ : 'That is all the user got: no table, no web view, no buttons and nothing to click — they can only reply with a message.',
498
+ ].join(' ');
499
+ }
500
+ /**
501
+ * {@link describeChannelDelivery} of the components a tool pushed (last props per id, previews left
502
+ * out), rendered the way the channel draws them. `undefined` on a channel the server does not draw
503
+ * for, or without `channels`.
504
+ */
505
+ export async function describeChannelComponents(catalog, components, channel, limits) {
506
+ if (!channel.configured || !channel.messaging)
507
+ return undefined;
508
+ const messages = [];
509
+ for (const component of components) {
510
+ if (component.partial === true)
511
+ continue;
512
+ messages.push(...(await renderChannelMessages(catalog, component, channel)));
513
+ }
514
+ return components.length === 0 ? undefined : describeChannelDelivery(messages, channel, limits);
515
+ }
516
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../../../src/genui/channels.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Charts as images, for channels that take images but cannot draw a chart (WhatsApp, Telegram, an
3
+ * email): `chartSvg(props)` draws the builtin `Chart` (bar or line) as SVG, and `chartImages()` turns
4
+ * it into a PNG with `@resvg/resvg-js` — an OPTIONAL peer dependency, loaded only when a chart is
5
+ * actually drawn.
6
+ *
7
+ * ```ts
8
+ * import { chartImages } from '@adonis-agora/agent/genui/chart-image'
9
+ * genui({ catalog, channels: { whatsapp: { chartImages: chartImages() } } })
10
+ * ```
11
+ */
12
+ import type { ChartImageRenderer } from './channels.js';
13
+ import type { ChartProps } from './registry.js';
14
+ export interface ChartSvgOptions {
15
+ /** Default 800. */
16
+ width?: number;
17
+ /** Default 450. */
18
+ height?: number;
19
+ /** Series colors, in order. Default: a palette readable on white. */
20
+ colors?: readonly string[];
21
+ /** Default `#ffffff`. */
22
+ background?: string;
23
+ /** Default `#1f2328`. */
24
+ foreground?: string;
25
+ /** Default: a list of common sans-serif families (resvg picks the first installed one). */
26
+ fontFamily?: string;
27
+ }
28
+ /** The builtin `Chart` as an SVG document: axes, gridlines, bars or lines, a legend for 2+ series. */
29
+ export declare function chartSvg(props: ChartProps, options?: ChartSvgOptions): string;
30
+ export interface ChartImagesOptions extends ChartSvgOptions {
31
+ /** The components drawn as images, all taking {@link ChartProps}. Default `['Chart']`. */
32
+ components?: readonly string[];
33
+ /** Font files for resvg (a server without system fonts draws no text otherwise). */
34
+ fontFiles?: readonly string[];
35
+ }
36
+ /** SVG → PNG bytes, with `@resvg/resvg-js`. */
37
+ export declare function svgToPng(svg: string, options?: {
38
+ width?: number;
39
+ fontFiles?: readonly string[];
40
+ }): Promise<Uint8Array>;
41
+ /**
42
+ * Charts as PNG images on a channel (`genui({ channels: { whatsapp: { chartImages: chartImages() } } })`).
43
+ * A chart the renderer cannot draw (resvg missing, bad props) falls back to its text summary.
44
+ */
45
+ export declare function chartImages(options?: ChartImagesOptions): ChartImageRenderer;
46
+ //# sourceMappingURL=chart-image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-image.d.ts","sourceRoot":"","sources":["../../../src/genui/chart-image.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAsB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8BD,sGAAsG;AACtG,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CAoGjF;AAED,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,0FAA0F;IAC1F,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,oFAAoF;IACpF,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B;AAuBD,+CAA+C;AAC/C,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAO,GAC9D,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,kBAAkB,CAehF"}