@wootsup/mcp 0.1.0-rc.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/CHANGELOG.md +91 -0
- package/LICENSE +21 -0
- package/README.md +179 -0
- package/SECURITY.md +163 -0
- package/dist/auth/keychain.d.ts +47 -0
- package/dist/auth/keychain.js +262 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/auth/oauth-provider.d.ts +68 -0
- package/dist/auth/oauth-provider.js +232 -0
- package/dist/auth/oauth-provider.js.map +1 -0
- package/dist/auth/profiles.d.ts +52 -0
- package/dist/auth/profiles.js +200 -0
- package/dist/auth/profiles.js.map +1 -0
- package/dist/auth/token.d.ts +27 -0
- package/dist/auth/token.js +88 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/dist/install-skill.d.ts +23 -0
- package/dist/install-skill.js +73 -0
- package/dist/install-skill.js.map +1 -0
- package/dist/modules/apimapper/cache.d.ts +2 -0
- package/dist/modules/apimapper/cache.js +71 -0
- package/dist/modules/apimapper/cache.js.map +1 -0
- package/dist/modules/apimapper/client.d.ts +85 -0
- package/dist/modules/apimapper/client.js +523 -0
- package/dist/modules/apimapper/client.js.map +1 -0
- package/dist/modules/apimapper/connections.d.ts +2 -0
- package/dist/modules/apimapper/connections.js +406 -0
- package/dist/modules/apimapper/connections.js.map +1 -0
- package/dist/modules/apimapper/credential-sanitizer.d.ts +7 -0
- package/dist/modules/apimapper/credential-sanitizer.js +70 -0
- package/dist/modules/apimapper/credential-sanitizer.js.map +1 -0
- package/dist/modules/apimapper/credentials.d.ts +2 -0
- package/dist/modules/apimapper/credentials.js +258 -0
- package/dist/modules/apimapper/credentials.js.map +1 -0
- package/dist/modules/apimapper/diagnose.d.ts +18 -0
- package/dist/modules/apimapper/diagnose.js +305 -0
- package/dist/modules/apimapper/diagnose.js.map +1 -0
- package/dist/modules/apimapper/flows.d.ts +2 -0
- package/dist/modules/apimapper/flows.js +372 -0
- package/dist/modules/apimapper/flows.js.map +1 -0
- package/dist/modules/apimapper/get-skill.d.ts +4 -0
- package/dist/modules/apimapper/get-skill.js +88 -0
- package/dist/modules/apimapper/get-skill.js.map +1 -0
- package/dist/modules/apimapper/graph-builder.d.ts +47 -0
- package/dist/modules/apimapper/graph-builder.js +117 -0
- package/dist/modules/apimapper/graph-builder.js.map +1 -0
- package/dist/modules/apimapper/graph.d.ts +2 -0
- package/dist/modules/apimapper/graph.js +117 -0
- package/dist/modules/apimapper/graph.js.map +1 -0
- package/dist/modules/apimapper/index.d.ts +2 -0
- package/dist/modules/apimapper/index.js +43 -0
- package/dist/modules/apimapper/index.js.map +1 -0
- package/dist/modules/apimapper/inspect.d.ts +20 -0
- package/dist/modules/apimapper/inspect.js +86 -0
- package/dist/modules/apimapper/inspect.js.map +1 -0
- package/dist/modules/apimapper/library.d.ts +2 -0
- package/dist/modules/apimapper/library.js +237 -0
- package/dist/modules/apimapper/library.js.map +1 -0
- package/dist/modules/apimapper/license.d.ts +2 -0
- package/dist/modules/apimapper/license.js +142 -0
- package/dist/modules/apimapper/license.js.map +1 -0
- package/dist/modules/apimapper/local-sources.d.ts +2 -0
- package/dist/modules/apimapper/local-sources.js +123 -0
- package/dist/modules/apimapper/local-sources.js.map +1 -0
- package/dist/modules/apimapper/misc.d.ts +2 -0
- package/dist/modules/apimapper/misc.js +149 -0
- package/dist/modules/apimapper/misc.js.map +1 -0
- package/dist/modules/apimapper/node-schema.d.ts +217 -0
- package/dist/modules/apimapper/node-schema.js +218 -0
- package/dist/modules/apimapper/node-schema.js.map +1 -0
- package/dist/modules/apimapper/normalizers.d.ts +13 -0
- package/dist/modules/apimapper/normalizers.js +37 -0
- package/dist/modules/apimapper/normalizers.js.map +1 -0
- package/dist/modules/apimapper/onboarding.d.ts +51 -0
- package/dist/modules/apimapper/onboarding.js +201 -0
- package/dist/modules/apimapper/onboarding.js.map +1 -0
- package/dist/modules/apimapper/schema.d.ts +2 -0
- package/dist/modules/apimapper/schema.js +84 -0
- package/dist/modules/apimapper/schema.js.map +1 -0
- package/dist/modules/apimapper/settings.d.ts +2 -0
- package/dist/modules/apimapper/settings.js +157 -0
- package/dist/modules/apimapper/settings.js.map +1 -0
- package/dist/modules/apimapper/skill-resources.d.ts +4 -0
- package/dist/modules/apimapper/skill-resources.js +85 -0
- package/dist/modules/apimapper/skill-resources.js.map +1 -0
- package/dist/modules/apimapper/types.d.ts +111 -0
- package/dist/modules/apimapper/types.js +14 -0
- package/dist/modules/apimapper/types.js.map +1 -0
- package/dist/modules/apimapper/use-profile.d.ts +34 -0
- package/dist/modules/apimapper/use-profile.js +176 -0
- package/dist/modules/apimapper/use-profile.js.map +1 -0
- package/dist/modules/apimapper/workflows.d.ts +2 -0
- package/dist/modules/apimapper/workflows.js +301 -0
- package/dist/modules/apimapper/workflows.js.map +1 -0
- package/dist/platform/index.d.ts +71 -0
- package/dist/platform/index.js +377 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/server-http.d.ts +22 -0
- package/dist/server-http.js +159 -0
- package/dist/server-http.js.map +1 -0
- package/dist/setup/detect-clients.d.ts +39 -0
- package/dist/setup/detect-clients.js +152 -0
- package/dist/setup/detect-clients.js.map +1 -0
- package/dist/setup/probe-handshake.d.ts +26 -0
- package/dist/setup/probe-handshake.js +159 -0
- package/dist/setup/probe-handshake.js.map +1 -0
- package/dist/setup/write-config.d.ts +25 -0
- package/dist/setup/write-config.js +247 -0
- package/dist/setup/write-config.js.map +1 -0
- package/dist/setup-cli.d.ts +49 -0
- package/dist/setup-cli.js +292 -0
- package/dist/setup-cli.js.map +1 -0
- package/dist/skill-instructions.d.ts +10 -0
- package/dist/skill-instructions.js +68 -0
- package/dist/skill-instructions.js.map +1 -0
- package/dist/transports/http.d.ts +29 -0
- package/dist/transports/http.js +267 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/stdio.d.ts +9 -0
- package/dist/transports/stdio.js +19 -0
- package/dist/transports/stdio.js.map +1 -0
- package/docs/architecture.md +140 -0
- package/docs/customgraph-internal-migration.md +210 -0
- package/docs/security.md +126 -0
- package/docs/tools.md +230 -0
- package/manifest.json +76 -0
- package/package.json +61 -0
- package/skills/apimapper/SKILL.md +57 -0
- package/skills/apimapper/reference/joomla.md +85 -0
- package/skills/apimapper/reference/oauth.md +94 -0
- package/skills/apimapper/reference/troubleshooting.md +123 -0
- package/skills/apimapper/reference/yootheme.md +96 -0
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
// src/modules/apimapper/client.ts — Platform-driven REST client for API Mapper.
|
|
2
|
+
//
|
|
3
|
+
// Two-layer architecture (preserves backwards-compat with the 12 modules that
|
|
4
|
+
// import `request`, `hintFor`, `WP_BASE`, `WP_USER`, `authConfigured`):
|
|
5
|
+
//
|
|
6
|
+
// Layer 1 (NEW) — Platform-driven client
|
|
7
|
+
// createPlatformClient(platform).request(action, init) → ExtApiResponse
|
|
8
|
+
// The Platform tells us how to build the URL, attach auth, and unwrap
|
|
9
|
+
// the response envelope. Works for WordPress, Joomla, and (eventually)
|
|
10
|
+
// Standalone.
|
|
11
|
+
//
|
|
12
|
+
// Layer 2 (LEGACY) — Module-level `request()` function
|
|
13
|
+
// The existing `request(path, init, opts)` is preserved for the 12 modules
|
|
14
|
+
// that already call it. It's a thin wrapper that builds a default
|
|
15
|
+
// WordPressPlatform from APIMAPPER_WP_* env vars + uses Basic auth (legacy
|
|
16
|
+
// Application Password) instead of Bearer. New code should use
|
|
17
|
+
// createPlatformClient() directly.
|
|
18
|
+
//
|
|
19
|
+
// Defense-in-depth:
|
|
20
|
+
// - sanitizeErrorString() strips Authorization headers + base64 tokens
|
|
21
|
+
// before any error reaches MCP responses.
|
|
22
|
+
// - Bearer token / Basic token built once at client construction.
|
|
23
|
+
// - Missing credentials → fail-fast in production, silent in tests (legacy
|
|
24
|
+
// path only — Platform path is config-driven).
|
|
25
|
+
import { createHttpClient } from "@getimo/mcp-toolkit";
|
|
26
|
+
import { sanitizeSecrets } from "./credential-sanitizer.js";
|
|
27
|
+
import { WordPressPlatform, JoomlaPlatform } from "../../platform/index.js";
|
|
28
|
+
// DXT / setup-CLI environment bootstrap. The setup wizard writes the
|
|
29
|
+
// MCP key as APIMAPPER_TOKEN and the site URL as APIMAPPER_SITE_URL.
|
|
30
|
+
// Legacy callers (R7 verify scripts, CustomGraph internal use) still
|
|
31
|
+
// expose APIMAPPER_WP_BASE + APIMAPPER_WP_APP_PASS. We bridge both
|
|
32
|
+
// directions HERE — at the top of this module — because ESM hoists
|
|
33
|
+
// imports above any code in src/index.ts. If the env mapping lived in
|
|
34
|
+
// index.ts (the previous design), this client.ts would observe
|
|
35
|
+
// APIMAPPER_WP_APP_PASS=='' at module-evaluation time and produce a
|
|
36
|
+
// broken (un-authed) client even though APIMAPPER_TOKEN was set.
|
|
37
|
+
// Closes Finding #14 (2026-05-18 walkthrough).
|
|
38
|
+
if (process.env.APIMAPPER_TOKEN && !process.env.APIMAPPER_WP_APP_PASS) {
|
|
39
|
+
process.env.APIMAPPER_WP_APP_PASS = process.env.APIMAPPER_TOKEN;
|
|
40
|
+
}
|
|
41
|
+
if (process.env.APIMAPPER_SITE_URL && !process.env.APIMAPPER_WP_BASE) {
|
|
42
|
+
process.env.APIMAPPER_WP_BASE = process.env.APIMAPPER_SITE_URL;
|
|
43
|
+
}
|
|
44
|
+
export const WP_BASE = (process.env.APIMAPPER_WP_BASE || "https://dev.wootsup.com/wordpress").replace(/\/$/, "");
|
|
45
|
+
export const WP_USER = process.env.APIMAPPER_WP_USER || "getimo";
|
|
46
|
+
export const WP_APP_PASS = process.env.APIMAPPER_WP_APP_PASS || "";
|
|
47
|
+
// Auth-shape detection: the credential the customer pastes during setup can
|
|
48
|
+
// be either a WordPress Application Password (legacy / power-user path) or
|
|
49
|
+
// an MCP key in `amk_live_…` / `amk_test_…` shape (the new Phase-1 flow).
|
|
50
|
+
// We mirror this on the server (RestControllerTrait::checkPermissions
|
|
51
|
+
// accepts both); the client must too. Bearer tokens go straight through
|
|
52
|
+
// `Authorization: Bearer <token>`; App Passwords get base64'd as
|
|
53
|
+
// `Authorization: Basic base64(user:pass)`.
|
|
54
|
+
const IS_MCP_BEARER = /^amk_(live|test)_/.test(WP_APP_PASS);
|
|
55
|
+
const BASIC_TOKEN = !IS_MCP_BEARER && WP_APP_PASS
|
|
56
|
+
? Buffer.from(`${WP_USER}:${WP_APP_PASS}`, "utf8").toString("base64")
|
|
57
|
+
: "";
|
|
58
|
+
const BEARER_TOKEN = IS_MCP_BEARER ? WP_APP_PASS : "";
|
|
59
|
+
if (!BASIC_TOKEN && !BEARER_TOKEN && process.env.NODE_ENV === "production") {
|
|
60
|
+
// Fail-fast: prevents silent unauthenticated client → opaque 401s downstream.
|
|
61
|
+
// In test/dev we keep the client buildable so unit tests don't require a vault.
|
|
62
|
+
console.error("[apimapper-rest] ERROR: APIMAPPER_WP_APP_PASS / APIMAPPER_TOKEN is not " +
|
|
63
|
+
"set. Set via 1Password (see README.md). Refusing to start in production.");
|
|
64
|
+
process.exit(2);
|
|
65
|
+
}
|
|
66
|
+
const rawApi = createHttpClient({
|
|
67
|
+
baseUrl: `${WP_BASE}/wp-json/api-mapper/v1`,
|
|
68
|
+
auth: BEARER_TOKEN
|
|
69
|
+
? { type: "bearer", token: BEARER_TOKEN }
|
|
70
|
+
: BASIC_TOKEN
|
|
71
|
+
? { type: "basic", token: BASIC_TOKEN }
|
|
72
|
+
: undefined,
|
|
73
|
+
defaultHeaders: { "X-Requested-With": "XMLHttpRequest" },
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* Sanitise an error string so it cannot leak the Basic-auth token, base64
|
|
77
|
+
* sequences, or upstream Authorization headers into MCP responses.
|
|
78
|
+
*/
|
|
79
|
+
export function sanitizeErrorString(s) {
|
|
80
|
+
if (!s)
|
|
81
|
+
return s;
|
|
82
|
+
// Widened to cover any scheme (Basic, Bearer, Digest, JWT, etc.):
|
|
83
|
+
let out = s.replace(/Authorization:\s*[A-Za-z]+\s+[^\s,;"']+/gi, "Authorization: [REDACTED]");
|
|
84
|
+
if (BASIC_TOKEN)
|
|
85
|
+
out = out.replaceAll(BASIC_TOKEN, "[REDACTED]");
|
|
86
|
+
if (BEARER_TOKEN)
|
|
87
|
+
out = out.replaceAll(BEARER_TOKEN, "[REDACTED]");
|
|
88
|
+
if (WP_APP_PASS)
|
|
89
|
+
out = out.replaceAll(WP_APP_PASS, "[REDACTED]");
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
function classify(status) {
|
|
93
|
+
if (status === undefined)
|
|
94
|
+
return "network";
|
|
95
|
+
if (status === 401 || status === 403)
|
|
96
|
+
return "auth";
|
|
97
|
+
if (status === 404)
|
|
98
|
+
return "not_found";
|
|
99
|
+
if (status === 429)
|
|
100
|
+
return "rate_limit";
|
|
101
|
+
if (status >= 500)
|
|
102
|
+
return "server";
|
|
103
|
+
return "unknown";
|
|
104
|
+
}
|
|
105
|
+
const DEFAULT_TIMEOUT_MS = 45_000;
|
|
106
|
+
const MIN_TIMEOUT_MS = 1_000;
|
|
107
|
+
const MAX_TIMEOUT_MS = 300_000;
|
|
108
|
+
function resolveTimeout(opts) {
|
|
109
|
+
const t = opts?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
110
|
+
return Math.max(MIN_TIMEOUT_MS, Math.min(MAX_TIMEOUT_MS, t));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a Platform-aware HTTP client. The Platform handles URL construction,
|
|
114
|
+
* auth header injection, and response envelope unwrap (e.g. Joomla's
|
|
115
|
+
* `{success, data, error}` shape).
|
|
116
|
+
*
|
|
117
|
+
* All errors are sanitised via `sanitizeErrorString()` before being returned.
|
|
118
|
+
*/
|
|
119
|
+
export function createPlatformClient(platform) {
|
|
120
|
+
return {
|
|
121
|
+
platform,
|
|
122
|
+
request: async (action, init = {}, opts = {}) => {
|
|
123
|
+
let status;
|
|
124
|
+
const timeoutMs = resolveTimeout(opts);
|
|
125
|
+
try {
|
|
126
|
+
const url = platform.buildUrl(action);
|
|
127
|
+
const res = await fetch(url, {
|
|
128
|
+
...init,
|
|
129
|
+
headers: {
|
|
130
|
+
Accept: "application/json",
|
|
131
|
+
"Content-Type": "application/json",
|
|
132
|
+
"X-Requested-With": "XMLHttpRequest",
|
|
133
|
+
...platform.buildAuthHeaders(init.method ?? "GET"),
|
|
134
|
+
...init.headers,
|
|
135
|
+
},
|
|
136
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
137
|
+
});
|
|
138
|
+
status = res.status;
|
|
139
|
+
const text = await res.text();
|
|
140
|
+
if (!res.ok) {
|
|
141
|
+
let parsed = text;
|
|
142
|
+
try {
|
|
143
|
+
parsed = JSON.parse(text);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// keep as text
|
|
147
|
+
}
|
|
148
|
+
const errMsg = typeof parsed === "object" && parsed && "message" in parsed
|
|
149
|
+
? String(parsed.message)
|
|
150
|
+
: typeof parsed === "object" && parsed && "error" in parsed
|
|
151
|
+
? String(parsed.error)
|
|
152
|
+
: `HTTP ${res.status}`;
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
error: sanitizeErrorString(errMsg),
|
|
156
|
+
status,
|
|
157
|
+
errorCode: classify(status),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
if (!text)
|
|
161
|
+
return { success: true, data: {}, status };
|
|
162
|
+
let data;
|
|
163
|
+
try {
|
|
164
|
+
data = JSON.parse(text);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Non-JSON body — pass through as text.
|
|
168
|
+
return { success: true, data: text, status };
|
|
169
|
+
}
|
|
170
|
+
// Run the platform-specific envelope unwrap. Joomla throws on
|
|
171
|
+
// success:false; we translate that to a structured failure so
|
|
172
|
+
// tools see a uniform shape regardless of platform.
|
|
173
|
+
let unwrapped;
|
|
174
|
+
try {
|
|
175
|
+
unwrapped = platform.parseResponse(data, init.method ?? "GET");
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
return {
|
|
179
|
+
success: false,
|
|
180
|
+
error: sanitizeErrorString(e instanceof Error ? e.message : String(e)),
|
|
181
|
+
status,
|
|
182
|
+
errorCode: "unknown",
|
|
183
|
+
payloadFailed: true,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// unwrapInnerSuccess for WordPress: treat 200 + `{success:false}`
|
|
187
|
+
// payload as error (WP REST sometimes returns inner-success envelopes
|
|
188
|
+
// for connection_test, license_activate, etc.).
|
|
189
|
+
if (opts.unwrapInnerSuccess &&
|
|
190
|
+
unwrapped &&
|
|
191
|
+
typeof unwrapped === "object" &&
|
|
192
|
+
"success" in unwrapped) {
|
|
193
|
+
const inner = unwrapped.success;
|
|
194
|
+
if (inner === false) {
|
|
195
|
+
const innerErr = unwrapped.error !== undefined
|
|
196
|
+
? String(unwrapped.error)
|
|
197
|
+
: "operation reported success:false in payload";
|
|
198
|
+
return {
|
|
199
|
+
success: false,
|
|
200
|
+
error: sanitizeErrorString(innerErr),
|
|
201
|
+
status,
|
|
202
|
+
errorCode: "unknown",
|
|
203
|
+
payloadFailed: true,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const out = opts.sanitize ? sanitizeSecrets(unwrapped) : unwrapped;
|
|
208
|
+
return { success: true, data: out, status };
|
|
209
|
+
}
|
|
210
|
+
catch (e) {
|
|
211
|
+
// AbortSignal.timeout fires "TimeoutError" or "AbortError" depending on
|
|
212
|
+
// Node version — classify both as network/timeout.
|
|
213
|
+
if (e instanceof Error && (e.name === "AbortError" || e.name === "TimeoutError")) {
|
|
214
|
+
return {
|
|
215
|
+
success: false,
|
|
216
|
+
error: `request timed out after ${Math.round(timeoutMs / 1000)}s`,
|
|
217
|
+
errorCode: "network",
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
success: false,
|
|
222
|
+
error: sanitizeErrorString(e instanceof Error ? e.message : String(e)),
|
|
223
|
+
errorCode: "network",
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// ── Layer 2: Legacy module-level request() (backwards-compat) ─────────
|
|
230
|
+
//
|
|
231
|
+
// The 13 existing tool modules import `request` and call it with a leading
|
|
232
|
+
// path segment like `/connections`. We preserve that signature by wiring it
|
|
233
|
+
// through a module-level Platform that depends on APIMAPPER_PLATFORM:
|
|
234
|
+
// - "wordpress" (default, includes legacy Application Password Basic auth)
|
|
235
|
+
// - "joomla" (uses JoomlaPlatform + Bearer token; pre-translates REST
|
|
236
|
+
// paths to com_ajax tasks via translateRestPath)
|
|
237
|
+
//
|
|
238
|
+
// Closes R9 Round-1 A2 P0 #1 (Joomla wiring dormant). Now every tool module
|
|
239
|
+
// using `request()` automatically routes through the right platform based
|
|
240
|
+
// on the env var the DXT/setup CLI wrote.
|
|
241
|
+
class WordPressBasicAuthPlatform extends WordPressPlatform {
|
|
242
|
+
basicToken;
|
|
243
|
+
bearerToken;
|
|
244
|
+
constructor(opts) {
|
|
245
|
+
super({ baseUrl: opts.baseUrl, token: opts.bearerToken ?? "" });
|
|
246
|
+
this.basicToken = opts.basicToken;
|
|
247
|
+
this.bearerToken = opts.bearerToken ?? "";
|
|
248
|
+
}
|
|
249
|
+
buildAuthHeaders() {
|
|
250
|
+
if (this.bearerToken)
|
|
251
|
+
return { Authorization: `Bearer ${this.bearerToken}` };
|
|
252
|
+
if (this.basicToken)
|
|
253
|
+
return { Authorization: `Basic ${this.basicToken}` };
|
|
254
|
+
return {};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const PLATFORM_KIND = (process.env.APIMAPPER_PLATFORM ?? "wordpress");
|
|
258
|
+
const legacyPlatform = PLATFORM_KIND === "joomla"
|
|
259
|
+
? new JoomlaPlatform({
|
|
260
|
+
// Joomla uses the same APIMAPPER_WP_BASE env var (or APIMAPPER_SITE_URL
|
|
261
|
+
// alias bridged by the DXT bootstrap in src/index.ts). The token is the
|
|
262
|
+
// raw amk_live_... bearer the setup CLI stored in the keychain. We
|
|
263
|
+
// accept the WP_USER:WP_APP_PASS pair too — split on the colon and use
|
|
264
|
+
// the password as the bearer for ergonomic parity with the WP env vars.
|
|
265
|
+
baseUrl: WP_BASE,
|
|
266
|
+
token: process.env.APIMAPPER_TOKEN
|
|
267
|
+
?? (BASIC_TOKEN ? Buffer.from(BASIC_TOKEN, "base64").toString().split(":")[1] ?? "" : ""),
|
|
268
|
+
})
|
|
269
|
+
: new WordPressBasicAuthPlatform({
|
|
270
|
+
baseUrl: WP_BASE,
|
|
271
|
+
basicToken: BASIC_TOKEN,
|
|
272
|
+
bearerToken: BEARER_TOKEN,
|
|
273
|
+
});
|
|
274
|
+
const legacyClient = createPlatformClient(legacyPlatform);
|
|
275
|
+
/**
|
|
276
|
+
* Issue a request through the toolkit HTTP client + capture HTTP status.
|
|
277
|
+
*
|
|
278
|
+
* Legacy signature: callers pass a path starting with "/" (e.g. "/connections")
|
|
279
|
+
* — we strip the leading slash and route through the Platform layer.
|
|
280
|
+
*
|
|
281
|
+
* Joomla routing: when APIMAPPER_PLATFORM=joomla, the WP-shape REST path is
|
|
282
|
+
* pre-translated to `{ action, params }` via JoomlaPlatform.translateRestPath
|
|
283
|
+
* BEFORE buildUrl runs. The translation table is pinned against the
|
|
284
|
+
* AjaxDispatcher match-arms.
|
|
285
|
+
*
|
|
286
|
+
* For new code, prefer `createPlatformClient(platform).request(action)`.
|
|
287
|
+
*/
|
|
288
|
+
export async function request(path, init = {}, opts = {}) {
|
|
289
|
+
// Strip the leading "/" — Platform.buildUrl() takes a bare action name.
|
|
290
|
+
// Also tolerate the existing escape-hatch where `path` starts with "http"
|
|
291
|
+
// (absolute URL); fall back to raw fetch in that case.
|
|
292
|
+
if (path.startsWith("http")) {
|
|
293
|
+
return rawAbsoluteRequest(path, init, opts);
|
|
294
|
+
}
|
|
295
|
+
// Joomla branch — translate REST path → com_ajax task + params, fetch
|
|
296
|
+
// directly so we can pass the params dict (legacyClient.request doesn't
|
|
297
|
+
// surface params).
|
|
298
|
+
if (legacyPlatform instanceof JoomlaPlatform) {
|
|
299
|
+
return joomlaRequest(legacyPlatform, path, init, opts);
|
|
300
|
+
}
|
|
301
|
+
const action = path.replace(/^\/+/, "");
|
|
302
|
+
return legacyClient.request(action, init, opts);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Joomla-side legacy request — translates REST path → com_ajax task name
|
|
306
|
+
* via JoomlaPlatform.translateRestPath, then fetches with params embedded
|
|
307
|
+
* via the platform's own buildUrl().
|
|
308
|
+
*/
|
|
309
|
+
async function joomlaRequest(platform, path, init, opts) {
|
|
310
|
+
let translated;
|
|
311
|
+
try {
|
|
312
|
+
translated = platform.translateRestPath(path, init.method ?? "GET");
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
return {
|
|
316
|
+
success: false,
|
|
317
|
+
error: sanitizeErrorString(e instanceof Error ? e.message : String(e)),
|
|
318
|
+
errorCode: "unknown",
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
let status;
|
|
322
|
+
const timeoutMs = resolveTimeout(opts);
|
|
323
|
+
try {
|
|
324
|
+
const url = platform.buildUrl(translated.action, translated.params);
|
|
325
|
+
const res = await fetch(url, {
|
|
326
|
+
...init,
|
|
327
|
+
headers: {
|
|
328
|
+
Accept: "application/json",
|
|
329
|
+
"Content-Type": "application/json",
|
|
330
|
+
"X-Requested-With": "XMLHttpRequest",
|
|
331
|
+
...platform.buildAuthHeaders(init.method ?? "GET"),
|
|
332
|
+
...init.headers,
|
|
333
|
+
},
|
|
334
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
335
|
+
});
|
|
336
|
+
status = res.status;
|
|
337
|
+
const text = await res.text();
|
|
338
|
+
if (!res.ok) {
|
|
339
|
+
let parsed = text;
|
|
340
|
+
try {
|
|
341
|
+
parsed = JSON.parse(text);
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
/* keep as text */
|
|
345
|
+
}
|
|
346
|
+
const errMsg = typeof parsed === "object" && parsed && "error" in parsed
|
|
347
|
+
? String(parsed.error)
|
|
348
|
+
: `HTTP ${res.status}`;
|
|
349
|
+
return {
|
|
350
|
+
success: false,
|
|
351
|
+
error: sanitizeErrorString(errMsg),
|
|
352
|
+
status,
|
|
353
|
+
errorCode: classify(status),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
if (!text)
|
|
357
|
+
return { success: true, data: {}, status };
|
|
358
|
+
let data;
|
|
359
|
+
try {
|
|
360
|
+
data = JSON.parse(text);
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
return { success: true, data: text, status };
|
|
364
|
+
}
|
|
365
|
+
let unwrapped;
|
|
366
|
+
try {
|
|
367
|
+
unwrapped = platform.parseResponse(data, init.method ?? "GET");
|
|
368
|
+
}
|
|
369
|
+
catch (e) {
|
|
370
|
+
return {
|
|
371
|
+
success: false,
|
|
372
|
+
error: sanitizeErrorString(e instanceof Error ? e.message : String(e)),
|
|
373
|
+
status,
|
|
374
|
+
errorCode: "unknown",
|
|
375
|
+
payloadFailed: true,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
const out = opts.sanitize ? sanitizeSecrets(unwrapped) : unwrapped;
|
|
379
|
+
return { success: true, data: out, status };
|
|
380
|
+
}
|
|
381
|
+
catch (e) {
|
|
382
|
+
if (e instanceof Error && (e.name === "AbortError" || e.name === "TimeoutError")) {
|
|
383
|
+
return {
|
|
384
|
+
success: false,
|
|
385
|
+
error: `request timed out after ${Math.round(timeoutMs / 1000)}s`,
|
|
386
|
+
errorCode: "network",
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
return {
|
|
390
|
+
success: false,
|
|
391
|
+
error: sanitizeErrorString(e instanceof Error ? e.message : String(e)),
|
|
392
|
+
errorCode: "network",
|
|
393
|
+
};
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Absolute-URL escape hatch: callers occasionally pass a fully-qualified
|
|
398
|
+
* URL (e.g. for cross-host paginated follow-ups). We can't route those
|
|
399
|
+
* through Platform because the host might not match WP_BASE — fall back
|
|
400
|
+
* to raw fetch but preserve the same auth + sanitisation semantics.
|
|
401
|
+
*/
|
|
402
|
+
async function rawAbsoluteRequest(url, init, opts) {
|
|
403
|
+
let status;
|
|
404
|
+
const timeoutMs = resolveTimeout(opts);
|
|
405
|
+
try {
|
|
406
|
+
const res = await fetch(url, {
|
|
407
|
+
...init,
|
|
408
|
+
headers: {
|
|
409
|
+
Accept: "application/json",
|
|
410
|
+
"Content-Type": "application/json",
|
|
411
|
+
"X-Requested-With": "XMLHttpRequest",
|
|
412
|
+
...(BASIC_TOKEN ? { Authorization: `Basic ${BASIC_TOKEN}` } : {}),
|
|
413
|
+
...init.headers,
|
|
414
|
+
},
|
|
415
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
416
|
+
});
|
|
417
|
+
status = res.status;
|
|
418
|
+
const text = await res.text();
|
|
419
|
+
if (!res.ok) {
|
|
420
|
+
let parsed = text;
|
|
421
|
+
try {
|
|
422
|
+
parsed = JSON.parse(text);
|
|
423
|
+
}
|
|
424
|
+
catch {
|
|
425
|
+
/* keep as text */
|
|
426
|
+
}
|
|
427
|
+
const errMsg = typeof parsed === "object" && parsed && "message" in parsed
|
|
428
|
+
? String(parsed.message)
|
|
429
|
+
: typeof parsed === "object" && parsed && "error" in parsed
|
|
430
|
+
? String(parsed.error)
|
|
431
|
+
: `HTTP ${res.status}`;
|
|
432
|
+
return {
|
|
433
|
+
success: false,
|
|
434
|
+
error: sanitizeErrorString(errMsg),
|
|
435
|
+
status,
|
|
436
|
+
errorCode: classify(status),
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
if (!text)
|
|
440
|
+
return { success: true, data: {}, status };
|
|
441
|
+
let data;
|
|
442
|
+
try {
|
|
443
|
+
data = JSON.parse(text);
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
if (opts.unwrapInnerSuccess && /success["']?\s*:\s*false/i.test(text)) {
|
|
447
|
+
return {
|
|
448
|
+
success: false,
|
|
449
|
+
error: sanitizeErrorString(`text response indicates success:false — ${text.slice(0, 200)}`),
|
|
450
|
+
status,
|
|
451
|
+
errorCode: "unknown",
|
|
452
|
+
payloadFailed: true,
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
return { success: true, data: text, status };
|
|
456
|
+
}
|
|
457
|
+
if (opts.unwrapInnerSuccess && data && typeof data === "object" && "success" in data) {
|
|
458
|
+
const inner = data.success;
|
|
459
|
+
if (inner === false) {
|
|
460
|
+
const innerErr = data.error !== undefined
|
|
461
|
+
? String(data.error)
|
|
462
|
+
: "operation reported success:false in payload";
|
|
463
|
+
return {
|
|
464
|
+
success: false,
|
|
465
|
+
error: sanitizeErrorString(innerErr),
|
|
466
|
+
status,
|
|
467
|
+
errorCode: "unknown",
|
|
468
|
+
payloadFailed: true,
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
const out = opts.sanitize ? sanitizeSecrets(data) : data;
|
|
473
|
+
return { success: true, data: out, status };
|
|
474
|
+
}
|
|
475
|
+
catch (e) {
|
|
476
|
+
if (e instanceof Error && (e.name === "AbortError" || e.name === "TimeoutError")) {
|
|
477
|
+
return {
|
|
478
|
+
success: false,
|
|
479
|
+
error: `request timed out after ${Math.round(timeoutMs / 1000)}s`,
|
|
480
|
+
errorCode: "network",
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
return {
|
|
484
|
+
success: false,
|
|
485
|
+
error: sanitizeErrorString(e instanceof Error ? e.message : String(e)),
|
|
486
|
+
errorCode: "network",
|
|
487
|
+
};
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Map an `errorCode` to a focused hint string for the caller.
|
|
492
|
+
* Falls back to the generic health-tool hint.
|
|
493
|
+
*/
|
|
494
|
+
export function hintFor(code) {
|
|
495
|
+
switch (code) {
|
|
496
|
+
case "auth":
|
|
497
|
+
return "Auth failed. Verify APIMAPPER_WP_APP_PASS — rotate via 1Password vault Claude-Secrets/WootsUp Dev API Mapper MCP.";
|
|
498
|
+
case "not_found":
|
|
499
|
+
return "Resource not found. Use the matching `*_list` tool to find a valid id.";
|
|
500
|
+
case "rate_limit":
|
|
501
|
+
return "Rate-limited. Retry after a few seconds; consider apimapper_cache_invalidate to reduce churn.";
|
|
502
|
+
case "server":
|
|
503
|
+
return "Upstream server error. Try again, then run apimapper_health and check WP error logs.";
|
|
504
|
+
case "network":
|
|
505
|
+
return "Network/timeout error. Verify APIMAPPER_WP_BASE is reachable from this host.";
|
|
506
|
+
default:
|
|
507
|
+
return HEALTH_HINT;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
export const HEALTH_HINT = "Use apimapper_health to check connectivity and auth.";
|
|
511
|
+
export function authConfigured() {
|
|
512
|
+
// Bearer token (amk_live_…) is sufficient on its own; legacy App-Password
|
|
513
|
+
// auth still requires both user + password.
|
|
514
|
+
if (BEARER_TOKEN)
|
|
515
|
+
return true;
|
|
516
|
+
return Boolean(WP_USER && WP_APP_PASS);
|
|
517
|
+
}
|
|
518
|
+
// Re-export the raw client for backwards compatibility with modules that
|
|
519
|
+
// don't yet need status codes. Avoid using directly in new code — prefer
|
|
520
|
+
// `request()` above for proper status + sanitisation, or
|
|
521
|
+
// `createPlatformClient()` for new Platform-aware code.
|
|
522
|
+
export const api = rawApi;
|
|
523
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/modules/apimapper/client.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,8EAA8E;AAC9E,wEAAwE;AACxE,EAAE;AACF,2CAA2C;AAC3C,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,kBAAkB;AAClB,EAAE;AACF,yDAAyD;AACzD,+EAA+E;AAC/E,sEAAsE;AACtE,+EAA+E;AAC/E,mEAAmE;AACnE,uCAAuC;AACvC,EAAE;AACF,oBAAoB;AACpB,yEAAyE;AACzE,8CAA8C;AAC9C,oEAAoE;AACpE,6EAA6E;AAC7E,mDAAmD;AAEnD,OAAO,EAAE,gBAAgB,EAAoB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAkC,MAAM,yBAAyB,CAAC;AAE5G,qEAAqE;AACrE,qEAAqE;AACrE,qEAAqE;AACrE,mEAAmE;AACnE,mEAAmE;AACnE,sEAAsE;AACtE,+DAA+D;AAC/D,oEAAoE;AACpE,iEAAiE;AACjE,+CAA+C;AAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AAClE,CAAC;AACD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,mCAAmC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,QAAQ,CAAC;AACjE,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;AAEnE,4EAA4E;AAC5E,2EAA2E;AAC3E,0EAA0E;AAC1E,sEAAsE;AACtE,wEAAwE;AACxE,iEAAiE;AACjE,4CAA4C;AAC5C,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC5D,MAAM,WAAW,GAAG,CAAC,aAAa,IAAI,WAAW;IAC/C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,IAAI,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACrE,CAAC,CAAC,EAAE,CAAC;AACP,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;AAEtD,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;IAC3E,8EAA8E;IAC9E,gFAAgF;IAChF,OAAO,CAAC,KAAK,CACX,yEAAyE;QACvE,0EAA0E,CAC7E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,gBAAgB,CAAC;IAC9B,OAAO,EAAE,GAAG,OAAO,wBAAwB;IAC3C,IAAI,EAAE,YAAY;QAChB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;QACzC,CAAC,CAAC,WAAW;YACX,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE;YACvC,CAAC,CAAC,SAAS;IACf,cAAc,EAAE,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;CACzD,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAS;IAC3C,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACjB,kEAAkE;IAClE,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CACjB,2CAA2C,EAC3C,2BAA2B,CAC5B,CAAC;IACF,IAAI,WAAW;QAAE,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACjE,IAAI,YAAY;QAAE,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,WAAW;QAAE,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC;AACb,CAAC;AAkBD,SAAS,QAAQ,CAAC,MAAe;IAC/B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC;IACpD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,YAAY,CAAC;IACxC,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,QAAQ,CAAC;IACnC,OAAO,SAAS,CAAC;AACnB,CAAC;AAyBD,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,cAAc,GAAG,KAAK,CAAC;AAC7B,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,SAAS,cAAc,CAAC,IAA6B;IACnD,MAAM,CAAC,GAAG,IAAI,EAAE,SAAS,IAAI,kBAAkB,CAAC;IAChD,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAaD;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAkB;IACrD,OAAO;QACL,QAAQ;QACR,OAAO,EAAE,KAAK,EACZ,MAAc,EACd,OAAoB,EAAE,EACtB,OAAoB,EAAE,EACM,EAAE;YAC9B,IAAI,MAA0B,CAAC;YAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAC3B,GAAG,IAAI;oBACP,OAAO,EAAE;wBACP,MAAM,EAAE,kBAAkB;wBAC1B,cAAc,EAAE,kBAAkB;wBAClC,kBAAkB,EAAE,gBAAgB;wBACpC,GAAG,QAAQ,CAAC,gBAAgB,CACzB,IAAI,CAAC,MAAwD,IAAI,KAAK,CACxE;wBACD,GAAI,IAAI,CAAC,OAA8C;qBACxD;oBACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;iBACvC,CAAC,CAAC;gBACH,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;gBACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAE9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;oBACZ,IAAI,MAAM,GAAY,IAAI,CAAC;oBAC3B,IAAI,CAAC;wBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;oBAAC,MAAM,CAAC;wBACP,eAAe;oBACjB,CAAC;oBACD,MAAM,MAAM,GACV,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;wBACzD,CAAC,CAAC,MAAM,CAAE,MAA+B,CAAC,OAAO,CAAC;wBAClD,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM;4BACzD,CAAC,CAAC,MAAM,CAAE,MAA6B,CAAC,KAAK,CAAC;4BAC9C,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;oBAC7B,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC;wBAClC,MAAM;wBACN,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;qBAC5B,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,IAAI;oBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAO,EAAE,MAAM,EAAE,CAAC;gBAE3D,IAAI,IAAa,CAAC;gBAClB,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;gBAAC,MAAM,CAAC;oBACP,wCAAwC;oBACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAoB,EAAE,MAAM,EAAE,CAAC;gBAC/D,CAAC;gBAED,8DAA8D;gBAC9D,8DAA8D;gBAC9D,oDAAoD;gBACpD,IAAI,SAAY,CAAC;gBACjB,IAAI,CAAC;oBACH,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAI,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;gBACpE,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,mBAAmB,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;wBACtE,MAAM;wBACN,SAAS,EAAE,SAAS;wBACpB,aAAa,EAAE,IAAI;qBACpB,CAAC;gBACJ,CAAC;gBAED,kEAAkE;gBAClE,sEAAsE;gBACtE,gDAAgD;gBAChD,IACE,IAAI,CAAC,kBAAkB;oBACvB,SAAS;oBACT,OAAO,SAAS,KAAK,QAAQ;oBAC7B,SAAS,IAAK,SAAqC,EACnD,CAAC;oBACD,MAAM,KAAK,GAAI,SAAmC,CAAC,OAAO,CAAC;oBAC3D,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;wBACpB,MAAM,QAAQ,GACX,SAAiC,CAAC,KAAK,KAAK,SAAS;4BACpD,CAAC,CAAC,MAAM,CAAE,SAAiC,CAAC,KAAK,CAAC;4BAClD,CAAC,CAAC,6CAA6C,CAAC;wBACpD,OAAO;4BACL,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,mBAAmB,CAAC,QAAQ,CAAC;4BACpC,MAAM;4BACN,SAAS,EAAE,SAAS;4BACpB,aAAa,EAAE,IAAI;yBACpB,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,eAAe,CAAC,SAAS,CAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;YAC9C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,wEAAwE;gBACxE,mDAAmD;gBACnD,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;oBACjF,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,2BAA2B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;wBACjE,SAAS,EAAE,SAAS;qBACrB,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,mBAAmB,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACtE,SAAS,EAAE,SAAS;iBACrB,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,sEAAsE;AACtE,6EAA6E;AAC7E,2EAA2E;AAC3E,kEAAkE;AAClE,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,0CAA0C;AAC1C,MAAM,0BAA2B,SAAQ,iBAAiB;IACvC,UAAU,CAAS;IACnB,WAAW,CAAS;IACrC,YAAY,IAAmE;QAC7E,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5C,CAAC;IACQ,gBAAgB;QACvB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC7E,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,aAAa,EAAE,SAAS,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAC1E,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,WAAW,CAExD,CAAC;AAEb,MAAM,cAAc,GAClB,aAAa,KAAK,QAAQ;IACxB,CAAC,CAAC,IAAI,cAAc,CAAC;QACjB,wEAAwE;QACxE,wEAAwE;QACxE,mEAAmE;QACnE,uEAAuE;QACvE,wEAAwE;QACxE,OAAO,EAAE,OAAO;QAChB,KAAK,EACH,OAAO,CAAC,GAAG,CAAC,eAAe;eACxB,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5F,CAAC;IACJ,CAAC,CAAC,IAAI,0BAA0B,CAAC;QAC7B,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,WAAW;QACvB,WAAW,EAAE,YAAY;KAC1B,CAAC,CAAC;AAET,MAAM,YAAY,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,OAAoB,EAAE,EACtB,OAAoB,EAAE;IAEtB,wEAAwE;IACxE,0EAA0E;IAC1E,uDAAuD;IACvD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,kBAAkB,CAAI,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,sEAAsE;IACtE,wEAAwE;IACxE,mBAAmB;IACnB,IAAI,cAAc,YAAY,cAAc,EAAE,CAAC;QAC7C,OAAO,aAAa,CAAI,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,YAAY,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,aAAa,CAC1B,QAAwB,EACxB,IAAY,EACZ,IAAiB,EACjB,IAAiB;IAEjB,IAAI,UAA8D,CAAC;IACnE,IAAI,CAAC;QACH,UAAU,GAAG,QAAQ,CAAC,iBAAiB,CACrC,IAAI,EACH,IAAI,CAAC,MAAiC,IAAI,KAAK,CACjD,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtE,SAAS,EAAE,SAAS;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,MAA0B,CAAC;IAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,kBAAkB,EAAE,gBAAgB;gBACpC,GAAG,QAAQ,CAAC,gBAAgB,CACzB,IAAI,CAAC,MAAiC,IAAI,KAAK,CACjD;gBACD,GAAI,IAAI,CAAC,OAA8C;aACxD;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAE9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,MAAM,GAAY,IAAI,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;YACD,MAAM,MAAM,GACV,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM;gBACvD,CAAC,CAAC,MAAM,CAAE,MAA6B,CAAC,KAAK,CAAC;gBAC9C,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC;gBAClC,MAAM;gBACN,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;aAC5B,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAO,EAAE,MAAM,EAAE,CAAC;QAE3D,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAoB,EAAE,MAAM,EAAE,CAAC;QAC/D,CAAC;QAED,IAAI,SAAY,CAAC;QACjB,IAAI,CAAC;YACH,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAI,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mBAAmB,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtE,MAAM;gBACN,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,IAAI;aACpB,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,eAAe,CAAC,SAAS,CAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;YACjF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,2BAA2B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;gBACjE,SAAS,EAAE,SAAS;aACrB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtE,SAAS,EAAE,SAAS;SACrB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,kBAAkB,CAC/B,GAAW,EACX,IAAiB,EACjB,IAAiB;IAEjB,IAAI,MAA0B,CAAC;IAC/B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;gBAClC,kBAAkB,EAAE,gBAAgB;gBACpC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,SAAS,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,GAAI,IAAI,CAAC,OAA8C;aACxD;YACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,MAAM,GAAY,IAAI,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;YACD,MAAM,MAAM,GACV,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM;gBACzD,CAAC,CAAC,MAAM,CAAE,MAA+B,CAAC,OAAO,CAAC;gBAClD,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM;oBACzD,CAAC,CAAC,MAAM,CAAE,MAA6B,CAAC,KAAK,CAAC;oBAC9C,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC;gBAClC,MAAM;gBACN,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC;aAC5B,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAO,EAAE,MAAM,EAAE,CAAC;QAC3D,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,IAAI,CAAC,kBAAkB,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,mBAAmB,CAAC,2CAA2C,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC3F,MAAM;oBACN,SAAS,EAAE,SAAS;oBACpB,aAAa,EAAE,IAAI;iBACpB,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAoB,EAAE,MAAM,EAAE,CAAC;QAC/D,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACrF,MAAM,KAAK,GAAI,IAA8B,CAAC,OAAO,CAAC;YACtD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,QAAQ,GACX,IAA4B,CAAC,KAAK,KAAK,SAAS;oBAC/C,CAAC,CAAC,MAAM,CAAE,IAA4B,CAAC,KAAK,CAAC;oBAC7C,CAAC,CAAC,6CAA6C,CAAC;gBACpD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,mBAAmB,CAAC,QAAQ,CAAC;oBACpC,MAAM;oBACN,SAAS,EAAE,SAAS;oBACpB,aAAa,EAAE,IAAI;iBACpB,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,eAAe,CAAC,IAAI,CAAO,CAAC,CAAC,CAAE,IAAU,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;YACjF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,2BAA2B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;gBACjE,SAAS,EAAE,SAAS;aACrB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACtE,SAAS,EAAE,SAAS;SACrB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAmB;IACzC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,mHAAmH,CAAC;QAC7H,KAAK,WAAW;YACd,OAAO,wEAAwE,CAAC;QAClF,KAAK,YAAY;YACf,OAAO,+FAA+F,CAAC;QACzG,KAAK,QAAQ;YACX,OAAO,sFAAsF,CAAC;QAChG,KAAK,SAAS;YACZ,OAAO,8EAA8E,CAAC;QACxF;YACE,OAAO,WAAW,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,sDAAsD,CAAC;AAElF,MAAM,UAAU,cAAc;IAC5B,0EAA0E;IAC1E,4CAA4C;IAC5C,IAAI,YAAY;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,OAAO,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,yEAAyE;AACzE,yEAAyE;AACzE,yDAAyD;AACzD,wDAAwD;AACxD,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC"}
|