agent-relay 11.1.1 → 11.2.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 CHANGED
@@ -62,6 +62,13 @@ agent-relay fleet spawn codex \
62
62
  --task "Use https://agentrelay.com/skill, ACK over Relay, then wait for details." \
63
63
  --node sf-mini
64
64
 
65
+ # Resume a known Claude/Codex CLI session on its origin node.
66
+ agent-relay fleet spawn codex \
67
+ --name api-worker \
68
+ --task "Resume over Relay and continue the prior task." \
69
+ --node sf-mini \
70
+ --session-ref <actual-codex-thread-id>
71
+
65
72
  # Omit --node for automatic eligible-node placement.
66
73
  agent-relay fleet spawn codex --name api-worker --task "Review the current diff."
67
74
 
@@ -78,6 +85,11 @@ set `RELAY_AGENT_TOKEN` to the token returned by
78
85
  `agent-relay agent register <lead-name>`. Automatic placement and release need
79
86
  only the workspace key.
80
87
 
88
+ `--session-ref` is a real CLI resume, not a logical collaboration label. Pass
89
+ the actual Claude session ID or Codex thread ID and target its origin node.
90
+ Omit it to start a new CLI session. The project’s Agent Relay workspace remains
91
+ pinned independently until you explicitly create or select another workspace.
92
+
81
93
  To run as a Cloud-managed node, first redeem a one-time enrollment token, then start the node:
82
94
 
83
95
  ```bash
@@ -85,6 +97,74 @@ agent-relay cloud enroll --token ocl_node_enr_...
85
97
  agent-relay node up
86
98
  ```
87
99
 
100
+ ## Cloud multiplayer rooms
101
+
102
+ Cloud room membership is scoped to one Relay workspace. Every v1 invite creates
103
+ a trusted full room participant: they receive their own revocable Relaycast
104
+ human credential and may use all ordinary agent-level collaboration actions.
105
+ The workspace key itself is never shared, so owner-key administration and Agent
106
+ Relay Cloud organization administration remain owner-only.
107
+
108
+ ```bash
109
+ # Owner: invite and manage people in this workspace.
110
+ agent-relay cloud room invite \
111
+ --workspace rw_7ccfea89 \
112
+ --email teammate@example.com \
113
+ --token-file ./teammate.room-invite
114
+ agent-relay cloud room invites --workspace rw_7ccfea89
115
+ agent-relay cloud room members --workspace rw_7ccfea89
116
+
117
+ # Share the owner-only token file over a secure channel. The invitee keeps the
118
+ # token out of shell history and process arguments.
119
+ # Tokens use the consumer-neutral relay_room_inv_ prefix followed by exactly
120
+ # 43 URL-safe characters.
121
+ read -rs ROOM_INVITATION_TOKEN
122
+ printf '%s' "$ROOM_INVITATION_TOKEN" |
123
+ agent-relay cloud room accept --token-stdin
124
+ unset ROOM_INVITATION_TOKEN
125
+
126
+ # Trusted clients establish one stable session per device.
127
+ # --json intentionally includes the participant credential; capture it in
128
+ # memory and do not log or persist it.
129
+ agent-relay cloud room session \
130
+ --workspace rw_7ccfea89 \
131
+ --device-id client-macbook \
132
+ --json
133
+
134
+ # Explicitly ending or replacing the device session revokes the old scoped token.
135
+ agent-relay cloud room revoke-session \
136
+ --workspace rw_7ccfea89 \
137
+ --device-id client-macbook
138
+
139
+ # Participants use their scoped token for agent-level Relaycast operations; an
140
+ # ambient owner workspace key is never consulted when --token is present.
141
+ agent-relay agent presence \
142
+ --token at_live_... \
143
+ --base-url https://cast.agentrelay.com
144
+
145
+ # Owner: revoke access and active room sessions.
146
+ agent-relay cloud room remove-member <membership-id> --workspace rw_7ccfea89
147
+ ```
148
+
149
+ There is no room-specific integration grant or credential service. Connect the
150
+ workspace provider through the existing Cloud integration API, then use the
151
+ normal Relayfile workflow for setup, mounts, reads, and writebacks:
152
+
153
+ ```bash
154
+ # Owner: discover or connect a provider through Cloud.
155
+ agent-relay cloud integration catalog
156
+ agent-relay cloud integration connect linear --workspace rw_7ccfea89
157
+ agent-relay cloud integration connections --workspace rw_7ccfea89
158
+
159
+ # Member clients use Relayfile directly, including its OAuth/backend selection
160
+ # and durable writeback queue.
161
+ relayfile integration available
162
+ relayfile integration connect linear
163
+ RELAYFILE_LOCAL_DIR="$PWD/.integrations" relayfile setup
164
+ RELAYFILE_LOCAL_DIR="$PWD/.integrations" relayfile status
165
+ RELAYFILE_LOCAL_DIR="$PWD/.integrations" relayfile writeback status
166
+ ```
167
+
88
168
  `local` remains as a deprecated hidden alias of `node` (it prints a one-time warning).
89
169
 
90
170
  Node workflow runs use Relayflows for YAML, TypeScript, and Python workflow files.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAStD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD,IAAI,CAyDN"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAStD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,GAAE,OAAO,CAAC,wBAAwB,CAAM,GAChD,IAAI,CA2EN"}
@@ -30,6 +30,18 @@ export function registerAgentCommands(program, overrides = {}) {
30
30
  printJson(deps, await relay.agents.list({ status: opts.status }));
31
31
  });
32
32
  });
33
+ addSdkOptions(group.command('me').description('Show the current agent identity')).action(async (opts) => {
34
+ await runSdk(deps, async () => {
35
+ const relay = deps.createAgentRelay(sdkOptionsFromOpts(opts));
36
+ printJson(deps, await relay.agents.me());
37
+ });
38
+ });
39
+ addSdkOptions(group.command('presence').description('List visible agent presence')).action(async (opts) => {
40
+ await runSdk(deps, async () => {
41
+ const relay = deps.createAgentRelay(sdkOptionsFromOpts(opts));
42
+ printJson(deps, await relay.agents.presence());
43
+ });
44
+ });
33
45
  addSdkOptions(group
34
46
  .command('add')
35
47
  .description('Add an agent to the workspace')
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/cli/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ import type { CloudDependencies } from './cloud.js';
3
+ type Dependencies = Pick<CloudDependencies, 'log' | 'error' | 'exit' | 'ensureCloudSession' | 'authorizedApiFetch'>;
4
+ export declare function registerCloudIntegrationCommands(cloudCommand: Command, deps: Dependencies): void;
5
+ export {};
6
+ //# sourceMappingURL=cloud-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-integration.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cloud-integration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAK1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,KAAK,YAAY,GAAG,IAAI,CACtB,iBAAiB,EACjB,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,oBAAoB,GAAG,oBAAoB,CACvE,CAAC;AAmOF,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAqJhG"}
@@ -0,0 +1,282 @@
1
+ import { InvalidArgumentError } from 'commander';
2
+ import { defaultApiUrl } from '@agent-relay/cloud';
3
+ import { stripAnsiFast } from '@agent-relay/utils';
4
+ const WORKSPACE_UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
5
+ const RELAY_WORKSPACE = /^rw_[a-z0-9]{8}$/;
6
+ const PROVIDER_ID = /^[a-z0-9][a-z0-9_-]{0,127}$/;
7
+ function isObject(value) {
8
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
9
+ }
10
+ function object(value, label) {
11
+ if (!isObject(value))
12
+ throw new Error(`Cloud returned an invalid ${label} response.`);
13
+ return value;
14
+ }
15
+ function string(value, label) {
16
+ if (typeof value !== 'string' || !value.trim()) {
17
+ throw new Error(`Cloud returned an invalid ${label} response.`);
18
+ }
19
+ return value.trim();
20
+ }
21
+ function connectionProviderIds(value) {
22
+ if (!Array.isArray(value)) {
23
+ throw new Error('Cloud returned an invalid integration connection response.');
24
+ }
25
+ return value.map((entry) => {
26
+ if (typeof entry === 'string')
27
+ return string(entry, 'integration connection');
28
+ return string(object(entry, 'integration connection provider').id, 'integration connection');
29
+ });
30
+ }
31
+ function workspaceId(value) {
32
+ const normalized = value.trim();
33
+ if (!WORKSPACE_UUID.test(normalized) && !RELAY_WORKSPACE.test(normalized)) {
34
+ throw new Error('Unsupported Cloud workspace identifier. Use a Cloud workspace UUID or unified rw_ workspace ID.');
35
+ }
36
+ return normalized;
37
+ }
38
+ function providerId(value) {
39
+ const normalized = value.trim().toLowerCase();
40
+ if (!PROVIDER_ID.test(normalized))
41
+ throw new Error('Invalid integration provider ID.');
42
+ return normalized;
43
+ }
44
+ function backend(value) {
45
+ if (value === 'nango' || value === 'composio')
46
+ return value;
47
+ throw new InvalidArgumentError('Expected backend to be one of: nango, composio');
48
+ }
49
+ function canonicalApiUrl(value) {
50
+ let url;
51
+ try {
52
+ url = new URL(value);
53
+ }
54
+ catch {
55
+ throw new Error('Invalid Cloud API URL.');
56
+ }
57
+ const loopback = url.hostname === 'localhost' || url.hostname === '127.0.0.1' || url.hostname === '[::1]';
58
+ if ((url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) ||
59
+ url.username ||
60
+ url.password ||
61
+ url.search ||
62
+ url.hash) {
63
+ throw new Error('Invalid Cloud API URL.');
64
+ }
65
+ return url.toString().replace(/\/+$/, '');
66
+ }
67
+ function cloudError(response) {
68
+ if (response.status === 401) {
69
+ return new Error('Cloud login required. Run `agent-relay cloud login` and retry.');
70
+ }
71
+ if (response.status === 403) {
72
+ return new Error('You do not have permission to perform that integration operation.');
73
+ }
74
+ if (response.status === 404) {
75
+ return new Error('The integration resource was not found or is no longer available.');
76
+ }
77
+ if (response.status === 409) {
78
+ return new Error('The integration operation conflicts with its current lifecycle state.');
79
+ }
80
+ if (response.status === 429) {
81
+ return new Error('Cloud integration rate limit exceeded. Wait and retry.');
82
+ }
83
+ return new Error(`Cloud integration request failed (${response.status}).`);
84
+ }
85
+ async function requestWithAuth(deps, path, init, apiUrl, priorAuth) {
86
+ const requested = apiUrl ?? defaultApiUrl();
87
+ const auth = priorAuth ??
88
+ (await deps.ensureCloudSession({
89
+ apiUrl: requested,
90
+ interactive: false,
91
+ })).auth;
92
+ if (apiUrl && canonicalApiUrl(auth.apiUrl) !== canonicalApiUrl(requested)) {
93
+ throw new Error(`Cloud login is bound to ${canonicalApiUrl(auth.apiUrl)}. Run \`agent-relay cloud login --api-url ${canonicalApiUrl(requested)} --force\` before using this host.`);
94
+ }
95
+ const result = await deps.authorizedApiFetch(auth, path, init, {
96
+ interactive: false,
97
+ });
98
+ const payload = (await result.response.json().catch(() => null));
99
+ if (!result.response.ok)
100
+ throw cloudError(result.response);
101
+ return { payload, auth: result.auth };
102
+ }
103
+ async function request(deps, path, init, apiUrl) {
104
+ return (await requestWithAuth(deps, path, init, apiUrl)).payload;
105
+ }
106
+ async function action(deps, fn) {
107
+ try {
108
+ await fn();
109
+ }
110
+ catch (error) {
111
+ deps.error(error instanceof Error ? error.message : String(error));
112
+ deps.exit(1);
113
+ }
114
+ }
115
+ function terminal(value) {
116
+ return (stripAnsiFast(value)
117
+ // eslint-disable-next-line no-control-regex
118
+ .replace(/[\u0000-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/g, '�')
119
+ .trim());
120
+ }
121
+ function secretField(key) {
122
+ return /(?:token|secret|password|authorization|credential|api[_-]?key)/i.test(key);
123
+ }
124
+ function sanitize(value) {
125
+ if (Array.isArray(value))
126
+ return value.map(sanitize);
127
+ if (!isObject(value))
128
+ return typeof value === 'string' ? terminal(value) : value;
129
+ return Object.fromEntries(Object.entries(value)
130
+ .filter(([key]) => !secretField(key))
131
+ .map(([key, nested]) => [key, sanitize(nested)]));
132
+ }
133
+ function json(deps, payload) {
134
+ deps.log(JSON.stringify(payload, null, 2));
135
+ }
136
+ function normalizeCatalog(payload) {
137
+ const response = object(payload, 'integration catalog');
138
+ if (!Array.isArray(response.providers)) {
139
+ throw new Error('Cloud returned an invalid integration catalog response.');
140
+ }
141
+ return {
142
+ providers: response.providers.map((entry) => {
143
+ const provider = object(entry, 'integration provider');
144
+ string(provider.id, 'integration provider');
145
+ return sanitize(provider);
146
+ }),
147
+ version: string(response.version, 'integration catalog'),
148
+ };
149
+ }
150
+ function renderProviders(catalog, deps) {
151
+ for (const provider of catalog.providers) {
152
+ const backends = Array.isArray(provider.backends)
153
+ ? provider.backends.map(String)
154
+ : [provider.backend].filter(Boolean).map(String);
155
+ deps.log([
156
+ terminal(String(provider.id ?? 'unknown')),
157
+ backends.length > 0 ? backends.join(',') : 'backend-unspecified',
158
+ ].join(' '));
159
+ }
160
+ }
161
+ function renderConnections(payload, deps) {
162
+ if (!Array.isArray(payload)) {
163
+ throw new Error('Cloud returned an invalid integration connection list.');
164
+ }
165
+ if (payload.length === 0) {
166
+ deps.log('No connected workspace integrations.');
167
+ return;
168
+ }
169
+ for (const entry of payload) {
170
+ const connection = object(entry, 'integration connection');
171
+ const id = [connection.id, connection.provider, connection.providerId].find((value) => typeof value === 'string' && value.trim());
172
+ if (typeof id !== 'string') {
173
+ throw new Error('Cloud returned an invalid integration connection list.');
174
+ }
175
+ const status = typeof connection.status === 'string' && connection.status.trim()
176
+ ? terminal(connection.status)
177
+ : undefined;
178
+ deps.log([terminal(id), status].filter(Boolean).join(' '));
179
+ }
180
+ }
181
+ export function registerCloudIntegrationCommands(cloudCommand, deps) {
182
+ const integration = cloudCommand
183
+ .command('integration')
184
+ .description('Manage Agent Relay Cloud integration connections');
185
+ integration
186
+ .command('catalog')
187
+ .description('Discover static and dynamic Cloud integrations')
188
+ .option('--api-url <url>', 'Cloud API base URL')
189
+ .option('--static', 'Exclude dynamic Nango and Composio catalog entries')
190
+ .option('--search <query>', 'Filter providers by ID or display name')
191
+ .option('--backend <backend>', 'Filter providers by nango or composio', backend)
192
+ .option('--json', 'Output the integration catalog as JSON')
193
+ .action(async (options) => {
194
+ await action(deps, async () => {
195
+ const catalog = normalizeCatalog(await request(deps, `/api/v1/integrations/catalog?dynamic=${options.static ? 'false' : 'true'}`, { method: 'GET' }, options.apiUrl));
196
+ const query = options.search?.trim().toLowerCase();
197
+ const payload = {
198
+ ...catalog,
199
+ providers: catalog.providers.filter((provider) => {
200
+ const haystack = `${String(provider.id ?? '')} ${String(provider.displayName ?? '')}`.toLowerCase();
201
+ const backends = Array.isArray(provider.backends)
202
+ ? provider.backends
203
+ : [provider.backend].filter(Boolean);
204
+ return ((!query || haystack.includes(query)) &&
205
+ (!options.backend || backends.includes(options.backend)));
206
+ }),
207
+ };
208
+ if (options.json)
209
+ json(deps, payload);
210
+ else
211
+ renderProviders(payload, deps);
212
+ });
213
+ });
214
+ integration
215
+ .command('connections')
216
+ .description('List connected workspace integrations')
217
+ .requiredOption('--workspace <workspace>', 'Cloud UUID or unified rw_ workspace ID')
218
+ .option('--api-url <url>', 'Cloud API base URL')
219
+ .option('--json', 'Output connections as JSON')
220
+ .action(async (options) => {
221
+ await action(deps, async () => {
222
+ const id = workspaceId(options.workspace);
223
+ const payload = sanitize(await request(deps, `/api/v1/workspaces/${encodeURIComponent(id)}/integrations`, { method: 'GET' }, options.apiUrl));
224
+ if (options.json)
225
+ json(deps, payload);
226
+ else
227
+ renderConnections(payload, deps);
228
+ });
229
+ });
230
+ integration
231
+ .command('connect')
232
+ .description('Create a Cloud connection session for a provider')
233
+ .argument('<provider>', 'Provider ID from the catalog')
234
+ .requiredOption('--workspace <workspace>', 'Cloud UUID or unified rw_ workspace ID')
235
+ .option('--backend <backend>', 'Connection backend: nango or composio', backend)
236
+ .option('--api-url <url>', 'Cloud API base URL')
237
+ .option('--json', 'Output safe connection-session details as JSON')
238
+ .action(async (providerInput, options) => {
239
+ await action(deps, async () => {
240
+ const id = workspaceId(options.workspace);
241
+ const provider = providerId(providerInput);
242
+ const response = object(await request(deps, `/api/v1/workspaces/${encodeURIComponent(id)}/integrations/connect-session`, {
243
+ method: 'POST',
244
+ body: JSON.stringify({
245
+ allowedIntegrations: [provider],
246
+ ...(options.backend ? { requestedBackend: options.backend } : {}),
247
+ }),
248
+ }, options.apiUrl), 'integration connection');
249
+ const payload = {
250
+ connectLink: string(response.connectLink, 'integration connection'),
251
+ workspaceId: string(response.workspaceId, 'integration connection'),
252
+ relayWorkspaceId: string(response.relayWorkspaceId, 'integration connection'),
253
+ backend: string(response.backend, 'integration connection'),
254
+ providers: connectionProviderIds(response.providers),
255
+ ...(typeof response.expiresAt === 'string' ? { expiresAt: response.expiresAt } : {}),
256
+ };
257
+ if (options.json)
258
+ json(deps, payload);
259
+ else
260
+ deps.log(payload.connectLink);
261
+ });
262
+ });
263
+ integration
264
+ .command('disconnect')
265
+ .description('Disconnect a provider from the workspace')
266
+ .argument('<provider>', 'Provider ID')
267
+ .requiredOption('--workspace <workspace>', 'Cloud UUID or unified rw_ workspace ID')
268
+ .option('--api-url <url>', 'Cloud API base URL')
269
+ .option('--json', 'Output the disconnection result as JSON')
270
+ .action(async (providerInput, options) => {
271
+ await action(deps, async () => {
272
+ const id = workspaceId(options.workspace);
273
+ const provider = providerId(providerInput);
274
+ await request(deps, `/api/v1/workspaces/${encodeURIComponent(id)}/integrations/${encodeURIComponent(provider)}/status`, { method: 'DELETE' }, options.apiUrl);
275
+ if (options.json)
276
+ json(deps, { success: true });
277
+ else
278
+ deps.log(`Disconnected ${terminal(provider)}.`);
279
+ });
280
+ });
281
+ }
282
+ //# sourceMappingURL=cloud-integration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-integration.js","sourceRoot":"","sources":["../../../src/cli/commands/cloud-integration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Command } from 'commander';
2
+ import type { CloudDependencies } from './cloud.js';
3
+ type CloudRoomDependencies = Pick<CloudDependencies, 'log' | 'error' | 'exit' | 'ensureCloudSession' | 'authorizedApiFetch'>;
4
+ interface CloudRoomIo {
5
+ readStdin: () => Promise<string>;
6
+ readSecretFile: (filePath: string) => Promise<string>;
7
+ writeSecretFile: (filePath: string, value: string) => Promise<void>;
8
+ }
9
+ export declare function registerCloudRoomCommands(cloudCommand: Command, deps: CloudRoomDependencies, ioOverrides?: Partial<CloudRoomIo>): void;
10
+ export {};
11
+ //# sourceMappingURL=cloud-room.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-room.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cloud-room.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAK1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,KAAK,qBAAqB,GAAG,IAAI,CAC/B,iBAAiB,EACjB,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,oBAAoB,GAAG,oBAAoB,CACvE,CAAC;AAcF,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AA6cD,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,OAAO,EACrB,IAAI,EAAE,qBAAqB,EAC3B,WAAW,GAAE,OAAO,CAAC,WAAW,CAAM,GACrC,IAAI,CAySN"}