@openvertice/bot-sdk 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +189 -2
- package/dist/src/audio.d.ts +32 -0
- package/dist/src/audio.d.ts.map +1 -0
- package/dist/src/audio.js +47 -0
- package/dist/src/audio.js.map +1 -0
- package/dist/src/cliente.d.ts +213 -0
- package/dist/src/cliente.d.ts.map +1 -0
- package/dist/src/cliente.js +381 -0
- package/dist/src/cliente.js.map +1 -0
- package/dist/src/gateway.d.ts +76 -0
- package/dist/src/gateway.d.ts.map +1 -0
- package/dist/src/gateway.js +299 -0
- package/dist/src/gateway.js.map +1 -0
- package/dist/src/http.d.ts +119 -0
- package/dist/src/http.d.ts.map +1 -0
- package/dist/src/http.js +189 -0
- package/dist/src/http.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +16 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/tipos.d.ts +243 -0
- package/dist/src/tipos.d.ts.map +1 -0
- package/dist/src/tipos.js +5 -0
- package/dist/src/tipos.js.map +1 -0
- package/dist/src/voz-wrtc.d.ts +20 -0
- package/dist/src/voz-wrtc.d.ts.map +1 -0
- package/dist/src/voz-wrtc.js +68 -0
- package/dist/src/voz-wrtc.js.map +1 -0
- package/dist/src/voz.d.ts +150 -0
- package/dist/src/voz.d.ts.map +1 -0
- package/dist/src/voz.js +311 -0
- package/dist/src/voz.js.map +1 -0
- package/dist/src/wav.d.ts +29 -0
- package/dist/src/wav.d.ts.map +1 -0
- package/dist/src/wav.js +54 -0
- package/dist/src/wav.js.map +1 -0
- package/package.json +58 -3
- package/src/audio.ts +88 -0
- package/src/cliente.ts +472 -0
- package/src/gateway.ts +354 -0
- package/src/http.ts +249 -0
- package/src/index.ts +41 -0
- package/src/tipos.ts +220 -0
- package/src/voz-wrtc.ts +100 -0
- package/src/voz.ts +407 -0
- package/src/wav.ts +71 -0
- package/src/wrtc.d.ts +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gFAAgF;AAChF,qBAAqB;AACrB;;;;;GAKG;AACH,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAkB9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAQ/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/** Contract version this SDK implements. */
|
|
2
|
+
export declare const CONTRATO = "2026-10";
|
|
3
|
+
/** Gateway event families a bot may subscribe to. */
|
|
4
|
+
export type Intencao = "MESSAGES" | "MEMBERS" | "ROOMS" | "PRESENCE";
|
|
5
|
+
/** A text channel as the server grants it to this bot. */
|
|
6
|
+
export interface CanalDeTexto {
|
|
7
|
+
/** Stable channel code used in every API call (for example `"MURAL"`). */
|
|
8
|
+
code: string;
|
|
9
|
+
/** Name people see ("Música"); falls back to `code` if the room is gone. */
|
|
10
|
+
nome: string;
|
|
11
|
+
/** Whether the bot may read what is posted here. */
|
|
12
|
+
escutar: boolean;
|
|
13
|
+
/** Whether the bot may post here. */
|
|
14
|
+
falar: boolean;
|
|
15
|
+
/** Command prefix of the channel; `null` = the bot receives everything it can hear. */
|
|
16
|
+
prefixo: string | null;
|
|
17
|
+
}
|
|
18
|
+
/** A voice channel the bot is allowed to join. */
|
|
19
|
+
export interface CanalDeVoz {
|
|
20
|
+
code: string;
|
|
21
|
+
nome: string;
|
|
22
|
+
}
|
|
23
|
+
/** STUN/TURN server handed to the WebRTC peer connection. */
|
|
24
|
+
export interface ServidorIce {
|
|
25
|
+
/** One URL or a list of them (`stun:`, `turn:`). */
|
|
26
|
+
urls: string | string[];
|
|
27
|
+
username?: string;
|
|
28
|
+
credential?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Rate limits the server enforces for this bot. */
|
|
31
|
+
export interface Limites {
|
|
32
|
+
/** Messages per minute. */
|
|
33
|
+
mensagensPorMinuto: number;
|
|
34
|
+
/** `identify` attempts per minute. */
|
|
35
|
+
identifyPorMinuto: number;
|
|
36
|
+
/** Session lifetime in seconds. */
|
|
37
|
+
sessaoSegundos: number;
|
|
38
|
+
}
|
|
39
|
+
/** Response of `GET /api/bots/gateway`: everything this bot is allowed to do. */
|
|
40
|
+
export interface Descoberta {
|
|
41
|
+
/** Contract version the server speaks; compare it with `CONTRATO`. */
|
|
42
|
+
contrato: string;
|
|
43
|
+
/** The identity the server assigned to the bot. */
|
|
44
|
+
bot: {
|
|
45
|
+
id: string;
|
|
46
|
+
usuario: string;
|
|
47
|
+
exibicao: string;
|
|
48
|
+
};
|
|
49
|
+
/** Where to connect and how often to send heartbeats. */
|
|
50
|
+
gateway: {
|
|
51
|
+
versao: number;
|
|
52
|
+
url: string;
|
|
53
|
+
heartbeatMs: number;
|
|
54
|
+
};
|
|
55
|
+
/** Channels the panel granted, split by kind. */
|
|
56
|
+
canais: {
|
|
57
|
+
texto: CanalDeTexto[];
|
|
58
|
+
voz: CanalDeVoz[];
|
|
59
|
+
};
|
|
60
|
+
/** Event families the panel granted. */
|
|
61
|
+
intents: Intencao[];
|
|
62
|
+
/** ICE servers to use for voice. */
|
|
63
|
+
iceServers: ServidorIce[];
|
|
64
|
+
/** Effective rate limits. */
|
|
65
|
+
limites: Limites;
|
|
66
|
+
}
|
|
67
|
+
/** Response of `POST /api/bots/session`: a short-lived gateway credential. */
|
|
68
|
+
export interface Sessao {
|
|
69
|
+
/** The session token, sent on `identify` and on message requests. */
|
|
70
|
+
sessao: string;
|
|
71
|
+
/** Expiry as a Unix timestamp in milliseconds. */
|
|
72
|
+
expiraEm: number;
|
|
73
|
+
/** Gateway endpoint and cadence to use with this session. */
|
|
74
|
+
gateway: {
|
|
75
|
+
versao: number;
|
|
76
|
+
url: string;
|
|
77
|
+
heartbeatMs: number;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/** A file attached to a message. */
|
|
81
|
+
export interface AnexoDaMensagem {
|
|
82
|
+
/** Original file name, as uploaded. */
|
|
83
|
+
nome: string;
|
|
84
|
+
/** MIME type. */
|
|
85
|
+
mime: string;
|
|
86
|
+
/** Size in bytes. */
|
|
87
|
+
tamanho: number;
|
|
88
|
+
/** Absolute URL to download the file. */
|
|
89
|
+
url: string;
|
|
90
|
+
}
|
|
91
|
+
/** Link preview the server resolved for a message. */
|
|
92
|
+
export interface PreviaDeLink {
|
|
93
|
+
/** URL the preview was built from. */
|
|
94
|
+
url: string;
|
|
95
|
+
/** Page title, when the server could read one. */
|
|
96
|
+
titulo: string | null;
|
|
97
|
+
/** Page description, when available. */
|
|
98
|
+
descricao: string | null;
|
|
99
|
+
/** Preview image URL, when available. */
|
|
100
|
+
imagem: string | null;
|
|
101
|
+
/** Site name (host) shown next to the preview. */
|
|
102
|
+
site: string;
|
|
103
|
+
}
|
|
104
|
+
/** A message, as delivered by `message.created` and returned by the send routes. */
|
|
105
|
+
export interface Mensagem {
|
|
106
|
+
/** Message id, unique inside the channel. */
|
|
107
|
+
id: string;
|
|
108
|
+
/** Code of the channel the message belongs to. */
|
|
109
|
+
sala?: string;
|
|
110
|
+
/** Display name of the author. */
|
|
111
|
+
autor: string;
|
|
112
|
+
/** Author id, used to tell the bot's own messages apart. */
|
|
113
|
+
autorId?: string | null;
|
|
114
|
+
/** `true` when the author is a bot — this one included. */
|
|
115
|
+
autorBot: boolean;
|
|
116
|
+
/** Kind of payload the message carries. */
|
|
117
|
+
tipo?: "texto" | "arquivo" | "voz";
|
|
118
|
+
/** Text content; `null` for attachments without a caption. */
|
|
119
|
+
texto: string | null;
|
|
120
|
+
/** Creation time as a Unix timestamp in milliseconds. */
|
|
121
|
+
criadaEm: number;
|
|
122
|
+
/** When the message was pinned, if it was. */
|
|
123
|
+
fixadaEm?: number | null;
|
|
124
|
+
/** Who pinned the message. */
|
|
125
|
+
fixadaPor?: string | null;
|
|
126
|
+
/** Attachment, when `tipo` is `arquivo` or `voz`. */
|
|
127
|
+
arquivo?: AnexoDaMensagem | null;
|
|
128
|
+
/** Resolved link preview, when the message contains a link. */
|
|
129
|
+
previa?: PreviaDeLink | null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The payload of `voice.signal` — the raw WebRTC `signal`, untranslated.
|
|
133
|
+
*
|
|
134
|
+
* The SDP travels under two names because both sides of the protocol already
|
|
135
|
+
* existed: `sdp` is the bot contract's name (server/bots/README.md) and
|
|
136
|
+
* `description.sdp` is what the browser client reads
|
|
137
|
+
* (`client/src/types/signaling.ts`). Senders fill in both; receivers accept
|
|
138
|
+
* either one.
|
|
139
|
+
*/
|
|
140
|
+
export interface SinalDeVoz {
|
|
141
|
+
/** `"offer"`, `"answer"` or `"candidate"`. */
|
|
142
|
+
type?: string;
|
|
143
|
+
/** Session description, in the bot contract's name. */
|
|
144
|
+
sdp?: string;
|
|
145
|
+
/** Session description, in the browser client's shape. */
|
|
146
|
+
description?: {
|
|
147
|
+
type?: string;
|
|
148
|
+
sdp?: string;
|
|
149
|
+
};
|
|
150
|
+
/** ICE candidate, when `type` is `"candidate"`. */
|
|
151
|
+
candidate?: unknown;
|
|
152
|
+
[chave: string]: unknown;
|
|
153
|
+
}
|
|
154
|
+
/** A command announced on `identify`, used by the client's autocomplete. */
|
|
155
|
+
export interface ComandoAnunciado {
|
|
156
|
+
/** Command name, without the channel prefix (e.g. `"tocar"`). */
|
|
157
|
+
nome: string;
|
|
158
|
+
/** Short, human-readable summary shown next to the suggestion. */
|
|
159
|
+
descricao?: string;
|
|
160
|
+
}
|
|
161
|
+
/** Someone else in the voice room. */
|
|
162
|
+
export interface PeerDaVoz {
|
|
163
|
+
/** Peer id inside the room. */
|
|
164
|
+
id: string;
|
|
165
|
+
/** Display name. */
|
|
166
|
+
nome: string;
|
|
167
|
+
/** `true` when the peer is a bot. */
|
|
168
|
+
bot?: boolean;
|
|
169
|
+
}
|
|
170
|
+
/** Events dispatched by the gateway (op 0), keyed by event name, with the shape of their `d`. */
|
|
171
|
+
export interface Eventos {
|
|
172
|
+
/** Sent once per connection, right after `identify` (or `resume`) succeeds. */
|
|
173
|
+
ready: {
|
|
174
|
+
/** The bot's identity on the server. */
|
|
175
|
+
bot: {
|
|
176
|
+
id: string;
|
|
177
|
+
usuario: string;
|
|
178
|
+
exibicao: string;
|
|
179
|
+
};
|
|
180
|
+
/** Text channels with full settings; voice channels as bare codes. */
|
|
181
|
+
canais: {
|
|
182
|
+
texto: CanalDeTexto[];
|
|
183
|
+
voz: string[];
|
|
184
|
+
};
|
|
185
|
+
/** Event families the server accepted. */
|
|
186
|
+
intents: Intencao[];
|
|
187
|
+
/** Channels where the read subscription took effect (they exist and grant access). */
|
|
188
|
+
ouvindo: string[];
|
|
189
|
+
/** Commands this process announced, for the client's autocomplete. */
|
|
190
|
+
comandos: ComandoAnunciado[];
|
|
191
|
+
/** ICE servers to use for voice. */
|
|
192
|
+
iceServers: ServidorIce[];
|
|
193
|
+
/** Id of the session this connection is using. */
|
|
194
|
+
sessao: string;
|
|
195
|
+
};
|
|
196
|
+
/** A message was posted in a channel the bot listens to. */
|
|
197
|
+
"message.created": Mensagem;
|
|
198
|
+
/**
|
|
199
|
+
* Someone called the bot with `@login`/`@display`.
|
|
200
|
+
*
|
|
201
|
+
* Arrives even in channels with a prefix (where `message.created` would not)
|
|
202
|
+
* and, in channels without a prefix, alongside it.
|
|
203
|
+
*/
|
|
204
|
+
mention: Mensagem;
|
|
205
|
+
/** A message was deleted; `sala` is the channel code it belonged to. */
|
|
206
|
+
"message.deleted": {
|
|
207
|
+
id: string;
|
|
208
|
+
sala: string;
|
|
209
|
+
};
|
|
210
|
+
/** An operation failed; `codigo` tells channel errors from voice errors. */
|
|
211
|
+
error: {
|
|
212
|
+
codigo: string;
|
|
213
|
+
mensagem: string;
|
|
214
|
+
};
|
|
215
|
+
/** The bot is now in the voice room. */
|
|
216
|
+
"voice.joined": {
|
|
217
|
+
/** Channel code. */
|
|
218
|
+
code: string;
|
|
219
|
+
/** Channel name. */
|
|
220
|
+
nome: string;
|
|
221
|
+
/** The bot's id in the room: it settles the crossed offer (glare). */
|
|
222
|
+
eu: string;
|
|
223
|
+
/** Peers already in the room. */
|
|
224
|
+
peers: PeerDaVoz[];
|
|
225
|
+
};
|
|
226
|
+
/** Another peer joined the voice room. */
|
|
227
|
+
"voice.peer.joined": PeerDaVoz;
|
|
228
|
+
/** Another peer left the voice room. */
|
|
229
|
+
"voice.peer.left": {
|
|
230
|
+
id: string;
|
|
231
|
+
};
|
|
232
|
+
/** The bot left (or was removed from) the voice room. */
|
|
233
|
+
"voice.left": {
|
|
234
|
+
code: string;
|
|
235
|
+
motivo: string;
|
|
236
|
+
};
|
|
237
|
+
/** WebRTC signaling addressed to this bot by peer `de`. */
|
|
238
|
+
"voice.signal": {
|
|
239
|
+
de: string;
|
|
240
|
+
signal: SinalDeVoz;
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=tipos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tipos.d.ts","sourceRoot":"","sources":["../../src/tipos.ts"],"names":[],"mappings":"AAGA,4CAA4C;AAC5C,eAAO,MAAM,QAAQ,YAAY,CAAC;AAElC,qDAAqD;AACrD,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAErE,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,uFAAuF;IACvF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,oDAAoD;AACpD,MAAM,WAAW,OAAO;IACtB,2BAA2B;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,iFAAiF;AACjF,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACvD,yDAAyD;IACzD,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,iDAAiD;IACjD,MAAM,EAAE;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,GAAG,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IACrD,wCAAwC;IACxC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,oCAAoC;IACpC,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,8EAA8E;AAC9E,MAAM,WAAW,MAAM;IACrB,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,sCAAsC;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wCAAwC;IACxC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yCAAyC;IACzC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,oFAAoF;AACpF,MAAM,WAAW,QAAQ;IACvB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,KAAK,CAAC;IACnC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qDAAqD;IACrD,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,WAAW,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,sCAAsC;AACtC,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,iGAAiG;AACjG,MAAM,WAAW,OAAO;IACtB,+EAA+E;IAC/E,KAAK,EAAE;QACL,wCAAwC;QACxC,GAAG,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QACvD,sEAAsE;QACtE,MAAM,EAAE;YAAE,KAAK,EAAE,YAAY,EAAE,CAAC;YAAC,GAAG,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QACjD,0CAA0C;QAC1C,OAAO,EAAE,QAAQ,EAAE,CAAC;QACpB,sFAAsF;QACtF,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,sEAAsE;QACtE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;QAC7B,oCAAoC;QACpC,UAAU,EAAE,WAAW,EAAE,CAAC;QAC1B,kDAAkD;QAClD,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,4DAA4D;IAC5D,iBAAiB,EAAE,QAAQ,CAAC;IAC5B;;;;;OAKG;IACH,OAAO,EAAE,QAAQ,CAAC;IAClB,wEAAwE;IACxE,iBAAiB,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,4EAA4E;IAC5E,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,wCAAwC;IACxC,cAAc,EAAE;QACd,oBAAoB;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,oBAAoB;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,sEAAsE;QACtE,EAAE,EAAE,MAAM,CAAC;QACX,iCAAiC;QACjC,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB,CAAC;IACF,0CAA0C;IAC1C,mBAAmB,EAAE,SAAS,CAAC;IAC/B,wCAAwC;IACxC,iBAAiB,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,yDAAyD;IACzD,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,2DAA2D;IAC3D,cAAc,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC;CACpD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Types of the Vértice contract (server/bots/README.md, version 2026-10).
|
|
2
|
+
// They are the boundary: if the server changes a field, it changes here too.
|
|
3
|
+
/** Contract version this SDK implements. */
|
|
4
|
+
export const CONTRATO = "2026-10";
|
|
5
|
+
//# sourceMappingURL=tipos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tipos.js","sourceRoot":"","sources":["../../src/tipos.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAE7E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TransporteDeVoz } from "./voz.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates the Node voice transport backed by `@roamhq/wrtc`.
|
|
4
|
+
*
|
|
5
|
+
* The returned transport mirrors the browser's `RTCPeerConnection` API, so the
|
|
6
|
+
* mesh code in voz.ts does not need to know which runtime it is running on.
|
|
7
|
+
* Every connection it opens is tracked, and `fechar()` closes them all.
|
|
8
|
+
*
|
|
9
|
+
* @returns A transport that creates peer connections and audio sources.
|
|
10
|
+
* @throws {Error} When `@roamhq/wrtc` is not installed.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const transporte = await criarTransporteWrtc();
|
|
15
|
+
* const voz = new Voz(bot, { transporte });
|
|
16
|
+
* await voz.entrar("PATIO");
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare function criarTransporteWrtc(): Promise<TransporteDeVoz>;
|
|
20
|
+
//# sourceMappingURL=voz-wrtc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voz-wrtc.d.ts","sourceRoot":"","sources":["../../src/voz-wrtc.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAA8B,eAAe,EAAE,MAAM,UAAU,CAAC;AAqD5E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC,CAwBpE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** Module cache: the native addon is imported at most once per process. */
|
|
2
|
+
let carregado = null;
|
|
3
|
+
/**
|
|
4
|
+
* Imports `@roamhq/wrtc` on first use.
|
|
5
|
+
*
|
|
6
|
+
* The import is dynamic on purpose: a bot that only handles text must not pay
|
|
7
|
+
* for (or fail because of) a native dependency it never uses.
|
|
8
|
+
*
|
|
9
|
+
* @returns The wrtc module, memoised after the first call.
|
|
10
|
+
* @throws {Error} With install instructions when the optional dependency is missing.
|
|
11
|
+
*/
|
|
12
|
+
async function carregarWrtc() {
|
|
13
|
+
if (carregado)
|
|
14
|
+
return carregado;
|
|
15
|
+
try {
|
|
16
|
+
const modulo = (await import("@roamhq/wrtc"));
|
|
17
|
+
carregado = "RTCPeerConnection" in modulo ? modulo : modulo.default;
|
|
18
|
+
return carregado;
|
|
19
|
+
}
|
|
20
|
+
catch (erro) {
|
|
21
|
+
throw new Error("A voz do bot precisa de `@roamhq/wrtc`. Instale com `npm i @roamhq/wrtc` " +
|
|
22
|
+
`no projeto do bot (o texto funciona sem ele). Detalhe: ${erro instanceof Error ? erro.message : String(erro)}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Creates the Node voice transport backed by `@roamhq/wrtc`.
|
|
27
|
+
*
|
|
28
|
+
* The returned transport mirrors the browser's `RTCPeerConnection` API, so the
|
|
29
|
+
* mesh code in voz.ts does not need to know which runtime it is running on.
|
|
30
|
+
* Every connection it opens is tracked, and `fechar()` closes them all.
|
|
31
|
+
*
|
|
32
|
+
* @returns A transport that creates peer connections and audio sources.
|
|
33
|
+
* @throws {Error} When `@roamhq/wrtc` is not installed.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const transporte = await criarTransporteWrtc();
|
|
38
|
+
* const voz = new Voz(bot, { transporte });
|
|
39
|
+
* await voz.entrar("PATIO");
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export async function criarTransporteWrtc() {
|
|
43
|
+
const wrtc = await carregarWrtc();
|
|
44
|
+
const abertas = new Set();
|
|
45
|
+
return {
|
|
46
|
+
/** Opens a peer connection configured with the server-provided ICE servers. */
|
|
47
|
+
criarConexao({ iceServers }) {
|
|
48
|
+
const conexao = new wrtc.RTCPeerConnection({
|
|
49
|
+
iceServers: iceServers.map((servidor) => ({
|
|
50
|
+
urls: servidor.urls,
|
|
51
|
+
...(servidor.username ? { username: servidor.username } : {}),
|
|
52
|
+
...(servidor.credential ? { credential: servidor.credential } : {}),
|
|
53
|
+
})),
|
|
54
|
+
});
|
|
55
|
+
abertas.add(conexao);
|
|
56
|
+
return conexao;
|
|
57
|
+
},
|
|
58
|
+
/** Creates the PCM source that feeds the published audio track. */
|
|
59
|
+
criarFonteDeAudio: () => new wrtc.nonstandard.RTCAudioSource(),
|
|
60
|
+
/** Closes every connection this transport opened. */
|
|
61
|
+
fechar() {
|
|
62
|
+
for (const conexao of abertas)
|
|
63
|
+
conexao.close();
|
|
64
|
+
abertas.clear();
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=voz-wrtc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voz-wrtc.js","sourceRoot":"","sources":["../../src/voz-wrtc.ts"],"names":[],"mappings":"AA4BA,2EAA2E;AAC3E,IAAI,SAAS,GAAsB,IAAI,CAAC;AAExC;;;;;;;;GAQG;AACH,KAAK,UAAU,YAAY;IACzB,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAEjB,CAAC;QAC5B,SAAS,GAAG,mBAAmB,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACpE,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,2EAA2E;YACzE,0DACE,IAAI,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CACpD,EAAE,CACL,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAgB,CAAC;IACxC,OAAO;QACL,+EAA+E;QAC/E,YAAY,CAAC,EAAE,UAAU,EAAiC;YACxD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,iBAAiB,CAAC;gBACzC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBACxC,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7D,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpE,CAAC,CAAC;aACJ,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,mEAAmE;QACnE,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE;QAC9D,qDAAqD;QACrD,MAAM;YACJ,KAAK,MAAM,OAAO,IAAI,OAAO;gBAAE,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/C,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { Bot } from "./cliente.js";
|
|
2
|
+
import type { ServidorIce } from "./tipos.js";
|
|
3
|
+
/**
|
|
4
|
+
* The minimum voice needs from WebRTC — swappable in tests.
|
|
5
|
+
*
|
|
6
|
+
* `criarTransporteWrtc()` provides the Node implementation.
|
|
7
|
+
*/
|
|
8
|
+
export interface TransporteDeVoz {
|
|
9
|
+
/** Opens one peer connection, configured with the given ICE servers. */
|
|
10
|
+
criarConexao(opcoes: {
|
|
11
|
+
iceServers: ServidorIce[];
|
|
12
|
+
}): ConexaoDeVoz;
|
|
13
|
+
/** Creates the PCM source that feeds the published track. */
|
|
14
|
+
criarFonteDeAudio(): FonteDeAudio;
|
|
15
|
+
/** Closes every connection this transport opened. */
|
|
16
|
+
fechar(): void;
|
|
17
|
+
}
|
|
18
|
+
/** The slice of `RTCPeerConnection` the mesh actually uses. */
|
|
19
|
+
export interface ConexaoDeVoz {
|
|
20
|
+
/** Standard `signalingState` (`stable`, `have-local-offer`, …). */
|
|
21
|
+
signalingState: string;
|
|
22
|
+
/** Local session description, once one has been set. */
|
|
23
|
+
localDescription: {
|
|
24
|
+
type: string;
|
|
25
|
+
sdp?: string;
|
|
26
|
+
} | null;
|
|
27
|
+
/** Adds an `audio` or `video` m-line and returns the transceiver. */
|
|
28
|
+
addTransceiver(tipo: "audio" | "video", opcoes?: {
|
|
29
|
+
direction?: string;
|
|
30
|
+
}): unknown;
|
|
31
|
+
/** Current transceivers, in SDP order. */
|
|
32
|
+
getTransceivers(): {
|
|
33
|
+
direction: string;
|
|
34
|
+
sender: {
|
|
35
|
+
track: unknown;
|
|
36
|
+
replaceTrack(track: unknown): Promise<void>;
|
|
37
|
+
};
|
|
38
|
+
}[];
|
|
39
|
+
/** Builds an offer from the current transceivers. */
|
|
40
|
+
createOffer(): Promise<{
|
|
41
|
+
type: "offer";
|
|
42
|
+
sdp: string;
|
|
43
|
+
}>;
|
|
44
|
+
/** Builds an answer to the current remote offer. */
|
|
45
|
+
createAnswer(): Promise<{
|
|
46
|
+
type: "answer";
|
|
47
|
+
sdp: string;
|
|
48
|
+
}>;
|
|
49
|
+
/** Applies a local session description. */
|
|
50
|
+
setLocalDescription(descricao: {
|
|
51
|
+
type: string;
|
|
52
|
+
sdp?: string;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
/** Applies the remote session description. */
|
|
55
|
+
setRemoteDescription(descricao: {
|
|
56
|
+
type: string;
|
|
57
|
+
sdp?: string;
|
|
58
|
+
}): Promise<void>;
|
|
59
|
+
/** Adds a remote ICE candidate. */
|
|
60
|
+
addIceCandidate(candidato: unknown): Promise<void>;
|
|
61
|
+
/** Closes the connection and releases its resources. */
|
|
62
|
+
close(): void;
|
|
63
|
+
/** Emits local ICE candidates as they are gathered. */
|
|
64
|
+
onicecandidate: ((evento: {
|
|
65
|
+
candidate: unknown;
|
|
66
|
+
}) => void) | null;
|
|
67
|
+
/** Emits remote tracks as they arrive. */
|
|
68
|
+
ontrack: ((evento: {
|
|
69
|
+
track: unknown;
|
|
70
|
+
}) => void) | null;
|
|
71
|
+
}
|
|
72
|
+
/** Audio source: where the track the bot publishes comes from. */
|
|
73
|
+
export interface FonteDeAudio {
|
|
74
|
+
/** Creates the track fed by this source. */
|
|
75
|
+
createTrack(): unknown;
|
|
76
|
+
}
|
|
77
|
+
/** What {@link Voz} needs to run. */
|
|
78
|
+
export interface OpcoesDeVoz {
|
|
79
|
+
/** Runtime that creates peer connections and audio sources. */
|
|
80
|
+
transporte: TransporteDeVoz;
|
|
81
|
+
/**
|
|
82
|
+
* The track the bot publishes. Without it, voice creates one from
|
|
83
|
+
* `transporte.criarFonteDeAudio()` — and you feed that source (see audio.ts).
|
|
84
|
+
*/
|
|
85
|
+
track?: unknown;
|
|
86
|
+
/** What to do with the audio that arrives from the other peers. */
|
|
87
|
+
aoReceberTrack?: (peerId: string, track: unknown) => void;
|
|
88
|
+
/** Diagnostic sink. */
|
|
89
|
+
log?: (mensagem: string) => void;
|
|
90
|
+
}
|
|
91
|
+
/** Result of a successful {@link Voz.entrar}. */
|
|
92
|
+
export interface EntradaNaVoz {
|
|
93
|
+
/** Channel code the bot joined. */
|
|
94
|
+
code: string;
|
|
95
|
+
/** Channel name. */
|
|
96
|
+
nome: string;
|
|
97
|
+
/** The bot's id in the room (it settles the crossed offer). */
|
|
98
|
+
eu: string;
|
|
99
|
+
/** Peers that were already in the room. */
|
|
100
|
+
peers: {
|
|
101
|
+
id: string;
|
|
102
|
+
nome: string;
|
|
103
|
+
bot?: boolean;
|
|
104
|
+
}[];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Voice client for a {@link Bot}.
|
|
108
|
+
*
|
|
109
|
+
* The bot is one more peer in the mesh: it offers to peers that are already in
|
|
110
|
+
* the room, answers offers, exchanges ICE candidates and publishes one audio
|
|
111
|
+
* track. Create it once, before `bot.start()`, so the listeners are in place
|
|
112
|
+
* when `voice.joined` arrives.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```ts
|
|
116
|
+
* const transporte = await criarTransporteWrtc();
|
|
117
|
+
* const voz = new Voz(bot, { transporte });
|
|
118
|
+
* await bot.start();
|
|
119
|
+
* await voz.entrar("PATIO");
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export declare class Voz {
|
|
123
|
+
#private;
|
|
124
|
+
/**
|
|
125
|
+
* Wires the voice client to a bot.
|
|
126
|
+
*
|
|
127
|
+
* It subscribes to the voice events right away, so the instance must exist
|
|
128
|
+
* before the bot starts.
|
|
129
|
+
*
|
|
130
|
+
* @param bot Bot whose gateway carries the signaling.
|
|
131
|
+
* @param opcoes Transport, optional track and logging.
|
|
132
|
+
*/
|
|
133
|
+
constructor(bot: Bot, opcoes: OpcoesDeVoz);
|
|
134
|
+
/** Channel the bot is in (`null` = not in voice). */
|
|
135
|
+
get canal(): string | null;
|
|
136
|
+
/** The published track; created on demand when it was not passed in the options. */
|
|
137
|
+
get track(): unknown;
|
|
138
|
+
/**
|
|
139
|
+
* Joins a voice channel and offers to everyone already there.
|
|
140
|
+
*
|
|
141
|
+
* @param code Channel code (case-insensitive).
|
|
142
|
+
* @returns The room information, once the server confirms the join.
|
|
143
|
+
* @throws {Error} When the server rejects the join or does not confirm it
|
|
144
|
+
* within {@link ESPERA_DA_ENTRADA_MS}.
|
|
145
|
+
*/
|
|
146
|
+
entrar(code: string): Promise<EntradaNaVoz>;
|
|
147
|
+
/** Leaves the voice room, if the bot is in one. */
|
|
148
|
+
sair(): void;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=voz.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voz.d.ts","sourceRoot":"","sources":["../../src/voz.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,YAAY,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,WAAW,EAAE,CAAA;KAAE,GAAG,YAAY,CAAC;IAClE,6DAA6D;IAC7D,iBAAiB,IAAI,YAAY,CAAC;IAClC,qDAAqD;IACrD,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,gBAAgB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxD,qEAAqE;IACrE,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAClF,0CAA0C;IAC1C,eAAe,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE;YAAE,KAAK,EAAE,OAAO,CAAC;YAAC,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;SAAE,CAAC;KACzE,EAAE,CAAC;IACJ,qDAAqD;IACrD,WAAW,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,oDAAoD;IACpD,YAAY,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,2CAA2C;IAC3C,mBAAmB,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,8CAA8C;IAC9C,oBAAoB,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,mCAAmC;IACnC,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,wDAAwD;IACxD,KAAK,IAAI,IAAI,CAAC;IACd,uDAAuD;IACvD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAClE,0CAA0C;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;CACxD;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,WAAW,IAAI,OAAO,CAAC;CACxB;AAED,qCAAqC;AACrC,MAAM,WAAW,WAAW;IAC1B,+DAA+D;IAC/D,UAAU,EAAE,eAAe,CAAC;IAC5B;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mEAAmE;IACnE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,uBAAuB;IACvB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,2CAA2C;IAC3C,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CACtD;AAKD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,GAAG;;IAed;;;;;;;;OAQG;gBACS,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW;IA6CzC,qDAAqD;IACrD,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,oFAAoF;IACpF,IAAI,KAAK,IAAI,OAAO,CAMnB;IAED;;;;;;;OAOG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmBjD,mDAAmD;IACnD,IAAI,IAAI,IAAI;CAqKb"}
|