@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 +7 -1
- package/compatibility.json +4 -4
- package/dist/bff.js +12 -1
- package/dist/bff.js.map +1 -1
- package/dist/runtime-types.d.ts +11 -1
- package/dist/types.d.ts +40 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# `@agents24/client`
|
|
2
2
|
|
|
3
|
-
Last Updated: 2026-08-
|
|
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
|
package/compatibility.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"contractHash": "a409af6996d10a8d94e0f6332c9a381c3535a9c8511314b6c42b237d7e057029",
|
|
3
|
-
"contractVersion": "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":
|
|
51
|
-
"node":
|
|
52
|
-
"python":
|
|
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"]}
|
package/dist/runtime-types.d.ts
CHANGED
|
@@ -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[]>;
|