@apex-inc/mcp-server 0.9.2 → 0.9.3
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/api-client.d.ts.map +1 -1
- package/dist/api-client.js +36 -16
- package/dist/api-client.js.map +1 -1
- package/dist/auth.d.ts +25 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +183 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/api-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAOA,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxE;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAID,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,QAEtD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAEvD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,QAMzC;AAED,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,SAAS,CAExD;AAiBD;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6BnE;AA2BD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAUrD;AAiED,wBAAsB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAIxD;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAQxE;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3D;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAQzE"}
|
package/dist/api-client.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MCP_SERVER_VERSION } from "./version.js";
|
|
2
|
+
import { ensureAuth, getAuthToken, reauthAfterFailure } from "./auth.js";
|
|
2
3
|
const BASE_URL = process.env.APEX_URL || process.env.APEX_API_URL || "http://localhost:3001";
|
|
3
4
|
let activeWorkspaceKey = (process.env.APEX_WORKSPACE_KEY || process.env.APEX_PROJECT_KEY);
|
|
4
5
|
let activeOrgId;
|
|
@@ -23,7 +24,9 @@ export function getUserContext() {
|
|
|
23
24
|
return userContext;
|
|
24
25
|
}
|
|
25
26
|
function authHeaders() {
|
|
26
|
-
|
|
27
|
+
// Static APEX_API_KEY, or the current device-flow access token. Both go in
|
|
28
|
+
// the `x-api-key` header so they share the backend's resolution path.
|
|
29
|
+
const key = getAuthToken();
|
|
27
30
|
const headers = {
|
|
28
31
|
"x-apex-source": "mcp-server",
|
|
29
32
|
// OPW-QA-002 — version handshake: the setup page warns when a
|
|
@@ -41,9 +44,13 @@ function authHeaders() {
|
|
|
41
44
|
* Only works with user keys (apex_uk_). Falls back gracefully for org keys.
|
|
42
45
|
*/
|
|
43
46
|
export async function discoverContext() {
|
|
44
|
-
|
|
45
|
-
|
|
47
|
+
await ensureAuth();
|
|
48
|
+
const key = getAuthToken();
|
|
49
|
+
// User-scoped credentials (static user key OR device access token) carry an
|
|
50
|
+
// org graph; org keys (apex_sk_) don't.
|
|
51
|
+
if (!key?.startsWith("apex_uk_") && !key?.startsWith("apex_at_")) {
|
|
46
52
|
return undefined;
|
|
53
|
+
}
|
|
47
54
|
try {
|
|
48
55
|
const res = await fetch(`${BASE_URL}/api/user/orgs`, {
|
|
49
56
|
headers: { ...authHeaders() },
|
|
@@ -129,18 +136,35 @@ async function throwForStatus(method, path, res) {
|
|
|
129
136
|
}
|
|
130
137
|
throw new Error(`${method} ${path} failed (${res.status}): ${text}`);
|
|
131
138
|
}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
139
|
+
/**
|
|
140
|
+
* Single fetch chokepoint: ensures a fresh credential first, and on a 401
|
|
141
|
+
* (device-token expired/revoked) attempts a refresh / re-auth and retries
|
|
142
|
+
* once. Static-key callers don't retry — their 401 is surfaced verbatim.
|
|
143
|
+
*/
|
|
144
|
+
async function fetchWithAuth(path, init) {
|
|
145
|
+
await ensureAuth();
|
|
146
|
+
const build = () => ({
|
|
147
|
+
...init,
|
|
148
|
+
headers: { ...init.headers, ...authHeaders() },
|
|
135
149
|
});
|
|
150
|
+
let res = await fetch(`${BASE_URL}${path}`, build());
|
|
151
|
+
if (res.status === 401 && !process.env.APEX_API_KEY) {
|
|
152
|
+
if (await reauthAfterFailure()) {
|
|
153
|
+
res = await fetch(`${BASE_URL}${path}`, build());
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return res;
|
|
157
|
+
}
|
|
158
|
+
export async function apiGet(path) {
|
|
159
|
+
const res = await fetchWithAuth(path, { method: "GET" });
|
|
136
160
|
if (!res.ok)
|
|
137
161
|
await throwForStatus("GET", path, res);
|
|
138
162
|
return res.json();
|
|
139
163
|
}
|
|
140
164
|
export async function apiPost(path, body) {
|
|
141
|
-
const res = await
|
|
165
|
+
const res = await fetchWithAuth(path, {
|
|
142
166
|
method: "POST",
|
|
143
|
-
headers: { "Content-Type": "application/json"
|
|
167
|
+
headers: { "Content-Type": "application/json" },
|
|
144
168
|
body: JSON.stringify(body),
|
|
145
169
|
});
|
|
146
170
|
if (!res.ok)
|
|
@@ -155,12 +179,11 @@ export async function apiPost(path, body) {
|
|
|
155
179
|
* `${runId}:${eventType}`).
|
|
156
180
|
*/
|
|
157
181
|
export async function postWithIdempotency(path, idempotencyKey, body) {
|
|
158
|
-
const res = await
|
|
182
|
+
const res = await fetchWithAuth(path, {
|
|
159
183
|
method: "POST",
|
|
160
184
|
headers: {
|
|
161
185
|
"Content-Type": "application/json",
|
|
162
186
|
"idempotency-key": idempotencyKey,
|
|
163
|
-
...authHeaders(),
|
|
164
187
|
},
|
|
165
188
|
body: JSON.stringify(body),
|
|
166
189
|
});
|
|
@@ -169,17 +192,14 @@ export async function postWithIdempotency(path, idempotencyKey, body) {
|
|
|
169
192
|
return res.json();
|
|
170
193
|
}
|
|
171
194
|
export async function apiDelete(path) {
|
|
172
|
-
const res = await
|
|
173
|
-
method: "DELETE",
|
|
174
|
-
headers: { ...authHeaders() },
|
|
175
|
-
});
|
|
195
|
+
const res = await fetchWithAuth(path, { method: "DELETE" });
|
|
176
196
|
if (!res.ok)
|
|
177
197
|
await throwForStatus("DELETE", path, res);
|
|
178
198
|
}
|
|
179
199
|
export async function apiPatch(path, body) {
|
|
180
|
-
const res = await
|
|
200
|
+
const res = await fetchWithAuth(path, {
|
|
181
201
|
method: "PATCH",
|
|
182
|
-
headers: { "Content-Type": "application/json"
|
|
202
|
+
headers: { "Content-Type": "application/json" },
|
|
183
203
|
body: JSON.stringify(body),
|
|
184
204
|
});
|
|
185
205
|
if (!res.ok)
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device-authorization auth for the Apex MCP server (RFC 8628).
|
|
3
|
+
*
|
|
4
|
+
* Precedence:
|
|
5
|
+
* 1. APEX_API_KEY env var → static key, used as-is (back-compat).
|
|
6
|
+
* 2. Stored device creds → ~/.apex/credentials.json (access + refresh).
|
|
7
|
+
* 3. Device flow → print a verification URL, poll, persist.
|
|
8
|
+
*
|
|
9
|
+
* Access tokens are short-lived; we refresh proactively before expiry and
|
|
10
|
+
* re-run the device flow if the refresh token is gone/revoked. See
|
|
11
|
+
* plans/mcp-device-auth-flow-2026-06.md.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Ensure a usable credential is in memory. Call once at startup and before
|
|
15
|
+
* requests. No-op (returns the static key) when APEX_API_KEY is set.
|
|
16
|
+
*/
|
|
17
|
+
export declare function ensureAuth(): Promise<void>;
|
|
18
|
+
/** The credential to send (static key, or current device access token). */
|
|
19
|
+
export declare function getAuthToken(): string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Called after a 401: try a refresh, then a full re-auth. Returns true if a
|
|
22
|
+
* fresh credential is now available to retry with.
|
|
23
|
+
*/
|
|
24
|
+
export declare function reauthAfterFailure(): Promise<boolean>;
|
|
25
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsKH;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAchD;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS3D"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device-authorization auth for the Apex MCP server (RFC 8628).
|
|
3
|
+
*
|
|
4
|
+
* Precedence:
|
|
5
|
+
* 1. APEX_API_KEY env var → static key, used as-is (back-compat).
|
|
6
|
+
* 2. Stored device creds → ~/.apex/credentials.json (access + refresh).
|
|
7
|
+
* 3. Device flow → print a verification URL, poll, persist.
|
|
8
|
+
*
|
|
9
|
+
* Access tokens are short-lived; we refresh proactively before expiry and
|
|
10
|
+
* re-run the device flow if the refresh token is gone/revoked. See
|
|
11
|
+
* plans/mcp-device-auth-flow-2026-06.md.
|
|
12
|
+
*/
|
|
13
|
+
import { homedir } from "node:os";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync, chmodSync, } from "node:fs";
|
|
16
|
+
const BASE_URL = process.env.APEX_URL || process.env.APEX_API_URL || "http://localhost:3001";
|
|
17
|
+
let creds = null;
|
|
18
|
+
let loaded = false;
|
|
19
|
+
const CRED_DIR = join(homedir(), ".apex");
|
|
20
|
+
const CRED_FILE = join(CRED_DIR, "credentials.json");
|
|
21
|
+
function credKey() {
|
|
22
|
+
return BASE_URL.replace(/\/+$/, "");
|
|
23
|
+
}
|
|
24
|
+
function loadCreds() {
|
|
25
|
+
try {
|
|
26
|
+
if (!existsSync(CRED_FILE))
|
|
27
|
+
return null;
|
|
28
|
+
const all = JSON.parse(readFileSync(CRED_FILE, "utf8"));
|
|
29
|
+
return all[credKey()] ?? null;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function saveCreds(next) {
|
|
36
|
+
creds = next;
|
|
37
|
+
try {
|
|
38
|
+
mkdirSync(CRED_DIR, { recursive: true });
|
|
39
|
+
let all = {};
|
|
40
|
+
if (existsSync(CRED_FILE)) {
|
|
41
|
+
try {
|
|
42
|
+
all = JSON.parse(readFileSync(CRED_FILE, "utf8"));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
all = {};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
all[credKey()] = next;
|
|
49
|
+
writeFileSync(CRED_FILE, JSON.stringify(all, null, 2));
|
|
50
|
+
try {
|
|
51
|
+
chmodSync(CRED_FILE, 0o600);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
/* best-effort on platforms without POSIX perms */
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Non-fatal — we still hold creds in memory for this session.
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function applyTokenResponse(j) {
|
|
62
|
+
if (!j.access_token || !j.refresh_token)
|
|
63
|
+
return false;
|
|
64
|
+
saveCreds({
|
|
65
|
+
accessToken: j.access_token,
|
|
66
|
+
refreshToken: j.refresh_token,
|
|
67
|
+
expiresAt: Date.now() + (j.expires_in ?? 3600) * 1000,
|
|
68
|
+
});
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
72
|
+
async function tryRefresh() {
|
|
73
|
+
if (!creds?.refreshToken)
|
|
74
|
+
return false;
|
|
75
|
+
try {
|
|
76
|
+
const res = await fetch(`${BASE_URL}/api/auth/device/token`, {
|
|
77
|
+
method: "POST",
|
|
78
|
+
headers: { "Content-Type": "application/json" },
|
|
79
|
+
body: JSON.stringify({
|
|
80
|
+
grant_type: "refresh_token",
|
|
81
|
+
refresh_token: creds.refreshToken,
|
|
82
|
+
}),
|
|
83
|
+
});
|
|
84
|
+
if (!res.ok)
|
|
85
|
+
return false;
|
|
86
|
+
return applyTokenResponse((await res.json()));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function runDeviceFlow() {
|
|
93
|
+
const start = await fetch(`${BASE_URL}/api/auth/device/code`, {
|
|
94
|
+
method: "POST",
|
|
95
|
+
headers: { "Content-Type": "application/json" },
|
|
96
|
+
body: JSON.stringify({ client: "Apex MCP server" }),
|
|
97
|
+
});
|
|
98
|
+
if (!start.ok) {
|
|
99
|
+
throw new Error(`Couldn't start device authorization (${start.status}). Set APEX_API_KEY ` +
|
|
100
|
+
`to connect with a static key instead.`);
|
|
101
|
+
}
|
|
102
|
+
const d = (await start.json());
|
|
103
|
+
console.error(`\n[apex] Connect this editor to Apex:\n` +
|
|
104
|
+
` → Open ${d.verification_uri_complete}\n` +
|
|
105
|
+
` → Confirm the code: ${d.user_code}\n` +
|
|
106
|
+
` (waiting for approval…)\n`);
|
|
107
|
+
const deadline = Date.now() + d.expires_in * 1000;
|
|
108
|
+
let intervalMs = (d.interval || 5) * 1000;
|
|
109
|
+
while (Date.now() < deadline) {
|
|
110
|
+
await sleep(intervalMs);
|
|
111
|
+
let body = {};
|
|
112
|
+
try {
|
|
113
|
+
const res = await fetch(`${BASE_URL}/api/auth/device/token`, {
|
|
114
|
+
method: "POST",
|
|
115
|
+
headers: { "Content-Type": "application/json" },
|
|
116
|
+
body: JSON.stringify({
|
|
117
|
+
grant_type: "device_code",
|
|
118
|
+
device_code: d.device_code,
|
|
119
|
+
}),
|
|
120
|
+
});
|
|
121
|
+
body = (await res.json().catch(() => ({})));
|
|
122
|
+
if (res.ok && applyTokenResponse(body)) {
|
|
123
|
+
console.error("[apex] Connected.");
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// transient — keep polling
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const err = String(body.error ?? "");
|
|
132
|
+
if (err === "slow_down")
|
|
133
|
+
intervalMs += 5000;
|
|
134
|
+
else if (err === "authorization_pending")
|
|
135
|
+
continue;
|
|
136
|
+
else
|
|
137
|
+
throw new Error(`Device authorization failed: ${err || "unknown"}`);
|
|
138
|
+
}
|
|
139
|
+
throw new Error("Device authorization timed out — restart the editor to retry.");
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Ensure a usable credential is in memory. Call once at startup and before
|
|
143
|
+
* requests. No-op (returns the static key) when APEX_API_KEY is set.
|
|
144
|
+
*/
|
|
145
|
+
export async function ensureAuth() {
|
|
146
|
+
if (process.env.APEX_API_KEY)
|
|
147
|
+
return;
|
|
148
|
+
if (!loaded) {
|
|
149
|
+
creds = loadCreds();
|
|
150
|
+
loaded = true;
|
|
151
|
+
}
|
|
152
|
+
if (!creds) {
|
|
153
|
+
await runDeviceFlow();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
if (Date.now() >= creds.expiresAt - 60_000) {
|
|
157
|
+
const ok = await tryRefresh();
|
|
158
|
+
if (!ok)
|
|
159
|
+
await runDeviceFlow();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** The credential to send (static key, or current device access token). */
|
|
163
|
+
export function getAuthToken() {
|
|
164
|
+
return process.env.APEX_API_KEY ?? creds?.accessToken;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Called after a 401: try a refresh, then a full re-auth. Returns true if a
|
|
168
|
+
* fresh credential is now available to retry with.
|
|
169
|
+
*/
|
|
170
|
+
export async function reauthAfterFailure() {
|
|
171
|
+
if (process.env.APEX_API_KEY)
|
|
172
|
+
return false; // static key — nothing to refresh
|
|
173
|
+
if (await tryRefresh())
|
|
174
|
+
return true;
|
|
175
|
+
try {
|
|
176
|
+
await runDeviceFlow();
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { toolDefinitions } from "./tools.js";
|
|
|
6
6
|
import { resourceDefinitions } from "./resources.js";
|
|
7
7
|
import { promptDefinitions } from "./prompts.js";
|
|
8
8
|
import { sendStartupPing, discoverContext } from "./api-client.js";
|
|
9
|
+
import { ensureAuth } from "./auth.js";
|
|
9
10
|
import { MCP_SERVER_VERSION } from "./version.js";
|
|
10
11
|
const server = new McpServer({ name: "apex", version: MCP_SERVER_VERSION }, {
|
|
11
12
|
instructions: [
|
|
@@ -49,6 +50,16 @@ server.prompt("experiment-review", "Review experiment results, see what you lear
|
|
|
49
50
|
async function main() {
|
|
50
51
|
const transport = new StdioServerTransport();
|
|
51
52
|
await server.connect(transport);
|
|
53
|
+
// Establish auth before discovery: static APEX_API_KEY is used as-is;
|
|
54
|
+
// otherwise this runs the device-authorization flow (prints a URL to
|
|
55
|
+
// approve) or refreshes stored tokens. Non-fatal so the server still
|
|
56
|
+
// starts and tools can report an actionable auth error.
|
|
57
|
+
try {
|
|
58
|
+
await ensureAuth();
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(`[apex] ${err instanceof Error ? err.message : String(err)}`);
|
|
62
|
+
}
|
|
52
63
|
const startupMsg = await discoverContext();
|
|
53
64
|
if (startupMsg) {
|
|
54
65
|
console.error(`[apex] ${startupMsg}`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAC7C;IACE,YAAY,EAAE;QACZ,gGAAgG;QAChG,gGAAgG;QAChG,uGAAuG;QACvG,6FAA6F;QAC7F,uFAAuF;QACvF,kGAAkG;QAClG,uFAAuF;QACvF,+DAA+D;QAC/D,qFAAqF;QACrF,+EAA+E;KAChF,CAAC,IAAI,CAAC,GAAG,CAAC;CACZ,CACF,CAAC;AAEF,yBAAyB;AAEzB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;IAC1D,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC3F,IAAI,CAAC;YACH,OAAO,MAAM,GAAG,CAAC,OAAO,CAAC,IAAa,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6BAA6B;AAE7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;IACrD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,EAAE;QACtG,OAAO,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2BAA2B;AAE3B,MAAM,CAAC,MAAM,CACX,gBAAgB,EAChB,+FAA+F,EAC/F,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,EACxE,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,IAA8B,CAAC,CACtF,CAAC;AAEF,MAAM,CAAC,MAAM,CACX,mBAAmB,EACnB,6EAA6E,EAC7E,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE,EACpE,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,IAA8B,CAAC,CACzF,CAAC;AAEF,gBAAgB;AAEhB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,MAAM,eAAe,EAAE,CAAC;IAC3C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,eAAe,EAAE,CAAC;AACpB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|