@extrovert.dev/mcp 0.1.0-pre.4 → 0.1.0-pre.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +38 -13
- package/dist/bin.d.ts +5 -7
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +63 -54
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +459 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +31 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +45 -11
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/contract.d.ts +2 -2
- package/dist/contract.js +2 -2
- package/dist/credentials.d.ts +41 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +203 -0
- package/dist/credentials.js.map +1 -0
- package/dist/fixtures.d.ts +2 -2
- package/dist/fixtures.d.ts.map +1 -1
- package/dist/fixtures.js +33 -4
- package/dist/fixtures.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -4
- package/dist/server.js.map +1 -1
- package/dist/stdio.d.ts.map +1 -1
- package/dist/stdio.js +24 -2
- package/dist/stdio.js.map +1 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +69 -8
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +27 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +3 -1
package/dist/cli.js
ADDED
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { ExtrovertApiError, ExtrovertClient } from "./client.js";
|
|
4
|
+
import { loadConfig } from "./config.js";
|
|
5
|
+
import { createCredentialStore } from "./credentials.js";
|
|
6
|
+
const MCP_PACKAGE = "@extrovert.dev/mcp@next";
|
|
7
|
+
export const CLI_HELP = `extrovert — setup, authenticate, and use Extrovert without custom transport code
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
extrovert setup [--host codex|claude]
|
|
11
|
+
extrovert auth login --with-token
|
|
12
|
+
extrovert auth status
|
|
13
|
+
extrovert auth logout
|
|
14
|
+
extrovert signup --human-email <email> [--username <name>]
|
|
15
|
+
extrovert verify [--otp <code>]
|
|
16
|
+
extrovert whoami [--json]
|
|
17
|
+
extrovert inbox list [--limit <n>] [--json]
|
|
18
|
+
extrovert message list --inbox <address> [--unread] [--limit <n>] [--json]
|
|
19
|
+
extrovert message get <message-id> [--source] [--json]
|
|
20
|
+
extrovert review list [--state <state>] [--limit <n>] [--json]
|
|
21
|
+
extrovert review status <review-id> [--json]
|
|
22
|
+
extrovert send --inbox <address> --to <email> --subject <text> --text <body>
|
|
23
|
+
--summary <reviewer-intent> [--client-id <id>] [--rules-reviewed]
|
|
24
|
+
|
|
25
|
+
Authentication:
|
|
26
|
+
signup stores only a short-lived pending key; verify atomically replaces it with
|
|
27
|
+
the full key in a permission-restricted local credential file. EXTROVERT_API_KEY
|
|
28
|
+
always takes precedence over the stored credential.
|
|
29
|
+
|
|
30
|
+
MCP transport:
|
|
31
|
+
Running extrovert-mcp with no command starts stdio. The official plugin and
|
|
32
|
+
'extrovert setup' configure that published server directly.
|
|
33
|
+
`;
|
|
34
|
+
export async function runCli(argv, options = {}) {
|
|
35
|
+
const env = options.env ?? process.env;
|
|
36
|
+
const context = {
|
|
37
|
+
env,
|
|
38
|
+
stdin: options.stdin ?? process.stdin,
|
|
39
|
+
stdout: options.stdout ?? process.stdout,
|
|
40
|
+
stderr: options.stderr ?? process.stderr,
|
|
41
|
+
store: options.credentialStore ?? createCredentialStore(env),
|
|
42
|
+
runCommand: options.runCommand ??
|
|
43
|
+
((command, args) => spawnSync(command, args, {
|
|
44
|
+
encoding: "utf8",
|
|
45
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
46
|
+
})),
|
|
47
|
+
};
|
|
48
|
+
try {
|
|
49
|
+
const command = argv[0];
|
|
50
|
+
if (!command || command === "help" || command === "--help" || command === "-h") {
|
|
51
|
+
context.stdout.write(CLI_HELP);
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
switch (command) {
|
|
55
|
+
case "setup":
|
|
56
|
+
return setupCommand(argv.slice(1), context);
|
|
57
|
+
case "auth":
|
|
58
|
+
return authCommand(argv.slice(1), context);
|
|
59
|
+
case "signup":
|
|
60
|
+
return signupCommand(argv.slice(1), context);
|
|
61
|
+
case "verify":
|
|
62
|
+
return verifyCommand(argv.slice(1), context);
|
|
63
|
+
case "whoami":
|
|
64
|
+
return whoamiCommand(argv.slice(1), context);
|
|
65
|
+
case "inbox":
|
|
66
|
+
return inboxCommand(argv.slice(1), context);
|
|
67
|
+
case "message":
|
|
68
|
+
return messageCommand(argv.slice(1), context);
|
|
69
|
+
case "review":
|
|
70
|
+
return reviewCommand(argv.slice(1), context);
|
|
71
|
+
case "send":
|
|
72
|
+
return sendCommand(argv.slice(1), context);
|
|
73
|
+
default:
|
|
74
|
+
throw new CliUsageError(`Unknown Extrovert command: ${command}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
const message = renderError(error);
|
|
79
|
+
context.stderr.write(`${message}\n`);
|
|
80
|
+
if (error instanceof CliUsageError)
|
|
81
|
+
context.stderr.write("Run 'extrovert --help' for usage.\n");
|
|
82
|
+
return error instanceof CliUsageError ? 2 : 1;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function setupCommand(args, context) {
|
|
86
|
+
const host = option(args, "--host") ?? "codex";
|
|
87
|
+
if (!new Set(["codex", "claude"]).has(host)) {
|
|
88
|
+
throw new CliUsageError("--host must be codex or claude");
|
|
89
|
+
}
|
|
90
|
+
const executable = host;
|
|
91
|
+
const existing = context.runCommand(executable, ["mcp", "get", "extrovert", ...(host === "codex" ? ["--json"] : [])]);
|
|
92
|
+
if (existing.error && isMissingExecutable(existing.error)) {
|
|
93
|
+
throw new Error(`${host} is not installed or not on PATH`);
|
|
94
|
+
}
|
|
95
|
+
if (existing.status === 0) {
|
|
96
|
+
context.stdout.write(`Extrovert MCP is already configured for ${host}. Start a new session to load it.\n`);
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
const added = context.runCommand(executable, ["mcp", "add", "extrovert", "--", "npx", "-y", MCP_PACKAGE]);
|
|
100
|
+
if (added.error)
|
|
101
|
+
throw added.error;
|
|
102
|
+
if (added.status !== 0) {
|
|
103
|
+
throw new Error(cleanCommandError(added.stderr) || `Could not configure Extrovert MCP for ${host}`);
|
|
104
|
+
}
|
|
105
|
+
context.stdout.write(`Configured Extrovert MCP for ${host}. Start a new session, then call sign_up or whoami.\n`);
|
|
106
|
+
return 0;
|
|
107
|
+
}
|
|
108
|
+
async function authCommand(args, context) {
|
|
109
|
+
const action = args[0];
|
|
110
|
+
switch (action) {
|
|
111
|
+
case "login": {
|
|
112
|
+
if (!hasFlag(args, "--with-token")) {
|
|
113
|
+
throw new CliUsageError("auth login requires --with-token; the key is read from EXTROVERT_API_KEY or a hidden stdin prompt");
|
|
114
|
+
}
|
|
115
|
+
const token = (context.env.EXTROVERT_API_KEY ?? "").trim() || (await readSecret(context, "Agent key: "));
|
|
116
|
+
if (!token.startsWith("pk_agent_"))
|
|
117
|
+
throw new CliUsageError("Expected a scoped pk_agent_… key");
|
|
118
|
+
const client = clientForKey(token, context, context.env.EXTROVERT_API_BASE_URL);
|
|
119
|
+
const me = await client.whoami();
|
|
120
|
+
context.store.save(token, clientBaseUrl(token, context, context.env.EXTROVERT_API_BASE_URL));
|
|
121
|
+
context.stdout.write(`Authenticated agent ${me.agent_id}; credential saved at ${context.store.paths.credential}.\n`);
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
case "status": {
|
|
125
|
+
const auth = resolveAuthentication(context);
|
|
126
|
+
if (!auth) {
|
|
127
|
+
context.stdout.write("Not authenticated. Run 'extrovert signup' or 'extrovert auth login --with-token'.\n");
|
|
128
|
+
return 1;
|
|
129
|
+
}
|
|
130
|
+
const me = await auth.client.whoami();
|
|
131
|
+
context.stdout.write(`Authenticated via ${auth.source}.\n${formatWhoAmI(me)}\n`);
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
case "logout": {
|
|
135
|
+
const removed = context.store.clear();
|
|
136
|
+
context.store.clearPendingSignup();
|
|
137
|
+
context.stdout.write(removed ? "Removed the stored Extrovert credential.\n" : "No stored Extrovert credential was present.\n");
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
default:
|
|
141
|
+
throw new CliUsageError("auth requires login, status, or logout");
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async function signupCommand(args, context) {
|
|
145
|
+
const humanEmail = requiredOption(args, "--human-email");
|
|
146
|
+
const username = option(args, "--username");
|
|
147
|
+
const apiBaseUrl = context.env.EXTROVERT_API_BASE_URL;
|
|
148
|
+
const config = loadConfig({ ...context.env, EXTROVERT_API_KEY: "", ...(apiBaseUrl ? { EXTROVERT_API_BASE_URL: apiBaseUrl } : {}) });
|
|
149
|
+
const client = new ExtrovertClient(config);
|
|
150
|
+
const result = await client.signUp({ human_email: humanEmail, username });
|
|
151
|
+
context.store.savePendingSignup({
|
|
152
|
+
agent_key: result.agent_key,
|
|
153
|
+
human_email: humanEmail,
|
|
154
|
+
address: result.address,
|
|
155
|
+
otp_expires_at: result.otp_expires_at,
|
|
156
|
+
api_base_url: config.apiBaseUrl,
|
|
157
|
+
});
|
|
158
|
+
context.stdout.write(`Verification code sent to ${result.otp_sent_to}.\nInbox: ${result.address}\nPending credential saved securely; run 'extrovert verify'.\n`);
|
|
159
|
+
return 0;
|
|
160
|
+
}
|
|
161
|
+
async function verifyCommand(args, context) {
|
|
162
|
+
const pending = context.store.loadPendingSignup();
|
|
163
|
+
if (!pending)
|
|
164
|
+
throw new Error("No pending signup. Run 'extrovert signup --human-email <email>' first.");
|
|
165
|
+
const otp = option(args, "--otp") ?? (await readVisibleLine(context, "Verification code: "));
|
|
166
|
+
if (!otp.trim())
|
|
167
|
+
throw new CliUsageError("Verification code cannot be empty");
|
|
168
|
+
const client = clientForKey(pending.agent_key, context, pending.api_base_url);
|
|
169
|
+
const result = await client.verify({ otp: otp.trim() });
|
|
170
|
+
try {
|
|
171
|
+
context.store.save(result.agent_key, pending.api_base_url);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
context.stdout.write(`${JSON.stringify({ agent_key: result.agent_key, address: result.address, scopes: result.scopes })}\n`);
|
|
175
|
+
throw new Error(`Verification succeeded, but durable credential storage failed. The replacement key was printed once above. ${renderError(error)}`);
|
|
176
|
+
}
|
|
177
|
+
context.store.clearPendingSignup();
|
|
178
|
+
context.stdout.write(`Verified. Full credential saved at ${context.store.paths.credential}.\nInbox: ${result.address}\nScopes: ${result.scopes.join(", ")}\nStart a new agent session; Extrovert MCP will authenticate automatically.\n`);
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
181
|
+
async function whoamiCommand(args, context) {
|
|
182
|
+
const me = await requireAuthentication(context).client.whoami();
|
|
183
|
+
writeResult(context, me, hasFlag(args, "--json"), formatWhoAmI);
|
|
184
|
+
return 0;
|
|
185
|
+
}
|
|
186
|
+
async function inboxCommand(args, context) {
|
|
187
|
+
if (args[0] !== "list")
|
|
188
|
+
throw new CliUsageError("inbox requires list");
|
|
189
|
+
const limit = integerOption(args, "--limit", 20, 1, 100);
|
|
190
|
+
const page = await requireAuthentication(context).client.listInboxes({ limit });
|
|
191
|
+
writeResult(context, page, hasFlag(args, "--json"), (value) => value.items.map((inbox) => `${inbox.address}\t${inbox.status}\t${inbox.id}`).join("\n") || "No inboxes.");
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
async function messageCommand(args, context) {
|
|
195
|
+
const action = args[0];
|
|
196
|
+
const client = requireAuthentication(context).client;
|
|
197
|
+
if (action === "list") {
|
|
198
|
+
const inbox = requiredOption(args, "--inbox");
|
|
199
|
+
const limit = integerOption(args, "--limit", 20, 1, 100);
|
|
200
|
+
const page = await client.listMessages({ inbox, limit, unread_only: hasFlag(args, "--unread") });
|
|
201
|
+
writeResult(context, page, hasFlag(args, "--json"), (value) => value.items.map(formatMessageSummary).join("\n") || "No messages.");
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
if (action === "get") {
|
|
205
|
+
const id = positional(args.slice(1))[0];
|
|
206
|
+
if (!id)
|
|
207
|
+
throw new CliUsageError("message get requires a message id");
|
|
208
|
+
const message = await client.getMessage(id);
|
|
209
|
+
writeResult(context, message, hasFlag(args, "--json"), (value) => formatMessage(value, hasFlag(args, "--source")));
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
throw new CliUsageError("message requires list or get");
|
|
213
|
+
}
|
|
214
|
+
async function reviewCommand(args, context) {
|
|
215
|
+
const action = args[0];
|
|
216
|
+
const client = requireAuthentication(context).client;
|
|
217
|
+
if (action === "status") {
|
|
218
|
+
const id = positional(args.slice(1))[0];
|
|
219
|
+
if (!id)
|
|
220
|
+
throw new CliUsageError("review status requires a review id");
|
|
221
|
+
const review = await client.getReview(id);
|
|
222
|
+
writeResult(context, review, hasFlag(args, "--json"), formatReview);
|
|
223
|
+
return 0;
|
|
224
|
+
}
|
|
225
|
+
if (action === "list") {
|
|
226
|
+
const state = option(args, "--state");
|
|
227
|
+
const limit = integerOption(args, "--limit", 20, 1, 100);
|
|
228
|
+
const page = await client.listReviews({ state, limit });
|
|
229
|
+
writeResult(context, page, hasFlag(args, "--json"), (value) => value.items.map((review) => `${review.id}\t${review.state}\t${review.proposed_subject}`).join("\n") || "No reviews.");
|
|
230
|
+
return 0;
|
|
231
|
+
}
|
|
232
|
+
throw new CliUsageError("review requires list or status");
|
|
233
|
+
}
|
|
234
|
+
async function sendCommand(args, context) {
|
|
235
|
+
const inbox = requiredOption(args, "--inbox");
|
|
236
|
+
const recipients = optionList(args, "--to");
|
|
237
|
+
if (!recipients.length)
|
|
238
|
+
throw new CliUsageError("send requires at least one --to recipient");
|
|
239
|
+
const subject = requiredOption(args, "--subject");
|
|
240
|
+
const text = requiredOption(args, "--text");
|
|
241
|
+
const summary = requiredOption(args, "--summary");
|
|
242
|
+
const clientId = option(args, "--client-id") ?? `cli-${randomUUID()}`;
|
|
243
|
+
const client = requireAuthentication(context).client;
|
|
244
|
+
await client.getInbox(inbox);
|
|
245
|
+
const rules = await client.getRules();
|
|
246
|
+
if (rules.items.length && !hasFlag(args, "--rules-reviewed")) {
|
|
247
|
+
throw new CliUsageError(`${rules.items.length} writing rule(s) apply. Review and apply them through MCP, or rerun with --rules-reviewed after doing so.`);
|
|
248
|
+
}
|
|
249
|
+
for (const recipient of recipients) {
|
|
250
|
+
const suppression = await client.precheckSuppression(recipient);
|
|
251
|
+
if (suppression.suppressed)
|
|
252
|
+
throw new Error(`Recipient ${recipient} is suppressed; no message was submitted.`);
|
|
253
|
+
}
|
|
254
|
+
const result = await client.submitForReview({
|
|
255
|
+
inbox,
|
|
256
|
+
to: recipients,
|
|
257
|
+
subject,
|
|
258
|
+
text,
|
|
259
|
+
mode: "review",
|
|
260
|
+
intent: { summary },
|
|
261
|
+
client_id: clientId,
|
|
262
|
+
});
|
|
263
|
+
context.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
264
|
+
return 0;
|
|
265
|
+
}
|
|
266
|
+
function resolveAuthentication(context) {
|
|
267
|
+
const fromEnvironment = (context.env.EXTROVERT_API_KEY ?? "").trim();
|
|
268
|
+
if (fromEnvironment) {
|
|
269
|
+
return { client: clientForKey(fromEnvironment, context, context.env.EXTROVERT_API_BASE_URL), source: "EXTROVERT_API_KEY" };
|
|
270
|
+
}
|
|
271
|
+
const stored = context.store.load();
|
|
272
|
+
if (!stored)
|
|
273
|
+
return undefined;
|
|
274
|
+
return { client: clientForKey(stored.agent_key, context, stored.api_base_url), source: context.store.paths.credential };
|
|
275
|
+
}
|
|
276
|
+
function requireAuthentication(context) {
|
|
277
|
+
const auth = resolveAuthentication(context);
|
|
278
|
+
if (!auth)
|
|
279
|
+
throw new Error("No Extrovert credential. Run 'extrovert signup' or 'extrovert auth login --with-token'.");
|
|
280
|
+
return auth;
|
|
281
|
+
}
|
|
282
|
+
function clientForKey(key, context, baseUrl) {
|
|
283
|
+
const env = { ...context.env, EXTROVERT_API_KEY: key };
|
|
284
|
+
if (baseUrl?.trim())
|
|
285
|
+
env.EXTROVERT_API_BASE_URL = baseUrl.trim();
|
|
286
|
+
return new ExtrovertClient(loadConfig(env));
|
|
287
|
+
}
|
|
288
|
+
function clientBaseUrl(key, context, baseUrl) {
|
|
289
|
+
const env = { ...context.env, EXTROVERT_API_KEY: key };
|
|
290
|
+
if (baseUrl?.trim())
|
|
291
|
+
env.EXTROVERT_API_BASE_URL = baseUrl.trim();
|
|
292
|
+
return loadConfig(env).apiBaseUrl;
|
|
293
|
+
}
|
|
294
|
+
function writeResult(context, value, json, format) {
|
|
295
|
+
context.stdout.write(json ? `${JSON.stringify(value, null, 2)}\n` : `${format(value)}\n`);
|
|
296
|
+
}
|
|
297
|
+
function formatWhoAmI(me) {
|
|
298
|
+
return [
|
|
299
|
+
`Agent: ${me.agent_id}`,
|
|
300
|
+
`Org: ${me.org_id || "(none)"}`,
|
|
301
|
+
`Project: ${me.project_id || "(none)"}`,
|
|
302
|
+
`Key: ${me.key_id}`,
|
|
303
|
+
`Scopes: ${me.scopes.join(", ") || "(none)"}`,
|
|
304
|
+
].join("\n");
|
|
305
|
+
}
|
|
306
|
+
function formatMessageSummary(message) {
|
|
307
|
+
const unread = message.seen ? " " : "*";
|
|
308
|
+
return `${unread} ${message.id}\t${message.date}\t${message.from.email}\t${message.subject}`;
|
|
309
|
+
}
|
|
310
|
+
function formatMessage(message, source) {
|
|
311
|
+
const body = source ? message.text ?? message.html ?? "" : message.extracted_text ?? message.text ?? message.extracted_html ?? message.html ?? "";
|
|
312
|
+
return [
|
|
313
|
+
`From: ${message.from.name ? `${message.from.name} <${message.from.email}>` : message.from.email}`,
|
|
314
|
+
`To: ${message.to.map((address) => address.email).join(", ")}`,
|
|
315
|
+
`Subject: ${message.subject}`,
|
|
316
|
+
`Date: ${message.date}`,
|
|
317
|
+
`Message: ${message.id}`,
|
|
318
|
+
"",
|
|
319
|
+
body,
|
|
320
|
+
].join("\n");
|
|
321
|
+
}
|
|
322
|
+
function formatReview(review) {
|
|
323
|
+
return [
|
|
324
|
+
`Review: ${review.id}`,
|
|
325
|
+
`State: ${review.state}`,
|
|
326
|
+
`Closed: ${review.closed === undefined ? "unknown" : String(review.closed)}`,
|
|
327
|
+
`Subject: ${review.sent_subject ?? review.proposed_subject}`,
|
|
328
|
+
`Updated: ${review.updated_at}`,
|
|
329
|
+
...(review.sent_at ? [`Sent: ${review.sent_at}`] : []),
|
|
330
|
+
...(review.send_error ? [`Error: ${review.send_error}`] : []),
|
|
331
|
+
].join("\n");
|
|
332
|
+
}
|
|
333
|
+
function option(args, name) {
|
|
334
|
+
const index = args.indexOf(name);
|
|
335
|
+
if (index === -1)
|
|
336
|
+
return undefined;
|
|
337
|
+
const value = args[index + 1];
|
|
338
|
+
if (!value || value.startsWith("--"))
|
|
339
|
+
throw new CliUsageError(`${name} requires a value`);
|
|
340
|
+
return value;
|
|
341
|
+
}
|
|
342
|
+
function requiredOption(args, name) {
|
|
343
|
+
const value = option(args, name)?.trim();
|
|
344
|
+
if (!value)
|
|
345
|
+
throw new CliUsageError(`${name} is required`);
|
|
346
|
+
return value;
|
|
347
|
+
}
|
|
348
|
+
function optionList(args, name) {
|
|
349
|
+
const values = [];
|
|
350
|
+
for (let index = 0; index < args.length; index++) {
|
|
351
|
+
if (args[index] !== name)
|
|
352
|
+
continue;
|
|
353
|
+
const value = args[index + 1];
|
|
354
|
+
if (!value || value.startsWith("--"))
|
|
355
|
+
throw new CliUsageError(`${name} requires a value`);
|
|
356
|
+
values.push(...value.split(",").map((item) => item.trim()).filter(Boolean));
|
|
357
|
+
}
|
|
358
|
+
return [...new Set(values)];
|
|
359
|
+
}
|
|
360
|
+
function integerOption(args, name, fallback, min, max) {
|
|
361
|
+
const raw = option(args, name);
|
|
362
|
+
if (raw === undefined)
|
|
363
|
+
return fallback;
|
|
364
|
+
const value = Number(raw);
|
|
365
|
+
if (!Number.isSafeInteger(value) || value < min || value > max) {
|
|
366
|
+
throw new CliUsageError(`${name} must be an integer from ${min} to ${max}`);
|
|
367
|
+
}
|
|
368
|
+
return value;
|
|
369
|
+
}
|
|
370
|
+
function hasFlag(args, name) {
|
|
371
|
+
return args.includes(name);
|
|
372
|
+
}
|
|
373
|
+
function positional(args) {
|
|
374
|
+
const values = [];
|
|
375
|
+
for (let index = 0; index < args.length; index++) {
|
|
376
|
+
const value = args[index];
|
|
377
|
+
if (!value)
|
|
378
|
+
continue;
|
|
379
|
+
if (value.startsWith("--")) {
|
|
380
|
+
if (!new Set(["--json", "--source", "--unread", "--rules-reviewed", "--with-token"]).has(value))
|
|
381
|
+
index++;
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
values.push(value);
|
|
385
|
+
}
|
|
386
|
+
return values;
|
|
387
|
+
}
|
|
388
|
+
async function readSecret(context, prompt) {
|
|
389
|
+
const input = context.stdin;
|
|
390
|
+
if (!input.isTTY || typeof input.setRawMode !== "function")
|
|
391
|
+
return readAll(context.stdin);
|
|
392
|
+
context.stderr.write(prompt);
|
|
393
|
+
return new Promise((resolve, reject) => {
|
|
394
|
+
const characters = [];
|
|
395
|
+
const wasRaw = input.isRaw;
|
|
396
|
+
const onData = (chunk) => {
|
|
397
|
+
for (const character of String(chunk)) {
|
|
398
|
+
if (character === "\u0003") {
|
|
399
|
+
cleanup();
|
|
400
|
+
reject(new Error("Cancelled"));
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
if (character === "\r" || character === "\n") {
|
|
404
|
+
cleanup();
|
|
405
|
+
context.stderr.write("\n");
|
|
406
|
+
resolve(characters.join("").trim());
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
if (character === "\u007f" || character === "\b")
|
|
410
|
+
characters.pop();
|
|
411
|
+
else
|
|
412
|
+
characters.push(character);
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
const cleanup = () => {
|
|
416
|
+
input.off("data", onData);
|
|
417
|
+
input.setRawMode?.(wasRaw ?? false);
|
|
418
|
+
input.pause();
|
|
419
|
+
};
|
|
420
|
+
input.setEncoding("utf8");
|
|
421
|
+
input.setRawMode(true);
|
|
422
|
+
input.resume();
|
|
423
|
+
input.on("data", onData);
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
async function readVisibleLine(context, prompt) {
|
|
427
|
+
context.stderr.write(prompt);
|
|
428
|
+
const value = await readAll(context.stdin);
|
|
429
|
+
return value.split(/\r?\n/, 1)[0]?.trim() ?? "";
|
|
430
|
+
}
|
|
431
|
+
async function readAll(stream) {
|
|
432
|
+
const chunks = [];
|
|
433
|
+
for await (const chunk of stream)
|
|
434
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk)));
|
|
435
|
+
return Buffer.concat(chunks).toString("utf8").trim();
|
|
436
|
+
}
|
|
437
|
+
function renderError(error) {
|
|
438
|
+
if (error instanceof ExtrovertApiError) {
|
|
439
|
+
const code = error.code ? ` [${error.code}]` : "";
|
|
440
|
+
const request = error.details && typeof error.details === "object" && "request_id" in error.details
|
|
441
|
+
? ` request ${error.details.request_id ?? ""}`
|
|
442
|
+
: "";
|
|
443
|
+
return `Extrovert API error${code}: ${error.message}${request}`;
|
|
444
|
+
}
|
|
445
|
+
return error instanceof Error ? error.message : String(error);
|
|
446
|
+
}
|
|
447
|
+
function cleanCommandError(value) {
|
|
448
|
+
return value ? String(value).trim() : "";
|
|
449
|
+
}
|
|
450
|
+
function isMissingExecutable(error) {
|
|
451
|
+
return "code" in error && error.code === "ENOENT";
|
|
452
|
+
}
|
|
453
|
+
class CliUsageError extends Error {
|
|
454
|
+
constructor(message) {
|
|
455
|
+
super(message);
|
|
456
|
+
this.name = "CliUsageError";
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
//# 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,OAAO,EAAE,SAAS,EAAyB,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAwB,MAAM,kBAAkB,CAAC;AAG/E,MAAM,WAAW,GAAG,yBAAyB,CAAC;AAE9C,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvB,CAAC;AAoBF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc,EAAE,UAAsB,EAAE;IACnE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,OAAO,GAAe;QAC1B,GAAG;QACH,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;QACrC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;QACxC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;QACxC,KAAK,EAAE,OAAO,CAAC,eAAe,IAAI,qBAAqB,CAAC,GAAG,CAAC;QAC5D,UAAU,EACR,OAAO,CAAC,UAAU;YAClB,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CACjB,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;gBACvB,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;KACR,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,OAAO;gBACV,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC9C,KAAK,MAAM;gBACT,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7C,KAAK,QAAQ;gBACX,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/C,KAAK,QAAQ;gBACX,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/C,KAAK,QAAQ;gBACX,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/C,KAAK,OAAO;gBACV,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC9C,KAAK,SAAS;gBACZ,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAChD,KAAK,QAAQ;gBACX,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/C,KAAK,MAAM;gBACT,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7C;gBACE,MAAM,IAAI,aAAa,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;QACrC,IAAI,KAAK,YAAY,aAAa;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAChG,OAAO,KAAK,YAAY,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,OAAmB;IACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC;IAC/C,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,aAAa,CAAC,gCAAgC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtH,IAAI,QAAQ,CAAC,KAAK,IAAI,mBAAmB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kCAAkC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,IAAI,qCAAqC,CAAC,CAAC;QAC3G,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1G,IAAI,KAAK,CAAC,KAAK;QAAE,MAAM,KAAK,CAAC,KAAK,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,yCAAyC,IAAI,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,uDAAuD,CAAC,CAAC;IAClH,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAc,EAAE,OAAmB;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,aAAa,CAAC,mGAAmG,CAAC,CAAC;YAC/H,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;YACzG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;gBAAE,MAAM,IAAI,aAAa,CAAC,kCAAkC,CAAC,CAAC;YAChG,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAChF,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC7F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,QAAQ,yBAAyB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC;YACrH,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qFAAqF,CAAC,CAAC;gBAC5G,OAAO,CAAC,CAAC;YACX,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,MAAM,MAAM,YAAY,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACjF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC;YAC/H,OAAO,CAAC,CAAC;QACX,CAAC;QACD;YACE,MAAM,IAAI,aAAa,CAAC,wCAAwC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,OAAmB;IAC9D,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpI,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,YAAY,EAAE,MAAM,CAAC,UAAU;KAChC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,MAAM,CAAC,WAAW,aAAa,MAAM,CAAC,OAAO,gEAAgE,CAC3I,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,OAAmB;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC;IAClD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IACxG,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,aAAa,CAAC,mCAAmC,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7H,MAAM,IAAI,KAAK,CAAC,8GAA8G,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtJ,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sCAAsC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,aAAa,MAAM,CAAC,OAAO,aAAa,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,+EAA+E,CACpN,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,OAAmB;IAC9D,MAAM,EAAE,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAChE,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,OAAmB;IAC7D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM;QAAE,MAAM,IAAI,aAAa,CAAC,qBAAqB,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChF,WAAW,CACT,OAAO,EACP,IAAI,EACJ,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EACvB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CACpH,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAc,EAAE,OAAmB;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACrD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QACjG,WAAW,CACT,OAAO,EACP,IAAI,EACJ,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EACvB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAC9E,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,aAAa,CAAC,mCAAmC,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5C,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACnH,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,aAAa,CAAC,8BAA8B,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAc,EAAE,OAAmB;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACrD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,aAAa,CAAC,oCAAoC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,SAAS,CAAgC,CAAC;QACrE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,WAAW,CACT,OAAO,EACP,IAAI,EACJ,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,EACvB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAChI,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,IAAI,aAAa,CAAC,gCAAgC,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAc,EAAE,OAAmB;IAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,MAAM,IAAI,aAAa,CAAC,2CAA2C,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,OAAO,UAAU,EAAE,EAAE,CAAC;IACtE,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAErD,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IACtC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,aAAa,CACrB,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,2GAA2G,CACjI,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,WAAW,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,SAAS,2CAA2C,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;QAC1C,KAAK;QACL,EAAE,EAAE,UAAU;QACd,OAAO;QACP,IAAI;QACJ,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,EAAE,OAAO,EAAE;QACnB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAmB;IAChD,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC7H,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;AAC1H,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAmB;IAChD,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;IACtH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,GAAW,EAAE,OAAmB,EAAE,OAAgB;IACtE,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC;IAC1E,IAAI,OAAO,EAAE,IAAI,EAAE;QAAE,GAAG,CAAC,sBAAsB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACjE,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,OAAmB,EAAE,OAAgB;IACvE,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC;IAC1E,IAAI,OAAO,EAAE,IAAI,EAAE;QAAE,GAAG,CAAC,sBAAsB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACjE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAI,OAAmB,EAAE,KAAQ,EAAE,IAAa,EAAE,MAA4B;IAChG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5F,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO;QACL,UAAU,EAAE,CAAC,QAAQ,EAAE;QACvB,QAAQ,EAAE,CAAC,MAAM,IAAI,QAAQ,EAAE;QAC/B,YAAY,EAAE,CAAC,UAAU,IAAI,QAAQ,EAAE;QACvC,QAAQ,EAAE,CAAC,MAAM,EAAE;QACnB,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE;KAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;AAC/F,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB,EAAE,MAAe;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAClJ,OAAO;QACL,SAAS,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;QAClG,OAAO,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC9D,YAAY,OAAO,CAAC,OAAO,EAAE;QAC7B,SAAS,OAAO,CAAC,IAAI,EAAE;QACvB,YAAY,OAAO,CAAC,EAAE,EAAE;QACxB,EAAE;QACF,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,OAAO;QACL,WAAW,MAAM,CAAC,EAAE,EAAE;QACtB,UAAU,MAAM,CAAC,KAAK,EAAE;QACxB,WAAW,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QAC5E,YAAY,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,gBAAgB,EAAE;QAC5D,YAAY,MAAM,CAAC,UAAU,EAAE;QAC/B,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,IAAc,EAAE,IAAY;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,aAAa,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC1F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAc,EAAE,IAAY;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,aAAa,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,IAAc,EAAE,IAAY;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,SAAS;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,aAAa,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;QAC1F,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,aAAa,CAAC,IAAc,EAAE,IAAY,EAAE,QAAgB,EAAE,GAAW,EAAE,GAAW;IAC7F,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC/D,MAAM,IAAI,aAAa,CAAC,GAAG,IAAI,4BAA4B,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,IAAc,EAAE,IAAY;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,KAAK,EAAE,CAAC;YACzG,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAmB,EAAE,MAAc;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAA0B,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC;QAC3B,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAE,EAAE;YACxC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC3B,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBACD,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBAC7C,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC3B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpC,OAAO;gBACT,CAAC;gBACD,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI;oBAAE,UAAU,CAAC,GAAG,EAAE,CAAC;;oBAC9D,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;YACpC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC,CAAC;QACF,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAmB,EAAE,MAAc;IAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,MAAgB;IACrC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3G,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,YAAY,IAAI,KAAK,CAAC,OAAO;YACjG,CAAC,CAAC,YAAa,KAAK,CAAC,OAAoC,CAAC,UAAU,IAAI,EAAE,EAAE;YAC5E,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,sBAAsB,IAAI,KAAK,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyC;IAClE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAY;IACvC,OAAO,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC/E,CAAC;AAED,MAAM,aAAc,SAAQ,KAAK;IAC/B,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
|
package/dist/client.d.ts
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { ExtrovertConfig } from "./config.js";
|
|
13
13
|
import { NotFoundError } from "./fixtures.js";
|
|
14
|
-
import type { Attachment, AttachmentDownload, AttachmentInput, BatchUpdateResult, Category, ContactListDirection, ContactListEntry, ContactListKind, DeleteResult, Domain, DomainOffboard, EnrollmentResult, GraduationStatus, Inbox, Job, KeyTier, MailboxCredentials, Message, Page, Review, RiskDial, ReviewDecisionContext, ReviewerAction, ReviewerDecisionResult, ReviewEventsResult, ReviewFeedback, ReviewIntent, ReviewMode, ReviewState, CategoryPacingState, ReviewTurn, Rule, RuleAuditEntry, ProblemField, ReplyEmailResult, ScanBacklogStatus, SendEmailResult, SignUpResult, SubmitForReviewResult, SuppressionEntry, SuppressionPrecheck, ReputationRollup, ReputationFinding, ListDeliverabilityFindingsInput, Thread, ThreadDetail, VerifyResult, WaitForEmailResult, Webhook, WebhookEvent, WhoAmI } from "./types.js";
|
|
14
|
+
import type { Attachment, AttachmentDownload, AttachmentInput, BatchUpdateResult, Category, ContactListDirection, ContactListEntry, ContactListKind, DeleteResult, Domain, DomainOffboard, EnrollmentResult, GraduationStatus, Inbox, Job, KeyTier, MailboxCredentials, Message, Page, Review, RiskDial, ReviewDecisionContext, ReviewerAction, ReviewerDecisionResult, ReviewEventsResult, ReviewFeedback, ReviewIntent, ReviewMode, ReviewState, CategoryPacingState, ReviewTurn, Rule, RuleSnapshot, RuleAuditEntry, ProblemField, ReplyEmailResult, ScanBacklogStatus, SendEmailResult, SignUpResult, SubmitForReviewResult, SuppressionEntry, SuppressionPrecheck, ReputationRollup, ReputationFinding, ListDeliverabilityFindingsInput, Thread, ThreadDetail, VerifyResult, WaitForEmailResult, Webhook, WebhookEvent, WhoAmI } from "./types.js";
|
|
15
15
|
/** Normalized error surfaced from any client call. */
|
|
16
16
|
export declare class ExtrovertApiError extends Error {
|
|
17
17
|
readonly status: number;
|
|
@@ -135,6 +135,7 @@ export interface SendEmailInput {
|
|
|
135
135
|
attachments?: AttachmentInput[];
|
|
136
136
|
/** Stable retry key, sent as Idempotency-Key and never in the JSON body. */
|
|
137
137
|
client_id?: string;
|
|
138
|
+
composition_token?: string;
|
|
138
139
|
}
|
|
139
140
|
export interface ReplyEmailInput {
|
|
140
141
|
inbox: string;
|
|
@@ -153,6 +154,7 @@ export interface ReplyEmailInput {
|
|
|
153
154
|
attachments?: AttachmentInput[];
|
|
154
155
|
/** Stable retry key, sent as Idempotency-Key and never in the JSON body. */
|
|
155
156
|
client_id?: string;
|
|
157
|
+
composition_token?: string;
|
|
156
158
|
}
|
|
157
159
|
export interface ForwardEmailInput {
|
|
158
160
|
inbox: string;
|
|
@@ -165,6 +167,7 @@ export interface ForwardEmailInput {
|
|
|
165
167
|
html?: string;
|
|
166
168
|
/** Stable retry key, sent as Idempotency-Key and never in the JSON body. */
|
|
167
169
|
client_id?: string;
|
|
170
|
+
composition_token?: string;
|
|
168
171
|
}
|
|
169
172
|
/**
|
|
170
173
|
* Submit a forward for human review (Review Loop). A forward is an outbound
|
|
@@ -194,6 +197,7 @@ export interface SubmitForwardForReviewInput {
|
|
|
194
197
|
category_confidence?: number;
|
|
195
198
|
/** Stable retry key, sent as Idempotency-Key and never in the JSON body. */
|
|
196
199
|
client_id?: string;
|
|
200
|
+
composition_token?: string;
|
|
197
201
|
}
|
|
198
202
|
/** Submit a new message for human review (Review Loop, spec §5.1). */
|
|
199
203
|
export interface SubmitForReviewInput {
|
|
@@ -227,6 +231,7 @@ export interface SubmitForReviewInput {
|
|
|
227
231
|
category_confidence?: number;
|
|
228
232
|
/** Stable retry key, sent as Idempotency-Key and never in the JSON body. */
|
|
229
233
|
client_id?: string;
|
|
234
|
+
composition_token?: string;
|
|
230
235
|
}
|
|
231
236
|
/** Submit an in-thread reply for human review (Review Loop). */
|
|
232
237
|
export interface SubmitReplyForReviewInput {
|
|
@@ -250,6 +255,7 @@ export interface SubmitReplyForReviewInput {
|
|
|
250
255
|
category_confidence?: number;
|
|
251
256
|
/** Stable retry key, sent as Idempotency-Key and never in the JSON body. */
|
|
252
257
|
client_id?: string;
|
|
258
|
+
composition_token?: string;
|
|
253
259
|
}
|
|
254
260
|
/** Filters for listing review requests (Review Loop, spec §5.2). */
|
|
255
261
|
export interface ListReviewsInput {
|
|
@@ -274,6 +280,7 @@ export interface SubmitRevisionInput {
|
|
|
274
280
|
id: string;
|
|
275
281
|
/** The revision the agent composed against (PRIMARY CAS; 409 STALE on mismatch). */
|
|
276
282
|
parent_revision: number;
|
|
283
|
+
composition_token?: string;
|
|
277
284
|
/** Optional row-version CAS (defense in depth). */
|
|
278
285
|
version?: number;
|
|
279
286
|
subject?: string;
|
|
@@ -375,6 +382,8 @@ export interface GetRulesInput {
|
|
|
375
382
|
}
|
|
376
383
|
/** Save / edit a writing rule (append-only by supersession, D11). */
|
|
377
384
|
export interface SaveRuleInput {
|
|
385
|
+
/** Stable retry key for this exact mutation. */
|
|
386
|
+
client_id: string;
|
|
378
387
|
/** Defaults from category_id (general iff empty). */
|
|
379
388
|
scope?: "general" | "category";
|
|
380
389
|
/** Category id (cat_…); empty = house-style/general (D2). */
|
|
@@ -462,11 +471,28 @@ export interface WaitForEmailInput {
|
|
|
462
471
|
since_now?: boolean;
|
|
463
472
|
timeout_ms: number;
|
|
464
473
|
}
|
|
474
|
+
export interface DurableCredentialPersistenceStatus {
|
|
475
|
+
attempted: boolean;
|
|
476
|
+
persisted: boolean;
|
|
477
|
+
location?: string;
|
|
478
|
+
error?: string;
|
|
479
|
+
}
|
|
480
|
+
export interface ExtrovertClientOptions {
|
|
481
|
+
/**
|
|
482
|
+
* Local-host hook for storing a newly issued full-scope key. Hosted HTTP leaves
|
|
483
|
+
* this unset because OAuth credentials belong to the MCP client, not the server.
|
|
484
|
+
*/
|
|
485
|
+
onDurableAgentKey?: (agentKey: string, apiBaseUrl: string) => {
|
|
486
|
+
location?: string;
|
|
487
|
+
} | void;
|
|
488
|
+
}
|
|
465
489
|
export declare class ExtrovertClient {
|
|
466
490
|
private readonly config;
|
|
491
|
+
private readonly options;
|
|
467
492
|
private readonly store?;
|
|
468
493
|
private apiKey;
|
|
469
|
-
|
|
494
|
+
private durableCredentialStatus;
|
|
495
|
+
constructor(config: ExtrovertConfig, options?: ExtrovertClientOptions);
|
|
470
496
|
get isMock(): boolean;
|
|
471
497
|
redeemEnrollment(input: RedeemEnrollmentInput): Promise<EnrollmentResult>;
|
|
472
498
|
/** Grab a free account: `POST /v1/agent/sign-up` (unauthenticated). */
|
|
@@ -478,6 +504,8 @@ export declare class ExtrovertClient {
|
|
|
478
504
|
verify(input: {
|
|
479
505
|
otp: string;
|
|
480
506
|
}): Promise<VerifyResult>;
|
|
507
|
+
/** Report whether the latest full-scope key was durably stored by this host. */
|
|
508
|
+
credentialPersistenceStatus(): DurableCredentialPersistenceStatus;
|
|
481
509
|
/** Introspect the principal behind the current key: `GET /v1/auth/me`. */
|
|
482
510
|
whoami(): Promise<WhoAmI>;
|
|
483
511
|
createInbox(input: CreateInboxInput): Promise<Inbox>;
|
|
@@ -721,7 +749,7 @@ export declare class ExtrovertClient {
|
|
|
721
749
|
* general; human>agent; newest rev/created_at; higher priority; plus a soft cap.
|
|
722
750
|
* Includes the general/house-style layer (D2) IN ADDITION to the category's rules.
|
|
723
751
|
*/
|
|
724
|
-
getRules(input?: GetRulesInput): Promise<
|
|
752
|
+
getRules(input?: GetRulesInput): Promise<RuleSnapshot>;
|
|
725
753
|
/**
|
|
726
754
|
* Save / edit a writing rule (`PUT /v1/rules`) — append-only by supersession (D11).
|
|
727
755
|
* scope='general' iff category_id is empty (house-style, D2). With supersedes_id
|