rackmind-cli 0.1.6 → 0.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.
- package/LICENSE +21 -0
- package/README.md +62 -176
- package/bin/rackmind.js +5 -1
- package/dist/ai/providers/anthropic-provider.d.ts +4 -0
- package/dist/ai/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/ai/providers/anthropic-provider.js +17 -4
- package/dist/ai/providers/anthropic-provider.js.map +1 -1
- package/dist/ai/providers/base.d.ts +15 -0
- package/dist/ai/providers/base.d.ts.map +1 -1
- package/dist/ai/providers/claude-code-bridge.d.ts +7 -0
- package/dist/ai/providers/claude-code-bridge.d.ts.map +1 -1
- package/dist/ai/providers/claude-code-bridge.js +1 -1
- package/dist/ai/providers/claude-code-bridge.js.map +1 -1
- package/dist/ai/providers/claude-code-provider.d.ts.map +1 -1
- package/dist/ai/providers/claude-code-provider.js +1 -0
- package/dist/ai/providers/claude-code-provider.js.map +1 -1
- package/dist/ai/providers/index.d.ts +1 -1
- package/dist/ai/providers/index.d.ts.map +1 -1
- package/dist/ai/providers/index.js.map +1 -1
- package/dist/ai/system-prompt.d.ts.map +1 -1
- package/dist/ai/system-prompt.js +1 -26
- package/dist/ai/system-prompt.js.map +1 -1
- package/dist/ai/tool-executor.d.ts +29 -1
- package/dist/ai/tool-executor.d.ts.map +1 -1
- package/dist/ai/tool-executor.js +85 -1
- package/dist/ai/tool-executor.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +21 -15
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/containers.d.ts.map +1 -1
- package/dist/commands/containers.js +10 -3
- package/dist/commands/containers.js.map +1 -1
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +19 -7
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/lifecycle.d.ts.map +1 -1
- package/dist/commands/lifecycle.js +133 -105
- package/dist/commands/lifecycle.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +10 -4
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +20 -12
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/servers.d.ts.map +1 -1
- package/dist/commands/servers.js +29 -2
- package/dist/commands/servers.js.map +1 -1
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +66 -50
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/vms.d.ts.map +1 -1
- package/dist/commands/vms.js +9 -3
- package/dist/commands/vms.js.map +1 -1
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +21 -0
- package/dist/config/index.js.map +1 -1
- package/dist/globals.d.ts +21 -3
- package/dist/globals.d.ts.map +1 -1
- package/dist/globals.js +30 -4
- package/dist/globals.js.map +1 -1
- package/dist/index.js +22 -6
- package/dist/index.js.map +1 -1
- package/dist/interactive/App.d.ts.map +1 -1
- package/dist/interactive/App.js +11 -5
- package/dist/interactive/App.js.map +1 -1
- package/dist/interactive/components/ConfirmDialog.d.ts +9 -0
- package/dist/interactive/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/interactive/components/ConfirmDialog.js +26 -0
- package/dist/interactive/components/ConfirmDialog.js.map +1 -0
- package/dist/interactive/components/InputBar.d.ts.map +1 -1
- package/dist/interactive/components/InputBar.js +10 -1
- package/dist/interactive/components/InputBar.js.map +1 -1
- package/dist/interactive/launch.d.ts +5 -0
- package/dist/interactive/launch.d.ts.map +1 -1
- package/dist/interactive/launch.js +16 -0
- package/dist/interactive/launch.js.map +1 -1
- package/dist/interactive/slashCommands.d.ts +1 -0
- package/dist/interactive/slashCommands.d.ts.map +1 -1
- package/dist/interactive/slashCommands.js +13 -0
- package/dist/interactive/slashCommands.js.map +1 -1
- package/dist/interactive/useRackMind.d.ts +9 -1
- package/dist/interactive/useRackMind.d.ts.map +1 -1
- package/dist/interactive/useRackMind.js +68 -3
- package/dist/interactive/useRackMind.js.map +1 -1
- package/dist/oneshot/run.d.ts.map +1 -1
- package/dist/oneshot/run.js +51 -9
- package/dist/oneshot/run.js.map +1 -1
- package/dist/server/client.d.ts +4 -2
- package/dist/server/client.d.ts.map +1 -1
- package/dist/server/client.js +6 -4
- package/dist/server/client.js.map +1 -1
- package/dist/server/ssh.d.ts.map +1 -1
- package/dist/server/ssh.js +1 -1
- package/dist/server/ssh.js.map +1 -1
- package/dist/utils/prompt.d.ts.map +1 -1
- package/dist/utils/prompt.js +4 -1
- package/dist/utils/prompt.js.map +1 -1
- package/dist/utils/table.d.ts +3 -0
- package/dist/utils/table.d.ts.map +1 -1
- package/dist/utils/table.js +4 -1
- package/dist/utils/table.js.map +1 -1
- package/package.json +44 -12
- package/dist/ai/client.d.ts +0 -71
- package/dist/ai/client.d.ts.map +0 -1
- package/dist/ai/client.js +0 -198
- package/dist/ai/client.js.map +0 -1
package/dist/ai/client.js
DELETED
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// AI client — Claude API integration with tool use loop
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
// Wraps @anthropic-ai/sdk to handle:
|
|
5
|
-
// 1. Sending messages with system prompt + tools
|
|
6
|
-
// 2. Streaming text responses to a callback
|
|
7
|
-
// 3. Executing tool calls and feeding results back until a final text response
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
10
|
-
import { getToolDefinitions } from './tools.js';
|
|
11
|
-
import { fetchServerContext, buildSystemPrompt } from './system-prompt.js';
|
|
12
|
-
import { executeTool } from './tool-executor.js';
|
|
13
|
-
import { logger } from '../utils/logger.js';
|
|
14
|
-
import { withRetry, isTransientError, isRateLimitError } from '../utils/retry.js';
|
|
15
|
-
// Max iterations for the tool use loop to prevent infinite loops
|
|
16
|
-
const MAX_TOOL_ITERATIONS = 20;
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
// AI Client
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
export class AIClient {
|
|
21
|
-
anthropic;
|
|
22
|
-
model;
|
|
23
|
-
maxTokens;
|
|
24
|
-
constructor(options) {
|
|
25
|
-
this.anthropic = new Anthropic({
|
|
26
|
-
apiKey: options.apiKey,
|
|
27
|
-
timeout: options.timeoutMs ?? 120_000, // 2 minutes default
|
|
28
|
-
});
|
|
29
|
-
this.model = options.model ?? 'claude-sonnet-4-5';
|
|
30
|
-
this.maxTokens = options.maxTokens ?? 4096;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Send a one-shot query to Claude with full server context and tool use.
|
|
34
|
-
*
|
|
35
|
-
* This method:
|
|
36
|
-
* 1. Fetches live server context from the Proxmox API
|
|
37
|
-
* 2. Builds a system prompt with the context
|
|
38
|
-
* 3. Sends the user's query to Claude with tool definitions
|
|
39
|
-
* 4. Streams the response, executing any tool calls in a loop
|
|
40
|
-
* 5. Returns when Claude produces a final text response (stop_reason = "end_turn")
|
|
41
|
-
*/
|
|
42
|
-
async chat(query, serverClient, serverAlias, callbacks) {
|
|
43
|
-
// Fetch live server context
|
|
44
|
-
const context = await fetchServerContext(serverClient);
|
|
45
|
-
const systemPrompt = buildSystemPrompt(context, serverAlias);
|
|
46
|
-
const tools = getToolDefinitions();
|
|
47
|
-
// Build initial messages
|
|
48
|
-
const messages = [{ role: 'user', content: query }];
|
|
49
|
-
// Tool use loop — keep going until Claude gives a final text response
|
|
50
|
-
for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
|
|
51
|
-
logger.debug('AI request iteration', { iteration, messageCount: messages.length });
|
|
52
|
-
const response = await this.createWithRetry(systemPrompt, tools, messages, callbacks);
|
|
53
|
-
// Process the response content blocks
|
|
54
|
-
const assistantContent = [];
|
|
55
|
-
const toolUseBlocks = [];
|
|
56
|
-
for (const block of response.content) {
|
|
57
|
-
assistantContent.push(block);
|
|
58
|
-
if (block.type === 'text') {
|
|
59
|
-
callbacks.onText(block.text);
|
|
60
|
-
}
|
|
61
|
-
else if (block.type === 'tool_use') {
|
|
62
|
-
toolUseBlocks.push(block);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// Add the assistant's response to the conversation
|
|
66
|
-
messages.push({ role: 'assistant', content: assistantContent });
|
|
67
|
-
// If Claude is done (no more tool calls), we're finished
|
|
68
|
-
if (response.stop_reason === 'end_turn' || toolUseBlocks.length === 0) {
|
|
69
|
-
logger.debug('AI conversation complete', {
|
|
70
|
-
iterations: iteration + 1,
|
|
71
|
-
stopReason: response.stop_reason,
|
|
72
|
-
});
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
// Execute all tool calls and collect results
|
|
76
|
-
const toolResults = [];
|
|
77
|
-
for (const toolBlock of toolUseBlocks) {
|
|
78
|
-
const toolInput = toolBlock.input;
|
|
79
|
-
callbacks.onToolStart(toolBlock.name, toolBlock.name);
|
|
80
|
-
const result = await executeTool(toolBlock.name, toolInput, serverClient);
|
|
81
|
-
callbacks.onToolEnd(toolBlock.name, result.label, result.isError);
|
|
82
|
-
toolResults.push({
|
|
83
|
-
type: 'tool_result',
|
|
84
|
-
tool_use_id: toolBlock.id,
|
|
85
|
-
content: result.content,
|
|
86
|
-
is_error: result.isError,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
// Add tool results to the conversation and loop back
|
|
90
|
-
messages.push({ role: 'user', content: toolResults });
|
|
91
|
-
}
|
|
92
|
-
callbacks.onError('Reached maximum tool iterations. The AI may be stuck in a loop.');
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Multi-turn conversation method for the interactive REPL.
|
|
96
|
-
*
|
|
97
|
-
* Unlike `chat()`, this accepts the full conversation history so far
|
|
98
|
-
* and appends the new user query. It returns the updated history
|
|
99
|
-
* (including the assistant's response) for the caller to persist.
|
|
100
|
-
*
|
|
101
|
-
* The caller is responsible for building up `history` across turns.
|
|
102
|
-
*/
|
|
103
|
-
async chatMultiTurn(query, history, serverClient, serverAlias, callbacks) {
|
|
104
|
-
// Fetch live server context
|
|
105
|
-
const context = await fetchServerContext(serverClient);
|
|
106
|
-
const systemPrompt = buildSystemPrompt(context, serverAlias);
|
|
107
|
-
const tools = getToolDefinitions();
|
|
108
|
-
// Clone history and append the new user message
|
|
109
|
-
const messages = [
|
|
110
|
-
...history,
|
|
111
|
-
{ role: 'user', content: query },
|
|
112
|
-
];
|
|
113
|
-
// Tool use loop
|
|
114
|
-
for (let iteration = 0; iteration < MAX_TOOL_ITERATIONS; iteration++) {
|
|
115
|
-
logger.debug('AI multi-turn request iteration', {
|
|
116
|
-
iteration,
|
|
117
|
-
messageCount: messages.length,
|
|
118
|
-
});
|
|
119
|
-
const response = await this.createWithRetry(systemPrompt, tools, messages, callbacks);
|
|
120
|
-
// Process content blocks
|
|
121
|
-
const assistantContent = [];
|
|
122
|
-
const toolUseBlocks = [];
|
|
123
|
-
for (const block of response.content) {
|
|
124
|
-
assistantContent.push(block);
|
|
125
|
-
if (block.type === 'text') {
|
|
126
|
-
callbacks.onText(block.text);
|
|
127
|
-
}
|
|
128
|
-
else if (block.type === 'tool_use') {
|
|
129
|
-
toolUseBlocks.push(block);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
messages.push({ role: 'assistant', content: assistantContent });
|
|
133
|
-
// If done, return the full updated history
|
|
134
|
-
if (response.stop_reason === 'end_turn' || toolUseBlocks.length === 0) {
|
|
135
|
-
logger.debug('AI multi-turn conversation turn complete', {
|
|
136
|
-
iterations: iteration + 1,
|
|
137
|
-
stopReason: response.stop_reason,
|
|
138
|
-
});
|
|
139
|
-
return messages;
|
|
140
|
-
}
|
|
141
|
-
// Execute tool calls
|
|
142
|
-
const toolResults = [];
|
|
143
|
-
for (const toolBlock of toolUseBlocks) {
|
|
144
|
-
const toolInput = toolBlock.input;
|
|
145
|
-
callbacks.onToolStart(toolBlock.name, toolBlock.name);
|
|
146
|
-
const result = await executeTool(toolBlock.name, toolInput, serverClient);
|
|
147
|
-
callbacks.onToolEnd(toolBlock.name, result.label, result.isError);
|
|
148
|
-
if (callbacks.onToolResult) {
|
|
149
|
-
callbacks.onToolResult({
|
|
150
|
-
toolName: toolBlock.name,
|
|
151
|
-
label: result.label,
|
|
152
|
-
isError: result.isError,
|
|
153
|
-
content: result.content,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
toolResults.push({
|
|
157
|
-
type: 'tool_result',
|
|
158
|
-
tool_use_id: toolBlock.id,
|
|
159
|
-
content: result.content,
|
|
160
|
-
is_error: result.isError,
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
messages.push({ role: 'user', content: toolResults });
|
|
164
|
-
}
|
|
165
|
-
callbacks.onError('Reached maximum tool iterations. The AI may be stuck in a loop.');
|
|
166
|
-
return messages;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Create a message with retry logic for transient errors.
|
|
170
|
-
* Rate limits and overload errors trigger exponential backoff.
|
|
171
|
-
*/
|
|
172
|
-
createWithRetry(system, tools, messages, callbacks) {
|
|
173
|
-
return withRetry(() => this.anthropic.messages.create({
|
|
174
|
-
model: this.model,
|
|
175
|
-
max_tokens: this.maxTokens,
|
|
176
|
-
system,
|
|
177
|
-
tools,
|
|
178
|
-
messages,
|
|
179
|
-
}), {
|
|
180
|
-
maxAttempts: 3,
|
|
181
|
-
initialDelayMs: 2000,
|
|
182
|
-
maxDelayMs: 30_000,
|
|
183
|
-
isRetryable: isTransientError,
|
|
184
|
-
onRetry: (attempt, error, delayMs) => {
|
|
185
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
186
|
-
const isRateLimit = isRateLimitError(error);
|
|
187
|
-
const label = isRateLimit ? 'Rate limited' : 'API error';
|
|
188
|
-
callbacks.onError(`${label}, retrying in ${Math.round(delayMs / 1000)}s (attempt ${attempt + 1}/3)...`);
|
|
189
|
-
logger.warn('API call retry', { attempt, delayMs, error: msg });
|
|
190
|
-
},
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
/** Get the current model name */
|
|
194
|
-
getModel() {
|
|
195
|
-
return this.model;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
//# sourceMappingURL=client.js.map
|
package/dist/ai/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ai/client.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAC9E,qCAAqC;AACrC,iDAAiD;AACjD,4CAA4C;AAC5C,+EAA+E;AAC/E,8EAA8E;AAE9E,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AA4BlF,iEAAiE;AACjE,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAuB/B,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,OAAO,QAAQ;IACA,SAAS,CAAY;IACrB,KAAK,CAAS;IACd,SAAS,CAAS;IAEnC,YAAY,OAAwB;QAChC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,EAAE,oBAAoB;SAC9D,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,mBAAmB,CAAC;QAClD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC/C,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI,CACN,KAAa,EACb,YAA0B,EAC1B,WAAmB,EACnB,SAA0B;QAE1B,4BAA4B;QAC5B,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;QAEnC,yBAAyB;QACzB,MAAM,QAAQ,GAAsC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvF,sEAAsE;QACtE,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,mBAAmB,EAAE,SAAS,EAAE,EAAE,CAAC;YACnE,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAEnF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAEtF,sCAAsC;YACtC,MAAM,gBAAgB,GAAsC,EAAE,CAAC;YAC/D,MAAM,aAAa,GAAsC,EAAE,CAAC;YAE5D,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACnC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE7B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACxB,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACnC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACL,CAAC;YAED,mDAAmD;YACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAEhE,yDAAyD;YACzD,IAAI,QAAQ,CAAC,WAAW,KAAK,UAAU,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpE,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;oBACrC,UAAU,EAAE,SAAS,GAAG,CAAC;oBACzB,UAAU,EAAE,QAAQ,CAAC,WAAW;iBACnC,CAAC,CAAC;gBACH,OAAO;YACX,CAAC;YAED,6CAA6C;YAC7C,MAAM,WAAW,GAA8C,EAAE,CAAC;YAElE,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;gBACpC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAgC,CAAC;gBAE7D,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAEtD,MAAM,MAAM,GAAG,MAAM,WAAW,CAC5B,SAAS,CAAC,IAAI,EACd,SAA8C,EAC9C,YAAY,CACf,CAAC;gBAEF,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAElE,WAAW,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,SAAS,CAAC,EAAE;oBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,QAAQ,EAAE,MAAM,CAAC,OAAO;iBAC3B,CAAC,CAAC;YACP,CAAC;YAED,qDAAqD;YACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,SAAS,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC;IACzF,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CACf,KAAa,EACb,OAA0C,EAC1C,YAA0B,EAC1B,WAAmB,EACnB,SAA6B;QAE7B,4BAA4B;QAC5B,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;QAEnC,gDAAgD;QAChD,MAAM,QAAQ,GAAsC;YAChD,GAAG,OAAO;YACV,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;SACnC,CAAC;QAEF,gBAAgB;QAChB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,mBAAmB,EAAE,SAAS,EAAE,EAAE,CAAC;YACnE,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;gBAC5C,SAAS;gBACT,YAAY,EAAE,QAAQ,CAAC,MAAM;aAChC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAEtF,yBAAyB;YACzB,MAAM,gBAAgB,GAAsC,EAAE,CAAC;YAC/D,MAAM,aAAa,GAAsC,EAAE,CAAC;YAE5D,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACnC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE7B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACxB,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACnC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACL,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAEhE,2CAA2C;YAC3C,IAAI,QAAQ,CAAC,WAAW,KAAK,UAAU,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACpE,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE;oBACrD,UAAU,EAAE,SAAS,GAAG,CAAC;oBACzB,UAAU,EAAE,QAAQ,CAAC,WAAW;iBACnC,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC;YACpB,CAAC;YAED,qBAAqB;YACrB,MAAM,WAAW,GAA8C,EAAE,CAAC;YAElE,KAAK,MAAM,SAAS,IAAI,aAAa,EAAE,CAAC;gBACpC,MAAM,SAAS,GAAG,SAAS,CAAC,KAAgC,CAAC;gBAE7D,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAEtD,MAAM,MAAM,GAAG,MAAM,WAAW,CAC5B,SAAS,CAAC,IAAI,EACd,SAA8C,EAC9C,YAAY,CACf,CAAC;gBAEF,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBAElE,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;oBACzB,SAAS,CAAC,YAAY,CAAC;wBACnB,QAAQ,EAAE,SAAS,CAAC,IAAI;wBACxB,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;qBAC1B,CAAC,CAAC;gBACP,CAAC;gBAED,WAAW,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,aAAa;oBACnB,WAAW,EAAE,SAAS,CAAC,EAAE;oBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,QAAQ,EAAE,MAAM,CAAC,OAAO;iBAC3B,CAAC,CAAC;YACP,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,SAAS,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC;QACrF,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;OAGG;IACK,eAAe,CACnB,MAAc,EACd,KAAgC,EAChC,QAA2C,EAC3C,SAA0B;QAE1B,OAAO,SAAS,CACZ,GAAG,EAAE,CACD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,SAAS;YAC1B,MAAM;YACN,KAAK;YACL,QAAQ;SACX,CAAC,EACN;YACI,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,MAAM;YAClB,WAAW,EAAE,gBAAgB;YAC7B,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACjC,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC;gBACzD,SAAS,CAAC,OAAO,CACb,GAAG,KAAK,iBAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,OAAO,GAAG,CAAC,QAAQ,CACvF,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACpE,CAAC;SACJ,CACJ,CAAC;IACN,CAAC;IAED,iCAAiC;IACjC,QAAQ;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;CACJ"}
|