@_davideast/stitch-mcp 0.3.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -239
- package/dist/chunk-25wakzyb.js +137 -0
- package/dist/chunk-25wakzyb.js.map +10 -0
- package/dist/chunk-2cetsfw4.js +16531 -0
- package/dist/chunk-2cetsfw4.js.map +95 -0
- package/dist/chunk-2fcdwvrm.js +54 -0
- package/dist/chunk-2fcdwvrm.js.map +10 -0
- package/dist/chunk-2k7n0w2x.js +3980 -0
- package/dist/chunk-2k7n0w2x.js.map +16 -0
- package/dist/chunk-2kyqsrg2.js +403 -0
- package/dist/chunk-2kyqsrg2.js.map +10 -0
- package/dist/chunk-384jmtpy.js +11057 -0
- package/dist/chunk-384jmtpy.js.map +238 -0
- package/dist/chunk-3at4pjgn.js +22 -0
- package/dist/chunk-3at4pjgn.js.map +9 -0
- package/dist/chunk-3sfn889r.js +492 -0
- package/dist/chunk-3sfn889r.js.map +13 -0
- package/dist/chunk-45wx7tn7.js +94 -0
- package/dist/chunk-45wx7tn7.js.map +10 -0
- package/dist/chunk-48d17n29.js +10 -0
- package/dist/chunk-48d17n29.js.map +9 -0
- package/dist/chunk-4jwmvjb4.js +839 -0
- package/dist/chunk-4jwmvjb4.js.map +11 -0
- package/dist/chunk-4jygt4d6.js +14 -0
- package/dist/chunk-4jygt4d6.js.map +10 -0
- package/dist/chunk-4vxy1qce.js +68 -0
- package/dist/chunk-4vxy1qce.js.map +10 -0
- package/dist/chunk-7tx0wn04.js +11 -0
- package/dist/chunk-7tx0wn04.js.map +9 -0
- package/dist/chunk-7xh1y383.js +45188 -0
- package/dist/chunk-7xh1y383.js.map +258 -0
- package/dist/chunk-8yrtq2qs.js +18 -0
- package/dist/chunk-8yrtq2qs.js.map +9 -0
- package/dist/chunk-985f11w6.js +21 -0
- package/dist/chunk-985f11w6.js.map +9 -0
- package/dist/chunk-9tvppjaf.js +250 -0
- package/dist/chunk-9tvppjaf.js.map +14 -0
- package/dist/chunk-9wyra8hs.js +32 -0
- package/dist/chunk-9wyra8hs.js.map +9 -0
- package/dist/chunk-cwkb2wbe.js +733 -0
- package/dist/chunk-cwkb2wbe.js.map +16 -0
- package/dist/chunk-djhzzcgj.js +362 -0
- package/dist/chunk-djhzzcgj.js.map +13 -0
- package/dist/chunk-edp6faw2.js +7 -0
- package/dist/chunk-edp6faw2.js.map +9 -0
- package/dist/chunk-ezmw2j8c.js +14 -0
- package/dist/chunk-ezmw2j8c.js.map +9 -0
- package/dist/chunk-f2hq6bfv.js +22 -0
- package/dist/chunk-f2hq6bfv.js.map +10 -0
- package/dist/chunk-fwb4fnkp.js +31 -0
- package/dist/chunk-fwb4fnkp.js.map +10 -0
- package/dist/chunk-h18jrqed.js +9517 -0
- package/dist/chunk-h18jrqed.js.map +99 -0
- package/dist/chunk-hb3c6f6a.js +42 -0
- package/dist/chunk-hb3c6f6a.js.map +9 -0
- package/dist/chunk-jy2d17pr.js +252 -0
- package/dist/chunk-jy2d17pr.js.map +11 -0
- package/dist/chunk-kbtqrkwh.js +24 -0
- package/dist/chunk-kbtqrkwh.js.map +10 -0
- package/dist/chunk-knbnsf6s.js +92 -0
- package/dist/chunk-knbnsf6s.js.map +10 -0
- package/dist/chunk-mv9ssgmx.js +446 -0
- package/dist/chunk-mv9ssgmx.js.map +17 -0
- package/dist/chunk-nq68kghz.js +1647 -0
- package/dist/chunk-nq68kghz.js.map +10 -0
- package/dist/chunk-nthabjd9.js +3138 -0
- package/dist/chunk-nthabjd9.js.map +34 -0
- package/dist/chunk-nxpzt33t.js +278 -0
- package/dist/chunk-nxpzt33t.js.map +10 -0
- package/dist/chunk-pfyjtfex.js +172 -0
- package/dist/chunk-pfyjtfex.js.map +10 -0
- package/dist/chunk-q1nd6g0y.js +392 -0
- package/dist/chunk-q1nd6g0y.js.map +20 -0
- package/dist/chunk-q4js8r0z.js +4708 -0
- package/dist/chunk-q4js8r0z.js.map +29 -0
- package/dist/chunk-qv44tmn6.js +289 -0
- package/dist/chunk-qv44tmn6.js.map +13 -0
- package/dist/chunk-r2sg2nxa.js +20 -0
- package/dist/chunk-r2sg2nxa.js.map +9 -0
- package/dist/chunk-rp8wjzht.js +16959 -0
- package/dist/chunk-rp8wjzht.js.map +26 -0
- package/dist/chunk-rpxnm86e.js +372 -0
- package/dist/chunk-rpxnm86e.js.map +17 -0
- package/dist/chunk-sdp429xd.js +914 -0
- package/dist/chunk-sdp429xd.js.map +24 -0
- package/dist/chunk-t85nbjjb.js +113 -0
- package/dist/chunk-t85nbjjb.js.map +10 -0
- package/dist/chunk-tz7wnw4s.js +211 -0
- package/dist/chunk-tz7wnw4s.js.map +11 -0
- package/dist/chunk-v7117ywx.js +1477 -0
- package/dist/chunk-v7117ywx.js.map +23 -0
- package/dist/chunk-w8q7nsm7.js +2098 -0
- package/dist/chunk-w8q7nsm7.js.map +44 -0
- package/dist/chunk-wa64nz8b.js +47 -0
- package/dist/chunk-wa64nz8b.js.map +10 -0
- package/dist/chunk-wz8d5vzb.js +234 -0
- package/dist/chunk-wz8d5vzb.js.map +11 -0
- package/dist/chunk-ycfxp056.js +677 -0
- package/dist/chunk-ycfxp056.js.map +17 -0
- package/dist/chunk-z9d2xc83.js +3256 -0
- package/dist/chunk-z9d2xc83.js.map +84 -0
- package/dist/cli.js +111 -125552
- package/dist/cli.js.map +19 -0
- package/dist/commands/autoload.d.ts +2 -0
- package/dist/commands/doctor/command.d.ts +2 -1
- package/dist/commands/doctor/command.js +82 -0
- package/dist/commands/doctor/command.js.map +11 -0
- package/dist/commands/doctor/spec.d.ts +16 -8
- package/dist/commands/init/command.d.ts +2 -1
- package/dist/commands/init/command.js +98 -0
- package/dist/commands/init/command.js.map +11 -0
- package/dist/commands/init/spec.d.ts +29 -9
- package/dist/commands/logout/command.d.ts +2 -1
- package/dist/commands/logout/command.js +79 -0
- package/dist/commands/logout/command.js.map +11 -0
- package/dist/commands/logout/spec.d.ts +11 -0
- package/dist/commands/proxy/command.d.ts +2 -1
- package/dist/commands/proxy/command.js +56 -0
- package/dist/commands/proxy/command.js.map +11 -0
- package/dist/commands/proxy/spec.d.ts +15 -0
- package/dist/commands/screens/command.d.ts +2 -1
- package/dist/commands/screens/command.js +61 -0
- package/dist/commands/screens/command.js.map +11 -0
- package/dist/commands/screens/spec.d.ts +9 -0
- package/dist/commands/serve/command.d.ts +2 -1
- package/dist/commands/serve/command.js +65 -0
- package/dist/commands/serve/command.js.map +11 -0
- package/dist/commands/serve/spec.d.ts +9 -0
- package/dist/commands/site/command.d.ts +2 -1
- package/dist/commands/site/command.js +53 -0
- package/dist/commands/site/command.js.map +11 -0
- package/dist/commands/site/spec.d.ts +15 -0
- package/dist/commands/snapshot/command.d.ts +2 -1
- package/dist/commands/snapshot/command.js +59 -0
- package/dist/commands/snapshot/command.js.map +11 -0
- package/dist/commands/tool/command.d.ts +2 -1
- package/dist/commands/tool/command.js +79 -0
- package/dist/commands/tool/command.js.map +11 -0
- package/dist/commands/tool/handler.d.ts +17 -0
- package/dist/commands/tool/spec.d.ts +17 -0
- package/dist/commands/tool/steps/ValidateToolStep.d.ts +8 -0
- package/dist/commands/tool/virtual-tools/index.d.ts +1 -0
- package/dist/commands/tool/virtual-tools/list-tools.d.ts +2 -0
- package/dist/commands/view/command.d.ts +2 -1
- package/dist/commands/view/command.js +52 -0
- package/dist/commands/view/command.js.map +11 -0
- package/dist/commands/view/spec.d.ts +24 -0
- package/dist/framework/CommandDefinition.d.ts +2 -2
- package/dist/index.js +26 -21668
- package/dist/index.js.map +9 -0
- package/dist/lib/services/site/schemas.d.ts +8 -8
- package/dist/services/config/handler.d.ts +12 -0
- package/dist/services/config/spec.d.ts +82 -0
- package/dist/services/gcloud/auth.d.ts +28 -0
- package/dist/services/gcloud/core.d.ts +21 -0
- package/dist/services/gcloud/handler.d.ts +6 -18
- package/dist/services/gcloud/install.d.ts +23 -0
- package/dist/services/gcloud/projects.d.ts +15 -0
- package/dist/services/gcloud/spec.d.ts +32 -24
- package/dist/services/mcp-client/client.d.ts +0 -5
- package/dist/services/mcp-client/spec.d.ts +6 -6
- package/dist/services/mcp-config/spec.d.ts +12 -12
- package/dist/services/project/spec.d.ts +4 -4
- package/dist/services/proxy/spec.d.ts +3 -3
- package/dist/services/stitch/api.d.ts +10 -0
- package/dist/services/stitch/connection.d.ts +5 -0
- package/dist/services/stitch/handler.d.ts +5 -3
- package/dist/services/stitch/iam.d.ts +11 -0
- package/dist/services/stitch/spec.d.ts +6 -6
- package/dist/services/view/spec.d.ts +7 -7
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/commands/doctor/handler.d.ts +9 -0
- package/dist/src/commands/doctor/handler.test.d.ts +1 -0
- package/dist/src/commands/doctor/spec.d.ts +130 -0
- package/dist/src/commands/doctor/spec.test.d.ts +1 -0
- package/dist/src/commands/init/handler.d.ts +17 -0
- package/dist/src/commands/init/handler.test.d.ts +1 -0
- package/dist/src/commands/init/spec.d.ts +88 -0
- package/dist/src/commands/init/spec.test.d.ts +1 -0
- package/dist/src/commands/proxy/handler.d.ts +7 -0
- package/dist/src/commands/proxy/handler.test.d.ts +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/platform/detector.d.ts +29 -0
- package/dist/src/platform/paths.d.ts +20 -0
- package/dist/src/platform/shell.d.ts +26 -0
- package/dist/src/services/gcloud/handler.d.ts +48 -0
- package/dist/src/services/gcloud/handler.test.d.ts +1 -0
- package/dist/src/services/gcloud/spec.d.ts +405 -0
- package/dist/src/services/mcp-config/handler.d.ts +12 -0
- package/dist/src/services/mcp-config/handler.test.d.ts +1 -0
- package/dist/src/services/mcp-config/spec.d.ts +88 -0
- package/dist/src/services/mcp-config/spec.test.d.ts +1 -0
- package/dist/src/services/project/handler.d.ts +11 -0
- package/dist/src/services/project/handler.test.d.ts +1 -0
- package/dist/src/services/project/spec.d.ts +86 -0
- package/dist/src/services/project/spec.test.d.ts +1 -0
- package/dist/src/services/proxy/handler.d.ts +15 -0
- package/dist/src/services/proxy/handler.test.d.ts +1 -0
- package/dist/src/services/proxy/spec.d.ts +83 -0
- package/dist/src/services/proxy/spec.test.d.ts +1 -0
- package/dist/src/services/stitch/handler.d.ts +15 -0
- package/dist/src/services/stitch/handler.test.d.ts +1 -0
- package/dist/src/services/stitch/spec.d.ts +262 -0
- package/dist/src/services/stitch/spec.test.d.ts +1 -0
- package/dist/src/ui/spinner.d.ts +11 -0
- package/dist/src/ui/theme.d.ts +18 -0
- package/dist/src/ui/wizard.d.ts +24 -0
- package/dist/tests/mocks/shell.d.ts +2 -0
- package/dist/ui/JsonTree.d.ts +1 -1
- package/package.json +2 -2
- package/dist/commands/registry.d.ts +0 -2
- package/dist/ui/copy-behaviors/index.d.ts +0 -8
- package/dist/ui/serve-behaviors/index.d.ts +0 -7
- /package/dist/ui/navigation-behaviors/{index.d.ts → handler.d.ts} +0 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import {
|
|
2
|
+
require_main
|
|
3
|
+
} from "./chunk-2kyqsrg2.js";
|
|
4
|
+
import {
|
|
5
|
+
StitchHandler,
|
|
6
|
+
createSpinner
|
|
7
|
+
} from "./chunk-sdp429xd.js";
|
|
8
|
+
import {
|
|
9
|
+
ConsoleUI
|
|
10
|
+
} from "./chunk-z9d2xc83.js";
|
|
11
|
+
import {
|
|
12
|
+
runSteps
|
|
13
|
+
} from "./chunk-f2hq6bfv.js";
|
|
14
|
+
import {
|
|
15
|
+
GcloudHandler
|
|
16
|
+
} from "./chunk-nthabjd9.js";
|
|
17
|
+
import {
|
|
18
|
+
icons,
|
|
19
|
+
theme
|
|
20
|
+
} from "./chunk-kbtqrkwh.js";
|
|
21
|
+
import {
|
|
22
|
+
__toESM
|
|
23
|
+
} from "./chunk-9wyra8hs.js";
|
|
24
|
+
|
|
25
|
+
// src/commands/doctor/handler.ts
|
|
26
|
+
var import_dotenv = __toESM(require_main(), 1);
|
|
27
|
+
|
|
28
|
+
// src/commands/doctor/steps/ApiKeyDetectedStep.ts
|
|
29
|
+
class ApiKeyDetectedStep {
|
|
30
|
+
id = "api-key-detected";
|
|
31
|
+
name = "Checking API Key...";
|
|
32
|
+
async shouldRun(context) {
|
|
33
|
+
return context.authMode === "apiKey";
|
|
34
|
+
}
|
|
35
|
+
async run(context) {
|
|
36
|
+
const apiKey = context.apiKey;
|
|
37
|
+
if (!apiKey || apiKey.trim().length === 0) {
|
|
38
|
+
const message2 = "STITCH_API_KEY is set but empty";
|
|
39
|
+
context.checks.push({
|
|
40
|
+
name: "API Key",
|
|
41
|
+
passed: false,
|
|
42
|
+
message: message2,
|
|
43
|
+
suggestion: "Set a valid API key in STITCH_API_KEY environment variable or in your .env file"
|
|
44
|
+
});
|
|
45
|
+
return { success: false, error: new Error(message2) };
|
|
46
|
+
}
|
|
47
|
+
const masked = apiKey.length > 7 ? `${apiKey.slice(0, 4)}...${apiKey.slice(-3)}` : "***";
|
|
48
|
+
const message = `Detected (${masked})`;
|
|
49
|
+
context.checks.push({
|
|
50
|
+
name: "API Key",
|
|
51
|
+
passed: true,
|
|
52
|
+
message
|
|
53
|
+
});
|
|
54
|
+
return { success: true, detail: message };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// src/commands/doctor/steps/GcloudCheckStep.ts
|
|
59
|
+
class GcloudCheckStep {
|
|
60
|
+
id = "gcloud-check";
|
|
61
|
+
name = "Checking Google Cloud CLI...";
|
|
62
|
+
async shouldRun(context) {
|
|
63
|
+
return context.authMode === "oauth";
|
|
64
|
+
}
|
|
65
|
+
async run(context) {
|
|
66
|
+
const gcloudResult = await context.gcloudService.ensureInstalled({
|
|
67
|
+
minVersion: "400.0.0",
|
|
68
|
+
forceLocal: false
|
|
69
|
+
});
|
|
70
|
+
if (gcloudResult.success) {
|
|
71
|
+
const message = `Installed (${gcloudResult.data.location}): v${gcloudResult.data.version}
|
|
72
|
+
Path: ${gcloudResult.data.path}`;
|
|
73
|
+
context.checks.push({
|
|
74
|
+
name: "Google Cloud CLI",
|
|
75
|
+
passed: true,
|
|
76
|
+
message
|
|
77
|
+
});
|
|
78
|
+
return { success: true, detail: message };
|
|
79
|
+
} else {
|
|
80
|
+
const message = "Not found or invalid version";
|
|
81
|
+
context.checks.push({
|
|
82
|
+
name: "Google Cloud CLI",
|
|
83
|
+
passed: false,
|
|
84
|
+
message,
|
|
85
|
+
suggestion: "Run: npx @_davideast/stitch-mcp init"
|
|
86
|
+
});
|
|
87
|
+
return { success: false, error: new Error(message) };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// src/commands/doctor/steps/AuthCheckStep.ts
|
|
93
|
+
class AuthCheckStep {
|
|
94
|
+
id = "auth-check";
|
|
95
|
+
name = "Checking user authentication...";
|
|
96
|
+
async shouldRun(context) {
|
|
97
|
+
return context.authMode === "oauth";
|
|
98
|
+
}
|
|
99
|
+
async run(context) {
|
|
100
|
+
const authResult = await context.gcloudService.authenticate({ skipIfActive: true });
|
|
101
|
+
if (authResult.success) {
|
|
102
|
+
const message = `Authenticated: ${authResult.data.account}`;
|
|
103
|
+
context.checks.push({
|
|
104
|
+
name: "User Authentication",
|
|
105
|
+
passed: true,
|
|
106
|
+
message
|
|
107
|
+
});
|
|
108
|
+
return { success: true, detail: message };
|
|
109
|
+
} else {
|
|
110
|
+
const message = "Not authenticated";
|
|
111
|
+
context.checks.push({
|
|
112
|
+
name: "User Authentication",
|
|
113
|
+
passed: false,
|
|
114
|
+
message,
|
|
115
|
+
suggestion: "Run: gcloud auth login"
|
|
116
|
+
});
|
|
117
|
+
return { success: false, error: new Error(message) };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/commands/doctor/steps/AdcCheckStep.ts
|
|
123
|
+
class AdcCheckStep {
|
|
124
|
+
id = "adc-check";
|
|
125
|
+
name = "Checking application credentials...";
|
|
126
|
+
async shouldRun(context) {
|
|
127
|
+
return context.authMode === "oauth";
|
|
128
|
+
}
|
|
129
|
+
async run(context) {
|
|
130
|
+
const adcResult = await context.gcloudService.authenticateADC({ skipIfActive: true });
|
|
131
|
+
if (adcResult.success) {
|
|
132
|
+
const message = "Present";
|
|
133
|
+
context.checks.push({
|
|
134
|
+
name: "Application Credentials",
|
|
135
|
+
passed: true,
|
|
136
|
+
message
|
|
137
|
+
});
|
|
138
|
+
return { success: true, detail: message };
|
|
139
|
+
} else {
|
|
140
|
+
const message = "Not configured";
|
|
141
|
+
context.checks.push({
|
|
142
|
+
name: "Application Credentials",
|
|
143
|
+
passed: false,
|
|
144
|
+
message,
|
|
145
|
+
suggestion: "Run: gcloud auth application-default login"
|
|
146
|
+
});
|
|
147
|
+
return { success: false, error: new Error(message) };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// src/commands/doctor/steps/ProjectCheckStep.ts
|
|
153
|
+
class ProjectCheckStep {
|
|
154
|
+
id = "project-check";
|
|
155
|
+
name = "Checking active project...";
|
|
156
|
+
async shouldRun(context) {
|
|
157
|
+
return context.authMode === "oauth";
|
|
158
|
+
}
|
|
159
|
+
async run(context) {
|
|
160
|
+
const projectId = await context.gcloudService.getProjectId();
|
|
161
|
+
if (projectId) {
|
|
162
|
+
const message = `Set: ${projectId}`;
|
|
163
|
+
context.checks.push({
|
|
164
|
+
name: "Active Project",
|
|
165
|
+
passed: true,
|
|
166
|
+
message
|
|
167
|
+
});
|
|
168
|
+
return { success: true, detail: message };
|
|
169
|
+
} else {
|
|
170
|
+
const message = "No project configured";
|
|
171
|
+
context.checks.push({
|
|
172
|
+
name: "Active Project",
|
|
173
|
+
passed: false,
|
|
174
|
+
message,
|
|
175
|
+
suggestion: "Run: npx @_davideast/stitch-mcp init"
|
|
176
|
+
});
|
|
177
|
+
return { success: false, error: new Error(message) };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// src/commands/doctor/steps/ApiKeyConnectionStep.ts
|
|
183
|
+
class ApiKeyConnectionStep {
|
|
184
|
+
id = "api-key-connection";
|
|
185
|
+
name = "Testing Stitch API...";
|
|
186
|
+
async shouldRun(context) {
|
|
187
|
+
if (context.authMode !== "apiKey")
|
|
188
|
+
return false;
|
|
189
|
+
const apiKeyCheck = context.checks.find((c) => c.name === "API Key");
|
|
190
|
+
return !!apiKeyCheck && apiKeyCheck.passed;
|
|
191
|
+
}
|
|
192
|
+
async run(context) {
|
|
193
|
+
const testResult = await context.stitchService.testConnectionWithApiKey({
|
|
194
|
+
apiKey: context.apiKey
|
|
195
|
+
});
|
|
196
|
+
if (testResult.success) {
|
|
197
|
+
const message = `Healthy (${testResult.data.statusCode})`;
|
|
198
|
+
context.checks.push({
|
|
199
|
+
name: "Stitch API",
|
|
200
|
+
passed: true,
|
|
201
|
+
message
|
|
202
|
+
});
|
|
203
|
+
return { success: true, detail: message };
|
|
204
|
+
} else {
|
|
205
|
+
const message = testResult.error.message;
|
|
206
|
+
context.checks.push({
|
|
207
|
+
name: "Stitch API",
|
|
208
|
+
passed: false,
|
|
209
|
+
message,
|
|
210
|
+
suggestion: testResult.error.suggestion,
|
|
211
|
+
details: testResult.error.details
|
|
212
|
+
});
|
|
213
|
+
return { success: false, error: new Error(message) };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// src/commands/doctor/steps/ApiCheckStep.ts
|
|
219
|
+
class ApiCheckStep {
|
|
220
|
+
id = "api-check";
|
|
221
|
+
name = "Testing Stitch API...";
|
|
222
|
+
async shouldRun(context) {
|
|
223
|
+
if (context.authMode !== "oauth")
|
|
224
|
+
return false;
|
|
225
|
+
const projectCheck = context.checks.find((c) => c.name === "Active Project");
|
|
226
|
+
return !!projectCheck && projectCheck.passed;
|
|
227
|
+
}
|
|
228
|
+
async run(context) {
|
|
229
|
+
const projectId = await context.gcloudService.getProjectId();
|
|
230
|
+
const accessToken = await context.gcloudService.getAccessToken();
|
|
231
|
+
if (projectId && accessToken) {
|
|
232
|
+
const testResult = await context.stitchService.testConnection({
|
|
233
|
+
projectId,
|
|
234
|
+
accessToken
|
|
235
|
+
});
|
|
236
|
+
if (testResult.success) {
|
|
237
|
+
const message = `Healthy (${testResult.data.statusCode})`;
|
|
238
|
+
context.checks.push({
|
|
239
|
+
name: "Stitch API",
|
|
240
|
+
passed: true,
|
|
241
|
+
message
|
|
242
|
+
});
|
|
243
|
+
return { success: true, detail: message };
|
|
244
|
+
} else {
|
|
245
|
+
const message = testResult.error.message;
|
|
246
|
+
context.checks.push({
|
|
247
|
+
name: "Stitch API",
|
|
248
|
+
passed: false,
|
|
249
|
+
message,
|
|
250
|
+
suggestion: testResult.error.suggestion,
|
|
251
|
+
details: testResult.error.details
|
|
252
|
+
});
|
|
253
|
+
return { success: false, error: new Error(message) };
|
|
254
|
+
}
|
|
255
|
+
} else {
|
|
256
|
+
const message = "Could not obtain access token";
|
|
257
|
+
context.checks.push({
|
|
258
|
+
name: "Stitch API",
|
|
259
|
+
passed: false,
|
|
260
|
+
message,
|
|
261
|
+
suggestion: "Re-run authentication"
|
|
262
|
+
});
|
|
263
|
+
return { success: false, error: new Error(message) };
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// src/commands/doctor/handler.ts
|
|
269
|
+
class DoctorHandler {
|
|
270
|
+
gcloudService;
|
|
271
|
+
stitchService;
|
|
272
|
+
steps;
|
|
273
|
+
ui;
|
|
274
|
+
constructor(gcloudService = new GcloudHandler, stitchService = new StitchHandler, ui) {
|
|
275
|
+
this.gcloudService = gcloudService;
|
|
276
|
+
this.stitchService = stitchService;
|
|
277
|
+
this.ui = ui || new ConsoleUI;
|
|
278
|
+
this.steps = [
|
|
279
|
+
new ApiKeyDetectedStep,
|
|
280
|
+
new GcloudCheckStep,
|
|
281
|
+
new AuthCheckStep,
|
|
282
|
+
new AdcCheckStep,
|
|
283
|
+
new ProjectCheckStep,
|
|
284
|
+
new ApiKeyConnectionStep,
|
|
285
|
+
new ApiCheckStep
|
|
286
|
+
];
|
|
287
|
+
}
|
|
288
|
+
async execute(input) {
|
|
289
|
+
import_dotenv.default.config({ quiet: true });
|
|
290
|
+
const apiKey = process.env.STITCH_API_KEY;
|
|
291
|
+
const context = {
|
|
292
|
+
input,
|
|
293
|
+
ui: this.ui,
|
|
294
|
+
gcloudService: this.gcloudService,
|
|
295
|
+
stitchService: this.stitchService,
|
|
296
|
+
authMode: apiKey ? "apiKey" : "oauth",
|
|
297
|
+
apiKey: apiKey || undefined,
|
|
298
|
+
checks: []
|
|
299
|
+
};
|
|
300
|
+
console.log(`
|
|
301
|
+
${theme.blue("Stitch Doctor")}
|
|
302
|
+
`);
|
|
303
|
+
try {
|
|
304
|
+
let spinner;
|
|
305
|
+
await runSteps(this.steps, context, {
|
|
306
|
+
onBeforeStep: (step) => {
|
|
307
|
+
spinner = createSpinner();
|
|
308
|
+
spinner.start(step.name);
|
|
309
|
+
},
|
|
310
|
+
onAfterStep: (_step, result) => {
|
|
311
|
+
if (result.success) {
|
|
312
|
+
spinner.succeed(result.detail || "Passed");
|
|
313
|
+
} else {
|
|
314
|
+
spinner.fail(result.error?.message || "Failed");
|
|
315
|
+
}
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
const allPassed = context.checks.every((c) => c.passed);
|
|
320
|
+
console.log(`
|
|
321
|
+
${theme.blue("─".repeat(60))}
|
|
322
|
+
`);
|
|
323
|
+
console.log(theme.blue(`Health Check Summary
|
|
324
|
+
`));
|
|
325
|
+
for (const check of context.checks) {
|
|
326
|
+
const icon = check.passed ? theme.green(icons.success) : theme.red(icons.error);
|
|
327
|
+
console.log(`${icon} ${check.name}: ${check.message}`);
|
|
328
|
+
if (check.suggestion && !check.passed) {
|
|
329
|
+
console.log(theme.gray(` → ${check.suggestion}`));
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (input.verbose) {
|
|
333
|
+
const failedChecksWithDetails = context.checks.filter((c) => !c.passed && c.details);
|
|
334
|
+
if (failedChecksWithDetails.length > 0) {
|
|
335
|
+
console.log(`
|
|
336
|
+
${theme.blue("Detailed Error Information")}
|
|
337
|
+
`);
|
|
338
|
+
for (const check of failedChecksWithDetails) {
|
|
339
|
+
console.log(theme.yellow(`${check.name}:`));
|
|
340
|
+
console.log(theme.gray(check.details.split(`
|
|
341
|
+
`).map((line) => ` ${line}`).join(`
|
|
342
|
+
`)));
|
|
343
|
+
console.log("");
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
console.log(`
|
|
348
|
+
${allPassed ? theme.green("All checks passed!") : theme.yellow("Some checks failed")}
|
|
349
|
+
`);
|
|
350
|
+
return {
|
|
351
|
+
success: true,
|
|
352
|
+
data: {
|
|
353
|
+
checks: context.checks,
|
|
354
|
+
allPassed
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
} catch (error) {
|
|
358
|
+
return {
|
|
359
|
+
success: false,
|
|
360
|
+
error: {
|
|
361
|
+
code: "UNKNOWN_ERROR",
|
|
362
|
+
message: error instanceof Error ? error.message : String(error),
|
|
363
|
+
recoverable: false
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
export { DoctorHandler };
|
|
371
|
+
|
|
372
|
+
//# debugId=FB405D19691F8C2E64756E2164756E21
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/doctor/handler.ts", "../src/commands/doctor/steps/ApiKeyDetectedStep.ts", "../src/commands/doctor/steps/GcloudCheckStep.ts", "../src/commands/doctor/steps/AuthCheckStep.ts", "../src/commands/doctor/steps/AdcCheckStep.ts", "../src/commands/doctor/steps/ProjectCheckStep.ts", "../src/commands/doctor/steps/ApiKeyConnectionStep.ts", "../src/commands/doctor/steps/ApiCheckStep.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { type DoctorCommand, type DoctorInput, type DoctorResult } from './spec.js';\nimport { GcloudHandler } from '../../services/gcloud/handler.js';\nimport { type GcloudService } from '../../services/gcloud/spec.js';\nimport { StitchHandler } from '../../services/stitch/handler.js';\nimport { type StitchService } from '../../services/stitch/spec.js';\nimport { theme, icons } from '../../ui/theme.js';\nimport { createSpinner } from '../../ui/spinner.js';\nimport { ConsoleUI } from '../../framework/ConsoleUI.js';\nimport { type UserInterface } from '../../framework/UserInterface.js';\nimport { type DoctorContext } from './context.js';\nimport { type CommandStep } from '../../framework/CommandStep.js';\nimport { runSteps } from '../../framework/StepRunner.js';\nimport dotenv from 'dotenv';\n\nimport { ApiKeyDetectedStep } from './steps/ApiKeyDetectedStep.js';\nimport { GcloudCheckStep } from './steps/GcloudCheckStep.js';\nimport { AuthCheckStep } from './steps/AuthCheckStep.js';\nimport { AdcCheckStep } from './steps/AdcCheckStep.js';\nimport { ProjectCheckStep } from './steps/ProjectCheckStep.js';\nimport { ApiKeyConnectionStep } from './steps/ApiKeyConnectionStep.js';\nimport { ApiCheckStep } from './steps/ApiCheckStep.js';\n\nexport class DoctorHandler implements DoctorCommand {\n private steps: CommandStep<DoctorContext>[];\n private readonly ui: UserInterface;\n\n constructor(\n private readonly gcloudService: GcloudService = new GcloudHandler(),\n private readonly stitchService: StitchService = new StitchHandler(),\n ui?: UserInterface\n ) {\n this.ui = ui || new ConsoleUI();\n this.steps = [\n new ApiKeyDetectedStep(),\n new GcloudCheckStep(),\n new AuthCheckStep(),\n new AdcCheckStep(),\n new ProjectCheckStep(),\n new ApiKeyConnectionStep(),\n new ApiCheckStep(),\n ];\n }\n\n async execute(input: DoctorInput): Promise<DoctorResult> {\n dotenv.config({ quiet: true });\n const apiKey = process.env.STITCH_API_KEY;\n\n const context: DoctorContext = {\n input,\n ui: this.ui,\n gcloudService: this.gcloudService,\n stitchService: this.stitchService,\n authMode: apiKey ? 'apiKey' : 'oauth',\n apiKey: apiKey || undefined,\n checks: []\n };\n\n console.log(`\\n${theme.blue('Stitch Doctor')}\\n`);\n\n try {\n let spinner: ReturnType<typeof createSpinner>;\n await runSteps(this.steps, context, {\n onBeforeStep: (step) => {\n spinner = createSpinner();\n spinner.start(step.name);\n },\n onAfterStep: (_step, result) => {\n if (result.success) {\n spinner.succeed(result.detail || 'Passed');\n } else {\n spinner.fail(result.error?.message || 'Failed');\n }\n return false; // always continue\n },\n });\n\n // Summary\n const allPassed = context.checks.every((c) => c.passed);\n console.log(`\\n${theme.blue('─'.repeat(60))}\\n`);\n console.log(theme.blue('Health Check Summary\\n'));\n\n for (const check of context.checks) {\n const icon = check.passed ? theme.green(icons.success) : theme.red(icons.error);\n console.log(`${icon} ${check.name}: ${check.message}`);\n if (check.suggestion && !check.passed) {\n console.log(theme.gray(` → ${check.suggestion}`));\n }\n }\n\n // Show full error details for failed checks if verbose is enabled\n if (input.verbose) {\n const failedChecksWithDetails = context.checks.filter(c => !c.passed && c.details);\n if (failedChecksWithDetails.length > 0) {\n console.log(`\\n${theme.blue('Detailed Error Information')}\\n`);\n for (const check of failedChecksWithDetails) {\n console.log(theme.yellow(`${check.name}:`));\n console.log(theme.gray(check.details!.split('\\n').map(line => ` ${line}`).join('\\n')));\n console.log('');\n }\n }\n }\n\n console.log(\n `\\n${allPassed ? theme.green('All checks passed!') : theme.yellow('Some checks failed')}\\n`\n );\n\n return {\n success: true,\n data: {\n checks: context.checks,\n allPassed,\n },\n };\n\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'UNKNOWN_ERROR',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n}\n",
|
|
6
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type DoctorContext } from '../context.js';\n\nexport class ApiKeyDetectedStep implements CommandStep<DoctorContext> {\n id = 'api-key-detected';\n name = 'Checking API Key...';\n\n async shouldRun(context: DoctorContext): Promise<boolean> {\n return context.authMode === 'apiKey';\n }\n\n async run(context: DoctorContext): Promise<StepResult> {\n const apiKey = context.apiKey;\n\n if (!apiKey || apiKey.trim().length === 0) {\n const message = 'STITCH_API_KEY is set but empty';\n context.checks.push({\n name: 'API Key',\n passed: false,\n message,\n suggestion: 'Set a valid API key in STITCH_API_KEY environment variable or in your .env file',\n });\n return { success: false, error: new Error(message) };\n }\n\n const masked = apiKey.length > 7\n ? `${apiKey.slice(0, 4)}...${apiKey.slice(-3)}`\n : '***';\n const message = `Detected (${masked})`;\n context.checks.push({\n name: 'API Key',\n passed: true,\n message,\n });\n return { success: true, detail: message };\n }\n}\n",
|
|
7
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type DoctorContext } from '../context.js';\n\nexport class GcloudCheckStep implements CommandStep<DoctorContext> {\n id = 'gcloud-check';\n name = 'Checking Google Cloud CLI...';\n\n async shouldRun(context: DoctorContext): Promise<boolean> {\n return context.authMode === 'oauth';\n }\n\n async run(context: DoctorContext): Promise<StepResult> {\n const gcloudResult = await context.gcloudService.ensureInstalled({\n minVersion: '400.0.0',\n forceLocal: false,\n });\n\n if (gcloudResult.success) {\n const message = `Installed (${gcloudResult.data.location}): v${gcloudResult.data.version}\\n Path: ${gcloudResult.data.path}`;\n context.checks.push({\n name: 'Google Cloud CLI',\n passed: true,\n message,\n });\n return { success: true, detail: message };\n } else {\n const message = 'Not found or invalid version';\n context.checks.push({\n name: 'Google Cloud CLI',\n passed: false,\n message,\n suggestion: 'Run: npx @_davideast/stitch-mcp init',\n });\n return { success: false, error: new Error(message) };\n }\n }\n}\n",
|
|
8
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type DoctorContext } from '../context.js';\n\nexport class AuthCheckStep implements CommandStep<DoctorContext> {\n id = 'auth-check';\n name = 'Checking user authentication...';\n\n async shouldRun(context: DoctorContext): Promise<boolean> {\n return context.authMode === 'oauth';\n }\n\n async run(context: DoctorContext): Promise<StepResult> {\n const authResult = await context.gcloudService.authenticate({ skipIfActive: true });\n\n if (authResult.success) {\n const message = `Authenticated: ${authResult.data.account}`;\n context.checks.push({\n name: 'User Authentication',\n passed: true,\n message,\n });\n return { success: true, detail: message };\n } else {\n const message = 'Not authenticated';\n context.checks.push({\n name: 'User Authentication',\n passed: false,\n message,\n suggestion: 'Run: gcloud auth login',\n });\n return { success: false, error: new Error(message) };\n }\n }\n}\n",
|
|
9
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type DoctorContext } from '../context.js';\n\nexport class AdcCheckStep implements CommandStep<DoctorContext> {\n id = 'adc-check';\n name = 'Checking application credentials...';\n\n async shouldRun(context: DoctorContext): Promise<boolean> {\n return context.authMode === 'oauth';\n }\n\n async run(context: DoctorContext): Promise<StepResult> {\n const adcResult = await context.gcloudService.authenticateADC({ skipIfActive: true });\n\n if (adcResult.success) {\n const message = 'Present';\n context.checks.push({\n name: 'Application Credentials',\n passed: true,\n message,\n });\n return { success: true, detail: message };\n } else {\n const message = 'Not configured';\n context.checks.push({\n name: 'Application Credentials',\n passed: false,\n message,\n suggestion: 'Run: gcloud auth application-default login',\n });\n return { success: false, error: new Error(message) };\n }\n }\n}\n",
|
|
10
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type DoctorContext } from '../context.js';\n\nexport class ProjectCheckStep implements CommandStep<DoctorContext> {\n id = 'project-check';\n name = 'Checking active project...';\n\n async shouldRun(context: DoctorContext): Promise<boolean> {\n return context.authMode === 'oauth';\n }\n\n async run(context: DoctorContext): Promise<StepResult> {\n const projectId = await context.gcloudService.getProjectId();\n\n if (projectId) {\n const message = `Set: ${projectId}`;\n context.checks.push({\n name: 'Active Project',\n passed: true,\n message,\n });\n return { success: true, detail: message };\n } else {\n const message = 'No project configured';\n context.checks.push({\n name: 'Active Project',\n passed: false,\n message,\n suggestion: 'Run: npx @_davideast/stitch-mcp init',\n });\n return { success: false, error: new Error(message) };\n }\n }\n}\n",
|
|
11
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type DoctorContext } from '../context.js';\n\nexport class ApiKeyConnectionStep implements CommandStep<DoctorContext> {\n id = 'api-key-connection';\n name = 'Testing Stitch API...';\n\n async shouldRun(context: DoctorContext): Promise<boolean> {\n if (context.authMode !== 'apiKey') return false;\n const apiKeyCheck = context.checks.find(c => c.name === 'API Key');\n return !!apiKeyCheck && apiKeyCheck.passed;\n }\n\n async run(context: DoctorContext): Promise<StepResult> {\n const testResult = await context.stitchService.testConnectionWithApiKey({\n apiKey: context.apiKey!,\n });\n\n if (testResult.success) {\n const message = `Healthy (${testResult.data.statusCode})`;\n context.checks.push({\n name: 'Stitch API',\n passed: true,\n message,\n });\n return { success: true, detail: message };\n } else {\n const message = testResult.error.message;\n context.checks.push({\n name: 'Stitch API',\n passed: false,\n message,\n suggestion: testResult.error.suggestion,\n details: testResult.error.details,\n });\n return { success: false, error: new Error(message) };\n }\n }\n}\n",
|
|
12
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type DoctorContext } from '../context.js';\n\nexport class ApiCheckStep implements CommandStep<DoctorContext> {\n id = 'api-check';\n name = 'Testing Stitch API...';\n\n async shouldRun(context: DoctorContext): Promise<boolean> {\n if (context.authMode !== 'oauth') return false;\n // Only run if we have a project\n const projectCheck = context.checks.find(c => c.name === 'Active Project');\n return !!projectCheck && projectCheck.passed;\n }\n\n async run(context: DoctorContext): Promise<StepResult> {\n // We need to re-fetch project ID because it's not stored in context state (only in checks array)\n const projectId = await context.gcloudService.getProjectId();\n const accessToken = await context.gcloudService.getAccessToken();\n\n if (projectId && accessToken) {\n const testResult = await context.stitchService.testConnection({\n projectId,\n accessToken,\n });\n\n if (testResult.success) {\n const message = `Healthy (${testResult.data.statusCode})`;\n context.checks.push({\n name: 'Stitch API',\n passed: true,\n message,\n });\n return { success: true, detail: message };\n } else {\n const message = testResult.error.message;\n context.checks.push({\n name: 'Stitch API',\n passed: false,\n message,\n suggestion: testResult.error.suggestion,\n details: testResult.error.details,\n });\n return { success: false, error: new Error(message) };\n }\n } else {\n const message = 'Could not obtain access token';\n context.checks.push({\n name: 'Stitch API',\n passed: false,\n message,\n suggestion: 'Re-run authentication',\n });\n return { success: false, error: new Error(message) };\n }\n }\n}\n"
|
|
13
|
+
],
|
|
14
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;AAYA;;;ACTO,MAAM,mBAAyD;AAAA,EACpE,KAAK;AAAA,EACL,OAAO;AAAA,OAED,UAAS,CAAC,SAA0C;AAAA,IACxD,OAAO,QAAQ,aAAa;AAAA;AAAA,OAGxB,IAAG,CAAC,SAA6C;AAAA,IACrD,MAAM,SAAS,QAAQ;AAAA,IAEvB,IAAI,CAAC,UAAU,OAAO,KAAK,EAAE,WAAW,GAAG;AAAA,MACzC,MAAM,WAAU;AAAA,MAChB,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,OAAO,OAAO,IAAI,MAAM,QAAO,EAAE;AAAA,IACrD;AAAA,IAEA,MAAM,SAAS,OAAO,SAAS,IAC3B,GAAG,OAAO,MAAM,GAAG,CAAC,OAAO,OAAO,MAAM,EAAE,MAC1C;AAAA,IACJ,MAAM,UAAU,aAAa;AAAA,IAC7B,QAAQ,OAAO,KAAK;AAAA,MAClB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,IACD,OAAO,EAAE,SAAS,MAAM,QAAQ,QAAQ;AAAA;AAE5C;;;ACjCO,MAAM,gBAAsD;AAAA,EACjE,KAAK;AAAA,EACL,OAAO;AAAA,OAED,UAAS,CAAC,SAA0C;AAAA,IACxD,OAAO,QAAQ,aAAa;AAAA;AAAA,OAGxB,IAAG,CAAC,SAA6C;AAAA,IACrD,MAAM,eAAe,MAAM,QAAQ,cAAc,gBAAgB;AAAA,MAC/D,YAAY;AAAA,MACZ,YAAY;AAAA,IACd,CAAC;AAAA,IAED,IAAI,aAAa,SAAS;AAAA,MACxB,MAAM,UAAU,cAAc,aAAa,KAAK,eAAe,aAAa,KAAK;AAAA,WAAqB,aAAa,KAAK;AAAA,MACxH,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,MAAM,QAAQ,QAAQ;AAAA,IAC1C,EAAO;AAAA,MACL,MAAM,UAAU;AAAA,MAChB,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,OAAO,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA;AAAA;AAGzD;;;ACjCO,MAAM,cAAoD;AAAA,EAC/D,KAAK;AAAA,EACL,OAAO;AAAA,OAED,UAAS,CAAC,SAA0C;AAAA,IACxD,OAAO,QAAQ,aAAa;AAAA;AAAA,OAGxB,IAAG,CAAC,SAA6C;AAAA,IACrD,MAAM,aAAa,MAAM,QAAQ,cAAc,aAAa,EAAE,cAAc,KAAK,CAAC;AAAA,IAElF,IAAI,WAAW,SAAS;AAAA,MACtB,MAAM,UAAU,kBAAkB,WAAW,KAAK;AAAA,MAClD,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,MAAM,QAAQ,QAAQ;AAAA,IAC1C,EAAO;AAAA,MACL,MAAM,UAAU;AAAA,MAChB,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,OAAO,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA;AAAA;AAGzD;;;AC9BO,MAAM,aAAmD;AAAA,EAC9D,KAAK;AAAA,EACL,OAAO;AAAA,OAED,UAAS,CAAC,SAA0C;AAAA,IACxD,OAAO,QAAQ,aAAa;AAAA;AAAA,OAGxB,IAAG,CAAC,SAA6C;AAAA,IACrD,MAAM,YAAY,MAAM,QAAQ,cAAc,gBAAgB,EAAE,cAAc,KAAK,CAAC;AAAA,IAEpF,IAAI,UAAU,SAAS;AAAA,MACrB,MAAM,UAAU;AAAA,MAChB,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,MAAM,QAAQ,QAAQ;AAAA,IAC1C,EAAO;AAAA,MACL,MAAM,UAAU;AAAA,MAChB,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,OAAO,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA;AAAA;AAGzD;;;AC9BO,MAAM,iBAAuD;AAAA,EAClE,KAAK;AAAA,EACL,OAAO;AAAA,OAED,UAAS,CAAC,SAA0C;AAAA,IACxD,OAAO,QAAQ,aAAa;AAAA;AAAA,OAGxB,IAAG,CAAC,SAA6C;AAAA,IACrD,MAAM,YAAY,MAAM,QAAQ,cAAc,aAAa;AAAA,IAE3D,IAAI,WAAW;AAAA,MACb,MAAM,UAAU,QAAQ;AAAA,MACxB,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,MAAM,QAAQ,QAAQ;AAAA,IAC1C,EAAO;AAAA,MACL,MAAM,UAAU;AAAA,MAChB,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,OAAO,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA;AAAA;AAGzD;;;AC9BO,MAAM,qBAA2D;AAAA,EACtE,KAAK;AAAA,EACL,OAAO;AAAA,OAED,UAAS,CAAC,SAA0C;AAAA,IACxD,IAAI,QAAQ,aAAa;AAAA,MAAU,OAAO;AAAA,IAC1C,MAAM,cAAc,QAAQ,OAAO,KAAK,OAAK,EAAE,SAAS,SAAS;AAAA,IACjE,OAAO,CAAC,CAAC,eAAe,YAAY;AAAA;AAAA,OAGhC,IAAG,CAAC,SAA6C;AAAA,IACrD,MAAM,aAAa,MAAM,QAAQ,cAAc,yBAAyB;AAAA,MACtE,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,IAED,IAAI,WAAW,SAAS;AAAA,MACtB,MAAM,UAAU,YAAY,WAAW,KAAK;AAAA,MAC5C,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,MACF,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,MAAM,QAAQ,QAAQ;AAAA,IAC1C,EAAO;AAAA,MACL,MAAM,UAAU,WAAW,MAAM;AAAA,MACjC,QAAQ,OAAO,KAAK;AAAA,QAClB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,YAAY,WAAW,MAAM;AAAA,QAC7B,SAAS,WAAW,MAAM;AAAA,MAC5B,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,OAAO,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA;AAAA;AAGzD;;;ACnCO,MAAM,aAAmD;AAAA,EAC9D,KAAK;AAAA,EACL,OAAO;AAAA,OAED,UAAS,CAAC,SAA0C;AAAA,IACxD,IAAI,QAAQ,aAAa;AAAA,MAAS,OAAO;AAAA,IAEzC,MAAM,eAAe,QAAQ,OAAO,KAAK,OAAK,EAAE,SAAS,gBAAgB;AAAA,IACzE,OAAO,CAAC,CAAC,gBAAgB,aAAa;AAAA;AAAA,OAGlC,IAAG,CAAC,SAA6C;AAAA,IAErD,MAAM,YAAY,MAAM,QAAQ,cAAc,aAAa;AAAA,IAC3D,MAAM,cAAc,MAAM,QAAQ,cAAc,eAAe;AAAA,IAE/D,IAAI,aAAa,aAAa;AAAA,MAC1B,MAAM,aAAa,MAAM,QAAQ,cAAc,eAAe;AAAA,QAC1D;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,MAED,IAAI,WAAW,SAAS;AAAA,QACpB,MAAM,UAAU,YAAY,WAAW,KAAK;AAAA,QAC5C,QAAQ,OAAO,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,QAAQ;AAAA,UACR;AAAA,QACJ,CAAC;AAAA,QACD,OAAO,EAAE,SAAS,MAAM,QAAQ,QAAQ;AAAA,MAC5C,EAAO;AAAA,QACH,MAAM,UAAU,WAAW,MAAM;AAAA,QACjC,QAAQ,OAAO,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,QAAQ;AAAA,UACR;AAAA,UACA,YAAY,WAAW,MAAM;AAAA,UAC7B,SAAS,WAAW,MAAM;AAAA,QAC9B,CAAC;AAAA,QACD,OAAO,EAAE,SAAS,OAAO,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA;AAAA,IAE3D,EAAO;AAAA,MACH,MAAM,UAAU;AAAA,MAChB,QAAQ,OAAO,KAAK;AAAA,QAChB,MAAM;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,YAAY;AAAA,MAChB,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,OAAO,OAAO,IAAI,MAAM,OAAO,EAAE;AAAA;AAAA;AAG3D;;;APjCO,MAAM,cAAuC;AAAA,EAK/B;AAAA,EACA;AAAA,EALX;AAAA,EACS;AAAA,EAEjB,WAAW,CACQ,gBAA+B,IAAI,eACnC,gBAA+B,IAAI,eACpD,IACA;AAAA,IAHiB;AAAA,IACA;AAAA,IAGjB,KAAK,KAAK,MAAM,IAAI;AAAA,IACpB,KAAK,QAAQ;AAAA,MACX,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAAA;AAAA,OAGI,QAAO,CAAC,OAA2C;AAAA,IACvD,sBAAO,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,IAC7B,MAAM,SAAS,QAAQ,IAAI;AAAA,IAE3B,MAAM,UAAyB;AAAA,MAC7B;AAAA,MACA,IAAI,KAAK;AAAA,MACT,eAAe,KAAK;AAAA,MACpB,eAAe,KAAK;AAAA,MACpB,UAAU,SAAS,WAAW;AAAA,MAC9B,QAAQ,UAAU;AAAA,MAClB,QAAQ,CAAC;AAAA,IACX;AAAA,IAEA,QAAQ,IAAI;AAAA,EAAK,MAAM,KAAK,eAAe;AAAA,CAAK;AAAA,IAEhD,IAAI;AAAA,MACF,IAAI;AAAA,MACJ,MAAM,SAAS,KAAK,OAAO,SAAS;AAAA,QAClC,cAAc,CAAC,SAAS;AAAA,UACtB,UAAU,cAAc;AAAA,UACxB,QAAQ,MAAM,KAAK,IAAI;AAAA;AAAA,QAEzB,aAAa,CAAC,OAAO,WAAW;AAAA,UAC9B,IAAI,OAAO,SAAS;AAAA,YAClB,QAAQ,QAAQ,OAAO,UAAU,QAAQ;AAAA,UAC3C,EAAO;AAAA,YACL,QAAQ,KAAK,OAAO,OAAO,WAAW,QAAQ;AAAA;AAAA,UAEhD,OAAO;AAAA;AAAA,MAEX,CAAC;AAAA,MAGD,MAAM,YAAY,QAAQ,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM;AAAA,MACtD,QAAQ,IAAI;AAAA,EAAK,MAAM,KAAK,IAAG,OAAO,EAAE,CAAC;AAAA,CAAK;AAAA,MAC9C,QAAQ,IAAI,MAAM,KAAK;AAAA,CAAwB,CAAC;AAAA,MAEhD,WAAW,SAAS,QAAQ,QAAQ;AAAA,QAClC,MAAM,OAAO,MAAM,SAAS,MAAM,MAAM,MAAM,OAAO,IAAI,MAAM,IAAI,MAAM,KAAK;AAAA,QAC9E,QAAQ,IAAI,GAAG,QAAQ,MAAM,SAAS,MAAM,SAAS;AAAA,QACrD,IAAI,MAAM,cAAc,CAAC,MAAM,QAAQ;AAAA,UACrC,QAAQ,IAAI,MAAM,KAAK,OAAM,MAAM,YAAY,CAAC;AAAA,QAClD;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,SAAS;AAAA,QACjB,MAAM,0BAA0B,QAAQ,OAAO,OAAO,OAAK,CAAC,EAAE,UAAU,EAAE,OAAO;AAAA,QACjF,IAAI,wBAAwB,SAAS,GAAG;AAAA,UACtC,QAAQ,IAAI;AAAA,EAAK,MAAM,KAAK,4BAA4B;AAAA,CAAK;AAAA,UAC7D,WAAW,SAAS,yBAAyB;AAAA,YAC3C,QAAQ,IAAI,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;AAAA,YAC1C,QAAQ,IAAI,MAAM,KAAK,MAAM,QAAS,MAAM;AAAA,CAAI,EAAE,IAAI,UAAQ,KAAK,MAAM,EAAE,KAAK;AAAA,CAAI,CAAC,CAAC;AAAA,YACtF,QAAQ,IAAI,EAAE;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ,IACN;AAAA,EAAK,YAAY,MAAM,MAAM,oBAAoB,IAAI,MAAM,OAAO,oBAAoB;AAAA,CACxF;AAAA,MAEA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,QAAQ,QAAQ;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO,OAAO;AAAA,MACd,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,aAAa;AAAA,QACf;AAAA,MACF;AAAA;AAAA;AAGN;",
|
|
15
|
+
"debugId": "FB405D19691F8C2E64756E2164756E21",
|
|
16
|
+
"names": []
|
|
17
|
+
}
|