@mantyx/sdk 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
### Added
|
|
9
9
|
|
|
10
|
+
- Improve golang types
|
|
11
|
+
|
|
12
|
+
## [0.5.0] — 2026-05-07
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
10
16
|
- Use defined input type for golang library
|
|
11
17
|
|
|
12
18
|
## [0.4.1] — 2026-05-07
|
|
@@ -44,7 +50,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
44
50
|
|
|
45
51
|
## [0.1.0] — 2026-05-02
|
|
46
52
|
|
|
47
|
-
[unreleased]: https://github.com/mantyx-io/mantyx-sdk/compare/v0.
|
|
53
|
+
[unreleased]: https://github.com/mantyx-io/mantyx-sdk/compare/v0.5.0..HEAD
|
|
54
|
+
[0.5.0]: https://github.com/mantyx-io/mantyx-sdk/compare/v0.4.1..v0.5.0
|
|
48
55
|
[0.4.1]: https://github.com/mantyx-io/mantyx-sdk/compare/v0.4.0..v0.4.1
|
|
49
56
|
[0.4.0]: https://github.com/mantyx-io/mantyx-sdk/compare/v0.2.0..v0.4.0
|
|
50
57
|
[0.2.0]: https://github.com/mantyx-io/mantyx-sdk/compare/v0.1.1..v0.2.0
|
package/dist/index.cjs
CHANGED
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/tools.ts","../src/local-resolver.ts","../src/sse.ts","../src/zod-to-json-schema.ts","../src/client.ts","../src/version.ts"],"sourcesContent":["/**\n * @mantyx/sdk — TypeScript client for the MANTYX agent runtime.\n *\n * Public surface:\n *\n * import { MantyxClient, defineLocalTool, mantyxTool, mantyxPluginTool } from \"@mantyx/sdk\";\n *\n * const client = new MantyxClient({\n * apiKey: process.env.MANTYX_API_KEY!,\n * workspaceSlug: process.env.MANTYX_WORKSPACE_SLUG!,\n * });\n *\n * const result = await client.runAgent({\n * systemPrompt: \"You are a helpful assistant.\",\n * prompt: \"Read /etc/hostname and tell me what it says.\",\n * tools: [\n * defineLocalTool({\n * name: \"read_file\",\n * description: \"Read a file from the local filesystem.\",\n * parameters: z.object({ path: z.string() }),\n * execute: async ({ path }) => fs.readFile(path, \"utf8\"),\n * }),\n * ],\n * });\n *\n * console.log(result.text);\n */\n\nexport {\n MantyxClient,\n AgentSession,\n DEFAULT_BASE_URL,\n parseRunOutput,\n} from \"./client.js\";\nexport type {\n MantyxClientOptions,\n ModelInfo,\n ModelCatalog,\n AgentSpecBase,\n RunSpec,\n SessionSpec,\n OutputSchema,\n RunResult,\n RunEvent,\n RunEventBase,\n AssistantDeltaEvent,\n ThinkingDeltaEvent,\n AssistantMessageEvent,\n ServerToolResultEvent,\n LocalToolCallEvent,\n LocalToolResultInEvent,\n ResultEvent,\n ErrorEvent,\n CancelledEvent,\n SessionInfo,\n LocalHandlers,\n} from \"./client.js\";\n\nexport {\n defineLocalTool,\n mantyxTool,\n mantyxPluginTool,\n mantyxA2A,\n defineLocalA2A,\n mantyxMcp,\n defineLocalMcp,\n isLocalTool,\n isLocalA2ATool,\n isLocalMcpServer,\n} from \"./tools.js\";\nexport type {\n LocalTool,\n MantyxToolRef,\n MantyxPluginToolRef,\n ToolRef,\n ZodLikeObject,\n DefineLocalToolOptions,\n ReasoningLevel,\n A2AToolRef,\n LocalA2ATool,\n McpToolRef,\n LocalMcpServer,\n LocalMcpHttpTransport,\n LocalMcpStdioTransport,\n MantyxA2AOptions,\n DefineLocalA2AOptions,\n MantyxMcpOptions,\n DefineLocalMcpOptions,\n} from \"./tools.js\";\n\nexport {\n MantyxError,\n MantyxAuthError,\n MantyxNetworkError,\n MantyxParseError,\n MantyxToolError,\n MantyxRunError,\n} from \"./errors.js\";\n\nexport { zodToJsonSchema, toToolParametersWire } from \"./zod-to-json-schema.js\";\n\nexport { readSseStream } from \"./sse.js\";\nexport type { SseEvent, SseStreamOptions } from \"./sse.js\";\n\nexport { SDK_VERSION } from \"./version.js\";\n\n// Note: `@mantyx/sdk/a2a-server` is exported as a separate sub-path so apps\n// that don't expose an A2A server never load `@a2a-js/sdk` or `express`. Import\n// from there to reach `MantyxAgentExecutor`, `serveAgentOverA2A`, and the\n// associated types.\n","/**\n * Error types raised by the MANTYX SDK.\n */\n\nexport class MantyxError extends Error {\n readonly code: string;\n readonly status: number | undefined;\n readonly hint: string | undefined;\n\n constructor(\n message: string,\n opts: { code?: string; status?: number; hint?: string } = {},\n ) {\n super(message);\n this.name = \"MantyxError\";\n this.code = opts.code ?? \"mantyx_error\";\n this.status = opts.status;\n this.hint = opts.hint;\n }\n}\n\nexport class MantyxNetworkError extends MantyxError {\n constructor(message: string, opts: { cause?: unknown } = {}) {\n super(message, { code: \"network\" });\n this.name = \"MantyxNetworkError\";\n if (opts.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = opts.cause;\n }\n }\n}\n\nexport class MantyxAuthError extends MantyxError {\n constructor(message = \"Invalid or missing API key\") {\n super(message, { code: \"unauthorized\", status: 401 });\n this.name = \"MantyxAuthError\";\n }\n}\n\nexport class MantyxToolError extends MantyxError {\n readonly toolName: string;\n\n constructor(toolName: string, message: string) {\n super(`Local tool ${JSON.stringify(toolName)} failed: ${message}`, {\n code: \"local_tool_failed\",\n });\n this.name = \"MantyxToolError\";\n this.toolName = toolName;\n }\n}\n\nexport class MantyxRunError extends MantyxError {\n readonly runId: string;\n readonly subtype: string;\n\n constructor(runId: string, subtype: string, message: string) {\n super(message, { code: subtype });\n this.name = \"MantyxRunError\";\n this.runId = runId;\n this.subtype = subtype;\n }\n}\n\n/**\n * Thrown by {@link parseRunOutput} when the run's terminal text was supposed\n * to be a JSON document (because `outputSchema` was set on the spec) but\n * either failed to JSON.parse or failed the user-supplied validator.\n *\n * The original `text` is preserved on the `text` field so callers can log\n * the raw model output for debugging.\n */\nexport class MantyxParseError extends MantyxError {\n readonly text: string;\n\n constructor(message: string, text: string, opts: { cause?: unknown } = {}) {\n super(message, { code: \"output_parse_failed\" });\n this.name = \"MantyxParseError\";\n this.text = text;\n if (opts.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = opts.cause;\n }\n }\n}\n","/**\n * Public tool helpers for the MANTYX SDK.\n *\n * Server-resolved (executed by MANTYX):\n * mantyxTool(id) → existing workspace `Tool` row by id\n * mantyxPluginTool(name) → built-in plugin tool by `@plugin/tool` name\n * mantyxA2A({...}) → remote Agent2Agent peer, dialed by MANTYX\n * mantyxMcp({...}) → remote MCP server (Streamable HTTP), proxied by MANTYX\n *\n * Client-resolved (executed in this process; the SDK shuttles inputs and\n * outputs over the agent loop):\n * defineLocalTool({...}) → generic local tool with a Zod parameter schema\n * defineLocalA2A({...}) → A2A peer the SDK can reach but MANTYX cannot —\n * pass an `agentCardUrl`; the SDK fetches the\n * Agent Card and speaks A2A `message/send` for you.\n * defineLocalMcp({...}) → MCP server the SDK manages — pass either a\n * Streamable HTTP `url` or a stdio\n * `command`; the SDK runs `Initialize` +\n * `tools/list` and forwards `tools/call` for you.\n *\n * The server emits a `local_tool_call` event for every client-resolved\n * invocation. The event carries a `kind` discriminator (`\"local\"` is implied\n * when omitted, `\"a2a_local\"` and `\"mcp_local\"` are explicit) so the SDK can\n * dispatch to the right handler.\n */\nimport type { z } from \"zod\";\n\nexport type ZodLikeObject = z.ZodType<Record<string, unknown>> & {\n _def?: unknown;\n parse?: (value: unknown) => unknown;\n};\n\n/**\n * Provider-thinking knob, mapped server-side onto each LLM's native dial:\n * `reasoning.effort` (OpenAI), `thinkingConfig.thinkingLevel` / `thinkingBudget`\n * (Gemini), or extended-thinking budget (Anthropic / Bedrock-Anthropic).\n *\n * Pass either a string anchor (`\"off\" | \"low\" | \"medium\" | \"high\"`) or an\n * integer in `0..100` (where `0` explicitly disables provider thinking).\n */\nexport type ReasoningLevel = \"off\" | \"low\" | \"medium\" | \"high\" | number;\n\n// ---------------------------------------------------------- Generic local tool\n\nexport interface LocalTool<TArgs = Record<string, unknown>> {\n readonly kind: \"local\";\n readonly name: string;\n readonly description: string;\n readonly parameters: ZodLikeObject | undefined;\n readonly execute: (args: TArgs) => Promise<string> | string;\n}\n\nexport interface DefineLocalToolOptions<T extends ZodLikeObject | undefined> {\n /** Lowercase alphanumeric + underscore, max 64 chars. */\n name: string;\n description?: string;\n parameters?: T;\n execute: (\n args: T extends ZodLikeObject ? z.infer<T> : Record<string, unknown>,\n ) => Promise<string> | string;\n}\n\nexport function defineLocalTool<T extends ZodLikeObject | undefined>(\n opts: DefineLocalToolOptions<T>,\n): LocalTool {\n assertToolName(opts.name);\n return {\n kind: \"local\",\n name: opts.name,\n description: opts.description ?? \"\",\n parameters: opts.parameters,\n execute: opts.execute as LocalTool[\"execute\"],\n };\n}\n\n// ------------------------------------------------------------ Server-resolved\n\nexport interface MantyxToolRef {\n readonly kind: \"mantyx\";\n readonly id: string;\n}\n\nexport interface MantyxPluginToolRef {\n readonly kind: \"mantyx_plugin\";\n readonly name: string;\n}\n\nexport function mantyxTool(id: string): MantyxToolRef {\n if (typeof id !== \"string\" || id.length === 0) {\n throw new Error(\"mantyxTool(id): id must be a non-empty string\");\n }\n return { kind: \"mantyx\", id };\n}\n\nexport function mantyxPluginTool(name: string): MantyxPluginToolRef {\n if (typeof name !== \"string\" || !name.startsWith(\"@\") || !name.includes(\"/\")) {\n throw new Error(\n `mantyxPluginTool(name): expected \"@plugin-slug/tool-name\", got ${JSON.stringify(name)}`,\n );\n }\n return { kind: \"mantyx_plugin\", name };\n}\n\n// ------------------------------------------------------------------------ A2A\n\n/**\n * Reference to a remote Agent2Agent peer reachable from MANTYX (server-resolved).\n * MANTYX dials `agentCardUrl` over A2A's `message/send` RPC and forwards the\n * remote agent's reply as the tool result.\n */\nexport interface A2AToolRef {\n readonly kind: \"a2a\";\n readonly name: string;\n readonly description?: string;\n readonly agentCardUrl: string;\n readonly headers?: Record<string, string>;\n readonly contextId?: string;\n}\n\nexport interface MantyxA2AOptions {\n /** Tool name surfaced to the model; must match `^[a-zA-Z0-9_]{1,64}$`. */\n name: string;\n description?: string;\n /** Remote Agent Card URL (`/.well-known/agent-card.json`) or JSON-RPC root. */\n agentCardUrl: string;\n /** Per-request HTTP headers (typically `Authorization`). */\n headers?: Record<string, string>;\n /** Optional A2A `contextId` to thread multiple delegations. */\n contextId?: string;\n}\n\nexport function mantyxA2A(opts: MantyxA2AOptions): A2AToolRef {\n assertToolName(opts.name);\n if (typeof opts.agentCardUrl !== \"string\" || opts.agentCardUrl.length === 0) {\n throw new Error(\"mantyxA2A: agentCardUrl is required\");\n }\n return {\n kind: \"a2a\",\n name: opts.name,\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n agentCardUrl: opts.agentCardUrl,\n ...(opts.headers ? { headers: { ...opts.headers } } : {}),\n ...(opts.contextId ? { contextId: opts.contextId } : {}),\n };\n}\n\n/**\n * Local A2A peer — the SDK fetches the Agent Card from `agentCardUrl` on\n * the first run, ships the resolved card with the spec, and speaks A2A\n * `message/send` to `agentCard.url` whenever MANTYX emits a\n * `local_tool_call` for this tool. You only supply the URL.\n *\n * The model addresses this tool by `name` and always passes\n * `{ message: string }` as arguments.\n *\n * Resolution is lazy: the card is fetched on the first `runAgent` /\n * `streamAgent` / `createSession` (or `session.send`) call and cached on\n * the tool ref for the rest of the process lifetime. Re-construct the ref\n * to force a refetch.\n */\nexport interface LocalA2ATool {\n readonly kind: \"a2a_local\";\n readonly name: string;\n /** Where the SDK fetches the Agent Card from. Cached after the first hit. */\n readonly agentCardUrl: string;\n /**\n * Headers used for **both** the card fetch and every `message/send` POST\n * (typically `Authorization` for intranet peers).\n */\n readonly headers: Record<string, string> | undefined;\n /**\n * Internal cache of the resolved Agent Card. Populated lazily by the\n * client on the first run; not part of the user contract.\n * @internal\n */\n _resolvedCard?: ResolvedAgentCard;\n}\n\n/** Internal: the snapshot of a resolved A2A Agent Card. */\nexport interface ResolvedAgentCard {\n /** Required by the A2A spec; used for the synthesized tool description. */\n readonly name: string;\n /** Peer's A2A endpoint — where the SDK POSTs `message/send`. */\n readonly url?: string;\n /** Anything else the peer publishes; forwarded verbatim onto the wire. */\n readonly [k: string]: unknown;\n}\n\nexport interface DefineLocalA2AOptions {\n /** Tool name surfaced to the model. Must match `^[a-zA-Z0-9_]{1,64}$`. */\n name: string;\n /**\n * URL of the peer's Agent Card (`/.well-known/agent-card.json` is the\n * conventional path). The SDK fetches this on the first run, parses it,\n * and ships the resolved card with the spec. The resolved card's `url`\n * field is then used as the `message/send` target.\n */\n agentCardUrl: string;\n /**\n * Headers attached to **both** the card fetch and every `message/send`\n * POST (typically `Authorization` for intranet peers).\n */\n headers?: Record<string, string>;\n}\n\nexport function defineLocalA2A(opts: DefineLocalA2AOptions): LocalA2ATool {\n assertToolName(opts.name);\n if (typeof opts.agentCardUrl !== \"string\" || opts.agentCardUrl.length === 0) {\n throw new Error(\"defineLocalA2A: `agentCardUrl` is required\");\n }\n return {\n kind: \"a2a_local\",\n name: opts.name,\n agentCardUrl: opts.agentCardUrl,\n headers: opts.headers ? { ...opts.headers } : undefined,\n };\n}\n\n// ------------------------------------------------------------------------ MCP\n\n/**\n * Reference to a remote MCP server (Streamable HTTP) discovered + proxied by\n * MANTYX. Each tool in the catalog is exposed to the model as `<name>_<tool>`.\n */\nexport interface McpToolRef {\n readonly kind: \"mcp\";\n readonly name: string;\n readonly url: string;\n readonly headers?: Record<string, string>;\n readonly toolFilter?: string[];\n}\n\nexport interface MantyxMcpOptions {\n /** Server label; used to prefix every discovered tool. */\n name: string;\n /** Streamable HTTP MCP endpoint. */\n url: string;\n headers?: Record<string, string>;\n /** Optional allowlist of MCP tool names. */\n toolFilter?: string[];\n}\n\nexport function mantyxMcp(opts: MantyxMcpOptions): McpToolRef {\n assertToolName(opts.name);\n if (typeof opts.url !== \"string\" || opts.url.length === 0) {\n throw new Error(\"mantyxMcp: url is required\");\n }\n return {\n kind: \"mcp\",\n name: opts.name,\n url: opts.url,\n ...(opts.headers ? { headers: { ...opts.headers } } : {}),\n ...(opts.toolFilter ? { toolFilter: [...opts.toolFilter] } : {}),\n };\n}\n\n/**\n * Streamable HTTP transport spec for {@link defineLocalMcp}.\n */\nexport interface LocalMcpHttpTransport {\n /** Streamable HTTP MCP endpoint (e.g. `http://localhost:8080/mcp`). */\n url: string;\n /** HTTP headers sent on every MCP request (typically `Authorization`). */\n headers?: Record<string, string>;\n}\n\n/**\n * stdio transport spec for {@link defineLocalMcp}. The SDK spawns the\n * specified executable with the given arguments and speaks JSON-RPC over\n * its stdin/stdout streams.\n */\nexport interface LocalMcpStdioTransport {\n /** Executable to launch (e.g. `mcp-server-filesystem`, `node`, `uvx`). */\n command: string;\n /** Arguments passed verbatim. */\n args?: string[];\n /** Environment variables for the child process. Inherited if undefined. */\n env?: Record<string, string>;\n /** Working directory for the child process. */\n cwd?: string;\n}\n\n/**\n * Local MCP server — the SDK manages the entire MCP lifecycle for you.\n *\n * Pass either a Streamable HTTP `url` or an stdio `command` (mutually\n * exclusive). On the first run, the SDK opens the transport, runs MCP's\n * `Initialize` (capturing the `Implementation` block) and `tools/list`\n * (capturing the catalog), and ships both inline as part of the spec. On\n * every `local_tool_call` with `kind: \"mcp_local\"` the SDK forwards the\n * call to MCP `tools/call` on the cached connection and POSTs the\n * flattened text response back to MANTYX.\n *\n * Connections are reused across runs and across messages within a session\n * and closed on `runAgent` completion / `session.end()`.\n */\nexport interface LocalMcpServer {\n readonly kind: \"mcp_local\";\n readonly name: string;\n /** One-of with {@link stdio} — the transport spec is mutually exclusive. */\n readonly http: LocalMcpHttpTransport | undefined;\n /** One-of with {@link http} — the transport spec is mutually exclusive. */\n readonly stdio: LocalMcpStdioTransport | undefined;\n /**\n * Internal cache of the resolved MCP client + catalog. Populated lazily\n * by the run driver on the first run; not part of the user contract.\n * @internal\n */\n _resolved?: ResolvedMcpServer;\n}\n\n/**\n * Internal: the live MCP client + the snapshot the SDK ships on the wire.\n */\nexport interface ResolvedMcpServer {\n /** The MCP `Implementation` block from `Initialize`. */\n readonly serverInfo: { name: string; version?: string; [k: string]: unknown };\n /** Verbatim `tools/list` output. */\n readonly tools: ReadonlyArray<{\n readonly name: string;\n readonly description?: string;\n readonly inputSchema: Record<string, unknown>;\n readonly annotations?: Record<string, unknown>;\n readonly [k: string]: unknown;\n }>;\n /**\n * The live MCP client. Used by the run driver to call `tools/call`. The\n * concrete type depends on the transport — kept loose so this header\n * file doesn't have to import the MCP SDK type.\n */\n readonly client: McpClientLike;\n /** Closes the MCP transport (idempotent). */\n readonly close: () => Promise<void>;\n}\n\n/** Minimal interface this SDK uses against an MCP client. */\nexport interface McpClientLike {\n callTool(params: { name: string; arguments?: Record<string, unknown> }): Promise<{\n content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n isError?: boolean;\n [k: string]: unknown;\n }>;\n}\n\nexport interface DefineLocalMcpOptions {\n /**\n * Server label echoed back as `mcpServer` on every `local_tool_call`. The\n * SDK auto-prefixes each discovered tool's wire-level `name` with\n * `<this>_` so the model sees a non-colliding `<server>_<tool>` surface\n * — mirroring how MANTYX prefixes for `kind: \"mcp\"`.\n */\n name: string;\n /**\n * Streamable HTTP transport. Mutually exclusive with {@link command}.\n */\n url?: string;\n /**\n * Headers attached to every MCP request when using the HTTP transport.\n */\n headers?: Record<string, string>;\n /**\n * stdio transport: executable to launch. Mutually exclusive with\n * {@link url}.\n */\n command?: string;\n /** Arguments for the stdio child process. */\n args?: string[];\n /** Environment variables for the stdio child process. */\n env?: Record<string, string>;\n /** Working directory for the stdio child process. */\n cwd?: string;\n}\n\nexport function defineLocalMcp(opts: DefineLocalMcpOptions): LocalMcpServer {\n assertToolName(opts.name);\n const hasHttp = typeof opts.url === \"string\" && opts.url.length > 0;\n const hasStdio = typeof opts.command === \"string\" && opts.command.length > 0;\n if (hasHttp && hasStdio) {\n throw new Error(\n \"defineLocalMcp: pass either `url` (Streamable HTTP) or `command` (stdio), not both\",\n );\n }\n if (!hasHttp && !hasStdio) {\n throw new Error(\n \"defineLocalMcp: one of `url` (Streamable HTTP) or `command` (stdio) is required\",\n );\n }\n if (hasHttp) {\n const url = opts.url as string;\n return {\n kind: \"mcp_local\",\n name: opts.name,\n http: {\n url,\n ...(opts.headers ? { headers: { ...opts.headers } } : {}),\n },\n stdio: undefined,\n };\n }\n const command = opts.command as string;\n return {\n kind: \"mcp_local\",\n name: opts.name,\n http: undefined,\n stdio: {\n command,\n ...(opts.args ? { args: [...opts.args] } : {}),\n ...(opts.env ? { env: { ...opts.env } } : {}),\n ...(opts.cwd ? { cwd: opts.cwd } : {}),\n },\n };\n}\n\n// ----------------------------------------------------------------- Union type\n\nexport type ToolRef =\n | MantyxToolRef\n | MantyxPluginToolRef\n | LocalTool\n | A2AToolRef\n | LocalA2ATool\n | McpToolRef\n | LocalMcpServer;\n\n// --------------------------------------------------------- Type-guard helpers\n\nexport function isLocalTool(t: ToolRef): t is LocalTool {\n return t.kind === \"local\";\n}\nexport function isLocalA2ATool(t: ToolRef): t is LocalA2ATool {\n return t.kind === \"a2a_local\";\n}\nexport function isLocalMcpServer(t: ToolRef): t is LocalMcpServer {\n return t.kind === \"mcp_local\";\n}\n\n// ------------------------------------------------------------------- Internal\n\nconst TOOL_NAME_RE = /^[a-zA-Z0-9_]{1,64}$/;\n\nfunction assertToolName(name: string): void {\n if (!TOOL_NAME_RE.test(name)) {\n throw new Error(\n `Invalid tool name ${JSON.stringify(name)}: must match /^[a-zA-Z0-9_]{1,64}$/`,\n );\n }\n}\n\n/**\n * Compose the wire-level (model-facing) tool name for a `mcp_local` entry.\n * The SDK auto-prefixes every discovered tool's bare name with the server\n * label so the model surface stays `<server>_<tool>`.\n */\nexport function prefixedMcpToolName(serverName: string, toolName: string): string {\n const prefix = `${serverName}_`;\n return toolName.startsWith(prefix) ? toolName : `${prefix}${toolName}`;\n}\n","/**\n * Resolution + dispatch for `a2a_local` and `mcp_local` tool refs.\n *\n * The wire protocol requires the SDK to ship the *resolved* A2A Agent Card\n * and the *resolved* MCP `Tool[]` inline as part of the spec. Users only\n * give the SDK a URL (or stdio command); this module turns that into the\n * resolved snapshot at spec-submit time, and speaks A2A `message/send` /\n * MCP `tools/call` at invocation time.\n *\n * Internal — not part of the public API.\n */\nimport type {\n LocalA2ATool,\n LocalMcpServer,\n McpClientLike,\n ResolvedAgentCard,\n ResolvedMcpServer,\n ToolRef,\n} from \"./tools.js\";\nimport { isLocalA2ATool, isLocalMcpServer } from \"./tools.js\";\n\n/**\n * Walks `tools[]` and resolves every `a2a_local` (HTTP fetch of the Agent\n * Card) + `mcp_local` (open transport, run `Initialize` + `tools/list`)\n * ref. Mutates the refs in place to attach the resolved snapshot, so the\n * subsequent `serializeToolRefs` call can read it. Returns the set of\n * resolutions that were created in *this* call (so the run driver can\n * close the MCP transports it opened when the run ends).\n */\nexport async function resolveLocalRefs(\n tools: ReadonlyArray<ToolRef> | undefined,\n opts: { fetch: typeof fetch } = { fetch: globalThis.fetch },\n): Promise<{\n /** MCP servers opened in *this* call — the run driver closes these on completion. */\n newlyOpenedMcp: LocalMcpServer[];\n}> {\n if (!tools || tools.length === 0) return { newlyOpenedMcp: [] };\n const newlyOpenedMcp: LocalMcpServer[] = [];\n\n // Resolve in parallel so a slow card / MCP connection doesn't gate the others.\n const work: Array<Promise<void>> = [];\n\n for (const t of tools) {\n if (isLocalA2ATool(t)) {\n if (t._resolvedCard) continue;\n work.push(resolveA2A(t, opts.fetch));\n } else if (isLocalMcpServer(t)) {\n if (t._resolved) continue;\n work.push(\n resolveMcp(t).then((resolved) => {\n if (resolved) newlyOpenedMcp.push(t);\n }),\n );\n }\n }\n\n await Promise.all(work);\n return { newlyOpenedMcp };\n}\n\nasync function resolveA2A(t: LocalA2ATool, fetchImpl: typeof fetch): Promise<void> {\n const headers = { Accept: \"application/json\", ...(t.headers ?? {}) };\n const res = await fetchImpl(t.agentCardUrl, { method: \"GET\", headers });\n if (!res.ok) {\n throw new Error(\n `defineLocalA2A(${JSON.stringify(t.name)}): GET ${t.agentCardUrl} returned ${res.status} ${res.statusText}`,\n );\n }\n const card = (await res.json()) as ResolvedAgentCard;\n if (!card || typeof card !== \"object\" || typeof card.name !== \"string\" || !card.name) {\n throw new Error(\n `defineLocalA2A(${JSON.stringify(t.name)}): ${t.agentCardUrl} did not return a valid Agent Card (missing required \\`name\\` field)`,\n );\n }\n // Mutate the ref so serialize + dispatch can read it.\n (t as { _resolvedCard?: ResolvedAgentCard })._resolvedCard = card;\n}\n\n/**\n * Open the MCP transport, run `Initialize` + `tools/list`, and cache the\n * client + snapshot on `t._resolved`. Returns `true` if a new connection\n * was opened (so the caller can register it for cleanup).\n */\nasync function resolveMcp(t: LocalMcpServer): Promise<boolean> {\n // We import lazily so users who never use mcp_local don't pay the\n // `@modelcontextprotocol/sdk` startup cost.\n const { Client } = await import(\"@modelcontextprotocol/sdk/client/index.js\");\n let transport: { close?: () => Promise<void> | void };\n let connect: (client: InstanceType<typeof Client>) => Promise<void>;\n if (t.http) {\n const { StreamableHTTPClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\n );\n const httpTransport = new StreamableHTTPClientTransport(new URL(t.http.url), {\n requestInit: t.http.headers ? { headers: t.http.headers } : {},\n });\n transport = httpTransport;\n connect = (c) => c.connect(httpTransport);\n } else if (t.stdio) {\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n const stdioTransport = new StdioClientTransport({\n command: t.stdio.command,\n ...(t.stdio.args ? { args: t.stdio.args } : {}),\n ...(t.stdio.env ? { env: t.stdio.env } : {}),\n ...(t.stdio.cwd ? { cwd: t.stdio.cwd } : {}),\n });\n transport = stdioTransport;\n connect = (c) => c.connect(stdioTransport);\n } else {\n throw new Error(\n `defineLocalMcp(${JSON.stringify(t.name)}): missing transport (no \\`url\\` or \\`command\\` was provided)`,\n );\n }\n\n const client = new Client({ name: \"@mantyx/sdk\", version: \"0.3.0\" }, { capabilities: {} });\n try {\n await connect(client);\n } catch (err) {\n throw new Error(\n `defineLocalMcp(${JSON.stringify(t.name)}): failed to connect — ${(err as Error).message}`,\n { cause: err },\n );\n }\n\n const serverInfo = (client.getServerVersion() ?? { name: t.name }) as {\n name: string;\n version?: string;\n };\n const listed = await client.listTools();\n const tools = listed.tools.map((tool) => {\n const out: Record<string, unknown> = {\n name: tool.name,\n inputSchema: tool.inputSchema as Record<string, unknown>,\n };\n if (typeof tool.description === \"string\") out.description = tool.description;\n if (tool.annotations) out.annotations = tool.annotations as Record<string, unknown>;\n return out as ResolvedMcpServer[\"tools\"][number];\n });\n\n const close = async (): Promise<void> => {\n try {\n await client.close();\n } catch {\n /* best effort */\n }\n try {\n const t = transport as { close?: () => Promise<void> | void };\n if (t.close) await t.close();\n } catch {\n /* best effort */\n }\n };\n\n (t as { _resolved?: ResolvedMcpServer })._resolved = {\n serverInfo,\n tools,\n client: client as unknown as McpClientLike,\n close,\n };\n return true;\n}\n\n/**\n * Close every MCP transport on the given refs (best-effort, idempotent).\n * Safe to call multiple times — the resolved cache is cleared after the\n * first call so re-running a session re-opens fresh connections.\n */\nexport async function closeMcpRefs(tools: ReadonlyArray<ToolRef> | undefined): Promise<void> {\n if (!tools || tools.length === 0) return;\n const closes: Array<Promise<void>> = [];\n for (const t of tools) {\n if (!isLocalMcpServer(t)) continue;\n const resolved = t._resolved;\n if (!resolved) continue;\n (t as { _resolved?: ResolvedMcpServer })._resolved = undefined;\n closes.push(resolved.close());\n }\n await Promise.all(closes);\n}\n\n// ---------------------------------------------------- A2A `message/send` call\n\n/**\n * POST a JSON-RPC `message/send` request to the resolved Agent Card's\n * `url`, then extract a single text reply. Returns the empty string when\n * the peer responds with no text content.\n */\nexport async function callA2A(\n t: LocalA2ATool,\n args: { message: string },\n opts: { fetch: typeof fetch } = { fetch: globalThis.fetch },\n): Promise<string> {\n const card = t._resolvedCard;\n if (!card) {\n throw new Error(\n `defineLocalA2A(${JSON.stringify(t.name)}): agent card has not been resolved yet`,\n );\n }\n const url = typeof card.url === \"string\" && card.url.length > 0 ? card.url : t.agentCardUrl;\n const body = {\n jsonrpc: \"2.0\" as const,\n id: cryptoRandomId(),\n method: \"message/send\",\n params: {\n message: {\n kind: \"message\",\n role: \"user\",\n messageId: cryptoRandomId(),\n parts: [{ kind: \"text\", text: args.message }],\n },\n },\n };\n const res = await opts.fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(t.headers ?? {}),\n },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n throw new Error(\n `A2A message/send to ${url} returned ${res.status} ${res.statusText}`,\n );\n }\n const json = (await res.json()) as {\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n };\n if (json.error) {\n throw new Error(`A2A peer reported error ${json.error.code}: ${json.error.message}`);\n }\n return extractA2AReplyText(json.result);\n}\n\n/**\n * Pull a single text string out of an A2A `message/send` result. The spec\n * lets the peer reply with either a `Message` (parts[]) or a `Task`. We\n * handle both shapes plus a couple of common fallbacks; anything else is\n * JSON-stringified so the model still gets *something* to reason over.\n */\nfunction extractA2AReplyText(result: unknown): string {\n if (result == null) return \"\";\n if (typeof result === \"string\") return result;\n if (typeof result !== \"object\") return JSON.stringify(result);\n const obj = result as Record<string, unknown>;\n // Message — parts: [{ kind: \"text\", text: \"...\" }, ...]\n if (Array.isArray(obj.parts)) {\n const text = textFromParts(obj.parts);\n if (text) return text;\n }\n // Task — status.message.parts (most peers' default reply shape)\n const status = obj.status as Record<string, unknown> | undefined;\n const statusMessage = status?.message as Record<string, unknown> | undefined;\n if (Array.isArray(statusMessage?.parts)) {\n const text = textFromParts(statusMessage!.parts as unknown[]);\n if (text) return text;\n }\n // Task — final artifact text\n const artifacts = obj.artifacts as unknown;\n if (Array.isArray(artifacts) && artifacts.length > 0) {\n const last = artifacts[artifacts.length - 1] as Record<string, unknown>;\n if (Array.isArray(last.parts)) {\n const text = textFromParts(last.parts);\n if (text) return text;\n }\n }\n return JSON.stringify(result);\n}\n\nfunction textFromParts(parts: unknown[]): string {\n const out: string[] = [];\n for (const part of parts) {\n if (!part || typeof part !== \"object\") continue;\n const p = part as Record<string, unknown>;\n if ((p.kind === \"text\" || p.type === \"text\") && typeof p.text === \"string\") {\n out.push(p.text);\n }\n }\n return out.join(\"\\n\");\n}\n\n// ----------------------------------------------------------- MCP tools/call\n\n/**\n * Forward a `local_tool_call` for `kind: \"mcp_local\"` into the cached MCP\n * client's `tools/call` and flatten the response content blocks to a\n * single text string.\n */\nexport async function callMcpTool(\n server: LocalMcpServer,\n toolName: string,\n args: Record<string, unknown>,\n): Promise<string> {\n const resolved = server._resolved;\n if (!resolved) {\n throw new Error(\n `defineLocalMcp(${JSON.stringify(server.name)}): MCP server has not been initialised`,\n );\n }\n const result = await resolved.client.callTool({ name: toolName, arguments: args });\n if (result.isError) {\n const text = textFromMcpContent(result.content) || \"MCP tool reported an error\";\n throw new Error(text);\n }\n return textFromMcpContent(result.content);\n}\n\nfunction textFromMcpContent(\n content: Array<{ type: string; text?: string; [k: string]: unknown }> | undefined,\n): string {\n if (!content || content.length === 0) return \"\";\n const out: string[] = [];\n for (const block of content) {\n if (block.type === \"text\" && typeof block.text === \"string\") out.push(block.text);\n }\n return out.join(\"\\n\");\n}\n\n// ------------------------------------------------------------------ Helpers\n\nfunction cryptoRandomId(): string {\n // Best effort: prefer node:crypto / Web Crypto when available, fall back\n // to a Math.random-based id.\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (c?.randomUUID) return c.randomUUID();\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n","/**\n * Minimal Server-Sent Events parser.\n *\n * Reads a `ReadableStream<Uint8Array>` (the body of a `fetch()` response) and\n * yields parsed events with `id`, `event` and `data` fields. We deliberately\n * keep this dependency-free instead of pulling in `eventsource` / `eventsource-parser`\n * so the SDK has the smallest possible install footprint.\n *\n * Reconnect/replay is handled at a higher layer using `Last-Event-ID` (the\n * default for browsers' `EventSource`) plus a `?lastSeq=` query param so curl\n * users and SSE-via-fetch consumers both work.\n */\n\nexport interface SseEvent {\n id?: string;\n event?: string;\n data: string;\n}\n\nexport interface SseStreamOptions {\n /** AbortSignal for cancellation. */\n signal?: AbortSignal;\n}\n\n/**\n * Async generator yielding parsed SSE events from a fetch response body.\n * Comment frames (`:keep-alive`) are dropped.\n */\nexport async function* readSseStream(\n body: ReadableStream<Uint8Array> | null,\n opts: SseStreamOptions = {},\n): AsyncGenerator<SseEvent, void, void> {\n if (!body) return;\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n let cancelled = false;\n const onAbort = (): void => {\n cancelled = true;\n try {\n void reader.cancel();\n } catch {\n // ignore\n }\n };\n if (opts.signal) {\n if (opts.signal.aborted) {\n onAbort();\n } else {\n opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n try {\n while (!cancelled) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n // SSE events are separated by a blank line (\\n\\n). Some servers emit \\r\\n.\n let sepIdx: number;\n while ((sepIdx = findSeparator(buffer)) !== -1) {\n const raw = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + (buffer.startsWith(\"\\r\", sepIdx) ? 4 : 2));\n const ev = parseEventBlock(raw);\n if (ev) yield ev;\n }\n }\n } finally {\n if (opts.signal) opts.signal.removeEventListener(\"abort\", onAbort);\n try {\n reader.releaseLock();\n } catch {\n // ignore\n }\n }\n}\n\nfunction findSeparator(s: string): number {\n const lf = s.indexOf(\"\\n\\n\");\n const crlf = s.indexOf(\"\\r\\n\\r\\n\");\n if (lf === -1) return crlf;\n if (crlf === -1) return lf;\n return Math.min(lf, crlf);\n}\n\nfunction parseEventBlock(block: string): SseEvent | null {\n const lines = block.split(/\\r?\\n/);\n let id: string | undefined;\n let event: string | undefined;\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.length === 0) continue;\n if (line.startsWith(\":\")) continue; // comment / heartbeat\n const colonIdx = line.indexOf(\":\");\n const field = colonIdx === -1 ? line : line.slice(0, colonIdx);\n let value = colonIdx === -1 ? \"\" : line.slice(colonIdx + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n if (field === \"id\") id = value;\n else if (field === \"event\") event = value;\n else if (field === \"data\") dataLines.push(value);\n }\n if (dataLines.length === 0 && id === undefined && event === undefined) {\n return null;\n }\n return {\n ...(id !== undefined ? { id } : {}),\n ...(event !== undefined ? { event } : {}),\n data: dataLines.join(\"\\n\"),\n };\n}\n","/**\n * Lightweight Zod → JSON Schema converter for tool parameter definitions.\n *\n * Tries `z.toJSONSchema` (Zod v4+) first; falls back to a hand-rolled walker\n * for v3 schemas so the SDK works on a wide range of zod versions.\n *\n * The output is a JSON-Schema-shaped object with `type: \"object\"`, `properties`,\n * and `required`. The MANTYX server feeds this to LLM providers verbatim, so\n * unsupported zod features (effects, transforms, intersections) degrade to a\n * permissive `\"object\"` description rather than failing.\n */\nimport { z } from \"zod\";\n\ntype JsonSchema = Record<string, unknown>;\n\ninterface ZodLikeWithToJsonSchema {\n toJSONSchema?: (schema: unknown) => JsonSchema;\n}\n\nexport function zodToJsonSchema(schema: z.ZodType<unknown>): JsonSchema {\n const builtIn = (z as unknown as ZodLikeWithToJsonSchema).toJSONSchema;\n if (typeof builtIn === \"function\") {\n try {\n const out = builtIn.call(z, schema) as JsonSchema;\n if (out && typeof out === \"object\") return out;\n } catch {\n // fall through to manual converter\n }\n }\n return convertNode(schema);\n}\n\nfunction convertNode(schema: z.ZodType<unknown>): JsonSchema {\n const def = (schema as unknown as { _def?: { typeName?: string } })._def;\n const typeName = def?.typeName;\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodNull\":\n return { type: \"null\" };\n case \"ZodLiteral\": {\n const value = (def as { value?: unknown }).value;\n return { const: value, type: typeof value };\n }\n case \"ZodEnum\": {\n const values = (def as { values?: readonly string[] }).values ?? [];\n return { type: \"string\", enum: [...values] };\n }\n case \"ZodArray\": {\n const inner = (def as { type?: z.ZodType<unknown> }).type;\n return {\n type: \"array\",\n items: inner ? convertNode(inner) : {},\n };\n }\n case \"ZodOptional\":\n case \"ZodNullable\": {\n const inner = (def as { innerType?: z.ZodType<unknown> }).innerType;\n return inner ? convertNode(inner) : {};\n }\n case \"ZodDefault\": {\n const inner = (def as { innerType?: z.ZodType<unknown> }).innerType;\n return inner ? convertNode(inner) : {};\n }\n case \"ZodObject\": {\n const shape = (def as { shape?: () => Record<string, z.ZodType<unknown>> }).shape;\n const fields = typeof shape === \"function\" ? shape() : (shape as Record<string, z.ZodType<unknown>> | undefined);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n if (fields) {\n for (const [key, value] of Object.entries(fields)) {\n properties[key] = convertNode(value);\n const innerDef = (value as unknown as { _def?: { typeName?: string } })._def;\n const innerTypeName = innerDef?.typeName;\n if (innerTypeName !== \"ZodOptional\" && innerTypeName !== \"ZodDefault\") {\n required.push(key);\n }\n }\n }\n const out: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) out.required = required;\n return out;\n }\n default:\n return {};\n }\n}\n\n/**\n * Coerce a JSON-Schema-shaped value into a wire object suitable for the\n * MANTYX local-tool definition payload. Accepts either a Zod schema or an\n * already-shaped JSON Schema object.\n */\nexport function toToolParametersWire(\n parameters: z.ZodType<unknown> | JsonSchema | undefined,\n): JsonSchema {\n if (!parameters) return { type: \"object\", properties: {} };\n if (typeof (parameters as { _def?: unknown })._def !== \"undefined\") {\n return zodToJsonSchema(parameters as z.ZodType<unknown>);\n }\n return parameters as JsonSchema;\n}\n","/**\n * MANTYX SDK client: HTTP plumbing, model catalog, run + session drivers.\n */\nimport {\n MantyxAuthError,\n MantyxError,\n MantyxNetworkError,\n MantyxParseError,\n MantyxRunError,\n MantyxToolError,\n} from \"./errors.js\";\nimport { callA2A, callMcpTool, closeMcpRefs, resolveLocalRefs } from \"./local-resolver.js\";\nimport { readSseStream } from \"./sse.js\";\nimport type {\n LocalA2ATool,\n LocalMcpServer,\n LocalTool,\n ReasoningLevel,\n ToolRef,\n} from \"./tools.js\";\nimport { isLocalA2ATool, isLocalMcpServer, isLocalTool, prefixedMcpToolName } from \"./tools.js\";\nimport { toToolParametersWire } from \"./zod-to-json-schema.js\";\n\nexport const DEFAULT_BASE_URL = \"https://app.mantyx.io\";\n\nexport interface MantyxClientOptions {\n apiKey: string;\n workspaceSlug: string;\n /** Defaults to `https://app.mantyx.io`. Override for self-hosted instances. */\n baseUrl?: string;\n /** Optional `fetch` override (e.g. node-fetch wrapper, or a custom HTTP client). */\n fetch?: typeof fetch;\n /** Default per-request timeout in milliseconds. Default: 60s. */\n timeoutMs?: number;\n}\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n vendorModelId: string;\n source: \"workspace_provider\" | \"platform_offering\";\n contextWindowTokens: number | null;\n pricing: {\n inputPer1MUsd: number | null;\n outputPer1MUsd: number | null;\n cacheReadPer1MUsd: number | null;\n } | null;\n}\n\nexport interface ModelCatalog {\n models: ModelInfo[];\n defaultModelId: string | null;\n}\n\nexport interface AgentSpecBase {\n name?: string;\n /**\n * Reference to a persisted MANTYX agent in this workspace. When set, the\n * server hydrates `systemPrompt`, `modelId`, and the agent's own tools\n * (memory, skills, plugin tools, …) from the Agent row at run time, and any\n * `tools` you supply here are merged on top — typically `local` tools the\n * SDK wants the agent to be able to call back into.\n *\n * Either `agentId` or `systemPrompt` must be set.\n */\n agentId?: string;\n /** Required unless `agentId` is set. */\n systemPrompt?: string;\n modelId?: string;\n tools?: ToolRef[];\n /**\n * Provider thinking strength: a string anchor (`\"off\" | \"low\" | \"medium\" |\n * \"high\"`) or an integer in `0..100` (where `0` explicitly disables provider\n * thinking on reasoning models). The server maps this onto each LLM's\n * native dial — see `docs/agent-runs-protocol.md` §4.4.\n *\n * For session-scoped runs the session value sets the default; per-message\n * overrides on `session.send` apply to that single run.\n */\n reasoningLevel?: ReasoningLevel;\n budgets?: { maxToolTurns?: number };\n /**\n * Constrains the model's **final assistant text** to a JSON document\n * matching a JSON Schema. The terminal `result` event still carries the\n * reply as `text: string`, but that string is guaranteed-parseable JSON.\n *\n * `name` (optional) is a stable identifier the server forwards to the\n * provider (OpenAI `text.format.name`, Anthropic synthetic-tool name).\n * Defaults to `\"output\"`. Must match `/^[a-zA-Z0-9_-]{1,64}$/`.\n *\n * `schema` is a JSON Schema describing the final assistant text. Its\n * root must be a JSON **object** — most providers reject array / scalar\n * roots in structured-output mode. The schema is shipped verbatim;\n * MANTYX does not validate its contents (the provider does).\n *\n * Use {@link parseRunOutput} on the resulting `RunResult` to JSON.parse\n * the reply (and optionally re-validate against your own zod / typebox /\n * ajv schema). See `docs/wire-protocol.md` §7.\n */\n outputSchema?: OutputSchema;\n /**\n * Flat string→string KV carried alongside the run / session for\n * observability. Use it to tag runs with your own application identifiers\n * (customer id, environment, workflow name, …) — the values are visible in\n * the MANTYX dashboard and can be filtered there.\n *\n * Limits enforced server-side: max 16 entries; keys match\n * `[A-Za-z0-9._-]{1,64}`; values are strings ≤ 256 chars; serialized JSON\n * ≤ 4 KB. For session-scoped runs, the session's metadata is inherited and\n * any per-message override is merged on top.\n */\n metadata?: Record<string, string>;\n}\n\nexport interface RunSpec extends AgentSpecBase {\n prompt?: string;\n messages?: Array<{ role: \"user\" | \"assistant\" | \"system\"; content: string }>;\n /** Receives streaming assistant text deltas. */\n onAssistantDelta?: (delta: string) => void;\n /** Receives raw events (assistant_message, local_tool_call, tool_result, ...) for advanced consumers. */\n onEvent?: (event: RunEvent) => void;\n /** Aborts the run on the client and best-effort cancels server-side. */\n signal?: AbortSignal;\n}\n\nexport type SessionSpec = AgentSpecBase;\n\n/**\n * Constrains the final assistant text to a JSON document matching a\n * JSON Schema. See {@link AgentSpecBase.outputSchema} for the full\n * semantics.\n */\nexport interface OutputSchema {\n /** Optional. Defaults to `\"output\"`. Must match `/^[a-zA-Z0-9_-]{1,64}$/`. */\n name?: string;\n /** Required. JSON Schema describing the final assistant text. Root must be a JSON object. */\n schema: Record<string, unknown>;\n}\n\nexport interface RunResult {\n runId: string;\n text: string;\n events: RunEvent[];\n}\n\nexport interface RunEventBase {\n seq: number;\n type: string;\n}\n\nexport interface AssistantDeltaEvent extends RunEventBase {\n type: \"assistant_delta\";\n text: string;\n}\n\nexport interface ThinkingDeltaEvent extends RunEventBase {\n type: \"thinking_delta\";\n text: string;\n}\n\nexport interface AssistantMessageEvent extends RunEventBase {\n type: \"assistant_message\";\n text: string;\n}\n\nexport interface ServerToolResultEvent extends RunEventBase {\n type: \"tool_result\";\n name: string;\n args?: Record<string, unknown>;\n ok?: boolean;\n summary?: string;\n phase?: \"start\" | \"end\";\n}\n\nexport interface LocalToolCallEvent extends RunEventBase {\n type: \"local_tool_call\";\n toolUseId: string;\n /**\n * The model-facing tool name. For `kind: \"mcp_local\"` events this is the\n * `<server>_<tool>` name the SDK declared on the wire; the SDK looks up\n * the local MCP server via `mcpServer` and forwards `mcpToolName` to\n * `tools/call` rather than parsing the prefix itself.\n */\n name: string;\n args: Record<string, unknown>;\n /**\n * Discriminator for which client-resolved handler should run.\n * - `\"local\"` (or omitted) — generic local tool\n * - `\"a2a_local\"` — local Agent2Agent peer\n * - `\"mcp_local\"` — local MCP server tool\n */\n kind?: \"local\" | \"a2a_local\" | \"mcp_local\";\n /**\n * Present on `kind: \"a2a_local\"` — the full A2A Agent Card the SDK shipped\n * with the spec, echoed back unchanged. Surfaced for advanced consumers\n * (`onEvent` / `streamAgent` callers); the built-in dispatcher ignores it\n * because it already has the cached card from the original\n * `defineLocalA2A` resolution.\n */\n agentCard?: { name: string; url?: string; [k: string]: unknown };\n /** Present on `kind: \"mcp_local\"` — server label declared via `defineLocalMcp`. */\n mcpServer?: string;\n /**\n * Present on `kind: \"mcp_local\"` — the model-facing tool name as declared on\n * the wire. Always equals `name`; surfaced as a separate field for the SDK's\n * convenience when dispatching into a local MCP client.\n */\n mcpToolName?: string;\n /**\n * Present on `kind: \"mcp_local\"` — the verbatim `Implementation` block from\n * MCP `Initialize`, echoed back for observability.\n */\n mcpServerInfo?: { name: string; version?: string; [k: string]: unknown };\n}\n\nexport interface LocalToolResultInEvent extends RunEventBase {\n type: \"local_tool_result_in\";\n toolUseId: string;\n result?: string;\n error?: string;\n}\n\nexport interface ResultEvent extends RunEventBase {\n type: \"result\";\n subtype: string;\n text?: string;\n error?: string;\n}\n\nexport interface ErrorEvent extends RunEventBase {\n type: \"error\";\n error: string;\n code?: string;\n}\n\nexport interface CancelledEvent extends RunEventBase {\n type: \"cancelled\";\n reason?: string;\n}\n\nexport type RunEvent =\n | AssistantDeltaEvent\n | ThinkingDeltaEvent\n | AssistantMessageEvent\n | ServerToolResultEvent\n | LocalToolCallEvent\n | LocalToolResultInEvent\n | ResultEvent\n | ErrorEvent\n | CancelledEvent\n | (RunEventBase & { type: string; [key: string]: unknown });\n\nexport interface SessionInfo {\n id: string;\n name: string;\n status: \"active\" | \"ended\";\n createdAt: string;\n lastUsedAt: string;\n endedAt: string | null;\n agentSpec: AgentSpecBase;\n messages: Array<{ role: \"user\" | \"assistant\" | \"system\"; content: string }>;\n /** Metadata that was attached to the session at create time, returned for observability. */\n metadata: Record<string, string>;\n}\n\nexport class MantyxClient {\n readonly options: Required<Pick<MantyxClientOptions, \"apiKey\" | \"workspaceSlug\" | \"baseUrl\">> & {\n fetch: typeof fetch;\n timeoutMs: number;\n };\n\n constructor(opts: MantyxClientOptions) {\n if (!opts.apiKey || typeof opts.apiKey !== \"string\") {\n throw new MantyxError(\"apiKey is required\");\n }\n if (!opts.workspaceSlug || typeof opts.workspaceSlug !== \"string\") {\n throw new MantyxError(\"workspaceSlug is required\");\n }\n const f = opts.fetch ?? globalThis.fetch;\n if (typeof f !== \"function\") {\n throw new MantyxError(\n \"Global fetch is not available; pass a custom `fetch` implementation in MantyxClientOptions.\",\n );\n }\n this.options = {\n apiKey: opts.apiKey,\n workspaceSlug: opts.workspaceSlug,\n baseUrl: (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\n fetch: f,\n timeoutMs: opts.timeoutMs ?? 60_000,\n };\n }\n\n // -------------------------------------------------------------- Models\n\n async listModels(): Promise<ModelCatalog> {\n return this.request<ModelCatalog>({\n method: \"GET\",\n path: \"/models\",\n });\n }\n\n // ------------------------------------------------------------- One-shot\n\n async runAgent(spec: RunSpec): Promise<RunResult> {\n const tools = spec.tools ?? [];\n // Resolve every `a2a_local` agent card and open every `mcp_local`\n // transport before submitting; the resolver mutates the refs in place\n // so the subsequent `serializeAgentSpec` reads the resolved data.\n await resolveLocalRefs(tools, { fetch: this.options.fetch });\n const handlers = collectLocalHandlers(tools);\n try {\n const created = await this.request<{ runId: string; streamUrl: string }>({\n method: \"POST\",\n path: \"/agent-runs\",\n body: serializeAgentSpec(spec, {\n prompt: spec.prompt,\n messages: spec.messages,\n }),\n });\n return await this.driveRun(created.runId, handlers, {\n ...(spec.onAssistantDelta ? { onAssistantDelta: spec.onAssistantDelta } : {}),\n ...(spec.onEvent ? { onEvent: spec.onEvent } : {}),\n ...(spec.signal ? { signal: spec.signal } : {}),\n });\n } finally {\n // One-shot runs own their MCP transports; close them on exit.\n await closeMcpRefs(tools);\n }\n }\n\n async *streamAgent(spec: RunSpec): AsyncGenerator<RunEvent, void, void> {\n const tools = spec.tools ?? [];\n await resolveLocalRefs(tools, { fetch: this.options.fetch });\n const handlers = collectLocalHandlers(tools);\n try {\n const created = await this.request<{ runId: string; streamUrl: string }>({\n method: \"POST\",\n path: \"/agent-runs\",\n body: serializeAgentSpec(spec, {\n prompt: spec.prompt,\n messages: spec.messages,\n }),\n });\n yield* this.streamRunEvents(created.runId, handlers, spec.signal);\n } finally {\n await closeMcpRefs(tools);\n }\n }\n\n /**\n * Internal registry of client-resolved tool handlers. Exposed for callers\n * who drive the run loop manually via `driveRun` / `streamRunEvents`.\n */\n collectHandlers(tools: ToolRef[]): LocalHandlers {\n return collectLocalHandlers(tools);\n }\n\n // ------------------------------------------------------------- Sessions\n\n async createSession(spec: SessionSpec): Promise<AgentSession> {\n const tools = spec.tools ?? [];\n // Resolve local refs once at session creation; the session keeps the\n // resolved cards / live MCP connections for its lifetime.\n await resolveLocalRefs(tools, { fetch: this.options.fetch });\n const handlers = collectLocalHandlers(tools);\n const created = await this.request<{ sessionId: string; name: string; createdAt: string }>({\n method: \"POST\",\n path: \"/agent-sessions\",\n body: serializeAgentSpec(spec),\n });\n return new AgentSession(this, created.sessionId, handlers, tools);\n }\n\n /**\n * Re-emit a `local_tool_call` event into the right local handler. Useful\n * for tests and for users who consume events via `streamAgent` themselves.\n */\n async dispatchLocalToolFromEvent(\n runId: string,\n ev: LocalToolCallEvent,\n handlers: LocalHandlers,\n ): Promise<void> {\n return this.dispatchLocalTool(runId, ev, handlers);\n }\n\n async resumeSession(\n sessionId: string,\n opts: { tools?: ToolRef[] } = {},\n ): Promise<AgentSession> {\n // Verify the session exists and is still active. Optionally refresh tool defs.\n await this.getSessionInfo(sessionId);\n const tools = opts.tools ?? [];\n if (tools.length > 0) {\n // Resolve before the first send — mirrors createSession.\n await resolveLocalRefs(tools, { fetch: this.options.fetch });\n }\n const handlers = collectLocalHandlers(tools);\n return new AgentSession(this, sessionId, handlers, tools);\n }\n\n async endSession(sessionId: string): Promise<void> {\n await this.request<{ ok: boolean }>({\n method: \"DELETE\",\n path: `/agent-sessions/${encodeURIComponent(sessionId)}`,\n });\n }\n\n async getSessionInfo(sessionId: string): Promise<SessionInfo> {\n return this.request<SessionInfo>({\n method: \"GET\",\n path: `/agent-sessions/${encodeURIComponent(sessionId)}`,\n });\n }\n\n // ----------------------------------------------------------- Internals\n\n /** Drive an existing run to completion (collect events, dispatch local tools). */\n async driveRun(\n runId: string,\n handlers: LocalHandlers,\n opts: {\n onAssistantDelta?: (delta: string) => void;\n onEvent?: (event: RunEvent) => void;\n signal?: AbortSignal;\n } = {},\n ): Promise<RunResult> {\n const collected: RunEvent[] = [];\n let finalText = \"\";\n for await (const ev of this.streamRunEvents(runId, handlers, opts.signal)) {\n collected.push(ev);\n if (opts.onEvent) opts.onEvent(ev);\n if (ev.type === \"assistant_delta\" && opts.onAssistantDelta) {\n opts.onAssistantDelta((ev as AssistantDeltaEvent).text);\n }\n if (ev.type === \"result\") {\n const r = ev as ResultEvent;\n if (r.subtype === \"success\") {\n finalText = typeof r.text === \"string\" ? r.text : \"\";\n } else {\n throw new MantyxRunError(runId, r.subtype, r.error ?? r.subtype);\n }\n } else if (ev.type === \"error\") {\n const e = ev as ErrorEvent;\n throw new MantyxRunError(runId, e.code ?? \"error\", e.error);\n } else if (ev.type === \"cancelled\") {\n throw new MantyxRunError(runId, \"cancelled\", \"Run was cancelled\");\n }\n }\n return { runId, text: finalText, events: collected };\n }\n\n async *streamRunEvents(\n runId: string,\n handlers: LocalHandlers,\n signal?: AbortSignal,\n ): AsyncGenerator<RunEvent, void, void> {\n const url = this.absoluteUrl(`/agent-runs/${encodeURIComponent(runId)}/stream`);\n let lastSeq = 0;\n while (true) {\n const reqUrl = lastSeq > 0 ? `${url}?lastSeq=${lastSeq}` : url;\n const res = await this.options.fetch(reqUrl, {\n method: \"GET\",\n headers: {\n ...this.authHeaders(),\n Accept: \"text/event-stream\",\n ...(lastSeq > 0 ? { \"Last-Event-ID\": String(lastSeq) } : {}),\n },\n ...(signal ? { signal } : {}),\n }).catch((err: unknown) => {\n throw new MantyxNetworkError(`Failed to open SSE stream: ${(err as Error).message}`, {\n cause: err,\n });\n });\n if (!res.ok) {\n throw await this.errorFromResponse(res);\n }\n let terminal = false;\n try {\n for await (const sseEvent of readSseStream(res.body, { ...(signal ? { signal } : {}) })) {\n let data: Record<string, unknown> = {};\n try {\n data = JSON.parse(sseEvent.data || \"{}\") as Record<string, unknown>;\n } catch {\n data = {};\n }\n const evType = sseEvent.event ?? (data.type as string | undefined) ?? \"message\";\n const seq = typeof data.seq === \"number\" ? data.seq : lastSeq;\n if (typeof seq === \"number\" && seq > lastSeq) lastSeq = seq;\n const ev = { seq, type: evType, ...data } as RunEvent;\n yield ev;\n if (evType === \"local_tool_call\") {\n const localEv = ev as LocalToolCallEvent;\n void this.dispatchLocalTool(runId, localEv, handlers).catch((err) => {\n // best-effort logging; the run will surface a `result/error` if the\n // server eventually times out.\n console.error(\"[mantyx-sdk] local tool dispatch failed:\", err);\n });\n }\n if (evType === \"result\" || evType === \"error\" || evType === \"cancelled\") {\n terminal = true;\n return;\n }\n }\n } catch (err) {\n if (signal?.aborted) {\n throw new MantyxRunError(runId, \"cancelled\", \"Run was cancelled by the client\");\n }\n // Network blip — retry after a tiny backoff with `?lastSeq=`.\n await sleep(500);\n continue;\n }\n if (terminal) return;\n // Stream closed without a terminal event (server restart, etc.) — reconnect.\n }\n }\n\n async dispatchLocalTool(\n runId: string,\n ev: LocalToolCallEvent,\n handlers: LocalHandlers,\n ): Promise<void> {\n const kind = ev.kind ?? \"local\";\n try {\n let out: string;\n if (kind === \"a2a_local\") {\n const tool = handlers.a2aTools.get(ev.name);\n if (!tool) {\n await this.postToolResult(runId, ev.toolUseId, {\n error: `No local A2A handler registered for tool ${JSON.stringify(ev.name)}`,\n });\n return;\n }\n const message = typeof ev.args?.message === \"string\" ? (ev.args.message as string) : \"\";\n out = await callA2A(tool, { message }, { fetch: this.options.fetch });\n } else if (kind === \"mcp_local\") {\n const serverName = ev.mcpServer ?? \"\";\n const mcpToolName = ev.mcpToolName ?? \"\";\n const server = handlers.mcpServers.get(serverName);\n if (!server) {\n await this.postToolResult(runId, ev.toolUseId, {\n error: `No local MCP server registered as ${JSON.stringify(serverName)}`,\n });\n return;\n }\n // The wire-prefixed tool name (`<server>_<tool>`) is what the model\n // sees; the upstream MCP server uses the bare name. Strip the prefix\n // before forwarding to `tools/call`.\n const upstreamName = mcpToolName.startsWith(`${serverName}_`)\n ? mcpToolName.slice(serverName.length + 1)\n : mcpToolName;\n out = await callMcpTool(server, upstreamName, ev.args ?? {});\n } else {\n const handler = handlers.localTools.get(ev.name);\n if (!handler) {\n await this.postToolResult(runId, ev.toolUseId, {\n error: `No local handler registered for tool ${JSON.stringify(ev.name)}`,\n });\n return;\n }\n const args = handler.parameters\n ? (handler.parameters.parse?.(ev.args) as Record<string, unknown>) ?? ev.args\n : ev.args;\n const result = await handler.execute(args);\n out = typeof result === \"string\" ? result : JSON.stringify(result);\n }\n await this.postToolResult(runId, ev.toolUseId, { result: out });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const handlerName = describeHandlerName(ev);\n await this.postToolResult(runId, ev.toolUseId, {\n error: new MantyxToolError(handlerName, message).message,\n });\n }\n }\n\n async postToolResult(\n runId: string,\n toolUseId: string,\n payload: { result?: string; error?: string },\n ): Promise<void> {\n await this.request<{ ok: boolean }>({\n method: \"POST\",\n path: `/agent-runs/${encodeURIComponent(runId)}/tool-results`,\n body: { toolUseId, ...payload },\n });\n }\n\n async cancelRun(runId: string): Promise<void> {\n await this.request<{ ok: boolean }>({\n method: \"POST\",\n path: `/agent-runs/${encodeURIComponent(runId)}/cancel`,\n });\n }\n\n // -------------------------------------------------------------- HTTP\n\n private absoluteUrl(path: string): string {\n return `${this.options.baseUrl}/api/v1/workspaces/${encodeURIComponent(this.options.workspaceSlug)}${path}`;\n }\n\n private authHeaders(): Record<string, string> {\n return { Authorization: `Bearer ${this.options.apiKey}` };\n }\n\n async request<T>(args: {\n method: string;\n path: string;\n body?: unknown;\n timeoutMs?: number;\n }): Promise<T> {\n const url = this.absoluteUrl(args.path);\n const ctrl = new AbortController();\n const t = setTimeout(() => ctrl.abort(), args.timeoutMs ?? this.options.timeoutMs);\n try {\n const res = await this.options.fetch(url, {\n method: args.method,\n headers: {\n ...this.authHeaders(),\n ...(args.body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n Accept: \"application/json\",\n },\n ...(args.body !== undefined ? { body: JSON.stringify(args.body) } : {}),\n signal: ctrl.signal,\n }).catch((err: unknown) => {\n if (ctrl.signal.aborted) {\n throw new MantyxNetworkError(`Request timed out after ${args.timeoutMs ?? this.options.timeoutMs}ms`);\n }\n throw new MantyxNetworkError(`Network error: ${(err as Error).message}`, { cause: err });\n });\n if (!res.ok) {\n throw await this.errorFromResponse(res);\n }\n const text = await res.text();\n if (!text) return undefined as unknown as T;\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new MantyxError(`Failed to parse JSON response: ${(err as Error).message}`);\n }\n } finally {\n clearTimeout(t);\n }\n }\n\n private async errorFromResponse(res: Response): Promise<MantyxError> {\n let body: { error?: string; code?: string; hint?: string } = {};\n try {\n body = (await res.json()) as typeof body;\n } catch {\n // ignore\n }\n if (res.status === 401) {\n return new MantyxAuthError(body.error ?? \"Invalid API key\");\n }\n return new MantyxError(body.error ?? `HTTP ${res.status}`, {\n code: body.code ?? `http_${res.status}`,\n status: res.status,\n ...(body.hint ? { hint: body.hint } : {}),\n });\n }\n}\n\n// ---------------------------------------------------------------- Sessions\n\nexport class AgentSession {\n readonly id: string;\n readonly client: MantyxClient;\n private readonly handlers: LocalHandlers;\n private readonly tools: ToolRef[];\n\n constructor(\n client: MantyxClient,\n id: string,\n handlers: LocalHandlers,\n tools?: ToolRef[],\n ) {\n this.client = client;\n this.id = id;\n this.handlers = handlers;\n this.tools = tools ?? [];\n }\n\n async send(\n prompt: string,\n opts: {\n onAssistantDelta?: (s: string) => void;\n signal?: AbortSignal;\n /**\n * Per-message metadata override. Server-side this is merged on top of\n * the session's metadata at run-creation time (run-level keys win).\n * Useful for tagging individual turns (e.g. `{ \"trace_id\": \"abc\" }`).\n */\n metadata?: Record<string, string>;\n /**\n * Per-message override for `reasoningLevel`. Applies only to this run\n * and does not mutate the session's stored value.\n */\n reasoningLevel?: ReasoningLevel;\n /**\n * Per-message override for `outputSchema`. Applies only to this run\n * and does not mutate the session's stored value.\n */\n outputSchema?: OutputSchema;\n } = {},\n ): Promise<RunResult> {\n const created = await this.client.request<{ runId: string; streamUrl: string }>({\n method: \"POST\",\n path: `/agent-sessions/${encodeURIComponent(this.id)}/messages`,\n body: this.buildSessionMessageBody(prompt, opts),\n });\n return this.client.driveRun(created.runId, this.handlers, {\n ...(opts.onAssistantDelta ? { onAssistantDelta: opts.onAssistantDelta } : {}),\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n }\n\n async *stream(\n prompt: string,\n opts: {\n signal?: AbortSignal;\n metadata?: Record<string, string>;\n reasoningLevel?: ReasoningLevel;\n outputSchema?: OutputSchema;\n } = {},\n ): AsyncGenerator<RunEvent, void, void> {\n const created = await this.client.request<{ runId: string; streamUrl: string }>({\n method: \"POST\",\n path: `/agent-sessions/${encodeURIComponent(this.id)}/messages`,\n body: this.buildSessionMessageBody(prompt, opts),\n });\n yield* this.client.streamRunEvents(created.runId, this.handlers, opts.signal);\n }\n\n private buildSessionMessageBody(\n prompt: string,\n opts: {\n metadata?: Record<string, string>;\n reasoningLevel?: ReasoningLevel;\n outputSchema?: OutputSchema;\n },\n ): Record<string, unknown> {\n const body: Record<string, unknown> = { prompt };\n if (this.tools.length > 0) body.tools = serializeToolRefs(this.tools);\n if (opts.metadata && Object.keys(opts.metadata).length > 0) body.metadata = opts.metadata;\n if (opts.reasoningLevel !== undefined) {\n body.reasoningLevel = normalizeReasoningLevel(opts.reasoningLevel);\n }\n if (opts.outputSchema !== undefined) {\n body.outputSchema = normalizeOutputSchema(opts.outputSchema);\n }\n return body;\n }\n\n async history(): Promise<Array<{ role: \"user\" | \"assistant\" | \"system\"; content: string }>> {\n const info = await this.client.getSessionInfo(this.id);\n return info.messages;\n }\n\n async info(): Promise<SessionInfo> {\n return this.client.getSessionInfo(this.id);\n }\n\n async end(): Promise<void> {\n try {\n await this.client.endSession(this.id);\n } finally {\n // Close any MCP transports the session opened.\n await closeMcpRefs(this.tools);\n }\n }\n}\n\n// ---------------------------------------------------------------- Helpers\n\nfunction serializeAgentSpec(\n spec: AgentSpecBase,\n extra: { prompt?: string; messages?: Array<{ role: string; content: string }> } = {},\n): Record<string, unknown> {\n if (!spec.agentId && (typeof spec.systemPrompt !== \"string\" || spec.systemPrompt.length === 0)) {\n throw new MantyxError(\"Either `agentId` or `systemPrompt` is required\");\n }\n const body: Record<string, unknown> = {\n tools: serializeToolRefs(spec.tools ?? []),\n };\n if (typeof spec.systemPrompt === \"string\") body.systemPrompt = spec.systemPrompt;\n if (spec.agentId) body.agentId = spec.agentId;\n if (spec.name) body.name = spec.name;\n if (spec.modelId) body.modelId = spec.modelId;\n if (spec.reasoningLevel !== undefined) {\n body.reasoningLevel = normalizeReasoningLevel(spec.reasoningLevel);\n }\n if (spec.outputSchema !== undefined) {\n body.outputSchema = normalizeOutputSchema(spec.outputSchema);\n }\n if (spec.budgets) body.budgets = spec.budgets;\n if (spec.metadata && Object.keys(spec.metadata).length > 0) body.metadata = spec.metadata;\n if (extra.prompt !== undefined) body.prompt = extra.prompt;\n if (extra.messages !== undefined) body.messages = extra.messages;\n return body;\n}\n\nfunction serializeToolRefs(tools: ToolRef[]): unknown[] {\n return tools.map((t) => {\n switch (t.kind) {\n case \"mantyx\":\n return { kind: \"mantyx\", id: t.id };\n case \"mantyx_plugin\":\n return { kind: \"mantyx_plugin\", name: t.name };\n case \"local\":\n return {\n kind: \"local\",\n name: t.name,\n description: t.description,\n parameters: toToolParametersWire(t.parameters),\n };\n case \"a2a\":\n return {\n kind: \"a2a\",\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n agentCardUrl: t.agentCardUrl,\n ...(t.headers ? { headers: { ...t.headers } } : {}),\n ...(t.contextId ? { contextId: t.contextId } : {}),\n };\n case \"a2a_local\": {\n const card = t._resolvedCard;\n if (!card) {\n throw new MantyxError(\n `defineLocalA2A(${JSON.stringify(t.name)}): agent card has not been resolved yet (was \\`runAgent\\` / \\`createSession\\` skipped?)`,\n );\n }\n return {\n kind: \"a2a_local\",\n name: t.name,\n // The wire ships the resolved A2A Agent Card. Shallow-clone so\n // consumers can mutate the input later without affecting the\n // wire payload.\n agentCard: { ...card },\n };\n }\n case \"mcp\":\n return {\n kind: \"mcp\",\n name: t.name,\n url: t.url,\n ...(t.headers ? { headers: { ...t.headers } } : {}),\n ...(t.toolFilter ? { toolFilter: [...t.toolFilter] } : {}),\n };\n case \"mcp_local\": {\n const resolved = t._resolved;\n if (!resolved) {\n throw new MantyxError(\n `defineLocalMcp(${JSON.stringify(t.name)}): MCP server has not been initialised yet`,\n );\n }\n // The SDK owns naming for `mcp_local` (MANTYX does no prefixing).\n // We auto-prefix each upstream tool name with the server label so\n // the model-facing surface is `<server>_<tool>` — mirroring how\n // MANTYX prefixes for `kind: \"mcp\"`.\n const tools = resolved.tools.map((tool) => {\n const wire: Record<string, unknown> = {\n name: prefixedMcpToolName(t.name, tool.name),\n inputSchema: tool.inputSchema,\n };\n if (typeof tool.description === \"string\") wire.description = tool.description;\n if (tool.annotations) wire.annotations = tool.annotations;\n return wire;\n });\n return {\n kind: \"mcp_local\",\n name: t.name,\n serverInfo: { ...resolved.serverInfo },\n tools,\n };\n }\n }\n });\n}\n\n/** Internal registry of client-resolved handlers, indexed by `kind`. */\nexport interface LocalHandlers {\n /** `kind: \"local\"` — generic local tools, indexed by tool name. */\n localTools: Map<string, LocalTool>;\n /** `kind: \"a2a_local\"` — local A2A peers, indexed by tool name. */\n a2aTools: Map<string, LocalA2ATool>;\n /** `kind: \"mcp_local\"` — local MCP servers, indexed by server name. */\n mcpServers: Map<string, LocalMcpServer>;\n}\n\nfunction collectLocalHandlers(tools: ReadonlyArray<ToolRef>): LocalHandlers {\n const localTools = new Map<string, LocalTool>();\n const a2aTools = new Map<string, LocalA2ATool>();\n const mcpServers = new Map<string, LocalMcpServer>();\n for (const t of tools) {\n if (isLocalTool(t)) {\n localTools.set(t.name, t);\n } else if (isLocalA2ATool(t)) {\n a2aTools.set(t.name, t);\n } else if (isLocalMcpServer(t)) {\n mcpServers.set(t.name, t);\n }\n }\n return { localTools, a2aTools, mcpServers };\n}\n\nfunction describeHandlerName(ev: LocalToolCallEvent): string {\n if (ev.kind === \"mcp_local\" && ev.mcpServer && ev.mcpToolName) {\n return `${ev.mcpServer}/${ev.mcpToolName}`;\n }\n return ev.name;\n}\n\nfunction normalizeReasoningLevel(level: ReasoningLevel): string | number {\n if (typeof level === \"number\") {\n if (!Number.isFinite(level) || level < 0 || level > 100) {\n throw new MantyxError(\n `reasoningLevel must be a string anchor or an integer in 0..100, got ${level}`,\n );\n }\n return Math.trunc(level);\n }\n if (level === \"off\" || level === \"low\" || level === \"medium\" || level === \"high\") {\n return level;\n }\n throw new MantyxError(\n `reasoningLevel must be one of \"off\" | \"low\" | \"medium\" | \"high\" or a number 0..100, got ${JSON.stringify(level)}`,\n );\n}\n\nconst OUTPUT_SCHEMA_NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;\nconst OUTPUT_SCHEMA_MAX_BYTES = 32 * 1024;\n\n/**\n * Validate an `OutputSchema` value and return the wire-shaped object.\n *\n * Mirrors the server-side `400 invalid_request` checks (name regex, schema\n * shape, ≤ 32 KB serialized) so callers get an early local error instead of\n * a round-trip rejection.\n */\nfunction normalizeOutputSchema(value: OutputSchema): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new MantyxError(\n `outputSchema must be an object of shape { name?, schema }, got ${JSON.stringify(value)}`,\n );\n }\n const out: Record<string, unknown> = {};\n if (value.name !== undefined) {\n if (typeof value.name !== \"string\" || !OUTPUT_SCHEMA_NAME_RE.test(value.name)) {\n throw new MantyxError(\n `outputSchema.name must match /^[a-zA-Z0-9_-]{1,64}$/, got ${JSON.stringify(value.name)}`,\n );\n }\n out.name = value.name;\n }\n const schema = value.schema;\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n throw new MantyxError(\n `outputSchema.schema must be a non-null JSON object (the JSON Schema root)`,\n );\n }\n out.schema = schema;\n let serialized: string;\n try {\n serialized = JSON.stringify(out);\n } catch (err) {\n throw new MantyxError(\n `outputSchema is not JSON-serialisable: ${(err as Error).message ?? String(err)}`,\n );\n }\n if (serialized.length > OUTPUT_SCHEMA_MAX_BYTES) {\n throw new MantyxError(\n `outputSchema serialised JSON is ${serialized.length} bytes; the server enforces a 32 KB limit`,\n );\n }\n return out;\n}\n\n/**\n * Parse the terminal text of a `RunResult` as JSON.\n *\n * When the run was submitted with `outputSchema`, MANTYX (via the LLM\n * provider) guarantees the reply parses as JSON in the *vast* majority of\n * cases. Transient model errors (refusal text, truncation under\n * `max_tokens` pressure, exotic Unicode) can still produce strings that\n * fail to `JSON.parse` in rare edge cases — this helper centralises that\n * brittle step and surfaces a typed {@link MantyxParseError} on failure\n * with the original text preserved on `err.text`.\n *\n * Pass an optional `validator` (zod's `.parse`, an Ajv compiled validator,\n * or any function) to re-validate against your source-of-truth schema. The\n * validator's return value (or thrown error) is forwarded to the caller.\n *\n * @example\n * ```ts\n * import { z } from \"zod\";\n * import { parseRunOutput } from \"@mantyx/sdk\";\n *\n * const Schema = z.object({ city: z.string(), temperature_c: z.number() });\n * const result = await client.runAgent({\n * systemPrompt: \"...\",\n * prompt: \"What's the weather in SF?\",\n * outputSchema: { name: \"weather_report\", schema: weatherJsonSchema },\n * });\n * const report = parseRunOutput(result, Schema.parse.bind(Schema));\n * // ^? { city: string; temperature_c: number }\n * ```\n */\nexport function parseRunOutput<T = unknown>(\n result: RunResult,\n validator?: (value: unknown) => T,\n): T {\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.text);\n } catch (err) {\n throw new MantyxParseError(\n `Run ${result.runId} returned non-JSON text; cannot satisfy outputSchema`,\n result.text,\n { cause: err },\n );\n }\n if (validator) {\n try {\n return validator(parsed);\n } catch (err) {\n throw new MantyxParseError(\n `Run ${result.runId} output failed validation: ${(err as Error).message ?? String(err)}`,\n result.text,\n { cause: err },\n );\n }\n }\n return parsed as T;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","/**\n * Release version — synced from repo root VERSION (`npm run sync-version`).\n */\nexport const SDK_VERSION = \"0.5.0\";\n"],"mappings":"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","names":["t","tools"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/tools.ts","../src/local-resolver.ts","../src/sse.ts","../src/zod-to-json-schema.ts","../src/client.ts","../src/version.ts"],"sourcesContent":["/**\n * @mantyx/sdk — TypeScript client for the MANTYX agent runtime.\n *\n * Public surface:\n *\n * import { MantyxClient, defineLocalTool, mantyxTool, mantyxPluginTool } from \"@mantyx/sdk\";\n *\n * const client = new MantyxClient({\n * apiKey: process.env.MANTYX_API_KEY!,\n * workspaceSlug: process.env.MANTYX_WORKSPACE_SLUG!,\n * });\n *\n * const result = await client.runAgent({\n * systemPrompt: \"You are a helpful assistant.\",\n * prompt: \"Read /etc/hostname and tell me what it says.\",\n * tools: [\n * defineLocalTool({\n * name: \"read_file\",\n * description: \"Read a file from the local filesystem.\",\n * parameters: z.object({ path: z.string() }),\n * execute: async ({ path }) => fs.readFile(path, \"utf8\"),\n * }),\n * ],\n * });\n *\n * console.log(result.text);\n */\n\nexport {\n MantyxClient,\n AgentSession,\n DEFAULT_BASE_URL,\n parseRunOutput,\n} from \"./client.js\";\nexport type {\n MantyxClientOptions,\n ModelInfo,\n ModelCatalog,\n AgentSpecBase,\n RunSpec,\n SessionSpec,\n OutputSchema,\n RunResult,\n RunEvent,\n RunEventBase,\n AssistantDeltaEvent,\n ThinkingDeltaEvent,\n AssistantMessageEvent,\n ServerToolResultEvent,\n LocalToolCallEvent,\n LocalToolResultInEvent,\n ResultEvent,\n ErrorEvent,\n CancelledEvent,\n SessionInfo,\n LocalHandlers,\n} from \"./client.js\";\n\nexport {\n defineLocalTool,\n mantyxTool,\n mantyxPluginTool,\n mantyxA2A,\n defineLocalA2A,\n mantyxMcp,\n defineLocalMcp,\n isLocalTool,\n isLocalA2ATool,\n isLocalMcpServer,\n} from \"./tools.js\";\nexport type {\n LocalTool,\n MantyxToolRef,\n MantyxPluginToolRef,\n ToolRef,\n ZodLikeObject,\n DefineLocalToolOptions,\n ReasoningLevel,\n A2AToolRef,\n LocalA2ATool,\n McpToolRef,\n LocalMcpServer,\n LocalMcpHttpTransport,\n LocalMcpStdioTransport,\n MantyxA2AOptions,\n DefineLocalA2AOptions,\n MantyxMcpOptions,\n DefineLocalMcpOptions,\n} from \"./tools.js\";\n\nexport {\n MantyxError,\n MantyxAuthError,\n MantyxNetworkError,\n MantyxParseError,\n MantyxToolError,\n MantyxRunError,\n} from \"./errors.js\";\n\nexport { zodToJsonSchema, toToolParametersWire } from \"./zod-to-json-schema.js\";\n\nexport { readSseStream } from \"./sse.js\";\nexport type { SseEvent, SseStreamOptions } from \"./sse.js\";\n\nexport { SDK_VERSION } from \"./version.js\";\n\n// Note: `@mantyx/sdk/a2a-server` is exported as a separate sub-path so apps\n// that don't expose an A2A server never load `@a2a-js/sdk` or `express`. Import\n// from there to reach `MantyxAgentExecutor`, `serveAgentOverA2A`, and the\n// associated types.\n","/**\n * Error types raised by the MANTYX SDK.\n */\n\nexport class MantyxError extends Error {\n readonly code: string;\n readonly status: number | undefined;\n readonly hint: string | undefined;\n\n constructor(\n message: string,\n opts: { code?: string; status?: number; hint?: string } = {},\n ) {\n super(message);\n this.name = \"MantyxError\";\n this.code = opts.code ?? \"mantyx_error\";\n this.status = opts.status;\n this.hint = opts.hint;\n }\n}\n\nexport class MantyxNetworkError extends MantyxError {\n constructor(message: string, opts: { cause?: unknown } = {}) {\n super(message, { code: \"network\" });\n this.name = \"MantyxNetworkError\";\n if (opts.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = opts.cause;\n }\n }\n}\n\nexport class MantyxAuthError extends MantyxError {\n constructor(message = \"Invalid or missing API key\") {\n super(message, { code: \"unauthorized\", status: 401 });\n this.name = \"MantyxAuthError\";\n }\n}\n\nexport class MantyxToolError extends MantyxError {\n readonly toolName: string;\n\n constructor(toolName: string, message: string) {\n super(`Local tool ${JSON.stringify(toolName)} failed: ${message}`, {\n code: \"local_tool_failed\",\n });\n this.name = \"MantyxToolError\";\n this.toolName = toolName;\n }\n}\n\nexport class MantyxRunError extends MantyxError {\n readonly runId: string;\n readonly subtype: string;\n\n constructor(runId: string, subtype: string, message: string) {\n super(message, { code: subtype });\n this.name = \"MantyxRunError\";\n this.runId = runId;\n this.subtype = subtype;\n }\n}\n\n/**\n * Thrown by {@link parseRunOutput} when the run's terminal text was supposed\n * to be a JSON document (because `outputSchema` was set on the spec) but\n * either failed to JSON.parse or failed the user-supplied validator.\n *\n * The original `text` is preserved on the `text` field so callers can log\n * the raw model output for debugging.\n */\nexport class MantyxParseError extends MantyxError {\n readonly text: string;\n\n constructor(message: string, text: string, opts: { cause?: unknown } = {}) {\n super(message, { code: \"output_parse_failed\" });\n this.name = \"MantyxParseError\";\n this.text = text;\n if (opts.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = opts.cause;\n }\n }\n}\n","/**\n * Public tool helpers for the MANTYX SDK.\n *\n * Server-resolved (executed by MANTYX):\n * mantyxTool(id) → existing workspace `Tool` row by id\n * mantyxPluginTool(name) → built-in plugin tool by `@plugin/tool` name\n * mantyxA2A({...}) → remote Agent2Agent peer, dialed by MANTYX\n * mantyxMcp({...}) → remote MCP server (Streamable HTTP), proxied by MANTYX\n *\n * Client-resolved (executed in this process; the SDK shuttles inputs and\n * outputs over the agent loop):\n * defineLocalTool({...}) → generic local tool with a Zod parameter schema\n * defineLocalA2A({...}) → A2A peer the SDK can reach but MANTYX cannot —\n * pass an `agentCardUrl`; the SDK fetches the\n * Agent Card and speaks A2A `message/send` for you.\n * defineLocalMcp({...}) → MCP server the SDK manages — pass either a\n * Streamable HTTP `url` or a stdio\n * `command`; the SDK runs `Initialize` +\n * `tools/list` and forwards `tools/call` for you.\n *\n * The server emits a `local_tool_call` event for every client-resolved\n * invocation. The event carries a `kind` discriminator (`\"local\"` is implied\n * when omitted, `\"a2a_local\"` and `\"mcp_local\"` are explicit) so the SDK can\n * dispatch to the right handler.\n */\nimport type { z } from \"zod\";\n\nexport type ZodLikeObject = z.ZodType<Record<string, unknown>> & {\n _def?: unknown;\n parse?: (value: unknown) => unknown;\n};\n\n/**\n * Provider-thinking knob, mapped server-side onto each LLM's native dial:\n * `reasoning.effort` (OpenAI), `thinkingConfig.thinkingLevel` / `thinkingBudget`\n * (Gemini), or extended-thinking budget (Anthropic / Bedrock-Anthropic).\n *\n * Pass either a string anchor (`\"off\" | \"low\" | \"medium\" | \"high\"`) or an\n * integer in `0..100` (where `0` explicitly disables provider thinking).\n */\nexport type ReasoningLevel = \"off\" | \"low\" | \"medium\" | \"high\" | number;\n\n// ---------------------------------------------------------- Generic local tool\n\nexport interface LocalTool<TArgs = Record<string, unknown>> {\n readonly kind: \"local\";\n readonly name: string;\n readonly description: string;\n readonly parameters: ZodLikeObject | undefined;\n readonly execute: (args: TArgs) => Promise<string> | string;\n}\n\nexport interface DefineLocalToolOptions<T extends ZodLikeObject | undefined> {\n /** Lowercase alphanumeric + underscore, max 64 chars. */\n name: string;\n description?: string;\n parameters?: T;\n execute: (\n args: T extends ZodLikeObject ? z.infer<T> : Record<string, unknown>,\n ) => Promise<string> | string;\n}\n\nexport function defineLocalTool<T extends ZodLikeObject | undefined>(\n opts: DefineLocalToolOptions<T>,\n): LocalTool {\n assertToolName(opts.name);\n return {\n kind: \"local\",\n name: opts.name,\n description: opts.description ?? \"\",\n parameters: opts.parameters,\n execute: opts.execute as LocalTool[\"execute\"],\n };\n}\n\n// ------------------------------------------------------------ Server-resolved\n\nexport interface MantyxToolRef {\n readonly kind: \"mantyx\";\n readonly id: string;\n}\n\nexport interface MantyxPluginToolRef {\n readonly kind: \"mantyx_plugin\";\n readonly name: string;\n}\n\nexport function mantyxTool(id: string): MantyxToolRef {\n if (typeof id !== \"string\" || id.length === 0) {\n throw new Error(\"mantyxTool(id): id must be a non-empty string\");\n }\n return { kind: \"mantyx\", id };\n}\n\nexport function mantyxPluginTool(name: string): MantyxPluginToolRef {\n if (typeof name !== \"string\" || !name.startsWith(\"@\") || !name.includes(\"/\")) {\n throw new Error(\n `mantyxPluginTool(name): expected \"@plugin-slug/tool-name\", got ${JSON.stringify(name)}`,\n );\n }\n return { kind: \"mantyx_plugin\", name };\n}\n\n// ------------------------------------------------------------------------ A2A\n\n/**\n * Reference to a remote Agent2Agent peer reachable from MANTYX (server-resolved).\n * MANTYX dials `agentCardUrl` over A2A's `message/send` RPC and forwards the\n * remote agent's reply as the tool result.\n */\nexport interface A2AToolRef {\n readonly kind: \"a2a\";\n readonly name: string;\n readonly description?: string;\n readonly agentCardUrl: string;\n readonly headers?: Record<string, string>;\n readonly contextId?: string;\n}\n\nexport interface MantyxA2AOptions {\n /** Tool name surfaced to the model; must match `^[a-zA-Z0-9_]{1,64}$`. */\n name: string;\n description?: string;\n /** Remote Agent Card URL (`/.well-known/agent-card.json`) or JSON-RPC root. */\n agentCardUrl: string;\n /** Per-request HTTP headers (typically `Authorization`). */\n headers?: Record<string, string>;\n /** Optional A2A `contextId` to thread multiple delegations. */\n contextId?: string;\n}\n\nexport function mantyxA2A(opts: MantyxA2AOptions): A2AToolRef {\n assertToolName(opts.name);\n if (typeof opts.agentCardUrl !== \"string\" || opts.agentCardUrl.length === 0) {\n throw new Error(\"mantyxA2A: agentCardUrl is required\");\n }\n return {\n kind: \"a2a\",\n name: opts.name,\n ...(opts.description !== undefined ? { description: opts.description } : {}),\n agentCardUrl: opts.agentCardUrl,\n ...(opts.headers ? { headers: { ...opts.headers } } : {}),\n ...(opts.contextId ? { contextId: opts.contextId } : {}),\n };\n}\n\n/**\n * Local A2A peer — the SDK fetches the Agent Card from `agentCardUrl` on\n * the first run, ships the resolved card with the spec, and speaks A2A\n * `message/send` to `agentCard.url` whenever MANTYX emits a\n * `local_tool_call` for this tool. You only supply the URL.\n *\n * The model addresses this tool by `name` and always passes\n * `{ message: string }` as arguments.\n *\n * Resolution is lazy: the card is fetched on the first `runAgent` /\n * `streamAgent` / `createSession` (or `session.send`) call and cached on\n * the tool ref for the rest of the process lifetime. Re-construct the ref\n * to force a refetch.\n */\nexport interface LocalA2ATool {\n readonly kind: \"a2a_local\";\n readonly name: string;\n /** Where the SDK fetches the Agent Card from. Cached after the first hit. */\n readonly agentCardUrl: string;\n /**\n * Headers used for **both** the card fetch and every `message/send` POST\n * (typically `Authorization` for intranet peers).\n */\n readonly headers: Record<string, string> | undefined;\n /**\n * Internal cache of the resolved Agent Card. Populated lazily by the\n * client on the first run; not part of the user contract.\n * @internal\n */\n _resolvedCard?: ResolvedAgentCard;\n}\n\n/** Internal: the snapshot of a resolved A2A Agent Card. */\nexport interface ResolvedAgentCard {\n /** Required by the A2A spec; used for the synthesized tool description. */\n readonly name: string;\n /** Peer's A2A endpoint — where the SDK POSTs `message/send`. */\n readonly url?: string;\n /** Anything else the peer publishes; forwarded verbatim onto the wire. */\n readonly [k: string]: unknown;\n}\n\nexport interface DefineLocalA2AOptions {\n /** Tool name surfaced to the model. Must match `^[a-zA-Z0-9_]{1,64}$`. */\n name: string;\n /**\n * URL of the peer's Agent Card (`/.well-known/agent-card.json` is the\n * conventional path). The SDK fetches this on the first run, parses it,\n * and ships the resolved card with the spec. The resolved card's `url`\n * field is then used as the `message/send` target.\n */\n agentCardUrl: string;\n /**\n * Headers attached to **both** the card fetch and every `message/send`\n * POST (typically `Authorization` for intranet peers).\n */\n headers?: Record<string, string>;\n}\n\nexport function defineLocalA2A(opts: DefineLocalA2AOptions): LocalA2ATool {\n assertToolName(opts.name);\n if (typeof opts.agentCardUrl !== \"string\" || opts.agentCardUrl.length === 0) {\n throw new Error(\"defineLocalA2A: `agentCardUrl` is required\");\n }\n return {\n kind: \"a2a_local\",\n name: opts.name,\n agentCardUrl: opts.agentCardUrl,\n headers: opts.headers ? { ...opts.headers } : undefined,\n };\n}\n\n// ------------------------------------------------------------------------ MCP\n\n/**\n * Reference to a remote MCP server (Streamable HTTP) discovered + proxied by\n * MANTYX. Each tool in the catalog is exposed to the model as `<name>_<tool>`.\n */\nexport interface McpToolRef {\n readonly kind: \"mcp\";\n readonly name: string;\n readonly url: string;\n readonly headers?: Record<string, string>;\n readonly toolFilter?: string[];\n}\n\nexport interface MantyxMcpOptions {\n /** Server label; used to prefix every discovered tool. */\n name: string;\n /** Streamable HTTP MCP endpoint. */\n url: string;\n headers?: Record<string, string>;\n /** Optional allowlist of MCP tool names. */\n toolFilter?: string[];\n}\n\nexport function mantyxMcp(opts: MantyxMcpOptions): McpToolRef {\n assertToolName(opts.name);\n if (typeof opts.url !== \"string\" || opts.url.length === 0) {\n throw new Error(\"mantyxMcp: url is required\");\n }\n return {\n kind: \"mcp\",\n name: opts.name,\n url: opts.url,\n ...(opts.headers ? { headers: { ...opts.headers } } : {}),\n ...(opts.toolFilter ? { toolFilter: [...opts.toolFilter] } : {}),\n };\n}\n\n/**\n * Streamable HTTP transport spec for {@link defineLocalMcp}.\n */\nexport interface LocalMcpHttpTransport {\n /** Streamable HTTP MCP endpoint (e.g. `http://localhost:8080/mcp`). */\n url: string;\n /** HTTP headers sent on every MCP request (typically `Authorization`). */\n headers?: Record<string, string>;\n}\n\n/**\n * stdio transport spec for {@link defineLocalMcp}. The SDK spawns the\n * specified executable with the given arguments and speaks JSON-RPC over\n * its stdin/stdout streams.\n */\nexport interface LocalMcpStdioTransport {\n /** Executable to launch (e.g. `mcp-server-filesystem`, `node`, `uvx`). */\n command: string;\n /** Arguments passed verbatim. */\n args?: string[];\n /** Environment variables for the child process. Inherited if undefined. */\n env?: Record<string, string>;\n /** Working directory for the child process. */\n cwd?: string;\n}\n\n/**\n * Local MCP server — the SDK manages the entire MCP lifecycle for you.\n *\n * Pass either a Streamable HTTP `url` or an stdio `command` (mutually\n * exclusive). On the first run, the SDK opens the transport, runs MCP's\n * `Initialize` (capturing the `Implementation` block) and `tools/list`\n * (capturing the catalog), and ships both inline as part of the spec. On\n * every `local_tool_call` with `kind: \"mcp_local\"` the SDK forwards the\n * call to MCP `tools/call` on the cached connection and POSTs the\n * flattened text response back to MANTYX.\n *\n * Connections are reused across runs and across messages within a session\n * and closed on `runAgent` completion / `session.end()`.\n */\nexport interface LocalMcpServer {\n readonly kind: \"mcp_local\";\n readonly name: string;\n /** One-of with {@link stdio} — the transport spec is mutually exclusive. */\n readonly http: LocalMcpHttpTransport | undefined;\n /** One-of with {@link http} — the transport spec is mutually exclusive. */\n readonly stdio: LocalMcpStdioTransport | undefined;\n /**\n * Internal cache of the resolved MCP client + catalog. Populated lazily\n * by the run driver on the first run; not part of the user contract.\n * @internal\n */\n _resolved?: ResolvedMcpServer;\n}\n\n/**\n * Internal: the live MCP client + the snapshot the SDK ships on the wire.\n */\nexport interface ResolvedMcpServer {\n /** The MCP `Implementation` block from `Initialize`. */\n readonly serverInfo: { name: string; version?: string; [k: string]: unknown };\n /** Verbatim `tools/list` output. */\n readonly tools: ReadonlyArray<{\n readonly name: string;\n readonly description?: string;\n readonly inputSchema: Record<string, unknown>;\n readonly annotations?: Record<string, unknown>;\n readonly [k: string]: unknown;\n }>;\n /**\n * The live MCP client. Used by the run driver to call `tools/call`. The\n * concrete type depends on the transport — kept loose so this header\n * file doesn't have to import the MCP SDK type.\n */\n readonly client: McpClientLike;\n /** Closes the MCP transport (idempotent). */\n readonly close: () => Promise<void>;\n}\n\n/** Minimal interface this SDK uses against an MCP client. */\nexport interface McpClientLike {\n callTool(params: { name: string; arguments?: Record<string, unknown> }): Promise<{\n content?: Array<{ type: string; text?: string; [k: string]: unknown }>;\n isError?: boolean;\n [k: string]: unknown;\n }>;\n}\n\nexport interface DefineLocalMcpOptions {\n /**\n * Server label echoed back as `mcpServer` on every `local_tool_call`. The\n * SDK auto-prefixes each discovered tool's wire-level `name` with\n * `<this>_` so the model sees a non-colliding `<server>_<tool>` surface\n * — mirroring how MANTYX prefixes for `kind: \"mcp\"`.\n */\n name: string;\n /**\n * Streamable HTTP transport. Mutually exclusive with {@link command}.\n */\n url?: string;\n /**\n * Headers attached to every MCP request when using the HTTP transport.\n */\n headers?: Record<string, string>;\n /**\n * stdio transport: executable to launch. Mutually exclusive with\n * {@link url}.\n */\n command?: string;\n /** Arguments for the stdio child process. */\n args?: string[];\n /** Environment variables for the stdio child process. */\n env?: Record<string, string>;\n /** Working directory for the stdio child process. */\n cwd?: string;\n}\n\nexport function defineLocalMcp(opts: DefineLocalMcpOptions): LocalMcpServer {\n assertToolName(opts.name);\n const hasHttp = typeof opts.url === \"string\" && opts.url.length > 0;\n const hasStdio = typeof opts.command === \"string\" && opts.command.length > 0;\n if (hasHttp && hasStdio) {\n throw new Error(\n \"defineLocalMcp: pass either `url` (Streamable HTTP) or `command` (stdio), not both\",\n );\n }\n if (!hasHttp && !hasStdio) {\n throw new Error(\n \"defineLocalMcp: one of `url` (Streamable HTTP) or `command` (stdio) is required\",\n );\n }\n if (hasHttp) {\n const url = opts.url as string;\n return {\n kind: \"mcp_local\",\n name: opts.name,\n http: {\n url,\n ...(opts.headers ? { headers: { ...opts.headers } } : {}),\n },\n stdio: undefined,\n };\n }\n const command = opts.command as string;\n return {\n kind: \"mcp_local\",\n name: opts.name,\n http: undefined,\n stdio: {\n command,\n ...(opts.args ? { args: [...opts.args] } : {}),\n ...(opts.env ? { env: { ...opts.env } } : {}),\n ...(opts.cwd ? { cwd: opts.cwd } : {}),\n },\n };\n}\n\n// ----------------------------------------------------------------- Union type\n\nexport type ToolRef =\n | MantyxToolRef\n | MantyxPluginToolRef\n | LocalTool\n | A2AToolRef\n | LocalA2ATool\n | McpToolRef\n | LocalMcpServer;\n\n// --------------------------------------------------------- Type-guard helpers\n\nexport function isLocalTool(t: ToolRef): t is LocalTool {\n return t.kind === \"local\";\n}\nexport function isLocalA2ATool(t: ToolRef): t is LocalA2ATool {\n return t.kind === \"a2a_local\";\n}\nexport function isLocalMcpServer(t: ToolRef): t is LocalMcpServer {\n return t.kind === \"mcp_local\";\n}\n\n// ------------------------------------------------------------------- Internal\n\nconst TOOL_NAME_RE = /^[a-zA-Z0-9_]{1,64}$/;\n\nfunction assertToolName(name: string): void {\n if (!TOOL_NAME_RE.test(name)) {\n throw new Error(\n `Invalid tool name ${JSON.stringify(name)}: must match /^[a-zA-Z0-9_]{1,64}$/`,\n );\n }\n}\n\n/**\n * Compose the wire-level (model-facing) tool name for a `mcp_local` entry.\n * The SDK auto-prefixes every discovered tool's bare name with the server\n * label so the model surface stays `<server>_<tool>`.\n */\nexport function prefixedMcpToolName(serverName: string, toolName: string): string {\n const prefix = `${serverName}_`;\n return toolName.startsWith(prefix) ? toolName : `${prefix}${toolName}`;\n}\n","/**\n * Resolution + dispatch for `a2a_local` and `mcp_local` tool refs.\n *\n * The wire protocol requires the SDK to ship the *resolved* A2A Agent Card\n * and the *resolved* MCP `Tool[]` inline as part of the spec. Users only\n * give the SDK a URL (or stdio command); this module turns that into the\n * resolved snapshot at spec-submit time, and speaks A2A `message/send` /\n * MCP `tools/call` at invocation time.\n *\n * Internal — not part of the public API.\n */\nimport type {\n LocalA2ATool,\n LocalMcpServer,\n McpClientLike,\n ResolvedAgentCard,\n ResolvedMcpServer,\n ToolRef,\n} from \"./tools.js\";\nimport { isLocalA2ATool, isLocalMcpServer } from \"./tools.js\";\n\n/**\n * Walks `tools[]` and resolves every `a2a_local` (HTTP fetch of the Agent\n * Card) + `mcp_local` (open transport, run `Initialize` + `tools/list`)\n * ref. Mutates the refs in place to attach the resolved snapshot, so the\n * subsequent `serializeToolRefs` call can read it. Returns the set of\n * resolutions that were created in *this* call (so the run driver can\n * close the MCP transports it opened when the run ends).\n */\nexport async function resolveLocalRefs(\n tools: ReadonlyArray<ToolRef> | undefined,\n opts: { fetch: typeof fetch } = { fetch: globalThis.fetch },\n): Promise<{\n /** MCP servers opened in *this* call — the run driver closes these on completion. */\n newlyOpenedMcp: LocalMcpServer[];\n}> {\n if (!tools || tools.length === 0) return { newlyOpenedMcp: [] };\n const newlyOpenedMcp: LocalMcpServer[] = [];\n\n // Resolve in parallel so a slow card / MCP connection doesn't gate the others.\n const work: Array<Promise<void>> = [];\n\n for (const t of tools) {\n if (isLocalA2ATool(t)) {\n if (t._resolvedCard) continue;\n work.push(resolveA2A(t, opts.fetch));\n } else if (isLocalMcpServer(t)) {\n if (t._resolved) continue;\n work.push(\n resolveMcp(t).then((resolved) => {\n if (resolved) newlyOpenedMcp.push(t);\n }),\n );\n }\n }\n\n await Promise.all(work);\n return { newlyOpenedMcp };\n}\n\nasync function resolveA2A(t: LocalA2ATool, fetchImpl: typeof fetch): Promise<void> {\n const headers = { Accept: \"application/json\", ...(t.headers ?? {}) };\n const res = await fetchImpl(t.agentCardUrl, { method: \"GET\", headers });\n if (!res.ok) {\n throw new Error(\n `defineLocalA2A(${JSON.stringify(t.name)}): GET ${t.agentCardUrl} returned ${res.status} ${res.statusText}`,\n );\n }\n const card = (await res.json()) as ResolvedAgentCard;\n if (!card || typeof card !== \"object\" || typeof card.name !== \"string\" || !card.name) {\n throw new Error(\n `defineLocalA2A(${JSON.stringify(t.name)}): ${t.agentCardUrl} did not return a valid Agent Card (missing required \\`name\\` field)`,\n );\n }\n // Mutate the ref so serialize + dispatch can read it.\n (t as { _resolvedCard?: ResolvedAgentCard })._resolvedCard = card;\n}\n\n/**\n * Open the MCP transport, run `Initialize` + `tools/list`, and cache the\n * client + snapshot on `t._resolved`. Returns `true` if a new connection\n * was opened (so the caller can register it for cleanup).\n */\nasync function resolveMcp(t: LocalMcpServer): Promise<boolean> {\n // We import lazily so users who never use mcp_local don't pay the\n // `@modelcontextprotocol/sdk` startup cost.\n const { Client } = await import(\"@modelcontextprotocol/sdk/client/index.js\");\n let transport: { close?: () => Promise<void> | void };\n let connect: (client: InstanceType<typeof Client>) => Promise<void>;\n if (t.http) {\n const { StreamableHTTPClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/streamableHttp.js\"\n );\n const httpTransport = new StreamableHTTPClientTransport(new URL(t.http.url), {\n requestInit: t.http.headers ? { headers: t.http.headers } : {},\n });\n transport = httpTransport;\n connect = (c) => c.connect(httpTransport);\n } else if (t.stdio) {\n const { StdioClientTransport } = await import(\n \"@modelcontextprotocol/sdk/client/stdio.js\"\n );\n const stdioTransport = new StdioClientTransport({\n command: t.stdio.command,\n ...(t.stdio.args ? { args: t.stdio.args } : {}),\n ...(t.stdio.env ? { env: t.stdio.env } : {}),\n ...(t.stdio.cwd ? { cwd: t.stdio.cwd } : {}),\n });\n transport = stdioTransport;\n connect = (c) => c.connect(stdioTransport);\n } else {\n throw new Error(\n `defineLocalMcp(${JSON.stringify(t.name)}): missing transport (no \\`url\\` or \\`command\\` was provided)`,\n );\n }\n\n const client = new Client({ name: \"@mantyx/sdk\", version: \"0.3.0\" }, { capabilities: {} });\n try {\n await connect(client);\n } catch (err) {\n throw new Error(\n `defineLocalMcp(${JSON.stringify(t.name)}): failed to connect — ${(err as Error).message}`,\n { cause: err },\n );\n }\n\n const serverInfo = (client.getServerVersion() ?? { name: t.name }) as {\n name: string;\n version?: string;\n };\n const listed = await client.listTools();\n const tools = listed.tools.map((tool) => {\n const out: Record<string, unknown> = {\n name: tool.name,\n inputSchema: tool.inputSchema as Record<string, unknown>,\n };\n if (typeof tool.description === \"string\") out.description = tool.description;\n if (tool.annotations) out.annotations = tool.annotations as Record<string, unknown>;\n return out as ResolvedMcpServer[\"tools\"][number];\n });\n\n const close = async (): Promise<void> => {\n try {\n await client.close();\n } catch {\n /* best effort */\n }\n try {\n const t = transport as { close?: () => Promise<void> | void };\n if (t.close) await t.close();\n } catch {\n /* best effort */\n }\n };\n\n (t as { _resolved?: ResolvedMcpServer })._resolved = {\n serverInfo,\n tools,\n client: client as unknown as McpClientLike,\n close,\n };\n return true;\n}\n\n/**\n * Close every MCP transport on the given refs (best-effort, idempotent).\n * Safe to call multiple times — the resolved cache is cleared after the\n * first call so re-running a session re-opens fresh connections.\n */\nexport async function closeMcpRefs(tools: ReadonlyArray<ToolRef> | undefined): Promise<void> {\n if (!tools || tools.length === 0) return;\n const closes: Array<Promise<void>> = [];\n for (const t of tools) {\n if (!isLocalMcpServer(t)) continue;\n const resolved = t._resolved;\n if (!resolved) continue;\n (t as { _resolved?: ResolvedMcpServer })._resolved = undefined;\n closes.push(resolved.close());\n }\n await Promise.all(closes);\n}\n\n// ---------------------------------------------------- A2A `message/send` call\n\n/**\n * POST a JSON-RPC `message/send` request to the resolved Agent Card's\n * `url`, then extract a single text reply. Returns the empty string when\n * the peer responds with no text content.\n */\nexport async function callA2A(\n t: LocalA2ATool,\n args: { message: string },\n opts: { fetch: typeof fetch } = { fetch: globalThis.fetch },\n): Promise<string> {\n const card = t._resolvedCard;\n if (!card) {\n throw new Error(\n `defineLocalA2A(${JSON.stringify(t.name)}): agent card has not been resolved yet`,\n );\n }\n const url = typeof card.url === \"string\" && card.url.length > 0 ? card.url : t.agentCardUrl;\n const body = {\n jsonrpc: \"2.0\" as const,\n id: cryptoRandomId(),\n method: \"message/send\",\n params: {\n message: {\n kind: \"message\",\n role: \"user\",\n messageId: cryptoRandomId(),\n parts: [{ kind: \"text\", text: args.message }],\n },\n },\n };\n const res = await opts.fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(t.headers ?? {}),\n },\n body: JSON.stringify(body),\n });\n if (!res.ok) {\n throw new Error(\n `A2A message/send to ${url} returned ${res.status} ${res.statusText}`,\n );\n }\n const json = (await res.json()) as {\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n };\n if (json.error) {\n throw new Error(`A2A peer reported error ${json.error.code}: ${json.error.message}`);\n }\n return extractA2AReplyText(json.result);\n}\n\n/**\n * Pull a single text string out of an A2A `message/send` result. The spec\n * lets the peer reply with either a `Message` (parts[]) or a `Task`. We\n * handle both shapes plus a couple of common fallbacks; anything else is\n * JSON-stringified so the model still gets *something* to reason over.\n */\nfunction extractA2AReplyText(result: unknown): string {\n if (result == null) return \"\";\n if (typeof result === \"string\") return result;\n if (typeof result !== \"object\") return JSON.stringify(result);\n const obj = result as Record<string, unknown>;\n // Message — parts: [{ kind: \"text\", text: \"...\" }, ...]\n if (Array.isArray(obj.parts)) {\n const text = textFromParts(obj.parts);\n if (text) return text;\n }\n // Task — status.message.parts (most peers' default reply shape)\n const status = obj.status as Record<string, unknown> | undefined;\n const statusMessage = status?.message as Record<string, unknown> | undefined;\n if (Array.isArray(statusMessage?.parts)) {\n const text = textFromParts(statusMessage!.parts as unknown[]);\n if (text) return text;\n }\n // Task — final artifact text\n const artifacts = obj.artifacts as unknown;\n if (Array.isArray(artifacts) && artifacts.length > 0) {\n const last = artifacts[artifacts.length - 1] as Record<string, unknown>;\n if (Array.isArray(last.parts)) {\n const text = textFromParts(last.parts);\n if (text) return text;\n }\n }\n return JSON.stringify(result);\n}\n\nfunction textFromParts(parts: unknown[]): string {\n const out: string[] = [];\n for (const part of parts) {\n if (!part || typeof part !== \"object\") continue;\n const p = part as Record<string, unknown>;\n if ((p.kind === \"text\" || p.type === \"text\") && typeof p.text === \"string\") {\n out.push(p.text);\n }\n }\n return out.join(\"\\n\");\n}\n\n// ----------------------------------------------------------- MCP tools/call\n\n/**\n * Forward a `local_tool_call` for `kind: \"mcp_local\"` into the cached MCP\n * client's `tools/call` and flatten the response content blocks to a\n * single text string.\n */\nexport async function callMcpTool(\n server: LocalMcpServer,\n toolName: string,\n args: Record<string, unknown>,\n): Promise<string> {\n const resolved = server._resolved;\n if (!resolved) {\n throw new Error(\n `defineLocalMcp(${JSON.stringify(server.name)}): MCP server has not been initialised`,\n );\n }\n const result = await resolved.client.callTool({ name: toolName, arguments: args });\n if (result.isError) {\n const text = textFromMcpContent(result.content) || \"MCP tool reported an error\";\n throw new Error(text);\n }\n return textFromMcpContent(result.content);\n}\n\nfunction textFromMcpContent(\n content: Array<{ type: string; text?: string; [k: string]: unknown }> | undefined,\n): string {\n if (!content || content.length === 0) return \"\";\n const out: string[] = [];\n for (const block of content) {\n if (block.type === \"text\" && typeof block.text === \"string\") out.push(block.text);\n }\n return out.join(\"\\n\");\n}\n\n// ------------------------------------------------------------------ Helpers\n\nfunction cryptoRandomId(): string {\n // Best effort: prefer node:crypto / Web Crypto when available, fall back\n // to a Math.random-based id.\n const c = (globalThis as { crypto?: { randomUUID?: () => string } }).crypto;\n if (c?.randomUUID) return c.randomUUID();\n return Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n","/**\n * Minimal Server-Sent Events parser.\n *\n * Reads a `ReadableStream<Uint8Array>` (the body of a `fetch()` response) and\n * yields parsed events with `id`, `event` and `data` fields. We deliberately\n * keep this dependency-free instead of pulling in `eventsource` / `eventsource-parser`\n * so the SDK has the smallest possible install footprint.\n *\n * Reconnect/replay is handled at a higher layer using `Last-Event-ID` (the\n * default for browsers' `EventSource`) plus a `?lastSeq=` query param so curl\n * users and SSE-via-fetch consumers both work.\n */\n\nexport interface SseEvent {\n id?: string;\n event?: string;\n data: string;\n}\n\nexport interface SseStreamOptions {\n /** AbortSignal for cancellation. */\n signal?: AbortSignal;\n}\n\n/**\n * Async generator yielding parsed SSE events from a fetch response body.\n * Comment frames (`:keep-alive`) are dropped.\n */\nexport async function* readSseStream(\n body: ReadableStream<Uint8Array> | null,\n opts: SseStreamOptions = {},\n): AsyncGenerator<SseEvent, void, void> {\n if (!body) return;\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n let cancelled = false;\n const onAbort = (): void => {\n cancelled = true;\n try {\n void reader.cancel();\n } catch {\n // ignore\n }\n };\n if (opts.signal) {\n if (opts.signal.aborted) {\n onAbort();\n } else {\n opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n try {\n while (!cancelled) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n // SSE events are separated by a blank line (\\n\\n). Some servers emit \\r\\n.\n let sepIdx: number;\n while ((sepIdx = findSeparator(buffer)) !== -1) {\n const raw = buffer.slice(0, sepIdx);\n buffer = buffer.slice(sepIdx + (buffer.startsWith(\"\\r\", sepIdx) ? 4 : 2));\n const ev = parseEventBlock(raw);\n if (ev) yield ev;\n }\n }\n } finally {\n if (opts.signal) opts.signal.removeEventListener(\"abort\", onAbort);\n try {\n reader.releaseLock();\n } catch {\n // ignore\n }\n }\n}\n\nfunction findSeparator(s: string): number {\n const lf = s.indexOf(\"\\n\\n\");\n const crlf = s.indexOf(\"\\r\\n\\r\\n\");\n if (lf === -1) return crlf;\n if (crlf === -1) return lf;\n return Math.min(lf, crlf);\n}\n\nfunction parseEventBlock(block: string): SseEvent | null {\n const lines = block.split(/\\r?\\n/);\n let id: string | undefined;\n let event: string | undefined;\n const dataLines: string[] = [];\n for (const line of lines) {\n if (line.length === 0) continue;\n if (line.startsWith(\":\")) continue; // comment / heartbeat\n const colonIdx = line.indexOf(\":\");\n const field = colonIdx === -1 ? line : line.slice(0, colonIdx);\n let value = colonIdx === -1 ? \"\" : line.slice(colonIdx + 1);\n if (value.startsWith(\" \")) value = value.slice(1);\n if (field === \"id\") id = value;\n else if (field === \"event\") event = value;\n else if (field === \"data\") dataLines.push(value);\n }\n if (dataLines.length === 0 && id === undefined && event === undefined) {\n return null;\n }\n return {\n ...(id !== undefined ? { id } : {}),\n ...(event !== undefined ? { event } : {}),\n data: dataLines.join(\"\\n\"),\n };\n}\n","/**\n * Lightweight Zod → JSON Schema converter for tool parameter definitions.\n *\n * Tries `z.toJSONSchema` (Zod v4+) first; falls back to a hand-rolled walker\n * for v3 schemas so the SDK works on a wide range of zod versions.\n *\n * The output is a JSON-Schema-shaped object with `type: \"object\"`, `properties`,\n * and `required`. The MANTYX server feeds this to LLM providers verbatim, so\n * unsupported zod features (effects, transforms, intersections) degrade to a\n * permissive `\"object\"` description rather than failing.\n */\nimport { z } from \"zod\";\n\ntype JsonSchema = Record<string, unknown>;\n\ninterface ZodLikeWithToJsonSchema {\n toJSONSchema?: (schema: unknown) => JsonSchema;\n}\n\nexport function zodToJsonSchema(schema: z.ZodType<unknown>): JsonSchema {\n const builtIn = (z as unknown as ZodLikeWithToJsonSchema).toJSONSchema;\n if (typeof builtIn === \"function\") {\n try {\n const out = builtIn.call(z, schema) as JsonSchema;\n if (out && typeof out === \"object\") return out;\n } catch {\n // fall through to manual converter\n }\n }\n return convertNode(schema);\n}\n\nfunction convertNode(schema: z.ZodType<unknown>): JsonSchema {\n const def = (schema as unknown as { _def?: { typeName?: string } })._def;\n const typeName = def?.typeName;\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\" };\n case \"ZodNumber\":\n return { type: \"number\" };\n case \"ZodBoolean\":\n return { type: \"boolean\" };\n case \"ZodNull\":\n return { type: \"null\" };\n case \"ZodLiteral\": {\n const value = (def as { value?: unknown }).value;\n return { const: value, type: typeof value };\n }\n case \"ZodEnum\": {\n const values = (def as { values?: readonly string[] }).values ?? [];\n return { type: \"string\", enum: [...values] };\n }\n case \"ZodArray\": {\n const inner = (def as { type?: z.ZodType<unknown> }).type;\n return {\n type: \"array\",\n items: inner ? convertNode(inner) : {},\n };\n }\n case \"ZodOptional\":\n case \"ZodNullable\": {\n const inner = (def as { innerType?: z.ZodType<unknown> }).innerType;\n return inner ? convertNode(inner) : {};\n }\n case \"ZodDefault\": {\n const inner = (def as { innerType?: z.ZodType<unknown> }).innerType;\n return inner ? convertNode(inner) : {};\n }\n case \"ZodObject\": {\n const shape = (def as { shape?: () => Record<string, z.ZodType<unknown>> }).shape;\n const fields = typeof shape === \"function\" ? shape() : (shape as Record<string, z.ZodType<unknown>> | undefined);\n const properties: Record<string, JsonSchema> = {};\n const required: string[] = [];\n if (fields) {\n for (const [key, value] of Object.entries(fields)) {\n properties[key] = convertNode(value);\n const innerDef = (value as unknown as { _def?: { typeName?: string } })._def;\n const innerTypeName = innerDef?.typeName;\n if (innerTypeName !== \"ZodOptional\" && innerTypeName !== \"ZodDefault\") {\n required.push(key);\n }\n }\n }\n const out: JsonSchema = { type: \"object\", properties };\n if (required.length > 0) out.required = required;\n return out;\n }\n default:\n return {};\n }\n}\n\n/**\n * Coerce a JSON-Schema-shaped value into a wire object suitable for the\n * MANTYX local-tool definition payload. Accepts either a Zod schema or an\n * already-shaped JSON Schema object.\n */\nexport function toToolParametersWire(\n parameters: z.ZodType<unknown> | JsonSchema | undefined,\n): JsonSchema {\n if (!parameters) return { type: \"object\", properties: {} };\n if (typeof (parameters as { _def?: unknown })._def !== \"undefined\") {\n return zodToJsonSchema(parameters as z.ZodType<unknown>);\n }\n return parameters as JsonSchema;\n}\n","/**\n * MANTYX SDK client: HTTP plumbing, model catalog, run + session drivers.\n */\nimport {\n MantyxAuthError,\n MantyxError,\n MantyxNetworkError,\n MantyxParseError,\n MantyxRunError,\n MantyxToolError,\n} from \"./errors.js\";\nimport { callA2A, callMcpTool, closeMcpRefs, resolveLocalRefs } from \"./local-resolver.js\";\nimport { readSseStream } from \"./sse.js\";\nimport type {\n LocalA2ATool,\n LocalMcpServer,\n LocalTool,\n ReasoningLevel,\n ToolRef,\n} from \"./tools.js\";\nimport { isLocalA2ATool, isLocalMcpServer, isLocalTool, prefixedMcpToolName } from \"./tools.js\";\nimport { toToolParametersWire } from \"./zod-to-json-schema.js\";\n\nexport const DEFAULT_BASE_URL = \"https://app.mantyx.io\";\n\nexport interface MantyxClientOptions {\n apiKey: string;\n workspaceSlug: string;\n /** Defaults to `https://app.mantyx.io`. Override for self-hosted instances. */\n baseUrl?: string;\n /** Optional `fetch` override (e.g. node-fetch wrapper, or a custom HTTP client). */\n fetch?: typeof fetch;\n /** Default per-request timeout in milliseconds. Default: 60s. */\n timeoutMs?: number;\n}\n\nexport interface ModelInfo {\n id: string;\n label: string;\n provider: string;\n vendorModelId: string;\n source: \"workspace_provider\" | \"platform_offering\";\n contextWindowTokens: number | null;\n pricing: {\n inputPer1MUsd: number | null;\n outputPer1MUsd: number | null;\n cacheReadPer1MUsd: number | null;\n } | null;\n}\n\nexport interface ModelCatalog {\n models: ModelInfo[];\n defaultModelId: string | null;\n}\n\nexport interface AgentSpecBase {\n name?: string;\n /**\n * Reference to a persisted MANTYX agent in this workspace. When set, the\n * server hydrates `systemPrompt`, `modelId`, and the agent's own tools\n * (memory, skills, plugin tools, …) from the Agent row at run time, and any\n * `tools` you supply here are merged on top — typically `local` tools the\n * SDK wants the agent to be able to call back into.\n *\n * Either `agentId` or `systemPrompt` must be set.\n */\n agentId?: string;\n /** Required unless `agentId` is set. */\n systemPrompt?: string;\n modelId?: string;\n tools?: ToolRef[];\n /**\n * Provider thinking strength: a string anchor (`\"off\" | \"low\" | \"medium\" |\n * \"high\"`) or an integer in `0..100` (where `0` explicitly disables provider\n * thinking on reasoning models). The server maps this onto each LLM's\n * native dial — see `docs/agent-runs-protocol.md` §4.4.\n *\n * For session-scoped runs the session value sets the default; per-message\n * overrides on `session.send` apply to that single run.\n */\n reasoningLevel?: ReasoningLevel;\n budgets?: { maxToolTurns?: number };\n /**\n * Constrains the model's **final assistant text** to a JSON document\n * matching a JSON Schema. The terminal `result` event still carries the\n * reply as `text: string`, but that string is guaranteed-parseable JSON.\n *\n * `name` (optional) is a stable identifier the server forwards to the\n * provider (OpenAI `text.format.name`, Anthropic synthetic-tool name).\n * Defaults to `\"output\"`. Must match `/^[a-zA-Z0-9_-]{1,64}$/`.\n *\n * `schema` is a JSON Schema describing the final assistant text. Its\n * root must be a JSON **object** — most providers reject array / scalar\n * roots in structured-output mode. The schema is shipped verbatim;\n * MANTYX does not validate its contents (the provider does).\n *\n * Use {@link parseRunOutput} on the resulting `RunResult` to JSON.parse\n * the reply (and optionally re-validate against your own zod / typebox /\n * ajv schema). See `docs/wire-protocol.md` §7.\n */\n outputSchema?: OutputSchema;\n /**\n * Flat string→string KV carried alongside the run / session for\n * observability. Use it to tag runs with your own application identifiers\n * (customer id, environment, workflow name, …) — the values are visible in\n * the MANTYX dashboard and can be filtered there.\n *\n * Limits enforced server-side: max 16 entries; keys match\n * `[A-Za-z0-9._-]{1,64}`; values are strings ≤ 256 chars; serialized JSON\n * ≤ 4 KB. For session-scoped runs, the session's metadata is inherited and\n * any per-message override is merged on top.\n */\n metadata?: Record<string, string>;\n}\n\nexport interface RunSpec extends AgentSpecBase {\n prompt?: string;\n messages?: Array<{ role: \"user\" | \"assistant\" | \"system\"; content: string }>;\n /** Receives streaming assistant text deltas. */\n onAssistantDelta?: (delta: string) => void;\n /** Receives raw events (assistant_message, local_tool_call, tool_result, ...) for advanced consumers. */\n onEvent?: (event: RunEvent) => void;\n /** Aborts the run on the client and best-effort cancels server-side. */\n signal?: AbortSignal;\n}\n\nexport type SessionSpec = AgentSpecBase;\n\n/**\n * Constrains the final assistant text to a JSON document matching a\n * JSON Schema. See {@link AgentSpecBase.outputSchema} for the full\n * semantics.\n */\nexport interface OutputSchema {\n /** Optional. Defaults to `\"output\"`. Must match `/^[a-zA-Z0-9_-]{1,64}$/`. */\n name?: string;\n /** Required. JSON Schema describing the final assistant text. Root must be a JSON object. */\n schema: Record<string, unknown>;\n}\n\nexport interface RunResult {\n runId: string;\n text: string;\n events: RunEvent[];\n}\n\nexport interface RunEventBase {\n seq: number;\n type: string;\n}\n\nexport interface AssistantDeltaEvent extends RunEventBase {\n type: \"assistant_delta\";\n text: string;\n}\n\nexport interface ThinkingDeltaEvent extends RunEventBase {\n type: \"thinking_delta\";\n text: string;\n}\n\nexport interface AssistantMessageEvent extends RunEventBase {\n type: \"assistant_message\";\n text: string;\n}\n\nexport interface ServerToolResultEvent extends RunEventBase {\n type: \"tool_result\";\n name: string;\n args?: Record<string, unknown>;\n ok?: boolean;\n summary?: string;\n phase?: \"start\" | \"end\";\n}\n\nexport interface LocalToolCallEvent extends RunEventBase {\n type: \"local_tool_call\";\n toolUseId: string;\n /**\n * The model-facing tool name. For `kind: \"mcp_local\"` events this is the\n * `<server>_<tool>` name the SDK declared on the wire; the SDK looks up\n * the local MCP server via `mcpServer` and forwards `mcpToolName` to\n * `tools/call` rather than parsing the prefix itself.\n */\n name: string;\n args: Record<string, unknown>;\n /**\n * Discriminator for which client-resolved handler should run.\n * - `\"local\"` (or omitted) — generic local tool\n * - `\"a2a_local\"` — local Agent2Agent peer\n * - `\"mcp_local\"` — local MCP server tool\n */\n kind?: \"local\" | \"a2a_local\" | \"mcp_local\";\n /**\n * Present on `kind: \"a2a_local\"` — the full A2A Agent Card the SDK shipped\n * with the spec, echoed back unchanged. Surfaced for advanced consumers\n * (`onEvent` / `streamAgent` callers); the built-in dispatcher ignores it\n * because it already has the cached card from the original\n * `defineLocalA2A` resolution.\n */\n agentCard?: { name: string; url?: string; [k: string]: unknown };\n /** Present on `kind: \"mcp_local\"` — server label declared via `defineLocalMcp`. */\n mcpServer?: string;\n /**\n * Present on `kind: \"mcp_local\"` — the model-facing tool name as declared on\n * the wire. Always equals `name`; surfaced as a separate field for the SDK's\n * convenience when dispatching into a local MCP client.\n */\n mcpToolName?: string;\n /**\n * Present on `kind: \"mcp_local\"` — the verbatim `Implementation` block from\n * MCP `Initialize`, echoed back for observability.\n */\n mcpServerInfo?: { name: string; version?: string; [k: string]: unknown };\n}\n\nexport interface LocalToolResultInEvent extends RunEventBase {\n type: \"local_tool_result_in\";\n toolUseId: string;\n result?: string;\n error?: string;\n}\n\nexport interface ResultEvent extends RunEventBase {\n type: \"result\";\n subtype: string;\n text?: string;\n error?: string;\n}\n\nexport interface ErrorEvent extends RunEventBase {\n type: \"error\";\n error: string;\n code?: string;\n}\n\nexport interface CancelledEvent extends RunEventBase {\n type: \"cancelled\";\n reason?: string;\n}\n\nexport type RunEvent =\n | AssistantDeltaEvent\n | ThinkingDeltaEvent\n | AssistantMessageEvent\n | ServerToolResultEvent\n | LocalToolCallEvent\n | LocalToolResultInEvent\n | ResultEvent\n | ErrorEvent\n | CancelledEvent\n | (RunEventBase & { type: string; [key: string]: unknown });\n\nexport interface SessionInfo {\n id: string;\n name: string;\n status: \"active\" | \"ended\";\n createdAt: string;\n lastUsedAt: string;\n endedAt: string | null;\n agentSpec: AgentSpecBase;\n messages: Array<{ role: \"user\" | \"assistant\" | \"system\"; content: string }>;\n /** Metadata that was attached to the session at create time, returned for observability. */\n metadata: Record<string, string>;\n}\n\nexport class MantyxClient {\n readonly options: Required<Pick<MantyxClientOptions, \"apiKey\" | \"workspaceSlug\" | \"baseUrl\">> & {\n fetch: typeof fetch;\n timeoutMs: number;\n };\n\n constructor(opts: MantyxClientOptions) {\n if (!opts.apiKey || typeof opts.apiKey !== \"string\") {\n throw new MantyxError(\"apiKey is required\");\n }\n if (!opts.workspaceSlug || typeof opts.workspaceSlug !== \"string\") {\n throw new MantyxError(\"workspaceSlug is required\");\n }\n const f = opts.fetch ?? globalThis.fetch;\n if (typeof f !== \"function\") {\n throw new MantyxError(\n \"Global fetch is not available; pass a custom `fetch` implementation in MantyxClientOptions.\",\n );\n }\n this.options = {\n apiKey: opts.apiKey,\n workspaceSlug: opts.workspaceSlug,\n baseUrl: (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\"),\n fetch: f,\n timeoutMs: opts.timeoutMs ?? 60_000,\n };\n }\n\n // -------------------------------------------------------------- Models\n\n async listModels(): Promise<ModelCatalog> {\n return this.request<ModelCatalog>({\n method: \"GET\",\n path: \"/models\",\n });\n }\n\n // ------------------------------------------------------------- One-shot\n\n async runAgent(spec: RunSpec): Promise<RunResult> {\n const tools = spec.tools ?? [];\n // Resolve every `a2a_local` agent card and open every `mcp_local`\n // transport before submitting; the resolver mutates the refs in place\n // so the subsequent `serializeAgentSpec` reads the resolved data.\n await resolveLocalRefs(tools, { fetch: this.options.fetch });\n const handlers = collectLocalHandlers(tools);\n try {\n const created = await this.request<{ runId: string; streamUrl: string }>({\n method: \"POST\",\n path: \"/agent-runs\",\n body: serializeAgentSpec(spec, {\n prompt: spec.prompt,\n messages: spec.messages,\n }),\n });\n return await this.driveRun(created.runId, handlers, {\n ...(spec.onAssistantDelta ? { onAssistantDelta: spec.onAssistantDelta } : {}),\n ...(spec.onEvent ? { onEvent: spec.onEvent } : {}),\n ...(spec.signal ? { signal: spec.signal } : {}),\n });\n } finally {\n // One-shot runs own their MCP transports; close them on exit.\n await closeMcpRefs(tools);\n }\n }\n\n async *streamAgent(spec: RunSpec): AsyncGenerator<RunEvent, void, void> {\n const tools = spec.tools ?? [];\n await resolveLocalRefs(tools, { fetch: this.options.fetch });\n const handlers = collectLocalHandlers(tools);\n try {\n const created = await this.request<{ runId: string; streamUrl: string }>({\n method: \"POST\",\n path: \"/agent-runs\",\n body: serializeAgentSpec(spec, {\n prompt: spec.prompt,\n messages: spec.messages,\n }),\n });\n yield* this.streamRunEvents(created.runId, handlers, spec.signal);\n } finally {\n await closeMcpRefs(tools);\n }\n }\n\n /**\n * Internal registry of client-resolved tool handlers. Exposed for callers\n * who drive the run loop manually via `driveRun` / `streamRunEvents`.\n */\n collectHandlers(tools: ToolRef[]): LocalHandlers {\n return collectLocalHandlers(tools);\n }\n\n // ------------------------------------------------------------- Sessions\n\n async createSession(spec: SessionSpec): Promise<AgentSession> {\n const tools = spec.tools ?? [];\n // Resolve local refs once at session creation; the session keeps the\n // resolved cards / live MCP connections for its lifetime.\n await resolveLocalRefs(tools, { fetch: this.options.fetch });\n const handlers = collectLocalHandlers(tools);\n const created = await this.request<{ sessionId: string; name: string; createdAt: string }>({\n method: \"POST\",\n path: \"/agent-sessions\",\n body: serializeAgentSpec(spec),\n });\n return new AgentSession(this, created.sessionId, handlers, tools);\n }\n\n /**\n * Re-emit a `local_tool_call` event into the right local handler. Useful\n * for tests and for users who consume events via `streamAgent` themselves.\n */\n async dispatchLocalToolFromEvent(\n runId: string,\n ev: LocalToolCallEvent,\n handlers: LocalHandlers,\n ): Promise<void> {\n return this.dispatchLocalTool(runId, ev, handlers);\n }\n\n async resumeSession(\n sessionId: string,\n opts: { tools?: ToolRef[] } = {},\n ): Promise<AgentSession> {\n // Verify the session exists and is still active. Optionally refresh tool defs.\n await this.getSessionInfo(sessionId);\n const tools = opts.tools ?? [];\n if (tools.length > 0) {\n // Resolve before the first send — mirrors createSession.\n await resolveLocalRefs(tools, { fetch: this.options.fetch });\n }\n const handlers = collectLocalHandlers(tools);\n return new AgentSession(this, sessionId, handlers, tools);\n }\n\n async endSession(sessionId: string): Promise<void> {\n await this.request<{ ok: boolean }>({\n method: \"DELETE\",\n path: `/agent-sessions/${encodeURIComponent(sessionId)}`,\n });\n }\n\n async getSessionInfo(sessionId: string): Promise<SessionInfo> {\n return this.request<SessionInfo>({\n method: \"GET\",\n path: `/agent-sessions/${encodeURIComponent(sessionId)}`,\n });\n }\n\n // ----------------------------------------------------------- Internals\n\n /** Drive an existing run to completion (collect events, dispatch local tools). */\n async driveRun(\n runId: string,\n handlers: LocalHandlers,\n opts: {\n onAssistantDelta?: (delta: string) => void;\n onEvent?: (event: RunEvent) => void;\n signal?: AbortSignal;\n } = {},\n ): Promise<RunResult> {\n const collected: RunEvent[] = [];\n let finalText = \"\";\n for await (const ev of this.streamRunEvents(runId, handlers, opts.signal)) {\n collected.push(ev);\n if (opts.onEvent) opts.onEvent(ev);\n if (ev.type === \"assistant_delta\" && opts.onAssistantDelta) {\n opts.onAssistantDelta((ev as AssistantDeltaEvent).text);\n }\n if (ev.type === \"result\") {\n const r = ev as ResultEvent;\n if (r.subtype === \"success\") {\n finalText = typeof r.text === \"string\" ? r.text : \"\";\n } else {\n throw new MantyxRunError(runId, r.subtype, r.error ?? r.subtype);\n }\n } else if (ev.type === \"error\") {\n const e = ev as ErrorEvent;\n throw new MantyxRunError(runId, e.code ?? \"error\", e.error);\n } else if (ev.type === \"cancelled\") {\n throw new MantyxRunError(runId, \"cancelled\", \"Run was cancelled\");\n }\n }\n return { runId, text: finalText, events: collected };\n }\n\n async *streamRunEvents(\n runId: string,\n handlers: LocalHandlers,\n signal?: AbortSignal,\n ): AsyncGenerator<RunEvent, void, void> {\n const url = this.absoluteUrl(`/agent-runs/${encodeURIComponent(runId)}/stream`);\n let lastSeq = 0;\n while (true) {\n const reqUrl = lastSeq > 0 ? `${url}?lastSeq=${lastSeq}` : url;\n const res = await this.options.fetch(reqUrl, {\n method: \"GET\",\n headers: {\n ...this.authHeaders(),\n Accept: \"text/event-stream\",\n ...(lastSeq > 0 ? { \"Last-Event-ID\": String(lastSeq) } : {}),\n },\n ...(signal ? { signal } : {}),\n }).catch((err: unknown) => {\n throw new MantyxNetworkError(`Failed to open SSE stream: ${(err as Error).message}`, {\n cause: err,\n });\n });\n if (!res.ok) {\n throw await this.errorFromResponse(res);\n }\n let terminal = false;\n try {\n for await (const sseEvent of readSseStream(res.body, { ...(signal ? { signal } : {}) })) {\n let data: Record<string, unknown> = {};\n try {\n data = JSON.parse(sseEvent.data || \"{}\") as Record<string, unknown>;\n } catch {\n data = {};\n }\n const evType = sseEvent.event ?? (data.type as string | undefined) ?? \"message\";\n const seq = typeof data.seq === \"number\" ? data.seq : lastSeq;\n if (typeof seq === \"number\" && seq > lastSeq) lastSeq = seq;\n const ev = { seq, type: evType, ...data } as RunEvent;\n yield ev;\n if (evType === \"local_tool_call\") {\n const localEv = ev as LocalToolCallEvent;\n void this.dispatchLocalTool(runId, localEv, handlers).catch((err) => {\n // best-effort logging; the run will surface a `result/error` if the\n // server eventually times out.\n console.error(\"[mantyx-sdk] local tool dispatch failed:\", err);\n });\n }\n if (evType === \"result\" || evType === \"error\" || evType === \"cancelled\") {\n terminal = true;\n return;\n }\n }\n } catch (err) {\n if (signal?.aborted) {\n throw new MantyxRunError(runId, \"cancelled\", \"Run was cancelled by the client\");\n }\n // Network blip — retry after a tiny backoff with `?lastSeq=`.\n await sleep(500);\n continue;\n }\n if (terminal) return;\n // Stream closed without a terminal event (server restart, etc.) — reconnect.\n }\n }\n\n async dispatchLocalTool(\n runId: string,\n ev: LocalToolCallEvent,\n handlers: LocalHandlers,\n ): Promise<void> {\n const kind = ev.kind ?? \"local\";\n try {\n let out: string;\n if (kind === \"a2a_local\") {\n const tool = handlers.a2aTools.get(ev.name);\n if (!tool) {\n await this.postToolResult(runId, ev.toolUseId, {\n error: `No local A2A handler registered for tool ${JSON.stringify(ev.name)}`,\n });\n return;\n }\n const message = typeof ev.args?.message === \"string\" ? (ev.args.message as string) : \"\";\n out = await callA2A(tool, { message }, { fetch: this.options.fetch });\n } else if (kind === \"mcp_local\") {\n const serverName = ev.mcpServer ?? \"\";\n const mcpToolName = ev.mcpToolName ?? \"\";\n const server = handlers.mcpServers.get(serverName);\n if (!server) {\n await this.postToolResult(runId, ev.toolUseId, {\n error: `No local MCP server registered as ${JSON.stringify(serverName)}`,\n });\n return;\n }\n // The wire-prefixed tool name (`<server>_<tool>`) is what the model\n // sees; the upstream MCP server uses the bare name. Strip the prefix\n // before forwarding to `tools/call`.\n const upstreamName = mcpToolName.startsWith(`${serverName}_`)\n ? mcpToolName.slice(serverName.length + 1)\n : mcpToolName;\n out = await callMcpTool(server, upstreamName, ev.args ?? {});\n } else {\n const handler = handlers.localTools.get(ev.name);\n if (!handler) {\n await this.postToolResult(runId, ev.toolUseId, {\n error: `No local handler registered for tool ${JSON.stringify(ev.name)}`,\n });\n return;\n }\n const args = handler.parameters\n ? (handler.parameters.parse?.(ev.args) as Record<string, unknown>) ?? ev.args\n : ev.args;\n const result = await handler.execute(args);\n out = typeof result === \"string\" ? result : JSON.stringify(result);\n }\n await this.postToolResult(runId, ev.toolUseId, { result: out });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const handlerName = describeHandlerName(ev);\n await this.postToolResult(runId, ev.toolUseId, {\n error: new MantyxToolError(handlerName, message).message,\n });\n }\n }\n\n async postToolResult(\n runId: string,\n toolUseId: string,\n payload: { result?: string; error?: string },\n ): Promise<void> {\n await this.request<{ ok: boolean }>({\n method: \"POST\",\n path: `/agent-runs/${encodeURIComponent(runId)}/tool-results`,\n body: { toolUseId, ...payload },\n });\n }\n\n async cancelRun(runId: string): Promise<void> {\n await this.request<{ ok: boolean }>({\n method: \"POST\",\n path: `/agent-runs/${encodeURIComponent(runId)}/cancel`,\n });\n }\n\n // -------------------------------------------------------------- HTTP\n\n private absoluteUrl(path: string): string {\n return `${this.options.baseUrl}/api/v1/workspaces/${encodeURIComponent(this.options.workspaceSlug)}${path}`;\n }\n\n private authHeaders(): Record<string, string> {\n return { Authorization: `Bearer ${this.options.apiKey}` };\n }\n\n async request<T>(args: {\n method: string;\n path: string;\n body?: unknown;\n timeoutMs?: number;\n }): Promise<T> {\n const url = this.absoluteUrl(args.path);\n const ctrl = new AbortController();\n const t = setTimeout(() => ctrl.abort(), args.timeoutMs ?? this.options.timeoutMs);\n try {\n const res = await this.options.fetch(url, {\n method: args.method,\n headers: {\n ...this.authHeaders(),\n ...(args.body !== undefined ? { \"Content-Type\": \"application/json\" } : {}),\n Accept: \"application/json\",\n },\n ...(args.body !== undefined ? { body: JSON.stringify(args.body) } : {}),\n signal: ctrl.signal,\n }).catch((err: unknown) => {\n if (ctrl.signal.aborted) {\n throw new MantyxNetworkError(`Request timed out after ${args.timeoutMs ?? this.options.timeoutMs}ms`);\n }\n throw new MantyxNetworkError(`Network error: ${(err as Error).message}`, { cause: err });\n });\n if (!res.ok) {\n throw await this.errorFromResponse(res);\n }\n const text = await res.text();\n if (!text) return undefined as unknown as T;\n try {\n return JSON.parse(text) as T;\n } catch (err) {\n throw new MantyxError(`Failed to parse JSON response: ${(err as Error).message}`);\n }\n } finally {\n clearTimeout(t);\n }\n }\n\n private async errorFromResponse(res: Response): Promise<MantyxError> {\n let body: { error?: string; code?: string; hint?: string } = {};\n try {\n body = (await res.json()) as typeof body;\n } catch {\n // ignore\n }\n if (res.status === 401) {\n return new MantyxAuthError(body.error ?? \"Invalid API key\");\n }\n return new MantyxError(body.error ?? `HTTP ${res.status}`, {\n code: body.code ?? `http_${res.status}`,\n status: res.status,\n ...(body.hint ? { hint: body.hint } : {}),\n });\n }\n}\n\n// ---------------------------------------------------------------- Sessions\n\nexport class AgentSession {\n readonly id: string;\n readonly client: MantyxClient;\n private readonly handlers: LocalHandlers;\n private readonly tools: ToolRef[];\n\n constructor(\n client: MantyxClient,\n id: string,\n handlers: LocalHandlers,\n tools?: ToolRef[],\n ) {\n this.client = client;\n this.id = id;\n this.handlers = handlers;\n this.tools = tools ?? [];\n }\n\n async send(\n prompt: string,\n opts: {\n onAssistantDelta?: (s: string) => void;\n signal?: AbortSignal;\n /**\n * Per-message metadata override. Server-side this is merged on top of\n * the session's metadata at run-creation time (run-level keys win).\n * Useful for tagging individual turns (e.g. `{ \"trace_id\": \"abc\" }`).\n */\n metadata?: Record<string, string>;\n /**\n * Per-message override for `reasoningLevel`. Applies only to this run\n * and does not mutate the session's stored value.\n */\n reasoningLevel?: ReasoningLevel;\n /**\n * Per-message override for `outputSchema`. Applies only to this run\n * and does not mutate the session's stored value.\n */\n outputSchema?: OutputSchema;\n } = {},\n ): Promise<RunResult> {\n const created = await this.client.request<{ runId: string; streamUrl: string }>({\n method: \"POST\",\n path: `/agent-sessions/${encodeURIComponent(this.id)}/messages`,\n body: this.buildSessionMessageBody(prompt, opts),\n });\n return this.client.driveRun(created.runId, this.handlers, {\n ...(opts.onAssistantDelta ? { onAssistantDelta: opts.onAssistantDelta } : {}),\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n }\n\n async *stream(\n prompt: string,\n opts: {\n signal?: AbortSignal;\n metadata?: Record<string, string>;\n reasoningLevel?: ReasoningLevel;\n outputSchema?: OutputSchema;\n } = {},\n ): AsyncGenerator<RunEvent, void, void> {\n const created = await this.client.request<{ runId: string; streamUrl: string }>({\n method: \"POST\",\n path: `/agent-sessions/${encodeURIComponent(this.id)}/messages`,\n body: this.buildSessionMessageBody(prompt, opts),\n });\n yield* this.client.streamRunEvents(created.runId, this.handlers, opts.signal);\n }\n\n private buildSessionMessageBody(\n prompt: string,\n opts: {\n metadata?: Record<string, string>;\n reasoningLevel?: ReasoningLevel;\n outputSchema?: OutputSchema;\n },\n ): Record<string, unknown> {\n const body: Record<string, unknown> = { prompt };\n if (this.tools.length > 0) body.tools = serializeToolRefs(this.tools);\n if (opts.metadata && Object.keys(opts.metadata).length > 0) body.metadata = opts.metadata;\n if (opts.reasoningLevel !== undefined) {\n body.reasoningLevel = normalizeReasoningLevel(opts.reasoningLevel);\n }\n if (opts.outputSchema !== undefined) {\n body.outputSchema = normalizeOutputSchema(opts.outputSchema);\n }\n return body;\n }\n\n async history(): Promise<Array<{ role: \"user\" | \"assistant\" | \"system\"; content: string }>> {\n const info = await this.client.getSessionInfo(this.id);\n return info.messages;\n }\n\n async info(): Promise<SessionInfo> {\n return this.client.getSessionInfo(this.id);\n }\n\n async end(): Promise<void> {\n try {\n await this.client.endSession(this.id);\n } finally {\n // Close any MCP transports the session opened.\n await closeMcpRefs(this.tools);\n }\n }\n}\n\n// ---------------------------------------------------------------- Helpers\n\nfunction serializeAgentSpec(\n spec: AgentSpecBase,\n extra: { prompt?: string; messages?: Array<{ role: string; content: string }> } = {},\n): Record<string, unknown> {\n if (!spec.agentId && (typeof spec.systemPrompt !== \"string\" || spec.systemPrompt.length === 0)) {\n throw new MantyxError(\"Either `agentId` or `systemPrompt` is required\");\n }\n const body: Record<string, unknown> = {\n tools: serializeToolRefs(spec.tools ?? []),\n };\n if (typeof spec.systemPrompt === \"string\") body.systemPrompt = spec.systemPrompt;\n if (spec.agentId) body.agentId = spec.agentId;\n if (spec.name) body.name = spec.name;\n if (spec.modelId) body.modelId = spec.modelId;\n if (spec.reasoningLevel !== undefined) {\n body.reasoningLevel = normalizeReasoningLevel(spec.reasoningLevel);\n }\n if (spec.outputSchema !== undefined) {\n body.outputSchema = normalizeOutputSchema(spec.outputSchema);\n }\n if (spec.budgets) body.budgets = spec.budgets;\n if (spec.metadata && Object.keys(spec.metadata).length > 0) body.metadata = spec.metadata;\n if (extra.prompt !== undefined) body.prompt = extra.prompt;\n if (extra.messages !== undefined) body.messages = extra.messages;\n return body;\n}\n\nfunction serializeToolRefs(tools: ToolRef[]): unknown[] {\n return tools.map((t) => {\n switch (t.kind) {\n case \"mantyx\":\n return { kind: \"mantyx\", id: t.id };\n case \"mantyx_plugin\":\n return { kind: \"mantyx_plugin\", name: t.name };\n case \"local\":\n return {\n kind: \"local\",\n name: t.name,\n description: t.description,\n parameters: toToolParametersWire(t.parameters),\n };\n case \"a2a\":\n return {\n kind: \"a2a\",\n name: t.name,\n ...(t.description !== undefined ? { description: t.description } : {}),\n agentCardUrl: t.agentCardUrl,\n ...(t.headers ? { headers: { ...t.headers } } : {}),\n ...(t.contextId ? { contextId: t.contextId } : {}),\n };\n case \"a2a_local\": {\n const card = t._resolvedCard;\n if (!card) {\n throw new MantyxError(\n `defineLocalA2A(${JSON.stringify(t.name)}): agent card has not been resolved yet (was \\`runAgent\\` / \\`createSession\\` skipped?)`,\n );\n }\n return {\n kind: \"a2a_local\",\n name: t.name,\n // The wire ships the resolved A2A Agent Card. Shallow-clone so\n // consumers can mutate the input later without affecting the\n // wire payload.\n agentCard: { ...card },\n };\n }\n case \"mcp\":\n return {\n kind: \"mcp\",\n name: t.name,\n url: t.url,\n ...(t.headers ? { headers: { ...t.headers } } : {}),\n ...(t.toolFilter ? { toolFilter: [...t.toolFilter] } : {}),\n };\n case \"mcp_local\": {\n const resolved = t._resolved;\n if (!resolved) {\n throw new MantyxError(\n `defineLocalMcp(${JSON.stringify(t.name)}): MCP server has not been initialised yet`,\n );\n }\n // The SDK owns naming for `mcp_local` (MANTYX does no prefixing).\n // We auto-prefix each upstream tool name with the server label so\n // the model-facing surface is `<server>_<tool>` — mirroring how\n // MANTYX prefixes for `kind: \"mcp\"`.\n const tools = resolved.tools.map((tool) => {\n const wire: Record<string, unknown> = {\n name: prefixedMcpToolName(t.name, tool.name),\n inputSchema: tool.inputSchema,\n };\n if (typeof tool.description === \"string\") wire.description = tool.description;\n if (tool.annotations) wire.annotations = tool.annotations;\n return wire;\n });\n return {\n kind: \"mcp_local\",\n name: t.name,\n serverInfo: { ...resolved.serverInfo },\n tools,\n };\n }\n }\n });\n}\n\n/** Internal registry of client-resolved handlers, indexed by `kind`. */\nexport interface LocalHandlers {\n /** `kind: \"local\"` — generic local tools, indexed by tool name. */\n localTools: Map<string, LocalTool>;\n /** `kind: \"a2a_local\"` — local A2A peers, indexed by tool name. */\n a2aTools: Map<string, LocalA2ATool>;\n /** `kind: \"mcp_local\"` — local MCP servers, indexed by server name. */\n mcpServers: Map<string, LocalMcpServer>;\n}\n\nfunction collectLocalHandlers(tools: ReadonlyArray<ToolRef>): LocalHandlers {\n const localTools = new Map<string, LocalTool>();\n const a2aTools = new Map<string, LocalA2ATool>();\n const mcpServers = new Map<string, LocalMcpServer>();\n for (const t of tools) {\n if (isLocalTool(t)) {\n localTools.set(t.name, t);\n } else if (isLocalA2ATool(t)) {\n a2aTools.set(t.name, t);\n } else if (isLocalMcpServer(t)) {\n mcpServers.set(t.name, t);\n }\n }\n return { localTools, a2aTools, mcpServers };\n}\n\nfunction describeHandlerName(ev: LocalToolCallEvent): string {\n if (ev.kind === \"mcp_local\" && ev.mcpServer && ev.mcpToolName) {\n return `${ev.mcpServer}/${ev.mcpToolName}`;\n }\n return ev.name;\n}\n\nfunction normalizeReasoningLevel(level: ReasoningLevel): string | number {\n if (typeof level === \"number\") {\n if (!Number.isFinite(level) || level < 0 || level > 100) {\n throw new MantyxError(\n `reasoningLevel must be a string anchor or an integer in 0..100, got ${level}`,\n );\n }\n return Math.trunc(level);\n }\n if (level === \"off\" || level === \"low\" || level === \"medium\" || level === \"high\") {\n return level;\n }\n throw new MantyxError(\n `reasoningLevel must be one of \"off\" | \"low\" | \"medium\" | \"high\" or a number 0..100, got ${JSON.stringify(level)}`,\n );\n}\n\nconst OUTPUT_SCHEMA_NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;\nconst OUTPUT_SCHEMA_MAX_BYTES = 32 * 1024;\n\n/**\n * Validate an `OutputSchema` value and return the wire-shaped object.\n *\n * Mirrors the server-side `400 invalid_request` checks (name regex, schema\n * shape, ≤ 32 KB serialized) so callers get an early local error instead of\n * a round-trip rejection.\n */\nfunction normalizeOutputSchema(value: OutputSchema): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new MantyxError(\n `outputSchema must be an object of shape { name?, schema }, got ${JSON.stringify(value)}`,\n );\n }\n const out: Record<string, unknown> = {};\n if (value.name !== undefined) {\n if (typeof value.name !== \"string\" || !OUTPUT_SCHEMA_NAME_RE.test(value.name)) {\n throw new MantyxError(\n `outputSchema.name must match /^[a-zA-Z0-9_-]{1,64}$/, got ${JSON.stringify(value.name)}`,\n );\n }\n out.name = value.name;\n }\n const schema = value.schema;\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) {\n throw new MantyxError(\n `outputSchema.schema must be a non-null JSON object (the JSON Schema root)`,\n );\n }\n out.schema = schema;\n let serialized: string;\n try {\n serialized = JSON.stringify(out);\n } catch (err) {\n throw new MantyxError(\n `outputSchema is not JSON-serialisable: ${(err as Error).message ?? String(err)}`,\n );\n }\n if (serialized.length > OUTPUT_SCHEMA_MAX_BYTES) {\n throw new MantyxError(\n `outputSchema serialised JSON is ${serialized.length} bytes; the server enforces a 32 KB limit`,\n );\n }\n return out;\n}\n\n/**\n * Parse the terminal text of a `RunResult` as JSON.\n *\n * When the run was submitted with `outputSchema`, MANTYX (via the LLM\n * provider) guarantees the reply parses as JSON in the *vast* majority of\n * cases. Transient model errors (refusal text, truncation under\n * `max_tokens` pressure, exotic Unicode) can still produce strings that\n * fail to `JSON.parse` in rare edge cases — this helper centralises that\n * brittle step and surfaces a typed {@link MantyxParseError} on failure\n * with the original text preserved on `err.text`.\n *\n * Pass an optional `validator` (zod's `.parse`, an Ajv compiled validator,\n * or any function) to re-validate against your source-of-truth schema. The\n * validator's return value (or thrown error) is forwarded to the caller.\n *\n * @example\n * ```ts\n * import { z } from \"zod\";\n * import { parseRunOutput } from \"@mantyx/sdk\";\n *\n * const Schema = z.object({ city: z.string(), temperature_c: z.number() });\n * const result = await client.runAgent({\n * systemPrompt: \"...\",\n * prompt: \"What's the weather in SF?\",\n * outputSchema: { name: \"weather_report\", schema: weatherJsonSchema },\n * });\n * const report = parseRunOutput(result, Schema.parse.bind(Schema));\n * // ^? { city: string; temperature_c: number }\n * ```\n */\nexport function parseRunOutput<T = unknown>(\n result: RunResult,\n validator?: (value: unknown) => T,\n): T {\n let parsed: unknown;\n try {\n parsed = JSON.parse(result.text);\n } catch (err) {\n throw new MantyxParseError(\n `Run ${result.runId} returned non-JSON text; cannot satisfy outputSchema`,\n result.text,\n { cause: err },\n );\n }\n if (validator) {\n try {\n return validator(parsed);\n } catch (err) {\n throw new MantyxParseError(\n `Run ${result.runId} output failed validation: ${(err as Error).message ?? String(err)}`,\n result.text,\n { cause: err },\n );\n }\n }\n return parsed as T;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","/**\n * Release version — synced from repo root VERSION (`npm run sync-version`).\n */\nexport const SDK_VERSION = \"0.6.0\";\n"],"mappings":"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","names":["t","tools"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -97,6 +97,6 @@ declare function readSseStream(body: ReadableStream<Uint8Array> | null, opts?: S
|
|
|
97
97
|
/**
|
|
98
98
|
* Release version — synced from repo root VERSION (`npm run sync-version`).
|
|
99
99
|
*/
|
|
100
|
-
declare const SDK_VERSION = "0.
|
|
100
|
+
declare const SDK_VERSION = "0.6.0";
|
|
101
101
|
|
|
102
102
|
export { MantyxAuthError, MantyxError, MantyxNetworkError, MantyxParseError, MantyxRunError, MantyxToolError, SDK_VERSION, type SseEvent, type SseStreamOptions, readSseStream, toToolParametersWire, zodToJsonSchema };
|
package/dist/index.d.ts
CHANGED
|
@@ -97,6 +97,6 @@ declare function readSseStream(body: ReadableStream<Uint8Array> | null, opts?: S
|
|
|
97
97
|
/**
|
|
98
98
|
* Release version — synced from repo root VERSION (`npm run sync-version`).
|
|
99
99
|
*/
|
|
100
|
-
declare const SDK_VERSION = "0.
|
|
100
|
+
declare const SDK_VERSION = "0.6.0";
|
|
101
101
|
|
|
102
102
|
export { MantyxAuthError, MantyxError, MantyxNetworkError, MantyxParseError, MantyxRunError, MantyxToolError, SDK_VERSION, type SseEvent, type SseStreamOptions, readSseStream, toToolParametersWire, zodToJsonSchema };
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["/**\n * Release version — synced from repo root VERSION (`npm run sync-version`).\n */\nexport const SDK_VERSION = \"0.
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["/**\n * Release version — synced from repo root VERSION (`npm run sync-version`).\n */\nexport const SDK_VERSION = \"0.6.0\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,IAAM,cAAc;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mantyx/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "MANTYX as a hosted agent runtime: define ephemeral agents, mix server-side MANTYX tools with locally-executed tools, run them remotely.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|