linguclaw 0.4.3 → 0.5.1
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/dist/api-integrations.d.ts +137 -0
- package/dist/api-integrations.d.ts.map +1 -0
- package/dist/api-integrations.js +348 -0
- package/dist/api-integrations.js.map +1 -0
- package/dist/chain-of-thought.d.ts +136 -0
- package/dist/chain-of-thought.d.ts.map +1 -0
- package/dist/chain-of-thought.js +337 -0
- package/dist/chain-of-thought.js.map +1 -0
- package/dist/code-sandbox.d.ts +81 -0
- package/dist/code-sandbox.d.ts.map +1 -0
- package/dist/code-sandbox.js +363 -0
- package/dist/code-sandbox.js.map +1 -0
- package/dist/lib.d.ts +22 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +63 -0
- package/dist/lib.js.map +1 -0
- package/dist/orchestrator.d.ts +28 -3
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +200 -20
- package/dist/orchestrator.js.map +1 -1
- package/dist/session-memory.d.ts +116 -0
- package/dist/session-memory.d.ts.map +1 -0
- package/dist/session-memory.js +351 -0
- package/dist/session-memory.js.map +1 -0
- package/dist/static/dashboard.html +1 -1
- package/dist/static/hub.html +1 -1
- package/dist/static/index.html +130 -5
- package/dist/task-planner.d.ts +145 -0
- package/dist/task-planner.d.ts.map +1 -0
- package/dist/task-planner.js +520 -0
- package/dist/task-planner.js.map +1 -0
- package/dist/web.d.ts +6 -2
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +186 -4
- package/dist/web.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chain of Thought - Transparent reasoning and action tracking system
|
|
4
|
+
*
|
|
5
|
+
* Core capabilities:
|
|
6
|
+
* - Thought Logs: See exactly what the agent is "thinking"
|
|
7
|
+
* - Action Tracking: Real-time visibility into which tools are being used
|
|
8
|
+
* - Reasoning Chain: Full audit trail of decisions and their outcomes
|
|
9
|
+
* - Event Streaming: WebSocket-compatible event emission for live UI updates
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ChainOfThought = void 0;
|
|
13
|
+
exports.getChainOfThought = getChainOfThought;
|
|
14
|
+
const events_1 = require("events");
|
|
15
|
+
const logger_1 = require("./logger");
|
|
16
|
+
const logger = (0, logger_1.getLogger)();
|
|
17
|
+
const DEFAULT_CONFIG = {
|
|
18
|
+
maxThoughtsPerSession: 500,
|
|
19
|
+
maxActionsPerSession: 200,
|
|
20
|
+
enableStreaming: true,
|
|
21
|
+
verboseLogging: false,
|
|
22
|
+
persistToDisk: false,
|
|
23
|
+
};
|
|
24
|
+
// ==================== Chain of Thought Engine ====================
|
|
25
|
+
class ChainOfThought extends events_1.EventEmitter {
|
|
26
|
+
config;
|
|
27
|
+
sessions = new Map();
|
|
28
|
+
activeSession = null;
|
|
29
|
+
idCounter = 0;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
super();
|
|
32
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Start a new reasoning session
|
|
36
|
+
*/
|
|
37
|
+
startSession(task, sessionId) {
|
|
38
|
+
const id = sessionId || `session-${Date.now()}-${Math.random().toString(36).substr(2, 6)}`;
|
|
39
|
+
this.sessions.set(id, {
|
|
40
|
+
task,
|
|
41
|
+
startedAt: new Date(),
|
|
42
|
+
thoughts: [],
|
|
43
|
+
actions: [],
|
|
44
|
+
chain: [],
|
|
45
|
+
});
|
|
46
|
+
this.activeSession = id;
|
|
47
|
+
this.emit('session:start', { sessionId: id, task });
|
|
48
|
+
logger.info(`[CoT] Session started: ${id} — "${task.substring(0, 100)}"`);
|
|
49
|
+
return id;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* End a reasoning session
|
|
53
|
+
*/
|
|
54
|
+
endSession(sessionId, conclusion) {
|
|
55
|
+
const sid = sessionId || this.activeSession;
|
|
56
|
+
if (!sid)
|
|
57
|
+
return null;
|
|
58
|
+
const session = this.sessions.get(sid);
|
|
59
|
+
if (!session)
|
|
60
|
+
return null;
|
|
61
|
+
if (conclusion) {
|
|
62
|
+
this.think(sid, 'conclusion', conclusion);
|
|
63
|
+
}
|
|
64
|
+
const summary = {
|
|
65
|
+
sessionId: sid,
|
|
66
|
+
task: session.task,
|
|
67
|
+
startedAt: session.startedAt,
|
|
68
|
+
endedAt: new Date(),
|
|
69
|
+
totalThoughts: session.thoughts.length,
|
|
70
|
+
totalActions: session.actions.length,
|
|
71
|
+
failedActions: session.actions.filter(a => a.status === 'failed').length,
|
|
72
|
+
corrections: session.thoughts.filter(t => t.type === 'correction').length,
|
|
73
|
+
reasoningChain: session.chain,
|
|
74
|
+
finalConclusion: conclusion,
|
|
75
|
+
};
|
|
76
|
+
this.emit('session:end', summary);
|
|
77
|
+
logger.info(`[CoT] Session ended: ${sid} — ${summary.totalThoughts} thoughts, ${summary.totalActions} actions`);
|
|
78
|
+
if (this.activeSession === sid) {
|
|
79
|
+
this.activeSession = null;
|
|
80
|
+
}
|
|
81
|
+
return summary;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Record a thought
|
|
85
|
+
*/
|
|
86
|
+
think(sessionId, type, content, meta) {
|
|
87
|
+
const sid = sessionId || this.activeSession;
|
|
88
|
+
const session = sid ? this.sessions.get(sid) : null;
|
|
89
|
+
const thought = {
|
|
90
|
+
id: `thought-${++this.idCounter}`,
|
|
91
|
+
sessionId: sid || 'unknown',
|
|
92
|
+
timestamp: new Date(),
|
|
93
|
+
type,
|
|
94
|
+
content,
|
|
95
|
+
confidence: meta?.confidence,
|
|
96
|
+
relatedActionId: meta?.relatedActionId,
|
|
97
|
+
parentThoughtId: meta?.parentThoughtId,
|
|
98
|
+
metadata: meta?.metadata,
|
|
99
|
+
};
|
|
100
|
+
if (session) {
|
|
101
|
+
if (session.thoughts.length < this.config.maxThoughtsPerSession) {
|
|
102
|
+
session.thoughts.push(thought);
|
|
103
|
+
}
|
|
104
|
+
session.chain.push({ thought });
|
|
105
|
+
}
|
|
106
|
+
if (this.config.enableStreaming) {
|
|
107
|
+
this.emit('thought', thought);
|
|
108
|
+
}
|
|
109
|
+
if (this.config.verboseLogging) {
|
|
110
|
+
logger.info(`[CoT] 💭 [${type}] ${content.substring(0, 150)}`);
|
|
111
|
+
}
|
|
112
|
+
return thought;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Record an action start
|
|
116
|
+
*/
|
|
117
|
+
startAction(sessionId, tool, operation, input, metadata) {
|
|
118
|
+
const sid = sessionId || this.activeSession;
|
|
119
|
+
const session = sid ? this.sessions.get(sid) : null;
|
|
120
|
+
const action = {
|
|
121
|
+
id: `action-${++this.idCounter}`,
|
|
122
|
+
sessionId: sid || 'unknown',
|
|
123
|
+
timestamp: new Date(),
|
|
124
|
+
tool,
|
|
125
|
+
operation,
|
|
126
|
+
input: input.substring(0, 2000),
|
|
127
|
+
status: 'started',
|
|
128
|
+
metadata,
|
|
129
|
+
};
|
|
130
|
+
if (session) {
|
|
131
|
+
if (session.actions.length < this.config.maxActionsPerSession) {
|
|
132
|
+
session.actions.push(action);
|
|
133
|
+
}
|
|
134
|
+
// Attach to last reasoning step or create new one
|
|
135
|
+
const lastStep = session.chain[session.chain.length - 1];
|
|
136
|
+
if (lastStep && !lastStep.action) {
|
|
137
|
+
lastStep.action = action;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
session.chain.push({
|
|
141
|
+
thought: {
|
|
142
|
+
id: `thought-${++this.idCounter}`,
|
|
143
|
+
sessionId: sid || 'unknown',
|
|
144
|
+
timestamp: new Date(),
|
|
145
|
+
type: 'observation',
|
|
146
|
+
content: `Executing ${tool}.${operation}`,
|
|
147
|
+
relatedActionId: action.id,
|
|
148
|
+
},
|
|
149
|
+
action,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (this.config.enableStreaming) {
|
|
154
|
+
this.emit('action:start', action);
|
|
155
|
+
}
|
|
156
|
+
if (this.config.verboseLogging) {
|
|
157
|
+
logger.info(`[CoT] 🔧 [${tool}.${operation}] ${input.substring(0, 100)}`);
|
|
158
|
+
}
|
|
159
|
+
return action;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Update an action's status
|
|
163
|
+
*/
|
|
164
|
+
updateAction(actionId, update) {
|
|
165
|
+
for (const session of this.sessions.values()) {
|
|
166
|
+
const action = session.actions.find(a => a.id === actionId);
|
|
167
|
+
if (action) {
|
|
168
|
+
if (update.status)
|
|
169
|
+
action.status = update.status;
|
|
170
|
+
if (update.output !== undefined)
|
|
171
|
+
action.output = update.output.substring(0, 5000);
|
|
172
|
+
if (update.error !== undefined)
|
|
173
|
+
action.error = update.error;
|
|
174
|
+
if (update.duration !== undefined)
|
|
175
|
+
action.duration = update.duration;
|
|
176
|
+
if (this.config.enableStreaming) {
|
|
177
|
+
this.emit('action:update', action);
|
|
178
|
+
}
|
|
179
|
+
// Update the chain step result
|
|
180
|
+
const step = session.chain.find(s => s.action?.id === actionId);
|
|
181
|
+
if (step) {
|
|
182
|
+
step.result = update.output || update.error;
|
|
183
|
+
}
|
|
184
|
+
return action;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Complete an action
|
|
191
|
+
*/
|
|
192
|
+
completeAction(actionId, output, startTime) {
|
|
193
|
+
return this.updateAction(actionId, {
|
|
194
|
+
status: 'completed',
|
|
195
|
+
output,
|
|
196
|
+
duration: startTime ? Date.now() - startTime : undefined,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Fail an action
|
|
201
|
+
*/
|
|
202
|
+
failAction(actionId, error, startTime) {
|
|
203
|
+
return this.updateAction(actionId, {
|
|
204
|
+
status: 'failed',
|
|
205
|
+
error,
|
|
206
|
+
duration: startTime ? Date.now() - startTime : undefined,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get the full reasoning chain for a session
|
|
211
|
+
*/
|
|
212
|
+
getChain(sessionId) {
|
|
213
|
+
const sid = sessionId || this.activeSession;
|
|
214
|
+
if (!sid)
|
|
215
|
+
return [];
|
|
216
|
+
return this.sessions.get(sid)?.chain || [];
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get all thoughts for a session
|
|
220
|
+
*/
|
|
221
|
+
getThoughts(sessionId, type) {
|
|
222
|
+
const sid = sessionId || this.activeSession;
|
|
223
|
+
if (!sid)
|
|
224
|
+
return [];
|
|
225
|
+
const thoughts = this.sessions.get(sid)?.thoughts || [];
|
|
226
|
+
if (type)
|
|
227
|
+
return thoughts.filter(t => t.type === type);
|
|
228
|
+
return thoughts;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get all actions for a session
|
|
232
|
+
*/
|
|
233
|
+
getActions(sessionId, tool) {
|
|
234
|
+
const sid = sessionId || this.activeSession;
|
|
235
|
+
if (!sid)
|
|
236
|
+
return [];
|
|
237
|
+
const actions = this.sessions.get(sid)?.actions || [];
|
|
238
|
+
if (tool)
|
|
239
|
+
return actions.filter(a => a.tool === tool);
|
|
240
|
+
return actions;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get session summary without ending it
|
|
244
|
+
*/
|
|
245
|
+
getSessionSummary(sessionId) {
|
|
246
|
+
const sid = sessionId || this.activeSession;
|
|
247
|
+
if (!sid)
|
|
248
|
+
return null;
|
|
249
|
+
const session = this.sessions.get(sid);
|
|
250
|
+
if (!session)
|
|
251
|
+
return null;
|
|
252
|
+
return {
|
|
253
|
+
sessionId: sid,
|
|
254
|
+
task: session.task,
|
|
255
|
+
startedAt: session.startedAt,
|
|
256
|
+
totalThoughts: session.thoughts.length,
|
|
257
|
+
totalActions: session.actions.length,
|
|
258
|
+
failedActions: session.actions.filter(a => a.status === 'failed').length,
|
|
259
|
+
corrections: session.thoughts.filter(t => t.type === 'correction').length,
|
|
260
|
+
reasoningChain: session.chain,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get a human-readable reasoning trace
|
|
265
|
+
*/
|
|
266
|
+
getReadableTrace(sessionId) {
|
|
267
|
+
const chain = this.getChain(sessionId);
|
|
268
|
+
if (chain.length === 0)
|
|
269
|
+
return 'No reasoning trace available.';
|
|
270
|
+
const lines = [];
|
|
271
|
+
for (let i = 0; i < chain.length; i++) {
|
|
272
|
+
const step = chain[i];
|
|
273
|
+
const idx = i + 1;
|
|
274
|
+
// Thought
|
|
275
|
+
const typeEmoji = {
|
|
276
|
+
reasoning: '🧠',
|
|
277
|
+
planning: '📋',
|
|
278
|
+
observation: '👁️',
|
|
279
|
+
decision: '⚖️',
|
|
280
|
+
reflection: '🪞',
|
|
281
|
+
correction: '🔄',
|
|
282
|
+
hypothesis: '💡',
|
|
283
|
+
conclusion: '✅',
|
|
284
|
+
}[step.thought.type] || '💭';
|
|
285
|
+
lines.push(`${idx}. ${typeEmoji} [${step.thought.type.toUpperCase()}] ${step.thought.content}`);
|
|
286
|
+
// Action
|
|
287
|
+
if (step.action) {
|
|
288
|
+
const statusEmoji = {
|
|
289
|
+
started: '⏳',
|
|
290
|
+
running: '🔄',
|
|
291
|
+
completed: '✅',
|
|
292
|
+
failed: '❌',
|
|
293
|
+
cancelled: '🚫',
|
|
294
|
+
}[step.action.status] || '❓';
|
|
295
|
+
lines.push(` ${statusEmoji} ${step.action.tool}.${step.action.operation}: ${step.action.input.substring(0, 100)}`);
|
|
296
|
+
if (step.action.output) {
|
|
297
|
+
lines.push(` → ${step.action.output.substring(0, 200)}`);
|
|
298
|
+
}
|
|
299
|
+
if (step.action.error) {
|
|
300
|
+
lines.push(` ✗ ${step.action.error.substring(0, 200)}`);
|
|
301
|
+
}
|
|
302
|
+
if (step.action.duration) {
|
|
303
|
+
lines.push(` ⏱ ${step.action.duration}ms`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
lines.push('');
|
|
307
|
+
}
|
|
308
|
+
return lines.join('\n');
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Get active session ID
|
|
312
|
+
*/
|
|
313
|
+
getActiveSessionId() {
|
|
314
|
+
return this.activeSession;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Clean up old sessions
|
|
318
|
+
*/
|
|
319
|
+
cleanup(maxAge = 3600000) {
|
|
320
|
+
const now = Date.now();
|
|
321
|
+
for (const [id, session] of this.sessions) {
|
|
322
|
+
if (now - session.startedAt.getTime() > maxAge && id !== this.activeSession) {
|
|
323
|
+
this.sessions.delete(id);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
exports.ChainOfThought = ChainOfThought;
|
|
329
|
+
// ==================== Singleton ====================
|
|
330
|
+
let instance = null;
|
|
331
|
+
function getChainOfThought(config) {
|
|
332
|
+
if (!instance) {
|
|
333
|
+
instance = new ChainOfThought(config);
|
|
334
|
+
}
|
|
335
|
+
return instance;
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=chain-of-thought.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-of-thought.js","sourceRoot":"","sources":["../src/chain-of-thought.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Sandbox - Execute Python/JavaScript/TypeScript code safely in Docker
|
|
3
|
+
*
|
|
4
|
+
* Core capabilities:
|
|
5
|
+
* - Execute code in isolated Docker containers
|
|
6
|
+
* - Support for Python, JavaScript, TypeScript, and Shell
|
|
7
|
+
* - Memory and CPU limits for safety
|
|
8
|
+
* - Timeout enforcement
|
|
9
|
+
* - Output capture (stdout, stderr, files)
|
|
10
|
+
* - Fallback to local execution with safety checks
|
|
11
|
+
*/
|
|
12
|
+
export type SandboxLanguage = 'python' | 'javascript' | 'typescript' | 'shell';
|
|
13
|
+
export interface CodeExecRequest {
|
|
14
|
+
language: SandboxLanguage;
|
|
15
|
+
code: string;
|
|
16
|
+
timeout?: number;
|
|
17
|
+
stdin?: string;
|
|
18
|
+
env?: Record<string, string>;
|
|
19
|
+
workDir?: string;
|
|
20
|
+
packages?: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface CodeExecResult {
|
|
23
|
+
success: boolean;
|
|
24
|
+
stdout: string;
|
|
25
|
+
stderr: string;
|
|
26
|
+
exitCode: number;
|
|
27
|
+
executionTime: number;
|
|
28
|
+
sandboxed: boolean;
|
|
29
|
+
language: SandboxLanguage;
|
|
30
|
+
error?: string;
|
|
31
|
+
files?: {
|
|
32
|
+
name: string;
|
|
33
|
+
content: string;
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
36
|
+
export declare class CodeSandbox {
|
|
37
|
+
private dockerAvailable;
|
|
38
|
+
private tempDir;
|
|
39
|
+
constructor();
|
|
40
|
+
/**
|
|
41
|
+
* Initialize and check Docker availability
|
|
42
|
+
*/
|
|
43
|
+
init(): Promise<boolean>;
|
|
44
|
+
get isDockerAvailable(): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Execute code in sandbox
|
|
47
|
+
*/
|
|
48
|
+
execute(request: CodeExecRequest): Promise<CodeExecResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Execute code in Docker container
|
|
51
|
+
*/
|
|
52
|
+
private executeInDocker;
|
|
53
|
+
/**
|
|
54
|
+
* Execute code locally with safety restrictions (fallback when Docker unavailable)
|
|
55
|
+
*/
|
|
56
|
+
private executeLocally;
|
|
57
|
+
/**
|
|
58
|
+
* Check code for dangerous patterns
|
|
59
|
+
*/
|
|
60
|
+
private checkCodeSafety;
|
|
61
|
+
/**
|
|
62
|
+
* Parse Docker container logs into stdout/stderr
|
|
63
|
+
*/
|
|
64
|
+
private parseDockerLogs;
|
|
65
|
+
/**
|
|
66
|
+
* Get available languages and their status
|
|
67
|
+
*/
|
|
68
|
+
getAvailableLanguages(): Promise<Record<SandboxLanguage, {
|
|
69
|
+
available: boolean;
|
|
70
|
+
runtime: string;
|
|
71
|
+
}>>;
|
|
72
|
+
/**
|
|
73
|
+
* Utility: ensure directory exists
|
|
74
|
+
*/
|
|
75
|
+
private ensureDir;
|
|
76
|
+
/**
|
|
77
|
+
* Utility: safely delete a file
|
|
78
|
+
*/
|
|
79
|
+
private safeDelete;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=code-sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-sandbox.d.ts","sourceRoot":"","sources":["../src/code-sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC;AAE/E,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAyDD,qBAAa,WAAW;IACtB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,OAAO,CAAS;;IAOxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;IAe9B,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BhE;;OAEG;YACW,eAAe;IA0F7B;;OAEG;YACW,cAAc;IAuE5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IA+BvB;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAwBxG;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;IACH,OAAO,CAAC,UAAU;CAKnB"}
|