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,