@extrovert.dev/sdk 0.1.0-pre.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +504 -0
- package/dist/index.cjs +5286 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3782 -0
- package/dist/index.d.ts +3782 -0
- package/dist/index.js +5218 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/problem.ts","../src/version.ts","../src/http.ts","../src/extract.ts","../src/recipients.ts","../src/fixtures.ts","../src/include.ts","../src/transport.ts","../src/key-tier.ts","../src/resources/inbox-handle.ts","../src/pagination.ts","../src/resources/projects.ts","../src/resources/index.ts","../src/client.ts","../src/send-result.ts","../src/webhook.ts","../src/contract.ts"],"names":["inbox","now"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Extrovert error types. Every non-2xx response is surfaced as an {@link ApiError} (or a subclass),\n * so callers can branch on `status` / `code` without inspecting raw responses.\n *\n * The redesigned surface returns RFC-9457 `application/problem+json` with a CLOSED\n * machine {@link ProblemCode} enum. When that body is present, the thrown error\n * carries the parsed {@link Problem} on `.problem` and a typed `.problemCode`; the\n * legacy `{ error, message }` envelope is still parsed for back-compat.\n */\n\nimport type { Problem, ProblemCode } from \"./problem.js\";\n\n/** The machine-readable error envelope the Extrovert API returns on failures. */\nexport interface ApiErrorBody {\n error: {\n /** Stable, machine-readable code, e.g. `enrollment_token_exhausted`, `not_found`. */\n code: string;\n /** Human-readable message safe to surface to developers. */\n message: string;\n /** Optional per-field validation detail. */\n details?: Record<string, unknown>;\n };\n /** Request id for support correlation, echoed from the `X-Request-Id` header. */\n request_id?: string;\n}\n\n/**\n * Base error for any failed Extrovert API call. Carries the HTTP `status`, the stable `code`, the\n * `request_id` for support, and the raw `body` for forward-compatible inspection.\n */\nexport class ApiError extends Error {\n /** HTTP status code (e.g. 401, 404, 409, 429). 0 when the request never reached the server. */\n readonly status: number;\n /** Stable machine-readable error code from the body, or a synthesized one for transport errors. */\n readonly code: string;\n /** Request id for support correlation, when present. */\n readonly requestId: string | undefined;\n /** The parsed error body, when the server returned one. */\n readonly body: ApiErrorBody | undefined;\n /**\n * The parsed RFC-9457 problem+json body, when the server returned one. Present on\n * the redesigned surface; `undefined` for the legacy `{ error }` envelope.\n */\n readonly problem: Problem | undefined;\n /**\n * The typed closed-enum problem code, when the server returned problem+json. An\n * unknown/legacy code is coerced to `\"internal\"`; the raw string is always on\n * {@link ApiError.code}.\n */\n readonly problemCode: ProblemCode | undefined;\n\n constructor(args: {\n status: number;\n code: string;\n message: string;\n requestId?: string | undefined;\n body?: ApiErrorBody | undefined;\n problem?: Problem | undefined;\n cause?: unknown;\n }) {\n super(args.message, args.cause === undefined ? undefined : { cause: args.cause });\n this.name = new.target.name;\n this.status = args.status;\n this.code = args.code;\n this.requestId = args.requestId;\n this.body = args.body;\n this.problem = args.problem;\n this.problemCode = args.problem?.code;\n // Maintain prototype chain across transpile targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /** True for 4xx responses (client errors that retrying won't fix). */\n get isClientError(): boolean {\n return this.status >= 400 && this.status < 500;\n }\n\n /** True for 5xx responses (server errors that may succeed on retry). */\n get isServerError(): boolean {\n return this.status >= 500;\n }\n}\n\n/** 401 — the agent key / enrollment token was missing, malformed, expired, or revoked. */\nexport class AuthenticationError extends ApiError {}\n\n/** 403 — authenticated, but the key's scopes don't permit this action (capability denied). */\nexport class PermissionError extends ApiError {}\n\n/**\n * 403 `forbidden_scope` — the call is outside the key's CEILING (e.g. a non-org key\n * on the org-wide wildcard, or a mint that would escalate). A redesign-specific\n * subclass of {@link PermissionError} so existing `instanceof PermissionError`\n * branches keep working.\n */\nexport class ForbiddenScopeError extends PermissionError {}\n\n/**\n * 400 `breadth_required` — an org-tier key/operator issued a bare list that needs a\n * breadth pick; the problem `errors`/`detail` name the next call\n * (`/v1/projects/{id}/inboxes` or `/v1/projects/-/inboxes`).\n */\nexport class BreadthRequiredError extends ApiError {}\n\n/** 404 — the inbox, message, thread, or webhook does not exist (or isn't visible to this tenant). */\nexport class NotFoundError extends ApiError {}\n\n/** 409 — a conflicting state, e.g. an enrollment token that already minted its max of N inboxes. */\nexport class ConflictError extends ApiError {}\n\n/** 422 — the request body failed validation; see `body.error.details`. */\nexport class ValidationError extends ApiError {}\n\n/**\n * 422 `recipient_suppressed` — a send/reply/forward was rejected because one or\n * more recipients have opted out (list-unsubscribe / suppression). The whole send\n * is rejected (never a silent partial drop). {@link suppressedRecipients} lists the\n * exact addresses to drop; retry the send without them. The scope/origin of the\n * opt-out is deliberately NOT surfaced. A subclass of {@link ValidationError} so\n * existing `instanceof ValidationError` branches keep working.\n */\nexport class RecipientSuppressedError extends ValidationError {\n /** The recipient addresses that are suppressed — drop these and retry. */\n readonly suppressedRecipients: string[];\n constructor(args: ConstructorParameters<typeof ApiError>[0]) {\n super(args);\n this.suppressedRecipients = suppressedRecipientsFromProblem(args.problem);\n }\n}\n\n/**\n * Pull the suppressed recipient addresses out of a problem+json body. The server\n * attaches them as per-field hints (`{field:\"recipient\", code:\"recipient_suppressed\",\n * detail:\"<address>\"}`) so the caller can drop exactly those and retry.\n */\nfunction suppressedRecipientsFromProblem(problem: Problem | undefined): string[] {\n const out: string[] = [];\n for (const field of problem?.errors ?? []) {\n if (field.field === \"recipient\" && typeof field.detail === \"string\" && field.detail) {\n out.push(field.detail);\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Review Loop taxonomy — the 422 remediation and the split 409.\n//\n// The server carries an error's recovery FACTS as repeated `{field, code,\n// detail}` problem hints (the same triple `breadth_required` and\n// `recipient_suppressed` already use), so the classes below read them off\n// `.problem.errors` instead of forcing every caller to re-GET the review. Two\n// rules the shapes encode:\n//\n// 1. Every new class extends an EXISTING one (ValidationError / ConflictError),\n// so code already written as `catch (e) { if (e instanceof ConflictError) }`\n// keeps working unchanged and only code that WANTS the distinction has to\n// learn it.\n// 2. Only StaleError and BornStaleError are retryable, and each only a bounded\n// number of times. TerminalError and WrongStateError must never be retried\n// with the same verb — that infinite loop is the bug this taxonomy exists to\n// make impossible.\n// ---------------------------------------------------------------------------\n\n/** First `detail` whose hint `field` matches, or undefined. */\nfunction hintDetail(problem: Problem | undefined, field: string): string | undefined {\n for (const f of problem?.errors ?? []) {\n if (f.field === field && typeof f.detail === \"string\" && f.detail) return f.detail;\n }\n return undefined;\n}\n\n/** First `code` whose hint `field` matches, or undefined. */\nfunction hintCode(problem: Problem | undefined, field: string): string | undefined {\n for (const f of problem?.errors ?? []) {\n if (f.field === field && typeof f.code === \"string\" && f.code) return f.code;\n }\n return undefined;\n}\n\n/** Every hint `code` under the repeated `field` (e.g. the `allowed_action` list). */\nfunction hintCodes(problem: Problem | undefined, field: string): string[] {\n const out: string[] = [];\n for (const f of problem?.errors ?? []) {\n if (f.field === field && typeof f.code === \"string\" && f.code) out.push(f.code);\n }\n return out;\n}\n\n/** Parse a hint whose `code` carries an integer (revision / version). */\nfunction hintInt(problem: Problem | undefined, field: string): number | undefined {\n const raw = hintCode(problem, field);\n if (raw === undefined) return undefined;\n const n = Number(raw);\n return Number.isInteger(n) ? n : undefined;\n}\n\n/**\n * 422 `intent_required` — the inbox's resolved review policy requires a human to\n * see this message before it goes out, and the request carried no `intent`.\n *\n * **Nothing was sent and nothing was queued.** The server checks this before it\n * writes any row, which is what makes the amended retry safe: add an `intent`\n * and re-POST the SAME request. {@link retryWith} is the literal JSON fragment to\n * splice in, and the human-readable remediation (the full recipe, including how\n * to monitor the resulting review) is on `.message` / `.problem.detail`.\n *\n * Under `require_review` — the default for every account — this is the FIRST\n * thing most agents hit. Read `effective_review_policy` on\n * `GET /v1/inboxes/{id}` once at start-up and compose an intent up front instead\n * of learning the policy by being refused. A subclass of {@link ValidationError}\n * so existing `instanceof ValidationError` branches keep working.\n */\nexport class IntentRequiredError extends ValidationError {\n /** The resolved review policy, e.g. `require_review`. */\n readonly policy: string | undefined;\n /** Where the policy came from — a per-inbox override or the account default. */\n readonly policySource: string | undefined;\n /** Literal JSON to merge into the original request body, then retry once. */\n readonly retryWith: string | undefined;\n constructor(args: ConstructorParameters<typeof ApiError>[0]) {\n super(args);\n // The server ships `policy` as `<policy> (source: <source>)` so one hint\n // carries both halves; split rather than demand a second field.\n const policyHint = hintDetail(args.problem, \"policy\");\n const match = policyHint?.match(/^([^\\s(]+)\\s*(?:\\(source:\\s*(.*?)\\s*\\))?$/);\n this.policy = match?.[1];\n this.policySource = match?.[2];\n this.retryWith = hintDetail(args.problem, \"retry_with\");\n }\n}\n\n/**\n * Base for the review-loop 409s. Carries the live state and CAS keys the server\n * attached so a retry (where one is legal at all) needs no extra `get_review`,\n * and the `allowed_action` verbs that ARE legal from the current state so an\n * agent is told what to do instead of guessing.\n *\n * Extends {@link ConflictError}: every one of these used to be a bare 409, and\n * nothing that catches `ConflictError` should have to change.\n */\nexport class ReviewConflictError extends ConflictError {\n /** The review's CURRENT state (`needs_review`, `approved`, `sent`, …). */\n readonly currentState: string | undefined;\n /** The current revision — pass it as `parent_revision` on a legal retry. */\n readonly currentRevision: number | undefined;\n /** The current row version (the optional belt-and-braces CAS). */\n readonly currentVersion: number | undefined;\n /** The verbs that ARE legal from {@link currentState}, e.g. `submit_revision`. */\n readonly allowedActions: string[];\n constructor(args: ConstructorParameters<typeof ApiError>[0]) {\n super(args);\n this.currentState = hintCode(args.problem, \"state\");\n this.currentRevision = hintInt(args.problem, \"revision\");\n this.currentVersion = hintInt(args.problem, \"version\");\n this.allowedActions = hintCodes(args.problem, \"allowed_action\");\n }\n /**\n * Whether retrying the same call could ever succeed. False for every subclass\n * except {@link StaleError} and {@link BornStaleError} — and true there only\n * after re-reading and re-applying on top of the other party's change.\n */\n get isRetryable(): boolean {\n return false;\n }\n}\n\n/**\n * 409 `stale` — the `(revision[, version])` you named is no longer current\n * because a human or reviewer moved the draft. **Nothing was mutated.**\n *\n * The one genuinely retryable conflict, and bounded (≤3): re-read the draft and\n * the feedback, re-apply your edit on top of theirs, resubmit with\n * {@link ReviewConflictError.currentRevision} as the new `parent_revision`. The\n * current state/revision/version ride along on the error, so the retry costs no\n * extra round trip.\n */\nexport class StaleError extends ReviewConflictError {\n override get isRetryable(): boolean {\n return true;\n }\n}\n\n/**\n * 409 `wrong_state` — this VERB is illegal from the review's current state, but\n * the draft is still live.\n *\n * **Never retry the same verb**; the timing is not the problem, the choice of\n * call is. Read {@link ReviewConflictError.allowedActions} and pick one of those.\n */\nexport class WrongStateError extends ReviewConflictError {}\n\n/**\n * 409 `terminal` — the review has already finished (sent / auto_sent /\n * cancelled). Nothing will EVER succeed on it.\n *\n * **Stop.** A `front_run_next` review event is waiting on the durable queue with\n * the outcome; drain it, ack it, and compose a NEW message if one is still\n * wanted. {@link sentMessageId} is the message that actually went out, when the\n * review reached a delivery.\n */\nexport class TerminalError extends ReviewConflictError {\n /** The message that was actually delivered, when this review sent one. */\n readonly sentMessageId: string | undefined;\n constructor(args: ConstructorParameters<typeof ApiError>[0]) {\n super(args);\n this.sentMessageId = hintCode(args.problem, \"sent_message_id\");\n }\n}\n\n/**\n * 409 `born_stale` — the redraft was composed against an OLDER writing-rule\n * high-water than the one now in force. **Nothing was mutated** and the composer\n * has been re-nudged.\n *\n * Retryable at most once per rule high-water: re-read the rules, re-apply them,\n * resubmit — or `restamp_review` when re-reading shows nothing genuinely needed\n * to change. Restamping when the body DID need to change makes the draft lie to\n * the born-stale accounting, so do it only for a true no-op.\n */\nexport class BornStaleError extends ReviewConflictError {\n override get isRetryable(): boolean {\n return true;\n }\n}\n\n/**\n * 409 `send_needs_reconciliation` — a delivery attempt reached (or may have\n * reached) the mail provider and the process died before recording the outcome,\n * so the review is parked for recover-by-Message-ID.\n *\n * **Do not resend.** That is exactly how one message goes out twice. Poll the\n * review (`closed` / `sent_message_id`) until an operator or the recovery path\n * resolves it.\n */\nexport class SendNeedsReconciliationError extends ReviewConflictError {}\n\n/**\n * 409 `idempotency_conflict` — the same `Idempotency-Key` was replayed with a\n * DIFFERENT request body within the same scope. The replay key is a hash of the\n * raw bytes, so \"same message, different spelling\" counts as different.\n *\n * A caller bug, not a race: do not retry under that key. Either send the byte-\n * identical body, or mint a new key for the genuinely new message.\n */\nexport class IdempotencyConflictError extends ConflictError {}\n\n/**\n * 503 `unavailable` — a dependency could not be read, so the request was failed\n * CLOSED rather than served on a guess. On the send path this specifically means\n * the account's review policy was unreadable: relaying unsupervised mail for a\n * customer whose stated policy we could not see is the failure that would be\n * worse than the outage.\n *\n * Retryable after {@link retryAfter} seconds. Distinct from `not_configured`,\n * which means the deployment does not have the capability at all.\n */\nexport class UnavailableError extends ApiError {\n /** Seconds to wait before retrying, from the `Retry-After` header. */\n readonly retryAfter: number | undefined;\n constructor(args: ConstructorParameters<typeof ApiError>[0] & { retryAfter?: number }) {\n super(args);\n this.retryAfter = args.retryAfter;\n }\n}\n\n/** 402 — payment required (x402 test-mode). `paymentRequired` holds the raw challenge header. */\nexport class PaymentRequiredError extends ApiError {\n /** The raw `PAYMENT-REQUIRED` header challenge to sign + retry (EIP-3009, Base Sepolia). */\n readonly paymentRequired: string | undefined;\n constructor(args: ConstructorParameters<typeof ApiError>[0] & { paymentRequired?: string }) {\n super(args);\n this.paymentRequired = args.paymentRequired;\n }\n}\n\n/** 429 — rate limited. `retryAfter` is the server's hint in seconds, when provided. */\nexport class RateLimitError extends ApiError {\n /** Seconds to wait before retrying, parsed from the `Retry-After` header. */\n readonly retryAfter: number | undefined;\n constructor(args: ConstructorParameters<typeof ApiError>[0] & { retryAfter?: number }) {\n super(args);\n this.retryAfter = args.retryAfter;\n }\n}\n\n/** The request failed before a response was received (network down, DNS, abort, timeout). */\nexport class ConnectionError extends ApiError {\n constructor(message: string, cause?: unknown) {\n super({ status: 0, code: \"connection_error\", message, cause });\n }\n}\n\n/** The request was aborted by the caller's `AbortSignal` or the client `timeout`. */\nexport class TimeoutError extends ApiError {\n constructor(message = \"Request timed out\", cause?: unknown) {\n super({ status: 0, code: \"timeout\", message, cause });\n }\n}\n\n/** Map an HTTP status (and the typed problem code, when present) to the most specific {@link ApiError} subclass. */\nexport function errorForStatus(args: {\n status: number;\n code: string;\n message: string;\n requestId?: string | undefined;\n body?: ApiErrorBody | undefined;\n problem?: Problem | undefined;\n retryAfter?: number | undefined;\n paymentRequired?: string | undefined;\n}): ApiError {\n // Prefer the closed problem code when the redesigned surface returned problem+json:\n // it distinguishes forbidden_scope / breadth_required from the generic status class.\n switch (args.problem?.code) {\n case \"forbidden_scope\":\n return new ForbiddenScopeError(args);\n case \"breadth_required\":\n return new BreadthRequiredError(args);\n case \"idempotency_conflict\":\n return new IdempotencyConflictError(args);\n case \"recipient_suppressed\":\n return new RecipientSuppressedError(args);\n // Review Loop taxonomy. These MUST be matched on the code, not the status:\n // five of them share HTTP 409 and the whole point is that an agent takes a\n // different action on each.\n case \"intent_required\":\n return new IntentRequiredError(args);\n case \"stale\":\n return new StaleError(args);\n case \"wrong_state\":\n return new WrongStateError(args);\n case \"terminal\":\n return new TerminalError(args);\n case \"born_stale\":\n return new BornStaleError(args);\n case \"send_needs_reconciliation\":\n return new SendNeedsReconciliationError(args);\n case \"graduation_locked\":\n case \"maturity_gate_unmet\":\n case \"scope_taken\":\n // Still a 409 with the review hints attached, but there is no distinct\n // recovery move: the caller reads the state hints and asks a human.\n return new ReviewConflictError(args);\n case \"unavailable\":\n return new UnavailableError(args);\n default:\n break;\n }\n switch (args.status) {\n case 401:\n return new AuthenticationError(args);\n case 402:\n return new PaymentRequiredError(args);\n case 403:\n return new PermissionError(args);\n case 404:\n return new NotFoundError(args);\n case 409:\n return new ConflictError(args);\n case 422:\n return new ValidationError(args);\n case 429:\n return new RateLimitError(args);\n default:\n return new ApiError(args);\n }\n}\n","/**\n * RFC-9457 problem+json errors (redesign §5.1 / §6.2).\n *\n * The redesigned surface returns `application/problem+json` with a CLOSED machine\n * `code` enum clients switch on. The SDK parses it into {@link Problem} and raises a\n * {@link ProblemError} whose `code` is the typed {@link ProblemCode} union, so callers\n * branch exhaustively without inspecting raw bodies. The legacy `{ error, message }`\n * envelope is still parsed by the transport (back-compat); when present it is mapped\n * onto the closest {@link ProblemCode}.\n */\n\n/**\n * The CLOSED problem code enum (mirrors `components.schemas.Problem.code` in the\n * frozen OpenAPI). Adding a member is a contract change — keep it in lockstep with\n * the Go `ProblemCode` enum.\n */\nexport type ProblemCode =\n | \"bad_request\"\n | \"unauthorized\"\n | \"forbidden_scope\"\n | \"not_found\"\n | \"conflict\"\n | \"idempotency_conflict\"\n | \"breadth_required\"\n | \"quota_exceeded\"\n | \"rate_limited\"\n | \"domain_not_allowed\"\n | \"recipient_blocked\"\n | \"recipient_suppressed\"\n | \"not_configured\"\n | \"domain_unavailable\"\n | \"internal\"\n // --- Review Loop taxonomy -------------------------------------------------\n //\n // Before these members every review-loop failure answered a bare `409\n // \"conflict\"` (or, on the send path, no machine code at all), so a stale CAS,\n // an illegal verb and a review a human had already closed were\n // indistinguishable — and a retry loop written against `status === 409`\n // retried all three, including the one that can never succeed. Each member\n // below exists because the agent must take a DIFFERENT action on it; see\n // {@link REVIEW_PROBLEM_RETRYABLE} for which are worth retrying at all.\n | \"intent_required\"\n | \"wrong_state\"\n | \"terminal\"\n | \"stale\"\n | \"born_stale\"\n | \"send_needs_reconciliation\"\n | \"graduation_locked\"\n | \"maturity_gate_unmet\"\n | \"scope_taken\"\n | \"unavailable\";\n\n/** The full set of {@link ProblemCode} values (for runtime validation / exhaustive UIs). */\nexport const PROBLEM_CODES: readonly ProblemCode[] = [\n \"bad_request\",\n \"unauthorized\",\n \"forbidden_scope\",\n \"not_found\",\n \"conflict\",\n \"idempotency_conflict\",\n \"breadth_required\",\n \"quota_exceeded\",\n \"rate_limited\",\n \"domain_not_allowed\",\n \"recipient_blocked\",\n \"recipient_suppressed\",\n \"not_configured\",\n \"domain_unavailable\",\n \"internal\",\n \"intent_required\",\n \"wrong_state\",\n \"terminal\",\n \"stale\",\n \"born_stale\",\n \"send_needs_reconciliation\",\n \"graduation_locked\",\n \"maturity_gate_unmet\",\n \"scope_taken\",\n \"unavailable\",\n] as const;\n\n/**\n * Which review-loop problem codes are worth retrying, and which are a dead end.\n *\n * This table is the whole point of splitting the 409: only a failed\n * compare-and-set (`stale`) and a redraft built against an older rule high-water\n * (`born_stale`) describe a situation a retry can fix, and each only a bounded\n * number of times (re-read, re-apply on top of the other party's change,\n * resubmit). `wrong_state` means the verb is wrong, not the timing — read the\n * `allowed_action` hints and pick another one. `terminal` means the review is\n * finished forever; a `front_run_next` nudge is already waiting on the queue\n * with the outcome. `send_needs_reconciliation` means a delivery attempt is\n * unconfirmed — resending is precisely how a message goes out twice.\n *\n * `intent_required` is listed false because retrying the SAME bytes fails\n * identically: the fix is to ADD an `intent` and send a different request. The\n * server states in its `detail` that nothing was sent and nothing was queued, so\n * that amended retry is safe.\n */\nexport const REVIEW_PROBLEM_RETRYABLE: Readonly<Record<string, boolean>> = {\n stale: true,\n born_stale: true,\n wrong_state: false,\n terminal: false,\n send_needs_reconciliation: false,\n intent_required: false,\n idempotency_conflict: false,\n} as const;\n\n/** One per-field validation detail in a {@link Problem}. */\nexport interface ProblemField {\n field?: string;\n code?: string;\n detail?: string;\n}\n\n/** The RFC-9457 problem+json body. */\nexport interface Problem {\n /** Dereferenceable URI under `https://extrovert.dev/problems/{code}`. */\n type: string;\n /** Short, human-readable summary of the problem type. */\n title: string;\n /** HTTP status code, duplicated in the body. */\n status: number;\n /** Human-readable, instance-specific detail. */\n detail?: string;\n /** The closed machine code clients switch on. */\n code: ProblemCode;\n /** Per-request id for support correlation. */\n request_id?: string;\n /** Optional machine hints (e.g. `breadth_required` may name the next calls). */\n errors?: ProblemField[];\n}\n\n/** True when `value` is a member of the closed {@link ProblemCode} enum. */\nexport function isProblemCode(value: unknown): value is ProblemCode {\n return typeof value === \"string\" && (PROBLEM_CODES as readonly string[]).includes(value);\n}\n\n/**\n * Parse an unknown JSON body into a {@link Problem} when it carries the required\n * problem+json shape (`code` in the closed enum), else `undefined`. Unknown codes\n * are coerced to `\"internal\"` so the typed union holds while the raw value is still\n * available via {@link ProblemError.rawCode}.\n */\nexport function parseProblem(body: unknown): { problem: Problem; rawCode: string } | undefined {\n if (!body || typeof body !== \"object\") return undefined;\n const b = body as Record<string, unknown>;\n // problem+json must have a string `code`; the legacy envelope uses `error` instead.\n if (typeof b.code !== \"string\") return undefined;\n const rawCode = b.code;\n const code: ProblemCode = isProblemCode(rawCode) ? rawCode : \"internal\";\n const problem: Problem = {\n type: typeof b.type === \"string\" ? b.type : `https://extrovert.dev/problems/${rawCode}`,\n title: typeof b.title === \"string\" ? b.title : rawCode,\n status: typeof b.status === \"number\" ? b.status : 0,\n code,\n detail: typeof b.detail === \"string\" ? b.detail : undefined,\n request_id: typeof b.request_id === \"string\" ? b.request_id : undefined,\n errors: Array.isArray(b.errors) ? (b.errors as ProblemField[]) : undefined,\n };\n return { problem, rawCode };\n}\n","/**\n * Dated API version pin (redesign §5.4).\n *\n * The Extrovert API is versioned by a dated `Extrovert-Version` request header. A\n * request that omits the header is served the latest version; a pinned older\n * version is transformed to the current shape by a server-side shim. The SDK pins\n * {@link CURRENT_API_VERSION} on every request by default so an app's behavior is\n * stable across server deploys; override it per client via\n * `new Extrovert({ apiVersion: \"YYYY-MM-DD\" })`.\n */\n\n/** The dated API version this SDK was built against. Sent as `Extrovert-Version`. */\nexport const CURRENT_API_VERSION = \"2026-06-23\";\n\n/** The HTTP header carrying the dated API version (request + echoed on the response). */\nexport const API_VERSION_HEADER = \"Extrovert-Version\";\n","/**\n * fetch-based transport for the Extrovert API.\n *\n * Runtime-agnostic: uses the global `fetch` (Node 18+, Cloudflare Workers, Vercel Edge, Deno,\n * browsers). No Node-only APIs, no dependencies. Retries idempotent requests with jittered backoff\n * on 429/5xx, honors `Retry-After`, and surfaces every failure as a typed {@link ApiError}.\n */\n\nimport {\n ApiError,\n ConnectionError,\n TimeoutError,\n errorForStatus,\n type ApiErrorBody,\n} from \"./errors.js\";\nimport { parseProblem, type Problem } from \"./problem.js\";\nimport { API_VERSION_HEADER, CURRENT_API_VERSION } from \"./version.js\";\n\n/** The library version, surfaced in the User-Agent. Kept in sync with package.json by build. */\nexport const SDK_VERSION = \"0.1.0-pre.3\";\n\nexport interface RetryOptions {\n /** Max retry attempts for idempotent requests on 429/5xx/network errors. Default 2. */\n maxRetries: number;\n /** Base backoff in ms (grows exponentially with jitter). Default 250. */\n baseDelayMs: number;\n /** Cap on a single backoff delay. Default 8000. */\n maxDelayMs: number;\n}\n\nexport interface RequestOptions {\n method: \"GET\" | \"POST\" | \"DELETE\" | \"PATCH\" | \"PUT\";\n path: string;\n /** Query params; undefined/null values are dropped. */\n query?: Record<string, string | number | boolean | undefined | null>;\n /** JSON body; serialized as `application/json`. */\n body?: unknown;\n /** Per-request idempotency key, sent as the `Idempotency-Key` header. */\n idempotencyKey?: string;\n /** Per-request timeout override (ms). */\n timeoutMs?: number;\n /** Per-request abort signal, merged with the timeout signal. */\n signal?: AbortSignal;\n /** Force this request to be treated as (non-)retryable, overriding the method default. */\n retryable?: boolean;\n /**\n * Return the raw response body as text instead of JSON-parsing it. Used for the\n * raw `.eml` download (Content-Type `message/rfc822`), which is not JSON.\n */\n raw?: boolean;\n /**\n * Return the raw response as binary, alongside the Content-Type and\n * Content-Disposition headers. Used for the attachment download (arbitrary\n * bytes), which must not pass through text/JSON decoding.\n */\n binary?: boolean;\n}\n\n/** A binary response body plus the headers needed to save/serve it. */\nexport interface BinaryResponse {\n bytes: Uint8Array;\n contentType: string;\n contentDisposition: string;\n}\n\nexport interface HttpClientConfig {\n baseUrl: string;\n apiKey: string;\n /** Default timeout in ms. Default 30000. wait_for_email overrides this per call. */\n timeoutMs: number;\n retry: RetryOptions;\n /** Custom fetch (e.g. for tests or a proxy). Defaults to the global fetch. */\n fetch: typeof fetch;\n /** Extra headers merged into every request. */\n defaultHeaders: Record<string, string>;\n /**\n * Dated API version pinned on every request as the `Extrovert-Version` header\n * (redesign §5.4). Defaults to {@link CURRENT_API_VERSION}.\n */\n apiVersion: string;\n}\n\nfunction buildUrl(\n baseUrl: string,\n path: string,\n query?: RequestOptions[\"query\"],\n): string {\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const rel = path.startsWith(\"/\") ? path : `/${path}`;\n const url = new URL(base + rel);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status === 429 || (status >= 500 && status <= 599);\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(new TimeoutError(\"Aborted during backoff\"));\n const id = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(id);\n reject(new TimeoutError(\"Aborted during backoff\"));\n },\n { once: true },\n );\n });\n}\n\n/** Compose the caller's signal with a timeout into a single AbortSignal. */\nfunction withTimeout(timeoutMs: number, signal?: AbortSignal): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const onAbort = () => controller.abort((signal as AbortSignal & { reason?: unknown })?.reason);\n if (signal) {\n if (signal.aborted) controller.abort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n const timer = setTimeout(() => controller.abort(new TimeoutError()), timeoutMs);\n return {\n signal: controller.signal,\n cancel: () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n },\n };\n}\n\nexport class HttpClient {\n constructor(private readonly config: HttpClientConfig) {}\n\n async request<T>(options: RequestOptions): Promise<T> {\n const url = buildUrl(this.config.baseUrl, options.path, options.query);\n const retryable =\n options.retryable ?? (options.method === \"GET\" || options.method === \"DELETE\");\n const maxAttempts = retryable ? this.config.retry.maxRetries + 1 : 1;\n const timeoutMs = options.timeoutMs ?? this.config.timeoutMs;\n\n let lastError: ApiError | undefined;\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const { signal, cancel } = withTimeout(timeoutMs, options.signal);\n try {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n // Accept problem+json (redesign) alongside json so the typed Problem body parses.\n Accept: \"application/json, application/problem+json\",\n \"User-Agent\": `extrovert-sdk-ts/${SDK_VERSION}`,\n // Pin the dated API version on every request (redesign §5.4).\n [API_VERSION_HEADER]: this.config.apiVersion || CURRENT_API_VERSION,\n ...this.config.defaultHeaders,\n };\n if (options.idempotencyKey) headers[\"Idempotency-Key\"] = options.idempotencyKey;\n let bodyInit: string | undefined;\n if (options.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n bodyInit = JSON.stringify(options.body);\n }\n\n const response = await this.config.fetch(url, {\n method: options.method,\n headers,\n body: bodyInit,\n signal,\n });\n\n if (response.ok) {\n cancel();\n if (response.status === 204) return undefined as T;\n // Binary requests (e.g. attachment bytes) return the raw bytes plus the\n // headers needed to save/serve the file, before any text decoding.\n if (options.binary) {\n const buf = new Uint8Array(await response.arrayBuffer());\n const binary: BinaryResponse = {\n bytes: buf,\n contentType: response.headers.get(\"content-type\") ?? \"application/octet-stream\",\n contentDisposition: response.headers.get(\"content-disposition\") ?? \"\",\n };\n return binary as unknown as T;\n }\n const text = await response.text();\n // Raw requests (e.g. message/rfc822 .eml) return the body verbatim.\n if (options.raw) return text as unknown as T;\n return (text ? JSON.parse(text) : undefined) as T;\n }\n\n const apiError = await toApiError(response);\n cancel();\n // Retry transient failures on idempotent requests.\n if (retryable && attempt < maxAttempts - 1 && isRetryableStatus(response.status)) {\n lastError = apiError;\n await sleep(this.backoff(attempt, apiError), options.signal);\n continue;\n }\n throw apiError;\n } catch (err) {\n cancel();\n if (err instanceof ApiError) {\n // Already a typed API error (thrown above) — propagate.\n if (!(err.isServerError && retryable && attempt < maxAttempts - 1)) throw err;\n lastError = err;\n await sleep(this.backoff(attempt, err), options.signal);\n continue;\n }\n // Transport-level failure (network, abort, timeout).\n const transportError = this.classifyTransportError(err);\n if (retryable && attempt < maxAttempts - 1 && transportError instanceof ConnectionError) {\n lastError = transportError;\n await sleep(this.backoff(attempt), options.signal);\n continue;\n }\n throw transportError;\n }\n }\n // Exhausted retries.\n throw lastError ?? new ConnectionError(\"Request failed after retries\");\n }\n\n /**\n * Open a Server-Sent-Events stream and yield each parsed frame as it arrives.\n *\n * This bypasses the JSON request/retry path: it does a single streaming `fetch`,\n * reads the response body incrementally, splits it on the SSE frame delimiter\n * (a blank line), and yields one {@link SseFrame} per frame (skipping comment\n * heartbeats). The connection stays open until the server closes it or the\n * caller's `signal` aborts. Reconnection/resume is the caller's job (re-call with\n * the last `id` as Last-Event-ID), so this primitive stays small and predictable.\n */\n async *stream(options: {\n path: string;\n query?: RequestOptions[\"query\"];\n lastEventId?: string;\n signal?: AbortSignal;\n }): AsyncGenerator<SseFrame, void, unknown> {\n const url = buildUrl(this.config.baseUrl, options.path, options.query);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.config.apiKey}`,\n Accept: \"text/event-stream\",\n \"User-Agent\": `extrovert-sdk-ts/${SDK_VERSION}`,\n [API_VERSION_HEADER]: this.config.apiVersion || CURRENT_API_VERSION,\n ...this.config.defaultHeaders,\n };\n if (options.lastEventId) headers[\"Last-Event-ID\"] = options.lastEventId;\n\n let response: Response;\n try {\n // No timeout: an SSE stream is intentionally long-lived. Only the caller's\n // signal closes it.\n response = await this.config.fetch(url, { method: \"GET\", headers, signal: options.signal });\n } catch (err) {\n throw this.classifyTransportError(err);\n }\n if (!response.ok) {\n throw await toApiError(response);\n }\n const body = response.body;\n if (!body) {\n throw new ConnectionError(\"SSE response had no readable body\");\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n // Frames are separated by a blank line. Tolerate both \\n\\n and \\r\\n\\r\\n.\n let sep: number;\n while ((sep = indexOfFrameSeparator(buffer)) !== -1) {\n const rawFrame = buffer.slice(0, sep);\n buffer = buffer.slice(sep).replace(/^(\\r?\\n){2}/, \"\");\n const frame = parseSseFrame(rawFrame);\n if (frame) yield frame;\n }\n }\n } finally {\n // Best-effort close of the underlying stream when the consumer stops early.\n try {\n await reader.cancel();\n } catch {\n // ignore\n }\n }\n }\n\n private backoff(attempt: number, error?: ApiError): number {\n if (error && \"retryAfter\" in error && typeof error.retryAfter === \"number\") {\n return Math.min(error.retryAfter * 1000, this.config.retry.maxDelayMs);\n }\n const exp = this.config.retry.baseDelayMs * 2 ** attempt;\n const jitter = Math.random() * this.config.retry.baseDelayMs;\n return Math.min(exp + jitter, this.config.retry.maxDelayMs);\n }\n\n private classifyTransportError(err: unknown): ApiError {\n if (err instanceof TimeoutError) return err;\n const name = (err as { name?: string })?.name;\n if (name === \"AbortError\" || name === \"TimeoutError\") {\n return new TimeoutError(\"Request timed out or was aborted\", err);\n }\n const message = err instanceof Error ? err.message : String(err);\n return new ConnectionError(`Network request failed: ${message}`, err);\n }\n}\n\n/** One parsed Server-Sent-Events frame: the `id:`, `event:`, and joined `data:`. */\nexport interface SseFrame {\n /** The `id:` field — the monotonic resume token (Last-Event-ID). */\n id?: string;\n /** The `event:` field — the event type. Defaults to `\"message\"` per the SSE spec. */\n event: string;\n /** The joined `data:` lines (newline-separated, per the SSE spec). */\n data: string;\n}\n\n/** Index of the next frame separator (blank line) in an SSE buffer, or -1. */\nfunction indexOfFrameSeparator(buf: string): number {\n const lf = buf.indexOf(\"\\n\\n\");\n const crlf = buf.indexOf(\"\\r\\n\\r\\n\");\n if (lf === -1) return crlf;\n if (crlf === -1) return lf;\n return Math.min(lf, crlf);\n}\n\n/**\n * Parse one raw SSE frame (the text between blank-line delimiters) into a\n * {@link SseFrame}. Comment lines (starting with `:`, e.g. heartbeats) and frames\n * with no `data` yield `undefined` so callers skip them.\n */\nfunction parseSseFrame(raw: string): SseFrame | undefined {\n let id: string | undefined;\n let event = \"message\";\n const dataLines: string[] = [];\n for (const line of raw.split(/\\r?\\n/)) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n // A single leading space after the colon is stripped, per the SSE spec.\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n switch (field) {\n case \"id\":\n id = value;\n break;\n case \"event\":\n event = value;\n break;\n case \"data\":\n dataLines.push(value);\n break;\n default:\n // ignore unknown fields (e.g. retry:)\n break;\n }\n }\n if (dataLines.length === 0) return undefined;\n return { id, event, data: dataLines.join(\"\\n\") };\n}\n\n/** Build a typed error from a non-2xx response, parsing the JSON envelope when present. */\nasync function toApiError(response: Response): Promise<ApiError> {\n const requestId = response.headers.get(\"x-request-id\") ?? undefined;\n const retryAfterRaw = response.headers.get(\"retry-after\");\n const retryAfter = retryAfterRaw ? Number(retryAfterRaw) : undefined;\n const paymentRequired = response.headers.get(\"payment-required\") ?? undefined;\n\n let body: ApiErrorBody | undefined;\n let problem: Problem | undefined;\n let code = `http_${response.status}`;\n let message = `Extrovert API request failed with status ${response.status}`;\n try {\n const text = await response.text();\n if (text) {\n const parsed = JSON.parse(text) as unknown;\n // Redesign surface: RFC-9457 problem+json (has a closed `code`).\n const parsedProblem = parseProblem(parsed);\n if (parsedProblem) {\n problem = parsedProblem.problem;\n code = parsedProblem.rawCode || code;\n message = parsedProblem.problem.detail || parsedProblem.problem.title || message;\n // Mirror onto the legacy body shape so `.body.error.code` still resolves.\n body = { error: { code, message }, request_id: parsedProblem.problem.request_id };\n } else if (parsed && typeof parsed === \"object\") {\n // LEGACY envelope. Two shapes are in the wild and BOTH must parse, or the\n // caller gets `http_409` and no server message — which is exactly what\n // happened until now, and why review-loop code could only branch on\n // `err.status`:\n //\n // (a) `{ error: { code, message } }` — the nested form this parser was\n // written for.\n // (b) `{ error: \"conflict\", message: \"…\" }` — what the Go `writeError`\n // helper actually emits (a STRING `error` plus a TOP-LEVEL\n // `message`), still used by every `/v1/admin/*` route.\n //\n // Reading only (a) against a (b) body yields `undefined` for BOTH halves.\n // The code fell back to `http_<status>` and the message to the generic\n // \"request failed with status N\" — losing the one string that says WHY.\n const legacy = parsed as {\n error?: string | { code?: string; message?: string; details?: Record<string, unknown> };\n message?: string;\n request_id?: string;\n };\n const legacyCode =\n typeof legacy.error === \"string\" ? legacy.error : legacy.error?.code;\n const legacyMessage =\n (typeof legacy.error === \"object\" ? legacy.error?.message : undefined) ?? legacy.message;\n if (legacyCode || legacyMessage) {\n code = legacyCode || code;\n message = legacyMessage || message;\n // Normalize onto the nested ApiErrorBody shape so `.body.error.code`\n // resolves for both wire spellings.\n body = {\n error: {\n code,\n message,\n ...(typeof legacy.error === \"object\" && legacy.error?.details\n ? { details: legacy.error.details }\n : {}),\n },\n ...(legacy.request_id ? { request_id: legacy.request_id } : {}),\n };\n }\n }\n }\n } catch {\n // Non-JSON error body; keep the generic message.\n }\n\n return errorForStatus({\n status: response.status,\n code,\n message,\n requestId: problem?.request_id ?? requestId,\n body,\n problem,\n retryAfter: Number.isFinite(retryAfter) ? retryAfter : undefined,\n paymentRequired,\n });\n}\n","/**\n * OTP / verification-link extraction.\n *\n * Find the most likely one-time code and preferred verification link in a message body. Pure and\n * dependency-free so it runs in Node, the edge, and the browser.\n */\n\nimport type { ExtractedCredentials, Message } from \"./models.js\";\n\n/**\n * Common OTP phrasings, ordered by specificity. A code adjacent to \"code/OTP/verification/PIN\" is a\n * far stronger signal than a bare 6-digit run (which could be a price, year, or zip).\n */\nconst OTP_CONTEXT_PATTERNS: RegExp[] = [\n /(?:one[-\\s]?time\\s*(?:code|password|pin)|verification\\s*code|security\\s*code|auth(?:entication)?\\s*code|access\\s*code|login\\s*code|confirmation\\s*code|your\\s*code|otp|pin)\\D{0,40}?(\\d[\\d\\s-]{3,9}\\d)/i,\n /(\\d[\\d\\s-]{3,9}\\d)\\D{0,30}?(?:is\\s*your|to\\s*(?:verify|confirm|sign|log))/i,\n];\n\n/** Fallback: a standalone 4–8 digit run that isn't obviously a year or currency amount. */\nconst OTP_BARE_PATTERN = /(?<![\\d.,$£€])\\b(\\d{4,8})\\b(?![\\d.,])/g;\n\n/** Verification / magic links, preferring ones whose URL or anchor hints at verification. */\nconst VERIFY_LINK_HINTS =\n /(verify|confirm|activate|magic|auth|login|sign[-_]?in|token|otp|reset|validate)/i;\n\nconst URL_PATTERN = /https?:\\/\\/[^\\s\"'<>)\\]]+/gi;\n\n/** Normalize a captured code: strip the spaces/dashes some senders insert for readability. */\nfunction normalizeCode(raw: string): string {\n return raw.replace(/[\\s-]/g, \"\");\n}\n\n/** Extract the most likely OTP code from a body of text, or null. */\nexport function extractOtp(body: string): string | null {\n for (const pattern of OTP_CONTEXT_PATTERNS) {\n const m = pattern.exec(body);\n if (m && m[1]) {\n const code = normalizeCode(m[1]);\n if (code.length >= 4 && code.length <= 10) return code;\n }\n }\n // Fallback: first plausible standalone digit run, skipping obvious years (1900–2099).\n let match: RegExpExecArray | null;\n OTP_BARE_PATTERN.lastIndex = 0;\n while ((match = OTP_BARE_PATTERN.exec(body)) !== null) {\n const code = match[1]!;\n const n = Number(code);\n if (code.length === 4 && n >= 1900 && n <= 2099) continue;\n return code;\n }\n return null;\n}\n\n/** Extract the most likely verification link from a body, or null. */\nexport function extractLink(body: string): string | null {\n const urls = body.match(URL_PATTERN);\n if (!urls || urls.length === 0) return null;\n const cleaned = urls.map((u) => u.replace(/[.,;:)]+$/, \"\"));\n const hinted = cleaned.find((u) => VERIFY_LINK_HINTS.test(u));\n return hinted ?? cleaned[0] ?? null;\n}\n\n/**\n * Extract OTP + verification link from a message. Prefers the plain-text body; falls back to a\n * tag-stripped HTML body so codes/links rendered only in HTML are still found.\n */\nexport function extractCredentials(message: Message): ExtractedCredentials {\n const htmlText = message.html ? stripHtml(message.html) : \"\";\n const text = message.text && message.text.trim().length > 0 ? message.text : htmlText;\n const combined = `${text}\\n${htmlText}`;\n return {\n otp: extractOtp(text) ?? extractOtp(htmlText),\n // Links live in href attributes, so search the raw HTML too.\n link: extractLink(message.html ?? \"\") ?? extractLink(combined),\n };\n}\n\n/** Minimal HTML-to-text: drop tags and decode the handful of entities that matter for codes. */\nfunction stripHtml(html: string): string {\n return html\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<[^>]+>/g, \" \")\n .replace(/ /gi, \" \")\n .replace(/&/gi, \"&\")\n .replace(/</gi, \"<\")\n .replace(/>/gi, \">\")\n .replace(/&#(\\d+);/g, (_, d: string) => String.fromCharCode(Number(d)))\n .replace(/\\s+/g, \" \")\n .trim();\n}\n","/**\n * Recipient-list normalization, shared by the live transport and the offline mock.\n *\n * `SendRequest.to` / `cc` / `bcc` accept `string | string[]` because passing one\n * address should not require a one-element array — and the flagship quickstart\n * does exactly that. The server, however, decodes them as `[]string` and rejects\n * a bare string with a 400. So the scalar form has to be widened somewhere, and\n * the honest place is the client: there is no deployed caller relying on a scalar\n * reaching the wire (it has always 400'd), so nothing is preserved by tolerating\n * it server-side.\n *\n * Living in its own module keeps ONE definition. The mock used to carry a private\n * copy, which is how a mock ends up quietly accepting shapes the server refuses.\n */\n\n/** Widen `string | string[] | undefined` to `string[]` (empty for absent). */\nexport function toArray(v: string | string[] | undefined): string[] {\n if (!v) return [];\n return Array.isArray(v) ? v : [v];\n}\n\n/**\n * Widen a recipient field for the WIRE, preserving \"the caller did not set this\".\n *\n * `toArray` collapses `undefined` to `[]`, which is right for internal fan-out\n * (union of all recipients) but wrong for a request body: emitting `cc: []` where\n * the caller sent nothing adds a key the caller never wrote. Returns `undefined`\n * for an absent field so the key is omitted from the JSON entirely.\n */\nexport function toWireArray(v: string | string[] | undefined): string[] | undefined {\n if (v === undefined) return undefined;\n return Array.isArray(v) ? v : [v];\n}\n","/**\n * Offline fixtures for the Extrovert SDK.\n *\n * The SDK can run against this in-memory, deterministic mock so examples, the MCP server, and the\n * console are fully navigable offline without contacting the live `/v1` API. Construct a client with\n * `transport: \"mock\"` (or set `EXTROVERT_API_BASE_URL=mock`) to route requests here instead of fetch.\n *\n * The mock honors the same request/response models as the real API and reproduces the few behaviors\n * the SDK ergonomics depend on (enrollment cap, idempotency on `client_id`, wait_for_email returning\n * an OTP). It is intentionally simple — not a full server — and never reaches the network.\n */\n\nimport type {\n AddContactListRequest,\n Agent,\n Attachment,\n AttachmentInput,\n BatchUpdateResult,\n Category,\n ContactListEntry,\n CreateInboxRequest,\n DeleteResult,\n Domain,\n DomainRecord,\n EnrollRequest,\n EnrollResponse,\n ForwardRequest,\n Inbox,\n InboxCredentials,\n InboxMetadata,\n InboxMetadataPatch,\n IsoTimestamp,\n AckReviewEventRequest,\n AckReviewEventResult,\n Job,\n OnboardDomainRequest,\n ListCategoriesParams,\n ListInboxesParams,\n ProjectInboxListParams,\n ListMessagesParams,\n ListReviewEventsParams,\n ListReviewsParams,\n ProposeCategoryRequest,\n ProposeGraduationRequest,\n UpdateCategoryRequest,\n GetRulesParams,\n GetRuleAuditParams,\n GraduationStatus,\n RiskDial,\n Rule,\n RuleAuditEntry,\n SaveRuleRequest,\n Message,\n Page,\n PostReviewChatRequest,\n RegisterWebhookRequest,\n ReplyRequest,\n RestampReviewRequest,\n CategoryPacingState,\n PacingItem,\n Review,\n ReviewDecisionContext,\n ReviewerDecisionRequest,\n ReviewerDecisionResult,\n ReviewEvent,\n ReviewEventsResult,\n ReviewFeedback,\n ReviewTurn,\n ScanBacklogStatus,\n SubmitRevisionRequest,\n SuppressionEntry,\n SuppressionPrecheck,\n ListSuppressionsParams,\n SearchMessagesParams,\n SendOutcome,\n SendRequest,\n SendResult,\n ReviewPolicy,\n ReviewState,\n SignUpRequest,\n SignUpResponse,\n StreamEvent,\n Thread,\n ThreadDetail,\n UpdateInboxRequest,\n UpdateWebhookRequest,\n VerifyRequest,\n VerifyResponse,\n WaitForEmailRequest,\n WaitForEmailResult,\n WaitForReviewEventParams,\n Webhook,\n WhoAmI,\n} from \"./models.js\";\nimport type { AttachmentDownload } from \"./transport.js\";\nimport type { List } from \"./pagination.js\";\nimport { extractCredentials } from \"./extract.js\";\nimport {\n ApiError,\n ConflictError,\n NotFoundError,\n PermissionError,\n RecipientSuppressedError,\n ValidationError,\n errorForStatus,\n} from \"./errors.js\";\nimport type { Problem, ProblemCode, ProblemField } from \"./problem.js\";\nimport { toArray } from \"./recipients.js\";\n\n/**\n * Opaque-cursor helpers for the mock's project-prefixed list. The real cursor is\n * server-minted and opaque; the mock encodes a bounded offset behind base64url so\n * the SDK iteration helpers exercise an opaque (non-integer) token end to end.\n */\nfunction encodeMockCursor(offset: number): string {\n const json = JSON.stringify({ o: offset, v: 1 });\n const b64 = typeof btoa === \"function\" ? btoa(json) : Buffer.from(json, \"utf8\").toString(\"base64\");\n return b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\nfunction decodeMockCursor(cursor: string): number {\n try {\n const b64 = cursor.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const json = typeof atob === \"function\" ? atob(b64) : Buffer.from(b64, \"base64\").toString(\"utf8\");\n const parsed = JSON.parse(json) as { o?: number };\n return typeof parsed.o === \"number\" && parsed.o >= 0 ? parsed.o : 0;\n } catch {\n return 0;\n }\n}\n\nconst SHARED_SUBDOMAIN = \"smtp.extrovert.dev\";\n\n/**\n * The fixed org/project the offline mock binds every key to. The mock has a single\n * org + project (mirroring the FIXED, key-bound org/project the real API resolves\n * from the stored key — there is no mutable selector). A `project_id` assertion on a\n * request must match {@link MOCK_PROJECT_ID} or the mock throws a 403, mirroring the\n * server's assertion-not-selector contract.\n */\nconst MOCK_ORG_ID = \"org_mock\";\nconst MOCK_PROJECT_ID = \"prj_mock\";\n/** Effective per-inbox recipient cap used by the offline API fixture. */\nconst DEFAULT_DAILY_SEND_LIMIT = 75;\n\n/** Caps for inbox metadata (AgentMail parity): ≤256 keys, ≤256 chars per key/string value. */\nconst METADATA_MAX_KEYS = 256;\nconst METADATA_MAX_KEY_LEN = 256;\nconst METADATA_MAX_VALUE_LEN = 256;\n\nfunction now(): IsoTimestamp {\n return new Date().toISOString();\n}\n\nfunction rid(prefix: string): string {\n const s = Math.random().toString(36).slice(2, 10);\n return `${prefix}_${s}`;\n}\n\nfunction randomHandle(): string {\n return `agent${Math.floor(1000 + Math.random() * 9000)}`;\n}\n\n/**\n * Enforce the project_id assertion contract (mock): a request `project_id` is an\n * ASSERTION, never a selector. The mock binds every key to {@link MOCK_PROJECT_ID},\n * so a non-matching assertion is a 403, mirroring the server.\n */\nfunction assertProjectMatch(projectId: string | undefined): void {\n if (projectId !== undefined && projectId !== MOCK_PROJECT_ID) {\n throw new PermissionError({\n status: 403,\n code: \"project_mismatch\",\n message: `project_id \"${projectId}\" does not match the key's bound project.`,\n });\n }\n}\n\n/**\n * Validate an inbox metadata patch against the AgentMail-parity caps and value\n * types (string/number/boolean, or null to delete a key on a PATCH). Throws a 400\n * ValidationError on a violation, mirroring the server.\n */\nfunction validateMetadataPatch(patch: InboxMetadataPatch): void {\n const keys = Object.keys(patch);\n if (keys.length > METADATA_MAX_KEYS) {\n throw new ValidationError({\n status: 400,\n code: \"invalid\",\n message: `metadata has too many keys (max ${METADATA_MAX_KEYS}).`,\n });\n }\n for (const key of keys) {\n if (key.length > METADATA_MAX_KEY_LEN) {\n throw new ValidationError({\n status: 400,\n code: \"invalid\",\n message: `metadata key \"${key.slice(0, 16)}…\" exceeds ${METADATA_MAX_KEY_LEN} chars.`,\n });\n }\n const value = patch[key];\n if (value === null) continue; // null deletes the key (PATCH)\n const t = typeof value;\n if (t !== \"string\" && t !== \"number\" && t !== \"boolean\") {\n throw new ValidationError({\n status: 400,\n code: \"invalid\",\n message: `metadata value for \"${key}\" must be a string, number, or boolean.`,\n });\n }\n if (t === \"string\" && (value as string).length > METADATA_MAX_VALUE_LEN) {\n throw new ValidationError({\n status: 400,\n code: \"invalid\",\n message: `metadata value for \"${key}\" exceeds ${METADATA_MAX_VALUE_LEN} chars.`,\n });\n }\n }\n}\n\n/**\n * Apply the shallow-merge / null-delete metadata patch semantics (mock):\n * - `undefined` patch leaves `current` unchanged;\n * - `null` patch CLEARS all metadata (returns `{}`);\n * - an object MERGES into `current`, with a per-key `null` value DELETING that key.\n */\nfunction mergeMetadata(\n current: InboxMetadata,\n patch: InboxMetadataPatch | null | undefined,\n): InboxMetadata {\n if (patch === undefined) return current;\n if (patch === null) return {};\n validateMetadataPatch(patch);\n const next: InboxMetadata = { ...current };\n for (const [key, value] of Object.entries(patch)) {\n if (value === null) {\n delete next[key];\n } else {\n next[key] = value;\n }\n }\n return next;\n}\n\n/** ruleSnapshotJSON renders a rule's restorable fields for an undo before/after column. */\nfunction ruleSnapshotJSON(r: Rule): string {\n return JSON.stringify({\n id: r.id,\n lineage_id: r.lineage_id,\n rev: r.rev,\n rule_layer: r.rule_layer,\n org_id: r.org_id,\n project_id: r.project_id,\n scope: r.scope,\n category_id: r.category_id,\n rule_text: r.rule_text,\n kind: r.kind,\n priority: r.priority,\n status: r.status,\n });\n}\n\ninterface MockState {\n agents: Map<string, Agent>;\n /** agent_handle -> agent_id, for idempotent enroll. */\n agentByHandle: Map<string, string>;\n /** client_id -> inbox_id, for idempotent inbox create. */\n inboxByClientId: Map<string, string>;\n /** client_id -> webhook_id, for idempotent webhook registration. */\n webhookByClientId: Map<string, string>;\n inboxes: Map<string, Inbox>;\n messages: Map<string, Message[]>; // keyed by inbox address\n /** message_id -> stored attachments (mock mirror of the real MIME parts). */\n attachments: Map<string, StoredAttachment[]>;\n webhooks: Map<string, Webhook>;\n /** entry id -> contact-list entry (mock mirror of extrovert_contact_lists). */\n contactLists: Map<string, ContactListEntry>;\n /** domain name -> onboarded domain (mock mirror of extrovert_domains). */\n domains: Map<string, Domain>;\n /** job id -> async job status (mock mirror of extrovert_jobs; currently only\n * the domain-offboard teardown enqueues one). */\n jobs: Map<string, Job>;\n /** suppression id -> recipient opt-out row (mock mirror of extrovert_suppressions). */\n suppressions: Map<string, SuppressionEntry>;\n /**\n * The account-level review policy (mock mirror of\n * extrovert_org_settings.review_policy).\n *\n * It defaults to `require_review` because that is the column default on the\n * REAL server for every org that has never touched it — i.e. every org. The\n * mock used to model no policy at all, so a bare `send()` sailed through\n * offline while the same call against production is refused 422. A mock that\n * cannot reproduce the platform's default posture is a mock that certifies\n * broken agents.\n */\n orgReviewPolicy: ReviewPolicy;\n /** address -> per-inbox override, which BEATS the account default when set. */\n inboxReviewPolicy: Map<string, ReviewPolicy>;\n /** review id -> review request (mock mirror of extrovert_review_requests). */\n reviews: Map<string, Review>;\n /** review id -> append-only thread turns. */\n reviewTurns: Map<string, ReviewTurn[]>;\n /**\n * review id -> the draft's attachments (mock mirror of proposed_attachments).\n * They survive submit -> review row -> approval on the real server now, so the\n * mock has to carry them too or a redraft that replaces them looks like a no-op.\n */\n reviewAttachments: Map<string, AttachmentInput[]>;\n /**\n * review id -> reviewer hand-back count (M8 Slice B circuit breaker (a)). The wire\n * Review shape doesn't carry hop_count, so the mock tracks it here to surface the\n * max_hops breaker on the decision context + reviewerDecide.\n */\n reviewHopCounts: Map<string, number>;\n /**\n * review id -> durable nudges (mock mirror of extrovert_review_nudges), oldest\n * first with a per-review monotonic seq. The authoritative liveness queue.\n */\n reviewEvents: Map<string, ReviewEvent[]>;\n /** review id -> last-acked seq (the per-(agent, review) cursor). */\n reviewEventCursors: Map<string, number>;\n /** idempotency-key -> the review state snapshot returned (chat replay, M5 parity v21). */\n chatByIdempotencyKey: Map<string, Review>;\n /** category id -> category (mock mirror of extrovert_categories, D9/D10). */\n categories: Map<string, Category>;\n /** rule id -> writing rule (mock mirror of extrovert_writing_rules, D2/D11). */\n rules: Map<string, Rule>;\n /** udo id -> change/undo audit row (mock mirror of extrovert_rule_undo_log). */\n ruleAudit: Map<string, RuleAuditEntry>;\n /** human_email -> self-signup state (mock OTP + verification). */\n signupByEmail: Map<string, SignupState>;\n /** Monotonic event journal backing the SSE stream (Slice 2). */\n events: StreamEvent[];\n /** Next event seq (monotonic, mirrors the server's AUTOINCREMENT). */\n eventSeq: number;\n mailboxesUsed: number;\n mailboxesMax: number;\n}\n\n/** Mock self-signup bookkeeping (in-memory OTP). */\ninterface SignupState {\n customerId: string;\n agentId: string;\n address: string;\n otp: string;\n verified: boolean;\n}\n\n/** A mock attachment: the wire metadata plus the raw base64 for download. */\ninterface StoredAttachment {\n meta: Attachment;\n content_base64: string;\n}\n\nfunction freshState(): MockState {\n return {\n agents: new Map(),\n agentByHandle: new Map(),\n inboxByClientId: new Map(),\n webhookByClientId: new Map(),\n inboxes: new Map(),\n messages: new Map(),\n attachments: new Map(),\n webhooks: new Map(),\n contactLists: new Map(),\n domains: new Map(),\n jobs: new Map(),\n suppressions: seedSuppressions(),\n orgReviewPolicy: \"require_review\",\n inboxReviewPolicy: new Map(),\n reviews: new Map(),\n reviewTurns: new Map(),\n reviewAttachments: new Map(),\n reviewHopCounts: new Map(),\n reviewEvents: new Map(),\n reviewEventCursors: new Map(),\n chatByIdempotencyKey: new Map(),\n categories: new Map(),\n rules: new Map(),\n ruleAudit: new Map(),\n signupByEmail: new Map(),\n events: [],\n eventSeq: 0,\n mailboxesUsed: 0,\n mailboxesMax: 5,\n };\n}\n\n/**\n * The recipient the mock seeds an active org-scope suppression for, so the\n * suppression reads (precheck/list/revoke) and the `recipient_suppressed`\n * send-rejection path have deterministic data offline.\n */\nexport const SEEDED_SUPPRESSED_RECIPIENT = \"unsubscribed@example.com\";\n\n/** Seed one active org-scope suppression row (source manual) for the mock. */\nfunction seedSuppressions(): Map<string, SuppressionEntry> {\n const m = new Map<string, SuppressionEntry>();\n const id = rid(\"sup\");\n m.set(id, {\n id,\n recipient: SEEDED_SUPPRESSED_RECIPIENT,\n recipient_raw: SEEDED_SUPPRESSED_RECIPIENT,\n scope: \"org\",\n source: \"manual\",\n reactivation_count: 0,\n created_at: now(),\n revoked: false,\n });\n return m;\n}\n\n// ---------------------------------------------------------------------------\n// Review-policy + review-loop helpers, mirrored from the server so the mock and\n// production cannot disagree about who gets refused and why.\n// ---------------------------------------------------------------------------\n\n/** A reply's server-derived envelope: recipients, `Re:` subject, thread. */\ninterface ReplyEnvelope {\n to: string[];\n subject: string;\n threadId: string;\n}\n\n/**\n * Whether the resolved policy turns this asserted mode into a review.\n *\n * `require_review` always does. `allow_direct` keeps `direct` iff the agent\n * ACTUALLY asserted it. `auto_send_graduated` is decided per-message by the\n * gates, so the conservative treatment is \"review unless direct under\n * allow_direct\" — the intent is still required, because the message may well end\n * up in the human queue and the summary is the reviewer's only context.\n */\nfunction resolvedModeIsReview(policy: ReviewPolicy, mode: \"review\" | \"direct\"): boolean {\n if (policy === \"allow_direct\" && mode === \"direct\") return false;\n return true;\n}\n\n/** The four states nothing will ever move a review out of (`closed` on the read shape). */\nconst CLOSED_REVIEW_STATES: ReadonlySet<ReviewState> = new Set<ReviewState>([\n \"sent\",\n \"auto_sent\",\n \"cancelled\",\n // `failed` is in the CLOSED set although it is not formally terminal: the\n // console cannot re-approve it and no sweep moves it, so an agent told\n // closed=false there would wait forever.\n \"failed\",\n]);\n\n/**\n * The states that answer 409 `terminal` rather than `wrong_state` — a review that\n * has finished for good, where the answer is STOP, not \"try a different verb\".\n * `failed` is deliberately NOT here: an agent may still `cancel_review` it, which\n * is its one legal close-out.\n */\nconst TERMINAL_REVIEW_STATES: ReadonlySet<ReviewState> = new Set<ReviewState>([\n \"sent\",\n \"auto_sent\",\n \"cancelled\",\n]);\n\n/**\n * The verbs a COMPOSING agent may legally call against a draft in this state,\n * most actionable first, reads last — the mock's mirror of the server's\n * `AllowedAgentActions`, which is what fills a 409's `allowed_action` hints.\n *\n * The reads are unconditional, which is why the list is never empty: from a\n * terminal state the honest answer is \"nothing will mutate this, go look at what\n * happened\".\n */\nfunction allowedAgentActions(state: ReviewState): string[] {\n const actions: string[] = [];\n // submit_revision targets needs_review WITH a revision bump — including the\n // needs_review self-edge, which is a legal redraft (a revision bump IS a change).\n if (state === \"needs_review\" || state === \"in_review\" || state === \"chatting\" ||\n state === \"stale\" || state === \"rejected\") {\n actions.push(\"submit_revision\");\n }\n // post_review_chat: legal from needs_review for a NON-human actor (an agent may\n // ask a question about a queued draft; it must not fabricate a reviewer, so the\n // state does not change).\n if (state === \"needs_review\" || state === \"in_review\" || state === \"chatting\") {\n actions.push(\"post_review_chat\");\n }\n if (state === \"needs_review\" || state === \"in_review\" || state === \"chatting\" || state === \"stale\") {\n actions.push(\"restamp_review\");\n }\n if (state === \"needs_review\" || state === \"in_review\" || state === \"chatting\" ||\n state === \"stale\" || state === \"rejected\" || state === \"failed\") {\n actions.push(\"cancel_review\");\n }\n return [...actions, \"get_review\", \"list_review_events\"];\n}\n\n/** Build an RFC-9457 problem body the mock can hand to the SAME parser the live client uses. */\nfunction mockProblem(\n code: ProblemCode,\n status: number,\n title: string,\n detail: string,\n fields: ProblemField[],\n): Problem {\n return {\n type: `https://extrovert.dev/problems/${code}`,\n title,\n status,\n code,\n detail,\n request_id: rid(\"req\"),\n errors: fields.length ? fields : undefined,\n };\n}\n\n/**\n * Raise the mock error through {@link errorForStatus}, the SAME factory the HTTP\n * transport uses on a real problem+json body. That is deliberate: it means the\n * offline mock cannot hand back a different error CLASS than production for the\n * same code, which is precisely the divergence that let a wire bug live behind\n * green demos.\n */\nfunction problemError(problem: Problem, message?: string): ApiError {\n return errorForStatus({\n status: problem.status,\n code: problem.code,\n message: message ?? problem.detail ?? problem.title,\n requestId: problem.request_id,\n problem,\n });\n}\n\n/**\n * The literal `intent_required` 422, remediation and all.\n *\n * The full recipe lives in `detail` (not only in `errors[]`) for the same reason\n * it does on the server: the MCP tool surface renders only the message, so\n * anything that exists only in `errors[]` is invisible to the model that has to\n * fix the request. `errors[]` carries the machine-readable duplicate — including\n * `retry_with`, the literal JSON to splice into the original body.\n */\nfunction intentRequiredError(policy: ReviewPolicy, inboxOverride: boolean): ApiError {\n const source = inboxOverride\n ? \"a per-inbox override on this inbox\"\n : \"the account default; no per-inbox override\";\n const detail =\n `This inbox requires human review before sending (review policy: ${policy}, from ${source}). ` +\n \"Nothing was sent and nothing was queued. \" +\n \"Retry the SAME request with an `intent` object added: \" +\n '{\"intent\":{\"summary\":\"<one sentence: who you are writing to, what you want, and why now>\"}}. ' +\n \"That summary is the first thing the human reviewer reads; 8-200 characters. \" +\n \"Optional: intent.meta {goal, recipient, prior_touches, urgency} for reviewer context, \" +\n \"and category_id (cat_...) from list_categories. \" +\n \"On success you get 202 queued_for_review with a review id (rr_...); then monitor it with \" +\n \"wait_for_review_event / list_review_events until you receive a `sent` or `send_failed` event.\";\n return problemError(\n mockProblem(\"intent_required\", 422, \"Intent Required\", detail, [\n { field: \"intent.summary\", code: \"required\",\n detail: \"One sentence for the human reviewer: who / what / why. 8-200 chars.\" },\n { field: \"intent.meta\", code: \"optional\",\n detail: \"{goal, recipient, prior_touches, urgency} - improves the reviewer's decision context.\" },\n { field: \"category_id\", code: \"optional\",\n detail: \"cat_... from list_categories. A graduated category can auto-send without a human.\" },\n { field: \"policy\", code: \"review_policy\", detail: `${policy} (source: ${source})` },\n { field: \"retry_with\", code: \"example\", detail: INTENT_RETRY_EXAMPLE },\n ]),\n );\n}\n\n/** The literal JSON an agent splices into its original request to fix a 422 in one turn. */\nexport const INTENT_RETRY_EXAMPLE =\n '{\"intent\":{\"summary\":\"Follow up with vp@acme.com on the Q3 pilot; 2 prior touches\"}}';\n\n/**\n * A review-loop 409 carrying the recovery FACTS the agent needs: the live state,\n * the CAS keys a legal retry must quote, and the verbs that ARE legal now. The\n * split between `stale` / `wrong_state` / `terminal` is the whole point — only\n * `stale` and `born_stale` are worth retrying.\n */\nfunction reviewConflict(\n code: \"stale\" | \"wrong_state\" | \"terminal\" | \"born_stale\",\n review: Review,\n detail: string,\n): ApiError {\n const fields: ProblemField[] = [\n { field: \"state\", code: review.state, detail: \"the draft's current state\" },\n ];\n if (code === \"terminal\") {\n if (review.sent_message_id) {\n fields.push({\n field: \"sent_message_id\",\n code: review.sent_message_id,\n detail: \"the message that was actually delivered\",\n });\n }\n } else {\n fields.push(\n { field: \"revision\", code: String(review.revision), detail: \"current revision — use as parent_revision\" },\n { field: \"version\", code: String(review.version), detail: \"current row version\" },\n );\n }\n for (const action of allowedAgentActions(review.state)) {\n fields.push({ field: \"allowed_action\", code: action, detail: ALLOWED_ACTION_DETAIL[action] ?? \"\" });\n }\n return problemError(mockProblem(code, 409, \"Conflict\", detail, fields));\n}\n\n/** One-line \"why you would call this\" per advertised verb, so it reads the same everywhere. */\nconst ALLOWED_ACTION_DETAIL: Readonly<Record<string, string>> = {\n submit_revision: \"post a new draft under parent_revision\",\n post_review_chat: \"ask the reviewer a clarifying question\",\n restamp_review: \"assert the draft is current against the rules without redrafting\",\n cancel_review: \"withdraw this review\",\n get_review: \"re-read the draft\",\n list_review_events: \"wait for the delivery outcome\",\n};\n\n/** Mock 404 helper (mirrors the transport's). */\nfunction notFoundMock(kind: string, id: string): NotFoundError {\n return new NotFoundError({\n status: 404,\n code: \"not_found\",\n message: `No ${kind} found for \"${id}\" in the offline mock.`,\n });\n}\n\n/** Materialize a forward's quoted body, exactly as the server does at submit time. */\nfunction forwardBodyText(note: string, parent: Message): string {\n return `${note}\\n\\n---------- Forwarded message ----------\\nFrom: ${parent.from.email}\\nSubject: ${parent.subject}\\n\\n${parent.text}`;\n}\n\n/**\n * A self-contained, deterministic-enough in-memory backend implementing the subset of behavior the\n * SDK exposes. One instance per mock client so tests/examples don't bleed into each other.\n */\nexport class MockBackend {\n private state: MockState = freshState();\n\n reset(): void {\n this.state = freshState();\n }\n\n enroll(req: EnrollRequest): EnrollResponse {\n const existingId = this.state.agentByHandle.get(req.agent_handle);\n const agentId = existingId ?? rid(\"agt\");\n if (!existingId) {\n const agent: Agent = {\n id: agentId,\n name: req.agent_name ?? null,\n status: \"active\",\n scopes: [\"mailbox:create\", \"mailbox:read\", \"mailbox:send\", \"webhook:write\"],\n created_at: now(),\n metadata: {},\n };\n this.state.agents.set(agentId, agent);\n this.state.agentByHandle.set(req.agent_handle, agentId);\n }\n // Mirror the frozen EnrollResult wire shape EXACTLY (agent_id, agent_key, scopes,\n // org_id, project_id) so SDK tests exercise the same fields the live server emits —\n // no agent_key_prefix/expires_at/mailboxes_* (those are NOT in the contract).\n return {\n agent_id: agentId,\n agent_key: `pk_agent_proj_${agentId.slice(4)}_${rid(\"sk\").slice(3)}`,\n scopes: [\"mailbox:create\", \"mailbox:read\", \"mailbox:send\", \"webhook:write\"],\n // The minted key is bound to the token's resolved org/project; the agent cannot change it.\n org_id: MOCK_ORG_ID,\n project_id: MOCK_PROJECT_ID,\n };\n }\n\n /**\n * Self-signup (Slice E). Returns a LIMITED-scope key and a first inbox; the OTP\n * is held in-memory (mock only) so `verify` can elevate to full scope. Idempotent\n * on human_email: a re-call reuses the tenant/agent and rotates the OTP.\n */\n signUp(req: SignUpRequest): SignUpResponse {\n const email = req.human_email.trim().toLowerCase();\n const existing = this.state.signupByEmail.get(email);\n const customerId = existing?.customerId ?? `cus_pn_signup_${rid(\"c\").slice(2)}`;\n const agentId = existing?.agentId ?? rid(\"agt\");\n const address =\n existing?.address ?? `${req.username ?? randomHandle()}@smtp.extrovert.dev`;\n const otp = String(Math.floor(100000 + Math.random() * 900000));\n this.state.signupByEmail.set(email, { customerId, agentId, address, otp, verified: false });\n return {\n customer_id: customerId,\n agent_id: agentId,\n agent_key: `pk_agent_${agentId.slice(4)}_${rid(\"sk\").slice(3)}`,\n key_prefix: `pk_agent_${agentId.slice(4, 8)}`,\n scopes: [\"mailbox:read\"],\n address,\n verified: false,\n otp_sent_to: email,\n otp_expires_at: new Date(Date.now() + 15 * 60 * 1000).toISOString(),\n message: \"A verification code was sent to your email. Call verify with it.\",\n };\n }\n\n /** Confirm a signup OTP and return a full-scope key (mock). */\n verify(req: VerifyRequest): VerifyResponse {\n // The mock matches the OTP against any pending signup (single-tenant fixture).\n for (const [, s] of this.state.signupByEmail) {\n if (!s.verified && s.otp === req.otp.trim()) {\n s.verified = true;\n return {\n agent_id: s.agentId,\n agent_key: `pk_agent_${s.agentId.slice(4)}_${rid(\"sk\").slice(3)}`,\n key_prefix: `pk_agent_${s.agentId.slice(4, 8)}`,\n scopes: [\"mailbox:create\", \"mailbox:read\", \"mailbox:send\"],\n verified: true,\n message: \"Verified. Use the new agent_key (full scopes).\",\n };\n }\n }\n throw new Error(\"verification code invalid or expired\");\n }\n\n /** Introspect the mock principal (GET /v1/auth/me). */\n whoami(): WhoAmI {\n return {\n customer_id: \"cus_pn_mock\",\n org_id: MOCK_ORG_ID,\n project_id: MOCK_PROJECT_ID,\n agent_id: this.state.agents.keys().next().value ?? \"agt_mock\",\n key_id: \"pkey_mock\",\n scopes: [\"mailbox:create\", \"mailbox:read\", \"mailbox:send\", \"webhook:write\"],\n };\n }\n\n createInbox(req: CreateInboxRequest): Inbox {\n // project_id is an assertion (never a selector): a mismatch is 403.\n assertProjectMatch(req.project_id);\n if (req.client_id) {\n const existing = this.state.inboxByClientId.get(req.client_id);\n if (existing) {\n // Idempotent replay returns the existing inbox verbatim (incl. its metadata).\n const inbox = this.state.inboxes.get(existing);\n if (inbox) return inbox;\n }\n }\n // Validate (and snapshot) the create-time metadata: no null deletes on create.\n const metadata = req.metadata ? mergeMetadata({}, req.metadata) : {};\n const username = req.username ?? randomHandle();\n const domain = req.domain ?? SHARED_SUBDOMAIN;\n const id = rid(\"ibx\");\n const inbox: Inbox = {\n object: \"inbox\",\n id,\n org_id: MOCK_ORG_ID,\n project_id: MOCK_PROJECT_ID,\n address: `${username}@${domain}`,\n username,\n domain,\n display_name: req.display_name ?? null,\n status: \"live\",\n onboarding_mode: req.domain ? \"ns_delegated\" : \"shared\",\n agent_id: null,\n daily_send_limit: DEFAULT_DAILY_SEND_LIMIT,\n webhook_url: req.webhook_url ?? null,\n metadata,\n created_at: now(),\n ...(req.return_credentials\n ? {\n credentials: {\n imap_host: \"smtp.extrovert.dev\",\n imap_port: 993,\n smtp_host: \"smtp.extrovert.dev\",\n smtp_port: 587,\n username: `${username}@${domain}`,\n password: rid(\"mbpw\").slice(5),\n },\n }\n : {}),\n };\n this.state.inboxes.set(id, inbox);\n this.state.inboxes.set(inbox.address, inbox);\n this.state.messages.set(inbox.address, []);\n if (req.client_id) this.state.inboxByClientId.set(req.client_id, id);\n this.state.mailboxesUsed += 1;\n return inbox;\n }\n\n listInboxes(params: ListInboxesParams = {}): Page<Inbox> {\n let items = [...new Set(this.state.inboxes.values())].filter(\n (ibx) => ibx.id.startsWith(\"ibx\"),\n );\n if (params.domain) items = items.filter((i) => i.domain === params.domain);\n if (params.status) items = items.filter((i) => i.status === params.status);\n return { items, total: items.length };\n }\n\n getInbox(address: string): Inbox | undefined {\n const inbox = this.state.inboxes.get(address);\n if (!inbox) return undefined;\n // effective_review_policy rides the SINGLE-inbox read only — the list path\n // omits it on the server (it would be one settings read per row for a value\n // identical across the org), so the mock omits it there too. Reading it once at\n // start-up is how an agent plans its first send instead of discovering the\n // policy by being refused 422.\n return { ...inbox, effective_review_policy: this.reviewPolicyFor(inbox.address) };\n }\n\n /**\n * Normalize an inbox ref (opaque id OR address alias) to the canonical address the\n * mock keys its message/thread/contact maps on. The SDK now routes inbox ops by the\n * canonical opaque `id` when it holds a full record (matching the contract's\n * canonical-key semantics), so the mock must resolve an id back to its address —\n * both key `state.inboxes` (same object), `state.messages` keys by address only.\n * Unknown refs pass through unchanged so the existing not-found paths still fire.\n */\n private addrOf(ref: string): string {\n return this.state.inboxes.get(ref)?.address ?? ref;\n }\n\n updateInbox(address: string, req: UpdateInboxRequest): Inbox | undefined {\n // project_id is an assertion (never a selector): a mismatch is 403.\n assertProjectMatch(req.project_id);\n const inbox = this.state.inboxes.get(address);\n if (!inbox) return undefined;\n if (req.display_name !== undefined) {\n inbox.display_name = req.display_name === \"\" ? null : req.display_name;\n }\n if (req.webhook_url !== undefined) {\n inbox.webhook_url = req.webhook_url === \"\" ? null : req.webhook_url;\n }\n if (req.daily_send_limit !== undefined) {\n if (\n !Number.isInteger(req.daily_send_limit) ||\n req.daily_send_limit < 1 ||\n req.daily_send_limit > 10_000\n ) {\n throw new ValidationError({\n status: 400,\n code: \"invalid\",\n message: \"daily_send_limit must be an integer from 1 through 10000.\",\n });\n }\n inbox.daily_send_limit = req.daily_send_limit;\n }\n // Metadata: shallow merge, per-key null deletes, top-level null clears all,\n // omitted leaves unchanged (see UpdateInboxRequest.metadata).\n if (req.metadata !== undefined) {\n inbox.metadata = mergeMetadata(inbox.metadata, req.metadata);\n }\n // The record is shared by id + address keys (same object), so both views update.\n return inbox;\n }\n\n deleteInbox(address: string): void {\n const inbox = this.state.inboxes.get(address);\n if (inbox) {\n this.state.inboxes.delete(inbox.id);\n this.state.inboxes.delete(inbox.address);\n this.state.messages.delete(inbox.address);\n }\n }\n\n // ---- Canonical project-prefixed inbox chain (x.projects.inboxes.*) ----------\n // The mock binds every key to MOCK_PROJECT_ID; the wildcard \"-\" (org breadth) is\n // accepted for an org-tier key. A concrete project outside the bound project is a\n // 404 (out-of-ceiling), mirroring the server's fail-closed addressing. An inbox\n // is resolved by its opaque id OR its address alias (both key the same map).\n\n /** Resolve the project path segment against the mock's bound project (fail-closed). */\n private resolveProjectSegment(projectId: string): void {\n if (projectId === \"-\" || projectId === MOCK_PROJECT_ID) return;\n // A concrete, out-of-ceiling project id is a 404 (never an existence oracle).\n throw new NotFoundError({\n status: 404,\n code: \"not_found\",\n message: `project \"${projectId}\" is outside this key's ceiling.`,\n });\n }\n\n createInboxInProject(projectId: string, req: CreateInboxRequest): Inbox {\n // A bare org wildcard create needs a concrete project (breadth_required) — the\n // mock has a single project, so \"-\" still resolves to it for ergonomics.\n this.resolveProjectSegment(projectId);\n return this.createInbox(req);\n }\n\n listInboxesInProject(projectId: string, params: ProjectInboxListParams = {}): List<Inbox> {\n this.resolveProjectSegment(projectId);\n let items = [...new Set(this.state.inboxes.values())].filter((ibx) => ibx.id.startsWith(\"ibx\"));\n // Opaque-cursor pagination over the offset-based mock store.\n const limit = Math.min(Math.max(params.limit ?? 50, 1), 100);\n const offset = params.cursor ? decodeMockCursor(params.cursor) : 0;\n const slice = items.slice(offset, offset + limit);\n const hasMore = offset + limit < items.length;\n return {\n object: \"list\",\n data: slice,\n has_more: hasMore,\n next_cursor: hasMore ? encodeMockCursor(offset + limit) : null,\n };\n }\n\n getInboxInProject(projectId: string, inboxId: string): Inbox | undefined {\n this.resolveProjectSegment(projectId);\n return this.state.inboxes.get(inboxId);\n }\n\n updateInboxInProject(projectId: string, inboxId: string, req: UpdateInboxRequest): Inbox | undefined {\n this.resolveProjectSegment(projectId);\n const inbox = this.state.inboxes.get(inboxId);\n if (!inbox) return undefined;\n return this.updateInbox(inbox.address, req);\n }\n\n deleteInboxInProject(projectId: string, inboxId: string): boolean {\n this.resolveProjectSegment(projectId);\n const inbox = this.state.inboxes.get(inboxId);\n if (!inbox) return false;\n this.deleteInbox(inbox.address);\n return true;\n }\n\n getInboxCredentialsInProject(projectId: string, inboxId: string): InboxCredentials | undefined {\n this.resolveProjectSegment(projectId);\n const inbox = this.state.inboxes.get(inboxId);\n if (!inbox) return undefined;\n return (\n inbox.credentials ?? {\n imap_host: \"smtp.extrovert.dev\",\n imap_port: 993,\n smtp_host: \"smtp.extrovert.dev\",\n smtp_port: 587,\n username: inbox.address,\n password: rid(\"mbpw\").slice(5),\n }\n );\n }\n\n // ---- Outbound: ONE policy-governed path (mock mirror of SubmitForReview) ----\n //\n // send / reply / forward / submitForReview / submitReplyForReview used to be five\n // separate mock implementations, and only the two `submit*` ones knew the review\n // loop existed. That is the same shape as the server bug this change set fixes:\n // policy enforcement living in a code path a caller can route around. On the real\n // server all five are ONE handler calling ONE service entry point, so they are one\n // method here too. If a rule can be bypassed by picking a different SDK method,\n // the mock will happily certify an agent that production refuses.\n //\n // The order below mirrors Service.SubmitForReview exactly, and the order is\n // load-bearing:\n //\n // 1. resolve the policy (inbox override > account default > require_review floor)\n // 2. default the mode from the policy + whether the caller asserted one\n // 3. PRE-FLIGHT: contact lists + suppression, on the FULL recipient set\n // 4. the intent gate (422 intent_required)\n // 5. route: auto-send, or park in needs_review\n //\n // (3) before (4) matters: a blocked or suppressed recipient is a fact no amount of\n // intent will fix, and answering `intent_required` first would send the agent off\n // to add an intent and retry straight into the same wall.\n\n /** The RESOLVED review policy for an inbox: per-inbox override, else the account default. */\n reviewPolicyFor(address: string): ReviewPolicy {\n return this.state.inboxReviewPolicy.get(this.addrOf(address)) ?? this.state.orgReviewPolicy;\n }\n\n /**\n * Mock-only: set the ACCOUNT-level review policy (the console/admin plane sets\n * this on the real server; there is no agent-plane write for it). Use it to\n * exercise an org that has been configured for direct sending.\n */\n setReviewPolicy(policy: ReviewPolicy): void {\n this.state.orgReviewPolicy = policy;\n }\n\n /** Mock-only: set (or clear) the per-inbox override, which beats the account default. */\n setInboxReviewPolicy(address: string, policy: ReviewPolicy | undefined): void {\n const addr = this.addrOf(address);\n if (policy === undefined) this.state.inboxReviewPolicy.delete(addr);\n else this.state.inboxReviewPolicy.set(addr, policy);\n }\n\n send(address: string, req: SendRequest): SendOutcome {\n address = this.addrOf(address);\n return this.submitOutbound({\n address,\n kind: \"send\",\n req,\n to: toArray(req.to),\n cc: toArray(req.cc),\n bcc: toArray(req.bcc),\n subject: req.subject ?? \"\",\n text: req.text ?? \"\",\n html: req.html,\n deliver: () => this.deliverSend(address, req),\n });\n }\n\n reply(address: string, req: ReplyRequest): SendOutcome {\n address = this.addrOf(address);\n // Envelope materialization: the reply's recipients and `Re:` subject are derived\n // from the parent HERE, before the pre-flight, so the block/suppression checks\n // screen the addresses that will actually be mailed and the reviewer reads the\n // real subject instead of an empty one.\n const env = this.deriveReplyEnvelope(address, req);\n return this.submitOutbound({\n address,\n kind: \"reply\",\n req,\n to: env.to,\n cc: toArray(req.cc),\n bcc: toArray(req.bcc),\n subject: env.subject,\n text: req.text ?? \"\",\n html: req.html,\n deliver: () => this.deliverReply(address, req, env),\n });\n }\n\n forward(address: string, messageId: string, req: ForwardRequest): SendOutcome {\n address = this.addrOf(address);\n const parent = (this.state.messages.get(address) ?? []).find((m) => m.id === messageId);\n if (!parent) throw notFoundMock(\"message\", messageId);\n // A forward is materialized at submit for the same reason a reply is, plus one\n // that is specific to it: the human must review the ACTUAL quoted thread they\n // are about to release to new recipients, not a note whose quote gets rebuilt\n // from the live parent at approval time.\n const subject = fwdSubject(parent.subject);\n const text = forwardBodyText(req.text ?? \"\", parent);\n return this.submitOutbound({\n address,\n kind: \"forward\",\n req,\n to: toArray(req.to),\n cc: toArray(req.cc),\n bcc: toArray(req.bcc),\n subject,\n text,\n deliver: () =>\n this.deliverRaw(address, {\n to: toArray(req.to),\n cc: toArray(req.cc),\n subject,\n text,\n threadId: parent.thread_id,\n }),\n });\n }\n\n /**\n * Submit a new message for review (mock). Rides the SAME endpoint as `send` on\n * the real server, so it is literally the same call here: the resolved policy —\n * not which SDK method you picked — decides whether the message is queued\n * (`kind:\"queued_for_review\"`) or delivered.\n */\n submitForReview(address: string, req: SendRequest): SendOutcome {\n return this.send(address, req);\n }\n\n /** Submit an in-thread reply for review (mock). Same endpoint, same routing, as `reply`. */\n submitReplyForReview(address: string, req: ReplyRequest): SendOutcome {\n return this.reply(address, req);\n }\n\n /**\n * The single enforcement point. Everything above funnels here; nothing else in\n * the mock may reach `deliver*` on the agent plane.\n */\n private submitOutbound(params: {\n address: string;\n kind: \"send\" | \"reply\" | \"forward\";\n req: {\n mode?: \"review\" | \"direct\";\n intent?: { summary: string; meta?: Record<string, unknown> };\n category_id?: string;\n };\n to: string[];\n cc: string[];\n bcc: string[];\n subject: string;\n text: string;\n html?: string;\n deliver: () => SendResult;\n }): SendOutcome {\n const { address, kind, req } = params;\n const policy = this.reviewPolicyFor(address);\n\n // A caller \"opted in\" by mentioning the review loop at all. It decides the\n // RESPONSE SHAPE and the mode default — never whether the policy applies.\n const optedIn =\n req.mode !== undefined || req.intent !== undefined || (req.category_id ?? \"\") !== \"\";\n\n // POLICY-AWARE MODE DEFAULT. Order is load-bearing: an explicit assertion wins\n // (the policy may still refuse it); then a caller that supplied any review field\n // but no mode keeps the historical opt-in meaning (\"queue this\"); only then does\n // an allow_direct org's bare send stay direct; everything else — require_review,\n // auto_send_graduated, and any policy value we do not recognize — falls to\n // review. Unknown policies MUST land there: a value a newer node wrote must\n // never be read by an older client as permission.\n let mode: \"review\" | \"direct\";\n if (req.mode !== undefined) mode = req.mode;\n else if (optedIn) mode = \"review\";\n else if (policy === \"allow_direct\") mode = \"direct\";\n else mode = \"review\";\n\n // PRE-FLIGHT on the full recipient set (to + cc + bcc), before the intent gate.\n const recipients = [...params.to, ...params.cc, ...params.bcc];\n this.enforceSendPolicy(address, recipients);\n this.enforceSuppression(recipients);\n\n // D3 intent gate. NOTHING is written and NOTHING is sent when it fires, which\n // is exactly what makes the amended retry safe.\n if (resolvedModeIsReview(policy, mode) && !req.intent?.summary?.trim()) {\n throw intentRequiredError(policy, this.state.inboxReviewPolicy.has(address));\n }\n\n const review = this.createReviewRecord(address, {\n kind,\n subject: params.subject,\n text: params.text,\n html: params.html,\n to: params.to,\n cc: params.cc,\n bcc: params.bcc,\n intent: req.intent,\n categoryId: req.category_id,\n mode,\n });\n\n // ROUTING. Two auto-send paths reach delivery without a human:\n // - allow_direct + an asserted (or defaulted) `direct` mode\n // - auto_send_graduated + a category the agent named\n // Everything else — including auto_send_graduated with NO category — is held,\n // and the gate_outcome records why so the agent is not left guessing.\n const directAuto = policy === \"allow_direct\" && mode === \"direct\";\n const graduatedAuto = policy === \"auto_send_graduated\" && (req.category_id ?? \"\") !== \"\";\n if (!directAuto && !graduatedAuto) {\n if (policy === \"auto_send_graduated\") review.gate_outcome = \"held:no_category\";\n this.state.reviews.set(review.id, review);\n return {\n kind: \"queued_for_review\",\n review: { id: review.id, state: review.state, effective_mode: review.effective_mode },\n };\n }\n\n const sent = params.deliver();\n this.markReviewAutoSent(review, sent, directAuto ? \"agent_direct\" : \"graduated_auto\");\n\n if (!optedIn) {\n // The LEGACY 202 body, byte-shape-identical to what the server still returns\n // for a caller that never mentioned the review loop — plus the additive\n // `review_id`, which is the only handle a crashed agent has on this path.\n // Note the asymmetry, and that it is the server's, not ours: `send` answers\n // {status, message_id, review_id} with NO thread_id; reply/forward answer\n // {message_id, thread_id, review_id} with no status.\n return kind === \"send\"\n ? { message_id: sent.message_id, status: \"sent\", review_id: review.id }\n : { message_id: sent.message_id, thread_id: sent.thread_id, review_id: review.id };\n }\n const message: { id: string; thread_id?: string } = { id: sent.message_id };\n if (sent.thread_id) message.thread_id = sent.thread_id;\n return { kind: \"sent\", message, review: { id: review.id, state: review.state } };\n }\n\n /**\n * Move a review to `state` and keep `closed` in lockstep.\n *\n * `closed` is DERIVED, never independently assigned, because the two drifting\n * apart is worse than either being wrong: an agent that polls `closed` on a row\n * whose state says otherwise has no way to tell which one to believe.\n */\n private setReviewState(review: Review, state: ReviewState): void {\n review.state = state;\n review.closed = CLOSED_REVIEW_STATES.has(state);\n }\n\n /** Mark a review delivered on an auto-send path and emit its terminal `sent` nudge. */\n private markReviewAutoSent(review: Review, sent: SendResult, sendPath: string): void {\n this.setReviewState(review, \"auto_sent\");\n review.version += 1;\n review.sent_message_id = sent.message_id_header ?? sent.message_id;\n review.send_path = sendPath;\n review.sent_at = now();\n review.updated_at = review.sent_at;\n this.state.reviews.set(review.id, review);\n this.enqueueTerminalNudge(review);\n }\n\n /** Raw delivery for a send — no policy, only reachable from submitOutbound. */\n private deliverSend(address: string, req: SendRequest): SendResult {\n return this.deliverRaw(address, {\n to: toArray(req.to),\n cc: toArray(req.cc),\n subject: req.subject,\n text: req.text ?? \"\",\n html: req.html,\n threadId: rid(\"thr\"),\n attachments: req.attachments,\n });\n }\n\n /** Raw delivery for a reply — no policy, only reachable from submitOutbound. */\n private deliverReply(address: string, req: ReplyRequest, env: ReplyEnvelope): SendResult {\n return this.deliverRaw(address, {\n to: env.to,\n cc: toArray(req.cc),\n subject: env.subject,\n text: req.text ?? \"\",\n html: req.html,\n threadId: env.threadId,\n attachments: req.attachments,\n });\n }\n\n /** Append the outbound message and shape the legacy send result. */\n private deliverRaw(\n address: string,\n opts: {\n to: string[];\n cc?: string[];\n subject: string;\n text: string;\n html?: string;\n threadId: string;\n attachments?: AttachmentInput[];\n },\n ): SendResult {\n const msg = this.appendMessage(address, {\n direction: \"outbound\",\n from: address,\n to: opts.to,\n cc: opts.cc,\n subject: opts.subject,\n text: opts.text,\n html: opts.html,\n threadId: opts.threadId,\n attachments: opts.attachments,\n });\n return {\n message_id: msg.id,\n thread_id: msg.thread_id,\n message_id_header: msg.message_id,\n status: \"sent\",\n created_at: now(),\n };\n }\n\n /**\n * Derive a reply's recipients / `Re:` subject / thread from the parent, the way\n * the server does before it writes the review row.\n */\n private deriveReplyEnvelope(address: string, req: ReplyRequest): ReplyEnvelope {\n const all = this.state.messages.get(address) ?? [];\n let parent: Message | undefined;\n let threadId = req.thread_id;\n if (req.message_id) {\n parent = all.find((m) => m.id === req.message_id);\n if (!parent) throw notFoundMock(\"message\", req.message_id);\n threadId = parent.thread_id;\n } else if (req.thread_id) {\n const inThread = all.filter((m) => m.thread_id === req.thread_id);\n parent = inThread[inThread.length - 1];\n } else {\n throw new ValidationError({\n status: 400,\n code: \"bad_request\",\n message: \"thread_id or message_id is required\",\n });\n }\n const to: string[] = [];\n if (parent) {\n to.push(parent.from.email);\n if (req.reply_all) for (const a of parent.to) if (a.email !== address) to.push(a.email);\n }\n return {\n to: to.length ? to : [\"reply@example.com\"],\n subject: parent ? reSubject(parent.subject) : \"Re:\",\n threadId: threadId ?? rid(\"thr\"),\n };\n }\n\n /** List review requests (mock), newest-first, with optional filters. */\n listReviews(params: ListReviewsParams = {}): Page<Review> {\n let items = [...this.state.reviews.values()].sort((a, b) =>\n b.created_at.localeCompare(a.created_at),\n );\n if (params.state !== undefined) {\n const states = Array.isArray(params.state) ? params.state : [params.state];\n items = items.filter((r) => states.includes(r.state));\n }\n if (params.category_id) items = items.filter((r) => r.category_id === params.category_id);\n if (params.inbox) {\n const inbox = params.inbox.toLowerCase();\n items = items.filter((r) => r.from_address.toLowerCase() === inbox);\n }\n return { items, total: items.length };\n }\n\n /** Get one review request (mock), or undefined when not found. */\n getReview(reviewId: string): Review | undefined {\n return this.state.reviews.get(reviewId);\n }\n\n /** Get a review's append-only thread turns (mock), or undefined when not found. */\n getReviewTurns(reviewId: string): Page<ReviewTurn> | undefined {\n if (!this.state.reviews.has(reviewId)) return undefined;\n const items = this.state.reviewTurns.get(reviewId) ?? [];\n return { items, total: items.length };\n }\n\n /**\n * Get the human's assembled feedback (mock; M5): the diff + the human comments /\n * rejection turns + the decision (derived from state). new_rules is empty in the\n * mock (rule provenance lives server-side). Undefined when not found.\n */\n getReviewFeedback(reviewId: string): ReviewFeedback | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n const turns = this.state.reviewTurns.get(reviewId) ?? [];\n const comments = turns\n .filter(\n (t) =>\n (t.turn_type === \"human_comment\" ||\n t.turn_type === \"human_reject\" ||\n t.turn_type === \"human_question\") &&\n (t.body ?? \"\").trim() !== \"\",\n )\n .map((t) => ({\n turn_id: t.id,\n actor_kind: t.actor_kind,\n body: t.body ?? \"\",\n actor_id: t.actor_id,\n created_at: t.created_at,\n }));\n let diffJson: Record<string, unknown> | undefined;\n for (const t of turns) {\n if ((t.turn_type === \"human_edit\" || t.turn_type === \"system_diff\") && t.diff_json) {\n diffJson = t.diff_json;\n }\n }\n const edited = !!review.sent_body_text || !!review.sent_subject || !!review.diff_unified;\n let decision: string;\n if (review.state === \"sent\" || review.state === \"auto_sent\" || review.state === \"approved\") {\n decision = edited ? \"edited\" : \"approved\";\n } else if (review.state === \"rejected\") {\n decision = \"rejected\";\n } else {\n decision = review.state;\n }\n return {\n review_id: reviewId,\n decision,\n diff_unified: review.diff_unified,\n diff_json: diffJson,\n comments,\n new_rules: [],\n };\n }\n\n /**\n * Post a chat turn on a review's thread (mock; M5). Idempotent on the optional key\n * (parity v21): a replay with the same key returns the same review without doubling\n * the turn. Flips in_review -> chatting on the first turn. Undefined when not found.\n */\n postReviewChat(\n reviewId: string,\n req: PostReviewChatRequest,\n idempotencyKey?: string,\n ): Review | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n const key = idempotencyKey?.trim();\n if (key) {\n const replayed = this.state.chatByIdempotencyKey.get(key);\n if (replayed) return replayed;\n }\n if (TERMINAL_REVIEW_STATES.has(review.state)) {\n this.enqueueFrontRunNudge(review, review.revision);\n throw reviewConflict(\n \"terminal\",\n review,\n `this review is ${review.state}; nothing will ever succeed on it. A front_run_next event is waiting on your queue.`,\n );\n }\n // needs_review IS a legal source for an AGENT question (D-5). The old guard's\n // rationale was right — an agent must not conjure a reviewer for a queued draft\n // — but its effect was wrong: after a reviewer-reject lands a draft back in\n // needs_review WITH feedback, the skill tells the agent to ask when the feedback\n // is ambiguous, and it could not. So the question is appended and the state is\n // deliberately NOT changed: `in_review` is a soft lock meaning a real human has\n // it open, and an agent may not fabricate that.\n if (\n review.state !== \"in_review\" &&\n review.state !== \"chatting\" &&\n review.state !== \"needs_review\"\n ) {\n throw reviewConflict(\n \"wrong_state\",\n review,\n `post_review_chat is not legal while the draft is in '${review.state}'.`,\n );\n }\n const turns = this.state.reviewTurns.get(reviewId) ?? [];\n turns.push({\n id: rid(\"turn\"),\n seq: turns.length + 1,\n turn_type: \"agent_question\",\n actor_kind: \"agent\",\n body: req.text,\n created_at: now(),\n });\n this.state.reviewTurns.set(reviewId, turns);\n if (review.state === \"in_review\") {\n this.setReviewState(review, \"chatting\");\n review.version += 1;\n review.updated_at = now();\n this.state.reviews.set(reviewId, review);\n }\n // No nudge for the agent's OWN question — feedback_added is a HUMAN signal, and\n // waking a composer with its own message is how a drain loop starts spinning.\n if (key) this.state.chatByIdempotencyKey.set(key, review);\n return review;\n }\n\n /**\n * Post a new agent draft under a parent_revision CAS (mock; M5; D17). A mismatch is\n * a 409 STALE with NO mutation; a clean CAS re-renders the draft in place\n * (revision++), returns to needs_review. Undefined when not found.\n */\n submitRevision(reviewId: string, req: SubmitRevisionRequest): Review | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n // The three-way 409 split, in the order an agent needs it.\n //\n // TERMINAL first: the review is over, nothing will ever succeed, and a\n // front_run_next nudge is left behind so an agent that only drains the queue\n // still learns it lost the race.\n if (TERMINAL_REVIEW_STATES.has(review.state)) {\n this.enqueueFrontRunNudge(review, req.parent_revision);\n throw reviewConflict(\n \"terminal\",\n review,\n `this review is ${review.state}; a redraft will never succeed. A front_run_next event is waiting on your queue.`,\n );\n }\n // WRONG_STATE: the draft is still live but this VERB is illegal from here.\n // Never retry the same verb — read the allowed_action hints and pick another.\n // needs_review IS legal (D-1): a redraft bumps the revision, which IS a change,\n // so the self-edge that used to be banned is exactly the loop a reviewer-reject\n // hands back to the composer.\n if (\n review.state !== \"needs_review\" &&\n review.state !== \"in_review\" &&\n review.state !== \"chatting\" &&\n review.state !== \"rejected\" &&\n review.state !== \"stale\"\n ) {\n throw reviewConflict(\n \"wrong_state\",\n review,\n `submit_revision is not legal while the draft is in '${review.state}'. Wait for a sent or send_failed review event.`,\n );\n }\n // STALE: the CAS failed. NOTHING is mutated, and the error carries the current\n // revision/version so the bounded retry needs no extra get_review.\n if (review.revision !== req.parent_revision) {\n throw reviewConflict(\n \"stale\",\n review,\n \"parent_revision is stale; re-read the review, re-apply your edit on top, and resubmit with the current revision\",\n );\n }\n if (req.version !== undefined && review.version !== req.version) {\n throw reviewConflict(\n \"stale\",\n review,\n \"version is stale; re-read the review, re-apply your edit on top, and resubmit\",\n );\n }\n review.revision += 1;\n review.version += 1;\n this.setReviewState(review, \"needs_review\");\n if (req.subject !== undefined) review.proposed_subject = req.subject;\n // `text` is canonical, `body` a permanent alias — resolved here EXACTLY as the\n // server does, including the conflicting_alias rejection. The mock must not be\n // more permissive than the wire: a fixture that quietly accepts what the server\n // refuses is how a 67-day-old send bug stayed invisible behind green demos.\n if (\n req.text !== undefined &&\n req.body !== undefined &&\n req.text !== req.body\n ) {\n throw new ValidationError({\n status: 400,\n code: \"conflicting_alias\",\n message: \"`body` is a deprecated alias for `text`; send one or the other\",\n });\n }\n const revisedText = req.text ?? req.body;\n if (revisedText !== undefined) review.proposed_body_text = revisedText;\n if (req.html !== undefined) review.proposed_body_html = req.html;\n // Attachments REPLACE when present, are untouched when the field is omitted,\n // and are cleared by an explicit empty array. Without this a redraft after\n // reviewer feedback would ship a message the human reviewed WITH a file and the\n // recipient received without one.\n if (req.attachments !== undefined) {\n this.state.reviewAttachments.set(reviewId, req.attachments);\n }\n review.updated_at = now();\n this.state.reviews.set(reviewId, review);\n const turns = this.state.reviewTurns.get(reviewId) ?? [];\n turns.push({\n id: rid(\"turn\"),\n seq: turns.length + 1,\n turn_type: \"agent_draft\",\n actor_kind: \"agent\",\n body: revisedText ?? review.proposed_body_text,\n revision: review.revision,\n created_at: now(),\n });\n this.state.reviewTurns.set(reviewId, turns);\n // Deliberately NO nudge: the composer must not be woken by its own redraft.\n // (redraft_requested is what a REVIEWER's reject/escalate/sweep enqueues; see\n // simulateReviewRejected.)\n return review;\n }\n\n /** Withdraw a pending review (mock; M5) to the terminal cancelled state. */\n cancelReview(reviewId: string): Review | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n if (TERMINAL_REVIEW_STATES.has(review.state)) {\n this.enqueueFrontRunNudge(review, review.revision);\n throw reviewConflict(\"terminal\", review, `this review is already ${review.state}.`);\n }\n this.setReviewState(review, \"cancelled\");\n review.version += 1;\n review.updated_at = now();\n this.state.reviews.set(reviewId, review);\n this.enqueueTerminalNudge(review);\n return review;\n }\n\n /**\n * Re-stamp a draft's rules-version WITHOUT redrafting (mock; D19/§8 $0 escape valve).\n * Advances the version the draft is current against; no revision bump, no body change.\n * A terminal/sent draft 409s; against_version above the category's current\n * rules-version is 400. The mock has no per-category rules_version on the Review, so it\n * just bumps the row version and returns it (the body is untouched).\n */\n restampReview(reviewId: string, req: RestampReviewRequest): Review | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n if (TERMINAL_REVIEW_STATES.has(review.state)) {\n this.enqueueFrontRunNudge(review, review.revision);\n throw reviewConflict(\"terminal\", review, `this review is already ${review.state}.`);\n }\n // restamp_review is ONLY the \"I re-read the rules and nothing needed to change\"\n // escape valve. It applies to a draft still sitting in the human queue; an\n // approved or failed draft has already left it.\n if (\n review.state !== \"needs_review\" &&\n review.state !== \"in_review\" &&\n review.state !== \"chatting\" &&\n review.state !== \"stale\"\n ) {\n throw reviewConflict(\n \"wrong_state\",\n review,\n `restamp_review is not legal while the draft is in '${review.state}'.`,\n );\n }\n if (req.against_version < 0) {\n throw new ValidationError({\n status: 400,\n code: \"invalid\",\n message: \"against_version must be >= 0\",\n });\n }\n review.version += 1;\n review.updated_at = now();\n this.state.reviews.set(reviewId, review);\n return review;\n }\n\n // ---- BYO review-agent decision plane (M8 Slice B; D5/§9) ---------------\n //\n // The mock single-agent store acts as BOTH composer and reviewer, surfacing the\n // reviewer decision surface + the two circuit breakers without modeling the link\n // table. hop_count is tracked in a side map; the breakers use the schema defaults\n // (max_hops=3, review_deadline_s=86400). A draft is \"reviewer-held\" iff in_review/\n // chatting (the queue states a reviewer can decide).\n\n /**\n * Test helper: create a draft already ASSIGNED to a reviewer (in_review), mirroring\n * how the real server routes a parked draft to a linked review-agent. Returns the\n * review id so a test can drive the reviewer decision plane offline. `createdAtMs`\n * (optional) backdates created_at so a test can trip the hard review_deadline breaker.\n */\n seedReviewerHeldReview(opts: { fromAddress: string; createdAtMs?: number } = { fromAddress: \"rep@smtp.extrovert.dev\" }): string {\n const review = this.createReviewRecord(opts.fromAddress, {\n kind: \"send\",\n subject: \"Pilot proposal\",\n text: \"Here is the Q3 pilot proposal.\",\n to: [\"vp@acme.com\"],\n intent: { summary: \"send pilot proposal\", meta: { goal: \"book_meeting\" } },\n });\n this.setReviewState(review, \"in_review\");\n if (opts.createdAtMs !== undefined) {\n review.created_at = new Date(opts.createdAtMs).toISOString();\n }\n this.state.reviews.set(review.id, review);\n return review.id;\n }\n\n /** Get the reviewer's decision context for a review (mock; §9). */\n getReviewDecisionContext(reviewId: string): ReviewDecisionContext | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n const turns = this.state.reviewTurns.get(reviewId) ?? [];\n const hopCount = this.state.reviewHopCounts.get(reviewId) ?? 0;\n const maxHops = 3;\n const deadlineMs = new Date(review.created_at).getTime() + 86400 * 1000;\n const deadline = new Date(deadlineMs).toISOString();\n const deadlinePassed = Date.now() >= deadlineMs;\n const hopsExhausted = hopCount >= maxHops;\n const forceToHuman = hopsExhausted || deadlinePassed;\n return {\n review,\n turns,\n hop_count: hopCount,\n max_hops: maxHops,\n review_deadline: deadline,\n deadline_passed: deadlinePassed,\n hops_exhausted: hopsExhausted,\n force_to_human: forceToHuman,\n force_reason: hopsExhausted\n ? \"max_hops_reached\"\n : deadlinePassed\n ? \"review_deadline_passed\"\n : undefined,\n };\n }\n\n /**\n * Submit a reviewer decision (mock; §9). approve/edit → the platform \"sends\" with the\n * composer's creds (kind=sent, send_path=reviewer_approved); reject → back to the\n * composer (needs_review, hop_count++) UNLESS a breaker forces the human; escalate →\n * the human queue. revision/version are the CAS (409 STALE on mismatch, NO mutation).\n */\n reviewerDecide(reviewId: string, req: ReviewerDecisionRequest): ReviewerDecisionResult | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n if (TERMINAL_REVIEW_STATES.has(review.state)) {\n throw reviewConflict(\"terminal\", review, `this review is already ${review.state}.`);\n }\n if (review.state !== \"in_review\" && review.state !== \"chatting\") {\n throw reviewConflict(\n \"wrong_state\",\n review,\n `a reviewer can only decide a review it holds (got '${review.state}').`,\n );\n }\n if (review.revision !== req.revision) {\n throw reviewConflict(\n \"stale\",\n review,\n \"revision is stale; re-read the decision context and retry\",\n );\n }\n if (req.version !== undefined && review.version !== req.version) {\n throw reviewConflict(\n \"stale\",\n review,\n \"version is stale; re-read the decision context and retry\",\n );\n }\n\n const hopCount = this.state.reviewHopCounts.get(reviewId) ?? 0;\n const deadlineMs = new Date(review.created_at).getTime() + 86400 * 1000;\n const breakerTripped = hopCount >= 3 || Date.now() >= deadlineMs;\n\n if (req.action === \"approve\" || req.action === \"edit\") {\n if (req.action === \"edit\") {\n if (req.subject !== undefined) review.sent_subject = req.subject;\n if (req.body !== undefined) review.sent_body_text = req.body;\n }\n this.setReviewState(review, \"sent\");\n review.version += 1;\n review.sent_message_id = `<${rid(\"mid\")}@acme.test>`;\n // A BYO reviewer approve is still a delivery the COMPOSER has to learn about —\n // send_path is what tells the two release paths apart on the terminal nudge.\n review.send_path = \"reviewer_approved\";\n review.sent_at = now();\n review.updated_at = review.sent_at;\n this.state.reviews.set(reviewId, review);\n this.enqueueTerminalNudge(review);\n return { kind: \"sent\", review, sent: true, message_id: review.sent_message_id, sent_to_human: false };\n }\n\n // reject / escalate → the human queue (needs_review). A reject within budget bumps\n // hop_count and goes back to the composer; a tripped breaker FORCES the human.\n this.setReviewState(review, \"needs_review\");\n review.version += 1;\n if (req.feedback !== undefined) review.decision_feedback = req.feedback;\n review.updated_at = now();\n this.state.reviews.set(reviewId, review);\n\n let forcedByBreaker: string | undefined;\n if (req.action === \"reject\" && !breakerTripped) {\n this.state.reviewHopCounts.set(reviewId, hopCount + 1);\n } else if (req.action === \"reject\" && breakerTripped) {\n forcedByBreaker = hopCount >= 3 ? \"max_hops_reached\" : \"review_deadline_passed\";\n }\n return { kind: \"sent_to_human\", review, sent: false, sent_to_human: true, forced_by_breaker: forcedByBreaker };\n }\n\n // ---- Category registry (Review Loop, D9/D10) --------------------------\n\n /**\n * Browse the registry (mock), newest-first, excluding merged/soft-deleted. `match`\n * is a pure lexical filter (every token must appear in name+description) — NO LLM,\n * mirroring the server.\n */\n listCategories(params: ListCategoriesParams = {}): Page<Category> {\n let items = [...this.state.categories.values()]\n .filter((c) => !c.merged_into)\n .sort((a, b) => b.created_at.localeCompare(a.created_at));\n const tokens = (params.match ?? \"\").trim().toLowerCase().split(/\\s+/).filter(Boolean);\n if (tokens.length) {\n items = items.filter((c) => {\n const hay = `${c.name} ${c.description}`.toLowerCase();\n return tokens.every((t) => hay.includes(t));\n });\n }\n return { items, total: items.length };\n }\n\n /** Get one category (mock), or undefined when not found. */\n getCategory(categoryId: string): Category | undefined {\n return this.state.categories.get(categoryId);\n }\n\n /** Propose a category (mock): stands immediately, author_kind=agent (D9). */\n proposeCategory(req: ProposeCategoryRequest): Category {\n const name = req.name.trim();\n if (!name) {\n throw new ValidationError({ status: 400, code: \"invalid\", message: \"name is required\" });\n }\n const ts = now();\n const cat: Category = {\n id: rid(\"cat\"),\n name,\n description: (req.description ?? \"\").trim(),\n scope: req.scope ?? \"org_shared\",\n state: \"supervised\",\n created_by_agent_id: \"agt_mock\",\n author_kind: \"agent\",\n rule_high_water: 0,\n rules_version: 0,\n created_at: ts,\n updated_at: ts,\n };\n this.state.categories.set(cat.id, cat);\n return cat;\n }\n\n /** Rename / re-describe a category (mock) — metadata only (D10). */\n updateCategory(categoryId: string, req: UpdateCategoryRequest): Category | undefined {\n const cat = this.state.categories.get(categoryId);\n if (!cat) return undefined;\n if (req.name !== undefined) cat.name = req.name.trim();\n if (req.description !== undefined) cat.description = req.description.trim();\n cat.updated_at = now();\n this.state.categories.set(cat.id, cat);\n return cat;\n }\n\n // ---- Graduation + risk dial (Review Loop, D16/D6/D17) — agent READ + PROPOSE --\n\n /** The mock account-default risk dial (mirrors the server defaults). */\n private accountDial(): RiskDial[\"account\"] {\n return {\n min_confidence: 0.7,\n first_contact_gate: true,\n drift_demote_after: 3,\n canary_rate: 0.05,\n graduate_min_approvals: 20,\n graduate_min_age_hours: 24,\n auto_send_cap_per_day: 50,\n };\n }\n\n /**\n * Read the effective risk dial (mock): the account default + every category with an\n * inherited (null override) effective dial. The mock category carries no overrides,\n * so every category inherits — effective == account.\n */\n getRiskDial(): RiskDial {\n const account = this.accountDial();\n const categories = [...this.state.categories.values()]\n .filter((c) => !c.merged_into)\n .map((c) => ({\n category_id: c.id,\n min_confidence: null,\n first_contact_gate: null,\n drift_demote_after: null,\n canary_rate: null,\n graduate_min_approvals: null,\n graduate_min_age_hours: null,\n effective: { ...account },\n }));\n return { account, categories };\n }\n\n private nextGraduationState(state: Category[\"state\"]): string {\n if (state === \"supervised\") return \"auto_notify\";\n if (state === \"auto_notify\") return \"auto_silent\";\n return \"\";\n }\n\n /**\n * Read a category's graduation gate status (mock). The mock category has no\n * counters, so it reports zero clean approvals / zero drift against the account\n * defaults; can_graduate is true for supervised→auto_notify (no maturity gate).\n */\n getGraduationStatus(categoryId: string): GraduationStatus | undefined {\n const cat = this.state.categories.get(categoryId);\n if (!cat) return undefined;\n const dial = this.accountDial();\n const next = this.nextGraduationState(cat.state);\n const approvalsMet = 0 >= dial.graduate_min_approvals;\n const ageMet = false;\n const maturityMet = approvalsMet && ageMet;\n const canGraduate =\n next === \"auto_notify\" ? true : next === \"auto_silent\" ? maturityMet : false;\n return {\n category_id: cat.id,\n state: cat.state,\n next_state: next,\n never_graduate: false,\n clean_approval_count: 0,\n graduate_min_approvals: dial.graduate_min_approvals,\n approvals_met: approvalsMet,\n age_hours: 0,\n graduate_min_age_hours: dial.graduate_min_age_hours,\n age_met: ageMet,\n maturity_gate_met: maturityMet,\n drift_count: 0,\n drift_demote_after: dial.drift_demote_after,\n can_graduate: canGraduate,\n };\n }\n\n /**\n * Propose graduating a category (mock): returns the current gate status without\n * changing the category state (D16 — an agent can never flip the bit).\n */\n proposeGraduation(categoryId: string, _req: ProposeGraduationRequest): GraduationStatus | undefined {\n return this.getGraduationStatus(categoryId);\n }\n\n /**\n * Read the D19/§8 backlog-reconciliation status (mock): counts the QUEUED drafts in a\n * category that are stale vs current-enough against the current rules-version. The\n * mock has no per-draft composed_* stamps on its Review fixtures, so every queued\n * draft reads as current-enough (composed 0 vs current 0) — the contract shape is\n * exercised; the integer-compare logic is covered by the Go tests.\n */\n getScanBacklogStatus(categoryId: string): ScanBacklogStatus | undefined {\n const cat = this.state.categories.get(categoryId);\n if (!cat) return undefined;\n let queued = 0;\n for (const review of this.state.reviews.values()) {\n if (\n review.category_id === categoryId &&\n (review.state === \"needs_review\" ||\n review.state === \"in_review\" ||\n review.state === \"chatting\")\n ) {\n queued += 1;\n }\n }\n return {\n category_id: cat.id,\n state: cat.state,\n queued,\n current_enough: queued,\n stale: 0,\n current_category_rules_version: cat.rules_version,\n current_house_style_version: 0,\n staleness_tolerance: 0,\n };\n }\n\n /**\n * Read the demand-driven pacing state (mock — M7 Slice B/§8): the cursor + effective\n * window/ceiling/interval + each queued draft's classification. The mock has no cursor\n * (nothing reviewed) and no composed_* stamps, so every queued draft reads in-window-\n * fresh until the window fills, then ahead; the contract shape is exercised (the\n * cursor/staleness mechanics are covered by the Go tests).\n */\n getCategoryPacingState(categoryId: string): CategoryPacingState | undefined {\n const cat = this.state.categories.get(categoryId);\n if (!cat) return undefined;\n const lookaheadWindow = 3;\n const queuedIds: string[] = [];\n for (const review of this.state.reviews.values()) {\n if (\n review.category_id === categoryId &&\n (review.state === \"needs_review\" ||\n review.state === \"in_review\" ||\n review.state === \"chatting\")\n ) {\n queuedIds.push(review.id);\n }\n }\n const items: PacingItem[] = queuedIds.map((id, i) => ({\n review_id: id,\n state: i < lookaheadWindow ? \"in_window_fresh\" : \"ahead\",\n }));\n return {\n category_id: cat.id,\n cursor_advanced_count: 0,\n lookahead_window: lookaheadWindow,\n rework_batch_max: 10,\n nudge_min_interval_ms: 5000,\n queued: queuedIds.length,\n in_window: Math.min(queuedIds.length, lookaheadWindow),\n redrafting: 0,\n items,\n };\n }\n\n // ---- Writing rules + house-style + precedence ladder + audit/undo ------\n\n /** rank a rule for the §7 ladder (mock mirror of the server's deterministic order). */\n private ruleRank(r: Rule): number[] {\n const hard = r.kind === \"hard\" ? 1 : 0;\n const spec = r.scope_agent_id ? 2 : r.scope === \"category\" ? 1 : 0;\n const human = r.author_kind === \"human\" ? 1 : 0;\n return [hard, spec, human, r.rev, r.priority];\n }\n\n /** Get the ORDERED active rule set (mock) — §7 ladder + category-before-general. */\n getRules(params: GetRulesParams = {}): Page<Rule> {\n const active = [...this.state.rules.values()].filter((r) => r.status === \"active\");\n const byRank = (a: Rule, b: Rule): number => {\n const ra = this.ruleRank(a);\n const rb = this.ruleRank(b);\n for (let i = 0; i < ra.length; i += 1) {\n const da = ra[i] ?? 0;\n const db = rb[i] ?? 0;\n if (da !== db) return db - da;\n }\n return a.id < b.id ? -1 : 1;\n };\n let general: Rule[] = [];\n let category: Rule[] = [];\n if (!params.scope || params.scope === \"general\") {\n general = active.filter((r) => r.scope === \"general\").sort(byRank);\n }\n if (params.category_id && (!params.scope || params.scope === \"category\")) {\n category = active.filter((r) => r.scope === \"category\" && r.category_id === params.category_id).sort(byRank);\n }\n const items = [...category, ...general];\n return { items, total: items.length };\n }\n\n /** Save / edit a rule (mock) — append-only by supersession (D11). */\n saveRule(req: SaveRuleRequest): Rule {\n const text = req.rule_text.trim();\n if (!text) {\n throw new ValidationError({ status: 400, code: \"invalid\", message: \"rule_text is required\" });\n }\n const categoryId = (req.category_id ?? \"\").trim();\n const scope = req.scope ?? (categoryId ? \"category\" : \"general\");\n if (scope === \"general\" && categoryId) {\n throw new ValidationError({ status: 400, code: \"invalid\", message: \"scope=general forbids a category_id\" });\n }\n if (scope === \"category\" && !categoryId) {\n throw new ValidationError({ status: 400, code: \"invalid\", message: \"scope=category requires a category_id\" });\n }\n const ts = now();\n if (req.supersedes_id) {\n const prior = this.state.rules.get(req.supersedes_id);\n if (!prior) throw new NotFoundError({ status: 404, code: \"not_found\", message: \"rule not found\" });\n prior.status = \"superseded\";\n this.state.rules.set(prior.id, prior);\n const next: Rule = {\n ...prior,\n id: rid(\"rule\"),\n rev: prior.rev + 1,\n rule_text: text,\n kind: req.kind ?? prior.kind,\n priority: req.priority ?? prior.priority,\n status: \"active\",\n supersedes_id: prior.id,\n author_kind: \"agent\",\n created_at: ts,\n updated_at: ts,\n };\n this.state.rules.set(next.id, next);\n this.recordRuleAudit(\"supersede\", next.id, ruleSnapshotJSON(prior), ruleSnapshotJSON(next));\n return next;\n }\n const rule: Rule = {\n id: rid(\"rule\"),\n lineage_id: rid(\"rln\"),\n rev: 1,\n // Agent-plane saves are ALWAYS project-layer, bound to the key's project (an\n // agent cannot author org-layer / house-style rules in v1).\n rule_layer: \"project\",\n org_id: MOCK_ORG_ID,\n project_id: MOCK_PROJECT_ID,\n scope,\n category_id: scope === \"category\" ? categoryId : undefined,\n scope_agent_id: req.scope_agent_id || undefined,\n rule_text: text,\n kind: req.kind ?? \"soft\",\n priority: req.priority ?? 0,\n status: \"active\",\n author_kind: \"agent\",\n created_at: ts,\n updated_at: ts,\n };\n this.state.rules.set(rule.id, rule);\n this.recordRuleAudit(\"create\", rule.id, \"{}\", ruleSnapshotJSON(rule));\n return rule;\n }\n\n /** Promote a rule between layers (mock, via supersession), or undefined when unknown. */\n promoteRule(ruleId: string, toScope: \"general\" | \"category\"): Rule | undefined {\n const prior = this.state.rules.get(ruleId);\n if (!prior) return undefined;\n if (prior.scope === toScope) return prior;\n if (toScope === \"category\" && !prior.category_id) {\n throw new ValidationError({ status: 400, code: \"invalid\", message: \"promote to category needs a category\" });\n }\n prior.status = \"superseded\";\n this.state.rules.set(prior.id, prior);\n const ts = now();\n const next: Rule = {\n ...prior,\n id: rid(\"rule\"),\n lineage_id: rid(\"rln\"),\n rev: 1,\n scope: toScope,\n category_id: toScope === \"category\" ? prior.category_id : undefined,\n status: \"active\",\n supersedes_id: prior.id,\n author_kind: \"agent\",\n created_at: ts,\n updated_at: ts,\n };\n this.state.rules.set(next.id, next);\n this.recordRuleAudit(\"supersede\", next.id, ruleSnapshotJSON(prior), ruleSnapshotJSON(next));\n return next;\n }\n\n /** Retire a rule (mock) — soft delete, or undefined when unknown. */\n retireRule(ruleId: string): Rule | undefined {\n const rule = this.state.rules.get(ruleId);\n if (!rule) return undefined;\n if (rule.status === \"retired\") return rule;\n rule.status = \"retired\";\n rule.updated_at = now();\n this.state.rules.set(rule.id, rule);\n this.recordRuleAudit(\"retire\", rule.id, ruleSnapshotJSON(rule), ruleSnapshotJSON(rule));\n return rule;\n }\n\n /** Read the rule/category change audit log (mock). */\n getRuleAudit(params: GetRuleAuditParams = {}): Page<RuleAuditEntry> {\n let items = [...this.state.ruleAudit.values()].sort((a, b) => b.created_at.localeCompare(a.created_at));\n if (params.entity_kind) items = items.filter((e) => e.entity_kind === params.entity_kind);\n if (params.entity_id) items = items.filter((e) => e.entity_id === params.entity_id);\n return { items, total: items.length };\n }\n\n /** Undo a rule change (mock) — restore the prior version; idempotent (re-undo 409). */\n undoRuleChange(udoId: string): Rule {\n const entry = this.state.ruleAudit.get(udoId);\n if (!entry) throw new NotFoundError({ status: 404, code: \"not_found\", message: \"audit row not found\" });\n if (entry.entity_kind !== \"rule\") {\n throw new ValidationError({ status: 400, code: \"invalid\", message: \"only rule entities are restorable here\" });\n }\n if (entry.undone) throw new ConflictError({ status: 409, code: \"conflict\", message: \"already undone\" });\n const head = this.state.rules.get(entry.entity_id);\n if (!head) throw new NotFoundError({ status: 404, code: \"not_found\", message: \"rule head not found\" });\n entry.undone = true;\n this.state.ruleAudit.set(entry.id, entry);\n const before = JSON.parse(entry.before_json ?? \"{}\") as Partial<Rule>;\n head.status = \"superseded\";\n this.state.rules.set(head.id, head);\n const ts = now();\n const restored: Rule = {\n ...head,\n id: rid(\"rule\"),\n rev: head.rev + 1,\n rule_text: before.rule_text ?? head.rule_text,\n status: before.rule_text ? \"active\" : \"retired\",\n supersedes_id: head.id,\n created_at: ts,\n updated_at: ts,\n };\n this.state.rules.set(restored.id, restored);\n this.recordRuleAudit(\"restore\", restored.id, ruleSnapshotJSON(head), ruleSnapshotJSON(restored));\n return restored;\n }\n\n /** recordRuleAudit appends one change/undo audit row (mock). */\n private recordRuleAudit(action: RuleAuditEntry[\"action\"], entityId: string, before: string, after: string): void {\n const entry: RuleAuditEntry = {\n id: rid(\"udo\"),\n entity_kind: \"rule\",\n entity_id: entityId,\n action,\n actor_kind: \"agent\",\n actor_id: \"agent:agt_mock\",\n before_json: before,\n after_json: after,\n undone: false,\n created_at: now(),\n };\n this.state.ruleAudit.set(entry.id, entry);\n }\n\n /**\n * enqueueReviewEvent appends a durable nudge for a review with the next per-review\n * monotonic seq (mock mirror of the server's enqueue-on-transition).\n */\n private enqueueReviewEvent(\n reviewId: string,\n reason: ReviewEvent[\"reason\"],\n payload?: Record<string, unknown>,\n ): ReviewEvent {\n const list = this.state.reviewEvents.get(reviewId) ?? [];\n const last = list[list.length - 1];\n const review = this.state.reviews.get(reviewId);\n const ev: ReviewEvent = {\n seq: last ? last.seq + 1 : 1,\n id: rid(\"ndg\"),\n reason,\n review_id: reviewId,\n category_id: review?.category_id,\n payload,\n created_at: now(),\n };\n list.push(ev);\n this.state.reviewEvents.set(reviewId, list);\n return ev;\n }\n\n /**\n * Emit the terminal-class nudge for the review's current state. `sent` and\n * `cancelled` close the row. `failed` emits `send_failed`, and a later explicit\n * cancel emits `cancelled`; this helper deliberately does not claim the first is\n * the last event the review can produce.\n */\n private enqueueTerminalNudge(review: Review): ReviewEvent | undefined {\n switch (review.state) {\n case \"sent\":\n case \"auto_sent\": {\n const payload: Record<string, unknown> = {\n state: review.state,\n message_id: review.sent_message_id ?? \"\",\n send_path: review.send_path ?? \"\",\n sent_at: review.sent_at ?? now(),\n };\n if (review.state === \"sent\") {\n // `decision` is derived the same way the chat surface derives it, so an\n // agent reading the nudge and an agent reading the thread never disagree\n // about whether the reviewer edited its draft.\n payload.decision =\n review.sent_body_text || review.sent_subject || review.diff_unified\n ? \"edited\"\n : \"approved\";\n } else {\n payload.gate_outcome = review.gate_outcome ?? \"\";\n }\n return this.enqueueReviewEvent(review.id, \"sent\", payload);\n }\n case \"failed\":\n // agent_retryable is FALSE and next_action says compose a NEW message: the\n // only live edge out of failed is cancel, so telling an agent to retry a row\n // nobody can move is how a drain loop spins forever.\n return this.enqueueReviewEvent(review.id, \"send_failed\", {\n state: \"failed\",\n error: review.send_error ?? \"\",\n agent_retryable: false,\n next_action: \"compose_and_submit_a_new_message\",\n });\n case \"cancelled\":\n return this.enqueueReviewEvent(review.id, \"cancelled\", { state: \"cancelled\" });\n default:\n return undefined;\n }\n }\n\n /**\n * Enqueue `front_run_next` — the signal that the review reached a terminal state\n * while the agent was still trying to act on it.\n *\n * Deduped on (review, terminal state, parent revision) so a retry loop hitting\n * the same 409 collapses to ONE row rather than one per attempt. Best-effort by\n * design: it must never turn a 409 into a failure.\n */\n private enqueueFrontRunNudge(review: Review, parentRevision: number): void {\n const key = `frontrun:${review.id}:${review.state}:${parentRevision}`;\n const list = this.state.reviewEvents.get(review.id) ?? [];\n if (list.some((e) => e.reason === \"front_run_next\" && e.payload?.dedupe_key === key)) return;\n this.enqueueReviewEvent(review.id, \"front_run_next\", {\n dedupe_key: key,\n state: review.state,\n sent_message_id: review.sent_message_id,\n your_parent_revision: parentRevision,\n current_revision: review.revision,\n diff_available: (review.diff_unified ?? \"\").trim() !== \"\",\n });\n }\n\n /**\n * Mock-only: mirror a console/human approve that delivers the draft. The live\n * server does this on the console plane (never an SDK call); the hook exists so a\n * drain loop can be driven to its terminal `sent` event offline.\n */\n simulateReviewApproved(reviewId: string, opts: { edited?: boolean } = {}): Review | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n if (opts.edited) review.sent_body_text = review.proposed_body_text;\n this.setReviewState(review, \"sent\");\n review.version += 1;\n review.sent_message_id = `<${rid(\"mid\")}@acme.test>`;\n review.send_path = \"human_reviewed\";\n review.sent_at = now();\n review.updated_at = review.sent_at;\n this.state.reviews.set(reviewId, review);\n this.enqueueTerminalNudge(review);\n return review;\n }\n\n /**\n * Mock-only: mirror an approved draft whose delivery then FAILED at the provider.\n * This is the case the composing agent was previously never told about — the\n * console showed the error and the agent's queue stayed silent — so the loop test\n * that matters most drives this path.\n */\n simulateSendFailed(reviewId: string, error = \"provider rejected the message\"): Review | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n this.setReviewState(review, \"failed\");\n review.version += 1;\n review.send_error = error;\n review.updated_at = now();\n this.state.reviews.set(reviewId, review);\n this.enqueueTerminalNudge(review);\n return review;\n }\n\n /**\n * simulateReviewRejected is a mock-only test hook that mirrors a console reject:\n * it enqueues a `rejected` durable nudge to the composer so the realtime\n * drain/ack surface has a deterministic event to exercise offline. The live\n * server enqueues this on the reject TRANSITION (console-only, never an SDK call).\n */\n simulateReviewRejected(reviewId: string, comment = \"soften the tone\"): ReviewEvent {\n return this.enqueueReviewEvent(reviewId, \"rejected\", { decision: \"rejected\", comment });\n }\n\n /**\n * simulateReviewOpened is a mock-only test hook that mirrors a reviewer opening a\n * draft (needs_review -> in_review). There is no agent-plane \"open for review\"\n * call (a reviewer/human opens it), so tests of the M5 chat surface use this to get\n * a chattable draft offline.\n */\n simulateReviewOpened(reviewId: string): Review | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n this.setReviewState(review, \"in_review\");\n review.version += 1;\n review.updated_at = now();\n this.state.reviews.set(reviewId, review);\n return review;\n }\n\n /**\n * simulateHumanComment is a mock-only test hook that mirrors the console chat side-\n * panel: it appends a human_comment turn so get_review_feedback has a comment to\n * assemble. The live server writes this on the console plane (never an SDK call).\n */\n simulateHumanComment(reviewId: string, body: string): ReviewTurn | undefined {\n const review = this.state.reviews.get(reviewId);\n if (!review) return undefined;\n const turns = this.state.reviewTurns.get(reviewId) ?? [];\n const turn: ReviewTurn = {\n id: rid(\"turn\"),\n seq: turns.length + 1,\n turn_type: \"human_comment\",\n actor_kind: \"human\",\n actor_id: \"user_demo\",\n body,\n created_at: now(),\n };\n turns.push(turn);\n this.state.reviewTurns.set(reviewId, turns);\n return turn;\n }\n\n /** Drain the next un-acked review events (mock), FIFO per review + cursors. */\n listReviewEvents(params: ListReviewEventsParams = {}): ReviewEventsResult {\n const want = params.review_id?.trim();\n const events: ReviewEvent[] = [];\n const touched = new Set<string>();\n for (const [reviewId, list] of this.state.reviewEvents) {\n if (want && reviewId !== want) continue;\n const acked = this.state.reviewEventCursors.get(reviewId) ?? 0;\n for (const ev of list) {\n if (ev.seq > acked) {\n events.push(ev);\n touched.add(reviewId);\n }\n }\n }\n events.sort((a, b) => (a.review_id ?? \"\").localeCompare(b.review_id ?? \"\") || a.seq - b.seq);\n const limited = params.limit && params.limit > 0 ? events.slice(0, params.limit) : events;\n const cursors = [...touched].map((reviewId) => ({\n review_id: reviewId,\n last_acked_seq: this.state.reviewEventCursors.get(reviewId) ?? 0,\n }));\n return { events: limited, cursors };\n }\n\n /**\n * Long-poll for a review event (mock). Offline there is nothing to wait FOR, so it\n * returns the immediate drain (empty when caught up) — the server's \"empty on\n * timeout\" contract.\n */\n waitForReviewEvent(params: WaitForReviewEventParams = {}): ReviewEventsResult {\n return this.listReviewEvents({ review_id: params.review_id, limit: params.limit });\n }\n\n /** Ack review events (mock): advance per-review cursors monotonically. */\n ackReviewEvent(req: AckReviewEventRequest): AckReviewEventResult {\n const cursors: { review_id: string; last_acked_seq: number }[] = [];\n for (const a of req.acks ?? []) {\n const reviewId = a.review_id?.trim();\n if (!reviewId) continue;\n const prev = this.state.reviewEventCursors.get(reviewId) ?? 0;\n const next = Math.max(prev, a.through_seq); // monotonic (exactly-once effect)\n this.state.reviewEventCursors.set(reviewId, next);\n cursors.push({ review_id: reviewId, last_acked_seq: next });\n }\n return { cursors };\n }\n\n /** Mint a needs_review record + its intent (agent_note) and initial-draft turns. */\n private createReviewRecord(\n address: string,\n opts: {\n kind: \"send\" | \"reply\" | \"forward\";\n subject: string;\n text: string;\n html?: string;\n to: string[];\n cc?: string[];\n bcc?: string[];\n intent?: { summary: string; meta?: Record<string, unknown> };\n categoryId?: string;\n /** The mode the policy resolved. Every agent-plane send writes a row, direct included. */\n mode?: \"review\" | \"direct\";\n },\n ): Review {\n const id = rid(\"rr\");\n const created = now();\n const mode = opts.mode ?? \"review\";\n const review: Review = {\n id,\n state: \"needs_review\",\n mode,\n effective_mode: mode,\n closed: false,\n kind: opts.kind,\n from_address: address,\n agent_id: rid(\"agt\"),\n category_id: opts.categoryId,\n intent_summary: opts.intent?.summary ?? \"\",\n intent_meta: opts.intent?.meta,\n revision: 0,\n version: 0,\n proposed_subject: opts.subject,\n proposed_body_text: opts.text,\n proposed_body_html: opts.html,\n proposed_to: opts.to,\n proposed_cc: opts.cc,\n proposed_bcc: opts.bcc,\n created_at: created,\n updated_at: created,\n };\n this.state.reviews.set(id, review);\n const turns: ReviewTurn[] = [];\n if (opts.intent?.summary?.trim()) {\n turns.push({\n id: rid(\"turn\"),\n seq: turns.length + 1,\n turn_type: \"agent_note\",\n actor_kind: \"agent\",\n body: opts.intent.summary,\n metadata: { kind: \"intent\" },\n created_at: created,\n });\n }\n turns.push({\n id: rid(\"turn\"),\n seq: turns.length + 1,\n turn_type: \"agent_draft\",\n actor_kind: \"agent\",\n body: opts.text,\n revision: 0,\n created_at: created,\n });\n this.state.reviewTurns.set(id, turns);\n return review;\n }\n\n /** Append a message to an inbox's store and return it (mock helper). */\n private appendMessage(\n address: string,\n opts: {\n direction: Message[\"direction\"];\n from: string;\n to: string[];\n cc?: string[];\n subject: string;\n text: string;\n html?: string;\n threadId: string;\n attachments?: AttachmentInput[];\n },\n ): Message {\n const id = rid(\"msg\");\n const inbox = this.state.inboxes.get(address);\n const msg: Message = {\n id,\n thread_id: opts.threadId,\n inbox: inbox?.address ?? address,\n direction: opts.direction,\n from: inbox?.display_name\n ? { email: opts.from, name: inbox.display_name }\n : { email: opts.from },\n to: opts.to.map((email) => ({ email })),\n cc: (opts.cc ?? []).map((email) => ({ email })),\n subject: opts.subject,\n text: opts.text,\n html: opts.html ?? null,\n extracted_text: opts.text.trim() || null,\n extracted_html: opts.html?.trim() || null,\n message_id: `<${id}@${address.split(\"@\")[1] ?? SHARED_SUBDOMAIN}>`,\n folder: opts.direction === \"inbound\" ? \"INBOX\" : \"Sent\",\n seen: opts.direction === \"outbound\",\n date: now(),\n };\n const arr = this.state.messages.get(address) ?? [];\n arr.push(msg);\n this.state.messages.set(address, arr);\n if (opts.direction === \"inbound\") this.emitEvent(\"message.received\", msg);\n if (opts.attachments && opts.attachments.length > 0) {\n const stored: StoredAttachment[] = opts.attachments.map((a, i) => ({\n meta: {\n id: `att_${i + 1}_${id}`,\n filename: a.filename,\n content_type: a.content_type || \"application/octet-stream\",\n size: base64ByteLength(a.content_base64),\n },\n content_base64: a.content_base64,\n }));\n this.state.attachments.set(id, stored);\n }\n return msg;\n }\n\n /** List a message's attachment metadata (mirrors the list endpoint). */\n listAttachments(messageId: string): Page<Attachment> {\n this.getMessage(messageId); // throws if the message does not exist\n const items = (this.state.attachments.get(messageId) ?? []).map((a) => a.meta);\n return { items, total: items.length };\n }\n\n /** Fetch one attachment's bytes + metadata (mirrors the download endpoint). */\n getAttachment(messageId: string, attachmentId: string): AttachmentDownload {\n const stored = (this.state.attachments.get(messageId) ?? []).find(\n (a) => a.meta.id === attachmentId,\n );\n if (!stored) throw new Error(`attachment not found: ${attachmentId}`);\n return {\n filename: stored.meta.filename,\n content_type: stored.meta.content_type,\n content_base64: stored.content_base64,\n };\n }\n\n listMessages(address: string, params: ListMessagesParams = {}): Page<Message> {\n address = this.addrOf(address);\n let items = [...(this.state.messages.get(address) ?? [])].sort((a, b) =>\n b.date.localeCompare(a.date),\n );\n if (params.unread) items = items.filter((m) => !m.seen);\n if (params.from) {\n const q = params.from.toLowerCase();\n items = items.filter((m) => m.from.email.toLowerCase().includes(q));\n }\n if (params.to) {\n const q = params.to.toLowerCase();\n items = items.filter((m) => m.to.some((a) => a.email.toLowerCase().includes(q)));\n }\n if (params.subject) {\n const q = params.subject.toLowerCase();\n items = items.filter((m) => m.subject.toLowerCase().includes(q));\n }\n const total = items.length;\n const offset = params.offset ?? (params.cursor ? Number(params.cursor) : 0);\n const limit = params.limit ?? 25;\n const page = items.slice(offset, offset + limit);\n const result: Page<Message> = { items: page, total };\n if (offset + page.length < total) result.next_cursor = String(offset + page.length);\n return result;\n }\n\n /** Fetch a single message by id across all inboxes. */\n getMessage(messageId: string): Message {\n for (const msgs of this.state.messages.values()) {\n const found = msgs.find((m) => m.id === messageId);\n if (found) return found;\n }\n throw new Error(`message not found: ${messageId}`);\n }\n\n /** Toggle the \\Seen flag for a message by id. */\n markRead(messageId: string, read: boolean): Message {\n const msg = this.getMessage(messageId);\n msg.seen = read;\n return msg;\n }\n\n /** Render a minimal RFC822 .eml for a message by id (mirrors the raw endpoint). */\n getMessageRaw(messageId: string): string {\n const m = this.getMessage(messageId);\n const to = m.to.map((a) => a.email).join(\", \");\n const from = m.from.name ? `${m.from.name} <${m.from.email}>` : m.from.email;\n const body = m.text ?? m.html ?? \"\";\n const contentType = m.text !== null ? \"text/plain\" : \"text/html\";\n return [\n `From: ${from}`,\n `To: ${to}`,\n `Subject: ${m.subject}`,\n `Message-ID: ${m.message_id}`,\n `Date: ${m.date}`,\n \"MIME-Version: 1.0\",\n `Content-Type: ${contentType}; charset=utf-8`,\n \"\",\n body,\n \"\",\n ].join(\"\\r\\n\");\n }\n\n /** Full-text search scoped to one inbox. */\n searchMessages(address: string, params: SearchMessagesParams): Page<Message> {\n address = this.addrOf(address);\n const q = params.q.toLowerCase();\n const items = [...(this.state.messages.get(address) ?? [])]\n .filter(\n (m) =>\n m.subject.toLowerCase().includes(q) ||\n [m.text, m.html]\n .filter((part): part is string => typeof part === \"string\" && part.length > 0)\n .join(\"\\n\")\n .toLowerCase()\n .includes(q) ||\n m.from.email.toLowerCase().includes(q),\n )\n .sort((a, b) => b.date.localeCompare(a.date));\n const total = items.length;\n const offset = params.offset ?? (params.cursor ? Number(params.cursor) : 0);\n const limit = params.limit ?? 25;\n const page = items.slice(offset, offset + limit);\n const result: Page<Message> = { items: page, total };\n if (offset + page.length < total) result.next_cursor = String(offset + page.length);\n return result;\n }\n\n listThreads(address: string): Page<Thread> {\n address = this.addrOf(address);\n const items = this.threadsFor(address);\n return { items, total: items.length };\n }\n\n /** Thread-level search (subject / snippet / participant substring). */\n searchThreads(address: string, params: SearchMessagesParams): Page<Thread> {\n address = this.addrOf(address);\n const q = params.q.toLowerCase();\n const items = this.threadsFor(address).filter(\n (t) =>\n t.subject.toLowerCase().includes(q) ||\n t.snippet.toLowerCase().includes(q) ||\n t.participants.join(\" \").toLowerCase().includes(q),\n );\n return { items, total: items.length };\n }\n\n /** Fetch one thread (with messages, oldest-first) by id under an inbox. */\n getThread(address: string, threadId: string): ThreadDetail {\n address = this.addrOf(address);\n const messages = (this.state.messages.get(address) ?? [])\n .filter((m) => m.thread_id === threadId)\n .sort((a, b) => a.date.localeCompare(b.date));\n if (messages.length === 0) throw new Error(`thread not found: ${threadId}`);\n return { ...this.buildThread(address, threadId, messages), messages };\n }\n\n /**\n * Delete a message by id: move it to Trash (soft) or remove it (expunge / it\n * already lives in Trash). Returns undefined when the inbox/message is unknown\n * so the transport can surface a 404.\n */\n deleteMessage(address: string, messageId: string, expunge: boolean): DeleteResult | undefined {\n address = this.addrOf(address);\n if (!this.getInbox(address)) return undefined;\n const msgs = this.state.messages.get(address) ?? [];\n const msg = msgs.find((m) => m.id === messageId);\n if (!msg) return undefined;\n const hard = expunge || msg.folder === \"Trash\";\n if (hard) {\n this.state.messages.set(address, msgs.filter((m) => m.id !== messageId));\n } else {\n msg.folder = \"Trash\";\n }\n return { id: messageId, deleted: true, expunged: hard, count: 1 };\n }\n\n /** Delete every message in a thread by id (move to Trash or expunge). */\n deleteThread(address: string, threadId: string, expunge: boolean): DeleteResult | undefined {\n address = this.addrOf(address);\n if (!this.getInbox(address)) return undefined;\n const msgs = this.state.messages.get(address) ?? [];\n const inThread = msgs.filter((m) => m.thread_id === threadId);\n if (inThread.length === 0) return undefined;\n if (expunge) {\n this.state.messages.set(address, msgs.filter((m) => m.thread_id !== threadId));\n } else {\n for (const m of inThread) m.folder = \"Trash\";\n }\n return { id: threadId, deleted: true, expunged: expunge, count: inThread.length };\n }\n\n /**\n * Batch mark read/unread and/or move folder for a list of ids under one inbox.\n * Unknown ids go in `failed`. Returns undefined when the inbox is unknown.\n */\n batchUpdateMessages(\n address: string,\n ids: string[],\n read: boolean | undefined,\n folder: string | undefined,\n ): BatchUpdateResult | undefined {\n address = this.addrOf(address);\n if (!this.getInbox(address)) return undefined;\n const byId = new Map((this.state.messages.get(address) ?? []).map((m) => [m.id, m]));\n const updated: string[] = [];\n const failed: string[] = [];\n for (const id of ids) {\n const m = byId.get(id);\n if (!m) {\n failed.push(id);\n continue;\n }\n if (read !== undefined) m.seen = read;\n if (folder) m.folder = folder;\n updated.push(id);\n }\n return { updated, failed };\n }\n\n /** Build all threads for an inbox, newest-active first. */\n private threadsFor(address: string): Thread[] {\n const byThread = new Map<string, Message[]>();\n for (const m of this.state.messages.get(address) ?? []) {\n const arr = byThread.get(m.thread_id) ?? [];\n arr.push(m);\n byThread.set(m.thread_id, arr);\n }\n const items = [...byThread.entries()].map(([id, ms]) => this.buildThread(address, id, ms));\n items.sort((a, b) => b.last_message_at.localeCompare(a.last_message_at));\n return items;\n }\n\n private buildThread(address: string, id: string, ms: Message[]): Thread {\n const sorted = [...ms].sort((a, b) => a.date.localeCompare(b.date));\n const last = sorted[sorted.length - 1]!;\n const seen = new Set<string>();\n const participants: string[] = [];\n for (const m of sorted) {\n for (const a of [m.from, ...m.to]) {\n const key = a.email.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n participants.push(a.name ? `${a.name} <${a.email}>` : a.email);\n }\n }\n return {\n id,\n inbox_id: this.state.inboxes.get(address)?.address ?? address,\n subject: normalizeThreadSubject(sorted[0]?.subject ?? \"(no subject)\"),\n participants,\n message_count: sorted.length,\n last_message_at: last.date,\n snippet: (last.text ?? last.html ?? \"\").slice(0, 120),\n };\n }\n\n /**\n * Mock wait_for_email: synthesizes a plausible OTP email after a short delay so the OTP example\n * runs end-to-end offline. The live implementation waits through the platform receive path.\n */\n async waitForEmail(address: string, req: WaitForEmailRequest): Promise<WaitForEmailResult> {\n address = this.addrOf(address);\n const inbox = this.state.inboxes.get(address);\n const match = req.match ? compileWaitRegex(req.match) : undefined;\n const delayMs = Math.min(400, (req.timeout_seconds ?? 300) * 1000);\n await new Promise((r) => setTimeout(r, delayMs));\n const code = String(Math.floor(100000 + Math.random() * 900000));\n const from = req.from ?? \"no-reply@acme.test\";\n const text = `Your Acme verification code is ${code}. It expires in 10 minutes.\\n\\nOr verify here: https://acme.test/verify?token=${rid(\"vt\")}`;\n const subject = req.subject ?? \"Your verification code\";\n if (match && !match.test(`${subject}\\n${text}`)) {\n return { timed_out: true, message: null, extracted: { otp: null, link: null } };\n }\n const message: Message = {\n id: rid(\"msg\"),\n thread_id: rid(\"thr\"),\n inbox: inbox?.address ?? address,\n direction: \"inbound\",\n from: { email: from, name: \"Acme\" },\n to: [{ email: address }],\n cc: [],\n subject,\n text,\n html: `<p>${text.replace(/\\n/g, \"<br/>\")}</p>`,\n extracted_text: text,\n extracted_html: `<p>${text.replace(/\\n/g, \"<br/>\")}</p>`,\n message_id: `<${rid(\"mid\")}@acme.test>`,\n folder: \"INBOX\",\n seen: false,\n date: now(),\n };\n const existing = this.state.messages.get(address) ?? [];\n existing.push(message);\n this.state.messages.set(address, existing);\n this.emitEvent(\"message.received\", message);\n return { timed_out: false, message, extracted: extractCredentials(message) };\n }\n\n /**\n * Append one event to the in-memory journal that backs the SSE stream. Mirrors\n * the server: a monotonic seq is the resume token and the payload is the same\n * envelope a webhook delivers.\n */\n private emitEvent(event: string, message: Message): void {\n const seq = ++this.state.eventSeq;\n this.state.events.push({\n event,\n seq,\n id: rid(\"evt\"),\n created_at: now(),\n inbox: message.inbox,\n message,\n });\n }\n\n /**\n * Replay journal events after `lastEventId`, scoped to one inbox (or all when\n * `address` is null). The offline mock yields the backlog and returns; the live\n * transport tails an open connection. Both honor the same resume contract.\n */\n async *streamEvents(\n address: string | null,\n lastEventId?: number,\n ): AsyncGenerator<StreamEvent, void, unknown> {\n const after = lastEventId ?? 0;\n // Events are keyed by the canonical address; normalize an id ref to it so a\n // handle that streams by its opaque id still matches its own events.\n const scope = address === null ? null : this.addrOf(address);\n for (const ev of this.state.events) {\n if (ev.seq <= after) continue;\n if (scope !== null && ev.inbox !== scope) continue;\n yield ev;\n }\n }\n\n registerWebhook(req: RegisterWebhookRequest): Webhook {\n // Idempotency replay: a repeat with the same client_id returns the first row.\n if (req.client_id) {\n const existingId = this.state.webhookByClientId.get(req.client_id);\n const existing = existingId ? this.state.webhooks.get(existingId) : undefined;\n if (existing) return { ...existing };\n }\n const id = rid(\"wh\");\n const webhook: Webhook = {\n id,\n url: req.url,\n events: req.events ?? [\"message.received\"],\n inbox: req.inbox ?? null,\n agent_id: this.state.agents.keys().next().value ?? \"agt_mock\",\n secret: `whsec_${rid(\"s\").slice(2)}${rid(\"s\").slice(2)}`,\n secret_prefix: `whsec_${rid(\"s\").slice(2, 6)}`,\n active: true,\n created_at: now(),\n };\n this.state.webhooks.set(id, webhook);\n if (req.client_id) this.state.webhookByClientId.set(req.client_id, id);\n // Return the create shape (with secret); stored copy keeps it for parity.\n return { ...webhook };\n }\n\n /** List registered webhooks (secret redacted, mirroring the server). */\n listWebhooks(): Page<Webhook> {\n const items = [...this.state.webhooks.values()].map((w) => redactSecret(w));\n return { items, total: items.length };\n }\n\n /** Get one webhook by id (secret redacted), or undefined when missing. */\n getWebhook(webhookId: string): Webhook | undefined {\n const w = this.state.webhooks.get(webhookId);\n return w ? redactSecret(w) : undefined;\n }\n\n /**\n * Update a webhook in place (secret redacted), or undefined when missing.\n * Every field is optional; an unset field leaves the stored value untouched\n * (PATCH semantics). An empty-string `inbox` clears the filter.\n */\n updateWebhook(webhookId: string, req: UpdateWebhookRequest): Webhook | undefined {\n const w = this.state.webhooks.get(webhookId);\n if (!w) return undefined;\n if (req.url !== undefined) w.url = req.url;\n if (req.events !== undefined) {\n w.events = req.events.length ? req.events : [\"message.received\"];\n }\n if (req.inbox !== undefined) w.inbox = req.inbox === \"\" ? null : req.inbox;\n if (req.active !== undefined) w.active = req.active;\n this.state.webhooks.set(webhookId, w);\n return redactSecret(w);\n }\n\n /** Delete a webhook by id; returns false when it was not found. */\n deleteWebhook(webhookId: string): boolean {\n return this.state.webhooks.delete(webhookId);\n }\n\n // ---- contact allow/block lists (Slice 3) ------------------------------\n\n /** Add one allow/block entry scoped to an inbox, or undefined when the inbox is unknown. */\n addContactListEntry(address: string, req: AddContactListRequest): ContactListEntry | undefined {\n address = this.addrOf(address);\n if (!this.state.inboxes.has(address)) return undefined;\n const entry: ContactListEntry = {\n id: rid(\"lst\"),\n inbox: address,\n kind: req.kind,\n direction: req.direction ?? \"send\",\n pattern: normalizeContactPattern(req.pattern),\n created_at: now(),\n };\n this.state.contactLists.set(entry.id, entry);\n return { ...entry };\n }\n\n /** List the entries governing an inbox (inbox-specific + account-wide), or undefined when unknown. */\n listContactLists(address: string): Page<ContactListEntry> | undefined {\n address = this.addrOf(address);\n if (!this.state.inboxes.has(address)) return undefined;\n const items = [...this.state.contactLists.values()].filter(\n (e) => e.inbox === null || e.inbox === address,\n );\n return { items, total: items.length };\n }\n\n /** Delete a contact-list entry by id; returns false when it was not found. */\n deleteContactListEntry(_address: string, entryId: string): boolean {\n return this.state.contactLists.delete(entryId);\n }\n\n // ---- domains (Slice 5) ------------------------------------------------\n\n /** Onboard a domain, mirroring the server's per-mode record set + status. Idempotent on the name. */\n onboardDomain(req: OnboardDomainRequest): Domain {\n // project_id is an assertion (never a selector): a mismatch is 403. The domain's\n // project binding is always derived from the key, not from client input.\n assertProjectMatch(req.project_id);\n const name = req.domain.trim().toLowerCase();\n const existing = this.state.domains.get(name);\n if (existing) return { ...existing };\n const mode = req.mode ?? \"ns_delegated\";\n const domain: Domain = {\n id: rid(\"dom\"),\n domain: name,\n mode,\n verification_status:\n mode === \"shared\" ? \"verified\" : mode === \"manual\" ? \"pending\" : \"verifying\",\n dkim_status: mode === \"shared\" ? \"configured\" : mode === \"manual\" ? \"pending\" : \"configured\",\n shared: mode === \"shared\",\n created_at: now(),\n records: mode === \"manual\" || mode === \"ns_delegated\" ? domainRecordSet(name) : undefined,\n delegation_ns: mode === \"ns_delegated\" ? domainDelegationNS(name) : undefined,\n instruction:\n mode === \"shared\"\n ? \"Shared domain ready. No DNS changes required.\"\n : \"Add the records, then trigger verification.\",\n };\n this.state.domains.set(name, domain);\n return { ...domain };\n }\n\n /** List onboarded domains (records omitted on the summary, mirroring the server). */\n listDomains(): Page<Domain> {\n const items = [...this.state.domains.values()].map((d) => domainSummary(d));\n return { items, total: items.length };\n }\n\n /** Get one domain's detail + the records to set, inline; undefined when absent. */\n getDomain(domain: string): Domain | undefined {\n const d = this.state.domains.get(domain.trim().toLowerCase());\n return d ? { ...d } : undefined;\n }\n\n /** Trigger/refresh verification; returns the (re-read) detail, or undefined when absent. */\n verifyDomain(domain: string): Domain | undefined {\n const d = this.state.domains.get(domain.trim().toLowerCase());\n return d ? { ...d } : undefined;\n }\n\n /**\n * Offboard (remove) a domain; returns false when it was not found. Also\n * records a synthetic succeeded teardown job under `job-offboard-<domain>`\n * (there is no job runner in the mock) so a subsequent {@link getJob} poll\n * resolves the same way the live transport's async contract would.\n */\n offboardDomain(domain: string): boolean {\n const name = domain.trim().toLowerCase();\n const found = this.state.domains.delete(name);\n if (found) {\n const ts = now();\n this.state.jobs.set(`job-offboard-${name}`, {\n object: \"job\",\n id: `job-offboard-${name}`,\n type: \"domain_offboard\",\n status: \"succeeded\",\n created_at: ts,\n updated_at: ts,\n finished_at: ts,\n });\n }\n return found;\n }\n\n /** Get one async job's poll status; undefined when the id is unknown. */\n getJob(jobId: string): Job | undefined {\n const job = this.state.jobs.get(jobId);\n return job ? { ...job } : undefined;\n }\n\n // ---- suppressions (recipient opt-outs / list-unsubscribe) --------------\n\n /**\n * Pre-check whether the caller's org suppresses a recipient (mirrors\n * `GET /v1/suppressions?recipient=…`). Returns `{recipient, suppressed, rows}`\n * over the active (non-revoked) org rows for that canonicalized recipient.\n */\n precheckSuppression(recipient: string): SuppressionPrecheck {\n const canonical = canonicalRecipient(recipient);\n const rows = [...this.state.suppressions.values()]\n .filter((s) => !s.revoked && s.recipient === canonical)\n .map((s) => ({ ...s }));\n return { recipient: canonical, suppressed: rows.length > 0, rows };\n }\n\n /** List the caller's own org suppression rows (mirrors the paged `GET /v1/suppressions`). */\n listSuppressions(params: ListSuppressionsParams): Page<SuppressionEntry> {\n let rows = [...this.state.suppressions.values()];\n if (params.scope) rows = rows.filter((s) => s.scope === params.scope);\n if (!params.include_revoked) rows = rows.filter((s) => !s.revoked);\n rows.sort((a, b) => b.created_at.localeCompare(a.created_at));\n const total = rows.length;\n const offset = params.cursor ? Math.max(0, Number.parseInt(params.cursor, 10) || 0) : 0;\n const limit = params.limit ?? 50;\n const items = rows.slice(offset, offset + limit).map((s) => ({ ...s }));\n const page: Page<SuppressionEntry> = { items, total };\n if (offset + items.length < total) page.next_cursor = String(offset + items.length);\n return page;\n }\n\n /**\n * Revoke one org-scope suppression row (mirrors `POST /v1/suppressions/{id}/revoke`).\n * A reason is required (the caller validates too). Returns the updated row, or\n * undefined when the id is unknown / not the caller's own org row.\n */\n revokeSuppression(id: string, reason: string): SuppressionEntry | undefined {\n const row = this.state.suppressions.get(id);\n // Only a non-revoked org row is revocable by the agent plane (global/shared rows\n // are platform-operator only and appear as an indistinguishable 404 here).\n if (!row || row.scope !== \"org\" || row.revoked) return undefined;\n row.revoked = true;\n row.revoked_at = now();\n row.revoked_by = \"agent:agt_mock\";\n row.revoke_reason = reason;\n this.state.suppressions.set(id, row);\n return { ...row };\n }\n\n /**\n * Reject the WHOLE send if ANY recipient has an active org-scope suppression,\n * naming exactly the suppressed addresses (never the scope/origin) so the caller\n * can drop them and retry — mirroring the live `recipient_suppressed` (422) path.\n */\n private enforceSuppression(recipients: string[]): void {\n const active = new Set(\n [...this.state.suppressions.values()].filter((s) => !s.revoked).map((s) => s.recipient),\n );\n if (active.size === 0) return;\n const hit: string[] = [];\n for (const rcpt of recipients) {\n const canonical = canonicalRecipient(rcpt);\n if (canonical && active.has(canonical) && !hit.includes(canonical)) hit.push(canonical);\n }\n if (hit.length === 0) return;\n throw new RecipientSuppressedError({\n status: 422,\n code: \"recipient_suppressed\",\n message: `${hit.length} recipient(s) have opted out (recipient_suppressed)`,\n problem: {\n type: \"https://extrovert.dev/problems/recipient_suppressed\",\n title: \"Recipient Suppressed\",\n status: 422,\n code: \"recipient_suppressed\",\n detail: \"One or more recipients have opted out; remove them and retry.\",\n errors: hit.map((r) => ({ field: \"recipient\", code: \"recipient_suppressed\", detail: r })),\n },\n });\n }\n\n /**\n * Enforce the send-direction contact lists for an inbox: reject a block-listed\n * recipient, or any recipient outside the allowlist when allowlist mode is on.\n * Throws a {@link PermissionError} (403) to mirror the real API.\n */\n private enforceSendPolicy(from: string, recipients: string[]): void {\n const entries = [...this.state.contactLists.values()].filter(\n (e) => e.direction === \"send\" && (e.inbox === null || e.inbox === from),\n );\n if (entries.length === 0) return;\n const blocks = entries.filter((e) => e.kind === \"block\");\n const allows = entries.filter((e) => e.kind === \"allow\");\n for (const rcpt of recipients) {\n const addr = normalizeContactPattern(rcpt);\n if (!addr) continue;\n if (blocks.some((b) => contactEntryMatches(b.pattern, addr))) {\n throw new PermissionError({\n status: 403,\n code: \"recipient_blocked\",\n message: `${rcpt} is block-listed`,\n });\n }\n if (allows.length > 0 && !allows.some((a) => contactEntryMatches(a.pattern, addr))) {\n throw new PermissionError({\n status: 403,\n code: \"recipient_blocked\",\n message: `${rcpt} is not on the allow list`,\n });\n }\n }\n }\n}\n\n/**\n * Canonicalize a recipient address for suppression matching: pull the address out\n * of a \"Name <addr>\" form, NFC-normalize, trim, and lower-case (mirrors the Go\n * canonicalization closely enough for the offline mock).\n */\nfunction canonicalRecipient(raw: string): string {\n let value = raw.trim();\n const m = value.match(/<([^>]+)>/);\n if (m && m[1]) value = m[1];\n return value.normalize(\"NFC\").trim().toLowerCase();\n}\n\n/**\n * Normalize a contact pattern or recipient: lower-case/trim, pull the address out\n * of a \"Name <addr>\" form, and strip a leading \"@\" from a domain pattern.\n */\nfunction normalizeContactPattern(raw: string): string {\n let value = raw.trim();\n const m = value.match(/<([^>]+)>/);\n if (m && m[1]) value = m[1];\n value = value.trim().toLowerCase();\n return value.startsWith(\"@\") ? value.slice(1) : value;\n}\n\n/**\n * Match a normalized pattern against a normalized recipient address. A pattern\n * with an \"@\" is a full-address match; a bare domain matches any address in it.\n */\nfunction contactEntryMatches(pattern: string, addr: string): boolean {\n if (!pattern || !addr) return false;\n if (pattern.includes(\"@\")) return pattern === addr;\n const at = addr.lastIndexOf(\"@\");\n const domain = at >= 0 ? addr.slice(at + 1) : addr;\n return domain === pattern;\n}\n\n/** Drop the one-time signing secret from a stored webhook for read responses. */\nfunction redactSecret(w: Webhook): Webhook {\n const { secret: _omit, ...rest } = w;\n return rest;\n}\n\n/** The MX/SPF/DMARC/DKIM record set a customer must set (mirrors the Go manualRecordSet). */\nfunction domainRecordSet(domain: string): DomainRecord[] {\n const dkimSuffix = domain.replace(/\\./g, \"-\");\n return [\n { name: domain, type: \"MX\", value: \"smtp.extrovert.dev\", priority: 10, ttl: 3600 },\n { name: domain, type: \"TXT\", value: \"v=spf1 include:spf.protection.outlook.com -all\", ttl: 3600 },\n { name: `_dmarc.${domain}`, type: \"TXT\", value: \"v=DMARC1; p=none; rua=mailto:dmarc@smtp.extrovert.dev\", ttl: 3600 },\n { name: `selector1._domainkey.${domain}`, type: \"CNAME\", value: `selector1-${dkimSuffix}._domainkey.azurecomm.net`, ttl: 3600 },\n { name: `selector2._domainkey.${domain}`, type: \"CNAME\", value: `selector2-${dkimSuffix}._domainkey.azurecomm.net`, ttl: 3600 },\n ];\n}\n\n/** The single NS delegation (one row per public nameserver) for ns_delegated mode. */\nfunction domainDelegationNS(domain: string): DomainRecord[] {\n return [\n { name: domain, type: \"NS\", value: \"ns1.extrovert.dev\", ttl: 300 },\n { name: domain, type: \"NS\", value: \"ns2.extrovert.dev\", ttl: 300 },\n ];\n}\n\n/** The list-view summary: status fields without the inline record set. */\nfunction domainSummary(d: Domain): Domain {\n const { records: _r, delegation_ns: _d, instruction: _i, ...rest } = d;\n return rest;\n}\n\nfunction reSubject(subject: string): string {\n return /^re:/i.test(subject) ? subject : `Re: ${normalizeThreadSubject(subject)}`;\n}\n\nfunction fwdSubject(subject: string): string {\n return /^fwd?:/i.test(subject) ? subject : `Fwd: ${normalizeThreadSubject(subject)}`;\n}\n\n/** Strip leading Re:/Fwd: prefixes for a thread's display subject. */\nfunction normalizeThreadSubject(subject: string): string {\n let s = subject.trim();\n for (;;) {\n const next = s.replace(/^(re|fwd|fw)\\s*:\\s*/i, \"\");\n if (next === s) break;\n s = next;\n }\n return s.trim();\n}\n\nfunction compileWaitRegex(pattern: string): RegExp {\n const explicitInsensitive = pattern.startsWith(\"(?i)\");\n const source = explicitInsensitive ? pattern.slice(4) : pattern;\n return new RegExp(source, explicitInsensitive ? \"i\" : undefined);\n}\n\n/** Decoded byte length of a base64 string (mirrors the Go-reported size). */\nfunction base64ByteLength(b64: string): number {\n const clean = b64.replace(/[\\r\\n\\s]/g, \"\");\n if (clean.length === 0) return 0;\n const padding = clean.endsWith(\"==\") ? 2 : clean.endsWith(\"=\") ? 1 : 0;\n return Math.floor((clean.length * 3) / 4) - padding;\n}\n","/**\n * `?include=` relation expansion typing (redesign §5.5 / §6.2).\n *\n * Reads may expand a per-resource allowlist of relations (depth ≤ 2); the server\n * re-applies the same ceiling/ownership filter to every expanded child. The SDK\n * types the allowed relations per resource so a caller cannot ask for a relation the\n * server would reject with 400 `bad_request`, and serializes the list as the\n * comma-separated `?include=` value.\n */\n\n/** Relations the `inbox` resource may expand (`?include=agent,domain`). */\nexport type InboxInclude = \"agent\" | \"domain\";\n\n/** Relations the `review` resource may expand (`?include=category,turns`). */\nexport type ReviewInclude = \"category\" | \"turns\";\n\n/** Serialize an include list into the comma-separated `?include=` query value. */\nexport function serializeInclude(include?: readonly string[]): string | undefined {\n if (!include || include.length === 0) return undefined;\n return include.join(\",\");\n}\n","/**\n * Transport abstraction.\n *\n * The resource methods speak a small, typed RPC surface; a transport decides whether each call hits\n * the live Extrovert API over HTTP or the offline {@link MockBackend}. This is the single mock seam:\n * flip `transport: \"mock\"` (or `EXTROVERT_API_BASE_URL=mock`) and the whole SDK runs without a network.\n *\n * `HttpTransport` is used for the live API; the mock stays for examples, docs, and tests.\n */\n\nimport { HttpClient, type BinaryResponse, type RequestOptions } from \"./http.js\";\nimport { MockBackend } from \"./fixtures.js\";\nimport { NotFoundError, ValidationError } from \"./errors.js\";\nimport type { List } from \"./pagination.js\";\nimport { serializeInclude } from \"./include.js\";\nimport { toWireArray } from \"./recipients.js\";\nimport type {\n AddContactListRequest,\n Attachment,\n BatchUpdateMessagesRequest,\n BatchUpdateResult,\n Category,\n ContactListEntry,\n AckReviewEventRequest,\n AckReviewEventResult,\n CreateInboxRequest,\n DeleteResult,\n Domain,\n DomainOffboard,\n EnrollRequest,\n EnrollResponse,\n ForwardRequest,\n GetInboxParams,\n Inbox,\n InboxCredentials,\n Job,\n OnboardDomainRequest,\n ListCategoriesParams,\n ListInboxesParams,\n ProjectInboxListParams,\n ListMessagesParams,\n ListReviewEventsParams,\n ListReviewsParams,\n ProposeCategoryRequest,\n ProposeGraduationRequest,\n UpdateCategoryRequest,\n GetRulesParams,\n GetRuleAuditParams,\n GraduationStatus,\n RiskDial,\n Rule,\n RuleAuditEntry,\n SaveRuleRequest,\n ListThreadsParams,\n MarkReadRequest,\n Message,\n Page,\n PostReviewChatRequest,\n RegisterWebhookRequest,\n ReplyRequest,\n CategoryPacingState,\n RestampReviewRequest,\n Review,\n ReviewDecisionContext,\n ReviewerDecisionRequest,\n ReviewerDecisionResult,\n ReviewEventsResult,\n ReviewFeedback,\n ReviewTurn,\n ScanBacklogStatus,\n SearchMessagesParams,\n SendOutcome,\n SendRequest,\n SignUpRequest,\n SignUpResponse,\n StreamEvent,\n SubmitRevisionRequest,\n SuppressionEntry,\n SuppressionPrecheck,\n ListSuppressionsParams,\n Thread,\n ThreadDetail,\n UpdateInboxRequest,\n UpdateWebhookRequest,\n VerifyRequest,\n VerifyResponse,\n WaitForEmailRequest,\n WaitForEmailResult,\n WaitForReviewEventParams,\n Webhook,\n WhoAmI,\n} from \"./models.js\";\n\n/** Raw bytes of one attachment plus the metadata needed to save/serve it. */\nexport interface AttachmentDownload {\n filename: string;\n content_type: string;\n /** Standard base64 of the attachment bytes. */\n content_base64: string;\n}\n\n/** The RPC surface every transport implements. One method per spec §8 endpoint. */\nexport interface Transport {\n enroll(req: EnrollRequest, signal?: AbortSignal): Promise<EnrollResponse>;\n signUp(req: SignUpRequest, signal?: AbortSignal): Promise<SignUpResponse>;\n verify(req: VerifyRequest, signal?: AbortSignal): Promise<VerifyResponse>;\n whoami(signal?: AbortSignal): Promise<WhoAmI>;\n createInbox(req: CreateInboxRequest, idempotencyKey?: string, signal?: AbortSignal): Promise<Inbox>;\n listInboxes(params: ListInboxesParams, signal?: AbortSignal): Promise<Page<Inbox>>;\n getInbox(address: string, signal?: AbortSignal): Promise<Inbox>;\n updateInbox(address: string, req: UpdateInboxRequest, signal?: AbortSignal): Promise<Inbox>;\n deleteInbox(address: string, signal?: AbortSignal): Promise<void>;\n // ---- Canonical project-prefixed inbox chain (x.projects.inboxes.*) ----------\n // These map to /v1/projects/{project_id}/inboxes[/{inbox_id}], return the redesign\n // List envelope on list, and key single-row ops by the opaque inbox_id (an address\n // is accepted as a within-project alias). project_id may be \"-\" (org wildcard).\n createInboxInProject(\n projectId: string,\n req: CreateInboxRequest,\n idempotencyKey?: string,\n signal?: AbortSignal,\n ): Promise<Inbox>;\n listInboxesInProject(\n projectId: string,\n params: ProjectInboxListParams,\n signal?: AbortSignal,\n ): Promise<List<Inbox>>;\n getInboxInProject(\n projectId: string,\n inboxId: string,\n params: GetInboxParams,\n signal?: AbortSignal,\n ): Promise<Inbox>;\n updateInboxInProject(\n projectId: string,\n inboxId: string,\n req: UpdateInboxRequest,\n signal?: AbortSignal,\n ): Promise<Inbox>;\n deleteInboxInProject(projectId: string, inboxId: string, signal?: AbortSignal): Promise<void>;\n getInboxCredentialsInProject(\n projectId: string,\n inboxId: string,\n signal?: AbortSignal,\n ): Promise<InboxCredentials>;\n // send / reply / forward all answer the same three-way SendOutcome union: the\n // resolved review policy decides whether a message is delivered now or parked\n // for a human, and the caller does not get to opt out of that decision.\n send(address: string, req: SendRequest, signal?: AbortSignal): Promise<SendOutcome>;\n reply(address: string, req: ReplyRequest, signal?: AbortSignal): Promise<SendOutcome>;\n forward(address: string, messageId: string, req: ForwardRequest, signal?: AbortSignal): Promise<SendOutcome>;\n listMessages(address: string, params: ListMessagesParams, signal?: AbortSignal): Promise<Page<Message>>;\n getMessage(messageId: string, signal?: AbortSignal): Promise<Message>;\n getMessageRaw(address: string, messageId: string, signal?: AbortSignal): Promise<string>;\n listAttachments(address: string, messageId: string, signal?: AbortSignal): Promise<Page<Attachment>>;\n getAttachment(\n address: string,\n messageId: string,\n attachmentId: string,\n signal?: AbortSignal,\n ): Promise<AttachmentDownload>;\n markRead(address: string, messageId: string, req: MarkReadRequest, signal?: AbortSignal): Promise<Message>;\n deleteMessage(address: string, messageId: string, expunge?: boolean, signal?: AbortSignal): Promise<DeleteResult>;\n batchUpdateMessages(\n address: string,\n req: BatchUpdateMessagesRequest,\n signal?: AbortSignal,\n ): Promise<BatchUpdateResult>;\n searchMessages(address: string, params: SearchMessagesParams, signal?: AbortSignal): Promise<Page<Message>>;\n listThreads(address: string, params: ListThreadsParams, signal?: AbortSignal): Promise<Page<Thread>>;\n searchThreads(address: string, params: SearchMessagesParams, signal?: AbortSignal): Promise<Page<Thread>>;\n getThread(address: string, threadId: string, signal?: AbortSignal): Promise<ThreadDetail>;\n deleteThread(address: string, threadId: string, expunge?: boolean, signal?: AbortSignal): Promise<DeleteResult>;\n waitForEmail(\n address: string,\n req: WaitForEmailRequest,\n timeoutMs: number,\n signal?: AbortSignal,\n ): Promise<WaitForEmailResult>;\n registerWebhook(req: RegisterWebhookRequest, signal?: AbortSignal): Promise<Webhook>;\n listWebhooks(signal?: AbortSignal): Promise<Page<Webhook>>;\n getWebhook(webhookId: string, signal?: AbortSignal): Promise<Webhook>;\n updateWebhook(webhookId: string, req: UpdateWebhookRequest, signal?: AbortSignal): Promise<Webhook>;\n deleteWebhook(webhookId: string, signal?: AbortSignal): Promise<void>;\n addContactListEntry(\n address: string,\n req: AddContactListRequest,\n signal?: AbortSignal,\n ): Promise<ContactListEntry>;\n listContactLists(address: string, signal?: AbortSignal): Promise<Page<ContactListEntry>>;\n deleteContactListEntry(address: string, entryId: string, signal?: AbortSignal): Promise<void>;\n // Suppressions (recipient opt-outs) — customer/org-scoped, not inbox-keyed.\n // precheck is the read-only \"is this recipient opted out of MY org's mail?\"; the\n // list pages the caller's own org rows; revoke re-enables one row (reason required).\n precheckSuppression(recipient: string, signal?: AbortSignal): Promise<SuppressionPrecheck>;\n listSuppressions(params: ListSuppressionsParams, signal?: AbortSignal): Promise<Page<SuppressionEntry>>;\n revokeSuppression(id: string, reason: string, signal?: AbortSignal): Promise<SuppressionEntry>;\n listDomains(signal?: AbortSignal): Promise<Page<Domain>>;\n getDomain(domain: string, signal?: AbortSignal): Promise<Domain>;\n onboardDomain(req: OnboardDomainRequest, signal?: AbortSignal): Promise<Domain>;\n verifyDomain(domain: string, signal?: AbortSignal): Promise<Domain>;\n offboardDomain(domain: string, signal?: AbortSignal): Promise<DomainOffboard>;\n // Poll surface for an async job the agent enqueued (currently only the\n // domain-offboard teardown's status_url).\n getJob(jobId: string, signal?: AbortSignal): Promise<Job>;\n // Review Loop (HITL): submit-for-review rides send/reply — literally the same\n // endpoints, so it answers the same SendOutcome union. It stays a distinct\n // method because it NAMES the intent of the call; a submit that omits `intent`\n // under require_review raises IntentRequiredError from either entry point.\n submitForReview(address: string, req: SendRequest, signal?: AbortSignal): Promise<SendOutcome>;\n submitReplyForReview(\n address: string,\n req: ReplyRequest,\n signal?: AbortSignal,\n ): Promise<SendOutcome>;\n listReviews(params: ListReviewsParams, signal?: AbortSignal): Promise<Page<Review>>;\n getReview(reviewId: string, signal?: AbortSignal): Promise<Review>;\n getReviewTurns(reviewId: string, signal?: AbortSignal): Promise<Page<ReviewTurn>>;\n // Review Loop (HITL) per-message CHAT + revision + cancel + feedback (M5). chat\n // takes an Idempotency-Key; submit_revision CASes on parent_revision (409 STALE).\n getReviewFeedback(reviewId: string, signal?: AbortSignal): Promise<ReviewFeedback>;\n postReviewChat(reviewId: string, req: PostReviewChatRequest, idempotencyKey?: string, signal?: AbortSignal): Promise<Review>;\n submitRevision(reviewId: string, req: SubmitRevisionRequest, signal?: AbortSignal): Promise<Review>;\n cancelReview(reviewId: string, idempotencyKey?: string, signal?: AbortSignal): Promise<Review>;\n // D19/§8 re-stamp-without-redraft escape valve ($0): assert \"reviewed against vX, no\n // change needed\" and advance composed_* WITHOUT a new draft.\n restampReview(reviewId: string, req: RestampReviewRequest, signal?: AbortSignal): Promise<Review>;\n // BYO review-agent DECISION plane (M8 Slice B; D5/§9). The reviewer (review:act + a\n // matching active link) reads its decision context, then decides approve|edit|reject|\n // escalate. On approve/edit the PLATFORM ACS-sends with the COMPOSER's creds (the\n // reviewer NEVER holds mailbox:send); the two circuit breakers force a maxed-out\n // review to the human regardless of intent.\n getReviewDecisionContext(reviewId: string, signal?: AbortSignal): Promise<ReviewDecisionContext>;\n reviewerDecide(reviewId: string, req: ReviewerDecisionRequest, signal?: AbortSignal): Promise<ReviewerDecisionResult>;\n // Review Loop (HITL) realtime: the durable nudge drain/ack/wait lifecycle. The\n // queue is the authoritative liveness source; SSE/webhook are fast paths atop it.\n listReviewEvents(params: ListReviewEventsParams, signal?: AbortSignal): Promise<ReviewEventsResult>;\n waitForReviewEvent(params: WaitForReviewEventParams, signal?: AbortSignal): Promise<ReviewEventsResult>;\n ackReviewEvent(req: AckReviewEventRequest, signal?: AbortSignal): Promise<AckReviewEventResult>;\n // Category registry (Review Loop, D9/D10): browse / propose / rename. Customer-\n // scoped + agent-attributed (the cross-agent-404 exception). match= is lexical.\n listCategories(params: ListCategoriesParams, signal?: AbortSignal): Promise<Page<Category>>;\n getCategory(categoryId: string, signal?: AbortSignal): Promise<Category>;\n proposeCategory(req: ProposeCategoryRequest, signal?: AbortSignal): Promise<Category>;\n updateCategory(categoryId: string, req: UpdateCategoryRequest, signal?: AbortSignal): Promise<Category>;\n // Graduation + risk dial (Review Loop, D16/D6/D17): agents READ the effective dial +\n // a category's graduation status, and PROPOSE graduation (records the request; never\n // flips the bit). Flipping the bit + setting the dial are console (human) actions.\n getRiskDial(signal?: AbortSignal): Promise<RiskDial>;\n getGraduationStatus(categoryId: string, signal?: AbortSignal): Promise<GraduationStatus>;\n proposeGraduation(categoryId: string, req: ProposeGraduationRequest, signal?: AbortSignal): Promise<GraduationStatus>;\n // D19/§8 backlog-reconciliation status (read-only): how many queued drafts are stale\n // vs current-enough against the current rules-version. Agents READ; humans/hooks TRIGGER.\n getScanBacklogStatus(categoryId: string, signal?: AbortSignal): Promise<ScanBacklogStatus>;\n // M7 Slice B/§8 demand-driven pacing state (read-only): the human review cursor, the\n // effective window/ceiling/interval, and each queued draft's classification.\n getCategoryPacingState(categoryId: string, signal?: AbortSignal): Promise<CategoryPacingState>;\n // Writing rules + house-style + precedence ladder + audit/undo (D2/D11). ANY\n // agent may write/edit/promote/retire/undo (the cross-agent exception); get_rules\n // returns the ORDERED list with the §7 ladder applied server-side (NO LLM).\n getRules(params: GetRulesParams, signal?: AbortSignal): Promise<Page<Rule>>;\n saveRule(req: SaveRuleRequest, signal?: AbortSignal): Promise<Rule>;\n promoteRule(ruleId: string, toScope: \"general\" | \"category\", signal?: AbortSignal): Promise<Rule>;\n retireRule(ruleId: string, signal?: AbortSignal): Promise<Rule>;\n getRuleAudit(params: GetRuleAuditParams, signal?: AbortSignal): Promise<Page<RuleAuditEntry>>;\n undoRuleChange(udoId: string, signal?: AbortSignal): Promise<Rule>;\n /**\n * Open a live event stream. `address` scopes to one inbox (`GET\n * /v1/inboxes/{addr}/stream`); pass `null` for every owned inbox (`GET\n * /v1/events`). `lastEventId`, when set, resumes after that event seq. The\n * generator ends when the server closes the stream or `signal` aborts.\n */\n stream(\n address: string | null,\n lastEventId?: number,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent, void, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Wire-body builders for the three outbound verbs.\n//\n// The SDK's request types are ergonomic (`to` may be a bare string) and carry one\n// field that is NOT a body field at all (`idempotency_key`, which belongs in a\n// header). Shipping the caller's object verbatim — which is what these methods\n// used to do — sent both problems straight to a server that decodes with\n// DisallowUnknownFields and `[]string` recipients, so a documented, typechecked\n// call 400'd on the wire. These builders are the one boundary where the\n// ergonomic shape becomes the wire shape:\n//\n// 1. `idempotency_key` is REMOVED from the body and set as `Idempotency-Key`.\n// The server tolerates it in the body for already-shipped builds, but it\n// must not be there: the replay key is a hash of the raw body, so a key\n// carried inside its own hashed payload is self-referential noise.\n// 2. `to` / `cc` / `bcc` are widened from `string | string[]` to `string[]`.\n// An absent field stays absent — emitting `cc: []` would add a key the\n// caller never wrote.\n// 3. Nothing is RENAMED. `text` is the canonical name on both sides; that is\n// the whole reason `text` was chosen over the server's old `body`.\n// ---------------------------------------------------------------------------\n\n/** Strip the header-only `idempotency_key` from a request object. */\nfunction withoutIdempotencyKey<T extends { idempotency_key?: string }>(req: T): Omit<T, \"idempotency_key\"> {\n const { idempotency_key: _headerOnly, ...rest } = req;\n return rest;\n}\n\n/**\n * Drop keys whose value is `undefined` so an omitted optional never reaches the\n * wire as an explicit `null`/`undefined` entry. `JSON.stringify` already elides\n * `undefined` values, so this is belt-and-braces for readability of the emitted\n * body in tests.\n */\nfunction omitUndefined<T extends Record<string, unknown>>(obj: T): T {\n const out = {} as Record<string, unknown>;\n for (const [k, v] of Object.entries(obj)) if (v !== undefined) out[k] = v;\n return out as T;\n}\n\n/** The JSON body for `POST /v1/inboxes/{addr}/send`. */\nfunction sendBody(req: SendRequest): Record<string, unknown> {\n return omitUndefined({\n ...withoutIdempotencyKey(req),\n to: toWireArray(req.to),\n cc: toWireArray(req.cc),\n bcc: toWireArray(req.bcc),\n });\n}\n\n/** The JSON body for `POST /v1/inboxes/{addr}/reply` (recipients are derived server-side). */\nfunction replyBody(req: ReplyRequest): Record<string, unknown> {\n return omitUndefined({\n ...withoutIdempotencyKey(req),\n cc: toWireArray(req.cc),\n bcc: toWireArray(req.bcc),\n });\n}\n\n/** The JSON body for `POST /v1/inboxes/{addr}/messages/{id}/forward`. */\nfunction forwardBody(req: ForwardRequest): Record<string, unknown> {\n return omitUndefined({\n ...withoutIdempotencyKey(req),\n to: toWireArray(req.to),\n cc: toWireArray(req.cc),\n bcc: toWireArray(req.bcc),\n });\n}\n\n/** Live transport: each method maps to a `/v1` request. */\nexport class HttpTransport implements Transport {\n constructor(private readonly http: HttpClient) {}\n\n private encodeAddress(address: string): string {\n return encodeURIComponent(address);\n }\n\n private call<T>(opts: RequestOptions): Promise<T> {\n return this.http.request<T>(opts);\n }\n\n enroll(req: EnrollRequest, signal?: AbortSignal): Promise<EnrollResponse> {\n return this.call({ method: \"POST\", path: \"/v1/enroll\", body: req, idempotencyKey: req.client_id, signal });\n }\n\n signUp(req: SignUpRequest, signal?: AbortSignal): Promise<SignUpResponse> {\n return this.call({ method: \"POST\", path: \"/v1/agent/sign-up\", body: req, signal });\n }\n\n verify(req: VerifyRequest, signal?: AbortSignal): Promise<VerifyResponse> {\n return this.call({ method: \"POST\", path: \"/v1/agent/verify\", body: req, signal });\n }\n\n whoami(signal?: AbortSignal): Promise<WhoAmI> {\n return this.call({ method: \"GET\", path: \"/v1/auth/me\", signal });\n }\n\n createInbox(req: CreateInboxRequest, idempotencyKey?: string, signal?: AbortSignal): Promise<Inbox> {\n return this.call({\n method: \"POST\",\n path: \"/v1/inboxes\",\n body: req,\n idempotencyKey: idempotencyKey ?? req.client_id,\n signal,\n });\n }\n\n async listInboxes(params: ListInboxesParams, signal?: AbortSignal): Promise<Page<Inbox>> {\n // The bare GET /v1/inboxes returns the legacy `{inboxes, next_page}` shape (frozen\n // OpenAPI listInboxes), NOT the `{items, total, next_cursor}` Page envelope. Remap\n // it here so `page.items` / `page.next_cursor` are populated against the live API\n // (`inboxes` and `next_page` are dropped raw otherwise). Mirrors the MCP client.\n const raw = await this.call<{\n inboxes?: Inbox[];\n items?: Inbox[];\n next_page?: string;\n next_cursor?: string;\n }>({ method: \"GET\", path: \"/v1/inboxes\", query: { ...params }, signal });\n const items = raw.inboxes ?? raw.items ?? [];\n const page: Page<Inbox> = { items, total: items.length };\n const cursor = raw.next_cursor ?? raw.next_page;\n if (cursor) page.next_cursor = cursor;\n return page;\n }\n\n getInbox(address: string, signal?: AbortSignal): Promise<Inbox> {\n return this.call({ method: \"GET\", path: `/v1/inboxes/${this.encodeAddress(address)}`, signal });\n }\n\n updateInbox(address: string, req: UpdateInboxRequest, signal?: AbortSignal): Promise<Inbox> {\n return this.call({\n method: \"PATCH\",\n path: `/v1/inboxes/${this.encodeAddress(address)}`,\n body: req,\n signal,\n });\n }\n\n async deleteInbox(address: string, signal?: AbortSignal): Promise<void> {\n await this.call({ method: \"DELETE\", path: `/v1/inboxes/${this.encodeAddress(address)}`, signal });\n }\n\n // ---- Canonical project-prefixed inbox chain (x.projects.inboxes.*) ----------\n\n createInboxInProject(\n projectId: string,\n req: CreateInboxRequest,\n idempotencyKey?: string,\n signal?: AbortSignal,\n ): Promise<Inbox> {\n return this.call({\n method: \"POST\",\n path: `/v1/projects/${encodeURIComponent(projectId)}/inboxes`,\n body: req,\n idempotencyKey: idempotencyKey ?? req.client_id,\n signal,\n });\n }\n\n listInboxesInProject(\n projectId: string,\n params: ProjectInboxListParams,\n signal?: AbortSignal,\n ): Promise<List<Inbox>> {\n return this.call({\n method: \"GET\",\n path: `/v1/projects/${encodeURIComponent(projectId)}/inboxes`,\n query: {\n limit: params.limit,\n cursor: params.cursor,\n include: serializeInclude(params.include),\n },\n signal,\n });\n }\n\n getInboxInProject(\n projectId: string,\n inboxId: string,\n params: GetInboxParams,\n signal?: AbortSignal,\n ): Promise<Inbox> {\n return this.call({\n method: \"GET\",\n path: `/v1/projects/${encodeURIComponent(projectId)}/inboxes/${encodeURIComponent(inboxId)}`,\n query: { include: serializeInclude(params.include) },\n signal,\n });\n }\n\n updateInboxInProject(\n projectId: string,\n inboxId: string,\n req: UpdateInboxRequest,\n signal?: AbortSignal,\n ): Promise<Inbox> {\n return this.call({\n method: \"PATCH\",\n path: `/v1/projects/${encodeURIComponent(projectId)}/inboxes/${encodeURIComponent(inboxId)}`,\n body: req,\n signal,\n });\n }\n\n async deleteInboxInProject(projectId: string, inboxId: string, signal?: AbortSignal): Promise<void> {\n await this.call({\n method: \"DELETE\",\n path: `/v1/projects/${encodeURIComponent(projectId)}/inboxes/${encodeURIComponent(inboxId)}`,\n signal,\n });\n }\n\n getInboxCredentialsInProject(\n projectId: string,\n inboxId: string,\n signal?: AbortSignal,\n ): Promise<InboxCredentials> {\n return this.call({\n method: \"GET\",\n path: `/v1/projects/${encodeURIComponent(projectId)}/inboxes/${encodeURIComponent(inboxId)}/credentials`,\n signal,\n });\n }\n\n send(address: string, req: SendRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.call({\n method: \"POST\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/send`,\n body: sendBody(req),\n idempotencyKey: req.idempotency_key,\n signal,\n });\n }\n\n reply(address: string, req: ReplyRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.call({\n method: \"POST\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/reply`,\n body: replyBody(req),\n idempotencyKey: req.idempotency_key,\n signal,\n });\n }\n\n forward(address: string, messageId: string, req: ForwardRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.call({\n method: \"POST\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages/${encodeURIComponent(messageId)}/forward`,\n body: forwardBody(req),\n idempotencyKey: req.idempotency_key,\n signal,\n });\n }\n\n listMessages(address: string, params: ListMessagesParams, signal?: AbortSignal): Promise<Page<Message>> {\n return this.call({\n method: \"GET\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages`,\n query: { ...params },\n signal,\n });\n }\n\n getMessage(messageId: string, signal?: AbortSignal): Promise<Message> {\n return this.call({ method: \"GET\", path: `/v1/messages/${encodeURIComponent(messageId)}`, signal });\n }\n\n getMessageRaw(address: string, messageId: string, signal?: AbortSignal): Promise<string> {\n return this.call({\n method: \"GET\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages/${encodeURIComponent(messageId)}/raw`,\n raw: true,\n signal,\n });\n }\n\n listAttachments(address: string, messageId: string, signal?: AbortSignal): Promise<Page<Attachment>> {\n return this.call({\n method: \"GET\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages/${encodeURIComponent(messageId)}/attachments`,\n signal,\n });\n }\n\n async getAttachment(\n address: string,\n messageId: string,\n attachmentId: string,\n signal?: AbortSignal,\n ): Promise<AttachmentDownload> {\n const res = await this.http.request<BinaryResponse>({\n method: \"GET\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`,\n binary: true,\n signal,\n });\n return {\n filename: filenameFromDisposition(res.contentDisposition),\n content_type: res.contentType,\n content_base64: bytesToBase64(res.bytes),\n };\n }\n\n markRead(address: string, messageId: string, req: MarkReadRequest, signal?: AbortSignal): Promise<Message> {\n return this.call({\n method: \"PATCH\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages/${encodeURIComponent(messageId)}`,\n body: req,\n signal,\n });\n }\n\n deleteMessage(\n address: string,\n messageId: string,\n expunge?: boolean,\n signal?: AbortSignal,\n ): Promise<DeleteResult> {\n return this.call({\n method: \"DELETE\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages/${encodeURIComponent(messageId)}`,\n query: expunge ? { expunge: true } : undefined,\n signal,\n });\n }\n\n batchUpdateMessages(\n address: string,\n req: BatchUpdateMessagesRequest,\n signal?: AbortSignal,\n ): Promise<BatchUpdateResult> {\n return this.call({\n method: \"PATCH\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages/batch`,\n body: req,\n signal,\n });\n }\n\n searchMessages(address: string, params: SearchMessagesParams, signal?: AbortSignal): Promise<Page<Message>> {\n return this.call({\n method: \"GET\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/messages/search`,\n query: { ...params },\n signal,\n });\n }\n\n listThreads(address: string, params: ListThreadsParams, signal?: AbortSignal): Promise<Page<Thread>> {\n return this.call({\n method: \"GET\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/threads`,\n query: { ...params },\n signal,\n });\n }\n\n searchThreads(address: string, params: SearchMessagesParams, signal?: AbortSignal): Promise<Page<Thread>> {\n return this.call({\n method: \"GET\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/threads/search`,\n query: { ...params },\n signal,\n });\n }\n\n getThread(address: string, threadId: string, signal?: AbortSignal): Promise<ThreadDetail> {\n return this.call({\n method: \"GET\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/threads/${encodeURIComponent(threadId)}`,\n signal,\n });\n }\n\n deleteThread(\n address: string,\n threadId: string,\n expunge?: boolean,\n signal?: AbortSignal,\n ): Promise<DeleteResult> {\n return this.call({\n method: \"DELETE\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/threads/${encodeURIComponent(threadId)}`,\n query: expunge ? { expunge: true } : undefined,\n signal,\n });\n }\n\n waitForEmail(\n address: string,\n req: WaitForEmailRequest,\n timeoutMs: number,\n signal?: AbortSignal,\n ): Promise<WaitForEmailResult> {\n return this.call({\n method: \"POST\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/wait`,\n body: req,\n // The server blocks up to req.timeout_seconds; give the HTTP read a small margin over it.\n timeoutMs,\n retryable: false,\n signal,\n });\n }\n\n registerWebhook(req: RegisterWebhookRequest, signal?: AbortSignal): Promise<Webhook> {\n return this.call({ method: \"POST\", path: \"/v1/webhooks\", body: req, idempotencyKey: req.client_id, signal });\n }\n\n listWebhooks(signal?: AbortSignal): Promise<Page<Webhook>> {\n return this.call({ method: \"GET\", path: \"/v1/webhooks\", signal });\n }\n\n getWebhook(webhookId: string, signal?: AbortSignal): Promise<Webhook> {\n return this.call({ method: \"GET\", path: `/v1/webhooks/${encodeURIComponent(webhookId)}`, signal });\n }\n\n updateWebhook(webhookId: string, req: UpdateWebhookRequest, signal?: AbortSignal): Promise<Webhook> {\n return this.call({\n method: \"PATCH\",\n path: `/v1/webhooks/${encodeURIComponent(webhookId)}`,\n body: req,\n signal,\n });\n }\n\n async deleteWebhook(webhookId: string, signal?: AbortSignal): Promise<void> {\n await this.call({ method: \"DELETE\", path: `/v1/webhooks/${encodeURIComponent(webhookId)}`, signal });\n }\n\n addContactListEntry(\n address: string,\n req: AddContactListRequest,\n signal?: AbortSignal,\n ): Promise<ContactListEntry> {\n return this.call({\n method: \"POST\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/lists`,\n body: req,\n signal,\n });\n }\n\n listContactLists(address: string, signal?: AbortSignal): Promise<Page<ContactListEntry>> {\n return this.call({ method: \"GET\", path: `/v1/inboxes/${this.encodeAddress(address)}/lists`, signal });\n }\n\n async deleteContactListEntry(address: string, entryId: string, signal?: AbortSignal): Promise<void> {\n await this.call({\n method: \"DELETE\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/lists/${encodeURIComponent(entryId)}`,\n signal,\n });\n }\n\n precheckSuppression(recipient: string, signal?: AbortSignal): Promise<SuppressionPrecheck> {\n // A `recipient` query param routes the server to the pre-check shape\n // ({recipient, suppressed, rows}) rather than the paged list.\n return this.call({ method: \"GET\", path: \"/v1/suppressions\", query: { recipient }, signal });\n }\n\n listSuppressions(params: ListSuppressionsParams, signal?: AbortSignal): Promise<Page<SuppressionEntry>> {\n // Note: no `recipient` here — that param switches the server to the pre-check.\n return this.call({\n method: \"GET\",\n path: \"/v1/suppressions\",\n query: {\n scope: params.scope,\n include_revoked: params.include_revoked ? \"true\" : undefined,\n limit: params.limit,\n cursor: params.cursor,\n },\n signal,\n });\n }\n\n revokeSuppression(id: string, reason: string, signal?: AbortSignal): Promise<SuppressionEntry> {\n return this.call({\n method: \"POST\",\n path: `/v1/suppressions/${encodeURIComponent(id)}/revoke`,\n body: { reason },\n signal,\n });\n }\n\n listDomains(signal?: AbortSignal): Promise<Page<Domain>> {\n return this.call({ method: \"GET\", path: \"/v1/domains\", signal });\n }\n\n getDomain(domain: string, signal?: AbortSignal): Promise<Domain> {\n return this.call({ method: \"GET\", path: `/v1/domains/${encodeURIComponent(domain)}`, signal });\n }\n\n onboardDomain(req: OnboardDomainRequest, signal?: AbortSignal): Promise<Domain> {\n return this.call({ method: \"POST\", path: \"/v1/domains\", body: req, signal });\n }\n\n verifyDomain(domain: string, signal?: AbortSignal): Promise<Domain> {\n return this.call({\n method: \"POST\",\n path: `/v1/domains/${encodeURIComponent(domain)}/verify`,\n signal,\n });\n }\n\n async offboardDomain(domain: string, signal?: AbortSignal): Promise<DomainOffboard> {\n // Async contract: the API accepts the offboard (HTTP 202) and returns the\n // teardown job to poll; the request body carries { job_id, status, status_url }.\n const res = await this.call<Partial<DomainOffboard>>({\n method: \"DELETE\",\n path: `/v1/domains/${encodeURIComponent(domain)}`,\n signal,\n });\n const jobId = res?.job_id ?? \"\";\n return {\n domain,\n job_id: jobId,\n status: res?.status ?? \"queued\",\n status_url: res?.status_url ?? (jobId ? `/v1/jobs/${jobId}` : \"\"),\n };\n }\n\n getJob(jobId: string, signal?: AbortSignal): Promise<Job> {\n return this.call({ method: \"GET\", path: `/v1/jobs/${encodeURIComponent(jobId)}`, signal });\n }\n\n submitForReview(address: string, req: SendRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.call({\n method: \"POST\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/send`,\n body: sendBody(req),\n idempotencyKey: req.idempotency_key,\n signal,\n });\n }\n\n submitReplyForReview(\n address: string,\n req: ReplyRequest,\n signal?: AbortSignal,\n ): Promise<SendOutcome> {\n return this.call({\n method: \"POST\",\n path: `/v1/inboxes/${this.encodeAddress(address)}/reply`,\n body: replyBody(req),\n idempotencyKey: req.idempotency_key,\n signal,\n });\n }\n\n listReviews(params: ListReviewsParams, signal?: AbortSignal): Promise<Page<Review>> {\n const query: Record<string, string | number | undefined> = {\n state: Array.isArray(params.state) ? params.state.join(\",\") : params.state,\n category_id: params.category_id,\n inbox: params.inbox,\n limit: params.limit,\n page: params.page,\n };\n return this.call({ method: \"GET\", path: \"/v1/reviews\", query, signal });\n }\n\n getReview(reviewId: string, signal?: AbortSignal): Promise<Review> {\n return this.call({ method: \"GET\", path: `/v1/reviews/${encodeURIComponent(reviewId)}`, signal });\n }\n\n getReviewTurns(reviewId: string, signal?: AbortSignal): Promise<Page<ReviewTurn>> {\n return this.call({\n method: \"GET\",\n path: `/v1/reviews/${encodeURIComponent(reviewId)}/turns`,\n signal,\n });\n }\n\n getReviewFeedback(reviewId: string, signal?: AbortSignal): Promise<ReviewFeedback> {\n return this.call({\n method: \"GET\",\n path: `/v1/reviews/${encodeURIComponent(reviewId)}/feedback`,\n signal,\n });\n }\n\n postReviewChat(\n reviewId: string,\n req: PostReviewChatRequest,\n idempotencyKey?: string,\n signal?: AbortSignal,\n ): Promise<Review> {\n return this.call({\n method: \"POST\",\n path: `/v1/reviews/${encodeURIComponent(reviewId)}/chat`,\n body: req,\n idempotencyKey,\n signal,\n });\n }\n\n submitRevision(reviewId: string, req: SubmitRevisionRequest, signal?: AbortSignal): Promise<Review> {\n return this.call({\n method: \"POST\",\n path: `/v1/reviews/${encodeURIComponent(reviewId)}/revision`,\n body: withoutIdempotencyKey(req),\n idempotencyKey: req.idempotency_key,\n signal,\n });\n }\n\n cancelReview(reviewId: string, idempotencyKey?: string, signal?: AbortSignal): Promise<Review> {\n return this.call({\n method: \"POST\",\n path: `/v1/reviews/${encodeURIComponent(reviewId)}/cancel`,\n body: {},\n idempotencyKey,\n signal,\n });\n }\n\n restampReview(reviewId: string, req: RestampReviewRequest, signal?: AbortSignal): Promise<Review> {\n return this.call({\n method: \"POST\",\n path: `/v1/reviews/${encodeURIComponent(reviewId)}/restamp`,\n body: withoutIdempotencyKey(req),\n idempotencyKey: req.idempotency_key,\n signal,\n });\n }\n\n getReviewDecisionContext(reviewId: string, signal?: AbortSignal): Promise<ReviewDecisionContext> {\n return this.call({\n method: \"GET\",\n path: `/v1/reviews/${encodeURIComponent(reviewId)}/decision-context`,\n signal,\n });\n }\n\n reviewerDecide(reviewId: string, req: ReviewerDecisionRequest, signal?: AbortSignal): Promise<ReviewerDecisionResult> {\n return this.call({\n method: \"POST\",\n path: `/v1/reviews/${encodeURIComponent(reviewId)}/decision`,\n body: req,\n signal,\n });\n }\n\n listReviewEvents(params: ListReviewEventsParams, signal?: AbortSignal): Promise<ReviewEventsResult> {\n return this.call({\n method: \"GET\",\n path: \"/v1/reviews/events\",\n query: { review_id: params.review_id, limit: params.limit },\n signal,\n });\n }\n\n waitForReviewEvent(params: WaitForReviewEventParams, signal?: AbortSignal): Promise<ReviewEventsResult> {\n return this.call({\n method: \"GET\",\n path: \"/v1/reviews/events/wait\",\n query: { review_id: params.review_id, limit: params.limit, wait_seconds: params.wait_seconds },\n signal,\n });\n }\n\n ackReviewEvent(req: AckReviewEventRequest, signal?: AbortSignal): Promise<AckReviewEventResult> {\n return this.call({\n method: \"POST\",\n path: \"/v1/reviews/events/ack\",\n body: { acks: req.acks ?? [], broadcast_ids: req.broadcast_ids ?? [] },\n signal,\n });\n }\n\n listCategories(params: ListCategoriesParams, signal?: AbortSignal): Promise<Page<Category>> {\n return this.call({ method: \"GET\", path: \"/v1/categories\", query: { match: params.match }, signal });\n }\n\n getCategory(categoryId: string, signal?: AbortSignal): Promise<Category> {\n return this.call({ method: \"GET\", path: `/v1/categories/${encodeURIComponent(categoryId)}`, signal });\n }\n\n proposeCategory(req: ProposeCategoryRequest, signal?: AbortSignal): Promise<Category> {\n return this.call({ method: \"POST\", path: \"/v1/categories\", body: req, signal });\n }\n\n updateCategory(categoryId: string, req: UpdateCategoryRequest, signal?: AbortSignal): Promise<Category> {\n return this.call({\n method: \"PUT\",\n path: `/v1/categories/${encodeURIComponent(categoryId)}`,\n body: req,\n signal,\n });\n }\n\n getRiskDial(signal?: AbortSignal): Promise<RiskDial> {\n return this.call({ method: \"GET\", path: \"/v1/risk-dial\", signal });\n }\n\n getGraduationStatus(categoryId: string, signal?: AbortSignal): Promise<GraduationStatus> {\n return this.call({\n method: \"GET\",\n path: `/v1/categories/${encodeURIComponent(categoryId)}/graduation-status`,\n signal,\n });\n }\n\n getScanBacklogStatus(categoryId: string, signal?: AbortSignal): Promise<ScanBacklogStatus> {\n return this.call({\n method: \"GET\",\n path: `/v1/categories/${encodeURIComponent(categoryId)}/backlog-status`,\n signal,\n });\n }\n\n getCategoryPacingState(categoryId: string, signal?: AbortSignal): Promise<CategoryPacingState> {\n return this.call({\n method: \"GET\",\n path: `/v1/categories/${encodeURIComponent(categoryId)}/pacing-state`,\n signal,\n });\n }\n\n proposeGraduation(categoryId: string, req: ProposeGraduationRequest, signal?: AbortSignal): Promise<GraduationStatus> {\n return this.call({\n method: \"POST\",\n path: `/v1/categories/${encodeURIComponent(categoryId)}/graduation-request`,\n body: { evidence: req.evidence ?? {} },\n signal,\n });\n }\n\n getRules(params: GetRulesParams, signal?: AbortSignal): Promise<Page<Rule>> {\n return this.call({\n method: \"GET\",\n path: \"/v1/rules\",\n query: { category_id: params.category_id, scope: params.scope },\n signal,\n });\n }\n\n saveRule(req: SaveRuleRequest, signal?: AbortSignal): Promise<Rule> {\n return this.call({ method: \"PUT\", path: \"/v1/rules\", body: req, signal });\n }\n\n promoteRule(ruleId: string, toScope: \"general\" | \"category\", signal?: AbortSignal): Promise<Rule> {\n return this.call({\n method: \"POST\",\n path: `/v1/rules/${encodeURIComponent(ruleId)}/promote`,\n body: { to_scope: toScope },\n signal,\n });\n }\n\n retireRule(ruleId: string, signal?: AbortSignal): Promise<Rule> {\n return this.call({ method: \"POST\", path: `/v1/rules/${encodeURIComponent(ruleId)}/retire`, body: {}, signal });\n }\n\n getRuleAudit(params: GetRuleAuditParams, signal?: AbortSignal): Promise<Page<RuleAuditEntry>> {\n return this.call({\n method: \"GET\",\n path: \"/v1/rules/audit\",\n query: { entity_kind: params.entity_kind, entity_id: params.entity_id },\n signal,\n });\n }\n\n undoRuleChange(udoId: string, signal?: AbortSignal): Promise<Rule> {\n return this.call({\n method: \"POST\",\n path: `/v1/rules/audit/${encodeURIComponent(udoId)}/undo`,\n body: {},\n signal,\n });\n }\n\n async *stream(\n address: string | null,\n lastEventId?: number,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent, void, unknown> {\n const path =\n address === null ? \"/v1/events\" : `/v1/inboxes/${this.encodeAddress(address)}/stream`;\n const frames = this.http.stream({\n path,\n lastEventId: lastEventId !== undefined ? String(lastEventId) : undefined,\n signal,\n });\n for await (const frame of frames) {\n // The SSE `data:` is the canonical event envelope; the `id:` is the monotonic\n // resume token (seq). Merge them into the typed StreamEvent.\n let envelope: Record<string, unknown> = {};\n try {\n envelope = JSON.parse(frame.data) as Record<string, unknown>;\n } catch {\n continue; // skip malformed frames rather than aborting the whole stream\n }\n const seq = frame.id !== undefined ? Number(frame.id) : NaN;\n yield {\n ...(envelope as object),\n event: (envelope.event as string) ?? frame.event,\n seq: Number.isFinite(seq) ? seq : 0,\n } as StreamEvent;\n }\n }\n}\n\n/** Offline transport backed by {@link MockBackend}. Never touches the network. */\nexport class MockTransport implements Transport {\n readonly backend: MockBackend;\n constructor(backend?: MockBackend) {\n this.backend = backend ?? new MockBackend();\n }\n\n async enroll(req: EnrollRequest): Promise<EnrollResponse> {\n return this.backend.enroll(req);\n }\n async signUp(req: SignUpRequest): Promise<SignUpResponse> {\n return this.backend.signUp(req);\n }\n async verify(req: VerifyRequest): Promise<VerifyResponse> {\n return this.backend.verify(req);\n }\n async whoami(): Promise<WhoAmI> {\n return this.backend.whoami();\n }\n async createInbox(req: CreateInboxRequest): Promise<Inbox> {\n return this.backend.createInbox(req);\n }\n async listInboxes(params: ListInboxesParams): Promise<Page<Inbox>> {\n return this.backend.listInboxes(params);\n }\n async getInbox(address: string): Promise<Inbox> {\n const inbox = this.backend.getInbox(address);\n if (!inbox) throw notFound(\"inbox\", address);\n return inbox;\n }\n async updateInbox(address: string, req: UpdateInboxRequest): Promise<Inbox> {\n const inbox = this.backend.updateInbox(address, req);\n if (!inbox) throw notFound(\"inbox\", address);\n return inbox;\n }\n async deleteInbox(address: string): Promise<void> {\n this.backend.deleteInbox(address);\n }\n async createInboxInProject(projectId: string, req: CreateInboxRequest): Promise<Inbox> {\n return this.backend.createInboxInProject(projectId, req);\n }\n async listInboxesInProject(projectId: string, params: ProjectInboxListParams): Promise<List<Inbox>> {\n return this.backend.listInboxesInProject(projectId, params);\n }\n async getInboxInProject(projectId: string, inboxId: string): Promise<Inbox> {\n const inbox = this.backend.getInboxInProject(projectId, inboxId);\n if (!inbox) throw notFound(\"inbox\", inboxId);\n return inbox;\n }\n async updateInboxInProject(\n projectId: string,\n inboxId: string,\n req: UpdateInboxRequest,\n ): Promise<Inbox> {\n const inbox = this.backend.updateInboxInProject(projectId, inboxId, req);\n if (!inbox) throw notFound(\"inbox\", inboxId);\n return inbox;\n }\n async deleteInboxInProject(projectId: string, inboxId: string): Promise<void> {\n if (!this.backend.deleteInboxInProject(projectId, inboxId)) throw notFound(\"inbox\", inboxId);\n }\n async getInboxCredentialsInProject(projectId: string, inboxId: string): Promise<InboxCredentials> {\n const creds = this.backend.getInboxCredentialsInProject(projectId, inboxId);\n if (!creds) throw notFound(\"inbox\", inboxId);\n return creds;\n }\n async send(address: string, req: SendRequest): Promise<SendOutcome> {\n return this.backend.send(address, req);\n }\n async reply(address: string, req: ReplyRequest): Promise<SendOutcome> {\n return this.backend.reply(address, req);\n }\n async forward(address: string, messageId: string, req: ForwardRequest): Promise<SendOutcome> {\n return this.backend.forward(address, messageId, req);\n }\n async listMessages(address: string, params: ListMessagesParams): Promise<Page<Message>> {\n return this.backend.listMessages(address, params);\n }\n async getMessage(messageId: string): Promise<Message> {\n try {\n return this.backend.getMessage(messageId);\n } catch {\n throw notFound(\"message\", messageId);\n }\n }\n async getMessageRaw(_address: string, messageId: string): Promise<string> {\n try {\n return this.backend.getMessageRaw(messageId);\n } catch {\n throw notFound(\"message\", messageId);\n }\n }\n async listAttachments(_address: string, messageId: string): Promise<Page<Attachment>> {\n try {\n return this.backend.listAttachments(messageId);\n } catch {\n throw notFound(\"message\", messageId);\n }\n }\n async getAttachment(\n _address: string,\n messageId: string,\n attachmentId: string,\n ): Promise<AttachmentDownload> {\n try {\n return this.backend.getAttachment(messageId, attachmentId);\n } catch {\n throw notFound(\"attachment\", attachmentId);\n }\n }\n async markRead(_address: string, messageId: string, req: MarkReadRequest): Promise<Message> {\n try {\n return this.backend.markRead(messageId, req.read);\n } catch {\n throw notFound(\"message\", messageId);\n }\n }\n async deleteMessage(address: string, messageId: string, expunge?: boolean): Promise<DeleteResult> {\n const res = this.backend.deleteMessage(address, messageId, expunge ?? false);\n if (!res) throw notFound(\"message\", messageId);\n return res;\n }\n async batchUpdateMessages(\n address: string,\n req: BatchUpdateMessagesRequest,\n ): Promise<BatchUpdateResult> {\n if (req.read === undefined && req.folder === undefined) {\n throw invalid(\"set read and/or folder to update\");\n }\n const res = this.backend.batchUpdateMessages(address, req.ids, req.read, req.folder);\n if (!res) throw notFound(\"inbox\", address);\n return res;\n }\n async searchMessages(address: string, params: SearchMessagesParams): Promise<Page<Message>> {\n return this.backend.searchMessages(address, params);\n }\n async listThreads(address: string, _params: ListThreadsParams): Promise<Page<Thread>> {\n return this.backend.listThreads(address);\n }\n async searchThreads(address: string, params: SearchMessagesParams): Promise<Page<Thread>> {\n return this.backend.searchThreads(address, params);\n }\n async getThread(address: string, threadId: string): Promise<ThreadDetail> {\n try {\n return this.backend.getThread(address, threadId);\n } catch {\n throw notFound(\"thread\", threadId);\n }\n }\n async deleteThread(address: string, threadId: string, expunge?: boolean): Promise<DeleteResult> {\n const res = this.backend.deleteThread(address, threadId, expunge ?? false);\n if (!res) throw notFound(\"thread\", threadId);\n return res;\n }\n async waitForEmail(\n address: string,\n req: WaitForEmailRequest,\n _timeoutMs: number,\n signal?: AbortSignal,\n ): Promise<WaitForEmailResult> {\n if (signal?.aborted) throw notFound(\"inbox\", address);\n return this.backend.waitForEmail(address, req);\n }\n async registerWebhook(req: RegisterWebhookRequest): Promise<Webhook> {\n return this.backend.registerWebhook(req);\n }\n async listWebhooks(): Promise<Page<Webhook>> {\n return this.backend.listWebhooks();\n }\n async getWebhook(webhookId: string): Promise<Webhook> {\n const hook = this.backend.getWebhook(webhookId);\n if (!hook) throw notFound(\"webhook\", webhookId);\n return hook;\n }\n async updateWebhook(webhookId: string, req: UpdateWebhookRequest): Promise<Webhook> {\n const hook = this.backend.updateWebhook(webhookId, req);\n if (!hook) throw notFound(\"webhook\", webhookId);\n return hook;\n }\n async deleteWebhook(webhookId: string): Promise<void> {\n if (!this.backend.deleteWebhook(webhookId)) throw notFound(\"webhook\", webhookId);\n }\n async addContactListEntry(address: string, req: AddContactListRequest): Promise<ContactListEntry> {\n const entry = this.backend.addContactListEntry(address, req);\n if (!entry) throw notFound(\"inbox\", address);\n return entry;\n }\n async listContactLists(address: string): Promise<Page<ContactListEntry>> {\n const page = this.backend.listContactLists(address);\n if (!page) throw notFound(\"inbox\", address);\n return page;\n }\n async deleteContactListEntry(address: string, entryId: string): Promise<void> {\n if (!this.backend.deleteContactListEntry(address, entryId)) throw notFound(\"contact list entry\", entryId);\n }\n async precheckSuppression(recipient: string): Promise<SuppressionPrecheck> {\n return this.backend.precheckSuppression(recipient);\n }\n async listSuppressions(params: ListSuppressionsParams): Promise<Page<SuppressionEntry>> {\n return this.backend.listSuppressions(params);\n }\n async revokeSuppression(id: string, reason: string): Promise<SuppressionEntry> {\n const row = this.backend.revokeSuppression(id, reason);\n if (!row) throw notFound(\"suppression\", id);\n return row;\n }\n async listDomains(): Promise<Page<Domain>> {\n return this.backend.listDomains();\n }\n async getDomain(domain: string): Promise<Domain> {\n const d = this.backend.getDomain(domain);\n if (!d) throw notFound(\"domain\", domain);\n return d;\n }\n async onboardDomain(req: OnboardDomainRequest): Promise<Domain> {\n return this.backend.onboardDomain(req);\n }\n async verifyDomain(domain: string): Promise<Domain> {\n const d = this.backend.verifyDomain(domain);\n if (!d) throw notFound(\"domain\", domain);\n return d;\n }\n async offboardDomain(domain: string): Promise<DomainOffboard> {\n if (!this.backend.offboardDomain(domain)) throw notFound(\"domain\", domain);\n // No job runner in the mock backend: report a synthetic succeeded teardown job\n // (the backend recorded it, so a follow-up getJob resolves it too).\n const jobId = `job-offboard-${domain.trim().toLowerCase()}`;\n return { domain, job_id: jobId, status: \"succeeded\", status_url: `/v1/jobs/${jobId}` };\n }\n async getJob(jobId: string): Promise<Job> {\n const job = this.backend.getJob(jobId);\n if (!job) throw notFound(\"job\", jobId);\n return job;\n }\n async submitForReview(address: string, req: SendRequest): Promise<SendOutcome> {\n return this.backend.submitForReview(address, req);\n }\n async submitReplyForReview(address: string, req: ReplyRequest): Promise<SendOutcome> {\n return this.backend.submitReplyForReview(address, req);\n }\n async listReviews(params: ListReviewsParams): Promise<Page<Review>> {\n return this.backend.listReviews(params);\n }\n async getReview(reviewId: string): Promise<Review> {\n const r = this.backend.getReview(reviewId);\n if (!r) throw notFound(\"review\", reviewId);\n return r;\n }\n async getReviewTurns(reviewId: string): Promise<Page<ReviewTurn>> {\n const turns = this.backend.getReviewTurns(reviewId);\n if (!turns) throw notFound(\"review\", reviewId);\n return turns;\n }\n async getReviewFeedback(reviewId: string): Promise<ReviewFeedback> {\n const fb = this.backend.getReviewFeedback(reviewId);\n if (!fb) throw notFound(\"review\", reviewId);\n return fb;\n }\n async postReviewChat(reviewId: string, req: PostReviewChatRequest, idempotencyKey?: string): Promise<Review> {\n const r = this.backend.postReviewChat(reviewId, req, idempotencyKey);\n if (!r) throw notFound(\"review\", reviewId);\n return r;\n }\n async submitRevision(reviewId: string, req: SubmitRevisionRequest): Promise<Review> {\n const r = this.backend.submitRevision(reviewId, req);\n if (!r) throw notFound(\"review\", reviewId);\n return r;\n }\n async cancelReview(reviewId: string, _idempotencyKey?: string): Promise<Review> {\n const r = this.backend.cancelReview(reviewId);\n if (!r) throw notFound(\"review\", reviewId);\n return r;\n }\n async restampReview(reviewId: string, req: RestampReviewRequest): Promise<Review> {\n const r = this.backend.restampReview(reviewId, req);\n if (!r) throw notFound(\"review\", reviewId);\n return r;\n }\n async getReviewDecisionContext(reviewId: string): Promise<ReviewDecisionContext> {\n const dc = this.backend.getReviewDecisionContext(reviewId);\n if (!dc) throw notFound(\"review\", reviewId);\n return dc;\n }\n async reviewerDecide(reviewId: string, req: ReviewerDecisionRequest): Promise<ReviewerDecisionResult> {\n const res = this.backend.reviewerDecide(reviewId, req);\n if (!res) throw notFound(\"review\", reviewId);\n return res;\n }\n async listReviewEvents(params: ListReviewEventsParams): Promise<ReviewEventsResult> {\n return this.backend.listReviewEvents(params);\n }\n async waitForReviewEvent(params: WaitForReviewEventParams): Promise<ReviewEventsResult> {\n return this.backend.waitForReviewEvent(params);\n }\n async ackReviewEvent(req: AckReviewEventRequest): Promise<AckReviewEventResult> {\n return this.backend.ackReviewEvent(req);\n }\n async listCategories(params: ListCategoriesParams): Promise<Page<Category>> {\n return this.backend.listCategories(params);\n }\n async getCategory(categoryId: string): Promise<Category> {\n const c = this.backend.getCategory(categoryId);\n if (!c) throw notFound(\"category\", categoryId);\n return c;\n }\n async proposeCategory(req: ProposeCategoryRequest): Promise<Category> {\n return this.backend.proposeCategory(req);\n }\n async updateCategory(categoryId: string, req: UpdateCategoryRequest): Promise<Category> {\n const c = this.backend.updateCategory(categoryId, req);\n if (!c) throw notFound(\"category\", categoryId);\n return c;\n }\n async getRiskDial(): Promise<RiskDial> {\n return this.backend.getRiskDial();\n }\n async getGraduationStatus(categoryId: string): Promise<GraduationStatus> {\n const st = this.backend.getGraduationStatus(categoryId);\n if (!st) throw notFound(\"category\", categoryId);\n return st;\n }\n async proposeGraduation(categoryId: string, req: ProposeGraduationRequest): Promise<GraduationStatus> {\n const st = this.backend.proposeGraduation(categoryId, req);\n if (!st) throw notFound(\"category\", categoryId);\n return st;\n }\n async getScanBacklogStatus(categoryId: string): Promise<ScanBacklogStatus> {\n const st = this.backend.getScanBacklogStatus(categoryId);\n if (!st) throw notFound(\"category\", categoryId);\n return st;\n }\n async getCategoryPacingState(categoryId: string): Promise<CategoryPacingState> {\n const st = this.backend.getCategoryPacingState(categoryId);\n if (!st) throw notFound(\"category\", categoryId);\n return st;\n }\n async getRules(params: GetRulesParams): Promise<Page<Rule>> {\n return this.backend.getRules(params);\n }\n async saveRule(req: SaveRuleRequest): Promise<Rule> {\n return this.backend.saveRule(req);\n }\n async promoteRule(ruleId: string, toScope: \"general\" | \"category\"): Promise<Rule> {\n const r = this.backend.promoteRule(ruleId, toScope);\n if (!r) throw notFound(\"rule\", ruleId);\n return r;\n }\n async retireRule(ruleId: string): Promise<Rule> {\n const r = this.backend.retireRule(ruleId);\n if (!r) throw notFound(\"rule\", ruleId);\n return r;\n }\n async getRuleAudit(params: GetRuleAuditParams): Promise<Page<RuleAuditEntry>> {\n return this.backend.getRuleAudit(params);\n }\n async undoRuleChange(udoId: string): Promise<Rule> {\n return this.backend.undoRuleChange(udoId);\n }\n async *stream(\n address: string | null,\n lastEventId?: number,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent, void, unknown> {\n for await (const ev of this.backend.streamEvents(address, lastEventId)) {\n if (signal?.aborted) return;\n yield ev;\n }\n }\n}\n\nfunction notFound(kind: string, id: string): NotFoundError {\n return new NotFoundError({\n status: 404,\n code: \"not_found\",\n message: `No ${kind} found for \"${id}\" in the offline mock.`,\n });\n}\n\nfunction invalid(message: string): ValidationError {\n return new ValidationError({ status: 400, code: \"invalid\", message });\n}\n\n/** Runtime-agnostic base64 of a byte array (no Buffer dependency). */\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]!);\n if (typeof btoa === \"function\") return btoa(binary);\n // Node fallback when btoa is unavailable.\n const g = globalThis as { Buffer?: { from(s: string, enc: string): { toString(enc: string): string } } };\n if (g.Buffer) return g.Buffer.from(binary, \"binary\").toString(\"base64\");\n throw new Error(\"No base64 encoder available in this runtime.\");\n}\n\n/** Pull a filename out of a Content-Disposition header value. */\nfunction filenameFromDisposition(disposition: string): string {\n const m = /filename\\*?=(?:UTF-8'')?\"?([^\";]+)\"?/i.exec(disposition);\n return m ? decodeURIComponent(m[1]!.trim()) : \"\";\n}\n","/**\n * Key-tier awareness (redesign §3.1).\n *\n * An agent key encodes its CEILING tier in its raw prefix. The SDK never trusts\n * client input for scope — the tier is derived from the key the caller already\n * holds, purely as a client-side hint so an app can branch (e.g. an org-tier key\n * MUST pick a project breadth on a list; a project/inbox key may use the bare\n * sugar). The server remains the source of truth; this is advisory only.\n *\n * Prefix scheme (the secret tail is unchanged across tiers):\n * - `pk_agent_org_…` → {@link KeyTier.Org} (admin/console mint only)\n * - `pk_agent_proj_…` → {@link KeyTier.Project} (enrollment redeem + console)\n * - `pk_agent_inbox_…` → {@link KeyTier.Inbox} (admin/console mint only)\n * - legacy `pk_agent_…` (no tier segment) → {@link KeyTier.Project}\n */\n\n/** The ceiling tier encoded in an agent key's prefix. */\nexport type KeyTier = \"org\" | \"project\" | \"inbox\" | \"unknown\";\n\nconst AGENT_HEAD = \"pk_agent_\";\n\n/**\n * Derive the {@link KeyTier} from a raw agent key by peeking the segment after the\n * `pk_agent_` head. A legacy bare `pk_agent_…` key (no tier segment) maps to\n * `\"project\"` — exactly today's behavior. A non-agent credential (enrollment\n * token, Clerk session, empty) returns `\"unknown\"`.\n */\nexport function parseKeyTier(apiKey: string | undefined): KeyTier {\n if (!apiKey || !apiKey.startsWith(AGENT_HEAD)) return \"unknown\";\n const rest = apiKey.slice(AGENT_HEAD.length);\n if (rest.startsWith(\"org_\")) return \"org\";\n if (rest.startsWith(\"proj_\")) return \"project\";\n if (rest.startsWith(\"inbox_\")) return \"inbox\";\n // Bare `pk_agent_<id>_<secret>` (no tier segment) is a legacy project key.\n return \"project\";\n}\n\n/**\n * Whether a key of this tier can address the org-wide wildcard (`/v1/projects/-/…`).\n * Only an org-tier key may; a project/inbox key on the wildcard is a 403. Use this\n * to fail fast client-side before a round-trip.\n */\nexport function tierAllowsOrgWildcard(tier: KeyTier): boolean {\n return tier === \"org\";\n}\n\n/**\n * Whether a bare (project-less) list is unambiguous for this tier. An org-tier key\n * MUST pick a breadth (a concrete project or the `-` wildcard), so a bare list is a\n * 400 `breadth_required`; project/inbox keys default to their bound project.\n */\nexport function tierNeedsExplicitBreadth(tier: KeyTier): boolean {\n return tier === \"org\";\n}\n","/**\n * InboxHandle — an ergonomic, bound handle to a single inbox.\n *\n * Returned by `extrovert.inboxes.create(...)` and `extrovert.inbox(address)`, it scopes every operation\n * to one address so agent code reads naturally: `inbox.send(...)`, `inbox.waitForEmail(...)`. This\n * is the \"one agent = one inbox\" shape the spec's identity model encourages (§5).\n */\n\nimport type { AttachmentDownload, Transport } from \"../transport.js\";\nimport type {\n AddContactListRequest,\n Attachment,\n BatchUpdateMessagesRequest,\n BatchUpdateResult,\n ContactListEntry,\n DeleteResult,\n ForwardRequest,\n Inbox,\n InboxCredentials,\n InboxStatus,\n ListMessagesParams,\n ListThreadsParams,\n MarkReadRequest,\n Message,\n OnboardingMode,\n Page,\n RegisterWebhookRequest,\n ReplyRequest,\n SearchMessagesParams,\n SendOutcome,\n SendRequest,\n StreamEvent,\n StreamOptions,\n Thread,\n ThreadDetail,\n UpdateInboxRequest,\n WaitForEmailRequest,\n WaitForEmailResult,\n Webhook,\n} from \"../models.js\";\n\nexport interface InboxHandleOptions {\n /** Default per-call timeout for blocking calls; resolved from the client config. */\n defaultWaitTimeoutMs: number;\n}\n\nexport class InboxHandle {\n /** The canonical address, e.g. `agent7@smtp.extrovert.dev`. */\n readonly address: string;\n /** The full inbox record this handle was created from (absent when constructed by address). */\n readonly record: Inbox | undefined;\n\n constructor(\n private readonly transport: Transport,\n address: string,\n private readonly options: InboxHandleOptions,\n record?: Inbox,\n ) {\n this.address = address;\n this.record = record;\n }\n\n /** The inbox id, when known. */\n get id(): string | undefined {\n return this.record?.id;\n }\n\n /**\n * The canonical key every transport op routes on. The contract canonicalizes the\n * OPAQUE inbox id (`pmbx_…`) and accepts the address only as a within-project alias\n * (both are valid in the `{inbox_id}` path slot). When this handle was built from a\n * full record we route by the canonical `id` (matching the \"an inbox's canonical key\n * is its opaque id\" docs); when built bare from an address (`client.inbox(addr)`),\n * the address alias is the only key we have, so we route on it.\n */\n private get ref(): string {\n return this.record?.id ?? this.address;\n }\n\n /**\n * Arbitrary key-value metadata on this inbox, when known (from the record this\n * handle was created from). Call {@link refresh} to re-read it after an update.\n */\n get metadata(): Inbox[\"metadata\"] | undefined {\n return this.record?.metadata;\n }\n\n /** Effective rolling-24-hour recipient cap, when known. */\n get dailySendLimit(): number | undefined {\n return this.record?.daily_send_limit;\n }\n\n /** Provisioning status, when known. */\n get status(): InboxStatus | undefined {\n return this.record?.status;\n }\n\n /** Onboarding mode of the host domain, when known. */\n get onboardingMode(): OnboardingMode | undefined {\n return this.record?.onboarding_mode;\n }\n\n /** Credentials, present only when the inbox was created with `returnCredentials: true`. */\n get credentials(): InboxCredentials | undefined {\n return this.record?.credentials;\n }\n\n /** Re-fetch the live inbox record. */\n refresh(signal?: AbortSignal): Promise<Inbox> {\n return this.transport.getInbox(this.ref, signal);\n }\n\n /**\n * Update this inbox's settings in place without delete+recreate: rename the sender\n * `display_name`, change the `webhook_url`, patch arbitrary `metadata` (shallow\n * merge; a key set to `null` deletes it, top-level `metadata: null` clears all),\n * or set `daily_send_limit` to 1–10,000 recipients per rolling 24h. The limit\n * field requires the opt-in `mailbox:quota` scope.\n * Returns the updated inbox record.\n */\n update(req: UpdateInboxRequest, signal?: AbortSignal): Promise<Inbox> {\n return this.transport.updateInbox(this.ref, req, signal);\n }\n\n /**\n * Send an email from this authenticated inbox. Starts a new thread.\n *\n * Returns a three-way {@link SendOutcome}: `kind:\"queued_for_review\"` means a\n * human has to approve it and NOTHING has been delivered yet; anything else was\n * delivered. Under the default `require_review` policy a call WITHOUT an\n * `intent` raises `IntentRequiredError` (422) instead — nothing sent, nothing\n * queued — so pass one, or read `inbox.record.effective_review_policy` first.\n */\n send(req: SendRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.transport.send(this.ref, req, signal);\n }\n\n /**\n * Reply within an existing thread. Select the parent with `thread_id` (reply to\n * the latest message) or `message_id` (reply to that message); the server\n * derives To / Subject / In-Reply-To / References. Set `reply_all` to reply to\n * every thread recipient. Returns the same three-way {@link SendOutcome} as\n * {@link send} — a reply is governed by the review policy too.\n */\n reply(req: ReplyRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.transport.reply(this.ref, req, signal);\n }\n\n /**\n * Forward a message in this inbox to new recipients, preserving the original.\n *\n * A forward is an outbound message to arbitrary NEW recipients that quotes an\n * inbound thread, so it is governed by the review policy exactly like a send —\n * same {@link SendOutcome} union, same `intent` requirement.\n */\n forward(messageId: string, req: ForwardRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.transport.forward(this.ref, messageId, req, signal);\n }\n\n /**\n * Submit a new message from this inbox for human review (Review Loop, HITL).\n * Pass `intent` (required when the resolved mode is review) and optionally\n * `mode`/`category_id`. The account/inbox review policy decides whether the\n * message is queued for review (`kind:\"queued_for_review\"`) or sent on a\n * policy-permitted direct path (`kind:\"sent\"`). Monitor it via\n * `extrovert.reviews`.\n */\n submitForReview(req: SendRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.transport.submitForReview(this.ref, req, signal);\n }\n\n /**\n * Submit an in-thread reply from this inbox for human review (Review Loop).\n * Same routing/return contract as {@link submitForReview}.\n */\n submitReplyForReview(req: ReplyRequest, signal?: AbortSignal): Promise<SendOutcome> {\n return this.transport.submitReplyForReview(this.ref, req, signal);\n }\n\n /**\n * List messages in this inbox, newest first. Narrow with exact-field filters\n * (from/to/subject substring) or `unread: true` (native \\Seen); page with\n * limit + offset.\n */\n messages(params: ListMessagesParams = {}, signal?: AbortSignal): Promise<Page<Message>> {\n return this.transport.listMessages(this.ref, params, signal);\n }\n\n /** Full-text search this inbox (IMAP SEARCH over from/subject/body). */\n search(params: SearchMessagesParams, signal?: AbortSignal): Promise<Page<Message>> {\n return this.transport.searchMessages(this.ref, params, signal);\n }\n\n /** Download the raw RFC822 `.eml` bytes for a message in this inbox. */\n messageRaw(messageId: string, signal?: AbortSignal): Promise<string> {\n return this.transport.getMessageRaw(this.ref, messageId, signal);\n }\n\n /** Mark a message in this inbox read/unread via the native \\Seen flag. */\n markRead(messageId: string, req: MarkReadRequest, signal?: AbortSignal): Promise<Message> {\n return this.transport.markRead(this.ref, messageId, req, signal);\n }\n\n /**\n * Delete a message in this inbox: move it to Trash (default, recoverable) or\n * permanently remove it when `expunge` is true.\n */\n deleteMessage(messageId: string, expunge?: boolean, signal?: AbortSignal): Promise<DeleteResult> {\n return this.transport.deleteMessage(this.ref, messageId, expunge, signal);\n }\n\n /**\n * Batch mark read/unread and/or move folder for a list of message ids in this\n * inbox. At least one of `read` / `folder` must be set; returns the per-id\n * `{updated, failed}` split.\n */\n batchUpdateMessages(req: BatchUpdateMessagesRequest, signal?: AbortSignal): Promise<BatchUpdateResult> {\n return this.transport.batchUpdateMessages(this.ref, req, signal);\n }\n\n /** List a message's attachment metadata ({id, filename, content_type, size}). */\n attachments(messageId: string, signal?: AbortSignal): Promise<Page<Attachment>> {\n return this.transport.listAttachments(this.ref, messageId, signal);\n }\n\n /** Download one attachment's bytes (base64) plus filename and content type. */\n attachment(\n messageId: string,\n attachmentId: string,\n signal?: AbortSignal,\n ): Promise<AttachmentDownload> {\n return this.transport.getAttachment(this.ref, messageId, attachmentId, signal);\n }\n\n /** List conversation threads in this inbox, newest-active first. */\n threads(params: ListThreadsParams = {}, signal?: AbortSignal): Promise<Page<Thread>> {\n return this.transport.listThreads(this.ref, params, signal);\n }\n\n /** Thread-level search in this inbox (subject / snippet / participants). */\n searchThreads(params: SearchMessagesParams, signal?: AbortSignal): Promise<Page<Thread>> {\n return this.transport.searchThreads(this.ref, params, signal);\n }\n\n /** Fetch one thread (with its messages) in this inbox by stable id. */\n thread(threadId: string, signal?: AbortSignal): Promise<ThreadDetail> {\n return this.transport.getThread(this.ref, threadId, signal);\n }\n\n /**\n * Delete an entire thread in this inbox (every message): move to Trash\n * (default) or permanently remove when `expunge` is true.\n */\n deleteThread(threadId: string, expunge?: boolean, signal?: AbortSignal): Promise<DeleteResult> {\n return this.transport.deleteThread(this.ref, threadId, expunge, signal);\n }\n\n /**\n * Poll server-side until a matching message arrives and return it with an extracted\n * OTP / verification link. The HTTP read timeout is set a hair above the server-side\n * `timeoutSeconds` so the request doesn't abort before the server returns its own timeout result.\n */\n waitForEmail(req: WaitForEmailRequest = {}, signal?: AbortSignal): Promise<WaitForEmailResult> {\n const serverTimeoutSeconds = req.timeout_seconds ?? 300;\n // Give the HTTP read a 5s margin over the server's blocking window, and never read for less\n // than the client's configured default timeout.\n const readTimeoutMs = Math.max(\n serverTimeoutSeconds * 1000 + 5000,\n this.options.defaultWaitTimeoutMs,\n );\n return this.transport.waitForEmail(this.ref, req, readTimeoutMs, signal);\n }\n\n /** Register an HMAC-signed inbound webhook scoped to this inbox. */\n registerWebhook(\n req: Omit<RegisterWebhookRequest, \"inbox\">,\n signal?: AbortSignal,\n ): Promise<Webhook> {\n return this.transport.registerWebhook({ ...req, inbox: this.address }, signal);\n }\n\n /**\n * Add an allow/block contact-list entry to this inbox. A `block` entry rejects a\n * send to a matching recipient; once any `allow` entry exists, sends from this\n * inbox are restricted to recipients that match one (allowlist mode).\n */\n addContactListEntry(req: AddContactListRequest, signal?: AbortSignal): Promise<ContactListEntry> {\n return this.transport.addContactListEntry(this.ref, req, signal);\n }\n\n /** List the allow/block contact-list entries governing this inbox. */\n listContactLists(signal?: AbortSignal): Promise<Page<ContactListEntry>> {\n return this.transport.listContactLists(this.ref, signal);\n }\n\n /** Delete a contact-list entry on this inbox by id. */\n deleteContactListEntry(entryId: string, signal?: AbortSignal): Promise<void> {\n return this.transport.deleteContactListEntry(this.ref, entryId, signal);\n }\n\n /**\n * Watch this inbox live (Server-Sent Events). Returns an async iterator of\n * {@link StreamEvent}; each `message.received` event arrives as it lands instead\n * of polling {@link waitForEmail}. Pass `lastEventId` (the `seq` of the last\n * event you saw) to resume without gaps after a reconnect, and a `signal` to\n * close the stream.\n *\n * ```ts\n * for await (const ev of inbox.stream()) {\n * if (ev.event === \"message.received\") console.log(\"new mail:\", ev.message?.subject);\n * }\n * ```\n */\n stream(options: StreamOptions = {}): AsyncGenerator<StreamEvent, void, unknown> {\n return this.transport.stream(this.ref, options.lastEventId, options.signal);\n }\n\n /**\n * Convenience wrapper over {@link stream}: invoke `onEvent` for every event until\n * the stream closes (or `signal` aborts). Returns when the stream ends.\n */\n async subscribe(\n onEvent: (event: StreamEvent) => void | Promise<void>,\n options: StreamOptions = {},\n ): Promise<void> {\n for await (const ev of this.stream(options)) {\n await onEvent(ev);\n }\n }\n\n /**\n * Permanently tear down this inbox and its messages/sender identity. Requires\n * `mailbox:delete`; this operation cannot be undone.\n */\n delete(signal?: AbortSignal): Promise<void> {\n return this.transport.deleteInbox(this.ref, signal);\n }\n}\n","/**\n * The ONE list envelope + opaque-cursor iteration (redesign §5.2 / §6.2).\n *\n * Every redesign collection endpoint (the canonical `x.projects.inboxes.*` chain\n * and beyond) returns {@link List}: `{ object: \"list\", data, has_more, next_cursor }`.\n * `next_cursor` is OPAQUE — treat it as a token and pass it back verbatim as\n * `?cursor` to fetch the next page. {@link ListPage} wraps a raw {@link List} with\n * ergonomic iteration (`for await … of`) and a `nextPage()` cursor walker so callers\n * never thread cursors by hand.\n */\n\n/** The opaque pagination cursor. Pass it back verbatim as `?cursor`; never parse it. */\nexport type Cursor = string;\n\n/** The one collection envelope for every redesign list response. */\nexport interface List<T> {\n /** Always the literal `\"list\"`. */\n object: \"list\";\n /** The rows on this page. */\n data: T[];\n /** True when another page exists (i.e. `next_cursor` is non-null). */\n has_more: boolean;\n /** Opaque cursor for the next page, or `null` on the last page. */\n next_cursor: Cursor | null;\n}\n\n/** Query params shared by every cursor-paginated list. */\nexport interface ListParams {\n /** Page size (server clamps to 1–100; default 50). */\n limit?: number;\n /** Opaque cursor from a prior page's `next_cursor`. */\n cursor?: Cursor;\n}\n\n/** A function that fetches one page given an opaque cursor (or undefined for page 1). */\nexport type PageFetcher<T> = (cursor: Cursor | undefined, signal?: AbortSignal) => Promise<List<T>>;\n\n/**\n * An ergonomic wrapper over a single {@link List} page that also knows how to fetch\n * the next page and auto-iterate across ALL pages.\n *\n * ```ts\n * const page = await x.projects.inboxes.list(\"proj_9k\");\n * for await (const inbox of page) console.log(inbox.id); // walks every page\n * // …or page-at-a-time:\n * if (page.hasMore) { const next = await page.nextPage(); }\n * ```\n */\nexport class ListPage<T> implements AsyncIterable<T> {\n /** The rows on THIS page. */\n readonly data: T[];\n /** True when another page exists. */\n readonly hasMore: boolean;\n /** Opaque cursor for the next page (null on the last page). */\n readonly nextCursor: Cursor | null;\n /** Always `\"list\"`. */\n readonly object = \"list\" as const;\n\n constructor(\n raw: List<T>,\n private readonly fetcher: PageFetcher<T>,\n ) {\n this.data = raw.data;\n this.hasMore = raw.has_more;\n this.nextCursor = raw.next_cursor;\n }\n\n /**\n * Fetch the next page. Throws if there is none — guard with {@link hasMore}.\n */\n async nextPage(signal?: AbortSignal): Promise<ListPage<T>> {\n if (!this.hasMore || this.nextCursor === null) {\n throw new Error(\"Extrovert: no more pages (next_cursor is null).\");\n }\n const raw = await this.fetcher(this.nextCursor, signal);\n return new ListPage(raw, this.fetcher);\n }\n\n /**\n * Auto-paginate: yield every row across every page, fetching subsequent pages\n * lazily as the iterator is consumed. The default iteration of a `ListPage`.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let page: ListPage<T> = this;\n for (;;) {\n for (const item of page.data) yield item;\n if (!page.hasMore || page.nextCursor === null) return;\n page = await page.nextPage();\n }\n }\n\n /** Collect EVERY row across EVERY page into a single array (eager). */\n async collect(signal?: AbortSignal): Promise<T[]> {\n const out: T[] = [...this.data];\n let page: ListPage<T> = this;\n while (page.hasMore && page.nextCursor !== null) {\n page = await page.nextPage(signal);\n out.push(...page.data);\n }\n return out;\n }\n}\n\n/** Build a {@link ListPage} from the first raw {@link List} and a page fetcher. */\nexport function listPage<T>(raw: List<T>, fetcher: PageFetcher<T>): ListPage<T> {\n return new ListPage(raw, fetcher);\n}\n","/**\n * `extrovert.projects` — the CANONICAL project-scoped resource chain (redesign §4).\n *\n * Scope lives in the KEY; a broad (org-tier) key narrows to one project by PATH.\n * The headline chain is `x.projects.inboxes.*`, mirroring\n * `/v1/projects/{project_id}/inboxes[/{inbox_id}]`:\n *\n * ```ts\n * const inbox = await x.projects.inboxes.create(\"proj_9k\", { username: \"ada\" });\n * const page = await x.projects.inboxes.list(\"proj_9k\"); // List envelope\n * for await (const i of page) console.log(i.id); // auto-paginates\n * await x.projects.inboxes.send(\"proj_9k\", inbox.id, { to, subject, text });\n * ```\n *\n * Operations are keyed by the OPAQUE `inbox_id` (the inbox's email address is also\n * accepted as a within-project alias). `projectId` may be `\"-\"` for the org-wide\n * wildcard — only an org-tier key may use it (others get 403 `forbidden_scope`).\n *\n * The bare `x.inboxes.*` / `x.inbox(address)` surface is curl-style sugar that\n * resolves to the key's default project; this chain is the contract-canonical one.\n */\n\nimport type { Transport, AttachmentDownload } from \"../transport.js\";\nimport { ValidationError } from \"../errors.js\";\nimport { ListPage } from \"../pagination.js\";\nimport type {\n Attachment,\n BatchUpdateMessagesRequest,\n BatchUpdateResult,\n CreateInboxRequest,\n DeleteResult,\n ForwardRequest,\n GetInboxParams,\n Inbox,\n InboxCredentials,\n ListMessagesParams,\n ListThreadsParams,\n MarkReadRequest,\n Message,\n Page,\n ProjectInboxListParams,\n ReplyRequest,\n SearchMessagesParams,\n SendOutcome,\n SendRequest,\n Thread,\n ThreadDetail,\n UpdateInboxRequest,\n WaitForEmailRequest,\n WaitForEmailResult,\n} from \"../models.js\";\nimport type { InboxHandleOptions } from \"./inbox-handle.js\";\n\n/** Options forwarded into the chain (per-call wait timeout, resolved from the client). */\ninterface ProjectsContext {\n transport: Transport;\n handleOptions: InboxHandleOptions;\n}\n\n/**\n * `x.projects.inboxes` — create / list / get / update / delete inboxes, plus the\n * send / reply / message / thread / wait operations, all scoped to one project (or\n * the `-` org wildcard for an org-tier key). List returns a {@link ListPage} that\n * auto-paginates over the opaque-cursor {@link import(\"../pagination.js\").List} envelope.\n */\nexport class ProjectInboxes {\n constructor(private readonly ctx: ProjectsContext) {}\n\n /** Create an inbox in `projectId`. `idempotencyKey` (or `req.client_id`) makes it exactly-once. */\n create(\n projectId: string,\n req: CreateInboxRequest = {},\n idempotencyKey?: string,\n signal?: AbortSignal,\n ): Promise<Inbox> {\n return this.ctx.transport.createInboxInProject(\n projectId,\n req,\n idempotencyKey ?? req.client_id,\n signal,\n );\n }\n\n /**\n * List inboxes in `projectId` (or the org subtree with `projectId=\"-\"`). Returns a\n * {@link ListPage} that yields the {@link import(\"../pagination.js\").List} envelope's\n * rows and auto-paginates across pages via the opaque cursor.\n */\n async list(\n projectId: string,\n params: ProjectInboxListParams = {},\n signal?: AbortSignal,\n ): Promise<ListPage<Inbox>> {\n const fetcher = (cursor: string | undefined, s?: AbortSignal) =>\n this.ctx.transport.listInboxesInProject(projectId, { ...params, cursor }, s);\n const first = await fetcher(params.cursor, signal);\n return new ListPage(first, fetcher);\n }\n\n /** Get an inbox by opaque `inboxId` (or address alias) in `projectId`. */\n get(\n projectId: string,\n inboxId: string,\n params: GetInboxParams = {},\n signal?: AbortSignal,\n ): Promise<Inbox> {\n return this.ctx.transport.getInboxInProject(projectId, inboxId, params, signal);\n }\n\n /**\n * Update an inbox in place (display name / webhook / metadata / daily send\n * limit). `daily_send_limit` requires the opt-in `mailbox:quota` scope.\n */\n update(\n projectId: string,\n inboxId: string,\n req: UpdateInboxRequest,\n signal?: AbortSignal,\n ): Promise<Inbox> {\n return this.ctx.transport.updateInboxInProject(projectId, inboxId, req, signal);\n }\n\n /**\n * Permanently delete an inbox by opaque id (or address alias). Requires\n * `mailbox:delete`; the inbox and its messages cannot be recovered.\n */\n delete(projectId: string, inboxId: string, signal?: AbortSignal): Promise<void> {\n return this.ctx.transport.deleteInboxInProject(projectId, inboxId, signal);\n }\n\n /** Fetch IMAP/SMTP connection settings + login for an inbox. */\n credentials(projectId: string, inboxId: string, signal?: AbortSignal): Promise<InboxCredentials> {\n return this.ctx.transport.getInboxCredentialsInProject(projectId, inboxId, signal);\n }\n\n /**\n * Send an email from an inbox in `projectId`.\n *\n * Returns a three-way {@link SendOutcome}: `kind:\"queued_for_review\"` means a\n * human has to approve it and NOTHING has been delivered yet; anything else was\n * delivered. Under the default `require_review` policy a call WITHOUT an\n * `intent` raises `IntentRequiredError` (422) instead — nothing sent, nothing\n * queued — so pass one, or read `inbox.record.effective_review_policy` first.\n */\n send(\n projectId: string,\n inboxId: string,\n req: SendRequest,\n signal?: AbortSignal,\n ): Promise<SendOutcome> {\n return this.ctx.transport.send(this.ref(projectId, inboxId), req, signal);\n }\n\n /** Reply within a thread from an inbox in `projectId`. See {@link send} on the return union. */\n reply(\n projectId: string,\n inboxId: string,\n req: ReplyRequest,\n signal?: AbortSignal,\n ): Promise<SendOutcome> {\n return this.ctx.transport.reply(this.ref(projectId, inboxId), req, signal);\n }\n\n /** Forward a message from an inbox in `projectId`. See {@link send} on the return union. */\n forward(\n projectId: string,\n inboxId: string,\n messageId: string,\n req: ForwardRequest,\n signal?: AbortSignal,\n ): Promise<SendOutcome> {\n return this.ctx.transport.forward(this.ref(projectId, inboxId), messageId, req, signal);\n }\n\n /** List messages in an inbox in `projectId`. */\n messages(\n projectId: string,\n inboxId: string,\n params: ListMessagesParams = {},\n signal?: AbortSignal,\n ): Promise<Page<Message>> {\n return this.ctx.transport.listMessages(this.ref(projectId, inboxId), params, signal);\n }\n\n /** Search messages in an inbox in `projectId`. */\n searchMessages(\n projectId: string,\n inboxId: string,\n params: SearchMessagesParams,\n signal?: AbortSignal,\n ): Promise<Page<Message>> {\n return this.ctx.transport.searchMessages(this.ref(projectId, inboxId), params, signal);\n }\n\n /** Mark a message read/unread in an inbox in `projectId`. */\n markRead(\n projectId: string,\n inboxId: string,\n messageId: string,\n req: MarkReadRequest,\n signal?: AbortSignal,\n ): Promise<Message> {\n return this.ctx.transport.markRead(this.ref(projectId, inboxId), messageId, req, signal);\n }\n\n /** Delete a message in an inbox in `projectId`. */\n deleteMessage(\n projectId: string,\n inboxId: string,\n messageId: string,\n expunge?: boolean,\n signal?: AbortSignal,\n ): Promise<DeleteResult> {\n return this.ctx.transport.deleteMessage(this.ref(projectId, inboxId), messageId, expunge, signal);\n }\n\n /** Batch mark/move messages in an inbox in `projectId`. */\n batchUpdateMessages(\n projectId: string,\n inboxId: string,\n req: BatchUpdateMessagesRequest,\n signal?: AbortSignal,\n ): Promise<BatchUpdateResult> {\n return this.ctx.transport.batchUpdateMessages(this.ref(projectId, inboxId), req, signal);\n }\n\n /** List a message's attachment metadata. */\n attachments(\n projectId: string,\n inboxId: string,\n messageId: string,\n signal?: AbortSignal,\n ): Promise<Page<Attachment>> {\n return this.ctx.transport.listAttachments(this.ref(projectId, inboxId), messageId, signal);\n }\n\n /** Download one attachment's bytes + filename + content type. */\n attachment(\n projectId: string,\n inboxId: string,\n messageId: string,\n attachmentId: string,\n signal?: AbortSignal,\n ): Promise<AttachmentDownload> {\n return this.ctx.transport.getAttachment(this.ref(projectId, inboxId), messageId, attachmentId, signal);\n }\n\n /** List conversation threads in an inbox in `projectId`. */\n threads(\n projectId: string,\n inboxId: string,\n params: ListThreadsParams = {},\n signal?: AbortSignal,\n ): Promise<Page<Thread>> {\n return this.ctx.transport.listThreads(this.ref(projectId, inboxId), params, signal);\n }\n\n /** Fetch one thread (+ its messages) in an inbox in `projectId`. */\n thread(\n projectId: string,\n inboxId: string,\n threadId: string,\n signal?: AbortSignal,\n ): Promise<ThreadDetail> {\n return this.ctx.transport.getThread(this.ref(projectId, inboxId), threadId, signal);\n }\n\n /**\n * Block until a matching message arrives in an inbox in `projectId` and return it\n * with an extracted OTP / verification link.\n */\n waitForEmail(\n projectId: string,\n inboxId: string,\n req: WaitForEmailRequest = {},\n signal?: AbortSignal,\n ): Promise<WaitForEmailResult> {\n const serverTimeoutSeconds = req.timeout_seconds ?? 300;\n const readTimeoutMs = Math.max(\n serverTimeoutSeconds * 1000 + 5000,\n this.ctx.handleOptions.defaultWaitTimeoutMs,\n );\n return this.ctx.transport.waitForEmail(this.ref(projectId, inboxId), req, readTimeoutMs, signal);\n }\n\n /**\n * The inbox reference the message/send/thread transport methods key on.\n *\n * The frozen contract project-prefixes ONLY the inbox collection/item/credentials\n * routes (`/v1/projects/{project_id}/inboxes[/{inbox_id}][/credentials]`); the\n * send/reply/forward/message/thread/wait sub-ops have NO project-prefixed path —\n * they address the inbox by its opaque id directly (`/v1/inboxes/{inbox_id}/…`),\n * where the project is implicit in (and enforced by) the inbox id server-side.\n *\n * So for these sub-ops `projectId` cannot be carried on the URL and is NOT a URL\n * selector. The adversarial review flagged that silently discarding it makes the\n * signature misleading. CHOICE: keep the arg (dropping it would break the chain's\n * symmetry with create/list/get/update/delete — the more disruptive option) but\n * VALIDATE it rather than ignore it. We reject the two client mistakes we can catch\n * without a round-trip:\n * - a blank / whitespace-only `projectId` (a required selector everywhere else in\n * the chain), and\n * - the org wildcard `-`, which is meaningless for a single-inbox op (there is no\n * breadth to pick).\n * The inbox-id ↔ project binding itself is enforced server-side by the opaque id.\n */\n private ref(projectId: string, inboxId: string): string {\n if (projectId.trim() === \"\") {\n throw new ValidationError({\n status: 400,\n code: \"bad_request\",\n message:\n \"projectId is required for the x.projects.inboxes sub-operations. Pass the concrete \" +\n \"project id (or use the bare x.inboxes / x.inbox(id) surface for the key's default project).\",\n });\n }\n if (projectId === \"-\") {\n throw new ValidationError({\n status: 400,\n code: \"bad_request\",\n message:\n \"The org wildcard \\\"-\\\" is only valid for list/create breadth, not a single-inbox \" +\n \"operation. Pass the concrete project id (or use the bare x.inboxes / x.inbox(id) surface).\",\n });\n }\n return inboxId;\n }\n}\n\n/**\n * `extrovert.projects` — the canonical project-scoped resource namespace. Today it\n * exposes the `inboxes` chain (`x.projects.inboxes.*`); future project-scoped\n * resources (domains, agents) hang off the same namespace.\n */\nexport class Projects {\n /** `x.projects.inboxes.*` — the canonical inbox chain. */\n readonly inboxes: ProjectInboxes;\n\n constructor(ctx: ProjectsContext) {\n this.inboxes = new ProjectInboxes(ctx);\n }\n}\n","/**\n * Resource namespaces: `extrovert.inboxes`, `extrovert.messages`, `extrovert.threads`,\n * `extrovert.webhooks`, `extrovert.contactLists`, `extrovert.domains`. Each is a thin,\n * typed facade over the {@link Transport}.\n */\n\nimport type { AttachmentDownload, Transport } from \"../transport.js\";\nimport { BreadthRequiredError } from \"../errors.js\";\nimport { tierNeedsExplicitBreadth, type KeyTier } from \"../key-tier.js\";\nimport { InboxHandle, type InboxHandleOptions } from \"./inbox-handle.js\";\nimport type {\n AckReviewEventRequest,\n AckReviewEventResult,\n AddContactListRequest,\n Attachment,\n BatchUpdateMessagesRequest,\n BatchUpdateResult,\n Category,\n ContactListEntry,\n CreateInboxRequest,\n DeleteResult,\n Domain,\n DomainOffboard,\n Inbox,\n ListCategoriesParams,\n ListInboxesParams,\n ListReviewEventsParams,\n ListReviewsParams,\n MarkReadRequest,\n Message,\n OnboardDomainRequest,\n Page,\n ProposeCategoryRequest,\n ProposeGraduationRequest,\n GetRulesParams,\n GetRuleAuditParams,\n GraduationStatus,\n RiskDial,\n Rule,\n RuleAuditEntry,\n SaveRuleRequest,\n PostReviewChatRequest,\n RegisterWebhookRequest,\n RestampReviewRequest,\n CategoryPacingState,\n Review,\n ReviewDecisionContext,\n ReviewerDecisionRequest,\n ReviewerDecisionResult,\n ReviewEventsResult,\n ReviewFeedback,\n ReviewTurn,\n ScanBacklogStatus,\n SubmitRevisionRequest,\n SuppressionEntry,\n SuppressionPrecheck,\n ListSuppressionsParams,\n ThreadDetail,\n UpdateCategoryRequest,\n UpdateInboxRequest,\n UpdateWebhookRequest,\n WaitForReviewEventParams,\n Webhook,\n} from \"../models.js\";\n\nexport { InboxHandle } from \"./inbox-handle.js\";\nexport { Projects, ProjectInboxes } from \"./projects.js\";\n\ninterface ResourceContext {\n transport: Transport;\n handleOptions: InboxHandleOptions;\n /**\n * The CEILING tier derived from the configured key prefix. Advisory client-side\n * hint ONLY (the server stays authoritative); lets the bare sugar surface fail\n * fast for an org-tier key that must pick a breadth, matching the MCP surface.\n */\n keyTier: KeyTier;\n}\n\n/** `extrovert.inboxes` — create, list, get, update, delete inboxes. */\nexport class Inboxes {\n constructor(private readonly ctx: ResourceContext) {}\n\n /**\n * Create an inbox. The default path mints an address on a pre-verified shared subdomain of\n * `smtp.extrovert.dev`, so it returns a live, send-and-receive-capable inbox in one call.\n *\n * Pass `metadata` to attach arbitrary key-value data, and `client_id` for idempotent creation\n * (re-calling with the same id returns the same inbox, with its metadata replayed verbatim).\n */\n async create(req: CreateInboxRequest = {}, signal?: AbortSignal): Promise<InboxHandle> {\n const inbox = await this.ctx.transport.createInbox(req, req.client_id, signal);\n return new InboxHandle(this.ctx.transport, inbox.address, this.ctx.handleOptions, inbox);\n }\n\n /**\n * List inboxes visible to the calling key (the bare curl-sugar surface — resolves\n * to the key's default project). An org-tier key has no single default project, so\n * the bare list is ambiguous: fail fast client-side with a BreadthRequiredError that\n * names the next call, matching the MCP surface, instead of round-tripping to a 400.\n * Use `extrovert.projects.inboxes.list(\"<project_id>\")` or `\"-\"` (org subtree) for\n * an org key. The check is advisory — the server stays authoritative.\n */\n list(params: ListInboxesParams = {}, signal?: AbortSignal): Promise<Page<Inbox>> {\n if (tierNeedsExplicitBreadth(this.ctx.keyTier)) {\n return Promise.reject(\n new BreadthRequiredError({\n status: 400,\n code: \"breadth_required\",\n message:\n \"An org-tier key must pick a list breadth: use extrovert.projects.inboxes.list(\\\"<project_id>\\\") \" +\n \"or extrovert.projects.inboxes.list(\\\"-\\\") (the org subtree).\",\n }),\n );\n }\n return this.ctx.transport.listInboxes(params, signal);\n }\n\n /** Fetch a single inbox and return an ergonomic handle bound to it. */\n async get(address: string, signal?: AbortSignal): Promise<InboxHandle> {\n const inbox = await this.ctx.transport.getInbox(address, signal);\n return new InboxHandle(this.ctx.transport, inbox.address, this.ctx.handleOptions, inbox);\n }\n\n /**\n * Update an inbox's settings in place without delete+recreate: rename the sender\n * `display_name`, change the `webhook_url`, patch arbitrary `metadata` (shallow\n * merge; a key set to `null` deletes it, top-level `metadata: null` clears all),\n * or set the effective `daily_send_limit` (1–10,000 recipients per rolling 24h).\n * Updating the daily limit requires the opt-in `mailbox:quota` scope.\n * Returns a handle bound to the updated record.\n */\n async update(address: string, req: UpdateInboxRequest, signal?: AbortSignal): Promise<InboxHandle> {\n const inbox = await this.ctx.transport.updateInbox(address, req, signal);\n return new InboxHandle(this.ctx.transport, inbox.address, this.ctx.handleOptions, inbox);\n }\n\n /**\n * Permanently delete an inbox by address. Requires `mailbox:delete`; the inbox,\n * messages, and sender identity cannot be recovered.\n */\n delete(address: string, signal?: AbortSignal): Promise<void> {\n return this.ctx.transport.deleteInbox(address, signal);\n }\n}\n\n/**\n * `extrovert.messages` — read a message, fetch its raw bytes, mark it read.\n *\n * Reply and forward are inbox-scoped (the server resolves the parent and derives\n * recipients), so they live on the {@link InboxHandle} (`inbox.reply(...)`,\n * `inbox.forward(...)`), not here.\n */\nexport class Messages {\n constructor(private readonly ctx: ResourceContext) {}\n\n /** Fetch a single message by its opaque id; the owning inbox is resolved from the id. */\n get(messageId: string, signal?: AbortSignal): Promise<Message> {\n return this.ctx.transport.getMessage(messageId, signal);\n }\n\n /**\n * Download the raw RFC822 `.eml` bytes for a message. `inbox` is the owning\n * address (needed to open the inbox); the id identifies the message.\n */\n raw(inbox: string, messageId: string, signal?: AbortSignal): Promise<string> {\n return this.ctx.transport.getMessageRaw(inbox, messageId, signal);\n }\n\n /**\n * Mark a message read/unread via the native IMAP \\Seen flag (Extrovert's\n * label-free read state). `inbox` is the owning address.\n */\n markRead(\n inbox: string,\n messageId: string,\n req: MarkReadRequest,\n signal?: AbortSignal,\n ): Promise<Message> {\n return this.ctx.transport.markRead(inbox, messageId, req, signal);\n }\n\n /**\n * Delete a message: move it to Trash (default, recoverable) or permanently\n * remove it when `expunge` is true. `inbox` is the owning address.\n */\n delete(\n inbox: string,\n messageId: string,\n expunge?: boolean,\n signal?: AbortSignal,\n ): Promise<DeleteResult> {\n return this.ctx.transport.deleteMessage(inbox, messageId, expunge, signal);\n }\n\n /**\n * Batch mark read/unread and/or move folder for a list of message ids in one\n * inbox. At least one of `read` / `folder` must be set; returns the per-id\n * `{updated, failed}` split.\n */\n batchUpdate(\n inbox: string,\n req: BatchUpdateMessagesRequest,\n signal?: AbortSignal,\n ): Promise<BatchUpdateResult> {\n return this.ctx.transport.batchUpdateMessages(inbox, req, signal);\n }\n\n /**\n * List a message's attachment metadata ({id, filename, content_type, size}).\n * `inbox` is the owning address; the message id identifies the message.\n */\n listAttachments(inbox: string, messageId: string, signal?: AbortSignal): Promise<Page<Attachment>> {\n return this.ctx.transport.listAttachments(inbox, messageId, signal);\n }\n\n /**\n * Download one attachment's bytes (base64) plus its filename and content type.\n * The \"easy attachment fetch\": `inbox` is the owning address, `messageId` the\n * message, and `attachmentId` the opaque id from {@link listAttachments}.\n */\n getAttachment(\n inbox: string,\n messageId: string,\n attachmentId: string,\n signal?: AbortSignal,\n ): Promise<AttachmentDownload> {\n return this.ctx.transport.getAttachment(inbox, messageId, attachmentId, signal);\n }\n}\n\n/**\n * `extrovert.threads` — fetch a conversation thread (with its messages) by id,\n * scoped to its owning inbox.\n */\nexport class Threads {\n constructor(private readonly ctx: ResourceContext) {}\n\n /** Fetch one thread (+ its messages, oldest-first) by id under its owning inbox address. */\n get(inbox: string, threadId: string, signal?: AbortSignal): Promise<ThreadDetail> {\n return this.ctx.transport.getThread(inbox, threadId, signal);\n }\n\n /**\n * Delete an entire thread (every message): move to Trash (default) or\n * permanently remove when `expunge` is true. `inbox` is the owning address.\n */\n delete(\n inbox: string,\n threadId: string,\n expunge?: boolean,\n signal?: AbortSignal,\n ): Promise<DeleteResult> {\n return this.ctx.transport.deleteThread(inbox, threadId, expunge, signal);\n }\n}\n\n/** `extrovert.webhooks` — register / list / get / update / delete HMAC-signed inbound webhooks. */\nexport class Webhooks {\n constructor(private readonly ctx: ResourceContext) {}\n\n /** Register an HMAC-signed, timestamped webhook. The signing `secret` is returned once. */\n register(req: RegisterWebhookRequest, signal?: AbortSignal): Promise<Webhook> {\n return this.ctx.transport.registerWebhook(req, signal);\n }\n\n /** List registered webhooks (the one-time signing `secret` is omitted). */\n list(signal?: AbortSignal): Promise<Page<Webhook>> {\n return this.ctx.transport.listWebhooks(signal);\n }\n\n /** Fetch one webhook by id (the signing `secret` is omitted). */\n get(webhookId: string, signal?: AbortSignal): Promise<Webhook> {\n return this.ctx.transport.getWebhook(webhookId, signal);\n }\n\n /**\n * Update a webhook in place: change the delivery `url`, the subscribed\n * `events`, the `inbox` filter (empty string clears it), or `active` to\n * enable/disable delivery. Omitted fields are left unchanged (PATCH\n * semantics). The signing `secret` is immutable and stays redacted.\n */\n update(webhookId: string, req: UpdateWebhookRequest, signal?: AbortSignal): Promise<Webhook> {\n return this.ctx.transport.updateWebhook(webhookId, req, signal);\n }\n\n /** Delete a webhook by id. */\n delete(webhookId: string, signal?: AbortSignal): Promise<void> {\n return this.ctx.transport.deleteWebhook(webhookId, signal);\n }\n}\n\n/**\n * `extrovert.contactLists` — per-inbox allow/block lists of addresses/domains.\n * A `block` entry rejects a send to a matching recipient; once an `allow` entry\n * exists for an inbox, sends from it are restricted to matching recipients\n * (allowlist mode). Entries are addressable by their opaque id (`lst_…`).\n */\nexport class ContactLists {\n constructor(private readonly ctx: ResourceContext) {}\n\n /** Add an allow/block entry to an inbox. */\n add(inbox: string, req: AddContactListRequest, signal?: AbortSignal): Promise<ContactListEntry> {\n return this.ctx.transport.addContactListEntry(inbox, req, signal);\n }\n\n /** List the entries governing an inbox (inbox-specific + account-wide). */\n list(inbox: string, signal?: AbortSignal): Promise<Page<ContactListEntry>> {\n return this.ctx.transport.listContactLists(inbox, signal);\n }\n\n /** Delete an entry on an inbox by id. */\n delete(inbox: string, entryId: string, signal?: AbortSignal): Promise<void> {\n return this.ctx.transport.deleteContactListEntry(inbox, entryId, signal);\n }\n}\n\n/**\n * `extrovert.suppressions` — recipient opt-outs (list-unsubscribe). A recipient\n * that has unsubscribed cannot be mailed by this org: a send to them is rejected\n * with `recipient_suppressed` ({@link RecipientSuppressedError}). Use `precheck`\n * before composing to skip a would-be-rejected recipient, `list` to browse the\n * org's opt-outs, and `revoke` (reason required, audit-logged) to re-enable a\n * recipient. All reads/writes are scoped to the caller's OWN org — a\n * platform-global or shared-domain opt-out is never surfaced here.\n */\nexport class Suppressions {\n constructor(private readonly ctx: ResourceContext) {}\n\n /**\n * Pre-check whether the caller's org already suppresses a recipient, BEFORE\n * composing. `suppressed: true` means a send to them would be rejected — skip\n * that recipient. Returns the matching org rows too (never a global/shared row).\n */\n precheck(recipient: string, signal?: AbortSignal): Promise<SuppressionPrecheck> {\n return this.ctx.transport.precheckSuppression(recipient, signal);\n }\n\n /** List the org's suppression rows (active by default; `include_revoked` for all). */\n list(params: ListSuppressionsParams = {}, signal?: AbortSignal): Promise<Page<SuppressionEntry>> {\n return this.ctx.transport.listSuppressions(params, signal);\n }\n\n /**\n * Revoke one org-scope suppression row (re-enable sending to that recipient). A\n * `reason` is REQUIRED (empty/whitespace is a 400) and is audit-logged. A\n * foreign/global/shared id is an indistinguishable 404.\n */\n revoke(id: string, reason: string, signal?: AbortSignal): Promise<SuppressionEntry> {\n return this.ctx.transport.revokeSuppression(id, reason, signal);\n }\n}\n\n/**\n * `extrovert.domains` — the customer's domains (privileged; the agent key must\n * carry the `domain:manage` scope). Onboard (shared | ns_delegated | manual |\n * purchased), read status + the DNS records to set inline, trigger/refresh\n * verification, and offboard. `mode: \"purchased\"` spends money at the registrar and\n * ADDITIONALLY requires the explicit, default-off `domain:purchase` scope (and is\n * capped by the org/project purchased-domain plan limit). Set `scope: \"project\"` to\n * bind the domain to the key's project; it defaults to `org` (org-shared).\n */\nexport class Domains {\n constructor(private readonly ctx: ResourceContext) {}\n\n /** List the customer's onboarded domains and their status. */\n list(signal?: AbortSignal): Promise<Page<Domain>> {\n return this.ctx.transport.listDomains(signal);\n }\n\n /** Get one domain's detail + verification status + the DNS records to set, inline. */\n get(domain: string, signal?: AbortSignal): Promise<Domain> {\n return this.ctx.transport.getDomain(domain, signal);\n }\n\n /**\n * Onboard (add) a domain. `mode` defaults to ns_delegated. `mode: \"purchased\"`\n * requires the `domain:purchase` scope (in addition to `domain:manage`). Returns\n * the record set / NS instruction.\n */\n onboard(req: OnboardDomainRequest, signal?: AbortSignal): Promise<Domain> {\n return this.ctx.transport.onboardDomain(req, signal);\n }\n\n /** Trigger or refresh verification for a domain; returns its (possibly advanced) status. */\n verify(domain: string, signal?: AbortSignal): Promise<Domain> {\n return this.ctx.transport.verifyDomain(domain, signal);\n }\n\n /**\n * Offboard (remove) a domain from the customer. Async: the API accepts the\n * request (HTTP 202) and tears the domain down as a job. Returns the accepted\n * job's id + poll URL (`status_url`); poll it with `extrovert.getJob(job_id)`\n * until the status is terminal (succeeded/failed/cancelled).\n */\n offboard(domain: string, signal?: AbortSignal): Promise<DomainOffboard> {\n return this.ctx.transport.offboardDomain(domain, signal);\n }\n}\n\n/**\n * `extrovert.reviews` — the Review Loop (HITL) agent-plane reads. A sending agent\n * monitors its submissions in the human-review queue: list/get a review request and\n * read its append-only thread of turns (intent, drafts, human comments/edits/\n * decisions, captured diffs). Submitting FOR review rides `inbox.send` /\n * `inbox.reply` with `mode`/`intent`/`category_id`. Human-authority actions\n * (approve/reject/edit-send) are console-only (D17) and never exposed here.\n */\nexport class Reviews {\n /**\n * `extrovert.reviews.events` — the Review Loop (HITL) realtime plane: drain,\n * long-poll, and ack the durable nudge queue (the AUTHORITATIVE liveness source;\n * SSE/webhook are best-effort fast paths on top of it).\n */\n readonly events: ReviewEvents;\n\n constructor(private readonly ctx: ResourceContext) {\n this.events = new ReviewEvents(ctx);\n }\n\n /** List review requests (customer-scoped). Filter by state / category / inbox. */\n list(params: ListReviewsParams = {}, signal?: AbortSignal): Promise<Page<Review>> {\n return this.ctx.transport.listReviews(params, signal);\n }\n\n /** Get one review request by id (rr_…): current draft + intent + state. */\n get(reviewId: string, signal?: AbortSignal): Promise<Review> {\n return this.ctx.transport.getReview(reviewId, signal);\n }\n\n /** Get a review's append-only thread turns by id (rr_…). */\n turns(reviewId: string, signal?: AbortSignal): Promise<Page<ReviewTurn>> {\n return this.ctx.transport.getReviewTurns(reviewId, signal);\n }\n\n /**\n * Get the human's assembled feedback (M5): the diff + comments + decision + the\n * rules born from this review. Read it after a rejected/edited nudge to learn what\n * the human wanted. $0 LLM — pure assembly on our side.\n */\n feedback(reviewId: string, signal?: AbortSignal): Promise<ReviewFeedback> {\n return this.ctx.transport.getReviewFeedback(reviewId, signal);\n }\n\n /**\n * Post a chat turn on a review's thread (M5): an agent question to the human\n * reviewer; flips in_review -> chatting on the first turn. Idempotent on the\n * optional `idempotencyKey` (the `Idempotency-Key` header). $0 LLM — you compose it.\n */\n chat(\n reviewId: string,\n req: PostReviewChatRequest,\n idempotencyKey?: string,\n signal?: AbortSignal,\n ): Promise<Review> {\n return this.ctx.transport.postReviewChat(reviewId, req, idempotencyKey, signal);\n }\n\n /**\n * Post a new agent draft under a parent_revision CAS (M5; D17). parent_revision\n * must equal the draft's current revision, else a 409 STALE with NO mutation (the\n * human always wins — re-read, re-apply, retry). On success the draft is re-rendered\n * in place (revision++) and returns to needs_review. $0 LLM — you compose the redraft.\n */\n revise(reviewId: string, req: SubmitRevisionRequest, signal?: AbortSignal): Promise<Review> {\n return this.ctx.transport.submitRevision(reviewId, req, signal);\n }\n\n /**\n * Withdraw your own pending review (M5) to the terminal cancelled state. Only the\n * composing agent may cancel; a terminal (already sent) review 409s.\n */\n cancel(\n reviewId: string,\n idempotencyKeyOrSignal?: string | AbortSignal,\n signal?: AbortSignal,\n ): Promise<Review> {\n const idempotencyKey = typeof idempotencyKeyOrSignal === \"string\" ? idempotencyKeyOrSignal : undefined;\n const effectiveSignal = typeof idempotencyKeyOrSignal === \"string\" ? signal : idempotencyKeyOrSignal;\n return this.ctx.transport.cancelReview(reviewId, idempotencyKey, effectiveSignal);\n }\n\n /**\n * Re-stamp a draft's rules-version WITHOUT redrafting (M7; D19/§8 $0 escape valve):\n * assert \"I reviewed this against rules vX and no change is needed\", advancing the\n * draft's composed_* versions with no new draft, no revision bump, no nudge. A\n * born-stale draft re-stamped to the current version becomes current-enough and\n * releasable on the next reconciliation sweep — the cheap counterpart to revise().\n * against_version above the category's current rules-version is 400; a terminal draft\n * 409s. $0 LLM — you judged.\n */\n restamp(reviewId: string, req: RestampReviewRequest, signal?: AbortSignal): Promise<Review> {\n return this.ctx.transport.restampReview(reviewId, req, signal);\n }\n\n /**\n * Get the REVIEWER's decision context for a review (M8 Slice B; D5/§9). The reviewer\n * is an AGENT granted review:act, authorized for THIS review ONLY via a matching\n * ACTIVE review-link (per-inbox beats account-wide). The context is the intent +\n * current draft + thread + the two-circuit-breaker budget (hop_count vs max_hops, the\n * hard review_deadline). `force_to_human` is true when a reject would be FORCED to the\n * human regardless of intent (the human is the only terminal authority, D17). A\n * cross-tenant id is 404; a non-reviewer is 403. Read-only, $0 LLM.\n */\n decisionContext(reviewId: string, signal?: AbortSignal): Promise<ReviewDecisionContext> {\n return this.ctx.transport.getReviewDecisionContext(reviewId, signal);\n }\n\n /**\n * Submit a reviewer decision (M8 Slice B; reviewer_decide, D5/§9). approve/edit → the\n * PLATFORM ACS-sends with the COMPOSER's credentials (the reviewer NEVER holds\n * mailbox:send on an inbox it doesn't own — the credential boundary); reject → back to\n * the composer (needs_review, hop_count++); escalate → the human queue. revision/\n * version are the CAS (409 STALE on mismatch, NO mutation — the human always wins,\n * D17). The two circuit breakers (hop_count ≥ max_hops, or the hard review_deadline)\n * FORCE a reject to the human regardless of intent — `forced_by_breaker` names it. $0\n * LLM — you judged; we route, send, and enforce the breakers.\n */\n decide(\n reviewId: string,\n req: ReviewerDecisionRequest,\n signal?: AbortSignal,\n ): Promise<ReviewerDecisionResult> {\n return this.ctx.transport.reviewerDecide(reviewId, req, signal);\n }\n}\n\n/**\n * `extrovert.reviews.events` — drain / long-poll / ack the durable review nudge\n * queue (spec §5.9). `list` is a non-blocking, side-effect-free drain of the next\n * un-acked nudges in FIFO seq order (strict per review); `wait` long-polls\n * (~25–55s) for the next one; `ack` advances the per-(agent, review) cursor\n * monotonically (idempotent — re-acking an older seq is a no-op).\n */\nexport class ReviewEvents {\n constructor(private readonly ctx: ResourceContext) {}\n\n /** Drain the next un-acked review events (non-blocking). */\n list(params: ListReviewEventsParams = {}, signal?: AbortSignal): Promise<ReviewEventsResult> {\n return this.ctx.transport.listReviewEvents(params, signal);\n }\n\n /** Long-poll for the next review event (empty on timeout). */\n wait(params: WaitForReviewEventParams = {}, signal?: AbortSignal): Promise<ReviewEventsResult> {\n return this.ctx.transport.waitForReviewEvent(params, signal);\n }\n\n /** Advance the per-review cursor(s) and/or mark broadcast nudges done. */\n ack(req: AckReviewEventRequest, signal?: AbortSignal): Promise<AckReviewEventResult> {\n return this.ctx.transport.ackReviewEvent(req, signal);\n }\n}\n\n/**\n * `extrovert.categories` — the Review Loop category registry (D9/D10). Browse and\n * MATCH an existing category before composing (like a skills registry), or propose\n * a new one. Categories are CUSTOMER-scoped and agent-attributed (the deliberate\n * cross-agent-404 exception); identity is opaque cat_ ids — nothing keys on the\n * name, so renames never break a reference. `match` is a pure lexical filter (NO\n * LLM on our side); the agent does the semantic matching. Merging / deleting a\n * category is a human (console) action, not exposed here (D17).\n */\nexport class Categories {\n constructor(private readonly ctx: ResourceContext) {}\n\n /** Browse the registry. `match` lexically filters name+description (NO LLM). */\n list(params: ListCategoriesParams = {}, signal?: AbortSignal): Promise<Page<Category>> {\n return this.ctx.transport.listCategories(params, signal);\n }\n\n /** Get one category by id (cat_…): name + description + scope + state. */\n get(categoryId: string, signal?: AbortSignal): Promise<Category> {\n return this.ctx.transport.getCategory(categoryId, signal);\n }\n\n /** Propose a new category; it stands immediately and writes a create audit row. */\n propose(req: ProposeCategoryRequest, signal?: AbortSignal): Promise<Category> {\n return this.ctx.transport.proposeCategory(req, signal);\n }\n\n /** Rename / re-describe a category — metadata only (D10). */\n update(categoryId: string, req: UpdateCategoryRequest, signal?: AbortSignal): Promise<Category> {\n return this.ctx.transport.updateCategory(categoryId, req, signal);\n }\n\n /**\n * Read the effective risk dial (D4/D12): the account default + every category's\n * overrides (each with its resolved effective value; null override = inherit).\n * Read-only — agents read but NEVER flip the dial; setting it is a human (console)\n * action (D16).\n */\n riskDial(signal?: AbortSignal): Promise<RiskDial> {\n return this.ctx.transport.getRiskDial(signal);\n }\n\n /**\n * Read a category's graduation gate status (D16): the gates passed / still needed\n * toward the next rung (approvals N/needed, age, maturity gate, drift vs K,\n * can_graduate). Read-only.\n */\n graduationStatus(categoryId: string, signal?: AbortSignal): Promise<GraduationStatus> {\n return this.ctx.transport.getGraduationStatus(categoryId, signal);\n }\n\n /**\n * Propose graduating a category (D16/D6): RECORDS the request (durable evidence) and\n * returns the current gate status. It does NOT change the category state — flipping\n * the bit is a human (console) action; an agent only proposes.\n */\n proposeGraduation(\n categoryId: string,\n req: ProposeGraduationRequest = {},\n signal?: AbortSignal,\n ): Promise<GraduationStatus> {\n return this.ctx.transport.proposeGraduation(categoryId, req, signal);\n }\n\n /**\n * Read the D19/§8 backlog-reconciliation status: how many of the category's QUEUED\n * drafts are stale vs current-enough against the current rules-version (a pure\n * integer compare, $0 LLM). Read-only — you READ the picture; the human (console\n * scan-backlog) or the graduate/rule-change hooks TRIGGER the actual reconciliation\n * sweep that releases current-enough drafts and nudges stale ones to redraft.\n */\n backlogStatus(categoryId: string, signal?: AbortSignal): Promise<ScanBacklogStatus> {\n return this.ctx.transport.getScanBacklogStatus(categoryId, signal);\n }\n\n /**\n * Read the demand-driven pacing state (M7 Slice B/§8): the human review cursor, the\n * effective lookahead window (freshness is guaranteed only for the next few drafts\n * after the cursor), the HARD per-nudge fan-out ceiling (rework_batch_max), the\n * per-agent nudge interval, and each queued draft's classification (behind_cursor |\n * in_window_fresh | in_window_redrafting | ahead). Read-only; the cursor advances\n * from the human's console approve/reject/edit actions.\n */\n pacingState(categoryId: string, signal?: AbortSignal): Promise<CategoryPacingState> {\n return this.ctx.transport.getCategoryPacingState(categoryId, signal);\n }\n}\n\n/**\n * `extrovert.rules` — the Review Loop writing-rule store + house-style + the §7\n * precedence ladder + audit/undo (D2/D11). ANY agent in the customer may write,\n * edit, promote, retire, and undo rules (the deliberate cross-agent exception — the\n * shared house-style is the whole pitch). `get()` returns the ORDERED active rule\n * set with the precedence ladder applied SERVER-SIDE (NO LLM on our side); the agent\n * reconciles the list semantically. Rules are append-only by supersession; undo\n * restores the prior version as a forward 'restore' supersession. Identity is opaque\n * rule_/rln_/udo_ ids — nothing keys on a name.\n */\nexport class Rules {\n constructor(private readonly ctx: ResourceContext) {}\n\n /** Get the ORDERED active rule set (precedence ladder applied; NO LLM). */\n get(params: GetRulesParams = {}, signal?: AbortSignal): Promise<Page<Rule>> {\n return this.ctx.transport.getRules(params, signal);\n }\n\n /**\n * Save / edit a rule (append-only by supersession; D11). An agent-plane save is\n * ALWAYS project-layer: the saved rule's `rule_layer` is `project`, bound to the\n * key's project. Agents cannot author org-layer / house-style (`rule_layer:\"org\"`)\n * rules in v1 — that is a console/admin action.\n */\n save(req: SaveRuleRequest, signal?: AbortSignal): Promise<Rule> {\n return this.ctx.transport.saveRule(req, signal);\n }\n\n /** Promote a rule between the category and general/house-style layers. */\n promote(ruleId: string, toScope: \"general\" | \"category\", signal?: AbortSignal): Promise<Rule> {\n return this.ctx.transport.promoteRule(ruleId, toScope, signal);\n }\n\n /** Retire a rule — soft delete; the history survives as training data. */\n retire(ruleId: string, signal?: AbortSignal): Promise<Rule> {\n return this.ctx.transport.retireRule(ruleId, signal);\n }\n\n /** Read the rule/category change audit log (the safety net, D11). */\n audit(params: GetRuleAuditParams = {}, signal?: AbortSignal): Promise<Page<RuleAuditEntry>> {\n return this.ctx.transport.getRuleAudit(params, signal);\n }\n\n /** Undo a rule change by its audit-row id (udo_…) — restore the prior version. */\n undo(udoId: string, signal?: AbortSignal): Promise<Rule> {\n return this.ctx.transport.undoRuleChange(udoId, signal);\n }\n}\n","/**\n * ExtrovertClient — the entry point.\n *\n * ```ts\n * import { Extrovert } from \"@extrovert.dev/sdk\";\n * const extrovert = new Extrovert({ apiKey: process.env.EXTROVERT_API_KEY! });\n * const inbox = await extrovert.inboxes.create(); // a real inbox, in one call\n * const outcome = await inbox.send({\n * to: \"ops@acme.test\",\n * subject: \"hi\",\n * text: \"from an agent\",\n * intent: { summary: \"send the requested status update\" },\n * });\n * if (outcome.kind === \"queued_for_review\") console.log(outcome.review.id);\n * ```\n */\n\nimport { HttpClient, type HttpClientConfig, type RetryOptions } from \"./http.js\";\nimport { HttpTransport, MockTransport, type Transport } from \"./transport.js\";\nimport { MockBackend } from \"./fixtures.js\";\nimport { Inboxes, Messages, Threads, Webhooks, ContactLists, Suppressions, Domains, Reviews, Categories, Rules, Projects, InboxHandle } from \"./resources/index.js\";\nimport type { InboxHandleOptions } from \"./resources/inbox-handle.js\";\nimport { CURRENT_API_VERSION } from \"./version.js\";\nimport { parseKeyTier, type KeyTier } from \"./key-tier.js\";\nimport type {\n CreateInboxRequest,\n EnrollRequest,\n EnrollResponse,\n Job,\n SignUpRequest,\n SignUpResponse,\n StreamEvent,\n StreamOptions,\n VerifyRequest,\n VerifyResponse,\n WhoAmI,\n} from \"./models.js\";\n\n/** Default production API base URL. Overridable via `baseUrl` or `EXTROVERT_API_BASE_URL`. */\nexport const DEFAULT_BASE_URL = \"https://api.extrovert.dev\";\n\n/** The sentinel that routes the client to the offline mock instead of the network. */\nexport const MOCK_BASE_URL = \"mock\";\n\nexport interface ExtrovertClientOptions {\n /**\n * Scoped agent key (`pk_agent_...`) or, for `enroll`, any bearer credential the server accepts.\n * Falls back to `EXTROVERT_API_KEY` when omitted.\n */\n apiKey?: string;\n /**\n * API base URL. Falls back to `EXTROVERT_API_BASE_URL`, then {@link DEFAULT_BASE_URL}. Set to\n * `\"mock\"` (or `transport: \"mock\"`) to run fully offline against the built-in fixtures.\n */\n baseUrl?: string;\n /** Force a transport. `\"mock\"` ignores `baseUrl` and never touches the network. */\n transport?: \"http\" | \"mock\";\n /** Default request timeout in ms. Default 30000. (wait_for_email manages its own, longer timeout.) */\n timeoutMs?: number;\n /** Retry policy for idempotent requests on 429/5xx/network errors. */\n retry?: Partial<RetryOptions>;\n /** Custom fetch implementation (tests, proxies, instrumentation). Defaults to global `fetch`. */\n fetch?: typeof fetch;\n /** Extra headers merged into every request. */\n defaultHeaders?: Record<string, string>;\n /**\n * Dated API version to pin (sent as the `Extrovert-Version` header on every\n * request; redesign §5.4). Defaults to {@link CURRENT_API_VERSION}. Pin an older\n * dated version to opt into the server's transform shim for that version.\n */\n apiVersion?: string;\n /** Inject a pre-built mock backend (shares state across clients in tests). */\n mockBackend?: MockBackend;\n}\n\nfunction readEnv(name: string): string | undefined {\n // Guarded so the SDK works in edge runtimes where `process` is undefined.\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process\n ?.env;\n return env?.[name];\n}\n\nconst DEFAULT_RETRY: RetryOptions = { maxRetries: 2, baseDelayMs: 250, maxDelayMs: 8000 };\n\nexport class ExtrovertClient {\n /** `extrovert.inboxes` — create / list / get / update / delete inboxes. */\n readonly inboxes: Inboxes;\n /** `extrovert.messages` — read a message, reply to it (threaded). */\n readonly messages: Messages;\n /** `extrovert.threads` — fetch a conversation thread. */\n readonly threads: Threads;\n /** `extrovert.webhooks` — register HMAC-signed inbound webhooks. */\n readonly webhooks: Webhooks;\n /** `extrovert.contactLists` — per-inbox allow/block lists of addresses/domains. */\n readonly contactLists: ContactLists;\n /** `extrovert.suppressions` — recipient opt-outs (list-unsubscribe); precheck/list/revoke. */\n readonly suppressions: Suppressions;\n /** `extrovert.domains` — the customer's domains (privileged; domain:manage scope). */\n readonly domains: Domains;\n /** `extrovert.reviews` — the Review Loop (HITL) agent-plane reads. */\n readonly reviews: Reviews;\n /** `extrovert.categories` — the Review Loop category registry (browse/propose/curate). */\n readonly categories: Categories;\n /** `extrovert.rules` — the Review Loop writing-rule store + house-style + audit/undo. */\n readonly rules: Rules;\n /**\n * `extrovert.projects` — the CANONICAL project-scoped chain. The headline is\n * `extrovert.projects.inboxes.*` (create/list/get/update/delete/send/...), keyed by\n * the opaque `inbox_id` and scoped to a `{project_id}` path (or `-` for the org\n * wildcard on an org-tier key). The bare `extrovert.inboxes` surface is curl sugar\n * that resolves to the key's default project.\n */\n readonly projects: Projects;\n\n /** The resolved API base URL (or `\"mock\"`). */\n readonly baseUrl: string;\n /**\n * The dated API version pinned on every request (`Extrovert-Version`). Defaults to\n * {@link CURRENT_API_VERSION}.\n */\n readonly apiVersion: string;\n /**\n * The CEILING tier derived from the configured agent key prefix (`org` | `project`\n * | `inbox` | `unknown`). Advisory client-side hint only — the server is the source\n * of truth. Lets an app branch (e.g. require a project pick for an org-tier key).\n */\n readonly keyTier: KeyTier;\n\n private readonly transport: Transport;\n private readonly handleOptions: InboxHandleOptions;\n\n constructor(options: ExtrovertClientOptions = {}) {\n const apiKey = options.apiKey ?? readEnv(\"EXTROVERT_API_KEY\") ?? \"\";\n const resolvedBaseUrl =\n options.baseUrl ?? readEnv(\"EXTROVERT_API_BASE_URL\") ?? DEFAULT_BASE_URL;\n const useMock =\n options.transport === \"mock\" || resolvedBaseUrl === MOCK_BASE_URL;\n\n this.baseUrl = useMock ? MOCK_BASE_URL : resolvedBaseUrl;\n this.apiVersion = options.apiVersion ?? CURRENT_API_VERSION;\n this.keyTier = parseKeyTier(apiKey);\n const timeoutMs = options.timeoutMs ?? 30_000;\n this.handleOptions = { defaultWaitTimeoutMs: timeoutMs };\n\n if (useMock) {\n this.transport = new MockTransport(options.mockBackend);\n } else {\n if (!apiKey) {\n throw new Error(\n \"Extrovert: no apiKey provided. Pass { apiKey } or set EXTROVERT_API_KEY (or use transport: \\\"mock\\\").\",\n );\n }\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (typeof fetchImpl !== \"function\") {\n throw new Error(\n \"Extrovert: global fetch is unavailable. Use Node 18+, an edge runtime, or pass a custom { fetch }.\",\n );\n }\n const config: HttpClientConfig = {\n baseUrl: resolvedBaseUrl,\n apiKey,\n timeoutMs,\n retry: { ...DEFAULT_RETRY, ...options.retry },\n fetch: fetchImpl,\n defaultHeaders: options.defaultHeaders ?? {},\n apiVersion: this.apiVersion,\n };\n this.transport = new HttpTransport(new HttpClient(config));\n }\n\n const ctx = { transport: this.transport, handleOptions: this.handleOptions, keyTier: this.keyTier };\n this.inboxes = new Inboxes(ctx);\n this.messages = new Messages(ctx);\n this.threads = new Threads(ctx);\n this.webhooks = new Webhooks(ctx);\n this.contactLists = new ContactLists(ctx);\n this.suppressions = new Suppressions(ctx);\n this.domains = new Domains(ctx);\n this.reviews = new Reviews(ctx);\n this.categories = new Categories(ctx);\n this.rules = new Rules(ctx);\n this.projects = new Projects(ctx);\n }\n\n /**\n * Redeem an enrollment token (`pk_enroll_...`) and mint a scoped agent key.\n *\n * Idempotent on `agent_handle`: redeeming twice with the same handle returns the same agent.\n * Returns the raw `EnrollResponse` — to immediately use the minted key, prefer\n * {@link ExtrovertClient.enrolled}.\n */\n enroll(req: EnrollRequest, signal?: AbortSignal): Promise<EnrollResponse> {\n return this.transport.enroll(req, signal);\n }\n\n /**\n * Grab a free account in one unauthenticated call (Slice E). Provisions a tenant\n * + a first inbox and returns a LIMITED-scope (read-only) agent key; a one-time\n * code is emailed to `human_email`. Call {@link verify} with the code to unlock\n * full scopes. Idempotent on `human_email`: re-calling rotates the key + resends.\n */\n signUp(req: SignUpRequest, signal?: AbortSignal): Promise<SignUpResponse> {\n return this.transport.signUp(req, signal);\n }\n\n /**\n * Confirm the emailed signup code and receive a NEW full-scope agent key (shown\n * once). Must be called with the limited key from {@link signUp} as the bearer.\n */\n verify(req: VerifyRequest, signal?: AbortSignal): Promise<VerifyResponse> {\n return this.transport.verify(req, signal);\n }\n\n /** Introspect the principal behind the current key (`GET /v1/auth/me`). */\n whoami(signal?: AbortSignal): Promise<WhoAmI> {\n return this.transport.whoami(signal);\n }\n\n /**\n * Poll the status of an async job (`GET /v1/jobs/{job_id}`) — currently only\n * the domain-offboard teardown started by {@link Domains.offboard} enqueues\n * one. `status` is terminal on succeeded/failed/cancelled; keep polling\n * otherwise. An unknown or foreign job id is a {@link NotFoundError}.\n */\n getJob(jobId: string, signal?: AbortSignal): Promise<Job> {\n return this.transport.getJob(jobId, signal);\n }\n\n /**\n * Redeem an enrollment token and return a *new* client already authenticated with the minted\n * agent key — the natural \"redeem then act\" flow for an agent.\n *\n * ```ts\n * const bootstrap = new Extrovert({ apiKey: enrollmentToken });\n * const { client, enrollment } = await bootstrap.enrolled({\n * token: enrollmentToken,\n * agent_handle: \"support-bot\",\n * });\n * const inbox = await client.inboxes.create();\n * ```\n */\n async enrolled(\n req: EnrollRequest,\n options?: Pick<ExtrovertClientOptions, \"timeoutMs\" | \"retry\" | \"fetch\" | \"defaultHeaders\">,\n signal?: AbortSignal,\n ): Promise<{ client: ExtrovertClient; enrollment: EnrollResponse }> {\n const enrollment = await this.enroll(req, signal);\n const client = new ExtrovertClient({\n apiKey: enrollment.agent_key,\n ...(this.baseUrl === MOCK_BASE_URL\n ? { transport: \"mock\", mockBackend: (this.transport as MockTransport).backend }\n : { baseUrl: this.baseUrl }),\n ...options,\n });\n return { client, enrollment };\n }\n\n /**\n * Get an ergonomic handle to an existing inbox by address — without an extra round-trip. Use this\n * when you already know the address (e.g. from a previous create) and want to send/wait/reply.\n * Call {@link InboxHandle.refresh} to load the full record.\n */\n inbox(address: string): InboxHandle {\n return new InboxHandle(this.transport, address, this.handleOptions);\n }\n\n /**\n * The headline shortcut: provision a real inbox in one call and get a handle bound to it.\n * Equivalent to `extrovert.inboxes.create(req)`, named to match the docs/marketing promise.\n */\n createInbox(req: CreateInboxRequest = {}, signal?: AbortSignal): Promise<InboxHandle> {\n return this.inboxes.create(req, signal);\n }\n\n /**\n * Watch events across EVERY inbox the agent owns (Server-Sent Events, `GET\n * /v1/events`). Returns an async iterator of {@link StreamEvent}; pass\n * `lastEventId` (the `seq` of the last event you saw) to resume after a reconnect\n * and a `signal` to close the stream. To watch a single inbox, use\n * {@link InboxHandle.stream} instead.\n *\n * ```ts\n * for await (const ev of extrovert.stream()) {\n * if (ev.event === \"message.received\") console.log(ev.inbox, ev.message?.subject);\n * }\n * ```\n */\n stream(options: StreamOptions = {}): AsyncGenerator<StreamEvent, void, unknown> {\n return this.transport.stream(null, options.lastEventId, options.signal);\n }\n\n /**\n * Convenience wrapper over {@link stream}: invoke `onEvent` for every event\n * across all owned inboxes until the stream closes (or `signal` aborts).\n */\n async subscribe(\n onEvent: (event: StreamEvent) => void | Promise<void>,\n options: StreamOptions = {},\n ): Promise<void> {\n for await (const ev of this.stream(options)) {\n await onEvent(ev);\n }\n }\n}\n","/**\n * Narrowing helpers for {@link SendOutcome} — the three shapes a send can answer.\n *\n * `inbox.send()` used to be typed as one struct with a REQUIRED `thread_id`, which\n * the direct-send response has never carried. The type checked; the value was\n * `undefined`. Now the return type is an honest union, and these helpers exist so\n * that reading it does not turn into a `\"kind\" in res` puzzle at every call site.\n *\n * The one rule worth internalizing: a `queued_for_review` outcome means **nothing\n * has been delivered**. A human has to approve it first, and the delivery outcome\n * arrives later as a `sent` / `send_failed` review event. Code that treats every\n * 2xx from `send()` as \"the mail went out\" is wrong under the default\n * `require_review` policy — which is every account that has not changed it.\n */\n\nimport type {\n QueuedForReviewResult,\n SendOutcome,\n SendResult,\n SentResult,\n} from \"./models.js\";\n\n/**\n * True when the message was PARKED for a human and nothing has been delivered.\n * Narrow with this before reading `res.review.id`, then monitor the review via\n * `extrovert.reviewEvents.wait({ review_id })`.\n */\nexport function isQueuedForReview(res: SendOutcome): res is QueuedForReviewResult {\n return res.kind === \"queued_for_review\";\n}\n\n/**\n * True when the message was delivered immediately — either the review-loop\n * `{kind:\"sent\"}` body or the legacy body a bare send gets under `allow_direct`.\n */\nexport function isSentImmediately(res: SendOutcome): res is SendResult | SentResult {\n return !isQueuedForReview(res);\n}\n\n/**\n * The delivered message id, or `undefined` when the message was queued instead.\n *\n * `undefined` here is NOT an error — it is the normal answer under\n * `require_review`. Pair it with {@link reviewIdOf} to follow the message to its\n * outcome.\n */\nexport function sentMessageIdOf(res: SendOutcome): string | undefined {\n if (isQueuedForReview(res)) return undefined;\n return res.kind === \"sent\" ? res.message.id : res.message_id;\n}\n\n/**\n * The thread id when one is known.\n *\n * Absent on a direct `send` (the server assigns the thread at delivery and the\n * legacy body does not echo it) and on a queued outcome (there is no message\n * yet). Reply and forward do return it.\n */\nexport function threadIdOf(res: SendOutcome): string | undefined {\n if (isQueuedForReview(res)) return undefined;\n return res.kind === \"sent\" ? res.message.thread_id : res.thread_id;\n}\n\n/**\n * The opaque review id (rr_…) that governed this send, on EVERY branch.\n *\n * This is the crash-recovery handle: an agent that issued a send and then died\n * can call `reviews.get(id)` and read `closed` / `send_error` / `sent_message_id`\n * rather than guessing whether the message went out. It is `undefined` only\n * against a server old enough to predate the field.\n */\nexport function reviewIdOf(res: SendOutcome): string | undefined {\n if (isQueuedForReview(res)) return res.review.id;\n return res.kind === \"sent\" ? res.review?.id : res.review_id;\n}\n","/**\n * Inbound webhook verification.\n *\n * Extrovert signs every inbound delivery with an HMAC-SHA256 over `${timestamp}.${rawBody}` and sends\n * `X-Extrovert-Signature: t=<unix>,v1=<hex>` (§6, §14). Verify with the per-webhook `secret` returned\n * once at registration. Uses Web Crypto (`crypto.subtle`), so it works in Node 18+, Cloudflare\n * Workers, Vercel Edge, Deno, and the browser without any dependency.\n */\n\nimport type { Message, WebhookEvent } from \"./models.js\";\n\n/** The decoded body of a `message.received` (and similar) webhook delivery. */\nexport interface WebhookPayload {\n event: WebhookEvent;\n /** Delivery id, unique per attempt. */\n id: string;\n created_at: string;\n /** The message that triggered the event (present for message.* events). */\n message?: Message;\n /** The inbox address the event concerns. */\n inbox?: string;\n}\n\nexport interface VerifyWebhookOptions {\n /** Raw request body, exactly as received (do not re-serialize JSON before verifying). */\n payload: string;\n /** The `X-Extrovert-Signature` header value. */\n signature: string;\n /** The webhook signing secret (`whsec_...`). */\n secret: string;\n /** Reject deliveries whose timestamp is older than this many seconds. Default 300 (5 min). */\n toleranceSeconds?: number;\n /** Override the clock (unix seconds) for deterministic testing. */\n nowSeconds?: number;\n}\n\nfunction parseSignatureHeader(header: string): { t: number; v1: string[] } {\n let t = 0;\n const v1: string[] = [];\n for (const part of header.split(\",\")) {\n const eq = part.indexOf(\"=\");\n if (eq === -1) continue;\n const key = part.slice(0, eq).trim();\n const value = part.slice(eq + 1).trim();\n if (key === \"t\") t = Number(value);\n else if (key === \"v1\") v1.push(value);\n }\n return { t, v1 };\n}\n\nfunction toHex(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let out = \"\";\n for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n return out;\n}\n\n/** Constant-time string compare to avoid leaking the signature via timing. */\nfunction timingSafeEqual(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n\nasync function hmacSha256Hex(secret: string, message: string): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (!subtle) {\n throw new Error(\n \"Web Crypto (crypto.subtle) is unavailable in this runtime; cannot verify webhook signatures.\",\n );\n }\n const enc = new TextEncoder();\n const key = await subtle.importKey(\n \"raw\",\n enc.encode(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const sig = await subtle.sign(\"HMAC\", key, enc.encode(message));\n return toHex(sig);\n}\n\n/**\n * Verify an inbound webhook signature. Returns true when the signature is valid and within the\n * timestamp tolerance. Throws only if the runtime lacks Web Crypto.\n *\n * @example\n * ```ts\n * const ok = await verifyWebhookSignature({\n * payload: rawBody,\n * signature: req.headers[\"x-extrovert-signature\"],\n * secret: process.env.EXTROVERT_WEBHOOK_SECRET!,\n * });\n * if (!ok) return new Response(\"bad signature\", { status: 400 });\n * ```\n */\nexport async function verifyWebhookSignature(options: VerifyWebhookOptions): Promise<boolean> {\n const { payload, signature, secret } = options;\n const tolerance = options.toleranceSeconds ?? 300;\n const now = options.nowSeconds ?? Math.floor(Date.now() / 1000);\n\n const { t, v1 } = parseSignatureHeader(signature);\n if (!t || v1.length === 0) return false;\n if (Math.abs(now - t) > tolerance) return false;\n\n const expected = await hmacSha256Hex(secret, `${t}.${payload}`);\n return v1.some((candidate) => timingSafeEqual(candidate, expected));\n}\n\n/**\n * Verify a webhook and parse its JSON body in one step. Returns the typed payload on success, or\n * null when the signature is invalid (so callers can branch without a try/catch on the common path).\n */\nexport async function parseWebhook(options: VerifyWebhookOptions): Promise<WebhookPayload | null> {\n const ok = await verifyWebhookSignature(options);\n if (!ok) return null;\n return JSON.parse(options.payload) as WebhookPayload;\n}\n\n/**\n * Produce the canonical `X-Extrovert-Signature` header value for a body — the exact format the Go\n * delivery engine emits: `t=<unix>,v1=<hex hmac-sha256(\"<t>.<rawbody>\")>`. Mainly useful for tests\n * and self-hosted senders; the platform signs deliveries server-side. The Go `SignWebhook` and this\n * helper are pinned to the same fixed conformance vector across languages.\n */\nexport async function signWebhook(\n secret: string,\n body: string,\n timestampSeconds: number,\n): Promise<string> {\n const t = Math.floor(timestampSeconds);\n const v1 = await hmacSha256Hex(secret, `${t}.${body}`);\n return `t=${t},v1=${v1}`;\n}\n","/**\n * The Extrovert Review-Loop **open contract** (HITL D14, spec §11).\n *\n * This module is the single, documented, *versioned* publication of the stable\n * agent-facing JSON shapes that the Review Loop exposes — the shapes agents and\n * third-party harnesses code against. It does **not** redesign any types: it\n * re-exports the canonical models built across M1–M8 (see `./models`) under one\n * named contract surface, stamps a {@link CONTRACT_VERSION}, and publishes a\n * machine-readable {@link CONTRACT_MANIFEST} so a harness can pin the exact set of\n * shapes + the version it built against.\n *\n * ## This is a contract, NOT a protocol (D14)\n *\n * Per resolved decision **D14**, the open surface is published **now** as an open,\n * documented **skill + SDK contract** — explicitly **not** a wire protocol and\n * **not** a standalone `/v1/contract` endpoint. The contract is exactly: these SDK\n * types + the agent skills (`extrovert-send-email`, `extrovert-writing-rules`) + the\n * docs, **versioned with the SDK** (this package). Formal protocol\n * standardization is deferred (spec §12).\n *\n * ## Provisional, pre-1.0 (0.x)\n *\n * {@link CONTRACT_VERSION} is **`0.1.0-pre.3`** — a deliberately **provisional**, pre-1.0\n * contract. It is open and documented, but it MAY still evolve before 1.0: there\n * are no external users yet, and the **D20 shared-pool auto-send governor** is a\n * hard prerequisite before onboarding external users. Pin the version; expect\n * additive 0.x changes. See {@link CONTRACT_MANIFEST}.`stability`.\n *\n * ## Identity (D10)\n *\n * Every shape keys on **opaque, typed ids** (`rr_`, `turn_`, `cat_`, `rule_`,\n * `rln_`, `ndg_`, …) and never on names. Names/descriptions are mutable display\n * metadata; renaming never breaks a reference. $0-LLM on our side — the contract\n * is pure deterministic JSON; all judgment lives in the agent skills.\n *\n * The canonical example payloads for the §11 core shapes (Intent, ReviewFeedback,\n * DiffJson, Rule, Nudge) are the conformance golden fixtures — see\n * `golang/internal/extrovertapi/testdata/contract/` and the SDK\n * `contract.test.ts` (both assert these examples parse/validate without loss).\n *\n * @packageDocumentation\n */\n\n// ---------------------------------------------------------------------------\n// §11 CORE — the canonical shapes, named verbatim from the spec.\n//\n// Four of the five §11 core shapes already exist as M1–M8 model types; we\n// re-export them here under their canonical names (NOT redefinitions), so the\n// existing tests + the openapi component schemas stay the single source of truth.\n// ---------------------------------------------------------------------------\n\n/** §11 \"Intent (submit time)\". The agent's for-the-reviewer summary (D3). */\nexport type { ReviewIntent } from \"./models.js\";\n/** §11 \"Feedback\". Returned by `get_review_feedback`. */\nexport type { ReviewFeedback, ReviewFeedbackComment } from \"./models.js\";\n/** §11 \"Rule (`get_rules` element)\". A learned writing preference. */\nexport type { Rule } from \"./models.js\";\n/** §11 \"Nudge (`list_review_events` element)\". A durable liveness nudge. */\nexport type { ReviewEvent } from \"./models.js\";\n\n/**\n * One structured hunk of a `diff_json` (spec §11 \"Diff (`diff_json`)\"). A single\n * deterministic field change computed server-side in Go ($0 LLM). `op` is the\n * change verb; `before`/`after` carry the literal text.\n */\nexport interface DiffHunk {\n /** The Review field this hunk changed (e.g. `subject`, `body_text`). */\n field: string;\n /** The change verb (e.g. `replace`, `insert`, `delete`). */\n op: string;\n /** The text before the change. */\n before?: string;\n /** The text after the change. */\n after?: string;\n}\n\n/**\n * §11 \"Diff (`diff_json`)\". The structured proposed-vs-sent diff, computed\n * deterministically in Go ($0 LLM). `fields_changed` names the changed Review\n * fields; `hunks` carry the per-field before/after.\n *\n * This is the named publication of the `diff_json` object that already appears\n * (as `diff_json`) on `ReviewFeedback` and `ReviewTurn`; those fields keep their\n * permissive `Record<string, unknown>` wire type for back-compat, and a harness\n * MAY narrow them to this shape.\n */\nexport interface DiffJson {\n /** The Review fields that changed (e.g. `[\"subject\",\"body_text\"]`). */\n fields_changed: string[];\n /** Per-field structured before/after hunks. */\n hunks: DiffHunk[];\n}\n\n// ---------------------------------------------------------------------------\n// FULL SURFACE — the rest of the published M1–M8 contract, re-exported as ONE\n// provisional-0.x contract (no tiering; D14 \"the full built surface\").\n// ---------------------------------------------------------------------------\n\nexport type {\n // submit / states / intent (M1/M2)\n ReviewMode,\n ReviewState,\n Review,\n ReviewTurn,\n SubmitForReviewResult,\n QueuedForReviewResult,\n SentResult,\n // realtime / nudge queue (M3)\n ReviewEventReason,\n ReviewEventsResult,\n ReviewEventCursor,\n // chat / revision / restamp (M5, M7)\n PostReviewChatRequest,\n SubmitRevisionRequest,\n RestampReviewRequest,\n // category registry (M4)\n Category,\n ProposeCategoryRequest,\n UpdateCategoryRequest,\n // graduation + risk dial (M6)\n AccountRiskDial,\n EffectiveRiskDial,\n CategoryRiskDial,\n RiskDial,\n GraduationStatus,\n ProposeGraduationRequest,\n // reconciliation + pacing (M7)\n ScanBacklogStatus,\n CategoryPacingState,\n PacingItem,\n // rules + audit (M4)\n SaveRuleRequest,\n RuleAuditEntry,\n // BYO reviewer decision (M8)\n ReviewerAction,\n ReviewDecisionContext,\n ReviewerDecisionRequest,\n ReviewerDecisionResult,\n} from \"./models.js\";\n\n// ---------------------------------------------------------------------------\n// Contract version + machine-readable manifest.\n// ---------------------------------------------------------------------------\n\n/**\n * The published version of the Extrovert Review-Loop open contract (D14).\n *\n * **`0.1.0-pre.3` — PROVISIONAL, pre-1.0.** Versioned *with the SDK* (this package's\n * `package.json` version) and aligned to the openapi `info.version`. Open and\n * documented, but MAY still evolve before 1.0 (no external users yet; the D20\n * shared-pool governor is required before external users). Pin it.\n */\nexport const CONTRACT_VERSION = \"0.1.0-pre.3\" as const;\n\n/** The stability posture of a published contract version. */\nexport type ContractStability = \"provisional\" | \"stable\";\n\n/**\n * The machine-readable manifest of the open contract (D14) — what a harness pins.\n *\n * It enumerates the canonical §11 **core** shapes and the **full** M1–M8 surface\n * by name, stamps {@link CONTRACT_VERSION}, and marks the {@link ContractStability}\n * posture so a consumer can reason about evolution risk. It carries no runtime\n * behavior (M9 adds none — types + a version + a test + docs) and no LLM.\n */\nexport interface ContractManifest {\n /** Stable contract name (NOT a protocol name — D14). */\n readonly name: \"extrovert.review-loop\";\n /** The published contract version (== {@link CONTRACT_VERSION}). */\n readonly version: string;\n /**\n * `provisional` (0.x) until the D20 shared-pool governor lands + external users\n * exist. Provisional ⇒ additive evolution before 1.0 is expected.\n */\n readonly stability: ContractStability;\n /**\n * D14: this is an SDK + skill contract, versioned WITH the SDK — never a wire\n * protocol or a standalone protocol endpoint.\n */\n readonly kind: \"sdk+skill-contract\";\n /** Cross-reference to the spec section that froze these shapes. */\n readonly spec_ref: \"hitl-spec.md#11\";\n /** The five canonical §11 shapes, named verbatim from the spec. */\n readonly core_shapes: readonly string[];\n /** The full published M1–M8 agent-facing contract surface (one 0.x contract; no tiering). */\n readonly shapes: readonly string[];\n /** The agent skills that are part of the contract (D14 — \"skill + SDK\"). */\n readonly skills: readonly string[];\n}\n\n/**\n * The published manifest instance. Frozen so a harness can compare it\n * structurally. The `core_shapes` are the five §11 canonical shapes; `shapes` is\n * the full provisional-0.x surface. Keep this list in sync with the re-exports\n * above — the `contract.test.ts` drift test asserts every named shape resolves.\n */\nexport const CONTRACT_MANIFEST: ContractManifest = {\n name: \"extrovert.review-loop\",\n version: CONTRACT_VERSION,\n stability: \"provisional\",\n kind: \"sdk+skill-contract\",\n spec_ref: \"hitl-spec.md#11\",\n // §11 core — the five canonical example shapes.\n core_shapes: [\"ReviewIntent\", \"ReviewFeedback\", \"DiffJson\", \"Rule\", \"ReviewEvent\"],\n // The FULL published surface (the §11 core plus the rest of M1–M8). Adding a\n // name here without a matching re-export (or vice-versa) breaks the drift test.\n shapes: [\n // §11 core\n \"ReviewIntent\",\n \"ReviewFeedback\",\n \"ReviewFeedbackComment\",\n \"DiffJson\",\n \"DiffHunk\",\n \"Rule\",\n \"ReviewEvent\",\n // submit / states (M1/M2)\n \"ReviewMode\",\n \"ReviewState\",\n \"Review\",\n \"ReviewTurn\",\n \"SubmitForReviewResult\",\n \"QueuedForReviewResult\",\n \"SentResult\",\n // realtime (M3)\n \"ReviewEventReason\",\n \"ReviewEventsResult\",\n \"ReviewEventCursor\",\n // chat / revision / restamp (M5/M7)\n \"PostReviewChatRequest\",\n \"SubmitRevisionRequest\",\n \"RestampReviewRequest\",\n // category registry (M4)\n \"Category\",\n \"ProposeCategoryRequest\",\n \"UpdateCategoryRequest\",\n // graduation + risk dial (M6)\n \"AccountRiskDial\",\n \"EffectiveRiskDial\",\n \"CategoryRiskDial\",\n \"RiskDial\",\n \"GraduationStatus\",\n \"ProposeGraduationRequest\",\n // reconciliation + pacing (M7)\n \"ScanBacklogStatus\",\n \"CategoryPacingState\",\n \"PacingItem\",\n // rules + audit (M4)\n \"SaveRuleRequest\",\n \"RuleAuditEntry\",\n // BYO reviewer decision (M8)\n \"ReviewerAction\",\n \"ReviewDecisionContext\",\n \"ReviewerDecisionRequest\",\n \"ReviewerDecisionResult\",\n ],\n // The complete Review Loop behavior lives in the send skill; writing-rule\n // governance remains independently installable and part of this contract.\n skills: [\"extrovert-send-email\", \"extrovert-writing-rules\"],\n} as const;\n"]}
|