@saferun/cli 0.5.26 ā 0.5.28
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/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.js +439 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/setup.d.ts +47 -0
- package/dist/commands/setup.js +528 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/register-commands.js +27 -0
- package/dist/register-commands.js.map +1 -1
- package/dist/utils/credentials.d.ts +48 -0
- package/dist/utils/credentials.js +143 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/gitignore.d.ts +22 -0
- package/dist/utils/gitignore.js +105 -0
- package/dist/utils/gitignore.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SafeRun Doctor Command
|
|
3
|
+
* Health check for all SafeRun components
|
|
4
|
+
*/
|
|
5
|
+
export declare class DoctorCommand {
|
|
6
|
+
private checks;
|
|
7
|
+
run(): Promise<void>;
|
|
8
|
+
private checkApiKey;
|
|
9
|
+
private checkApiServer;
|
|
10
|
+
private checkSlack;
|
|
11
|
+
private checkGitHubApp;
|
|
12
|
+
private checkGitHooks;
|
|
13
|
+
private checkShellWrapper;
|
|
14
|
+
private checkGitignore;
|
|
15
|
+
private checkFilePermissions;
|
|
16
|
+
private printResults;
|
|
17
|
+
private fetchWithTimeout;
|
|
18
|
+
}
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SafeRun Doctor Command
|
|
4
|
+
* Health check for all SafeRun components
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.DoctorCommand = void 0;
|
|
11
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const os_1 = __importDefault(require("os"));
|
|
15
|
+
const git_1 = require("../utils/git");
|
|
16
|
+
const installer_1 = require("../hooks/installer");
|
|
17
|
+
const credentials_1 = require("../utils/credentials");
|
|
18
|
+
const gitignore_1 = require("../utils/gitignore");
|
|
19
|
+
const SAFERUN_API_URL = 'https://saferun-api.up.railway.app';
|
|
20
|
+
class DoctorCommand {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.checks = [];
|
|
23
|
+
}
|
|
24
|
+
async run() {
|
|
25
|
+
console.log(chalk_1.default.cyan('\n𩺠SafeRun Health Check\n'));
|
|
26
|
+
// Run all checks
|
|
27
|
+
await this.checkApiKey();
|
|
28
|
+
await this.checkApiServer();
|
|
29
|
+
await this.checkSlack();
|
|
30
|
+
await this.checkGitHubApp();
|
|
31
|
+
await this.checkGitHooks();
|
|
32
|
+
await this.checkShellWrapper();
|
|
33
|
+
await this.checkGitignore();
|
|
34
|
+
await this.checkFilePermissions();
|
|
35
|
+
// Print results
|
|
36
|
+
this.printResults();
|
|
37
|
+
}
|
|
38
|
+
async checkApiKey() {
|
|
39
|
+
const apiKey = await (0, credentials_1.resolveApiKey)();
|
|
40
|
+
if (!apiKey) {
|
|
41
|
+
this.checks.push({
|
|
42
|
+
name: 'API Key',
|
|
43
|
+
status: 'error',
|
|
44
|
+
message: 'Not configured',
|
|
45
|
+
detail: 'Run "saferun setup" to configure',
|
|
46
|
+
});
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Check where it came from
|
|
50
|
+
const globalCreds = await (0, credentials_1.loadGlobalCredentials)();
|
|
51
|
+
const source = process.env.SAFERUN_API_KEY
|
|
52
|
+
? 'environment variable'
|
|
53
|
+
: globalCreds.api_key
|
|
54
|
+
? 'global config (~/.saferun/credentials)'
|
|
55
|
+
: 'local config';
|
|
56
|
+
this.checks.push({
|
|
57
|
+
name: 'API Key',
|
|
58
|
+
status: 'ok',
|
|
59
|
+
message: `Configured (${(0, credentials_1.maskApiKey)(apiKey)})`,
|
|
60
|
+
detail: `Source: ${source}`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
async checkApiServer() {
|
|
64
|
+
const apiKey = await (0, credentials_1.resolveApiKey)();
|
|
65
|
+
try {
|
|
66
|
+
const response = await this.fetchWithTimeout(`${SAFERUN_API_URL}/health`, 5000);
|
|
67
|
+
const data = await response.json();
|
|
68
|
+
this.checks.push({
|
|
69
|
+
name: 'API Server',
|
|
70
|
+
status: 'ok',
|
|
71
|
+
message: `Reachable (v${data.version || 'unknown'})`,
|
|
72
|
+
detail: SAFERUN_API_URL,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
this.checks.push({
|
|
77
|
+
name: 'API Server',
|
|
78
|
+
status: 'error',
|
|
79
|
+
message: 'Unreachable',
|
|
80
|
+
detail: `${SAFERUN_API_URL} - ${err}`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async checkSlack() {
|
|
85
|
+
const apiKey = await (0, credentials_1.resolveApiKey)();
|
|
86
|
+
if (!apiKey) {
|
|
87
|
+
this.checks.push({
|
|
88
|
+
name: 'Slack',
|
|
89
|
+
status: 'skip',
|
|
90
|
+
message: 'Skipped (no API key)',
|
|
91
|
+
});
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const response = await fetch(`${SAFERUN_API_URL}/v1/settings/notifications`, {
|
|
96
|
+
headers: { 'X-API-Key': apiKey },
|
|
97
|
+
});
|
|
98
|
+
if (response.ok) {
|
|
99
|
+
const data = await response.json();
|
|
100
|
+
if (data.slack_enabled) {
|
|
101
|
+
this.checks.push({
|
|
102
|
+
name: 'Slack',
|
|
103
|
+
status: 'ok',
|
|
104
|
+
message: `Connected (${data.slack_channel || 'webhook'})`,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
this.checks.push({
|
|
109
|
+
name: 'Slack',
|
|
110
|
+
status: 'warn',
|
|
111
|
+
message: 'Not configured',
|
|
112
|
+
detail: 'Run "saferun config slack" to configure',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else if (response.status === 404) {
|
|
117
|
+
this.checks.push({
|
|
118
|
+
name: 'Slack',
|
|
119
|
+
status: 'warn',
|
|
120
|
+
message: 'Not configured',
|
|
121
|
+
detail: 'Run "saferun config slack" to configure',
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.checks.push({
|
|
126
|
+
name: 'Slack',
|
|
127
|
+
status: 'error',
|
|
128
|
+
message: `API error (${response.status})`,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
this.checks.push({
|
|
134
|
+
name: 'Slack',
|
|
135
|
+
status: 'error',
|
|
136
|
+
message: 'Could not check status',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async checkGitHubApp() {
|
|
141
|
+
const apiKey = await (0, credentials_1.resolveApiKey)();
|
|
142
|
+
if (!apiKey) {
|
|
143
|
+
this.checks.push({
|
|
144
|
+
name: 'GitHub App',
|
|
145
|
+
status: 'skip',
|
|
146
|
+
message: 'Skipped (no API key)',
|
|
147
|
+
});
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// We can't directly check if GitHub App is installed without repo context
|
|
151
|
+
// For now, just indicate it needs manual verification
|
|
152
|
+
const isRepo = await (0, git_1.isGitRepository)();
|
|
153
|
+
if (!isRepo) {
|
|
154
|
+
this.checks.push({
|
|
155
|
+
name: 'GitHub App',
|
|
156
|
+
status: 'skip',
|
|
157
|
+
message: 'Not in a git repository',
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const gitInfo = await (0, git_1.getGitInfo)();
|
|
162
|
+
if (!(gitInfo === null || gitInfo === void 0 ? void 0 : gitInfo.repoSlug)) {
|
|
163
|
+
this.checks.push({
|
|
164
|
+
name: 'GitHub App',
|
|
165
|
+
status: 'warn',
|
|
166
|
+
message: 'Could not determine repository',
|
|
167
|
+
});
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
// Try to check via API if we have webhook configured for this repo
|
|
171
|
+
try {
|
|
172
|
+
const response = await fetch(`${SAFERUN_API_URL}/v1/settings`, {
|
|
173
|
+
headers: { 'X-API-Key': apiKey },
|
|
174
|
+
});
|
|
175
|
+
if (response.ok) {
|
|
176
|
+
const data = await response.json();
|
|
177
|
+
// Check if this repo has webhooks
|
|
178
|
+
if (data.github_app_installed || data.webhooks_enabled) {
|
|
179
|
+
this.checks.push({
|
|
180
|
+
name: 'GitHub App',
|
|
181
|
+
status: 'ok',
|
|
182
|
+
message: `Installed on ${gitInfo.repoSlug}`,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
this.checks.push({
|
|
187
|
+
name: 'GitHub App',
|
|
188
|
+
status: 'warn',
|
|
189
|
+
message: 'Not detected',
|
|
190
|
+
detail: 'Install at github.com/apps/saferun-ai',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
this.checks.push({
|
|
196
|
+
name: 'GitHub App',
|
|
197
|
+
status: 'warn',
|
|
198
|
+
message: 'Could not verify',
|
|
199
|
+
detail: 'Check github.com/apps/saferun-ai',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
this.checks.push({
|
|
205
|
+
name: 'GitHub App',
|
|
206
|
+
status: 'warn',
|
|
207
|
+
message: 'Could not verify',
|
|
208
|
+
detail: 'Check github.com/apps/saferun-ai',
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async checkGitHooks() {
|
|
213
|
+
var _a;
|
|
214
|
+
const isRepo = await (0, git_1.isGitRepository)();
|
|
215
|
+
if (!isRepo) {
|
|
216
|
+
this.checks.push({
|
|
217
|
+
name: 'Git Hooks',
|
|
218
|
+
status: 'skip',
|
|
219
|
+
message: 'Not in a git repository',
|
|
220
|
+
});
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const gitInfo = await (0, git_1.getGitInfo)();
|
|
224
|
+
if (!gitInfo) {
|
|
225
|
+
this.checks.push({
|
|
226
|
+
name: 'Git Hooks',
|
|
227
|
+
status: 'error',
|
|
228
|
+
message: 'Could not get git info',
|
|
229
|
+
});
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const manifest = await (0, installer_1.loadManifest)(gitInfo.repoRoot);
|
|
233
|
+
const hooks = await (0, git_1.listHooks)(gitInfo.gitDir);
|
|
234
|
+
if ((_a = manifest === null || manifest === void 0 ? void 0 : manifest.hooks) === null || _a === void 0 ? void 0 : _a.length) {
|
|
235
|
+
const saferunHooks = hooks.filter(h => manifest.hooks.some((m) => m.name === h));
|
|
236
|
+
this.checks.push({
|
|
237
|
+
name: 'Git Hooks',
|
|
238
|
+
status: 'ok',
|
|
239
|
+
message: `${saferunHooks.length} SafeRun hooks installed`,
|
|
240
|
+
detail: saferunHooks.join(', '),
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
else if (hooks.length > 0) {
|
|
244
|
+
this.checks.push({
|
|
245
|
+
name: 'Git Hooks',
|
|
246
|
+
status: 'warn',
|
|
247
|
+
message: 'Hooks exist but SafeRun not initialized',
|
|
248
|
+
detail: 'Run "saferun init" to install protection',
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
this.checks.push({
|
|
253
|
+
name: 'Git Hooks',
|
|
254
|
+
status: 'error',
|
|
255
|
+
message: 'No hooks installed',
|
|
256
|
+
detail: 'Run "saferun init" to install protection',
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async checkShellWrapper() {
|
|
261
|
+
// Check if shell wrapper is in ~/.zshrc or ~/.bashrc
|
|
262
|
+
const home = os_1.default.homedir();
|
|
263
|
+
const shellFiles = [
|
|
264
|
+
path_1.default.join(home, '.zshrc'),
|
|
265
|
+
path_1.default.join(home, '.bashrc'),
|
|
266
|
+
path_1.default.join(home, '.bash_profile'),
|
|
267
|
+
];
|
|
268
|
+
let found = false;
|
|
269
|
+
let shellFile = '';
|
|
270
|
+
for (const file of shellFiles) {
|
|
271
|
+
if (fs_1.default.existsSync(file)) {
|
|
272
|
+
try {
|
|
273
|
+
const content = await fs_1.default.promises.readFile(file, 'utf-8');
|
|
274
|
+
if (content.includes('saferun_git_wrapper') || content.includes('# SafeRun shell')) {
|
|
275
|
+
found = true;
|
|
276
|
+
shellFile = path_1.default.basename(file);
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
// Ignore read errors
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
if (found) {
|
|
286
|
+
this.checks.push({
|
|
287
|
+
name: 'Shell Wrapper',
|
|
288
|
+
status: 'ok',
|
|
289
|
+
message: `Active (${shellFile})`,
|
|
290
|
+
detail: 'Intercepts git commands in protected repos',
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
this.checks.push({
|
|
295
|
+
name: 'Shell Wrapper',
|
|
296
|
+
status: 'warn',
|
|
297
|
+
message: 'Not configured',
|
|
298
|
+
detail: 'Run "saferun shell-init --auto" for extra protection',
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
async checkGitignore() {
|
|
303
|
+
const isRepo = await (0, git_1.isGitRepository)();
|
|
304
|
+
if (!isRepo) {
|
|
305
|
+
this.checks.push({
|
|
306
|
+
name: '.gitignore',
|
|
307
|
+
status: 'skip',
|
|
308
|
+
message: 'Not in a git repository',
|
|
309
|
+
});
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const gitInfo = await (0, git_1.getGitInfo)();
|
|
313
|
+
if (!gitInfo) {
|
|
314
|
+
this.checks.push({
|
|
315
|
+
name: '.gitignore',
|
|
316
|
+
status: 'skip',
|
|
317
|
+
message: 'Could not get git info',
|
|
318
|
+
});
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
const result = await (0, gitignore_1.checkGitignore)(gitInfo.repoRoot);
|
|
322
|
+
if (result.hasSaferunEntries) {
|
|
323
|
+
this.checks.push({
|
|
324
|
+
name: '.gitignore',
|
|
325
|
+
status: 'ok',
|
|
326
|
+
message: 'Credentials excluded',
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
else if (result.exists) {
|
|
330
|
+
this.checks.push({
|
|
331
|
+
name: '.gitignore',
|
|
332
|
+
status: 'warn',
|
|
333
|
+
message: 'Missing SafeRun entries',
|
|
334
|
+
detail: 'Run "saferun setup" to add entries',
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
this.checks.push({
|
|
339
|
+
name: '.gitignore',
|
|
340
|
+
status: 'warn',
|
|
341
|
+
message: 'No .gitignore file',
|
|
342
|
+
detail: 'Run "saferun setup" to create',
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
async checkFilePermissions() {
|
|
347
|
+
const credentialsPath = (0, credentials_1.getCredentialsPath)();
|
|
348
|
+
if (!fs_1.default.existsSync(credentialsPath)) {
|
|
349
|
+
// Not an error - might use env var
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
try {
|
|
353
|
+
const stats = await fs_1.default.promises.stat(credentialsPath);
|
|
354
|
+
const mode = (stats.mode & 0o777).toString(8);
|
|
355
|
+
if (mode === '600') {
|
|
356
|
+
this.checks.push({
|
|
357
|
+
name: 'File Permissions',
|
|
358
|
+
status: 'ok',
|
|
359
|
+
message: 'Credentials secured (600)',
|
|
360
|
+
detail: credentialsPath,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
this.checks.push({
|
|
365
|
+
name: 'File Permissions',
|
|
366
|
+
status: 'warn',
|
|
367
|
+
message: `Credentials file has mode ${mode}`,
|
|
368
|
+
detail: `Expected 600, got ${mode}. Run: chmod 600 ${credentialsPath}`,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
// Ignore errors
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
printResults() {
|
|
377
|
+
let hasErrors = false;
|
|
378
|
+
let hasWarnings = false;
|
|
379
|
+
for (const check of this.checks) {
|
|
380
|
+
let statusIcon;
|
|
381
|
+
let statusColor;
|
|
382
|
+
switch (check.status) {
|
|
383
|
+
case 'ok':
|
|
384
|
+
statusIcon = 'ā';
|
|
385
|
+
statusColor = chalk_1.default.green;
|
|
386
|
+
break;
|
|
387
|
+
case 'warn':
|
|
388
|
+
statusIcon = 'ā ';
|
|
389
|
+
statusColor = chalk_1.default.yellow;
|
|
390
|
+
hasWarnings = true;
|
|
391
|
+
break;
|
|
392
|
+
case 'error':
|
|
393
|
+
statusIcon = 'ā';
|
|
394
|
+
statusColor = chalk_1.default.red;
|
|
395
|
+
hasErrors = true;
|
|
396
|
+
break;
|
|
397
|
+
case 'skip':
|
|
398
|
+
statusIcon = 'ā';
|
|
399
|
+
statusColor = chalk_1.default.gray;
|
|
400
|
+
break;
|
|
401
|
+
default:
|
|
402
|
+
statusIcon = '?';
|
|
403
|
+
statusColor = chalk_1.default.white;
|
|
404
|
+
}
|
|
405
|
+
console.log(`${statusColor(statusIcon)} ${chalk_1.default.bold(check.name)}`);
|
|
406
|
+
console.log(` ${check.message}`);
|
|
407
|
+
if (check.detail) {
|
|
408
|
+
console.log(chalk_1.default.gray(` ${check.detail}`));
|
|
409
|
+
}
|
|
410
|
+
console.log('');
|
|
411
|
+
}
|
|
412
|
+
console.log(chalk_1.default.gray('ā'.repeat(50)));
|
|
413
|
+
if (hasErrors) {
|
|
414
|
+
console.log(chalk_1.default.red('\nā Some checks failed. Run "saferun setup" to fix.\n'));
|
|
415
|
+
process.exitCode = 1;
|
|
416
|
+
}
|
|
417
|
+
else if (hasWarnings) {
|
|
418
|
+
console.log(chalk_1.default.yellow('\nā ļø Some warnings. Protection may be incomplete.\n'));
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
console.log(chalk_1.default.green('\nā
All systems operational!\n'));
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
async fetchWithTimeout(url, timeout) {
|
|
425
|
+
const controller = new AbortController();
|
|
426
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
427
|
+
try {
|
|
428
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
429
|
+
clearTimeout(timeoutId);
|
|
430
|
+
return response;
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
clearTimeout(timeoutId);
|
|
434
|
+
throw err;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
exports.DoctorCommand = DoctorCommand;
|
|
439
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;AAEH,kDAA0B;AAE1B,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,sCAAsE;AAEtE,kDAAkD;AAClD,sDAM8B;AAC9B,kDAAoD;AAEpD,MAAM,eAAe,GAAG,oCAAoC,CAAC;AAS7D,MAAa,aAAa;IAA1B;QACU,WAAM,GAAkB,EAAE,CAAC;IA6brC,CAAC;IA3bC,KAAK,CAAC,GAAG;QACP,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAEvD,iBAAiB;QACjB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAElC,gBAAgB;QAChB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAa,GAAE,CAAC;QAErC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,gBAAgB;gBACzB,MAAM,EAAE,kCAAkC;aAC3C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,2BAA2B;QAC3B,MAAM,WAAW,GAAG,MAAM,IAAA,mCAAqB,GAAE,CAAC;QAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe;YACxC,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,WAAW,CAAC,OAAO;gBACnB,CAAC,CAAC,wCAAwC;gBAC1C,CAAC,CAAC,cAAc,CAAC;QAErB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,eAAe,IAAA,wBAAU,EAAC,MAAM,CAAC,GAAG;YAC7C,MAAM,EAAE,WAAW,MAAM,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAa,GAAE,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,eAAe,SAAS,EAAE,IAAI,CAAC,CAAC;YAChF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,eAAe,IAAI,CAAC,OAAO,IAAI,SAAS,GAAG;gBACpD,MAAM,EAAE,eAAe;aACxB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,aAAa;gBACtB,MAAM,EAAE,GAAG,eAAe,MAAM,GAAG,EAAE;aACtC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAa,GAAE,CAAC;QAErC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,eAAe,4BAA4B,EAAE;gBAC3E,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;aACjC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,IAAI;wBACZ,OAAO,EAAE,cAAc,IAAI,CAAC,aAAa,IAAI,SAAS,GAAG;qBAC1D,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,gBAAgB;wBACzB,MAAM,EAAE,yCAAyC;qBAClD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,gBAAgB;oBACzB,MAAM,EAAE,yCAAyC;iBAClD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE,cAAc,QAAQ,CAAC,MAAM,GAAG;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,wBAAwB;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAa,GAAE,CAAC;QAErC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,0EAA0E;QAC1E,sDAAsD;QACtD,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAe,GAAE,CAAC;QAEvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAA,gBAAU,GAAE,CAAC;QACnC,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAA,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,eAAe,cAAc,EAAE;gBAC7D,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;aACjC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,kCAAkC;gBAClC,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,IAAI;wBACZ,OAAO,EAAE,gBAAgB,OAAO,CAAC,QAAQ,EAAE;qBAC5C,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,cAAc;wBACvB,MAAM,EAAE,uCAAuC;qBAChD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,YAAY;oBAClB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,kBAAkB;oBAC3B,MAAM,EAAE,kCAAkC;iBAC3C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,kBAAkB;gBAC3B,MAAM,EAAE,kCAAkC;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa;;QACzB,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAe,GAAE,CAAC;QAEvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAA,gBAAU,GAAE,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,wBAAwB;aAClC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAY,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,MAAM,IAAA,eAAS,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,0CAAE,MAAM,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACpC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAC9C,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,0BAA0B;gBACzD,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;aAChC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yCAAyC;gBAClD,MAAM,EAAE,0CAA0C;aACnD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,oBAAoB;gBAC7B,MAAM,EAAE,0CAA0C;aACnD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,qDAAqD;QACrD,MAAM,IAAI,GAAG,YAAE,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG;YACjB,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;YACzB,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;YAC1B,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;SACjC,CAAC;QAEF,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,SAAS,GAAG,EAAE,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;oBAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;wBACnF,KAAK,GAAG,IAAI,CAAC;wBACb,SAAS,GAAG,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAChC,MAAM;oBACR,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,qBAAqB;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,WAAW,SAAS,GAAG;gBAChC,MAAM,EAAE,4CAA4C;aACrD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,eAAe;gBACrB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,gBAAgB;gBACzB,MAAM,EAAE,sDAAsD;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAe,GAAE,CAAC;QAEvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yBAAyB;aACnC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAA,gBAAU,GAAE,CAAC;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,wBAAwB;aAClC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAc,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,yBAAyB;gBAClC,MAAM,EAAE,oCAAoC;aAC7C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,oBAAoB;gBAC7B,MAAM,EAAE,+BAA+B;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,MAAM,eAAe,GAAG,IAAA,gCAAkB,GAAE,CAAC;QAE7C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,mCAAmC;YACnC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAE9C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,2BAA2B;oBACpC,MAAM,EAAE,eAAe;iBACxB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,kBAAkB;oBACxB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,6BAA6B,IAAI,EAAE;oBAC5C,MAAM,EAAE,qBAAqB,IAAI,oBAAoB,eAAe,EAAE;iBACvE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,UAAkB,CAAC;YACvB,IAAI,WAAkC,CAAC;YAEvC,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrB,KAAK,IAAI;oBACP,UAAU,GAAG,GAAG,CAAC;oBACjB,WAAW,GAAG,eAAK,CAAC,KAAK,CAAC;oBAC1B,MAAM;gBACR,KAAK,MAAM;oBACT,UAAU,GAAG,GAAG,CAAC;oBACjB,WAAW,GAAG,eAAK,CAAC,MAAM,CAAC;oBAC3B,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;gBACR,KAAK,OAAO;oBACV,UAAU,GAAG,GAAG,CAAC;oBACjB,WAAW,GAAG,eAAK,CAAC,GAAG,CAAC;oBACxB,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM;gBACR,KAAK,MAAM;oBACT,UAAU,GAAG,GAAG,CAAC;oBACjB,WAAW,GAAG,eAAK,CAAC,IAAI,CAAC;oBACzB,MAAM;gBACR;oBACE,UAAU,GAAG,GAAG,CAAC;oBACjB,WAAW,GAAG,eAAK,CAAC,KAAK,CAAC;YAC9B,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,WAAW,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,GAAW,EAAE,OAAe;QACzD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACjE,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF;AA9bD,sCA8bC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SafeRun Setup Wizard
|
|
3
|
+
* Complete onboarding in one command: API Key ā Slack ā GitHub App ā Repo Setup
|
|
4
|
+
*/
|
|
5
|
+
interface SetupOptions {
|
|
6
|
+
skipSlack?: boolean;
|
|
7
|
+
skipGithub?: boolean;
|
|
8
|
+
apiKey?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class SetupCommand {
|
|
11
|
+
private apiKey?;
|
|
12
|
+
private slackConfigured;
|
|
13
|
+
private githubAppInstalled;
|
|
14
|
+
private repoInitialized;
|
|
15
|
+
private protectionMode;
|
|
16
|
+
run(options?: SetupOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Step 1: Configure API Key
|
|
19
|
+
*/
|
|
20
|
+
private stepApiKey;
|
|
21
|
+
/**
|
|
22
|
+
* Step 2: Configure Slack notifications
|
|
23
|
+
*/
|
|
24
|
+
private stepSlack;
|
|
25
|
+
/**
|
|
26
|
+
* Step 3: Install GitHub App
|
|
27
|
+
*/
|
|
28
|
+
private stepGitHubApp;
|
|
29
|
+
/**
|
|
30
|
+
* Step 4: Initialize repository
|
|
31
|
+
*/
|
|
32
|
+
private stepRepoSetup;
|
|
33
|
+
/**
|
|
34
|
+
* Step 5: Select Protection Mode
|
|
35
|
+
*/
|
|
36
|
+
private stepProtectionMode;
|
|
37
|
+
/**
|
|
38
|
+
* Print setup summary
|
|
39
|
+
*/
|
|
40
|
+
private printSummary;
|
|
41
|
+
private openBrowser;
|
|
42
|
+
private validateApiKey;
|
|
43
|
+
private checkSlackStatus;
|
|
44
|
+
private configureSlack;
|
|
45
|
+
private sendTestSlack;
|
|
46
|
+
}
|
|
47
|
+
export {};
|