@smilique/said 1.0.6 → 1.0.7
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/agent.d.ts +11 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +118 -23
- package/dist/agent.js.map +1 -1
- package/package.json +1 -1
package/dist/agent.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface ConversationContext {
|
|
|
17
17
|
export interface AgentConfig extends ServiceConfig {
|
|
18
18
|
systemPrompt?: string;
|
|
19
19
|
maxContextLength?: number;
|
|
20
|
+
maxToolIterations?: number;
|
|
20
21
|
}
|
|
21
22
|
export interface ChatMessage {
|
|
22
23
|
role: 'system' | 'user' | 'assistant';
|
|
@@ -39,6 +40,7 @@ export declare class Agent extends Service {
|
|
|
39
40
|
private systemPrompt;
|
|
40
41
|
private contexts;
|
|
41
42
|
private maxContextLength;
|
|
43
|
+
private maxToolIterations;
|
|
42
44
|
private skillRegistry;
|
|
43
45
|
constructor(config: AgentConfig, eventEmitter?: EventEmitter);
|
|
44
46
|
setProvider(provider: LLMProvider | null): void;
|
|
@@ -50,6 +52,15 @@ export declare class Agent extends Service {
|
|
|
50
52
|
start(): Promise<void>;
|
|
51
53
|
stop(): Promise<void>;
|
|
52
54
|
getLastTokenUsage(): TokenUsage;
|
|
55
|
+
/**
|
|
56
|
+
* Execute a skill from an LLM response string
|
|
57
|
+
* Returns {skillResult, remainingResponse} if skill found, null otherwise
|
|
58
|
+
*/
|
|
59
|
+
private executeSkillFromResponse;
|
|
60
|
+
/**
|
|
61
|
+
* Trim conversation context to keep it within limits
|
|
62
|
+
*/
|
|
63
|
+
private trimContext;
|
|
53
64
|
processMessage(chatId: number, userMessage: string): Promise<string>;
|
|
54
65
|
processMessageStream(chatId: number, userMessage: string): Promise<AsyncIterable<string>>;
|
|
55
66
|
clearContext(chatId: number): void;
|
package/dist/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAuB,MAAM,sBAAsB,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAuB,MAAM,sBAAsB,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5E,iBAAiB,CAAC,IAAI,UAAU,CAAC;CAClC;AAED,qBAAa,KAAM,SAAQ,OAAO;IAChC,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,YAAY,CA+BgF;IACpG,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,gBAAgB,CAAc;IACtC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,YAAY;IAc5D,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAI/C,gBAAgB,IAAI,aAAa;IAIjC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIjC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAItC,UAAU,IAAI,KAAK,EAAE;IAIf,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,iBAAiB,IAAI,UAAU;IAO/B;;;OAGG;YACW,wBAAwB;IAmDtC;;OAEG;IACH,OAAO,CAAC,WAAW;IAWb,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkGpE,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAgC/F,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,gBAAgB,IAAI,IAAI;CAGzB"}
|
package/dist/agent.js
CHANGED
|
@@ -8,7 +8,7 @@ export class Agent extends Service {
|
|
|
8
8
|
1. **Using Skills** - You have access to skills that can interact with the filesystem, browse the web, make API calls, and execute custom tools. When a user asks for something that requires these capabilities, use the appropriate skill.
|
|
9
9
|
|
|
10
10
|
2. **Skills Available**:
|
|
11
|
-
- file-edit: Read, write,
|
|
11
|
+
- file-edit: Read, write, delete, list files on the filesystem
|
|
12
12
|
- web-surf: Fetch and parse web pages and URLs
|
|
13
13
|
- api-call: Make HTTP API requests
|
|
14
14
|
- tool-call: Execute custom tools and commands
|
|
@@ -17,13 +17,27 @@ export class Agent extends Service {
|
|
|
17
17
|
|
|
18
18
|
4. **Subagents** - You can spawn and manage subagents to handle parallel tasks.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
**IMPORTANT - How to use skills:**
|
|
21
|
+
When you need to use a skill, respond with ONLY the skill invocation in this exact format. Do NOT include any other text in your response:
|
|
22
|
+
[[skillName '{"param": "value"}']]
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
For file-edit skill, use these operations:
|
|
25
|
+
- [[file-edit '{"operation": "read", "path": "/path/to/file"}']]
|
|
26
|
+
- [[file-edit '{"operation": "write", "path": "/path/to/file", "content": "text"}']]
|
|
27
|
+
- [[file-edit '{"operation": "list", "path": "/path/to/dir"}']]
|
|
28
|
+
- [[file-edit '{"operation": "delete", "path": "/path/to/file"}']]
|
|
29
|
+
- [[file-edit '{"operation": "mkdir", "path": "/path/to/dir"}']]
|
|
30
|
+
- [[file-edit '{"operation": "stat", "path": "/path/to/file"}']]
|
|
31
|
+
|
|
32
|
+
For web-surf:
|
|
33
|
+
- [[web-surf '{"operation": "fetch", "url": "https://example.com"}']]
|
|
34
|
+
|
|
35
|
+
The system will execute the skill and return the result. Then you can respond to the user with the actual answer based on the tool result.
|
|
36
|
+
|
|
37
|
+
For normal responses (without skills), just respond as a helpful assistant. Be concise and accurate.`;
|
|
25
38
|
contexts = new Map();
|
|
26
39
|
maxContextLength = 10;
|
|
40
|
+
maxToolIterations = 5;
|
|
27
41
|
skillRegistry;
|
|
28
42
|
constructor(config, eventEmitter) {
|
|
29
43
|
super(config, eventEmitter);
|
|
@@ -33,6 +47,9 @@ Otherwise, respond as a helpful assistant. Be concise and accurate.`;
|
|
|
33
47
|
if (config.maxContextLength) {
|
|
34
48
|
this.maxContextLength = config.maxContextLength;
|
|
35
49
|
}
|
|
50
|
+
if (config.maxToolIterations) {
|
|
51
|
+
this.maxToolIterations = config.maxToolIterations;
|
|
52
|
+
}
|
|
36
53
|
this.skillRegistry = globalSkillRegistry;
|
|
37
54
|
}
|
|
38
55
|
setProvider(provider) {
|
|
@@ -67,11 +84,67 @@ Otherwise, respond as a helpful assistant. Be concise and accurate.`;
|
|
|
67
84
|
}
|
|
68
85
|
return { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
|
|
69
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Execute a skill from an LLM response string
|
|
89
|
+
* Returns {skillResult, remainingResponse} if skill found, null otherwise
|
|
90
|
+
*/
|
|
91
|
+
async executeSkillFromResponse(response, chatId) {
|
|
92
|
+
// Match [[skillName:action '{"param": "value"}']] pattern
|
|
93
|
+
const skillPattern = /\[\[(\w+)(?::(\w+))?\s*(.*?)\]\]/;
|
|
94
|
+
const match = response.match(skillPattern);
|
|
95
|
+
if (!match) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const skillName = match[1];
|
|
99
|
+
const action = match[2] || 'execute';
|
|
100
|
+
const paramsStr = match[3];
|
|
101
|
+
console.log(`[Agent] Executing skill: ${skillName}:${action}`);
|
|
102
|
+
// Parse params
|
|
103
|
+
let params = {};
|
|
104
|
+
if (paramsStr) {
|
|
105
|
+
try {
|
|
106
|
+
params = JSON.parse(paramsStr);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
params = { value: paramsStr };
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Add action as operation if specified
|
|
113
|
+
if (action && action !== 'execute') {
|
|
114
|
+
params.operation = action;
|
|
115
|
+
}
|
|
116
|
+
// Execute skill
|
|
117
|
+
const skillContext = {
|
|
118
|
+
sessionId: String(chatId),
|
|
119
|
+
};
|
|
120
|
+
const result = await this.skillRegistry.execute(skillName, params, skillContext);
|
|
121
|
+
// Remove the skill invocation from response
|
|
122
|
+
const remainingResponse = response.replace(match[0], '').trim();
|
|
123
|
+
return {
|
|
124
|
+
skillResult: result.success
|
|
125
|
+
? JSON.stringify(result.data, null, 2)
|
|
126
|
+
: `Error: ${result.error}`,
|
|
127
|
+
remainingResponse,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Trim conversation context to keep it within limits
|
|
132
|
+
*/
|
|
133
|
+
trimContext(context) {
|
|
134
|
+
const maxMessages = this.maxContextLength + 10; // Buffer for tool results
|
|
135
|
+
if (context.messages.length > maxMessages) {
|
|
136
|
+
const systemMessage = context.messages[0];
|
|
137
|
+
context.messages = [
|
|
138
|
+
systemMessage,
|
|
139
|
+
...context.messages.slice(-this.maxContextLength),
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
70
143
|
async processMessage(chatId, userMessage) {
|
|
71
144
|
if (!this.provider) {
|
|
72
145
|
throw new Error('LLM provider not set');
|
|
73
146
|
}
|
|
74
|
-
// Check if message contains a skill invocation
|
|
147
|
+
// Check if message contains a direct skill invocation (from user)
|
|
75
148
|
const skillMatch = userMessage.match(/\[\[(\w+)(?::(\w+))?\s*(.*?)\]\]/);
|
|
76
149
|
if (skillMatch) {
|
|
77
150
|
const skillName = skillMatch[1];
|
|
@@ -87,15 +160,19 @@ Otherwise, respond as a helpful assistant. Be concise and accurate.`;
|
|
|
87
160
|
params = { value: paramsStr };
|
|
88
161
|
}
|
|
89
162
|
}
|
|
163
|
+
// Add action as operation if specified
|
|
164
|
+
if (action && action !== 'execute') {
|
|
165
|
+
params.operation = action;
|
|
166
|
+
}
|
|
90
167
|
const skillContext = {
|
|
91
168
|
sessionId: String(chatId),
|
|
92
169
|
};
|
|
93
170
|
const result = await this.skillRegistry.execute(skillName, params, skillContext);
|
|
94
171
|
if (result.success) {
|
|
95
|
-
return `
|
|
172
|
+
return `Result: ${JSON.stringify(result.data, null, 2)}`;
|
|
96
173
|
}
|
|
97
174
|
else {
|
|
98
|
-
return `
|
|
175
|
+
return `Error: ${result.error}`;
|
|
99
176
|
}
|
|
100
177
|
}
|
|
101
178
|
// Get or create conversation context
|
|
@@ -109,22 +186,40 @@ Otherwise, respond as a helpful assistant. Be concise and accurate.`;
|
|
|
109
186
|
}
|
|
110
187
|
// Add user message
|
|
111
188
|
context.messages.push({ role: 'user', content: userMessage });
|
|
112
|
-
//
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
context
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
189
|
+
// Tool execution loop (ReAct pattern)
|
|
190
|
+
let finalResponse = '';
|
|
191
|
+
for (let iteration = 0; iteration < this.maxToolIterations; iteration++) {
|
|
192
|
+
// Trim context if too long
|
|
193
|
+
this.trimContext(context);
|
|
194
|
+
// Get response from provider
|
|
195
|
+
const response = await this.provider.chatCompletion({
|
|
196
|
+
messages: context.messages,
|
|
197
|
+
});
|
|
198
|
+
// Check if response contains skill invocation
|
|
199
|
+
const skillExec = await this.executeSkillFromResponse(response, chatId);
|
|
200
|
+
if (skillExec) {
|
|
201
|
+
console.log(`[Agent] Skill execution result: ${skillExec.skillResult.substring(0, 100)}...`);
|
|
202
|
+
// Add assistant's skill attempt to context
|
|
203
|
+
if (skillExec.remainingResponse) {
|
|
204
|
+
context.messages.push({ role: 'assistant', content: skillExec.remainingResponse });
|
|
205
|
+
}
|
|
206
|
+
// Add tool result to context
|
|
207
|
+
context.messages.push({
|
|
208
|
+
role: 'system',
|
|
209
|
+
content: `Tool execution result: ${skillExec.skillResult}`,
|
|
210
|
+
});
|
|
211
|
+
// Continue to next iteration to let LLM process the result
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
// No skill detected - this is the final response
|
|
215
|
+
context.messages.push({ role: 'assistant', content: response });
|
|
216
|
+
finalResponse = response;
|
|
217
|
+
break;
|
|
120
218
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
// Add assistant response to context
|
|
126
|
-
context.messages.push({ role: 'assistant', content: response });
|
|
127
|
-
return response;
|
|
219
|
+
if (!finalResponse) {
|
|
220
|
+
finalResponse = context.messages[context.messages.length - 1].content || 'Max tool iterations reached';
|
|
221
|
+
}
|
|
222
|
+
return finalResponse;
|
|
128
223
|
}
|
|
129
224
|
async processMessageStream(chatId, userMessage) {
|
|
130
225
|
if (!this.provider) {
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAiB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsB,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAiB,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAyC1E,MAAM,OAAO,KAAM,SAAQ,OAAO;IACxB,QAAQ,GAAuB,IAAI,CAAC;IACpC,YAAY,GAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qGA+BoE,CAAC;IAC5F,QAAQ,GAAqC,IAAI,GAAG,EAAE,CAAC;IACvD,gBAAgB,GAAW,EAAE,CAAC;IAC9B,iBAAiB,GAAW,CAAC,CAAC;IAC9B,aAAa,CAAgB;IAErC,YAAY,MAAmB,EAAE,YAA2B;QAC1D,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC5B,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAClD,CAAC;QACD,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC;IAC3C,CAAC;IAED,WAAW,CAAC,QAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,aAAa,CAAC,KAAY;QACxB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,eAAe,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC/B,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,wBAAwB,CACpC,QAAgB,EAChB,MAAc;QAEd,0DAA0D;QAC1D,MAAM,YAAY,GAAG,kCAAkC,CAAC;QACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAE3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACrC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;QAE/D,eAAe;QACf,IAAI,MAAM,GAAwB,EAAE,CAAC;QACrC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAChC,CAAC;QACH,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;QAC5B,CAAC;QAED,gBAAgB;QAChB,MAAM,YAAY,GAAiB;YACjC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;SAC1B,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QAEjF,4CAA4C;QAC5C,MAAM,iBAAiB,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhE,OAAO;YACL,WAAW,EAAE,MAAM,CAAC,OAAO;gBACzB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,EAAE;YAC5B,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAA4B;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC,0BAA0B;QAC1E,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,QAAQ,GAAG;gBACjB,aAAa;gBACb,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;aAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,WAAmB;QACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,kEAAkE;QAClE,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACzE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YAC1C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAEhC,IAAI,MAAM,GAAwB,EAAE,CAAC;YACrC,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACjC,CAAC;gBAAC,MAAM,CAAC;oBACP,yCAAyC;oBACzC,MAAM,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;YAC5B,CAAC;YAED,MAAM,YAAY,GAAiB;gBACjC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;aAC1B,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YAEjF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,OAAO,UAAU,MAAM,CAAC,KAAK,EAAE,CAAC;YAClC,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1D,MAAM;aACP,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,mBAAmB;QACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAE9D,sCAAsC;QACtC,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE,EAAE,CAAC;YACxE,2BAA2B;YAC3B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAE1B,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAClD,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;YAEH,8CAA8C;YAC9C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAExE,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,mCAAmC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;gBAE7F,2CAA2C;gBAC3C,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC;oBAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACrF,CAAC;gBAED,6BAA6B;gBAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACpB,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,0BAA0B,SAAS,CAAC,WAAW,EAAE;iBAC3D,CAAC,CAAC;gBAEH,2DAA2D;gBAC3D,SAAS;YACX,CAAC;YAED,iDAAiD;YACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,aAAa,GAAG,QAAQ,CAAC;YACzB,MAAM;QACR,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,6BAA6B,CAAC;QACzG,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAc,EAAE,WAAmB;QAC5D,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,qCAAqC;QACrC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC1D,MAAM;aACP,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,mBAAmB;QACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAE9D,2BAA2B;QAC3B,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,QAAQ,GAAG;gBACjB,aAAa;gBACb,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;aAClD,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,gBAAgB;QACd,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|