diff --git a/bun.lock b/bun.lock index a57137c..aaf85e6 100644 --- a/bun.lock +++ b/bun.lock @@ -12,16 +12,16 @@ "name": "@runloop/example-acp-cli", "version": "0.1.0", "dependencies": { - "@runloop/remote-agents-sdk": "workspace:*", "@runloop/api-client": "^1.20.0", + "@runloop/remote-agents-sdk": "workspace:*", }, }, "examples/acp-hello-world": { "name": "@runloop/example-acp-hello-world", "version": "0.1.0", "dependencies": { - "@runloop/remote-agents-sdk": "workspace:*", "@runloop/api-client": "^1.20.0", + "@runloop/remote-agents-sdk": "workspace:*", }, }, "examples/blueprint": { @@ -36,8 +36,8 @@ "version": "0.1.0", "dependencies": { "@anthropic-ai/claude-agent-sdk": "0.2.91", - "@runloop/remote-agents-sdk": "workspace:*", "@runloop/api-client": "^1.20.0", + "@runloop/remote-agents-sdk": "workspace:*", }, }, "examples/claude-hello-world": { @@ -45,8 +45,8 @@ "version": "0.1.0", "dependencies": { "@anthropic-ai/claude-agent-sdk": "0.2.91", - "@runloop/remote-agents-sdk": "workspace:*", "@runloop/api-client": "^1.20.0", + "@runloop/remote-agents-sdk": "workspace:*", }, }, "examples/combined-app": { @@ -54,8 +54,8 @@ "version": "0.1.0", "dependencies": { "@anthropic-ai/claude-agent-sdk": "0.2.91", - "@runloop/remote-agents-sdk": "workspace:*", "@runloop/api-client": "^1.20.0", + "@runloop/remote-agents-sdk": "workspace:*", "diff": "^8.0.4", "express": "^5.2.1", "react": "^19.2.4", @@ -83,8 +83,8 @@ "dependencies": { "@agentclientprotocol/sdk": "0.18.0", "@anthropic-ai/claude-agent-sdk": "^0.2.91", - "@runloop/remote-agents-sdk": "workspace:*", "@runloop/api-client": "^1.20.0", + "@runloop/remote-agents-sdk": "workspace:*", }, "devDependencies": { "typescript": "^5.8.0", @@ -94,8 +94,8 @@ "name": "tools", "version": "0.0.0", "dependencies": { - "@runloop/remote-agents-sdk": "workspace:*", "@runloop/api-client": "^1.20.0", + "@runloop/remote-agents-sdk": "workspace:*", "feature-examples": "workspace:*", }, "devDependencies": { @@ -106,7 +106,7 @@ "name": "@runloop/remote-agents-sdk", "version": "0.4.3", "dependencies": { - "@agentclientprotocol/sdk": "0.18.0", + "@agentclientprotocol/sdk": "0.21.0", }, "devDependencies": { "@anthropic-ai/claude-agent-sdk": "^0.2.91", @@ -127,7 +127,7 @@ }, }, "packages": { - "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.18.0", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-JQGEi3EetQ38DLPpYxxnnz1fyo1/3qQEkKfUmj4JfiOJCEtjGWQ0nl54IH4LZceO7zIOrtUUxc+2cJRQbBOChA=="], + "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.21.0", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-ONj+Q8qOdNQp5XbH5jnMwzT9IKZJsSN0p0lkceS4GtUtNOPVLpNzSS8gqQdGMKfBvA0ESbkL8BTaSN1Rc9miEw=="], "@anthropic-ai/claude-agent-sdk": ["@anthropic-ai/claude-agent-sdk@0.2.91", "", { "dependencies": { "@anthropic-ai/sdk": "^0.80.0", "@modelcontextprotocol/sdk": "^1.27.1" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "^0.34.2", "@img/sharp-darwin-x64": "^0.34.2", "@img/sharp-linux-arm": "^0.34.2", "@img/sharp-linux-arm64": "^0.34.2", "@img/sharp-linux-x64": "^0.34.2", "@img/sharp-linuxmusl-arm64": "^0.34.2", "@img/sharp-linuxmusl-x64": "^0.34.2", "@img/sharp-win32-arm64": "^0.34.2", "@img/sharp-win32-x64": "^0.34.2" }, "peerDependencies": { "zod": "^4.0.0" } }, "sha512-DCd5Ad5XKBbIIOMZ73L+c+e9azM6NtZzOtdKQAzykzRG/KxSCMraMAsMMQrJrIUMH3oTtHY7QuQimAiElVVVpA=="], @@ -353,8 +353,6 @@ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ=="], - "@runloop/remote-agents-sdk": ["@runloop/remote-agents-sdk@workspace:sdk"], - "@runloop/api-client": ["@runloop/api-client@1.20.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7", "tar": "^7.5.2", "uuidv7": "^1.0.2", "zod": "^3.24.1" } }, "sha512-CePHm41HeCJsyR3a6gmwrBv2BCpM0MOE59Hn9azqU+nQcQcYAI8e5l3zmT1XV+ft+GoE9PxSvsEYXEEnwez0HQ=="], "@runloop/example-acp-cli": ["@runloop/example-acp-cli@workspace:examples/acp-cli"], @@ -369,6 +367,8 @@ "@runloop/example-combined-app": ["@runloop/example-combined-app@workspace:examples/combined-app"], + "@runloop/remote-agents-sdk": ["@runloop/remote-agents-sdk@workspace:sdk"], + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="], "@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="], @@ -959,7 +959,7 @@ "typedoc": ["typedoc@0.28.18", "", { "dependencies": { "@gerrit0/mini-shiki": "^3.23.0", "lunr": "^2.3.9", "markdown-it": "^14.1.1", "minimatch": "^10.2.4", "yaml": "^2.8.2" }, "peerDependencies": { "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x" }, "bin": { "typedoc": "bin/typedoc" } }, "sha512-NTWTUOFRQ9+SGKKTuWKUioUkjxNwtS3JDRPVKZAXGHZy2wCA8bdv2iJiyeePn0xkmK+TCCqZFT0X7+2+FLjngA=="], - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], @@ -1009,15 +1009,17 @@ "yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], - "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@runloop/api-client/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "@anthropic-ai/claude-agent-sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], + + "@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "@runloop/example-combined-app/typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + "@runloop/remote-agents-sdk/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "@types/body-parser/@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], @@ -1033,6 +1035,10 @@ "@types/ws/@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="], + "feature-examples/@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.18.0", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-JQGEi3EetQ38DLPpYxxnnz1fyo1/3qQEkKfUmj4JfiOJCEtjGWQ0nl54IH4LZceO7zIOrtUUxc+2cJRQbBOChA=="], + + "feature-examples/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], @@ -1041,6 +1047,8 @@ "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.12", "", {}, "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw=="], + "tools/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "vitest/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], "@types/body-parser/@types/node/undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="], diff --git a/examples/combined-app/src/client/hooks/useACPAgent.ts b/examples/combined-app/src/client/hooks/useACPAgent.ts index bbc7a31..ff6b8bb 100644 --- a/examples/combined-app/src/client/hooks/useACPAgent.ts +++ b/examples/combined-app/src/client/hooks/useACPAgent.ts @@ -22,7 +22,13 @@ import { isFromAgent, extractACPUserMessage, } from "@runloop/remote-agents-sdk/acp"; -import type { AuthMethod, ElicitationAction, SessionUpdate, ACPTimelineEvent, InitializeResponse } from "@runloop/remote-agents-sdk/acp"; +import type { + AuthMethod, + CreateElicitationResponse, + SessionUpdate, + ACPTimelineEvent, + InitializeResponse, +} from "@runloop/remote-agents-sdk/acp"; import type { WsEvent } from "../../shared/ws-events.js"; import type { TurnBlock, @@ -101,7 +107,7 @@ export interface UseACPAgentReturn { respondToPermission: (requestId: string, optionId: string) => Promise; cancelPermission: (requestId: string) => Promise; setAutoApprovePermissions: (enabled: boolean) => Promise; - respondToElicitation: (requestId: string, action: ElicitationAction) => Promise; + respondToElicitation: (requestId: string, response: CreateElicitationResponse) => Promise; shutdown: () => Promise; createNewSession: () => Promise; switchSession: (sessionId: string) => Promise; @@ -704,9 +710,9 @@ export function useACPAgent(agentId: string | null): UseACPAgentReturn { } }, [agentId]); - const respondToElicitation = useCallback(async (requestId: string, action: ElicitationAction) => { + const respondToElicitation = useCallback(async (requestId: string, response: CreateElicitationResponse) => { dispatch({ type: "SET", patch: { pendingElicitation: null } }); - try { await api("/api/elicitation-response", { agentId, requestId, action }); } catch (err) { + try { await api("/api/elicitation-response", { agentId, requestId, response }); } catch (err) { dispatch({ type: "SET", patch: { error: err instanceof Error ? err.message : String(err) } }); } }, [agentId]); diff --git a/examples/combined-app/src/server/acp-client.ts b/examples/combined-app/src/server/acp-client.ts index b062930..ee5ebc2 100644 --- a/examples/combined-app/src/server/acp-client.ts +++ b/examples/combined-app/src/server/acp-client.ts @@ -3,8 +3,8 @@ import type { RequestPermissionRequest, RequestPermissionResponse, SessionNotification, - ElicitationRequest, - ElicitationResponse, + CreateElicitationRequest, + CreateElicitationResponse, } from "@runloop/remote-agents-sdk/acp"; import { CLIENT_METHODS } from "@runloop/remote-agents-sdk/acp"; import type { BaseWsEvent } from "../shared/ws-events.ts"; @@ -25,7 +25,7 @@ export class NodeACPClient implements Client { private pendingElicitations = new Map< string, { - resolve: (resp: ElicitationResponse) => void; + resolve: (resp: CreateElicitationResponse) => void; reject: (err: Error) => void; } >(); @@ -56,7 +56,7 @@ export class NodeACPClient implements Client { } } - resolveElicitation(requestId: string, response: ElicitationResponse): void { + resolveElicitation(requestId: string, response: CreateElicitationResponse): void { const pending = this.pendingElicitations.get(requestId); if (pending) { pending.resolve(response); @@ -103,16 +103,34 @@ export class NodeACPClient implements Client { "session/prompt", ]); + async unstable_completeElicitation(): Promise { + for (const [id, pending] of this.pendingElicitations) { + pending.reject(new Error("Elicitation completed by agent")); + this.pendingElicitations.delete(id); + } + this.emit({ type: "elicitation_dismissed" }); + } + + async unstable_createElicitation( + request: CreateElicitationRequest, + ): Promise { + const requestId = `elicit-${++this.elicitationCounter}`; + + this.emit({ type: "elicitation_request", requestId, request }); + + return await new Promise( + (resolve, reject) => { + this.pendingElicitations.set(requestId, { resolve, reject }); + }, + ); + } + async extNotification( method: string, params: Record, ): Promise { - if (method === CLIENT_METHODS.session_elicitation_complete) { - for (const [id, pending] of this.pendingElicitations) { - pending.reject(new Error("Elicitation completed by agent")); - this.pendingElicitations.delete(id); - } - this.emit({ type: "elicitation_dismissed" }); + if (method === CLIENT_METHODS.elicitation_complete) { + await this.unstable_completeElicitation(); return; } if (NodeACPClient.IGNORED_NOTIFICATIONS.has(method)) return; @@ -123,21 +141,12 @@ export class NodeACPClient implements Client { method: string, params: Record, ): Promise> { - if (method === CLIENT_METHODS.session_elicitation) { - const request = params as unknown as ElicitationRequest; - const requestId = `elicit-${++this.elicitationCounter}`; - - this.emit({ type: "elicitation_request", requestId, request }); - - const response = await new Promise( - (resolve, reject) => { - this.pendingElicitations.set(requestId, { resolve, reject }); - }, + if (method === CLIENT_METHODS.elicitation_create) { + const response = await this.unstable_createElicitation( + params as unknown as CreateElicitationRequest, ); - return response as unknown as Record; } - throw new Error(`Unknown ext method: ${method}`); } diff --git a/examples/combined-app/src/server/routes/acp.ts b/examples/combined-app/src/server/routes/acp.ts index 2890e35..4dfddf1 100644 --- a/examples/combined-app/src/server/routes/acp.ts +++ b/examples/combined-app/src/server/routes/acp.ts @@ -66,7 +66,7 @@ export function registerACPRoutes(app: Express, registry: AgentRegistry) { } entry .acpManager!.requireClient() - .resolveElicitation(req.body.requestId, { action: req.body.action }); + .resolveElicitation(req.body.requestId, req.body.response); res.json({ ok: true }); }), ); diff --git a/examples/combined-app/src/shared/ws-events.ts b/examples/combined-app/src/shared/ws-events.ts index b206ca8..bf425d5 100644 --- a/examples/combined-app/src/shared/ws-events.ts +++ b/examples/combined-app/src/shared/ws-events.ts @@ -1,4 +1,8 @@ -import type { ACPTimelineEvent, ElicitationRequest, RequestPermissionRequest } from "@runloop/remote-agents-sdk/acp"; +import type { + ACPTimelineEvent, + CreateElicitationRequest, + RequestPermissionRequest, +} from "@runloop/remote-agents-sdk/acp"; import type { ClaudeTimelineEvent, SDKControlRequest } from "@runloop/remote-agents-sdk/claude"; export type BaseWsEvent = @@ -8,7 +12,7 @@ export type BaseWsEvent = | { type: "control_request"; controlRequest: SDKControlRequest } | { type: "permission_request"; requestId: string; request: RequestPermissionRequest } | { type: "permission_dismissed" } - | { type: "elicitation_request"; requestId: string; request: ElicitationRequest } + | { type: "elicitation_request"; requestId: string; request: CreateElicitationRequest } | { type: "elicitation_dismissed" }; export type WsEvent = BaseWsEvent & { agentId: string }; diff --git a/sdk/package.json b/sdk/package.json index 0c33ff9..447afbe 100644 --- a/sdk/package.json +++ b/sdk/package.json @@ -73,7 +73,7 @@ "docs": "typedoc" }, "dependencies": { - "@agentclientprotocol/sdk": "0.18.0" + "@agentclientprotocol/sdk": "0.21.0" }, "peerDependencies": { "@anthropic-ai/claude-agent-sdk": ">=0.2.90", diff --git a/sdk/src/acp/axon-stream.ts b/sdk/src/acp/axon-stream.ts index 6c0b4a9..fc325f6 100644 --- a/sdk/src/acp/axon-stream.ts +++ b/sdk/src/acp/axon-stream.ts @@ -13,11 +13,11 @@ import type { AxonStreamOptions } from "./types.js"; * Set of event_types that are notifications (no request ID correlation). * `session/update` is the main one -- the broker sends streaming chunks, * tool calls, plan updates, etc. as session/update notifications. - * `session/elicitation/complete` signals elicitation finished (no response expected). + * `elicitation/complete` signals elicitation finished (no response expected). */ const NOTIFICATION_TYPES = new Set([ CLIENT_METHODS.session_update, - CLIENT_METHODS.session_elicitation_complete, + CLIENT_METHODS.elicitation_complete, ]); /** diff --git a/sdk/src/acp/timeline-event-guards.test.ts b/sdk/src/acp/timeline-event-guards.test.ts index 43d462e..45c32b2 100644 --- a/sdk/src/acp/timeline-event-guards.test.ts +++ b/sdk/src/acp/timeline-event-guards.test.ts @@ -242,13 +242,13 @@ describe("isUnknownTimelineEvent", () => { // --------------------------------------------------------------------------- describe("isElicitationRequestEvent", () => { - it("returns true for session/elicitation AGENT_EVENT", () => { - const event = makeProtocolTimelineEvent(CLIENT_METHODS.session_elicitation, "AGENT_EVENT"); + it("returns true for elicitation/create AGENT_EVENT", () => { + const event = makeProtocolTimelineEvent(CLIENT_METHODS.elicitation_create, "AGENT_EVENT"); expect(isElicitationRequestEvent(event)).toBe(true); }); - it("returns false for session/elicitation USER_EVENT (response)", () => { - const event = makeProtocolTimelineEvent(CLIENT_METHODS.session_elicitation, "USER_EVENT"); + it("returns false for elicitation/create USER_EVENT (response)", () => { + const event = makeProtocolTimelineEvent(CLIENT_METHODS.elicitation_create, "USER_EVENT"); expect(isElicitationRequestEvent(event)).toBe(false); }); @@ -269,13 +269,13 @@ describe("isElicitationRequestEvent", () => { }); describe("isElicitationResponseEvent", () => { - it("returns true for session/elicitation USER_EVENT", () => { - const event = makeProtocolTimelineEvent(CLIENT_METHODS.session_elicitation, "USER_EVENT"); + it("returns true for elicitation/create USER_EVENT", () => { + const event = makeProtocolTimelineEvent(CLIENT_METHODS.elicitation_create, "USER_EVENT"); expect(isElicitationResponseEvent(event)).toBe(true); }); - it("returns false for session/elicitation AGENT_EVENT (request)", () => { - const event = makeProtocolTimelineEvent(CLIENT_METHODS.session_elicitation, "AGENT_EVENT"); + it("returns false for elicitation/create AGENT_EVENT (request)", () => { + const event = makeProtocolTimelineEvent(CLIENT_METHODS.elicitation_create, "AGENT_EVENT"); expect(isElicitationResponseEvent(event)).toBe(false); }); @@ -296,24 +296,18 @@ describe("isElicitationResponseEvent", () => { }); describe("isElicitationCompleteEvent", () => { - it("returns true for session/elicitation/complete AGENT_EVENT", () => { - const event = makeProtocolTimelineEvent( - CLIENT_METHODS.session_elicitation_complete, - "AGENT_EVENT", - ); + it("returns true for elicitation/complete AGENT_EVENT", () => { + const event = makeProtocolTimelineEvent(CLIENT_METHODS.elicitation_complete, "AGENT_EVENT"); expect(isElicitationCompleteEvent(event)).toBe(true); }); - it("returns true for session/elicitation/complete USER_EVENT", () => { - const event = makeProtocolTimelineEvent( - CLIENT_METHODS.session_elicitation_complete, - "USER_EVENT", - ); + it("returns true for elicitation/complete USER_EVENT", () => { + const event = makeProtocolTimelineEvent(CLIENT_METHODS.elicitation_complete, "USER_EVENT"); expect(isElicitationCompleteEvent(event)).toBe(true); }); - it("returns false for session/elicitation events", () => { - const event = makeProtocolTimelineEvent(CLIENT_METHODS.session_elicitation, "AGENT_EVENT"); + it("returns false for elicitation/create events", () => { + const event = makeProtocolTimelineEvent(CLIENT_METHODS.elicitation_create, "AGENT_EVENT"); expect(isElicitationCompleteEvent(event)).toBe(false); }); diff --git a/sdk/src/acp/timeline-event-guards.ts b/sdk/src/acp/timeline-event-guards.ts index 90c03e2..36ffe4a 100644 --- a/sdk/src/acp/timeline-event-guards.ts +++ b/sdk/src/acp/timeline-event-guards.ts @@ -137,7 +137,7 @@ export function isNewSessionEvent(event: ACPTimelineEvent): event is ACPNewSessi // --------------------------------------------------------------------------- /** - * A timeline event for `session/elicitation` (agent requesting user input). + * A timeline event for `elicitation/create` (agent requesting user input). * * Check `axonEvent.origin` to determine direction: * - `AGENT_EVENT` = agent sent the request @@ -146,20 +146,20 @@ export function isNewSessionEvent(event: ACPTimelineEvent): event is ACPNewSessi * @category Timeline */ export type ElicitationTimelineEvent = ACPOtherProtocolTimelineEvent & { - eventType: typeof CLIENT_METHODS.session_elicitation; + eventType: typeof CLIENT_METHODS.elicitation_create; }; /** - * A timeline event for `session/elicitation/complete` notification. + * A timeline event for `elicitation/complete` notification. * * @category Timeline */ export type ElicitationCompleteTimelineEvent = ACPOtherProtocolTimelineEvent & { - eventType: typeof CLIENT_METHODS.session_elicitation_complete; + eventType: typeof CLIENT_METHODS.elicitation_complete; }; /** - * Type guard for `session/elicitation` timeline events (request from agent). + * Type guard for `elicitation/create` timeline events (request from agent). * * This matches when the agent asks the client for user input. The request * arrives as an `AGENT_EVENT`. @@ -173,13 +173,13 @@ export function isElicitationRequestEvent( ): event is ElicitationTimelineEvent { return ( event.kind === "acp_protocol" && - event.eventType === CLIENT_METHODS.session_elicitation && + event.eventType === CLIENT_METHODS.elicitation_create && isFromAgent(event) ); } /** - * Type guard for `session/elicitation` timeline events (response from client). + * Type guard for `elicitation/create` timeline events (response from client). * * This matches when the client responds to an elicitation request. The response * arrives as a `USER_EVENT`. @@ -193,13 +193,13 @@ export function isElicitationResponseEvent( ): event is ElicitationTimelineEvent { return ( event.kind === "acp_protocol" && - event.eventType === CLIENT_METHODS.session_elicitation && + event.eventType === CLIENT_METHODS.elicitation_create && isFromUser(event) ); } /** - * Type guard for `session/elicitation/complete` timeline events. + * Type guard for `elicitation/complete` timeline events. * * @param event - The timeline event to test. * @returns `true` if `event` is an elicitation complete notification. @@ -208,7 +208,5 @@ export function isElicitationResponseEvent( export function isElicitationCompleteEvent( event: ACPTimelineEvent, ): event is ElicitationCompleteTimelineEvent { - return ( - event.kind === "acp_protocol" && event.eventType === CLIENT_METHODS.session_elicitation_complete - ); + return event.kind === "acp_protocol" && event.eventType === CLIENT_METHODS.elicitation_complete; }