@agents24/client 0.2.2 → 0.2.4

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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@agents24/client`
2
2
 
3
- Last Updated: 2026-08-12
3
+ Last Updated: 2026-08-24
4
4
 
5
5
  Framework-neutral end-user runtime client for one deployment-scoped Agents24 Agent. It supports public client sessions, authenticated streaming, durable reconnect, threads, attachments, HITL, and MCP without accepting organization API keys.
6
6
 
@@ -62,6 +62,12 @@ For a single-choice question, send exactly one listed option or `custom_text` fo
62
62
 
63
63
  `@agents24/client/bff` exposes `createBffAgentClient({ basePath })`, an `AgentClient` implementation for a customer-owned same-origin BFF. It covers the complete chat lifecycle, uses same-origin credentials, reconnects with the last durable cursor, and reuses caller idempotency keys for mutations. It accepts only an absolute path such as `/api/agents24`. Pair it with `createAgents24BffHandler` from `@agents24/node/bff`; use `npm create agents24-app@latest` for the complete React/Vite setup.
64
64
 
65
+ The same BFF client now also covers conversation-scoped multi-Agent bridges.
66
+ Use `requestedAgentId` on new turns and `threads.setRuntimeSelection(...)` to
67
+ persist preferred Agent/model restoration for a conversation. The server
68
+ remains authoritative for allowed Agents, stored thread ownership, and run
69
+ routing.
70
+
65
71
  `compatibility.json` contains the exact generated contract hash, protocol versions, peers, and target operation counts. Do not infer compatibility from semver alone.
66
72
 
67
73
  ## Runtime status
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "contractHash": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
3
- "contractVersion": "0.2.0",
3
+ "contractVersion": "0.3.0",
4
4
  "corpus": "conformance/v1/corpus.json",
5
5
  "generatedBy": "@agents24/sdk-contract",
6
6
  "packages": {
@@ -47,8 +47,8 @@
47
47
  },
48
48
  "schemaVersion": "agents24.compatibility.v1",
49
49
  "targetOperationCounts": {
50
- "client": 22,
51
- "node": 79,
52
- "python": 70
50
+ "client": 60,
51
+ "node": 97,
52
+ "python": 88
53
53
  }
54
54
  }
package/dist/bff.js CHANGED
@@ -99,7 +99,7 @@ function createBffAgentClient(options = {}) {
99
99
  };
100
100
  return {
101
101
  async bootstrap(input) {
102
- return json("GET", "/bootstrap", input?.signal ? { signal: input.signal } : {});
102
+ return json("GET", appendQuery("/bootstrap", { agent_id: input?.agentId }), input?.signal ? { signal: input.signal } : {});
103
103
  },
104
104
  resourcePolicies: {
105
105
  getEffective(input) {
@@ -116,6 +116,7 @@ function createBffAgentClient(options = {}) {
116
116
  attachmentIds: [...input.attachmentIds ?? []],
117
117
  ...input.threadId ? { threadId: input.threadId } : {},
118
118
  ...input.requestedModelId ? { requestedModelId: input.requestedModelId } : {},
119
+ ...input.requestedAgentId ? { requestedAgentId: input.requestedAgentId } : {},
119
120
  toolInputs: input.toolInputs ?? {},
120
121
  metadata: input.metadata ?? {},
121
122
  client: input.client ?? { sdk_name: "@agents24/client/bff", sdk_version: "0.2.2" }
@@ -202,6 +203,15 @@ function createBffAgentClient(options = {}) {
202
203
  idempotencyKey: input.idempotencyKey,
203
204
  ...input.signal ? { signal: input.signal } : {}
204
205
  });
206
+ },
207
+ setRuntimeSelection(input) {
208
+ return json("PATCH", `/threads/${encodePath(input.threadId)}/runtime-selection`, {
209
+ body: {
210
+ preferredAgentId: input.preferredAgentId,
211
+ ...input.preferredModelId ? { preferredModelId: input.preferredModelId } : {}
212
+ },
213
+ ...input.signal ? { signal: input.signal } : {}
214
+ });
205
215
  }
206
216
  },
207
217
  attachments: {
@@ -209,6 +219,7 @@ function createBffAgentClient(options = {}) {
209
219
  const multipart = options.multipart ?? createByteMultipartEncoder(encoder);
210
220
  const encoded = await multipart.encode([
211
221
  ...input.threadId ? [{ field: "thread_id", value: input.threadId }] : [],
222
+ ...input.requestedAgentId ? [{ field: "requested_agent_id", value: input.requestedAgentId }] : [],
212
223
  ...input.uploads.map((upload) => ({ field: "files", value: upload }))
213
224
  ]);
214
225
  const body = await json("POST", "/attachments/upload", {
package/dist/bff.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bff.ts"],"names":[],"mappings":"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","file":"bff.js","sourcesContent":["import { defaultIds, resolveDecoderFactory, resolveEncoder, resolveFetch } from \"./capabilities.js\";\nimport { Agents24ClientError } from \"./errors.js\";\nimport { responseError, responseJson } from \"./http.js\";\nimport { createByteMultipartEncoder } from \"./multipart.js\";\nimport { consumeRuntimeStream, consumeThreadSummaryStream, type RuntimeStreamState } from \"./stream.js\";\nimport { appendQuery, encodePath } from \"./url.js\";\nimport type {\n AgentClient,\n AbortSignalLike,\n AttachmentResult,\n EffectiveResourcePolicy,\n FetchLike,\n MultipartEncoder,\n RuntimeEventHandler,\n ResponseFeedbackResult,\n StreamResult,\n TextDecoderLike,\n TextEncoderLike,\n ThreadDetail,\n ThreadListResult,\n ThreadSummaryEventHandler,\n} from \"./types.js\";\nimport type { AttachmentContentAccess } from \"./runtime-types.js\";\n\nexport interface Agents24BffClientOptions {\n basePath?: string;\n fetch?: FetchLike;\n decoder?: () => TextDecoderLike;\n encoder?: TextEncoderLike;\n multipart?: MultipartEncoder;\n maxReconnectAttempts?: number;\n}\n\nfunction normalizeBasePath(value: string | undefined): string {\n const path = String(value || \"/api/agents24\").trim();\n if (!path.startsWith(\"/\") || /[\\r\\n\\0?#]/.test(path)) {\n throw new Agents24ClientError(\"basePath must be a same-origin absolute path.\", {\n kind: \"configuration\",\n code: \"INVALID_BFF_BASE_PATH\",\n });\n }\n return path.replace(/\\/+$/, \"\");\n}\n\nfunction objectResult<T extends object>(value: unknown, operation: string): T {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Agents24ClientError(`${operation} returned an invalid response.`, {\n kind: \"protocol\",\n code: \"INVALID_JSON_RESPONSE\",\n });\n }\n return value as T;\n}\n\nfunction shouldReconnect(error: unknown): boolean {\n return error instanceof Agents24ClientError && error.kind === \"network\" && error.retryable;\n}\n\nexport function createBffAgentClient(options: Agents24BffClientOptions = {}): AgentClient {\n const basePath = normalizeBasePath(options.basePath);\n const fetch = resolveFetch(options.fetch);\n const decoder = resolveDecoderFactory(options.decoder);\n const encoder = resolveEncoder(options.encoder);\n const ids = defaultIds();\n const maxReconnectAttempts = Math.max(0, Math.min(options.maxReconnectAttempts ?? 3, 10));\n\n const request = async (method: string, path: string, init: {\n accept?: string;\n body?: unknown;\n contentType?: string;\n idempotencyKey?: string;\n signal?: AbortSignalLike;\n } = {}) => {\n let response;\n try {\n response = await fetch(`${basePath}${path}`, {\n method,\n headers: {\n Accept: init.accept || \"application/json\",\n ...(init.contentType ? { \"Content-Type\": init.contentType } : {}),\n ...(init.idempotencyKey ? { \"Idempotency-Key\": init.idempotencyKey } : {}),\n },\n ...(init.body === undefined ? {} : { body: init.body }),\n ...(init.signal ? { signal: init.signal } : {}),\n credentials: \"same-origin\",\n redirect: \"error\",\n cache: \"no-store\",\n });\n } catch (cause) {\n throw new Agents24ClientError(\"The Agents24 BFF could not be reached.\", {\n kind: init.signal?.aborted ? \"aborted\" : \"network\",\n code: init.signal?.aborted ? \"ABORTED\" : \"NETWORK_ERROR\",\n retryable: !init.signal?.aborted,\n cause,\n });\n }\n if (!response.ok) throw await responseError(response);\n return response;\n };\n\n const json = async <T extends object>(method: string, path: string, init: Parameters<typeof request>[2] = {}): Promise<T> => {\n const body = init.body === undefined || init.contentType\n ? init.body\n : JSON.stringify(init.body);\n const response = await request(method, path, {\n ...init,\n ...(body === undefined ? {} : { body }),\n ...(init.body === undefined || init.contentType ? {} : { contentType: \"application/json\" }),\n });\n return objectResult<T>(await responseJson(response), path);\n };\n\n const attachOnce = async (\n runId: string,\n cursor: number | undefined,\n signal: Parameters<AgentClient[\"runs\"][\"attach\"]>[0][\"signal\"],\n onEvent: RuntimeEventHandler,\n ): Promise<RuntimeStreamState> => {\n const response = await request(\"POST\", `/runs/${encodePath(runId)}/attach`, {\n accept: \"text/event-stream\",\n body: JSON.stringify(cursor === undefined ? {} : { cursor }),\n contentType: \"application/json\",\n ...(signal ? { signal } : {}),\n });\n return consumeRuntimeStream({\n response,\n decoder: decoder(),\n onEvent,\n ...(signal ? { signal } : {}),\n ...(cursor === undefined ? {} : { afterCursor: cursor }),\n });\n };\n\n const withReconnect = async (\n initial: () => Promise<RuntimeStreamState>,\n signal: Parameters<AgentClient[\"runs\"][\"attach\"]>[0][\"signal\"],\n onEvent: RuntimeEventHandler,\n ): Promise<StreamResult> => {\n let state: RuntimeStreamState | undefined;\n let attempts = 0;\n while (true) {\n try {\n state = state?.runId\n ? await attachOnce(state.runId, state.cursor ?? undefined, signal, onEvent)\n : await initial();\n } catch (error) {\n if (signal?.aborted || !shouldReconnect(error) || attempts >= maxReconnectAttempts) throw error;\n attempts += 1;\n continue;\n }\n if (!state.detached || signal?.aborted || attempts >= maxReconnectAttempts) return state;\n attempts += 1;\n }\n };\n\n return {\n async bootstrap(input) {\n return json(\"GET\", \"/bootstrap\", input?.signal ? { signal: input.signal } : {});\n },\n resourcePolicies: {\n getEffective(input) {\n return json<EffectiveResourcePolicy>(\"GET\", \"/resource-policy\", input?.signal ? { signal: input.signal } : {});\n },\n },\n chat: {\n async stream(input, onEvent) {\n const initial = async () => consumeRuntimeStream({\n response: await request(\"POST\", \"/chat/stream\", {\n accept: \"text/event-stream\",\n body: JSON.stringify({\n input: input.input,\n attachmentIds: [...(input.attachmentIds ?? [])],\n ...(input.threadId ? { threadId: input.threadId } : {}),\n ...(input.requestedModelId ? { requestedModelId: input.requestedModelId } : {}),\n toolInputs: input.toolInputs ?? {},\n metadata: input.metadata ?? {},\n client: input.client ?? { sdk_name: \"@agents24/client/bff\", sdk_version: \"0.2.2\" },\n }),\n contentType: \"application/json\",\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n }),\n decoder: decoder(),\n onEvent,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n return withReconnect(initial, input.signal, onEvent);\n },\n },\n runs: {\n attach(input, onEvent) {\n return withReconnect(\n () => attachOnce(input.runId, input.cursor, input.signal, onEvent),\n input.signal,\n onEvent,\n );\n },\n cancel(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/cancel`, {\n body: {},\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n setFeedback(input) {\n return json<ResponseFeedbackResult>(\n \"PUT\",\n `/runs/${encodePath(input.runId)}/feedback`,\n {\n body: {\n rating: input.rating,\n ...(input.reason ? { reason: input.reason } : {}),\n ...(input.comment ? { comment: input.comment } : {}),\n },\n ...(input.signal ? { signal: input.signal } : {}),\n },\n );\n },\n },\n threads: {\n list(input) {\n return json<ThreadListResult>(\"GET\", appendQuery(\"/threads\", {\n skip: input?.skip,\n limit: input?.limit,\n }), input?.signal ? { signal: input.signal } : {});\n },\n get(input) {\n return json<ThreadDetail>(\"GET\", appendQuery(`/threads/${encodePath(input.threadId)}`, {\n limit: input.limit,\n before_turn_index: input.beforeTurnIndex,\n }), input.signal ? { signal: input.signal } : {});\n },\n async events(input, onEvent: ThreadSummaryEventHandler) {\n let cursor = input.cursor;\n let attempts = 0;\n while (!input.signal?.aborted) {\n try {\n const response = await request(\"GET\", appendQuery(\"/threads/events\", { cursor }), {\n accept: \"text/event-stream\",\n ...(input.signal ? { signal: input.signal } : {}),\n });\n cursor = (await consumeThreadSummaryStream({\n response,\n decoder: decoder(),\n onEvent,\n ...(input.signal ? { signal: input.signal } : {}),\n ...(cursor === undefined ? {} : { afterCursor: cursor }),\n })) ?? undefined;\n return;\n } catch (error) {\n if (input.signal?.aborted || !shouldReconnect(error) || attempts >= maxReconnectAttempts) throw error;\n attempts += 1;\n }\n }\n },\n delete(input) {\n return json(\"DELETE\", `/threads/${encodePath(input.threadId)}`, {\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n attachments: {\n async uploadBatch(input) {\n const multipart = options.multipart ?? createByteMultipartEncoder(encoder);\n const encoded = await multipart.encode([\n ...(input.threadId ? [{ field: \"thread_id\", value: input.threadId }] : []),\n ...input.uploads.map((upload) => ({ field: \"files\", value: upload })),\n ]);\n const body = await json<Record<string, unknown>>(\"POST\", \"/attachments/upload\", {\n body: encoded.body,\n contentType: encoded.contentType,\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n if (!Array.isArray(body.items)) throw new Error(\"Attachment upload returned an invalid batch\");\n return body.items.map((item) => objectResult<AttachmentResult>(item, \"Attachment upload\"));\n },\n createContentAccess(input) {\n return json<AttachmentContentAccess>(\n \"POST\",\n `/attachments/${encodePath(input.attachmentId)}/content-access`,\n {\n body: { disposition: input.disposition },\n ...(input.signal ? { signal: input.signal } : {}),\n },\n );\n },\n },\n hitl: {\n resume(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/hitl/${encodePath(input.interruptId)}/resume`, {\n body: {\n interruptId: input.interruptId,\n action: input.action,\n ...(input.comment ? { comment: input.comment } : {}),\n ...(input.answers ? { answers: input.answers } : {}),\n },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n mcp: {\n startAuthorization(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/mcp/servers/${encodePath(input.serverId)}/auth/start`, {\n body: {\n interruptId: input.interruptId,\n redirectUri: input.redirectUri,\n popupNonce: input.popupNonce,\n codeChallenge: input.codeChallenge,\n },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n redeemCallback(input) {\n return json(\"POST\", \"/mcp/callback/redeem\", {\n body: { code: input.code, codeVerifier: input.codeVerifier },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n sessions: {\n async revoke(input) {\n await request(\"POST\", \"/session/revoke\", {\n idempotencyKey: input?.idempotencyKey ?? ids.createId(),\n ...(input?.signal ? { signal: input.signal } : {}),\n });\n },\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/bff.ts"],"names":[],"mappings":"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","file":"bff.js","sourcesContent":["import { defaultIds, resolveDecoderFactory, resolveEncoder, resolveFetch } from \"./capabilities.js\";\nimport { Agents24ClientError } from \"./errors.js\";\nimport { responseError, responseJson } from \"./http.js\";\nimport { createByteMultipartEncoder } from \"./multipart.js\";\nimport { consumeRuntimeStream, consumeThreadSummaryStream, type RuntimeStreamState } from \"./stream.js\";\nimport { appendQuery, encodePath } from \"./url.js\";\nimport type {\n AgentClient,\n AbortSignalLike,\n AttachmentResult,\n EffectiveResourcePolicy,\n FetchLike,\n MultipartEncoder,\n RuntimeEventHandler,\n ResponseFeedbackResult,\n StreamResult,\n TextDecoderLike,\n TextEncoderLike,\n ThreadDetail,\n ThreadListResult,\n ThreadSummaryEventHandler,\n} from \"./types.js\";\nimport type { AttachmentContentAccess } from \"./runtime-types.js\";\n\nexport interface Agents24BffClientOptions {\n basePath?: string;\n fetch?: FetchLike;\n decoder?: () => TextDecoderLike;\n encoder?: TextEncoderLike;\n multipart?: MultipartEncoder;\n maxReconnectAttempts?: number;\n}\n\nfunction normalizeBasePath(value: string | undefined): string {\n const path = String(value || \"/api/agents24\").trim();\n if (!path.startsWith(\"/\") || /[\\r\\n\\0?#]/.test(path)) {\n throw new Agents24ClientError(\"basePath must be a same-origin absolute path.\", {\n kind: \"configuration\",\n code: \"INVALID_BFF_BASE_PATH\",\n });\n }\n return path.replace(/\\/+$/, \"\");\n}\n\nfunction objectResult<T extends object>(value: unknown, operation: string): T {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Agents24ClientError(`${operation} returned an invalid response.`, {\n kind: \"protocol\",\n code: \"INVALID_JSON_RESPONSE\",\n });\n }\n return value as T;\n}\n\nfunction shouldReconnect(error: unknown): boolean {\n return error instanceof Agents24ClientError && error.kind === \"network\" && error.retryable;\n}\n\nexport function createBffAgentClient(options: Agents24BffClientOptions = {}): AgentClient {\n const basePath = normalizeBasePath(options.basePath);\n const fetch = resolveFetch(options.fetch);\n const decoder = resolveDecoderFactory(options.decoder);\n const encoder = resolveEncoder(options.encoder);\n const ids = defaultIds();\n const maxReconnectAttempts = Math.max(0, Math.min(options.maxReconnectAttempts ?? 3, 10));\n\n const request = async (method: string, path: string, init: {\n accept?: string;\n body?: unknown;\n contentType?: string;\n idempotencyKey?: string;\n signal?: AbortSignalLike;\n } = {}) => {\n let response;\n try {\n response = await fetch(`${basePath}${path}`, {\n method,\n headers: {\n Accept: init.accept || \"application/json\",\n ...(init.contentType ? { \"Content-Type\": init.contentType } : {}),\n ...(init.idempotencyKey ? { \"Idempotency-Key\": init.idempotencyKey } : {}),\n },\n ...(init.body === undefined ? {} : { body: init.body }),\n ...(init.signal ? { signal: init.signal } : {}),\n credentials: \"same-origin\",\n redirect: \"error\",\n cache: \"no-store\",\n });\n } catch (cause) {\n throw new Agents24ClientError(\"The Agents24 BFF could not be reached.\", {\n kind: init.signal?.aborted ? \"aborted\" : \"network\",\n code: init.signal?.aborted ? \"ABORTED\" : \"NETWORK_ERROR\",\n retryable: !init.signal?.aborted,\n cause,\n });\n }\n if (!response.ok) throw await responseError(response);\n return response;\n };\n\n const json = async <T extends object>(method: string, path: string, init: Parameters<typeof request>[2] = {}): Promise<T> => {\n const body = init.body === undefined || init.contentType\n ? init.body\n : JSON.stringify(init.body);\n const response = await request(method, path, {\n ...init,\n ...(body === undefined ? {} : { body }),\n ...(init.body === undefined || init.contentType ? {} : { contentType: \"application/json\" }),\n });\n return objectResult<T>(await responseJson(response), path);\n };\n\n const attachOnce = async (\n runId: string,\n cursor: number | undefined,\n signal: Parameters<AgentClient[\"runs\"][\"attach\"]>[0][\"signal\"],\n onEvent: RuntimeEventHandler,\n ): Promise<RuntimeStreamState> => {\n const response = await request(\"POST\", `/runs/${encodePath(runId)}/attach`, {\n accept: \"text/event-stream\",\n body: JSON.stringify(cursor === undefined ? {} : { cursor }),\n contentType: \"application/json\",\n ...(signal ? { signal } : {}),\n });\n return consumeRuntimeStream({\n response,\n decoder: decoder(),\n onEvent,\n ...(signal ? { signal } : {}),\n ...(cursor === undefined ? {} : { afterCursor: cursor }),\n });\n };\n\n const withReconnect = async (\n initial: () => Promise<RuntimeStreamState>,\n signal: Parameters<AgentClient[\"runs\"][\"attach\"]>[0][\"signal\"],\n onEvent: RuntimeEventHandler,\n ): Promise<StreamResult> => {\n let state: RuntimeStreamState | undefined;\n let attempts = 0;\n while (true) {\n try {\n state = state?.runId\n ? await attachOnce(state.runId, state.cursor ?? undefined, signal, onEvent)\n : await initial();\n } catch (error) {\n if (signal?.aborted || !shouldReconnect(error) || attempts >= maxReconnectAttempts) throw error;\n attempts += 1;\n continue;\n }\n if (!state.detached || signal?.aborted || attempts >= maxReconnectAttempts) return state;\n attempts += 1;\n }\n };\n\n return {\n async bootstrap(input) {\n return json(\"GET\", appendQuery(\"/bootstrap\", { agent_id: input?.agentId }), input?.signal ? { signal: input.signal } : {});\n },\n resourcePolicies: {\n getEffective(input) {\n return json<EffectiveResourcePolicy>(\"GET\", \"/resource-policy\", input?.signal ? { signal: input.signal } : {});\n },\n },\n chat: {\n async stream(input, onEvent) {\n const initial = async () => consumeRuntimeStream({\n response: await request(\"POST\", \"/chat/stream\", {\n accept: \"text/event-stream\",\n body: JSON.stringify({\n input: input.input,\n attachmentIds: [...(input.attachmentIds ?? [])],\n ...(input.threadId ? { threadId: input.threadId } : {}),\n ...(input.requestedModelId ? { requestedModelId: input.requestedModelId } : {}),\n ...(input.requestedAgentId ? { requestedAgentId: input.requestedAgentId } : {}),\n toolInputs: input.toolInputs ?? {},\n metadata: input.metadata ?? {},\n client: input.client ?? { sdk_name: \"@agents24/client/bff\", sdk_version: \"0.2.2\" },\n }),\n contentType: \"application/json\",\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n }),\n decoder: decoder(),\n onEvent,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n return withReconnect(initial, input.signal, onEvent);\n },\n },\n runs: {\n attach(input, onEvent) {\n return withReconnect(\n () => attachOnce(input.runId, input.cursor, input.signal, onEvent),\n input.signal,\n onEvent,\n );\n },\n cancel(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/cancel`, {\n body: {},\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n setFeedback(input) {\n return json<ResponseFeedbackResult>(\n \"PUT\",\n `/runs/${encodePath(input.runId)}/feedback`,\n {\n body: {\n rating: input.rating,\n ...(input.reason ? { reason: input.reason } : {}),\n ...(input.comment ? { comment: input.comment } : {}),\n },\n ...(input.signal ? { signal: input.signal } : {}),\n },\n );\n },\n },\n threads: {\n list(input) {\n return json<ThreadListResult>(\"GET\", appendQuery(\"/threads\", {\n skip: input?.skip,\n limit: input?.limit,\n }), input?.signal ? { signal: input.signal } : {});\n },\n get(input) {\n return json<ThreadDetail>(\"GET\", appendQuery(`/threads/${encodePath(input.threadId)}`, {\n limit: input.limit,\n before_turn_index: input.beforeTurnIndex,\n }), input.signal ? { signal: input.signal } : {});\n },\n async events(input, onEvent: ThreadSummaryEventHandler) {\n let cursor = input.cursor;\n let attempts = 0;\n while (!input.signal?.aborted) {\n try {\n const response = await request(\"GET\", appendQuery(\"/threads/events\", { cursor }), {\n accept: \"text/event-stream\",\n ...(input.signal ? { signal: input.signal } : {}),\n });\n cursor = (await consumeThreadSummaryStream({\n response,\n decoder: decoder(),\n onEvent,\n ...(input.signal ? { signal: input.signal } : {}),\n ...(cursor === undefined ? {} : { afterCursor: cursor }),\n })) ?? undefined;\n return;\n } catch (error) {\n if (input.signal?.aborted || !shouldReconnect(error) || attempts >= maxReconnectAttempts) throw error;\n attempts += 1;\n }\n }\n },\n delete(input) {\n return json(\"DELETE\", `/threads/${encodePath(input.threadId)}`, {\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n setRuntimeSelection(input) {\n return json(\"PATCH\", `/threads/${encodePath(input.threadId)}/runtime-selection`, {\n body: {\n preferredAgentId: input.preferredAgentId,\n ...(input.preferredModelId ? { preferredModelId: input.preferredModelId } : {}),\n },\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n attachments: {\n async uploadBatch(input) {\n const multipart = options.multipart ?? createByteMultipartEncoder(encoder);\n const encoded = await multipart.encode([\n ...(input.threadId ? [{ field: \"thread_id\", value: input.threadId }] : []),\n ...(input.requestedAgentId ? [{ field: \"requested_agent_id\", value: input.requestedAgentId }] : []),\n ...input.uploads.map((upload) => ({ field: \"files\", value: upload })),\n ]);\n const body = await json<Record<string, unknown>>(\"POST\", \"/attachments/upload\", {\n body: encoded.body,\n contentType: encoded.contentType,\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n if (!Array.isArray(body.items)) throw new Error(\"Attachment upload returned an invalid batch\");\n return body.items.map((item) => objectResult<AttachmentResult>(item, \"Attachment upload\"));\n },\n createContentAccess(input) {\n return json<AttachmentContentAccess>(\n \"POST\",\n `/attachments/${encodePath(input.attachmentId)}/content-access`,\n {\n body: { disposition: input.disposition },\n ...(input.signal ? { signal: input.signal } : {}),\n },\n );\n },\n },\n hitl: {\n resume(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/hitl/${encodePath(input.interruptId)}/resume`, {\n body: {\n interruptId: input.interruptId,\n action: input.action,\n ...(input.comment ? { comment: input.comment } : {}),\n ...(input.answers ? { answers: input.answers } : {}),\n },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n mcp: {\n startAuthorization(input) {\n return json(\"POST\", `/runs/${encodePath(input.runId)}/mcp/servers/${encodePath(input.serverId)}/auth/start`, {\n body: {\n interruptId: input.interruptId,\n redirectUri: input.redirectUri,\n popupNonce: input.popupNonce,\n codeChallenge: input.codeChallenge,\n },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n redeemCallback(input) {\n return json(\"POST\", \"/mcp/callback/redeem\", {\n body: { code: input.code, codeVerifier: input.codeVerifier },\n idempotencyKey: input.idempotencyKey,\n ...(input.signal ? { signal: input.signal } : {}),\n });\n },\n },\n sessions: {\n async revoke(input) {\n await request(\"POST\", \"/session/revoke\", {\n idempotencyKey: input?.idempotencyKey ?? ids.createId(),\n ...(input?.signal ? { signal: input.signal } : {}),\n });\n },\n },\n };\n}\n"]}
@@ -59,7 +59,6 @@ export type ResponseFeedbackResult = {
59
59
  };
60
60
  export type ThreadSummary = {
61
61
  id: string;
62
- agent_id: string | null;
63
62
  external_user_id?: string | null;
64
63
  external_session_id?: string | null;
65
64
  title: string | null;
@@ -68,6 +67,17 @@ export type ThreadSummary = {
68
67
  last_run_id: string | null;
69
68
  last_run_status: string | null;
70
69
  active_run: ActiveThreadRun | null;
70
+ runtime_selection: {
71
+ agent_id: string | null;
72
+ agent_alias: string | null;
73
+ model_id: string | null;
74
+ };
75
+ participant_agents: Array<{
76
+ id: string;
77
+ name: string;
78
+ alias: string | null;
79
+ aliases: string[];
80
+ }>;
71
81
  last_activity_at: string | null;
72
82
  created_at: string;
73
83
  updated_at: string;
package/dist/types.d.ts CHANGED
@@ -197,6 +197,14 @@ export interface ClientModelSelectionFeature {
197
197
  label: string;
198
198
  }[];
199
199
  }
200
+ export interface ClientAgentSelectionFeature {
201
+ selectable: boolean;
202
+ default_id: string | null;
203
+ options: readonly {
204
+ id: string;
205
+ label: string;
206
+ }[];
207
+ }
200
208
  export interface ClientInputModalityFeature {
201
209
  enabled: boolean;
202
210
  required: boolean;
@@ -249,6 +257,7 @@ export interface ClientBootstrap {
249
257
  capabilities: readonly string[];
250
258
  features: Record<string, unknown> & {
251
259
  models?: ClientModelSelectionFeature;
260
+ agents?: ClientAgentSelectionFeature;
252
261
  inputs: ClientInputFeature;
253
262
  };
254
263
  native_profiles: readonly Record<string, unknown>[];
@@ -266,6 +275,7 @@ export interface ChatStreamInput {
266
275
  threadId?: string;
267
276
  attachmentIds?: readonly string[];
268
277
  requestedModelId?: string;
278
+ requestedAgentId?: string;
269
279
  toolInputs?: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
270
280
  metadata?: Readonly<Record<string, unknown>>;
271
281
  client?: ClientHints;
@@ -327,8 +337,21 @@ export interface ThreadSummary {
327
337
  last_run_id?: string | null;
328
338
  last_run_status?: string | null;
329
339
  active_run?: ActiveThreadRun | null;
340
+ runtime_selection: ThreadRuntimeSelection;
341
+ participant_agents: readonly ThreadParticipantAgent[];
330
342
  [key: string]: unknown;
331
343
  }
344
+ export interface ThreadRuntimeSelection {
345
+ agent_id: string | null;
346
+ agent_alias: string | null;
347
+ model_id: string | null;
348
+ }
349
+ export interface ThreadParticipantAgent {
350
+ id: string;
351
+ name: string;
352
+ alias: string | null;
353
+ aliases: readonly string[];
354
+ }
332
355
  export interface ThreadListResult {
333
356
  items: ThreadSummary[];
334
357
  total?: number;
@@ -417,6 +440,7 @@ export interface EffectiveResourcePolicy {
417
440
  }
418
441
  export interface AgentClient {
419
442
  bootstrap(input?: {
443
+ agentId?: string;
420
444
  signal?: AbortSignalLike;
421
445
  }): Promise<ClientBootstrap>;
422
446
  readonly resourcePolicies: {
@@ -453,11 +477,27 @@ export interface AgentClient {
453
477
  idempotencyKey: string;
454
478
  signal?: AbortSignalLike;
455
479
  }): Promise<Record<string, unknown>>;
480
+ setRuntimeSelection?(input: {
481
+ threadId: string;
482
+ preferredAgentId: string;
483
+ preferredModelId?: string | null;
484
+ signal?: AbortSignalLike;
485
+ }): Promise<{
486
+ runtime_selection: ThreadRuntimeSelection;
487
+ models: {
488
+ default_id: string | null;
489
+ options: readonly {
490
+ id: string;
491
+ label: string;
492
+ }[];
493
+ };
494
+ }>;
456
495
  };
457
496
  readonly attachments: {
458
497
  uploadBatch(input: {
459
498
  uploads: readonly PortableUpload[];
460
499
  threadId?: string;
500
+ requestedAgentId?: string;
461
501
  idempotencyKey: string;
462
502
  signal?: AbortSignalLike;
463
503
  }): Promise<readonly AttachmentResult[]>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agents24/client",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "Framework-neutral end-user runtime client for deployment-scoped Agents24 sessions.",
5
5
  "keywords": [
6
6
  "agents24",