@marktoflow/cli 2.0.0-alpha.7 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -456
- package/dist/commands/dry-run.d.ts +1 -0
- package/dist/commands/dry-run.d.ts.map +1 -1
- package/dist/commands/dry-run.js +161 -25
- package/dist/commands/dry-run.js.map +1 -1
- package/dist/commands/history.d.ts +18 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +258 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/test-connection.d.ts +26 -0
- package/dist/commands/test-connection.d.ts.map +1 -0
- package/dist/commands/test-connection.js +599 -0
- package/dist/commands/test-connection.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +575 -32
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +8 -2
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +191 -16
- package/dist/oauth.js.map +1 -1
- package/dist/serve.d.ts +3 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/serve.js +453 -0
- package/dist/serve.js.map +1 -0
- package/dist/utils/agent-override.d.ts +43 -0
- package/dist/utils/agent-override.d.ts.map +1 -0
- package/dist/utils/agent-override.js +90 -0
- package/dist/utils/agent-override.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/input-parser.d.ts +37 -0
- package/dist/utils/input-parser.d.ts.map +1 -0
- package/dist/utils/input-parser.js +80 -0
- package/dist/utils/input-parser.js.map +1 -0
- package/package.json +12 -8
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Connection Command
|
|
3
|
+
*
|
|
4
|
+
* Validates service credentials and makes minimal API calls to verify
|
|
5
|
+
* that configured services are reachable and properly authenticated.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import ora from 'ora';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Credential Validation
|
|
11
|
+
// ============================================================================
|
|
12
|
+
function validateCredentialFormat(value, def) {
|
|
13
|
+
if (!def.prefix)
|
|
14
|
+
return { valid: true };
|
|
15
|
+
if (!value.startsWith(def.prefix)) {
|
|
16
|
+
return {
|
|
17
|
+
valid: false,
|
|
18
|
+
issue: `Expected value to start with "${def.prefix}" but got "${value.substring(0, Math.min(8, value.length))}..."`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return { valid: true };
|
|
22
|
+
}
|
|
23
|
+
function resolveEnvVar(name) {
|
|
24
|
+
return process.env[name];
|
|
25
|
+
}
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Service Definitions
|
|
28
|
+
// ============================================================================
|
|
29
|
+
const SERVICES = {
|
|
30
|
+
slack: {
|
|
31
|
+
name: 'Slack',
|
|
32
|
+
envVars: [
|
|
33
|
+
{
|
|
34
|
+
name: 'SLACK_BOT_TOKEN',
|
|
35
|
+
label: 'Bot Token',
|
|
36
|
+
required: true,
|
|
37
|
+
prefix: 'xoxb-',
|
|
38
|
+
helpUrl: 'https://api.slack.com/apps',
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
testConnection: async (creds) => {
|
|
42
|
+
const token = creds['SLACK_BOT_TOKEN'];
|
|
43
|
+
const response = await fetch('https://slack.com/api/auth.test', {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: {
|
|
46
|
+
Authorization: `Bearer ${token}`,
|
|
47
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
const data = (await response.json());
|
|
51
|
+
if (data.ok) {
|
|
52
|
+
return {
|
|
53
|
+
success: true,
|
|
54
|
+
message: `Authenticated as ${data.user} in workspace ${data.team}`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
message: `Auth failed: ${data.error}`,
|
|
60
|
+
details: getSlackErrorHelp(data.error ?? 'unknown'),
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
github: {
|
|
65
|
+
name: 'GitHub',
|
|
66
|
+
envVars: [
|
|
67
|
+
{
|
|
68
|
+
name: 'GITHUB_TOKEN',
|
|
69
|
+
label: 'Personal Access Token',
|
|
70
|
+
required: true,
|
|
71
|
+
prefix: 'gh',
|
|
72
|
+
helpUrl: 'https://github.com/settings/tokens',
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
testConnection: async (creds) => {
|
|
76
|
+
const token = creds['GITHUB_TOKEN'];
|
|
77
|
+
const response = await fetch('https://api.github.com/user', {
|
|
78
|
+
headers: {
|
|
79
|
+
Authorization: `Bearer ${token}`,
|
|
80
|
+
Accept: 'application/vnd.github.v3+json',
|
|
81
|
+
'User-Agent': 'marktoflow-cli',
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
if (response.ok) {
|
|
85
|
+
const data = (await response.json());
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
message: `Authenticated as ${data.login}${data.name ? ` (${data.name})` : ''}`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (response.status === 401) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
message: 'Invalid or expired token',
|
|
95
|
+
details: 'Create a new token at https://github.com/settings/tokens',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
success: false,
|
|
100
|
+
message: `API returned ${response.status} ${response.statusText}`,
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
gmail: {
|
|
105
|
+
name: 'Gmail',
|
|
106
|
+
envVars: [
|
|
107
|
+
{
|
|
108
|
+
name: 'GOOGLE_CLIENT_ID',
|
|
109
|
+
label: 'Client ID',
|
|
110
|
+
required: true,
|
|
111
|
+
helpUrl: 'https://console.cloud.google.com/',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'GOOGLE_CLIENT_SECRET',
|
|
115
|
+
label: 'Client Secret',
|
|
116
|
+
required: true,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'GMAIL_REFRESH_TOKEN',
|
|
120
|
+
label: 'Refresh Token',
|
|
121
|
+
required: true,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
testConnection: async (creds) => {
|
|
125
|
+
// First, exchange refresh token for access token
|
|
126
|
+
const tokenResponse = await fetch('https://oauth2.googleapis.com/token', {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
129
|
+
body: new URLSearchParams({
|
|
130
|
+
client_id: creds['GOOGLE_CLIENT_ID'],
|
|
131
|
+
client_secret: creds['GOOGLE_CLIENT_SECRET'],
|
|
132
|
+
refresh_token: creds['GMAIL_REFRESH_TOKEN'],
|
|
133
|
+
grant_type: 'refresh_token',
|
|
134
|
+
}),
|
|
135
|
+
});
|
|
136
|
+
if (!tokenResponse.ok) {
|
|
137
|
+
const error = (await tokenResponse.json());
|
|
138
|
+
return {
|
|
139
|
+
success: false,
|
|
140
|
+
message: `Token refresh failed: ${error.error_description ?? 'unknown error'}`,
|
|
141
|
+
details: 'Run "marktoflow connect gmail" to re-authenticate',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
const tokens = (await tokenResponse.json());
|
|
145
|
+
// Test with profile endpoint
|
|
146
|
+
const profileResponse = await fetch('https://gmail.googleapis.com/gmail/v1/users/me/profile', {
|
|
147
|
+
headers: { Authorization: `Bearer ${tokens.access_token}` },
|
|
148
|
+
});
|
|
149
|
+
if (profileResponse.ok) {
|
|
150
|
+
const profile = (await profileResponse.json());
|
|
151
|
+
return {
|
|
152
|
+
success: true,
|
|
153
|
+
message: `Authenticated as ${profile.emailAddress}`,
|
|
154
|
+
details: profile.messagesTotal ? `${profile.messagesTotal} total messages` : undefined,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
message: `Profile request failed: ${profileResponse.status}`,
|
|
160
|
+
details: 'Ensure Gmail API is enabled in Google Cloud Console',
|
|
161
|
+
};
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
notion: {
|
|
165
|
+
name: 'Notion',
|
|
166
|
+
envVars: [
|
|
167
|
+
{
|
|
168
|
+
name: 'NOTION_TOKEN',
|
|
169
|
+
label: 'Integration Token',
|
|
170
|
+
required: true,
|
|
171
|
+
prefix: 'secret_',
|
|
172
|
+
helpUrl: 'https://www.notion.so/my-integrations',
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
testConnection: async (creds) => {
|
|
176
|
+
const token = creds['NOTION_TOKEN'];
|
|
177
|
+
const response = await fetch('https://api.notion.com/v1/search', {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
Authorization: `Bearer ${token}`,
|
|
181
|
+
'Content-Type': 'application/json',
|
|
182
|
+
'Notion-Version': '2022-06-28',
|
|
183
|
+
},
|
|
184
|
+
body: JSON.stringify({ query: '', page_size: 1 }),
|
|
185
|
+
});
|
|
186
|
+
if (response.ok) {
|
|
187
|
+
const data = (await response.json());
|
|
188
|
+
return {
|
|
189
|
+
success: true,
|
|
190
|
+
message: `Connected to Notion`,
|
|
191
|
+
details: `Found ${data.results.length} accessible page(s) in test query`,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
if (response.status === 401) {
|
|
195
|
+
return {
|
|
196
|
+
success: false,
|
|
197
|
+
message: 'Invalid integration token',
|
|
198
|
+
details: 'Create a new integration at https://www.notion.so/my-integrations',
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
success: false,
|
|
203
|
+
message: `API returned ${response.status} ${response.statusText}`,
|
|
204
|
+
};
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
jira: {
|
|
208
|
+
name: 'Jira',
|
|
209
|
+
envVars: [
|
|
210
|
+
{
|
|
211
|
+
name: 'JIRA_HOST',
|
|
212
|
+
label: 'Jira Host URL',
|
|
213
|
+
required: true,
|
|
214
|
+
helpUrl: 'https://id.atlassian.com/manage-profile/security/api-tokens',
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
name: 'JIRA_EMAIL',
|
|
218
|
+
label: 'Email Address',
|
|
219
|
+
required: true,
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: 'JIRA_API_TOKEN',
|
|
223
|
+
label: 'API Token',
|
|
224
|
+
required: true,
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
testConnection: async (creds) => {
|
|
228
|
+
const host = creds['JIRA_HOST'].replace(/\/$/, '');
|
|
229
|
+
const email = creds['JIRA_EMAIL'];
|
|
230
|
+
const apiToken = creds['JIRA_API_TOKEN'];
|
|
231
|
+
const encoded = Buffer.from(`${email}:${apiToken}`).toString('base64');
|
|
232
|
+
const response = await fetch(`${host}/rest/api/3/myself`, {
|
|
233
|
+
headers: {
|
|
234
|
+
Authorization: `Basic ${encoded}`,
|
|
235
|
+
Accept: 'application/json',
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
if (response.ok) {
|
|
239
|
+
const data = (await response.json());
|
|
240
|
+
return {
|
|
241
|
+
success: true,
|
|
242
|
+
message: `Authenticated as ${data.displayName} (${data.emailAddress})`,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
if (response.status === 401) {
|
|
246
|
+
return {
|
|
247
|
+
success: false,
|
|
248
|
+
message: 'Invalid email or API token',
|
|
249
|
+
details: 'Create a new API token at https://id.atlassian.com/manage-profile/security/api-tokens',
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
if (response.status === 403) {
|
|
253
|
+
return {
|
|
254
|
+
success: false,
|
|
255
|
+
message: 'Access denied - check that your API token has sufficient permissions',
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
success: false,
|
|
260
|
+
message: `API returned ${response.status} ${response.statusText}`,
|
|
261
|
+
};
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
linear: {
|
|
265
|
+
name: 'Linear',
|
|
266
|
+
envVars: [
|
|
267
|
+
{
|
|
268
|
+
name: 'LINEAR_API_KEY',
|
|
269
|
+
label: 'API Key',
|
|
270
|
+
required: true,
|
|
271
|
+
prefix: 'lin_api_',
|
|
272
|
+
helpUrl: 'https://linear.app/settings/api',
|
|
273
|
+
},
|
|
274
|
+
],
|
|
275
|
+
testConnection: async (creds) => {
|
|
276
|
+
const apiKey = creds['LINEAR_API_KEY'];
|
|
277
|
+
const response = await fetch('https://api.linear.app/graphql', {
|
|
278
|
+
method: 'POST',
|
|
279
|
+
headers: {
|
|
280
|
+
Authorization: apiKey,
|
|
281
|
+
'Content-Type': 'application/json',
|
|
282
|
+
},
|
|
283
|
+
body: JSON.stringify({
|
|
284
|
+
query: '{ viewer { id name email } }',
|
|
285
|
+
}),
|
|
286
|
+
});
|
|
287
|
+
if (response.ok) {
|
|
288
|
+
const data = (await response.json());
|
|
289
|
+
if (data.data?.viewer) {
|
|
290
|
+
return {
|
|
291
|
+
success: true,
|
|
292
|
+
message: `Authenticated as ${data.data.viewer.name} (${data.data.viewer.email})`,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
if (data.errors && data.errors.length > 0) {
|
|
296
|
+
return {
|
|
297
|
+
success: false,
|
|
298
|
+
message: `GraphQL error: ${data.errors[0].message}`,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (response.status === 401) {
|
|
303
|
+
return {
|
|
304
|
+
success: false,
|
|
305
|
+
message: 'Invalid API key',
|
|
306
|
+
details: 'Create a new API key at https://linear.app/settings/api',
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
success: false,
|
|
311
|
+
message: `API returned ${response.status} ${response.statusText}`,
|
|
312
|
+
};
|
|
313
|
+
},
|
|
314
|
+
},
|
|
315
|
+
discord: {
|
|
316
|
+
name: 'Discord',
|
|
317
|
+
envVars: [
|
|
318
|
+
{
|
|
319
|
+
name: 'DISCORD_BOT_TOKEN',
|
|
320
|
+
label: 'Bot Token',
|
|
321
|
+
required: true,
|
|
322
|
+
helpUrl: 'https://discord.com/developers/applications',
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
testConnection: async (creds) => {
|
|
326
|
+
const token = creds['DISCORD_BOT_TOKEN'];
|
|
327
|
+
const response = await fetch('https://discord.com/api/v10/users/@me', {
|
|
328
|
+
headers: {
|
|
329
|
+
Authorization: `Bot ${token}`,
|
|
330
|
+
},
|
|
331
|
+
});
|
|
332
|
+
if (response.ok) {
|
|
333
|
+
const data = (await response.json());
|
|
334
|
+
return {
|
|
335
|
+
success: true,
|
|
336
|
+
message: `Authenticated as ${data.username}#${data.discriminator} (ID: ${data.id})`,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
if (response.status === 401) {
|
|
340
|
+
return {
|
|
341
|
+
success: false,
|
|
342
|
+
message: 'Invalid bot token',
|
|
343
|
+
details: 'Get your bot token from https://discord.com/developers/applications',
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
return {
|
|
347
|
+
success: false,
|
|
348
|
+
message: `API returned ${response.status} ${response.statusText}`,
|
|
349
|
+
};
|
|
350
|
+
},
|
|
351
|
+
},
|
|
352
|
+
telegram: {
|
|
353
|
+
name: 'Telegram',
|
|
354
|
+
envVars: [
|
|
355
|
+
{
|
|
356
|
+
name: 'TELEGRAM_BOT_TOKEN',
|
|
357
|
+
label: 'Bot Token',
|
|
358
|
+
required: true,
|
|
359
|
+
helpUrl: 'https://core.telegram.org/bots#botfather',
|
|
360
|
+
},
|
|
361
|
+
],
|
|
362
|
+
testConnection: async (creds) => {
|
|
363
|
+
const token = creds['TELEGRAM_BOT_TOKEN'];
|
|
364
|
+
const response = await fetch(`https://api.telegram.org/bot${token}/getMe`);
|
|
365
|
+
if (response.ok) {
|
|
366
|
+
const data = (await response.json());
|
|
367
|
+
if (data.ok && data.result) {
|
|
368
|
+
return {
|
|
369
|
+
success: true,
|
|
370
|
+
message: `Authenticated as @${data.result.username} (${data.result.first_name})`,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (response.status === 401) {
|
|
375
|
+
return {
|
|
376
|
+
success: false,
|
|
377
|
+
message: 'Invalid bot token',
|
|
378
|
+
details: 'Get a bot token from @BotFather on Telegram: https://core.telegram.org/bots#botfather',
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
success: false,
|
|
383
|
+
message: `API returned ${response.status} ${response.statusText}`,
|
|
384
|
+
};
|
|
385
|
+
},
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
// ============================================================================
|
|
389
|
+
// Error Help
|
|
390
|
+
// ============================================================================
|
|
391
|
+
function getSlackErrorHelp(error) {
|
|
392
|
+
switch (error) {
|
|
393
|
+
case 'invalid_auth':
|
|
394
|
+
case 'not_authed':
|
|
395
|
+
return 'The token is invalid or has been revoked. Get a new token at https://api.slack.com/apps';
|
|
396
|
+
case 'account_inactive':
|
|
397
|
+
return 'The token belongs to a deactivated user or workspace.';
|
|
398
|
+
case 'token_revoked':
|
|
399
|
+
return 'The token has been revoked. Generate a new token at https://api.slack.com/apps';
|
|
400
|
+
case 'token_expired':
|
|
401
|
+
return 'The token has expired. If using OAuth, refresh the token.';
|
|
402
|
+
default:
|
|
403
|
+
return `See Slack API docs: https://api.slack.com/methods/auth.test`;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// ============================================================================
|
|
407
|
+
// Test Executor
|
|
408
|
+
// ============================================================================
|
|
409
|
+
async function testService(serviceKey) {
|
|
410
|
+
const definition = SERVICES[serviceKey];
|
|
411
|
+
if (!definition) {
|
|
412
|
+
return {
|
|
413
|
+
service: serviceKey,
|
|
414
|
+
name: serviceKey,
|
|
415
|
+
result: {
|
|
416
|
+
success: false,
|
|
417
|
+
message: `Unknown service: ${serviceKey}`,
|
|
418
|
+
details: `Available services: ${Object.keys(SERVICES).join(', ')}`,
|
|
419
|
+
},
|
|
420
|
+
credentialStatus: 'missing',
|
|
421
|
+
duration: 0,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
// Check credentials
|
|
425
|
+
const creds = {};
|
|
426
|
+
const missingVars = [];
|
|
427
|
+
const malformedVars = [];
|
|
428
|
+
for (const envDef of definition.envVars) {
|
|
429
|
+
const value = resolveEnvVar(envDef.name);
|
|
430
|
+
if (!value) {
|
|
431
|
+
if (envDef.required) {
|
|
432
|
+
missingVars.push(envDef);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
const formatCheck = validateCredentialFormat(value, envDef);
|
|
437
|
+
if (!formatCheck.valid) {
|
|
438
|
+
malformedVars.push({ def: envDef, issue: formatCheck.issue ?? 'Invalid format' });
|
|
439
|
+
}
|
|
440
|
+
creds[envDef.name] = value;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
// Report missing credentials
|
|
444
|
+
if (missingVars.length > 0) {
|
|
445
|
+
const missingNames = missingVars.map((v) => v.name);
|
|
446
|
+
const helpUrls = missingVars
|
|
447
|
+
.filter((v) => v.helpUrl)
|
|
448
|
+
.map((v) => v.helpUrl);
|
|
449
|
+
const helpText = helpUrls.length > 0 ? `\nGet credentials: ${helpUrls[0]}` : '';
|
|
450
|
+
return {
|
|
451
|
+
service: serviceKey,
|
|
452
|
+
name: definition.name,
|
|
453
|
+
result: {
|
|
454
|
+
success: false,
|
|
455
|
+
message: `Missing required environment variable(s): ${missingNames.join(', ')}`,
|
|
456
|
+
details: `Set these in your .env file or environment.${helpText}\nRun "marktoflow connect ${serviceKey}" for setup instructions.`,
|
|
457
|
+
},
|
|
458
|
+
credentialStatus: 'missing',
|
|
459
|
+
duration: 0,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
// Report malformed credentials
|
|
463
|
+
if (malformedVars.length > 0) {
|
|
464
|
+
const issues = malformedVars.map((v) => `${v.def.name}: ${v.issue}`);
|
|
465
|
+
return {
|
|
466
|
+
service: serviceKey,
|
|
467
|
+
name: definition.name,
|
|
468
|
+
result: {
|
|
469
|
+
success: false,
|
|
470
|
+
message: `Credential format issue(s):\n ${issues.join('\n ')}`,
|
|
471
|
+
details: 'Check that your credentials are correctly copied.',
|
|
472
|
+
},
|
|
473
|
+
credentialStatus: 'malformed',
|
|
474
|
+
duration: 0,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
// Run the actual connection test
|
|
478
|
+
const startTime = Date.now();
|
|
479
|
+
try {
|
|
480
|
+
const result = await definition.testConnection(creds);
|
|
481
|
+
const duration = Date.now() - startTime;
|
|
482
|
+
return {
|
|
483
|
+
service: serviceKey,
|
|
484
|
+
name: definition.name,
|
|
485
|
+
result,
|
|
486
|
+
credentialStatus: 'present',
|
|
487
|
+
duration,
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
catch (error) {
|
|
491
|
+
const duration = Date.now() - startTime;
|
|
492
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
493
|
+
// Provide actionable messages for common network errors
|
|
494
|
+
let details;
|
|
495
|
+
if (errorMessage.includes('ENOTFOUND')) {
|
|
496
|
+
details = 'DNS resolution failed. Check your network connection and the service URL.';
|
|
497
|
+
}
|
|
498
|
+
else if (errorMessage.includes('ECONNREFUSED')) {
|
|
499
|
+
details = 'Connection refused. The service may be down or the URL may be incorrect.';
|
|
500
|
+
}
|
|
501
|
+
else if (errorMessage.includes('ETIMEDOUT') || errorMessage.includes('timeout')) {
|
|
502
|
+
details = 'Connection timed out. Check your network connection or try again later.';
|
|
503
|
+
}
|
|
504
|
+
else if (errorMessage.includes('CERT') || errorMessage.includes('certificate')) {
|
|
505
|
+
details = 'SSL/TLS certificate error. Check your system clock and network configuration.';
|
|
506
|
+
}
|
|
507
|
+
return {
|
|
508
|
+
service: serviceKey,
|
|
509
|
+
name: definition.name,
|
|
510
|
+
result: {
|
|
511
|
+
success: false,
|
|
512
|
+
message: `Connection error: ${errorMessage}`,
|
|
513
|
+
details,
|
|
514
|
+
},
|
|
515
|
+
credentialStatus: 'present',
|
|
516
|
+
duration,
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
// ============================================================================
|
|
521
|
+
// Output Formatting
|
|
522
|
+
// ============================================================================
|
|
523
|
+
function displayResult(result) {
|
|
524
|
+
const icon = result.result.success ? chalk.green('PASS') : chalk.red('FAIL');
|
|
525
|
+
const serviceName = chalk.bold(result.name);
|
|
526
|
+
const durationStr = result.duration > 0 ? chalk.dim(` (${result.duration}ms)`) : '';
|
|
527
|
+
console.log(`\n ${icon} ${serviceName}${durationStr}`);
|
|
528
|
+
console.log(` ${result.result.message}`);
|
|
529
|
+
if (result.result.details) {
|
|
530
|
+
const detailLines = result.result.details.split('\n');
|
|
531
|
+
for (const line of detailLines) {
|
|
532
|
+
console.log(chalk.dim(` ${line}`));
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
function displaySummary(results) {
|
|
537
|
+
const passed = results.filter((r) => r.result.success).length;
|
|
538
|
+
const failed = results.filter((r) => !r.result.success).length;
|
|
539
|
+
console.log('\n' + chalk.bold(' Summary'));
|
|
540
|
+
console.log(` ${chalk.green(`${passed} passed`)}, ${chalk.red(`${failed} failed`)}, ${results.length} total`);
|
|
541
|
+
if (failed > 0) {
|
|
542
|
+
console.log(chalk.dim('\n Run "marktoflow connect <service>" to configure missing services.'));
|
|
543
|
+
}
|
|
544
|
+
console.log('');
|
|
545
|
+
}
|
|
546
|
+
// ============================================================================
|
|
547
|
+
// Public API
|
|
548
|
+
// ============================================================================
|
|
549
|
+
export function getAvailableServices() {
|
|
550
|
+
return Object.keys(SERVICES);
|
|
551
|
+
}
|
|
552
|
+
export async function runTestConnection(service) {
|
|
553
|
+
return testService(service);
|
|
554
|
+
}
|
|
555
|
+
export async function runTestAllConnections() {
|
|
556
|
+
const results = [];
|
|
557
|
+
for (const serviceKey of Object.keys(SERVICES)) {
|
|
558
|
+
const result = await testService(serviceKey);
|
|
559
|
+
results.push(result);
|
|
560
|
+
displayResult(result);
|
|
561
|
+
}
|
|
562
|
+
return results;
|
|
563
|
+
}
|
|
564
|
+
export async function executeTestConnection(service, options) {
|
|
565
|
+
console.log(chalk.bold('\n marktoflow Connection Test\n'));
|
|
566
|
+
if (options.all) {
|
|
567
|
+
const spinner = ora('Testing all service connections...').start();
|
|
568
|
+
spinner.stop();
|
|
569
|
+
const results = await runTestAllConnections();
|
|
570
|
+
displaySummary(results);
|
|
571
|
+
const hasFailed = results.some((r) => !r.result.success);
|
|
572
|
+
if (hasFailed) {
|
|
573
|
+
process.exit(1);
|
|
574
|
+
}
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
if (!service) {
|
|
578
|
+
console.log(chalk.red(' Error: specify a service name or use --all\n'));
|
|
579
|
+
console.log(' Usage:');
|
|
580
|
+
console.log(' marktoflow test-connection <service>');
|
|
581
|
+
console.log(' marktoflow test-connection --all\n');
|
|
582
|
+
console.log(' Available services:');
|
|
583
|
+
for (const [key, def] of Object.entries(SERVICES)) {
|
|
584
|
+
console.log(` ${chalk.cyan(key.padEnd(12))} ${def.name}`);
|
|
585
|
+
}
|
|
586
|
+
console.log('');
|
|
587
|
+
process.exit(1);
|
|
588
|
+
}
|
|
589
|
+
const serviceLower = service.toLowerCase();
|
|
590
|
+
const spinner = ora(`Testing ${SERVICES[serviceLower]?.name ?? service} connection...`).start();
|
|
591
|
+
const result = await testService(serviceLower);
|
|
592
|
+
spinner.stop();
|
|
593
|
+
displayResult(result);
|
|
594
|
+
console.log('');
|
|
595
|
+
if (!result.result.success) {
|
|
596
|
+
process.exit(1);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
//# sourceMappingURL=test-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-connection.js","sourceRoot":"","sources":["../../src/commands/test-connection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AA0CtB,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,SAAS,wBAAwB,CAAC,KAAa,EAAE,GAAc;IAC7D,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAExC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,iCAAiC,GAAG,CAAC,MAAM,cAAc,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM;SACpH,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,MAAM,QAAQ,GAAsC;IAClD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,iBAAiB;gBACvB,KAAK,EAAE,WAAW;gBAClB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,4BAA4B;aACtC;SACF;QACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iCAAiC,EAAE;gBAC9D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,KAAK,EAAE;oBAChC,cAAc,EAAE,mCAAmC;iBACpD;aACF,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkE,CAAC;YACtG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,oBAAoB,IAAI,CAAC,IAAI,iBAAiB,IAAI,CAAC,IAAI,EAAE;iBACnE,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,gBAAgB,IAAI,CAAC,KAAK,EAAE;gBACrC,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;aACpD,CAAC;QACJ,CAAC;KACF;IAED,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,uBAAuB;gBAC9B,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,oCAAoC;aAC9C;SACF;QACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,6BAA6B,EAAE;gBAC1D,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,KAAK,EAAE;oBAChC,MAAM,EAAE,gCAAgC;oBACxC,YAAY,EAAE,gBAAgB;iBAC/B;aACF,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqC,CAAC;gBACzE,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,oBAAoB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;iBAC/E,CAAC;YACJ,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,0BAA0B;oBACnC,OAAO,EAAE,0DAA0D;iBACpE,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;aAClE,CAAC;QACJ,CAAC;KACF;IAED,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,kBAAkB;gBACxB,KAAK,EAAE,WAAW;gBAClB,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,mCAAmC;aAC7C;YACD;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,IAAI;aACf;SACF;QACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,iDAAiD;YACjD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;gBACvE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;gBAChE,IAAI,EAAE,IAAI,eAAe,CAAC;oBACxB,SAAS,EAAE,KAAK,CAAC,kBAAkB,CAAC;oBACpC,aAAa,EAAE,KAAK,CAAC,sBAAsB,CAAC;oBAC5C,aAAa,EAAE,KAAK,CAAC,qBAAqB,CAAC;oBAC3C,UAAU,EAAE,eAAe;iBAC5B,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;gBACtB,MAAM,KAAK,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAAmC,CAAC;gBAC7E,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,yBAAyB,KAAK,CAAC,iBAAiB,IAAI,eAAe,EAAE;oBAC9E,OAAO,EAAE,mDAAmD;iBAC7D,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAA6B,CAAC;YAExE,6BAA6B;YAC7B,MAAM,eAAe,GAAG,MAAM,KAAK,CACjC,wDAAwD,EACxD;gBACE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,YAAY,EAAE,EAAE;aAC5D,CACF,CAAC;YAEF,IAAI,eAAe,CAAC,EAAE,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,CAAqD,CAAC;gBACnG,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,oBAAoB,OAAO,CAAC,YAAY,EAAE;oBACnD,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,iBAAiB,CAAC,CAAC,CAAC,SAAS;iBACvF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,2BAA2B,eAAe,CAAC,MAAM,EAAE;gBAC5D,OAAO,EAAE,qDAAqD;aAC/D,CAAC;QACJ,CAAC;KACF;IAED,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,mBAAmB;gBAC1B,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,uCAAuC;aACjD;SACF;QACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,kCAAkC,EAAE;gBAC/D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,KAAK,EAAE;oBAChC,cAAc,EAAE,kBAAkB;oBAClC,gBAAgB,EAAE,YAAY;iBAC/B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;aAClD,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA2B,CAAC;gBAC/D,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,qBAAqB;oBAC9B,OAAO,EAAE,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,mCAAmC;iBACzE,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,2BAA2B;oBACpC,OAAO,EAAE,mEAAmE;iBAC7E,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;aAClE,CAAC;QACJ,CAAC;KACF;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,6DAA6D;aACvE;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,IAAI;aACf;YACD;gBACE,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,WAAW;gBAClB,QAAQ,EAAE,IAAI;aACf;SACF;QACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,oBAAoB,EAAE;gBACxD,OAAO,EAAE;oBACP,aAAa,EAAE,SAAS,OAAO,EAAE;oBACjC,MAAM,EAAE,kBAAkB;iBAC3B;aACF,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkD,CAAC;gBACtF,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,oBAAoB,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,YAAY,GAAG;iBACvE,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,4BAA4B;oBACrC,OAAO,EAAE,uFAAuF;iBACjG,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,sEAAsE;iBAChF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;aAClE,CAAC;QACJ,CAAC;KACF;IAED,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,iCAAiC;aAC3C;SACF;QACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gCAAgC,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,MAAM;oBACrB,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,8BAA8B;iBACtC,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;gBACF,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;oBACtB,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,oBAAoB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG;qBACjF,CAAC;gBACJ,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1C,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,kBAAkB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;qBACpD,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,iBAAiB;oBAC1B,OAAO,EAAE,yDAAyD;iBACnE,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;aAClE,CAAC;QACJ,CAAC;KACF;IAED,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,mBAAmB;gBACzB,KAAK,EAAE,WAAW;gBAClB,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,6CAA6C;aACvD;SACF;QACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,uCAAuC,EAAE;gBACpE,OAAO,EAAE;oBACP,aAAa,EAAE,OAAO,KAAK,EAAE;iBAC9B;aACF,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4D,CAAC;gBAChG,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,oBAAoB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,SAAS,IAAI,CAAC,EAAE,GAAG;iBACpF,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,mBAAmB;oBAC5B,OAAO,EAAE,qEAAqE;iBAC/E,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;aAClE,CAAC;QACJ,CAAC;KACF;IAED,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,WAAW;gBAClB,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,0CAA0C;aACpD;SACF;QACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,+BAA+B,KAAK,QAAQ,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGlC,CAAC;gBACF,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC3B,OAAO;wBACL,OAAO,EAAE,IAAI;wBACb,OAAO,EAAE,qBAAqB,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG;qBACjF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,mBAAmB;oBAC5B,OAAO,EAAE,uFAAuF;iBACjG,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,gBAAgB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE;aAClE,CAAC;QACJ,CAAC;KACF;CACF,CAAC;AAEF,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,SAAS,iBAAiB,CAAC,KAAa;IACtC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,cAAc,CAAC;QACpB,KAAK,YAAY;YACf,OAAO,yFAAyF,CAAC;QACnG,KAAK,kBAAkB;YACrB,OAAO,uDAAuD,CAAC;QACjE,KAAK,eAAe;YAClB,OAAO,gFAAgF,CAAC;QAC1F,KAAK,eAAe;YAClB,OAAO,2DAA2D,CAAC;QACrE;YACE,OAAO,6DAA6D,CAAC;IACzE,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,KAAK,UAAU,WAAW,CAAC,UAAkB;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,oBAAoB,UAAU,EAAE;gBACzC,OAAO,EAAE,uBAAuB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACnE;YACD,gBAAgB,EAAE,SAAS;YAC3B,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,oBAAoB;IACpB,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,WAAW,GAAgB,EAAE,CAAC;IACpC,MAAM,aAAa,GAAwC,EAAE,CAAC;IAE9D,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBACvB,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC;YACpF,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,WAAW;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,sBAAsB,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEhF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,6CAA6C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC/E,OAAO,EAAE,8CAA8C,QAAQ,6BAA6B,UAAU,2BAA2B;aAClI;YACD,gBAAgB,EAAE,SAAS;YAC3B,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACrE,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,kCAAkC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBAChE,OAAO,EAAE,mDAAmD;aAC7D;YACD,gBAAgB,EAAE,WAAW;YAC7B,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM;YACN,gBAAgB,EAAE,SAAS;YAC3B,QAAQ;SACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5E,wDAAwD;QACxD,IAAI,OAA2B,CAAC;QAChC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,2EAA2E,CAAC;QACxF,CAAC;aAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACjD,OAAO,GAAG,0EAA0E,CAAC;QACvF,CAAC;aAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAClF,OAAO,GAAG,yEAAyE,CAAC;QACtF,CAAC;aAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACjF,OAAO,GAAG,+EAA+E,CAAC;QAC5F,CAAC;QAED,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM,EAAE;gBACN,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,qBAAqB,YAAY,EAAE;gBAC5C,OAAO;aACR;YACD,gBAAgB,EAAE,SAAS;YAC3B,QAAQ;SACT,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,SAAS,aAAa,CAAC,MAAyB;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpF,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,WAAW,GAAG,WAAW,EAAE,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAE/C,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAA4B;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,SAAS,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,SAAS,CAAC,KAAK,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;IAE/G,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,uEAAuE,CAAC,CACnF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAe;IACrD,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,aAAa,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA2B,EAC3B,OAA0B;IAE1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;IAE5D,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,GAAG,CAAC,oCAAoC,CAAC,CAAC,KAAK,EAAE,CAAC;QAClE,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC;QAC9C,cAAc,CAAC,OAAO,CAAC,CAAC;QAExB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,IAAI,OAAO,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEhG,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|