diff --git a/packages/core/src/client/actions/rpc.ts b/packages/core/src/client/actions/rpc.ts index 0e3948d3..28d31474 100644 --- a/packages/core/src/client/actions/rpc.ts +++ b/packages/core/src/client/actions/rpc.ts @@ -103,6 +103,11 @@ export interface ListAgentsResult { agents: { id: string; closed: boolean }[]; } +/** listConversations - no params needed (conversation-first alias of listAgents) */ +export interface ListConversationsResult { + conversations: { id: string; closed: boolean }[]; +} + /** createAgent - request params */ export interface CreateAgentParams { id?: string; @@ -113,6 +118,16 @@ export interface CreateAgentResult { id: string; } +/** createConversation - request params (conversation-first alias of createAgent) */ +export interface CreateConversationParams { + id?: string; +} + +/** createConversation - response payload */ +export interface CreateConversationResult { + id: string; +} + /** deleteAgent - request params */ export interface DeleteAgentParams { id: string; @@ -123,6 +138,16 @@ export interface DeleteAgentResult { ok: boolean; } +/** deleteConversation - request params (conversation-first alias of deleteAgent) */ +export interface DeleteConversationParams { + id: string; +} + +/** deleteConversation - response payload */ +export interface DeleteConversationResult { + ok: boolean; +} + /** updateGateway - request params */ export interface UpdateGatewayParams { url: string; diff --git a/packages/core/src/hub/hub.ts b/packages/core/src/hub/hub.ts index 9d838b2c..e5312626 100644 --- a/packages/core/src/hub/hub.ts +++ b/packages/core/src/hub/hub.ts @@ -24,6 +24,9 @@ import { createGetHubInfoHandler } from "./rpc/handlers/get-hub-info.js"; import { createListAgentsHandler } from "./rpc/handlers/list-agents.js"; import { createCreateAgentHandler } from "./rpc/handlers/create-agent.js"; import { createDeleteAgentHandler } from "./rpc/handlers/delete-agent.js"; +import { createListConversationsHandler } from "./rpc/handlers/list-conversations.js"; +import { createCreateConversationHandler } from "./rpc/handlers/create-conversation.js"; +import { createDeleteConversationHandler } from "./rpc/handlers/delete-conversation.js"; import { createUpdateGatewayHandler } from "./rpc/handlers/update-gateway.js"; import { createGetLastHeartbeatHandler } from "./rpc/handlers/get-last-heartbeat.js"; import { createSetHeartbeatsHandler } from "./rpc/handlers/set-heartbeats.js"; @@ -123,6 +126,9 @@ export class Hub { this.rpc.register("listAgents", createListAgentsHandler(this)); this.rpc.register("createAgent", createCreateAgentHandler(this)); this.rpc.register("deleteAgent", createDeleteAgentHandler(this)); + this.rpc.register("listConversations", createListConversationsHandler(this)); + this.rpc.register("createConversation", createCreateConversationHandler(this)); + this.rpc.register("deleteConversation", createDeleteConversationHandler(this)); this.rpc.register("updateGateway", createUpdateGatewayHandler(this)); this.rpc.register("last-heartbeat", createGetLastHeartbeatHandler(this)); this.rpc.register("set-heartbeats", createSetHeartbeatsHandler(this)); diff --git a/packages/core/src/hub/rpc/handlers/create-conversation.ts b/packages/core/src/hub/rpc/handlers/create-conversation.ts new file mode 100644 index 00000000..15a570ab --- /dev/null +++ b/packages/core/src/hub/rpc/handlers/create-conversation.ts @@ -0,0 +1,13 @@ +import type { RpcHandler } from "../dispatcher.js"; + +interface HubLike { + createConversation(id?: string): { sessionId: string }; +} + +export function createCreateConversationHandler(hub: HubLike): RpcHandler { + return (params: unknown) => { + const { id } = (params ?? {}) as { id?: string }; + const conversation = hub.createConversation(id); + return { id: conversation.sessionId }; + }; +} diff --git a/packages/core/src/hub/rpc/handlers/delete-conversation.ts b/packages/core/src/hub/rpc/handlers/delete-conversation.ts new file mode 100644 index 00000000..ecc93f8d --- /dev/null +++ b/packages/core/src/hub/rpc/handlers/delete-conversation.ts @@ -0,0 +1,19 @@ +import { RpcError, type RpcHandler } from "../dispatcher.js"; + +interface HubLike { + closeConversation(id: string): boolean; +} + +export function createDeleteConversationHandler(hub: HubLike): RpcHandler { + return (params: unknown) => { + if (!params || typeof params !== "object") { + throw new RpcError("INVALID_PARAMS", "params must be an object"); + } + const { id } = params as { id?: string }; + if (!id) { + throw new RpcError("INVALID_PARAMS", "Missing required param: id"); + } + const ok = hub.closeConversation(id); + return { ok }; + }; +} diff --git a/packages/core/src/hub/rpc/handlers/list-conversations.ts b/packages/core/src/hub/rpc/handlers/list-conversations.ts new file mode 100644 index 00000000..42508ca6 --- /dev/null +++ b/packages/core/src/hub/rpc/handlers/list-conversations.ts @@ -0,0 +1,16 @@ +import type { RpcHandler } from "../dispatcher.js"; + +interface HubLike { + listConversations(): string[]; + getConversation(id: string): { closed: boolean } | undefined; +} + +export function createListConversationsHandler(hub: HubLike): RpcHandler { + return () => { + const conversations = hub.listConversations().map((id) => { + const conversation = hub.getConversation(id); + return { id, closed: conversation?.closed ?? true }; + }); + return { conversations }; + }; +} diff --git a/packages/sdk/src/actions/rpc.ts b/packages/sdk/src/actions/rpc.ts index 8a665a3e..2849e655 100644 --- a/packages/sdk/src/actions/rpc.ts +++ b/packages/sdk/src/actions/rpc.ts @@ -112,6 +112,11 @@ export interface ListAgentsResult { agents: { id: string; closed: boolean }[]; } +/** listConversations - no params needed (conversation-first alias of listAgents) */ +export interface ListConversationsResult { + conversations: { id: string; closed: boolean }[]; +} + /** createAgent - request params */ export interface CreateAgentParams { id?: string; @@ -122,6 +127,16 @@ export interface CreateAgentResult { id: string; } +/** createConversation - request params (conversation-first alias of createAgent) */ +export interface CreateConversationParams { + id?: string; +} + +/** createConversation - response payload */ +export interface CreateConversationResult { + id: string; +} + /** deleteAgent - request params */ export interface DeleteAgentParams { id: string; @@ -132,6 +147,16 @@ export interface DeleteAgentResult { ok: boolean; } +/** deleteConversation - request params (conversation-first alias of deleteAgent) */ +export interface DeleteConversationParams { + id: string; +} + +/** deleteConversation - response payload */ +export interface DeleteConversationResult { + ok: boolean; +} + /** updateGateway - request params */ export interface UpdateGatewayParams { url: string;