@m8tes/sdk 0.1.0-alpha.2 → 0.1.0-alpha.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/protocol/events.ts","../src/protocol/sse-parser.ts","../src/protocol/normalizer.ts","../src/protocol/accumulator.ts","../src/protocol/errors.ts","../src/protocol/seg.ts","../src/http.ts","../src/pagination.ts","../src/params.ts","../src/resources/agents.ts","../src/resources/apps.ts","../src/resources/account.ts","../src/resources/users.ts","../src/resources/billing.ts","../src/resources/memories.ts","../src/resources/models.ts","../src/resources/model-connections.ts","../src/resources/permissions.ts","../src/mime.ts","../src/polling.ts","../src/streaming.ts","../src/resources/runs.ts","../src/resources/settings.ts","../src/resources/tasks.ts","../src/resources/webhooks.ts","../src/index.ts"],"names":["key","p","str","reject","now","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @m8tes/react — normalized PUBLIC stream event model.\n *\n * The m8tes V2 backend emits Claude-native FLAT SSE frames (`content_block_delta`,\n * `tool_use`, `permission_request`, `done`, ...). The normalizer (`normalizer.ts`)\n * maps each wire frame to ZERO or MORE events of this stable, versioned\n * discriminated union, keyed on `type`.\n *\n * Type discriminants follow the Vercel AI SDK v5 kebab-case idiom where semantics\n * align (`text-*`, `reasoning-*`, `tool-input-*`, `tool-output-available`) so a\n * future `@m8tes/ai-sdk` adapter maps cleanly. They DIVERGE where m8tes semantics\n * are first-class and have no vanilla-`useChat` analog: human-in-the-loop\n * `approval-request` / `question`, and run rejoin/replay (`run-start` carries\n * runId/runUuid; every terminal path is explicit).\n *\n * Every event carries:\n * - `seq`: a client-assigned monotonic counter. The wire exposes NO SSE `id:`\n * and NO per-event sequence number, so this is assigned by the normalizer and\n * is NOT a dedupe key (see `normalizer.ts` for the domain-id dedupe strategy).\n * - `raw`: the unmodified wire frame, for forward-compatibility.\n *\n * Frames that normalize to nothing renderable (`: keep-alive`, `keep-alive`,\n * `ping`, the duplicate `metadata` preamble frame, `RUNNER_DIAG`, etc.) are\n * dropped by the normalizer and never enter this union.\n *\n * This is a PUBLIC PROTOCOL: once shipped, names are semver-stable. Bump\n * `PROTOCOL_VERSION` on any breaking change to the shape.\n */\n\nexport const PROTOCOL_VERSION = \"m8tes.stream.v2\" as const;\nexport type ProtocolVersion = typeof PROTOCOL_VERSION;\n\n/** Tool/approval state machine (superset of AI SDK v5 tool-part states + HITL). */\nexport type ToolState =\n | \"input-streaming\" // tool-input-start/-delta seen; args still partial JSON\n | \"input-available\" // full input object resolved (standalone tool_use)\n | \"awaiting-approval\" // paused on the m8tes permission gate (HITL)\n | \"output-available\" // tool_result received, not an error\n | \"output-error\" // tool_result with is_error === true\n | \"denied\"; // approval was denied; tool never executed\n\n/** Coarse run status surfaced to the UI. */\nexport type RunStatus =\n | \"connecting\" // sandbox-connecting\n | \"running\" // metadata / message stream flowing\n | \"awaiting_approval\" // paused on a tool permission gate\n | \"awaiting_input\" // paused on AskUserQuestion\n | \"complete\" // done, completion_state === \"complete\"\n | \"incomplete\" // done, completion_state !== \"complete\"\n | \"error\" // terminal error\n | \"cancelled\"; // terminal cancellation\n\nexport interface BaseEvent {\n type: string;\n /** Client-assigned, monotonic per stream. There is NO wire sequence id. */\n seq: number;\n /** The unmodified wire frame this event was normalized from. */\n raw: Record<string, unknown>;\n}\n\n/* ---------- Run lifecycle (m8tes-first-class) ---------- */\n\n/** From the first `metadata` frame. Re-applied (idempotently) on every rejoin. */\nexport interface RunStartEvent extends BaseEvent {\n type: \"run-start\";\n protocolVersion: ProtocolVersion;\n runId: number | null;\n runUuid: string | null;\n mode: \"task\" | \"chat\";\n agentName?: string;\n instanceId?: number;\n taskId?: number;\n status?: string;\n sandbox?: { id: string | null; enabled: boolean };\n}\n\n/** Coarse status transitions (sandbox connect, metadata.status, pause entry). */\nexport interface RunStatusEvent extends BaseEvent {\n type: \"run-status\";\n status: RunStatus;\n message?: string;\n sandboxId?: string | null;\n durationMs?: number;\n}\n\n/** From `run_metrics`. */\nexport interface RunMetricsEvent extends BaseEvent {\n type: \"run-metrics\";\n model: string;\n executionTimeMs: number;\n inputTokens: number;\n outputTokens: number;\n costUsd: number | null; // claude_token_cost_usd\n sdkCostUsd: number | null; // sdk_total_cost_usd (authoritative)\n stopReason: string | null;\n completionState: string;\n unresolvedToolUseIds: string[];\n messageCount: number;\n /** present only when completionState !== \"complete\" */\n diagnostics?: Record<string, unknown>;\n}\n\n/** Terminal success path. From `done`. completionState !== \"complete\" => incomplete run. */\nexport interface RunFinishEvent extends BaseEvent {\n type: \"run-finish\";\n status: \"complete\" | \"incomplete\";\n completionState: string;\n unresolvedToolUseIds: string[];\n stopReason: string | null;\n terminalCompletionSeen: boolean;\n messageCount: number;\n}\n\n/** Structured failure codes carried on the wire as a dedicated `type`. */\nexport type RunErrorCode =\n | \"SANDBOX_BOOT_TIMEOUT\"\n | \"SANDBOX_QUOTA_EXHAUSTED\"\n | \"SANDBOX_UNAVAILABLE\"\n | \"SNAPSHOT_VERSION_MISMATCH\"\n | \"AGENT_RUNNER_DIED\"\n | \"RUNNER_LIFECYCLE_ERROR\";\n\n/** Terminal failure path. From `error`, `sdk_error`, `AGENT_RUNNER_DIED`, SANDBOX_*, SNAPSHOT_VERSION_MISMATCH. */\nexport interface RunErrorEvent extends BaseEvent {\n type: \"run-error\";\n error: string;\n message: string;\n /** structured failure code when the wire type was a coded failure, else null */\n code: RunErrorCode | null;\n fatal: true;\n /** HTTP status when the failure was an API (non-stream) error, e.g. 402/429 */\n apiStatus?: number;\n /** v2 envelope `error.details` — carries machine codes like\n * `error_code: \"END_USER_RATE_LIMITED\"` plus `retry_after`/`period_end` */\n apiDetails?: Record<string, unknown>;\n}\n\n/** Terminal cancellation. From `cancelled`. */\nexport interface RunCancelledEvent extends BaseEvent {\n type: \"run-cancelled\";\n runId?: number | null;\n}\n\n/* ---------- Message lifecycle ---------- */\n\nexport interface MessageStartEvent extends BaseEvent {\n type: \"message-start\";\n messageId: string;\n role: \"assistant\";\n usage?: { inputTokens: number; outputTokens: number };\n}\n\n/** From `message_stop` or `message_complete`. */\nexport interface MessageEndEvent extends BaseEvent {\n type: \"message-end\";\n messageId: string;\n usage?: { inputTokens: number; outputTokens: number };\n}\n\n/* ---------- Text ---------- */\n\nexport interface TextStartEvent extends BaseEvent {\n type: \"text-start\";\n id: string; // canonical block id (dedupe key)\n messageId: string;\n}\nexport interface TextDeltaEvent extends BaseEvent {\n type: \"text-delta\";\n id: string; // block id\n delta: string;\n messageId: string;\n}\nexport interface TextEndEvent extends BaseEvent {\n type: \"text-end\"; // inferred from content_block_stop on a text block\n id: string;\n messageId: string;\n}\n\n/* ---------- Reasoning (thinking + reasoning, one first-class part) ---------- */\n\nexport interface ReasoningStartEvent extends BaseEvent {\n type: \"reasoning-start\";\n id: string;\n messageId: string;\n}\nexport interface ReasoningDeltaEvent extends BaseEvent {\n type: \"reasoning-delta\";\n id: string;\n delta: string;\n messageId: string;\n}\nexport interface ReasoningEndEvent extends BaseEvent {\n type: \"reasoning-end\";\n id: string;\n messageId: string;\n}\n\n/* ---------- Plan (m8tes plan-mode; no AI SDK analog) ---------- */\n\nexport interface PlanStartEvent extends BaseEvent {\n type: \"plan-start\";\n id: string;\n messageId: string;\n}\nexport interface PlanDeltaEvent extends BaseEvent {\n type: \"plan-delta\";\n id: string;\n delta: string;\n messageId: string;\n}\nexport interface PlanEndEvent extends BaseEvent {\n type: \"plan-end\";\n id: string;\n messageId: string;\n}\n\n/* ---------- Tool-call lifecycle (AI SDK v5 idiom) ---------- */\n\nexport interface ToolInputStartEvent extends BaseEvent {\n type: \"tool-input-start\";\n toolCallId: string; // dedupe key\n toolName: string;\n messageId: string;\n state: \"input-streaming\";\n}\nexport interface ToolInputDeltaEvent extends BaseEvent {\n type: \"tool-input-delta\";\n toolCallId: string;\n inputTextDelta: string; // incremental partial-JSON STRING\n state: \"input-streaming\";\n}\nexport interface ToolInputAvailableEvent extends BaseEvent {\n type: \"tool-input-available\";\n toolCallId: string;\n toolName: string;\n input: unknown; // parsed object (from standalone tool_use.input)\n state: \"input-available\";\n}\nexport interface ToolOutputAvailableEvent extends BaseEvent {\n type: \"tool-output-available\";\n toolCallId: string; // from tool_result.tool_use_id\n output: unknown; // content (preferred) or result\n isError: boolean; // from is_error\n state: \"output-available\" | \"output-error\";\n}\n\n/* ---------- Human-in-the-loop (first-class, unlike vanilla useChat) ---------- */\n\n/** Tool approval gate. From `awaiting_approval` (toolName !== \"AskUserQuestion\") or `permission_request`. */\nexport interface ApprovalRequestEvent extends BaseEvent {\n type: \"approval-request\";\n requestId: string; // dedupe key\n toolCallId?: string; // the paused tool_use id when correlatable\n toolName: string;\n toolInput: unknown;\n timeoutSeconds: number;\n}\n/** Derived on resume / from the answer round-trip; surfaced for state reconciliation. */\nexport interface ApprovalResolvedEvent extends BaseEvent {\n type: \"approval-resolved\";\n requestId: string;\n resolved: \"approved\" | \"denied\";\n}\n\n/** AskUserQuestion gate. From `awaiting_approval` where toolName === \"AskUserQuestion\". */\nexport interface QuestionOption {\n label: string;\n description?: string;\n}\nexport interface QuestionItem {\n question: string;\n /** Real wire options are `{label, description}` objects; the normalizer also\n * coerces bare-string options into `{label}` defensively. */\n options?: QuestionOption[];\n [k: string]: unknown;\n}\nexport interface QuestionEvent extends BaseEvent {\n type: \"question\";\n requestId: string; // dedupe key\n toolCallId: string; // AskUserQuestion tool_use id; answer returns as tool-output-available for this id\n questions: QuestionItem[];\n timeoutSeconds: number;\n}\n\n/* ---------- Sandbox + non-fatal notices ---------- */\n\n/** From `sandbox-connecting` / `sandbox-connected`. (Fatal sandbox failures => RunErrorEvent with `code`.) */\nexport interface SandboxStatusEvent extends BaseEvent {\n type: \"sandbox-status\";\n phase: \"connecting\" | \"connected\";\n message: string;\n runId: number | null;\n sandboxId?: string | null;\n durationMs?: number;\n}\n\n/** Non-fatal diagnostics: stderr, mcp_error/mcp_auth_failed (warning), rate_limit, system_message. */\nexport interface NoticeEvent extends BaseEvent {\n type: \"notice\";\n level: \"info\" | \"warning\";\n source: \"stderr\" | \"mcp\" | \"rate_limit\" | \"system\";\n message: string;\n detail?: string;\n}\n\n/** From `compact_boundary`: the SDK summarized the conversation history. */\nexport interface CompactBoundaryEvent extends BaseEvent {\n type: \"compact-boundary\";\n trigger: \"manual\" | \"auto\";\n preTokens: number;\n}\n\n/* ---------- Passthrough ---------- */\n\n/**\n * Any wire type with no normalized mapping (`sdk_content_snapshot`, `user_message`,\n * `compact_boundary`, and future/unknown types). `raw` is preserved so consumers\n * and a newer normalizer can recover the original. Forward-compat: a new backend\n * event surfaces here instead of crashing.\n */\nexport interface UnknownEvent extends BaseEvent {\n type: \"unknown\";\n wireType: string; // the original wire `type` string (\"\" if absent)\n}\n\nexport type M8tesStreamEvent =\n | RunStartEvent\n | RunStatusEvent\n | RunMetricsEvent\n | RunFinishEvent\n | RunErrorEvent\n | RunCancelledEvent\n | MessageStartEvent\n | MessageEndEvent\n | TextStartEvent\n | TextDeltaEvent\n | TextEndEvent\n | ReasoningStartEvent\n | ReasoningDeltaEvent\n | ReasoningEndEvent\n | PlanStartEvent\n | PlanDeltaEvent\n | PlanEndEvent\n | ToolInputStartEvent\n | ToolInputDeltaEvent\n | ToolInputAvailableEvent\n | ToolOutputAvailableEvent\n | ApprovalRequestEvent\n | ApprovalResolvedEvent\n | QuestionEvent\n | SandboxStatusEvent\n | NoticeEvent\n | CompactBoundaryEvent\n | UnknownEvent;\n\nexport type M8tesStreamEventType = M8tesStreamEvent[\"type\"];\n\n/** Terminal events end a stream. */\nexport const TERMINAL_EVENT_TYPES = [\n \"run-finish\",\n \"run-error\",\n \"run-cancelled\",\n] as const satisfies readonly M8tesStreamEventType[];\nexport type TerminalEventType = (typeof TERMINAL_EVENT_TYPES)[number];\n\n/** True for the three terminal event types. */\nexport function isTerminalEvent(\n event: M8tesStreamEvent,\n): event is RunFinishEvent | RunErrorEvent | RunCancelledEvent {\n return (TERMINAL_EVENT_TYPES as readonly string[]).includes(event.type);\n}\n","/**\n * SSE wire decoder: raw bytes/text -> wire frame objects.\n *\n * Layer 1 of the pipeline (Layer 2 is `normalizer.ts`). This module ONLY knows\n * the SSE envelope + JSON, never the m8tes event semantics.\n *\n * chunk(s) ─push─► [ frame split on blank line ] ─► [ data: lines ]\n * ─► [ concatenated-JSON split ] ─► JSON.parse ─► wire object\n *\n * Wire facts it handles (from the streaming contract):\n * - Frames are separated by a blank line; `\\r\\n` is normalized to `\\n`.\n * - A line starting with `:` is an SSE comment (keepalive) — ignored.\n * - A frame may carry one or more `data:` lines (joined with `\\n` per spec).\n * - A single `data:` payload may glue MULTIPLE complete JSON objects together\n * (observed in the app stream); they are split with a string-aware brace\n * scanner — NOT a naive `}{` regex, which breaks on braces inside strings.\n * - Invalid JSON in a completed frame is DROPPED (reported via `onMalformed`),\n * never thrown — a corrupt frame must not kill the stream (contract §7).\n */\n\nexport interface SseParserOptions {\n /**\n * Called for each `data:` payload (or split piece) that fails to parse as JSON.\n * Default: no-op. Wire this to telemetry; do NOT throw from it.\n */\n onMalformed?: (rawPayload: string, error: unknown) => void;\n}\n\ntype WireFrame = Record<string, unknown>;\n\n/** Split a payload into top-level JSON object/array substrings, string-aware. */\nexport function splitConcatenatedJson(payload: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let inString = false;\n let escaped = false;\n let start = -1;\n let lastEnd = 0; // index just past the last emitted top-level value\n\n for (let i = 0; i < payload.length; i++) {\n const ch = payload.charAt(i);\n if (start === -1) {\n if (ch === \"{\" || ch === \"[\") {\n start = i;\n depth = 1;\n inString = false;\n escaped = false;\n }\n continue; // skip whitespace/junk before a value\n }\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') {\n inString = true;\n } else if (ch === \"{\" || ch === \"[\") {\n depth++;\n } else if (ch === \"}\" || ch === \"]\") {\n depth--;\n if (depth === 0) {\n out.push(payload.slice(start, i + 1));\n start = -1;\n lastEnd = i + 1;\n }\n }\n }\n\n if (start !== -1) {\n // Unterminated trailing object: emit so it fails parse loudly (reported).\n out.push(payload.slice(start));\n } else {\n // Residue after the last complete value (or a bare primitive when no value\n // was found): emit it so corruption reaches onMalformed instead of vanishing.\n const tail = payload.slice(lastEnd).trim();\n if (tail !== \"\") out.push(tail);\n }\n return out;\n}\n\n/** Extract the joined `data:` payload from one SSE frame, or null if it has none. */\nfunction frameDataPayload(frameText: string): string | null {\n const dataLines: string[] = [];\n for (const rawLine of frameText.split(\"\\n\")) {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n if (line === \"\" || line.charAt(0) === \":\") continue; // blank / comment\n if (line.startsWith(\"data:\")) {\n let value = line.slice(5);\n if (value.charAt(0) === \" \") value = value.slice(1); // drop one space\n dataLines.push(value);\n }\n // other SSE fields (event:/id:/retry:) are unused by m8tes — ignore.\n }\n if (dataLines.length === 0) return null;\n return dataLines.join(\"\\n\");\n}\n\nfunction parsePayload(\n payload: string,\n onMalformed: SseParserOptions[\"onMalformed\"],\n): WireFrame[] {\n const out: WireFrame[] = [];\n for (const candidate of splitConcatenatedJson(payload)) {\n try {\n const parsed: unknown = JSON.parse(candidate);\n if (parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n out.push(parsed as WireFrame);\n } else {\n // Arrays / primitives are not valid wire frames (flat objects only).\n onMalformed?.(candidate, new Error(\"frame is not a JSON object\"));\n }\n } catch (err) {\n onMalformed?.(candidate, err);\n }\n }\n return out;\n}\n\n/**\n * Stateful streaming decoder. Feed it response-body chunks (any size, split\n * mid-frame); it returns the wire frames completed by each chunk. Call `flush()`\n * once the stream ends to drain a trailing frame that had no closing blank line.\n */\nexport function createSseDecoder(opts: SseParserOptions = {}) {\n // `buf` holds normalized text plus, possibly, a single trailing raw `\\r` that\n // we cannot yet normalize: a CRLF can be split across chunk boundaries\n // (`...\\r` | `\\n...`). Eagerly turning a lone trailing `\\r` into `\\n` would\n // fabricate a `\\n\\n` frame boundary and corrupt a multi-line frame.\n let buf = \"\";\n\n function ingest(chunk: string): void {\n buf += chunk;\n let tail = \"\";\n if (buf.endsWith(\"\\r\")) {\n tail = \"\\r\"; // hold it for the next chunk\n buf = buf.slice(0, -1);\n }\n buf = buf.replace(/\\r\\n?/g, \"\\n\") + tail;\n }\n\n function drain(final: boolean): WireFrame[] {\n const frames: WireFrame[] = [];\n let sep = buf.indexOf(\"\\n\\n\");\n while (sep !== -1) {\n const frameText = buf.slice(0, sep);\n buf = buf.slice(sep + 2);\n const payload = frameDataPayload(frameText);\n if (payload !== null) frames.push(...parsePayload(payload, opts.onMalformed));\n sep = buf.indexOf(\"\\n\\n\");\n }\n if (final && buf.trim() !== \"\") {\n const payload = frameDataPayload(buf);\n if (payload !== null) frames.push(...parsePayload(payload, opts.onMalformed));\n buf = \"\";\n }\n return frames;\n }\n\n return {\n /** Feed a chunk; returns the wire frames it completed. */\n push(chunk: string): WireFrame[] {\n ingest(chunk);\n return drain(false);\n },\n /** Flush a trailing unterminated frame at end-of-stream. */\n flush(): WireFrame[] {\n if (buf.endsWith(\"\\r\")) buf = `${buf.slice(0, -1)}\\n`; // EOL at end-of-stream\n return drain(true);\n },\n };\n}\n\n/** Convenience: parse a whole SSE string into wire frames (used by fixtures/tests). */\nexport function parseSse(text: string, opts: SseParserOptions = {}): WireFrame[] {\n const dec = createSseDecoder(opts);\n return [...dec.push(text), ...dec.flush()];\n}\n","/**\n * Normalizer: wire frames -> public M8tesStreamEvent[].\n *\n * Layer 2 of the pipeline (Layer 1 = `sse-parser.ts`). Each wire frame maps to\n * ZERO or MORE public events. The normalizer owns:\n * - `seq`: a monotonic counter stamped on every emitted event (no wire seq id).\n * - dedupe: a domain-id `open`/`seen` ledger so a `/stream` rejoin that\n * re-streams blocks + re-sends a message_snapshot + re-sends a pending\n * permission_request renders EXACTLY ONCE (streaming contract §dedupeStrategy).\n *\n * One normalizer instance is kept ALIVE across a reconnect (the hook reuses it),\n * so `seen` persists and replayed content is dropped. Idempotent-apply rules:\n * - START events: skip if the key is already open or seen.\n * - DELTA events: drop if the key is in `seen` (finalized) — a replayed delta\n * for a closed block. A bare key not yet seen is lazily opened (tolerates a\n * trimmed replay prefix).\n * - END / result / terminal / approval events: finalize, move key to `seen`;\n * a second occurrence is a no-op.\n *\n * Unknown/unmapped wire types pass through as `UnknownEvent` (never throw).\n */\n\nimport {\n PROTOCOL_VERSION,\n type M8tesStreamEvent,\n type QuestionItem,\n type QuestionOption,\n type RunErrorCode,\n} from \"./events\";\n\ntype WireFrame = Record<string, unknown>;\n/** Distributive Omit — preserves each union member's discriminant-specific\n * fields (plain `Omit<Union, K>` collapses a union to its common keys). */\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown\n ? Omit<T, K>\n : never;\ntype Emitted = DistributiveOmit<M8tesStreamEvent, \"seq\" | \"raw\">;\n\nconst ASK_USER_QUESTION = \"AskUserQuestion\";\n\nconst SANDBOX_ERROR_CODES: ReadonlySet<string> = new Set<RunErrorCode>([\n \"SANDBOX_BOOT_TIMEOUT\",\n \"SANDBOX_QUOTA_EXHAUSTED\",\n \"SANDBOX_UNAVAILABLE\",\n \"SNAPSHOT_VERSION_MISMATCH\",\n \"AGENT_RUNNER_DIED\",\n \"RUNNER_LIFECYCLE_ERROR\",\n]);\n\n/* ---- tiny safe field accessors over the loosely-typed wire ---- */\nconst str = (o: WireFrame, k: string): string | undefined =>\n typeof o[k] === \"string\" ? (o[k] as string) : undefined;\nconst num = (o: WireFrame, k: string): number | undefined =>\n typeof o[k] === \"number\" ? (o[k] as number) : undefined;\nconst bool = (o: WireFrame, k: string): boolean | undefined =>\n typeof o[k] === \"boolean\" ? (o[k] as boolean) : undefined;\nconst obj = (o: WireFrame, k: string): WireFrame | undefined => {\n const v = o[k];\n return v !== null && typeof v === \"object\" && !Array.isArray(v)\n ? (v as WireFrame)\n : undefined;\n};\nconst arr = (o: WireFrame, k: string): unknown[] | undefined =>\n Array.isArray(o[k]) ? (o[k] as unknown[]) : undefined;\n\ntype BlockKind = \"text\" | \"reasoning\" | \"plan\" | \"tool_use\" | \"other\";\n\nfunction blockKindFromType(t: string | undefined): BlockKind {\n switch (t) {\n case \"text\":\n return \"text\";\n case \"thinking\":\n case \"reasoning\":\n return \"reasoning\";\n case \"plan\":\n return \"plan\";\n case \"tool_use\":\n case \"server_tool_use\":\n return \"tool_use\";\n default:\n return \"other\";\n }\n}\n\nconst blockEndType = {\n text: \"text-end\",\n reasoning: \"reasoning-end\",\n plan: \"plan-end\",\n} as const;\nconst blockStartType = {\n text: \"text-start\",\n reasoning: \"reasoning-start\",\n plan: \"plan-start\",\n} as const;\nconst blockDeltaType = {\n text: \"text-delta\",\n reasoning: \"reasoning-delta\",\n plan: \"plan-delta\",\n} as const;\n\nexport interface Normalizer {\n /** Map one wire frame to zero+ public events (seq-stamped, in order). */\n push(frame: WireFrame): M8tesStreamEvent[];\n /** Discard all dedupe/lifecycle state (e.g. starting a brand-new run). */\n reset(): void;\n}\n\nexport function createNormalizer(): Normalizer {\n let seq = 0;\n let open = new Set<string>();\n let seen = new Set<string>();\n let blockKind = new Map<string, BlockKind>();\n let currentMessageId: string | null = null;\n let activeTextBlockId: string | null = null;\n let lastToolId: string | null = null; // last non-question tool_use block id\n let lastQuestionToolId: string | null = null;\n // Whether any text/reasoning/plan content streamed this run — an id-less\n // snapshot block then duplicates it (the runtime only synthesizes a content\n // snapshot when nothing streamed). Run-global on purpose: replayed blocks can\n // arrive before their message_start, so a per-message key can mismatch.\n let anyContentStreamed = false;\n let runStartEmitted = false;\n let terminalEmitted = false;\n\n function reset() {\n seq = 0;\n open = new Set();\n seen = new Set();\n blockKind = new Map();\n currentMessageId = null;\n activeTextBlockId = null;\n lastToolId = null;\n lastQuestionToolId = null;\n anyContentStreamed = false;\n runStartEmitted = false;\n terminalEmitted = false;\n }\n\n function emitContentBlockStart(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"id\");\n if (!id) return;\n const kind = blockKindFromType(str(f, \"block_type\") ?? str(f, \"type\"));\n const key = kind === \"tool_use\" ? `tool:${id}` : `block:${id}`;\n if (open.has(key) || seen.has(key)) return; // replayed start\n blockKind.set(id, kind);\n if (kind === \"tool_use\") {\n const name = str(f, \"name\") ?? \"\";\n if (name === ASK_USER_QUESTION) lastQuestionToolId = id;\n else lastToolId = id;\n open.add(key);\n out.push({\n type: \"tool-input-start\",\n toolCallId: id,\n toolName: name,\n messageId: currentMessageId ?? \"\",\n state: \"input-streaming\",\n });\n } else if (kind === \"text\" || kind === \"reasoning\" || kind === \"plan\") {\n open.add(key);\n if (kind === \"text\") activeTextBlockId = id;\n anyContentStreamed = true;\n out.push({\n type: blockStartType[kind],\n id,\n messageId: currentMessageId ?? \"\",\n });\n }\n // kind \"other\" (tool_result block start, etc.): no public start event.\n }\n\n function emitContentBlockDelta(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"id\");\n if (!id) return;\n const delta = obj(f, \"delta\");\n if (!delta) return;\n const dType = str(delta, \"type\");\n\n if (dType === \"input_json_delta\") {\n const key = `tool:${id}`;\n if (seen.has(key)) return; // finalized tool, replayed delta\n const partial = str(delta, \"partial_json\") ?? \"\";\n if (partial === \"\") return;\n if (!open.has(key)) {\n // tolerate a trimmed tool start: lazily open so content_block_stop\n // finalizes tool:{id} into `seen` and a rejoin's replayed deltas drop.\n open.add(key);\n blockKind.set(id, \"tool_use\");\n }\n out.push({\n type: \"tool-input-delta\",\n toolCallId: id,\n inputTextDelta: partial,\n state: \"input-streaming\",\n });\n return;\n }\n\n let kind: \"text\" | \"reasoning\" | \"plan\" | null = null;\n if (dType === \"text_delta\") kind = \"text\";\n else if (dType === \"thinking_delta\" || dType === \"reasoning_delta\")\n kind = \"reasoning\";\n else if (dType === \"plan_delta\") kind = \"plan\";\n if (!kind) return; // signature_delta, output_json_delta, etc. -> ignore\n\n const key = `block:${id}`;\n if (seen.has(key)) return; // finalized block, replayed delta\n // Content key varies by delta type on the real wire (mirrors the runtime\n // accumulator): thinking_delta carries `thinking`, plan_delta carries\n // `text` or `plan`, text_delta carries `text`.\n const text =\n kind === \"reasoning\"\n ? (str(delta, \"thinking\") ?? str(delta, \"text\") ?? \"\")\n : kind === \"plan\"\n ? (str(delta, \"text\") ?? str(delta, \"plan\") ?? \"\")\n : (str(delta, \"text\") ?? \"\");\n if (text === \"\") return; // empty delta is a no-op\n if (!open.has(key)) {\n // tolerate a trimmed replay prefix: lazily open the block\n open.add(key);\n blockKind.set(id, kind);\n if (kind === \"text\") activeTextBlockId = id;\n anyContentStreamed = true;\n }\n out.push({ type: blockDeltaType[kind], id, delta: text, messageId: currentMessageId ?? \"\" });\n }\n\n function emitContentBlockStop(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"id\");\n if (!id) return;\n const kind = blockKind.get(id) ?? \"other\";\n if (kind === \"tool_use\") {\n seen.add(`tool:${id}`);\n open.delete(`tool:${id}`);\n return; // input streaming closed; resolved input arrives via standalone tool_use\n }\n if (kind === \"text\" || kind === \"reasoning\" || kind === \"plan\") {\n const key = `block:${id}`;\n open.delete(key);\n if (seen.has(key)) return; // replayed stop for an already-finalized block\n seen.add(key);\n if (activeTextBlockId === id) activeTextBlockId = null;\n out.push({ type: blockEndType[kind], id, messageId: currentMessageId ?? \"\" });\n }\n }\n\n function emitMessageDelta(f: WireFrame, out: Emitted[]): void {\n const delta = obj(f, \"delta\");\n if (!delta) return;\n const text = str(delta, \"text\") ?? \"\";\n if (text === \"\" || !activeTextBlockId) return; // empty / no active block (replay)\n const key = `block:${activeTextBlockId}`;\n if (seen.has(key)) return;\n out.push({\n type: \"text-delta\",\n id: activeTextBlockId,\n delta: text,\n messageId: currentMessageId ?? \"\",\n });\n }\n\n function emitStandaloneToolUse(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"id\");\n if (!id) return;\n const name = str(f, \"name\") ?? \"\";\n if (name === ASK_USER_QUESTION) lastQuestionToolId = id;\n else if (name) lastToolId = id;\n if (\"input\" in f) {\n const key = `toolinput:${id}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push({\n type: \"tool-input-available\",\n toolCallId: id,\n toolName: name,\n input: f[\"input\"],\n state: \"input-available\",\n });\n } else {\n const partial = str(f, \"input_text\");\n if (partial && !seen.has(`tool:${id}`)) {\n out.push({\n type: \"tool-input-delta\",\n toolCallId: id,\n inputTextDelta: partial,\n state: \"input-streaming\",\n });\n }\n }\n }\n\n function emitToolResult(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"tool_use_id\");\n if (!id) return;\n const key = `tool_result:${id}`;\n if (seen.has(key)) return;\n seen.add(key);\n const isError = bool(f, \"is_error\") ?? false;\n const output = \"content\" in f ? f[\"content\"] : f[\"result\"];\n out.push({\n type: \"tool-output-available\",\n toolCallId: id,\n output,\n isError,\n state: isError ? \"output-error\" : \"output-available\",\n });\n }\n\n /** awaiting_approval / permission_request -> approval-request OR question. */\n function emitApprovalGate(f: WireFrame, out: Emitted[]): void {\n const requestId = str(f, \"request_id\");\n if (!requestId) return;\n const toolName = str(f, \"tool_name\") ?? \"\";\n const timeoutSeconds = num(f, \"timeout_seconds\") ?? 0;\n const toolInput = f[\"tool_input\"];\n if (toolName === ASK_USER_QUESTION) {\n const key = `question:${requestId}`;\n if (seen.has(key)) return;\n seen.add(key);\n const ti = obj(f, \"tool_input\");\n const questions = ((ti && arr(ti, \"questions\")) ?? []).flatMap((q): QuestionItem[] => {\n if (q === null || typeof q !== \"object\") return [];\n const qq = q as WireFrame;\n // Real wire options are `{label, description}` objects; coerce bare\n // strings defensively and drop anything without a label.\n const options = (arr(qq, \"options\") ?? []).flatMap((o): QuestionOption[] => {\n if (typeof o === \"string\") return [{ label: o }];\n if (o === null || typeof o !== \"object\") return [];\n const label = str(o as WireFrame, \"label\");\n if (!label) return [];\n const description = str(o as WireFrame, \"description\");\n return [description === undefined ? { label } : { label, description }];\n });\n return [{ ...qq, question: str(qq, \"question\") ?? \"\", options }];\n });\n out.push({\n type: \"question\",\n requestId,\n toolCallId: str(f, \"tool_use_id\") ?? lastQuestionToolId ?? \"\",\n questions,\n timeoutSeconds,\n });\n } else {\n const key = `approval:${requestId}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push({\n type: \"approval-request\",\n requestId,\n // The frame's own tool_use_id is authoritative (live awaiting_approval\n // carries it; rejoin permission_request does too as of the run_join\n // fix). The last-tool inference is only a fallback — with PARALLEL tool\n // calls it can name the wrong tool.\n toolCallId: str(f, \"tool_use_id\") ?? lastToolId ?? undefined,\n toolName,\n toolInput,\n timeoutSeconds,\n });\n }\n }\n\n /** message_snapshot: reconstruct ONLY blocks not already rendered. Real\n * snapshot text/thinking/plan blocks carry NO `id` (they're the runtime\n * accumulator's typed blocks, e.g. `{\"type\":\"thinking\",\"thinking\":...}`) —\n * for those we synthesize a stable positional key and reconstruct only when\n * this message streamed no content (the synthetic final snapshot on the\n * CLI-error path, or a fully-trimmed rejoin); if content DID stream, an\n * id-less snapshot block is a copy of it and is dropped. */\n function emitSnapshot(f: WireFrame, out: Emitted[]): void {\n const messageId = str(f, \"message_id\") ?? currentMessageId ?? \"\";\n const blocks = arr(f, \"content_blocks\") ?? [];\n for (let i = 0; i < blocks.length; i++) {\n const raw = blocks[i];\n if (raw === null || typeof raw !== \"object\") continue;\n const b = raw as WireFrame;\n const bType = str(b, \"type\");\n const kind = blockKindFromType(bType);\n if (kind === \"text\" || kind === \"reasoning\" || kind === \"plan\") {\n let id = str(b, \"id\");\n if (!id) {\n if (anyContentStreamed) continue; // copy of already-streamed content\n id = `${messageId}:snap:${i}`; // stable across a replayed snapshot\n }\n const key = `block:${id}`;\n if (seen.has(key)) continue; // already finalized -> drop the snapshot copy\n if (open.has(key)) {\n // streamed but not yet closed (orphan / trimmed stop): finalize ONLY,\n // do not re-emit start+content on top of what already rendered.\n open.delete(key);\n seen.add(key);\n if (activeTextBlockId === id) activeTextBlockId = null;\n out.push({ type: blockEndType[kind], id, messageId });\n continue;\n }\n // never seen: reconstruct from the snapshot (trimmed-prefix replay or\n // snapshot-only output). Content key varies by block type (runtime\n // accumulator shape): text -> `text`, thinking -> `thinking`, plan -> `plan`.\n seen.add(key);\n out.push({ type: blockStartType[kind], id, messageId });\n const text =\n kind === \"reasoning\"\n ? (str(b, \"thinking\") ?? str(b, \"text\") ?? \"\")\n : kind === \"plan\"\n ? (str(b, \"plan\") ?? str(b, \"text\") ?? \"\")\n : (str(b, \"text\") ?? \"\");\n if (text !== \"\") out.push({ type: blockDeltaType[kind], id, delta: text, messageId });\n out.push({ type: blockEndType[kind], id, messageId });\n } else if (bType === \"tool_use\") {\n const id = str(b, \"id\");\n if (!id || seen.has(`toolinput:${id}`)) continue;\n seen.add(`toolinput:${id}`);\n out.push({\n type: \"tool-input-available\",\n toolCallId: id,\n toolName: str(b, \"name\") ?? \"\",\n input: b[\"input\"],\n state: \"input-available\",\n });\n } else if (bType === \"tool_result\") {\n const id = str(b, \"tool_use_id\");\n if (!id || seen.has(`tool_result:${id}`)) continue;\n seen.add(`tool_result:${id}`);\n const isError = bool(b, \"is_error\") ?? false;\n out.push({\n type: \"tool-output-available\",\n toolCallId: id,\n output: \"content\" in b ? b[\"content\"] : b[\"result\"],\n isError,\n state: isError ? \"output-error\" : \"output-available\",\n });\n }\n }\n }\n\n function emitNotice(\n out: Emitted[],\n level: \"info\" | \"warning\",\n source: \"stderr\" | \"mcp\" | \"rate_limit\" | \"system\",\n message: string,\n detail?: string,\n ): void {\n out.push(detail === undefined ? { type: \"notice\", level, source, message } : { type: \"notice\", level, source, message, detail });\n }\n\n function handle(frame: WireFrame, out: Emitted[]): void {\n const type = str(frame, \"type\") ?? \"\";\n\n switch (type) {\n /* ---- dropped no-ops ---- */\n case \"keep-alive\":\n case \"ping\":\n case \"RUNNER_DIAG\":\n case \"sdk_init\":\n case \"sandbox_metrics\":\n return;\n\n /* ---- run lifecycle ---- */\n case \"metadata\": {\n if (runStartEmitted) return; // duplicate preamble / rejoin re-synth\n runStartEmitted = true;\n const sandboxId = str(frame, \"sandbox_id\") ?? null;\n const sandboxEnabled = bool(frame, \"sandbox_enabled\") ?? false;\n out.push({\n type: \"run-start\",\n protocolVersion: PROTOCOL_VERSION,\n runId: num(frame, \"run_id\") ?? null,\n runUuid: str(frame, \"run_uuid\") ?? null,\n mode: str(frame, \"mode\") === \"task\" ? \"task\" : \"chat\",\n ...(str(frame, \"agent_name\") ? { agentName: str(frame, \"agent_name\") } : {}),\n ...(num(frame, \"instance_id\") !== undefined ? { instanceId: num(frame, \"instance_id\") } : {}),\n ...(num(frame, \"task_id\") !== undefined ? { taskId: num(frame, \"task_id\") } : {}),\n ...(str(frame, \"status\") ? { status: str(frame, \"status\") } : {}),\n sandbox: { id: sandboxId, enabled: sandboxEnabled },\n });\n return;\n }\n case \"run_metrics\": {\n out.push({\n type: \"run-metrics\",\n model: str(frame, \"model\") ?? \"\",\n executionTimeMs: num(frame, \"execution_time_ms\") ?? 0,\n inputTokens: num(frame, \"input_tokens_used\") ?? 0,\n outputTokens: num(frame, \"output_tokens_used\") ?? 0,\n costUsd: num(frame, \"claude_token_cost_usd\") ?? null,\n sdkCostUsd: num(frame, \"sdk_total_cost_usd\") ?? null,\n stopReason: str(frame, \"stop_reason\") ?? null,\n completionState: str(frame, \"completion_state\") ?? \"\",\n unresolvedToolUseIds: (arr(frame, \"unresolved_tool_use_ids\") ?? []).filter(\n (x): x is string => typeof x === \"string\",\n ),\n messageCount: num(frame, \"message_count\") ?? 0,\n ...(obj(frame, \"diagnostics\") ? { diagnostics: obj(frame, \"diagnostics\") } : {}),\n });\n return;\n }\n case \"done\": {\n if (terminalEmitted) return;\n terminalEmitted = true;\n const completionState = str(frame, \"completion_state\") ?? \"complete\";\n out.push({\n type: \"run-finish\",\n status: completionState === \"complete\" ? \"complete\" : \"incomplete\",\n completionState,\n unresolvedToolUseIds: (arr(frame, \"unresolved_tool_use_ids\") ?? []).filter(\n (x): x is string => typeof x === \"string\",\n ),\n stopReason: str(frame, \"stop_reason\") ?? null,\n terminalCompletionSeen: bool(frame, \"terminal_completion_seen\") ?? false,\n messageCount: num(frame, \"message_count\") ?? 0,\n });\n return;\n }\n case \"cancelled\": {\n if (terminalEmitted) return;\n terminalEmitted = true;\n out.push({ type: \"run-cancelled\", runId: num(frame, \"run_id\") ?? null });\n return;\n }\n case \"error\":\n case \"AGENT_RUNNER_DIED\":\n case \"RUNNER_LIFECYCLE_ERROR\":\n case \"SANDBOX_BOOT_TIMEOUT\":\n case \"SANDBOX_QUOTA_EXHAUSTED\":\n case \"SANDBOX_UNAVAILABLE\":\n case \"SNAPSHOT_VERSION_MISMATCH\": {\n if (terminalEmitted) return;\n terminalEmitted = true;\n const code = SANDBOX_ERROR_CODES.has(type) ? (type as RunErrorCode) : null;\n out.push({\n type: \"run-error\",\n error: str(frame, \"error\") ?? str(frame, \"message\") ?? type,\n message: str(frame, \"message\") ?? \"Agent execution failed\",\n code,\n fatal: true,\n });\n return;\n }\n case \"sdk_error\": {\n // Ambiguous terminality in the legacy parser — treat as a non-fatal\n // warning notice so the UI doesn't dead-end on a recoverable error.\n emitNotice(out, \"warning\", \"system\", str(frame, \"error\") ?? \"SDK error\");\n return;\n }\n case \"sdk_success\": {\n // The SDK ResultMessage. On an Anthropic-side failure (quota exhausted,\n // oauth revoked, model unavailable, ...) the wire STILL ends with\n // `done` + completion_state \"complete\", but the backend marks the run\n // failed from `is_error` — surface the failure here so the client\n // doesn't report a failed run as complete. (terminalEmitted then\n // suppresses the misleading `done`.) Non-error results stay unknown\n // passthrough bookkeeping.\n if (bool(frame, \"is_error\") !== true) {\n out.push({ type: \"unknown\", wireType: type }); // bookkeeping passthrough (as before)\n return;\n }\n if (terminalEmitted) return;\n terminalEmitted = true;\n out.push({\n type: \"run-error\",\n error: str(frame, \"subtype\") ?? \"sdk_error\",\n message: str(frame, \"result\") ?? \"The model provider returned an error.\",\n code: null,\n fatal: true,\n });\n return;\n }\n\n /* ---- message lifecycle ---- */\n case \"message_start\": {\n const msg = obj(frame, \"message\");\n const id = (msg && str(msg, \"id\")) ?? str(frame, \"message_id\");\n if (!id) return;\n currentMessageId = id;\n const key = `message:${id}`;\n if (seen.has(key)) return;\n seen.add(key);\n const usage = msg && obj(msg, \"usage\");\n out.push({\n type: \"message-start\",\n messageId: id,\n role: \"assistant\",\n ...(usage\n ? { usage: { inputTokens: num(usage, \"input_tokens\") ?? 0, outputTokens: num(usage, \"output_tokens\") ?? 0 } }\n : {}),\n });\n return;\n }\n case \"message_stop\":\n case \"message_complete\": {\n const id = str(frame, \"message_id\") ?? currentMessageId;\n if (!id) return;\n const key = `message:${id}:end`;\n if (seen.has(key)) return;\n seen.add(key);\n const usage = obj(frame, \"usage\");\n out.push({\n type: \"message-end\",\n messageId: id,\n ...(usage\n ? { usage: { inputTokens: num(usage, \"input_tokens\") ?? 0, outputTokens: num(usage, \"output_tokens\") ?? 0 } }\n : {}),\n });\n return;\n }\n case \"message_snapshot\":\n emitSnapshot(frame, out);\n return;\n\n /* ---- content blocks ---- */\n case \"content_block_start\":\n emitContentBlockStart(frame, out);\n return;\n case \"content_block_delta\":\n emitContentBlockDelta(frame, out);\n return;\n case \"content_block_stop\":\n emitContentBlockStop(frame, out);\n return;\n case \"message_delta\":\n emitMessageDelta(frame, out);\n return;\n\n /* ---- tools ---- */\n case \"tool_use\":\n emitStandaloneToolUse(frame, out);\n return;\n case \"tool_result\":\n emitToolResult(frame, out);\n return;\n\n /* ---- standalone reasoning / plan: passthrough as `unknown` for v1 ----\n * These top-level (non-content_block) frames carry full content with no\n * wire id, so they cannot be deduped across a rejoin and two bursts would\n * collide on a synthetic id. Block-based reasoning (content_block\n * reasoning_delta) is the dedupe-safe path and IS handled. Surface these\n * raw until their real wire behavior is confirmed (CONTRACT.md open Q). */\n\n /* ---- HITL ---- */\n case \"awaiting_approval\":\n case \"permission_request\":\n emitApprovalGate(frame, out);\n return;\n\n /* ---- sandbox + notices ---- */\n case \"sandbox-connecting\":\n out.push({\n type: \"sandbox-status\",\n phase: \"connecting\",\n message: str(frame, \"message\") ?? \"Connecting to sandbox\",\n runId: num(frame, \"run_id\") ?? null,\n });\n return;\n case \"sandbox-connected\":\n out.push({\n type: \"sandbox-status\",\n phase: \"connected\",\n message: str(frame, \"message\") ?? \"Connected to sandbox\",\n runId: num(frame, \"run_id\") ?? null,\n ...(str(frame, \"sandbox_id\") !== undefined ? { sandboxId: str(frame, \"sandbox_id\") } : {}),\n ...(num(frame, \"duration_ms\") !== undefined ? { durationMs: num(frame, \"duration_ms\") } : {}),\n });\n return;\n case \"stderr\":\n emitNotice(out, \"info\", \"stderr\", str(frame, \"message\") ?? \"\");\n return;\n case \"mcp_error\":\n case \"mcp_auth_failed\":\n emitNotice(out, \"warning\", \"mcp\", str(frame, \"message\") ?? str(frame, \"error\") ?? \"MCP error\", str(frame, \"detail\"));\n return;\n case \"rate_limit\": {\n const info = obj(frame, \"rate_limit_info\");\n const status = (info && str(info, \"status\")) ?? \"allowed\";\n emitNotice(out, status === \"rejected\" ? \"warning\" : \"info\", \"rate_limit\", `Rate limit: ${status}`);\n return;\n }\n case \"compact_boundary\":\n out.push({\n type: \"compact-boundary\",\n trigger: str(frame, \"trigger\") === \"manual\" ? \"manual\" : \"auto\",\n preTokens: num(frame, \"pre_tokens\") ?? 0,\n });\n return;\n\n /* ---- passthrough ---- */\n default:\n out.push({ type: \"unknown\", wireType: type });\n return;\n }\n }\n\n return {\n push(frame: WireFrame): M8tesStreamEvent[] {\n const partials: Emitted[] = [];\n handle(frame, partials);\n return partials.map(\n (e) => ({ ...e, seq: seq++, raw: frame }) as M8tesStreamEvent,\n );\n },\n reset,\n };\n}\n","/**\n * Accumulator: the normalized event stream -> renderable conversation state.\n *\n * Pure + immutable (new state object on every change) so React can re-render via\n * useState/useSyncExternalStore. Framework-agnostic — `useMate` wraps it. It\n * assumes the normalizer has already deduped (so each event is \"new\"); it only\n * folds events into messages/parts + run status + pending HITL.\n *\n * Lazy creation: a `text-delta`/`tool-*` with no preceding start (a trimmed\n * replay prefix) lazily creates its message/part, so a partial rejoin still\n * renders rather than dropping content.\n */\n\nimport type {\n ApprovalRequestEvent,\n M8tesStreamEvent,\n QuestionEvent,\n RunStatus,\n ToolState,\n} from \"./events\";\n\nexport type TextLikeKind = \"text\" | \"reasoning\" | \"plan\";\n\nexport interface TextPart {\n kind: TextLikeKind;\n id: string;\n text: string;\n}\nexport interface ToolPart {\n kind: \"tool\";\n toolCallId: string;\n toolName: string;\n state: ToolState;\n inputText: string; // accumulated partial-JSON while streaming\n input?: unknown; // resolved input object\n output?: unknown; // tool result\n isError?: boolean;\n}\n/** Non-fatal diagnostics rendered as a quiet inline row (mcp auth failures,\n * rate limits) — the platform surfaces these; silence hides real failures. */\nexport interface NoticePart {\n kind: \"notice\";\n id: string;\n level: \"info\" | \"warning\";\n source: string;\n message: string;\n}\n/** Sandbox lifecycle pill (\"connecting to environment\" -> \"environment ready\"). */\nexport interface SandboxPart {\n kind: \"sandbox\";\n id: string;\n phase: \"connecting\" | \"connected\";\n durationMs?: number;\n}\n/** Conversation-summarized divider (SDK auto/manual compaction). */\nexport interface CompactPart {\n kind: \"compact\";\n id: string;\n trigger: \"manual\" | \"auto\";\n preTokens: number;\n}\nexport type MatePart = TextPart | ToolPart | NoticePart | SandboxPart | CompactPart;\n\nexport interface MateMessage {\n id: string;\n role: \"assistant\" | \"user\";\n parts: MatePart[];\n}\n\nexport type MateStatus = \"idle\" | RunStatus;\n\nexport interface ConversationState {\n runId: number | null;\n runUuid: string | null;\n agentName: string | null;\n status: MateStatus;\n messages: MateMessage[];\n pendingApproval: ApprovalRequestEvent | null;\n pendingQuestion: QuestionEvent | null;\n /** From run-metrics: \"refusal\" | \"max_tokens\" render a quiet outcome row\n * (\"Request declined\" / \"Response truncated\"); anything else is null. */\n finishStopReason: \"refusal\" | \"max_tokens\" | null;\n error: {\n message: string;\n code: string | null;\n /** HTTP status for API errors (402 limit / 429 rate) */\n apiStatus?: number;\n /** v2 `error.details` (machine `error_code`, `retry_after`, `period_end`, ...) */\n apiDetails?: Record<string, unknown>;\n } | null;\n}\n\nexport const initialConversationState: ConversationState = {\n runId: null,\n runUuid: null,\n agentName: null,\n status: \"idle\",\n messages: [],\n pendingApproval: null,\n pendingQuestion: null,\n finishStopReason: null,\n error: null,\n};\n\nfunction lastAssistantIndex(messages: MateMessage[]): number {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === \"assistant\") return i;\n }\n return -1;\n}\n\n/** Get-or-create a message and replace its parts via `fn`. */\nfunction withMessageParts(\n state: ConversationState,\n messageId: string,\n role: \"assistant\" | \"user\",\n fn: (parts: MatePart[]) => MatePart[],\n): ConversationState {\n const messages = state.messages.slice();\n let idx = messageId\n ? messages.findIndex((m) => m.id === messageId)\n : lastAssistantIndex(messages);\n if (idx === -1) {\n messages.push({ id: messageId || `m:${messages.length}`, role, parts: [] });\n idx = messages.length - 1;\n }\n const msg = messages[idx]!;\n messages[idx] = { ...msg, parts: fn(msg.parts) };\n return { ...state, messages };\n}\n\nconst isTextLike = (p: MatePart): p is TextPart =>\n p.kind === \"text\" || p.kind === \"reasoning\" || p.kind === \"plan\";\n\nfunction ensureTextPart(parts: MatePart[], kind: TextLikeKind, id: string): MatePart[] {\n if (parts.some((p) => isTextLike(p) && p.id === id)) return parts;\n return [...parts, { kind, id, text: \"\" }];\n}\n\nfunction applyTextDelta(\n parts: MatePart[],\n kind: TextLikeKind,\n id: string,\n delta: string,\n): MatePart[] {\n const i = parts.findIndex((p) => isTextLike(p) && p.id === id);\n if (i === -1) return [...parts, { kind, id, text: delta }];\n const p = parts[i] as TextPart;\n const next = parts.slice();\n next[i] = { ...p, text: p.text + delta };\n return next;\n}\n\n/** Find a tool part by id across ALL messages (results pair across messages). */\nfunction updateToolPart(\n state: ConversationState,\n toolCallId: string,\n toolName: string | undefined,\n patch: (p: ToolPart) => ToolPart,\n): ConversationState {\n const messages = state.messages.slice();\n for (let mi = 0; mi < messages.length; mi++) {\n const parts = messages[mi]!.parts;\n const pi = parts.findIndex((p) => p.kind === \"tool\" && p.toolCallId === toolCallId);\n if (pi !== -1) {\n const np = parts.slice();\n np[pi] = patch(parts[pi] as ToolPart);\n messages[mi] = { ...messages[mi]!, parts: np };\n return { ...state, messages };\n }\n }\n // not found: lazily create in the last assistant message (or a new one)\n let idx = lastAssistantIndex(messages);\n if (idx === -1) {\n messages.push({ id: `m:${messages.length}`, role: \"assistant\", parts: [] });\n idx = messages.length - 1;\n }\n const base: ToolPart = {\n kind: \"tool\",\n toolCallId,\n toolName: toolName ?? \"\",\n state: \"input-streaming\",\n inputText: \"\",\n };\n messages[idx] = { ...messages[idx]!, parts: [...messages[idx]!.parts, patch(base)] };\n return { ...state, messages };\n}\n\n/** A paused run resumes the moment content flows again. */\nfunction resume(status: MateStatus): MateStatus {\n return status === \"awaiting_approval\" || status === \"awaiting_input\" ? \"running\" : status;\n}\n\nexport function accumulate(\n state: ConversationState,\n e: M8tesStreamEvent,\n): ConversationState {\n switch (e.type) {\n case \"run-start\":\n return {\n ...state,\n runId: e.runId,\n runUuid: e.runUuid,\n agentName: e.agentName ?? state.agentName ?? null,\n status: \"running\",\n error: null,\n // A retry re-drives the turn: the previous attempt's outcome row\n // (\"Response truncated\", \"Request declined\") must not survive it.\n finishStopReason: null,\n };\n case \"run-status\":\n return { ...state, status: e.status };\n case \"message-start\":\n return withMessageParts(state, e.messageId, e.role, (p) => p);\n case \"text-start\":\n return {\n ...withMessageParts(state, e.messageId, \"assistant\", (p) => ensureTextPart(p, \"text\", e.id)),\n status: resume(state.status),\n };\n case \"text-delta\":\n return {\n ...withMessageParts(state, e.messageId, \"assistant\", (p) => applyTextDelta(p, \"text\", e.id, e.delta)),\n status: resume(state.status),\n };\n case \"reasoning-start\":\n return withMessageParts(state, e.messageId, \"assistant\", (p) => ensureTextPart(p, \"reasoning\", e.id));\n case \"reasoning-delta\":\n return withMessageParts(state, e.messageId, \"assistant\", (p) => applyTextDelta(p, \"reasoning\", e.id, e.delta));\n case \"plan-start\":\n return withMessageParts(state, e.messageId, \"assistant\", (p) => ensureTextPart(p, \"plan\", e.id));\n case \"plan-delta\":\n return withMessageParts(state, e.messageId, \"assistant\", (p) => applyTextDelta(p, \"plan\", e.id, e.delta));\n case \"text-end\":\n case \"reasoning-end\":\n case \"plan-end\":\n case \"message-end\":\n return state;\n case \"tool-input-start\":\n return {\n ...withMessageParts(state, e.messageId, \"assistant\", (p) =>\n p.some((x) => x.kind === \"tool\" && x.toolCallId === e.toolCallId)\n ? p\n : [\n ...p,\n {\n kind: \"tool\",\n toolCallId: e.toolCallId,\n toolName: e.toolName,\n state: \"input-streaming\",\n inputText: \"\",\n },\n ],\n ),\n status: resume(state.status),\n };\n case \"tool-input-delta\":\n return updateToolPart(state, e.toolCallId, undefined, (t) => ({\n ...t,\n inputText: t.inputText + e.inputTextDelta,\n state: \"input-streaming\",\n }));\n case \"tool-input-available\":\n return updateToolPart(state, e.toolCallId, e.toolName, (t) => ({\n ...t,\n input: e.input,\n state: \"input-available\",\n }));\n case \"tool-output-available\": {\n const s = updateToolPart(state, e.toolCallId, undefined, (t) => ({\n ...t,\n output: e.output,\n isError: e.isError,\n state: e.state,\n }));\n const pendingApproval =\n s.pendingApproval && s.pendingApproval.toolCallId === e.toolCallId ? null : s.pendingApproval;\n const pendingQuestion =\n s.pendingQuestion && s.pendingQuestion.toolCallId === e.toolCallId ? null : s.pendingQuestion;\n return { ...s, pendingApproval, pendingQuestion, status: resume(s.status) };\n }\n case \"approval-request\":\n return { ...state, pendingApproval: e, status: \"awaiting_approval\" };\n case \"approval-resolved\":\n return state.pendingApproval && state.pendingApproval.requestId === e.requestId\n ? { ...state, pendingApproval: null }\n : state;\n case \"question\":\n return { ...state, pendingQuestion: e, status: \"awaiting_input\" };\n case \"run-finish\":\n return { ...state, status: e.status, pendingApproval: null, pendingQuestion: null };\n case \"run-error\":\n return {\n ...state,\n status: \"error\",\n error: {\n message: e.message,\n code: e.code,\n ...(e.apiStatus !== undefined ? { apiStatus: e.apiStatus } : {}),\n ...(e.apiDetails !== undefined ? { apiDetails: e.apiDetails } : {}),\n },\n pendingApproval: null,\n pendingQuestion: null,\n };\n case \"run-cancelled\":\n return { ...state, status: \"cancelled\", pendingApproval: null, pendingQuestion: null };\n case \"sandbox-status\": {\n // Inline lifecycle pill: \"connecting\" appends; \"connected\" upgrades the\n // open connecting pill in place (adding the boot duration) so one boot\n // renders as one row, platform-style.\n const withStatus =\n e.phase === \"connecting\" && state.status === \"idle\" ? { ...state, status: \"connecting\" as const } : state;\n if (e.phase === \"connecting\") {\n return withMessageParts(withStatus, \"\", \"assistant\", (p) => [\n ...p,\n { kind: \"sandbox\", id: `sb:${p.length}`, phase: \"connecting\" },\n ]);\n }\n const messages = withStatus.messages.slice();\n for (let mi = messages.length - 1; mi >= 0; mi--) {\n const parts = messages[mi]!.parts;\n for (let pi = parts.length - 1; pi >= 0; pi--) {\n const part = parts[pi]!;\n if (part.kind === \"sandbox\" && part.phase === \"connecting\") {\n const np = parts.slice();\n np[pi] = { ...part, phase: \"connected\", ...(e.durationMs !== undefined ? { durationMs: e.durationMs } : {}) };\n messages[mi] = { ...messages[mi]!, parts: np };\n return { ...withStatus, messages };\n }\n }\n }\n return withMessageParts(withStatus, \"\", \"assistant\", (p) => [\n ...p,\n { kind: \"sandbox\", id: `sb:${p.length}`, phase: \"connected\", ...(e.durationMs !== undefined ? { durationMs: e.durationMs } : {}) },\n ]);\n }\n case \"notice\":\n // Platform parity: only WARNING diagnostics surface (MCP auth failures,\n // rejected rate limits). Info chatter (stderr, allowed rate limits) is\n // dropped HERE rather than hidden in the view — a part that renders null\n // still occupies a row in the thread's flex column and injects a phantom\n // gap. Raw `notice` events still reach headless consumers via `onEvent`.\n if (e.level !== \"warning\") return state;\n return withMessageParts(state, \"\", \"assistant\", (p) => [\n ...p,\n { kind: \"notice\", id: `n:${p.length}`, level: e.level, source: e.source, message: e.message },\n ]);\n case \"compact-boundary\":\n return withMessageParts(state, \"\", \"assistant\", (p) => [\n ...p,\n { kind: \"compact\", id: `c:${p.length}`, trigger: e.trigger, preTokens: e.preTokens },\n ]);\n case \"run-metrics\":\n return e.stopReason === \"refusal\" || e.stopReason === \"max_tokens\"\n ? { ...state, finishStopReason: e.stopReason }\n : state;\n case \"unknown\":\n return state;\n default:\n return state;\n }\n}\n\n/** Stateful convenience wrapper for the hook (holds the running snapshot). */\nexport interface Accumulator {\n readonly state: ConversationState;\n apply(event: M8tesStreamEvent): ConversationState;\n /** Optimistically append the user's own message (shown immediately on send). */\n addUserMessage(text: string): ConversationState;\n reset(): void;\n}\n\nexport function createAccumulator(): Accumulator {\n let state = initialConversationState;\n return {\n get state() {\n return state;\n },\n apply(event) {\n state = accumulate(state, event);\n return state;\n },\n addUserMessage(text) {\n const id = `u:${state.messages.length}`;\n state = {\n ...state,\n messages: [...state.messages, { id, role: \"user\", parts: [{ kind: \"text\", id, text }] }],\n };\n return state;\n },\n reset() {\n state = initialConversationState;\n },\n };\n}\n","/**\n * Typed error hierarchy for the m8tes V2 API — ONE implementation shared by\n * `@m8tes/sdk` (API-key client) and `@m8tes/react` (browser proxy client).\n *\n * Mirrors the Python SDK's `sdk/py/m8tes/_exceptions.py` so the two languages\n * behave identically: same status→class map, same `docUrl`/`errorCode`/\n * `retryAfter`/`details` fields, just camelCase.\n *\n * The wire envelope is standardized across every /api/v2 route\n * (`fastapi/app/routers/v2/_errors.py`):\n *\n * { \"error\": { \"message\", \"type\", \"code\", \"request_id\", \"doc_url\",\n * \"details\": { \"error_code\": \"...\", ...context } } }\n *\n * Note `error.code` is the int HTTP status by design; the machine-readable app\n * code (e.g. \"RUN_LIMIT_REACHED\", \"END_USER_RATE_LIMITED\") lives at\n * `error.details.error_code` and is surfaced here as `errorCode`.\n *\n * No auth and no `node:` imports live in this file — it ships in browser\n * bundles via `@m8tes/sdk/protocol`.\n */\n\nexport interface ApiErrorFields {\n /** Envelope `error.type`, e.g. \"authentication_error\". */\n type: string;\n /** Envelope `error.code` — the int HTTP status (kept for wire fidelity). */\n code: number;\n /** HTTP status of the response. */\n status: number;\n /** `error.request_id`, else the `x-request-id` response header. Quote this in bug reports. */\n requestId?: string;\n /** Full `error.details` object: actionable context (runs_used, period_end, ...). */\n details?: unknown;\n /** `error.doc_url` — docs deep link for this error type. */\n docUrl?: string;\n /** `error.details.error_code` — machine-readable app code for branching. */\n errorCode?: string;\n /** Seconds from the `Retry-After` header. Set on 429; undefined when absent or an HTTP-date. */\n retryAfter?: number;\n}\n\n/** Base class for every API error. Catch this to catch them all. */\nexport class M8tesApiError extends Error {\n readonly type: string;\n readonly code: number;\n readonly status: number;\n readonly requestId?: string;\n readonly details?: unknown;\n readonly docUrl?: string;\n readonly errorCode?: string;\n readonly retryAfter?: number;\n\n constructor(message: string, f: ApiErrorFields) {\n super(message);\n this.name = \"M8tesApiError\";\n this.type = f.type;\n this.code = f.code;\n this.status = f.status;\n this.requestId = f.requestId;\n this.details = f.details;\n this.docUrl = f.docUrl;\n this.errorCode = f.errorCode;\n this.retryAfter = f.retryAfter;\n }\n}\n\n/** 400 or 422 — invalid request. Check `.status` to tell them apart. */\nexport class ValidationError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"ValidationError\";\n }\n}\n\n/** 401 — missing, malformed, or revoked API key. */\nexport class AuthenticationError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"AuthenticationError\";\n }\n}\n\n/** 402 — billing limit reached or subscription issue. `.details` carries the caps. */\nexport class BillingError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"BillingError\";\n }\n}\n\n/** 403 — authenticated but not allowed. */\nexport class PermissionDeniedError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"PermissionDeniedError\";\n }\n}\n\n/** 404 — no such resource, or it belongs to another account/end-user. */\nexport class NotFoundError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"NotFoundError\";\n }\n}\n\n/** 409 — conflicting state. */\nexport class ConflictError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"ConflictError\";\n }\n}\n\n/**\n * 409 from `GET /runs/{id}/stream` — the run is no longer executing, so there is\n * nothing to join. The caller should fall back to `runs.get(id)` for the final\n * result rather than treating this as a failure.\n */\nexport class RunNotStreamingError extends ConflictError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"RunNotStreamingError\";\n }\n}\n\n/** 429 — too many requests. Honour `.retryAfter` before retrying. */\nexport class RateLimitError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"RateLimitError\";\n }\n}\n\n/** 500+ — server-side error. Safe to retry idempotent requests. */\nexport class APIError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"APIError\";\n }\n}\n\n/**\n * A stream completed but emitted error events (expired credential, provider rate\n * limit, quota exhaustion). Raised so a failed run is never mistaken for a\n * successful empty one. `.details.errors` holds the raw messages.\n */\nexport class RunFailedError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"RunFailedError\";\n }\n}\n\n/** Status → class. Mirrors `STATUS_MAP` in the Python SDK. */\nconst STATUS_MAP: Record<number, new (message: string, f: ApiErrorFields) => M8tesApiError> = {\n 400: ValidationError,\n 401: AuthenticationError,\n 402: BillingError,\n 403: PermissionDeniedError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: ValidationError,\n 429: RateLimitError,\n};\n\n/** `Retry-After` in seconds. An HTTP-date (or garbage) yields undefined, matching Python. */\nexport function parseRetryAfter(raw: string | null | undefined): number | undefined {\n if (!raw) return undefined;\n const seconds = Number(raw);\n return Number.isFinite(seconds) ? seconds : undefined;\n}\n\nfunction str(o: Record<string, unknown>, key: string): string | undefined {\n return typeof o[key] === \"string\" ? (o[key] as string) : undefined;\n}\n\n/**\n * Pull the standardized envelope out of a parsed error body.\n *\n * Tolerant by design: a proxy, a CDN, or a non-v2 route can return HTML, an\n * empty body, or a bare `{detail: ...}`, and callers still get a usable error\n * with the right status rather than a SyntaxError.\n */\nexport function parseErrorEnvelope(\n status: number,\n body: unknown,\n headers?: { get(name: string): string | null },\n): { message: string; fields: ApiErrorFields } {\n const e =\n body !== null && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"object\"\n ? ((body as { error: Record<string, unknown> }).error ?? {})\n : {};\n const details = e[\"details\"];\n const errorCode =\n details !== null && typeof details === \"object\"\n ? str(details as Record<string, unknown>, \"error_code\")\n : undefined;\n return {\n message: str(e, \"message\") ?? `Request failed (${status})`,\n fields: {\n type: str(e, \"type\") ?? \"api_error\",\n code: typeof e[\"code\"] === \"number\" ? (e[\"code\"] as number) : status,\n status,\n requestId: str(e, \"request_id\") ?? headers?.get(\"x-request-id\") ?? undefined,\n details,\n docUrl: str(e, \"doc_url\"),\n errorCode,\n retryAfter: parseRetryAfter(headers?.get(\"retry-after\")),\n },\n };\n}\n\nexport interface ErrorFromResponseOptions {\n /**\n * Map 409 to `RunNotStreamingError` (the \"run already finished, fall back to\n * runs.get()\" signal) instead of the generic `ConflictError`. Set on stream\n * requests, where 409 has exactly that meaning.\n */\n conflictIsNotStreaming?: boolean;\n}\n\n/** The error class a status maps to. Exported so clients that build their own\n * message (e.g. the SDK's base-URL diagnostics) still get the right type. */\nexport function errorClassForStatus(\n status: number,\n opts: ErrorFromResponseOptions = {},\n): new (message: string, f: ApiErrorFields) => M8tesApiError {\n if (status === 409 && opts.conflictIsNotStreaming) return RunNotStreamingError;\n // Python: `STATUS_MAP.get(status, APIError)` — ANY unmapped status (405, 418,\n // 5xx) becomes APIError. Falling back to the bare base class here would mean a\n // 405 caught as APIError in Python slips through the same `catch` in\n // TypeScript. Pinned by test/parity.test.ts.\n return STATUS_MAP[status] ?? APIError;\n}\n\n/**\n * Build the right typed error from a non-OK `Response`. Consumes the body.\n */\nexport async function errorFromResponse(\n res: Response,\n opts: ErrorFromResponseOptions = {},\n): Promise<M8tesApiError> {\n let body: unknown;\n try {\n body = await res.json();\n } catch {\n body = undefined;\n }\n const { message, fields } = parseErrorEnvelope(res.status, body, res.headers);\n const Cls = errorClassForStatus(res.status, opts);\n return new Cls(message, fields);\n}\n","/**\n * `seg()` — turn ONE caller-supplied value into a single, inescapable URL path\n * segment. Mirrors the Python SDK's `sdk/py/m8tes/_http.py::seg` exactly; the\n * shared corpus `sdk/py/tests/data/path_encoding_parity.json` pins both halves.\n *\n * Every dynamic `/`-delimited segment this SDK (and `@m8tes/react`) puts in a\n * path goes through this. The values are frequently tenant-controlled (an\n * end-user id, an app slug, a run's filename), and interpolating one straight\n * into a template literal lets it steer the request somewhere the method never\n * named — the compile-time `number` type is erased at runtime, so a JS\n * consumer, a value off `JSON.parse`, or one `as any` reaches it. Measured\n * before this landed: `runs.get(\"5/messages\")` reached `GET /runs/{id}/messages`,\n * and `tasks.delete(\"5/webhook\")` would destroy a webhook token instead of\n * archiving the task.\n *\n * Two mechanisms, because percent-encoding alone does NOT confine the route:\n *\n * 1. REFUSE anything that would still be structural after the server decodes.\n * uvicorn sets the ASGI path to the percent-DECODED path and Starlette\n * routes on that, so `%2F` is a separator to the server even though it is\n * not one to `fetch`. `/` is therefore rejected, as are `\"\"`, `\".\"` and\n * `\"..\"`, which address the collection or the parent rather than a resource.\n * 2. PERCENT-ENCODE the rest, so the value stays one opaque segment: `?` and\n * `#` would otherwise start a query or a fragment.\n *\n * It throws `ValidationError` (nothing was sent, so `.status` is 0), keeping an\n * existing `catch (e) { if (e instanceof M8tesApiError) ... }` working.\n *\n * Known cosmetic divergence from Python: `encodeURIComponent` leaves `!*'()`\n * literal where Python's `quote(safe=\"\")` escapes them. Both decode to the same\n * segment server-side and neither can leave it — asserted route-aware by the\n * parity corpus rather than waved through.\n *\n * Lives under `protocol/` because it is browser-safe (no credential, no\n * `node:*`) and `@m8tes/react`'s proxy client builds the same paths.\n */\n\nimport { ValidationError } from \"./errors\";\n\n// A segment that is one of these cannot name a resource, and each one silently\n// addresses a DIFFERENT one instead — `\"\"` and `\".\"` collapse onto the\n// collection route, `\"..\"` onto the parent.\nconst UNADDRESSABLE = new Set([\"\", \".\", \"..\"]);\n\n// The one character that becomes a path SEPARATOR at the server. Escaping it is\n// not enough (see above), so it is refused. A BACKSLASH is deliberately NOT\n// refused — it is a legal character in a filename and an id, and measured\n// against this stack it stays inside its segment; it is percent-encoded like\n// any other reserved character (same call as Python).\nconst SEPARATOR = \"/\";\n\nfunction reject(value: string, reason: string): never {\n throw new ValidationError(\n `${JSON.stringify(value)} cannot be used as a URL path segment: ${reason}. ` +\n \"Percent-encoding does not help — the server decodes the path before routing it.\",\n { type: \"invalid_request_error\", code: 0, status: 0 },\n );\n}\n\n/** One caller-supplied value → one safe path segment, or a `ValidationError`. */\nexport function seg(value: unknown): string {\n if (value === null || value === undefined) {\n reject(String(value), \"an id of null or undefined is a caller bug, not a resource name\");\n }\n const text = String(value);\n if (UNADDRESSABLE.has(text)) {\n reject(text, \"it addresses the parent or the collection, not a resource\");\n }\n if (text.includes(SEPARATOR)) {\n reject(text, \"a '/' becomes a real path separator once the server decodes it\");\n }\n return encodeURIComponent(text);\n}\n","/**\n * Server-side transport for the m8tes V2 API.\n *\n * SECURITY: this module holds the secret `m8_` API key and must NEVER reach a\n * browser bundle. Client-side rendering of an agent goes through\n * `@m8tes/react` + its server proxy, which keeps the key on the server. The\n * bundle-boundary test asserts `dist/protocol/index.js` contains none of this.\n *\n * Retry semantics mirror the Python SDK (`sdk/py/m8tes/_http.py`) exactly so the\n * two languages behave the same under load:\n * - 3 attempts total, 0.5s initial backoff, doubling\n * - retry only 429/500/502/503/504\n * - retry GET/HEAD/PUT/DELETE/OPTIONS always, and a POST only when it carries\n * an `Idempotency-Key`. Without one, a POST that timed out may already have\n * started a billable run, so re-sending it could double-charge; with one, the\n * server replays the run it already created, which is why the run-creating\n * calls mint a key on every request.\n * - honour `Retry-After` on 429\n */\n\nimport {\n APIError,\n errorClassForStatus,\n parseErrorEnvelope,\n parseRetryAfter,\n type ErrorFromResponseOptions,\n type M8tesApiError,\n type M8tesStreamEvent,\n type Normalizer,\n createNormalizer,\n createSseDecoder,\n} from \"./protocol/index\";\n\n/** Canonical hosted API. Includes the `/api/v2` prefix, like the Python SDK's DEFAULT_BASE_URL. */\nexport const DEFAULT_BASE_URL = \"https://api.m8tes.ai/api/v2\";\n\nconst MAX_ATTEMPTS = 3;\nconst INITIAL_BACKOFF_MS = 500;\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\nconst IDEMPOTENT_METHODS = new Set([\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\"]);\n\n/** Makes a POST safe to repeat: the server replays the run the first one created. */\nexport const IDEMPOTENCY_HEADER = \"idempotency-key\";\n/** Set by the API when a response is a replay rather than a fresh result. */\nexport const REPLAY_HEADER = \"idempotent-replay\";\n\n/**\n * The ONLY routes whose POST the server makes idempotent.\n *\n * Retry eligibility checks this as well as the header, because the header alone is\n * not evidence the server will honour it. `new M8tes({headers: {\"Idempotency-Key\":\n * …}})` sets it on EVERY request, which would make every POST retryable —\n * including `tasks.create`, which has no server-side idempotency, so a timed-out\n * create would be re-sent and duplicate the task. Found in review.\n *\n * Matched against the path RELATIVE to baseUrl, and fully anchored. An earlier\n * version matched suffixes, which also accepted `/foo/reply` and `/foo/runs` — and\n * `request()`/`raw()` are public, so an unsupported path could have been retried on\n * a route that ignores the key. Anchoring is the whole point of the check, so it\n * must not be approximate.\n */\nconst IDEMPOTENT_POST_PATHS = [\n /^\\/runs\\/?$/,\n /^\\/runs\\/with-files\\/?$/,\n /^\\/runs\\/\\d+\\/reply\\/?$/,\n /^\\/runs\\/\\d+\\/reply\\/with-files\\/?$/,\n /^\\/tasks\\/\\d+\\/runs\\/?$/,\n];\n\nfunction isIdempotentRoute(path: string): boolean {\n const clean = path.split(\"?\")[0] ?? \"\";\n return IDEMPOTENT_POST_PATHS.some((re) => re.test(clean));\n}\n\n/**\n * Whether this request may be re-sent after a timeout or 5xx.\n *\n * Mirrors `_is_retryable` in the Python SDK (`sdk/py/m8tes/_http.py`) so the two\n * languages behave identically under load. Header names are compared lowercased\n * because `mergeHeaders` normalises them — a caller writing `Idempotency-Key`\n * must get retries just like one writing `idempotency-key`.\n */\nfunction isRetryable(method: string, path: string, headers: Record<string, string>): boolean {\n if (IDEMPOTENT_METHODS.has(method.toUpperCase())) return true;\n return IDEMPOTENCY_HEADER in headers && isIdempotentRoute(path);\n}\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface ClientOptions {\n /** Your `m8_` key. Defaults to `process.env.M8TES_API_KEY`. */\n apiKey?: string;\n /** Override the API host. Must include the `/api/v2` prefix. */\n baseUrl?: string;\n /** Per-request timeout in ms. Default 300_000 (5 min), matching the Python SDK. */\n timeout?: number;\n /** Extra headers on every request. */\n headers?: Record<string, string>;\n /** Pluggable fetch, for tests or a custom agent/proxy. Default `globalThis.fetch`. */\n fetch?: FetchLike;\n /** Reported (not thrown) when a stream frame is unparseable. */\n onMalformed?: (rawPayload: string, error: unknown) => void;\n}\n\nexport interface RequestOptions {\n body?: unknown;\n query?: string;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n /**\n * Send as multipart/form-data instead of JSON. Used by the file-upload route.\n * `fetch` sets its own `content-type` with the boundary, so we must NOT set\n * one — a hand-written header omits the boundary and the server cannot parse\n * the body.\n */\n form?: FormData;\n}\n\nexport interface StreamRequestOptions extends RequestOptions {\n /** Reuse a normalizer across reconnects so its dedupe ledger persists. */\n normalizer?: Normalizer;\n /**\n * Called instead of decoding the body when the server answers a run-creating\n * POST with `Idempotent-Replay: true`.\n *\n * A replay is JSON (the run), not SSE — a run that already exists has no fresh\n * stream to emit — so the caller decides what to do with it, in practice\n * joining that run's own stream. It lives here rather than in the resource\n * because this is the only place the Response object exists; by the time\n * `stream()` yields, the headers are gone.\n */\n onReplay?: (run: { id: number; status: string }) => AsyncGenerator<M8tesStreamEvent, void, unknown>;\n}\n\n/**\n * Backoff that an abort cuts short. A plain `setTimeout` would keep a caller\n * waiting out the full delay after they cancelled — with `Retry-After: 3600` on\n * a 429, that is an hour of a request that nobody is waiting for any more.\n */\nfunction backoff(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timer = setTimeout(done, ms);\n function done(): void {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\nfunction looksLikeHtml(res: Response, text: string): boolean {\n if ((res.headers.get(\"content-type\") ?? \"\").includes(\"text/html\")) return true;\n const head = text.trimStart().slice(0, 9).toLowerCase();\n return head.startsWith(\"<!doctype\") || head.startsWith(\"<html\");\n}\n\n/**\n * Replace the raw body with an actionable message when the response says\n * \"you are not talking to the m8tes API\" — the two mistakes that otherwise\n * surface as a baffling 404 or a wall of HTML. Ported from the Python SDK.\n */\nfunction diagnose(res: Response, text: string, body: unknown, url: string): string | undefined {\n if (looksLikeHtml(res, text)) {\n return (\n `Received an HTML page instead of an API response (HTTP ${res.status}) from ${url}. ` +\n `This usually means the host does not serve the m8tes API; check your baseUrl ` +\n `(the hosted API is ${DEFAULT_BASE_URL}).`\n );\n }\n const isBareNotFound =\n res.status === 404 &&\n body !== null &&\n typeof body === \"object\" &&\n !(\"error\" in body) &&\n (body as { detail?: unknown }).detail === \"Not Found\";\n if (isBareNotFound) {\n return (\n `HTTP 404 from ${url} with no API error envelope — the path matched no route. ` +\n `Check your baseUrl includes the /api/v2 prefix (the hosted API is ${DEFAULT_BASE_URL}).`\n );\n }\n return undefined;\n}\n\nexport interface Http {\n baseUrl: string;\n request<T>(method: string, path: string, opts?: RequestOptions): Promise<T>;\n /** The OK `Response` itself — for binary bodies (file downloads). Retries and\n * typed errors still apply; the caller owns reading the body. */\n raw(method: string, path: string, opts?: RequestOptions): Promise<Response>;\n stream(\n method: string,\n path: string,\n opts?: StreamRequestOptions,\n ): AsyncGenerator<M8tesStreamEvent, void, unknown>;\n}\n\nexport function createHttp(options: ClientOptions = {}): Http {\n // A secret `m8_` key in a browser is readable by every visitor. Bundlers do not\n // stop you importing this entry into client code, so fail loudly the moment it\n // runs there rather than shipping a leaked key quietly. (Edge/worker runtimes\n // have no `document`, so they are unaffected.)\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n throw new Error(\n \"@m8tes/sdk is server-only: it holds your secret m8_ API key, which anyone \" +\n \"could read out of a browser bundle. To render an agent in the browser use \" +\n \"@m8tes/react, which talks to a server proxy that keeps the key on your server. \" +\n \"See https://www.m8tes.ai/docs/embed-a-ui\",\n );\n }\n const apiKey = options.apiKey ?? globalThis.process?.env?.[\"M8TES_API_KEY\"];\n if (!apiKey) {\n throw new Error(\n \"@m8tes/sdk: no API key. Pass `new M8tes({ apiKey })` or set M8TES_API_KEY. \" +\n \"Create a key at https://m8tes.ai/developer.\",\n );\n }\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const timeout = options.timeout ?? 300_000;\n const maybeFetch = options.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!maybeFetch) {\n throw new Error(\n \"@m8tes/sdk: no global fetch. Use Node 18+ or pass `fetch` in the client options.\",\n );\n }\n const fetchImpl: FetchLike = maybeFetch; // narrowed; safe to capture in closures\n\n async function toError(\n res: Response,\n url: string,\n errOpts: ErrorFromResponseOptions,\n ): Promise<M8tesApiError> {\n const text = await res.text().catch(() => \"\");\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch {\n body = undefined;\n }\n const parsed = parseErrorEnvelope(res.status, body, res.headers);\n const message = diagnose(res, text, body, url) ?? (body ? parsed.message : text || parsed.message);\n return new (errorClassForStatus(res.status, errOpts))(message, parsed.fields);\n }\n\n /**\n * Merge header maps case-insensitively.\n *\n * HTTP header names are case-insensitive, but a plain object is not: a caller\n * passing `Content-Type` and the SDK setting `content-type` produced BOTH, and\n * fetch joins duplicates into `application/json, application/json`, which the\n * server cannot parse. Everything is lowercased so last-writer-wins actually\n * wins.\n */\n function mergeHeaders(...sources: Array<Record<string, string> | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const src of sources) {\n for (const [k, v] of Object.entries(src ?? {})) out[k.toLowerCase()] = v;\n }\n return out;\n }\n\n /** One attempt. Layers the client timeout onto any caller-supplied signal. */\n async function attempt(method: string, url: string, opts: RequestOptions): Promise<Response> {\n // Auth LAST: a server proxy that forwards inbound request headers into\n // `headers` would otherwise silently replace the SDK's credential with a\n // client-supplied one. The key you constructed the client with always wins.\n const headers = mergeHeaders(options.headers, opts.headers, {\n authorization: `Bearer ${apiKey}`,\n });\n const init: RequestInit = { method, headers };\n if (opts.form !== undefined) {\n // Deliberately no content-type: fetch adds it WITH the multipart boundary.\n // A content-type configured globally (or per-request) would suppress that\n // header, leaving the server unable to parse the body. Keys are lowercased\n // by mergeHeaders, so one delete covers every casing the caller used.\n delete headers[\"content-type\"];\n init.body = opts.form;\n } else if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(opts.body);\n }\n const timer = AbortSignal.timeout(timeout);\n init.signal = opts.signal ? AbortSignal.any([opts.signal, timer]) : timer;\n return fetchImpl(url, init);\n }\n\n /**\n * Retry loop shared by `request` and `stream`. Returns the OK response; throws\n * a typed error once the attempts are spent or the status is not retryable.\n */\n async function send(\n method: string,\n path: string,\n opts: RequestOptions,\n errOpts: ErrorFromResponseOptions = {},\n ): Promise<Response> {\n const url = `${baseUrl}${path}${opts.query ?? \"\"}`;\n // Same merge (and lowercasing) `attempt` applies, so this sees exactly the\n // headers that go on the wire — a key set globally on the client counts too.\n const idempotent = isRetryable(method, path, mergeHeaders(options.headers, opts.headers));\n let lastNetworkError: unknown;\n\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n const isLast = i === MAX_ATTEMPTS - 1;\n let res: Response;\n try {\n res = await attempt(method, url, opts);\n } catch (e) {\n // A caller-initiated abort is intent, not a fault — never retry or wrap it.\n if (opts.signal?.aborted) throw e;\n lastNetworkError = e;\n if (!idempotent || isLast) {\n throw new APIError(e instanceof Error ? e.message : String(e), {\n type: \"api_error\",\n code: 0,\n status: 0,\n });\n }\n await backoff(INITIAL_BACKOFF_MS * 2 ** i, opts.signal);\n if (opts.signal?.aborted) throw e;\n continue;\n }\n\n if (res.ok) return res;\n if (!RETRYABLE_STATUS.has(res.status) || !idempotent || isLast) {\n throw await toError(res, url, errOpts);\n }\n const retryAfter = res.status === 429 ? parseRetryAfter(res.headers.get(\"retry-after\")) : undefined;\n // Drain the body so the connection can be reused on the next attempt.\n await res.text().catch(() => \"\");\n await backoff(retryAfter !== undefined ? retryAfter * 1000 : INITIAL_BACKOFF_MS * 2 ** i, opts.signal);\n // The caller gave up while we were waiting — surface their abort rather\n // than burning the remaining attempts on a request nobody wants.\n if (opts.signal?.aborted) throw await toError(res, url, errOpts);\n }\n\n throw new APIError(\n lastNetworkError instanceof Error ? lastNetworkError.message : \"Max retries exceeded\",\n { type: \"api_error\", code: 0, status: 0 },\n );\n }\n\n return {\n baseUrl,\n async request<T>(method: string, path: string, opts: RequestOptions = {}): Promise<T> {\n const res = await send(method, path, opts);\n if (res.status === 204) return undefined as T;\n const text = await res.text();\n return (text ? (JSON.parse(text) as T) : (undefined as T));\n },\n\n raw(method: string, path: string, opts: RequestOptions = {}): Promise<Response> {\n return send(method, path, opts);\n },\n\n async *stream(method: string, path: string, opts: StreamRequestOptions = {}) {\n // A 409 on a stream route means \"the run already finished\" — surfaced as\n // RunNotStreamingError so callers fall back to runs.get() instead of\n // treating a completed run as an error.\n const res = await send(method, path, opts, { conflictIsNotStreaming: true });\n // An idempotent retry was answered from the run the first attempt created.\n // Hand it to the resource, which joins that run's stream — the caller asked\n // for a stream and still gets one, without learning a retry happened.\n if (opts.onReplay && res.headers.get(REPLAY_HEADER)) {\n const run = (await res.json()) as { id: number; status: string };\n yield* opts.onReplay(run);\n return;\n }\n if (!res.body) return;\n const normalizer = opts.normalizer ?? createNormalizer();\n const decoder = createSseDecoder({ onMalformed: options.onMalformed });\n const reader = res.body.getReader();\n const td = new TextDecoder();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n for (const frame of decoder.push(td.decode(value, { stream: true }))) {\n yield* normalizer.push(frame);\n }\n }\n for (const frame of decoder.flush()) yield* normalizer.push(frame);\n } finally {\n // cancel() tears down the connection on an early break (caller stopped\n // iterating); releaseLock() alone would leak a live SSE connection.\n try {\n await reader.cancel();\n } catch {\n try {\n reader.releaseLock();\n } catch {\n /* already released */\n }\n }\n }\n },\n };\n}\n","/**\n * Cursor pagination over the V2 `ListResponse` envelope (`{data, has_more}`).\n *\n * Mirrors the Python SDK's `SyncPage` (`sdk/py/m8tes/_types.py`): a page is the\n * raw response plus an async iterator that walks every remaining page for you.\n *\n * The cursor is the last item's `id`, or its `name` for `/apps` (the one resource\n * keyed by name). Same rule as Python, so both SDKs paginate identically.\n */\n\nexport interface ListResponse<T> {\n data: T[];\n hasMore: boolean;\n}\n\n/** A page of results. `for await (const item of page)` walks ALL pages. */\nexport class Page<T> implements ListResponse<T>, AsyncIterable<T> {\n readonly data: T[];\n readonly hasMore: boolean;\n /** Fetches the next page given a cursor. Absent on a terminal page. */\n private readonly fetchNext?: (startingAfter: string | number) => Promise<Page<T>>;\n\n constructor(\n data: T[],\n hasMore: boolean,\n fetchNext?: (startingAfter: string | number) => Promise<Page<T>>,\n ) {\n this.data = data;\n this.hasMore = hasMore;\n this.fetchNext = fetchNext;\n }\n\n /**\n * Auto-paging: yields every item across every page.\n *\n * Stops if the cursor ever fails to advance. A server that returns the same\n * page again with `has_more: true` — a caching layer, a replica lagging, a bug\n * — would otherwise spin forever, re-yielding the same rows and never\n * returning. Terminating is the only safe response: the caller gets the items\n * it did see rather than a hung process.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: Page<T> = this;\n const seen = new Set<string | number>();\n for (;;) {\n yield* page.data;\n const last = page.data.at(-1) as { id?: unknown; name?: unknown } | undefined;\n if (!page.hasMore || !last || !page.fetchNext) return;\n const cursor =\n typeof last.id === \"number\" || typeof last.id === \"string\"\n ? last.id\n : typeof last.name === \"string\"\n ? last.name\n : undefined;\n if (cursor === undefined || seen.has(cursor)) return;\n seen.add(cursor);\n page = await page.fetchNext(cursor);\n }\n }\n\n /** Every item across every page, collected. Prefer iteration for large sets. */\n async all(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n","/**\n * Request-parameter plumbing. Deliberately tiny.\n *\n * This package speaks the API's own **snake_case** on the wire, in params AND in\n * response types — the same names as `/docs/api-reference` and the Python SDK, and\n * the convention `openai`, `stripe`, and `@anthropic-ai/sdk` all use. So there is\n * no case-mapping layer: request bodies are passed through, and responses are\n * returned exactly as the API sent them.\n *\n * That is not just a style choice. The mapping layer this replaced corrupted\n * caller-defined keys twice: `answers` is keyed by AskUserQuestion TEXT, and\n * `output_schema` carries the caller's own JSON-Schema property names — a key\n * rewriter silently changed both. With no rewriter, that class of bug cannot exist.\n *\n * THE BOUNDARY, precisely — snake_case is for API DATA, camelCase for SDK surfaces:\n *\n * snake_case request params + response bodies `user_id`, `created_at`,\n * (anything that crosses the wire) `output_data`, `enable_memory`\n *\n * camelCase things the SDK owns and the API `new M8tes({ apiKey })`,\n * never sees: client options, method `client.runs.createAsync()`,\n * names, `RunStream`, and the `stream.runId`,\n * normalized events in `event.requestId`\n * `@m8tes/sdk/protocol` (our own\n * format, shared with @m8tes/react's\n * UI — not the REST wire)\n *\n * So: if you read the name in `/docs/api-reference`, it is snake_case here too.\n * If it is a TypeScript construct we invented, it is camelCase.\n */\n\n/** Drop `undefined` so an omitted option is absent rather than an explicit\n * `null` — which the API reads as \"clear this field\". An explicit `null`\n * survives, because that IS how you clear one. */\nexport function toBody(params: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) out[k] = v;\n }\n return out;\n}\n\n/** Query string from params, skipping `undefined`/`null`. Returns \"\" when empty. */\nexport function toQuery(params: Record<string, unknown>): string {\n const q = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === null) continue;\n q.set(k, String(v));\n }\n const s = q.toString();\n return s ? `?${s}` : \"\";\n}\n\n/**\n * `agent_id` is the canonical name; `teammate_id` is the permanent legacy alias\n * and the actual wire field. Passing conflicting values is an error rather than a\n * silent pick — mirrors `_resolve_agent_id` in the Python SDK.\n */\nexport function resolveAgentId(\n teammateId: number | undefined,\n agentId: number | undefined,\n): number | undefined {\n if (agentId !== undefined && teammateId !== undefined && agentId !== teammateId) {\n throw new Error(\"Pass agent_id or teammate_id, not both\");\n }\n return teammateId ?? agentId;\n}\n","/**\n * `client.agents` — the reusable agent personas runs execute as.\n *\n * The V2 resource is `agents`; `client.teammates` is a permanent alias because\n * the DB model and older API docs use that name. Mirrors\n * `sdk/py/m8tes/_resources/teammates.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport type { Agent, EmailInbox, JsonObject, PermissionMode, WebhookToggle } from \"../types\";\n\nexport interface AgentCreateParams {\n name?: string;\n /** The agent's standing instructions: who it is and how it works. */\n instructions?: string;\n /** Tool slugs it may use, e.g. `[\"gmail\", \"slack\"]`. */\n tools?: string[];\n role?: string;\n goals?: string;\n /** Your id for the end-user who owns this agent. */\n user_id?: string;\n metadata?: JsonObject;\n model?: string;\n effort?: string;\n default_permission_mode?: PermissionMode;\n /** Built-in tool toggles. Omit to inherit the platform default. */\n enable_memory?: boolean;\n enable_history?: boolean;\n enable_task_setup_tools?: boolean;\n enable_feedback?: boolean;\n enable_self_improvement?: boolean;\n /** Give the agent its own email inbox on create. */\n email_inbox?: boolean;\n /** Give the agent a webhook trigger URL on create. */\n webhook?: boolean;\n /** Start from a prebuilt persona, e.g. `\"ppc-manager\"`. Template improvements\n * keep flowing in on later reads unless you override the field. */\n from_template?: string;\n}\n\n/**\n * PATCH /agents/{id} accepts exactly these fields (backend `TeammateUpdate`).\n * Create-only fields are NOT here on purpose: sending `webhook` or `email_inbox`\n * to PATCH returns 200 and silently does nothing, which reads as a working call.\n * Use `enableWebhook()` / `enableEmailInbox()` instead.\n *\n * `null` is meaningful: it CLEARS the field back to the platform default.\n */\nexport interface AgentUpdateParams {\n name?: string | null;\n instructions?: string | null;\n tools?: string[] | null;\n role?: string | null;\n goals?: string | null;\n metadata?: JsonObject | null;\n model?: string | null;\n effort?: string | null;\n default_permission_mode?: PermissionMode | null;\n allowed_senders?: string[] | null;\n enable_memory?: boolean | null;\n enable_history?: boolean | null;\n enable_task_setup_tools?: boolean | null;\n enable_feedback?: boolean | null;\n enable_self_improvement?: boolean | null;\n}\n\nexport interface AgentListParams {\n user_id?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface AgentsResource {\n create(params?: AgentCreateParams): Promise<Agent>;\n list(params?: AgentListParams): Promise<Page<Agent>>;\n get(agentId: number, params?: { user_id?: string }): Promise<Agent>;\n update(agentId: number, params: AgentUpdateParams & { user_id?: string }): Promise<Agent>;\n delete(agentId: number, params?: { user_id?: string }): Promise<void>;\n /** Turn on the webhook trigger; returns the URL to POST to.\n * `user_id` scopes to one end-user (404 on mismatch), like get/update/delete. */\n enableWebhook(agentId: number, params?: { user_id?: string }): Promise<WebhookToggle>;\n disableWebhook(agentId: number, params?: { user_id?: string }): Promise<void>;\n /** Turn on the agent's email inbox; returns the address that starts runs. */\n enableEmailInbox(agentId: number, params?: { user_id?: string }): Promise<EmailInbox>;\n disableEmailInbox(agentId: number, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createAgentsResource(http: Http): AgentsResource {\n return {\n create(params = {}) {\n return http.request<Agent>(\"POST\", \"/agents/\", { body: toBody({ ...params }) });\n },\n\n async list(params = {}) {\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Agent>> => {\n const res = await http.request<{ data: Agent[]; has_more?: boolean }>(\"GET\", \"/agents/\", {\n query: toQuery(p),\n });\n return new Page<Agent>(res?.data ?? [], res?.has_more ?? false, (starting_after) =>\n fetchPage({ ...p, starting_after }),\n );\n };\n return fetchPage({ ...params });\n },\n\n get(agentId, params = {}) {\n return http.request<Agent>(\"GET\", `/agents/${seg(agentId)}`, { query: toQuery(params) });\n },\n\n update(agentId, params) {\n // user_id scopes the request (query param); everything else is the patch.\n const { user_id, ...patch } = params;\n return http.request<Agent>(\"PATCH\", `/agents/${seg(agentId)}`, {\n body: toBody(patch),\n query: toQuery({ user_id }),\n });\n },\n\n async delete(agentId, params = {}) {\n await http.request(\"DELETE\", `/agents/${seg(agentId)}`, { query: toQuery(params) });\n },\n\n enableWebhook(agentId, params = {}) {\n return http.request<WebhookToggle>(\"POST\", `/agents/${seg(agentId)}/webhook`, {\n body: {},\n query: toQuery(params),\n });\n },\n\n async disableWebhook(agentId, params = {}) {\n await http.request(\"DELETE\", `/agents/${seg(agentId)}/webhook`, { query: toQuery(params) });\n },\n\n enableEmailInbox(agentId, params = {}) {\n return http.request<EmailInbox>(\"POST\", `/agents/${seg(agentId)}/email-inbox`, {\n body: {},\n query: toQuery(params),\n });\n },\n\n async disableEmailInbox(agentId, params = {}) {\n await http.request(\"DELETE\", `/agents/${seg(agentId)}/email-inbox`, { query: toQuery(params) });\n },\n };\n}\n","/**\n * `client.apps` — the tools agents act in, and each end-user's connections to them.\n *\n * Connections are scoped: pass `user_id` and the connection belongs to that\n * end-user, so the agent acts with THEIR Gmail/Stripe/Slack rather than yours.\n * In an embed that matters a lot — an account-level connection means a\n * prompt-injected agent could act on your behalf.\n *\n * Mirrors `sdk/py/m8tes/_resources/apps.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport type { App, AppConnectionInitiation, AppConnectionResult } from \"../types\";\n\nexport interface AppsResource {\n /**\n * Every available tool, with connection status for the given scope.\n *\n * NOT paginated and NOT cursor-able: `GET /apps/` accepts only `user_id` and\n * returns the whole catalog. Sending `limit` or `starting_after` gets a 422\n * (`unknown_query_parameter`) — verified against a live backend, which is also\n * how the same bug was found in the published Python SDK. A `Page` is still\n * returned so `for await` works uniformly across resources.\n */\n list(params?: { user_id?: string }): Promise<Page<App>>;\n /** True when this app is connected for the given scope. */\n isConnected(appName: string, params?: { user_id?: string }): Promise<boolean>;\n /**\n * Start an OAuth connection. Send the user to the returned `authorization_url`,\n * then pass the returned `connection_id` to `connectComplete()`.\n *\n * `redirect_uri` is REQUIRED and is spelled `_uri`, not `_url` — the API 422s\n * on anything else.\n */\n connectOauth(\n appName: string,\n params: { redirect_uri: string; user_id?: string },\n ): Promise<AppConnectionInitiation>;\n /** Connect an app that authenticates with a key instead of OAuth. */\n connectApiKey(\n appName: string,\n params: { api_key: string; user_id?: string },\n ): Promise<AppConnectionResult>;\n /** Finish an OAuth connection after the user returns. `connection_id` comes\n * from `connectOauth()` and is required. */\n connectComplete(\n appName: string,\n params: { connection_id: string; user_id?: string },\n ): Promise<AppConnectionResult>;\n disconnect(appName: string, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createAppsResource(http: Http): AppsResource {\n // A local, not `this.list` — a destructured `const { isConnected } =\n // client.apps` would otherwise throw. (The same bug shipped in\n // `runs.createAndWait`; nothing in this package should depend on `this`.)\n const list = async (params: { user_id?: string } = {}): Promise<Page<App>> => {\n // Only `user_id` — see the interface comment. No fetchNext: there is no\n // cursor to follow, and inventing one would 422.\n const res = await http.request<{ data: App[]; has_more?: boolean }>(\"GET\", \"/apps/\", {\n query: toQuery({ user_id: params.user_id }),\n });\n return new Page<App>(res?.data ?? [], res?.has_more ?? false);\n };\n\n return {\n list,\n\n async isConnected(appName, params = {}) {\n // The list endpoint reports connection state per scope; a single-app filter\n // would be a second contract to keep in sync for no gain.\n const { data } = await list(params);\n return data.find((a) => a.name === appName)?.connected ?? false;\n },\n\n connectOauth(appName, params) {\n return http.request<AppConnectionInitiation>(\"POST\", `/apps/${seg(appName)}/connect`, {\n body: toBody({ ...params }),\n });\n },\n\n connectApiKey(appName, params) {\n return http.request<AppConnectionResult>(\"POST\", `/apps/${seg(appName)}/connect/api-key`, {\n body: toBody({ ...params }),\n });\n },\n\n connectComplete(appName, params) {\n return http.request<AppConnectionResult>(\"POST\", `/apps/${seg(appName)}/connect/complete`, {\n body: toBody({ ...params }),\n });\n },\n\n async disconnect(appName, params = {}) {\n await http.request(\"DELETE\", `/apps/${seg(appName)}/connections`, { query: toQuery(params) });\n },\n };\n}\n","/**\n * `client.account` — the two operations that act on the whole account rather\n * than anything inside it: take your data out, and shut the account down.\n *\n * Both exist to satisfy the GDPR/CCPA rights to access and to erasure, so they\n * are here for compliance flows you have to be able to run programmatically —\n * a data-subject request you are forwarding, or an offboarding path in your own\n * product. Neither takes parameters: they always apply to the account behind\n * the API key you authenticated with, and there is no `user_id` scoping. To\n * remove one end-user's data instead, use `client.users.delete()`.\n *\n * Mirrors `sdk/py/m8tes/_resources/account.py`.\n */\n\nimport type { Http } from \"../http\";\nimport type { AccountDeletion, AccountExport } from \"../types\";\n\nexport interface AccountResource {\n /**\n * Hand a customer (or a regulator) everything the account holds — the\n * GDPR/CCPA right to access.\n *\n * The document covers the account's agents, tasks, runs, documents, memories,\n * and integration metadata. Credentials and other secrets are never included,\n * so an export is safe to forward but is NOT a backup you can restore from.\n * It is a single JSON body, not a stream: a large account produces a large\n * response, so allow for it in your request timeout.\n */\n export(): Promise<AccountExport>;\n\n /**\n * Close the account — the GDPR/CCPA right to erasure.\n *\n * Soft-delete, and it takes effect at once: sessions and the API key are\n * revoked, billing is canceled, and all automation stops, with the data\n * erased after a grace period. In other words the key you just called this\n * with is dead afterwards, so nothing else in the SDK will work.\n */\n delete(): Promise<AccountDeletion>;\n}\n\nexport function createAccountResource(http: Http): AccountResource {\n return {\n export() {\n return http.request<AccountExport>(\"GET\", \"/account/export\");\n },\n\n delete() {\n return http.request<AccountDeletion>(\"DELETE\", \"/account\");\n },\n };\n}\n","/**\n * `client.users` — your end-users, the multi-tenancy boundary.\n *\n * `user_id` is YOUR identifier for a customer; the platform stores it as\n * `end_user_id` and isolates that person's memory, run history, and tool\n * connections strictly. There is no fallback to account-level data.\n *\n * Registering an end-user here is optional — passing `user_id` on a run creates\n * them implicitly. Do it explicitly when you want per-user budgets and rate\n * limits. Mirrors `sdk/py/m8tes/_resources/users.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport type { EndUser, EndUserUsage, JsonObject } from \"../types\";\n\nexport interface EndUserCreateParams {\n /** Your id for this person. Any stable string. */\n user_id: string;\n name?: string;\n email?: string;\n company?: string;\n metadata?: JsonObject;\n /** Cap this end-user's runs per billing period. */\n run_limit?: number;\n /** Cap this end-user's spend per billing period, in cents. */\n cost_limit_cents?: number;\n /** Cap this end-user's runs per minute. Exceeding it returns 429. */\n rate_per_minute?: number;\n}\n\n/** `null` CLEARS a cap (inherit the account default); omitting leaves it alone. */\nexport interface EndUserUpdateParams {\n name?: string | null;\n email?: string | null;\n company?: string | null;\n metadata?: JsonObject | null;\n run_limit?: number | null;\n cost_limit_cents?: number | null;\n rate_per_minute?: number | null;\n}\n\nexport interface PageParams {\n limit?: number;\n starting_after?: number;\n}\n\nexport interface UsersResource {\n create(params: EndUserCreateParams): Promise<EndUser>;\n list(params?: PageParams): Promise<Page<EndUser>>;\n get(userId: string): Promise<EndUser>;\n update(userId: string, params: EndUserUpdateParams): Promise<EndUser>;\n delete(userId: string): Promise<void>;\n /** Per-end-user token, run, and cost usage against their limits. */\n usage(params?: PageParams & { user_id?: string }): Promise<Page<EndUserUsage>>;\n}\n\n/** Shared cursor-paging helper: the envelope is identical across list routes. */\nexport function pager<T>(http: Http, path: string): (p: Record<string, unknown>) => Promise<Page<T>> {\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<T>> => {\n const res = await http.request<{ data: T[]; has_more?: boolean }>(\"GET\", path, {\n query: toQuery(p),\n });\n return new Page<T>(res?.data ?? [], res?.has_more ?? false, (starting_after) =>\n fetchPage({ ...p, starting_after }),\n );\n };\n return fetchPage;\n}\n\nexport function createUsersResource(http: Http): UsersResource {\n return {\n create(params) {\n return http.request<EndUser>(\"POST\", \"/users/\", { body: toBody({ ...params }) });\n },\n\n list(params = {}) {\n return pager<EndUser>(http, \"/users/\")({ ...params });\n },\n\n get(userId) {\n return http.request<EndUser>(\"GET\", `/users/${seg(userId)}`);\n },\n\n update(userId, params) {\n return http.request<EndUser>(\"PATCH\", `/users/${seg(userId)}`, {\n body: toBody({ ...params }),\n });\n },\n\n async delete(userId) {\n await http.request(\"DELETE\", `/users/${seg(userId)}`);\n },\n\n usage(params = {}) {\n return pager<EndUserUsage>(http, \"/usage/end-users\")({ ...params });\n },\n };\n}\n","/**\n * `client.billing` — what you have spent, what you may spend, and the ceiling.\n *\n * This is the resource you reach for when cost is a product requirement rather\n * than an afterthought: read current-period usage (runs, model spend, accrued\n * overage), break spend down by day / end-user / agent / model, fetch the public\n * plan catalog, and set the caps — the monthly overage cap on plan accounts, and\n * on prepaid accounts the token balance, top-ups, auto-reload, and the\n * low-balance alert threshold.\n *\n * An embed developer capping what their own customers can burn lives here: pair\n * `usageTimeseries({ user_id })` with the per-end-user limits on `client.users`\n * to meter each tenant, and `setOverage` / `setAutoReload` to bound the account\n * as a whole.\n *\n * Mirrors `sdk/py/m8tes/_resources/billing.py`.\n */\n\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { resolveAgentId, toBody, toQuery } from \"../params\";\nimport type { Balance, Plan, Receipt, Usage, UsageTimeseries } from \"../types\";\nimport { type PageParams, pager } from \"./users\";\n\nexport interface UsageTimeseriesParams {\n /** Inclusive ISO date (`\"2026-07-01\"`), UTC days. Defaults to 30 days ago. */\n start_date?: string;\n /** Inclusive ISO date. Defaults to today. */\n end_date?: string;\n /** Scope to one end-user. */\n user_id?: string;\n /** Scope to one agent. */\n agent_id?: number;\n /** Permanent legacy alias for `agent_id` — the same wire field. */\n teammate_id?: number;\n /** Creation stamp: `\"api\"` embedding, `\"platform\"` first-party. Not settlement. */\n surface?: \"api\" | \"platform\";\n /** Where the run settled: `\"wallet\"` is the prepaid ledger. */\n settled_meter?: \"wallet\" | \"plan\" | \"released\" | \"own_sub\";\n /** `\"model\"` adds per-model slices to every bucket's `models`. The route\n * accepts this one value only, so it is a literal rather than a string. */\n group_by?: \"model\";\n}\n\nexport interface OverageParams {\n enabled: boolean;\n /** Hard ceiling on overage spend per period, in cents. */\n monthly_cap_cents: number;\n}\n\nexport interface TopupParams {\n /** Cents to add. $5 minimum, $1M maximum. */\n amount_cents: number;\n}\n\n/**\n * Enabling auto-reload REQUIRES both amounts; disabling takes neither. Modelled\n * as a union so `{ enabled: true }` alone is a compile error rather than a 422.\n */\nexport type AutoReloadParams =\n | {\n enabled: true;\n /** Reload when the balance drops below this, in cents. */\n threshold_cents: number;\n /** Cents to charge per reload. $5–$10,000. */\n amount_cents: number;\n }\n | {\n enabled: false;\n /** Amounts may still be updated while disabled; the API applies them. */\n threshold_cents?: number;\n amount_cents?: number;\n };\n\nexport interface AlertThresholdParams {\n /** Balance (cents) at which the low-balance warning fires. `0` warns only on depletion. */\n low_balance_threshold_cents: number;\n}\n\nexport interface BillingResource {\n /** Where you stand this period: plan, runs used vs included, model spend, and overage state. */\n usage(): Promise<Usage>;\n\n /**\n * Spend broken down by UTC day — the series to chart, alert on, or reconcile\n * against an invoice. Buckets are zero-filled across the whole window, so the\n * array is safe to plot without gap-handling. Cost matches `usage().cost_used`\n * semantics, so the series always reconciles with period totals. With\n * `group_by: \"model\"`, runs that predate model attribution fold\n * into a `\"unknown\"` slice rather than disappearing.\n */\n usageTimeseries(params?: UsageTimeseriesParams): Promise<UsageTimeseries>;\n\n /**\n * Proof of payment for finance: one row per paid prepaid top-up, newest first.\n * `receipt_url` can be `null` when Stripe can no longer retrieve the session.\n */\n receipts(params?: PageParams): Promise<Page<Receipt>>;\n\n /** What the paid plans include and cost — for your own pricing page or upgrade\n * prompt. Public (paid) plans only, straight from the canonical catalog, and\n * returned as a plain array rather than a page. */\n plans(): Promise<Plan[]>;\n\n /**\n * Decide whether runs may continue past your plan's included allotment, and how\n * far. Off by default; once enabled, extra runs bill at the per-run overage rate\n * until `monthly_cap_cents` is reached. Returns the refreshed usage so you can\n * confirm the new state without a second call.\n */\n setOverage(params: OverageParams): Promise<Usage>;\n\n /** How much prepaid credit is left, and where it went (prepaid-billed accounts).\n * Amounts are micro-USD; `balance_usd` is a rounded display string. */\n balance(): Promise<Balance>;\n\n /**\n * Add credit when a human is present to pay. Returns a Stripe Checkout URL to\n * send the buyer to — nothing is credited until they complete payment.\n */\n topup(params: TopupParams): Promise<string>;\n\n /**\n * Keep credit topped up without a human, so runs never stop for an empty wallet:\n * a balance below `threshold_cents` charges `amount_cents` to the saved card\n * off-session. Enabling requires a saved payment method (any completed top-up\n * Checkout saves one) — without it this throws a billing error with code\n * `NO_SAVED_PAYMENT_METHOD`. Disabling needs only `enabled: false`. At most one\n * reload fires per 6-hour window. Returns the refreshed balance.\n */\n setAutoReload(params: AutoReloadParams): Promise<Balance>;\n\n /**\n * Choose when you want to hear about a draining balance. The critical tier is\n * fixed at 20% of the value you set, and `0` warns only on depletion. Warnings\n * arrive by email and as `balance.low` / `balance.critical` / `balance.depleted`\n * webhook events. Returns the refreshed balance.\n */\n setAlertThreshold(params: AlertThresholdParams): Promise<Balance>;\n}\n\nexport function createBillingResource(http: Http): BillingResource {\n return {\n usage() {\n return http.request<Usage>(\"GET\", \"/usage/\");\n },\n\n usageTimeseries(params = {}) {\n const { agent_id, teammate_id, ...rest } = params;\n const query = toQuery(\n toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) }),\n );\n return http.request<UsageTimeseries>(\"GET\", \"/usage/timeseries\", { query });\n },\n\n receipts(params = {}) {\n return pager<Receipt>(http, \"/billing/receipts\")({ ...params });\n },\n\n plans() {\n return http.request<Plan[]>(\"GET\", \"/billing/plans\");\n },\n\n setOverage(params) {\n return http.request<Usage>(\"PATCH\", \"/billing/overage\", { body: toBody({ ...params }) });\n },\n\n balance() {\n return http.request<Balance>(\"GET\", \"/billing/balance\");\n },\n\n async topup(params) {\n const res = await http.request<{ checkout_url: string }>(\"POST\", \"/billing/topup\", {\n body: toBody({ ...params }),\n });\n return res.checkout_url;\n },\n\n setAutoReload(params) {\n return http.request<Balance>(\"PATCH\", \"/billing/auto-reload\", {\n body: toBody({ ...params }),\n });\n },\n\n setAlertThreshold(params) {\n return http.request<Balance>(\"PATCH\", \"/billing/alert-settings\", {\n body: toBody({ ...params }),\n });\n },\n };\n}\n","/**\n * `client.memories` — pre-load what an agent already knows about someone.\n *\n * A run starts cold unless it has memories to draw on. Writing them here lets you\n * seed an end-user's context from data you already hold (plan, timezone, past\n * decisions, preferences) so the first run behaves like the tenth, instead of\n * waiting for the agent to learn it over several conversations.\n *\n * `user_id` is the scope, and the scopes never mix: with it, the memory belongs to\n * that one end-user and is visible only to runs carrying the same `user_id`;\n * without it, the memory is account-level and visible only to runs that carry no\n * `user_id`. There is no inheritance between the two — an account-level memory is\n * NOT a fallback for an end-user run.\n *\n * Documented at `/docs/users`. Mirrors `sdk/py/m8tes/_resources/memories.py`.\n */\n\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport { pager } from \"./users\";\nimport type { Memory } from \"../types\";\n\nexport interface MemoryCreateParams {\n /** The fact to remember, in plain language. */\n content: string;\n /** Scope it to one end-user. Omit for an account-level memory. */\n user_id?: string;\n}\n\nexport interface MemoryListParams {\n /** Scope to read. Omit to read account-level memories. */\n user_id?: string;\n /**\n * Keyword filter on content (case-insensitive substring). It only narrows the\n * chosen scope — it never reaches across into the other one — and paging\n * applies to the filtered set.\n */\n query?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface MemoryUpdateParams {\n /** Replaces the stored text outright. */\n content: string;\n /** The scope the memory lives in. Must match, or the memory is not found. */\n user_id?: string;\n}\n\nexport interface MemoriesResource {\n /**\n * Teach an agent a fact up front, before anyone runs it.\n *\n * Throws a `ConflictError` (409) when the scope is already at its memory\n * capacity, or when identical content is already stored in it — so this is\n * safe to call repeatedly only if you handle that error.\n */\n create(params: MemoryCreateParams): Promise<Memory>;\n /** Audit or display what an agent knows about one end-user (or the account). */\n list(params?: MemoryListParams): Promise<Page<Memory>>;\n /** Correct a fact that changed, keeping its id — rather than delete + re-create. */\n update(memoryId: number, params: MemoryUpdateParams): Promise<Memory>;\n /** Make an agent forget something, e.g. on an end-user's erasure request. */\n delete(memoryId: number, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createMemoriesResource(http: Http): MemoriesResource {\n return {\n create(params) {\n return http.request<Memory>(\"POST\", \"/memories/\", { body: toBody({ ...params }) });\n },\n\n list(params = {}) {\n return pager<Memory>(http, \"/memories/\")({ ...params });\n },\n\n update(memoryId, { user_id, content }) {\n // Scope travels in the query string, the new text in the body.\n return http.request<Memory>(\"PATCH\", `/memories/${seg(memoryId)}`, {\n query: toQuery({ user_id }),\n body: toBody({ content }),\n });\n },\n\n async delete(memoryId, params = {}) {\n await http.request(\"DELETE\", `/memories/${seg(memoryId)}`, {\n query: toQuery({ user_id: params.user_id }),\n });\n },\n };\n}\n","/**\n * `client.models` — find out which `model` values are actually valid, and what\n * they cost, instead of guessing from the docs.\n *\n * `model` is a plain string everywhere in this SDK, which keeps new models\n * usable the day they're enabled but means a typo is only caught by the API. Ask\n * this route instead: it returns the models your account can select right now\n * (Anthropic and not — the set grows without an SDK release), which one is the\n * default, and the per-million-token prices the platform bills you at, so you\n * can estimate spend before starting a run.\n *\n * Mirrors `sdk/py/m8tes/_resources/models.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport type { Model } from \"../types\";\n\nexport interface ModelsResource {\n /**\n * The models you can pass as `model` on an agent or a run, with USD pricing\n * per million tokens.\n *\n * Omit `model` on an agent/run to get the entry flagged `default: true` — that\n * flag is per-viewer, so the default you see here is the default you'd get.\n *\n * Takes no arguments and has no cursor: `GET /models/` returns the whole\n * catalog in one response. A `Page` is still returned so `for await` works the\n * same as on every other list, but it never fetches a second page.\n */\n /**\n * The model catalog. Check `zdr_supported` before sending customer data: a\n * non-ZDR model is allowed on the API but may retain inputs and outputs.\n */\n list(): Promise<Page<Model>>;\n}\n\nexport function createModelsResource(http: Http): ModelsResource {\n return {\n async list() {\n const res = await http.request<{ data: Model[]; has_more?: boolean }>(\"GET\", \"/models/\");\n // No fetchNext: the route accepts no cursor, matching the Python SDK's\n // SyncPage built without `_fetch_next`.\n return new Page<Model>(res?.data ?? [], res?.has_more ?? false);\n },\n };\n}\n","/** Account-level OAuth subscriptions used by the Claude Code execution harness. */\n\nimport type { Http } from \"../http\";\nimport { seg } from \"../protocol/seg\";\n\nexport type ModelConnectionProvider = \"claude\" | \"openai\" | \"xai\" | \"gemini\";\nexport type AuthorizableModelConnectionProvider = \"openai\" | \"xai\" | \"gemini\";\nexport type DeviceModelConnectionProvider = \"openai\" | \"xai\";\nexport type CodeModelConnectionProvider = \"gemini\";\n\nexport interface ModelConnection {\n\tprovider: ModelConnectionProvider;\n\tdisplay_name: string;\n\tconnected: boolean;\n\tstatus?: string | null;\n\taccount_label?: string | null;\n\texpires_at?: string | null;\n}\n\nexport interface ModelAuthorization {\n\tprovider: AuthorizableModelConnectionProvider;\n\tstate: string;\n\tstatus: \"pending\" | \"connected\";\n\tauthorization_url?: string | null;\n\tuser_code?: string | null;\n\texpires_at?: string | null;\n\tinterval_seconds: number;\n}\n\nexport interface ModelConnectionsResource {\n\t/** List supported providers. Credential material is never returned. */\n\tlist(): Promise<ModelConnection[]>;\n\t/** Start provider-native authorization; show the returned URL and device code when used. */\n\tauthorize(provider: AuthorizableModelConnectionProvider): Promise<ModelAuthorization>;\n\t/** Poll once; successful device authorization is saved automatically. */\n\tauthorizationStatus(\n\t\tprovider: DeviceModelConnectionProvider,\n\t\tstate: string\n\t): Promise<ModelAuthorization>;\n\t/** Exchange a pasted authorization code and store the connection. */\n\tcompleteAuthorization(\n\t\tprovider: CodeModelConnectionProvider,\n\t\tstate: string,\n\t\tparams: { code: string }\n\t): Promise<ModelAuthorization>;\n\t/** Cancel a short-lived provider authorization session. */\n\tcancelAuthorization(provider: AuthorizableModelConnectionProvider, state: string): Promise<void>;\n\t/** Delete m8tes' encrypted copy of the provider credentials. */\n\tdisconnect(provider: ModelConnectionProvider): Promise<ModelConnection>;\n}\n\nexport function createModelConnectionsResource(http: Http): ModelConnectionsResource {\n\treturn {\n\t\tasync list() {\n\t\t\tconst res = await http.request<{ data: ModelConnection[] }>(\"GET\", \"/model-connections/\");\n\t\t\treturn res?.data ?? [];\n\t\t},\n\t\tauthorize(provider) {\n\t\t\treturn http.request<ModelAuthorization>(\n\t\t\t\t\"POST\",\n\t\t\t\t`/model-connections/${seg(provider)}/authorizations`\n\t\t\t);\n\t\t},\n\t\tauthorizationStatus(provider, state) {\n\t\t\treturn http.request<ModelAuthorization>(\n\t\t\t\t\"GET\",\n\t\t\t\t`/model-connections/${seg(provider)}/authorizations/${seg(state)}`\n\t\t\t);\n\t\t},\n\t\tcompleteAuthorization(provider, state, params) {\n\t\t\treturn http.request<ModelAuthorization>(\n\t\t\t\t\"POST\",\n\t\t\t\t`/model-connections/${seg(provider)}/authorizations/${seg(state)}`,\n\t\t\t\t{ body: { code: params.code } }\n\t\t\t);\n\t\t},\n\t\tasync cancelAuthorization(provider, state) {\n\t\t\tawait http.request(\"DELETE\", `/model-connections/${seg(provider)}/authorizations/${seg(state)}`);\n\t\t},\n\t\tdisconnect(provider) {\n\t\t\treturn http.request<ModelConnection>(\"DELETE\", `/model-connections/${seg(provider)}`);\n\t\t},\n\t};\n}\n","/**\n * `client.permissions` — standing tool allow-lists, one end-user at a time.\n *\n * A run pauses whenever the agent reaches for a tool that is not pre-approved,\n * and stays paused until somebody answers. That is the right default for a first\n * run and the wrong one for a tool your product has already decided is fine. A\n * policy here says \"this end-user's runs may use this tool\" once, so their runs\n * stop stopping.\n *\n * Scope: policies are per end-user (`user_id` is required on every call — there\n * is no account-wide policy) and outlive the run, unlike `runs.answerPermission()`\n * which unblocks a single gate. `/docs/users` documents this surface; mirrors\n * `sdk/py/m8tes/_resources/permissions.py`.\n */\n\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport type { PermissionPolicy } from \"../types\";\nimport { type PageParams, pager } from \"./users\";\n\nexport interface PermissionCreateParams {\n /** The end-user whose runs this policy applies to. Required — policies never span end-users. */\n user_id: string;\n /** The tool to pre-approve, e.g. `\"Bash\"` or an `mcp__*` tool name. */\n tool: string;\n}\n\nexport interface PermissionListParams extends PageParams {\n /** Required: you list one end-user's policies, never the account's. */\n user_id: string;\n}\n\nexport interface PermissionsResource {\n /**\n * Pre-approve a tool so this end-user's runs no longer pause on it.\n * Idempotent — re-approving the same tool returns the existing policy rather\n * than erroring or duplicating. Send `tool`; the policy comes back as `tool_name`.\n */\n create(params: PermissionCreateParams): Promise<PermissionPolicy>;\n /** Audit what an end-user's runs are allowed to do without asking. */\n list(params: PermissionListParams): Promise<Page<PermissionPolicy>>;\n /**\n * Revoke a pre-approval, so the tool gates again on the next run.\n * `user_id` is required and scopes the delete — an id alone will not resolve.\n */\n delete(permissionId: number, params: { user_id: string }): Promise<void>;\n}\n\nexport function createPermissionsResource(http: Http): PermissionsResource {\n return {\n create(params) {\n return http.request<PermissionPolicy>(\"POST\", \"/permissions/\", {\n body: toBody({ ...params }),\n });\n },\n\n list(params) {\n return pager<PermissionPolicy>(http, \"/permissions/\")({ ...params });\n },\n\n async delete(permissionId, params) {\n await http.request(\"DELETE\", `/permissions/${seg(permissionId)}`, {\n query: toQuery({ user_id: params.user_id }),\n });\n },\n };\n}\n","/**\n * Filename → MIME type, for run attachments.\n *\n * The upload endpoint validates `content_type` against a strict allowlist\n * (`fastapi/app/services/execution/file_validation.py::ALLOWED_TYPES`) and\n * rejects the whole batch on a miss. A `Blob` built from bytes or a string has\n * no type, so it arrives as `application/octet-stream` and every upload fails\n * with `Invalid type: application/octet-stream` — which tells the developer\n * nothing about what to do next.\n *\n * So the type is inferred from the extension, and a caller can always override\n * it explicitly. Found by a live E2E: the mocked tests could not see it, because\n * only the real server enforces the allowlist.\n *\n * This map mirrors that allowlist. Adding a type here that the server does not\n * accept just moves the failure; keep the two in step.\n */\n\n// null-prototype on purpose: a plain object literal resolves `constructor`,\n// `__proto__`, `toString` through the prototype chain, so a filename ending\n// `.constructor` returned a truthy NON-string that sailed past the `if (!type)`\n// guard and became a garbage Content-Type. Filenames are often user-supplied.\nconst EXTENSION_TYPES: Record<string, string> = Object.assign(Object.create(null), {\n // Images (the agent can actually see these via its Read tool)\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n // Documents\n pdf: \"application/pdf\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n html: \"text/html\",\n htm: \"text/html\",\n // Code\n py: \"text/x-python\",\n js: \"application/javascript\",\n mjs: \"application/javascript\",\n cjs: \"application/javascript\",\n json: \"application/json\",\n ts: \"text/typescript\",\n tsx: \"text/typescript\",\n css: \"text/css\",\n c: \"text/x-c\",\n h: \"text/x-c\",\n java: \"text/x-java-source\",\n go: \"text/x-go\",\n sql: \"application/sql\",\n // Data / config\n csv: \"text/csv\",\n tsv: \"text/csv\",\n xml: \"application/xml\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n // Archives\n zip: \"application/zip\",\n gz: \"application/gzip\",\n tgz: \"application/gzip\",\n tar: \"application/x-tar\",\n // Office\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n xls: \"application/vnd.ms-excel\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ppt: \"application/vnd.ms-powerpoint\",\n});\n\n/** Every type the upload endpoint accepts. Used to make a rejection actionable. */\nexport const UPLOADABLE_EXTENSIONS = Object.keys(EXTENSION_TYPES);\n\n/**\n * The MIME type for a filename, or undefined when the extension is unknown.\n *\n * Undefined rather than a fallback on purpose: `application/octet-stream` is\n * exactly what the server rejects, so guessing it would only reproduce the\n * original confusing error.\n */\nexport function mimeTypeForFilename(name: string): string | undefined {\n const ext = name.includes(\".\") ? name.slice(name.lastIndexOf(\".\") + 1).toLowerCase() : \"\";\n return EXTENSION_TYPES[ext];\n}\n\n/**\n * Message for a file whose type cannot be determined. The server's own error\n * (\"Invalid type: application/octet-stream\") does not say what to do about it.\n */\nexport function unknownTypeMessage(name: string): string {\n return (\n `@m8tes/sdk: cannot infer a content type for \"${name}\", and the upload endpoint ` +\n `rejects files whose type it does not recognise. Pass it explicitly — ` +\n `{ name: \"${name}\", data, type: \"text/plain\" } — or rename the file with a known ` +\n `extension (${UPLOADABLE_EXTENSIONS.slice(0, 12).join(\", \")}, ...).`\n );\n}\n","/**\n * Wait for a run to finish.\n *\n * Streaming is the good path: you see the work as it happens. But plenty of\n * integrations are a queue worker or a cron job that just wants the answer, and\n * without this every one of them hand-rolls the same loop — with its own idea of\n * which statuses are terminal, its own backoff, and usually no timeout. That is\n * the single most common thing a developer had to build themselves.\n *\n * Mirrors `sdk/py/m8tes/_resources/runs.py` (`poll`, `wait`): same terminal set,\n * same 2s interval and 300s default timeout, same \"a transient API error is not\n * a failure, keep polling until the deadline\" behaviour.\n */\n\nimport {\n AuthenticationError,\n ConflictError,\n NotFoundError,\n PermissionDeniedError,\n ValidationError,\n} from \"./protocol/index\";\nimport type { PermissionRequest, Run } from \"./types\";\n\n/**\n * A revoked key, a deleted run, or a bad id will NEVER become terminal, so\n * retrying is pure cost: ~150 authenticated requests over the default 300s,\n * ending in a timeout whose advice (\"raise the timeout, or stream instead\") is\n * wrong for all three. Only genuinely transient failures keep polling.\n */\nfunction isPermanent(err: unknown): boolean {\n return (\n err instanceof AuthenticationError ||\n err instanceof PermissionDeniedError ||\n err instanceof NotFoundError ||\n err instanceof ValidationError\n );\n}\n\n/**\n * A run is done when it reaches one of these.\n *\n * Mirrors `TERMINAL_RUN_STATUSES` in `fastapi/app/models/run.py`, which is the\n * canonical set — including `\"closed\"` (a user-closed chat that cannot resume).\n * Both SDKs previously omitted it, so a closed run polled until the timeout.\n * The backend's own comment on that set warns these lists drift and that \"a\n * 'closed' chat run burned tokens too\". `archived` is deliberately NOT here:\n * it is a display state applied to already-terminal runs.\n */\nexport const TERMINAL_STATUSES = new Set([\"completed\", \"failed\", \"cancelled\", \"closed\"]);\n\n/**\n * Gate refusals `wait()` may ride out, keyed on the server's machine-readable\n * `error.details.error_code` (`fastapi/app/routers/v2/runs.py::approve_permission`).\n * Mirrors `_BENIGN_GATE_REFUSALS` in `sdk/py/m8tes/_resources/runs.py`.\n *\n * Membership is the SAFETY boundary, so it is an ALLOWLIST, not a denylist: anything\n * unrecognised — including an older server that sends no code at all — propagates. A\n * refusal the SDK cannot positively identify as harmless is treated as harmful,\n * because the one it must never swallow (`gate_resolved_otherwise`: another approver\n * decided the OPPOSITE way) is indistinguishable from the benign ones without it.\n *\n * `run_not_active` is benign ONLY because the server raises it exclusively for a gate\n * still OPEN on a finished run. If a CONTRADICTED decision could ever report\n * `run_not_active`, a lost denial would be swallowed here — so that split is a\n * contract, pinned server-side by\n * `test_a_contradicted_decision_on_a_terminal_run_is_not_reported_as_benign`.\n */\nconst BENIGN_GATE_REFUSAL_CODES = new Set([\"gate_cancelled\", \"run_not_active\"]);\n\n/**\n * The one benign refusal the server still spells as prose. `POST /runs/{id}/answer`\n * raises `HTTPException(409, detail=\"auto_continued\")` — a STRING detail, and\n * `routers/v2/_errors.py` lifts `error_code` only out of a DICT one — so the envelope\n * carries no code to branch on. It means the platform proceeded with the\n * \"(Recommended)\" option after ~10 minutes and the run is executing normally.\n *\n * Matched as the EXACT, complete message, never a substring, so no other 409 can\n * borrow it. Giving that endpoint a real code (and deleting this) is filed in\n * `TODOS.md`; until then, dropping it would break every polling caller on the\n * documented auto-continue path.\n */\nconst AUTO_CONTINUED_MESSAGE = \"auto_continued\";\n\nfunction isBenignGateRefusal(err: ConflictError | NotFoundError): boolean {\n if (err.errorCode !== undefined) return BENIGN_GATE_REFUSAL_CODES.has(err.errorCode);\n return err instanceof ConflictError && err.message === AUTO_CONTINUED_MESSAGE;\n}\n\nexport interface PollOptions {\n /** Seconds between polls. Default 2. */\n interval?: number;\n /** Seconds before giving up. Default 300. */\n timeout?: number;\n /** Abort the wait early. The in-flight request is cancelled with it. */\n signal?: AbortSignal;\n}\n\nexport interface WaitOptions extends PollOptions {\n /**\n * Called when a tool needs a decision. Return \"allow\" or \"deny\".\n * Without it, a run that pauses for a tool throws rather than hanging until\n * the timeout — silence would look identical to a slow run.\n */\n onApproval?: (request: PermissionRequest) => \"allow\" | \"deny\" | Promise<\"allow\" | \"deny\">;\n /**\n * Called when the agent asks a question. Return `{ [question text]: answer }`.\n * The keys must be the exact `question` strings from the request.\n */\n onQuestion?: (\n request: PermissionRequest,\n ) => Record<string, string> | Promise<Record<string, string>>;\n}\n\n/** Thrown when a run does not reach a terminal status before the deadline. */\nexport class RunTimeoutError extends Error {\n readonly runId: number;\n readonly timeoutSeconds: number;\n /** The last error seen while polling, if any. Without it a timeout hides the\n * transient failure that actually caused it. */\n override readonly cause?: unknown;\n /** The run's status when the deadline hit, when one was ever observed. */\n readonly lastStatus?: string;\n constructor(runId: number, timeoutSeconds: number, cause?: unknown, lastStatus?: string) {\n // The likeliest cause of a poll() timeout is a run parked at\n // awaiting_approval, which NEVER becomes terminal — so \"raise the timeout\"\n // is the one piece of advice guaranteed not to help. Say what actually\n // unblocks it when we know the status.\n const advice =\n lastStatus === \"awaiting_approval\"\n ? `The run is waiting for a human and will never finish on its own: use runs.wait() with ` +\n `onApproval/onQuestion, or resolve it yourself via runs.permissions(${runId}).`\n : `Raise the timeout, or stream the run instead of polling it.`;\n super(\n `Run ${runId} did not reach a terminal status within ${timeoutSeconds}s` +\n (lastStatus ? ` (last status: ${lastStatus})` : \"\") +\n `. ${advice}` +\n (cause instanceof Error ? ` Last error while polling: ${cause.message}` : \"\"),\n );\n this.name = \"RunTimeoutError\";\n this.runId = runId;\n this.timeoutSeconds = timeoutSeconds;\n this.cause = cause;\n if (lastStatus !== undefined) this.lastStatus = lastStatus;\n }\n}\n\n/**\n * Thrown when a run pauses for a human and no handler was supplied. Better than\n * waiting out the full timeout, which gives the caller no idea what happened.\n */\nexport class RunPausedError extends Error {\n readonly runId: number;\n readonly request: PermissionRequest;\n constructor(runId: number, request: PermissionRequest, hint: string) {\n super(`Run ${runId} is waiting for a human: ${hint}`);\n this.name = \"RunPausedError\";\n this.runId = runId;\n this.request = request;\n }\n}\n\n/** Normalized options, with a monotonic deadline. */\nfunction plan(options: PollOptions): {\n interval: number;\n timeout: number;\n deadline: number;\n signal?: AbortSignal;\n} {\n const interval = options.interval ?? 2;\n const timeout = options.timeout ?? 300;\n // NaN makes every `now() >= deadline` false and turns setTimeout into an\n // immediate timer, so the loop hot-spins against the API until something\n // external kills it. A negative interval does the same. Refuse both loudly.\n for (const [name, value] of [[\"interval\", interval], [\"timeout\", timeout]] as const) {\n if (!Number.isFinite(value) || value < 0) {\n throw new TypeError(\n `@m8tes/sdk: ${name} must be a finite, non-negative number of seconds (got ${String(value)}).`,\n );\n }\n }\n return { interval, timeout, deadline: now() + timeout * 1000, signal: options.signal };\n}\n\n/**\n * Sleep for `interval`, but never past the deadline — otherwise a long interval\n * with a short timeout overshoots by the whole interval before anyone checks.\n */\nfunction napUntil(interval: number, deadline: number, signal?: AbortSignal): Promise<void> {\n const remaining = Math.max(0, deadline - now()) / 1000;\n return sleep(Math.min(interval, remaining), signal);\n}\n\n/**\n * Bound an awaited operation by the deadline (and the abort signal).\n *\n * Without this the advertised timeout only gated the gaps BETWEEN awaits: a\n * caller's `onApproval` that never settles hung `wait()` forever, and a slow\n * request could return success long after the deadline had passed. Now every\n * await is raced against the remaining time.\n */\nasync function withDeadline<T>(\n start: () => Promise<T>,\n deadline: number,\n signal: AbortSignal | undefined,\n onExpired: () => Error,\n): Promise<T> {\n const remaining = deadline - now();\n // A FACTORY, not a promise: an argument would be evaluated eagerly, firing a\n // request (or invoking the caller's callback) that is then thrown away — the\n // work happens, costs, and is ignored. Nothing starts once time is up.\n if (remaining <= 0) throw onExpired();\n const work = start();\n let timer: ReturnType<typeof setTimeout> | undefined;\n let onAbort: (() => void) | undefined;\n try {\n return await Promise.race([\n work,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(onExpired()), remaining);\n if (signal) {\n onAbort = () => reject(onExpired());\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n if (signal && onAbort) signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\n/** Interruptible sleep. An abort resolves it immediately rather than stranding the caller. */\nfunction sleep(seconds: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timer = setTimeout(done, seconds * 1000);\n function done(): void {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\n/** True for an AskUserQuestion pause carrying a plan for approval (plan mode). */\nexport function isPlanApproval(request: PermissionRequest): boolean {\n if (request.tool_name !== \"AskUserQuestion\") return false;\n const questions = (request.tool_input as { questions?: Array<{ header?: string }> } | null)\n ?.questions;\n return Array.isArray(questions) && questions.some((q) => q?.header === \"Plan Approval\");\n}\n\n/** The proposed plan text, for a plan-approval pause. Null otherwise. */\nexport function planText(request: PermissionRequest): string | null {\n if (!isPlanApproval(request)) return null;\n const questions = (\n request.tool_input as { questions?: Array<{ header?: string; question?: string }> } | null\n )?.questions;\n return questions?.find((q) => q?.header === \"Plan Approval\")?.question ?? null;\n}\n\n/**\n * Injected by the runs resource so this module stays free of transport concerns.\n * Every call takes the caller's `signal`, so an abort cancels the in-flight HTTP\n * request instead of only shortening the next sleep.\n */\nexport interface PollDeps {\n get(runId: number, signal?: AbortSignal): Promise<Run>;\n permissions(runId: number, signal?: AbortSignal): Promise<PermissionRequest[]>;\n approve(\n runId: number,\n params: { request_id: string; decision: \"allow\" | \"deny\" },\n signal?: AbortSignal,\n ): Promise<unknown>;\n answer(\n runId: number,\n params: { answers: Record<string, string> },\n signal?: AbortSignal,\n ): Promise<unknown>;\n}\n\n/**\n * Monotonic milliseconds. `Date.now()` follows the wall clock, so an NTP\n * correction backwards mid-wait extends the timeout by the same amount (and\n * repeated corrections can stop it expiring at all). Python uses\n * `time.monotonic()` for exactly this reason.\n */\nconst now = (): number =>\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n\n/** Thrown when the caller aborts the wait. */\nexport class RunWaitAbortedError extends Error {\n /**\n * The run being waited on — `undefined` when the abort landed BEFORE any run\n * was created, which is the one case where there is nothing to go back to.\n * Previously this path passed a literal 0, producing \"Waiting on run 0 was\n * aborted\" and pointing the reader at a run that never existed.\n */\n readonly runId?: number;\n constructor(runId?: number) {\n super(\n runId === undefined\n ? \"Aborted before the run was created; nothing was started and nothing was billed.\"\n : `Waiting on run ${runId} was aborted. The run is still executing — ` +\n `poll it later with runs.get(${runId}), or stop it with runs.cancel(${runId}).`,\n );\n this.name = \"RunWaitAbortedError\";\n if (runId !== undefined) this.runId = runId;\n }\n}\n\n/**\n * Poll until the run is terminal.\n *\n * A run that pauses for a human never becomes terminal, so this would spin until\n * the timeout — `waitForRun` handles that case. `poll` is for autonomous runs.\n */\nexport async function pollRun(deps: PollDeps, runId: number, options: PollOptions = {}): Promise<Run> {\n const { interval, timeout, deadline, signal } = plan(options);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n // Kept so a timeout can still show WHY the last attempt failed.\n let lastError: unknown;\n // Kept so the timeout can give advice that fits the state the run is actually in.\n let lastStatus: string | undefined;\n\n for (;;) {\n let run: Run | undefined;\n try {\n run = await withDeadline(() => deps.get(runId, signal), deadline, signal, () =>\n signal?.aborted ? new RunWaitAbortedError(runId) : new RunTimeoutError(runId, timeout, lastError, lastStatus),\n );\n } catch (err) {\n // A timeout/abort raised by withDeadline is the verdict, not a blip.\n if (err instanceof RunTimeoutError || err instanceof RunWaitAbortedError) throw err;\n // A blip while the run is executing is not a failure: keep polling until\n // the deadline. But a 401/403/404 never resolves, so surface it now.\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (isPermanent(err)) throw err;\n lastError = err;\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n await napUntil(interval, deadline, signal);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n continue;\n }\n\n lastStatus = run.status;\n if (TERMINAL_STATUSES.has(run.status)) return run;\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n await napUntil(interval, deadline, signal);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n // The deadline can pass DURING the sleep; without this the loop would issue\n // one more request and could return successfully long after it expired.\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n }\n}\n\n/**\n * Wait for a run, answering human-in-the-loop pauses through callbacks.\n *\n * Same loop as `pollRun`, plus: on `awaiting_approval`, resolve every pending\n * request and let the run continue.\n */\nexport async function waitForRun(\n deps: PollDeps,\n runId: number,\n options: WaitOptions = {},\n): Promise<Run> {\n const { interval, timeout, deadline, signal } = plan(options);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n // Kept so a timeout can still show WHY the last attempt failed.\n let lastError: unknown;\n // Kept so the timeout can give advice that fits the state the run is actually in.\n let lastStatus: string | undefined;\n // A request we have already answered can still come back as \"pending\" on the\n // next poll, because the backend has not flipped its status yet. Without this\n // ledger the caller's onApproval/onQuestion fires again for the same gate —\n // and a callback that notifies a human or increments a counter would repeat.\n // Measured: 3 duplicate calls across 4 polls before this was added.\n const answered = new Set<string>();\n\n for (;;) {\n let run: Run | undefined;\n try {\n run = await withDeadline(() => deps.get(runId, signal), deadline, signal, () =>\n signal?.aborted ? new RunWaitAbortedError(runId) : new RunTimeoutError(runId, timeout, lastError, lastStatus),\n );\n } catch (err) {\n if (err instanceof RunTimeoutError || err instanceof RunWaitAbortedError) throw err;\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (isPermanent(err)) throw err;\n lastError = err;\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n await napUntil(interval, deadline, signal);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n continue;\n }\n\n lastStatus = run.status;\n if (TERMINAL_STATUSES.has(run.status)) return run;\n\n if (run.status === \"awaiting_approval\") {\n const expired = () =>\n signal?.aborted ? new RunWaitAbortedError(runId) : new RunTimeoutError(runId, timeout, lastError, lastStatus);\n const bound = <T>(start: () => Promise<T>): Promise<T> => withDeadline(start, deadline, signal, expired);\n /**\n * Resolving a gate can lose a race the caller cannot prevent — but two very\n * different losses look alike, so this branches on the SERVER'S code, never on\n * the status alone.\n *\n * benign — the gate was cancelled, the run went terminal, or the platform\n * auto-continued a \"(Recommended)\" question. Nothing a human decided was\n * contradicted, and `wait()` owes the caller the RUN's outcome, not the\n * gate's; keep polling and the next `get()` returns the real result.\n *\n * CONTRADICTED — another approver decided the OTHER way (or answered the same\n * question differently), so this caller's decision did NOT happen and the\n * opposite one is what runs. `onQuestion` picks A, Slack commits B, `/answer`\n * 409s the losing A: swallowing that makes `wait()` return a completed run to\n * a caller who believes they blocked the tool that just executed. It is the\n * same false confirmation the 404 exists to prevent, one layer up.\n *\n * Swallowing EVERY conflict could not tell those apart. See\n * `_BENIGN_GATE_REFUSALS` in `sdk/py/m8tes/_resources/runs.py` — same allowlist,\n * same reasoning, deliberately kept in step.\n */\n const resolveGate = async (start: () => Promise<unknown>): Promise<void> => {\n try {\n await bound(start);\n } catch (err) {\n if (!(err instanceof ConflictError) && !(err instanceof NotFoundError)) throw err;\n if (!isBenignGateRefusal(err)) throw err;\n }\n };\n const pending = (await bound(() => deps.permissions(runId, signal))).filter(\n (r) => r.status === \"pending\" && !answered.has(r.request_id),\n );\n for (const request of pending) {\n answered.add(request.request_id);\n if (request.tool_name === \"AskUserQuestion\") {\n if (!options.onQuestion) {\n throw new RunPausedError(\n runId,\n request,\n \"the agent asked a question. Pass onQuestion to answer it, or call runs.answer() yourself.\",\n );\n }\n // The callback is the caller's code: it can hang, so it is bounded too.\n const answers = await bound(async () => options.onQuestion!(request));\n await resolveGate(() => deps.answer(runId, { answers }, signal));\n } else {\n if (!options.onApproval) {\n throw new RunPausedError(\n runId,\n request,\n `the tool \"${request.tool_name}\" needs a decision. Pass onApproval, or call runs.approve() yourself.`,\n );\n }\n const decision = await bound(async () => options.onApproval!(request));\n await resolveGate(() => deps.approve(runId, { request_id: request.request_id, decision }, signal));\n }\n }\n }\n\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n await napUntil(interval, deadline, signal);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n }\n}\n","/**\n * `RunStream` — the developer-facing view of a streaming run.\n *\n * Mirrors the Python SDK's `RunStream` (`sdk/py/m8tes/_streaming.py`): iterate\n * events, or just await the text. It accumulates as you consume, so after\n * iterating you have `.text`, `.runId`, and `.errors` without a second request.\n *\n * Beyond Python it also exposes `.state` — the full normalized conversation\n * (messages, tool calls, notices) from the shared protocol accumulator. Useful\n * server-side for logging what the agent actually did, not just what it said.\n *\n * Nothing is consumed until you iterate: constructing a RunStream is free, and\n * an un-iterated stream is closed by `close()` without reading the body.\n */\n\nimport {\n RunFailedError,\n accumulate,\n initialConversationState,\n isTerminalEvent,\n type ConversationState,\n type M8tesStreamEvent,\n} from \"./protocol/index\";\n\nexport interface RunStreamOptions {\n /**\n * Throw `RunFailedError` once iteration finishes if the run emitted any error\n * event, so a mid-run failure is never mistaken for a successful empty run.\n * Defaults to false, matching the Python SDK.\n */\n raiseOnError?: boolean;\n /**\n * Reuse this key to retry the same call safely — the server replays the run the\n * first attempt produced instead of starting (and billing) a second one. One is\n * minted per call automatically; supply your own only when a retry must survive\n * a process restart. Sent as the `Idempotency-Key` header.\n */\n idempotencyKey?: string;\n}\n\nexport class RunStream implements AsyncIterable<M8tesStreamEvent> {\n private readonly source: AsyncGenerator<M8tesStreamEvent, void, unknown>;\n private readonly raiseOnError: boolean;\n private state: ConversationState = initialConversationState;\n private textChunks: string[] = [];\n private errorMessages: string[] = [];\n private runIdValue: number | null = null;\n private consumed = false;\n\n constructor(\n source: AsyncGenerator<M8tesStreamEvent, void, unknown>,\n options: RunStreamOptions = {},\n ) {\n this.source = source;\n this.raiseOnError = options.raiseOnError ?? false;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<M8tesStreamEvent> {\n if (this.consumed) {\n throw new Error(\n \"RunStream has already been consumed. A stream is single-pass — iterate once, \" +\n \"then read .text / .state / .errors, or call runs.get(runId) to re-read the result.\",\n );\n }\n this.consumed = true;\n try {\n for await (const event of this.source) {\n this.state = accumulate(this.state, event);\n if (event.type === \"text-delta\") this.textChunks.push(event.delta);\n if (event.type === \"run-start\" && event.runId !== null) this.runIdValue = event.runId;\n if (event.type === \"run-error\") this.errorMessages.push(event.message || event.error);\n yield event;\n }\n } finally {\n // Closing the source generator cancels the underlying HTTP response even\n // when the caller breaks out of the loop early.\n await this.source.return(undefined).catch(() => undefined);\n }\n if (this.raiseOnError && this.errorMessages.length > 0) {\n throw new RunFailedError(`Run failed: ${this.errorMessages.join(\"; \")}`, {\n type: \"run_failed\",\n code: 0,\n status: 0,\n details: { errors: this.errorMessages },\n });\n }\n }\n\n /** Yield only the assistant's text, in order. The 90% case for a server. */\n async *iterText(): AsyncGenerator<string, void, unknown> {\n for await (const event of this) {\n if (event.type === \"text-delta\") yield event.delta;\n }\n }\n\n /** Drain the stream and return the full assistant text. */\n async text(): Promise<string> {\n for await (const _ of this) {\n /* accumulate */\n }\n return this.textChunks.join(\"\");\n }\n\n /** Accumulated text so far (complete once iteration finishes). */\n get output(): string {\n return this.textChunks.join(\"\");\n }\n\n /** Run id, available as soon as the first `run-start` event arrives. */\n get runId(): number | null {\n return this.runIdValue;\n }\n\n /** Error messages the run emitted. Check this, or pass `raiseOnError`. */\n get errors(): string[] {\n return [...this.errorMessages];\n }\n\n get hasErrors(): boolean {\n return this.errorMessages.length > 0;\n }\n\n /** Full normalized conversation: messages, tool calls, notices, status. */\n get conversation(): ConversationState {\n return this.state;\n }\n\n /** Close the underlying response without draining it. */\n async close(): Promise<void> {\n await this.source.return(undefined).catch(() => undefined);\n }\n}\n\nexport { isTerminalEvent };\n","/**\n * `client.runs` — start agents, stream what they do, and answer them mid-run.\n *\n * `create()` is the one call most integrations need: it provisions a default\n * agent if the account has none, so a brand-new key can run an agent in one\n * request. Mirrors `sdk/py/m8tes/_resources/runs.py`, field for field.\n */\n\nimport { IDEMPOTENCY_HEADER, type Http } from \"../http\";\nimport { mimeTypeForFilename, unknownTypeMessage } from \"../mime\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { resolveAgentId, toBody, toQuery } from \"../params\";\nimport {\n pollRun,\n RunWaitAbortedError,\n TERMINAL_STATUSES,\n waitForRun,\n type PollDeps,\n type PollOptions,\n type WaitOptions,\n} from \"../polling\";\nimport { ConflictError, type M8tesStreamEvent } from \"../protocol/index\";\n\n/**\n * Stamp the run id onto an error on its way out of a wait.\n *\n * `waitForRun` tolerates transient failures on `get`, but a failure while\n * resolving a permission gate (permissions/answer/approve) escapes to the\n * caller. Escaping is a defensible trade-off; escaping ANONYMOUSLY is not — for\n * `createAndWait` the caller never saw the id, so a run that is created,\n * billed, and STILL EXECUTING became unreachable. The error's class is\n * preserved so `instanceof ValidationError` and friends keep working; the id is\n * purely additive, and never overwrites an existing `runId`.\n */\nfunction withRunId<E>(err: E, runId: number): E {\n if (err && typeof err === \"object\" && !(\"runId\" in err)) {\n Object.defineProperty(err, \"runId\", { value: runId, enumerable: true, configurable: true });\n const e = err as { message?: string };\n if (typeof e.message === \"string\" && !e.message.includes(String(runId))) {\n e.message = `${e.message} (while waiting on run ${runId}, which is still executing)`;\n }\n }\n return err;\n}\nimport { RunStream, type RunStreamOptions } from \"../streaming\";\nimport type {\n JsonObject,\n PermissionMode,\n PermissionRequest,\n Run,\n RunFile,\n RunOutcome,\n} from \"../types\";\n\nexport interface RunCreateParams {\n /** What the agent should do. */\n message: string;\n /** Which agent runs it. Omit to use (or auto-provision) the account default. */\n agent_id?: number;\n /** Permanent legacy alias for `agent_id` — the same wire field. */\n teammate_id?: number;\n /** Your id for the end-user this run belongs to. Isolates their memory, history, and tool connections. */\n user_id?: string;\n /** Tool slugs available for this run. */\n tools?: string[];\n /** One-off system instructions for this run. */\n instructions?: string;\n /** Name a newly auto-created agent. */\n name?: string;\n /** Your own key/value data, echoed back on the Run. */\n metadata?: JsonObject;\n model?: string;\n effort?: string;\n permission_mode?: PermissionMode;\n /** Enable clarifying questions, tool approval, and plan mode. */\n human_in_the_loop?: boolean;\n /** Run-level overrides for the built-in tools. Omit to inherit the agent default. */\n memory?: boolean;\n history?: boolean;\n task_setup_tools?: boolean;\n feedback?: boolean;\n /** Ask for structured output matching this JSON Schema; lands on `run.output_data`. */\n output_schema?: JsonObject;\n /** Give this run's agent an email inbox. */\n email_inbox?: boolean;\n /**\n * Reuse this key to retry the same create safely — the server returns the run\n * the first attempt made instead of starting (and billing) a second one.\n *\n * One is minted per call automatically, which is what makes the SDK's own\n * retries safe. Supply your own only when a retry must survive a process\n * restart: a job runner re-driving the same unit of work should pass its job\n * id. Sent as the `Idempotency-Key` header; never part of the request body.\n */\n idempotencyKey?: string;\n /**\n * Files the agent can read: a CSV to analyze, a PDF to summarize. Each is a\n * `{ name, data }` pair; `data` accepts anything `FormData` takes (Blob,\n * Uint8Array, ArrayBuffer, string). Sending files switches the request to the\n * multipart `/runs/with-files` endpoint; every other option behaves the same.\n *\n * Attachments require sandbox execution (the agent reads them with its file\n * tools from the run's working directory).\n */\n files?: RunFileInput[];\n}\n\n/** One attachment for `runs.create({ files })`. */\nexport interface RunFileInput {\n /** Filename the agent will see. Its extension determines the content type. */\n name: string;\n /** Contents. `Blob`/`File` pass straight through; bytes and strings are wrapped. */\n data: Blob | ArrayBuffer | ArrayBufferView | string;\n /**\n * Content type, if the extension does not imply it. The upload endpoint\n * validates against an allowlist and rejects the batch on a miss, so this is\n * inferred from `name` by default rather than defaulting to\n * `application/octet-stream` (which the server refuses).\n */\n type?: string;\n}\n\nexport interface RunListParams {\n user_id?: string;\n agent_id?: number;\n teammate_id?: number;\n task_id?: number;\n status?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface ApproveParams {\n /** From the `approval-request` event, or `runs.permissions()`. */\n request_id: string;\n decision: \"allow\" | \"deny\";\n /**\n * Apply the same decision to matching tool requests for the rest of THIS run.\n * For a policy that outlives the run, use the permissions API instead.\n */\n remember?: boolean;\n}\n\nexport interface AnswerParams {\n /**\n * Question text → the option label you picked. The keys must be the exact\n * `question` strings from the `question` event.\n */\n answers: Record<string, string>;\n}\n\nexport interface RunsResource {\n /** Start a run and stream it. */\n create(params: RunCreateParams, options?: RunStreamOptions): RunStream;\n /** Start a run and return immediately; poll `get()` or use a webhook for the result. */\n createAsync(params: RunCreateParams): Promise<Run>;\n /**\n * Start a run and wait for the result. The batch/cron counterpart to `create()`.\n * Pass `onApproval`/`onQuestion` to answer human-in-the-loop pauses inline;\n * without them a paused run throws `RunPausedError` rather than hanging.\n */\n createAndWait(params: RunCreateParams, options?: WaitOptions): Promise<Run>;\n /** Poll an existing run until it is terminal. Throws `RunTimeoutError` on deadline. */\n poll(runId: number, options?: PollOptions): Promise<Run>;\n /** Like `poll`, but resolves human-in-the-loop pauses through callbacks. */\n wait(runId: number, options?: WaitOptions): Promise<Run>;\n /**\n * Retry a failed or cancelled run. Returns a NEW run — poll that one's id, the\n * original stays failed. Idempotent: an in-flight retry is returned as-is.\n *\n * If the run already did something visible (sent a message, changed data), the\n * API refuses with a 409 `retry_needs_confirmation`; pass `confirm: true` to\n * proceed. Check `run.retryable` first to avoid a guaranteed conflict.\n */\n retry(runId: number, params?: { confirm?: boolean }): Promise<Run>;\n /** Join a run already in flight. Throws `RunNotStreamingError` if it has finished. */\n stream(runId: number, options?: RunStreamOptions): RunStream;\n /** Continue the conversation on an existing run, streaming the reply. */\n reply(runId: number, message: string, options?: RunStreamOptions): RunStream;\n /** GET /runs/{id} takes NO query params — it is already account-scoped, and\n * sending `user_id` returns 422 `unknown_query_parameter`. */\n get(runId: number): Promise<Run>;\n list(params?: RunListParams): Promise<Page<Run>>;\n /** Cancel a running run. Returns the updated Run, like the Python SDK. */\n cancel(runId: number): Promise<Run>;\n /** Approve or deny a pending tool-permission gate. */\n approve(runId: number, params: ApproveParams): Promise<PermissionRequest>;\n /** Answer a pending AskUserQuestion gate, resuming the run. */\n answer(runId: number, params: AnswerParams): Promise<{ status: string; resumed: boolean }>;\n /** Gates currently waiting on a human. */\n permissions(runId: number): Promise<PermissionRequest[]>;\n /** Condensed result: headline, summary, tokens, cost. */\n outcome(runId: number): Promise<RunOutcome>;\n /** Files the agent produced. */\n files(runId: number): Promise<RunFile[]>;\n /** Download one produced file. */\n downloadFile(runId: number, filename: string): Promise<ArrayBuffer>;\n}\n\n/** Unwrap `{data: [...]}` or a bare array — both shapes exist across v2 routes. */\nfunction items(payload: { data?: unknown[] } | unknown[] | undefined): unknown[] {\n return Array.isArray(payload) ? payload : (payload?.data ?? []);\n}\n\n/**\n * Headers for a run-creating POST — minting a key when the caller gave none.\n *\n * A key is ALWAYS sent. Runs are billable, so a POST that times out is otherwise\n * unanswerable: retry and you may pay twice, don't and you may drop the request.\n * With a key the server binds it to the run it created and replays that run for\n * every repeat, which is what lets `http` retry these POSTs at all.\n *\n * Mirrors `idempotency_headers` in the Python SDK. Auto-minting never dedupes two\n * DELIBERATE identical runs: those are two calls, and each mints its own key.\n * Pass `idempotencyKey` to reuse one across process restarts (a job runner\n * re-driving the same unit of work should pass its job id).\n */\nexport function idempotencyHeaders(key?: string): Record<string, string> {\n return { [IDEMPOTENCY_HEADER]: key ?? crypto.randomUUID() };\n}\n\n/**\n * Follow an idempotent replay to the run's live stream.\n *\n * A run that has ALREADY finished by the time the retry lands has nothing to\n * join, so this throws rather than yielding an empty stream that would read as\n * \"the agent said nothing\". The window is the retry backoff (sub-second), and the\n * error names the run so the caller can fetch its result — still strictly better\n * than the pre-idempotency outcome, where a timed-out create left them unable to\n * learn the run existed at all.\n */\nexport function replayJoin(\n http: Http,\n): (run: { id: number; status: string }) => AsyncGenerator<M8tesStreamEvent, void, unknown> {\n return async function* (run) {\n if (TERMINAL_STATUSES.has(run.status)) {\n throw new ConflictError(\n `Run ${run.id} was already created by an earlier attempt with this idempotency ` +\n `key and has finished (status=${run.status}), so there is no stream to join. ` +\n `You were charged once. Fetch the result with runs.get(${run.id}).`,\n {\n type: \"invalid_request_error\",\n code: 409,\n status: 409,\n details: { error_code: \"idempotent_replay_terminal\", run_id: run.id, status: run.status },\n },\n );\n }\n yield* http.stream(\"GET\", `/runs/${seg(run.id)}/stream`);\n };\n}\n\nexport function createRunsResource(http: Http): RunsResource {\n const createBody = (p: RunCreateParams, stream: boolean): Record<string, unknown> => {\n const { agent_id, teammate_id, files, idempotencyKey, ...rest } = p;\n void files; // carried in the multipart form, never in the JSON body\n void idempotencyKey; // rides in the Idempotency-Key HEADER, never in the body\n return toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id), stream });\n };\n\n /** Multipart form for /runs/with-files: the same JSON under `payload`, plus the files. */\n const createForm = (p: RunCreateParams, stream: boolean): FormData => {\n const form = new FormData();\n form.append(\"payload\", JSON.stringify(createBody(p, stream)));\n for (const f of p.files ?? []) {\n // Precedence: an explicit `type` always wins (otherwise a Blob carrying\n // application/octet-stream would override the caller's own correction and\n // the server would reject the batch), then the Blob's own type, then the\n // filename extension.\n const blobType = f.data instanceof Blob && f.data.type ? f.data.type : undefined;\n const type = f.type ?? blobType ?? mimeTypeForFilename(f.name);\n if (!type) throw new TypeError(unknownTypeMessage(f.name));\n const blob =\n f.data instanceof Blob && f.data.type === type\n ? f.data\n : new Blob([f.data as BlobPart], { type });\n form.append(\"files\", blob, f.name);\n }\n return form;\n };\n\n const hasFiles = (p: RunCreateParams): boolean => (p.files?.length ?? 0) > 0;\n\n // Injected into the polling helpers so they stay transport-free.\n // The caller's abort signal reaches every request, so cancelling a wait\n // cancels the in-flight HTTP call rather than just shortening the next sleep.\n const deps: PollDeps = {\n get: (runId, signal) => http.request<Run>(\"GET\", `/runs/${seg(runId)}`, { signal }),\n permissions: async (runId, signal) =>\n items(await http.request(\"GET\", `/runs/${seg(runId)}/permissions`, { signal })) as PermissionRequest[],\n approve: (runId, params, signal) =>\n http.request(\"POST\", `/runs/${seg(runId)}/approve`, { body: { remember: false, ...params }, signal }),\n answer: (runId, params, signal) =>\n http.request(\"POST\", `/runs/${seg(runId)}/answer`, { body: params, signal }),\n };\n\n // Declared as a local (not a method) so nothing here depends on `this`:\n // `const { createAndWait } = client.runs` is a normal thing to write, and it\n // threw \"Cannot read properties of undefined\" while createAndWait was the one\n // method calling `this.createAsync`. Verified against the packed tarball.\n //\n // `async` on purpose: an unmappable attachment must REJECT, not throw\n // synchronously, or `.catch()` would miss what try/catch catches. (Streaming\n // `create()` returns a RunStream rather than a promise, so it throws\n // synchronously — you never got a stream to iterate.)\n const createAsync = async (params: RunCreateParams): Promise<Run> => {\n const headers = idempotencyHeaders(params.idempotencyKey);\n return hasFiles(params)\n ? http.request<Run>(\"POST\", \"/runs/with-files\", { form: createForm(params, false), headers })\n : http.request<Run>(\"POST\", \"/runs\", { body: createBody(params, false), headers });\n };\n\n return {\n create(params, options) {\n const headers = idempotencyHeaders(params.idempotencyKey);\n const init = hasFiles(params)\n ? { form: createForm(params, true), headers }\n : { body: createBody(params, true), headers };\n const path = hasFiles(params) ? \"/runs/with-files\" : \"/runs\";\n return new RunStream(\n http.stream(\"POST\", path, { ...init, onReplay: replayJoin(http) }),\n options,\n );\n },\n\n createAsync,\n\n async createAndWait(params, options = {}) {\n // Check BEFORE creating: a run costs money, and starting one for an\n // operation the caller already cancelled is the one mistake here that\n // spends real budget. (Verified: this used to issue the POST first.)\n if (options.signal?.aborted) throw new RunWaitAbortedError();\n const started = await createAsync(params);\n // Past this line the run exists and is billable, so every failure must\n // still tell the caller WHICH run to go back to.\n try {\n return await waitForRun(deps, started.id, options);\n } catch (err) {\n throw withRunId(err, started.id);\n }\n },\n\n poll(runId, options) {\n return pollRun(deps, runId, options);\n },\n\n wait(runId, options) {\n return waitForRun(deps, runId, options);\n },\n\n // `confirm` is a QUERY param and the route takes no body (verified against\n // fastapi/app/routers/v2/runs.py::retry_run), so send neither.\n retry(runId, params = {}) {\n return http.request<Run>(\"POST\", `/runs/${seg(runId)}/retry`, {\n query: params.confirm ? toQuery({ confirm: true }) : \"\",\n });\n },\n\n stream(runId, options) {\n return new RunStream(http.stream(\"GET\", `/runs/${seg(runId)}/stream`), options);\n },\n\n reply(runId, message, options) {\n return new RunStream(\n http.stream(\"POST\", `/runs/${seg(runId)}/reply`, {\n body: { message },\n headers: idempotencyHeaders(options?.idempotencyKey),\n onReplay: replayJoin(http),\n }),\n options,\n );\n },\n\n get(runId) {\n return http.request<Run>(\"GET\", `/runs/${seg(runId)}`);\n },\n\n async list(params = {}) {\n const { agent_id, teammate_id, ...rest } = params;\n const q = toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) });\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Run>> => {\n const res = await http.request<{ data: Run[]; has_more?: boolean }>(\"GET\", \"/runs\", {\n query: toQuery(p),\n });\n return new Page<Run>(res?.data ?? [], res?.has_more ?? false, (starting_after) =>\n fetchPage({ ...p, starting_after }),\n );\n };\n return fetchPage(q);\n },\n\n cancel(runId) {\n return http.request<Run>(\"POST\", `/runs/${seg(runId)}/cancel`, { body: {} });\n },\n\n approve(runId, params) {\n return http.request<PermissionRequest>(\"POST\", `/runs/${seg(runId)}/approve`, {\n body: { remember: false, ...params },\n });\n },\n\n answer(runId, params) {\n // `answers` is keyed by question text and goes over the wire verbatim.\n return http.request<{ status: string; resumed: boolean }>(\"POST\", `/runs/${seg(runId)}/answer`, {\n body: { answers: params.answers },\n });\n },\n\n async permissions(runId) {\n return items(await http.request(\"GET\", `/runs/${seg(runId)}/permissions`)) as PermissionRequest[];\n },\n\n outcome(runId) {\n return http.request<RunOutcome>(\"GET\", `/runs/${seg(runId)}/outcome`);\n },\n\n async files(runId) {\n return items(await http.request(\"GET\", `/runs/${seg(runId)}/files`)) as RunFile[];\n },\n\n async downloadFile(runId, filename) {\n const res = await http.raw(\"GET\", `/runs/${seg(runId)}/files/${seg(filename)}/download`, {\n headers: { accept: \"application/octet-stream\" },\n });\n return res.arrayBuffer();\n },\n };\n}\n","/**\n * `client.settings` — account-level configuration.\n *\n * In v0.1 scope for one concrete reason: strict multi-tenant mode\n * (`require_end_user_id`) is ON by default for API accounts, and when it rejects a\n * request the backend's own 422 message says \"turn it off once with\n * client.settings.update(require_end_user_id=False)\". Without this resource a\n * TypeScript developer would follow that instruction into a method that does not\n * exist. Found by running the SDK against a real backend.\n *\n * Mirrors `sdk/py/m8tes/_resources/settings.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { toBody } from \"../params\";\n\nexport interface AccountSettings {\n /** Per-end-user monthly run cap. null = uncapped. */\n per_end_user_run_limit: number | null;\n /** Per-end-user monthly metered spend cap, in cents. null = uncapped. */\n per_end_user_cost_limit_cents: number | null;\n /** Per-end-user run-starts per minute. null = unthrottled. */\n per_end_user_rate_per_minute: number | null;\n /** \"standard\", or \"metadata_only\" for zero data retention. */\n retention_mode: string;\n /** When true, any request that would fall back to the account scope is rejected. */\n require_end_user_id: boolean;\n}\n\nexport interface AccountSettingsUpdateParams {\n /** Pass a number to set, `null` to clear, omit to leave unchanged. */\n per_end_user_run_limit?: number | null;\n per_end_user_cost_limit_cents?: number | null;\n per_end_user_rate_per_minute?: number | null;\n retention_mode?: \"standard\" | \"metadata_only\";\n /**\n * Strict multi-tenant mode. ON by default for API accounts: a request that\n * omits `user_id` and would therefore land in the account-level scope is\n * rejected with a 422 rather than silently assuming the global scope.\n *\n * Set false only if you are building for yourself (single-tenant).\n */\n require_end_user_id?: boolean;\n}\n\nexport interface SettingsResource {\n get(): Promise<AccountSettings>;\n update(params: AccountSettingsUpdateParams): Promise<AccountSettings>;\n}\n\nexport function createSettingsResource(http: Http): SettingsResource {\n return {\n get() {\n return http.request<AccountSettings>(\"GET\", \"/settings/\");\n },\n // `null` must survive (it CLEARS a cap); only `undefined` is dropped.\n update(params) {\n return http.request<AccountSettings>(\"PATCH\", \"/settings/\", { body: toBody({ ...params }) });\n },\n };\n}\n","/**\n * `client.tasks` — reusable work definitions, plus the triggers that fire them.\n *\n * A task is \"what to do\"; a trigger is \"when\". `client.tasks.triggers` covers all\n * four kinds (schedule, webhook, email, app event). Mirrors\n * `sdk/py/m8tes/_resources/tasks.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { resolveAgentId, toBody, toQuery } from \"../params\";\nimport { idempotencyHeaders, replayJoin } from \"./runs\";\nimport { RunStream, type RunStreamOptions } from \"../streaming\";\nimport type { JsonObject, Run, Task, Trigger, TriggerType, WebhookToggle } from \"../types\";\n\n/** A task must belong to an agent: `POST /tasks/` requires `teammate_id`, so the\n * type requires one of the two spellings rather than letting you discover it as\n * a 422. */\ntype TaskOwner = { agent_id: number; teammate_id?: never } | { teammate_id: number; agent_id?: never };\n\nexport type TaskCreateParams = TaskOwner & TaskCreateFields;\n\nexport interface TaskCreateFields {\n /** What the agent should do each time this task runs. */\n instructions: string;\n name?: string;\n tools?: string[];\n /** What a good result looks like. */\n expected_output?: string;\n goals?: string;\n user_id?: string;\n /** Email the account owner when a run finishes. Default true. */\n email_notifications?: boolean;\n /** Create a webhook trigger alongside the task. */\n webhook?: boolean;\n /** Cron expression, e.g. `\"0 9 * * 1-5\"`. Creates a schedule trigger. */\n schedule?: string;\n /** IANA timezone for `schedule`. Default \"UTC\". */\n schedule_timezone?: string;\n enable_memory?: boolean;\n enable_history?: boolean;\n enable_task_setup_tools?: boolean;\n enable_feedback?: boolean;\n /** Accumulate self-improvement lessons across this task's runs. Default true. */\n enable_lessons?: boolean;\n}\n\n/**\n * PATCH /tasks/{id} accepts exactly these fields (backend `DevTaskUpdate`).\n * `schedule`, `schedule_timezone`, `webhook`, and the agent id are create-only:\n * sending them to PATCH returns 200 and changes nothing. Change a schedule via\n * `tasks.triggers.update()`, and a webhook via `enableWebhook()`.\n *\n * `null` is meaningful: it CLEARS the field.\n */\nexport interface TaskUpdateParams {\n name?: string | null;\n instructions?: string | null;\n tools?: string[] | null;\n expected_output?: string | null;\n goals?: string | null;\n email_notifications?: boolean | null;\n enable_memory?: boolean | null;\n enable_history?: boolean | null;\n enable_task_setup_tools?: boolean | null;\n enable_feedback?: boolean | null;\n enable_lessons?: boolean | null;\n}\n\nexport interface TaskListParams {\n user_id?: string;\n agent_id?: number;\n teammate_id?: number;\n status?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface TriggerCreateParams {\n type: TriggerType | string;\n /** Schedule triggers: a cron expression. */\n cron?: string;\n /** Schedule triggers: a plain interval instead of cron. */\n interval_seconds?: number;\n /** IANA timezone. Default \"UTC\". */\n timezone?: string;\n /** App-event triggers: the app slug, e.g. `\"github\"`. */\n app?: string;\n /** App-event triggers: the event name, e.g. `\"pull_request_opened\"`. */\n trigger_name?: string;\n trigger_config?: JsonObject;\n user_id?: string;\n /** Email triggers: only these senders may start a run. */\n allowed_senders?: string[];\n}\n\nexport interface TriggersResource {\n create(taskId: number, params: TriggerCreateParams): Promise<Trigger>;\n list(taskId: number, params?: { user_id?: string }): Promise<Trigger[]>;\n /** Only the schedule shape and the enabled flag are mutable — a trigger's\n * `type`/`app`/`trigger_name` are fixed at creation and are silently ignored\n * on PATCH. Delete and recreate to change those. `user_id` scopes to one\n * end-user (404 on mismatch). */\n update(\n taskId: number,\n triggerId: number,\n params: {\n cron?: string;\n interval_seconds?: number;\n timezone?: string;\n enabled?: boolean;\n user_id?: string;\n },\n ): Promise<Trigger>;\n delete(taskId: number, triggerId: number, params?: { user_id?: string }): Promise<void>;\n}\n\nexport interface TaskRunParams {\n /** Run on behalf of this end-user. */\n user_id?: string;\n /**\n * Reuse this key to retry the same call safely — the server returns the run the\n * first attempt made instead of starting (and billing) a second one. One is\n * minted per call automatically; supply your own (e.g. a scheduler's job id)\n * only when a retry must survive a process restart. Sent as the\n * `Idempotency-Key` header, never in the body.\n */\n idempotencyKey?: string;\n}\n\nexport interface TasksResource {\n triggers: TriggersResource;\n create(params: TaskCreateParams): Promise<Task>;\n list(params?: TaskListParams): Promise<Page<Task>>;\n get(taskId: number, params?: { user_id?: string }): Promise<Task>;\n update(taskId: number, params: TaskUpdateParams & { user_id?: string }): Promise<Task>;\n delete(taskId: number, params?: { user_id?: string }): Promise<void>;\n /** Run the task now, streaming it. */\n run(taskId: number, params?: TaskRunParams, options?: RunStreamOptions): RunStream;\n /** Run the task now without streaming; poll `runs.get()` for the result. */\n runAsync(taskId: number, params?: TaskRunParams): Promise<Run>;\n /** `user_id` scopes to one end-user (404 on mismatch), like get/update/delete. */\n enableWebhook(taskId: number, params?: { user_id?: string }): Promise<WebhookToggle>;\n disableWebhook(taskId: number, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createTasksResource(http: Http): TasksResource {\n const triggers: TriggersResource = {\n create(taskId, params) {\n // user_id rides both channels on purpose: the query copy is the end-user\n // scope gate on the task (404 on mismatch); the body copy picks whose\n // connected account an app trigger arms.\n return http.request<Trigger>(\"POST\", `/tasks/${seg(taskId)}/triggers/`, {\n body: toBody({ timezone: \"UTC\", ...params }),\n query: toQuery({ user_id: params.user_id }),\n });\n },\n async list(taskId, params = {}) {\n const res = await http.request<{ data?: Trigger[] } | Trigger[]>(\n \"GET\",\n `/tasks/${seg(taskId)}/triggers/`,\n { query: toQuery(params) },\n );\n return Array.isArray(res) ? res : (res?.data ?? []);\n },\n update(taskId, triggerId, params) {\n const { user_id, ...patch } = params;\n return http.request<Trigger>(\"PATCH\", `/tasks/${seg(taskId)}/triggers/${seg(triggerId)}`, {\n body: toBody(patch),\n query: toQuery({ user_id }),\n });\n },\n async delete(taskId, triggerId, params = {}) {\n await http.request(\"DELETE\", `/tasks/${seg(taskId)}/triggers/${seg(triggerId)}`, {\n query: toQuery(params),\n });\n },\n };\n\n return {\n triggers,\n\n create(params) {\n const { agent_id, teammate_id, ...rest } = params;\n return http.request<Task>(\"POST\", \"/tasks/\", {\n body: toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) }),\n });\n },\n\n async list(params = {}) {\n const { agent_id, teammate_id, ...rest } = params;\n const q = toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) });\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Task>> => {\n const res = await http.request<{ data: Task[]; has_more?: boolean }>(\"GET\", \"/tasks/\", {\n query: toQuery(p),\n });\n return new Page<Task>(res?.data ?? [], res?.has_more ?? false, (starting_after) =>\n fetchPage({ ...p, starting_after }),\n );\n };\n return fetchPage(q);\n },\n\n get(taskId, params = {}) {\n return http.request<Task>(\"GET\", `/tasks/${seg(taskId)}`, { query: toQuery(params) });\n },\n\n update(taskId, params) {\n const { user_id, ...patch } = params;\n return http.request<Task>(\"PATCH\", `/tasks/${seg(taskId)}`, {\n body: toBody(patch),\n query: toQuery({ user_id }),\n });\n },\n\n async delete(taskId, params = {}) {\n await http.request(\"DELETE\", `/tasks/${seg(taskId)}`, { query: toQuery(params) });\n },\n\n run(taskId, params = {}, options) {\n const { idempotencyKey, ...rest } = params;\n return new RunStream(\n http.stream(\"POST\", `/tasks/${seg(taskId)}/runs`, {\n body: toBody({ ...rest, stream: true }),\n headers: idempotencyHeaders(idempotencyKey),\n // Shares the create path's replay handling, so a fix on one side can\n // never silently miss the other.\n onReplay: replayJoin(http),\n }),\n options,\n );\n },\n\n runAsync(taskId, params = {}) {\n const { idempotencyKey, ...rest } = params;\n return http.request<Run>(\"POST\", `/tasks/${seg(taskId)}/runs`, {\n body: toBody({ ...rest, stream: false }),\n headers: idempotencyHeaders(idempotencyKey),\n });\n },\n\n enableWebhook(taskId, params = {}) {\n return http.request<WebhookToggle>(\"POST\", `/tasks/${seg(taskId)}/webhook`, {\n body: {},\n query: toQuery(params),\n });\n },\n\n async disableWebhook(taskId, params = {}) {\n await http.request(\"DELETE\", `/tasks/${seg(taskId)}/webhook`, { query: toQuery(params) });\n },\n };\n}\n","/**\n * `client.webhooks` — outbound event delivery, plus signature verification.\n *\n * `verifySignature` is the one function every webhook receiver needs, so it is\n * also exported standalone from the package root: verifying does not require a\n * client or an API key. Mirrors `sdk/py/m8tes/_resources/webhooks.py` byte for\n * byte on the signing scheme, so a payload verified by one SDK verifies in the\n * other.\n *\n * Scheme: HMAC-SHA256 over `\"{webhook-id}.{webhook-timestamp}.{raw body}\"`, hex,\n * prefixed `v1=`, compared in constant time.\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody } from \"../params\";\nimport { pager } from \"./users\";\nimport type { Webhook, WebhookDelivery } from \"../types\";\n\nexport interface VerifySignatureOptions {\n /**\n * Reject signatures whose timestamp is older (or newer) than this many\n * seconds — replay protection. Omit to skip the check. 300 is a good default\n * for a public endpoint.\n */\n toleranceSeconds?: number;\n /** Injectable clock, for tests. Seconds since epoch. */\n now?: () => number;\n}\n\n/**\n * Verify a m8tes webhook signature.\n *\n * Pass the RAW request body — a parsed-and-restringified object will not match,\n * because JSON.stringify does not preserve key order or spacing.\n *\n * ```ts\n * const raw = await req.text();\n * if (!verifySignature(raw, Object.fromEntries(req.headers), secret, { toleranceSeconds: 300 })) {\n * return new Response(\"bad signature\", { status: 401 });\n * }\n * ```\n */\nexport function verifySignature(\n body: string | Uint8Array,\n headers: Record<string, string | string[] | undefined> | Headers,\n secret: string,\n options: VerifySignatureOptions = {},\n): boolean {\n const get = (name: string): string | undefined => {\n if (typeof (headers as Headers).get === \"function\") {\n return (headers as Headers).get(name) ?? undefined;\n }\n // Header names are case-insensitive on the wire; normalize before lookup.\n const lower = Object.fromEntries(\n Object.entries(headers as Record<string, string | string[] | undefined>).map(([k, v]) => [\n k.toLowerCase(),\n Array.isArray(v) ? v[0] : v,\n ]),\n );\n return lower[name];\n };\n\n const webhookId = get(\"webhook-id\");\n const timestamp = get(\"webhook-timestamp\");\n const signature = get(\"webhook-signature\");\n if (!webhookId || !timestamp || !signature) return false;\n\n if (options.toleranceSeconds !== undefined) {\n const ts = Number.parseInt(timestamp, 10);\n if (!Number.isFinite(ts)) return false;\n const now = options.now ? options.now() : Math.floor(Date.now() / 1000);\n if (Math.abs(now - ts) > options.toleranceSeconds) return false;\n }\n\n const raw = typeof body === \"string\" ? body : new TextDecoder().decode(body);\n const expected = `v1=${createHmac(\"sha256\", secret).update(`${webhookId}.${timestamp}.${raw}`).digest(\"hex\")}`;\n const a = Buffer.from(expected);\n const b = Buffer.from(signature);\n // timingSafeEqual throws on length mismatch; a length difference is already a\n // mismatch, so short-circuit rather than leak it as an exception.\n return a.length === b.length && timingSafeEqual(a, b);\n}\n\nexport interface WebhooksResource {\n verifySignature: typeof verifySignature;\n /** Register an endpoint. The signing secret is returned ONLY here — store it. */\n create(params: { url: string; events?: string[] }): Promise<Webhook>;\n list(params?: { limit?: number; starting_after?: number }): Promise<Page<Webhook>>;\n get(webhookId: number): Promise<Webhook>;\n update(\n webhookId: number,\n params: { url?: string; events?: string[]; active?: boolean },\n ): Promise<Webhook>;\n delete(webhookId: number): Promise<void>;\n /** Delivery attempts, for debugging a receiver that is not getting events. */\n listDeliveries(\n webhookId: number,\n params?: { limit?: number; starting_after?: number },\n ): Promise<Page<WebhookDelivery>>;\n}\n\nexport function createWebhooksResource(http: Http): WebhooksResource {\n return {\n verifySignature,\n\n create(params) {\n return http.request<Webhook>(\"POST\", \"/webhooks/\", { body: toBody({ ...params }) });\n },\n\n list(params = {}) {\n return pager<Webhook>(http, \"/webhooks/\")({ ...params });\n },\n\n get(webhookId) {\n return http.request<Webhook>(\"GET\", `/webhooks/${seg(webhookId)}`);\n },\n\n update(webhookId, params) {\n return http.request<Webhook>(\"PATCH\", `/webhooks/${seg(webhookId)}`, { body: toBody({ ...params }) });\n },\n\n async delete(webhookId) {\n await http.request(\"DELETE\", `/webhooks/${seg(webhookId)}`);\n },\n\n listDeliveries(webhookId, params = {}) {\n return pager<WebhookDelivery>(http, `/webhooks/${seg(webhookId)}/deliveries`)({ ...params });\n },\n };\n}\n","/**\n * `@m8tes/sdk` — TypeScript client for the m8tes API.\n *\n * ```ts\n * import { M8tes } from \"@m8tes/sdk\";\n *\n * const client = new M8tes(); // reads M8TES_API_KEY\n *\n * const run = client.runs.create({\n * message: \"A customer asked to cancel. Draft a warm reply offering to pause instead.\",\n * userId: \"customer_42\", // isolates this end-user's memory, history, and connections\n * });\n * for await (const chunk of run.iterText()) process.stdout.write(chunk);\n * ```\n *\n * SECURITY: this entry point holds your secret `m8_` key and is server-only.\n * Never import it from client-side code. To render an agent in a browser, use\n * `@m8tes/react` plus its server proxy, which keeps the key on your server.\n *\n * The streaming wire protocol lives in `@m8tes/sdk/protocol` (browser-safe, no\n * auth) so this package and `@m8tes/react` share one implementation.\n */\n\nimport { createHttp, DEFAULT_BASE_URL, type ClientOptions, type Http } from \"./http\";\nimport { createAgentsResource, type AgentsResource } from \"./resources/agents\";\nimport { createAppsResource, type AppsResource } from \"./resources/apps\";\nimport { createAccountResource, type AccountResource } from \"./resources/account\";\nimport { createBillingResource, type BillingResource } from \"./resources/billing\";\nimport { createMemoriesResource, type MemoriesResource } from \"./resources/memories\";\nimport { createModelsResource, type ModelsResource } from \"./resources/models\";\nimport {\n createModelConnectionsResource,\n type ModelConnectionsResource,\n} from \"./resources/model-connections\";\nimport { createPermissionsResource, type PermissionsResource } from \"./resources/permissions\";\nimport { createRunsResource, type RunsResource } from \"./resources/runs\";\nimport { createSettingsResource, type SettingsResource } from \"./resources/settings\";\nimport { createTasksResource, type TasksResource } from \"./resources/tasks\";\nimport { createUsersResource, type UsersResource } from \"./resources/users\";\nimport { createWebhooksResource, verifySignature, type WebhooksResource } from \"./resources/webhooks\";\n\n/** Kept in lockstep with package.json \"version\" — guarded by test/version.test.ts. */\nexport const M8TES_SDK_VERSION = \"0.1.0-alpha.2\";\n\nexport class M8tes {\n readonly runs: RunsResource;\n readonly agents: AgentsResource;\n /** Permanent alias for `agents` — the DB model and older docs say \"teammate\". */\n readonly teammates: AgentsResource;\n readonly tasks: TasksResource;\n readonly users: UsersResource;\n readonly apps: AppsResource;\n readonly webhooks: WebhooksResource;\n readonly settings: SettingsResource;\n readonly memories: MemoriesResource;\n readonly permissions: PermissionsResource;\n readonly models: ModelsResource;\n readonly modelConnections: ModelConnectionsResource;\n readonly billing: BillingResource;\n readonly account: AccountResource;\n /** The underlying transport. Use it to call an endpoint this version does not wrap yet. */\n readonly http: Http;\n\n constructor(options: ClientOptions = {}) {\n this.http = createHttp(options);\n this.runs = createRunsResource(this.http);\n this.agents = createAgentsResource(this.http);\n this.teammates = this.agents;\n this.tasks = createTasksResource(this.http);\n this.users = createUsersResource(this.http);\n this.apps = createAppsResource(this.http);\n this.webhooks = createWebhooksResource(this.http);\n this.settings = createSettingsResource(this.http);\n this.memories = createMemoriesResource(this.http);\n this.permissions = createPermissionsResource(this.http);\n this.models = createModelsResource(this.http);\n this.modelConnections = createModelConnectionsResource(this.http);\n this.billing = createBillingResource(this.http);\n this.account = createAccountResource(this.http);\n }\n}\n\n// No default export on purpose: mixing default + named exports makes the CJS\n// build ambiguous (`require(...)` consumers would need `.default`). The one\n// documented form is `import { M8tes } from \"@m8tes/sdk\"`.\n\n// Webhook verification needs no client and no key — import it directly in a\n// route handler that only receives events.\nexport { verifySignature, type VerifySignatureOptions } from \"./resources/webhooks\";\n\n// Transport + client options.\nexport { createHttp, DEFAULT_BASE_URL, type ClientOptions, type FetchLike, type Http } from \"./http\";\n\n// Streaming + pagination.\nexport { RunStream, type RunStreamOptions } from \"./streaming\";\n// Waiting on a run. The error classes are exported so `catch (e) { if (e\n// instanceof RunTimeoutError) ... }` works — without them a caller can only\n// match on a message string.\nexport {\n pollRun,\n waitForRun,\n isPlanApproval,\n planText,\n RunTimeoutError,\n RunPausedError,\n RunWaitAbortedError,\n TERMINAL_STATUSES,\n type PollOptions,\n type WaitOptions,\n} from \"./polling\";\nexport { Page, type ListResponse } from \"./pagination\";\n\n// Resource params + shapes.\nexport type {\n AgentsResource,\n AgentCreateParams,\n AgentUpdateParams,\n AgentListParams,\n} from \"./resources/agents\";\nexport type { AppsResource } from \"./resources/apps\";\nexport type { RunsResource, RunCreateParams, RunListParams } from \"./resources/runs\";\nexport type {\n TasksResource,\n TriggersResource,\n TaskCreateParams,\n TaskUpdateParams,\n TaskListParams,\n TaskRunParams,\n TriggerCreateParams,\n} from \"./resources/tasks\";\nexport type {\n UsersResource,\n EndUserCreateParams,\n EndUserUpdateParams,\n PageParams,\n} from \"./resources/users\";\nexport type { WebhooksResource } from \"./resources/webhooks\";\nexport type {\n SettingsResource,\n AccountSettings,\n AccountSettingsUpdateParams,\n} from \"./resources/settings\";\nexport type * from \"./resources/memories\";\nexport type * from \"./resources/permissions\";\nexport type * from \"./resources/models\";\nexport type * from \"./resources/model-connections\";\nexport type * from \"./resources/billing\";\nexport type * from \"./resources/account\";\nexport * from \"./types\";\n\n// The full wire protocol + typed errors, re-exported so a single import of\n// `@m8tes/sdk` is enough for the common case.\nexport * from \"./protocol/index\";\n"]}
1
+ {"version":3,"sources":["../src/protocol/events.ts","../src/protocol/sse-parser.ts","../src/protocol/normalizer.ts","../src/protocol/accumulator.ts","../src/protocol/errors.ts","../src/protocol/seg.ts","../src/http.ts","../src/pagination.ts","../src/params.ts","../src/resources/agents.ts","../src/resources/apps.ts","../src/resources/account.ts","../src/resources/users.ts","../src/resources/billing.ts","../src/resources/memories.ts","../src/resources/models.ts","../src/resources/model-connections.ts","../src/resources/permissions.ts","../src/mime.ts","../src/polling.ts","../src/streaming.ts","../src/resources/runs.ts","../src/resources/settings.ts","../src/resources/tasks.ts","../src/resources/webhooks.ts","../src/index.ts"],"names":["key","p","str","reject","now","createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @m8tes/react — normalized PUBLIC stream event model.\n *\n * The m8tes V2 backend emits Claude-native FLAT SSE frames (`content_block_delta`,\n * `tool_use`, `permission_request`, `done`, ...). The normalizer (`normalizer.ts`)\n * maps each wire frame to ZERO or MORE events of this stable, versioned\n * discriminated union, keyed on `type`.\n *\n * Type discriminants follow the Vercel AI SDK v5 kebab-case idiom where semantics\n * align (`text-*`, `reasoning-*`, `tool-input-*`, `tool-output-available`) so a\n * future `@m8tes/ai-sdk` adapter maps cleanly. They DIVERGE where m8tes semantics\n * are first-class and have no vanilla-`useChat` analog: human-in-the-loop\n * `approval-request` / `question`, and run rejoin/replay (`run-start` carries\n * runId/runUuid; every terminal path is explicit).\n *\n * Every event carries:\n * - `seq`: a client-assigned monotonic counter. The wire exposes NO SSE `id:`\n * and NO per-event sequence number, so this is assigned by the normalizer and\n * is NOT a dedupe key (see `normalizer.ts` for the domain-id dedupe strategy).\n * - `raw`: the unmodified wire frame, for forward-compatibility.\n *\n * Frames that normalize to nothing renderable (`: keep-alive`, `keep-alive`,\n * `ping`, the duplicate `metadata` preamble frame, `RUNNER_DIAG`, etc.) are\n * dropped by the normalizer and never enter this union.\n *\n * This is a PUBLIC PROTOCOL: once shipped, names are semver-stable. Bump\n * `PROTOCOL_VERSION` on any breaking change to the shape.\n */\n\nexport const PROTOCOL_VERSION = \"m8tes.stream.v2\" as const;\nexport type ProtocolVersion = typeof PROTOCOL_VERSION;\n\n/** Tool/approval state machine (superset of AI SDK v5 tool-part states + HITL). */\nexport type ToolState =\n | \"input-streaming\" // tool-input-start/-delta seen; args still partial JSON\n | \"input-available\" // full input object resolved (standalone tool_use)\n | \"awaiting-approval\" // paused on the m8tes permission gate (HITL)\n | \"output-available\" // tool_result received, not an error\n | \"output-error\" // tool_result with is_error === true\n | \"denied\"; // approval was denied; tool never executed\n\n/** Coarse run status surfaced to the UI. */\nexport type RunStatus =\n | \"connecting\" // sandbox-connecting\n | \"running\" // metadata / message stream flowing\n | \"awaiting_approval\" // paused on a tool permission gate\n | \"awaiting_input\" // paused on AskUserQuestion\n | \"complete\" // done, completion_state === \"complete\"\n | \"incomplete\" // done, completion_state !== \"complete\"\n | \"error\" // terminal error\n | \"cancelled\"; // terminal cancellation\n\nexport interface BaseEvent {\n type: string;\n /** Client-assigned, monotonic per stream. There is NO wire sequence id. */\n seq: number;\n /** The unmodified wire frame this event was normalized from. */\n raw: Record<string, unknown>;\n}\n\n/* ---------- Run lifecycle (m8tes-first-class) ---------- */\n\n/** From the first `metadata` frame. Re-applied (idempotently) on every rejoin. */\nexport interface RunStartEvent extends BaseEvent {\n type: \"run-start\";\n protocolVersion: ProtocolVersion;\n runId: number | null;\n runUuid: string | null;\n mode: \"task\" | \"chat\";\n agentName?: string;\n instanceId?: number;\n taskId?: number;\n status?: string;\n sandbox?: { id: string | null; enabled: boolean };\n}\n\n/** Coarse status transitions (sandbox connect, metadata.status, pause entry). */\nexport interface RunStatusEvent extends BaseEvent {\n type: \"run-status\";\n status: RunStatus;\n message?: string;\n sandboxId?: string | null;\n durationMs?: number;\n}\n\n/** From `run_metrics`. */\nexport interface RunMetricsEvent extends BaseEvent {\n type: \"run-metrics\";\n model: string;\n executionTimeMs: number;\n inputTokens: number;\n outputTokens: number;\n costUsd: number | null; // claude_token_cost_usd\n sdkCostUsd: number | null; // sdk_total_cost_usd (authoritative)\n stopReason: string | null;\n completionState: string;\n unresolvedToolUseIds: string[];\n messageCount: number;\n /** present only when completionState !== \"complete\" */\n diagnostics?: Record<string, unknown>;\n}\n\n/** Terminal success path. From `done`. completionState !== \"complete\" => incomplete run. */\nexport interface RunFinishEvent extends BaseEvent {\n type: \"run-finish\";\n status: \"complete\" | \"incomplete\";\n completionState: string;\n unresolvedToolUseIds: string[];\n stopReason: string | null;\n terminalCompletionSeen: boolean;\n messageCount: number;\n}\n\n/** Structured failure codes carried on the wire as a dedicated `type`. */\nexport type RunErrorCode =\n | \"SANDBOX_BOOT_TIMEOUT\"\n | \"SANDBOX_QUOTA_EXHAUSTED\"\n | \"SANDBOX_UNAVAILABLE\"\n | \"SNAPSHOT_VERSION_MISMATCH\"\n | \"AGENT_RUNNER_DIED\"\n | \"RUNNER_LIFECYCLE_ERROR\";\n\n/** Terminal failure path. From `error`, `sdk_error`, `AGENT_RUNNER_DIED`, SANDBOX_*, SNAPSHOT_VERSION_MISMATCH. */\nexport interface RunErrorEvent extends BaseEvent {\n type: \"run-error\";\n error: string;\n message: string;\n /** structured failure code when the wire type was a coded failure, else null */\n code: RunErrorCode | null;\n fatal: true;\n /** HTTP status when the failure was an API (non-stream) error, e.g. 402/429 */\n apiStatus?: number;\n /** v2 envelope `error.details` — carries machine codes like\n * `error_code: \"END_USER_RATE_LIMITED\"` plus `retry_after`/`period_end` */\n apiDetails?: Record<string, unknown>;\n}\n\n/** Terminal cancellation. From `cancelled`. */\nexport interface RunCancelledEvent extends BaseEvent {\n type: \"run-cancelled\";\n runId?: number | null;\n}\n\n/* ---------- Message lifecycle ---------- */\n\nexport interface MessageStartEvent extends BaseEvent {\n type: \"message-start\";\n messageId: string;\n role: \"assistant\";\n usage?: { inputTokens: number; outputTokens: number };\n}\n\n/** From `message_stop` or `message_complete`. */\nexport interface MessageEndEvent extends BaseEvent {\n type: \"message-end\";\n messageId: string;\n usage?: { inputTokens: number; outputTokens: number };\n}\n\n/* ---------- Text ---------- */\n\nexport interface TextStartEvent extends BaseEvent {\n type: \"text-start\";\n id: string; // canonical block id (dedupe key)\n messageId: string;\n}\nexport interface TextDeltaEvent extends BaseEvent {\n type: \"text-delta\";\n id: string; // block id\n delta: string;\n messageId: string;\n}\nexport interface TextEndEvent extends BaseEvent {\n type: \"text-end\"; // inferred from content_block_stop on a text block\n id: string;\n messageId: string;\n}\n\n/* ---------- Reasoning (thinking + reasoning, one first-class part) ---------- */\n\nexport interface ReasoningStartEvent extends BaseEvent {\n type: \"reasoning-start\";\n id: string;\n messageId: string;\n}\nexport interface ReasoningDeltaEvent extends BaseEvent {\n type: \"reasoning-delta\";\n id: string;\n delta: string;\n messageId: string;\n}\nexport interface ReasoningEndEvent extends BaseEvent {\n type: \"reasoning-end\";\n id: string;\n messageId: string;\n}\n\n/* ---------- Plan (m8tes plan-mode; no AI SDK analog) ---------- */\n\nexport interface PlanStartEvent extends BaseEvent {\n type: \"plan-start\";\n id: string;\n messageId: string;\n}\nexport interface PlanDeltaEvent extends BaseEvent {\n type: \"plan-delta\";\n id: string;\n delta: string;\n messageId: string;\n}\nexport interface PlanEndEvent extends BaseEvent {\n type: \"plan-end\";\n id: string;\n messageId: string;\n}\n\n/* ---------- Tool-call lifecycle (AI SDK v5 idiom) ---------- */\n\nexport interface ToolInputStartEvent extends BaseEvent {\n type: \"tool-input-start\";\n toolCallId: string; // dedupe key\n toolName: string;\n messageId: string;\n state: \"input-streaming\";\n}\nexport interface ToolInputDeltaEvent extends BaseEvent {\n type: \"tool-input-delta\";\n toolCallId: string;\n inputTextDelta: string; // incremental partial-JSON STRING\n state: \"input-streaming\";\n}\nexport interface ToolInputAvailableEvent extends BaseEvent {\n type: \"tool-input-available\";\n toolCallId: string;\n toolName: string;\n input: unknown; // parsed object (from standalone tool_use.input)\n state: \"input-available\";\n}\nexport interface ToolOutputAvailableEvent extends BaseEvent {\n type: \"tool-output-available\";\n toolCallId: string; // from tool_result.tool_use_id\n output: unknown; // content (preferred) or result\n isError: boolean; // from is_error\n state: \"output-available\" | \"output-error\";\n}\n\n/* ---------- Human-in-the-loop (first-class, unlike vanilla useChat) ---------- */\n\n/** Tool approval gate. From `awaiting_approval` (toolName !== \"AskUserQuestion\") or `permission_request`. */\nexport interface ApprovalRequestEvent extends BaseEvent {\n type: \"approval-request\";\n requestId: string; // dedupe key\n toolCallId?: string; // the paused tool_use id when correlatable\n toolName: string;\n toolInput: unknown;\n timeoutSeconds: number;\n}\n/** Derived on resume / from the answer round-trip; surfaced for state reconciliation. */\nexport interface ApprovalResolvedEvent extends BaseEvent {\n type: \"approval-resolved\";\n requestId: string;\n resolved: \"approved\" | \"denied\";\n}\n\n/** AskUserQuestion gate. From `awaiting_approval` where toolName === \"AskUserQuestion\". */\nexport interface QuestionOption {\n label: string;\n description?: string;\n}\nexport interface QuestionItem {\n question: string;\n /** Real wire options are `{label, description}` objects; the normalizer also\n * coerces bare-string options into `{label}` defensively. */\n options?: QuestionOption[];\n [k: string]: unknown;\n}\nexport interface QuestionEvent extends BaseEvent {\n type: \"question\";\n requestId: string; // dedupe key\n toolCallId: string; // AskUserQuestion tool_use id; answer returns as tool-output-available for this id\n questions: QuestionItem[];\n timeoutSeconds: number;\n}\n\n/* ---------- Sandbox + non-fatal notices ---------- */\n\n/** From `sandbox-connecting` / `sandbox-connected`. (Fatal sandbox failures => RunErrorEvent with `code`.) */\nexport interface SandboxStatusEvent extends BaseEvent {\n type: \"sandbox-status\";\n phase: \"connecting\" | \"connected\";\n message: string;\n runId: number | null;\n sandboxId?: string | null;\n durationMs?: number;\n}\n\n/** Non-fatal diagnostics: stderr, mcp_error/mcp_auth_failed (warning), rate_limit, system_message. */\nexport interface NoticeEvent extends BaseEvent {\n type: \"notice\";\n level: \"info\" | \"warning\";\n source: \"stderr\" | \"mcp\" | \"rate_limit\" | \"system\";\n message: string;\n detail?: string;\n}\n\n/** From `compact_boundary`: the SDK summarized the conversation history. */\nexport interface CompactBoundaryEvent extends BaseEvent {\n type: \"compact-boundary\";\n trigger: \"manual\" | \"auto\";\n preTokens: number;\n}\n\n/* ---------- Passthrough ---------- */\n\n/**\n * Any wire type with no normalized mapping (`sdk_content_snapshot`, `user_message`,\n * `compact_boundary`, and future/unknown types). `raw` is preserved so consumers\n * and a newer normalizer can recover the original. Forward-compat: a new backend\n * event surfaces here instead of crashing.\n */\nexport interface UnknownEvent extends BaseEvent {\n type: \"unknown\";\n wireType: string; // the original wire `type` string (\"\" if absent)\n}\n\nexport type M8tesStreamEvent =\n | RunStartEvent\n | RunStatusEvent\n | RunMetricsEvent\n | RunFinishEvent\n | RunErrorEvent\n | RunCancelledEvent\n | MessageStartEvent\n | MessageEndEvent\n | TextStartEvent\n | TextDeltaEvent\n | TextEndEvent\n | ReasoningStartEvent\n | ReasoningDeltaEvent\n | ReasoningEndEvent\n | PlanStartEvent\n | PlanDeltaEvent\n | PlanEndEvent\n | ToolInputStartEvent\n | ToolInputDeltaEvent\n | ToolInputAvailableEvent\n | ToolOutputAvailableEvent\n | ApprovalRequestEvent\n | ApprovalResolvedEvent\n | QuestionEvent\n | SandboxStatusEvent\n | NoticeEvent\n | CompactBoundaryEvent\n | UnknownEvent;\n\nexport type M8tesStreamEventType = M8tesStreamEvent[\"type\"];\n\n/** Terminal events end a stream. */\nexport const TERMINAL_EVENT_TYPES = [\n \"run-finish\",\n \"run-error\",\n \"run-cancelled\",\n] as const satisfies readonly M8tesStreamEventType[];\nexport type TerminalEventType = (typeof TERMINAL_EVENT_TYPES)[number];\n\n/** True for the three terminal event types. */\nexport function isTerminalEvent(\n event: M8tesStreamEvent,\n): event is RunFinishEvent | RunErrorEvent | RunCancelledEvent {\n return (TERMINAL_EVENT_TYPES as readonly string[]).includes(event.type);\n}\n","/**\n * SSE wire decoder: raw bytes/text -> wire frame objects.\n *\n * Layer 1 of the pipeline (Layer 2 is `normalizer.ts`). This module ONLY knows\n * the SSE envelope + JSON, never the m8tes event semantics.\n *\n * chunk(s) ─push─► [ frame split on blank line ] ─► [ data: lines ]\n * ─► [ concatenated-JSON split ] ─► JSON.parse ─► wire object\n *\n * Wire facts it handles (from the streaming contract):\n * - Frames are separated by a blank line; `\\r\\n` is normalized to `\\n`.\n * - A line starting with `:` is an SSE comment (keepalive) — ignored.\n * - A frame may carry one or more `data:` lines (joined with `\\n` per spec).\n * - A single `data:` payload may glue MULTIPLE complete JSON objects together\n * (observed in the app stream); they are split with a string-aware brace\n * scanner — NOT a naive `}{` regex, which breaks on braces inside strings.\n * - Invalid JSON in a completed frame is DROPPED (reported via `onMalformed`),\n * never thrown — a corrupt frame must not kill the stream (contract §7).\n */\n\nexport interface SseParserOptions {\n /**\n * Called for each `data:` payload (or split piece) that fails to parse as JSON.\n * Default: no-op. Wire this to telemetry; do NOT throw from it.\n */\n onMalformed?: (rawPayload: string, error: unknown) => void;\n}\n\ntype WireFrame = Record<string, unknown>;\n\n/** Split a payload into top-level JSON object/array substrings, string-aware. */\nexport function splitConcatenatedJson(payload: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let inString = false;\n let escaped = false;\n let start = -1;\n let lastEnd = 0; // index just past the last emitted top-level value\n\n for (let i = 0; i < payload.length; i++) {\n const ch = payload.charAt(i);\n if (start === -1) {\n if (ch === \"{\" || ch === \"[\") {\n start = i;\n depth = 1;\n inString = false;\n escaped = false;\n }\n continue; // skip whitespace/junk before a value\n }\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') {\n inString = true;\n } else if (ch === \"{\" || ch === \"[\") {\n depth++;\n } else if (ch === \"}\" || ch === \"]\") {\n depth--;\n if (depth === 0) {\n out.push(payload.slice(start, i + 1));\n start = -1;\n lastEnd = i + 1;\n }\n }\n }\n\n if (start !== -1) {\n // Unterminated trailing object: emit so it fails parse loudly (reported).\n out.push(payload.slice(start));\n } else {\n // Residue after the last complete value (or a bare primitive when no value\n // was found): emit it so corruption reaches onMalformed instead of vanishing.\n const tail = payload.slice(lastEnd).trim();\n if (tail !== \"\") out.push(tail);\n }\n return out;\n}\n\n/** Extract the joined `data:` payload from one SSE frame, or null if it has none. */\nfunction frameDataPayload(frameText: string): string | null {\n const dataLines: string[] = [];\n for (const rawLine of frameText.split(\"\\n\")) {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n if (line === \"\" || line.charAt(0) === \":\") continue; // blank / comment\n if (line.startsWith(\"data:\")) {\n let value = line.slice(5);\n if (value.charAt(0) === \" \") value = value.slice(1); // drop one space\n dataLines.push(value);\n }\n // other SSE fields (event:/id:/retry:) are unused by m8tes — ignore.\n }\n if (dataLines.length === 0) return null;\n return dataLines.join(\"\\n\");\n}\n\nfunction parsePayload(\n payload: string,\n onMalformed: SseParserOptions[\"onMalformed\"],\n): WireFrame[] {\n const out: WireFrame[] = [];\n for (const candidate of splitConcatenatedJson(payload)) {\n try {\n const parsed: unknown = JSON.parse(candidate);\n if (parsed !== null && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n out.push(parsed as WireFrame);\n } else {\n // Arrays / primitives are not valid wire frames (flat objects only).\n onMalformed?.(candidate, new Error(\"frame is not a JSON object\"));\n }\n } catch (err) {\n onMalformed?.(candidate, err);\n }\n }\n return out;\n}\n\n/**\n * Stateful streaming decoder. Feed it response-body chunks (any size, split\n * mid-frame); it returns the wire frames completed by each chunk. Call `flush()`\n * once the stream ends to drain a trailing frame that had no closing blank line.\n */\nexport function createSseDecoder(opts: SseParserOptions = {}) {\n // `buf` holds normalized text plus, possibly, a single trailing raw `\\r` that\n // we cannot yet normalize: a CRLF can be split across chunk boundaries\n // (`...\\r` | `\\n...`). Eagerly turning a lone trailing `\\r` into `\\n` would\n // fabricate a `\\n\\n` frame boundary and corrupt a multi-line frame.\n let buf = \"\";\n\n function ingest(chunk: string): void {\n buf += chunk;\n let tail = \"\";\n if (buf.endsWith(\"\\r\")) {\n tail = \"\\r\"; // hold it for the next chunk\n buf = buf.slice(0, -1);\n }\n buf = buf.replace(/\\r\\n?/g, \"\\n\") + tail;\n }\n\n function drain(final: boolean): WireFrame[] {\n const frames: WireFrame[] = [];\n let sep = buf.indexOf(\"\\n\\n\");\n while (sep !== -1) {\n const frameText = buf.slice(0, sep);\n buf = buf.slice(sep + 2);\n const payload = frameDataPayload(frameText);\n if (payload !== null) frames.push(...parsePayload(payload, opts.onMalformed));\n sep = buf.indexOf(\"\\n\\n\");\n }\n if (final && buf.trim() !== \"\") {\n const payload = frameDataPayload(buf);\n if (payload !== null) frames.push(...parsePayload(payload, opts.onMalformed));\n buf = \"\";\n }\n return frames;\n }\n\n return {\n /** Feed a chunk; returns the wire frames it completed. */\n push(chunk: string): WireFrame[] {\n ingest(chunk);\n return drain(false);\n },\n /** Flush a trailing unterminated frame at end-of-stream. */\n flush(): WireFrame[] {\n if (buf.endsWith(\"\\r\")) buf = `${buf.slice(0, -1)}\\n`; // EOL at end-of-stream\n return drain(true);\n },\n };\n}\n\n/** Convenience: parse a whole SSE string into wire frames (used by fixtures/tests). */\nexport function parseSse(text: string, opts: SseParserOptions = {}): WireFrame[] {\n const dec = createSseDecoder(opts);\n return [...dec.push(text), ...dec.flush()];\n}\n","/**\n * Normalizer: wire frames -> public M8tesStreamEvent[].\n *\n * Layer 2 of the pipeline (Layer 1 = `sse-parser.ts`). Each wire frame maps to\n * ZERO or MORE public events. The normalizer owns:\n * - `seq`: a monotonic counter stamped on every emitted event (no wire seq id).\n * - dedupe: a domain-id `open`/`seen` ledger so a `/stream` rejoin that\n * re-streams blocks + re-sends a message_snapshot + re-sends a pending\n * permission_request renders EXACTLY ONCE (streaming contract §dedupeStrategy).\n *\n * One normalizer instance is kept ALIVE across a reconnect (the hook reuses it),\n * so `seen` persists and replayed content is dropped. Idempotent-apply rules:\n * - START events: skip if the key is already open or seen.\n * - DELTA events: drop if the key is in `seen` (finalized) — a replayed delta\n * for a closed block. A bare key not yet seen is lazily opened (tolerates a\n * trimmed replay prefix).\n * - END / result / terminal / approval events: finalize, move key to `seen`;\n * a second occurrence is a no-op.\n *\n * Unknown/unmapped wire types pass through as `UnknownEvent` (never throw).\n */\n\nimport {\n PROTOCOL_VERSION,\n type M8tesStreamEvent,\n type QuestionItem,\n type QuestionOption,\n type RunErrorCode,\n} from \"./events\";\n\ntype WireFrame = Record<string, unknown>;\n/** Distributive Omit — preserves each union member's discriminant-specific\n * fields (plain `Omit<Union, K>` collapses a union to its common keys). */\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown\n ? Omit<T, K>\n : never;\ntype Emitted = DistributiveOmit<M8tesStreamEvent, \"seq\" | \"raw\">;\n\nconst ASK_USER_QUESTION = \"AskUserQuestion\";\n\nconst SANDBOX_ERROR_CODES: ReadonlySet<string> = new Set<RunErrorCode>([\n \"SANDBOX_BOOT_TIMEOUT\",\n \"SANDBOX_QUOTA_EXHAUSTED\",\n \"SANDBOX_UNAVAILABLE\",\n \"SNAPSHOT_VERSION_MISMATCH\",\n \"AGENT_RUNNER_DIED\",\n \"RUNNER_LIFECYCLE_ERROR\",\n]);\n\n/* ---- tiny safe field accessors over the loosely-typed wire ---- */\nconst str = (o: WireFrame, k: string): string | undefined =>\n typeof o[k] === \"string\" ? (o[k] as string) : undefined;\nconst num = (o: WireFrame, k: string): number | undefined =>\n typeof o[k] === \"number\" ? (o[k] as number) : undefined;\nconst bool = (o: WireFrame, k: string): boolean | undefined =>\n typeof o[k] === \"boolean\" ? (o[k] as boolean) : undefined;\nconst obj = (o: WireFrame, k: string): WireFrame | undefined => {\n const v = o[k];\n return v !== null && typeof v === \"object\" && !Array.isArray(v)\n ? (v as WireFrame)\n : undefined;\n};\nconst arr = (o: WireFrame, k: string): unknown[] | undefined =>\n Array.isArray(o[k]) ? (o[k] as unknown[]) : undefined;\n\ntype BlockKind = \"text\" | \"reasoning\" | \"plan\" | \"tool_use\" | \"other\";\n\nfunction blockKindFromType(t: string | undefined): BlockKind {\n switch (t) {\n case \"text\":\n return \"text\";\n case \"thinking\":\n case \"reasoning\":\n return \"reasoning\";\n case \"plan\":\n return \"plan\";\n case \"tool_use\":\n case \"server_tool_use\":\n return \"tool_use\";\n default:\n return \"other\";\n }\n}\n\nconst blockEndType = {\n text: \"text-end\",\n reasoning: \"reasoning-end\",\n plan: \"plan-end\",\n} as const;\nconst blockStartType = {\n text: \"text-start\",\n reasoning: \"reasoning-start\",\n plan: \"plan-start\",\n} as const;\nconst blockDeltaType = {\n text: \"text-delta\",\n reasoning: \"reasoning-delta\",\n plan: \"plan-delta\",\n} as const;\n\nexport interface Normalizer {\n /** Map one wire frame to zero+ public events (seq-stamped, in order). */\n push(frame: WireFrame): M8tesStreamEvent[];\n /** Discard all dedupe/lifecycle state (e.g. starting a brand-new run). */\n reset(): void;\n}\n\nexport function createNormalizer(): Normalizer {\n let seq = 0;\n let open = new Set<string>();\n let seen = new Set<string>();\n let blockKind = new Map<string, BlockKind>();\n let currentMessageId: string | null = null;\n let activeTextBlockId: string | null = null;\n let lastToolId: string | null = null; // last non-question tool_use block id\n let lastQuestionToolId: string | null = null;\n // Whether any text/reasoning/plan content streamed this run — an id-less\n // snapshot block then duplicates it (the runtime only synthesizes a content\n // snapshot when nothing streamed). Run-global on purpose: replayed blocks can\n // arrive before their message_start, so a per-message key can mismatch.\n let anyContentStreamed = false;\n let runStartEmitted = false;\n let terminalEmitted = false;\n\n function reset() {\n seq = 0;\n open = new Set();\n seen = new Set();\n blockKind = new Map();\n currentMessageId = null;\n activeTextBlockId = null;\n lastToolId = null;\n lastQuestionToolId = null;\n anyContentStreamed = false;\n runStartEmitted = false;\n terminalEmitted = false;\n }\n\n function emitContentBlockStart(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"id\");\n if (!id) return;\n const kind = blockKindFromType(str(f, \"block_type\") ?? str(f, \"type\"));\n const key = kind === \"tool_use\" ? `tool:${id}` : `block:${id}`;\n if (open.has(key) || seen.has(key)) return; // replayed start\n blockKind.set(id, kind);\n if (kind === \"tool_use\") {\n const name = str(f, \"name\") ?? \"\";\n if (name === ASK_USER_QUESTION) lastQuestionToolId = id;\n else lastToolId = id;\n open.add(key);\n out.push({\n type: \"tool-input-start\",\n toolCallId: id,\n toolName: name,\n messageId: currentMessageId ?? \"\",\n state: \"input-streaming\",\n });\n } else if (kind === \"text\" || kind === \"reasoning\" || kind === \"plan\") {\n open.add(key);\n if (kind === \"text\") activeTextBlockId = id;\n anyContentStreamed = true;\n out.push({\n type: blockStartType[kind],\n id,\n messageId: currentMessageId ?? \"\",\n });\n }\n // kind \"other\" (tool_result block start, etc.): no public start event.\n }\n\n function emitContentBlockDelta(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"id\");\n if (!id) return;\n const delta = obj(f, \"delta\");\n if (!delta) return;\n const dType = str(delta, \"type\");\n\n if (dType === \"input_json_delta\") {\n const key = `tool:${id}`;\n if (seen.has(key)) return; // finalized tool, replayed delta\n const partial = str(delta, \"partial_json\") ?? \"\";\n if (partial === \"\") return;\n if (!open.has(key)) {\n // tolerate a trimmed tool start: lazily open so content_block_stop\n // finalizes tool:{id} into `seen` and a rejoin's replayed deltas drop.\n open.add(key);\n blockKind.set(id, \"tool_use\");\n }\n out.push({\n type: \"tool-input-delta\",\n toolCallId: id,\n inputTextDelta: partial,\n state: \"input-streaming\",\n });\n return;\n }\n\n let kind: \"text\" | \"reasoning\" | \"plan\" | null = null;\n if (dType === \"text_delta\") kind = \"text\";\n else if (dType === \"thinking_delta\" || dType === \"reasoning_delta\")\n kind = \"reasoning\";\n else if (dType === \"plan_delta\") kind = \"plan\";\n if (!kind) return; // signature_delta, output_json_delta, etc. -> ignore\n\n const key = `block:${id}`;\n if (seen.has(key)) return; // finalized block, replayed delta\n // Content key varies by delta type on the real wire (mirrors the runtime\n // accumulator): thinking_delta carries `thinking`, plan_delta carries\n // `text` or `plan`, text_delta carries `text`.\n const text =\n kind === \"reasoning\"\n ? (str(delta, \"thinking\") ?? str(delta, \"text\") ?? \"\")\n : kind === \"plan\"\n ? (str(delta, \"text\") ?? str(delta, \"plan\") ?? \"\")\n : (str(delta, \"text\") ?? \"\");\n if (text === \"\") return; // empty delta is a no-op\n if (!open.has(key)) {\n // tolerate a trimmed replay prefix: lazily open the block\n open.add(key);\n blockKind.set(id, kind);\n if (kind === \"text\") activeTextBlockId = id;\n anyContentStreamed = true;\n }\n out.push({ type: blockDeltaType[kind], id, delta: text, messageId: currentMessageId ?? \"\" });\n }\n\n function emitContentBlockStop(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"id\");\n if (!id) return;\n const kind = blockKind.get(id) ?? \"other\";\n if (kind === \"tool_use\") {\n seen.add(`tool:${id}`);\n open.delete(`tool:${id}`);\n return; // input streaming closed; resolved input arrives via standalone tool_use\n }\n if (kind === \"text\" || kind === \"reasoning\" || kind === \"plan\") {\n const key = `block:${id}`;\n open.delete(key);\n if (seen.has(key)) return; // replayed stop for an already-finalized block\n seen.add(key);\n if (activeTextBlockId === id) activeTextBlockId = null;\n out.push({ type: blockEndType[kind], id, messageId: currentMessageId ?? \"\" });\n }\n }\n\n function emitMessageDelta(f: WireFrame, out: Emitted[]): void {\n const delta = obj(f, \"delta\");\n if (!delta) return;\n const text = str(delta, \"text\") ?? \"\";\n if (text === \"\" || !activeTextBlockId) return; // empty / no active block (replay)\n const key = `block:${activeTextBlockId}`;\n if (seen.has(key)) return;\n out.push({\n type: \"text-delta\",\n id: activeTextBlockId,\n delta: text,\n messageId: currentMessageId ?? \"\",\n });\n }\n\n function emitStandaloneToolUse(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"id\");\n if (!id) return;\n const name = str(f, \"name\") ?? \"\";\n if (name === ASK_USER_QUESTION) lastQuestionToolId = id;\n else if (name) lastToolId = id;\n if (\"input\" in f) {\n const key = `toolinput:${id}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push({\n type: \"tool-input-available\",\n toolCallId: id,\n toolName: name,\n input: f[\"input\"],\n state: \"input-available\",\n });\n } else {\n const partial = str(f, \"input_text\");\n if (partial && !seen.has(`tool:${id}`)) {\n out.push({\n type: \"tool-input-delta\",\n toolCallId: id,\n inputTextDelta: partial,\n state: \"input-streaming\",\n });\n }\n }\n }\n\n function emitToolResult(f: WireFrame, out: Emitted[]): void {\n const id = str(f, \"tool_use_id\");\n if (!id) return;\n const key = `tool_result:${id}`;\n if (seen.has(key)) return;\n seen.add(key);\n const isError = bool(f, \"is_error\") ?? false;\n const output = \"content\" in f ? f[\"content\"] : f[\"result\"];\n out.push({\n type: \"tool-output-available\",\n toolCallId: id,\n output,\n isError,\n state: isError ? \"output-error\" : \"output-available\",\n });\n }\n\n /** awaiting_approval / permission_request -> approval-request OR question. */\n function emitApprovalGate(f: WireFrame, out: Emitted[]): void {\n const requestId = str(f, \"request_id\");\n if (!requestId) return;\n const toolName = str(f, \"tool_name\") ?? \"\";\n const timeoutSeconds = num(f, \"timeout_seconds\") ?? 0;\n const toolInput = f[\"tool_input\"];\n if (toolName === ASK_USER_QUESTION) {\n const key = `question:${requestId}`;\n if (seen.has(key)) return;\n seen.add(key);\n const ti = obj(f, \"tool_input\");\n const questions = ((ti && arr(ti, \"questions\")) ?? []).flatMap((q): QuestionItem[] => {\n if (q === null || typeof q !== \"object\") return [];\n const qq = q as WireFrame;\n // Real wire options are `{label, description}` objects; coerce bare\n // strings defensively and drop anything without a label.\n const options = (arr(qq, \"options\") ?? []).flatMap((o): QuestionOption[] => {\n if (typeof o === \"string\") return [{ label: o }];\n if (o === null || typeof o !== \"object\") return [];\n const label = str(o as WireFrame, \"label\");\n if (!label) return [];\n const description = str(o as WireFrame, \"description\");\n return [description === undefined ? { label } : { label, description }];\n });\n return [{ ...qq, question: str(qq, \"question\") ?? \"\", options }];\n });\n out.push({\n type: \"question\",\n requestId,\n toolCallId: str(f, \"tool_use_id\") ?? lastQuestionToolId ?? \"\",\n questions,\n timeoutSeconds,\n });\n } else {\n const key = `approval:${requestId}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push({\n type: \"approval-request\",\n requestId,\n // The frame's own tool_use_id is authoritative (live awaiting_approval\n // carries it; rejoin permission_request does too as of the run_join\n // fix). The last-tool inference is only a fallback — with PARALLEL tool\n // calls it can name the wrong tool.\n toolCallId: str(f, \"tool_use_id\") ?? lastToolId ?? undefined,\n toolName,\n toolInput,\n timeoutSeconds,\n });\n }\n }\n\n /** message_snapshot: reconstruct ONLY blocks not already rendered. Real\n * snapshot text/thinking/plan blocks carry NO `id` (they're the runtime\n * accumulator's typed blocks, e.g. `{\"type\":\"thinking\",\"thinking\":...}`) —\n * for those we synthesize a stable positional key and reconstruct only when\n * this message streamed no content (the synthetic final snapshot on the\n * CLI-error path, or a fully-trimmed rejoin); if content DID stream, an\n * id-less snapshot block is a copy of it and is dropped. */\n function emitSnapshot(f: WireFrame, out: Emitted[]): void {\n const messageId = str(f, \"message_id\") ?? currentMessageId ?? \"\";\n const blocks = arr(f, \"content_blocks\") ?? [];\n for (let i = 0; i < blocks.length; i++) {\n const raw = blocks[i];\n if (raw === null || typeof raw !== \"object\") continue;\n const b = raw as WireFrame;\n const bType = str(b, \"type\");\n const kind = blockKindFromType(bType);\n if (kind === \"text\" || kind === \"reasoning\" || kind === \"plan\") {\n let id = str(b, \"id\");\n if (!id) {\n if (anyContentStreamed) continue; // copy of already-streamed content\n id = `${messageId}:snap:${i}`; // stable across a replayed snapshot\n }\n const key = `block:${id}`;\n if (seen.has(key)) continue; // already finalized -> drop the snapshot copy\n if (open.has(key)) {\n // streamed but not yet closed (orphan / trimmed stop): finalize ONLY,\n // do not re-emit start+content on top of what already rendered.\n open.delete(key);\n seen.add(key);\n if (activeTextBlockId === id) activeTextBlockId = null;\n out.push({ type: blockEndType[kind], id, messageId });\n continue;\n }\n // never seen: reconstruct from the snapshot (trimmed-prefix replay or\n // snapshot-only output). Content key varies by block type (runtime\n // accumulator shape): text -> `text`, thinking -> `thinking`, plan -> `plan`.\n seen.add(key);\n out.push({ type: blockStartType[kind], id, messageId });\n const text =\n kind === \"reasoning\"\n ? (str(b, \"thinking\") ?? str(b, \"text\") ?? \"\")\n : kind === \"plan\"\n ? (str(b, \"plan\") ?? str(b, \"text\") ?? \"\")\n : (str(b, \"text\") ?? \"\");\n if (text !== \"\") out.push({ type: blockDeltaType[kind], id, delta: text, messageId });\n out.push({ type: blockEndType[kind], id, messageId });\n } else if (bType === \"tool_use\") {\n const id = str(b, \"id\");\n if (!id || seen.has(`toolinput:${id}`)) continue;\n seen.add(`toolinput:${id}`);\n out.push({\n type: \"tool-input-available\",\n toolCallId: id,\n toolName: str(b, \"name\") ?? \"\",\n input: b[\"input\"],\n state: \"input-available\",\n });\n } else if (bType === \"tool_result\") {\n const id = str(b, \"tool_use_id\");\n if (!id || seen.has(`tool_result:${id}`)) continue;\n seen.add(`tool_result:${id}`);\n const isError = bool(b, \"is_error\") ?? false;\n out.push({\n type: \"tool-output-available\",\n toolCallId: id,\n output: \"content\" in b ? b[\"content\"] : b[\"result\"],\n isError,\n state: isError ? \"output-error\" : \"output-available\",\n });\n }\n }\n }\n\n function emitNotice(\n out: Emitted[],\n level: \"info\" | \"warning\",\n source: \"stderr\" | \"mcp\" | \"rate_limit\" | \"system\",\n message: string,\n detail?: string,\n ): void {\n out.push(detail === undefined ? { type: \"notice\", level, source, message } : { type: \"notice\", level, source, message, detail });\n }\n\n function handle(frame: WireFrame, out: Emitted[]): void {\n const type = str(frame, \"type\") ?? \"\";\n\n switch (type) {\n /* ---- dropped no-ops ---- */\n case \"keep-alive\":\n case \"ping\":\n case \"RUNNER_DIAG\":\n case \"sdk_init\":\n case \"sandbox_metrics\":\n return;\n\n /* ---- run lifecycle ---- */\n case \"metadata\": {\n if (runStartEmitted) return; // duplicate preamble / rejoin re-synth\n runStartEmitted = true;\n const sandboxId = str(frame, \"sandbox_id\") ?? null;\n const sandboxEnabled = bool(frame, \"sandbox_enabled\") ?? false;\n out.push({\n type: \"run-start\",\n protocolVersion: PROTOCOL_VERSION,\n runId: num(frame, \"run_id\") ?? null,\n runUuid: str(frame, \"run_uuid\") ?? null,\n mode: str(frame, \"mode\") === \"task\" ? \"task\" : \"chat\",\n ...(str(frame, \"agent_name\") ? { agentName: str(frame, \"agent_name\") } : {}),\n ...(num(frame, \"instance_id\") !== undefined ? { instanceId: num(frame, \"instance_id\") } : {}),\n ...(num(frame, \"task_id\") !== undefined ? { taskId: num(frame, \"task_id\") } : {}),\n ...(str(frame, \"status\") ? { status: str(frame, \"status\") } : {}),\n sandbox: { id: sandboxId, enabled: sandboxEnabled },\n });\n return;\n }\n case \"run_metrics\": {\n out.push({\n type: \"run-metrics\",\n model: str(frame, \"model\") ?? \"\",\n executionTimeMs: num(frame, \"execution_time_ms\") ?? 0,\n inputTokens: num(frame, \"input_tokens_used\") ?? 0,\n outputTokens: num(frame, \"output_tokens_used\") ?? 0,\n costUsd: num(frame, \"claude_token_cost_usd\") ?? null,\n sdkCostUsd: num(frame, \"sdk_total_cost_usd\") ?? null,\n stopReason: str(frame, \"stop_reason\") ?? null,\n completionState: str(frame, \"completion_state\") ?? \"\",\n unresolvedToolUseIds: (arr(frame, \"unresolved_tool_use_ids\") ?? []).filter(\n (x): x is string => typeof x === \"string\",\n ),\n messageCount: num(frame, \"message_count\") ?? 0,\n ...(obj(frame, \"diagnostics\") ? { diagnostics: obj(frame, \"diagnostics\") } : {}),\n });\n return;\n }\n case \"done\": {\n if (terminalEmitted) return;\n terminalEmitted = true;\n const completionState = str(frame, \"completion_state\") ?? \"complete\";\n out.push({\n type: \"run-finish\",\n status: completionState === \"complete\" ? \"complete\" : \"incomplete\",\n completionState,\n unresolvedToolUseIds: (arr(frame, \"unresolved_tool_use_ids\") ?? []).filter(\n (x): x is string => typeof x === \"string\",\n ),\n stopReason: str(frame, \"stop_reason\") ?? null,\n terminalCompletionSeen: bool(frame, \"terminal_completion_seen\") ?? false,\n messageCount: num(frame, \"message_count\") ?? 0,\n });\n return;\n }\n case \"cancelled\": {\n if (terminalEmitted) return;\n terminalEmitted = true;\n out.push({ type: \"run-cancelled\", runId: num(frame, \"run_id\") ?? null });\n return;\n }\n case \"error\":\n case \"AGENT_RUNNER_DIED\":\n case \"RUNNER_LIFECYCLE_ERROR\":\n case \"SANDBOX_BOOT_TIMEOUT\":\n case \"SANDBOX_QUOTA_EXHAUSTED\":\n case \"SANDBOX_UNAVAILABLE\":\n case \"SNAPSHOT_VERSION_MISMATCH\": {\n if (terminalEmitted) return;\n terminalEmitted = true;\n const code = SANDBOX_ERROR_CODES.has(type) ? (type as RunErrorCode) : null;\n out.push({\n type: \"run-error\",\n error: str(frame, \"error\") ?? str(frame, \"message\") ?? type,\n message: str(frame, \"message\") ?? \"Agent execution failed\",\n code,\n fatal: true,\n });\n return;\n }\n case \"sdk_error\": {\n // Ambiguous terminality in the legacy parser — treat as a non-fatal\n // warning notice so the UI doesn't dead-end on a recoverable error.\n emitNotice(out, \"warning\", \"system\", str(frame, \"error\") ?? \"SDK error\");\n return;\n }\n case \"sdk_success\": {\n // The SDK ResultMessage. On an Anthropic-side failure (quota exhausted,\n // oauth revoked, model unavailable, ...) the wire STILL ends with\n // `done` + completion_state \"complete\", but the backend marks the run\n // failed from `is_error` — surface the failure here so the client\n // doesn't report a failed run as complete. (terminalEmitted then\n // suppresses the misleading `done`.) Non-error results stay unknown\n // passthrough bookkeeping.\n if (bool(frame, \"is_error\") !== true) {\n out.push({ type: \"unknown\", wireType: type }); // bookkeeping passthrough (as before)\n return;\n }\n if (terminalEmitted) return;\n terminalEmitted = true;\n out.push({\n type: \"run-error\",\n error: str(frame, \"subtype\") ?? \"sdk_error\",\n message: str(frame, \"result\") ?? \"The model provider returned an error.\",\n code: null,\n fatal: true,\n });\n return;\n }\n\n /* ---- message lifecycle ---- */\n case \"message_start\": {\n const msg = obj(frame, \"message\");\n const id = (msg && str(msg, \"id\")) ?? str(frame, \"message_id\");\n if (!id) return;\n currentMessageId = id;\n const key = `message:${id}`;\n if (seen.has(key)) return;\n seen.add(key);\n const usage = msg && obj(msg, \"usage\");\n out.push({\n type: \"message-start\",\n messageId: id,\n role: \"assistant\",\n ...(usage\n ? { usage: { inputTokens: num(usage, \"input_tokens\") ?? 0, outputTokens: num(usage, \"output_tokens\") ?? 0 } }\n : {}),\n });\n return;\n }\n case \"message_stop\":\n case \"message_complete\": {\n const id = str(frame, \"message_id\") ?? currentMessageId;\n if (!id) return;\n const key = `message:${id}:end`;\n if (seen.has(key)) return;\n seen.add(key);\n const usage = obj(frame, \"usage\");\n out.push({\n type: \"message-end\",\n messageId: id,\n ...(usage\n ? { usage: { inputTokens: num(usage, \"input_tokens\") ?? 0, outputTokens: num(usage, \"output_tokens\") ?? 0 } }\n : {}),\n });\n return;\n }\n case \"message_snapshot\":\n emitSnapshot(frame, out);\n return;\n\n /* ---- content blocks ---- */\n case \"content_block_start\":\n emitContentBlockStart(frame, out);\n return;\n case \"content_block_delta\":\n emitContentBlockDelta(frame, out);\n return;\n case \"content_block_stop\":\n emitContentBlockStop(frame, out);\n return;\n case \"message_delta\":\n emitMessageDelta(frame, out);\n return;\n\n /* ---- tools ---- */\n case \"tool_use\":\n emitStandaloneToolUse(frame, out);\n return;\n case \"tool_result\":\n emitToolResult(frame, out);\n return;\n\n /* ---- standalone reasoning / plan: passthrough as `unknown` for v1 ----\n * These top-level (non-content_block) frames carry full content with no\n * wire id, so they cannot be deduped across a rejoin and two bursts would\n * collide on a synthetic id. Block-based reasoning (content_block\n * reasoning_delta) is the dedupe-safe path and IS handled. Surface these\n * raw until their real wire behavior is confirmed (CONTRACT.md open Q). */\n\n /* ---- HITL ---- */\n case \"awaiting_approval\":\n case \"permission_request\":\n emitApprovalGate(frame, out);\n return;\n\n /* ---- sandbox + notices ---- */\n case \"sandbox-connecting\":\n out.push({\n type: \"sandbox-status\",\n phase: \"connecting\",\n message: str(frame, \"message\") ?? \"Connecting to sandbox\",\n runId: num(frame, \"run_id\") ?? null,\n });\n return;\n case \"sandbox-connected\":\n out.push({\n type: \"sandbox-status\",\n phase: \"connected\",\n message: str(frame, \"message\") ?? \"Connected to sandbox\",\n runId: num(frame, \"run_id\") ?? null,\n ...(str(frame, \"sandbox_id\") !== undefined ? { sandboxId: str(frame, \"sandbox_id\") } : {}),\n ...(num(frame, \"duration_ms\") !== undefined ? { durationMs: num(frame, \"duration_ms\") } : {}),\n });\n return;\n case \"stderr\":\n emitNotice(out, \"info\", \"stderr\", str(frame, \"message\") ?? \"\");\n return;\n case \"mcp_error\":\n case \"mcp_auth_failed\":\n emitNotice(out, \"warning\", \"mcp\", str(frame, \"message\") ?? str(frame, \"error\") ?? \"MCP error\", str(frame, \"detail\"));\n return;\n case \"rate_limit\": {\n const info = obj(frame, \"rate_limit_info\");\n const status = (info && str(info, \"status\")) ?? \"allowed\";\n emitNotice(out, status === \"rejected\" ? \"warning\" : \"info\", \"rate_limit\", `Rate limit: ${status}`);\n return;\n }\n case \"compact_boundary\":\n out.push({\n type: \"compact-boundary\",\n trigger: str(frame, \"trigger\") === \"manual\" ? \"manual\" : \"auto\",\n preTokens: num(frame, \"pre_tokens\") ?? 0,\n });\n return;\n\n /* ---- passthrough ---- */\n default:\n out.push({ type: \"unknown\", wireType: type });\n return;\n }\n }\n\n return {\n push(frame: WireFrame): M8tesStreamEvent[] {\n const partials: Emitted[] = [];\n handle(frame, partials);\n return partials.map(\n (e) => ({ ...e, seq: seq++, raw: frame }) as M8tesStreamEvent,\n );\n },\n reset,\n };\n}\n","/**\n * Accumulator: the normalized event stream -> renderable conversation state.\n *\n * Pure + immutable (new state object on every change) so React can re-render via\n * useState/useSyncExternalStore. Framework-agnostic — `useMate` wraps it. It\n * assumes the normalizer has already deduped (so each event is \"new\"); it only\n * folds events into messages/parts + run status + pending HITL.\n *\n * Lazy creation: a `text-delta`/`tool-*` with no preceding start (a trimmed\n * replay prefix) lazily creates its message/part, so a partial rejoin still\n * renders rather than dropping content.\n */\n\nimport type {\n ApprovalRequestEvent,\n M8tesStreamEvent,\n QuestionEvent,\n RunStatus,\n ToolState,\n} from \"./events\";\n\nexport type TextLikeKind = \"text\" | \"reasoning\" | \"plan\";\n\nexport interface TextPart {\n kind: TextLikeKind;\n id: string;\n text: string;\n}\nexport interface ToolPart {\n kind: \"tool\";\n toolCallId: string;\n toolName: string;\n state: ToolState;\n inputText: string; // accumulated partial-JSON while streaming\n input?: unknown; // resolved input object\n output?: unknown; // tool result\n isError?: boolean;\n}\n/** Non-fatal diagnostics rendered as a quiet inline row (mcp auth failures,\n * rate limits) — the platform surfaces these; silence hides real failures. */\nexport interface NoticePart {\n kind: \"notice\";\n id: string;\n level: \"info\" | \"warning\";\n source: string;\n message: string;\n}\n/** Sandbox lifecycle pill (\"connecting to environment\" -> \"environment ready\"). */\nexport interface SandboxPart {\n kind: \"sandbox\";\n id: string;\n phase: \"connecting\" | \"connected\";\n durationMs?: number;\n}\n/** Conversation-summarized divider (SDK auto/manual compaction). */\nexport interface CompactPart {\n kind: \"compact\";\n id: string;\n trigger: \"manual\" | \"auto\";\n preTokens: number;\n}\nexport type MatePart = TextPart | ToolPart | NoticePart | SandboxPart | CompactPart;\n\nexport interface MateMessage {\n id: string;\n role: \"assistant\" | \"user\";\n parts: MatePart[];\n}\n\nexport type MateStatus = \"idle\" | RunStatus;\n\nexport interface ConversationState {\n runId: number | null;\n runUuid: string | null;\n agentName: string | null;\n status: MateStatus;\n messages: MateMessage[];\n pendingApproval: ApprovalRequestEvent | null;\n pendingQuestion: QuestionEvent | null;\n /** From run-metrics: \"refusal\" | \"max_tokens\" render a quiet outcome row\n * (\"Request declined\" / \"Response truncated\"); anything else is null. */\n finishStopReason: \"refusal\" | \"max_tokens\" | null;\n error: {\n message: string;\n code: string | null;\n /** HTTP status for API errors (402 limit / 429 rate) */\n apiStatus?: number;\n /** v2 `error.details` (machine `error_code`, `retry_after`, `period_end`, ...) */\n apiDetails?: Record<string, unknown>;\n } | null;\n}\n\nexport const initialConversationState: ConversationState = {\n runId: null,\n runUuid: null,\n agentName: null,\n status: \"idle\",\n messages: [],\n pendingApproval: null,\n pendingQuestion: null,\n finishStopReason: null,\n error: null,\n};\n\nfunction lastAssistantIndex(messages: MateMessage[]): number {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === \"assistant\") return i;\n }\n return -1;\n}\n\n/** Get-or-create a message and replace its parts via `fn`. */\nfunction withMessageParts(\n state: ConversationState,\n messageId: string,\n role: \"assistant\" | \"user\",\n fn: (parts: MatePart[]) => MatePart[],\n): ConversationState {\n const messages = state.messages.slice();\n let idx = messageId\n ? messages.findIndex((m) => m.id === messageId)\n : lastAssistantIndex(messages);\n if (idx === -1) {\n messages.push({ id: messageId || `m:${messages.length}`, role, parts: [] });\n idx = messages.length - 1;\n }\n const msg = messages[idx]!;\n messages[idx] = { ...msg, parts: fn(msg.parts) };\n return { ...state, messages };\n}\n\nconst isTextLike = (p: MatePart): p is TextPart =>\n p.kind === \"text\" || p.kind === \"reasoning\" || p.kind === \"plan\";\n\nfunction ensureTextPart(parts: MatePart[], kind: TextLikeKind, id: string): MatePart[] {\n if (parts.some((p) => isTextLike(p) && p.id === id)) return parts;\n return [...parts, { kind, id, text: \"\" }];\n}\n\nfunction applyTextDelta(\n parts: MatePart[],\n kind: TextLikeKind,\n id: string,\n delta: string,\n): MatePart[] {\n const i = parts.findIndex((p) => isTextLike(p) && p.id === id);\n if (i === -1) return [...parts, { kind, id, text: delta }];\n const p = parts[i] as TextPart;\n const next = parts.slice();\n next[i] = { ...p, text: p.text + delta };\n return next;\n}\n\n/** Find a tool part by id across ALL messages (results pair across messages). */\nfunction updateToolPart(\n state: ConversationState,\n toolCallId: string,\n toolName: string | undefined,\n patch: (p: ToolPart) => ToolPart,\n): ConversationState {\n const messages = state.messages.slice();\n for (let mi = 0; mi < messages.length; mi++) {\n const parts = messages[mi]!.parts;\n const pi = parts.findIndex((p) => p.kind === \"tool\" && p.toolCallId === toolCallId);\n if (pi !== -1) {\n const np = parts.slice();\n np[pi] = patch(parts[pi] as ToolPart);\n messages[mi] = { ...messages[mi]!, parts: np };\n return { ...state, messages };\n }\n }\n // not found: lazily create in the last assistant message (or a new one)\n let idx = lastAssistantIndex(messages);\n if (idx === -1) {\n messages.push({ id: `m:${messages.length}`, role: \"assistant\", parts: [] });\n idx = messages.length - 1;\n }\n const base: ToolPart = {\n kind: \"tool\",\n toolCallId,\n toolName: toolName ?? \"\",\n state: \"input-streaming\",\n inputText: \"\",\n };\n messages[idx] = { ...messages[idx]!, parts: [...messages[idx]!.parts, patch(base)] };\n return { ...state, messages };\n}\n\n/** A paused run resumes the moment content flows again. */\nfunction resume(status: MateStatus): MateStatus {\n return status === \"awaiting_approval\" || status === \"awaiting_input\" ? \"running\" : status;\n}\n\nexport function accumulate(\n state: ConversationState,\n e: M8tesStreamEvent,\n): ConversationState {\n switch (e.type) {\n case \"run-start\":\n return {\n ...state,\n runId: e.runId,\n runUuid: e.runUuid,\n agentName: e.agentName ?? state.agentName ?? null,\n status: \"running\",\n error: null,\n // A retry re-drives the turn: the previous attempt's outcome row\n // (\"Response truncated\", \"Request declined\") must not survive it.\n finishStopReason: null,\n };\n case \"run-status\":\n return { ...state, status: e.status };\n case \"message-start\":\n return withMessageParts(state, e.messageId, e.role, (p) => p);\n case \"text-start\":\n return {\n ...withMessageParts(state, e.messageId, \"assistant\", (p) => ensureTextPart(p, \"text\", e.id)),\n status: resume(state.status),\n };\n case \"text-delta\":\n return {\n ...withMessageParts(state, e.messageId, \"assistant\", (p) => applyTextDelta(p, \"text\", e.id, e.delta)),\n status: resume(state.status),\n };\n case \"reasoning-start\":\n return withMessageParts(state, e.messageId, \"assistant\", (p) => ensureTextPart(p, \"reasoning\", e.id));\n case \"reasoning-delta\":\n return withMessageParts(state, e.messageId, \"assistant\", (p) => applyTextDelta(p, \"reasoning\", e.id, e.delta));\n case \"plan-start\":\n return withMessageParts(state, e.messageId, \"assistant\", (p) => ensureTextPart(p, \"plan\", e.id));\n case \"plan-delta\":\n return withMessageParts(state, e.messageId, \"assistant\", (p) => applyTextDelta(p, \"plan\", e.id, e.delta));\n case \"text-end\":\n case \"reasoning-end\":\n case \"plan-end\":\n case \"message-end\":\n return state;\n case \"tool-input-start\":\n return {\n ...withMessageParts(state, e.messageId, \"assistant\", (p) =>\n p.some((x) => x.kind === \"tool\" && x.toolCallId === e.toolCallId)\n ? p\n : [\n ...p,\n {\n kind: \"tool\",\n toolCallId: e.toolCallId,\n toolName: e.toolName,\n state: \"input-streaming\",\n inputText: \"\",\n },\n ],\n ),\n status: resume(state.status),\n };\n case \"tool-input-delta\":\n return updateToolPart(state, e.toolCallId, undefined, (t) => ({\n ...t,\n inputText: t.inputText + e.inputTextDelta,\n state: \"input-streaming\",\n }));\n case \"tool-input-available\":\n return updateToolPart(state, e.toolCallId, e.toolName, (t) => ({\n ...t,\n input: e.input,\n state: \"input-available\",\n }));\n case \"tool-output-available\": {\n const s = updateToolPart(state, e.toolCallId, undefined, (t) => ({\n ...t,\n output: e.output,\n isError: e.isError,\n state: e.state,\n }));\n const pendingApproval =\n s.pendingApproval && s.pendingApproval.toolCallId === e.toolCallId ? null : s.pendingApproval;\n const pendingQuestion =\n s.pendingQuestion && s.pendingQuestion.toolCallId === e.toolCallId ? null : s.pendingQuestion;\n return { ...s, pendingApproval, pendingQuestion, status: resume(s.status) };\n }\n case \"approval-request\":\n return { ...state, pendingApproval: e, status: \"awaiting_approval\" };\n case \"approval-resolved\":\n return state.pendingApproval && state.pendingApproval.requestId === e.requestId\n ? { ...state, pendingApproval: null }\n : state;\n case \"question\":\n return { ...state, pendingQuestion: e, status: \"awaiting_input\" };\n case \"run-finish\":\n return { ...state, status: e.status, pendingApproval: null, pendingQuestion: null };\n case \"run-error\":\n return {\n ...state,\n status: \"error\",\n error: {\n message: e.message,\n code: e.code,\n ...(e.apiStatus !== undefined ? { apiStatus: e.apiStatus } : {}),\n ...(e.apiDetails !== undefined ? { apiDetails: e.apiDetails } : {}),\n },\n pendingApproval: null,\n pendingQuestion: null,\n };\n case \"run-cancelled\":\n return { ...state, status: \"cancelled\", pendingApproval: null, pendingQuestion: null };\n case \"sandbox-status\": {\n // Inline lifecycle pill: \"connecting\" appends; \"connected\" upgrades the\n // open connecting pill in place (adding the boot duration) so one boot\n // renders as one row, platform-style.\n const withStatus =\n e.phase === \"connecting\" && state.status === \"idle\" ? { ...state, status: \"connecting\" as const } : state;\n if (e.phase === \"connecting\") {\n return withMessageParts(withStatus, \"\", \"assistant\", (p) => [\n ...p,\n { kind: \"sandbox\", id: `sb:${p.length}`, phase: \"connecting\" },\n ]);\n }\n const messages = withStatus.messages.slice();\n for (let mi = messages.length - 1; mi >= 0; mi--) {\n const parts = messages[mi]!.parts;\n for (let pi = parts.length - 1; pi >= 0; pi--) {\n const part = parts[pi]!;\n if (part.kind === \"sandbox\" && part.phase === \"connecting\") {\n const np = parts.slice();\n np[pi] = { ...part, phase: \"connected\", ...(e.durationMs !== undefined ? { durationMs: e.durationMs } : {}) };\n messages[mi] = { ...messages[mi]!, parts: np };\n return { ...withStatus, messages };\n }\n }\n }\n return withMessageParts(withStatus, \"\", \"assistant\", (p) => [\n ...p,\n { kind: \"sandbox\", id: `sb:${p.length}`, phase: \"connected\", ...(e.durationMs !== undefined ? { durationMs: e.durationMs } : {}) },\n ]);\n }\n case \"notice\":\n // Platform parity: only WARNING diagnostics surface (MCP auth failures,\n // rejected rate limits). Info chatter (stderr, allowed rate limits) is\n // dropped HERE rather than hidden in the view — a part that renders null\n // still occupies a row in the thread's flex column and injects a phantom\n // gap. Raw `notice` events still reach headless consumers via `onEvent`.\n if (e.level !== \"warning\") return state;\n return withMessageParts(state, \"\", \"assistant\", (p) => [\n ...p,\n { kind: \"notice\", id: `n:${p.length}`, level: e.level, source: e.source, message: e.message },\n ]);\n case \"compact-boundary\":\n return withMessageParts(state, \"\", \"assistant\", (p) => [\n ...p,\n { kind: \"compact\", id: `c:${p.length}`, trigger: e.trigger, preTokens: e.preTokens },\n ]);\n case \"run-metrics\":\n return e.stopReason === \"refusal\" || e.stopReason === \"max_tokens\"\n ? { ...state, finishStopReason: e.stopReason }\n : state;\n case \"unknown\":\n return state;\n default:\n return state;\n }\n}\n\n/** Stateful convenience wrapper for the hook (holds the running snapshot). */\nexport interface Accumulator {\n readonly state: ConversationState;\n apply(event: M8tesStreamEvent): ConversationState;\n /** Optimistically append the user's own message (shown immediately on send). */\n addUserMessage(text: string): ConversationState;\n reset(): void;\n}\n\nexport function createAccumulator(): Accumulator {\n let state = initialConversationState;\n return {\n get state() {\n return state;\n },\n apply(event) {\n state = accumulate(state, event);\n return state;\n },\n addUserMessage(text) {\n const id = `u:${state.messages.length}`;\n state = {\n ...state,\n messages: [...state.messages, { id, role: \"user\", parts: [{ kind: \"text\", id, text }] }],\n };\n return state;\n },\n reset() {\n state = initialConversationState;\n },\n };\n}\n","/**\n * Typed error hierarchy for the m8tes V2 API — ONE implementation shared by\n * `@m8tes/sdk` (API-key client) and `@m8tes/react` (browser proxy client).\n *\n * Mirrors the Python SDK's `sdk/py/m8tes/_exceptions.py` so the two languages\n * behave identically: same status→class map, same `docUrl`/`errorCode`/\n * `retryAfter`/`details` fields, just camelCase.\n *\n * The wire envelope is standardized across every /api/v2 route\n * (`fastapi/app/routers/v2/_errors.py`):\n *\n * { \"error\": { \"message\", \"type\", \"code\", \"request_id\", \"doc_url\",\n * \"details\": { \"error_code\": \"...\", ...context } } }\n *\n * Note `error.code` is the int HTTP status by design; the machine-readable app\n * code (e.g. \"RUN_LIMIT_REACHED\", \"END_USER_RATE_LIMITED\") lives at\n * `error.details.error_code` and is surfaced here as `errorCode`.\n *\n * No auth and no `node:` imports live in this file — it ships in browser\n * bundles via `@m8tes/sdk/protocol`.\n */\n\nexport interface ApiErrorFields {\n /** Envelope `error.type`, e.g. \"authentication_error\". */\n type: string;\n /** Envelope `error.code` — the int HTTP status (kept for wire fidelity). */\n code: number;\n /** HTTP status of the response. */\n status: number;\n /** `error.request_id`, else the `x-request-id` response header. Quote this in bug reports. */\n requestId?: string;\n /** Full `error.details` object: actionable context (runs_used, period_end, ...). */\n details?: unknown;\n /** `error.doc_url` — docs deep link for this error type. */\n docUrl?: string;\n /** `error.details.error_code` — machine-readable app code for branching. */\n errorCode?: string;\n /** Seconds from the `Retry-After` header. Set on 429; undefined when absent or an HTTP-date. */\n retryAfter?: number;\n}\n\n/** Base class for every API error. Catch this to catch them all. */\nexport class M8tesApiError extends Error {\n readonly type: string;\n readonly code: number;\n readonly status: number;\n readonly requestId?: string;\n readonly details?: unknown;\n readonly docUrl?: string;\n readonly errorCode?: string;\n readonly retryAfter?: number;\n\n constructor(message: string, f: ApiErrorFields) {\n super(message);\n this.name = \"M8tesApiError\";\n this.type = f.type;\n this.code = f.code;\n this.status = f.status;\n this.requestId = f.requestId;\n this.details = f.details;\n this.docUrl = f.docUrl;\n this.errorCode = f.errorCode;\n this.retryAfter = f.retryAfter;\n }\n}\n\n/** 400 or 422 — invalid request. Check `.status` to tell them apart. */\nexport class ValidationError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"ValidationError\";\n }\n}\n\n/** 401 — missing, malformed, or revoked API key. */\nexport class AuthenticationError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"AuthenticationError\";\n }\n}\n\n/** 402 — billing limit reached or subscription issue. `.details` carries the caps. */\nexport class BillingError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"BillingError\";\n }\n}\n\n/** 403 — authenticated but not allowed. */\nexport class PermissionDeniedError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"PermissionDeniedError\";\n }\n}\n\n/** 404 — no such resource, or it belongs to another account/end-user. */\nexport class NotFoundError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"NotFoundError\";\n }\n}\n\n/** 409 — conflicting state. */\nexport class ConflictError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"ConflictError\";\n }\n}\n\n/**\n * 409 from `GET /runs/{id}/stream` — the run is no longer executing, so there is\n * nothing to join. The caller should fall back to `runs.get(id)` for the final\n * result rather than treating this as a failure.\n */\nexport class RunNotStreamingError extends ConflictError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"RunNotStreamingError\";\n }\n}\n\n/** 429 — too many requests. Honour `.retryAfter` before retrying. */\nexport class RateLimitError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"RateLimitError\";\n }\n}\n\n/** 500+ — server-side error. Safe to retry idempotent requests. */\nexport class APIError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"APIError\";\n }\n}\n\n/**\n * A stream completed but emitted error events (expired credential, provider rate\n * limit, quota exhaustion). Raised so a failed run is never mistaken for a\n * successful empty one. `.details.errors` holds the raw messages.\n */\nexport class RunFailedError extends M8tesApiError {\n constructor(message: string, f: ApiErrorFields) {\n super(message, f);\n this.name = \"RunFailedError\";\n }\n}\n\n/** Status → class. Mirrors `STATUS_MAP` in the Python SDK. */\nconst STATUS_MAP: Record<number, new (message: string, f: ApiErrorFields) => M8tesApiError> = {\n 400: ValidationError,\n 401: AuthenticationError,\n 402: BillingError,\n 403: PermissionDeniedError,\n 404: NotFoundError,\n 409: ConflictError,\n 422: ValidationError,\n 429: RateLimitError,\n};\n\n/** `Retry-After` in seconds. An HTTP-date (or garbage) yields undefined, matching Python. */\nexport function parseRetryAfter(raw: string | null | undefined): number | undefined {\n if (!raw) return undefined;\n const seconds = Number(raw);\n return Number.isFinite(seconds) ? seconds : undefined;\n}\n\nfunction str(o: Record<string, unknown>, key: string): string | undefined {\n return typeof o[key] === \"string\" ? (o[key] as string) : undefined;\n}\n\n/**\n * Pull the standardized envelope out of a parsed error body.\n *\n * Tolerant by design: a proxy, a CDN, or a non-v2 route can return HTML, an\n * empty body, or a bare `{detail: ...}`, and callers still get a usable error\n * with the right status rather than a SyntaxError.\n */\nexport function parseErrorEnvelope(\n status: number,\n body: unknown,\n headers?: { get(name: string): string | null },\n): { message: string; fields: ApiErrorFields } {\n const e =\n body !== null && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"object\"\n ? ((body as { error: Record<string, unknown> }).error ?? {})\n : {};\n const details = e[\"details\"];\n const errorCode =\n details !== null && typeof details === \"object\"\n ? str(details as Record<string, unknown>, \"error_code\")\n : undefined;\n return {\n message: str(e, \"message\") ?? `Request failed (${status})`,\n fields: {\n type: str(e, \"type\") ?? \"api_error\",\n code: typeof e[\"code\"] === \"number\" ? (e[\"code\"] as number) : status,\n status,\n requestId: str(e, \"request_id\") ?? headers?.get(\"x-request-id\") ?? undefined,\n details,\n docUrl: str(e, \"doc_url\"),\n errorCode,\n retryAfter: parseRetryAfter(headers?.get(\"retry-after\")),\n },\n };\n}\n\nexport interface ErrorFromResponseOptions {\n /**\n * Map 409 to `RunNotStreamingError` (the \"run already finished, fall back to\n * runs.get()\" signal) instead of the generic `ConflictError`. Set on stream\n * requests, where 409 has exactly that meaning.\n */\n conflictIsNotStreaming?: boolean;\n}\n\n/** The error class a status maps to. Exported so clients that build their own\n * message (e.g. the SDK's base-URL diagnostics) still get the right type. */\nexport function errorClassForStatus(\n status: number,\n opts: ErrorFromResponseOptions = {},\n): new (message: string, f: ApiErrorFields) => M8tesApiError {\n if (status === 409 && opts.conflictIsNotStreaming) return RunNotStreamingError;\n // Python: `STATUS_MAP.get(status, APIError)` — ANY unmapped status (405, 418,\n // 5xx) becomes APIError. Falling back to the bare base class here would mean a\n // 405 caught as APIError in Python slips through the same `catch` in\n // TypeScript. Pinned by test/parity.test.ts.\n return STATUS_MAP[status] ?? APIError;\n}\n\n/**\n * Build the right typed error from a non-OK `Response`. Consumes the body.\n */\nexport async function errorFromResponse(\n res: Response,\n opts: ErrorFromResponseOptions = {},\n): Promise<M8tesApiError> {\n let body: unknown;\n try {\n body = await res.json();\n } catch {\n body = undefined;\n }\n const { message, fields } = parseErrorEnvelope(res.status, body, res.headers);\n const Cls = errorClassForStatus(res.status, opts);\n return new Cls(message, fields);\n}\n","/**\n * `seg()` — turn ONE caller-supplied value into a single, inescapable URL path\n * segment. Mirrors the Python SDK's `sdk/py/m8tes/_http.py::seg` exactly; the\n * shared corpus `sdk/py/tests/data/path_encoding_parity.json` pins both halves.\n *\n * Every dynamic `/`-delimited segment this SDK (and `@m8tes/react`) puts in a\n * path goes through this. The values are frequently tenant-controlled (an\n * end-user id, an app slug, a run's filename), and interpolating one straight\n * into a template literal lets it steer the request somewhere the method never\n * named — the compile-time `number` type is erased at runtime, so a JS\n * consumer, a value off `JSON.parse`, or one `as any` reaches it. Measured\n * before this landed: `runs.get(\"5/messages\")` reached `GET /runs/{id}/messages`,\n * and `tasks.delete(\"5/webhook\")` would destroy a webhook token instead of\n * archiving the task.\n *\n * Two mechanisms, because percent-encoding alone does NOT confine the route:\n *\n * 1. REFUSE anything that would still be structural after the server decodes.\n * uvicorn sets the ASGI path to the percent-DECODED path and Starlette\n * routes on that, so `%2F` is a separator to the server even though it is\n * not one to `fetch`. `/` is therefore rejected, as are `\"\"`, `\".\"` and\n * `\"..\"`, which address the collection or the parent rather than a resource.\n * 2. PERCENT-ENCODE the rest, so the value stays one opaque segment: `?` and\n * `#` would otherwise start a query or a fragment.\n *\n * It throws `ValidationError` (nothing was sent, so `.status` is 0), keeping an\n * existing `catch (e) { if (e instanceof M8tesApiError) ... }` working.\n *\n * Known cosmetic divergence from Python: `encodeURIComponent` leaves `!*'()`\n * literal where Python's `quote(safe=\"\")` escapes them. Both decode to the same\n * segment server-side and neither can leave it — asserted route-aware by the\n * parity corpus rather than waved through.\n *\n * Lives under `protocol/` because it is browser-safe (no credential, no\n * `node:*`) and `@m8tes/react`'s proxy client builds the same paths.\n */\n\nimport { ValidationError } from \"./errors\";\n\n// A segment that is one of these cannot name a resource, and each one silently\n// addresses a DIFFERENT one instead — `\"\"` and `\".\"` collapse onto the\n// collection route, `\"..\"` onto the parent.\nconst UNADDRESSABLE = new Set([\"\", \".\", \"..\"]);\n\n// The one character that becomes a path SEPARATOR at the server. Escaping it is\n// not enough (see above), so it is refused. A BACKSLASH is deliberately NOT\n// refused — it is a legal character in a filename and an id, and measured\n// against this stack it stays inside its segment; it is percent-encoded like\n// any other reserved character (same call as Python).\nconst SEPARATOR = \"/\";\n\nfunction reject(value: string, reason: string): never {\n throw new ValidationError(\n `${JSON.stringify(value)} cannot be used as a URL path segment: ${reason}. ` +\n \"Percent-encoding does not help — the server decodes the path before routing it.\",\n { type: \"invalid_request_error\", code: 0, status: 0 },\n );\n}\n\n/** One caller-supplied value → one safe path segment, or a `ValidationError`. */\nexport function seg(value: unknown): string {\n if (value === null || value === undefined) {\n reject(String(value), \"an id of null or undefined is a caller bug, not a resource name\");\n }\n const text = String(value);\n if (UNADDRESSABLE.has(text)) {\n reject(text, \"it addresses the parent or the collection, not a resource\");\n }\n if (text.includes(SEPARATOR)) {\n reject(text, \"a '/' becomes a real path separator once the server decodes it\");\n }\n return encodeURIComponent(text);\n}\n","/**\n * Server-side transport for the m8tes V2 API.\n *\n * SECURITY: this module holds the secret `m8_` API key and must NEVER reach a\n * browser bundle. Client-side rendering of an agent goes through\n * `@m8tes/react` + its server proxy, which keeps the key on the server. The\n * bundle-boundary test asserts `dist/protocol/index.js` contains none of this.\n *\n * Retry semantics mirror the Python SDK (`sdk/py/m8tes/_http.py`) exactly so the\n * two languages behave the same under load:\n * - 3 attempts total, 0.5s initial backoff, doubling\n * - retry only 429/500/502/503/504\n * - retry GET/HEAD/PUT/DELETE/OPTIONS always, and a POST only when it carries\n * an `Idempotency-Key`. Without one, a POST that timed out may already have\n * started a billable run, so re-sending it could double-charge; with one, the\n * server replays the run it already created, which is why the run-creating\n * calls mint a key on every request.\n * - honour `Retry-After` on 429\n */\n\nimport {\n APIError,\n errorClassForStatus,\n parseErrorEnvelope,\n parseRetryAfter,\n type ErrorFromResponseOptions,\n type M8tesApiError,\n type M8tesStreamEvent,\n type Normalizer,\n createNormalizer,\n createSseDecoder,\n} from \"./protocol/index\";\n\n/** Canonical hosted API. Includes the `/api/v2` prefix, like the Python SDK's DEFAULT_BASE_URL. */\nexport const DEFAULT_BASE_URL = \"https://api.m8tes.ai/api/v2\";\n\nconst MAX_ATTEMPTS = 3;\nconst INITIAL_BACKOFF_MS = 500;\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\nconst IDEMPOTENT_METHODS = new Set([\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\"]);\n\n/** Makes a POST safe to repeat: the server replays the run the first one created. */\nexport const IDEMPOTENCY_HEADER = \"idempotency-key\";\n/** Set by the API when a response is a replay rather than a fresh result. */\nexport const REPLAY_HEADER = \"idempotent-replay\";\n\n/**\n * The ONLY routes whose POST the server makes idempotent.\n *\n * Retry eligibility checks this as well as the header, because the header alone is\n * not evidence the server will honour it. `new M8tes({headers: {\"Idempotency-Key\":\n * …}})` sets it on EVERY request, which would make every POST retryable —\n * including `tasks.create`, which has no server-side idempotency, so a timed-out\n * create would be re-sent and duplicate the task. Found in review.\n *\n * Matched against the path RELATIVE to baseUrl, and fully anchored. An earlier\n * version matched suffixes, which also accepted `/foo/reply` and `/foo/runs` — and\n * `request()`/`raw()` are public, so an unsupported path could have been retried on\n * a route that ignores the key. Anchoring is the whole point of the check, so it\n * must not be approximate.\n */\nconst IDEMPOTENT_POST_PATHS = [\n /^\\/runs\\/?$/,\n /^\\/runs\\/with-files\\/?$/,\n /^\\/runs\\/\\d+\\/reply\\/?$/,\n /^\\/runs\\/\\d+\\/reply\\/with-files\\/?$/,\n /^\\/tasks\\/\\d+\\/runs\\/?$/,\n];\n\nfunction isIdempotentRoute(path: string): boolean {\n const clean = path.split(\"?\")[0] ?? \"\";\n return IDEMPOTENT_POST_PATHS.some((re) => re.test(clean));\n}\n\n/**\n * Whether this request may be re-sent after a timeout or 5xx.\n *\n * Mirrors `_is_retryable` in the Python SDK (`sdk/py/m8tes/_http.py`) so the two\n * languages behave identically under load. Header names are compared lowercased\n * because `mergeHeaders` normalises them — a caller writing `Idempotency-Key`\n * must get retries just like one writing `idempotency-key`.\n */\nfunction isRetryable(method: string, path: string, headers: Record<string, string>): boolean {\n if (IDEMPOTENT_METHODS.has(method.toUpperCase())) return true;\n return IDEMPOTENCY_HEADER in headers && isIdempotentRoute(path);\n}\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface ClientOptions {\n /** Your `m8_` key. Defaults to `process.env.M8TES_API_KEY`. */\n apiKey?: string;\n /** Override the API host. Must include the `/api/v2` prefix. */\n baseUrl?: string;\n /** Per-request timeout in ms. Default 300_000 (5 min), matching the Python SDK. */\n timeout?: number;\n /** Extra headers on every request. */\n headers?: Record<string, string>;\n /** Pluggable fetch, for tests or a custom agent/proxy. Default `globalThis.fetch`. */\n fetch?: FetchLike;\n /** Reported (not thrown) when a stream frame is unparseable. */\n onMalformed?: (rawPayload: string, error: unknown) => void;\n}\n\nexport interface RequestOptions {\n body?: unknown;\n query?: string;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n /**\n * Send as multipart/form-data instead of JSON. Used by the file-upload route.\n * `fetch` sets its own `content-type` with the boundary, so we must NOT set\n * one — a hand-written header omits the boundary and the server cannot parse\n * the body.\n */\n form?: FormData;\n}\n\nexport interface StreamRequestOptions extends RequestOptions {\n /** Reuse a normalizer across reconnects so its dedupe ledger persists. */\n normalizer?: Normalizer;\n /**\n * Called instead of decoding the body when the server answers a run-creating\n * POST with `Idempotent-Replay: true`.\n *\n * A replay is JSON (the run), not SSE — a run that already exists has no fresh\n * stream to emit — so the caller decides what to do with it, in practice\n * joining that run's own stream. It lives here rather than in the resource\n * because this is the only place the Response object exists; by the time\n * `stream()` yields, the headers are gone.\n */\n onReplay?: (run: { id: number; status: string }) => AsyncGenerator<M8tesStreamEvent, void, unknown>;\n}\n\n/**\n * Backoff that an abort cuts short. A plain `setTimeout` would keep a caller\n * waiting out the full delay after they cancelled — with `Retry-After: 3600` on\n * a 429, that is an hour of a request that nobody is waiting for any more.\n */\nfunction backoff(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timer = setTimeout(done, ms);\n function done(): void {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\nfunction looksLikeHtml(res: Response, text: string): boolean {\n if ((res.headers.get(\"content-type\") ?? \"\").includes(\"text/html\")) return true;\n const head = text.trimStart().slice(0, 9).toLowerCase();\n return head.startsWith(\"<!doctype\") || head.startsWith(\"<html\");\n}\n\n/**\n * Replace the raw body with an actionable message when the response says\n * \"you are not talking to the m8tes API\" — the two mistakes that otherwise\n * surface as a baffling 404 or a wall of HTML. Ported from the Python SDK.\n */\nfunction diagnose(res: Response, text: string, body: unknown, url: string): string | undefined {\n if (looksLikeHtml(res, text)) {\n return (\n `Received an HTML page instead of an API response (HTTP ${res.status}) from ${url}. ` +\n `This usually means the host does not serve the m8tes API; check your baseUrl ` +\n `(the hosted API is ${DEFAULT_BASE_URL}).`\n );\n }\n const isBareNotFound =\n res.status === 404 &&\n body !== null &&\n typeof body === \"object\" &&\n !(\"error\" in body) &&\n (body as { detail?: unknown }).detail === \"Not Found\";\n if (isBareNotFound) {\n return (\n `HTTP 404 from ${url} with no API error envelope — the path matched no route. ` +\n `Check your baseUrl includes the /api/v2 prefix (the hosted API is ${DEFAULT_BASE_URL}).`\n );\n }\n return undefined;\n}\n\nexport interface Http {\n baseUrl: string;\n request<T>(method: string, path: string, opts?: RequestOptions): Promise<T>;\n /** The OK `Response` itself — for binary bodies (file downloads). Retries and\n * typed errors still apply; the caller owns reading the body. */\n raw(method: string, path: string, opts?: RequestOptions): Promise<Response>;\n stream(\n method: string,\n path: string,\n opts?: StreamRequestOptions,\n ): AsyncGenerator<M8tesStreamEvent, void, unknown>;\n}\n\nexport function createHttp(options: ClientOptions = {}): Http {\n // A secret `m8_` key in a browser is readable by every visitor. Bundlers do not\n // stop you importing this entry into client code, so fail loudly the moment it\n // runs there rather than shipping a leaked key quietly. (Edge/worker runtimes\n // have no `document`, so they are unaffected.)\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n throw new Error(\n \"@m8tes/sdk is server-only: it holds your secret m8_ API key, which anyone \" +\n \"could read out of a browser bundle. To render an agent in the browser use \" +\n \"@m8tes/react, which talks to a server proxy that keeps the key on your server. \" +\n \"See https://www.m8tes.ai/docs/embed-a-ui\",\n );\n }\n const apiKey = options.apiKey ?? globalThis.process?.env?.[\"M8TES_API_KEY\"];\n if (!apiKey) {\n throw new Error(\n \"@m8tes/sdk: no API key. Pass `new M8tes({ apiKey })` or set M8TES_API_KEY. \" +\n \"Create a key at https://m8tes.ai/developer.\",\n );\n }\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const timeout = options.timeout ?? 300_000;\n const maybeFetch = options.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!maybeFetch) {\n throw new Error(\n \"@m8tes/sdk: no global fetch. Use Node 18+ or pass `fetch` in the client options.\",\n );\n }\n const fetchImpl: FetchLike = maybeFetch; // narrowed; safe to capture in closures\n\n async function toError(\n res: Response,\n url: string,\n errOpts: ErrorFromResponseOptions,\n ): Promise<M8tesApiError> {\n const text = await res.text().catch(() => \"\");\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch {\n body = undefined;\n }\n const parsed = parseErrorEnvelope(res.status, body, res.headers);\n const message = diagnose(res, text, body, url) ?? (body ? parsed.message : text || parsed.message);\n return new (errorClassForStatus(res.status, errOpts))(message, parsed.fields);\n }\n\n /**\n * Merge header maps case-insensitively.\n *\n * HTTP header names are case-insensitive, but a plain object is not: a caller\n * passing `Content-Type` and the SDK setting `content-type` produced BOTH, and\n * fetch joins duplicates into `application/json, application/json`, which the\n * server cannot parse. Everything is lowercased so last-writer-wins actually\n * wins.\n */\n function mergeHeaders(...sources: Array<Record<string, string> | undefined>): Record<string, string> {\n const out: Record<string, string> = {};\n for (const src of sources) {\n for (const [k, v] of Object.entries(src ?? {})) out[k.toLowerCase()] = v;\n }\n return out;\n }\n\n /** One attempt. Layers the client timeout onto any caller-supplied signal. */\n async function attempt(method: string, url: string, opts: RequestOptions): Promise<Response> {\n // Auth LAST: a server proxy that forwards inbound request headers into\n // `headers` would otherwise silently replace the SDK's credential with a\n // client-supplied one. The key you constructed the client with always wins.\n const headers = mergeHeaders(options.headers, opts.headers, {\n authorization: `Bearer ${apiKey}`,\n });\n const init: RequestInit = { method, headers };\n if (opts.form !== undefined) {\n // Deliberately no content-type: fetch adds it WITH the multipart boundary.\n // A content-type configured globally (or per-request) would suppress that\n // header, leaving the server unable to parse the body. Keys are lowercased\n // by mergeHeaders, so one delete covers every casing the caller used.\n delete headers[\"content-type\"];\n init.body = opts.form;\n } else if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(opts.body);\n }\n const timer = AbortSignal.timeout(timeout);\n init.signal = opts.signal ? AbortSignal.any([opts.signal, timer]) : timer;\n return fetchImpl(url, init);\n }\n\n /**\n * Retry loop shared by `request` and `stream`. Returns the OK response; throws\n * a typed error once the attempts are spent or the status is not retryable.\n */\n async function send(\n method: string,\n path: string,\n opts: RequestOptions,\n errOpts: ErrorFromResponseOptions = {},\n ): Promise<Response> {\n const url = `${baseUrl}${path}${opts.query ?? \"\"}`;\n // Same merge (and lowercasing) `attempt` applies, so this sees exactly the\n // headers that go on the wire — a key set globally on the client counts too.\n const idempotent = isRetryable(method, path, mergeHeaders(options.headers, opts.headers));\n let lastNetworkError: unknown;\n\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n const isLast = i === MAX_ATTEMPTS - 1;\n let res: Response;\n try {\n res = await attempt(method, url, opts);\n } catch (e) {\n // A caller-initiated abort is intent, not a fault — never retry or wrap it.\n if (opts.signal?.aborted) throw e;\n lastNetworkError = e;\n if (!idempotent || isLast) {\n throw new APIError(e instanceof Error ? e.message : String(e), {\n type: \"api_error\",\n code: 0,\n status: 0,\n });\n }\n await backoff(INITIAL_BACKOFF_MS * 2 ** i, opts.signal);\n if (opts.signal?.aborted) throw e;\n continue;\n }\n\n if (res.ok) return res;\n if (!RETRYABLE_STATUS.has(res.status) || !idempotent || isLast) {\n throw await toError(res, url, errOpts);\n }\n const retryAfter = res.status === 429 ? parseRetryAfter(res.headers.get(\"retry-after\")) : undefined;\n // Drain the body so the connection can be reused on the next attempt.\n await res.text().catch(() => \"\");\n await backoff(retryAfter !== undefined ? retryAfter * 1000 : INITIAL_BACKOFF_MS * 2 ** i, opts.signal);\n // The caller gave up while we were waiting — surface their abort rather\n // than burning the remaining attempts on a request nobody wants.\n if (opts.signal?.aborted) throw await toError(res, url, errOpts);\n }\n\n throw new APIError(\n lastNetworkError instanceof Error ? lastNetworkError.message : \"Max retries exceeded\",\n { type: \"api_error\", code: 0, status: 0 },\n );\n }\n\n return {\n baseUrl,\n async request<T>(method: string, path: string, opts: RequestOptions = {}): Promise<T> {\n const res = await send(method, path, opts);\n if (res.status === 204) return undefined as T;\n const text = await res.text();\n return (text ? (JSON.parse(text) as T) : (undefined as T));\n },\n\n raw(method: string, path: string, opts: RequestOptions = {}): Promise<Response> {\n return send(method, path, opts);\n },\n\n async *stream(method: string, path: string, opts: StreamRequestOptions = {}) {\n // A 409 on a stream route means \"the run already finished\" — surfaced as\n // RunNotStreamingError so callers fall back to runs.get() instead of\n // treating a completed run as an error.\n const res = await send(method, path, opts, { conflictIsNotStreaming: true });\n // An idempotent retry was answered from the run the first attempt created.\n // Hand it to the resource, which joins that run's stream — the caller asked\n // for a stream and still gets one, without learning a retry happened.\n if (opts.onReplay && res.headers.get(REPLAY_HEADER)) {\n const run = (await res.json()) as { id: number; status: string };\n yield* opts.onReplay(run);\n return;\n }\n if (!res.body) return;\n const normalizer = opts.normalizer ?? createNormalizer();\n const decoder = createSseDecoder({ onMalformed: options.onMalformed });\n const reader = res.body.getReader();\n const td = new TextDecoder();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n for (const frame of decoder.push(td.decode(value, { stream: true }))) {\n yield* normalizer.push(frame);\n }\n }\n for (const frame of decoder.flush()) yield* normalizer.push(frame);\n } finally {\n // cancel() tears down the connection on an early break (caller stopped\n // iterating); releaseLock() alone would leak a live SSE connection.\n try {\n await reader.cancel();\n } catch {\n try {\n reader.releaseLock();\n } catch {\n /* already released */\n }\n }\n }\n },\n };\n}\n","/**\n * Cursor pagination over the V2 `ListResponse` envelope (`{data, has_more}`).\n *\n * Mirrors the Python SDK's `SyncPage` (`sdk/py/m8tes/_types.py`): a page is the\n * raw response plus an async iterator that walks every remaining page for you.\n *\n * The cursor is the last item's `id`, or its `name` for `/apps` (the one resource\n * keyed by name). Same rule as Python, so both SDKs paginate identically.\n */\n\nexport interface ListResponse<T> {\n data: T[];\n hasMore: boolean;\n /** Cursor for `?starting_after=` when `hasMore` is true; mirrors the Python SDK. */\n nextStartingAfter?: string | number | null;\n}\n\n/** A page of results. `for await (const item of page)` walks ALL pages. */\nexport class Page<T> implements ListResponse<T>, AsyncIterable<T> {\n readonly data: T[];\n readonly hasMore: boolean;\n readonly nextStartingAfter?: string | number | null;\n /** Fetches the next page given a cursor. Absent on a terminal page. */\n private readonly fetchNext?: (startingAfter: string | number) => Promise<Page<T>>;\n\n constructor(\n data: T[],\n hasMore: boolean,\n fetchNext?: (startingAfter: string | number) => Promise<Page<T>>,\n nextStartingAfter?: string | number | null,\n ) {\n this.data = data;\n this.hasMore = hasMore;\n this.fetchNext = fetchNext;\n this.nextStartingAfter = nextStartingAfter ?? null;\n }\n\n /**\n * Auto-paging: yields every item across every page.\n *\n * Stops if the cursor ever fails to advance. A server that returns the same\n * page again with `has_more: true` — a caching layer, a replica lagging, a bug\n * — would otherwise spin forever, re-yielding the same rows and never\n * returning. Terminating is the only safe response: the caller gets the items\n * it did see rather than a hung process.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: Page<T> = this;\n const seen = new Set<string | number>();\n for (;;) {\n yield* page.data;\n const last = page.data.at(-1) as { id?: unknown; name?: unknown } | undefined;\n if (!page.hasMore || !last || !page.fetchNext) return;\n let cursor: string | number | undefined =\n page.nextStartingAfter === null || page.nextStartingAfter === undefined\n ? undefined\n : page.nextStartingAfter;\n if (cursor === undefined) {\n cursor =\n typeof last.id === \"number\" || typeof last.id === \"string\"\n ? last.id\n : typeof last.name === \"string\"\n ? last.name\n : undefined;\n }\n if (cursor === undefined || seen.has(cursor)) return;\n seen.add(cursor);\n page = await page.fetchNext(cursor);\n }\n }\n\n /** Every item across every page, collected. Prefer iteration for large sets. */\n async all(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n","/**\n * Request-parameter plumbing. Deliberately tiny.\n *\n * This package speaks the API's own **snake_case** on the wire, in params AND in\n * response types — the same names as `/docs/api-reference` and the Python SDK, and\n * the convention `openai`, `stripe`, and `@anthropic-ai/sdk` all use. So there is\n * no case-mapping layer: request bodies are passed through, and responses are\n * returned exactly as the API sent them.\n *\n * That is not just a style choice. The mapping layer this replaced corrupted\n * caller-defined keys twice: `answers` is keyed by AskUserQuestion TEXT, and\n * `output_schema` carries the caller's own JSON-Schema property names — a key\n * rewriter silently changed both. With no rewriter, that class of bug cannot exist.\n *\n * THE BOUNDARY, precisely — snake_case is for API DATA, camelCase for SDK surfaces:\n *\n * snake_case request params + response bodies `user_id`, `created_at`,\n * (anything that crosses the wire) `output_data`, `enable_memory`\n *\n * camelCase things the SDK owns and the API `new M8tes({ apiKey })`,\n * never sees: client options, method `client.runs.createAsync()`,\n * names, `RunStream`, and the `stream.runId`,\n * normalized events in `event.requestId`\n * `@m8tes/sdk/protocol` (our own\n * format, shared with @m8tes/react's\n * UI — not the REST wire)\n *\n * So: if you read the name in `/docs/api-reference`, it is snake_case here too.\n * If it is a TypeScript construct we invented, it is camelCase.\n */\n\n/** Drop `undefined` so an omitted option is absent rather than an explicit\n * `null` — which the API reads as \"clear this field\". An explicit `null`\n * survives, because that IS how you clear one. */\nexport function toBody(params: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) out[k] = v;\n }\n return out;\n}\n\n/** Query string from params, skipping `undefined`/`null`. Returns \"\" when empty. */\nexport function toQuery(params: Record<string, unknown>): string {\n const q = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === null) continue;\n q.set(k, String(v));\n }\n const s = q.toString();\n return s ? `?${s}` : \"\";\n}\n\n/**\n * `agent_id` is the canonical name; `teammate_id` is the permanent legacy alias\n * and the actual wire field. Passing conflicting values is an error rather than a\n * silent pick — mirrors `_resolve_agent_id` in the Python SDK.\n */\nexport function resolveAgentId(\n teammateId: number | undefined,\n agentId: number | undefined,\n): number | undefined {\n if (agentId !== undefined && teammateId !== undefined && agentId !== teammateId) {\n throw new Error(\"Pass agent_id or teammate_id, not both\");\n }\n return teammateId ?? agentId;\n}\n","/**\n * `client.agents` — the reusable agent personas runs execute as.\n *\n * The V2 resource is `agents`; `client.teammates` is a permanent alias because\n * the DB model and older API docs use that name. Mirrors\n * `sdk/py/m8tes/_resources/teammates.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport type { Agent, EmailInbox, JsonObject, PermissionMode, WebhookToggle } from \"../types\";\n\nexport interface AgentCreateParams {\n name?: string;\n /** The agent's standing instructions: who it is and how it works. */\n instructions?: string;\n /** Tool slugs it may use, e.g. `[\"gmail\", \"slack\"]`. */\n tools?: string[];\n role?: string;\n goals?: string;\n /** Your id for the end-user who owns this agent. */\n user_id?: string;\n metadata?: JsonObject;\n model?: string;\n effort?: string;\n default_permission_mode?: PermissionMode;\n /** Built-in tool toggles. Omit to inherit the platform default. */\n enable_memory?: boolean;\n enable_history?: boolean;\n enable_task_setup_tools?: boolean;\n enable_feedback?: boolean;\n enable_self_improvement?: boolean;\n /** Give the agent its own email inbox on create. */\n email_inbox?: boolean;\n /** Give the agent a webhook trigger URL on create. */\n webhook?: boolean;\n /** Start from a prebuilt persona, e.g. `\"ppc-manager\"`. Template improvements\n * keep flowing in on later reads unless you override the field. */\n from_template?: string;\n}\n\n/**\n * PATCH /agents/{id} accepts exactly these fields (backend `TeammateUpdate`).\n * Create-only fields are NOT here on purpose: sending `webhook` or `email_inbox`\n * to PATCH returns 200 and silently does nothing, which reads as a working call.\n * Use `enableWebhook()` / `enableEmailInbox()` instead.\n *\n * `null` is meaningful: it CLEARS the field back to the platform default.\n */\nexport interface AgentUpdateParams {\n name?: string | null;\n instructions?: string | null;\n tools?: string[] | null;\n role?: string | null;\n goals?: string | null;\n metadata?: JsonObject | null;\n model?: string | null;\n effort?: string | null;\n default_permission_mode?: PermissionMode | null;\n allowed_senders?: string[] | null;\n enable_memory?: boolean | null;\n enable_history?: boolean | null;\n enable_task_setup_tools?: boolean | null;\n enable_feedback?: boolean | null;\n enable_self_improvement?: boolean | null;\n}\n\nexport interface AgentListParams {\n user_id?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface AgentsResource {\n create(params?: AgentCreateParams): Promise<Agent>;\n list(params?: AgentListParams): Promise<Page<Agent>>;\n get(agentId: number, params?: { user_id?: string }): Promise<Agent>;\n update(agentId: number, params: AgentUpdateParams & { user_id?: string }): Promise<Agent>;\n delete(agentId: number, params?: { user_id?: string }): Promise<void>;\n /** Turn on the webhook trigger; returns the URL to POST to.\n * `user_id` scopes to one end-user (404 on mismatch), like get/update/delete. */\n enableWebhook(agentId: number, params?: { user_id?: string }): Promise<WebhookToggle>;\n disableWebhook(agentId: number, params?: { user_id?: string }): Promise<void>;\n /** Turn on the agent's email inbox; returns the address that starts runs. */\n enableEmailInbox(agentId: number, params?: { user_id?: string }): Promise<EmailInbox>;\n disableEmailInbox(agentId: number, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createAgentsResource(http: Http): AgentsResource {\n return {\n create(params = {}) {\n return http.request<Agent>(\"POST\", \"/agents/\", { body: toBody({ ...params }) });\n },\n\n async list(params = {}) {\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Agent>> => {\n const res = await http.request<{ data: Agent[]; has_more?: boolean; next_starting_after?: string | number | null }>(\"GET\", \"/agents/\", {\n query: toQuery(p),\n });\n return new Page<Agent>(\n res?.data ?? [],\n res?.has_more ?? false,\n (starting_after) => fetchPage({ ...p, starting_after }),\n res?.next_starting_after,\n );\n };\n return fetchPage({ ...params });\n },\n\n get(agentId, params = {}) {\n return http.request<Agent>(\"GET\", `/agents/${seg(agentId)}`, { query: toQuery(params) });\n },\n\n update(agentId, params) {\n // user_id scopes the request (query param); everything else is the patch.\n const { user_id, ...patch } = params;\n return http.request<Agent>(\"PATCH\", `/agents/${seg(agentId)}`, {\n body: toBody(patch),\n query: toQuery({ user_id }),\n });\n },\n\n async delete(agentId, params = {}) {\n await http.request(\"DELETE\", `/agents/${seg(agentId)}`, { query: toQuery(params) });\n },\n\n enableWebhook(agentId, params = {}) {\n return http.request<WebhookToggle>(\"POST\", `/agents/${seg(agentId)}/webhook`, {\n body: {},\n query: toQuery(params),\n });\n },\n\n async disableWebhook(agentId, params = {}) {\n await http.request(\"DELETE\", `/agents/${seg(agentId)}/webhook`, { query: toQuery(params) });\n },\n\n enableEmailInbox(agentId, params = {}) {\n return http.request<EmailInbox>(\"POST\", `/agents/${seg(agentId)}/email-inbox`, {\n body: {},\n query: toQuery(params),\n });\n },\n\n async disableEmailInbox(agentId, params = {}) {\n await http.request(\"DELETE\", `/agents/${seg(agentId)}/email-inbox`, { query: toQuery(params) });\n },\n };\n}\n","/**\n * `client.apps` — the tools agents act in, and each end-user's connections to them.\n *\n * Connections are scoped: pass `user_id` and the connection belongs to that\n * end-user, so the agent acts with THEIR Gmail/Stripe/Slack rather than yours.\n * In an embed that matters a lot — an account-level connection means a\n * prompt-injected agent could act on your behalf.\n *\n * Mirrors `sdk/py/m8tes/_resources/apps.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport type { App, AppConnectionInitiation, AppConnectionResult } from \"../types\";\n\nexport interface AppsResource {\n /**\n * Every available tool, with connection status for the given scope.\n *\n * NOT paginated and NOT cursor-able: `GET /apps/` accepts only `user_id` and\n * returns the whole catalog. Sending `limit` or `starting_after` gets a 422\n * (`unknown_query_parameter`) — verified against a live backend, which is also\n * how the same bug was found in the published Python SDK. A `Page` is still\n * returned so `for await` works uniformly across resources.\n */\n list(params?: { user_id?: string }): Promise<Page<App>>;\n /** True when this app is connected for the given scope. */\n isConnected(appName: string, params?: { user_id?: string }): Promise<boolean>;\n /**\n * Start an OAuth connection. Send the user to the returned `authorization_url`,\n * then pass the returned `connection_id` to `connectComplete()`.\n *\n * `redirect_uri` is REQUIRED and is spelled `_uri`, not `_url` — the API 422s\n * on anything else.\n */\n connectOauth(\n appName: string,\n params: { redirect_uri: string; user_id?: string },\n ): Promise<AppConnectionInitiation>;\n /** Connect an app that authenticates with a key instead of OAuth. */\n connectApiKey(\n appName: string,\n params: { api_key: string; user_id?: string },\n ): Promise<AppConnectionResult>;\n /** Finish an OAuth connection after the user returns. `connection_id` comes\n * from `connectOauth()` and is required. */\n connectComplete(\n appName: string,\n params: { connection_id: string; user_id?: string },\n ): Promise<AppConnectionResult>;\n disconnect(appName: string, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createAppsResource(http: Http): AppsResource {\n // A local, not `this.list` — a destructured `const { isConnected } =\n // client.apps` would otherwise throw. (The same bug shipped in\n // `runs.createAndWait`; nothing in this package should depend on `this`.)\n const list = async (params: { user_id?: string } = {}): Promise<Page<App>> => {\n // Only `user_id` — see the interface comment. No fetchNext: there is no\n // cursor to follow, and inventing one would 422.\n const res = await http.request<{ data: App[]; has_more?: boolean; next_starting_after?: string | number | null }>(\"GET\", \"/apps/\", {\n query: toQuery({ user_id: params.user_id }),\n });\n return new Page<App>(res?.data ?? [], res?.has_more ?? false, undefined, res?.next_starting_after);\n };\n\n return {\n list,\n\n async isConnected(appName, params = {}) {\n // The list endpoint reports connection state per scope; a single-app filter\n // would be a second contract to keep in sync for no gain.\n const { data } = await list(params);\n return data.find((a) => a.name === appName)?.connected ?? false;\n },\n\n connectOauth(appName, params) {\n return http.request<AppConnectionInitiation>(\"POST\", `/apps/${seg(appName)}/connect`, {\n body: toBody({ ...params }),\n });\n },\n\n connectApiKey(appName, params) {\n return http.request<AppConnectionResult>(\"POST\", `/apps/${seg(appName)}/connect/api-key`, {\n body: toBody({ ...params }),\n });\n },\n\n connectComplete(appName, params) {\n return http.request<AppConnectionResult>(\"POST\", `/apps/${seg(appName)}/connect/complete`, {\n body: toBody({ ...params }),\n });\n },\n\n async disconnect(appName, params = {}) {\n await http.request(\"DELETE\", `/apps/${seg(appName)}/connections`, { query: toQuery(params) });\n },\n };\n}\n","/**\n * `client.account` — the two operations that act on the whole account rather\n * than anything inside it: take your data out, and shut the account down.\n *\n * Both exist to satisfy the GDPR/CCPA rights to access and to erasure, so they\n * are here for compliance flows you have to be able to run programmatically —\n * a data-subject request you are forwarding, or an offboarding path in your own\n * product. Neither takes parameters: they always apply to the account behind\n * the API key you authenticated with, and there is no `user_id` scoping. To\n * remove one end-user's data instead, use `client.users.delete()`.\n *\n * Mirrors `sdk/py/m8tes/_resources/account.py`.\n */\n\nimport type { Http } from \"../http\";\nimport type { AccountDeletion, AccountExport } from \"../types\";\n\nexport interface AccountResource {\n /**\n * Hand a customer (or a regulator) everything the account holds — the\n * GDPR/CCPA right to access.\n *\n * The document covers the account's agents, tasks, runs, documents, memories,\n * and integration metadata. Credentials and other secrets are never included,\n * so an export is safe to forward but is NOT a backup you can restore from.\n * It is a single JSON body, not a stream: a large account produces a large\n * response, so allow for it in your request timeout.\n */\n export(): Promise<AccountExport>;\n\n /**\n * Close the account — the GDPR/CCPA right to erasure.\n *\n * Soft-delete, and it takes effect at once: sessions and the API key are\n * revoked, billing is canceled, and all automation stops, with the data\n * erased after a grace period. In other words the key you just called this\n * with is dead afterwards, so nothing else in the SDK will work.\n */\n delete(): Promise<AccountDeletion>;\n}\n\nexport function createAccountResource(http: Http): AccountResource {\n return {\n export() {\n return http.request<AccountExport>(\"GET\", \"/account/export\");\n },\n\n delete() {\n return http.request<AccountDeletion>(\"DELETE\", \"/account\");\n },\n };\n}\n","/**\n * `client.users` — your end-users, the multi-tenancy boundary.\n *\n * `user_id` is YOUR identifier for a customer; the platform stores it as\n * `end_user_id` and isolates that person's memory, run history, and tool\n * connections strictly. There is no fallback to account-level data.\n *\n * Registering an end-user here is optional — passing `user_id` on a run creates\n * them implicitly. Do it explicitly when you want per-user budgets and rate\n * limits. Mirrors `sdk/py/m8tes/_resources/users.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport type { EndUser, EndUserUsage, JsonObject } from \"../types\";\n\nexport interface EndUserCreateParams {\n /** Your id for this person. Any stable string. */\n user_id: string;\n name?: string;\n email?: string;\n company?: string;\n metadata?: JsonObject;\n /** Cap this end-user's runs per billing period. */\n run_limit?: number;\n /** Cap this end-user's spend per billing period, in cents. */\n cost_limit_cents?: number;\n /** Cap this end-user's runs per minute. Exceeding it returns 429. */\n rate_per_minute?: number;\n}\n\n/** `null` CLEARS a cap (inherit the account default); omitting leaves it alone. */\nexport interface EndUserUpdateParams {\n name?: string | null;\n email?: string | null;\n company?: string | null;\n metadata?: JsonObject | null;\n run_limit?: number | null;\n cost_limit_cents?: number | null;\n rate_per_minute?: number | null;\n}\n\nexport interface PageParams {\n limit?: number;\n starting_after?: number;\n}\n\nexport interface UsersResource {\n create(params: EndUserCreateParams): Promise<EndUser>;\n list(params?: PageParams): Promise<Page<EndUser>>;\n get(userId: string): Promise<EndUser>;\n update(userId: string, params: EndUserUpdateParams): Promise<EndUser>;\n delete(userId: string): Promise<void>;\n /** Per-end-user token, run, and cost usage against their limits. */\n usage(params?: PageParams & { user_id?: string }): Promise<Page<EndUserUsage>>;\n}\n\n/** Shared cursor-paging helper: the envelope is identical across list routes. */\nexport function pager<T>(http: Http, path: string): (p: Record<string, unknown>) => Promise<Page<T>> {\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<T>> => {\n const res = await http.request<{ data: T[]; has_more?: boolean; next_starting_after?: string | number | null }>(\"GET\", path, {\n query: toQuery(p),\n });\n return new Page<T>(\n res?.data ?? [],\n res?.has_more ?? false,\n (starting_after) => fetchPage({ ...p, starting_after }),\n res?.next_starting_after,\n );\n };\n return fetchPage;\n}\n\nexport function createUsersResource(http: Http): UsersResource {\n return {\n create(params) {\n return http.request<EndUser>(\"POST\", \"/users/\", { body: toBody({ ...params }) });\n },\n\n list(params = {}) {\n return pager<EndUser>(http, \"/users/\")({ ...params });\n },\n\n get(userId) {\n return http.request<EndUser>(\"GET\", `/users/${seg(userId)}`);\n },\n\n update(userId, params) {\n return http.request<EndUser>(\"PATCH\", `/users/${seg(userId)}`, {\n body: toBody({ ...params }),\n });\n },\n\n async delete(userId) {\n await http.request(\"DELETE\", `/users/${seg(userId)}`);\n },\n\n usage(params = {}) {\n return pager<EndUserUsage>(http, \"/usage/end-users\")({ ...params });\n },\n };\n}\n","/**\n * `client.billing` — what you have spent, what you may spend, and the ceiling.\n *\n * This is the resource you reach for when cost is a product requirement rather\n * than an afterthought: read current-period usage (runs, model spend, accrued\n * overage), break spend down by day / end-user / agent / model, fetch the public\n * plan catalog, and set the caps — the monthly overage cap on plan accounts, and\n * on prepaid accounts the token balance, top-ups, auto-reload, and the\n * low-balance alert threshold.\n *\n * An embed developer capping what their own customers can burn lives here: pair\n * `usageTimeseries({ user_id })` with the per-end-user limits on `client.users`\n * to meter each tenant, and `setOverage` / `setAutoReload` to bound the account\n * as a whole.\n *\n * Mirrors `sdk/py/m8tes/_resources/billing.py`.\n */\n\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { resolveAgentId, toBody, toQuery } from \"../params\";\nimport type { Balance, Plan, Receipt, Usage, UsageTimeseries } from \"../types\";\nimport { type PageParams, pager } from \"./users\";\n\nexport interface UsageTimeseriesParams {\n /** Inclusive ISO date (`\"2026-07-01\"`), UTC days. Defaults to 30 days ago. */\n start_date?: string;\n /** Inclusive ISO date. Defaults to today. */\n end_date?: string;\n /** Scope to one end-user. */\n user_id?: string;\n /** Scope to one agent. */\n agent_id?: number;\n /** Permanent legacy alias for `agent_id` — the same wire field. */\n teammate_id?: number;\n /** Creation stamp: `\"api\"` embedding, `\"platform\"` first-party. Not settlement. */\n surface?: \"api\" | \"platform\";\n /** Where the run settled: `\"wallet\"` is the prepaid ledger. */\n settled_meter?: \"wallet\" | \"plan\" | \"released\" | \"own_sub\";\n /** `\"model\"` adds per-model slices to every bucket's `models`. The route\n * accepts this one value only, so it is a literal rather than a string. */\n group_by?: \"model\";\n}\n\nexport interface OverageParams {\n enabled: boolean;\n /** Hard ceiling on overage spend per period, in cents. */\n monthly_cap_cents: number;\n}\n\nexport interface TopupParams {\n /** Cents to add. $5 minimum, $1M maximum. */\n amount_cents: number;\n}\n\n/**\n * Enabling auto-reload REQUIRES both amounts; disabling takes neither. Modelled\n * as a union so `{ enabled: true }` alone is a compile error rather than a 422.\n */\nexport type AutoReloadParams =\n | {\n enabled: true;\n /** Reload when the balance drops below this, in cents. */\n threshold_cents: number;\n /** Cents to charge per reload. $5–$10,000. */\n amount_cents: number;\n }\n | {\n enabled: false;\n /** Amounts may still be updated while disabled; the API applies them. */\n threshold_cents?: number;\n amount_cents?: number;\n };\n\nexport interface AlertThresholdParams {\n /** Balance (cents) at which the low-balance warning fires. `0` warns only on depletion. */\n low_balance_threshold_cents: number;\n}\n\nexport interface BillingResource {\n /** Where you stand this period: plan, runs used vs included, model spend, and overage state. */\n usage(): Promise<Usage>;\n\n /**\n * Spend broken down by UTC day — the series to chart, alert on, or reconcile\n * against an invoice. Buckets are zero-filled across the whole window, so the\n * array is safe to plot without gap-handling. Cost matches `usage().cost_used`\n * semantics, so the series always reconciles with period totals. With\n * `group_by: \"model\"`, runs that predate model attribution fold\n * into a `\"unknown\"` slice rather than disappearing.\n */\n usageTimeseries(params?: UsageTimeseriesParams): Promise<UsageTimeseries>;\n\n /**\n * Proof of payment for finance: one row per paid prepaid top-up, newest first.\n * `receipt_url` can be `null` when Stripe can no longer retrieve the session.\n */\n receipts(params?: PageParams): Promise<Page<Receipt>>;\n\n /** What the paid plans include and cost — for your own pricing page or upgrade\n * prompt. Public (paid) plans only, straight from the canonical catalog, and\n * returned as a plain array rather than a page. */\n plans(): Promise<Plan[]>;\n\n /**\n * Decide whether runs may continue past your plan's included allotment, and how\n * far. Off by default; once enabled, extra runs bill at the per-run overage rate\n * until `monthly_cap_cents` is reached. Returns the refreshed usage so you can\n * confirm the new state without a second call.\n */\n setOverage(params: OverageParams): Promise<Usage>;\n\n /** How much prepaid credit is left, and where it went (prepaid-billed accounts).\n * Amounts are micro-USD; `balance_usd` is a rounded display string. */\n balance(): Promise<Balance>;\n\n /**\n * Add credit when a human is present to pay. Returns a Stripe Checkout URL to\n * send the buyer to — nothing is credited until they complete payment.\n */\n topup(params: TopupParams): Promise<string>;\n\n /**\n * Keep credit topped up without a human, so runs never stop for an empty wallet:\n * a balance below `threshold_cents` charges `amount_cents` to the saved card\n * off-session. Enabling requires a saved payment method (any completed top-up\n * Checkout saves one) — without it this throws a billing error with code\n * `NO_SAVED_PAYMENT_METHOD`. Disabling needs only `enabled: false`. At most one\n * reload fires per 6-hour window. Returns the refreshed balance.\n */\n setAutoReload(params: AutoReloadParams): Promise<Balance>;\n\n /**\n * Choose when you want to hear about a draining balance. The critical tier is\n * fixed at 20% of the value you set, and `0` warns only on depletion. Warnings\n * arrive by email and as `balance.low` / `balance.critical` / `balance.depleted`\n * webhook events. Returns the refreshed balance.\n */\n setAlertThreshold(params: AlertThresholdParams): Promise<Balance>;\n}\n\nexport function createBillingResource(http: Http): BillingResource {\n return {\n usage() {\n return http.request<Usage>(\"GET\", \"/usage/\");\n },\n\n usageTimeseries(params = {}) {\n const { agent_id, teammate_id, ...rest } = params;\n const query = toQuery(\n toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) }),\n );\n return http.request<UsageTimeseries>(\"GET\", \"/usage/timeseries\", { query });\n },\n\n receipts(params = {}) {\n return pager<Receipt>(http, \"/billing/receipts\")({ ...params });\n },\n\n plans() {\n return http.request<Plan[]>(\"GET\", \"/billing/plans\");\n },\n\n setOverage(params) {\n return http.request<Usage>(\"PATCH\", \"/billing/overage\", { body: toBody({ ...params }) });\n },\n\n balance() {\n return http.request<Balance>(\"GET\", \"/billing/balance\");\n },\n\n async topup(params) {\n const res = await http.request<{ checkout_url: string }>(\"POST\", \"/billing/topup\", {\n body: toBody({ ...params }),\n });\n return res.checkout_url;\n },\n\n setAutoReload(params) {\n return http.request<Balance>(\"PATCH\", \"/billing/auto-reload\", {\n body: toBody({ ...params }),\n });\n },\n\n setAlertThreshold(params) {\n return http.request<Balance>(\"PATCH\", \"/billing/alert-settings\", {\n body: toBody({ ...params }),\n });\n },\n };\n}\n","/**\n * `client.memories` — pre-load what an agent already knows about someone.\n *\n * A run starts cold unless it has memories to draw on. Writing them here lets you\n * seed an end-user's context from data you already hold (plan, timezone, past\n * decisions, preferences) so the first run behaves like the tenth, instead of\n * waiting for the agent to learn it over several conversations.\n *\n * `user_id` is the scope, and the scopes never mix: with it, the memory belongs to\n * that one end-user and is visible only to runs carrying the same `user_id`;\n * without it, the memory is account-level and visible only to runs that carry no\n * `user_id`. There is no inheritance between the two — an account-level memory is\n * NOT a fallback for an end-user run.\n *\n * Documented at `/docs/users`. Mirrors `sdk/py/m8tes/_resources/memories.py`.\n */\n\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport { pager } from \"./users\";\nimport type { Memory } from \"../types\";\n\nexport interface MemoryCreateParams {\n /** The fact to remember, in plain language. */\n content: string;\n /** Scope it to one end-user. Omit for an account-level memory. */\n user_id?: string;\n}\n\nexport interface MemoryListParams {\n /** Scope to read. Omit to read account-level memories. */\n user_id?: string;\n /**\n * Keyword filter on content (case-insensitive substring). It only narrows the\n * chosen scope — it never reaches across into the other one — and paging\n * applies to the filtered set.\n */\n query?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface MemoryUpdateParams {\n /** Replaces the stored text outright. */\n content: string;\n /** The scope the memory lives in. Must match, or the memory is not found. */\n user_id?: string;\n}\n\nexport interface MemoriesResource {\n /**\n * Teach an agent a fact up front, before anyone runs it.\n *\n * Throws a `ConflictError` (409) when the scope is already at its memory\n * capacity, or when identical content is already stored in it — so this is\n * safe to call repeatedly only if you handle that error.\n */\n create(params: MemoryCreateParams): Promise<Memory>;\n /** Audit or display what an agent knows about one end-user (or the account). */\n list(params?: MemoryListParams): Promise<Page<Memory>>;\n /** Correct a fact that changed, keeping its id — rather than delete + re-create. */\n update(memoryId: number, params: MemoryUpdateParams): Promise<Memory>;\n /** Make an agent forget something, e.g. on an end-user's erasure request. */\n delete(memoryId: number, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createMemoriesResource(http: Http): MemoriesResource {\n return {\n create(params) {\n return http.request<Memory>(\"POST\", \"/memories/\", { body: toBody({ ...params }) });\n },\n\n list(params = {}) {\n return pager<Memory>(http, \"/memories/\")({ ...params });\n },\n\n update(memoryId, { user_id, content }) {\n // Scope travels in the query string, the new text in the body.\n return http.request<Memory>(\"PATCH\", `/memories/${seg(memoryId)}`, {\n query: toQuery({ user_id }),\n body: toBody({ content }),\n });\n },\n\n async delete(memoryId, params = {}) {\n await http.request(\"DELETE\", `/memories/${seg(memoryId)}`, {\n query: toQuery({ user_id: params.user_id }),\n });\n },\n };\n}\n","/**\n * `client.models` — find out which `model` values are actually valid, and what\n * they cost, instead of guessing from the docs.\n *\n * `model` is a plain string everywhere in this SDK, which keeps new models\n * usable the day they're enabled but means a typo is only caught by the API. Ask\n * this route instead: it returns the models your account can select right now\n * (Anthropic and not — the set grows without an SDK release), which one is the\n * default, and the per-million-token prices the platform bills you at, so you\n * can estimate spend before starting a run.\n *\n * Mirrors `sdk/py/m8tes/_resources/models.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport type { Model } from \"../types\";\n\nexport interface ModelsResource {\n /**\n * The models you can pass as `model` on an agent or a run, with USD pricing\n * per million tokens.\n *\n * Omit `model` on an agent/run to get the entry flagged `default: true` — that\n * flag is per-viewer, so the default you see here is the default you'd get.\n *\n * Takes no arguments and has no cursor: `GET /models/` returns the whole\n * catalog in one response. A `Page` is still returned so `for await` works the\n * same as on every other list, but it never fetches a second page.\n */\n /**\n * The model catalog. Check `zdr_supported` before sending customer data: a\n * non-ZDR model is allowed on the API but may retain inputs and outputs.\n */\n list(): Promise<Page<Model>>;\n}\n\nexport function createModelsResource(http: Http): ModelsResource {\n return {\n async list() {\n const res = await http.request<{ data: Model[]; has_more?: boolean; next_starting_after?: string | number | null }>(\"GET\", \"/models/\");\n // No fetchNext: the route accepts no cursor, matching the Python SDK's\n // SyncPage built without `_fetch_next`.\n return new Page<Model>(res?.data ?? [], res?.has_more ?? false, undefined, res?.next_starting_after);\n },\n };\n}\n","/** Account-level OAuth subscriptions used by the Claude Code execution harness. */\n\nimport type { Http } from \"../http\";\nimport { seg } from \"../protocol/seg\";\n\nexport type ModelConnectionProvider = \"claude\" | \"openai\" | \"xai\" | \"gemini\";\nexport type AuthorizableModelConnectionProvider = \"openai\" | \"xai\" | \"gemini\";\nexport type DeviceModelConnectionProvider = \"openai\" | \"xai\";\nexport type CodeModelConnectionProvider = \"gemini\";\n\nexport interface ModelConnection {\n\tprovider: ModelConnectionProvider;\n\tdisplay_name: string;\n\tconnected: boolean;\n\tstatus?: string | null;\n\taccount_label?: string | null;\n\texpires_at?: string | null;\n}\n\nexport interface ModelAuthorization {\n\tprovider: AuthorizableModelConnectionProvider;\n\tstate: string;\n\tstatus: \"pending\" | \"connected\";\n\tauthorization_url?: string | null;\n\tuser_code?: string | null;\n\texpires_at?: string | null;\n\tinterval_seconds: number;\n}\n\nexport interface ModelConnectionsResource {\n\t/** List supported providers. Credential material is never returned. */\n\tlist(): Promise<ModelConnection[]>;\n\t/** Start provider-native authorization; show the returned URL and device code when used. */\n\tauthorize(provider: AuthorizableModelConnectionProvider): Promise<ModelAuthorization>;\n\t/** Poll once; successful device authorization is saved automatically. */\n\tauthorizationStatus(\n\t\tprovider: DeviceModelConnectionProvider,\n\t\tstate: string\n\t): Promise<ModelAuthorization>;\n\t/** Exchange a pasted authorization code and store the connection. */\n\tcompleteAuthorization(\n\t\tprovider: CodeModelConnectionProvider,\n\t\tstate: string,\n\t\tparams: { code: string }\n\t): Promise<ModelAuthorization>;\n\t/** Cancel a short-lived provider authorization session. */\n\tcancelAuthorization(provider: AuthorizableModelConnectionProvider, state: string): Promise<void>;\n\t/** Delete m8tes' encrypted copy of the provider credentials. */\n\tdisconnect(provider: ModelConnectionProvider): Promise<ModelConnection>;\n}\n\nexport function createModelConnectionsResource(http: Http): ModelConnectionsResource {\n\treturn {\n\t\tasync list() {\n\t\t\tconst res = await http.request<{ data: ModelConnection[] }>(\"GET\", \"/model-connections/\");\n\t\t\treturn res?.data ?? [];\n\t\t},\n\t\tauthorize(provider) {\n\t\t\treturn http.request<ModelAuthorization>(\n\t\t\t\t\"POST\",\n\t\t\t\t`/model-connections/${seg(provider)}/authorizations`\n\t\t\t);\n\t\t},\n\t\tauthorizationStatus(provider, state) {\n\t\t\treturn http.request<ModelAuthorization>(\n\t\t\t\t\"GET\",\n\t\t\t\t`/model-connections/${seg(provider)}/authorizations/${seg(state)}`\n\t\t\t);\n\t\t},\n\t\tcompleteAuthorization(provider, state, params) {\n\t\t\treturn http.request<ModelAuthorization>(\n\t\t\t\t\"POST\",\n\t\t\t\t`/model-connections/${seg(provider)}/authorizations/${seg(state)}`,\n\t\t\t\t{ body: { code: params.code } }\n\t\t\t);\n\t\t},\n\t\tasync cancelAuthorization(provider, state) {\n\t\t\tawait http.request(\"DELETE\", `/model-connections/${seg(provider)}/authorizations/${seg(state)}`);\n\t\t},\n\t\tdisconnect(provider) {\n\t\t\treturn http.request<ModelConnection>(\"DELETE\", `/model-connections/${seg(provider)}`);\n\t\t},\n\t};\n}\n","/**\n * `client.permissions` — standing tool allow-lists, one end-user at a time.\n *\n * A run pauses whenever the agent reaches for a tool that is not pre-approved,\n * and stays paused until somebody answers. That is the right default for a first\n * run and the wrong one for a tool your product has already decided is fine. A\n * policy here says \"this end-user's runs may use this tool\" once, so their runs\n * stop stopping.\n *\n * Scope: policies are per end-user (`user_id` is required on every call — there\n * is no account-wide policy) and outlive the run, unlike `runs.answerPermission()`\n * which unblocks a single gate. `/docs/users` documents this surface; mirrors\n * `sdk/py/m8tes/_resources/permissions.py`.\n */\n\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody, toQuery } from \"../params\";\nimport type { PermissionPolicy } from \"../types\";\nimport { type PageParams, pager } from \"./users\";\n\nexport interface PermissionCreateParams {\n /** The end-user whose runs this policy applies to. Required — policies never span end-users. */\n user_id: string;\n /** The tool to pre-approve, e.g. `\"Bash\"` or an `mcp__*` tool name. */\n tool: string;\n}\n\nexport interface PermissionListParams extends PageParams {\n /** Required: you list one end-user's policies, never the account's. */\n user_id: string;\n}\n\nexport interface PermissionsResource {\n /**\n * Pre-approve a tool so this end-user's runs no longer pause on it.\n * Idempotent — re-approving the same tool returns the existing policy rather\n * than erroring or duplicating. Send `tool`; the policy comes back as `tool_name`.\n */\n create(params: PermissionCreateParams): Promise<PermissionPolicy>;\n /** Audit what an end-user's runs are allowed to do without asking. */\n list(params: PermissionListParams): Promise<Page<PermissionPolicy>>;\n /**\n * Revoke a pre-approval, so the tool gates again on the next run.\n * `user_id` is required and scopes the delete — an id alone will not resolve.\n */\n delete(permissionId: number, params: { user_id: string }): Promise<void>;\n}\n\nexport function createPermissionsResource(http: Http): PermissionsResource {\n return {\n create(params) {\n return http.request<PermissionPolicy>(\"POST\", \"/permissions/\", {\n body: toBody({ ...params }),\n });\n },\n\n list(params) {\n return pager<PermissionPolicy>(http, \"/permissions/\")({ ...params });\n },\n\n async delete(permissionId, params) {\n await http.request(\"DELETE\", `/permissions/${seg(permissionId)}`, {\n query: toQuery({ user_id: params.user_id }),\n });\n },\n };\n}\n","/**\n * Filename → MIME type, for run attachments.\n *\n * The upload endpoint validates `content_type` against a strict allowlist\n * (`fastapi/app/services/execution/file_validation.py::ALLOWED_TYPES`) and\n * rejects the whole batch on a miss. A `Blob` built from bytes or a string has\n * no type, so it arrives as `application/octet-stream` and every upload fails\n * with `Invalid type: application/octet-stream` — which tells the developer\n * nothing about what to do next.\n *\n * So the type is inferred from the extension, and a caller can always override\n * it explicitly. Found by a live E2E: the mocked tests could not see it, because\n * only the real server enforces the allowlist.\n *\n * This map mirrors that allowlist. Adding a type here that the server does not\n * accept just moves the failure; keep the two in step.\n */\n\n// null-prototype on purpose: a plain object literal resolves `constructor`,\n// `__proto__`, `toString` through the prototype chain, so a filename ending\n// `.constructor` returned a truthy NON-string that sailed past the `if (!type)`\n// guard and became a garbage Content-Type. Filenames are often user-supplied.\nconst EXTENSION_TYPES: Record<string, string> = Object.assign(Object.create(null), {\n // Images (the agent can actually see these via its Read tool)\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n // Documents\n pdf: \"application/pdf\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n html: \"text/html\",\n htm: \"text/html\",\n // Code\n py: \"text/x-python\",\n js: \"application/javascript\",\n mjs: \"application/javascript\",\n cjs: \"application/javascript\",\n json: \"application/json\",\n ts: \"text/typescript\",\n tsx: \"text/typescript\",\n css: \"text/css\",\n c: \"text/x-c\",\n h: \"text/x-c\",\n java: \"text/x-java-source\",\n go: \"text/x-go\",\n sql: \"application/sql\",\n // Data / config\n csv: \"text/csv\",\n tsv: \"text/csv\",\n xml: \"application/xml\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n // Archives\n zip: \"application/zip\",\n gz: \"application/gzip\",\n tgz: \"application/gzip\",\n tar: \"application/x-tar\",\n // Office\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n xls: \"application/vnd.ms-excel\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ppt: \"application/vnd.ms-powerpoint\",\n});\n\n/** Every type the upload endpoint accepts. Used to make a rejection actionable. */\nexport const UPLOADABLE_EXTENSIONS = Object.keys(EXTENSION_TYPES);\n\n/**\n * The MIME type for a filename, or undefined when the extension is unknown.\n *\n * Undefined rather than a fallback on purpose: `application/octet-stream` is\n * exactly what the server rejects, so guessing it would only reproduce the\n * original confusing error.\n */\nexport function mimeTypeForFilename(name: string): string | undefined {\n const ext = name.includes(\".\") ? name.slice(name.lastIndexOf(\".\") + 1).toLowerCase() : \"\";\n return EXTENSION_TYPES[ext];\n}\n\n/**\n * Message for a file whose type cannot be determined. The server's own error\n * (\"Invalid type: application/octet-stream\") does not say what to do about it.\n */\nexport function unknownTypeMessage(name: string): string {\n return (\n `@m8tes/sdk: cannot infer a content type for \"${name}\", and the upload endpoint ` +\n `rejects files whose type it does not recognise. Pass it explicitly — ` +\n `{ name: \"${name}\", data, type: \"text/plain\" } — or rename the file with a known ` +\n `extension (${UPLOADABLE_EXTENSIONS.slice(0, 12).join(\", \")}, ...).`\n );\n}\n","/**\n * Wait for a run to finish.\n *\n * Streaming is the good path: you see the work as it happens. But plenty of\n * integrations are a queue worker or a cron job that just wants the answer, and\n * without this every one of them hand-rolls the same loop — with its own idea of\n * which statuses are terminal, its own backoff, and usually no timeout. That is\n * the single most common thing a developer had to build themselves.\n *\n * Mirrors `sdk/py/m8tes/_resources/runs.py` (`poll`, `wait`): same terminal set,\n * same 2s interval and 300s default timeout, same \"a transient API error is not\n * a failure, keep polling until the deadline\" behaviour.\n */\n\nimport {\n AuthenticationError,\n ConflictError,\n NotFoundError,\n PermissionDeniedError,\n ValidationError,\n} from \"./protocol/index\";\nimport type { PermissionRequest, Run } from \"./types\";\n\n/**\n * A revoked key, a deleted run, or a bad id will NEVER become terminal, so\n * retrying is pure cost: ~150 authenticated requests over the default 300s,\n * ending in a timeout whose advice (\"raise the timeout, or stream instead\") is\n * wrong for all three. Only genuinely transient failures keep polling.\n */\nfunction isPermanent(err: unknown): boolean {\n return (\n err instanceof AuthenticationError ||\n err instanceof PermissionDeniedError ||\n err instanceof NotFoundError ||\n err instanceof ValidationError\n );\n}\n\n/**\n * A run is done when it reaches one of these.\n *\n * Mirrors `TERMINAL_RUN_STATUSES` in `fastapi/app/models/run.py`, which is the\n * canonical set — including `\"closed\"` (a user-closed chat that cannot resume).\n * Both SDKs previously omitted it, so a closed run polled until the timeout.\n * The backend's own comment on that set warns these lists drift and that \"a\n * 'closed' chat run burned tokens too\". `archived` is deliberately NOT here:\n * it is a display state applied to already-terminal runs.\n */\nexport const TERMINAL_STATUSES = new Set([\"completed\", \"failed\", \"cancelled\", \"closed\"]);\n\n/**\n * Gate refusals `wait()` may ride out, keyed on the server's machine-readable\n * `error.details.error_code` (`fastapi/app/routers/v2/runs.py::approve_permission`).\n * Mirrors `_BENIGN_GATE_REFUSALS` in `sdk/py/m8tes/_resources/runs.py`.\n *\n * Membership is the SAFETY boundary, so it is an ALLOWLIST, not a denylist: anything\n * unrecognised — including an older server that sends no code at all — propagates. A\n * refusal the SDK cannot positively identify as harmless is treated as harmful,\n * because the one it must never swallow (`gate_resolved_otherwise`: another approver\n * decided the OPPOSITE way) is indistinguishable from the benign ones without it.\n *\n * `run_not_active` is benign ONLY because the server raises it exclusively for a gate\n * still OPEN on a finished run. If a CONTRADICTED decision could ever report\n * `run_not_active`, a lost denial would be swallowed here — so that split is a\n * contract, pinned server-side by\n * `test_a_contradicted_decision_on_a_terminal_run_is_not_reported_as_benign`.\n */\nconst BENIGN_GATE_REFUSAL_CODES = new Set([\"gate_cancelled\", \"run_not_active\"]);\n\n/**\n * The one benign refusal the server still spells as prose. `POST /runs/{id}/answer`\n * raises `HTTPException(409, detail=\"auto_continued\")` — a STRING detail, and\n * `routers/v2/_errors.py` lifts `error_code` only out of a DICT one — so the envelope\n * carries no code to branch on. It means the platform proceeded with the\n * \"(Recommended)\" option after ~10 minutes and the run is executing normally.\n *\n * Matched as the EXACT, complete message, never a substring, so no other 409 can\n * borrow it. Giving that endpoint a real code (and deleting this) is filed in\n * `TODOS.md`; until then, dropping it would break every polling caller on the\n * documented auto-continue path.\n */\nconst AUTO_CONTINUED_MESSAGE = \"auto_continued\";\n\nfunction isBenignGateRefusal(err: ConflictError | NotFoundError): boolean {\n if (err.errorCode !== undefined) return BENIGN_GATE_REFUSAL_CODES.has(err.errorCode);\n return err instanceof ConflictError && err.message === AUTO_CONTINUED_MESSAGE;\n}\n\nexport interface PollOptions {\n /** Seconds between polls. Default 2. */\n interval?: number;\n /** Seconds before giving up. Default 300. */\n timeout?: number;\n /** Abort the wait early. The in-flight request is cancelled with it. */\n signal?: AbortSignal;\n /**\n * End-user scope for each `GET /runs/{id}` poll. Required when the account\n * has strict multi-tenant mode on — without it every poll 422s.\n */\n user_id?: string;\n}\n\nexport interface WaitOptions extends PollOptions {\n /**\n * Called when a tool needs a decision. Return \"allow\" or \"deny\".\n * Without it, a run that pauses for a tool throws rather than hanging until\n * the timeout — silence would look identical to a slow run.\n */\n onApproval?: (request: PermissionRequest) => \"allow\" | \"deny\" | Promise<\"allow\" | \"deny\">;\n /**\n * Called when the agent asks a question. Return `{ [question text]: answer }`.\n * The keys must be the exact `question` strings from the request.\n */\n onQuestion?: (\n request: PermissionRequest,\n ) => Record<string, string> | Promise<Record<string, string>>;\n}\n\n/** Thrown when a run does not reach a terminal status before the deadline. */\nexport class RunTimeoutError extends Error {\n readonly runId: number;\n readonly timeoutSeconds: number;\n /** The last error seen while polling, if any. Without it a timeout hides the\n * transient failure that actually caused it. */\n override readonly cause?: unknown;\n /** The run's status when the deadline hit, when one was ever observed. */\n readonly lastStatus?: string;\n constructor(runId: number, timeoutSeconds: number, cause?: unknown, lastStatus?: string) {\n // The likeliest cause of a poll() timeout is a run parked at\n // awaiting_approval, which NEVER becomes terminal — so \"raise the timeout\"\n // is the one piece of advice guaranteed not to help. Say what actually\n // unblocks it when we know the status.\n const advice =\n lastStatus === \"awaiting_approval\"\n ? `The run is waiting for a human and will never finish on its own: use runs.wait() with ` +\n `onApproval/onQuestion, or resolve it yourself via runs.permissions(${runId}).`\n : `Raise the timeout, or stream the run instead of polling it.`;\n super(\n `Run ${runId} did not reach a terminal status within ${timeoutSeconds}s` +\n (lastStatus ? ` (last status: ${lastStatus})` : \"\") +\n `. ${advice}` +\n (cause instanceof Error ? ` Last error while polling: ${cause.message}` : \"\"),\n );\n this.name = \"RunTimeoutError\";\n this.runId = runId;\n this.timeoutSeconds = timeoutSeconds;\n this.cause = cause;\n if (lastStatus !== undefined) this.lastStatus = lastStatus;\n }\n}\n\n/**\n * Thrown when a run pauses for a human and no handler was supplied. Better than\n * waiting out the full timeout, which gives the caller no idea what happened.\n */\nexport class RunPausedError extends Error {\n readonly runId: number;\n readonly request: PermissionRequest;\n constructor(runId: number, request: PermissionRequest, hint: string) {\n super(`Run ${runId} is waiting for a human: ${hint}`);\n this.name = \"RunPausedError\";\n this.runId = runId;\n this.request = request;\n }\n}\n\n/** Normalized options, with a monotonic deadline. */\nfunction plan(options: PollOptions): {\n interval: number;\n timeout: number;\n deadline: number;\n signal?: AbortSignal;\n} {\n const interval = options.interval ?? 2;\n const timeout = options.timeout ?? 300;\n // NaN makes every `now() >= deadline` false and turns setTimeout into an\n // immediate timer, so the loop hot-spins against the API until something\n // external kills it. A negative interval does the same. Refuse both loudly.\n for (const [name, value] of [[\"interval\", interval], [\"timeout\", timeout]] as const) {\n if (!Number.isFinite(value) || value < 0) {\n throw new TypeError(\n `@m8tes/sdk: ${name} must be a finite, non-negative number of seconds (got ${String(value)}).`,\n );\n }\n }\n return { interval, timeout, deadline: now() + timeout * 1000, signal: options.signal };\n}\n\n/**\n * Sleep for `interval`, but never past the deadline — otherwise a long interval\n * with a short timeout overshoots by the whole interval before anyone checks.\n */\nfunction napUntil(interval: number, deadline: number, signal?: AbortSignal): Promise<void> {\n const remaining = Math.max(0, deadline - now()) / 1000;\n return sleep(Math.min(interval, remaining), signal);\n}\n\n/**\n * Bound an awaited operation by the deadline (and the abort signal).\n *\n * Without this the advertised timeout only gated the gaps BETWEEN awaits: a\n * caller's `onApproval` that never settles hung `wait()` forever, and a slow\n * request could return success long after the deadline had passed. Now every\n * await is raced against the remaining time.\n */\nasync function withDeadline<T>(\n start: () => Promise<T>,\n deadline: number,\n signal: AbortSignal | undefined,\n onExpired: () => Error,\n): Promise<T> {\n const remaining = deadline - now();\n // A FACTORY, not a promise: an argument would be evaluated eagerly, firing a\n // request (or invoking the caller's callback) that is then thrown away — the\n // work happens, costs, and is ignored. Nothing starts once time is up.\n if (remaining <= 0) throw onExpired();\n const work = start();\n let timer: ReturnType<typeof setTimeout> | undefined;\n let onAbort: (() => void) | undefined;\n try {\n return await Promise.race([\n work,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(onExpired()), remaining);\n if (signal) {\n onAbort = () => reject(onExpired());\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n if (signal && onAbort) signal.removeEventListener(\"abort\", onAbort);\n }\n}\n\n/** Interruptible sleep. An abort resolves it immediately rather than stranding the caller. */\nfunction sleep(seconds: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timer = setTimeout(done, seconds * 1000);\n function done(): void {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\n/** True for an AskUserQuestion pause carrying a plan for approval (plan mode). */\nexport function isPlanApproval(request: PermissionRequest): boolean {\n if (request.tool_name !== \"AskUserQuestion\") return false;\n const questions = (request.tool_input as { questions?: Array<{ header?: string }> } | null)\n ?.questions;\n return Array.isArray(questions) && questions.some((q) => q?.header === \"Plan Approval\");\n}\n\n/** The proposed plan text, for a plan-approval pause. Null otherwise. */\nexport function planText(request: PermissionRequest): string | null {\n if (!isPlanApproval(request)) return null;\n const questions = (\n request.tool_input as { questions?: Array<{ header?: string; question?: string }> } | null\n )?.questions;\n return questions?.find((q) => q?.header === \"Plan Approval\")?.question ?? null;\n}\n\n/**\n * Injected by the runs resource so this module stays free of transport concerns.\n * Every call takes the caller's `signal`, so an abort cancels the in-flight HTTP\n * request instead of only shortening the next sleep.\n */\nexport interface PollDeps {\n get(runId: number, signal?: AbortSignal): Promise<Run>;\n permissions(runId: number, signal?: AbortSignal): Promise<PermissionRequest[]>;\n approve(\n runId: number,\n params: { request_id: string; decision: \"allow\" | \"deny\" },\n signal?: AbortSignal,\n ): Promise<unknown>;\n answer(\n runId: number,\n params: { answers: Record<string, string> },\n signal?: AbortSignal,\n ): Promise<unknown>;\n}\n\n/**\n * Monotonic milliseconds. `Date.now()` follows the wall clock, so an NTP\n * correction backwards mid-wait extends the timeout by the same amount (and\n * repeated corrections can stop it expiring at all). Python uses\n * `time.monotonic()` for exactly this reason.\n */\nconst now = (): number =>\n typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n\n/** Thrown when the caller aborts the wait. */\nexport class RunWaitAbortedError extends Error {\n /**\n * The run being waited on — `undefined` when the abort landed BEFORE any run\n * was created, which is the one case where there is nothing to go back to.\n * Previously this path passed a literal 0, producing \"Waiting on run 0 was\n * aborted\" and pointing the reader at a run that never existed.\n */\n readonly runId?: number;\n constructor(runId?: number) {\n super(\n runId === undefined\n ? \"Aborted before the run was created; nothing was started and nothing was billed.\"\n : `Waiting on run ${runId} was aborted. The run is still executing — ` +\n `poll it later with runs.get(${runId}), or stop it with runs.cancel(${runId}).`,\n );\n this.name = \"RunWaitAbortedError\";\n if (runId !== undefined) this.runId = runId;\n }\n}\n\n/**\n * Poll until the run is terminal.\n *\n * A run that pauses for a human never becomes terminal, so this would spin until\n * the timeout — `waitForRun` handles that case. `poll` is for autonomous runs.\n */\nexport async function pollRun(deps: PollDeps, runId: number, options: PollOptions = {}): Promise<Run> {\n const { interval, timeout, deadline, signal } = plan(options);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n // Kept so a timeout can still show WHY the last attempt failed.\n let lastError: unknown;\n // Kept so the timeout can give advice that fits the state the run is actually in.\n let lastStatus: string | undefined;\n\n for (;;) {\n let run: Run | undefined;\n try {\n run = await withDeadline(() => deps.get(runId, signal), deadline, signal, () =>\n signal?.aborted ? new RunWaitAbortedError(runId) : new RunTimeoutError(runId, timeout, lastError, lastStatus),\n );\n } catch (err) {\n // A timeout/abort raised by withDeadline is the verdict, not a blip.\n if (err instanceof RunTimeoutError || err instanceof RunWaitAbortedError) throw err;\n // A blip while the run is executing is not a failure: keep polling until\n // the deadline. But a 401/403/404 never resolves, so surface it now.\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (isPermanent(err)) throw err;\n lastError = err;\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n await napUntil(interval, deadline, signal);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n continue;\n }\n\n lastStatus = run.status;\n if (TERMINAL_STATUSES.has(run.status)) return run;\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n await napUntil(interval, deadline, signal);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n // The deadline can pass DURING the sleep; without this the loop would issue\n // one more request and could return successfully long after it expired.\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n }\n}\n\n/**\n * Wait for a run, answering human-in-the-loop pauses through callbacks.\n *\n * Same loop as `pollRun`, plus: on `awaiting_approval`, resolve every pending\n * request and let the run continue.\n */\nexport async function waitForRun(\n deps: PollDeps,\n runId: number,\n options: WaitOptions = {},\n): Promise<Run> {\n const { interval, timeout, deadline, signal } = plan(options);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n // Kept so a timeout can still show WHY the last attempt failed.\n let lastError: unknown;\n // Kept so the timeout can give advice that fits the state the run is actually in.\n let lastStatus: string | undefined;\n // A request we have already answered can still come back as \"pending\" on the\n // next poll, because the backend has not flipped its status yet. Without this\n // ledger the caller's onApproval/onQuestion fires again for the same gate —\n // and a callback that notifies a human or increments a counter would repeat.\n // Measured: 3 duplicate calls across 4 polls before this was added.\n const answered = new Set<string>();\n\n for (;;) {\n let run: Run | undefined;\n try {\n run = await withDeadline(() => deps.get(runId, signal), deadline, signal, () =>\n signal?.aborted ? new RunWaitAbortedError(runId) : new RunTimeoutError(runId, timeout, lastError, lastStatus),\n );\n } catch (err) {\n if (err instanceof RunTimeoutError || err instanceof RunWaitAbortedError) throw err;\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (isPermanent(err)) throw err;\n lastError = err;\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n await napUntil(interval, deadline, signal);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n continue;\n }\n\n lastStatus = run.status;\n if (TERMINAL_STATUSES.has(run.status)) return run;\n\n if (run.status === \"awaiting_approval\") {\n const expired = () =>\n signal?.aborted ? new RunWaitAbortedError(runId) : new RunTimeoutError(runId, timeout, lastError, lastStatus);\n const bound = <T>(start: () => Promise<T>): Promise<T> => withDeadline(start, deadline, signal, expired);\n /**\n * Resolving a gate can lose a race the caller cannot prevent — but two very\n * different losses look alike, so this branches on the SERVER'S code, never on\n * the status alone.\n *\n * benign — the gate was cancelled, the run went terminal, or the platform\n * auto-continued a \"(Recommended)\" question. Nothing a human decided was\n * contradicted, and `wait()` owes the caller the RUN's outcome, not the\n * gate's; keep polling and the next `get()` returns the real result.\n *\n * CONTRADICTED — another approver decided the OTHER way (or answered the same\n * question differently), so this caller's decision did NOT happen and the\n * opposite one is what runs. `onQuestion` picks A, Slack commits B, `/answer`\n * 409s the losing A: swallowing that makes `wait()` return a completed run to\n * a caller who believes they blocked the tool that just executed. It is the\n * same false confirmation the 404 exists to prevent, one layer up.\n *\n * Swallowing EVERY conflict could not tell those apart. See\n * `_BENIGN_GATE_REFUSALS` in `sdk/py/m8tes/_resources/runs.py` — same allowlist,\n * same reasoning, deliberately kept in step.\n */\n const resolveGate = async (start: () => Promise<unknown>): Promise<void> => {\n try {\n await bound(start);\n } catch (err) {\n if (!(err instanceof ConflictError) && !(err instanceof NotFoundError)) throw err;\n if (!isBenignGateRefusal(err)) throw err;\n }\n };\n const pending = (await bound(() => deps.permissions(runId, signal))).filter(\n (r) => r.status === \"pending\" && !answered.has(r.request_id),\n );\n for (const request of pending) {\n answered.add(request.request_id);\n if (request.tool_name === \"AskUserQuestion\") {\n if (!options.onQuestion) {\n throw new RunPausedError(\n runId,\n request,\n \"the agent asked a question. Pass onQuestion to answer it, or call runs.answer() yourself.\",\n );\n }\n // The callback is the caller's code: it can hang, so it is bounded too.\n const answers = await bound(async () => options.onQuestion!(request));\n await resolveGate(() => deps.answer(runId, { answers }, signal));\n } else {\n if (!options.onApproval) {\n throw new RunPausedError(\n runId,\n request,\n `the tool \"${request.tool_name}\" needs a decision. Pass onApproval, or call runs.approve() yourself.`,\n );\n }\n const decision = await bound(async () => options.onApproval!(request));\n await resolveGate(() => deps.approve(runId, { request_id: request.request_id, decision }, signal));\n }\n }\n }\n\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n await napUntil(interval, deadline, signal);\n if (signal?.aborted) throw new RunWaitAbortedError(runId);\n if (now() >= deadline) throw new RunTimeoutError(runId, timeout, lastError, lastStatus);\n }\n}\n","/**\n * `RunStream` — the developer-facing view of a streaming run.\n *\n * Mirrors the Python SDK's `RunStream` (`sdk/py/m8tes/_streaming.py`): iterate\n * events, or just await the text. It accumulates as you consume, so after\n * iterating you have `.text`, `.runId`, and `.errors` without a second request.\n *\n * Beyond Python it also exposes `.state` — the full normalized conversation\n * (messages, tool calls, notices) from the shared protocol accumulator. Useful\n * server-side for logging what the agent actually did, not just what it said.\n *\n * Nothing is consumed until you iterate: constructing a RunStream is free, and\n * an un-iterated stream is closed by `close()` without reading the body.\n */\n\nimport {\n RunFailedError,\n accumulate,\n initialConversationState,\n isTerminalEvent,\n type ConversationState,\n type M8tesStreamEvent,\n} from \"./protocol/index\";\n\nexport interface RunStreamOptions {\n /**\n * Throw `RunFailedError` once iteration finishes if the run emitted any error\n * event, so a mid-run failure is never mistaken for a successful empty run.\n * Defaults to false, matching the Python SDK.\n */\n raiseOnError?: boolean;\n /**\n * Reuse this key to retry the same call safely — the server replays the run the\n * first attempt produced instead of starting (and billing) a second one. One is\n * minted per call automatically; supply your own only when a retry must survive\n * a process restart. Sent as the `Idempotency-Key` header.\n */\n idempotencyKey?: string;\n}\n\nexport class RunStream implements AsyncIterable<M8tesStreamEvent> {\n private readonly source: AsyncGenerator<M8tesStreamEvent, void, unknown>;\n private readonly raiseOnError: boolean;\n private state: ConversationState = initialConversationState;\n private textChunks: string[] = [];\n private errorMessages: string[] = [];\n private runIdValue: number | null = null;\n private consumed = false;\n\n constructor(\n source: AsyncGenerator<M8tesStreamEvent, void, unknown>,\n options: RunStreamOptions = {},\n ) {\n this.source = source;\n this.raiseOnError = options.raiseOnError ?? false;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<M8tesStreamEvent> {\n if (this.consumed) {\n throw new Error(\n \"RunStream has already been consumed. A stream is single-pass — iterate once, \" +\n \"then read .text / .state / .errors, or call runs.get(runId) to re-read the result.\",\n );\n }\n this.consumed = true;\n try {\n for await (const event of this.source) {\n this.state = accumulate(this.state, event);\n if (event.type === \"text-delta\") this.textChunks.push(event.delta);\n if (event.type === \"run-start\" && event.runId !== null) this.runIdValue = event.runId;\n if (event.type === \"run-error\") this.errorMessages.push(event.message || event.error);\n yield event;\n }\n } finally {\n // Closing the source generator cancels the underlying HTTP response even\n // when the caller breaks out of the loop early.\n await this.source.return(undefined).catch(() => undefined);\n }\n if (this.raiseOnError && this.errorMessages.length > 0) {\n throw new RunFailedError(`Run failed: ${this.errorMessages.join(\"; \")}`, {\n type: \"run_failed\",\n code: 0,\n status: 0,\n details: { errors: this.errorMessages },\n });\n }\n }\n\n /** Yield only the assistant's text, in order. The 90% case for a server. */\n async *iterText(): AsyncGenerator<string, void, unknown> {\n for await (const event of this) {\n if (event.type === \"text-delta\") yield event.delta;\n }\n }\n\n /** Drain the stream and return the full assistant text. */\n async text(): Promise<string> {\n for await (const _ of this) {\n /* accumulate */\n }\n return this.textChunks.join(\"\");\n }\n\n /** Accumulated text so far (complete once iteration finishes). */\n get output(): string {\n return this.textChunks.join(\"\");\n }\n\n /** Run id, available as soon as the first `run-start` event arrives. */\n get runId(): number | null {\n return this.runIdValue;\n }\n\n /** Error messages the run emitted. Check this, or pass `raiseOnError`. */\n get errors(): string[] {\n return [...this.errorMessages];\n }\n\n get hasErrors(): boolean {\n return this.errorMessages.length > 0;\n }\n\n /** Full normalized conversation: messages, tool calls, notices, status. */\n get conversation(): ConversationState {\n return this.state;\n }\n\n /** Close the underlying response without draining it. */\n async close(): Promise<void> {\n await this.source.return(undefined).catch(() => undefined);\n }\n}\n\nexport { isTerminalEvent };\n","/**\n * `client.runs` — start agents, stream what they do, and answer them mid-run.\n *\n * `create()` is the one call most integrations need: it provisions a default\n * agent if the account has none, so a brand-new key can run an agent in one\n * request. Mirrors `sdk/py/m8tes/_resources/runs.py`, field for field.\n */\n\nimport { IDEMPOTENCY_HEADER, type Http } from \"../http\";\nimport { mimeTypeForFilename, unknownTypeMessage } from \"../mime\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { resolveAgentId, toBody, toQuery } from \"../params\";\nimport {\n pollRun,\n RunWaitAbortedError,\n TERMINAL_STATUSES,\n waitForRun,\n type PollDeps,\n type PollOptions,\n type WaitOptions,\n} from \"../polling\";\nimport { ConflictError, ValidationError, type M8tesStreamEvent } from \"../protocol/index\";\n\n/**\n * Stamp the run id onto an error on its way out of a wait.\n *\n * `waitForRun` tolerates transient failures on `get`, but a failure while\n * resolving a permission gate (permissions/answer/approve) escapes to the\n * caller. Escaping is a defensible trade-off; escaping ANONYMOUSLY is not — for\n * `createAndWait` the caller never saw the id, so a run that is created,\n * billed, and STILL EXECUTING became unreachable. The error's class is\n * preserved so `instanceof ValidationError` and friends keep working; the id is\n * purely additive, and never overwrites an existing `runId`.\n */\nfunction withRunId<E>(err: E, runId: number): E {\n if (err && typeof err === \"object\" && !(\"runId\" in err)) {\n Object.defineProperty(err, \"runId\", { value: runId, enumerable: true, configurable: true });\n const e = err as { message?: string };\n if (typeof e.message === \"string\" && !e.message.includes(String(runId))) {\n e.message = `${e.message} (while waiting on run ${runId}, which is still executing)`;\n }\n }\n return err;\n}\nimport { RunStream, type RunStreamOptions } from \"../streaming\";\nimport type {\n JsonObject,\n PermissionMode,\n PermissionRequest,\n Run,\n RunFile,\n RunOutcome,\n} from \"../types\";\n\nexport interface RunCreateParams {\n /** What the agent should do. */\n message: string;\n /** Which agent runs it. Omit to use (or auto-provision) the account default. */\n agent_id?: number;\n /** Permanent legacy alias for `agent_id` — the same wire field. */\n teammate_id?: number;\n /** Your id for the end-user this run belongs to. Isolates their memory, history, and tool connections. */\n user_id?: string;\n /** Tool slugs available for this run. */\n tools?: string[];\n /** One-off system instructions for this run. */\n instructions?: string;\n /** Name a newly auto-created agent. */\n name?: string;\n /** Your own key/value data, echoed back on the Run. */\n metadata?: JsonObject;\n model?: string;\n effort?: string;\n permission_mode?: PermissionMode;\n /** Enable clarifying questions, tool approval, and plan mode. */\n human_in_the_loop?: boolean;\n /** Run-level overrides for the built-in tools. Omit to inherit the agent default. */\n memory?: boolean;\n history?: boolean;\n task_setup_tools?: boolean;\n feedback?: boolean;\n /** Ask for structured output matching this JSON Schema; lands on `run.output_data`. */\n output_schema?: JsonObject;\n /** Give this run's agent an email inbox. */\n email_inbox?: boolean;\n /**\n * Reuse this key to retry the same create safely — the server returns the run\n * the first attempt made instead of starting (and billing) a second one.\n *\n * One is minted per call automatically, which is what makes the SDK's own\n * retries safe. Supply your own only when a retry must survive a process\n * restart: a job runner re-driving the same unit of work should pass its job\n * id. Sent as the `Idempotency-Key` header; never part of the request body.\n */\n idempotencyKey?: string;\n /**\n * Files the agent can read: a CSV to analyze, a PDF to summarize. Each is a\n * `{ name, data }` pair; `data` accepts anything `FormData` takes (Blob,\n * Uint8Array, ArrayBuffer, string). Sending files switches the request to the\n * multipart `/runs/with-files` endpoint; every other option behaves the same.\n *\n * Attachments require sandbox execution (the agent reads them with its file\n * tools from the run's working directory).\n */\n files?: RunFileInput[];\n}\n\n/** One attachment for `runs.create({ files })`. */\nexport interface RunFileInput {\n /** Filename the agent will see. Its extension determines the content type. */\n name: string;\n /** Contents. `Blob`/`File` pass straight through; bytes and strings are wrapped. */\n data: Blob | ArrayBuffer | ArrayBufferView | string;\n /**\n * Content type, if the extension does not imply it. The upload endpoint\n * validates against an allowlist and rejects the batch on a miss, so this is\n * inferred from `name` by default rather than defaulting to\n * `application/octet-stream` (which the server refuses).\n */\n type?: string;\n}\n\nexport interface RunListParams {\n user_id?: string;\n agent_id?: number;\n teammate_id?: number;\n task_id?: number;\n status?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface ApproveParams {\n /** From the `approval-request` event, or `runs.permissions()`. */\n request_id: string;\n decision: \"allow\" | \"deny\";\n /**\n * Persist beyond this single gate.\n * - `false` (default): this request only.\n * - `true` + allow: also silence matching tools for the rest of THIS run AND\n * store a cross-run always-allow policy (scoped to the run's end-user when\n * set; revoke via `/permissions`).\n * - `true` + deny: deny matching tools for the rest of THIS run only (no\n * stored policy).\n */\n remember?: boolean;\n}\n\nexport interface AnswerParams {\n /**\n * Question text → the option label you picked. The keys must be the exact\n * `question` strings from the `question` event.\n */\n answers: Record<string, string>;\n}\n\nexport interface RunsResource {\n /** Start a run and stream it. */\n create(params: RunCreateParams, options?: RunStreamOptions): RunStream;\n /** Start a run and return immediately; poll `get()` or use a webhook for the result. */\n createAsync(params: RunCreateParams): Promise<Run>;\n /**\n * Start a run and wait for the result. The batch/cron counterpart to `create()`.\n * Pass `onApproval`/`onQuestion` to answer human-in-the-loop pauses inline;\n * without them a paused run throws `RunPausedError` rather than hanging.\n */\n createAndWait(params: RunCreateParams, options?: WaitOptions): Promise<Run>;\n /** Poll an existing run until it is terminal. Throws `RunTimeoutError` on deadline. */\n poll(runId: number, options?: PollOptions): Promise<Run>;\n /** Like `poll`, but resolves human-in-the-loop pauses through callbacks. */\n wait(runId: number, options?: WaitOptions): Promise<Run>;\n /**\n * Retry a failed or cancelled run. Returns a NEW run — poll that one's id, the\n * original stays failed. Idempotent: an in-flight retry is returned as-is.\n *\n * If the run already did something visible (sent a message, changed data), the\n * API refuses with a 409 `retry_needs_confirmation`; pass `confirm: true` to\n * proceed. Check `run.retryable` first to avoid a guaranteed conflict.\n */\n retry(runId: number, params?: { confirm?: boolean }): Promise<Run>;\n /** Join a run already in flight. Throws `RunNotStreamingError` if it has finished. */\n stream(runId: number, options?: RunStreamOptions): RunStream;\n /** Continue the conversation on an existing run, streaming the reply. */\n reply(runId: number, message: string, options?: RunStreamOptions): RunStream;\n /** GET /runs/{id}. Pass `user_id` to scope to one end-user (required when the\n * account has strict multi-tenant mode on). */\n get(runId: number, params?: { user_id?: string }): Promise<Run>;\n list(params?: RunListParams): Promise<Page<Run>>;\n /** Cancel a running run. Returns the updated Run, like the Python SDK.\n * Pass `user_id` when the account has strict multi-tenant mode on. */\n cancel(runId: number, params?: { user_id?: string }): Promise<Run>;\n /** Approve or deny a pending tool-permission gate. */\n approve(runId: number, params: ApproveParams): Promise<PermissionRequest>;\n /** Answer a pending AskUserQuestion gate, resuming the run. */\n answer(runId: number, params: AnswerParams): Promise<{ status: string; resumed: boolean }>;\n /** Gates currently waiting on a human. */\n permissions(runId: number): Promise<PermissionRequest[]>;\n /** Condensed result: headline, summary, tokens, cost. */\n outcome(runId: number): Promise<RunOutcome>;\n /** Files the agent produced. */\n files(runId: number): Promise<RunFile[]>;\n /** Download one produced file. */\n downloadFile(runId: number, filename: string): Promise<ArrayBuffer>;\n}\n\n/** Unwrap `{data: [...]}` or a bare array — both shapes exist across v2 routes. */\nfunction items(payload: { data?: unknown[] } | unknown[] | undefined): unknown[] {\n return Array.isArray(payload) ? payload : (payload?.data ?? []);\n}\n\n/**\n * Headers for a run-creating POST — minting a key when the caller gave none.\n *\n * A key is ALWAYS sent. Runs are billable, so a POST that times out is otherwise\n * unanswerable: retry and you may pay twice, don't and you may drop the request.\n * With a key the server binds it to the run it created and replays that run for\n * every repeat, which is what lets `http` retry these POSTs at all.\n *\n * Mirrors `idempotency_headers` in the Python SDK. Auto-minting never dedupes two\n * DELIBERATE identical runs: those are two calls, and each mints its own key.\n * Pass `idempotencyKey` to reuse one across process restarts (a job runner\n * re-driving the same unit of work should pass its job id).\n */\nexport function idempotencyHeaders(key?: string): Record<string, string> {\n return { [IDEMPOTENCY_HEADER]: key ?? crypto.randomUUID() };\n}\n\n/**\n * Follow an idempotent replay to the run's live stream.\n *\n * A run that has ALREADY finished by the time the retry lands has nothing to\n * join, so this throws rather than yielding an empty stream that would read as\n * \"the agent said nothing\". The window is the retry backoff (sub-second), and the\n * error names the run so the caller can fetch its result — still strictly better\n * than the pre-idempotency outcome, where a timed-out create left them unable to\n * learn the run existed at all.\n */\nexport function replayJoin(\n http: Http,\n): (run: { id: number; status: string }) => AsyncGenerator<M8tesStreamEvent, void, unknown> {\n return async function* (run) {\n if (TERMINAL_STATUSES.has(run.status)) {\n throw new ConflictError(\n `Run ${run.id} was already created by an earlier attempt with this idempotency ` +\n `key and has finished (status=${run.status}), so there is no stream to join. ` +\n `You were charged once. Fetch the result with runs.get(${run.id}).`,\n {\n type: \"invalid_request_error\",\n code: 409,\n status: 409,\n details: { error_code: \"idempotent_replay_terminal\", run_id: run.id, status: run.status },\n },\n );\n }\n yield* http.stream(\"GET\", `/runs/${seg(run.id)}/stream`);\n };\n}\n\nexport function createRunsResource(http: Http): RunsResource {\n const createBody = (p: RunCreateParams, stream: boolean): Record<string, unknown> => {\n const { agent_id, teammate_id, files, idempotencyKey, ...rest } = p;\n void files; // carried in the multipart form, never in the JSON body\n void idempotencyKey; // rides in the Idempotency-Key HEADER, never in the body\n return toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id), stream });\n };\n\n /** Multipart form for /runs/with-files: the same JSON under `payload`, plus the files. */\n const createForm = (p: RunCreateParams, stream: boolean): FormData => {\n const form = new FormData();\n form.append(\"payload\", JSON.stringify(createBody(p, stream)));\n for (const f of p.files ?? []) {\n // Precedence: an explicit `type` always wins (otherwise a Blob carrying\n // application/octet-stream would override the caller's own correction and\n // the server would reject the batch), then the Blob's own type, then the\n // filename extension.\n const blobType = f.data instanceof Blob && f.data.type ? f.data.type : undefined;\n const type = f.type ?? blobType ?? mimeTypeForFilename(f.name);\n if (!type) throw new TypeError(unknownTypeMessage(f.name));\n const blob =\n f.data instanceof Blob && f.data.type === type\n ? f.data\n : new Blob([f.data as BlobPart], { type });\n form.append(\"files\", blob, f.name);\n }\n return form;\n };\n\n const hasFiles = (p: RunCreateParams): boolean => (p.files?.length ?? 0) > 0;\n\n // Injected into the polling helpers so they stay transport-free.\n // The caller's abort signal reaches every request, so cancelling a wait\n // cancels the in-flight HTTP call rather than just shortening the next sleep.\n //\n // `user_id` is closed over per call: strict multi-tenant mode requires it on\n // every GET /runs/{id}, and createAndWait inherits it from the create body.\n const pollDeps = (userId?: string): PollDeps => ({\n get: (runId, signal) =>\n http.request<Run>(\"GET\", `/runs/${seg(runId)}`, {\n query: toQuery({ user_id: userId }),\n signal,\n }),\n permissions: async (runId, signal) =>\n items(await http.request(\"GET\", `/runs/${seg(runId)}/permissions`, { signal })) as PermissionRequest[],\n approve: (runId, params, signal) =>\n http.request(\"POST\", `/runs/${seg(runId)}/approve`, { body: { remember: false, ...params }, signal }),\n answer: (runId, params, signal) =>\n http.request(\"POST\", `/runs/${seg(runId)}/answer`, { body: params, signal }),\n });\n\n // Declared as a local (not a method) so nothing here depends on `this`:\n // `const { createAndWait } = client.runs` is a normal thing to write, and it\n // threw \"Cannot read properties of undefined\" while createAndWait was the one\n // method calling `this.createAsync`. Verified against the packed tarball.\n //\n // `async` on purpose: an unmappable attachment must REJECT, not throw\n // synchronously, or `.catch()` would miss what try/catch catches. (Streaming\n // `create()` returns a RunStream rather than a promise, so it throws\n // synchronously — you never got a stream to iterate.)\n const createAsync = async (params: RunCreateParams): Promise<Run> => {\n const headers = idempotencyHeaders(params.idempotencyKey);\n return hasFiles(params)\n ? http.request<Run>(\"POST\", \"/runs/with-files\", { form: createForm(params, false), headers })\n : http.request<Run>(\"POST\", \"/runs\", { body: createBody(params, false), headers });\n };\n\n return {\n create(params, options) {\n const headers = idempotencyHeaders(params.idempotencyKey);\n const init = hasFiles(params)\n ? { form: createForm(params, true), headers }\n : { body: createBody(params, true), headers };\n const path = hasFiles(params) ? \"/runs/with-files\" : \"/runs\";\n return new RunStream(\n http.stream(\"POST\", path, { ...init, onReplay: replayJoin(http) }),\n options,\n );\n },\n\n createAsync,\n\n async createAndWait(params, options = {}) {\n // Check BEFORE creating: a run costs money, and starting one for an\n // operation the caller already cancelled is the one mistake here that\n // spends real budget. (Verified: this used to issue the POST first.)\n if (options.signal?.aborted) throw new RunWaitAbortedError();\n // Conflicting scopes would create a billable run then 404 on every poll\n // under strict mode — refuse before POST (Greptile T-Rex P1).\n if (\n options.user_id != null &&\n params.user_id != null &&\n options.user_id !== params.user_id\n ) {\n throw new ValidationError(\n `createAndWait: options.user_id (${JSON.stringify(options.user_id)}) conflicts with ` +\n `params.user_id (${JSON.stringify(params.user_id)}). Use one scope for create and poll.`,\n { type: \"invalid_request_error\", code: 0, status: 0 },\n );\n }\n // Fold wait-option scope into create when the body omitted it — otherwise\n // an options-only user_id would create an unscoped (or differently scoped)\n // run and then poll with a foreign scope → permanent 404 after billing.\n const createParams =\n params.user_id == null && options.user_id != null\n ? { ...params, user_id: options.user_id }\n : params;\n const started = await createAsync(createParams);\n // Past this line the run exists and is billable, so every failure must\n // still tell the caller WHICH run to go back to.\n // Prefer the API-stamped owner (truth after create), else the create body.\n // A create scope that resolves to a different stamped owner must poll as\n // stamped — otherwise strict mode 404s the billable run (Greptile P1).\n const userId = started.user_id ?? createParams.user_id ?? undefined;\n try {\n return await waitForRun(pollDeps(userId), started.id, { ...options, user_id: userId });\n } catch (err) {\n throw withRunId(err, started.id);\n }\n },\n\n poll(runId, options = {}) {\n return pollRun(pollDeps(options.user_id), runId, options);\n },\n\n wait(runId, options = {}) {\n return waitForRun(pollDeps(options.user_id), runId, options);\n },\n\n // `confirm` is a QUERY param and the route takes no body (verified against\n // fastapi/app/routers/v2/runs.py::retry_run), so send neither.\n retry(runId, params = {}) {\n return http.request<Run>(\"POST\", `/runs/${seg(runId)}/retry`, {\n query: params.confirm ? toQuery({ confirm: true }) : \"\",\n });\n },\n\n stream(runId, options) {\n return new RunStream(http.stream(\"GET\", `/runs/${seg(runId)}/stream`), options);\n },\n\n reply(runId, message, options) {\n return new RunStream(\n http.stream(\"POST\", `/runs/${seg(runId)}/reply`, {\n body: { message },\n headers: idempotencyHeaders(options?.idempotencyKey),\n onReplay: replayJoin(http),\n }),\n options,\n );\n },\n\n get(runId, params = {}) {\n return http.request<Run>(\"GET\", `/runs/${seg(runId)}`, {\n query: toQuery({ user_id: params.user_id }),\n });\n },\n\n async list(params = {}) {\n const { agent_id, teammate_id, ...rest } = params;\n const q = toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) });\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Run>> => {\n const res = await http.request<{ data: Run[]; has_more?: boolean; next_starting_after?: string | number | null }>(\"GET\", \"/runs\", {\n query: toQuery(p),\n });\n return new Page<Run>(\n res?.data ?? [],\n res?.has_more ?? false,\n (starting_after) => fetchPage({ ...p, starting_after }),\n res?.next_starting_after,\n );\n };\n return fetchPage(q);\n },\n\n cancel(runId, params = {}) {\n return http.request<Run>(\"POST\", `/runs/${seg(runId)}/cancel`, {\n query: toQuery({ user_id: params.user_id }),\n });\n },\n\n approve(runId, params) {\n return http.request<PermissionRequest>(\"POST\", `/runs/${seg(runId)}/approve`, {\n body: { remember: false, ...params },\n });\n },\n\n answer(runId, params) {\n // `answers` is keyed by question text and goes over the wire verbatim.\n return http.request<{ status: string; resumed: boolean }>(\"POST\", `/runs/${seg(runId)}/answer`, {\n body: { answers: params.answers },\n });\n },\n\n async permissions(runId) {\n return items(await http.request(\"GET\", `/runs/${seg(runId)}/permissions`)) as PermissionRequest[];\n },\n\n outcome(runId) {\n return http.request<RunOutcome>(\"GET\", `/runs/${seg(runId)}/outcome`);\n },\n\n async files(runId) {\n return items(await http.request(\"GET\", `/runs/${seg(runId)}/files`)) as RunFile[];\n },\n\n async downloadFile(runId, filename) {\n const res = await http.raw(\"GET\", `/runs/${seg(runId)}/files/${seg(filename)}/download`, {\n headers: { accept: \"application/octet-stream\" },\n });\n return res.arrayBuffer();\n },\n };\n}\n","/**\n * `client.settings` — account-level configuration.\n *\n * In v0.1 scope for one concrete reason: strict multi-tenant mode\n * (`require_end_user_id`) is ON by default for API accounts, and when it rejects a\n * request the backend's own 422 message says \"turn it off once with\n * client.settings.update(require_end_user_id=False)\". Without this resource a\n * TypeScript developer would follow that instruction into a method that does not\n * exist. Found by running the SDK against a real backend.\n *\n * Mirrors `sdk/py/m8tes/_resources/settings.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { toBody } from \"../params\";\n\nexport interface AccountSettings {\n /** Per-end-user monthly run cap. null = uncapped. */\n per_end_user_run_limit: number | null;\n /** Per-end-user monthly metered spend cap, in cents. null = uncapped. */\n per_end_user_cost_limit_cents: number | null;\n /** Per-end-user run-starts per minute. null = unthrottled. */\n per_end_user_rate_per_minute: number | null;\n /** \"standard\", or \"metadata_only\" for zero data retention. */\n retention_mode: string;\n /** When true, any request that would fall back to the account scope is rejected. */\n require_end_user_id: boolean;\n}\n\nexport interface AccountSettingsUpdateParams {\n /** Pass a number to set, `null` to clear, omit to leave unchanged. */\n per_end_user_run_limit?: number | null;\n per_end_user_cost_limit_cents?: number | null;\n per_end_user_rate_per_minute?: number | null;\n retention_mode?: \"standard\" | \"metadata_only\";\n /**\n * Strict multi-tenant mode. ON by default for API accounts: a request that\n * omits `user_id` and would therefore land in the account-level scope is\n * rejected with a 422 rather than silently assuming the global scope.\n *\n * Set false only if you are building for yourself (single-tenant).\n */\n require_end_user_id?: boolean;\n}\n\nexport interface SettingsResource {\n get(): Promise<AccountSettings>;\n update(params: AccountSettingsUpdateParams): Promise<AccountSettings>;\n}\n\nexport function createSettingsResource(http: Http): SettingsResource {\n return {\n get() {\n return http.request<AccountSettings>(\"GET\", \"/settings/\");\n },\n // `null` must survive (it CLEARS a cap); only `undefined` is dropped.\n update(params) {\n return http.request<AccountSettings>(\"PATCH\", \"/settings/\", { body: toBody({ ...params }) });\n },\n };\n}\n","/**\n * `client.tasks` — reusable work definitions, plus the triggers that fire them.\n *\n * A task is \"what to do\"; a trigger is \"when\". `client.tasks.triggers` covers all\n * four kinds (schedule, webhook, email, app event). Mirrors\n * `sdk/py/m8tes/_resources/tasks.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { resolveAgentId, toBody, toQuery } from \"../params\";\nimport { idempotencyHeaders, replayJoin } from \"./runs\";\nimport { RunStream, type RunStreamOptions } from \"../streaming\";\nimport type { JsonObject, Run, Task, Trigger, TriggerType, WebhookToggle } from \"../types\";\n\n/** A task must belong to an agent: `POST /tasks/` requires `teammate_id`, so the\n * type requires one of the two spellings rather than letting you discover it as\n * a 422. */\ntype TaskOwner = { agent_id: number; teammate_id?: never } | { teammate_id: number; agent_id?: never };\n\nexport type TaskCreateParams = TaskOwner & TaskCreateFields;\n\nexport interface TaskCreateFields {\n /** What the agent should do each time this task runs. */\n instructions: string;\n name?: string;\n tools?: string[];\n /** What a good result looks like. */\n expected_output?: string;\n goals?: string;\n user_id?: string;\n /** Email the account owner when a run finishes. Default true. */\n email_notifications?: boolean;\n /** Create a webhook trigger alongside the task. */\n webhook?: boolean;\n /** Cron expression, e.g. `\"0 9 * * 1-5\"`. Creates a schedule trigger. */\n schedule?: string;\n /** IANA timezone for `schedule`. Default \"UTC\". */\n schedule_timezone?: string;\n enable_memory?: boolean;\n enable_history?: boolean;\n enable_task_setup_tools?: boolean;\n enable_feedback?: boolean;\n /** Accumulate self-improvement lessons across this task's runs. Default true. */\n enable_lessons?: boolean;\n}\n\n/**\n * PATCH /tasks/{id} accepts exactly these fields (backend `DevTaskUpdate`).\n * `schedule`, `schedule_timezone`, `webhook`, and the agent id are create-only:\n * sending them to PATCH returns 200 and changes nothing. Change a schedule via\n * `tasks.triggers.update()`, and a webhook via `enableWebhook()`.\n *\n * `null` is meaningful: it CLEARS the field.\n */\nexport interface TaskUpdateParams {\n name?: string | null;\n instructions?: string | null;\n tools?: string[] | null;\n expected_output?: string | null;\n goals?: string | null;\n email_notifications?: boolean | null;\n enable_memory?: boolean | null;\n enable_history?: boolean | null;\n enable_task_setup_tools?: boolean | null;\n enable_feedback?: boolean | null;\n enable_lessons?: boolean | null;\n}\n\nexport interface TaskListParams {\n user_id?: string;\n agent_id?: number;\n teammate_id?: number;\n status?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface TriggerCreateParams {\n type: TriggerType | string;\n /** Schedule triggers: a cron expression. */\n cron?: string;\n /** Schedule triggers: a plain interval instead of cron. */\n interval_seconds?: number;\n /** IANA timezone. Default \"UTC\". */\n timezone?: string;\n /** App-event triggers: the app slug, e.g. `\"github\"`. */\n app?: string;\n /** App-event triggers: the event name, e.g. `\"pull_request_opened\"`. */\n trigger_name?: string;\n trigger_config?: JsonObject;\n user_id?: string;\n /** Email triggers: only these senders may start a run. */\n allowed_senders?: string[];\n}\n\nexport interface TriggersResource {\n create(taskId: number, params: TriggerCreateParams): Promise<Trigger>;\n list(taskId: number, params?: { user_id?: string }): Promise<Trigger[]>;\n /** Only the schedule shape and the enabled flag are mutable — a trigger's\n * `type`/`app`/`trigger_name` are fixed at creation and are silently ignored\n * on PATCH. Delete and recreate to change those. `user_id` scopes to one\n * end-user (404 on mismatch). */\n update(\n taskId: number,\n triggerId: number,\n params: {\n cron?: string;\n interval_seconds?: number;\n timezone?: string;\n enabled?: boolean;\n user_id?: string;\n },\n ): Promise<Trigger>;\n delete(taskId: number, triggerId: number, params?: { user_id?: string }): Promise<void>;\n}\n\nexport interface TaskRunParams {\n /** Run on behalf of this end-user. */\n user_id?: string;\n /**\n * Reuse this key to retry the same call safely — the server returns the run the\n * first attempt made instead of starting (and billing) a second one. One is\n * minted per call automatically; supply your own (e.g. a scheduler's job id)\n * only when a retry must survive a process restart. Sent as the\n * `Idempotency-Key` header, never in the body.\n */\n idempotencyKey?: string;\n}\n\nexport interface TasksResource {\n triggers: TriggersResource;\n create(params: TaskCreateParams): Promise<Task>;\n list(params?: TaskListParams): Promise<Page<Task>>;\n get(taskId: number, params?: { user_id?: string }): Promise<Task>;\n update(taskId: number, params: TaskUpdateParams & { user_id?: string }): Promise<Task>;\n delete(taskId: number, params?: { user_id?: string }): Promise<void>;\n /** Run the task now, streaming it. */\n run(taskId: number, params?: TaskRunParams, options?: RunStreamOptions): RunStream;\n /** Run the task now without streaming; poll `runs.get()` for the result. */\n runAsync(taskId: number, params?: TaskRunParams): Promise<Run>;\n /** `user_id` scopes to one end-user (404 on mismatch), like get/update/delete. */\n enableWebhook(taskId: number, params?: { user_id?: string }): Promise<WebhookToggle>;\n disableWebhook(taskId: number, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createTasksResource(http: Http): TasksResource {\n const triggers: TriggersResource = {\n create(taskId, params) {\n // user_id rides both channels on purpose: the query copy is the end-user\n // scope gate on the task (404 on mismatch); the body copy picks whose\n // connected account an app trigger arms.\n return http.request<Trigger>(\"POST\", `/tasks/${seg(taskId)}/triggers/`, {\n body: toBody({ timezone: \"UTC\", ...params }),\n query: toQuery({ user_id: params.user_id }),\n });\n },\n async list(taskId, params = {}) {\n const res = await http.request<{ data?: Trigger[] } | Trigger[]>(\n \"GET\",\n `/tasks/${seg(taskId)}/triggers/`,\n { query: toQuery(params) },\n );\n return Array.isArray(res) ? res : (res?.data ?? []);\n },\n update(taskId, triggerId, params) {\n const { user_id, ...patch } = params;\n return http.request<Trigger>(\"PATCH\", `/tasks/${seg(taskId)}/triggers/${seg(triggerId)}`, {\n body: toBody(patch),\n query: toQuery({ user_id }),\n });\n },\n async delete(taskId, triggerId, params = {}) {\n await http.request(\"DELETE\", `/tasks/${seg(taskId)}/triggers/${seg(triggerId)}`, {\n query: toQuery(params),\n });\n },\n };\n\n return {\n triggers,\n\n create(params) {\n const { agent_id, teammate_id, ...rest } = params;\n return http.request<Task>(\"POST\", \"/tasks/\", {\n body: toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) }),\n });\n },\n\n async list(params = {}) {\n const { agent_id, teammate_id, ...rest } = params;\n const q = toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) });\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Task>> => {\n const res = await http.request<{ data: Task[]; has_more?: boolean; next_starting_after?: string | number | null }>(\"GET\", \"/tasks/\", {\n query: toQuery(p),\n });\n return new Page<Task>(\n res?.data ?? [],\n res?.has_more ?? false,\n (starting_after) => fetchPage({ ...p, starting_after }),\n res?.next_starting_after,\n );\n };\n return fetchPage(q);\n },\n\n get(taskId, params = {}) {\n return http.request<Task>(\"GET\", `/tasks/${seg(taskId)}`, { query: toQuery(params) });\n },\n\n update(taskId, params) {\n const { user_id, ...patch } = params;\n return http.request<Task>(\"PATCH\", `/tasks/${seg(taskId)}`, {\n body: toBody(patch),\n query: toQuery({ user_id }),\n });\n },\n\n async delete(taskId, params = {}) {\n await http.request(\"DELETE\", `/tasks/${seg(taskId)}`, { query: toQuery(params) });\n },\n\n run(taskId, params = {}, options) {\n const { idempotencyKey, ...rest } = params;\n return new RunStream(\n http.stream(\"POST\", `/tasks/${seg(taskId)}/runs`, {\n body: toBody({ ...rest, stream: true }),\n headers: idempotencyHeaders(idempotencyKey),\n // Shares the create path's replay handling, so a fix on one side can\n // never silently miss the other.\n onReplay: replayJoin(http),\n }),\n options,\n );\n },\n\n runAsync(taskId, params = {}) {\n const { idempotencyKey, ...rest } = params;\n return http.request<Run>(\"POST\", `/tasks/${seg(taskId)}/runs`, {\n body: toBody({ ...rest, stream: false }),\n headers: idempotencyHeaders(idempotencyKey),\n });\n },\n\n enableWebhook(taskId, params = {}) {\n return http.request<WebhookToggle>(\"POST\", `/tasks/${seg(taskId)}/webhook`, {\n body: {},\n query: toQuery(params),\n });\n },\n\n async disableWebhook(taskId, params = {}) {\n await http.request(\"DELETE\", `/tasks/${seg(taskId)}/webhook`, { query: toQuery(params) });\n },\n };\n}\n","/**\n * `client.webhooks` — outbound event delivery, plus signature verification.\n *\n * `verifySignature` is the one function every webhook receiver needs, so it is\n * also exported standalone from the package root: verifying does not require a\n * client or an API key. Mirrors `sdk/py/m8tes/_resources/webhooks.py` byte for\n * byte on the signing scheme, so a payload verified by one SDK verifies in the\n * other.\n *\n * Scheme: HMAC-SHA256 over `\"{webhook-id}.{webhook-timestamp}.{raw body}\"`, hex,\n * prefixed `v1=`, compared in constant time.\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { seg } from \"../protocol/seg\";\nimport { toBody } from \"../params\";\nimport { pager } from \"./users\";\nimport type { Webhook, WebhookDelivery } from \"../types\";\n\nexport interface VerifySignatureOptions {\n /**\n * Reject signatures whose timestamp is older (or newer) than this many\n * seconds — replay protection. Omit to skip the check. 300 is a good default\n * for a public endpoint.\n */\n toleranceSeconds?: number;\n /** Injectable clock, for tests. Seconds since epoch. */\n now?: () => number;\n}\n\n/**\n * Verify a m8tes webhook signature.\n *\n * Pass the RAW request body — a parsed-and-restringified object will not match,\n * because JSON.stringify does not preserve key order or spacing.\n *\n * ```ts\n * const raw = await req.text();\n * if (!verifySignature(raw, Object.fromEntries(req.headers), secret, { toleranceSeconds: 300 })) {\n * return new Response(\"bad signature\", { status: 401 });\n * }\n * ```\n */\nexport function verifySignature(\n body: string | Uint8Array,\n headers: Record<string, string | string[] | undefined> | Headers,\n secret: string,\n options: VerifySignatureOptions = {},\n): boolean {\n const get = (name: string): string | undefined => {\n if (typeof (headers as Headers).get === \"function\") {\n return (headers as Headers).get(name) ?? undefined;\n }\n // Header names are case-insensitive on the wire; normalize before lookup.\n const lower = Object.fromEntries(\n Object.entries(headers as Record<string, string | string[] | undefined>).map(([k, v]) => [\n k.toLowerCase(),\n Array.isArray(v) ? v[0] : v,\n ]),\n );\n return lower[name];\n };\n\n const webhookId = get(\"webhook-id\");\n const timestamp = get(\"webhook-timestamp\");\n const signature = get(\"webhook-signature\");\n if (!webhookId || !timestamp || !signature) return false;\n\n if (options.toleranceSeconds !== undefined) {\n const ts = Number.parseInt(timestamp, 10);\n if (!Number.isFinite(ts)) return false;\n const now = options.now ? options.now() : Math.floor(Date.now() / 1000);\n if (Math.abs(now - ts) > options.toleranceSeconds) return false;\n }\n\n const raw = typeof body === \"string\" ? body : new TextDecoder().decode(body);\n const expected = `v1=${createHmac(\"sha256\", secret).update(`${webhookId}.${timestamp}.${raw}`).digest(\"hex\")}`;\n const a = Buffer.from(expected);\n const b = Buffer.from(signature);\n // timingSafeEqual throws on length mismatch; a length difference is already a\n // mismatch, so short-circuit rather than leak it as an exception.\n return a.length === b.length && timingSafeEqual(a, b);\n}\n\nexport interface WebhooksResource {\n verifySignature: typeof verifySignature;\n /** Register an endpoint. The signing secret is returned ONLY here — store it. */\n create(params: { url: string; events?: string[] }): Promise<Webhook>;\n list(params?: { limit?: number; starting_after?: number }): Promise<Page<Webhook>>;\n get(webhookId: number): Promise<Webhook>;\n update(\n webhookId: number,\n params: { url?: string; events?: string[]; active?: boolean },\n ): Promise<Webhook>;\n delete(webhookId: number): Promise<void>;\n /** Delivery attempts, for debugging a receiver that is not getting events. */\n listDeliveries(\n webhookId: number,\n params?: { limit?: number; starting_after?: number },\n ): Promise<Page<WebhookDelivery>>;\n}\n\nexport function createWebhooksResource(http: Http): WebhooksResource {\n return {\n verifySignature,\n\n create(params) {\n return http.request<Webhook>(\"POST\", \"/webhooks/\", { body: toBody({ ...params }) });\n },\n\n list(params = {}) {\n return pager<Webhook>(http, \"/webhooks/\")({ ...params });\n },\n\n get(webhookId) {\n return http.request<Webhook>(\"GET\", `/webhooks/${seg(webhookId)}`);\n },\n\n update(webhookId, params) {\n return http.request<Webhook>(\"PATCH\", `/webhooks/${seg(webhookId)}`, { body: toBody({ ...params }) });\n },\n\n async delete(webhookId) {\n await http.request(\"DELETE\", `/webhooks/${seg(webhookId)}`);\n },\n\n listDeliveries(webhookId, params = {}) {\n return pager<WebhookDelivery>(http, `/webhooks/${seg(webhookId)}/deliveries`)({ ...params });\n },\n };\n}\n","/**\n * `@m8tes/sdk` — TypeScript client for the m8tes API.\n *\n * ```ts\n * import { M8tes } from \"@m8tes/sdk\";\n *\n * const client = new M8tes(); // reads M8TES_API_KEY\n *\n * const run = client.runs.create({\n * message: \"A customer asked to cancel. Draft a warm reply offering to pause instead.\",\n * userId: \"customer_42\", // isolates this end-user's memory, history, and connections\n * });\n * for await (const chunk of run.iterText()) process.stdout.write(chunk);\n * ```\n *\n * SECURITY: this entry point holds your secret `m8_` key and is server-only.\n * Never import it from client-side code. To render an agent in a browser, use\n * `@m8tes/react` plus its server proxy, which keeps the key on your server.\n *\n * The streaming wire protocol lives in `@m8tes/sdk/protocol` (browser-safe, no\n * auth) so this package and `@m8tes/react` share one implementation.\n */\n\nimport { createHttp, DEFAULT_BASE_URL, type ClientOptions, type Http } from \"./http\";\nimport { createAgentsResource, type AgentsResource } from \"./resources/agents\";\nimport { createAppsResource, type AppsResource } from \"./resources/apps\";\nimport { createAccountResource, type AccountResource } from \"./resources/account\";\nimport { createBillingResource, type BillingResource } from \"./resources/billing\";\nimport { createMemoriesResource, type MemoriesResource } from \"./resources/memories\";\nimport { createModelsResource, type ModelsResource } from \"./resources/models\";\nimport {\n createModelConnectionsResource,\n type ModelConnectionsResource,\n} from \"./resources/model-connections\";\nimport { createPermissionsResource, type PermissionsResource } from \"./resources/permissions\";\nimport { createRunsResource, type RunsResource } from \"./resources/runs\";\nimport { createSettingsResource, type SettingsResource } from \"./resources/settings\";\nimport { createTasksResource, type TasksResource } from \"./resources/tasks\";\nimport { createUsersResource, type UsersResource } from \"./resources/users\";\nimport { createWebhooksResource, verifySignature, type WebhooksResource } from \"./resources/webhooks\";\n\n/** Kept in lockstep with package.json \"version\" — guarded by test/version.test.ts. */\nexport const M8TES_SDK_VERSION = \"0.1.0-alpha.3\";\n\nexport class M8tes {\n readonly runs: RunsResource;\n readonly agents: AgentsResource;\n /** Permanent alias for `agents` — the DB model and older docs say \"teammate\". */\n readonly teammates: AgentsResource;\n readonly tasks: TasksResource;\n readonly users: UsersResource;\n readonly apps: AppsResource;\n readonly webhooks: WebhooksResource;\n readonly settings: SettingsResource;\n readonly memories: MemoriesResource;\n readonly permissions: PermissionsResource;\n readonly models: ModelsResource;\n readonly modelConnections: ModelConnectionsResource;\n readonly billing: BillingResource;\n readonly account: AccountResource;\n /** The underlying transport. Use it to call an endpoint this version does not wrap yet. */\n readonly http: Http;\n\n constructor(options: ClientOptions = {}) {\n this.http = createHttp(options);\n this.runs = createRunsResource(this.http);\n this.agents = createAgentsResource(this.http);\n this.teammates = this.agents;\n this.tasks = createTasksResource(this.http);\n this.users = createUsersResource(this.http);\n this.apps = createAppsResource(this.http);\n this.webhooks = createWebhooksResource(this.http);\n this.settings = createSettingsResource(this.http);\n this.memories = createMemoriesResource(this.http);\n this.permissions = createPermissionsResource(this.http);\n this.models = createModelsResource(this.http);\n this.modelConnections = createModelConnectionsResource(this.http);\n this.billing = createBillingResource(this.http);\n this.account = createAccountResource(this.http);\n }\n}\n\n// No default export on purpose: mixing default + named exports makes the CJS\n// build ambiguous (`require(...)` consumers would need `.default`). The one\n// documented form is `import { M8tes } from \"@m8tes/sdk\"`.\n\n// Webhook verification needs no client and no key — import it directly in a\n// route handler that only receives events.\nexport { verifySignature, type VerifySignatureOptions } from \"./resources/webhooks\";\n\n// Transport + client options.\nexport { createHttp, DEFAULT_BASE_URL, type ClientOptions, type FetchLike, type Http } from \"./http\";\n\n// Streaming + pagination.\nexport { RunStream, type RunStreamOptions } from \"./streaming\";\n// Waiting on a run. The error classes are exported so `catch (e) { if (e\n// instanceof RunTimeoutError) ... }` works — without them a caller can only\n// match on a message string.\nexport {\n pollRun,\n waitForRun,\n isPlanApproval,\n planText,\n RunTimeoutError,\n RunPausedError,\n RunWaitAbortedError,\n TERMINAL_STATUSES,\n type PollOptions,\n type WaitOptions,\n} from \"./polling\";\nexport { Page, type ListResponse } from \"./pagination\";\n\n// Resource params + shapes.\nexport type {\n AgentsResource,\n AgentCreateParams,\n AgentUpdateParams,\n AgentListParams,\n} from \"./resources/agents\";\nexport type { AppsResource } from \"./resources/apps\";\nexport type { RunsResource, RunCreateParams, RunListParams } from \"./resources/runs\";\nexport type {\n TasksResource,\n TriggersResource,\n TaskCreateParams,\n TaskUpdateParams,\n TaskListParams,\n TaskRunParams,\n TriggerCreateParams,\n} from \"./resources/tasks\";\nexport type {\n UsersResource,\n EndUserCreateParams,\n EndUserUpdateParams,\n PageParams,\n} from \"./resources/users\";\nexport type { WebhooksResource } from \"./resources/webhooks\";\nexport type {\n SettingsResource,\n AccountSettings,\n AccountSettingsUpdateParams,\n} from \"./resources/settings\";\nexport type * from \"./resources/memories\";\nexport type * from \"./resources/permissions\";\nexport type * from \"./resources/models\";\nexport type * from \"./resources/model-connections\";\nexport type * from \"./resources/billing\";\nexport type * from \"./resources/account\";\nexport * from \"./types\";\n\n// The full wire protocol + typed errors, re-exported so a single import of\n// `@m8tes/sdk` is enough for the common case.\nexport * from \"./protocol/index\";\n"]}