@beeos-ai/bma-sdk 0.4.2 → 1.0.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.
Files changed (51) hide show
  1. package/README.md +122 -34
  2. package/dist/core.d.ts +105 -0
  3. package/dist/core.js +406 -0
  4. package/dist/core.js.map +1 -0
  5. package/dist/errors.d.ts +77 -0
  6. package/dist/errors.js +109 -0
  7. package/dist/errors.js.map +1 -0
  8. package/dist/facade-extensions.d.ts +17 -61
  9. package/dist/facade-extensions.js +25 -112
  10. package/dist/facade-extensions.js.map +1 -1
  11. package/dist/generated/facade-extensions-operations.d.ts +133 -0
  12. package/dist/generated/facade-extensions-operations.js +11 -0
  13. package/dist/generated/facade-extensions-operations.js.map +1 -0
  14. package/dist/generated/facade-extensions-resources.d.ts +34 -0
  15. package/dist/generated/facade-extensions-resources.js +47 -0
  16. package/dist/generated/facade-extensions-resources.js.map +1 -0
  17. package/dist/generated/facade-extensions-types.d.ts +14 -0
  18. package/dist/generated/facade-extensions-types.js +2 -0
  19. package/dist/generated/facade-extensions-types.js.map +1 -0
  20. package/dist/generated/rest-operations.d.ts +4079 -0
  21. package/dist/generated/rest-operations.js +234 -0
  22. package/dist/generated/rest-operations.js.map +1 -0
  23. package/dist/generated/rest-resources.d.ts +666 -0
  24. package/dist/generated/rest-resources.js +1124 -0
  25. package/dist/generated/rest-resources.js.map +1 -0
  26. package/dist/generated/rest-types.d.ts +572 -0
  27. package/dist/generated/rest-types.js +2 -0
  28. package/dist/generated/rest-types.js.map +1 -0
  29. package/dist/generated/rest.d.ts +233 -10
  30. package/dist/index.d.ts +41 -76
  31. package/dist/index.js +49 -239
  32. package/dist/index.js.map +1 -1
  33. package/dist/lib/artifacts.d.ts +14 -0
  34. package/dist/lib/artifacts.js +56 -0
  35. package/dist/lib/artifacts.js.map +1 -0
  36. package/dist/lib/tool-runner.d.ts +99 -0
  37. package/dist/lib/tool-runner.js +140 -0
  38. package/dist/lib/tool-runner.js.map +1 -0
  39. package/dist/pagination.d.ts +31 -0
  40. package/dist/pagination.js +66 -0
  41. package/dist/pagination.js.map +1 -0
  42. package/dist/resource.d.ts +8 -0
  43. package/dist/resource.js +9 -0
  44. package/dist/resource.js.map +1 -0
  45. package/dist/streaming.d.ts +27 -0
  46. package/dist/streaming.js +89 -0
  47. package/dist/streaming.js.map +1 -0
  48. package/dist/version.d.ts +1 -0
  49. package/dist/version.js +4 -0
  50. package/dist/version.js.map +1 -0
  51. package/package.json +4 -2
package/dist/index.js CHANGED
@@ -1,248 +1,58 @@
1
- // TypeScript client for the BMA REST API. Every path, operation and schema
2
- // type comes from src/generated/rest.ts, which is generated from
3
- // contracts/bma/rest.openapi.yaml; this file adds only what the contract does
4
- // not describe: bearer authentication, error decoding, the server-sent event
5
- // stream, and verified artifact downloads.
1
+ // TypeScript client for the BMA REST API.
2
+ //
3
+ // const bma = new BmaClient({ token, baseUrl, orgId, projectId });
4
+ // const { session } = await bma.agents.sessions.create(agentId);
5
+ //
6
+ // Resource classes, request descriptors and params types are generated by
7
+ // tools/sdkgen/sdkgen.py from contracts/bma/rest.openapi.yaml and
8
+ // contracts/bma/sdk.resources.yaml; schema types by openapi-typescript.
6
9
  import createClient from "openapi-fetch";
7
- /** Hosted BMA API root, including the /v1 prefix. */
8
- export const DEFAULT_BASE_URL = "https://api.bma.beeos.ai/v1";
9
- export const SDK_VERSION = "0.4.2";
10
- /** A non-2xx response from the BMA API. */
11
- export class BmaApiError extends Error {
12
- status;
13
- code;
14
- currentDigest;
15
- issues;
16
- constructor(status, body) {
17
- const wire = (typeof body === "object" && body !== null ? body : {});
18
- const code = typeof wire.code === "string" ? wire.code : "";
19
- const message = typeof wire.error === "string" && wire.error !== "" ? wire.error : `HTTP ${status}`;
20
- super(`bma: HTTP ${status} ${code || "unknown"}: ${message}`);
21
- this.name = "BmaApiError";
22
- this.status = status;
23
- this.code = code;
24
- this.currentDigest = wire.current_digest;
25
- this.issues = wire.issues;
26
- }
27
- /** Whether a retry may succeed without changing the request. */
28
- get retryable() {
29
- return (this.status === 408 ||
30
- this.status === 429 ||
31
- this.status >= 500 ||
32
- this.code === "service_unavailable" ||
33
- this.code === "rate_limited");
34
- }
35
- }
36
- /**
37
- * Returns `data` from an openapi-fetch result or throws BmaApiError.
38
- *
39
- * ```ts
40
- * const agent = unwrap(await bma.rest.GET("/orgs/{orgID}/projects/{projectID}/agents/{agentID}", { params }));
41
- * ```
42
- */
43
- export function unwrap(result) {
44
- if (result.response.ok) {
45
- return result.data;
46
- }
47
- throw new BmaApiError(result.response.status, result.error);
10
+ import { BmaApiError, BmaError } from "./errors.js";
11
+ import { bmaOrigin } from "./core.js";
12
+ import { RestClientBase } from "./generated/rest-resources.js";
13
+ import { SDK_VERSION } from "./version.js";
14
+ export { SDK_VERSION };
15
+ export * as Resources from "./generated/rest-resources.js";
16
+ export { APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, AuthenticationError, BadRequestError, BmaApiError, BmaError, ConflictError, ContentTooLargeError, EventStreamError, InternalServerError, NotFoundError, PermissionDeniedError, RateLimitError, RequestTimeoutError, ServiceUnavailableError, UnprocessableEntityError, } from "./errors.js";
17
+ export { DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT_MS } from "./core.js";
18
+ export { PagePromise } from "./pagination.js";
19
+ export { Stream } from "./streaming.js";
20
+ export { defineTool, ToolError } from "./lib/tool-runner.js";
21
+ /** Hosted BMA origin; the client adds the /api/v1 prefix. */
22
+ export const DEFAULT_BASE_URL = "https://api.bma.beeos.ai";
23
+ function env(name) {
24
+ const value = typeof process === "undefined" ? undefined : process.env?.[name]?.trim();
25
+ return value || undefined;
48
26
  }
49
27
  /** Authenticated BMA REST client. */
50
- export class BmaClient {
51
- /** Generated, fully typed openapi-fetch client for every contract operation. */
52
- rest;
53
- baseUrl;
54
- token;
55
- fetchImpl;
56
- constructor(options) {
57
- const token = options.token?.trim();
58
- if (!token) {
59
- throw new Error("bma: token is required");
60
- }
61
- const baseUrl = (options.baseUrl?.trim() || DEFAULT_BASE_URL).replace(/\/+$/, "");
62
- const scheme = new URL(baseUrl).protocol;
63
- if (scheme !== "http:" && scheme !== "https:") {
64
- throw new Error("bma: baseUrl must use http or https");
65
- }
66
- this.baseUrl = baseUrl;
67
- this.token = token;
68
- this.fetchImpl = options.fetch ?? globalThis.fetch;
69
- this.rest = createClient({ baseUrl, fetch: this.fetchImpl, headers: this.headers() });
70
- }
71
- headers(extra = {}) {
72
- return { Authorization: `Bearer ${this.token}`, ...extra };
73
- }
74
- async send(path, accept, headers, signal) {
75
- const response = await this.fetchImpl(this.baseUrl + path, {
76
- method: "GET",
77
- headers: this.headers({ Accept: accept, ...headers }),
78
- signal,
79
- });
80
- if (!response.ok) {
81
- const text = await response.text();
82
- let body;
83
- try {
84
- body = JSON.parse(text);
85
- }
86
- catch {
87
- body = undefined;
88
- }
89
- throw new BmaApiError(response.status, body);
90
- }
91
- return response;
92
- }
28
+ export class BmaClient extends RestClientBase {
93
29
  /**
94
- * Streams `GET .../agents/{agentID}/events/stream`. Heartbeat comments are
95
- * skipped; the iterator ends when the server closes the stream.
30
+ * Escape hatch: the openapi-fetch client typed by contract path, for
31
+ * operations without a resource method (Machine Daemon). Pair with unwrap().
96
32
  */
97
- async *streamEvents(options) {
98
- const query = {};
99
- if (options.sessionId !== undefined)
100
- query.session_id = options.sessionId;
101
- if (options.afterSequence !== undefined)
102
- query.after_sequence = options.afterSequence;
103
- if (options.streamDeltas !== undefined)
104
- query.stream_deltas = options.streamDeltas;
105
- const search = new URLSearchParams(Object.entries(query).map(([k, v]) => [k, String(v)])).toString();
106
- const path = `/orgs/${encodeURIComponent(options.orgID)}/projects/${encodeURIComponent(options.projectID)}` +
107
- `/agents/${encodeURIComponent(options.agentID)}/events/stream` +
108
- (search ? `?${search}` : "");
109
- const headers = {};
110
- if (options.lastEventId !== undefined)
111
- headers["Last-Event-ID"] = String(options.lastEventId);
112
- const response = await this.send(path, "text/event-stream", headers, options.signal);
113
- const media = (response.headers.get("Content-Type") ?? "").split(";")[0].trim();
114
- if (media !== "text/event-stream" || !response.body) {
115
- await response.body?.cancel();
116
- throw new Error(`bma: event stream content type = ${JSON.stringify(media)}`);
117
- }
118
- for await (const raw of parseSSE(response.body)) {
119
- const frame = { event: raw.event, data: JSON.parse(raw.data) };
120
- if (raw.id !== undefined) {
121
- const sequence = Number(raw.id);
122
- if (!Number.isSafeInteger(sequence)) {
123
- throw new Error(`bma: invalid event id ${JSON.stringify(raw.id)}`);
124
- }
125
- frame.id = raw.id;
126
- frame.sequence = sequence;
127
- }
128
- yield frame;
129
- }
130
- }
131
- /**
132
- * Downloads artifact content and verifies the size and sha256 digest
133
- * recorded on the artifact. The whole body is buffered, bounded by maxBytes.
134
- */
135
- async downloadArtifact(artifact, options) {
136
- const size = artifact.size_bytes;
137
- if (!(options.maxBytes > 0))
138
- throw new Error("bma: maxBytes is required");
139
- if (size === undefined || size < 0 || size > options.maxBytes) {
140
- throw new Error("bma: artifact size is missing or exceeds maxBytes");
141
- }
142
- const digest = artifact.digest ?? "";
143
- if (!/^sha256:[0-9a-f]{64}$/.test(digest)) {
144
- throw new Error("bma: artifact digest must be sha256:<hex>");
145
- }
146
- const path = `/orgs/${encodeURIComponent(artifact.org_id)}/projects/${encodeURIComponent(artifact.project_id)}` +
147
- `/agents/${encodeURIComponent(artifact.agent_id)}/artifacts/${encodeURIComponent(artifact.id)}/content`;
148
- const response = await this.send(path, "application/octet-stream", {}, options.signal);
149
- const bytes = await readAtMost(response, size + 1);
150
- if (bytes.byteLength !== size) {
151
- throw new Error(`bma: artifact size = ${bytes.byteLength}, want ${size}`);
152
- }
153
- const hash = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
154
- const actual = Array.from(hash, (b) => b.toString(16).padStart(2, "0")).join("");
155
- if (`sha256:${actual}` !== digest) {
156
- throw new Error("bma: artifact digest mismatch");
157
- }
158
- return bytes;
159
- }
160
- }
161
- async function readAtMost(response, limit) {
162
- const reader = response.body?.getReader();
163
- if (!reader)
164
- return new Uint8Array();
165
- const chunks = [];
166
- let total = 0;
167
- for (;;) {
168
- const { done, value } = await reader.read();
169
- if (done)
170
- break;
171
- chunks.push(value);
172
- total += value.byteLength;
173
- if (total >= limit) {
174
- await reader.cancel();
175
- break;
176
- }
177
- }
178
- const out = new Uint8Array(total);
179
- let offset = 0;
180
- for (const chunk of chunks) {
181
- out.set(chunk, offset);
182
- offset += chunk.byteLength;
33
+ rest;
34
+ constructor(options = {}) {
35
+ const token = options.token?.trim() || env("BMA_TOKEN");
36
+ if (!token)
37
+ throw new BmaError("bma: token is required; pass token or set BMA_TOKEN");
38
+ const baseUrl = `${bmaOrigin(options.baseUrl?.trim() || env("BMA_BASE_URL") || DEFAULT_BASE_URL)}/api/v1`;
39
+ const headers = { Authorization: `Bearer ${token}`, "User-Agent": `bma-sdk-typescript/${SDK_VERSION}` };
40
+ super({
41
+ baseUrl,
42
+ fetch: options.fetch,
43
+ timeout: options.timeout,
44
+ maxRetries: options.maxRetries,
45
+ headers,
46
+ scope: { org_id: options.orgId ?? env("BMA_ORG_ID"), project_id: options.projectId ?? env("BMA_PROJECT_ID") },
47
+ scopeOption: { org_id: "orgId", project_id: "projectId" },
48
+ });
49
+ this.rest = createClient({ baseUrl: this.baseUrl, fetch: options.fetch ?? globalThis.fetch, headers });
183
50
  }
184
- return out;
185
51
  }
186
- /** Minimal text/event-stream parser (WHATWG SSE field rules). */
187
- export async function* parseSSE(body) {
188
- const decoder = new TextDecoder();
189
- let buffer = "";
190
- let event = "";
191
- let id;
192
- let data = [];
193
- const dispatch = () => {
194
- const frame = data.length > 0 ? { event: event || "message", id, data: data.join("\n") } : undefined;
195
- event = "";
196
- id = undefined;
197
- data = [];
198
- return frame;
199
- };
200
- const reader = body.getReader();
201
- try {
202
- for (;;) {
203
- const { done, value } = await reader.read();
204
- buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });
205
- let newline;
206
- while ((newline = buffer.search(/\r\n|\r|\n/)) >= 0) {
207
- const line = buffer.slice(0, newline);
208
- buffer = buffer.slice(newline + (buffer.startsWith("\r\n", newline) ? 2 : 1));
209
- if (line === "") {
210
- const frame = dispatch();
211
- if (frame)
212
- yield frame;
213
- continue;
214
- }
215
- if (line.startsWith(":"))
216
- continue;
217
- const colon = line.indexOf(":");
218
- const field = colon < 0 ? line : line.slice(0, colon);
219
- let value = colon < 0 ? "" : line.slice(colon + 1);
220
- if (value.startsWith(" "))
221
- value = value.slice(1);
222
- if (field === "event")
223
- event = value;
224
- else if (field === "id")
225
- id = value;
226
- else if (field === "data")
227
- data.push(value);
228
- }
229
- if (done) {
230
- if (buffer !== "") {
231
- // A final line without a terminator still belongs to the frame.
232
- const colon = buffer.indexOf(":");
233
- if (colon > 0 && buffer.slice(0, colon) === "data") {
234
- data.push(buffer.slice(colon + 1).replace(/^ /, ""));
235
- }
236
- }
237
- const frame = dispatch();
238
- if (frame)
239
- yield frame;
240
- return;
241
- }
242
- }
243
- }
244
- finally {
245
- reader.releaseLock();
246
- }
52
+ /** Escape hatch companion of `bma.rest`: returns `data` or throws the typed error. */
53
+ export function unwrap(result) {
54
+ if (result.response.ok)
55
+ return result.data;
56
+ throw BmaApiError.generate(result.response.status, result.error, result.response.headers);
247
57
  }
248
58
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { RequestOptions } from "../core.js";
2
+ import type { Artifact } from "../generated/rest-types.js";
3
+ import { APIResource } from "../resource.js";
4
+ export interface DownloadArtifactOptions extends RequestOptions {
5
+ /** Explicit product limit; artifacts larger than this are refused. */
6
+ maxBytes: number;
7
+ }
8
+ export declare class ArtifactsBase extends APIResource {
9
+ /**
10
+ * Downloads artifact content and verifies its size and sha256 digest. The
11
+ * whole body is buffered, bounded by maxBytes.
12
+ */
13
+ downloadVerified(artifact: Artifact, options: DownloadArtifactOptions): Promise<Uint8Array<ArrayBuffer>>;
14
+ }
@@ -0,0 +1,56 @@
1
+ import { BmaError } from "../errors.js";
2
+ import { OP } from "../generated/rest-operations.js";
3
+ import { APIResource } from "../resource.js";
4
+ export class ArtifactsBase extends APIResource {
5
+ /**
6
+ * Downloads artifact content and verifies its size and sha256 digest. The
7
+ * whole body is buffered, bounded by maxBytes.
8
+ */
9
+ async downloadVerified(artifact, options) {
10
+ const { maxBytes, ...request } = options;
11
+ const size = artifact.size_bytes;
12
+ if (!(maxBytes > 0))
13
+ throw new BmaError("bma: maxBytes is required");
14
+ if (size === undefined || size < 0 || size > maxBytes) {
15
+ throw new BmaError("bma: artifact size is missing or exceeds maxBytes");
16
+ }
17
+ const digest = artifact.digest ?? "";
18
+ if (!/^sha256:[0-9a-f]{64}$/.test(digest))
19
+ throw new BmaError("bma: artifact digest must be sha256:<hex>");
20
+ const response = await this._client._request(OP.getArtifactContent, { agentID: artifact.agent_id, artifactID: artifact.id }, { org_id: artifact.org_id, project_id: artifact.project_id }, request);
21
+ const bytes = await readAtMost(response, size + 1);
22
+ if (bytes.byteLength !== size)
23
+ throw new BmaError(`bma: artifact size = ${bytes.byteLength}, want ${size}`);
24
+ const hash = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
25
+ const actual = Array.from(hash, (b) => b.toString(16).padStart(2, "0")).join("");
26
+ if (`sha256:${actual}` !== digest)
27
+ throw new BmaError("bma: artifact digest mismatch");
28
+ return bytes;
29
+ }
30
+ }
31
+ async function readAtMost(response, limit) {
32
+ const reader = response.body?.getReader();
33
+ if (!reader)
34
+ return new Uint8Array();
35
+ const chunks = [];
36
+ let total = 0;
37
+ for (;;) {
38
+ const { done, value } = await reader.read();
39
+ if (done)
40
+ break;
41
+ chunks.push(value);
42
+ total += value.byteLength;
43
+ if (total >= limit) {
44
+ await reader.cancel();
45
+ break;
46
+ }
47
+ }
48
+ const out = new Uint8Array(total);
49
+ let offset = 0;
50
+ for (const chunk of chunks) {
51
+ out.set(chunk, offset);
52
+ offset += chunk.byteLength;
53
+ }
54
+ return out;
55
+ }
56
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/lib/artifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import type { RequestOptions } from "../core.js";
2
+ import type { AgentConfigDefinitionTool, SubmitToolResultContentBlock, ToolCall } from "../generated/rest-types.js";
3
+ import { APIResource } from "../resource.js";
4
+ /** The Standard Schema v1 interface (https://standardschema.dev), as published. */
5
+ export interface StandardSchemaV1<Input = unknown, Output = Input> {
6
+ readonly "~standard": {
7
+ readonly version: 1;
8
+ readonly vendor: string;
9
+ readonly validate: (value: unknown) => StandardResult<Output> | Promise<StandardResult<Output>>;
10
+ readonly types?: {
11
+ readonly input: Input;
12
+ readonly output: Output;
13
+ } | undefined;
14
+ /** Standard JSON Schema (zod >= 4.2, valibot via toStandardJsonSchema). */
15
+ readonly jsonSchema?: {
16
+ readonly input: (options: {
17
+ target: string;
18
+ }) => Record<string, unknown>;
19
+ };
20
+ };
21
+ }
22
+ type StandardResult<Output> = {
23
+ readonly value: Output;
24
+ readonly issues?: undefined;
25
+ } | {
26
+ readonly issues: ReadonlyArray<{
27
+ readonly message: string;
28
+ readonly path?: ReadonlyArray<PropertyKey | {
29
+ key: PropertyKey;
30
+ }>;
31
+ }>;
32
+ };
33
+ type InferOutput<S extends StandardSchemaV1> = NonNullable<S["~standard"]["types"]>["output"];
34
+ /** What a tool returns: text, or result content blocks. */
35
+ export type ToolOutput = string | SubmitToolResultContentBlock[];
36
+ /** Throw from `run` to report a failed call with this content to the model. */
37
+ export declare class ToolError extends Error {
38
+ readonly content: ToolOutput;
39
+ constructor(content: ToolOutput);
40
+ }
41
+ export interface ToolRunContext {
42
+ toolCall: ToolCall;
43
+ signal: AbortSignal;
44
+ }
45
+ export interface RunnableTool<Input = unknown> {
46
+ readonly name: string;
47
+ /** Agent config entry for `tools.<name>`. */
48
+ readonly definition: AgentConfigDefinitionTool & {
49
+ type: "custom";
50
+ description: string;
51
+ };
52
+ parse(input: unknown): Promise<Input>;
53
+ run(input: Input, context: ToolRunContext): ToolOutput | Promise<ToolOutput>;
54
+ }
55
+ /**
56
+ * Defines a custom tool from a Standard Schema (zod, valibot, arktype). The
57
+ * input is validated before `run` sees it; the JSON Schema for the agent
58
+ * config comes from the schema's Standard JSON Schema or `jsonSchema`.
59
+ */
60
+ export declare function defineTool<S extends StandardSchemaV1>(options: {
61
+ name: string;
62
+ description: string;
63
+ inputSchema: S;
64
+ /** JSON Schema of the input; derived from `inputSchema` when omitted. */
65
+ jsonSchema?: Record<string, unknown>;
66
+ run: (input: InferOutput<S>, context: ToolRunContext) => ToolOutput | Promise<ToolOutput>;
67
+ }): RunnableTool<InferOutput<S>>;
68
+ export interface ToolRunnerParams {
69
+ /** Only calls made in this session (calls of subagents are always handled). */
70
+ session_id?: string;
71
+ tools: RunnableTool<any>[];
72
+ org_id?: string;
73
+ project_id?: string;
74
+ /**
75
+ * Event stream reconnects in a row that receive no data before the runner
76
+ * fails; unlimited by default (with backoff up to 8 s), so a runner rides
77
+ * out deployments. Independent of `maxRetries`, which bounds each request.
78
+ */
79
+ max_reconnects?: number;
80
+ }
81
+ /** A running tool consumer. */
82
+ export interface ToolRunner {
83
+ /** Resolves when the runner stops; rejects with the error that stopped it. */
84
+ done(): Promise<void>;
85
+ /** Stops listening and waits for running tools to finish. */
86
+ stop(): Promise<void>;
87
+ }
88
+ export declare class ToolCallsBase extends APIResource {
89
+ /**
90
+ * Runs custom tools for an agent: every `ready` custom call (of the agent
91
+ * and its subagents) whose name matches a tool is parsed, run, and its
92
+ * result submitted. Ready calls are listed on every (re)connection of the
93
+ * event stream, so calls that became ready while disconnected are not lost.
94
+ * A 409 on submit (another consumer answered the call first) counts as
95
+ * handled. `done()` rejects only with the error that stopped the runner.
96
+ */
97
+ runner(agentId: string, params: ToolRunnerParams, options?: RequestOptions): ToolRunner;
98
+ }
99
+ export {};