@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/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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
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
- constructor(config: ExtrovertConfig);
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<Page<Rule>>;
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