diff --git a/packages/framework/src/handler.ts b/packages/framework/src/handler.ts index 92d92ec8b84..e6e03976171 100644 --- a/packages/framework/src/handler.ts +++ b/packages/framework/src/handler.ts @@ -309,12 +309,12 @@ export class NovuRequestHandler { } private async runAgentHandler(registeredAgent: Agent, event: string, ctx: AgentContextImpl): Promise { - const handlerMap: Partial Awaitable>> = { + const handlerMap = { [AgentEventEnum.ON_MESSAGE]: registeredAgent.handlers.onMessage, [AgentEventEnum.ON_REACTION]: registeredAgent.handlers.onReaction, [AgentEventEnum.ON_ACTION]: registeredAgent.handlers.onAction, [AgentEventEnum.ON_RESOLVE]: registeredAgent.handlers.onResolve, - }; + } as Partial Awaitable>>; if (!Object.prototype.hasOwnProperty.call(handlerMap, event)) { throw new InvalidActionError(event, AgentEventEnum); diff --git a/packages/framework/src/index.ts b/packages/framework/src/index.ts index fc76897d05b..b393cb75609 100644 --- a/packages/framework/src/index.ts +++ b/packages/framework/src/index.ts @@ -4,6 +4,7 @@ export { NovuRequestHandler, type ServeHandlerOptions } from './handler'; export type { Agent, AgentAction, + AgentActionContext, AgentAttachment, AgentBridgeRequest, AgentContext, @@ -12,9 +13,12 @@ export type { AgentHistoryEntry, AgentMessage, AgentMessageAuthor, + AgentMessageContext, AgentPlatformContext, AgentReaction, + AgentReactionContext, AgentReplyPayload, + AgentResolveContext, AgentSubscriber, CardChild, CardElement, diff --git a/packages/framework/src/resources/agent/agent.context.ts b/packages/framework/src/resources/agent/agent.context.ts index e5ef2dce0ee..02deb21d914 100644 --- a/packages/framework/src/resources/agent/agent.context.ts +++ b/packages/framework/src/resources/agent/agent.context.ts @@ -5,7 +5,6 @@ import type { AddReactionPayload, AgentAction, AgentBridgeRequest, - AgentContext, AgentConversation, AgentHistoryEntry, AgentMessage, @@ -247,7 +246,7 @@ class ReplyHandleImpl implements ReplyHandle { } } -export class AgentContextImpl implements AgentContext { +export class AgentContextImpl { readonly event: string; readonly action: AgentAction | null; readonly message: AgentMessage | null; diff --git a/packages/framework/src/resources/agent/agent.test.ts b/packages/framework/src/resources/agent/agent.test.ts index bb489992fc7..78c9f731441 100644 --- a/packages/framework/src/resources/agent/agent.test.ts +++ b/packages/framework/src/resources/agent/agent.test.ts @@ -1609,4 +1609,5 @@ describe('agent dispatch via NovuRequestHandler', () => { expect(JSON.parse(replyCalls[0][1].body).reply.markdown).toBe('Thinking…'); expect(JSON.parse(replyCalls[1][1].body).reply.markdown).toBe('Final answer'); }); + }); diff --git a/packages/framework/src/resources/agent/agent.types.ts b/packages/framework/src/resources/agent/agent.types.ts index abdccb7db52..ff34a651195 100644 --- a/packages/framework/src/resources/agent/agent.types.ts +++ b/packages/framework/src/resources/agent/agent.types.ts @@ -142,11 +142,7 @@ export interface ReplyHandle { edit(content: MessageContent, options?: { files?: FileRef[] }): Promise; } -export interface AgentContext { - readonly event: string; - readonly action: AgentAction | null; - readonly message: AgentMessage | null; - readonly reaction: AgentReaction | null; +interface AgentContextBase { readonly conversation: AgentConversation; readonly subscriber: AgentSubscriber | null; readonly history: AgentHistoryEntry[]; @@ -207,11 +203,32 @@ export interface AgentContext { addReaction(messageId: string, emojiName: Emoji): void; } +export interface AgentMessageContext extends AgentContextBase { + readonly event: 'onMessage'; + readonly message: AgentMessage; +} + +export interface AgentActionContext extends AgentContextBase { + readonly event: 'onAction'; + readonly action: AgentAction; +} + +export interface AgentReactionContext extends AgentContextBase { + readonly event: 'onReaction'; + readonly reaction: AgentReaction; +} + +export interface AgentResolveContext extends AgentContextBase { + readonly event: 'onResolve'; +} + +export type AgentContext = AgentMessageContext | AgentActionContext | AgentReactionContext | AgentResolveContext; + export interface AgentHandlers { - onMessage: (ctx: AgentContext) => Awaitable; - onReaction?: (ctx: AgentContext) => Awaitable; - onAction?: (ctx: AgentContext) => Awaitable; - onResolve?: (ctx: AgentContext) => Awaitable; + onMessage: (ctx: AgentMessageContext) => Awaitable; + onReaction?: (ctx: AgentReactionContext) => Awaitable; + onAction?: (ctx: AgentActionContext) => Awaitable; + onResolve?: (ctx: AgentResolveContext) => Awaitable; } export interface Agent { diff --git a/packages/framework/src/resources/agent/index.ts b/packages/framework/src/resources/agent/index.ts index 3b6edfbc3b4..b42da939b0d 100644 --- a/packages/framework/src/resources/agent/index.ts +++ b/packages/framework/src/resources/agent/index.ts @@ -17,6 +17,7 @@ export { agent } from './agent.resource'; export type { Agent, AgentAction, + AgentActionContext, AgentAttachment, AgentBridgeRequest, AgentContext, @@ -25,9 +26,12 @@ export type { AgentHistoryEntry, AgentMessage, AgentMessageAuthor, + AgentMessageContext, AgentPlatformContext, AgentReaction, + AgentReactionContext, AgentReplyPayload, + AgentResolveContext, AgentSubscriber, EditPayload, FileRef,