@cluesmith/codev 2.0.0-rc.47 → 2.0.0-rc.49
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/bin/af.js +2 -2
- package/bin/consult.js +1 -1
- package/dist/agent-farm/commands/start.d.ts +3 -0
- package/dist/agent-farm/commands/start.d.ts.map +1 -1
- package/dist/agent-farm/commands/start.js +65 -0
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/commands/status.d.ts +2 -0
- package/dist/agent-farm/commands/status.d.ts.map +1 -1
- package/dist/agent-farm/commands/status.js +56 -1
- package/dist/agent-farm/commands/status.js.map +1 -1
- package/dist/agent-farm/commands/stop.d.ts +6 -0
- package/dist/agent-farm/commands/stop.d.ts.map +1 -1
- package/dist/agent-farm/commands/stop.js +36 -1
- package/dist/agent-farm/commands/stop.js.map +1 -1
- package/dist/agent-farm/db/index.d.ts.map +1 -1
- package/dist/agent-farm/db/index.js +17 -0
- package/dist/agent-farm/db/index.js.map +1 -1
- package/dist/agent-farm/db/schema.d.ts +1 -1
- package/dist/agent-farm/db/schema.d.ts.map +1 -1
- package/dist/agent-farm/db/schema.js +2 -0
- package/dist/agent-farm/db/schema.js.map +1 -1
- package/dist/agent-farm/lib/tower-client.d.ts +157 -0
- package/dist/agent-farm/lib/tower-client.d.ts.map +1 -0
- package/dist/agent-farm/lib/tower-client.js +223 -0
- package/dist/agent-farm/lib/tower-client.js.map +1 -0
- package/dist/agent-farm/servers/tower-server.js +836 -224
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/commands/adopt.js +1 -1
- package/package.json +1 -1
- package/templates/tower.html +2 -2
- package/dist/agent-farm/servers/dashboard-server.d.ts +0 -7
- package/dist/agent-farm/servers/dashboard-server.d.ts.map +0 -1
- package/dist/agent-farm/servers/dashboard-server.js +0 -2181
- package/dist/agent-farm/servers/dashboard-server.js.map +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tower API Client (Spec 0090 Phase 3)
|
|
3
|
+
*
|
|
4
|
+
* Provides a client for CLI commands to interact with the tower daemon.
|
|
5
|
+
* Handles local-key authentication and common API operations.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Project info returned by tower API
|
|
9
|
+
*/
|
|
10
|
+
export interface TowerProject {
|
|
11
|
+
path: string;
|
|
12
|
+
name: string;
|
|
13
|
+
basePort: number;
|
|
14
|
+
active: boolean;
|
|
15
|
+
proxyUrl: string;
|
|
16
|
+
terminals: number;
|
|
17
|
+
lastUsed?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Project status with detailed info
|
|
21
|
+
*/
|
|
22
|
+
export interface TowerProjectStatus {
|
|
23
|
+
path: string;
|
|
24
|
+
name: string;
|
|
25
|
+
active: boolean;
|
|
26
|
+
basePort: number;
|
|
27
|
+
terminals: Array<{
|
|
28
|
+
type: 'architect' | 'builder' | 'shell';
|
|
29
|
+
id: string;
|
|
30
|
+
label: string;
|
|
31
|
+
url: string;
|
|
32
|
+
active: boolean;
|
|
33
|
+
}>;
|
|
34
|
+
gateStatus?: {
|
|
35
|
+
hasGate: boolean;
|
|
36
|
+
gateName?: string;
|
|
37
|
+
builderId?: string;
|
|
38
|
+
timestamp?: number;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Health status from tower
|
|
43
|
+
*/
|
|
44
|
+
export interface TowerHealth {
|
|
45
|
+
status: 'healthy' | 'degraded';
|
|
46
|
+
uptime: number;
|
|
47
|
+
activeProjects: number;
|
|
48
|
+
totalProjects: number;
|
|
49
|
+
memoryUsage: number;
|
|
50
|
+
timestamp: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Terminal info from tower
|
|
54
|
+
*/
|
|
55
|
+
export interface TowerTerminal {
|
|
56
|
+
id: string;
|
|
57
|
+
pid: number;
|
|
58
|
+
cols: number;
|
|
59
|
+
rows: number;
|
|
60
|
+
label: string;
|
|
61
|
+
status: 'running' | 'exited';
|
|
62
|
+
createdAt: string;
|
|
63
|
+
wsPath: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Encode a project path for use in tower API URLs
|
|
67
|
+
*/
|
|
68
|
+
export declare function encodeProjectPath(projectPath: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Decode a project path from tower API URL
|
|
71
|
+
*/
|
|
72
|
+
export declare function decodeProjectPath(encoded: string): string;
|
|
73
|
+
/**
|
|
74
|
+
* Tower API client class
|
|
75
|
+
*/
|
|
76
|
+
export declare class TowerClient {
|
|
77
|
+
private readonly baseUrl;
|
|
78
|
+
private readonly localKey;
|
|
79
|
+
constructor(port?: number);
|
|
80
|
+
/**
|
|
81
|
+
* Make a request to the tower API
|
|
82
|
+
*/
|
|
83
|
+
private request;
|
|
84
|
+
/**
|
|
85
|
+
* Check if tower is running and healthy
|
|
86
|
+
*/
|
|
87
|
+
isRunning(): Promise<boolean>;
|
|
88
|
+
/**
|
|
89
|
+
* Get tower health status
|
|
90
|
+
*/
|
|
91
|
+
getHealth(): Promise<TowerHealth | null>;
|
|
92
|
+
/**
|
|
93
|
+
* List all projects known to tower
|
|
94
|
+
*/
|
|
95
|
+
listProjects(): Promise<TowerProject[]>;
|
|
96
|
+
/**
|
|
97
|
+
* Activate a project (start its dashboard)
|
|
98
|
+
*/
|
|
99
|
+
activateProject(projectPath: string): Promise<{
|
|
100
|
+
ok: boolean;
|
|
101
|
+
adopted?: boolean;
|
|
102
|
+
error?: string;
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Deactivate a project (stop its dashboard)
|
|
106
|
+
*/
|
|
107
|
+
deactivateProject(projectPath: string): Promise<{
|
|
108
|
+
ok: boolean;
|
|
109
|
+
stopped?: number[];
|
|
110
|
+
error?: string;
|
|
111
|
+
}>;
|
|
112
|
+
/**
|
|
113
|
+
* Get status of a specific project
|
|
114
|
+
*/
|
|
115
|
+
getProjectStatus(projectPath: string): Promise<TowerProjectStatus | null>;
|
|
116
|
+
/**
|
|
117
|
+
* Create a terminal session
|
|
118
|
+
*/
|
|
119
|
+
createTerminal(options: {
|
|
120
|
+
command?: string;
|
|
121
|
+
args?: string[];
|
|
122
|
+
cols?: number;
|
|
123
|
+
rows?: number;
|
|
124
|
+
cwd?: string;
|
|
125
|
+
label?: string;
|
|
126
|
+
env?: Record<string, string>;
|
|
127
|
+
}): Promise<TowerTerminal | null>;
|
|
128
|
+
/**
|
|
129
|
+
* List all terminal sessions
|
|
130
|
+
*/
|
|
131
|
+
listTerminals(): Promise<TowerTerminal[]>;
|
|
132
|
+
/**
|
|
133
|
+
* Get terminal info
|
|
134
|
+
*/
|
|
135
|
+
getTerminal(terminalId: string): Promise<TowerTerminal | null>;
|
|
136
|
+
/**
|
|
137
|
+
* Kill a terminal session
|
|
138
|
+
*/
|
|
139
|
+
killTerminal(terminalId: string): Promise<boolean>;
|
|
140
|
+
/**
|
|
141
|
+
* Resize a terminal
|
|
142
|
+
*/
|
|
143
|
+
resizeTerminal(terminalId: string, cols: number, rows: number): Promise<TowerTerminal | null>;
|
|
144
|
+
/**
|
|
145
|
+
* Get the tower dashboard URL for a project
|
|
146
|
+
*/
|
|
147
|
+
getProjectUrl(projectPath: string): string;
|
|
148
|
+
/**
|
|
149
|
+
* Get the WebSocket URL for a terminal
|
|
150
|
+
*/
|
|
151
|
+
getTerminalWsUrl(terminalId: string): string;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Get the default tower client
|
|
155
|
+
*/
|
|
156
|
+
export declare function getTowerClient(port?: number): TowerClient;
|
|
157
|
+
//# sourceMappingURL=tower-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tower-client.d.ts","sourceRoot":"","sources":["../../../src/agent-farm/lib/tower-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tower API Client (Spec 0090 Phase 3)
|
|
3
|
+
*
|
|
4
|
+
* Provides a client for CLI commands to interact with the tower daemon.
|
|
5
|
+
* Handles local-key authentication and common API operations.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
8
|
+
import { resolve } from 'node:path';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { randomBytes } from 'node:crypto';
|
|
11
|
+
// Tower configuration
|
|
12
|
+
const DEFAULT_TOWER_PORT = 4100;
|
|
13
|
+
const AGENT_FARM_DIR = resolve(homedir(), '.agent-farm');
|
|
14
|
+
const LOCAL_KEY_PATH = resolve(AGENT_FARM_DIR, 'local-key');
|
|
15
|
+
// Request timeout
|
|
16
|
+
const REQUEST_TIMEOUT_MS = 10000;
|
|
17
|
+
/**
|
|
18
|
+
* Get or create the local key for CLI authentication
|
|
19
|
+
*/
|
|
20
|
+
function getLocalKey() {
|
|
21
|
+
if (!existsSync(AGENT_FARM_DIR)) {
|
|
22
|
+
mkdirSync(AGENT_FARM_DIR, { recursive: true, mode: 0o700 });
|
|
23
|
+
}
|
|
24
|
+
if (!existsSync(LOCAL_KEY_PATH)) {
|
|
25
|
+
const key = randomBytes(32).toString('hex');
|
|
26
|
+
writeFileSync(LOCAL_KEY_PATH, key, { mode: 0o600 });
|
|
27
|
+
return key;
|
|
28
|
+
}
|
|
29
|
+
return readFileSync(LOCAL_KEY_PATH, 'utf-8').trim();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Encode a project path for use in tower API URLs
|
|
33
|
+
*/
|
|
34
|
+
export function encodeProjectPath(projectPath) {
|
|
35
|
+
return Buffer.from(projectPath).toString('base64url');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Decode a project path from tower API URL
|
|
39
|
+
*/
|
|
40
|
+
export function decodeProjectPath(encoded) {
|
|
41
|
+
return Buffer.from(encoded, 'base64url').toString('utf-8');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Tower API client class
|
|
45
|
+
*/
|
|
46
|
+
export class TowerClient {
|
|
47
|
+
baseUrl;
|
|
48
|
+
localKey;
|
|
49
|
+
constructor(port = DEFAULT_TOWER_PORT) {
|
|
50
|
+
this.baseUrl = `http://localhost:${port}`;
|
|
51
|
+
this.localKey = getLocalKey();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Make a request to the tower API
|
|
55
|
+
*/
|
|
56
|
+
async request(path, options = {}) {
|
|
57
|
+
try {
|
|
58
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
59
|
+
...options,
|
|
60
|
+
headers: {
|
|
61
|
+
...options.headers,
|
|
62
|
+
'codev-web-key': this.localKey,
|
|
63
|
+
'Content-Type': 'application/json',
|
|
64
|
+
},
|
|
65
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const text = await response.text();
|
|
69
|
+
let error;
|
|
70
|
+
try {
|
|
71
|
+
const json = JSON.parse(text);
|
|
72
|
+
error = json.error || json.message || text;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
error = text;
|
|
76
|
+
}
|
|
77
|
+
return { ok: false, status: response.status, error };
|
|
78
|
+
}
|
|
79
|
+
if (response.status === 204) {
|
|
80
|
+
return { ok: true, status: 204 };
|
|
81
|
+
}
|
|
82
|
+
const data = (await response.json());
|
|
83
|
+
return { ok: true, status: response.status, data };
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
87
|
+
if (message.includes('ECONNREFUSED')) {
|
|
88
|
+
return { ok: false, status: 0, error: 'Tower not running' };
|
|
89
|
+
}
|
|
90
|
+
if (message.includes('timeout')) {
|
|
91
|
+
return { ok: false, status: 0, error: 'Request timeout' };
|
|
92
|
+
}
|
|
93
|
+
return { ok: false, status: 0, error: message };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if tower is running and healthy
|
|
98
|
+
*/
|
|
99
|
+
async isRunning() {
|
|
100
|
+
const result = await this.request('/health');
|
|
101
|
+
return result.ok && result.data?.status === 'healthy';
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get tower health status
|
|
105
|
+
*/
|
|
106
|
+
async getHealth() {
|
|
107
|
+
const result = await this.request('/health');
|
|
108
|
+
return result.ok ? result.data : null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* List all projects known to tower
|
|
112
|
+
*/
|
|
113
|
+
async listProjects() {
|
|
114
|
+
const result = await this.request('/api/projects');
|
|
115
|
+
return result.ok ? result.data.projects : [];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Activate a project (start its dashboard)
|
|
119
|
+
*/
|
|
120
|
+
async activateProject(projectPath) {
|
|
121
|
+
const encoded = encodeProjectPath(projectPath);
|
|
122
|
+
const result = await this.request(`/api/projects/${encoded}/activate`, { method: 'POST' });
|
|
123
|
+
if (!result.ok) {
|
|
124
|
+
return { ok: false, error: result.error };
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
ok: result.data?.success ?? true,
|
|
128
|
+
adopted: result.data?.adopted,
|
|
129
|
+
error: result.data?.error,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Deactivate a project (stop its dashboard)
|
|
134
|
+
*/
|
|
135
|
+
async deactivateProject(projectPath) {
|
|
136
|
+
const encoded = encodeProjectPath(projectPath);
|
|
137
|
+
const result = await this.request(`/api/projects/${encoded}/deactivate`, { method: 'POST' });
|
|
138
|
+
if (!result.ok) {
|
|
139
|
+
return { ok: false, error: result.error };
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
ok: result.data?.success ?? true,
|
|
143
|
+
stopped: result.data?.stopped,
|
|
144
|
+
error: result.data?.error,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get status of a specific project
|
|
149
|
+
*/
|
|
150
|
+
async getProjectStatus(projectPath) {
|
|
151
|
+
const encoded = encodeProjectPath(projectPath);
|
|
152
|
+
const result = await this.request(`/api/projects/${encoded}/status`);
|
|
153
|
+
return result.ok ? result.data : null;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Create a terminal session
|
|
157
|
+
*/
|
|
158
|
+
async createTerminal(options) {
|
|
159
|
+
const result = await this.request('/api/terminals', {
|
|
160
|
+
method: 'POST',
|
|
161
|
+
body: JSON.stringify(options),
|
|
162
|
+
});
|
|
163
|
+
return result.ok ? result.data : null;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* List all terminal sessions
|
|
167
|
+
*/
|
|
168
|
+
async listTerminals() {
|
|
169
|
+
const result = await this.request('/api/terminals');
|
|
170
|
+
return result.ok ? result.data.terminals : [];
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get terminal info
|
|
174
|
+
*/
|
|
175
|
+
async getTerminal(terminalId) {
|
|
176
|
+
const result = await this.request(`/api/terminals/${terminalId}`);
|
|
177
|
+
return result.ok ? result.data : null;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Kill a terminal session
|
|
181
|
+
*/
|
|
182
|
+
async killTerminal(terminalId) {
|
|
183
|
+
const result = await this.request(`/api/terminals/${terminalId}`, { method: 'DELETE' });
|
|
184
|
+
return result.ok;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Resize a terminal
|
|
188
|
+
*/
|
|
189
|
+
async resizeTerminal(terminalId, cols, rows) {
|
|
190
|
+
const result = await this.request(`/api/terminals/${terminalId}/resize`, {
|
|
191
|
+
method: 'POST',
|
|
192
|
+
body: JSON.stringify({ cols, rows }),
|
|
193
|
+
});
|
|
194
|
+
return result.ok ? result.data : null;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get the tower dashboard URL for a project
|
|
198
|
+
*/
|
|
199
|
+
getProjectUrl(projectPath) {
|
|
200
|
+
const encoded = encodeProjectPath(projectPath);
|
|
201
|
+
return `${this.baseUrl}/project/${encoded}/`;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get the WebSocket URL for a terminal
|
|
205
|
+
*/
|
|
206
|
+
getTerminalWsUrl(terminalId) {
|
|
207
|
+
return `ws://localhost:${new URL(this.baseUrl).port}/ws/terminal/${terminalId}`;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Default tower client instance
|
|
212
|
+
*/
|
|
213
|
+
let defaultClient = null;
|
|
214
|
+
/**
|
|
215
|
+
* Get the default tower client
|
|
216
|
+
*/
|
|
217
|
+
export function getTowerClient(port) {
|
|
218
|
+
if (!defaultClient || (port && port !== DEFAULT_TOWER_PORT)) {
|
|
219
|
+
defaultClient = new TowerClient(port);
|
|
220
|
+
}
|
|
221
|
+
return defaultClient;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=tower-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tower-client.js","sourceRoot":"","sources":["../../../src/agent-farm/lib/tower-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,sBAAsB;AACtB,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AAE5D,kBAAkB;AAClB,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAgEjC;;GAEG;AACH,SAAS,WAAW;IAClB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5C,aAAa,CAAC,cAAc,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,WAAW;IACL,OAAO,CAAS;IAChB,QAAQ,CAAS;IAElC,YAAY,OAAe,kBAAkB;QAC3C,IAAI,CAAC,OAAO,GAAG,oBAAoB,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,QAAQ,GAAG,WAAW,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO,CACnB,IAAY,EACZ,UAAuB,EAAE;QAEzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;gBACrD,GAAG,OAAO;gBACV,OAAO,EAAE;oBACP,GAAG,OAAO,CAAC,OAAO;oBAClB,eAAe,EAAE,IAAI,CAAC,QAAQ;oBAC9B,cAAc,EAAE,kBAAkB;iBACnC;gBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC;aAChD,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,IAAI,KAAa,CAAC;gBAClB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC9B,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,GAAG,IAAI,CAAC;gBACf,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;YACvD,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACnC,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;YAC9D,CAAC;YACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;YAC5D,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAc,SAAS,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAc,SAAS,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAA+B,eAAe,CAAC,CAAC;QACjF,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CACnB,WAAmB;QAEnB,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,iBAAiB,OAAO,WAAW,EACnC,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI;YAChC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO;YAC7B,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,WAAmB;QAEnB,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,iBAAiB,OAAO,aAAa,EACrC,EAAE,MAAM,EAAE,MAAM,EAAE,CACnB,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI;YAChC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO;YAC7B,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,WAAmB;QACxC,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAqB,iBAAiB,OAAO,SAAS,CAAC,CAAC;QACzF,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAQpB;QACC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAgB,gBAAgB,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAiC,gBAAgB,CAAC,CAAC;QACpF,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAgB,kBAAkB,UAAU,EAAE,CAAC,CAAC;QACjF,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,UAAkB,EAClB,IAAY,EACZ,IAAY;QAEZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAgB,kBAAkB,UAAU,SAAS,EAAE;YACtF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SACrC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,WAAmB;QAC/B,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC/C,OAAO,GAAG,IAAI,CAAC,OAAO,YAAY,OAAO,GAAG,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,UAAkB;QACjC,OAAO,kBAAkB,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,gBAAgB,UAAU,EAAE,CAAC;IAClF,CAAC;CACF;AAED;;GAEG;AACH,IAAI,aAAa,GAAuB,IAAI,CAAC;AAE7C;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAa;IAC1C,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,kBAAkB,CAAC,EAAE,CAAC;QAC5D,aAAa,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|