@agentvault/agentvault 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/_cp.d.ts +10 -0
  2. package/dist/_cp.d.ts.map +1 -0
  3. package/dist/cli.js +72036 -253
  4. package/dist/cli.js.map +7 -1
  5. package/dist/index.js +76351 -24
  6. package/dist/index.js.map +7 -1
  7. package/dist/openclaw-entry.js +1449 -1201
  8. package/dist/openclaw-entry.js.map +7 -1
  9. package/package.json +1 -1
  10. package/dist/__tests__/crypto-helpers.test.d.ts +0 -2
  11. package/dist/__tests__/crypto-helpers.test.d.ts.map +0 -1
  12. package/dist/__tests__/functional.test.d.ts +0 -21
  13. package/dist/__tests__/functional.test.d.ts.map +0 -1
  14. package/dist/__tests__/install-plugin.test.d.ts +0 -2
  15. package/dist/__tests__/install-plugin.test.d.ts.map +0 -1
  16. package/dist/__tests__/multi-session.test.d.ts +0 -2
  17. package/dist/__tests__/multi-session.test.d.ts.map +0 -1
  18. package/dist/__tests__/state.test.d.ts +0 -2
  19. package/dist/__tests__/state.test.d.ts.map +0 -1
  20. package/dist/__tests__/transport.test.d.ts +0 -2
  21. package/dist/__tests__/transport.test.d.ts.map +0 -1
  22. package/dist/account-config.js +0 -60
  23. package/dist/account-config.js.map +0 -1
  24. package/dist/channel.js +0 -3411
  25. package/dist/channel.js.map +0 -1
  26. package/dist/create-agent.js +0 -314
  27. package/dist/create-agent.js.map +0 -1
  28. package/dist/crypto-helpers.js +0 -4
  29. package/dist/crypto-helpers.js.map +0 -1
  30. package/dist/doctor.js +0 -415
  31. package/dist/doctor.js.map +0 -1
  32. package/dist/fetch-interceptor.js +0 -213
  33. package/dist/fetch-interceptor.js.map +0 -1
  34. package/dist/gateway-send.js +0 -114
  35. package/dist/gateway-send.js.map +0 -1
  36. package/dist/http-handlers.js +0 -131
  37. package/dist/http-handlers.js.map +0 -1
  38. package/dist/mcp-handlers.js +0 -48
  39. package/dist/mcp-handlers.js.map +0 -1
  40. package/dist/mcp-server.js +0 -192
  41. package/dist/mcp-server.js.map +0 -1
  42. package/dist/openclaw-compat.js +0 -94
  43. package/dist/openclaw-compat.js.map +0 -1
  44. package/dist/openclaw-plugin.js +0 -297
  45. package/dist/openclaw-plugin.js.map +0 -1
  46. package/dist/openclaw-types.js +0 -13
  47. package/dist/openclaw-types.js.map +0 -1
  48. package/dist/setup.js +0 -460
  49. package/dist/setup.js.map +0 -1
  50. package/dist/skill-invoker.js +0 -100
  51. package/dist/skill-invoker.js.map +0 -1
  52. package/dist/skill-manifest.js +0 -249
  53. package/dist/skill-manifest.js.map +0 -1
  54. package/dist/skill-telemetry.js +0 -146
  55. package/dist/skill-telemetry.js.map +0 -1
  56. package/dist/skills-publish.js +0 -133
  57. package/dist/skills-publish.js.map +0 -1
  58. package/dist/state.js +0 -178
  59. package/dist/state.js.map +0 -1
  60. package/dist/transport.js +0 -43
  61. package/dist/transport.js.map +0 -1
  62. package/dist/types.js +0 -2
  63. package/dist/types.js.map +0 -1
  64. package/dist/workspace-handlers.js +0 -177
  65. package/dist/workspace-handlers.js.map +0 -1
package/dist/setup.js DELETED
@@ -1,460 +0,0 @@
1
- /**
2
- * AgentVault one-time setup command.
3
- *
4
- * Runs enrollment + waits for owner approval + persists state,
5
- * then auto-registers the agentvault channel in openclaw config.
6
- *
7
- * Usage: npx @agentvault/agentvault setup --token=av_tok_...
8
- */
9
- import { execSync, spawnSync } from "node:child_process";
10
- import * as readline from "node:readline";
11
- import { resolve } from "node:path";
12
- import { SecureChannel } from "./channel.js";
13
- import { VERSION } from "./index.js";
14
- import { isStateValid } from "./state.js";
15
- export async function runSetupCommand(options) {
16
- const { token, name, apiUrl } = options;
17
- const dataDir = resolve(options.dataDir.replace(/^~/, process.env.HOME ?? "~"));
18
- // Guard: skip enrollment if already enrolled (unless --force)
19
- const alreadyEnrolled = await isStateValid(dataDir);
20
- if (alreadyEnrolled && !options.force) {
21
- console.log(`
22
- Already enrolled (state in ${dataDir}).
23
- Re-enroll with --force, or update plugin with: openclaw plugins update agentvault
24
- `);
25
- return;
26
- }
27
- console.log(`
28
- ╔══════════════════════════════════════════════╗
29
- ║ AgentVault — First-Time Setup ║
30
- ╚══════════════════════════════════════════════╝
31
-
32
- Agent name : ${name}${options.accountId ? `\n Account ID : ${options.accountId}` : ""}
33
- Data dir : ${dataDir}
34
- API : ${apiUrl}
35
- `);
36
- let enrollDone = false;
37
- const channel = new SecureChannel({
38
- inviteToken: token,
39
- dataDir,
40
- apiUrl,
41
- agentName: name,
42
- onMessage: () => { }, // Not handling messages during setup
43
- onStateChange: (state) => {
44
- switch (state) {
45
- case "enrolling":
46
- console.log(" Enrolling with AgentVault server...");
47
- break;
48
- case "polling":
49
- console.log(" Waiting for approval in your AgentVault dashboard...");
50
- if (channel.fingerprint) {
51
- console.log(`\n Fingerprint: ${channel.fingerprint}`);
52
- console.log(" Verify this fingerprint matches the one shown in your dashboard");
53
- console.log(" before clicking Approve.\n");
54
- }
55
- break;
56
- case "activating":
57
- console.log(" Approved! Setting up encryption...");
58
- break;
59
- case "ready":
60
- enrollDone = true;
61
- console.log(" ✅ Enrollment complete! Secure channel established.\n");
62
- break;
63
- case "error":
64
- console.error(" ❌ Setup encountered an error.");
65
- break;
66
- }
67
- },
68
- });
69
- channel.on("error", (err) => {
70
- console.error(`\n ❌ Setup failed: ${err.message}\n`);
71
- process.exit(1);
72
- });
73
- // Start enrollment — blocks until ready or error
74
- await new Promise((res, rej) => {
75
- const check = setInterval(() => {
76
- if (enrollDone) {
77
- clearInterval(check);
78
- res();
79
- }
80
- }, 500);
81
- channel.start().catch((err) => {
82
- clearInterval(check);
83
- rej(err);
84
- });
85
- });
86
- // Stop the live connection — OpenClaw's gateway will own it after restart
87
- await channel.stop();
88
- // --- Install plugin + register in OpenClaw config ---
89
- console.log(" Installing AgentVault plugin in OpenClaw...\n");
90
- // Extend PATH to find openclaw regardless of how npx was invoked
91
- const home = process.env.HOME ?? "";
92
- const extraPaths = [
93
- `${home}/.local/bin`,
94
- `${home}/.pnpm/bin`,
95
- `${home}/Library/pnpm/bin`,
96
- "/usr/local/bin",
97
- "/opt/homebrew/bin",
98
- ].join(":");
99
- const env = { ...process.env, PATH: `${extraPaths}:${process.env.PATH ?? ""}` };
100
- const pluginInstalled = installPlugin(env);
101
- if (!pluginInstalled) {
102
- // openclaw not in PATH — print full manual instructions and bail
103
- if (options.accountId) {
104
- console.log(`
105
- ⚠️ Could not auto-configure OpenClaw (is 'openclaw' in your PATH?).
106
-
107
- 1. Install the plugin:
108
- openclaw plugins install @agentvault/agentvault
109
-
110
- 2. Register the plugin in the allow list:
111
- openclaw config set plugins.allow '["agentvault"]'
112
-
113
- 3. Add this to your OpenClaw config (openclaw.yaml or openclaw.json):
114
- channels:
115
- agentvault:
116
- apiUrl: "${apiUrl}"
117
- bindings:
118
- - match:
119
- accountId: "*"
120
- accounts:
121
- ${options.accountId}:
122
- dataDir: "${dataDir}"
123
- agentName: "${name}"
124
-
125
- 4. (Recommended) Install pm2 for auto-restart and crash recovery:
126
- npm install -g pm2
127
- pm2 start "openclaw gateway start" --name openclaw-gateway
128
- pm2 startup
129
- pm2 save
130
-
131
- 5. Restart the gateway:
132
- openclaw gateway restart
133
- `);
134
- }
135
- else {
136
- console.log(`
137
- ⚠️ Could not auto-configure OpenClaw (is 'openclaw' in your PATH?).
138
-
139
- 1. Install the plugin:
140
- openclaw plugins install @agentvault/agentvault
141
-
142
- 2. Register the plugin in the allow list:
143
- openclaw config set plugins.allow '["agentvault"]'
144
-
145
- 3. Add this to your OpenClaw config (openclaw.yaml or openclaw.json):
146
- channels:
147
- agentvault:
148
- dataDir: "${dataDir}"
149
- apiUrl: "${apiUrl}"
150
- agentName: "${name}"
151
-
152
- 4. (Recommended) Install pm2 for auto-restart and crash recovery:
153
- npm install -g pm2
154
- pm2 start "openclaw gateway start" --name openclaw-gateway
155
- pm2 startup
156
- pm2 save
157
-
158
- 5. Restart the gateway:
159
- openclaw gateway restart
160
- `);
161
- }
162
- return;
163
- }
164
- console.log("\n Registering AgentVault channel in OpenClaw config...\n");
165
- const configPrefix = options.accountId
166
- ? `channels.agentvault.accounts.${options.accountId}`
167
- : "channels.agentvault";
168
- const patchCommands = [
169
- // When using multi-agent, set shared apiUrl at top level too
170
- ...(options.accountId ? [`openclaw config set channels.agentvault.apiUrl "${apiUrl}"`] : []),
171
- `openclaw config set ${configPrefix}.dataDir "${dataDir}"`,
172
- `openclaw config set ${configPrefix}.apiUrl "${apiUrl}"`,
173
- `openclaw config set ${configPrefix}.agentName "${name}"`,
174
- `openclaw config set plugins.allow '["agentvault"]'`,
175
- ];
176
- let configPatched = false;
177
- for (const cmd of patchCommands) {
178
- try {
179
- execSync(cmd, { stdio: "pipe", env });
180
- configPatched = true;
181
- }
182
- catch {
183
- // config write failed — fall through to manual
184
- configPatched = false;
185
- break;
186
- }
187
- }
188
- // Ensure channel binding + top-level agent binding exist
189
- if (configPatched && options.accountId) {
190
- // Read config directly for reliable patching (openclaw config set
191
- // can clobber arrays when merging JSON)
192
- try {
193
- const { readOpenClawConfig } = await import("./create-agent.js");
194
- const home = process.env.HOME ?? "";
195
- const ocHome = `${home}/.openclaw`;
196
- const fs = await import("node:fs");
197
- const path = await import("node:path");
198
- const configPath = path.join(ocHome, "openclaw.json");
199
- if (fs.existsSync(configPath)) {
200
- const raw = fs.readFileSync(configPath, "utf-8");
201
- const cfg = JSON.parse(raw);
202
- let changed = false;
203
- // Channel binding for this account
204
- const avChannel = cfg?.channels?.agentvault;
205
- if (avChannel) {
206
- const channelBindings = (avChannel.bindings ?? []);
207
- if (!channelBindings.some((b) => b.match?.accountId === options.accountId)) {
208
- const wildcardIdx = channelBindings.findIndex((b) => b.match?.accountId === "*");
209
- const entry = { match: { accountId: options.accountId } };
210
- if (wildcardIdx >= 0) {
211
- channelBindings.splice(wildcardIdx, 0, entry);
212
- }
213
- else {
214
- channelBindings.push(entry);
215
- }
216
- avChannel.bindings = channelBindings;
217
- changed = true;
218
- }
219
- // Ensure wildcard binding exists
220
- if (!channelBindings.some((b) => b.match?.accountId === "*")) {
221
- channelBindings.push({ match: { accountId: "*" } });
222
- changed = true;
223
- }
224
- }
225
- // Top-level binding: agentId → channel account
226
- const topBindings = (cfg.bindings ?? []);
227
- if (!topBindings.some((b) => b.agentId === options.accountId && b.match?.accountId === options.accountId)) {
228
- topBindings.push({
229
- agentId: options.accountId,
230
- match: { channel: "agentvault", accountId: options.accountId },
231
- });
232
- cfg.bindings = topBindings;
233
- changed = true;
234
- }
235
- if (changed) {
236
- const backupPath = `${configPath}.bak.pre-setup-${options.accountId}`;
237
- fs.copyFileSync(configPath, backupPath);
238
- fs.writeFileSync(configPath, JSON.stringify(cfg, null, 2) + "\n", "utf-8");
239
- }
240
- }
241
- }
242
- catch {
243
- // best-effort — not critical, create-agent.ts Step 7 will also try
244
- }
245
- }
246
- if (configPatched) {
247
- console.log(` ✅ Channel registered in OpenClaw config.\n`);
248
- // --- Step 6: Configure pm2 process management ---
249
- console.log(" Configuring pm2 process management...\n");
250
- configurePm2(env);
251
- await promptAndRestart(env);
252
- // macOS: check for stale plist after restart
253
- if (process.platform === "darwin") {
254
- const { validatePlist } = await import("./doctor.js");
255
- const plistResult = validatePlist();
256
- if (plistResult.status === "stale") {
257
- console.log(`\n ⚠️ macOS LaunchAgent plist has stale paths.
258
- Run to diagnose and fix: npx @agentvault/agentvault doctor\n`);
259
- }
260
- }
261
- }
262
- else {
263
- if (options.accountId) {
264
- console.log(` ⚠️ Could not auto-configure OpenClaw channel.
265
- Add this to your OpenClaw config (openclaw.yaml or openclaw.json) manually:
266
-
267
- channels:
268
- agentvault:
269
- apiUrl: "${apiUrl}"
270
- accounts:
271
- ${options.accountId}:
272
- dataDir: "${dataDir}"
273
- agentName: "${name}"
274
-
275
- Then restart OpenClaw:
276
- openclaw gateway restart
277
- `);
278
- }
279
- else {
280
- console.log(` ⚠️ Could not auto-configure OpenClaw channel.
281
- Add this to your OpenClaw config (openclaw.yaml or openclaw.json) manually:
282
-
283
- channels:
284
- agentvault:
285
- dataDir: "${dataDir}"
286
- apiUrl: "${apiUrl}"
287
- agentName: "${name}"
288
-
289
- Then restart OpenClaw:
290
- openclaw gateway restart
291
- `);
292
- }
293
- }
294
- }
295
- /**
296
- * Install/update the plugin in OpenClaw's extensions directory.
297
- * Returns true if the plugin is installed (or was already up-to-date).
298
- */
299
- export function installPlugin(env) {
300
- // Check if already installed
301
- try {
302
- const info = execSync("openclaw plugins info agentvault", {
303
- stdio: "pipe",
304
- env,
305
- });
306
- const infoStr = info.toString();
307
- const versionMatch = infoStr.match(/version[:\s]+(\S+)/i);
308
- const installedVersion = versionMatch?.[1];
309
- if (installedVersion && installedVersion !== VERSION) {
310
- console.log(` Updating plugin ${installedVersion} → ${VERSION}...`);
311
- try {
312
- execSync("openclaw plugins update agentvault", { stdio: "pipe", env });
313
- console.log(" Plugin updated.");
314
- }
315
- catch {
316
- console.log(` ⚠️ Update failed — v${installedVersion} will be used.`);
317
- }
318
- }
319
- else {
320
- console.log(` Plugin already installed (v${installedVersion ?? "unknown"}).`);
321
- }
322
- return true;
323
- }
324
- catch {
325
- // Not installed — install fresh
326
- }
327
- try {
328
- execSync("openclaw plugins install @agentvault/agentvault", {
329
- stdio: "pipe",
330
- env,
331
- });
332
- console.log(" ✅ Plugin installed in OpenClaw.");
333
- return true;
334
- }
335
- catch {
336
- console.log(" ⚠️ Could not auto-install plugin.");
337
- return false;
338
- }
339
- }
340
- /**
341
- * Configure pm2 to manage the OpenClaw gateway process.
342
- * Returns true if pm2 was configured (or already configured).
343
- */
344
- export function configurePm2(env) {
345
- // Check if pm2 is available
346
- try {
347
- execSync("pm2 --version", { stdio: "pipe", env });
348
- }
349
- catch {
350
- console.log(`
351
- ℹ️ pm2 not found. For best reliability, install pm2:
352
- npm install -g pm2
353
-
354
- Then configure the gateway to auto-restart:
355
- pm2 start "openclaw gateway start" --name openclaw-gateway
356
- pm2 startup
357
- pm2 save
358
- `);
359
- return false;
360
- }
361
- // Check if already configured
362
- try {
363
- const info = execSync("pm2 describe openclaw-gateway", { stdio: "pipe", env });
364
- const infoStr = info.toString();
365
- if (infoStr.includes("online") || infoStr.includes("stopped")) {
366
- console.log(" pm2 process 'openclaw-gateway' already exists.");
367
- return true;
368
- }
369
- }
370
- catch {
371
- // Not configured yet — continue
372
- }
373
- // Determine platform-specific command
374
- const isMac = process.platform === "darwin";
375
- const startCmd = isMac
376
- ? "caffeinate -i openclaw gateway start"
377
- : "openclaw gateway start";
378
- try {
379
- execSync(`pm2 start "${startCmd}" --name openclaw-gateway`, { stdio: "pipe", env });
380
- console.log(" ✅ Gateway registered with pm2.");
381
- }
382
- catch (err) {
383
- console.log(` ⚠️ Failed to register with pm2: ${err}`);
384
- return false;
385
- }
386
- // Generate startup script
387
- try {
388
- execSync("pm2 startup", { stdio: "pipe", env });
389
- console.log(" ✅ pm2 startup configured (auto-start on boot).");
390
- }
391
- catch {
392
- console.log(" ⚠️ pm2 startup failed — you may need to run 'pm2 startup' manually with sudo.");
393
- }
394
- // Save process list
395
- try {
396
- execSync("pm2 save", { stdio: "pipe", env });
397
- console.log(" ✅ pm2 process list saved.");
398
- }
399
- catch {
400
- console.log(" ⚠️ pm2 save failed.");
401
- }
402
- return true;
403
- }
404
- /**
405
- * Prompt the user to restart the OpenClaw gateway now or later.
406
- * Runs `openclaw gateway restart` synchronously if they confirm.
407
- */
408
- async function promptAndRestart(env) {
409
- const answer = await ask(" ⚠️ OpenClaw gateway will restart, briefly interrupting any active conversations.\n" +
410
- " Restart now? [y/N] ");
411
- if (answer.trim().toLowerCase() === "y") {
412
- console.log("\n Restarting OpenClaw gateway...");
413
- const result = spawnSync("openclaw", ["gateway", "restart"], {
414
- stdio: "inherit",
415
- env,
416
- });
417
- if (result.status === 0) {
418
- console.log(`
419
- ✅ Gateway restarted. AgentVault is now active.
420
- Your AgentVault UI will route encrypted messages
421
- directly into your agent.
422
- `);
423
- }
424
- else {
425
- console.log(`
426
- ⚠️ Restart command failed (exit ${result.status ?? "unknown"}).
427
- Please restart manually:
428
-
429
- openclaw gateway restart
430
- `);
431
- }
432
- }
433
- else {
434
- console.log(`
435
- ──────────────────────────────────────────────
436
- Run this when you're ready to activate:
437
-
438
- openclaw gateway restart
439
-
440
- After restart, your AgentVault UI will route
441
- encrypted messages directly into your agent.
442
- ──────────────────────────────────────────────
443
- `);
444
- }
445
- }
446
- /** Prompt helper — resolves with the user's input line. */
447
- function ask(question) {
448
- return new Promise((resolve) => {
449
- const rl = readline.createInterface({
450
- input: process.stdin,
451
- output: process.stdout,
452
- terminal: true,
453
- });
454
- rl.question(question, (answer) => {
455
- rl.close();
456
- resolve(answer);
457
- });
458
- });
459
- }
460
- //# sourceMappingURL=setup.js.map
package/dist/setup.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -1,100 +0,0 @@
1
- /**
2
- * Skill invocation lifecycle — auth, execute, record, bill.
3
- *
4
- * Sets _instrument.skillName so all child spans are attributed to the skill.
5
- */
6
- /**
7
- * Execute a skill invocation with full lifecycle tracking.
8
- *
9
- * 1. Validates SPT token (if provided)
10
- * 2. Dispatches to the skill handler
11
- * 3. Records invocation via POST /capabilities/invocations
12
- * 4. Returns result with timing data
13
- */
14
- export async function invokeSkill(opts, handler) {
15
- const start = Date.now();
16
- // 1. Validate SPT if provided
17
- if (opts.sptToken) {
18
- const valid = await validateSptForInvocation(opts.apiUrl, opts.sptToken, opts.apiKey);
19
- if (!valid) {
20
- return {
21
- success: false,
22
- error: "Invalid or expired SPT token",
23
- latencyMs: Date.now() - start,
24
- };
25
- }
26
- }
27
- // 2. Execute handler
28
- try {
29
- const result = await handler(opts.skillName, opts.args);
30
- const latencyMs = Date.now() - start;
31
- // 3. Record invocation (fire and forget)
32
- if (opts.sptToken) {
33
- recordInvocation(opts, "completed", latencyMs).catch(() => { });
34
- }
35
- return {
36
- success: true,
37
- data: result,
38
- latencyMs,
39
- };
40
- }
41
- catch (err) {
42
- const latencyMs = Date.now() - start;
43
- const error = err instanceof Error ? err.message : String(err);
44
- // Record failed invocation
45
- if (opts.sptToken) {
46
- recordInvocation(opts, "failed", latencyMs).catch(() => { });
47
- }
48
- return {
49
- success: false,
50
- error,
51
- latencyMs,
52
- };
53
- }
54
- }
55
- async function validateSptForInvocation(apiUrl, token, apiKey) {
56
- try {
57
- const headers = {
58
- "Content-Type": "application/json",
59
- };
60
- if (apiKey) {
61
- headers["Authorization"] = `Bearer ${apiKey}`;
62
- }
63
- const res = await fetch(`${apiUrl}/api/v1/capabilities/introspect`, {
64
- method: "POST",
65
- headers,
66
- body: JSON.stringify({ token }),
67
- });
68
- if (!res.ok)
69
- return false;
70
- const data = (await res.json());
71
- return data.active === true;
72
- }
73
- catch {
74
- return false;
75
- }
76
- }
77
- async function recordInvocation(opts, status, _latencyMs) {
78
- if (!opts.sptToken)
79
- return;
80
- try {
81
- const headers = {
82
- "Content-Type": "application/json",
83
- };
84
- if (opts.apiKey) {
85
- headers["Authorization"] = `Bearer ${opts.apiKey}`;
86
- }
87
- await fetch(`${opts.apiUrl}/api/v1/capabilities/invocations`, {
88
- method: "POST",
89
- headers,
90
- body: JSON.stringify({
91
- spt_token: opts.sptToken,
92
- status,
93
- }),
94
- });
95
- }
96
- catch {
97
- // Fire and forget — invocation tracking is best-effort
98
- }
99
- }
100
- //# sourceMappingURL=skill-invoker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skill-invoker.js","sourceRoot":"","sources":["../src/skill-invoker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAoB,EACpB,OAA+E;IAE/E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEzB,8BAA8B;IAC9B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,8BAA8B;gBACrC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC9B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAErC,yCAAyC;QACzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,MAAM;YACZ,SAAS;SACV,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACrC,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE/D,2BAA2B;QAC3B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK;YACL,SAAS;SACV,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,MAAc,EACd,KAAa,EACb,MAAe;IAEf,IAAI,CAAC;QACH,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;QAChD,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,iCAAiC,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;QACvD,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAAoB,EACpB,MAAc,EACd,UAAkB;IAElB,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO;IAE3B,IAAI,CAAC;QACH,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,kCAAkC,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,MAAM;aACP,CAAC;SACH,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,uDAAuD;IACzD,CAAC;AACH,CAAC"}