@thenavidm/creatomate-mcp-cli 0.0.0-stage → 2.0.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/CHANGELOG.md +34 -0
- package/COMPARISON.md +25 -0
- package/CONTRIBUTING.md +30 -0
- package/INSTALL.md +321 -0
- package/LICENSE +17 -0
- package/README.md +1058 -2
- package/SECURITY.md +15 -0
- package/SKILL.md +121 -0
- package/THIRD_PARTY_NOTICES.md +3 -0
- package/dist/api/client.d.ts +21 -0
- package/dist/api/client.js +116 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/errors.d.ts +12 -0
- package/dist/api/errors.js +24 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/cli.d.ts +81 -0
- package/dist/cli.js +487 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +16 -0
- package/dist/config.js +31 -0
- package/dist/config.js.map +1 -0
- package/dist/doctor.d.ts +1 -0
- package/dist/doctor.js +22 -0
- package/dist/doctor.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/safety.d.ts +36 -0
- package/dist/safety.js +82 -0
- package/dist/safety.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.js +56 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/index.d.ts +424 -0
- package/dist/tools/index.js +69 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/operations.json +505 -0
- package/licenses/AGPL-3.0.txt +661 -0
- package/package.json +96 -4
package/dist/cli.js
ADDED
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The CLI surface, over the server's own tools.
|
|
3
|
+
*
|
|
4
|
+
* FOR A REPO WITH NO `ALL_TOOLS` SEAM. Copy this file to src/cli.ts and edit
|
|
5
|
+
* only the block marked "This repo". Use assets/cli.ts instead when the repo
|
|
6
|
+
* already collects its tools into ALL_TOOLS with defineTool.
|
|
7
|
+
*
|
|
8
|
+
* Such a repo registers its tools straight on the SDK's McpServer, so there is
|
|
9
|
+
* no array for the house template to read. Rather than rewrite every tool, this
|
|
10
|
+
* builds the real server in-process and talks to it through the SDK's in-memory
|
|
11
|
+
* transport, exactly as an MCP app does: tools/list gives the names, the JSON
|
|
12
|
+
* Schema and the annotations; tools/call runs the same handler with the same
|
|
13
|
+
* validation and the same write guard. The two surfaces cannot drift, because
|
|
14
|
+
* there is only one of them.
|
|
15
|
+
*
|
|
16
|
+
* Flags, --help and `schema <command>` come from the JSON Schema an MCP app
|
|
17
|
+
* receives. Everything else is the house contract: --json, --compact, --agent,
|
|
18
|
+
* --select, and exit codes 0 ok, 2 usage or a refused write, 3 not found,
|
|
19
|
+
* 4 auth, 5 API, 7 rate limited, 10 nothing configured.
|
|
20
|
+
*/
|
|
21
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
22
|
+
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
|
|
23
|
+
/* ---------------------------------------------------------------- This repo */
|
|
24
|
+
import { loadConfig } from "./config.js";
|
|
25
|
+
import { buildServer, VERSION } from "./server.js";
|
|
26
|
+
/** The binary names, as package.json declares them. */
|
|
27
|
+
const CLI_BIN = "creatomate-cli";
|
|
28
|
+
const MCP_BIN = "creatomate-mcp";
|
|
29
|
+
/** The server exactly as the MCP binary builds it, and how to shut it. */
|
|
30
|
+
async function openServer() {
|
|
31
|
+
const server = buildServer(loadConfig(), undefined, "cli");
|
|
32
|
+
return {
|
|
33
|
+
server: server,
|
|
34
|
+
close: async () => {
|
|
35
|
+
await server.close();
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** This server's own error words, checked before the generic ones. */
|
|
40
|
+
const EXIT_WORDS = [
|
|
41
|
+
[/invalid arguments|unsupported creatomate|review hash|local validation/i, 2],
|
|
42
|
+
[/unknown profile|private creatomate token file|no valid api key|invalid request timeout|private creatomate profile|creatomate_default_account|creatomate_accounts|creatomate profile names|every creatomate profile/i, 10],
|
|
43
|
+
];
|
|
44
|
+
/* ------------------------------------------------ The same in every repo */
|
|
45
|
+
export const EXIT = {
|
|
46
|
+
ok: 0,
|
|
47
|
+
usage: 2,
|
|
48
|
+
notFound: 3,
|
|
49
|
+
auth: 4,
|
|
50
|
+
api: 5,
|
|
51
|
+
rateLimited: 7,
|
|
52
|
+
config: 10,
|
|
53
|
+
};
|
|
54
|
+
/** Map an error message onto the contract. The server's own words go first. */
|
|
55
|
+
export function exitCodeFor(message) {
|
|
56
|
+
const text = message.toLowerCase();
|
|
57
|
+
for (const [pattern, code] of EXIT_WORDS)
|
|
58
|
+
if (pattern.test(text))
|
|
59
|
+
return code;
|
|
60
|
+
if (/input validation|invalid arguments|invalid params|-32602/.test(text))
|
|
61
|
+
return EXIT.usage;
|
|
62
|
+
if (/will not run without|without confirm|confirm: true|--confirm|read[-_ ]only|is unavailable|is disabled/.test(text))
|
|
63
|
+
return EXIT.usage;
|
|
64
|
+
if (/rate ?limit|too many requests|\b429\b|quota/.test(text))
|
|
65
|
+
return EXIT.rateLimited;
|
|
66
|
+
// Config before auth: "no token configured" mentions a token, and matching
|
|
67
|
+
// auth first sends someone who configured nothing looking for a bad one.
|
|
68
|
+
if (/not configured|nothing is configured|not signed in|no [a-z ]*(account|credential|token|key)s? (is |are )?(set|configured)|missing .*env|run `?[a-z-]+ login/.test(text))
|
|
69
|
+
return EXIT.config;
|
|
70
|
+
if (/\b401\b|\b403\b|unauthori[sz]ed|forbidden|invalid[_ ]grant|token (has )?expired|expired token|authenticat|credential|permission denied|insufficient permission/.test(text))
|
|
71
|
+
return EXIT.auth;
|
|
72
|
+
if (/\b404\b|not found|no such|does not exist/.test(text))
|
|
73
|
+
return EXIT.notFound;
|
|
74
|
+
return EXIT.api;
|
|
75
|
+
}
|
|
76
|
+
class UsageError extends Error {
|
|
77
|
+
}
|
|
78
|
+
/** The first concrete type in a schema, looking through nullable unions. */
|
|
79
|
+
function concrete(schema) {
|
|
80
|
+
const union = schema.anyOf ?? schema.oneOf;
|
|
81
|
+
if (union)
|
|
82
|
+
return concrete(union.find((s) => s.type !== "null") ?? union[0] ?? {});
|
|
83
|
+
if (Array.isArray(schema.type))
|
|
84
|
+
return {
|
|
85
|
+
...schema,
|
|
86
|
+
type: schema.type.find((t) => t !== "null") ?? "string",
|
|
87
|
+
};
|
|
88
|
+
return schema;
|
|
89
|
+
}
|
|
90
|
+
function kindOf(schema) {
|
|
91
|
+
const s = concrete(schema);
|
|
92
|
+
if (s.enum)
|
|
93
|
+
return { kind: "enum", repeatable: false, choices: s.enum.map(String) };
|
|
94
|
+
if (s.type === "array") {
|
|
95
|
+
const item = concrete(s.items ?? {});
|
|
96
|
+
if (item.enum)
|
|
97
|
+
return { kind: "enum", repeatable: true, choices: item.enum.map(String) };
|
|
98
|
+
if (item.type === "object" || item.type === "array")
|
|
99
|
+
return { kind: "json", repeatable: true };
|
|
100
|
+
return { kind: item.type ?? "string", repeatable: true };
|
|
101
|
+
}
|
|
102
|
+
if (s.type === "object")
|
|
103
|
+
return { kind: "json", repeatable: false };
|
|
104
|
+
if (s.type === "number" || s.type === "integer" || s.type === "boolean")
|
|
105
|
+
return { kind: s.type, repeatable: false };
|
|
106
|
+
return { kind: "string", repeatable: false };
|
|
107
|
+
}
|
|
108
|
+
/** One flag per property of the JSON Schema an MCP app receives. */
|
|
109
|
+
export function flagsFor(schema) {
|
|
110
|
+
const required = new Set(schema.required ?? []);
|
|
111
|
+
return Object.entries(schema.properties ?? {}).map(([key, prop]) => ({
|
|
112
|
+
key,
|
|
113
|
+
flag: `--${key.replace(/_/g, "-")}`,
|
|
114
|
+
...kindOf(prop),
|
|
115
|
+
required: required.has(key),
|
|
116
|
+
help: (prop.description ?? concrete(prop).description ?? "").trim(),
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
function coerce(flag, raw) {
|
|
120
|
+
switch (flag.kind) {
|
|
121
|
+
case "number":
|
|
122
|
+
case "integer": {
|
|
123
|
+
const value = Number(raw);
|
|
124
|
+
if (!Number.isFinite(value) ||
|
|
125
|
+
(flag.kind === "integer" && !Number.isInteger(value)))
|
|
126
|
+
throw new UsageError(`${flag.flag} expects ${flag.kind === "integer" ? "a whole number" : "a number"}, got '${raw}'.`);
|
|
127
|
+
return value;
|
|
128
|
+
}
|
|
129
|
+
case "boolean":
|
|
130
|
+
if (/^(true|1|yes)$/i.test(raw))
|
|
131
|
+
return true;
|
|
132
|
+
if (/^(false|0|no)$/i.test(raw))
|
|
133
|
+
return false;
|
|
134
|
+
throw new UsageError(`${flag.flag} expects true or false, got '${raw}'.`);
|
|
135
|
+
case "enum":
|
|
136
|
+
if (flag.choices && !flag.choices.includes(raw))
|
|
137
|
+
throw new UsageError(`${flag.flag} expects one of: ${flag.choices.join(", ")}. Got '${raw}'.`);
|
|
138
|
+
return raw;
|
|
139
|
+
case "json":
|
|
140
|
+
try {
|
|
141
|
+
return JSON.parse(raw);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
throw new UsageError(`${flag.flag} expects JSON, got '${raw}'.`);
|
|
145
|
+
}
|
|
146
|
+
default:
|
|
147
|
+
return raw;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Turn argv into the arguments object. `--flag value`, `--flag=value`, the
|
|
152
|
+
* underscore spelling, a bare switch for booleans, a repeatable flag collected
|
|
153
|
+
* into an array, and one bare argument filling the first required flag.
|
|
154
|
+
*/
|
|
155
|
+
export function parseArgs(argv, flags) {
|
|
156
|
+
const out = {};
|
|
157
|
+
const positional = [];
|
|
158
|
+
const byFlag = new Map();
|
|
159
|
+
for (const f of flags) {
|
|
160
|
+
byFlag.set(f.flag, f);
|
|
161
|
+
byFlag.set(`--${f.key}`, f);
|
|
162
|
+
}
|
|
163
|
+
for (let i = 0; i < argv.length; i++) {
|
|
164
|
+
const token = argv[i];
|
|
165
|
+
if (!token.startsWith("--")) {
|
|
166
|
+
positional.push(token);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const eq = token.indexOf("=");
|
|
170
|
+
const name = eq === -1 ? token : token.slice(0, eq);
|
|
171
|
+
const flag = byFlag.get(name);
|
|
172
|
+
if (!flag)
|
|
173
|
+
throw new UsageError(`Unknown option ${name}.`);
|
|
174
|
+
let raw = eq === -1 ? undefined : token.slice(eq + 1);
|
|
175
|
+
if (raw === undefined) {
|
|
176
|
+
if (flag.kind === "boolean" &&
|
|
177
|
+
(argv[i + 1] === undefined || argv[i + 1].startsWith("--"))) {
|
|
178
|
+
out[flag.key] = true;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
raw = argv[++i];
|
|
182
|
+
}
|
|
183
|
+
if (raw === undefined)
|
|
184
|
+
throw new UsageError(`${flag.flag} expects a value.`);
|
|
185
|
+
const value = coerce(flag, raw);
|
|
186
|
+
if (flag.repeatable)
|
|
187
|
+
out[flag.key] = [...(out[flag.key] ?? []), value];
|
|
188
|
+
else
|
|
189
|
+
out[flag.key] = value;
|
|
190
|
+
}
|
|
191
|
+
if (positional.length > 0) {
|
|
192
|
+
const target = flags.find((f) => f.required && out[f.key] === undefined);
|
|
193
|
+
if (!target)
|
|
194
|
+
throw new UsageError(`Unexpected argument '${positional[0]}'.`);
|
|
195
|
+
if (positional.length > 1)
|
|
196
|
+
throw new UsageError(`Unexpected argument '${positional[1]}'.`);
|
|
197
|
+
const value = coerce(target, positional[0]);
|
|
198
|
+
out[target.key] = target.repeatable ? [value] : value;
|
|
199
|
+
}
|
|
200
|
+
const missing = flags.filter((f) => f.required && out[f.key] === undefined);
|
|
201
|
+
if (missing.length)
|
|
202
|
+
throw new UsageError(`Missing ${missing.map((f) => f.flag).join(", ")}.`);
|
|
203
|
+
return out;
|
|
204
|
+
}
|
|
205
|
+
/** `--select a,b.c` keeps only those fields. Dotted paths descend, arrays element-wise. */
|
|
206
|
+
export function selectFields(data, paths) {
|
|
207
|
+
if (Array.isArray(data))
|
|
208
|
+
return data.map((d) => selectFields(d, paths));
|
|
209
|
+
if (data === null || typeof data !== "object")
|
|
210
|
+
return data;
|
|
211
|
+
const byHead = new Map();
|
|
212
|
+
for (const path of paths) {
|
|
213
|
+
const [head, ...rest] = path.split(".");
|
|
214
|
+
if (head === undefined)
|
|
215
|
+
continue;
|
|
216
|
+
const group = byHead.get(head) ?? [];
|
|
217
|
+
if (rest.length)
|
|
218
|
+
group.push(rest.join("."));
|
|
219
|
+
byHead.set(head, group);
|
|
220
|
+
}
|
|
221
|
+
const out = {};
|
|
222
|
+
for (const [head, rest] of byHead) {
|
|
223
|
+
const value = data[head];
|
|
224
|
+
if (value === undefined)
|
|
225
|
+
continue;
|
|
226
|
+
out[head] = rest.length ? selectFields(value, rest) : value;
|
|
227
|
+
}
|
|
228
|
+
return out;
|
|
229
|
+
}
|
|
230
|
+
function textOf(result) {
|
|
231
|
+
return (result.content ?? [])
|
|
232
|
+
.map((part) => part.type === "text"
|
|
233
|
+
? (part.text ?? "")
|
|
234
|
+
: `[${part.type}${part.mimeType ? ` ${part.mimeType}` : ""}${part.data ? `, ${Math.round((part.data.length * 3) / 4 / 1024)} KB` : ""}, not shown in a terminal]`)
|
|
235
|
+
.join("\n");
|
|
236
|
+
}
|
|
237
|
+
/** The result as data: structured when the tool declares it, else its text parsed when it is JSON. */
|
|
238
|
+
function dataOf(result) {
|
|
239
|
+
if (result.structuredContent !== undefined)
|
|
240
|
+
return result.structuredContent;
|
|
241
|
+
const text = textOf(result);
|
|
242
|
+
try {
|
|
243
|
+
return JSON.parse(text);
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return text;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function emit(data, format) {
|
|
250
|
+
if (format === "text" && typeof data === "string") {
|
|
251
|
+
process.stdout.write(data.endsWith("\n") ? data : `${data}\n`);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
process.stdout.write(`${format === "compact" ? JSON.stringify(data) : JSON.stringify(data, null, 2)}\n`);
|
|
255
|
+
}
|
|
256
|
+
function emitError(message) {
|
|
257
|
+
process.stderr.write(`${JSON.stringify({ error: message }, null, 2)}\n`);
|
|
258
|
+
}
|
|
259
|
+
export function commandName(tool) {
|
|
260
|
+
return tool.replace(/_/g, "-");
|
|
261
|
+
}
|
|
262
|
+
function normalize(name) {
|
|
263
|
+
return name.replace(/-/g, "_");
|
|
264
|
+
}
|
|
265
|
+
function binName() {
|
|
266
|
+
const name = (process.argv[1] ?? "").split("/").pop() ?? "";
|
|
267
|
+
return name.startsWith(CLI_BIN) ? CLI_BIN : MCP_BIN;
|
|
268
|
+
}
|
|
269
|
+
function risk(tool) {
|
|
270
|
+
if (tool.annotations?.readOnlyHint)
|
|
271
|
+
return "read";
|
|
272
|
+
return tool.annotations?.destructiveHint ? "destructive" : "write";
|
|
273
|
+
}
|
|
274
|
+
const COLUMN = 34;
|
|
275
|
+
function renderToolHelp(tool) {
|
|
276
|
+
const flags = flagsFor(tool.inputSchema);
|
|
277
|
+
const required = flags.filter((f) => f.required);
|
|
278
|
+
const optional = flags.filter((f) => !f.required);
|
|
279
|
+
const usage = [
|
|
280
|
+
`${binName()} ${commandName(tool.name)}`,
|
|
281
|
+
...required.map((f) => `${f.flag} <${f.kind}>`),
|
|
282
|
+
optional.length ? "[options]" : "",
|
|
283
|
+
]
|
|
284
|
+
.filter(Boolean)
|
|
285
|
+
.join(" ");
|
|
286
|
+
const lines = [
|
|
287
|
+
``,
|
|
288
|
+
(tool.description ?? "").trim(),
|
|
289
|
+
``,
|
|
290
|
+
`Usage:`,
|
|
291
|
+
` ${usage}`,
|
|
292
|
+
``,
|
|
293
|
+
];
|
|
294
|
+
const describe = (list, heading) => {
|
|
295
|
+
if (!list.length)
|
|
296
|
+
return;
|
|
297
|
+
lines.push(`${heading}:`);
|
|
298
|
+
for (const f of list) {
|
|
299
|
+
const placeholder = f.kind === "boolean"
|
|
300
|
+
? ""
|
|
301
|
+
: ` <${f.choices ? f.choices.join("|") : f.kind}>`;
|
|
302
|
+
const left = ` ${f.flag}${placeholder}`;
|
|
303
|
+
const help = f.repeatable ? `${f.help} Repeatable.`.trim() : f.help;
|
|
304
|
+
if (!help)
|
|
305
|
+
lines.push(left);
|
|
306
|
+
else if (left.length < COLUMN)
|
|
307
|
+
lines.push(`${left.padEnd(COLUMN)}${help}`);
|
|
308
|
+
else
|
|
309
|
+
lines.push(left, `${" ".repeat(COLUMN)}${help}`);
|
|
310
|
+
}
|
|
311
|
+
lines.push(``);
|
|
312
|
+
};
|
|
313
|
+
describe(required, "Required");
|
|
314
|
+
describe(optional, "Options");
|
|
315
|
+
lines.push(`Output:`);
|
|
316
|
+
lines.push(` --json force JSON`);
|
|
317
|
+
lines.push(` --compact force single-line JSON`);
|
|
318
|
+
lines.push(` --agent machine mode: JSON, compact, no prompts, no colour`);
|
|
319
|
+
lines.push(` --select <a,b.c> keep only these fields, dotted paths descend`);
|
|
320
|
+
lines.push(``);
|
|
321
|
+
lines.push(`Risk: ${risk(tool)}${"confirm" in (tool.inputSchema.properties ?? {}) ? ", runs only with --confirm" : ""}`);
|
|
322
|
+
lines.push(``);
|
|
323
|
+
return lines.join("\n");
|
|
324
|
+
}
|
|
325
|
+
/** A tool's one line: its title, or the first sentence of its description. */
|
|
326
|
+
function summary(tool) {
|
|
327
|
+
const title = tool.title ?? tool.annotations?.title;
|
|
328
|
+
if (title && title !== tool.name)
|
|
329
|
+
return title;
|
|
330
|
+
const first = (tool.description ?? "").trim().split(/(?<=\.)\s/)[0] ?? "";
|
|
331
|
+
return first.length > 72 ? `${first.slice(0, 71).trimEnd()}…` : first;
|
|
332
|
+
}
|
|
333
|
+
function renderToolList(tools) {
|
|
334
|
+
const width = Math.max(...tools.map((t) => commandName(t.name).length)) + 2;
|
|
335
|
+
const bin = binName();
|
|
336
|
+
const lines = [``, `${bin} commands (${tools.length})`, ``];
|
|
337
|
+
for (const tool of tools) {
|
|
338
|
+
const mark = risk(tool) === "read" ? " " : risk(tool) === "destructive" ? "!" : "*";
|
|
339
|
+
lines.push(` ${mark} ${commandName(tool.name).padEnd(width)}${summary(tool)}`);
|
|
340
|
+
}
|
|
341
|
+
const gated = tools.some((t) => risk(t) === "destructive" &&
|
|
342
|
+
"confirm" in (t.inputSchema.properties ?? {}));
|
|
343
|
+
lines.push(``, ` * writes ! confirmed write${gated ? ", and asks for --confirm where the tool takes it" : ""}`, ``);
|
|
344
|
+
lines.push(` ${bin} <command> --help what it takes`);
|
|
345
|
+
lines.push(` ${bin} schema <command> the JSON schema an MCP client sees`, ``);
|
|
346
|
+
return lines.join("\n");
|
|
347
|
+
}
|
|
348
|
+
/** Connect an in-memory client to the real server. */
|
|
349
|
+
async function connect() {
|
|
350
|
+
const { server, close } = await openServer();
|
|
351
|
+
const [clientSide, serverSide] = InMemoryTransport.createLinkedPair();
|
|
352
|
+
await server.connect(serverSide);
|
|
353
|
+
const client = new Client({ name: CLI_BIN, version: VERSION });
|
|
354
|
+
await client.connect(clientSide);
|
|
355
|
+
const { tools } = await client.listTools();
|
|
356
|
+
return {
|
|
357
|
+
client,
|
|
358
|
+
tools: tools,
|
|
359
|
+
close: async () => {
|
|
360
|
+
await client.close().catch(() => undefined);
|
|
361
|
+
await close().catch(() => undefined);
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
/** A first argument that is a command rather than a server flag. */
|
|
366
|
+
export function isCliCommand(argv, toolNames) {
|
|
367
|
+
const first = argv[0];
|
|
368
|
+
if (!first || first.startsWith("-"))
|
|
369
|
+
return false;
|
|
370
|
+
if (first === "tools" || first === "schema")
|
|
371
|
+
return true;
|
|
372
|
+
return toolNames.includes(normalize(first));
|
|
373
|
+
}
|
|
374
|
+
export async function runCli(argv) {
|
|
375
|
+
const { client, tools, close } = await connect();
|
|
376
|
+
try {
|
|
377
|
+
const command = argv[0] ?? "tools";
|
|
378
|
+
const rest = argv.slice(1);
|
|
379
|
+
if (command === "tools") {
|
|
380
|
+
process.stdout.write(renderToolList(tools));
|
|
381
|
+
return EXIT.ok;
|
|
382
|
+
}
|
|
383
|
+
if (command === "schema") {
|
|
384
|
+
const tool = tools.find((t) => t.name === normalize(rest[0] ?? ""));
|
|
385
|
+
if (!tool) {
|
|
386
|
+
emitError(`Unknown command '${rest[0] ?? ""}'. Run \`${binName()}\` to list them.`);
|
|
387
|
+
return EXIT.usage;
|
|
388
|
+
}
|
|
389
|
+
emit(tool.inputSchema, "json");
|
|
390
|
+
return EXIT.ok;
|
|
391
|
+
}
|
|
392
|
+
const tool = tools.find((t) => t.name === normalize(command));
|
|
393
|
+
if (!tool) {
|
|
394
|
+
emitError(`Unknown command '${command}'. Run \`${binName()}\` to list them. A write tool is missing from the list when the server runs read only.`);
|
|
395
|
+
return EXIT.usage;
|
|
396
|
+
}
|
|
397
|
+
if (rest.includes("--help") || rest.includes("-h")) {
|
|
398
|
+
process.stdout.write(renderToolHelp(tool));
|
|
399
|
+
return EXIT.ok;
|
|
400
|
+
}
|
|
401
|
+
const agent = rest.includes("--agent");
|
|
402
|
+
const format = rest.includes("--compact") || agent
|
|
403
|
+
? "compact"
|
|
404
|
+
: rest.includes("--json")
|
|
405
|
+
? "json"
|
|
406
|
+
: "text";
|
|
407
|
+
const selectAt = rest.findIndex((t) => t === "--select" || t.startsWith("--select="));
|
|
408
|
+
const selectRaw = selectAt === -1
|
|
409
|
+
? undefined
|
|
410
|
+
: rest[selectAt].includes("=")
|
|
411
|
+
? rest[selectAt].split("=").slice(1).join("=")
|
|
412
|
+
: rest[selectAt + 1];
|
|
413
|
+
const select = selectRaw
|
|
414
|
+
?.split(",")
|
|
415
|
+
.map((f) => f.trim())
|
|
416
|
+
.filter(Boolean);
|
|
417
|
+
const consumed = new Set([
|
|
418
|
+
"--json",
|
|
419
|
+
"--compact",
|
|
420
|
+
"--agent",
|
|
421
|
+
"--no-color",
|
|
422
|
+
"--no-input",
|
|
423
|
+
"--yes",
|
|
424
|
+
]);
|
|
425
|
+
const toolArgv = rest.filter((token, i) => {
|
|
426
|
+
if (consumed.has(token))
|
|
427
|
+
return false;
|
|
428
|
+
if (token === "--select" || token.startsWith("--select="))
|
|
429
|
+
return false;
|
|
430
|
+
if (selectAt !== -1 &&
|
|
431
|
+
i === selectAt + 1 &&
|
|
432
|
+
!rest[selectAt].includes("="))
|
|
433
|
+
return false;
|
|
434
|
+
return true;
|
|
435
|
+
});
|
|
436
|
+
let args;
|
|
437
|
+
try {
|
|
438
|
+
args = parseArgs(toolArgv, flagsFor(tool.inputSchema));
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
emitError(error.message);
|
|
442
|
+
if (!agent)
|
|
443
|
+
process.stderr.write(renderToolHelp(tool));
|
|
444
|
+
return EXIT.usage;
|
|
445
|
+
}
|
|
446
|
+
let result;
|
|
447
|
+
try {
|
|
448
|
+
// Long enough for an export or a slow upstream; the protocol default is 60s.
|
|
449
|
+
result = (await client.callTool({ name: tool.name, arguments: args }, undefined, { timeout: 10 * 60_000 }));
|
|
450
|
+
}
|
|
451
|
+
catch (error) {
|
|
452
|
+
const message = error.message ?? String(error);
|
|
453
|
+
emitError(message);
|
|
454
|
+
return exitCodeFor(message);
|
|
455
|
+
}
|
|
456
|
+
if (result.isError) {
|
|
457
|
+
const message = textOf(result);
|
|
458
|
+
// The server words a refusal for an AI. In a terminal the switch is --confirm.
|
|
459
|
+
emitError(message.replace(/\bconfirm: true\b/g, "--confirm"));
|
|
460
|
+
return exitCodeFor(message);
|
|
461
|
+
}
|
|
462
|
+
// Text a person reads as it is. JSON, or a --select, gets the data.
|
|
463
|
+
const data = format === "text" &&
|
|
464
|
+
!select?.length &&
|
|
465
|
+
result.structuredContent === undefined
|
|
466
|
+
? textOf(result)
|
|
467
|
+
: dataOf(result);
|
|
468
|
+
emit(select?.length && typeof data === "object"
|
|
469
|
+
? selectFields(data, select)
|
|
470
|
+
: data, format);
|
|
471
|
+
return EXIT.ok;
|
|
472
|
+
}
|
|
473
|
+
finally {
|
|
474
|
+
await close();
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
/** Every tool, as tools/list returns it to an MCP app. */
|
|
478
|
+
export async function listTools() {
|
|
479
|
+
const { tools, close } = await connect();
|
|
480
|
+
await close();
|
|
481
|
+
return tools;
|
|
482
|
+
}
|
|
483
|
+
/** The tool names, for the entry point to route on. */
|
|
484
|
+
export async function toolNames() {
|
|
485
|
+
return (await listTools()).map((t) => t.name);
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,gFAAgF;AAEhF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEnD,uDAAuD;AACvD,MAAM,OAAO,GAAG,gBAAgB,CAAC;AACjC,MAAM,OAAO,GAAG,gBAAgB,CAAC;AAEjC,0EAA0E;AAC1E,KAAK,UAAU,UAAU;IAIvB,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAC3D,OAAO;QACL,MAAM,EAAE,MAAe;QACvB,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,GAAsB;IACrC,CAAC,wEAAwE,EAAC,CAAC,CAAC;IAC5E,CAAC,qNAAqN,EAAC,EAAE,CAAC;CAC1N,CAAC;AAEF,6EAA6E;AAE7E,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAC;IACL,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,WAAW,EAAE,CAAC;IACd,MAAM,EAAE,EAAE;CACF,CAAC;AAEX,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,UAAU;QAAE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAC9E,IAAI,0DAA0D,CAAC,IAAI,CAAC,IAAI,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,IACE,uGAAuG,CAAC,IAAI,CAC1G,IAAI,CACL;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,IAAI,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1D,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,2EAA2E;IAC3E,yEAAyE;IACzE,IACE,6JAA6J,CAAC,IAAI,CAChK,IAAI,CACL;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,IACE,gKAAgK,CAAC,IAAI,CACnK,IAAI,CACL;QAED,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,IAAI,0CAA0C,CAAC,IAAI,CAAC,IAAI,CAAC;QACvD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,OAAO,IAAI,CAAC,GAAG,CAAC;AAClB,CAAC;AAqCD,MAAM,UAAW,SAAQ,KAAK;CAAG;AAEjC,4EAA4E;AAC5E,SAAS,QAAQ,CAAC,MAAkB;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;IAC3C,IAAI,KAAK;QACP,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,QAAQ;SACxD,CAAC;IACJ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,MAAM,CAAC,MAAkB;IAKhC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC,IAAI;QACR,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;IAC1E,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI;YACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5E,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YACjD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAG,IAAI,CAAC,IAAiB,IAAI,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACpE,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QACrE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC7C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/C,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,QAAQ,CAAC,MAAkB;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,GAAG;QACH,IAAI,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;QACnC,GAAG,MAAM,CAAC,IAAI,CAAC;QACf,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAC3B,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;KACpE,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,MAAM,CAAC,IAAU,EAAE,GAAW;IACrC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IACE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAErD,MAAM,IAAI,UAAU,CAClB,GAAG,IAAI,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,UAAU,UAAU,GAAG,IAAI,CACjG,CAAC;YACJ,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,SAAS;YACZ,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC7C,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC9C,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,gCAAgC,GAAG,IAAI,CAAC,CAAC;QAC5E,KAAK,MAAM;YACT,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC7C,MAAM,IAAI,UAAU,CAClB,GAAG,IAAI,CAAC,IAAI,oBAAoB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CACzE,CAAC;YACJ,OAAO,GAAG,CAAC;QACb,KAAK,MAAM;YACT,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,uBAAuB,GAAG,IAAI,CAAC,CAAC;YACnE,CAAC;QACH;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,IAAc,EACd,KAAa;IAEb,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,IAAI,GAAG,CAAC,CAAC;QAC3D,IAAI,GAAG,GAAuB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC1E,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IACE,IAAI,CAAC,IAAI,KAAK,SAAS;gBACvB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,SAAS,IAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EACvE,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,GAAG,KAAK,SAAS;YACnB,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,CAAC,IAAI,mBAAmB,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,UAAU;YACjB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAe,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;;YAC9D,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM;YACT,MAAM,IAAI,UAAU,CAAC,wBAAwB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YACvB,MAAM,IAAI,UAAU,CAAC,wBAAwB,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAW,CAAC,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,MAAM;QAChB,MAAM,IAAI,UAAU,CAAC,WAAW,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,IAAa,EAAE,KAAe;IACzD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACxE,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,GAAI,IAAgC,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAgBD,SAAS,MAAM,CAAC,MAAkB;IAChC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;SAC1B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI,CAAC,IAAI,KAAK,MAAM;QAClB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QACnB,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,4BAA4B,CACpK;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,sGAAsG;AACtG,SAAS,MAAM,CAAC,MAAkB;IAChC,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,IAAa,EAAE,MAAc;IACzC,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACnF,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,OAAO;IACd,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5D,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACtD,CAAC;AAED,SAAS,IAAI,CAAC,IAAU;IACtB,IAAI,IAAI,CAAC,WAAW,EAAE,YAAY;QAAE,OAAO,MAAM,CAAC;IAClD,OAAO,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC;AACrE,CAAC;AAED,MAAM,MAAM,GAAG,EAAE,CAAC;AAElB,SAAS,cAAc,CAAC,IAAU;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG;QACZ,GAAG,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACxC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;QAC/C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;KACnC;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAC/B,EAAE;QACF,QAAQ;QACR,KAAK,KAAK,EAAE;QACZ,EAAE;KACH,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,OAAe,EAAQ,EAAE;QACvD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,WAAW,GACf,CAAC,CAAC,IAAI,KAAK,SAAS;gBAClB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACpE,IAAI,CAAC,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACvB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM;gBAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;;gBACzC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CACR,sFAAsF,CACvF,CAAC;IACF,KAAK,CAAC,IAAI,CACR,gFAAgF,CACjF,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7G,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,SAAS,OAAO,CAAC,IAAU;IACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;IACpD,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1E,OAAO,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AACxE,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,MAAM,KAAK,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,cAAc,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACzE,KAAK,CAAC,IAAI,CACR,KAAK,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa;QACzB,SAAS,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE,CAAC,CAChD,CAAC;IACF,KAAK,CAAC,IAAI,CACR,EAAE,EACF,kCAAkC,KAAK,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,EAAE,EAAE,EACnG,EAAE,CACH,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,oCAAoC,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CACR,KAAK,GAAG,yDAAyD,EACjE,EAAE,CACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,sDAAsD;AACtD,KAAK,UAAU,OAAO;IAKpB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;IAC7C,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;IACtE,MAAM,MAAM,CAAC,OAAO,CAAC,UAAmB,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IAC3C,OAAO;QACL,MAAM;QACN,KAAK,EAAE,KAAe;QACtB,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,SAAmB;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IACzC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAE3B,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACpE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS,CACP,oBAAoB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,OAAO,EAAE,kBAAkB,CACzE,CAAC;gBACF,OAAO,IAAI,CAAC,KAAK,CAAC;YACpB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS,CACP,oBAAoB,OAAO,YAAY,OAAO,EAAE,wFAAwF,CACzI,CAAC;YACF,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,MAAM,GACV,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK;YACjC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACvB,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CACrD,CAAC;QACF,MAAM,SAAS,GACb,QAAQ,KAAK,CAAC,CAAC;YACb,CAAC,CAAC,SAAS;YACX,CAAC,CAAE,IAAI,CAAC,QAAQ,CAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACxC,CAAC,CAAE,IAAI,CAAC,QAAQ,CAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC1D,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,SAAS;YACtB,EAAE,KAAK,CAAC,GAAG,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;YACvB,QAAQ;YACR,WAAW;YACX,SAAS;YACT,YAAY;YACZ,YAAY;YACZ,OAAO;SACR,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACxC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACtC,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxE,IACE,QAAQ,KAAK,CAAC,CAAC;gBACf,CAAC,KAAK,QAAQ,GAAG,CAAC;gBAClB,CAAE,IAAI,CAAC,QAAQ,CAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAEzC,OAAO,KAAK,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,IAA6B,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,IAAI,MAAkB,CAAC;QACvB,IAAI,CAAC;YACH,6EAA6E;YAC7E,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAC7B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EACpC,SAAS,EACT,EAAE,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,CACzB,CAAe,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAI,KAAe,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1D,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/B,+EAA+E;YAC/E,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;YAC9D,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;QAED,oEAAoE;QACpE,MAAM,IAAI,GACR,MAAM,KAAK,MAAM;YACjB,CAAC,MAAM,EAAE,MAAM;YACf,MAAM,CAAC,iBAAiB,KAAK,SAAS;YACpC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YAChB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CACF,MAAM,EAAE,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ;YACxC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;YAC5B,CAAC,CAAC,IAAI,EACR,MAAM,CACP,CAAC;QACF,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC;IACzC,MAAM,KAAK,EAAE,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,OAAO,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type Account = {
|
|
2
|
+
name: string;
|
|
3
|
+
apiToken: string;
|
|
4
|
+
tokenFile: string;
|
|
5
|
+
};
|
|
6
|
+
export type Config = {
|
|
7
|
+
accounts: Account[];
|
|
8
|
+
defaultAccount: string;
|
|
9
|
+
readOnly: boolean;
|
|
10
|
+
allowDestructive: boolean;
|
|
11
|
+
auditPath: string;
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
minIntervalMs: number;
|
|
14
|
+
};
|
|
15
|
+
export declare function loadConfig(env?: NodeJS.ProcessEnv): Config;
|
|
16
|
+
export declare function selectAccount(c: Config, hint?: string): Account;
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function integer(v, fallback, min, max) { const n = v ? Number(v) : fallback; if (!Number.isInteger(n) || n < min || n > max)
|
|
2
|
+
throw Error('Invalid request timeout or pacing settings.'); return n; }
|
|
3
|
+
export function loadConfig(env = process.env) {
|
|
4
|
+
let entries = [];
|
|
5
|
+
if (env.CREATOMATE_ACCOUNTS) {
|
|
6
|
+
try {
|
|
7
|
+
const v = JSON.parse(env.CREATOMATE_ACCOUNTS);
|
|
8
|
+
if (!Array.isArray(v))
|
|
9
|
+
throw Error();
|
|
10
|
+
entries = v;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw Error('CREATOMATE_ACCOUNTS must be a private JSON array of named project profiles.');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
else if (env.CREATOMATE_API_KEY || env.CREATOMATE_TOKEN_FILE)
|
|
17
|
+
entries = [{ name: 'default', api_key: env.CREATOMATE_API_KEY, token_file: env.CREATOMATE_TOKEN_FILE }];
|
|
18
|
+
const accounts = entries.map(x => { if (!x || typeof x !== 'object' || typeof x.name !== 'string' || !x.name.trim())
|
|
19
|
+
throw Error('Every Creatomate profile requires a nonempty name.'); for (const k of ['api_key', 'token_file'])
|
|
20
|
+
if (x[k] !== undefined && (typeof x[k] !== 'string' || /[\r\n]/.test(x[k])))
|
|
21
|
+
throw Error('Private Creatomate profile settings must be strings without line breaks.'); return { name: x.name.trim(), apiToken: String(x.api_key ?? ''), tokenFile: String(x.token_file ?? '') }; });
|
|
22
|
+
if (new Set(accounts.map(a => a.name)).size !== accounts.length)
|
|
23
|
+
throw Error('Creatomate profile names must be unique.');
|
|
24
|
+
const defaultAccount = env.CREATOMATE_DEFAULT_ACCOUNT ?? accounts[0]?.name ?? '';
|
|
25
|
+
if (defaultAccount && !accounts.some(a => a.name === defaultAccount))
|
|
26
|
+
throw Error('Unknown CREATOMATE_DEFAULT_ACCOUNT.');
|
|
27
|
+
return { accounts, defaultAccount, readOnly: /^(1|true)$/i.test(env.CREATOMATE_READ_ONLY ?? ''), allowDestructive: !/^(0|false)$/i.test(env.CREATOMATE_ALLOW_DESTRUCTIVE ?? ''), auditPath: env.CREATOMATE_AUDIT_LOG ?? '', timeoutMs: integer(env.CREATOMATE_REQUEST_TIMEOUT_MS, 30000, 100, 300000), minIntervalMs: integer(env.CREATOMATE_MIN_REQUEST_INTERVAL_MS, 350, 0, 10000) };
|
|
28
|
+
}
|
|
29
|
+
export function selectAccount(c, hint) { const a = c.accounts.find(a => a.name === (hint ?? c.defaultAccount)); if (!a)
|
|
30
|
+
throw Error(c.accounts.length ? 'Unknown profile; run list_accounts and use its exact label.' : 'No credentials configured. Set CREATOMATE_API_KEY or CREATOMATE_TOKEN_FILE privately; run creatomate-cli login.'); return a; }
|
|
31
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runDoctor(network?: boolean): Promise<number>;
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { loadConfig } from './config.js';
|
|
2
|
+
import { CreatomateClient } from './api/client.js';
|
|
3
|
+
import { exitCodeFor } from './cli.js';
|
|
4
|
+
export async function runDoctor(network = false) { const config = loadConfig(); const c = new CreatomateClient(config); try {
|
|
5
|
+
const out = { profiles: config.accounts.length, defaultProfile: config.defaultAccount || null, readOnly: config.readOnly, mutationsAllowed: config.allowDestructive, networkRequested: network };
|
|
6
|
+
if (!config.accounts.length) {
|
|
7
|
+
console.log(JSON.stringify({ ...out, error: 'No credentials configured. Run creatomate-cli login.' }));
|
|
8
|
+
return 10;
|
|
9
|
+
}
|
|
10
|
+
if (network) {
|
|
11
|
+
const result = await c.request('GET', '/v2/templates');
|
|
12
|
+
console.log(JSON.stringify(c.sanitize({ ...out, templateReadVerified: true, templateCount: Array.isArray(result) ? result.length : null, projectOwnerVerified: false })));
|
|
13
|
+
}
|
|
14
|
+
else
|
|
15
|
+
console.log(JSON.stringify({ ...out, credentialsValidated: false }));
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
console.error(JSON.stringify({ error: c.redactText(e.message) }));
|
|
20
|
+
return exitCodeFor(e.message);
|
|
21
|
+
} }
|
|
22
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAM,EAAC,UAAU,EAAC,MAAI,aAAa,CAAC;AAAA,OAAM,EAAC,gBAAgB,EAAC,MAAI,iBAAiB,CAAC;AAAA,OAAM,EAAC,WAAW,EAAC,MAAI,UAAU,CAAC;AACpH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAO,GAAC,KAAK,IAAkB,MAAM,MAAM,GAAC,UAAU,EAAE,CAAC,CAAA,MAAM,CAAC,GAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAA,IAAG,CAAC;IAAA,MAAM,GAAG,GAAC,EAAC,QAAQ,EAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAC,cAAc,EAAC,MAAM,CAAC,cAAc,IAAE,IAAI,EAAC,QAAQ,EAAC,MAAM,CAAC,QAAQ,EAAC,gBAAgB,EAAC,MAAM,CAAC,gBAAgB,EAAC,gBAAgB,EAAC,OAAO,EAAC,CAAC;IAAA,IAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAC,CAAC;QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,GAAG,GAAG,EAAC,KAAK,EAAC,sDAAsD,EAAC,CAAC,CAAC,CAAC;QAAA,OAAO,EAAE,CAAC;IAAA,CAAC;IAAA,IAAG,OAAO,EAAC,CAAC;QAAA,MAAM,MAAM,GAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAC,eAAe,CAAC,CAAC;QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAC,GAAG,GAAG,EAAC,oBAAoB,EAAC,IAAI,EAAC,aAAa,EAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,MAAM,CAAC,MAAM,CAAA,CAAC,CAAA,IAAI,EAAC,oBAAoB,EAAC,KAAK,EAAC,CAAC,CAAC,CAAC,CAAC;IAAA,CAAC;;QAAK,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,GAAG,GAAG,EAAC,oBAAoB,EAAC,KAAK,EAAC,CAAC,CAAC,CAAC;IAAA,OAAO,CAAC,CAAC;AAAA,CAAC;AAAA,OAAM,CAAC,EAAC,CAAC;IAAA,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,KAAK,EAAC,CAAC,CAAC,UAAU,CAAE,CAAW,CAAC,OAAO,CAAC,EAAC,CAAC,CAAC,CAAC;IAAA,OAAO,WAAW,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC;AAAA,CAAC,CAAA,CAAC"}
|
package/dist/index.d.ts
ADDED