strray-ai 1.22.21 → 1.22.22

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 (32) hide show
  1. package/.strray/state/state.json +1 -0
  2. package/dist/CHANGELOG.md +8 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/integrations/openclaw/api-server.d.ts +86 -0
  8. package/dist/integrations/openclaw/api-server.d.ts.map +1 -0
  9. package/dist/integrations/openclaw/api-server.js +339 -0
  10. package/dist/integrations/openclaw/api-server.js.map +1 -0
  11. package/dist/integrations/openclaw/client.d.ts +120 -0
  12. package/dist/integrations/openclaw/client.d.ts.map +1 -0
  13. package/dist/integrations/openclaw/client.js +447 -0
  14. package/dist/integrations/openclaw/client.js.map +1 -0
  15. package/dist/integrations/openclaw/config.d.ts +97 -0
  16. package/dist/integrations/openclaw/config.d.ts.map +1 -0
  17. package/dist/integrations/openclaw/config.js +375 -0
  18. package/dist/integrations/openclaw/config.js.map +1 -0
  19. package/dist/integrations/openclaw/hooks/strray-hooks.d.ts +125 -0
  20. package/dist/integrations/openclaw/hooks/strray-hooks.d.ts.map +1 -0
  21. package/dist/integrations/openclaw/hooks/strray-hooks.js +281 -0
  22. package/dist/integrations/openclaw/hooks/strray-hooks.js.map +1 -0
  23. package/dist/integrations/openclaw/index.d.ts +102 -0
  24. package/dist/integrations/openclaw/index.d.ts.map +1 -0
  25. package/dist/integrations/openclaw/index.js +340 -0
  26. package/dist/integrations/openclaw/index.js.map +1 -0
  27. package/dist/integrations/openclaw/types.d.ts +427 -0
  28. package/dist/integrations/openclaw/types.d.ts.map +1 -0
  29. package/dist/integrations/openclaw/types.js +154 -0
  30. package/dist/integrations/openclaw/types.js.map +1 -0
  31. package/package.json +1 -1
  32. package/scripts/node/universal-version-manager.js +3 -3
@@ -0,0 +1,375 @@
1
+ /**
2
+ * OpenClaw Configuration Loader
3
+ *
4
+ * Handles loading, validation, and management of OpenClaw integration configuration.
5
+ *
6
+ * @version 1.0.0
7
+ * @since 2026-03-14
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import * as os from 'os';
12
+ /**
13
+ * Default configuration values
14
+ */
15
+ const DEFAULT_CONFIG = {
16
+ gatewayUrl: 'ws://127.0.0.1:18789',
17
+ autoReconnect: true,
18
+ maxReconnectAttempts: 5,
19
+ reconnectDelay: 1000,
20
+ apiServer: {
21
+ enabled: true,
22
+ port: 18431,
23
+ host: '127.0.0.1',
24
+ },
25
+ hooks: {
26
+ enabled: true,
27
+ toolBefore: true,
28
+ toolAfter: true,
29
+ includeArgs: true,
30
+ includeResult: true,
31
+ },
32
+ enabled: true,
33
+ debug: false,
34
+ logLevel: 'info',
35
+ };
36
+ /**
37
+ * Environment variable mappings
38
+ */
39
+ const ENV_MAPPINGS = {
40
+ OPENCLAW_GATEWAY_URL: 'gatewayUrl',
41
+ OPENCLAW_AUTH_TOKEN: 'authToken',
42
+ OPENCLAW_DEVICE_ID: 'deviceId',
43
+ OPENCLAW_API_KEY: 'apiServer.apiKey',
44
+ OPENCLAW_API_PORT: 'apiServer.port',
45
+ OPENCLAW_ENABLED: 'enabled',
46
+ OPENCLAW_DEBUG: 'debug',
47
+ };
48
+ /**
49
+ * Configuration loader class
50
+ */
51
+ export class OpenClawConfigLoader {
52
+ config = null;
53
+ configPath;
54
+ loadedAt = 0;
55
+ constructor(configPath) {
56
+ this.configPath = configPath ||
57
+ path.join(process.cwd(), '.opencode', 'openclaw', 'config.json');
58
+ }
59
+ /**
60
+ * Load configuration from file with environment variable overrides
61
+ */
62
+ load() {
63
+ try {
64
+ // Load from file if exists
65
+ let userConfig = {};
66
+ if (fs.existsSync(this.configPath)) {
67
+ const configContent = fs.readFileSync(this.configPath, 'utf-8');
68
+ userConfig = JSON.parse(configContent);
69
+ }
70
+ // Apply environment variable overrides
71
+ userConfig = this.applyEnvironmentOverrides(userConfig);
72
+ // Merge with defaults
73
+ this.config = this.mergeWithDefaults(userConfig);
74
+ // Validate configuration
75
+ const validation = this.validateConfig(this.config);
76
+ if (!validation.valid) {
77
+ throw new Error(`Configuration validation failed: ${validation.errors.map(e => e.message).join(', ')}`);
78
+ }
79
+ this.loadedAt = Date.now();
80
+ return this.config;
81
+ }
82
+ catch (error) {
83
+ if (error instanceof Error) {
84
+ throw new Error(`Failed to load OpenClaw configuration: ${error.message}`);
85
+ }
86
+ throw new Error('Failed to load OpenClaw configuration: Unknown error');
87
+ }
88
+ }
89
+ /**
90
+ * Reload configuration from file
91
+ */
92
+ reload() {
93
+ this.config = null;
94
+ this.loadedAt = 0;
95
+ return this.load();
96
+ }
97
+ /**
98
+ * Get current configuration
99
+ */
100
+ getConfig() {
101
+ if (!this.config) {
102
+ return this.load();
103
+ }
104
+ return this.config;
105
+ }
106
+ /**
107
+ * Get configuration age in milliseconds
108
+ */
109
+ getConfigAge() {
110
+ if (!this.loadedAt)
111
+ return 0;
112
+ return Date.now() - this.loadedAt;
113
+ }
114
+ /**
115
+ * Check if configuration needs reload
116
+ */
117
+ needsReload(maxAgeMs = 60000) {
118
+ return this.getConfigAge() > maxAgeMs;
119
+ }
120
+ /**
121
+ * Apply environment variable overrides
122
+ */
123
+ applyEnvironmentOverrides(config) {
124
+ const result = { ...config };
125
+ for (const [envVar, configPath] of Object.entries(ENV_MAPPINGS)) {
126
+ const envValue = process.env[envVar];
127
+ if (envValue !== undefined) {
128
+ // Parse value based on expected type
129
+ let parsedValue = envValue;
130
+ // Handle boolean values
131
+ if (envValue.toLowerCase() === 'true') {
132
+ parsedValue = true;
133
+ }
134
+ else if (envValue.toLowerCase() === 'false') {
135
+ parsedValue = false;
136
+ }
137
+ // Handle numeric values
138
+ else if (/^\d+$/.test(envValue)) {
139
+ parsedValue = parseInt(envValue, 10);
140
+ }
141
+ // Set nested value
142
+ const keys = configPath.split('.');
143
+ let current = result;
144
+ for (let i = 0; i < keys.length - 1; i++) {
145
+ const key = keys[i];
146
+ if (!current[key]) {
147
+ current[key] = {};
148
+ }
149
+ current = current[key];
150
+ }
151
+ current[keys[keys.length - 1]] = parsedValue;
152
+ }
153
+ }
154
+ return result;
155
+ }
156
+ /**
157
+ * Merge user config with defaults
158
+ */
159
+ mergeWithDefaults(userConfig) {
160
+ // Handle nested defaults
161
+ const apiServerDefaults = DEFAULT_CONFIG.apiServer || { enabled: true, port: 18431, host: '127.0.0.1' };
162
+ const hooksDefaults = DEFAULT_CONFIG.hooks || { enabled: true, toolBefore: true, toolAfter: true, includeArgs: true, includeResult: true };
163
+ const result = {
164
+ gatewayUrl: userConfig.gatewayUrl || DEFAULT_CONFIG.gatewayUrl || 'ws://127.0.0.1:18789',
165
+ autoReconnect: userConfig.autoReconnect ?? DEFAULT_CONFIG.autoReconnect ?? true,
166
+ maxReconnectAttempts: userConfig.maxReconnectAttempts ?? DEFAULT_CONFIG.maxReconnectAttempts ?? 5,
167
+ reconnectDelay: userConfig.reconnectDelay ?? DEFAULT_CONFIG.reconnectDelay ?? 1000,
168
+ apiServer: {
169
+ enabled: userConfig.apiServer?.enabled ?? apiServerDefaults.enabled ?? true,
170
+ port: userConfig.apiServer?.port ?? apiServerDefaults.port ?? 18431,
171
+ host: userConfig.apiServer?.host ?? apiServerDefaults.host ?? '127.0.0.1',
172
+ ...(userConfig.apiServer?.apiKey !== undefined ? { apiKey: userConfig.apiServer.apiKey } : {}),
173
+ },
174
+ hooks: {
175
+ enabled: userConfig.hooks?.enabled ?? hooksDefaults.enabled ?? true,
176
+ toolBefore: userConfig.hooks?.toolBefore ?? hooksDefaults.toolBefore ?? true,
177
+ toolAfter: userConfig.hooks?.toolAfter ?? hooksDefaults.toolAfter ?? true,
178
+ includeArgs: userConfig.hooks?.includeArgs ?? hooksDefaults.includeArgs ?? true,
179
+ includeResult: userConfig.hooks?.includeResult ?? hooksDefaults.includeResult ?? true,
180
+ },
181
+ enabled: userConfig.enabled ?? DEFAULT_CONFIG.enabled ?? true,
182
+ debug: userConfig.debug ?? DEFAULT_CONFIG.debug ?? false,
183
+ logLevel: userConfig.logLevel ?? DEFAULT_CONFIG.logLevel ?? 'info',
184
+ };
185
+ if (userConfig.authToken !== undefined)
186
+ result.authToken = userConfig.authToken;
187
+ if (userConfig.deviceId !== undefined)
188
+ result.deviceId = userConfig.deviceId;
189
+ if (userConfig.deviceKeyPair !== undefined)
190
+ result.deviceKeyPair = userConfig.deviceKeyPair;
191
+ return result;
192
+ }
193
+ /**
194
+ * Validate configuration
195
+ */
196
+ validateConfig(config) {
197
+ const errors = [];
198
+ const warnings = [];
199
+ // Validate gateway URL
200
+ if (!config.gatewayUrl) {
201
+ errors.push({
202
+ field: 'gatewayUrl',
203
+ message: 'gatewayUrl is required',
204
+ code: 'MISSING_REQUIRED',
205
+ });
206
+ }
207
+ else {
208
+ try {
209
+ const url = new URL(config.gatewayUrl);
210
+ if (!['ws:', 'wss:'].includes(url.protocol)) {
211
+ errors.push({
212
+ field: 'gatewayUrl',
213
+ message: 'gatewayUrl must be a WebSocket URL (ws:// or wss://)',
214
+ code: 'INVALID_PROTOCOL',
215
+ });
216
+ }
217
+ }
218
+ catch {
219
+ errors.push({
220
+ field: 'gatewayUrl',
221
+ message: 'gatewayUrl is not a valid URL',
222
+ code: 'INVALID_URL',
223
+ });
224
+ }
225
+ }
226
+ // Validate API server port
227
+ if (config.apiServer?.enabled) {
228
+ if (!config.apiServer.port || config.apiServer.port < 1 || config.apiServer.port > 65535) {
229
+ errors.push({
230
+ field: 'apiServer.port',
231
+ message: 'apiServer.port must be between 1 and 65535',
232
+ code: 'INVALID_PORT',
233
+ });
234
+ }
235
+ // Warn if binding to non-localhost
236
+ if (config.apiServer.host && !['localhost', '127.0.0.1', '::1'].includes(config.apiServer.host)) {
237
+ warnings.push({
238
+ field: 'apiServer.host',
239
+ message: 'Binding API server to non-localhost address may expose API externally',
240
+ });
241
+ }
242
+ }
243
+ // Validate reconnection settings
244
+ if (config.maxReconnectAttempts < 0) {
245
+ errors.push({
246
+ field: 'maxReconnectAttempts',
247
+ message: 'maxReconnectAttempts must be non-negative',
248
+ code: 'INVALID_VALUE',
249
+ });
250
+ }
251
+ if (config.reconnectDelay < 0) {
252
+ errors.push({
253
+ field: 'reconnectDelay',
254
+ message: 'reconnectDelay must be non-negative',
255
+ code: 'INVALID_VALUE',
256
+ });
257
+ }
258
+ // Validate log level
259
+ const validLogLevels = ['error', 'warn', 'info', 'debug'];
260
+ if (config.logLevel && !validLogLevels.includes(config.logLevel)) {
261
+ errors.push({
262
+ field: 'logLevel',
263
+ message: `logLevel must be one of: ${validLogLevels.join(', ')}`,
264
+ code: 'INVALID_VALUE',
265
+ });
266
+ }
267
+ // Warnings for potentially problematic configs
268
+ if (config.apiServer?.enabled && !config.apiServer.apiKey) {
269
+ warnings.push({
270
+ field: 'apiServer.apiKey',
271
+ message: 'API server is enabled without an API key - consider adding one for security',
272
+ });
273
+ }
274
+ if (config.autoReconnect && config.maxReconnectAttempts === 0) {
275
+ warnings.push({
276
+ field: 'autoReconnect',
277
+ message: 'autoReconnect is true but maxReconnectAttempts is 0',
278
+ });
279
+ }
280
+ return {
281
+ valid: errors.length === 0,
282
+ errors,
283
+ warnings,
284
+ };
285
+ }
286
+ /**
287
+ * Get configuration file path
288
+ */
289
+ getConfigPath() {
290
+ return this.configPath;
291
+ }
292
+ /**
293
+ * Check if configuration file exists
294
+ */
295
+ configExists() {
296
+ return fs.existsSync(this.configPath);
297
+ }
298
+ /**
299
+ * Create sample configuration file
300
+ */
301
+ createSampleConfig() {
302
+ const configDir = path.dirname(this.configPath);
303
+ // Create directory if it doesn't exist
304
+ if (!fs.existsSync(configDir)) {
305
+ fs.mkdirSync(configDir, { recursive: true });
306
+ }
307
+ const sampleConfig = {
308
+ gatewayUrl: 'ws://127.0.0.1:18789',
309
+ // SECURITY WARNING: authToken MUST be configured before use.
310
+ // Leaving this empty will prevent authenticated connections.
311
+ authToken: process.env.OPENCLAW_AUTH_TOKEN || '',
312
+ deviceId: process.env.OPENCLAW_DEVICE_ID || 'your-device-id',
313
+ autoReconnect: true,
314
+ maxReconnectAttempts: 5,
315
+ reconnectDelay: 1000,
316
+ apiServer: {
317
+ enabled: true,
318
+ port: 18431,
319
+ host: '127.0.0.1',
320
+ ...(process.env.OPENCLAW_API_KEY ? { apiKey: process.env.OPENCLAW_API_KEY } : {}),
321
+ },
322
+ hooks: {
323
+ enabled: true,
324
+ toolBefore: true,
325
+ toolAfter: true,
326
+ includeArgs: true,
327
+ includeResult: true,
328
+ },
329
+ enabled: true, // Disabled by default until configured
330
+ debug: false,
331
+ logLevel: 'info',
332
+ };
333
+ fs.writeFileSync(this.configPath, JSON.stringify(sampleConfig, null, 2) + os.EOL, 'utf-8');
334
+ }
335
+ /**
336
+ * Get config for API server only
337
+ */
338
+ getAPIServerConfig() {
339
+ const config = this.getConfig();
340
+ return config.apiServer;
341
+ }
342
+ /**
343
+ * Get config for hooks only
344
+ */
345
+ getHooksConfig() {
346
+ const config = this.getConfig();
347
+ return config.hooks;
348
+ }
349
+ /**
350
+ * Check if integration is enabled
351
+ */
352
+ isEnabled() {
353
+ return this.getConfig().enabled;
354
+ }
355
+ /**
356
+ * Check if API server is enabled
357
+ */
358
+ isAPIServerEnabled() {
359
+ return this.getConfig().apiServer?.enabled ?? false;
360
+ }
361
+ /**
362
+ * Check if hooks are enabled
363
+ */
364
+ areHooksEnabled() {
365
+ const config = this.getConfig();
366
+ return config.hooks?.enabled ?? false;
367
+ }
368
+ }
369
+ // Export singleton instance
370
+ export const configLoader = new OpenClawConfigLoader();
371
+ // Export factory function
372
+ export function createConfigLoader(configPath) {
373
+ return new OpenClawConfigLoader(configPath);
374
+ }
375
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/integrations/openclaw/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * OpenClaw 0xRay Hooks Integration
3
+ *
4
+ * Integrates OpenClaw with 0xRay's tool.before and tool.after hooks
5
+ * to send tool execution events to OpenClaw Gateway.
6
+ *
7
+ * @version 1.0.0
8
+ * @since 2026-03-14
9
+ */
10
+ import { OpenClawClient } from '../client.js';
11
+ /**
12
+ * Hooks configuration
13
+ */
14
+ export interface OpenClawHooksConfig {
15
+ enabled: boolean;
16
+ toolBefore: boolean;
17
+ toolAfter: boolean;
18
+ includeArgs: boolean;
19
+ includeResult: boolean;
20
+ toolFilter?: string[];
21
+ }
22
+ /**
23
+ * 0xRay tool event
24
+ */
25
+ export interface StringRayToolEvent {
26
+ toolName: string;
27
+ toolId: string;
28
+ args: Record<string, unknown>;
29
+ result?: unknown;
30
+ error?: string;
31
+ duration: number;
32
+ timestamp: number;
33
+ sessionId?: string;
34
+ agent?: string;
35
+ }
36
+ /**
37
+ * Hook event callback type
38
+ */
39
+ export type ToolEventCallback = (event: StringRayToolEvent) => void | Promise<void>;
40
+ /**
41
+ * OpenClaw Hooks Manager
42
+ */
43
+ export declare class OpenClawHooksManager {
44
+ private client;
45
+ private config;
46
+ private initialized;
47
+ private toolBeforeCallbacks;
48
+ private toolAfterCallbacks;
49
+ private logger;
50
+ private eventQueue;
51
+ private maxQueueSize;
52
+ private isFlushing;
53
+ constructor(config: OpenClawHooksConfig);
54
+ /**
55
+ * Set the OpenClaw client
56
+ */
57
+ setClient(client: OpenClawClient): void;
58
+ /**
59
+ * Initialize hooks - registers with 0xRay's event system
60
+ */
61
+ initialize(): Promise<void>;
62
+ /**
63
+ * Register a callback for tool.before events
64
+ * Call this to connect to 0xRay's tool.before event system
65
+ */
66
+ registerToolBefore(callback: ToolEventCallback): void;
67
+ /**
68
+ * Unregister a tool.before callback
69
+ */
70
+ unregisterToolBefore(callback: ToolEventCallback): void;
71
+ /**
72
+ * Register a callback for tool.after events
73
+ * Call this to connect to 0xRay's tool.after event system
74
+ */
75
+ registerToolAfter(callback: ToolEventCallback): void;
76
+ /**
77
+ * Unregister a tool.after callback
78
+ */
79
+ unregisterToolAfter(callback: ToolEventCallback): void;
80
+ /**
81
+ * Handle tool.before event from 0xRay
82
+ */
83
+ onToolBefore(event: StringRayToolEvent): Promise<void>;
84
+ /**
85
+ * Handle tool.after event from 0xRay
86
+ */
87
+ onToolAfter(event: StringRayToolEvent): Promise<void>;
88
+ /**
89
+ * Queue an event for later delivery when connection is restored
90
+ */
91
+ private queueEvent;
92
+ /**
93
+ * Flush queued events to OpenClaw Gateway
94
+ */
95
+ private flushEventQueue;
96
+ /**
97
+ * Get the current queue size
98
+ */
99
+ getQueueSize(): number;
100
+ /**
101
+ * Called when client reconnects - flush the event queue
102
+ */
103
+ handleReconnect(): Promise<void>;
104
+ /**
105
+ * Shutdown hooks
106
+ */
107
+ shutdown(): Promise<void>;
108
+ /**
109
+ * Check if hooks are initialized
110
+ */
111
+ isInitialized(): boolean;
112
+ /**
113
+ * Update configuration
114
+ */
115
+ updateConfig(config: Partial<OpenClawHooksConfig>): void;
116
+ /**
117
+ * Get current configuration
118
+ */
119
+ getConfig(): OpenClawHooksConfig;
120
+ }
121
+ /**
122
+ * Factory function to create hooks manager
123
+ */
124
+ export declare function createOpenClawHooksManager(config: OpenClawHooksConfig): OpenClawHooksManager;
125
+ //# sourceMappingURL=strray-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strray-hooks.d.ts","sourceRoot":"","sources":["../../../../src/integrations/openclaw/hooks/strray-hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpF;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,mBAAmB,CAAqC;IAChE,OAAO,CAAC,kBAAkB,CAAqC;IAC/D,OAAO,CAAC,MAAM,CAAU;IAGxB,OAAO,CAAC,UAAU,CAAwE;IAC1F,OAAO,CAAC,YAAY,CAAO;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,mBAAmB;IAYvC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAIvC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC;;;OAGG;IACH,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIrD;;OAEG;IACH,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIpD;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAItD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C5D;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkD3D;;OAEG;IACH,OAAO,CAAC,UAAU;IAUlB;;OAEG;YACW,eAAe;IA6B7B;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAOxD;;OAEG;IACH,SAAS,IAAI,mBAAmB;CAGjC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB,CAE5F"}