@novu/framework 2.11.1 → 2.11.2-alpha.1

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.
Files changed (89) hide show
  1. package/README.md +114 -9
  2. package/ai-sdk/package.json +4 -0
  3. package/cards/package.json +4 -0
  4. package/dist/{esm/index-D6L0Yufw.d.ts → cjs/agent.types-Dqm2VBTO.d.cts} +410 -193
  5. package/dist/cjs/ai-sdk/index.cjs +1 -0
  6. package/dist/cjs/ai-sdk/index.d.cts +40 -0
  7. package/dist/cjs/cards.cjs +57 -0
  8. package/dist/cjs/cards.d.cts +2 -0
  9. package/dist/cjs/{health-check.types-D4NEyjyC.d.cts → health-check.types-B9FbzRbm.d.cts} +6 -140
  10. package/dist/cjs/index-1DobCKAF.d.cts +160 -0
  11. package/dist/cjs/index.cjs +138 -138
  12. package/dist/cjs/index.d.cts +5 -3
  13. package/dist/cjs/internal/index.cjs +1 -1
  14. package/dist/cjs/internal/index.d.cts +98 -4
  15. package/dist/cjs/jsx-dev-runtime.cjs +1 -1
  16. package/dist/cjs/jsx-runtime.cjs +1 -1
  17. package/dist/cjs/langchain/index.cjs +1 -0
  18. package/dist/cjs/langchain/index.d.cts +106 -0
  19. package/dist/cjs/servers/express.cjs +138 -138
  20. package/dist/cjs/servers/express.d.cts +6 -4
  21. package/dist/cjs/servers/h3.cjs +137 -137
  22. package/dist/cjs/servers/h3.d.cts +6 -4
  23. package/dist/cjs/servers/lambda.cjs +137 -137
  24. package/dist/cjs/servers/lambda.d.cts +6 -5
  25. package/dist/cjs/servers/nest.cjs +138 -138
  26. package/dist/cjs/servers/nest.d.cts +21 -7
  27. package/dist/cjs/servers/next.cjs +137 -137
  28. package/dist/cjs/servers/next.d.cts +6 -4
  29. package/dist/cjs/servers/nuxt.cjs +137 -137
  30. package/dist/cjs/servers/nuxt.d.cts +6 -4
  31. package/dist/cjs/servers/remix.cjs +137 -137
  32. package/dist/cjs/servers/remix.d.cts +6 -4
  33. package/dist/cjs/servers/sveltekit.cjs +137 -137
  34. package/dist/cjs/servers/sveltekit.d.cts +6 -4
  35. package/dist/cjs/step-resolver.cjs +1 -1
  36. package/dist/cjs/step-resolver.d.cts +3 -2
  37. package/dist/cjs/{subscriber.types-PRaHFLJu.d.cts → subscriber.types-DubxcL8q.d.cts} +18 -78
  38. package/dist/cjs/util.types-DaFfsxgy.d.cts +78 -0
  39. package/dist/cjs/validators.cjs +1 -1
  40. package/dist/{cjs/index-BNiIiOE-.d.cts → esm/agent.types-E3sxq6xr.d.ts} +410 -193
  41. package/dist/esm/ai-sdk/index.d.ts +40 -0
  42. package/dist/esm/ai-sdk/index.js +1 -0
  43. package/dist/esm/cards.d.ts +2 -0
  44. package/dist/esm/cards.js +1 -0
  45. package/dist/esm/{chunk-DKQLYSZS.js → chunk-22DBAEUX.js} +1 -1
  46. package/dist/esm/{chunk-KLCBNFAF.js → chunk-3XT6S7TZ.js} +14 -14
  47. package/dist/esm/chunk-3ZWME5KT.js +0 -0
  48. package/dist/esm/chunk-C3P3ZH2I.js +36 -0
  49. package/dist/esm/{chunk-QTWEINJ4.js → chunk-CANJPWLT.js} +1 -1
  50. package/dist/esm/chunk-E2MET7IR.js +1 -0
  51. package/dist/esm/chunk-FHYMHX3T.js +1 -0
  52. package/dist/esm/chunk-Q6BV36LU.js +98 -0
  53. package/dist/esm/chunk-W6DIBD4Z.js +1 -0
  54. package/dist/esm/{health-check.types-C-81VaBO.d.ts → health-check.types-BNocZ4Wk.d.ts} +6 -140
  55. package/dist/esm/index-aVljLqR4.d.ts +160 -0
  56. package/dist/esm/index.d.ts +5 -3
  57. package/dist/esm/index.js +1 -1
  58. package/dist/esm/internal/index.d.ts +98 -4
  59. package/dist/esm/internal/index.js +1 -1
  60. package/dist/esm/jsx-dev-runtime.js +1 -1
  61. package/dist/esm/jsx-runtime-7EPQR56T.js +1 -0
  62. package/dist/esm/jsx-runtime.js +1 -1
  63. package/dist/esm/langchain/index.d.ts +106 -0
  64. package/dist/esm/langchain/index.js +1 -0
  65. package/dist/esm/servers/express.d.ts +6 -4
  66. package/dist/esm/servers/express.js +1 -1
  67. package/dist/esm/servers/h3.d.ts +6 -4
  68. package/dist/esm/servers/h3.js +1 -1
  69. package/dist/esm/servers/lambda.d.ts +6 -5
  70. package/dist/esm/servers/lambda.js +1 -1
  71. package/dist/esm/servers/nest.d.ts +21 -7
  72. package/dist/esm/servers/nest.js +1 -1
  73. package/dist/esm/servers/next.d.ts +6 -4
  74. package/dist/esm/servers/next.js +1 -1
  75. package/dist/esm/servers/nuxt.d.ts +6 -4
  76. package/dist/esm/servers/nuxt.js +1 -1
  77. package/dist/esm/servers/remix.d.ts +6 -4
  78. package/dist/esm/servers/remix.js +1 -1
  79. package/dist/esm/servers/sveltekit.d.ts +6 -4
  80. package/dist/esm/servers/sveltekit.js +1 -1
  81. package/dist/esm/step-resolver.d.ts +3 -2
  82. package/dist/esm/step-resolver.js +1 -1
  83. package/dist/esm/{subscriber.types-CC7F0JO_.d.ts → subscriber.types-CmybpXhA.d.ts} +18 -78
  84. package/dist/esm/util.types-DaFfsxgy.d.ts +78 -0
  85. package/dist/esm/validators.js +1 -1
  86. package/package.json +56 -8
  87. package/dist/esm/chunk-52LSX2V5.js +0 -1
  88. package/dist/esm/chunk-N4PZBM53.js +0 -1
  89. package/dist/esm/chunk-ND6IQFTA.js +0 -133
@@ -0,0 +1,40 @@
1
+ import { i as AgentHandlers, k as AgentMessage, m as AgentMessageContext, M as MessageContent, u as ToolApprovalDecision, b as AgentActionContext, R as ReplyHandle, A as Agent, j as AgentHistoryEntry } from '../agent.types-E3sxq6xr.js';
2
+ import { streamText, generateText, ModelMessage } from 'ai';
3
+ import { A as Awaitable } from '../util.types-DaFfsxgy.js';
4
+ import 'chat';
5
+
6
+ type AiSdkStreamResult = Awaited<ReturnType<typeof streamText>>;
7
+ type AiSdkGenerateResult = Awaited<ReturnType<typeof generateText>>;
8
+ type AiSdkResult = AiSdkStreamResult | AiSdkGenerateResult;
9
+ /**
10
+ * Handlers for `@novu/framework/ai-sdk` agents.
11
+ *
12
+ * Extends {@link AgentHandlers}: same events and config (`toolApproval`, etc.),
13
+ * but `onMessage` and `onToolApproval` may return an AI SDK result for automatic delivery.
14
+ */
15
+ type AiSdkAgentHandlers = Omit<AgentHandlers, 'onMessage' | 'onToolApproval'> & {
16
+ onMessage: (message: AgentMessage, ctx: AgentMessageContext) => Awaitable<MessageContent | AiSdkResult | void>;
17
+ /**
18
+ * Optional. Auto-resumes `onMessage` after approve/deny unless you return an
19
+ * `AiSdkResult` to drive the resume yourself.
20
+ */
21
+ onToolApproval?: (decision: ToolApprovalDecision, ctx: AgentActionContext) => Awaitable<MessageContent | AiSdkResult | ReplyHandle | void>;
22
+ onError?: AgentHandlers['onError'];
23
+ };
24
+
25
+ type AiSdkMessageHandler = AiSdkAgentHandlers['onMessage'];
26
+ declare function agent(id: string, handlers: AiSdkMessageHandler | AiSdkAgentHandlers): Agent;
27
+
28
+ /**
29
+ * Convert `ctx.history` into AI SDK `ModelMessage[]` for `streamText` / `generateText`.
30
+ *
31
+ * History already includes the current incoming message — do not append the handler's
32
+ * `message` argument on top of it.
33
+ *
34
+ * Pass the system prompt via the top-level `instructions` option of `streamText` /
35
+ * `generateText`. AI SDK 7 rejects `system` messages inside the `messages` array by default,
36
+ * so this helper never injects one.
37
+ */
38
+ declare function toModelMessages(history: AgentHistoryEntry[]): ModelMessage[];
39
+
40
+ export { type AiSdkAgentHandlers, agent, toModelMessages };
@@ -0,0 +1 @@
1
+ import{b as d,c as m,f as y}from"../chunk-W6DIBD4Z.js";import"../chunk-FHYMHX3T.js";function x(e){return e.role==="tool"&&Array.isArray(e.content)}function H(e){return typeof e=="object"&&e!==null&&e.type==="tool-result"}function _(e){return typeof e=="object"&&e!==null&&"type"in e&&e.type==="execution-denied"}function q(e){if(e&&typeof e=="object"&&"type"in e&&"value"in e){let t=e;if(t.type==="json"||t.type==="text")return t.value}return e}async function N(e){var o;return((o=await Promise.resolve(e.responseMessages))!=null?o:[]).filter(x).flatMap(n=>n.content).filter(H).filter(n=>!_(n.output)).map(n=>({toolCallId:n.toolCallId,toolName:n.toolName,output:q(n.output)}))}function O(e){var o;let t=new Set;for(let n of e.history)n.type==="tool_approval_request"&&((o=n.toolData)!=null&&o.toolCallId)&&t.add(n.toolData.toolCallId);return t}async function R(e,t){var l;let o=await N(e);if(o.length===0)return;let n=O(t);for(let r of o)n.has(r.toolCallId)&&t.emitToolResult({toolCallId:r.toolCallId,toolName:r.toolName,output:r.output,preview:`Tool "${(l=r.toolName)!=null?l:r.toolCallId}" result`})}function g(e){return typeof e=="object"&&e!==null&&typeof e.consumeStream=="function"}function h(e){return typeof e=="object"&&e!==null&&"text"in e&&"steps"in e&&"usage"in e&&!g(e)}function c(e){return typeof e!="object"||e===null||m(e)?!1:g(e)||h(e)}function b(e){var o;if(typeof e!="object"||e===null||e.type!=="tool-approval-request")return!1;let t=e;return!t.isAutomatic&&typeof((o=t.toolCall)==null?void 0:o.toolCallId)=="string"}async function D(e){let t=await Promise.resolve(e.content);return Array.isArray(t)?t.filter(b):[]}async function f(e,t,o){g(e)&&await e.consumeStream({onError:l=>{throw l}}),await R(e,t);let n=await D(e);if(n.length>0){let l=n[0],r={id:l.toolCall.toolCallId,name:l.toolCall.toolName,input:l.toolCall.input};await y(t,r,o,l.approvalId);return}await L(e,t)}async function L(e,t){let o=(await Promise.resolve(e.text)).trim();if(!o){await t.typing.stop();return}await t.reply(o)}var j={text:"",platformMessageId:"",author:{userId:"",fullName:"",userName:"",isBot:!1},timestamp:""};function Y(e){return typeof e=="object"&&e!==null&&"messageId"in e&&"platformThreadId"in e}function G(e,t){let o=typeof t=="function"?{onMessage:t}:t;if(typeof o.onMessage!="function")throw new Error(`agent('${e}') requires an onMessage handler`);return o}function U(e,t){if(!e)throw new Error("agent() requires a non-empty agentId");let o=G(e,t),n=o.toolApproval,l=typeof o.onToolApproval=="function",r=async s=>{let i=d(s),p=await o.onMessage(j,i.asMessageContext());c(p)&&await f(p,i,n)},a={onMessage:async(s,i)=>{let p=await o.onMessage(s,i);if(c(p)){await f(p,d(i),n);return}return p},onToolApproval:async(s,i)=>{let p=d(i);if(o.onToolApproval){let u=await o.onToolApproval(s,i);if(c(u)){await f(u,p,n);return}u!=null&&!Y(u)&&await p.reply(u)}await r(i)},...n&&{toolApproval:n},...o.onAction&&{onAction:o.onAction},...o.onReaction&&{onReaction:o.onReaction},...o.onResolve&&{onResolve:o.onResolve},...o.onError&&{onError:o.onError}};return{id:e,handlers:a,userOnToolApproval:l}}var V="tool_approval_request",$="tool_approval_decision",z="tool_result";function I(e){var o;let t=e.toolData;if(!(!t||typeof t.approvalId!="string"||typeof t.toolCallId!="string"))return{approvalId:t.approvalId,toolCallId:t.toolCallId,name:(o=t.toolName)!=null?o:"tool",input:t.input}}function T(e){let t=e.toolData;if(!(!t||typeof t.approvalId!="string"||typeof t.approved!="boolean"))return{approvalId:t.approvalId,approved:t.approved}}function M(e){let t=e.toolData;if(!(!t||typeof t.toolCallId!="string"))return{toolCallId:t.toolCallId,toolName:t.toolName,output:t.output}}function C(e){let t=new Set,o=new Map,n=new Map,l=new Set;for(let a of e)if(a.type===V){let s=I(a);s&&(n.set(s.approvalId,s.toolCallId),l.add(s.toolCallId))}else if(a.type===$){let s=T(a);s&&!s.approved&&t.add(s.approvalId)}else if(a.type===z){let s=M(a);s&&o.set(s.toolCallId,s)}let r=new Set;for(let a of o.keys())l.has(a)&&r.add(a);return{deniedApprovalIds:t,toolResults:o,approvalIdToToolCallId:n,pairedAtRequest:r}}function Q(e,t){return t.deniedApprovalIds.has(e.approvalId)?"denied":t.toolResults.has(e.toolCallId)?"resolved":"in-flight"}function A(e,t){var n;let o=[{type:"tool-call",toolCallId:e.toolCallId,toolName:e.name,input:(n=e.input)!=null?n:{}}];return t&&o.push({type:"tool-approval-request",approvalId:e.approvalId,toolCallId:e.toolCallId}),{role:"assistant",content:o}}function B(e){return{role:"tool",content:[{type:"tool-result",toolCallId:e,toolName:"tool",output:{type:"execution-denied"}}]}}function S(e){var t;return{role:"tool",content:[{type:"tool-result",toolCallId:e.toolCallId,toolName:(t=e.toolName)!=null?t:"tool",output:{type:"json",value:e.output}}]}}function v(e,t){return[A(e,!1),t]}function w(e,t){let o=I(e);if(!o)return[];let n=Q(o,t);switch(n){case"denied":return v(o,B(o.toolCallId));case"resolved":{let l=t.toolResults.get(o.toolCallId);return l?v(o,S(l)):[A(o,!1)]}case"in-flight":return[A(o,!0)];default:return n}}function k(e,t){let o=T(e);if(!o||!o.approved)return;let n=t.approvalIdToToolCallId.get(o.approvalId);if(!(n&&t.toolResults.has(n)))return{role:"tool",content:[{type:"tool-approval-response",approvalId:o.approvalId,approved:!0}]}}function E(e,t){let o=M(e);if(o&&!t.pairedAtRequest.has(o.toolCallId))return S(o)}var F="message",J="tool_approval_request",K="tool_approval_decision",W="tool_result";function P(e){return e==="agent"||e==="assistant"}function X(e){let t=new Set;for(let o of e)!P(o.role)&&o.role!=="system"&&o.senderName&&t.add(o.senderName);return t.size}function Z(e,t){if(!e.content.trim())return;let o=P(e.role),n=!o&&t&&e.senderName?`${e.senderName}: ${e.content}`:e.content;return{role:o?"assistant":"user",content:n}}function ee(e,t,o){switch(e.type){case F:{let n=Z(e,t);return n?[n]:[]}case J:return w(e,o);case K:{let n=k(e,o);return n?[n]:[]}case W:{let n=E(e,o);return n?[n]:[]}default:return[]}}function te(e){let t=X(e)>1,o=C(e);return e.flatMap(n=>ee(n,t,o))}export{U as agent,te as toModelMessages};
@@ -0,0 +1,2 @@
1
+ export { Actions, ActionsElement, Button, ButtonElement, Card, CardChild, CardElement, CardLink, CardText, Divider, DividerElement, LinkElement, Select, SelectElement, SelectOption, SelectOptionElement, TextElement, TextInput, TextInputElement } from 'chat';
2
+ import 'chat/jsx-runtime';
@@ -0,0 +1 @@
1
+ import{a as e,b as t,c as n,d as l,e as i,f as m,g as r,h as o,i as E}from"./chunk-C3P3ZH2I.js";import"./chunk-3XT6S7TZ.js";import"./chunk-FHYMHX3T.js";export{e as Actions,t as Button,n as Card,l as CardLink,i as CardText,m as Divider,r as Select,o as SelectOption,E as TextInput};
@@ -1 +1 @@
1
- import{u as h}from"./chunk-FRWG7YTE.js";import f from"ajv";import y from"ajv-formats";var S=t=>typeof structuredClone=="function"?structuredClone(t):JSON.parse(JSON.stringify(t));var n=class extends h{constructor(a,o){let r=o.length===1?"it":"them";super(`Tried to use a ${a} in @novu/framework without ${o.join(", ")} installed. Please install ${r} by running \`npm install ${o.join(" ")}\`.`);this.statusCode=500;this.code="MissingDependencyError"}};var m=async(t,e)=>{let a=new Set;if((await Promise.allSettled(t.map(r=>r.import))).forEach((r,p)=>{let s=t[p];r.status==="fulfilled"&&s.exports.every(u=>r.value[u]!==void 0)||a.add(s.name)}),a.size>0)throw new n(e,Array.from(a))};var i=class{constructor(){this.requiredImports=[];this.ajv=new f({useDefaults:!0,removeAdditional:"failing",strict:!1}),y(this.ajv),this.compiledSchemas=new Map}async canHandle(e){let a=e.type==="object"||!!e.anyOf||!!e.allOf||!!e.oneOf;return a&&await m(this.requiredImports,"JSON schema"),a}async validate(e,a){let o=this.compiledSchemas.get(a);o||(o=this.ajv.compile(a),this.compiledSchemas.set(a,o));let r=S(e);return o(r)?{success:!0,data:r}:{success:!1,errors:o.errors.map(s=>({path:s.instancePath,message:s.message}))}}async transformToJsonSchema(e){return e}};var c=class{constructor(){this.requiredImports=[{name:"zod",import:import("zod"),exports:["ZodType"]},{name:"zod-to-json-schema",import:import("zod-to-json-schema"),exports:["zodToJsonSchema"]}]}async canHandle(e){let a=e.safeParseAsync!==void 0;return a&&await m(this.requiredImports,"Zod schema"),a}async validate(e,a){let o=await a.safeParseAsync(e);return o.success?{success:!0,data:o.data}:{success:!1,errors:o.error.errors.map(r=>({path:`/${r.path.join("/")}`,message:r.message}))}}async transformToJsonSchema(e){let{zodToJsonSchema:a}=await import("zod-to-json-schema");return a(e)}};var d=new c,l=new i,v=async(t,e)=>{if(await d.canHandle(t))return d.validate(e,t);if(await l.canHandle(t))return l.validate(e,t);throw new Error("Invalid schema")},T=async t=>{if(await d.canHandle(t))return d.transformToJsonSchema(t);if(await l.canHandle(t))return l.transformToJsonSchema(t);throw new Error("Invalid schema")};export{v as a,T as b};
1
+ import{u as h}from"./chunk-FRWG7YTE.js";import f from"ajv";import y from"ajv-formats";var S=t=>typeof structuredClone=="function"?structuredClone(t):JSON.parse(JSON.stringify(t));var n=class extends h{constructor(a,o){let r=o.length===1?"it":"them";super(`Tried to use a ${a} in @novu/framework without ${o.join(", ")} installed. Please install ${r} by running \`npm install ${o.join(" ")}\`.`);this.statusCode=500;this.code="MissingDependencyError"}};var m=async(t,e)=>{let a=new Set;if((await Promise.allSettled(t.map(r=>r.import))).forEach((r,p)=>{let s=t[p];r.status==="fulfilled"&&s.exports.every(u=>r.value[u]!==void 0)||a.add(s.name)}),a.size>0)throw new n(e,Array.from(a))};var i=class{constructor(){this.requiredImports=[];this.ajv=new f({useDefaults:!0,removeAdditional:"failing",strict:!1}),y(this.ajv),this.compiledSchemas=new Map}async canHandle(e){let a=e.type==="object"||!!e.anyOf||!!e.allOf||!!e.oneOf;return a&&await m(this.requiredImports,"JSON schema"),a}async validate(e,a){let o=this.compiledSchemas.get(a);o||(o=this.ajv.compile(a),this.compiledSchemas.set(a,o));let r=S(e);return o(r)?{success:!0,data:r}:{success:!1,errors:o.errors.map(s=>({path:s.instancePath,message:s.message}))}}async transformToJsonSchema(e){return e}};var c=class{constructor(){this.requiredImports=[{name:"zod",import:import("zod"),exports:["ZodType"]},{name:"zod-to-json-schema",import:import("zod-to-json-schema"),exports:["zodToJsonSchema"]}]}async canHandle(e){let a=e.safeParseAsync!==void 0;return a&&await m(this.requiredImports,"Zod schema"),a}async validate(e,a){let o=await a.safeParseAsync(e);return o.success?{success:!0,data:o.data}:{success:!1,errors:o.error.issues.map(r=>({path:`/${r.path.join("/")}`,message:r.message}))}}async transformToJsonSchema(e){let{zodToJsonSchema:a}=await import("zod-to-json-schema");return a(e)}};var d=new c,l=new i,v=async(t,e)=>{if(await d.canHandle(t))return d.validate(e,t);if(await l.canHandle(t))return l.validate(e,t);throw new Error("Invalid schema")},T=async t=>{if(await d.canHandle(t))return d.transformToJsonSchema(t);if(await l.canHandle(t))return l.transformToJsonSchema(t);throw new Error("Invalid schema")};export{v as a,T as b};