@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.
- package/CHANGELOG.md +29 -0
- package/dist/configure.d.ts +5 -4
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +8 -4
- package/dist/configure.js.map +1 -1
- package/dist/providers/agent_provider.d.ts.map +1 -1
- package/dist/providers/agent_provider.js +15 -1
- package/dist/providers/agent_provider.js.map +1 -1
- package/dist/src/a2ui/adapter.d.ts.map +1 -1
- package/dist/src/a2ui/adapter.js +1 -0
- package/dist/src/a2ui/adapter.js.map +1 -1
- package/dist/src/a2ui/core.d.ts.map +1 -1
- package/dist/src/a2ui/core.js +11 -1
- package/dist/src/a2ui/core.js.map +1 -1
- package/dist/src/action-proposal-executor.d.ts.map +1 -1
- package/dist/src/action-proposal-executor.js +3 -0
- package/dist/src/action-proposal-executor.js.map +1 -1
- package/dist/src/ag-ui/adapter.d.ts.map +1 -1
- package/dist/src/ag-ui/adapter.js +2 -0
- package/dist/src/ag-ui/adapter.js.map +1 -1
- package/dist/src/ag-ui/core/encoder.d.ts.map +1 -1
- package/dist/src/ag-ui/core/encoder.js +3 -0
- package/dist/src/ag-ui/core/encoder.js.map +1 -1
- package/dist/src/agent-deps-factory.d.ts +3 -1
- package/dist/src/agent-deps-factory.d.ts.map +1 -1
- package/dist/src/agent-deps-factory.js +3 -0
- package/dist/src/agent-deps-factory.js.map +1 -1
- package/dist/src/agent-deps.d.ts +3 -1
- package/dist/src/agent-deps.d.ts.map +1 -1
- package/dist/src/agent-deps.js.map +1 -1
- package/dist/src/agent-loop.d.ts +7 -1
- package/dist/src/agent-loop.d.ts.map +1 -1
- package/dist/src/agent-loop.js +52 -2
- package/dist/src/agent-loop.js.map +1 -1
- package/dist/src/agent-service.d.ts +6 -0
- package/dist/src/agent-service.d.ts.map +1 -1
- package/dist/src/agent-service.js +5 -3
- package/dist/src/agent-service.js.map +1 -1
- package/dist/src/channels/adapters/evolution_api.d.ts.map +1 -1
- package/dist/src/channels/adapters/evolution_api.js +35 -0
- package/dist/src/channels/adapters/evolution_api.js.map +1 -1
- package/dist/src/channels/adapters/telegram.d.ts.map +1 -1
- package/dist/src/channels/adapters/telegram.js +25 -7
- package/dist/src/channels/adapters/telegram.js.map +1 -1
- package/dist/src/channels/adapters/whatsapp_cloud.d.ts.map +1 -1
- package/dist/src/channels/adapters/whatsapp_cloud.js +44 -0
- package/dist/src/channels/adapters/whatsapp_cloud.js.map +1 -1
- package/dist/src/channels/handler.d.ts +29 -1
- package/dist/src/channels/handler.d.ts.map +1 -1
- package/dist/src/channels/handler.js +231 -9
- package/dist/src/channels/handler.js.map +1 -1
- package/dist/src/channels/index.d.ts +2 -2
- package/dist/src/channels/index.d.ts.map +1 -1
- package/dist/src/channels/index.js.map +1 -1
- package/dist/src/channels/types.d.ts +40 -0
- package/dist/src/channels/types.d.ts.map +1 -1
- package/dist/src/genui/catalog.d.ts +12 -1
- package/dist/src/genui/catalog.d.ts.map +1 -1
- package/dist/src/genui/catalog.js +18 -1
- package/dist/src/genui/catalog.js.map +1 -1
- package/dist/src/genui/channels.d.ts +252 -0
- package/dist/src/genui/channels.d.ts.map +1 -0
- package/dist/src/genui/channels.js +516 -0
- package/dist/src/genui/channels.js.map +1 -0
- package/dist/src/genui/chart-image.d.ts +46 -0
- package/dist/src/genui/chart-image.d.ts.map +1 -0
- package/dist/src/genui/chart-image.js +155 -0
- package/dist/src/genui/chart-image.js.map +1 -0
- package/dist/src/genui/factory.d.ts +23 -1
- package/dist/src/genui/factory.d.ts.map +1 -1
- package/dist/src/genui/factory.js +13 -1
- package/dist/src/genui/factory.js.map +1 -1
- package/dist/src/genui/index.d.ts.map +1 -1
- package/dist/src/genui/index.js +64 -3
- package/dist/src/genui/index.js.map +1 -1
- package/dist/src/genui/kit/adonis.d.ts +4 -0
- package/dist/src/genui/kit/adonis.d.ts.map +1 -0
- package/dist/src/genui/kit/adonis.js +38 -0
- package/dist/src/genui/kit/adonis.js.map +1 -0
- package/dist/src/genui/kit/bundle.d.ts +25 -0
- package/dist/src/genui/kit/bundle.d.ts.map +1 -0
- package/dist/src/genui/kit/bundle.js +144 -0
- package/dist/src/genui/kit/bundle.js.map +1 -0
- package/dist/src/genui/kit/discover.d.ts +41 -0
- package/dist/src/genui/kit/discover.d.ts.map +1 -0
- package/dist/src/genui/kit/discover.js +100 -0
- package/dist/src/genui/kit/discover.js.map +1 -0
- package/dist/src/genui/kit/docs.d.ts +22 -0
- package/dist/src/genui/kit/docs.d.ts.map +1 -0
- package/dist/src/genui/kit/docs.js +237 -0
- package/dist/src/genui/kit/docs.js.map +1 -0
- package/dist/src/genui/kit/files.d.ts +27 -0
- package/dist/src/genui/kit/files.d.ts.map +1 -0
- package/dist/src/genui/kit/files.js +126 -0
- package/dist/src/genui/kit/files.js.map +1 -0
- package/dist/src/genui/kit/index.d.ts +12 -0
- package/dist/src/genui/kit/index.d.ts.map +1 -0
- package/dist/src/genui/kit/index.js +12 -0
- package/dist/src/genui/kit/index.js.map +1 -0
- package/dist/src/genui/kit/plugin.d.ts +52 -0
- package/dist/src/genui/kit/plugin.d.ts.map +1 -0
- package/dist/src/genui/kit/plugin.js +314 -0
- package/dist/src/genui/kit/plugin.js.map +1 -0
- package/dist/src/genui/kit/write.d.ts +14 -0
- package/dist/src/genui/kit/write.d.ts.map +1 -0
- package/dist/src/genui/kit/write.js +39 -0
- package/dist/src/genui/kit/write.js.map +1 -0
- package/dist/src/genui/public.d.ts +7 -3
- package/dist/src/genui/public.d.ts.map +1 -1
- package/dist/src/genui/public.js +5 -1
- package/dist/src/genui/public.js.map +1 -1
- package/dist/src/genui/sandbox-jsx.d.ts +29 -0
- package/dist/src/genui/sandbox-jsx.d.ts.map +1 -0
- package/dist/src/genui/sandbox-jsx.js +656 -0
- package/dist/src/genui/sandbox-jsx.js.map +1 -0
- package/dist/src/genui/sandbox-kit.d.ts +88 -0
- package/dist/src/genui/sandbox-kit.d.ts.map +1 -0
- package/dist/src/genui/sandbox-kit.js +89 -0
- package/dist/src/genui/sandbox-kit.js.map +1 -0
- package/dist/src/genui/sandbox-theme.d.ts +61 -0
- package/dist/src/genui/sandbox-theme.d.ts.map +1 -0
- package/dist/src/genui/sandbox-theme.js +255 -0
- package/dist/src/genui/sandbox-theme.js.map +1 -0
- package/dist/src/genui/sandbox.d.ts +73 -2
- package/dist/src/genui/sandbox.d.ts.map +1 -1
- package/dist/src/genui/sandbox.js +106 -16
- package/dist/src/genui/sandbox.js.map +1 -1
- package/dist/src/genui/text.d.ts.map +1 -1
- package/dist/src/genui/text.js +33 -1
- package/dist/src/genui/text.js.map +1 -1
- package/dist/src/genui/tools.d.ts +26 -0
- package/dist/src/genui/tools.d.ts.map +1 -1
- package/dist/src/genui/tools.js +94 -14
- package/dist/src/genui/tools.js.map +1 -1
- package/dist/src/genui/tree.d.ts +25 -2
- package/dist/src/genui/tree.d.ts.map +1 -1
- package/dist/src/genui/tree.js +161 -4
- package/dist/src/genui/tree.js.map +1 -1
- package/dist/src/hooks/genui_kit.d.ts +20 -0
- package/dist/src/hooks/genui_kit.d.ts.map +1 -0
- package/dist/src/hooks/genui_kit.js +55 -0
- package/dist/src/hooks/genui_kit.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/negotiated-tool-ui.d.ts +27 -0
- package/dist/src/negotiated-tool-ui.d.ts.map +1 -1
- package/dist/src/negotiated-tool-ui.js +52 -0
- package/dist/src/negotiated-tool-ui.js.map +1 -1
- package/dist/src/react/core/genui/sandbox-assets.d.ts +32 -0
- package/dist/src/react/core/genui/sandbox-assets.d.ts.map +1 -0
- package/dist/src/react/core/genui/sandbox-assets.js +174 -0
- package/dist/src/react/core/genui/sandbox-assets.js.map +1 -0
- package/dist/src/react/core/genui/sandbox.d.ts +9 -0
- package/dist/src/react/core/genui/sandbox.d.ts.map +1 -1
- package/dist/src/react/core/genui/sandbox.js +119 -19
- package/dist/src/react/core/genui/sandbox.js.map +1 -1
- package/dist/src/react/core/index.d.ts +1 -1
- package/dist/src/react/core/index.d.ts.map +1 -1
- package/dist/src/react/core/index.js +1 -1
- package/dist/src/react/core/index.js.map +1 -1
- package/dist/src/react/core/presentation/phrasing.d.ts +3 -2
- package/dist/src/react/core/presentation/phrasing.d.ts.map +1 -1
- package/dist/src/react/core/presentation/phrasing.js +4 -27
- package/dist/src/react/core/presentation/phrasing.js.map +1 -1
- package/dist/src/react/core/presentation/tool-activity.d.ts +8 -0
- package/dist/src/react/core/presentation/tool-activity.d.ts.map +1 -1
- package/dist/src/react/core/presentation/tool-activity.js +28 -1
- package/dist/src/react/core/presentation/tool-activity.js.map +1 -1
- package/dist/src/react/core/transcript/model.d.ts +6 -0
- package/dist/src/react/core/transcript/model.d.ts.map +1 -1
- package/dist/src/react/core/transcript/model.js +6 -1
- package/dist/src/react/core/transcript/model.js.map +1 -1
- package/dist/src/react/core/transcript/use-chat-transcript.d.ts +5 -0
- package/dist/src/react/core/transcript/use-chat-transcript.d.ts.map +1 -1
- package/dist/src/react/core/transcript/use-chat-transcript.js +3 -0
- package/dist/src/react/core/transcript/use-chat-transcript.js.map +1 -1
- package/dist/src/spi/tool.d.ts +7 -0
- package/dist/src/spi/tool.d.ts.map +1 -1
- package/dist/src/tool-presentation.d.ts +15 -0
- package/dist/src/tool-presentation.d.ts.map +1 -1
- package/dist/src/tool-presentation.js +48 -0
- package/dist/src/tool-presentation.js.map +1 -1
- package/dist/src/tool-registry.d.ts.map +1 -1
- package/dist/src/tool-registry.js +2 -0
- package/dist/src/tool-registry.js.map +1 -1
- package/dist/src/types.d.ts +10 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/vite/index.d.ts +24 -0
- package/dist/src/vite/index.d.ts.map +1 -0
- package/dist/src/vite/index.js +29 -0
- package/dist/src/vite/index.js.map +1 -0
- package/package.json +38 -2
- package/skills/agent-setup/SKILL.md +3 -1
- 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, '<')
|
|
201
|
+
.replace(/>/g, '>')
|
|
202
|
+
.replace(/"/g, '"');
|
|
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"}
|