agent-web-interface 4.1.1 → 4.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.
Files changed (71) hide show
  1. package/dist/src/browser/session-manager.d.ts +28 -1
  2. package/dist/src/browser/session-manager.d.ts.map +1 -1
  3. package/dist/src/browser/session-manager.js +73 -0
  4. package/dist/src/browser/session-manager.js.map +1 -1
  5. package/dist/src/index.d.ts +10 -1
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +47 -0
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/server/mcp-server.d.ts +14 -1
  10. package/dist/src/server/mcp-server.d.ts.map +1 -1
  11. package/dist/src/server/mcp-server.js +21 -6
  12. package/dist/src/server/mcp-server.js.map +1 -1
  13. package/dist/src/server/session-store.d.ts +18 -3
  14. package/dist/src/server/session-store.d.ts.map +1 -1
  15. package/dist/src/server/session-store.js +27 -3
  16. package/dist/src/server/session-store.js.map +1 -1
  17. package/dist/src/session/session-worker-binding.d.ts +57 -0
  18. package/dist/src/session/session-worker-binding.d.ts.map +1 -0
  19. package/dist/src/session/session-worker-binding.js +109 -0
  20. package/dist/src/session/session-worker-binding.js.map +1 -0
  21. package/dist/src/shared/services/logging.service.d.ts +8 -0
  22. package/dist/src/shared/services/logging.service.d.ts.map +1 -1
  23. package/dist/src/shared/services/logging.service.js +10 -0
  24. package/dist/src/shared/services/logging.service.js.map +1 -1
  25. package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -1
  26. package/dist/src/snapshot/snapshot-compiler.js +68 -1
  27. package/dist/src/snapshot/snapshot-compiler.js.map +1 -1
  28. package/dist/src/tools/tool-schemas.d.ts +22 -22
  29. package/dist/src/tools/tool-schemas.d.ts.map +1 -1
  30. package/dist/src/tools/tool-schemas.js.map +1 -1
  31. package/dist/src/worker/chrome-worker-process.d.ts +123 -0
  32. package/dist/src/worker/chrome-worker-process.d.ts.map +1 -0
  33. package/dist/src/worker/chrome-worker-process.js +294 -0
  34. package/dist/src/worker/chrome-worker-process.js.map +1 -0
  35. package/dist/src/worker/errors/index.d.ts +5 -0
  36. package/dist/src/worker/errors/index.d.ts.map +1 -0
  37. package/dist/src/worker/errors/index.js +5 -0
  38. package/dist/src/worker/errors/index.js.map +1 -0
  39. package/dist/src/worker/errors/worker.error.d.ts +122 -0
  40. package/dist/src/worker/errors/worker.error.d.ts.map +1 -0
  41. package/dist/src/worker/errors/worker.error.js +199 -0
  42. package/dist/src/worker/errors/worker.error.js.map +1 -0
  43. package/dist/src/worker/health-monitor.d.ts +141 -0
  44. package/dist/src/worker/health-monitor.d.ts.map +1 -0
  45. package/dist/src/worker/health-monitor.js +260 -0
  46. package/dist/src/worker/health-monitor.js.map +1 -0
  47. package/dist/src/worker/index.d.ts +16 -0
  48. package/dist/src/worker/index.d.ts.map +1 -0
  49. package/dist/src/worker/index.js +19 -0
  50. package/dist/src/worker/index.js.map +1 -0
  51. package/dist/src/worker/lease-manager.d.ts +137 -0
  52. package/dist/src/worker/lease-manager.d.ts.map +1 -0
  53. package/dist/src/worker/lease-manager.js +334 -0
  54. package/dist/src/worker/lease-manager.js.map +1 -0
  55. package/dist/src/worker/multi-tenant-config.d.ts +46 -0
  56. package/dist/src/worker/multi-tenant-config.d.ts.map +1 -0
  57. package/dist/src/worker/multi-tenant-config.js +94 -0
  58. package/dist/src/worker/multi-tenant-config.js.map +1 -0
  59. package/dist/src/worker/port-allocator.d.ts +96 -0
  60. package/dist/src/worker/port-allocator.d.ts.map +1 -0
  61. package/dist/src/worker/port-allocator.js +153 -0
  62. package/dist/src/worker/port-allocator.js.map +1 -0
  63. package/dist/src/worker/types.d.ts +218 -0
  64. package/dist/src/worker/types.d.ts.map +1 -0
  65. package/dist/src/worker/types.js +38 -0
  66. package/dist/src/worker/types.js.map +1 -0
  67. package/dist/src/worker/worker-manager.d.ts +157 -0
  68. package/dist/src/worker/worker-manager.d.ts.map +1 -0
  69. package/dist/src/worker/worker-manager.js +500 -0
  70. package/dist/src/worker/worker-manager.js.map +1 -0
  71. package/package.json +1 -1
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Health Monitor
3
+ *
4
+ * Monitors the health of Chrome workers by periodically checking
5
+ * their CDP endpoints via /json/version.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { createLogger } from '../shared/services/logging.service.js';
9
+ const logger = createLogger('HealthMonitor');
10
+ /**
11
+ * Default health check configuration
12
+ */
13
+ const DEFAULT_HEALTH_CONFIG = {
14
+ timeoutMs: 5000,
15
+ failureThreshold: 3,
16
+ };
17
+ /**
18
+ * Monitors the health of Chrome workers.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const monitor = new HealthMonitor({ intervalMs: 30000 });
23
+ *
24
+ * monitor.on('healthChange', ({ workerId, healthy, result }) => {
25
+ * if (!healthy) {
26
+ * console.log(`Worker ${workerId} became unhealthy: ${result.error}`);
27
+ * }
28
+ * });
29
+ *
30
+ * monitor.registerWorker('w-123', 9300);
31
+ * monitor.start();
32
+ *
33
+ * // Later...
34
+ * monitor.unregisterWorker('w-123');
35
+ * monitor.stop();
36
+ * ```
37
+ */
38
+ export class HealthMonitor extends EventEmitter {
39
+ intervalMs;
40
+ config;
41
+ workers = new Map();
42
+ intervalId = null;
43
+ _isRunning = false;
44
+ constructor(intervalMs = 30_000, config = {}) {
45
+ super();
46
+ this.intervalMs = intervalMs;
47
+ this.config = { ...DEFAULT_HEALTH_CONFIG, ...config };
48
+ }
49
+ /**
50
+ * Check if the monitor is currently running
51
+ */
52
+ get isRunning() {
53
+ return this._isRunning;
54
+ }
55
+ /**
56
+ * Get the number of registered workers
57
+ */
58
+ get workerCount() {
59
+ return this.workers.size;
60
+ }
61
+ /**
62
+ * Register a worker for health monitoring
63
+ *
64
+ * @param workerId - Unique worker identifier
65
+ * @param port - CDP port number
66
+ */
67
+ registerWorker(workerId, port) {
68
+ if (this.workers.has(workerId)) {
69
+ logger.warning('Worker already registered for health monitoring', { workerId });
70
+ return;
71
+ }
72
+ this.workers.set(workerId, {
73
+ workerId,
74
+ port,
75
+ healthy: true, // Assume healthy until proven otherwise
76
+ consecutiveFailures: 0,
77
+ });
78
+ logger.debug('Worker registered for health monitoring', { workerId, port });
79
+ }
80
+ /**
81
+ * Unregister a worker from health monitoring
82
+ *
83
+ * @param workerId - Unique worker identifier
84
+ * @returns true if the worker was found and removed
85
+ */
86
+ unregisterWorker(workerId) {
87
+ const removed = this.workers.delete(workerId);
88
+ if (removed) {
89
+ logger.debug('Worker unregistered from health monitoring', { workerId });
90
+ }
91
+ return removed;
92
+ }
93
+ /**
94
+ * Check if a worker is registered
95
+ */
96
+ isWorkerRegistered(workerId) {
97
+ return this.workers.has(workerId);
98
+ }
99
+ /**
100
+ * Get the current health state of a worker
101
+ */
102
+ getWorkerHealth(workerId) {
103
+ return this.workers.get(workerId);
104
+ }
105
+ /**
106
+ * Start periodic health monitoring
107
+ */
108
+ start() {
109
+ if (this._isRunning) {
110
+ logger.warning('Health monitor is already running');
111
+ return;
112
+ }
113
+ this._isRunning = true;
114
+ // Run initial check immediately
115
+ void this.checkAllWorkers();
116
+ // Set up periodic checks
117
+ this.intervalId = setInterval(() => {
118
+ void this.checkAllWorkers();
119
+ }, this.intervalMs);
120
+ logger.info('Health monitor started', { intervalMs: this.intervalMs });
121
+ }
122
+ /**
123
+ * Stop periodic health monitoring
124
+ */
125
+ stop() {
126
+ if (!this._isRunning) {
127
+ return;
128
+ }
129
+ if (this.intervalId) {
130
+ clearInterval(this.intervalId);
131
+ this.intervalId = null;
132
+ }
133
+ this._isRunning = false;
134
+ logger.info('Health monitor stopped');
135
+ }
136
+ /**
137
+ * Check health of all registered workers
138
+ */
139
+ async checkAllWorkers() {
140
+ const checks = Array.from(this.workers.values()).map((state) => this.checkWorker(state));
141
+ await Promise.all(checks);
142
+ }
143
+ /**
144
+ * Check health of a specific worker by ID
145
+ *
146
+ * @param workerId - Worker identifier
147
+ * @returns Health check result
148
+ */
149
+ async checkWorkerById(workerId) {
150
+ const state = this.workers.get(workerId);
151
+ if (!state) {
152
+ return {
153
+ healthy: false,
154
+ error: `Worker ${workerId} is not registered`,
155
+ };
156
+ }
157
+ return this.checkWorker(state);
158
+ }
159
+ /**
160
+ * Perform a single health check on a worker
161
+ */
162
+ async checkWorker(state) {
163
+ const result = await this.performHealthCheck(state.port);
164
+ state.lastCheck = result;
165
+ state.lastCheckTime = Date.now();
166
+ const wasHealthy = state.healthy;
167
+ if (result.healthy) {
168
+ state.consecutiveFailures = 0;
169
+ state.healthy = true;
170
+ }
171
+ else {
172
+ state.consecutiveFailures++;
173
+ // Only mark as unhealthy after threshold is reached
174
+ if (state.consecutiveFailures >= this.config.failureThreshold) {
175
+ state.healthy = false;
176
+ }
177
+ }
178
+ // Emit event if health state changed
179
+ if (wasHealthy !== state.healthy) {
180
+ logger.info('Worker health state changed', {
181
+ workerId: state.workerId,
182
+ healthy: state.healthy,
183
+ consecutiveFailures: state.consecutiveFailures,
184
+ });
185
+ this.emit('healthChange', {
186
+ workerId: state.workerId,
187
+ healthy: state.healthy,
188
+ result,
189
+ });
190
+ }
191
+ return result;
192
+ }
193
+ /**
194
+ * Perform a health check against the CDP endpoint
195
+ *
196
+ * @param port - CDP port number
197
+ * @returns Health check result
198
+ */
199
+ async performHealthCheck(port) {
200
+ const url = `http://127.0.0.1:${port}/json/version`;
201
+ const startTime = Date.now();
202
+ try {
203
+ const response = await fetch(url, {
204
+ signal: AbortSignal.timeout(this.config.timeoutMs),
205
+ });
206
+ if (!response.ok) {
207
+ return {
208
+ healthy: false,
209
+ responseTimeMs: Date.now() - startTime,
210
+ error: `HTTP ${response.status}: ${response.statusText}`,
211
+ };
212
+ }
213
+ const versionInfo = (await response.json());
214
+ return {
215
+ healthy: true,
216
+ responseTimeMs: Date.now() - startTime,
217
+ versionInfo,
218
+ };
219
+ }
220
+ catch (error) {
221
+ const errorMessage = error instanceof Error
222
+ ? error.name === 'TimeoutError'
223
+ ? `Timeout after ${this.config.timeoutMs}ms`
224
+ : error.message
225
+ : String(error);
226
+ return {
227
+ healthy: false,
228
+ responseTimeMs: Date.now() - startTime,
229
+ error: errorMessage,
230
+ };
231
+ }
232
+ }
233
+ /**
234
+ * Get all unhealthy workers
235
+ */
236
+ getUnhealthyWorkers() {
237
+ return Array.from(this.workers.entries())
238
+ .filter(([_, state]) => !state.healthy)
239
+ .map(([workerId]) => workerId);
240
+ }
241
+ /**
242
+ * Reset health state for a worker (e.g., after restart)
243
+ */
244
+ resetWorkerHealth(workerId) {
245
+ const state = this.workers.get(workerId);
246
+ if (state) {
247
+ state.healthy = true;
248
+ state.consecutiveFailures = 0;
249
+ state.lastCheck = undefined;
250
+ state.lastCheckTime = undefined;
251
+ }
252
+ }
253
+ /**
254
+ * Clear all registered workers
255
+ */
256
+ clear() {
257
+ this.workers.clear();
258
+ }
259
+ }
260
+ //# sourceMappingURL=health-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-monitor.js","sourceRoot":"","sources":["../../../src/worker/health-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Worker Module
3
+ *
4
+ * Exports the Browser Worker Manager system for managing tenant-bound
5
+ * Chrome workers with exclusive lease-based access control.
6
+ */
7
+ export { WorkerManager } from './worker-manager.js';
8
+ export { WorkerError, type WorkerErrorCode } from './errors/index.js';
9
+ export type { WorkerState, LeaseStatus, WorkerDescriptor, LeaseDescriptor, LeaseAcquisitionResult, WorkerManagerConfig, PortRange, HealthCheckResult, CdpVersionInfo, WorkerProcessEvents, HealthMonitorEvents, WorkerManagerEvents, } from './types.js';
10
+ export { DEFAULT_WORKER_CONFIG, CHROME_WORKER_ARGS } from './types.js';
11
+ export { PortAllocator, type PortAllocatorConfig } from './port-allocator.js';
12
+ export { ChromeWorkerProcess, type ChromeWorkerProcessConfig, findChromePath, } from './chrome-worker-process.js';
13
+ export { HealthMonitor, type HealthCheckConfig } from './health-monitor.js';
14
+ export { LeaseManager, type LeaseManagerConfig } from './lease-manager.js';
15
+ export { getMultiTenantConfig, validateMultiTenantConfig, type MultiTenantConfig, } from './multi-tenant-config.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/worker/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGtE,YAAY,EACV,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGvE,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC9B,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,KAAK,iBAAiB,GACvB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Worker Module
3
+ *
4
+ * Exports the Browser Worker Manager system for managing tenant-bound
5
+ * Chrome workers with exclusive lease-based access control.
6
+ */
7
+ // Main orchestrator
8
+ export { WorkerManager } from './worker-manager.js';
9
+ // Error handling
10
+ export { WorkerError } from './errors/index.js';
11
+ export { DEFAULT_WORKER_CONFIG, CHROME_WORKER_ARGS } from './types.js';
12
+ // Component classes (for advanced usage/testing)
13
+ export { PortAllocator } from './port-allocator.js';
14
+ export { ChromeWorkerProcess, findChromePath, } from './chrome-worker-process.js';
15
+ export { HealthMonitor } from './health-monitor.js';
16
+ export { LeaseManager } from './lease-manager.js';
17
+ // Multi-tenant configuration
18
+ export { getMultiTenantConfig, validateMultiTenantConfig, } from './multi-tenant-config.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/worker/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AAkBtE,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvE,iDAAiD;AACjD,OAAO,EAAE,aAAa,EAA4B,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EACL,mBAAmB,EAEnB,cAAc,GACf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAA0B,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAE3E,6BAA6B;AAC7B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,GAE1B,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Lease Manager
3
+ *
4
+ * Manages exclusive leases for worker access.
5
+ * Each tenant can hold at most one lease at a time.
6
+ */
7
+ import type { LeaseDescriptor, LeaseAcquisitionResult } from './types.js';
8
+ /**
9
+ * Configuration for LeaseManager
10
+ */
11
+ export interface LeaseManagerConfig {
12
+ /** Default lease TTL in milliseconds */
13
+ defaultTtlMs: number;
14
+ /** Interval for checking expired leases (ms) */
15
+ cleanupIntervalMs?: number;
16
+ }
17
+ /**
18
+ * Manages exclusive leases for tenant workers.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const leaseManager = new LeaseManager({ defaultTtlMs: 300000 });
23
+ *
24
+ * // Acquire a lease
25
+ * const result = leaseManager.acquire('tenant-a', 'controller-1', 'w-123');
26
+ * if (result.success) {
27
+ * console.log(`Lease acquired: ${result.lease.leaseId}`);
28
+ * }
29
+ *
30
+ * // Refresh the lease before it expires
31
+ * leaseManager.refresh('tenant-a');
32
+ *
33
+ * // Release when done
34
+ * leaseManager.release('tenant-a');
35
+ * ```
36
+ */
37
+ export declare class LeaseManager {
38
+ private readonly defaultTtlMs;
39
+ private readonly leases;
40
+ private cleanupIntervalId;
41
+ /** Callbacks for lease expiration */
42
+ private onLeaseExpiredCallbacks;
43
+ /** Callbacks for lease revocation */
44
+ private onLeaseRevokedCallbacks;
45
+ constructor(config: LeaseManagerConfig);
46
+ /**
47
+ * Get number of active leases
48
+ */
49
+ get leaseCount(): number;
50
+ /**
51
+ * Acquire a lease for a tenant
52
+ *
53
+ * @param tenantId - Tenant identifier
54
+ * @param controllerId - Controller/session identifier
55
+ * @param workerId - Worker to lease
56
+ * @param ttlMs - Optional custom TTL (uses default if not specified)
57
+ * @returns Lease acquisition result
58
+ */
59
+ acquire(tenantId: string, controllerId: string, workerId: string, ttlMs?: number): LeaseAcquisitionResult;
60
+ /**
61
+ * Release a lease
62
+ *
63
+ * @param tenantId - Tenant identifier
64
+ * @param controllerId - Optional controller ID to validate ownership
65
+ * @returns true if lease was released
66
+ */
67
+ release(tenantId: string, controllerId?: string): boolean;
68
+ /**
69
+ * Refresh a lease to extend its TTL
70
+ *
71
+ * @param tenantId - Tenant identifier
72
+ * @param ttlMs - Optional new TTL (uses default if not specified)
73
+ * @returns true if lease was refreshed
74
+ * @throws WorkerError if lease not found or expired
75
+ */
76
+ refresh(tenantId: string, ttlMs?: number): boolean;
77
+ /**
78
+ * Revoke a lease (typically on worker crash)
79
+ *
80
+ * @param tenantId - Tenant identifier
81
+ * @param reason - Reason for revocation
82
+ */
83
+ revoke(tenantId: string, reason: string): void;
84
+ /**
85
+ * Check if a tenant has an active lease
86
+ */
87
+ hasLease(tenantId: string): boolean;
88
+ /**
89
+ * Get the lease for a tenant (if any)
90
+ */
91
+ getLease(tenantId: string): LeaseDescriptor | undefined;
92
+ /**
93
+ * Get the lease holder (controller) for a tenant
94
+ */
95
+ getLeaseHolder(tenantId: string): string | undefined;
96
+ /**
97
+ * Check if a specific controller holds the lease for a tenant
98
+ */
99
+ isLeaseHeldBy(tenantId: string, controllerId: string): boolean;
100
+ /**
101
+ * Get the worker ID for a tenant's lease
102
+ */
103
+ getWorkerIdForTenant(tenantId: string): string | undefined;
104
+ /**
105
+ * Register a callback for lease expiration
106
+ */
107
+ onLeaseExpired(callback: (lease: LeaseDescriptor) => void): void;
108
+ /**
109
+ * Register a callback for lease revocation
110
+ */
111
+ onLeaseRevoked(callback: (lease: LeaseDescriptor, reason: string) => void): void;
112
+ /**
113
+ * Clean up expired leases
114
+ */
115
+ cleanupExpired(): number;
116
+ /**
117
+ * Get all active leases
118
+ */
119
+ getAllLeases(): LeaseDescriptor[];
120
+ /**
121
+ * Clear all leases
122
+ */
123
+ clear(): void;
124
+ /**
125
+ * Stop the cleanup interval
126
+ */
127
+ stop(): void;
128
+ /**
129
+ * Internal: refresh lease TTL
130
+ */
131
+ private refreshLease;
132
+ /**
133
+ * Internal: start cleanup interval
134
+ */
135
+ private startCleanupInterval;
136
+ }
137
+ //# sourceMappingURL=lease-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lease-manager.d.ts","sourceRoot":"","sources":["../../../src/worker/lease-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAM1E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,iBAAiB,CAA+C;IAExE,qCAAqC;IACrC,OAAO,CAAC,uBAAuB,CAA4C;IAC3E,qCAAqC;IACrC,OAAO,CAAC,uBAAuB,CAA4D;gBAE/E,MAAM,EAAE,kBAAkB;IAStC;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;;;;;;OAQG;IACH,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,sBAAsB;IA+DzB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO;IA4BzD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAoBlD;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IA4B9C;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAanC;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIvD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKpD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAW9D;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ1D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IAIhE;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhF;;OAEG;IACH,cAAc,IAAI,MAAM;IAoCxB;;OAEG;IACH,YAAY,IAAI,eAAe,EAAE;IAIjC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAQ7B"}