@hugex/ai 2.9.6 → 2.9.8

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.
@@ -0,0 +1 @@
1
+ import{Composio as eo}from"@composio/core";import{VercelProvider as io}from"@composio/vercel";import{SessionPreset as J}from"@composio/core";function A(o,n){var t;return(n==null?void 0:n.trim())||((t=o.connectionScope)==null?void 0:t.trim())||void 0}function U(o){let n=o.trim();if(!n)throw new Error("Composio connection scope is required");return n}var q=/https:\/\/connect\.composio\.dev\/link\/[^\s)\]"']+/i,z=/"redirect_?[Uu]rl"\s*:\s*"(https?:\/\/[^"]+)"/;function Y(o){var t;let n=(t=o.publicOrigin)==null?void 0:t.trim();return n?n.replace(/\/$/,""):G(o.env)}function x(o){var i,e,s,c;let n=(e=(i=o.secrets)==null?void 0:i.COMPOSIO_API_KEY)==null?void 0:e.trim();if(n)return n;let t=(c=(s=o.env)==null?void 0:s.COMPOSIO_API_KEY)==null?void 0:c.trim();if(t)return t;throw new Error("COMPOSIO_API_KEY is not configured (register tenant secret or set env COMPOSIO_API_KEY)")}function W(o){if(!o)return[];let n=[];for(let t of Object.values(o))n.push(...C(t.enable));return[...new Set(n)].sort()}function v(o){return JSON.stringify({toolkits:o.toolkits,tools:o.tools,authMode:o.authMode,authConfigs:o.authConfigs,workbench:o.workbench,sessionPreset:o.sessionPreset,sessionPreload:o.sessionPreload})}function $(o,n){var e;let t=Z(o.tools),i=o.sessionPreset==="direct_tools";return{toolkits:o.toolkits,...o.authConfigs?{authConfigs:o.authConfigs}:{},...t?{tools:t}:{},manageConnections:n.manageConnections,workbench:n.workbench,...i?{sessionPreset:J.DIRECT_TOOLS}:{},...!i&&((e=o.sessionPreload)!=null&&e.enabled)?(()=>{let s=W(o.tools);return s.length>0?{preload:{tools:s}}:{}})():{}}}function H(o,n){var i;let t=(i=o==null?void 0:o.context)==null?void 0:i.user;return t!=null&&t.email||t!=null&&t.id?t:n.user}function F(o,n,t){var c,r,l;let i=H(n,o),e=(c=i==null?void 0:i.email)==null?void 0:c.trim();if(e&&e!=="default")return e;if((t==null?void 0:t.allowChatIdFallback)===!1)throw new Error("Composio user ID unavailable \u2014 log in so your tool-editor connections apply to your email");let s=(l=(r=n==null?void 0:n.flowData)==null?void 0:r.chatId)==null?void 0:l.trim();if(s&&s!=="default")return s;throw new Error("Composio user ID unavailable \u2014 log in (access_token cookie) or provide a chat session id")}function V(o){let n=JSON.stringify(o);return(typeof btoa=="function"?btoa(n):Buffer.from(n,"utf8").toString("base64")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function G(o){var t;let n=(t=o==null?void 0:o.ORA_PUBLIC_URL)==null?void 0:t.trim();return n?n.replace(/\/$/,""):"http://localhost:5173"}function L(o,n,t,i){let e=Y(o),s=V({flowId:n??"",sessionId:t??"",toolRowId:i});return`${e}/api/composio/callback?ctx=${encodeURIComponent(s)}`}function C(o){return Array.isArray(o)?o.filter(n=>typeof n=="string"&&!!n.trim()).map(n=>n.trim()):[]}function Q(o,n){var s;let t=o.toUpperCase(),i=(s=t.split("_")[0])==null?void 0:s.toLowerCase();if(!i)return;let e=n.find(c=>c.toLowerCase()===i);return e||n.find(c=>t.startsWith(`${c.toUpperCase()}_`))}function X(o,n){let t={};for(let i of o){let e=Q(i,n);e&&(t[e]||(t[e]=[]),t[e].push(i))}return Object.fromEntries(Object.entries(t).map(([i,e])=>[i,{enable:e}]))}function Z(o){if(!o)return;let n={};for(let[t,i]of Object.entries(o)){let e=C(i.enable),s=C(i.disable);e.length?n[t]={enable:e}:s.length&&(n[t]={disable:s})}return Object.keys(n).length>0?n:void 0}function oo(o,n,t){let i=new Set(n.map(r=>r.trim()).filter(Boolean)),e={};if(o&&typeof o=="object")for(let[r,l]of Object.entries(o)){if(!i.has(r)||!l||typeof l!="object")continue;let u=l,a=C(u.enable),f=C(u.disable);a.length===0&&f.length===0||(e[r]={...a.length?{enable:a}:{},...f.length?{disable:f}:{}})}if(Object.keys(e).length>0)return e;let s=C(t==null?void 0:t.tools);if(s.length===0)return;let c=X(s,n);return Object.keys(c).length>0?c:void 0}function j(o){var r;let n=o&&typeof o=="object"?o:{},t=Array.isArray(n.toolkits)?n.toolkits.filter(l=>typeof l=="string"&&l.trim()):[];if(t.length===0)throw new Error("Composio tool execution.toolkits must be a non-empty string array");let i=oo(n.tools,t,n.preload),e=typeof n.connectionScope=="string"&&n.connectionScope.trim()?n.connectionScope.trim():void 0,s=n.sessionPreset==="direct_tools"?"direct_tools":void 0,c=((r=n.sessionPreload)==null?void 0:r.enabled)===!0?{enabled:!0}:void 0;return{toolkits:t,authMode:n.authMode==="manual"?"manual":"in_app",authConfigs:n.authConfigs,...e?{connectionScope:e}:{},...i?{tools:i}:{},manageConnections:n.manageConnections,workbench:n.workbench??{enable:!0},...s?{sessionPreset:s}:{},...c?{sessionPreload:c}:{}}}function M(o,n){var i,e;return o.authMode==="manual"?!1:{callbackUrl:((e=(i=o.manageConnections)==null?void 0:i.callbackUrl)==null?void 0:e.trim())||n}}function K(o){let n=String((o==null?void 0:o.message)??o??"").toLowerCase();return n.includes("not connected")||n.includes("not authenticated")||n.includes("connection required")||n.includes("no active connection")||n.includes("authorize")||n.includes("authentication")||n.includes("connect link")||n.includes("no connected account")||n.includes("composio_manage_connections")}function no(o){if(typeof o!="string")return;let n=o.trim();if(n.startsWith("http"))return n}function to(o){for(let n of["redirectUrl","redirect_url","composio_link_redirect_url","url","link"]){let t=no(o[n]);if(t)return d(t)??t}}function d(o){if(o&&typeof o=="object"&&!Array.isArray(o)){let i=to(o);return i||d(JSON.stringify(o))}if(typeof o!="string")return;let n=o.match(q);if(n!=null&&n[0])return n[0];let t=o.match(z);if(t!=null&&t[1]){let i=t[1].replace(/\\u0026/g,"&").replace(/\\\//g,"/");return d(i)??i}}function h(o,n){var t;if(typeof o=="string"){let i=o.toLowerCase();for(let e of(n==null?void 0:n.toolkits)??[])if(i.includes(e.toLowerCase()))return e}return(t=n==null?void 0:n.toolkits)==null?void 0:t[0]}function y(o,n,t,i,e){let s=i?d(i)??i.trim():void 0;!s||!s.startsWith("http")||o==null||o({type:"info:composio:auth_required",content:{toolkit:e,redirectUrl:s,toolRowId:n.id}})}function N(o){let n=d(o);if(n)return n;if(typeof o=="string")return d(o);try{return d(JSON.stringify(o))}catch{return}}async function so(o,n,t,i,e,s=!0){var r;let c=await o.toolkits({toolkits:n.toolkits});for(let l of c.items)if(!(l.isNoAuth||(r=l.connection)!=null&&r.isActive))try{let u=await o.authorize(l.slug,{callbackUrl:t});s&&y(e,i,n,u.redirectUrl,l.slug);break}catch(u){`${l.slug}${String(u)}`}}function ro(o,n,t,i,e=!0){let s={};for(let[c,r]of Object.entries(o)){if(!r||typeof r!="object"||typeof r.execute!="function"){s[c]=r;continue}let l=r.execute.bind(r);s[c]={...r,execute:async(...u)=>{try{let a=await l(...u);if(e){let f=N(a);f&&y(i,n,t,f,h(String(a),t))}return a}catch(a){if(K(a)){let f=N(a);y(i,n,t,f,h(String(a),t))}throw a}}}}return s}async function mo(o,n,t,i){var S,O,T,I,_,R;if(o.kind!=="composio")throw new Error(`loadComposioTools: unsupported kind '${o.kind}' for tool '${o.name}'`);let e=j(o.execution),s=x(n),c=e.authMode==="manual",r;if(c){let p=A(e,o.id);if(!p)throw new Error(`Composio manual tool '${o.name}' is missing connection scope (tool id or execution.connectionScope)`);r=U(p)}else r=F(n,t,{allowChatIdFallback:!0});let l=(S=t.flowData)==null?void 0:S.flowId,u=(O=t.flowData)==null?void 0:O.chatId,a=((T=e.manageConnections)==null?void 0:T.callbackUrl)||L(n,l,u,o.id),f=M(e,a),w=new eo({apiKey:s,provider:new io});n.composioSessions||(n.composioSessions={});let E=v(e),D=c?!1:((I=e.workbench)==null?void 0:I.enable)!==!1,g,m=n.composioSessions[o.id];m!=null&&m.sessionId&&m.userId===r&&m.configKey===E?(g=await w.use(m.sessionId),`${m.sessionId}${o.name}${r}`,void 0):(g=await w.create(r,$(e,{manageConnections:f,workbench:{enable:D}})),n.composioSessions[o.id]={sessionId:g.sessionId,userId:r,configKey:E},`${g.sessionId}${o.name}${r}${e.authMode}${e.sessionPreset??"default"}`,(_=e.sessionPreload)!=null&&_.enabled,void 0);try{let p=await g.toolkits({toolkits:e.toolkits});for(let b of p.items){let P=!!(b.isNoAuth||(R=b.connection)!=null&&R.isActive);`${b.slug}${P}${r}`}await so(g,e,a,o,i,!c)}catch(p){`${o.name}${String(p)}`}let k=await g.tools(),B=Array.isArray(k)?Object.fromEntries(k.map(p=>[p.name??p.toolName,p])):k;return ro(B,o,e,i,!c)}export{mo as a};
@@ -0,0 +1,3 @@
1
+ var x=(u=>(u.START_NODE="startNode",u.CLASSIFIER_NODE="classifierNode",u.MEMO_NODE="memoNode",u.LLM_NODE="llmNode",u.ANSWER_NODE="answerNode",u.API_NODE="apiNode",u))(x||{});var R=/^[a-zA-Z][a-zA-Z0-9_]*$/,T=["string","number","boolean","json"];function h(e){let n=e==null?void 0:e.inputs;if(!Array.isArray(n))return[];let i=[],t=new Set;for(let r of n){let s=typeof(r==null?void 0:r.name)=="string"?r.name.trim():"";if(!s||!R.test(s)||t.has(s))continue;t.add(s);let u=T.includes(r==null?void 0:r.type)?r.type:"string";i.push({name:s,label:typeof(r==null?void 0:r.label)=="string"&&r.label.trim()?r.label.trim():void 0,type:u,required:(r==null?void 0:r.required)===!0,default:(r==null?void 0:r.default)??void 0})}return i}function v(e,n){let i=e.label||e.name;switch(e.type){case"number":{let t=typeof n=="number"?n:Number(String(n).trim());return Number.isFinite(t)?{value:t}:{error:`"${i}" must be a number`}}case"boolean":{if(typeof n=="boolean")return{value:n};let t=String(n).trim().toLowerCase();return["true","1","yes","si","s\xED"].includes(t)?{value:!0}:["false","0","no"].includes(t)?{value:!1}:{error:`"${i}" must be true or false`}}case"json":{if(typeof n=="object")return{value:n};try{return{value:JSON.parse(String(n))}}catch{return{error:`"${i}" must be valid JSON`}}}default:return{value:typeof n=="string"?n:String(n)}}}function S(e){return e==null||typeof e=="string"&&e.trim()===""}function k(e,n){let i={},t=[],r=n??{};for(let s of e){let u=r[s.name],f=S(u)?s.default:u;if(S(f)){s.required&&t.push(`"${s.label||s.name}" is required`);continue}let{value:g,error:O}=v(s,f);O?t.push(O):i[s.name]=g}return{values:i,errors:t}}function M(e){return typeof e=="string"?e:e==null?"":typeof e=="object"?JSON.stringify(e):String(e)}function C(e,n,i){let t=n.user_input;if(typeof t=="string"&&t.trim())return t;let r=e.filter(u=>u.name!=="user_input"&&n[u.name]!==void 0).map(u=>`- ${u.label||u.name}: ${M(n[u.name])}`),s=(i==null?void 0:i.trim())||"Automated execution";return r.length>0?`${s}
2
+ ${r.join(`
3
+ `)}`:s}function F(e,n){if(!n)return e;if(e==null)return;let i=n.split("."),t=e;for(let r of i){if(t==null)return;t=t[r]}return t}function L(e){switch(e){case"startNode":return[{name:"user_input",path:"user_input",label:"User input",source:"default"},{name:"images",path:"images",label:"User images",type:"image",source:"default"},{name:"files",path:"files",label:"User docs",type:"file",source:"default"}];case"llmNode":return[{name:"output",path:"",label:"LLM text",source:"default"}];case"apiNode":return[{name:"ok",path:"ok",source:"default"},{name:"status",path:"status",source:"default"},{name:"data",path:"data",source:"default"}];case"classifierNode":return[{name:"classification",path:"classification",source:"default"}];case"memoNode":return[{name:"context",path:"",label:"Retrieved context",source:"default"}];case"answerNode":return[];default:return[]}}function P(e){return e.type!=="startNode"?[]:h(e.data).map(n=>({name:n.name,path:n.name,label:n.label,type:n.type==="json"?"object":n.type,source:"default"}))}function w(e){var r;let n=L(e.type),i=((r=e.data)==null?void 0:r.outVars)||[],t=[...n,...P(e).filter(s=>!n.some(u=>u.name===s.name))];for(let s of i){let u=t.findIndex(f=>f.name===s.name);u>=0?t[u]={...s,source:"user"}:t.push({...s,source:"user"})}return t}function $(e,n){var y,a,d,p,o,l,I;if(e==="user_input")return(y=n.context)==null?void 0:y.user_input;if(e==="images")return(a=n.context)==null?void 0:a.user_images;if(e==="classified_id")return(d=n.context)==null?void 0:d.classified_id;if(e==="files"||e==="file_content")return((p=n.context)==null?void 0:p.files)||((o=n.context)==null?void 0:o.file_content);let i=e.indexOf(".");if(i===-1){let m=e;return n.nodes.find(E=>E.id===m)?(l=n.results)==null?void 0:l[m]:void 0}let t=e.substring(0,i),r=e.substring(i+1),s=n.nodes.find(m=>m.id===t);if(!s)return;let u=w(s),f=r.split(".")[0],g=u.find(m=>m.name===f);if(!g)return;let O=(I=n.results)==null?void 0:I[t],_=F(O,g.path??""),c=r.substring(f.length+1);return c?F(_,c):_}var D="\0__ORA_OB__\0",V="\0__ORA_CB__\0";function W(e,n,i,t){var O,_;if(!e)return e;let r=(t==null?void 0:t.serializeNonStrings)??!1,s=e.replace(/\\\{\{/g,D).replace(/\\\}\}/g,V),u={...i.context||{}};if((O=n.data)!=null&&O.varMapping&&Array.isArray(n.data.varMapping))for(let c of n.data.varMapping){let y=c.var||c.to,a=c.from;if(y&&a){let d=!1,p=!1;if(a==="images")d=!0;else if(a==="files"||a==="file_content")p=!0;else{let l=a.indexOf(".");if(l!==-1){let I=a.substring(0,l),m=a.substring(l+1).split(".")[0],b=i.nodes.find(E=>E.id===I);if(b){let N=w(b).find(A=>A.name===m);(N==null?void 0:N.type)==="image"&&(d=!0),(N==null?void 0:N.type)==="file"&&(p=!0)}}}if(d||p)continue;let o=$(a,i);(o==null||o==="")&&(o=c.default??""),u[y]=o}}let f=/\{\{\s*([^}]+?)\s*\}\}/g;s=s.replace(f,(c,y)=>{var d,p;let a=y.trim();if(a.startsWith("secrets.")){let o=a.slice(8);return i.secrets?Object.prototype.hasOwnProperty.call(i.secrets,o)?i.secrets[o]:((p=t==null?void 0:t.onError)==null||p.call(t,`Secret "${o}" is not defined for this tenant`),c):((d=t==null?void 0:t.onError)==null||d.call(t,`Secret reference {{ ${a} }} cannot be resolved (no secrets context)`),c)}if(Object.prototype.hasOwnProperty.call(u,a)){let o=u[a],l;return typeof o=="string"?l=o:typeof o=="object"&&o!==null?l=r?JSON.stringify(o):JSON.stringify(o,null,2):o!=null?l=r?JSON.stringify(o):String(o):l="",l}return c});let g=s.match(/\{\{\s*[^}]+\s*\}\}/g);return g&&((_=t==null?void 0:t.onError)==null||_.call(t,`Mismatch detected: Unmatched placeholders found: ${g}`)),s=s.split(D).join("{{").split(V).join("}}"),s}export{x as a,R as b,h as c,k as d,C as e,F as f,L as g,w as h,$ as i,W as j};
@@ -0,0 +1 @@
1
+ import{f as N}from"./chunk-C2HAGFXJ.js";import{a as J}from"./chunk-V6JSMX5A.js";import{tool as ot}from"ai";import{z as M}from"zod";import{z as p}from"zod";function j(t){if(t&&typeof t=="object"&&!t.type)return p.object({});if(t.type==="object")if(t.properties){let e={},o=t.required||[];for(let[r,n]of Object.entries(t.properties)){let a=j(n),c=n!=null&&typeof n=="object"&&Object.prototype.hasOwnProperty.call(n,"default");e[r]=c?a.default(n.default):o.includes(r)?a:a.optional()}return p.object(e)}else return p.object({});else if(t.type==="array"&&t.items){let e=j(t.items);return p.array(e)}else{if(t.type==="string")return p.string();if(t.type==="number"||t.type==="integer")return p.number();if(t.type==="boolean")return p.boolean()}return p.any()}var W=/\{\{\s*secrets\.[A-Z][A-Z0-9_]*\s*\}\}/,xt=t=>W.test(t),rt=/\{\{\s*auth\.[A-Z][A-Z0-9_]*\s*\}\}/;var E=t=>W.test(t)||rt.test(t),w=t=>{let e=t.indexOf("?");return e===-1?t:`${t.slice(0,e)}?[redacted-query]`};var st=256*1024,it=3e4,ct=/\{\{\s*([^}]+?)\s*\}\}/g,at=t=>{let e=t.toLowerCase();return e.includes("token")||e.includes("secret")||e.includes("key")||e.includes("password")||e.includes("access")||e==="authorization"},ut=t=>{let e={};for(let o in t)e[o]=at(o)?"[REDACTED]":t[o];return e},I=(t,e)=>{let o=t.indexOf(".");if(o===-1)return e[t];let r=t.slice(0,o),n=t.slice(o+1);if(r in e)return N(e[r],n)},H=(t,e,o)=>t&&t.replace(ct,(r,n)=>{let a=String(n).trim();if(a.startsWith("secrets.")){let f=a.slice(8);return Object.prototype.hasOwnProperty.call(o.secrets,f)?o.secrets[f]:r}if(a.startsWith("auth.")){let f=a.slice(5);return Object.prototype.hasOwnProperty.call(o.auth,f)?o.auth[f]:r}let c=I(a,e);return c==null?"":typeof c=="string"?c:JSON.stringify(c)}),dt=/\{\{\s*((?:secrets|auth)\.[^}\s]+)\s*\}\}/g,lt=(...t)=>{let e=new Set;for(let o of t){if(o==null)continue;let r=typeof o=="string"?o:JSON.stringify(o);for(let n of r.matchAll(dt))e.add(n[1])}return[...e]},T=(t,e,o)=>{if(t==null)return t;if(typeof t=="string"){let r=t.match(/^\s*\{\{\s*([^}]+?)\s*\}\}\s*$/);if(r){let n=r[1].trim();if(n.startsWith("secrets.")){let c=n.slice(8);return Object.prototype.hasOwnProperty.call(o.secrets,c)?o.secrets[c]:t}if(n.startsWith("auth.")){let c=n.slice(5);return Object.prototype.hasOwnProperty.call(o.auth,c)?o.auth[c]:t}return I(n,e)}return H(t,e,o)}if(Array.isArray(t))return t.map(r=>T(r,e,o));if(typeof t=="object"){let r={};for(let n in t)r[n]=T(t[n],e,o);return r}return t},ft=(t,e)=>t?e?/^https?:\/\//i.test(e)?e:t.endsWith("/")&&e.startsWith("/")?t+e.slice(1):!t.endsWith("/")&&!e.startsWith("/")?`${t}/${e}`:t+e:t:e||"",pt=(t,e)=>{if(!e)return t;let o=new URL(t);for(let r in e){let n=e[r];n!==void 0&&(Array.isArray(n)?o.searchParams.set(r,n.join(",")):o.searchParams.set(r,String(n)))}return o.toString()},K=t=>{if(!t)return{};let e={};for(let o in t)t[o]!==void 0&&(e[o]=t[o]);return e},yt=t=>{let e={};for(let o in t){let r=t[o];r!=null&&(e[o]=typeof r=="string"?r:String(r))}return e},gt=(t,e,o)=>{if(!(!t||t.type==="none"||!t.value)){if(t.type==="bearer"){e.Authorization=`Bearer ${t.value}`;return}if(t.type==="apiKey"){let r=t.in||"header",n=t.param||t.header||"X-API-Key";r==="query"?o[n]=t.value:e[n]=t.value}}},mt=(t,e)=>{let o=new TextEncoder().encode(t);if(o.byteLength<=e)return{text:t,truncated:!1};let r=o.slice(0,e);return{text:new TextDecoder("utf-8",{fatal:!1}).decode(r),truncated:!0}};function ht(t,e,o,r){var Z;if(t.kind!=="http")throw new Error(`customHttpTool: unsupported kind '${t.kind}' for tool '${t.name}'`);let n=t.execution||{},a=n.actions&&typeof n.actions=="object"?Object.keys(n.actions):[],c=((Z=n.router)==null?void 0:Z.field)||"action",f=t.inputSchema&&typeof t.inputSchema=="object"&&Object.keys(t.inputSchema).length>0?j(t.inputSchema):M.object({});if(a.length>0&&f instanceof M.ZodObject){let m=M.enum(a);f=f.extend({[c]:m})}let G=t.description||t.label||t.name,y=t.output||{},Q=Number.isFinite(y.maxBytes)&&y.maxBytes>0?y.maxBytes:st;return ot({description:G,inputSchema:f,execute:async m=>{var z;let h={secrets:e.secrets??{},auth:e.userAuth??{}},b={input:m??{},...o.context||{}},u=n,i;if(n.actions&&typeof n.actions=="object"){let s=((z=n.router)==null?void 0:z.field)||"action";if(i=m==null?void 0:m[s],!i||!n.actions[i])return{type:"error",error:`unknown action '${i}' for tool '${t.name}'`,natural:`Tool ${t.name} could not run: missing or unknown action.`};u=n.actions[i]}let C=u.url||ft(n.baseUrl,u.path);if(!C)return{type:"error",error:"missing url",natural:`Tool ${t.name} has no URL configured.`};let V=E(C),F=H(C,b,h),X={...n.headers||{},...u.headers||{}},g=yt(K(T(X,b,h))),Y={...n.query||{},...u.query||{}},P=K(T(Y,b,h)),$=(u.method||n.method||"GET").toUpperCase(),k,v=u.body!==void 0||n.body!==void 0;if($!=="GET"&&$!=="HEAD"&&v){let s=u.body!==void 0?u.body:n.body,d=typeof s=="string"?H(s,b,h):T(s,b,h);k=typeof d=="string"?d:JSON.stringify(d),!g["Content-Type"]&&!g["content-type"]&&(g["Content-Type"]="application/json")}let R=u.auth||n.auth,A=R?{...R,value:R.value?H(String(R.value),b,h):R.value}:void 0;gt(A,g,P);let S=pt(F,P),tt=V?w(S):S,U=lt(F,g,P,k,A==null?void 0:A.value);if(U.length>0){let s=U.map(d=>`{{ ${d} }}`).join(", ");return r==null||r({type:`error:tool:${t.name}:credentials`,content:{tool:t.name,action:i,missing:U}}),{type:"error",error:`unresolved credentials: ${s}`,natural:`Tool ${t.name} could not run because ${s} has no value in this execution. Connect the credential or use a tenant secret so unattended runs can resolve it.`}}let et=Math.min(Number.isFinite(u.timeoutMs)&&u.timeoutMs>0?u.timeoutMs:Number.isFinite(n.timeoutMs)&&n.timeoutMs>0?n.timeoutMs:15e3,it),D={tool:t.name,action:i,stage:"request",url:tt,method:$,headers:ut(g)};JSON.stringify(D),r==null||r({type:`info:tool:${t.name}:request`,content:D});let q=new AbortController,nt=setTimeout(()=>q.abort(),et);try{let s=await fetch(S,{method:$,headers:g,body:k,signal:q.signal}),d=s.headers.get("content-type")||"",O=await s.text(),{text:x,truncated:_}=mt(O,Q),l;if(y.contentType==="text"?l=x:d.includes("application/json")||y.contentType==="json"?(l=J(x),l===null&&x&&(l=x)):l=x,y.jsonPath&&l!==null&&typeof l=="object"&&(l=N(l,y.jsonPath)),!s.ok){let B={tool:t.name,action:i,stage:"http_error",status:s.status};return JSON.stringify(B),r==null||r({type:`error:tool:${t.name}:http`,content:B}),{type:"error",status:s.status,error:`HTTP ${s.status}: ${s.statusText}`,result:l,truncated:_,natural:`${t.name}${i?`:${i}`:""} failed with HTTP ${s.status}.`}}let L={tool:t.name,action:i,stage:"finish",status:s.status,truncated:_};return JSON.stringify(L),r==null||r({type:`info:tool:${t.name}:finish`,content:L}),{type:i||t.name,status:s.status,result:l,truncated:_,natural:`${t.name}${i?`:${i}`:""} completed (HTTP ${s.status}).`}}catch(s){let d=String((s==null?void 0:s.message)??s),O={tool:t.name,action:i,stage:"error",error:d};return JSON.stringify(O),r==null||r({type:`error:tool:${t.name}:execution`,content:O}),{type:"error",error:d,natural:`${t.name}${i?`:${i}`:""} failed: ${d}`}}finally{clearTimeout(nt)}}})}var St=ht;export{xt as a,w as b,j as c,ht as d,St as e};
@@ -1,4 +1,4 @@
1
- import type { ApprovalRequestPayload, EventItem, FlowConfig, Message, StepInfo, TypingMessage } from '../../common/types/agent-types';
1
+ import type { ApprovalRequestPayload, EventItem, FlowConfig, Message, ReasoningMessage, StepInfo, TypingMessage } from '../../common/types/agent-types';
2
2
  export interface AgentState {
3
3
  messages: Message[];
4
4
  events: EventItem[];
@@ -6,6 +6,7 @@ export interface AgentState {
6
6
  status: 'connecting' | 'connected' | 'disconnected';
7
7
  typingMessage: TypingMessage;
8
8
  reasoningMessage: TypingMessage;
9
+ reasoningMessages: ReasoningMessage[];
9
10
  isReasoning: boolean;
10
11
  stepInfo: StepInfo;
11
12
  approvals: Array<{
@@ -37,7 +38,9 @@ export interface AgentActions {
37
38
  clearTyping: () => void;
38
39
  setReasoning: (reasoning: TypingMessage) => void;
39
40
  appendReasoning: (id: string, chunk: string) => void;
41
+ commitReasoning: (ts?: number) => void;
40
42
  clearReasoning: () => void;
43
+ setReasoningMessages: (messages: ReasoningMessage[]) => void;
41
44
  setReasoningActive: (active: boolean) => void;
42
45
  setStep: (step: StepInfo) => void;
43
46
  clearStep: () => void;
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from './client/hooks/useAgent';
2
2
  export * from './client/states/agent-store';
3
- export * from './index.common';
3
+ export * from './common';
4
4
  export * from './common/utils/logc';
package/dist/client.js CHANGED
@@ -1 +1 @@
1
- import{a as d,b as G,c as E,d as $,e as L,f as Se,g as Ae,h as fe}from"./chunk-HAYNUZZB.js";import{a as J,b as Y,c as k,d as K,e as Q,f as X}from"./chunk-OYP6D5VN.js";import{a as z,b as B,c as W,d as Z,e as ee,f as te,g as ne,h as se,i as oe,j as re,k as ae,l as ie,m as ge,n as le,o as pe,p as ce,q as de,r as ue,s as ve,t as ye}from"./chunk-GRZ6ZRHM.js";import{a as P}from"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";import{useAgent as H}from"agents/react";import{useCallback as u,useEffect as j,useMemo as U,useRef as S}from"react";import{create as q}from"zustand";import{devtools as V}from"zustand/middleware";var F={messages:[],events:[],eventsVisible:!1,status:"connecting",typingMessage:null,reasoningMessage:null,isReasoning:!1,stepInfo:null,approvals:[],error:null,flowConfig:null,composioAuth:null};function T(n){return q()(V((t,y)=>({...F,initHistory:e=>t({messages:e}),addEvent:e=>t(o=>({events:[...o.events,{...e,ts:Date.now()}]})),clearEvents:()=>t({events:[]}),setMessages:e=>{t({messages:e})},addMessage:e=>{t(o=>({messages:[...o.messages,e]}))},setTyping:e=>t({typingMessage:e}),appendTyping:(e,o)=>{let i=y().typingMessage;i&&i.id===e?t({typingMessage:{id:e,text:i.text+o}}):t({typingMessage:{id:e,text:o}})},clearTyping:()=>t({typingMessage:null}),setReasoning:e=>t({reasoningMessage:e}),appendReasoning:(e,o)=>{let i=y().reasoningMessage;i&&i.id===e?t({reasoningMessage:{id:e,text:i.text+o}}):t({reasoningMessage:{id:e,text:o}})},clearReasoning:()=>t({reasoningMessage:null,isReasoning:!1}),setReasoningActive:e=>t({isReasoning:e}),setStep:e=>t({stepInfo:e}),clearStep:()=>t({stepInfo:null}),setStatus:e=>t({status:e}),toggleEvents:()=>t(e=>({eventsVisible:!e.eventsVisible})),clearHistory:()=>t({messages:[],typingMessage:null,reasoningMessage:null,isReasoning:!1,stepInfo:null}),addApprovalRequest:e=>{let o={id:`approval-${Date.now()}-${Math.random()}`,toolCallId:e.toolCallId,toolName:e.toolName,args:e.args??{},description:e.description,ts:Date.now(),status:"pending"};t(i=>({approvals:[...i.approvals,o]}))},updateApprovalStatus:({toolCallId:e,status:o})=>{t(i=>({approvals:i.approvals.map(v=>v.toolCallId===e?{...v,status:o}:v)}))},removeApproval:e=>{t(o=>({approvals:o.approvals.filter(i=>i.toolCallId!==e)}))},setError:e=>t({error:e}),setFlowConfig:e=>t({flowConfig:e}),setComposioAuth:e=>t({composioAuth:e}),clearComposioAuth:()=>t({composioAuth:null})}),{name:n,enabled:!0}))}var D=T("agent-store"),M=new Map;function I(n){if(!n)return D;let t=M.get(n);return t||(t=T(`agent-store:${n}`),M.set(n,t)),t}function we(n){let t=U(()=>I(n==null?void 0:n.storeKey),[n==null?void 0:n.storeKey]),y=t(s=>s.typingMessage),e=S(null),o=S(null),i=S(null),v=S(null);j(()=>{e.current=y},[y]);let A=u(s=>{var g;let r=s.trim().slice(0,E);!r||typeof((g=v.current)==null?void 0:g.send)!="function"||v.current.send(d.USER_IDENTITY+":"+r)},[]),l=H({host:n==null?void 0:n.host,basePath:(n==null?void 0:n.basePath)??"/api/agents/base",agent:n==null?void 0:n.agent,name:n==null?void 0:n.name,query:n==null?void 0:n.query,onMessage:s=>{if(typeof s.data!="string")return;let[r,g]=s.data.split("::");if(!r||!g)return;let a=t.getState(),f={[d.SERVER_HISTORY]:p=>{let c=JSON.parse(p);a.setMessages(c.messages)},[d.SERVER_EVENT]:p=>{var R;let c=JSON.parse(p);if((c==null?void 0:c.type)==="info:composio:auth_required"&&((R=c==null?void 0:c.content)!=null&&R.redirectUrl)){let m=c.content;a.setComposioAuth({toolkit:m.toolkit,redirectUrl:m.redirectUrl,toolRowId:m.toolRowId})}a.addEvent({type:"server",...c})},[d.SERVER_ERROR]:p=>{a.setError(p),a.addEvent({type:"error",content:p})},[d.SERVER_TEXT_STREAM]:p=>{o.current?a.appendTyping(o.current,p):(o.current=String(Date.now()),a.setTyping({id:o.current,text:p}))},[d.SERVER_TEXT_STREAM_COMPLETE]:p=>{if(a.setReasoningActive(!1),o.current&&a.typingMessage){let c=a.typingMessage.text;a.addMessage({role:"assistant",type:"text",content:c,id:o.current,ts:Date.now()}),a.clearTyping(),o.current=null}},[d.SERVER_REASONING_STREAM]:p=>{a.setReasoningActive(!0),i.current?a.appendReasoning(i.current,p):(i.current=String(Date.now()),a.setReasoning({id:i.current,text:p}))},[d.SERVER_REASONING_STREAM_COMPLETE]:()=>{i.current=null,a.setReasoningActive(!1)},[d.SERVER_CONFIG]:p=>{a.setFlowConfig(JSON.parse(p))}};f[r]&&f[r](g)},onOpen:()=>{let s=t.getState();s.setStatus("connected"),s.clearTyping(),o.current=null,s.clearReasoning(),i.current=null,s.clearStep(),s.addEvent({type:"connection",content:"Connected to Agent Server"}),n!=null&&n.user&&A(n.user)},onClose:()=>{let s=t.getState();s.setStatus("disconnected"),s.setFlowConfig(null),s.addEvent({type:"connection",content:"Connection closed"})}});v.current=l;let C=u((s,r,g)=>{let a=s.trim();if(!a&&(!r||r.length===0)&&(!g||g.length===0))return;let p=((r==null?void 0:r.length)??0)>0||((g==null?void 0:g.length)??0)>0?JSON.stringify({text:a,images:r,documents:g}):a;l.send(d.USER_MESSAGE+":"+p);let c=t.getState();i.current=null,c.clearReasoning(),c.addMessage({id:String(Date.now())+Math.random(),role:"user",type:"text",content:a,images:r,ts:Date.now()})},[l]),h=u(()=>{t.getState().clearHistory(),l.send(d.USER_CLEAR_HISTORY+":1")},[l]),w=u((s,r)=>{let g=s.trim();g&&l.send(d.USER_AUTH+":"+JSON.stringify({name:g,value:r}))},[l]),x=u(s=>{A(s)},[A]),_=u(()=>t.getState().toggleEvents(),[]),b=u(()=>t.getState().clearEvents(),[]),N=u(s=>{let r=t.getState();r.updateApprovalStatus({toolCallId:s,status:"approved"});let g=JSON.stringify({type:"tool_approval",toolCallId:s,approved:!0});typeof(l==null?void 0:l.send)=="function"&&l.send(g),r.addEvent({type:"approval",content:`Approved tool call ${s}`,ts:Date.now()})},[l]),O=u(s=>{let r=t.getState();r.updateApprovalStatus({toolCallId:s,status:"rejected"});let g=JSON.stringify({type:"tool_approval",toolCallId:s,approved:!1});typeof(l==null?void 0:l.send)=="function"&&l.send(g),r.addEvent({type:"approval",content:`Rejected tool call ${s}`,ts:Date.now()})},[l]);return{connection:l,store:t,send:C,clearHistory:h,sendAuth:w,setIdentity:x,toggleEventsVisible:_,clearEvents:b,approve:N,reject:O}}export{z as GENERATION_PARAM_KEYS,W as GENERATION_PRESETS,E as MAX_USER_IDENTITY_LENGTH,Ae as MODEL_REGISTRY_SNAPSHOT,J as NodeType,B as PRESET_PARAM_KEYS,pe as REASONING_EFFORT_LEVELS,Se as TOOL_REGISTRY_SNAPSHOT,te as applyPresetToOverrides,ye as buildReasoningProviderOptions,Z as deriveParamSupport,I as getAgentStore,k as getDefaultOutVars,K as getEffectiveOutVars,fe as getModelEntry,P as logc,d as messageTypes,se as normalizeEffectiveParams,ce as normalizeReasoning,ae as openAiReasoningParamSupport,re as openAiStandardParamSupport,L as parseUserAuth,G as parseUserMessage,ne as pickNodeOverrides,de as reasoningEffortLevels,ue as reasoningExposable,Q as resolveOutVarRef,ee as resolvePreset,ve as resolveReasoningEffort,X as resolveTemplate,$ as sanitizeUserIdentity,le as stripUnsupportedFromNodeData,oe as toStreamTextSettings,we as useAgent,D as useAgentStore,Y as walkPath,ge as workersAiParamSupport,ie as xaiParamSupport};
1
+ import{a as u,b as Q,c as T,d as X,e as z,f as Ee,g as Te,h as Ie}from"./chunk-76OHKISD.js";import{a as $,b as L,c as Y,d as k,e as K,f as Se,g as fe,h as Ae,i as Re,j as Me}from"./chunk-C2HAGFXJ.js";import{a as B,b as W,c as Z,d as ee,e as te,f as ne,g as se,h as oe,i as re,j as ae,k as ie,l as ge,m as le,n as pe,o as ce,p as ue,q as de,r as ve,s as ye,t as me}from"./chunk-GRZ6ZRHM.js";import{a as G}from"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";import{useAgent as U}from"agents/react";import{useCallback as d,useEffect as P,useMemo as J,useRef as m}from"react";import{create as F}from"zustand";import{devtools as D}from"zustand/middleware";var H={messages:[],events:[],eventsVisible:!1,status:"connecting",typingMessage:null,reasoningMessage:null,reasoningMessages:[],isReasoning:!1,stepInfo:null,approvals:[],error:null,flowConfig:null,composioAuth:null};function C(n){return F()(D((t,y)=>({...H,initHistory:e=>t({messages:e}),addEvent:e=>t(o=>({events:[...o.events,{...e,ts:Date.now()}]})),clearEvents:()=>t({events:[]}),setMessages:e=>{t({messages:e})},addMessage:e=>{t(o=>({messages:[...o.messages,e]}))},setTyping:e=>t({typingMessage:e}),appendTyping:(e,o)=>{let r=y().typingMessage;r&&r.id===e?t({typingMessage:{id:e,text:r.text+o}}):t({typingMessage:{id:e,text:o}})},clearTyping:()=>t({typingMessage:null}),setReasoning:e=>t({reasoningMessage:e}),appendReasoning:(e,o)=>{let r=y().reasoningMessage;r&&r.id===e?t({reasoningMessage:{id:e,text:r.text+o}}):t({reasoningMessage:{id:e,text:o}})},commitReasoning:e=>{t(o=>{var r;return(r=o.reasoningMessage)!=null&&r.text?{reasoningMessages:[...o.reasoningMessages,{...o.reasoningMessage,ts:e??Date.now()}],reasoningMessage:null,isReasoning:!1}:{reasoningMessage:null,isReasoning:!1}})},clearReasoning:()=>t({reasoningMessage:null,isReasoning:!1}),setReasoningMessages:e=>t({reasoningMessages:e}),setReasoningActive:e=>t({isReasoning:e}),setStep:e=>t({stepInfo:e}),clearStep:()=>t({stepInfo:null}),setStatus:e=>t({status:e}),toggleEvents:()=>t(e=>({eventsVisible:!e.eventsVisible})),clearHistory:()=>t({messages:[],typingMessage:null,reasoningMessage:null,reasoningMessages:[],isReasoning:!1,stepInfo:null}),addApprovalRequest:e=>{let o={id:`approval-${Date.now()}-${Math.random()}`,toolCallId:e.toolCallId,toolName:e.toolName,args:e.args??{},description:e.description,ts:Date.now(),status:"pending"};t(r=>({approvals:[...r.approvals,o]}))},updateApprovalStatus:({toolCallId:e,status:o})=>{t(r=>({approvals:r.approvals.map(v=>v.toolCallId===e?{...v,status:o}:v)}))},removeApproval:e=>{t(o=>({approvals:o.approvals.filter(r=>r.toolCallId!==e)}))},setError:e=>t({error:e}),setFlowConfig:e=>t({flowConfig:e}),setComposioAuth:e=>t({composioAuth:e}),clearComposioAuth:()=>t({composioAuth:null})}),{name:n,enabled:!0}))}var j=C("agent-store"),I=new Map;function h(n){if(!n)return j;let t=I.get(n);return t||(t=C(`agent-store:${n}`),I.set(n,t)),t}function qe(n){let t=J(()=>h(n==null?void 0:n.storeKey),[n==null?void 0:n.storeKey]),y=t(s=>s.typingMessage),e=m(null),o=m(null),r=m(null),v=m(0),S=m(null),f=()=>(v.current=Math.max(Date.now(),v.current+1),v.current);P(()=>{e.current=y},[y]);let A=d(s=>{var g;let i=s.trim().slice(0,T);!i||typeof((g=S.current)==null?void 0:g.send)!="function"||S.current.send(u.USER_IDENTITY+":"+i)},[]),l=U({host:n==null?void 0:n.host,basePath:(n==null?void 0:n.basePath)??"/api/agents/base",agent:n==null?void 0:n.agent,name:n==null?void 0:n.name,query:n==null?void 0:n.query,onMessage:s=>{if(typeof s.data!="string")return;let[i,g]=s.data.split("::");if(!i||!g)return;let a=t.getState(),R={[u.SERVER_HISTORY]:p=>{let c=JSON.parse(p);a.setMessages(c.messages),a.setReasoningMessages([])},[u.SERVER_EVENT]:p=>{var E;let c=JSON.parse(p);if((c==null?void 0:c.type)==="info:composio:auth_required"&&((E=c==null?void 0:c.content)!=null&&E.redirectUrl)){let M=c.content;a.setComposioAuth({toolkit:M.toolkit,redirectUrl:M.redirectUrl,toolRowId:M.toolRowId})}a.addEvent({type:"server",...c})},[u.SERVER_ERROR]:p=>{a.setError(p),a.addEvent({type:"error",content:p})},[u.SERVER_TEXT_STREAM]:p=>{o.current?a.appendTyping(o.current,p):(o.current=String(Date.now()),a.setTyping({id:o.current,text:p}))},[u.SERVER_TEXT_STREAM_COMPLETE]:p=>{if(a.setReasoningActive(!1),o.current&&a.typingMessage){let c=a.typingMessage.text;a.addMessage({role:"assistant",type:"text",content:c,id:o.current,ts:f()}),a.clearTyping(),o.current=null}},[u.SERVER_REASONING_STREAM]:p=>{a.setReasoningActive(!0),r.current?a.appendReasoning(r.current,p):(r.current=String(Date.now()),a.setReasoning({id:r.current,text:p}))},[u.SERVER_REASONING_STREAM_COMPLETE]:()=>{a.commitReasoning(f()),r.current=null},[u.SERVER_CONFIG]:p=>{a.setFlowConfig(JSON.parse(p))}};R[i]&&R[i](g)},onOpen:()=>{let s=t.getState();s.setStatus("connected"),s.clearTyping(),o.current=null,s.clearReasoning(),r.current=null,s.clearStep(),s.addEvent({type:"connection",content:"Connected to Agent Server"}),n!=null&&n.user&&A(n.user)},onClose:()=>{let s=t.getState();s.setStatus("disconnected"),s.setFlowConfig(null),s.addEvent({type:"connection",content:"Connection closed"})}});S.current=l;let x=d((s,i,g)=>{let a=s.trim();if(!a&&(!i||i.length===0)&&(!g||g.length===0))return;let p=((i==null?void 0:i.length)??0)>0||((g==null?void 0:g.length)??0)>0?JSON.stringify({text:a,images:i,documents:g}):a;l.send(u.USER_MESSAGE+":"+p);let c=t.getState();r.current=null,c.clearReasoning(),c.addMessage({id:String(Date.now())+Math.random(),role:"user",type:"text",content:a,images:i,ts:f()})},[l]),w=d(()=>{t.getState().clearHistory(),l.send(u.USER_CLEAR_HISTORY+":1")},[l]),_=d((s,i)=>{let g=s.trim();g&&l.send(u.USER_AUTH+":"+JSON.stringify({name:g,value:i}))},[l]),b=d(s=>{A(s)},[A]),N=d(()=>t.getState().toggleEvents(),[]),O=d(()=>t.getState().clearEvents(),[]),q=d(s=>{let i=t.getState();i.updateApprovalStatus({toolCallId:s,status:"approved"});let g=JSON.stringify({type:"tool_approval",toolCallId:s,approved:!0});typeof(l==null?void 0:l.send)=="function"&&l.send(g),i.addEvent({type:"approval",content:`Approved tool call ${s}`,ts:Date.now()})},[l]),V=d(s=>{let i=t.getState();i.updateApprovalStatus({toolCallId:s,status:"rejected"});let g=JSON.stringify({type:"tool_approval",toolCallId:s,approved:!1});typeof(l==null?void 0:l.send)=="function"&&l.send(g),i.addEvent({type:"approval",content:`Rejected tool call ${s}`,ts:Date.now()})},[l]);return{connection:l,store:t,send:x,clearHistory:w,sendAuth:_,setIdentity:b,toggleEventsVisible:N,clearEvents:O,approve:q,reject:V}}export{L as FLOW_INPUT_NAME_RE,B as GENERATION_PARAM_KEYS,Z as GENERATION_PRESETS,T as MAX_USER_IDENTITY_LENGTH,Te as MODEL_REGISTRY_SNAPSHOT,$ as NodeType,W as PRESET_PARAM_KEYS,ce as REASONING_EFFORT_LEVELS,Ee as TOOL_REGISTRY_SNAPSHOT,ne as applyPresetToOverrides,me as buildReasoningProviderOptions,K as buildTriggerMessageText,ee as deriveParamSupport,h as getAgentStore,fe as getDefaultOutVars,Ae as getEffectiveOutVars,Y as getFlowInputDefs,Ie as getModelEntry,G as logc,u as messageTypes,oe as normalizeEffectiveParams,k as normalizeFlowInputs,ue as normalizeReasoning,ie as openAiReasoningParamSupport,ae as openAiStandardParamSupport,z as parseUserAuth,Q as parseUserMessage,se as pickNodeOverrides,de as reasoningEffortLevels,ve as reasoningExposable,Re as resolveOutVarRef,te as resolvePreset,ye as resolveReasoningEffort,Me as resolveTemplate,X as sanitizeUserIdentity,pe as stripUnsupportedFromNodeData,re as toStreamTextSettings,qe as useAgent,j as useAgentStore,Se as walkPath,le as workersAiParamSupport,ge as xaiParamSupport};
@@ -38,6 +38,11 @@ export type TypingMessage = {
38
38
  id: string;
39
39
  text: string;
40
40
  } | null;
41
+ export type ReasoningMessage = {
42
+ id: string;
43
+ text: string;
44
+ ts: number;
45
+ };
41
46
  export type StepInfo = {
42
47
  tool?: string;
43
48
  phase?: string;
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Declarative execution contract shared by every trigger source (manual chat turns,
3
+ * QStash schedules and future provider hooks).
4
+ */
5
+ export type FlowInputType = 'string' | 'number' | 'boolean' | 'json';
6
+ /** A declarative input declared on the Start node and supplied by a trigger. */
7
+ export interface FlowInputDef {
8
+ name: string;
9
+ label?: string;
10
+ type: FlowInputType;
11
+ required?: boolean;
12
+ /** Serialized default: JSON inputs keep their raw text so the designer can edit it. */
13
+ default?: string | number | boolean | null;
14
+ }
15
+ export type FlowInputValues = Record<string, unknown>;
16
+ /** Where a run came from. `manual` covers WS/HTTP turns started by a person. */
17
+ export type TriggerType = 'manual' | 'qstash' | 'execute_now' | 'hook';
18
+ /** Lifecycle of a single run. Mirrored by its notification record. */
19
+ export type RunStatus = 'queued' | 'running' | 'succeeded' | 'failed' | 'skipped';
20
+ /**
21
+ * Normalized unit of work handed to `AgentDO`. One envelope produces at most one
22
+ * effective run: the DO claims `runId` before executing, so duplicate deliveries
23
+ * (QStash retries, provider replays) collapse into a single execution.
24
+ */
25
+ export interface TriggerEnvelope {
26
+ triggerId: string;
27
+ triggerType: TriggerType;
28
+ tenant?: string;
29
+ flowId: string;
30
+ /** User email that owns the session (`flowId::userId` for schedules and hooks). */
31
+ userId: string;
32
+ /** `flowId::sessionId` addresses the DO; schedules and hooks use `sessionId === userId`. */
33
+ sessionId: string;
34
+ runId: string;
35
+ scheduleId?: string;
36
+ inputs: FlowInputValues;
37
+ /** Provider-supplied dedupe key (e.g. `Upstash-Message-Id`). */
38
+ idempotencyKey?: string;
39
+ /** Human label used for the synthesized chat turn and the notification title. */
40
+ label?: string;
41
+ /** Single-use id of the signed gateway request; the agent rejects a repeat of it. */
42
+ nonce?: string;
43
+ }
44
+ /**
45
+ * Body of the signed `hx-ora → ora-[tenant]` dispatch. The gateway owns QStash, resolves the
46
+ * tenant and already registered `runId`, so the tenant only has to authenticate the request and
47
+ * persist the work in the right queue.
48
+ */
49
+ export interface TriggerDispatchRequest {
50
+ tenant: string;
51
+ flowId: string;
52
+ userId: string;
53
+ sessionId?: string;
54
+ runId: string;
55
+ scheduleId?: string;
56
+ triggerType: TriggerType;
57
+ inputs?: FlowInputValues;
58
+ idempotencyKey?: string;
59
+ label?: string;
60
+ }
@@ -41,6 +41,8 @@ export interface UserMessagePayload {
41
41
  mimeType: string;
42
42
  data: string;
43
43
  }[];
44
+ /** Values for the Start node's declarative inputs (schedules, hooks, headless runs). */
45
+ inputs?: Record<string, unknown>;
44
46
  }
45
47
  export declare function parseUserMessage(content: string): UserMessagePayload;
46
48
  export interface UserAuthPayload {
@@ -0,0 +1,19 @@
1
+ import type { FlowInputDef, FlowInputValues } from '../types/trigger-types';
2
+ export declare const FLOW_INPUT_NAME_RE: RegExp;
3
+ /** Reads and sanitizes the declarative inputs stored on a Start node's `data.inputs`. */
4
+ export declare function getFlowInputDefs(startNodeData: any): FlowInputDef[];
5
+ export interface FlowInputResolution {
6
+ values: FlowInputValues;
7
+ errors: string[];
8
+ }
9
+ /**
10
+ * Validates a trigger's raw inputs against the Start node declaration. Applies defaults,
11
+ * coerces to the declared type and drops values that were never declared, so a stale
12
+ * schedule cannot inject variables into a flow that no longer expects them.
13
+ */
14
+ export declare function normalizeFlowInputs(defs: FlowInputDef[], raw: FlowInputValues | undefined): FlowInputResolution;
15
+ /**
16
+ * Builds the chat turn text for a headless trigger. Schedules and hooks reuse the
17
+ * conversation history of `flowId::userId`, so every run has to read as a user turn.
18
+ */
19
+ export declare function buildTriggerMessageText(defs: FlowInputDef[], values: FlowInputValues, label?: string): string;
package/dist/common.d.ts CHANGED
@@ -9,4 +9,6 @@ export * from './common/constants/tools-registry';
9
9
  export * from './common/constants/ai-models';
10
10
  export * from './common/utils/logc';
11
11
  export * from './common/types/var-mapping';
12
+ export * from './common/types/trigger-types';
13
+ export * from './common/utils/flowInputs';
12
14
  export * from './common/utils/templateUtils';
package/dist/common.js CHANGED
@@ -1 +1 @@
1
- import{a as b,b as d,c as e,d as f,e as g,f as G,g as H,h as I}from"./chunk-HAYNUZZB.js";import{a as c,b as h,c as i,d as j,e as k,f as l}from"./chunk-OYP6D5VN.js";import{a as m,b as n,c as o,d as p,e as q,f as r,g as s,h as t,i as u,j as v,k as w,l as x,m as y,n as z,o as A,p as B,q as C,r as D,s as E,t as F}from"./chunk-GRZ6ZRHM.js";import{a}from"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{m as GENERATION_PARAM_KEYS,o as GENERATION_PRESETS,e as MAX_USER_IDENTITY_LENGTH,H as MODEL_REGISTRY_SNAPSHOT,c as NodeType,n as PRESET_PARAM_KEYS,A as REASONING_EFFORT_LEVELS,G as TOOL_REGISTRY_SNAPSHOT,r as applyPresetToOverrides,F as buildReasoningProviderOptions,p as deriveParamSupport,i as getDefaultOutVars,j as getEffectiveOutVars,I as getModelEntry,a as logc,b as messageTypes,t as normalizeEffectiveParams,B as normalizeReasoning,w as openAiReasoningParamSupport,v as openAiStandardParamSupport,g as parseUserAuth,d as parseUserMessage,s as pickNodeOverrides,C as reasoningEffortLevels,D as reasoningExposable,k as resolveOutVarRef,q as resolvePreset,E as resolveReasoningEffort,l as resolveTemplate,f as sanitizeUserIdentity,z as stripUnsupportedFromNodeData,u as toStreamTextSettings,h as walkPath,y as workersAiParamSupport,x as xaiParamSupport};
1
+ import{a as b,b as h,c as i,d as j,e as k,f as K,g as L,h as M}from"./chunk-76OHKISD.js";import{a as c,b as d,c as e,d as f,e as g,f as F,g as G,h as H,i as I,j as J}from"./chunk-C2HAGFXJ.js";import{a as l,b as m,c as n,d as o,e as p,f as q,g as r,h as s,i as t,j as u,k as v,l as w,m as x,n as y,o as z,p as A,q as B,r as C,s as D,t as E}from"./chunk-GRZ6ZRHM.js";import{a}from"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{d as FLOW_INPUT_NAME_RE,l as GENERATION_PARAM_KEYS,n as GENERATION_PRESETS,i as MAX_USER_IDENTITY_LENGTH,L as MODEL_REGISTRY_SNAPSHOT,c as NodeType,m as PRESET_PARAM_KEYS,z as REASONING_EFFORT_LEVELS,K as TOOL_REGISTRY_SNAPSHOT,q as applyPresetToOverrides,E as buildReasoningProviderOptions,g as buildTriggerMessageText,o as deriveParamSupport,G as getDefaultOutVars,H as getEffectiveOutVars,e as getFlowInputDefs,M as getModelEntry,a as logc,b as messageTypes,s as normalizeEffectiveParams,f as normalizeFlowInputs,A as normalizeReasoning,v as openAiReasoningParamSupport,u as openAiStandardParamSupport,k as parseUserAuth,h as parseUserMessage,r as pickNodeOverrides,B as reasoningEffortLevels,C as reasoningExposable,I as resolveOutVarRef,p as resolvePreset,D as resolveReasoningEffort,J as resolveTemplate,j as sanitizeUserIdentity,y as stripUnsupportedFromNodeData,t as toStreamTextSettings,F as walkPath,x as workersAiParamSupport,w as xaiParamSupport};
@@ -0,0 +1 @@
1
+ import{a}from"./chunk-4WAWR4LB.js";import"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{a as loadComposioTools};
@@ -0,0 +1 @@
1
+ import{d as a,e as b}from"./chunk-TK4TFAI5.js";import"./chunk-C2HAGFXJ.js";import"./chunk-V6JSMX5A.js";import"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{a as customHttpTool,b as default};
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export * from './server/tools/tempTool';
3
3
  export * from './server/tools/twitter';
4
4
  export * from './server/tools/vectorize';
5
5
  export * from './server/core/AgentDO';
6
+ export * from './server/core/agentTurn';
6
7
  export * from './server/logic/serverMessages';
7
8
  export * from './server/logic/FlowEngine';
8
9
  export * from './server/utils/apiUtils';
@@ -15,6 +16,11 @@ export * from './server/utils/auth';
15
16
  export * from './server/utils/cookies';
16
17
  export * from './server/api/commons';
17
18
  export * from './server/api/agents';
19
+ export * from './server/api/triggers';
20
+ export * from './server/triggers/dispatch';
21
+ export * from './server/triggers/hookAdapters';
22
+ export * from './server/utils/triggerSignature';
23
+ export * from './server/utils/oraTriggers';
18
24
  export * from './server/api/instances';
19
25
  export * from './server/api/auth';
20
26
  export * from './server/runners/memoNodeRunner';
@@ -23,5 +29,5 @@ export * from './server/runners/startNodeRunner';
23
29
  export * from './server/runners/classifierNodeRunner';
24
30
  export * from './server/runners/llmNodeRunner';
25
31
  export * from './server/sql/agentSQL';
26
- export * from './index.common';
32
+ export * from './common';
27
33
  export * from './common/utils/logc';
package/dist/index.js CHANGED
@@ -1,26 +1,4 @@
1
- import{a as it,b as Ut,c as Kt,d as Wt}from"./chunk-26SLPOG6.js";import{a as zt}from"./chunk-GOWQA2OT.js";import{a as Yt,b as Gt}from"./chunk-4FUIFBZO.js";import{a as uo,b as at,c as mo,d as E,e as xt,f as Et,g as Bt,h as Qt,i as Zt,j as rt,k as Rt,l as St}from"./chunk-57TCP6J4.js";import{a as b,b as et,c as Ee,d as ot,e as bt,f as Jt,g as yo,h as go}from"./chunk-HAYNUZZB.js";import{a as G,b as Be,c as Qe,d as st,e as nt,f as Pt}from"./chunk-OYP6D5VN.js";import{a as Ze,b as Se,c as ve,d as to,e as eo,f as oo,g as Lt,h as so,i as jt,j as no,k as io,l as ao,m as ro,n as lo,o as co,p as fo,q as po,r as Ht,s as Vt,t as qt}from"./chunk-GRZ6ZRHM.js";import{a as Je}from"./chunk-RYHQGPX5.js";import{a as Ke}from"./chunk-R6EKV3WR.js";import{a as ze}from"./chunk-6HY7QUMP.js";import{a as Xe,b as We}from"./chunk-V6JSMX5A.js";import{a as z,b as Y,c as Ye,d as Dt,e as Ge}from"./chunk-G3SGJ7XJ.js";import{a as tt}from"./chunk-U56YWPSI.js";import{a as Xt}from"./chunk-YHXUBVN2.js";import{a as v}from"./chunk-3TXHFKDN.js";import{Agent as Ue}from"agents";import{nanoid as Le}from"nanoid";async function vt(o,e){return o.length?!e||!e.HX_ORA_URL||!e.HX_API_KEY?(console.error("extractDocuments: missing HX_ORA_URL or HX_API_KEY"),o.map(t=>({name:t.name,text:""}))):await Promise.all(o.map(async t=>{try{let n=await fetch(`${e.HX_ORA_URL}/internal/files/extract`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:e.HX_API_KEY},body:JSON.stringify(t)});if(!n.ok)return console.error(`extractDocuments: ${t.name} failed ${n.status}`),{name:t.name,text:""};let a=await n.json();return{name:t.name,text:a.text||""}}catch(n){return console.error(`extractDocuments: ${t.name} threw`,n),{name:t.name,text:""}}})):[]}async function Nt(o,e,s,t,n,a,p){var c,d,u;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});try{let l=await((c=o.getMessages)==null?void 0:c.call(o))??[],{flowId:f,chatId:r,tenant:m}=s.flowData,i=((d=l[l.length-1])==null?void 0:d.type)==="text"?l[l.length-1].content:"NO-TEXT";p==null||p({type:"answer_node",payload:{userMessage:(u=s==null?void 0:s.context)==null?void 0:u.user_input,answer:i}})}catch(l){console.error("answerNodeRunner: failed to emit answer telemetry:",l),t==null||t({type:"debug",content:"Warning: failed to emit answer telemetry"}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(l)}})}n==null||n(e.id,{type:"answerNode",message:"Answer response for: "+e.data.response,saved:!0}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}function K(o,e,s,t,n){var c,d,u;let a=(n==null?void 0:n.callerTag)??"llmNodeRunner",p=(n==null?void 0:n.serializeNonStrings)??!1;try{return Pt(o,e,{context:s.context??{},results:s.results??{},nodes:((d=(c=s.flowData)==null?void 0:c.state)==null?void 0:d.nodes)??[],secrets:(u=n==null?void 0:n.sessionEnv)==null?void 0:u.secrets},{callerTag:a,serializeNonStrings:p,onError:l=>{t==null||t({type:`error:${a}`,content:l})}})}catch(l){return console.error(l),"error"}}var te="[redacted]",Ct=(o,e,s,t,n)=>K(o,e,s,n,{callerTag:"apiNodeRunner",serializeNonStrings:!0,sessionEnv:t});async function Tt(o,e,s,t,n,a,p){var u,l,f,r,m,i;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let c=null,d=Date.now();try{console.log("[apiNodeRunner] context keys:",Object.keys(s.context||{})),console.log("[apiNodeRunner] results keys:",Object.keys(s.results||{}));let g=((u=e.data)==null?void 0:u.url)||"",h=Ct(g,e,s,o,t);if(console.log("[apiNodeRunner] resolved url:",it(g)?Ut(h):h),!h){t==null||t({type:"error:apiNodeRunner",content:"Missing url"}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:"Missing url"}}),n==null||n(e.id,c);return}let w=(((l=e.data)==null?void 0:l.method)||"GET").toUpperCase();console.log("[apiNodeRunner] method:",w);let y=((f=e.data)==null?void 0:f.headers)||{},x={},C={};for(let M in y)if(Object.prototype.hasOwnProperty.call(y,M)){let q=String(y[M]??"");C[M]=it(q),x[M]=Ct(q,e,s,o,t)}let R,k=!1;if(w!=="GET"&&w!=="HEAD"&&((r=e.data)==null?void 0:r.body)!==void 0){let M=typeof e.data.body=="string"?e.data.body:JSON.stringify(e.data.body);k=it(M),R=Ct(M,e,s,o,t),!x["Content-Type"]&&!x["content-type"]&&(x["Content-Type"]="application/json")}let _={};for(let M in x)_[M]=C[M]?te:x[M];console.log("[apiNodeRunner] headers:",JSON.stringify(_)),console.log("[apiNodeRunner] body:",k?te:R),t==null||t({type:"info:apiNodeRunner",content:`${w} ${h}`});let P=Number((m=e.data)==null?void 0:m.timeoutMs),I=new AbortController,$=Number.isFinite(P)&&P>0?setTimeout(()=>I.abort(),P):null,A;try{console.log("[apiNodeRunner] fetching..."),A=await fetch(h,{method:w,headers:x,body:R,signal:I.signal}),console.log("[apiNodeRunner] fetch returned status:",A.status)}finally{$&&clearTimeout($)}let j=A.headers.get("content-type")||"";console.log("[apiNodeRunner] content-type:",j);let N;j.includes("application/json")?N=await A.json():N=await A.text(),console.log("[apiNodeRunner] payload preview:",typeof N=="string"?N.slice(0,200):JSON.stringify(N).slice(0,200)),c={ok:A.ok,status:A.status,data:N};let D=Date.now()-d;p==null||p({type:"api_call",payload:{nodeId:e.id,url:h,method:w,status:A.status,latencyMs:D}}),t==null||t({type:"info:apiNodeRunner",content:`Response ${A.status} (${D}ms)`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}catch(g){console.error("Error processing ApiNode:",g),t==null||t({type:"error:apiNodeRunner",content:`API node execution failed: ${g}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(g)}})}finally{console.log("[apiNodeRunner] final result:",(i=JSON.stringify(c))==null?void 0:i.slice(0,300)),n==null||n(e.id,c)}}import{generateObject as we}from"ai";import{z as ee}from"zod";async function It(o,e,s,t,n,a,p){var g,h,w;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let c=(s==null?void 0:s.context)??{},d=String(((g=e==null?void 0:e.data)==null?void 0:g.input_variable)||"user_input").trim(),u=(c==null?void 0:c[d])??"",l=Array.isArray((h=e==null?void 0:e.data)==null?void 0:h.items)?e.data.items:[];if(l.length===0){t==null||t({type:"error:classifier",content:"ClassifierNode has no items to classify."});return}let f=String((w=l[l.length-1])==null?void 0:w.id);if(!u||String(u).trim().length===0){t==null||t({type:"warning:classifier",content:"No input for classification \u2014 falling back to last item."}),n==null||n(e.id,{classification:f}),s.context=s.context||{},s.context.classified_id=f,a==null||a(s);return}let m=`You are a precise classifier. Given a short user message, identify the category that best matches from the provided list.
2
- If the message is ambiguous or none clearly matches, choose the LAST category in the list.
3
-
4
- Categories:
5
- ${l.map(y=>{let x=y.keywords??y["keywords/topics"]??"",C=Array.isArray(x)?x.join(", "):String(x||"");return`- id: ${y.id}
6
- label: ${y.label}
7
- keywords/topics: ${C}`}).join(`
8
- `)}
9
- `,i=`User message:
10
- """${String(u).trim()}"""
11
-
12
- Select the best matching category id.`;try{let y=Date.now(),x=l.map(A=>String(A.id)),C="gpt_4_1_mini",R=await at(C,o);if(!R)throw new Error(`Model '${C}' not found in registry`);let{modelHandle:k,effectiveParams:_}=R,P=await we({model:k,messages:[{role:"system",content:m},{role:"user",content:i}],schema:ee.object({classification:ee.enum(x).describe("The id of the best matching category")}),temperature:_.temperature??0}),I=Date.now()-y,$=P.object.classification;p==null||p({type:"class_telemetry",payload:{nodeId:e.id,totalLatency:I,model:P.response.modelId,usage:P.usage,options:x}}),p==null||p({type:"class_result",payload:{result:P}}),n==null||n(e.id,{classification:$}),s.context=s.context||{},s.context.classified_id=$,a==null||a(s),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}catch(y){t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(y)}})}}import{stepCountIs as Ne,streamText as Ce}from"ai";import{nanoid as Te}from"nanoid";import"zod";var U=(o,e,s)=>{o.send(e+"::"+s)};function oe(o,e){var t,n,a,p,c,d;let s="";if((t=o.data)!=null&&t.varMapping&&Array.isArray(o.data.varMapping))for(let u of o.data.varMapping){let l=u.from;if(!l)continue;let f=!1;if(l==="files"||l==="file_content")f=!0;else{let r=l.indexOf(".");if(r!==-1){let m=l.substring(0,r),i=l.substring(r+1).split(".")[0],g=(p=(a=(n=e.flowData)==null?void 0:n.state)==null?void 0:a.nodes)==null?void 0:p.find(h=>h.id===m);if(g){let w=st(g).find(y=>y.name===i);(w==null?void 0:w.type)==="file"&&(f=!0)}}}if(f){let r=nt(l,{context:e.context||{},results:e.results||{},nodes:((d=(c=e.flowData)==null?void 0:c.state)==null?void 0:d.nodes)||[]});typeof r=="string"&&r.trim()&&(s+=(s?`
13
-
14
- `:"")+r)}}return s}function se(o,e){var t,n,a,p,c,d;let s=[];if((t=o.data)!=null&&t.varMapping&&Array.isArray(o.data.varMapping))for(let u of o.data.varMapping){let l=u.from;if(!l)continue;let f=!1;if(l==="images")f=!0;else{let r=l.indexOf(".");if(r!==-1){let m=l.substring(0,r),i=l.substring(r+1).split(".")[0],g=(p=(a=(n=e.flowData)==null?void 0:n.state)==null?void 0:a.nodes)==null?void 0:p.find(h=>h.id===m);if(g){let w=st(g).find(y=>y.name===i);(w==null?void 0:w.type)==="image"&&(f=!0)}}}if(f){let r=nt(l,{context:e.context||{},results:e.results||{},nodes:((d=(c=e.flowData)==null?void 0:c.state)==null?void 0:d.nodes)||[]});Array.isArray(r)&&s.push(...r)}}return s}var xe=v({"../tools/composioTool.ts":()=>import("./composioTool-TVURCFXP.js"),"../tools/convertTempMessure.ts":()=>import("./convertTempMessure-5CAGRLBY.js"),"../tools/httpTool.ts":()=>import("./httpTool-NTDDXZZE.js"),"../tools/recall.ts":()=>import("./recall-IABRCSHY.js"),"../tools/skillTool.ts":()=>import("./skillTool-BSQFKZGK.js"),"../tools/tempTool.ts":()=>import("./tempTool-2RXAF56M.js"),"../tools/twitter.ts":()=>import("./twitter-OMDEG7T2.js"),"../tools/vectorize.ts":()=>import("./vectorize-UJXIDL2E.js")});var Re=v({});function Ot(o,e,s,t,n){var p;if(!((p=t.memoryConfig)!=null&&p.enabled)||!t.memoryConfig.toolCache||!s.cacheable||!e||typeof e.execute!="function")return e;let a=e.execute.bind(e);return e.execute=async(c,...d)=>{var r;if(!t.getContextIndex)return a(c,...d);let u=await xt(c),f=(await t.getContextIndex()).find(m=>{if(m.domain!=="tool")return!1;let i=Rt(m.meta);return i.toolName===o&&i.paramsHash===u});if(f){let m=await((r=t.getContext)==null?void 0:r.call(t,f.ref));if((m==null?void 0:m.data)!=null&&Rt(m.meta).truncated!==!0){n==null||n({type:"info:memory:cacheHit",content:{ref:m.ref,toolName:o}});try{return JSON.parse(m.data)}catch{return m.data}}}return a(c,...d)},e}async function Ie(o,e,s,t){var l,f;if(!((l=s.memoryConfig)!=null&&l.enabled)||!s.setContext||s.cycle==null)return;let n=o.toolCalls??[],a=o.toolResults??[];if(!n.length||!a.length)return;let p=new Map;for(let r of a)r!=null&&r.toolCallId&&p.set(r.toolCallId,r);let c=Array.isArray((f=e==null?void 0:e.data)==null?void 0:f.tools)?e.data.tools:[],d=new Map;for(let r of c)r&&typeof r.id=="string"&&d.set(r.id,r);let u=new Map;for(let r of Object.values(s.toolDefs??{}))r&&r.name&&u.set(r.name,r);for(let r of n){let m=r.toolCallId,i=r.toolName,g=p.get(m);if(!i||!g||i==="readSkillRef")continue;let h=r.args??r.input,w=g.result??g.output,y=!1,x="",C="tool",R="",k=u.get(i);k&&k.kind==="skill"&&(y=!0,x=`skill:${i}`,C="skill",R=`Skill instructions for ${i}`),x||(x=await Bt(i,h),R=Et(h,w));let _=d.get(i)??c.find($=>$.id===i),P=await xt(h),I=typeof w=="string"?w:JSON.stringify(w??null);await s.setContext({ref:x,domain:C,description:R,data:I,cycle:s.cycle,meta:JSON.stringify({toolName:i,paramsHash:P,cacheable:(_==null?void 0:_.cacheable)===!0})}),t==null||t({type:"info:memory:updated",content:{ref:x}})}}async function Oe(o,e,s,t){var f;let n=Array.isArray((f=s==null?void 0:s.data)==null?void 0:f.tools)?s.data.tools:[];if(n.length===0)return{};let a={},p=r=>{var x,C;let m=typeof(r==null?void 0:r.description)=="string"?r.description:"",i=r==null?void 0:r.inputSchema,g;try{let R=(i==null?void 0:i.shape)??(typeof((x=i==null?void 0:i._def)==null?void 0:x.shape)=="function"?i._def.shape():(C=i==null?void 0:i._def)==null?void 0:C.shape);R&&typeof R=="object"&&(g=R)}catch{}let h=g?Object.keys(g):[],w=m?`description="${m.length>120?m.slice(0,120)+"\u2026":m}"`:"description=(none)",y=h.length?`inputSchema={${h.join(", ")}}`:"inputSchema=(none)";return`${w} ${y}`},c=(()=>{let r=[],m=[],i=[],g=[];for(let w=0;w<n.length;w++){let y=n[w];!y||typeof y!="object"||typeof y.id!="string"?g.push(w):y.kind==="builtin"?r.push(y.id):y.kind==="skill"?i.push(y.id):y.kind==="http"||y.kind==="mcp"||y.kind==="composio"?m.push(y.id):g.push(w)}let h=[];return r.length&&h.push(`builtin[${r.join(", ")}]`),m.length&&h.push(`custom[${m.join(", ")}]`),i.length&&h.push(`skill[${i.join(", ")}]`),g.length&&h.push(`invalid@[${g.join(", ")}]`),h.join(" ")||"(none)"})();console.log(`[tools] node ${s.id} requested (${n.length}): ${c}`);let d=!1,u=async()=>{if(d&&o.toolDefs)return o.toolDefs;if(!o.env)return o.toolDefs=o.toolDefs||{},d=!0,o.toolDefs;try{let r=await Xt(o.env),m={};for(let i of r)i&&i.id&&(m[i.id]=i);o.toolDefs=m}catch(r){t==null||t({type:"error:llmNodeRunner",content:`Failed to load custom tool defs: ${String(r)}`}),o.toolDefs=o.toolDefs||{}}return d=!0,o.toolDefs},l=[];for(let r=0;r<n.length;r++){let m=n[r];if(!m||typeof m!="object"||typeof m.id!="string"||m.kind!=="builtin"&&m.kind!=="http"&&m.kind!=="mcp"&&m.kind!=="composio"&&m.kind!=="skill"){t==null||t({type:"error:llmNodeRunner",content:`Invalid tool descriptor at index ${r}: expected { kind: 'http'|'mcp'|'composio'|'builtin'|'skill', id: string, params?: any }`});continue}let i=m;if(i.kind!=="builtin"){let h=(await u())[i.id];if(!h){console.error(`[tools] \u2717 custom '${i.id}': not found for tenant`),t==null||t({type:"error:llmNodeRunner",content:`custom tool '${i.id}' not found for this tenant`});continue}if(i.kind==="composio"){try{let y=await zt(h,o,e,t),x=Object.keys(y);for(let[C,R]of Object.entries(y))a[C]=Ot(C,R,i,o,t);console.log(`[tools] \u2713 composio '${i.id}' \u2192 ${x.length} tool(s)`)}catch(y){console.error(`[tools] \u2717 composio '${i.id}': ${String(y)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading composio tool '${i.id}': ${String(y)}`})}continue}if(i.kind==="skill"){if(h.kind!=="skill"){console.error(`[tools] \u2717 skill '${i.id}': row is of kind '${h.kind}', not 'skill'`),t==null||t({type:"error:llmNodeRunner",content:`tool '${i.id}' is not a skill`});continue}let y=h.name;if(a[y]){t==null||t({type:"warn:llmNodeRunner",content:`tool name collision on '${y}' \u2014 builtin/other already registered, skipping skill '${i.id}'`});continue}try{a[y]=Yt(h,o,e,t),l.push(h);let x=typeof h.execution=="string"?JSON.parse(h.execution):h.execution||{},C=Array.isArray(x.references)?x.references.map(R=>R==null?void 0:R.name):[];console.log(`[tools] \u2713 skill '${i.id}' \u2192 '${y}' (refs: ${C.join(", ")||"none"})`),t==null||t({type:"info:skill:registered",content:{skill:y,refCount:C.length,refs:C}})}catch(x){console.error(`[tools] \u2717 skill '${i.id}': ${String(x)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading skill tool '${i.id}': ${String(x)}`})}continue}let w=h.name;if(a[w]){t==null||t({type:"warn:llmNodeRunner",content:`tool name collision on '${w}' \u2014 builtin already registered, skipping custom tool '${i.id}'`});continue}try{let y=Wt(h,o,e,t);a[w]=Ot(w,y,i,o,t),console.log(`[tools] \u2713 custom '${i.id}' \u2192 '${w}'`),console.log(`[tools] ${p(a[w])}`)}catch(y){console.error(`[tools] \u2717 custom '${i.id}': ${String(y)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading custom tool '${i.id}': ${String(y)}`})}continue}if(!Jt[i.id]){console.error(`[tools] \u2717 builtin '${i.id}': not in registry`),t==null||t({type:"error:llmNodeRunner",content:`Tool '${i.id}' not found in registry`});continue}try{let g;try{g=await xe(`../tools/${i.id}.ts`)}catch{g=await Re(`../tools/${i.id}.js`)}let h;if(g[i.id])h=g[i.id];else if(g.default)h=g.default;else if(g.create)h=g.create;else{let _=Object.values(g);_.length>0&&(h=_[0])}if(!h){t==null||t({type:"error:llmNodeRunner",content:`No factory export found for tool '${i.id}'`});continue}let w,y,x={};if(i.params&&typeof i.params=="object"){if(typeof i.params.description=="string"?w=i.params.description:i.params.description!==void 0&&(t==null||t({type:"error:llmNodeRunner",content:`Invalid description for tool '${i.id}' \u2014 must be a string`})),i.params.inputSchema!==void 0){let _=i.params.inputSchema;typeof _=="object"&&(typeof _.safeParse=="function"||_._def)?y=_:typeof _=="object"&&_!==null&&_.type==="object"&&_.properties?(y=Kt(_),y||t==null||t({type:"error:llmNodeRunner",content:`Invalid inputSchema for tool '${i.id}' \u2014 must be a Zod schema or JSON Schema object`})):t==null||t({type:"error:llmNodeRunner",content:`Invalid inputSchema for tool '${i.id}' \u2014 must be a Zod schema or JSON Schema object`})}i.params.defaults!==void 0?typeof i.params.defaults=="object"&&i.params.defaults!==null&&!Array.isArray(i.params.defaults)?x=i.params.defaults:(t==null||t({type:"error:llmNodeRunner",content:`Invalid defaults for tool '${i.id}' \u2014 must be an object`}),x={}):i.params.source!==void 0||i.params.target!==void 0?(t==null||t({type:"error:llmNodeRunner",content:`Invalid params for tool '${i.id}' \u2014 legacy top-level source/target not supported; use params.defaults instead`}),x={}):x={}}let C=h(o,e,x,t);w&&C&&typeof C=="object"&&(C.description=w),y&&C&&typeof C=="object"&&(C.inputSchema=y),a[i.id]=Ot(i.id,C,i,o,t);let R=[];w&&R.push("description"),y&&R.push("inputSchema"),Object.keys(x).length&&R.push(`defaults(${Object.keys(x).join(",")})`);let k=R.length?` [overrides: ${R.join(", ")}]`:"";console.log(`[tools] \u2713 builtin '${i.id}'${k}`),console.log(`[tools] ${p(C)}`)}catch(g){console.error(`[tools] \u2717 builtin '${i.id}': ${String(g)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading tool '${i.id}': ${String(g)}`});continue}}if(l.length>0)if(a.readSkillRef)t==null||t({type:"warn:llmNodeRunner",content:"tool name collision on 'readSkillRef' \u2014 builtin/other already registered, skipping readSkillRef tool"});else try{a.readSkillRef=Gt(o,l,e,t),console.log(`[tools] \u2713 registered readSkillRef tool for ${l.length} skill(s)`),t==null||t({type:"info:skill:readSkillRefRegistered",content:{skills:l.map(r=>r.name)}})}catch(r){console.error(`[tools] \u2717 failed to load readSkillRef tool: ${String(r)}`)}return a}async function _t(o,e,s,t,n,a,p){var P,I,$,A,j;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let c=!1;try{let N=(P=s.flowData)==null?void 0:P.state;if(N&&N.edges&&N.nodes){let D=N.edges.filter(M=>M.source===e.id);if(D.length>0){let M=N.nodes.find(q=>q.id===D[0].target);M&&M.type==="answerNode"&&(c=!0)}}}catch(N){console.error("Error determining next node for streaming:",N)}let d=K(e.data.template,e,s,t,{sessionEnv:o});(!d||!d.trim())&&(d="Answer straight forward to the user, dont offer any other option to continue");let u=d,l="";if((I=o.memoryConfig)!=null&&I.enabled){let N=await(($=o.getContextIndex)==null?void 0:$.call(o))??[];l=Zt(N),d+=l}let f=K(e.data.user_template||"",e,s,t,{sessionEnv:o}),r=N=>N&&Object.fromEntries(Object.keys(N).map(D=>[D,"[redacted]"])),m=o!=null&&o.secrets||o!=null&&o.userAuth?{...o,secrets:r(o.secrets),userAuth:r(o.userAuth)}:o,i=K(e.data.template,e,s,void 0,{sessionEnv:m})||u;i+=l;let g=K(e.data.user_template||"",e,s,void 0,{sessionEnv:m});t==null||t({type:`info:llmNodeRunner:${e.id}`,content:i}),t==null||t({type:`info:llmNodeRunner:${e.id}`,content:g});let h=(A=e==null?void 0:e.data)==null?void 0:A.window_size,w=Number(h);(!Number.isInteger(w)||w<=0)&&(w=5);let y=se(e,s),x=oe(e,s),R=(await((j=o.getMessages)==null?void 0:j.call(o))??[]).slice(-w),k=R.filter(N=>N&&typeof N.role=="string"&&typeof N.content=="string");k.length!==R.length&&console.warn(`Filtered ${R.length-k.length} invalid messages from history`);let _=Fe(k,f,y,x);await _e(d,_,o.conn,t,e,c,n,s,a,o,p)}async function _e(o,e,s,t,n,a,p,c,d,u,l){var r;let f=Date.now();if(!((r=u.env)!=null&&r.AI))throw new Error("AI binding is required for LLM node");return new Promise(async(m,i)=>{var j,N,D,M,q,B,Q;let g,h={},w,y="none",x=!1,C,R=!1,k=!1,_=0,P=0,I=(j=n==null?void 0:n.data)==null?void 0:j.sendReasoning,$=I!==!1;try{let L=(N=n==null?void 0:n.data)==null?void 0:N.model,W=Array.isArray(L)?L[0]:L||"gpt_5_nano",T=Lt(n==null?void 0:n.data),F=await at(W,u,T);if(!F)throw new Error(`Model '${W}' not found in registry`);g=F.modelHandle,h=F.effectiveParams||{},y=F.reasoning.kind;let O=Vt(F.reasoning,(D=n==null?void 0:n.data)==null?void 0:D.reasoningEffort);x=$&&Ht(F.reasoning);let V=typeof((M=n==null?void 0:n.data)==null?void 0:M.reasoningMaxTokens)=="number"?n.data.reasoningMaxTokens:void 0;w=qt(F.provider,{effort:O,exposeReasoning:x,maxTokens:V}),O&&(t==null||t({type:"info:llmNodeRunner:reasoningEffort",content:O})),console.log(`[reasoning] ${JSON.stringify({model:W,provider:F.provider,capability:F.reasoning,requestedEffort:((q=n==null?void 0:n.data)==null?void 0:q.reasoningEffort)??null,resolvedEffort:O??null,sendReasoning:$,exposeReasoning:x,providerOptions:w??null},null,2)}`);for(let H of F.paramAdjustments??[])t==null||t({type:"warn:llmNodeRunner",content:H});t==null||t({type:"info:llmNodeRunner:model",content:W}),t==null||t({type:"info:llmNodeRunner:generationParams",content:{...(B=n==null?void 0:n.data)!=null&&B.generationPreset?{preset:n.data.generationPreset}:{},...h,...y!=="none"?{reasoning:y,configuredSendReasoning:I,sendReasoning:$,exposeReasoning:x,...O?{effort:O}:{}}:{}}})}catch(L){throw t==null||t({type:"error:llmNodeRunner",content:`Model error: ${String(L)}`}),L}let A=await Oe(u,c,n,t);if((Q=u.memoryConfig)!=null&&Q.enabled){let{recall:L}=await import("./recall-IABRCSHY.js");A.recall=L(u,c,void 0,t)}console.log(`[tools] node ${n.id} loaded ${Object.keys(A).length}: ${Object.keys(A).join(", ")||"(none)"}`),t==null||t({type:"info:llmNodeRunner:toolsLoaded",content:{nodeId:n.id,tools:Object.keys(A)}});try{let L=Ce({model:g,system:o,messages:e,stopWhen:(()=>{var H;let F=!!A.readSkillRef?10:5,O=Number(((H=n.data)==null?void 0:H.max_steps)??F),V=Number.isFinite(O)?Math.max(1,Math.min(30,O)):F;return Ne(V)})(),...jt(h),...w?{providerOptions:w}:{},tools:A,onFinish:async T=>{var At,Mt;let F=T.text||"",O=T.reasoningText??((At=T.reasoning)==null?void 0:At.text)??"";if(console.log(`[reasoning] done: deltas=${_} chars=${P} result.reasoningText=${O.length} finishReason=${T.finishReason??"n/a"} reasoningTokens=${((Mt=T.usage)==null?void 0:Mt.reasoningTokens)??"n/a"}`),$&&x&&!R&&O&&s){R=!0;try{U(s,b.SERVER_REASONING_STREAM,O)}catch(he){console.warn("Failed to send finished reasoning over connection",he)}}let V={id:Te(),role:"assistant",type:"text",content:F,ts:Date.now()};a&&(u.setMessages?await u.setMessages(V):t==null||t({type:"error:llmNodeRunner",content:"setMessages callback missing"})),s&&$&&R&&!k&&(k=!0,U(s,b.SERVER_REASONING_STREAM_COMPLETE,JSON.stringify({}))),a&&s&&U(s,b.SERVER_TEXT_STREAM_COMPLETE,JSON.stringify({})),p==null||p((n==null?void 0:n.id)||"llm_result",F),t==null||t({type:"info:llmNodeRunner:onFinish",content:JSON.stringify(T)});let H=Date.now()-f,ge=C?C-f:void 0;l==null||l({type:"llm_telemetry",payload:{nodeId:n.id,totalLatency:H,timeToFirstToken:ge,model:T.response.modelId,usage:T.usage}}),l==null||l({type:"llm_result",payload:{result:T}})},onStepFinish:async T=>{let F=(O,V=200)=>{let H=typeof O=="string"?O:JSON.stringify(O);return H?H.length>V?`${H.slice(0,V)}\u2026(+${H.length-V})`:H:""};if(T.toolCalls&&T.toolCalls.length>0){for(let O of T.toolCalls)console.log(`[tools] \u2192 ${O.toolName}(${F(O.args??O.input)})`);t==null||t({type:`info:llmNodeRunner:toolCalls:${n.id}`,content:JSON.stringify(T.toolCalls)})}if(T.toolResults&&T.toolResults.length>0){for(let O of T.toolResults)console.log(`[tools] \u2190 ${O.toolName} \u2192 ${F(O.result??O.output)}`);t==null||t({type:`info:llmNodeRunner:toolResults:${n.id}`,content:JSON.stringify(T.toolResults)})}await Ie(T,n,u,t)},experimental_onToolCallStart:T=>{var F;t==null||t({type:"tool:execution",content:{nodeId:n.id,toolName:(F=T==null?void 0:T.toolCall)==null?void 0:F.toolName,status:"start"}})},experimental_onToolCallFinish:T=>{var F,O;t==null||t({type:"tool:execution",content:{nodeId:n.id,toolName:(F=T==null?void 0:T.toolCall)==null?void 0:F.toolName,status:((O=T==null?void 0:T.toolOutput)==null?void 0:O.type)==="tool-error"?"error":"success"}})},onError:T=>{t==null||t({type:"error:llmNodeRunner",content:"Execution error"}),i(T)},onChunk:T=>{if(T.chunk.type==="reasoning-delta"){let O=T.chunk.text??T.chunk.delta??"";if(O&&(R=!0,_+=1,P+=O.length,_===1&&console.log("[reasoning] \u2713 first reasoning-delta received")),$&&s&&O)try{U(s,b.SERVER_REASONING_STREAM,O)}catch(V){console.warn("Failed to send reasoning chunk over connection",V)}return}if(T.chunk.type==="text-delta"){if(C||(C=Date.now()),s&&$&&R&&!k){k=!0;try{U(s,b.SERVER_REASONING_STREAM_COMPLETE,JSON.stringify({}))}catch(O){console.warn("Failed to send reasoning complete over connection",O)}}return}l==null||l({type:T.chunk.type,payload:{nodeId:n.id,chunk:T.chunk}});let F=`llm_chunk:${T.chunk.type}`;t==null||t({type:F,content:{...T}})}}),W=async()=>{let T="";for await(let F of L.fullStream)if(F.type==="text-delta"){if(T+=F.text,a&&s)try{U(s,b.SERVER_TEXT_STREAM,F.text)}catch(O){console.warn("Failed to send chunk over connection",O)}}else if(F.type==="finish-step"&&F.finishReason==="tool-calls"){if(a&&s&&T.trim())try{U(s,b.SERVER_TEXT_STREAM_COMPLETE,JSON.stringify({}))}catch(O){console.warn("Failed to flush text segment over connection",O)}T=""}};await Promise.all([L,W()]),m(),t==null||t({type:"node:execution",content:{nodeId:n.id,nodeType:n.type,status:"success"}})}catch(L){t==null||t({type:"node:execution",content:{nodeId:n.id,nodeType:n.type,status:"error",error:String(L)}}),i(L)}})}function Fe(o,e,s,t){let n=!!(s&&s.length>0),a=!!t,p=n||a,d=o.length>0&&o[o.length-1].role==="user"?o[o.length-1]:void 0,u=l=>{let f=[],r="";if(a&&(r+=`[Attached files]
15
- ${t}
16
- [End of attached files]
17
-
18
- `),l&&(r+=l),r&&f.push({type:"text",text:r}),n)for(let m of s)f.push({type:"image",image:m.data,mimeType:m.mimeType});return f};return e&&d&&d.content===e?[...o.slice(0,-1).map(f=>({role:f.role,content:f.content})),{role:"user",content:u(e)}]:e?[...o.map(l=>({role:l.role,content:l.content})),{role:"user",content:u(e)}]:p&&d?[...o.slice(0,-1).map(f=>({role:f.role,content:f.content})),{role:"user",content:u(d.content)}]:o.map(l=>({role:l.role,content:l.content}))}async function Ft(o,e,s,t,n,a,p){var u,l,f,r;console.log(`**** MEMO Node id: ${e.id} ****`),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let c="",d=Date.now();try{if(t==null||t({type:"info:memoNodeRunner",content:"Starting memo node execution"}),((u=s==null?void 0:s.context)==null?void 0:u[e.data.query_key])===void 0){t==null||t({type:"error:memoNodeRunner",content:`Query key ${e.data.query_key} not found in context`}),n==null||n(e.id,c);return}if(!o.env||!o.ctx){t==null||t({type:"error:memoNodeRunner",content:"Missing env or ctx"}),n==null||n(e.id,c);return}if(!e.data.rag_id){t==null||t({type:"error:memoNodeRunner",content:"Missing rag_id"}),n==null||n(e.id,c);return}let m=((l=s==null?void 0:s.context)==null?void 0:l[e.data.query_key])||"";t==null||t({type:"info:memoNodeRunner",content:`Query text: ${m}`}),t==null||t({type:"info:memoNodeRunner",content:"Generating embedding for query"});let i=await Dt(o,m,!0);t==null||t({type:"info:memoNodeRunner",content:`Embedding generated successfully, length: ${i.data[0].length}`});let g=Array.isArray(e.data.rag_id)?e.data.rag_id:[e.data.rag_id],h=[];for(let C of g){t==null||t({type:"info:memoNodeRunner",content:`Executing RAG query with namespace: ${C}`});let R=await o.env[`VDB_${(f=s.flowData)==null?void 0:f.tenant}_1024`].query(i.data[0],{namespace:C,topK:e.data.topk,returnMetadata:"all"});t==null||t({type:"info:memoNodeRunner",content:`RAG query completed for namespace ${C}, matches: ${((r=R.matches)==null?void 0:r.length)||0}`}),Array.isArray(R.matches)&&h.push(...R.matches)}let w=Date.now()-d;c=h.map(C=>{var R;return(R=C.metadata)==null?void 0:R.value}).filter(C=>typeof C=="string").join(`
19
-
20
- `),p==null||p({type:"memo_search",payload:{nodeId:e.id,searchLatencyMs:w,retrievedContext:c}}),t==null||t({type:"info:memoNodeRunner",content:`Context retrieval complete, length: ${c.length}, preview: ${c.substring(0,200)}...`}),t==null||t({type:"info:memoNodeRunner",content:"Memo node execution completed successfully"})}catch(m){console.error("Error processing MemoNode:",m),t==null||t({type:"error:memoNodeRunner",content:`Memo node execution failed: ${m}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(m)}})}finally{n==null||n(e.id,c),t==null||t({type:"info:memoNodeRunner",content:`onResult called with context length: ${c.length}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}}async function $t(o,e,s,t,n,a,p){var u,l,f,r,m,i;console.log(`**** START Node ${e.id} ****`),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}}),t==null||t({type:"info:flow",content:s}),p==null||p({type:"start_node",payload:{userMessage:(u=s==null?void 0:s.context)==null?void 0:u.user_input}});let c=((l=e.data)==null?void 0:l.allow_images)!==!1,d=((f=e.data)==null?void 0:f.allow_documents)!==!1;!c&&(s!=null&&s.context)&&(s.context.user_images=[],a==null||a({...s})),!d&&(s!=null&&s.context)&&(s.context.files="",a==null||a({...s})),n==null||n(e.id,{user_input:(r=s==null?void 0:s.context)==null?void 0:r.user_input,images:c?(m=s==null?void 0:s.context)==null?void 0:m.user_images:[],files:d?(i=s==null?void 0:s.context)==null?void 0:i.files:""}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}function lt(o,e,s){let t=e;async function n(d){let u=d;for(t.executedNodes=t.executedNodes||[],t.context=t.context||{},t.results=t.results||{};u&&u.id;)await a(u),u=Ae(u,t.flowData,t)}async function a(d){var m;let u=c[d.type];if(!u){(m=s==null?void 0:s.onError)==null||m.call(s,`Unknown node type: ${d.type}`);return}let l=i=>{var g;return(g=s==null?void 0:s.onServerEvent)==null?void 0:g.call(s,{...i,ts:Date.now()})},f=i=>{var g,h;if((g=s==null?void 0:s.onTelemetry)==null||g.call(s,i),i.type==="llm_telemetry"||i.type==="class_telemetry"){let w=(h=i.payload)==null?void 0:h.usage;w&&(t.tokenUsage=t.tokenUsage||{promptTokens:0,completionTokens:0,totalTokens:0},t.tokenUsage.promptTokens+=w.promptTokens||0,t.tokenUsage.completionTokens+=w.completionTokens||0,t.tokenUsage.totalTokens+=w.totalTokens||0)}};return await u(o,d,t,l,(i,g)=>{t.results[i]=g},s==null?void 0:s.onChangeState,f)}let p=async d=>{var x,C,R;let u=Date.now(),l=typeof d=="string"?et(d):d,f=(l==null?void 0:l.text)||"",r=(l==null?void 0:l.images)||[],m=(l==null?void 0:l.documents)||[],i=await vt(m,o.env),g=i.length>0?i.map(k=>`--- file: ${k.name} ---
21
- ${k.text}`).join(`
22
-
23
- `):"";t.context={user_input:f,user_images:r,files:g},t.tokenUsage={promptTokens:0,completionTokens:0,totalTokens:0},(x=s==null?void 0:s.onServerEvent)==null||x.call(s,{type:"agent:start",content:"Execution started",timestamp:Date.now()});let{startNode:h,error:w}=$e(t.flowData);if(!h){(C=s==null?void 0:s.onError)==null||C.call(s,w||"Flow Format Error");return}await n(h);let y=Date.now()-u;(R=s==null?void 0:s.onServerEvent)==null||R.call(s,{type:"agent:telemetry",content:{durationMs:y,tokenUsage:t.tokenUsage},timestamp:Date.now()})},c={startNode:$t,classifierNode:It,llmNode:_t,memoNode:Ft,answerNode:Nt,apiNode:Tt};return p}function $e(o){var l;let e=(o==null?void 0:o.state)??o;if(!e||!e.nodes||!e.edges||e.edges.length===0)return{error:"Flow is missing state, nodes, or edges."};let s=e.nodes.filter(f=>f.type==="startNode");if(s.length!==1)return{error:`Flow must include exactly one START node, found ${s.length}.`};let t=s[0],n=e.nodes.filter(f=>f.type==="answerNode");if(n.length===0)return{error:"Flow must include at least one ANSWER node."};let a=new Map;for(let f of e.edges)a.has(f.source)||a.set(f.source,[]),a.get(f.source).push(f.target);let p=new Map;for(let f of e.edges)p.has(f.target)||p.set(f.target,[]),p.get(f.target).push(f.source);let c=ne(t.id,a),d=new Set;for(let f of n){let r=ne(f.id,p);for(let m of r)d.add(m)}let u=[];for(let f of c)if(!d.has(f)){let r=e.nodes.find(m=>m.id===f);if(r){let m=((l=r.data)==null?void 0:l.label)||"";u.push(`${f}(${m},${r.type})`)}}return u.length>0?{error:`The following nodes reachable from START do not lead to any ANSWER node: ${u.join(", ")}`}:{startNode:t}}function ne(o,e){let s=new Set,t=[o];for(s.add(o);t.length>0;){let n=t.shift(),a=e.get(n)||[];for(let p of a)s.has(p)||(s.add(p),t.push(p))}return s}function ke(o,e){var s;return((s=o.state)==null?void 0:s.nodes.find(t=>t.id===e))||null}function Ae(o,e,s){var c;let t=e==null?void 0:e.state;if(!t)return null;let n=t.edges.filter(d=>d.source===o.id);if(n.length===0)return null;let a=n[0].target;if(o.type==="classifierNode"&&((c=s==null?void 0:s.context)!=null&&c.classified_id)){let d=s.context.classified_id,u=n.find(l=>l.sourceHandle===`source-${d}`);u?a=u.target:console.log(`No matching edge, falling back to first: ${a}`)}return ke(e,a)}async function Me(o){o.sql`CREATE TABLE IF NOT EXISTS messages (id TEXT PRIMARY KEY, role TEXT NOT NULL, type TEXT NOT NULL, content TEXT NOT NULL, ts INTEGER NOT NULL)`}async function ct(o,e){o.sql`INSERT INTO messages (id, role, type, content, ts) VALUES (${e.id}, ${e.role}, ${e.type}, ${e.content}, ${e.ts})`}async function X(o){return o.sql`SELECT id, role, type, content, ts FROM messages ORDER BY ts ASC`}async function dt(o){o.sql`DELETE FROM messages`}async function De(o){o.sql`CREATE TABLE IF NOT EXISTS context (
1
+ import{a as dt,b as Zt,c as te,d as ee}from"./chunk-TK4TFAI5.js";import{a as se,b as ne}from"./chunk-4FUIFBZO.js";import{a as oe}from"./chunk-YHXUBVN2.js";import{a as Zo,b as it,c as So,d as at,e as xt,f as Xt,g as Gt,h as zt,i as Wt,j as Bt,k as Rt,l as Yt}from"./chunk-57TCP6J4.js";import{a as P,b as rt,c as bo,d as S,e as Ht,f as St,g as es,h as os}from"./chunk-76OHKISD.js";import{a as B,b as Uo,c as Y,d as Lt,e as jt,f as vo,g as ts,h as ct,i as lt,j as Qt}from"./chunk-C2HAGFXJ.js";import{a as Lo,b as jo,c as Ho,d as Eo,e as qo,f as Vo,g as Et,h as Ko,i as qt,j as Jo,k as Xo,l as Go,m as zo,n as Wo,o as Bo,p as Yo,q as Qo,r as Vt,s as Kt,t as Jt}from"./chunk-GRZ6ZRHM.js";import{a as Oo}from"./chunk-RYHQGPX5.js";import{a as $o}from"./chunk-R6EKV3WR.js";import{a as Mo}from"./chunk-6HY7QUMP.js";import{a as ko,b as Fo}from"./chunk-V6JSMX5A.js";import{a as K,b as W,c as Po,d as bt,e as Do}from"./chunk-G3SGJ7XJ.js";import{a as vt}from"./chunk-4WAWR4LB.js";import{a as nt}from"./chunk-U56YWPSI.js";import{a as st}from"./chunk-3TXHFKDN.js";import{Agent as po}from"agents";import{nanoid as fo}from"nanoid";var U=(o,e,s)=>{o.send(e+"::"+s)};async function We(o){o.sql`CREATE TABLE IF NOT EXISTS messages (id TEXT PRIMARY KEY, role TEXT NOT NULL, type TEXT NOT NULL, content TEXT NOT NULL, ts INTEGER NOT NULL)`}async function re(o,e){o.sql`INSERT INTO messages (id, role, type, content, ts) VALUES (${e.id}, ${e.role}, ${e.type}, ${e.content}, ${e.ts})`}async function J(o){return o.sql`SELECT id, role, type, content, ts FROM messages ORDER BY ts ASC`}async function ut(o){o.sql`DELETE FROM messages`}async function Be(o){o.sql`CREATE TABLE IF NOT EXISTS context (
24
2
  ref TEXT PRIMARY KEY,
25
3
  domain TEXT NOT NULL,
26
4
  description TEXT NOT NULL,
@@ -28,14 +6,37 @@ ${k.text}`).join(`
28
6
  cycle INTEGER NOT NULL,
29
7
  meta TEXT,
30
8
  ts INTEGER NOT NULL
31
- )`}async function ie(o,e){let s=e.data??null,t=s!=null?Qt(s):{data:null,truncated:!1},n=t.truncated?St(e.meta,{truncated:!0}):e.meta??null,a=e.ts??Date.now();o.sql`INSERT INTO context (ref, domain, description, data, cycle, meta, ts)
32
- VALUES (${e.ref}, ${e.domain}, ${e.description}, ${t.data}, ${e.cycle}, ${n}, ${a})
9
+ )`}async function ie(o,e){let s=e.data??null,t=s!=null?zt(s):{data:null,truncated:!1},n=t.truncated?Yt(e.meta,{truncated:!0}):e.meta??null,r=e.ts??Date.now();o.sql`INSERT INTO context (ref, domain, description, data, cycle, meta, ts)
10
+ VALUES (${e.ref}, ${e.domain}, ${e.description}, ${t.data}, ${e.cycle}, ${n}, ${r})
33
11
  ON CONFLICT(ref) DO UPDATE SET
34
12
  domain = excluded.domain,
35
13
  description = excluded.description,
36
14
  data = excluded.data,
37
15
  cycle = excluded.cycle,
38
16
  meta = excluded.meta,
39
- ts = excluded.ts`}async function ft(o){return o.sql`SELECT ref, domain, description, cycle, meta, ts FROM context ORDER BY ts ASC`}async function pt(o,e){return o.sql`SELECT ref, domain, description, data, cycle, meta, ts FROM context WHERE ref = ${e} LIMIT 1`[0]??null}async function ae(o,e){var t;return((t=o.sql`SELECT data FROM context WHERE ref = ${e} LIMIT 1`[0])==null?void 0:t.data)??null}async function re(o,e){let s=o.sql`SELECT ref, domain, description, data, cycle, meta, ts FROM context WHERE ref = ${e} LIMIT 1`;if(s[0])return s[0];let t=o.sql`SELECT ref, domain, description, data, cycle, meta, ts FROM context WHERE ref LIKE ${e+"%"} LIMIT 2`;return t.length===1?t[0]:null}async function le(o,e){o.sql`DELETE FROM context WHERE domain = 'tool' AND cycle <= ${e}`}async function ce(o){var s;return((s=o.sql`SELECT COALESCE(MAX(cycle), 0) AS maxCycle FROM context`[0])==null?void 0:s.maxCycle)??0}async function ut(o){o.sql`DELETE FROM context`}async function de(o){await Me(o),await De(o)}async function mt(o,e){var t,n;let s=(t=e==null?void 0:e.flowData)==null?void 0:t.flowId;if(!(o!=null&&o.HX_CORE_URL)||!s)return{engineState:e,refreshed:!1};try{let a=await Y(s,o),p={...e,flowData:{...a,tenant:e.flowData.tenant,flowId:s,chatId:e.flowData.chatId}},c=a==null?void 0:a.stateVersion,d=typeof c=="number"&&c!==((n=e.flowData)==null?void 0:n.stateVersion);return{engineState:p,refreshed:d}}catch(a){return console.error(`[flowRefresh] fetch failed for flow ${s}:`,a),{engineState:e,refreshed:!1}}}var kt=Object.freeze({});async function Z(o,e){if(!e)return kt;if(o.HX_ORA_URL&&o.HX_API_KEY)try{let n=await fetch(`${o.HX_ORA_URL}/internal/secrets`,{headers:{Authorization:o.HX_API_KEY}});if(n.ok){let a=await n.json();if(a.secrets)return Object.freeze(a.secrets)}else console.warn(`[secrets] API failed with status ${n.status}, falling back to KV`)}catch(n){console.error("[secrets] API request failed, falling back to KV",n)}let s=o.ORA_SECRETS;if(!s)return kt;let t=`${e}:`;try{let n=await s.list({prefix:t,limit:1e3});n.list_complete===!1&&console.warn(`[secrets] tenant=${e} exceeded list page; truncating to first 1000 keys`);let a=await Promise.all(n.keys.map(async c=>{let d=await s.get(c.name);return d!==null?[c.name.slice(t.length),d]:null})),p={};for(let c of a){if(!c)continue;let[d,u]=c;d&&(p[d]=u)}return Object.freeze(p)}catch(n){return console.error("[secrets] failed to load tenant secrets from KV",{tenant:e,err:n}),kt}}import{nanoid as Ds}from"nanoid";function S(o){var n,a;let e=(n=o==null?void 0:o.flowData)==null?void 0:n.state,t=((e==null?void 0:e.nodes)??((a=o==null?void 0:o.flowData)==null?void 0:a.nodes)??[]).find(p=>p.type==="startNode");return t==null?void 0:t.data}async function yt(o,e){return typeof e.cycle=="number"&&Number.isFinite(e.cycle)?e.cycle+1:await ce(o)+1}function gt(o,e,s,t,n){let a=E(S(s));return{...e,memoryConfig:a,cycle:t,setContext:async c=>{await ie(o,c),await(n==null?void 0:n(c.ref))},getContextIndex:async()=>ft(o),getContextData:async c=>ae(o,c),getContext:async c=>pt(o,c),resolveContext:async c=>re(o,c),pruneContext:async c=>le(o,c)}}function ht(o,e){return!o||!o.HX_ORA_URL||!o.HX_API_KEY?Promise.resolve():fetch(`${o.HX_ORA_URL}/internal/sessions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:o.HX_API_KEY},body:JSON.stringify(e)}).catch(s=>{console.error("[sessionIndex] failed to index session",s)})}var wt=async(o,e)=>{fetch(`${e.DW_URL}/q/telemetry/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}),`${JSON.stringify(o)}`};import{nanoid as be}from"nanoid";async function Pe(o,e){var a,p;let s=o.id||o.name||"",[t,n]=s.split("::");if(!t||!n)return null;try{let d=(a=(await z(t,e)).metadata)==null?void 0:a.tenant,u=await Y(t,e),l=(p=o.state)==null?void 0:p.user,f={flowData:{...u,tenant:d,flowId:t,chatId:n},executedNodes:[],context:l?{user:l}:{}};return o.setState({...o.state,engineState:f}),f}catch(c){return console.error("Failed to initialize engine state:",c),null}}async function fe(o,e,s,t){var n,a,p;try{let c=await e.json(),d=c.message;if(!d||typeof d!="string")return new Response(JSON.stringify({error:"Invalid message"}),{status:400,headers:{"content-type":"application/json"}});let u=typeof c.userId=="string"?ot(c.userId):null;u&&!((n=o.state.user)!=null&&n.email)&&o.setState({...o.state,injectedUserId:u});let l=()=>{var N;return((N=o.state.user)==null?void 0:N.email)??u??o.state.injectedUserId??void 0},f=Date.now(),r=[],m=async()=>await X(o),i=async N=>{await ct(o,N)},g={id:be(),role:"user",type:"text",content:d,ts:Date.now()};await i(g);let h={onChangeState:N=>{o.setState({...o.state,engineState:N})},onServerEvent:async N=>{r.push(N)},onTelemetry:async N=>{var D,M,q,B,Q,L;await wt({...N,userId:l(),tenant:((M=(D=o.state.engineState)==null?void 0:D.flowData)==null?void 0:M.tenant)||"",flowId:((B=(q=o.state.engineState)==null?void 0:q.flowData)==null?void 0:B.flowId)||"",sessionId:((L=(Q=o.state.engineState)==null?void 0:Q.flowData)==null?void 0:L.chatId)||""},s)},onError:N=>{o.setState({...o.state,error:N})}},w=async N=>{if(o.state.modelsCache&&o.state.modelsCache[N])return o.state.modelsCache[N];try{let{fetchOraModel:D}=await import("./oraApi-YIJGMXX7.js"),M=await D(N,s);return o.setState({...o.state,modelsCache:{...o.state.modelsCache||{},[N]:M}}),M}catch(D){throw console.error(`Error fetching model ${N}:`,D),D}},y=o.state.engineState;if(y){let{engineState:N,refreshed:D}=await mt(s,y);y=N,D&&o.setState({...o.state,engineState:y,modelsCache:{}})}else if(y=await Pe(o,s),!y)return new Response(JSON.stringify({error:"Failed to initialize agent"}),{status:500,headers:{"content-type":"application/json"}});let x=(a=y==null?void 0:y.flowData)==null?void 0:a.tenant,C=await Z(s,x),R=E(S(y)),k=typeof y.cycle=="number"?y.cycle:0;R.enabled&&(k=await yt(o,y),y={...y,cycle:k},o.setState({...o.state,engineState:y})),o.skillRefCache||(o.skillRefCache=new Map);let _=gt(o,{env:s,ctx:t,conn:void 0,getMessages:m,setMessages:i,getOraModel:w,secrets:C,skillRefCache:o.skillRefCache},y,k);await lt(_,y,h)(d);let{tenant:P,flowId:I,chatId:$}=y.flowData??{};P&&I&&$&&t.waitUntil(ht(s,{id:`${I}::${$}`,tenant:P,flowId:I,sessionId:$,userId:l(),title:d.slice(0,120),turnTs:f,events:r})),(p=_.memoryConfig)!=null&&p.enabled&&_.memoryConfig.mode==="summarize"&&t&&t.waitUntil(rt(o,_,k)),o.setState({...o.state,lastUpdated:new Date});let j=(await m()).reverse().find(N=>N.role==="assistant");return new Response(JSON.stringify({answer:(j==null?void 0:j.content)||""}),{headers:{"content-type":"application/json"}})}catch(c){return new Response(JSON.stringify({error:c.message}),{status:500,headers:{"content-type":"application/json"}})}}async function pe(o){try{return await dt(o),await ut(o),o.skillRefCache&&o.skillRefCache.clear(),o.setState({...o.state,error:"",engineState:void 0,modelsCache:{},lastUpdated:new Date}),new Response(JSON.stringify({success:!0,messages:[]}),{headers:{"content-type":"application/json"}})}catch(e){return new Response(JSON.stringify({error:e.message}),{status:500,headers:{"content-type":"application/json"}})}}var ue=class extends Ue{initialState={user:void 0,injectedUserId:null,sessionId:null,lastUpdated:null,modelsCache:{}};resolveSessionUserId(){var e;return((e=this.state.user)==null?void 0:e.email)??this.state.injectedUserId??void 0}secrets=Object.freeze({});userAuth={};composioSessions={};skillRefCache=new Map;publicOrigin;async onRequest(e){let s=new URL(e.url);if(s.pathname.endsWith("/state"))return new Response(JSON.stringify(this.state),{headers:{"content-type":"application/json"}});if(s.pathname.endsWith("/history")){let t=await X(this);return new Response(JSON.stringify(t),{headers:{"content-type":"application/json"}})}if(s.pathname.endsWith("/context")){let t={"content-type":"application/json","access-control-allow-origin":"*"};if(!e.headers.get("X-User-Payload"))return new Response(JSON.stringify({error:"Unauthorized"}),{status:401,headers:t});let n=s.searchParams.get("ref");if(n){let p=await pt(this,n);return p?new Response(JSON.stringify({entry:p}),{headers:t}):new Response(JSON.stringify({error:"Not found"}),{status:404,headers:t})}let a=await ft(this);return new Response(JSON.stringify({entries:a}),{headers:t})}return e.method==="POST"&&s.pathname.endsWith("/message")?fe(this,e,this.env,this.ctx):e.method==="DELETE"&&s.pathname.endsWith("/clear")?pe(this):new Response("Ready to assist.")}async onConnect(e,s){var r,m,i,g,h;let[t,n]=e.server.split("::"),p=(r=(await z(t,this.env)).metadata)==null?void 0:r.tenant;this.secrets=await Z(this.env,p),this.userAuth={},this.composioSessions={},this.publicOrigin=void 0;let c=null;if(s.request){try{this.publicOrigin=new URL(s.request.url).origin}catch{}let w=s.request.headers.get("X-User-Payload");if(w)try{c=JSON.parse(w)}catch(y){console.warn("Failed to parse X-User-Payload",y)}}let d=await Y(t,this.env);this.setState({...this.state,user:c||null,sessionId:n,engineState:{flowData:{...d,tenant:p,flowId:t,chatId:n},executedNodes:[],context:c?{user:c}:{}}}),c||console.warn("[AgentDO] WebSocket connected without authenticated user \u2014 Composio manual auth requires login (access_token on socket URL)");let u=await X(this);U(e,b.SERVER_HISTORY,JSON.stringify({messages:u}));let f=(((m=d==null?void 0:d.state)==null?void 0:m.nodes)??(d==null?void 0:d.nodes)??[]).find(w=>w.type==="startNode");if(f){let w={allow_images:((i=f.data)==null?void 0:i.allow_images)??!1,allow_documents:((g=f.data)==null?void 0:g.allow_documents)??!1,greeting:(h=f.data)==null?void 0:h.greeting};U(e,b.SERVER_CONFIG,JSON.stringify(w))}}async onMessage(e,s){if(typeof s!="string")return;let t=s.indexOf(":");if(t===-1)return;let n=s.substring(0,t),a=s.substring(t+1);if(!n||!a)return;let c={[b.USER_MESSAGE]:d=>this.onUserMessage(e,d),[b.USER_CLEAR_HISTORY]:()=>this.onClearHistory(e),[b.USER_AUTH]:d=>this.onUserAuth(e,d),[b.USER_IDENTITY]:d=>this.onUserIdentity(e,d)}[n];c&&await c(a)}async onUserMessage(e,s){var C,R,k,_,P;let t=Date.now(),n=[],a=async()=>await X(this),p=async I=>{await ct(this,I)},c=async I=>{if(this.state.modelsCache&&this.state.modelsCache[I])return this.state.modelsCache[I];try{let{fetchOraModel:$}=await import("./oraApi-YIJGMXX7.js"),A=await $(I,this.env);return this.setState({...this.state,modelsCache:{...this.state.modelsCache,[I]:A}}),A}catch($){throw console.error(`Error fetching model ${I}:`,$),$}},d=et(s),u={id:Le(),role:"user",type:"text",content:d.text,images:d.images,ts:Date.now()};await p(u);let l={onChangeState:I=>{this.setState({...this.state,engineState:I})},onServerEvent:async I=>{U(e,b.SERVER_EVENT,JSON.stringify(I)),n.push(I)},onTelemetry:async I=>{var $,A,j,N,D,M;await wt({...I,userId:this.resolveSessionUserId(),tenant:((A=($=this.state.engineState)==null?void 0:$.flowData)==null?void 0:A.tenant)||"",flowId:((N=(j=this.state.engineState)==null?void 0:j.flowData)==null?void 0:N.flowId)||"",sessionId:((M=(D=this.state.engineState)==null?void 0:D.flowData)==null?void 0:M.chatId)||""},this.env)},onError:I=>{U(e,b.SERVER_ERROR,I),this.setState({...this.state,error:I})}};if(Object.keys(this.secrets).length===0){let I=(R=(C=this.state.engineState)==null?void 0:C.flowData)==null?void 0:R.tenant;I&&(this.secrets=await Z(this.env,I))}let f={...this.state.engineState},{engineState:r,refreshed:m}=await mt(this.env,f);f=r,m&&this.setState({...this.state,engineState:f,modelsCache:{}}),this.state.user&&!((k=f.context)!=null&&k.user)&&(f.context={...f.context||{},user:this.state.user});let i=E(S(f)),g=typeof f.cycle=="number"?f.cycle:0;i.enabled&&(g=await yt(this,f),f.cycle=g,this.setState({...this.state,engineState:f}));let h=gt(this,{env:this.env,ctx:this.ctx,conn:e,getMessages:a,setMessages:p,getOraModel:c,secrets:this.secrets,userAuth:this.userAuth,user:this.state.user,composioSessions:this.composioSessions,publicOrigin:this.publicOrigin,skillRefCache:this.skillRefCache},f,g,async I=>{U(e,b.SERVER_EVENT,JSON.stringify({type:"info:memory:updated",content:{ref:I}}))});await lt(h,f,l)(d);let{tenant:w,flowId:y,chatId:x}=f.flowData??{};w&&y&&x&&this.ctx.waitUntil(ht(this.env,{id:`${y}::${x}`,tenant:w,flowId:y,sessionId:x,userId:this.resolveSessionUserId(),title:(_=d.text)==null?void 0:_.slice(0,120),turnTs:t,events:n})),(P=h.memoryConfig)!=null&&P.enabled&&h.memoryConfig.mode==="summarize"&&this.ctx&&this.ctx.waitUntil(rt(this,h,g)),this.setState({...this.state,lastUpdated:new Date})}async onUserIdentity(e,s){let t=ot(s);if(!t){U(e,b.SERVER_ERROR,"Invalid identity payload");return}this.setState({...this.state,injectedUserId:t}),U(e,b.SERVER_EVENT,JSON.stringify({type:"info:identity",content:{set:!0}}))}async onUserAuth(e,s){let t=bt(s);if(!t){U(e,b.SERVER_ERROR,"Invalid auth payload");return}let n=t.value.trim();n===""?delete this.userAuth[t.name]:this.userAuth[t.name]=t.value,U(e,b.SERVER_EVENT,JSON.stringify({type:"info:auth",content:{name:t.name,set:n!==""}}))}async onClearHistory(e){await dt(this),await ut(this),this.userAuth={},this.composioSessions={},this.skillRefCache.clear();let s=this.state.engineState?{...this.state.engineState,cycle:void 0}:void 0;this.setState({...this.state,error:"",engineState:s,modelsCache:{},lastUpdated:new Date}),e&&U(e,b.SERVER_HISTORY,JSON.stringify({messages:[]}))}async onStart(){`${JSON.stringify(this.state)}`,await de(this);let e=await X(this);`${JSON.stringify(e)}`}async onClose(e,s,t,n){console.log(`Session closed: ${this.state.sessionId} ${s} - ${t}`)}async onError(e){console.error("AgentDO encountered an error:",e)}};function xn(o){let e=o.state;if(!e)return null;let s=["startNode","answerNode"];for(let t of s)if(!e.nodes.some(a=>a.type===t))return!1;return e.nodes.find(t=>t.type==="startNode")}import{importSPKI as je,jwtVerify as He}from"jose";function me(o){let e={};if(!o)return e;let s=o.split(";");for(let t of s){let n=t.indexOf("=");if(n>-1){let a=t.slice(0,n).trim(),p=t.slice(n+1).trim();a&&(e[a]=decodeURIComponent(p))}}return e}async function J(o,e,s){let t=me(o.headers.get("cookie")),n=new URL(o.url),a=t.access_token||n.searchParams.get("access_token"),p=await Ve(e,a);if(p.ok){let c=p.payload,d=typeof c.preferred_username=="string"?c.preferred_username.trim():"",u=typeof c.email=="string"?c.email.trim():"";return{id:c.sub,email:d||u,name:c.name,first_name:c.given_name,last_name:c.family_name,tenant:c.tenant,roles:c["ora-roles"],db_name:c.db_name||null,user_id:c.user_id||null}}return null}async function Ve(o,e){if(!e||typeof e!="string")return{ok:!1,payload:null,protectedHeader:null};if(!o.KC_RS256_PK)throw new Error("PK is not defined");let s=`-----BEGIN PUBLIC KEY-----
17
+ ts = excluded.ts`}async function pt(o){return o.sql`SELECT ref, domain, description, cycle, meta, ts FROM context ORDER BY ts ASC`}async function ft(o,e){return o.sql`SELECT ref, domain, description, data, cycle, meta, ts FROM context WHERE ref = ${e} LIMIT 1`[0]??null}async function ae(o,e){var t;return((t=o.sql`SELECT data FROM context WHERE ref = ${e} LIMIT 1`[0])==null?void 0:t.data)??null}async function ce(o,e){let s=o.sql`SELECT ref, domain, description, data, cycle, meta, ts FROM context WHERE ref = ${e} LIMIT 1`;if(s[0])return s[0];let t=o.sql`SELECT ref, domain, description, data, cycle, meta, ts FROM context WHERE ref LIKE ${e+"%"} LIMIT 2`;return t.length===1?t[0]:null}async function le(o,e){o.sql`DELETE FROM context WHERE domain = 'tool' AND cycle <= ${e}`}async function de(o){var s;return((s=o.sql`SELECT COALESCE(MAX(cycle), 0) AS maxCycle FROM context`[0])==null?void 0:s.maxCycle)??0}async function mt(o){o.sql`DELETE FROM context`}async function ue(o){await We(o),await Be(o)}function It(o){return{"Content-Type":"application/json",Authorization:o.HX_API_KEY}}function gt(o){return!!(o!=null&&o.HX_ORA_URL)&&!!(o!=null&&o.HX_API_KEY)}async function Tt(o,e){if(!gt(o))return null;let s=await fetch(`${o.HX_ORA_URL}/internal/runs`,{method:"POST",headers:It(o),body:JSON.stringify(e)});return s.ok?await s.json():(console.error("[oraTriggers] createRun failed",s.status,await s.text().catch(()=>"")),null)}async function pe(o,e){if(!gt(o))return{claimed:!0};let s=await fetch(`${o.HX_ORA_URL}/internal/runs/${encodeURIComponent(e)}/claim`,{method:"POST",headers:It(o)});if(!s.ok){let t=await s.text().catch(()=>"");throw new Error(`claimRun ${e} failed with ${s.status}: ${t}`)}return await s.json()}async function yt(o,e,s,t=3){if(!gt(o))return!0;for(let n=1;n<=t;n++){try{let r=await fetch(`${o.HX_ORA_URL}/internal/runs/${encodeURIComponent(e)}/complete`,{method:"POST",headers:It(o),body:JSON.stringify(s)});if(r.ok)return!0;if(r.status===404)return console.error(`[oraTriggers] completeRun ${e} rejected with 404`),!1;console.warn(`[oraTriggers] completeRun ${e} attempt ${n} failed with ${r.status}`)}catch(r){console.warn(`[oraTriggers] completeRun ${e} attempt ${n} threw`,r)}n<t&&await new Promise(r=>setTimeout(r,250*n))}return console.error(`[oraTriggers] completeRun ${e} exhausted ${t} attempts; hx-ora will time the run out`),!1}async function fe(o,e){if(!gt(o))return Promise.resolve();try{return await Tt(o,e)}catch(s){return console.error("[oraTriggers] recordRun failed",s),null}}var Nt=Object.freeze({});async function ht(o,e){if(!e)return Nt;if(o.HX_ORA_URL&&o.HX_API_KEY)try{let n=await fetch(`${o.HX_ORA_URL}/internal/secrets`,{headers:{Authorization:o.HX_API_KEY}});if(n.ok){let r=await n.json();if(r.secrets)return Object.freeze(r.secrets)}else console.warn(`[secrets] API failed with status ${n.status}, falling back to KV`)}catch(n){console.error("[secrets] API request failed, falling back to KV",n)}let s=o.ORA_SECRETS;if(!s)return Nt;let t=`${e}:`;try{let n=await s.list({prefix:t,limit:1e3});n.list_complete===!1&&console.warn(`[secrets] tenant=${e} exceeded list page; truncating to first 1000 keys`);let r=await Promise.all(n.keys.map(async c=>{let p=await s.get(c.name);return p!==null?[c.name.slice(t.length),p]:null})),i={};for(let c of r){if(!c)continue;let[p,f]=c;p&&(i[p]=f)}return Object.freeze(i)}catch(n){return console.error("[secrets] failed to load tenant secrets from KV",{tenant:e,err:n}),Nt}}import{nanoid as ls}from"nanoid";function v(o){var n,r;let e=(n=o==null?void 0:o.flowData)==null?void 0:n.state,t=((e==null?void 0:e.nodes)??((r=o==null?void 0:o.flowData)==null?void 0:r.nodes)??[]).find(i=>i.type==="startNode");return t==null?void 0:t.data}async function me(o,e){return typeof e.cycle=="number"&&Number.isFinite(e.cycle)?e.cycle+1:await de(o)+1}function ge(o,e,s,t,n){let r=at(v(s));return{...e,memoryConfig:r,cycle:t,setContext:async c=>{await ie(o,c),await(n==null?void 0:n(c.ref))},getContextIndex:async()=>pt(o),getContextData:async c=>ae(o,c),getContext:async c=>ft(o,c),resolveContext:async c=>ce(o,c),pruneContext:async c=>le(o,c)}}import{nanoid as co}from"nanoid";async function ye(o,e){return o.length?!e||!e.HX_ORA_URL||!e.HX_API_KEY?(console.error("extractDocuments: missing HX_ORA_URL or HX_API_KEY"),o.map(t=>({name:t.name,text:""}))):await Promise.all(o.map(async t=>{try{let n=await fetch(`${e.HX_ORA_URL}/internal/files/extract`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:e.HX_API_KEY},body:JSON.stringify(t)});if(!n.ok)return console.error(`extractDocuments: ${t.name} failed ${n.status}`),{name:t.name,text:""};let r=await n.json();return{name:t.name,text:r.text||""}}catch(n){return console.error(`extractDocuments: ${t.name} threw`,n),{name:t.name,text:""}}})):[]}async function Ct(o,e,s,t,n,r,i){var c,p,f;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});try{let u=await((c=o.getMessages)==null?void 0:c.call(o))??[],{flowId:m,chatId:l,tenant:d}=s.flowData,a=((p=u[u.length-1])==null?void 0:p.type)==="text"?u[u.length-1].content:"NO-TEXT";i==null||i({type:"answer_node",payload:{userMessage:(f=s==null?void 0:s.context)==null?void 0:f.user_input,answer:a}})}catch(u){console.error("answerNodeRunner: failed to emit answer telemetry:",u),t==null||t({type:"debug",content:"Warning: failed to emit answer telemetry"}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(u)}})}n==null||n(e.id,{type:"answerNode",message:"Answer response for: "+e.data.response,saved:!0}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}function G(o,e,s,t,n){var c,p,f;let r=(n==null?void 0:n.callerTag)??"llmNodeRunner",i=(n==null?void 0:n.serializeNonStrings)??!1;try{return Qt(o,e,{context:s.context??{},results:s.results??{},nodes:((p=(c=s.flowData)==null?void 0:c.state)==null?void 0:p.nodes)??[],secrets:(f=n==null?void 0:n.sessionEnv)==null?void 0:f.secrets},{callerTag:r,serializeNonStrings:i,onError:u=>{t==null||t({type:`error:${r}`,content:u})}})}catch(u){return console.error(u),"error"}}var he="[redacted]",At=(o,e,s,t,n)=>G(o,e,s,n,{callerTag:"apiNodeRunner",serializeNonStrings:!0,sessionEnv:t});async function _t(o,e,s,t,n,r,i){var f,u,m,l,d,a;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let c=null,p=Date.now();try{console.log("[apiNodeRunner] context keys:",Object.keys(s.context||{})),console.log("[apiNodeRunner] results keys:",Object.keys(s.results||{}));let y=((f=e.data)==null?void 0:f.url)||"",w=At(y,e,s,o,t);if(console.log("[apiNodeRunner] resolved url:",dt(y)?Zt(w):w),!w){t==null||t({type:"error:apiNodeRunner",content:"Missing url"}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:"Missing url"}}),n==null||n(e.id,c);return}let h=(((u=e.data)==null?void 0:u.method)||"GET").toUpperCase();console.log("[apiNodeRunner] method:",h);let g=((m=e.data)==null?void 0:m.headers)||{},x={},I={};for(let D in g)if(Object.prototype.hasOwnProperty.call(g,D)){let V=String(g[D]??"");I[D]=dt(V),x[D]=At(V,e,s,o,t)}let R,$=!1;if(h!=="GET"&&h!=="HEAD"&&((l=e.data)==null?void 0:l.body)!==void 0){let D=typeof e.data.body=="string"?e.data.body:JSON.stringify(e.data.body);$=dt(D),R=At(D,e,s,o,t),!x["Content-Type"]&&!x["content-type"]&&(x["Content-Type"]="application/json")}let O={};for(let D in x)O[D]=I[D]?he:x[D];console.log("[apiNodeRunner] headers:",JSON.stringify(O)),console.log("[apiNodeRunner] body:",$?he:R),t==null||t({type:"info:apiNodeRunner",content:`${h} ${w}`});let M=Number((d=e.data)==null?void 0:d.timeoutMs),b=new AbortController,F=Number.isFinite(M)&&M>0?setTimeout(()=>b.abort(),M):null,k;try{console.log("[apiNodeRunner] fetching..."),k=await fetch(w,{method:h,headers:x,body:R,signal:b.signal}),console.log("[apiNodeRunner] fetch returned status:",k.status)}finally{F&&clearTimeout(F)}let A=k.headers.get("content-type")||"";console.log("[apiNodeRunner] content-type:",A);let N;A.includes("application/json")?N=await k.json():N=await k.text(),console.log("[apiNodeRunner] payload preview:",typeof N=="string"?N.slice(0,200):JSON.stringify(N).slice(0,200)),c={ok:k.ok,status:k.status,data:N};let L=Date.now()-p;i==null||i({type:"api_call",payload:{nodeId:e.id,url:w,method:h,status:k.status,latencyMs:L}}),t==null||t({type:"info:apiNodeRunner",content:`Response ${k.status} (${L}ms)`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}catch(y){console.error("Error processing ApiNode:",y),t==null||t({type:"error:apiNodeRunner",content:`API node execution failed: ${y}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(y)}})}finally{console.log("[apiNodeRunner] final result:",(a=JSON.stringify(c))==null?void 0:a.slice(0,300)),n==null||n(e.id,c)}}import{generateObject as Ye}from"ai";import{z as we}from"zod";async function Ot(o,e,s,t,n,r,i){var y,w,h;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let c=(s==null?void 0:s.context)??{},p=String(((y=e==null?void 0:e.data)==null?void 0:y.input_variable)||"user_input").trim(),f=(c==null?void 0:c[p])??"",u=Array.isArray((w=e==null?void 0:e.data)==null?void 0:w.items)?e.data.items:[];if(u.length===0){t==null||t({type:"error:classifier",content:"ClassifierNode has no items to classify."});return}let m=String((h=u[u.length-1])==null?void 0:h.id);if(!f||String(f).trim().length===0){t==null||t({type:"warning:classifier",content:"No input for classification \u2014 falling back to last item."}),n==null||n(e.id,{classification:m}),s.context=s.context||{},s.context.classified_id=m,r==null||r(s);return}let d=`You are a precise classifier. Given a short user message, identify the category that best matches from the provided list.
18
+ If the message is ambiguous or none clearly matches, choose the LAST category in the list.
19
+
20
+ Categories:
21
+ ${u.map(g=>{let x=g.keywords??g["keywords/topics"]??"",I=Array.isArray(x)?x.join(", "):String(x||"");return`- id: ${g.id}
22
+ label: ${g.label}
23
+ keywords/topics: ${I}`}).join(`
24
+ `)}
25
+ `,a=`User message:
26
+ """${String(f).trim()}"""
27
+
28
+ Select the best matching category id.`;try{let g=Date.now(),x=u.map(k=>String(k.id)),I="gpt_4_1_mini",R=await it(I,o);if(!R)throw new Error(`Model '${I}' not found in registry`);let{modelHandle:$,effectiveParams:O}=R,M=await Ye({model:$,messages:[{role:"system",content:d},{role:"user",content:a}],schema:we.object({classification:we.enum(x).describe("The id of the best matching category")}),temperature:O.temperature??0}),b=Date.now()-g,F=M.object.classification;i==null||i({type:"class_telemetry",payload:{nodeId:e.id,totalLatency:b,model:M.response.modelId,usage:M.usage,options:x}}),i==null||i({type:"class_result",payload:{result:M}}),n==null||n(e.id,{classification:F}),s.context=s.context||{},s.context.classified_id=F,r==null||r(s),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}catch(g){t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(g)}})}}import{stepCountIs as Se,streamText as ve}from"ai";import{nanoid as to}from"nanoid";import"zod";function xe(o,e){var t,n,r,i,c,p;let s="";if((t=o.data)!=null&&t.varMapping&&Array.isArray(o.data.varMapping))for(let f of o.data.varMapping){let u=f.from;if(!u)continue;let m=!1;if(u==="files"||u==="file_content")m=!0;else{let l=u.indexOf(".");if(l!==-1){let d=u.substring(0,l),a=u.substring(l+1).split(".")[0],y=(i=(r=(n=e.flowData)==null?void 0:n.state)==null?void 0:r.nodes)==null?void 0:i.find(w=>w.id===d);if(y){let h=ct(y).find(g=>g.name===a);(h==null?void 0:h.type)==="file"&&(m=!0)}}}if(m){let l=lt(u,{context:e.context||{},results:e.results||{},nodes:((p=(c=e.flowData)==null?void 0:c.state)==null?void 0:p.nodes)||[]});typeof l=="string"&&l.trim()&&(s+=(s?`
29
+
30
+ `:"")+l)}}return s}function Re(o,e){var t,n,r,i,c,p;let s=[];if((t=o.data)!=null&&t.varMapping&&Array.isArray(o.data.varMapping))for(let f of o.data.varMapping){let u=f.from;if(!u)continue;let m=!1;if(u==="images")m=!0;else{let l=u.indexOf(".");if(l!==-1){let d=u.substring(0,l),a=u.substring(l+1).split(".")[0],y=(i=(r=(n=e.flowData)==null?void 0:n.state)==null?void 0:r.nodes)==null?void 0:i.find(w=>w.id===d);if(y){let h=ct(y).find(g=>g.name===a);(h==null?void 0:h.type)==="image"&&(m=!0)}}}if(m){let l=lt(u,{context:e.context||{},results:e.results||{},nodes:((p=(c=e.flowData)==null?void 0:c.state)==null?void 0:p.nodes)||[]});Array.isArray(l)&&s.push(...l)}}return s}var Qe=st({"../tools/composioTool.ts":()=>import("./composioTool-44B637WM.js"),"../tools/convertTempMessure.ts":()=>import("./convertTempMessure-5CAGRLBY.js"),"../tools/httpTool.ts":()=>import("./httpTool-SFK4FG4Q.js"),"../tools/recall.ts":()=>import("./recall-IABRCSHY.js"),"../tools/skillTool.ts":()=>import("./skillTool-BSQFKZGK.js"),"../tools/tempTool.ts":()=>import("./tempTool-2RXAF56M.js"),"../tools/twitter.ts":()=>import("./twitter-OMDEG7T2.js"),"../tools/vectorize.ts":()=>import("./vectorize-UJXIDL2E.js")});var Ze=st({});function $t(o,e,s,t,n){var i;if(!((i=t.memoryConfig)!=null&&i.enabled)||!t.memoryConfig.toolCache||!s.cacheable||!e||typeof e.execute!="function")return e;let r=e.execute.bind(e);return e.execute=async(c,...p)=>{var l;if(!t.getContextIndex)return r(c,...p);let f=await xt(c),m=(await t.getContextIndex()).find(d=>{if(d.domain!=="tool")return!1;let a=Rt(d.meta);return a.toolName===o&&a.paramsHash===f});if(m){let d=await((l=t.getContext)==null?void 0:l.call(t,m.ref));if((d==null?void 0:d.data)!=null&&Rt(d.meta).truncated!==!0){n==null||n({type:"info:memory:cacheHit",content:{ref:d.ref,toolName:o}});try{return JSON.parse(d.data)}catch{return d.data}}}return r(c,...p)},e}async function eo(o,e,s,t){var u,m;if(!((u=s.memoryConfig)!=null&&u.enabled)||!s.setContext||s.cycle==null)return;let n=o.toolCalls??[],r=o.toolResults??[];if(!n.length||!r.length)return;let i=new Map;for(let l of r)l!=null&&l.toolCallId&&i.set(l.toolCallId,l);let c=Array.isArray((m=e==null?void 0:e.data)==null?void 0:m.tools)?e.data.tools:[],p=new Map;for(let l of c)l&&typeof l.id=="string"&&p.set(l.id,l);let f=new Map;for(let l of Object.values(s.toolDefs??{}))l&&l.name&&f.set(l.name,l);for(let l of n){let d=l.toolCallId,a=l.toolName,y=i.get(d);if(!a||!y||a==="readSkillRef")continue;let w=l.args??l.input,h=y.result??y.output,g=!1,x="",I="tool",R="",$=f.get(a);$&&$.kind==="skill"&&(g=!0,x=`skill:${a}`,I="skill",R=`Skill instructions for ${a}`),x||(x=await Gt(a,w),R=Xt(w,h));let O=p.get(a)??c.find(F=>F.id===a),M=await xt(w),b=typeof h=="string"?h:JSON.stringify(h??null);await s.setContext({ref:x,domain:I,description:R,data:b,cycle:s.cycle,meta:JSON.stringify({toolName:a,paramsHash:M,cacheable:(O==null?void 0:O.cacheable)===!0})}),t==null||t({type:"info:memory:updated",content:{ref:x}})}}async function oo(o,e,s,t){var m;let n=Array.isArray((m=s==null?void 0:s.data)==null?void 0:m.tools)?s.data.tools:[];if(n.length===0)return{};let r={},i=l=>{var x,I;let d=typeof(l==null?void 0:l.description)=="string"?l.description:"",a=l==null?void 0:l.inputSchema,y;try{let R=(a==null?void 0:a.shape)??(typeof((x=a==null?void 0:a._def)==null?void 0:x.shape)=="function"?a._def.shape():(I=a==null?void 0:a._def)==null?void 0:I.shape);R&&typeof R=="object"&&(y=R)}catch{}let w=y?Object.keys(y):[],h=d?`description="${d.length>120?d.slice(0,120)+"\u2026":d}"`:"description=(none)",g=w.length?`inputSchema={${w.join(", ")}}`:"inputSchema=(none)";return`${h} ${g}`},c=(()=>{let l=[],d=[],a=[],y=[];for(let h=0;h<n.length;h++){let g=n[h];!g||typeof g!="object"||typeof g.id!="string"?y.push(h):g.kind==="builtin"?l.push(g.id):g.kind==="skill"?a.push(g.id):g.kind==="http"||g.kind==="mcp"||g.kind==="composio"?d.push(g.id):y.push(h)}let w=[];return l.length&&w.push(`builtin[${l.join(", ")}]`),d.length&&w.push(`custom[${d.join(", ")}]`),a.length&&w.push(`skill[${a.join(", ")}]`),y.length&&w.push(`invalid@[${y.join(", ")}]`),w.join(" ")||"(none)"})();console.log(`[tools] node ${s.id} requested (${n.length}): ${c}`);let p=!1,f=async()=>{if(p&&o.toolDefs)return o.toolDefs;if(!o.env)return o.toolDefs=o.toolDefs||{},p=!0,o.toolDefs;try{let l=await oe(o.env),d={};for(let a of l)a&&a.id&&(d[a.id]=a);o.toolDefs=d}catch(l){t==null||t({type:"error:llmNodeRunner",content:`Failed to load custom tool defs: ${String(l)}`}),o.toolDefs=o.toolDefs||{}}return p=!0,o.toolDefs},u=[];for(let l=0;l<n.length;l++){let d=n[l];if(!d||typeof d!="object"||typeof d.id!="string"||d.kind!=="builtin"&&d.kind!=="http"&&d.kind!=="mcp"&&d.kind!=="composio"&&d.kind!=="skill"){t==null||t({type:"error:llmNodeRunner",content:`Invalid tool descriptor at index ${l}: expected { kind: 'http'|'mcp'|'composio'|'builtin'|'skill', id: string, params?: any }`});continue}let a=d;if(a.kind!=="builtin"){let w=(await f())[a.id];if(!w){console.error(`[tools] \u2717 custom '${a.id}': not found for tenant`),t==null||t({type:"error:llmNodeRunner",content:`custom tool '${a.id}' not found for this tenant`});continue}if(a.kind==="composio"){try{let g=await vt(w,o,e,t),x=Object.keys(g);for(let[I,R]of Object.entries(g))r[I]=$t(I,R,a,o,t);console.log(`[tools] \u2713 composio '${a.id}' \u2192 ${x.length} tool(s)`)}catch(g){console.error(`[tools] \u2717 composio '${a.id}': ${String(g)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading composio tool '${a.id}': ${String(g)}`})}continue}if(a.kind==="skill"){if(w.kind!=="skill"){console.error(`[tools] \u2717 skill '${a.id}': row is of kind '${w.kind}', not 'skill'`),t==null||t({type:"error:llmNodeRunner",content:`tool '${a.id}' is not a skill`});continue}let g=w.name;if(r[g]){t==null||t({type:"warn:llmNodeRunner",content:`tool name collision on '${g}' \u2014 builtin/other already registered, skipping skill '${a.id}'`});continue}try{r[g]=se(w,o,e,t),u.push(w);let x=typeof w.execution=="string"?JSON.parse(w.execution):w.execution||{},I=Array.isArray(x.references)?x.references.map(R=>R==null?void 0:R.name):[];console.log(`[tools] \u2713 skill '${a.id}' \u2192 '${g}' (refs: ${I.join(", ")||"none"})`),t==null||t({type:"info:skill:registered",content:{skill:g,refCount:I.length,refs:I}})}catch(x){console.error(`[tools] \u2717 skill '${a.id}': ${String(x)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading skill tool '${a.id}': ${String(x)}`})}continue}let h=w.name;if(r[h]){t==null||t({type:"warn:llmNodeRunner",content:`tool name collision on '${h}' \u2014 builtin already registered, skipping custom tool '${a.id}'`});continue}try{let g=ee(w,o,e,t);r[h]=$t(h,g,a,o,t),console.log(`[tools] \u2713 custom '${a.id}' \u2192 '${h}'`),console.log(`[tools] ${i(r[h])}`)}catch(g){console.error(`[tools] \u2717 custom '${a.id}': ${String(g)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading custom tool '${a.id}': ${String(g)}`})}continue}if(!St[a.id]){console.error(`[tools] \u2717 builtin '${a.id}': not in registry`),t==null||t({type:"error:llmNodeRunner",content:`Tool '${a.id}' not found in registry`});continue}try{let y;try{y=await Qe(`../tools/${a.id}.ts`)}catch{y=await Ze(`../tools/${a.id}.js`)}let w;if(y[a.id])w=y[a.id];else if(y.default)w=y.default;else if(y.create)w=y.create;else{let O=Object.values(y);O.length>0&&(w=O[0])}if(!w){t==null||t({type:"error:llmNodeRunner",content:`No factory export found for tool '${a.id}'`});continue}let h,g,x={};if(a.params&&typeof a.params=="object"){if(typeof a.params.description=="string"?h=a.params.description:a.params.description!==void 0&&(t==null||t({type:"error:llmNodeRunner",content:`Invalid description for tool '${a.id}' \u2014 must be a string`})),a.params.inputSchema!==void 0){let O=a.params.inputSchema;typeof O=="object"&&(typeof O.safeParse=="function"||O._def)?g=O:typeof O=="object"&&O!==null&&O.type==="object"&&O.properties?(g=te(O),g||t==null||t({type:"error:llmNodeRunner",content:`Invalid inputSchema for tool '${a.id}' \u2014 must be a Zod schema or JSON Schema object`})):t==null||t({type:"error:llmNodeRunner",content:`Invalid inputSchema for tool '${a.id}' \u2014 must be a Zod schema or JSON Schema object`})}a.params.defaults!==void 0?typeof a.params.defaults=="object"&&a.params.defaults!==null&&!Array.isArray(a.params.defaults)?x=a.params.defaults:(t==null||t({type:"error:llmNodeRunner",content:`Invalid defaults for tool '${a.id}' \u2014 must be an object`}),x={}):a.params.source!==void 0||a.params.target!==void 0?(t==null||t({type:"error:llmNodeRunner",content:`Invalid params for tool '${a.id}' \u2014 legacy top-level source/target not supported; use params.defaults instead`}),x={}):x={}}let I=w(o,e,x,t);h&&I&&typeof I=="object"&&(I.description=h),g&&I&&typeof I=="object"&&(I.inputSchema=g),r[a.id]=$t(a.id,I,a,o,t);let R=[];h&&R.push("description"),g&&R.push("inputSchema"),Object.keys(x).length&&R.push(`defaults(${Object.keys(x).join(",")})`);let $=R.length?` [overrides: ${R.join(", ")}]`:"";console.log(`[tools] \u2713 builtin '${a.id}'${$}`),console.log(`[tools] ${i(I)}`)}catch(y){console.error(`[tools] \u2717 builtin '${a.id}': ${String(y)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading tool '${a.id}': ${String(y)}`});continue}}if(u.length>0)if(r.readSkillRef)t==null||t({type:"warn:llmNodeRunner",content:"tool name collision on 'readSkillRef' \u2014 builtin/other already registered, skipping readSkillRef tool"});else try{r.readSkillRef=ne(o,u,e,t),console.log(`[tools] \u2713 registered readSkillRef tool for ${u.length} skill(s)`),t==null||t({type:"info:skill:readSkillRefRegistered",content:{skills:u.map(l=>l.name)}})}catch(l){console.error(`[tools] \u2717 failed to load readSkillRef tool: ${String(l)}`)}return r}async function kt(o,e,s,t,n,r,i){var M,b,F,k,A;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let c=!1;try{let N=(M=s.flowData)==null?void 0:M.state;if(N&&N.edges&&N.nodes){let L=N.edges.filter(D=>D.source===e.id);if(L.length>0){let D=N.nodes.find(V=>V.id===L[0].target);D&&D.type==="answerNode"&&(c=!0)}}}catch(N){console.error("Error determining next node for streaming:",N)}let p=G(e.data.template,e,s,t,{sessionEnv:o});(!p||!p.trim())&&(p="Answer straight forward to the user, dont offer any other option to continue");let f=p,u="";if((b=o.memoryConfig)!=null&&b.enabled){let N=await((F=o.getContextIndex)==null?void 0:F.call(o))??[];u=Wt(N),p+=u}let m=G(e.data.user_template||"",e,s,t,{sessionEnv:o}),l=N=>N&&Object.fromEntries(Object.keys(N).map(L=>[L,"[redacted]"])),d=o!=null&&o.secrets||o!=null&&o.userAuth?{...o,secrets:l(o.secrets),userAuth:l(o.userAuth)}:o,a=G(e.data.template,e,s,void 0,{sessionEnv:d})||f;a+=u;let y=G(e.data.user_template||"",e,s,void 0,{sessionEnv:d});t==null||t({type:`info:llmNodeRunner:${e.id}`,content:a}),t==null||t({type:`info:llmNodeRunner:${e.id}`,content:y});let w=(k=e==null?void 0:e.data)==null?void 0:k.window_size,h=Number(w);(!Number.isInteger(h)||h<=0)&&(h=5);let g=Re(e,s),x=xe(e,s),R=(await((A=o.getMessages)==null?void 0:A.call(o))??[]).slice(-h),$=R.filter(N=>N&&typeof N.role=="string"&&typeof N.content=="string");$.length!==R.length&&console.warn(`Filtered ${R.length-$.length} invalid messages from history`);let O=no($,m,g,x);await so(p,O,o.conn,t,e,c,n,s,r,o,i)}async function so(o,e,s,t,n,r,i,c,p,f,u){var l;let m=Date.now();if(!((l=f.env)!=null&&l.AI))throw new Error("AI binding is required for LLM node");return new Promise(async(d,a)=>{var A,N,L,D,V,Q,Z;let y,w={},h,g="none",x=!1,I,R=!1,$=!1,O=0,M=0,b=(A=n==null?void 0:n.data)==null?void 0:A.sendReasoning,F=b!==!1;try{let j=(N=n==null?void 0:n.data)==null?void 0:N.model,z=Array.isArray(j)?j[0]:j||"gpt_5_nano",T=Et(n==null?void 0:n.data),_=await it(z,f,T);if(!_)throw new Error(`Model '${z}' not found in registry`);y=_.modelHandle,w=_.effectiveParams||{},g=_.reasoning.kind;let C=Kt(_.reasoning,(L=n==null?void 0:n.data)==null?void 0:L.reasoningEffort);x=F&&Vt(_.reasoning);let E=typeof((D=n==null?void 0:n.data)==null?void 0:D.reasoningMaxTokens)=="number"?n.data.reasoningMaxTokens:void 0;h=Jt(_.provider,{effort:C,exposeReasoning:x,maxTokens:E}),C&&(t==null||t({type:"info:llmNodeRunner:reasoningEffort",content:C})),console.log(`[reasoning] ${JSON.stringify({model:z,provider:_.provider,capability:_.reasoning,requestedEffort:((V=n==null?void 0:n.data)==null?void 0:V.reasoningEffort)??null,resolvedEffort:C??null,sendReasoning:F,exposeReasoning:x,providerOptions:h??null},null,2)}`);for(let H of _.paramAdjustments??[])t==null||t({type:"warn:llmNodeRunner",content:H});t==null||t({type:"info:llmNodeRunner:model",content:z}),t==null||t({type:"info:llmNodeRunner:generationParams",content:{...(Q=n==null?void 0:n.data)!=null&&Q.generationPreset?{preset:n.data.generationPreset}:{},...w,...g!=="none"?{reasoning:g,configuredSendReasoning:b,sendReasoning:F,exposeReasoning:x,...C?{effort:C}:{}}:{}}})}catch(j){throw t==null||t({type:"error:llmNodeRunner",content:`Model error: ${String(j)}`}),j}let k=await oo(f,c,n,t);if((Z=f.memoryConfig)!=null&&Z.enabled){let{recall:j}=await import("./recall-IABRCSHY.js");k.recall=j(f,c,void 0,t)}console.log(`[tools] node ${n.id} loaded ${Object.keys(k).length}: ${Object.keys(k).join(", ")||"(none)"}`),t==null||t({type:"info:llmNodeRunner:toolsLoaded",content:{nodeId:n.id,tools:Object.keys(k)}});try{let j=ve({model:y,system:o,messages:e,stopWhen:(()=>{var H;let _=!!k.readSkillRef?10:5,C=Number(((H=n.data)==null?void 0:H.max_steps)??_),E=Number.isFinite(C)?Math.max(1,Math.min(30,C)):_;return Se(E)})(),...qt(w),...h?{providerOptions:h}:{},tools:k,onFinish:async T=>{var Dt,Ut;let _=T.text||"",C=T.reasoningText??((Dt=T.reasoning)==null?void 0:Dt.text)??"";if(console.log(`[reasoning] done: deltas=${O} chars=${M} result.reasoningText=${C.length} finishReason=${T.finishReason??"n/a"} reasoningTokens=${((Ut=T.usage)==null?void 0:Ut.reasoningTokens)??"n/a"}`),F&&x&&!R&&C&&s){R=!0;try{U(s,P.SERVER_REASONING_STREAM,C)}catch(ze){console.warn("Failed to send finished reasoning over connection",ze)}}let E={id:to(),role:"assistant",type:"text",content:_,ts:Date.now()};r&&(f.setMessages?await f.setMessages(E):t==null||t({type:"error:llmNodeRunner",content:"setMessages callback missing"})),s&&F&&R&&!$&&($=!0,U(s,P.SERVER_REASONING_STREAM_COMPLETE,JSON.stringify({}))),r&&s&&U(s,P.SERVER_TEXT_STREAM_COMPLETE,JSON.stringify({})),i==null||i((n==null?void 0:n.id)||"llm_result",_),t==null||t({type:"info:llmNodeRunner:onFinish",content:JSON.stringify(T)});let H=Date.now()-m,Ge=I?I-m:void 0;u==null||u({type:"llm_telemetry",payload:{nodeId:n.id,totalLatency:H,timeToFirstToken:Ge,model:T.response.modelId,usage:T.usage}}),u==null||u({type:"llm_result",payload:{result:T}})},onStepFinish:async T=>{let _=(C,E=200)=>{let H=typeof C=="string"?C:JSON.stringify(C);return H?H.length>E?`${H.slice(0,E)}\u2026(+${H.length-E})`:H:""};if(T.toolCalls&&T.toolCalls.length>0){for(let C of T.toolCalls)console.log(`[tools] \u2192 ${C.toolName}(${_(C.args??C.input)})`);t==null||t({type:`info:llmNodeRunner:toolCalls:${n.id}`,content:JSON.stringify(T.toolCalls)})}if(T.toolResults&&T.toolResults.length>0){for(let C of T.toolResults)console.log(`[tools] \u2190 ${C.toolName} \u2192 ${_(C.result??C.output)}`);t==null||t({type:`info:llmNodeRunner:toolResults:${n.id}`,content:JSON.stringify(T.toolResults)})}await eo(T,n,f,t)},experimental_onToolCallStart:T=>{var _;t==null||t({type:"tool:execution",content:{nodeId:n.id,toolName:(_=T==null?void 0:T.toolCall)==null?void 0:_.toolName,status:"start"}})},experimental_onToolCallFinish:T=>{var _,C;t==null||t({type:"tool:execution",content:{nodeId:n.id,toolName:(_=T==null?void 0:T.toolCall)==null?void 0:_.toolName,status:((C=T==null?void 0:T.toolOutput)==null?void 0:C.type)==="tool-error"?"error":"success"}})},onError:T=>{t==null||t({type:"error:llmNodeRunner",content:"Execution error"}),a(T)},onChunk:T=>{if(T.chunk.type==="reasoning-delta"){let C=T.chunk.text??T.chunk.delta??"";if(C&&(R=!0,O+=1,M+=C.length,O===1&&console.log("[reasoning] \u2713 first reasoning-delta received")),F&&s&&C)try{U(s,P.SERVER_REASONING_STREAM,C)}catch(E){console.warn("Failed to send reasoning chunk over connection",E)}return}if(T.chunk.type==="text-delta"){if(I||(I=Date.now()),s&&F&&R&&!$){$=!0;try{U(s,P.SERVER_REASONING_STREAM_COMPLETE,JSON.stringify({}))}catch(C){console.warn("Failed to send reasoning complete over connection",C)}}return}u==null||u({type:T.chunk.type,payload:{nodeId:n.id,chunk:T.chunk}});let _=`llm_chunk:${T.chunk.type}`;t==null||t({type:_,content:{...T}})}}),z=async()=>{let T="";for await(let _ of j.fullStream)if(_.type==="text-delta"){if(T+=_.text,r&&s)try{U(s,P.SERVER_TEXT_STREAM,_.text)}catch(C){console.warn("Failed to send chunk over connection",C)}}else if(_.type==="finish-step"&&_.finishReason==="tool-calls"){if(r&&s&&T.trim())try{U(s,P.SERVER_TEXT_STREAM_COMPLETE,JSON.stringify({}))}catch(C){console.warn("Failed to flush text segment over connection",C)}T=""}};await Promise.all([j,z()]),d(),t==null||t({type:"node:execution",content:{nodeId:n.id,nodeType:n.type,status:"success"}})}catch(j){t==null||t({type:"node:execution",content:{nodeId:n.id,nodeType:n.type,status:"error",error:String(j)}}),a(j)}})}function no(o,e,s,t){let n=!!(s&&s.length>0),r=!!t,i=n||r,p=o.length>0&&o[o.length-1].role==="user"?o[o.length-1]:void 0,f=u=>{let m=[],l="";if(r&&(l+=`[Attached files]
31
+ ${t}
32
+ [End of attached files]
33
+
34
+ `),u&&(l+=u),l&&m.push({type:"text",text:l}),n)for(let d of s)m.push({type:"image",image:d.data,mimeType:d.mimeType});return m};return e&&p&&p.content===e?[...o.slice(0,-1).map(m=>({role:m.role,content:m.content})),{role:"user",content:f(e)}]:e?[...o.map(u=>({role:u.role,content:u.content})),{role:"user",content:f(e)}]:i&&p?[...o.slice(0,-1).map(m=>({role:m.role,content:m.content})),{role:"user",content:f(p.content)}]:o.map(u=>({role:u.role,content:u.content}))}async function Ft(o,e,s,t,n,r,i){var f,u,m,l;console.log(`**** MEMO Node id: ${e.id} ****`),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let c="",p=Date.now();try{if(t==null||t({type:"info:memoNodeRunner",content:"Starting memo node execution"}),((f=s==null?void 0:s.context)==null?void 0:f[e.data.query_key])===void 0){t==null||t({type:"error:memoNodeRunner",content:`Query key ${e.data.query_key} not found in context`}),n==null||n(e.id,c);return}if(!o.env||!o.ctx){t==null||t({type:"error:memoNodeRunner",content:"Missing env or ctx"}),n==null||n(e.id,c);return}if(!e.data.rag_id){t==null||t({type:"error:memoNodeRunner",content:"Missing rag_id"}),n==null||n(e.id,c);return}let d=((u=s==null?void 0:s.context)==null?void 0:u[e.data.query_key])||"";t==null||t({type:"info:memoNodeRunner",content:`Query text: ${d}`}),t==null||t({type:"info:memoNodeRunner",content:"Generating embedding for query"});let a=await bt(o,d,!0);t==null||t({type:"info:memoNodeRunner",content:`Embedding generated successfully, length: ${a.data[0].length}`});let y=Array.isArray(e.data.rag_id)?e.data.rag_id:[e.data.rag_id],w=[];for(let I of y){t==null||t({type:"info:memoNodeRunner",content:`Executing RAG query with namespace: ${I}`});let R=await o.env[`VDB_${(m=s.flowData)==null?void 0:m.tenant}_1024`].query(a.data[0],{namespace:I,topK:e.data.topk,returnMetadata:"all"});t==null||t({type:"info:memoNodeRunner",content:`RAG query completed for namespace ${I}, matches: ${((l=R.matches)==null?void 0:l.length)||0}`}),Array.isArray(R.matches)&&w.push(...R.matches)}let h=Date.now()-p;c=w.map(I=>{var R;return(R=I.metadata)==null?void 0:R.value}).filter(I=>typeof I=="string").join(`
35
+
36
+ `),i==null||i({type:"memo_search",payload:{nodeId:e.id,searchLatencyMs:h,retrievedContext:c}}),t==null||t({type:"info:memoNodeRunner",content:`Context retrieval complete, length: ${c.length}, preview: ${c.substring(0,200)}...`}),t==null||t({type:"info:memoNodeRunner",content:"Memo node execution completed successfully"})}catch(d){console.error("Error processing MemoNode:",d),t==null||t({type:"error:memoNodeRunner",content:`Memo node execution failed: ${d}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(d)}})}finally{n==null||n(e.id,c),t==null||t({type:"info:memoNodeRunner",content:`onResult called with context length: ${c.length}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}}async function Mt(o,e,s,t,n,r,i){var u,m,l,d,a,y,w;console.log(`**** START Node ${e.id} ****`),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}}),t==null||t({type:"info:flow",content:s}),i==null||i({type:"start_node",payload:{userMessage:(u=s==null?void 0:s.context)==null?void 0:u.user_input}});let c=((m=e.data)==null?void 0:m.allow_images)!==!1,p=((l=e.data)==null?void 0:l.allow_documents)!==!1;!c&&(s!=null&&s.context)&&(s.context.user_images=[],r==null||r({...s})),!p&&(s!=null&&s.context)&&(s.context.files="",r==null||r({...s}));let f={};for(let h of Y(e.data))f[h.name]=(d=s==null?void 0:s.context)==null?void 0:d[h.name];n==null||n(e.id,{...f,user_input:(a=s==null?void 0:s.context)==null?void 0:a.user_input,images:c?(y=s==null?void 0:s.context)==null?void 0:y.user_images:[],files:p?(w=s==null?void 0:s.context)==null?void 0:w.files:""}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}function Te(o,e,s){let t=e;async function n(p){let f=p;for(t.executedNodes=t.executedNodes||[],t.context=t.context||{},t.results=t.results||{};f&&f.id;)await r(f),f=ao(f,t.flowData,t)}async function r(p){var d;let f=c[p.type];if(!f){(d=s==null?void 0:s.onError)==null||d.call(s,`Unknown node type: ${p.type}`);return}let u=a=>{var y;return(y=s==null?void 0:s.onServerEvent)==null?void 0:y.call(s,{...a,ts:Date.now()})},m=a=>{var y,w;if((y=s==null?void 0:s.onTelemetry)==null||y.call(s,a),a.type==="llm_telemetry"||a.type==="class_telemetry"){let h=(w=a.payload)==null?void 0:w.usage;h&&(t.tokenUsage=t.tokenUsage||{promptTokens:0,completionTokens:0,totalTokens:0},t.tokenUsage.promptTokens+=h.promptTokens||0,t.tokenUsage.completionTokens+=h.completionTokens||0,t.tokenUsage.totalTokens+=h.totalTokens||0)}};return await f(o,p,t,u,(a,y)=>{t.results[a]=y},s==null?void 0:s.onChangeState,m)}let i=async p=>{var l,d,a,y,w,h;let f=Date.now(),u="completed",m;try{let g=typeof p=="string"?rt(p):p,x=(g==null?void 0:g.text)||"",I=(g==null?void 0:g.images)||[],R=(g==null?void 0:g.documents)||[],$=await ye(R,o.env),O=$.length>0?$.map(F=>`--- file: ${F.name} ---
37
+ ${F.text}`).join(`
38
+
39
+ `):"";t.context={user_input:x,user_images:I,files:O},t.tokenUsage={promptTokens:0,completionTokens:0,totalTokens:0},(l=s==null?void 0:s.onServerEvent)==null||l.call(s,{type:"agent:start",content:"Execution started",timestamp:Date.now()});let{startNode:M,error:b}=ro(t.flowData);if(!M)u="failed",m=b||"Flow Format Error",(d=s==null?void 0:s.onError)==null||d.call(s,m);else{let F=Y(M.data),{values:k,errors:A}=Lt(F,g==null?void 0:g.inputs);if(A.length>0)return u="failed",m=`Invalid flow inputs: ${A.join("; ")}`,(a=s==null?void 0:s.onError)==null||a.call(s,m),{status:u,error:m};t.context={...t.context,inputs:k,...k},t.context.user_input||(t.context.user_input=x),await n(M),(y=s==null?void 0:s.onServerEvent)==null||y.call(s,{type:"agent:telemetry",content:{durationMs:Date.now()-f,tokenUsage:t.tokenUsage},timestamp:Date.now()})}}catch(g){u="failed",m=g instanceof Error?g.message:"Agent execution failed",(w=s==null?void 0:s.onError)==null||w.call(s,m)}finally{(h=s==null?void 0:s.onServerEvent)==null||h.call(s,{type:"agent:complete",content:{status:u,durationMs:Date.now()-f},timestamp:Date.now()})}return{status:u,error:m}},c={startNode:Mt,classifierNode:Ot,llmNode:kt,memoNode:Ft,answerNode:Ct,apiNode:_t};return i}function ro(o){var u;let e=(o==null?void 0:o.state)??o;if(!e||!e.nodes||!e.edges||e.edges.length===0)return{error:"Flow is missing state, nodes, or edges."};let s=e.nodes.filter(m=>m.type==="startNode");if(s.length!==1)return{error:`Flow must include exactly one START node, found ${s.length}.`};let t=s[0],n=e.nodes.filter(m=>m.type==="answerNode");if(n.length===0)return{error:"Flow must include at least one ANSWER node."};let r=new Map;for(let m of e.edges)r.has(m.source)||r.set(m.source,[]),r.get(m.source).push(m.target);let i=new Map;for(let m of e.edges)i.has(m.target)||i.set(m.target,[]),i.get(m.target).push(m.source);let c=Ie(t.id,r),p=new Set;for(let m of n){let l=Ie(m.id,i);for(let d of l)p.add(d)}let f=[];for(let m of c)if(!p.has(m)){let l=e.nodes.find(d=>d.id===m);if(l){let d=((u=l.data)==null?void 0:u.label)||"";f.push(`${m}(${d},${l.type})`)}}return f.length>0?{error:`The following nodes reachable from START do not lead to any ANSWER node: ${f.join(", ")}`}:{startNode:t}}function Ie(o,e){let s=new Set,t=[o];for(s.add(o);t.length>0;){let n=t.shift(),r=e.get(n)||[];for(let i of r)s.has(i)||(s.add(i),t.push(i))}return s}function io(o,e){var s;return((s=o.state)==null?void 0:s.nodes.find(t=>t.id===e))||null}function ao(o,e,s){var c;let t=e==null?void 0:e.state;if(!t)return null;let n=t.edges.filter(p=>p.source===o.id);if(n.length===0)return null;let r=n[0].target;if(o.type==="classifierNode"&&((c=s==null?void 0:s.context)!=null&&c.classified_id)){let p=s.context.classified_id,f=n.find(u=>u.sourceHandle===`source-${p}`);f?r=f.target:console.log(`No matching edge, falling back to first: ${r}`)}return io(e,r)}async function Ne(o,e){var t,n;let s=(t=e==null?void 0:e.flowData)==null?void 0:t.flowId;if(!(o!=null&&o.HX_CORE_URL)||!s)return{engineState:e,refreshed:!1};try{let r=await W(s,o),i={...e,flowData:{...r,tenant:e.flowData.tenant,flowId:s,chatId:e.flowData.chatId}},c=r==null?void 0:r.stateVersion,p=typeof c=="number"&&c!==((n=e.flowData)==null?void 0:n.stateVersion);return{engineState:i,refreshed:p}}catch(r){return console.error(`[flowRefresh] fetch failed for flow ${s}:`,r),{engineState:e,refreshed:!1}}}function Ce(o,e){return!o||!o.HX_ORA_URL||!o.HX_API_KEY?Promise.resolve():fetch(`${o.HX_ORA_URL}/internal/sessions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:o.HX_API_KEY},body:JSON.stringify(e)}).catch(s=>{console.error("[sessionIndex] failed to index session",s)})}var Ae=async(o,e)=>{fetch(`${e.DW_URL}/q/telemetry/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}),`${JSON.stringify(o)}`};async function tt(o,e){var r,i;let s=o.id||o.name||"",[t,n]=String(s).split("::");if(!t||!n)return null;try{let p=(r=(await K(t,e)).metadata)==null?void 0:r.tenant,f=await W(t,e),u=(i=o.state)==null?void 0:i.user,m={flowData:{...f,tenant:p,flowId:t,chatId:n},executedNodes:[],context:u?{user:u}:{}};return o.setState({...o.state,engineState:m}),m}catch(c){return console.error("Failed to initialize engine state:",c),null}}async function et(o){var O,M,b,F,k;let{agent:e,env:s,ctx:t,payload:n,connection:r}=o,i=Date.now(),c=[],p=async()=>await J(e),f=async A=>{await re(e,A)},u=async A=>{if(e.state.modelsCache&&e.state.modelsCache[A])return e.state.modelsCache[A];try{let{fetchOraModel:N}=await import("./oraApi-YIJGMXX7.js"),L=await N(A,s);return e.setState({...e.state,modelsCache:{...e.state.modelsCache||{},[A]:L}}),L}catch(N){throw console.error(`Error fetching model ${A}:`,N),N}},m={id:co(),role:"user",type:"text",content:n.text,images:n.images,ts:Date.now()};await f(m);let l={onChangeState:A=>{e.setState({...e.state,engineState:A})},onServerEvent:async A=>{var N;await((N=o.onServerEvent)==null?void 0:N.call(o,A)),c.push(A)},onTelemetry:async A=>{var N,L,D,V,Q,Z;await Ae({...A,userId:o.resolveUserId(),tenant:((L=(N=e.state.engineState)==null?void 0:N.flowData)==null?void 0:L.tenant)||"",flowId:((V=(D=e.state.engineState)==null?void 0:D.flowData)==null?void 0:V.flowId)||"",sessionId:((Z=(Q=e.state.engineState)==null?void 0:Q.flowData)==null?void 0:Z.chatId)||""},s)},onError:A=>{var N;(N=o.onError)==null||N.call(o,A),e.setState({...e.state,error:A})}},d=e.state.engineState?{...e.state.engineState}:null;if(d){let{engineState:A,refreshed:N}=await Ne(s,d);d=A,N&&e.setState({...e.state,engineState:d,modelsCache:{}})}else if(d=await tt(e,s),!d){let A="Failed to initialize agent";return l.onError(A),{status:"failed",error:A}}let a=o.secrets;if(!a||Object.keys(a).length===0){let A=(O=d.flowData)==null?void 0:O.tenant;a=A?await ht(s,A):{},(M=o.onSecretsLoaded)==null||M.call(o,a)}let y=o.user??e.state.user??void 0;y&&!((b=d.context)!=null&&b.user)&&(d.context={...d.context||{},user:y});let w=at(v(d)),h=typeof d.cycle=="number"?d.cycle:0;w.enabled&&(h=await me(e,d),d.cycle=h,e.setState({...e.state,engineState:d}));let g=ge(e,{env:s,ctx:t,conn:r,getMessages:p,setMessages:f,getOraModel:u,secrets:a,userAuth:o.userAuth,user:y,composioSessions:o.composioSessions,publicOrigin:o.publicOrigin,skillRefCache:o.skillRefCache},d,h,o.onMemoryRef),x=await Te(g,d,l)(n),{tenant:I,flowId:R,chatId:$}=d.flowData??{};return I&&R&&$&&t.waitUntil(Ce(s,{id:`${R}::${$}`,tenant:I,flowId:R,sessionId:$,userId:o.resolveUserId(),title:(F=n.text)==null?void 0:F.slice(0,120),turnTs:i,events:c})),x.status==="completed"&&((k=g.memoryConfig)!=null&&k.enabled)&&g.memoryConfig.mode==="summarize"&&t&&t.waitUntil(Bt(e,g,h)),e.setState({...e.state,lastUpdated:new Date}),{status:x.status,error:x.error,engineState:d}}import{nanoid as lo}from"nanoid";function uo(o){let e=o.headers.get("X-User-Payload");if(!e)return null;try{let s=JSON.parse(e),t=typeof(s==null?void 0:s.email)=="string"?S(s.email):null;return t?{...s,email:t}:null}catch{return null}}async function _e(o,e,s,t){var n;try{let r=await e.json(),i=r.message;if(!i||typeof i!="string")return new Response(JSON.stringify({error:"Invalid message"}),{status:400,headers:{"content-type":"application/json"}});let c=typeof r.userId=="string"?S(r.userId):null,p=uo(e),f=p==null?void 0:p.email;p?o.setState({...o.state,user:p,injectedUserId:f}):c&&!((n=o.state.user)!=null&&n.email)&&o.setState({...o.state,injectedUserId:c});let u=()=>f??c??o.state.injectedUserId??void 0;o.skillRefCache||(o.skillRefCache=new Map);let m=r.inputs&&typeof r.inputs=="object"?r.inputs:void 0;if(!o.state.engineState&&!await tt(o,s))return new Response(JSON.stringify({error:"Failed to initialize agent"}),{status:500,headers:{"content-type":"application/json"}});let l=f?`run-${lo(12)}`:null;l&&await o.registerManualRun(l,i,f);let d=await et({agent:o,env:s,ctx:t,payload:{text:i,inputs:m},skillRefCache:o.skillRefCache,user:p??void 0,resolveUserId:u});if(l&&t.waitUntil(o.completeManualRun(l,d.status==="completed"?"succeeded":"failed",d.error)),d.status==="failed")return new Response(JSON.stringify({error:d.error||"Agent execution failed"}),{status:500,headers:{"content-type":"application/json"}});let y=(await J(o)).reverse().find(w=>w.role==="assistant");return new Response(JSON.stringify({answer:(y==null?void 0:y.content)||""}),{headers:{"content-type":"application/json"}})}catch(r){return new Response(JSON.stringify({error:r.message}),{status:500,headers:{"content-type":"application/json"}})}}async function Oe(o){try{return await ut(o),await mt(o),o.skillRefCache&&o.skillRefCache.clear(),o.setState({...o.state,error:"",engineState:void 0,modelsCache:{},lastUpdated:new Date}),new Response(JSON.stringify({success:!0,messages:[]}),{headers:{"content-type":"application/json"}})}catch(e){return new Response(JSON.stringify({error:e.message}),{status:500,headers:{"content-type":"application/json"}})}}var $e="trigger:nonce:",mo=900*1e3,ke=class extends po{initialState={user:void 0,injectedUserId:null,sessionId:null,lastUpdated:null,modelsCache:{}};resolveSessionUserId(){var e;return((e=this.state.user)==null?void 0:e.email)??this.state.injectedUserId??void 0}secrets=Object.freeze({});userAuth={};composioSessions={};skillRefCache=new Map;publicOrigin;async onRequest(e){let s=new URL(e.url);if(s.pathname.endsWith("/state"))return new Response(JSON.stringify(this.state),{headers:{"content-type":"application/json"}});if(s.pathname.endsWith("/history")){let t=await J(this);return new Response(JSON.stringify(t),{headers:{"content-type":"application/json"}})}if(s.pathname.endsWith("/context")){let t={"content-type":"application/json","access-control-allow-origin":"*"};if(!e.headers.get("X-User-Payload"))return new Response(JSON.stringify({error:"Unauthorized"}),{status:401,headers:t});let n=s.searchParams.get("ref");if(n){let i=await ft(this,n);return i?new Response(JSON.stringify({entry:i}),{headers:t}):new Response(JSON.stringify({error:"Not found"}),{status:404,headers:t})}let r=await pt(this);return new Response(JSON.stringify({entries:r}),{headers:t})}return e.method==="POST"&&s.pathname.endsWith("/message")?_e(this,e,this.env,this.ctx):e.method==="DELETE"&&s.pathname.endsWith("/clear")?Oe(this):new Response("Ready to assist.")}async onConnect(e,s){var l,d,a,y,w;let[t,n]=e.server.split("::"),i=(l=(await K(t,this.env)).metadata)==null?void 0:l.tenant;this.secrets=await ht(this.env,i),this.userAuth={},this.composioSessions={},this.publicOrigin=void 0;let c=null;if(s.request){try{this.publicOrigin=new URL(s.request.url).origin}catch{}let h=s.request.headers.get("X-User-Payload");if(h)try{c=JSON.parse(h)}catch(g){console.warn("Failed to parse X-User-Payload",g)}}let p=await W(t,this.env);this.setState({...this.state,user:c||null,sessionId:n,engineState:{flowData:{...p,tenant:i,flowId:t,chatId:n},executedNodes:[],context:c?{user:c}:{}}}),c||console.warn("[AgentDO] WebSocket connected without authenticated user \u2014 Composio manual auth requires login (access_token on socket URL)");let f=await J(this);U(e,P.SERVER_HISTORY,JSON.stringify({messages:f}));let m=(((d=p==null?void 0:p.state)==null?void 0:d.nodes)??(p==null?void 0:p.nodes)??[]).find(h=>h.type==="startNode");if(m){let h={allow_images:((a=m.data)==null?void 0:a.allow_images)??!1,allow_documents:((y=m.data)==null?void 0:y.allow_documents)??!1,greeting:(w=m.data)==null?void 0:w.greeting};U(e,P.SERVER_CONFIG,JSON.stringify(h))}}async onMessage(e,s){if(typeof s!="string")return;let t=s.indexOf(":");if(t===-1)return;let n=s.substring(0,t),r=s.substring(t+1);if(!n||!r)return;let c={[P.USER_MESSAGE]:p=>this.onUserMessage(e,p),[P.USER_CLEAR_HISTORY]:()=>this.onClearHistory(e),[P.USER_AUTH]:p=>this.onUserAuth(e,p),[P.USER_IDENTITY]:p=>this.onUserIdentity(e,p)}[n];c&&await c(r)}async onUserMessage(e,s){let t=rt(s),n=this.hasAuditableUser()?`run-${fo(12)}`:null;n&&await this.registerManualRun(n,t.text);let r=await et({agent:this,env:this.env,ctx:this.ctx,payload:t,connection:e,secrets:this.secrets,userAuth:this.userAuth,composioSessions:this.composioSessions,publicOrigin:this.publicOrigin,skillRefCache:this.skillRefCache,user:this.state.user,resolveUserId:()=>this.resolveSessionUserId(),onServerEvent:i=>{U(e,P.SERVER_EVENT,JSON.stringify(i))},onError:i=>{U(e,P.SERVER_ERROR,i)},onMemoryRef:i=>{U(e,P.SERVER_EVENT,JSON.stringify({type:"info:memory:updated",content:{ref:i}}))},onSecretsLoaded:i=>{this.secrets=i}});n&&this.ctx.waitUntil(this.completeManualRun(n,r.status==="completed"?"succeeded":"failed",r.error))}hasAuditableUser(e){var s;return!!(e||(s=this.state.user)!=null&&s.email)}registerManualRun(e,s,t){var p,f;let{tenant:n,flowId:r,chatId:i}=((p=this.state.engineState)==null?void 0:p.flowData)??{},c=t||((f=this.state.user)==null?void 0:f.email);return!n||!r||!i||!c?Promise.resolve():fe(this.env,{id:e,tenant:n,flowId:r,userId:c,sessionId:i,triggerType:"manual",label:s==null?void 0:s.slice(0,120)})}completeManualRun(e,s,t){return yt(this.env,e,{status:s,error:t})}async enqueueTrigger(e){var n;if(!(e!=null&&e.runId)||!(e!=null&&e.flowId))return{queued:!1};if(e.nonce&&!await this.claimTriggerNonce(e.nonce))return console.warn(`[AgentDO] rejected replayed trigger nonce ${e.nonce}`),{queued:!1,duplicate:!0};let s=e.userId;return s&&!((n=this.state.user)!=null&&n.email)&&this.state.injectedUserId!==s&&this.setState({...this.state,injectedUserId:s}),{queued:!0,taskId:await this.queue("processTrigger",e)}}async claimTriggerNonce(e){let s=`${$e}${e}`;if(await this.ctx.storage.get(s))return!1;let t=Date.now();await this.ctx.storage.put(s,t);let r=[...(await this.ctx.storage.list({prefix:$e})).entries()].filter(([,i])=>t-i>mo).map(([i])=>i);return r.length>0&&await this.ctx.storage.delete(r),!0}async processTrigger(e){if(!(await pe(this.env,e.runId)).claimed){console.warn(`[AgentDO] trigger ${e.triggerId} skipped \u2014 run ${e.runId} already claimed`);return}try{this.state.engineState||await tt(this,this.env);let t=Y(v(this.state.engineState)),n=jt(t,e.inputs||{},e.label),r=await et({agent:this,env:this.env,ctx:this.ctx,payload:{text:n,inputs:e.inputs||{}},secrets:this.secrets,composioSessions:this.composioSessions,skillRefCache:this.skillRefCache,resolveUserId:()=>e.userId||this.resolveSessionUserId(),onSecretsLoaded:i=>{this.secrets=i}});await yt(this.env,e.runId,{status:r.status==="completed"?"succeeded":"failed",error:r.error})}catch(t){let n=t instanceof Error?t.message:"Trigger execution failed";throw await yt(this.env,e.runId,{status:"failed",error:n}),t}}async onUserIdentity(e,s){let t=S(s);if(!t){U(e,P.SERVER_ERROR,"Invalid identity payload");return}this.setState({...this.state,injectedUserId:t}),U(e,P.SERVER_EVENT,JSON.stringify({type:"info:identity",content:{set:!0}}))}async onUserAuth(e,s){let t=Ht(s);if(!t){U(e,P.SERVER_ERROR,"Invalid auth payload");return}let n=t.value.trim();n===""?delete this.userAuth[t.name]:this.userAuth[t.name]=t.value,U(e,P.SERVER_EVENT,JSON.stringify({type:"info:auth",content:{name:t.name,set:n!==""}}))}async onClearHistory(e){await ut(this),await mt(this),this.userAuth={},this.composioSessions={},this.skillRefCache.clear();let s=this.state.engineState?{...this.state.engineState,cycle:void 0}:void 0;this.setState({...this.state,error:"",engineState:s,modelsCache:{},lastUpdated:new Date}),e&&U(e,P.SERVER_HISTORY,JSON.stringify({messages:[]}))}async onStart(){`${JSON.stringify(this.state)}`,await ue(this);let e=await J(this);`${JSON.stringify(e)}`}async onClose(e,s,t,n){console.log(`Session closed: ${this.state.sessionId} ${s} - ${t}`)}async onError(e){console.error("AgentDO encountered an error:",e)}};function rr(o){let e=o.state;if(!e)return null;let s=["startNode","answerNode"];for(let t of s)if(!e.nodes.some(r=>r.type===t))return!1;return e.nodes.find(t=>t.type==="startNode")}import{importSPKI as go,jwtVerify as yo}from"jose";function Fe(o){let e={};if(!o)return e;let s=o.split(";");for(let t of s){let n=t.indexOf("=");if(n>-1){let r=t.slice(0,n).trim(),i=t.slice(n+1).trim();r&&(e[r]=decodeURIComponent(i))}}return e}function ho(o){return(typeof o.email=="string"?o.email.trim():"")||null}async function X(o,e,s){let t=Fe(o.headers.get("cookie")),n=new URL(o.url),r=t.access_token||n.searchParams.get("access_token"),i=await wo(e,r);if(i.ok){let c=i.payload,p=ho(c);return p?{id:c.sub,email:p,name:c.name,first_name:c.given_name,last_name:c.family_name,tenant:c.tenant,roles:c["ora-roles"],db_name:c.db_name||null,user_id:c.user_id||null}:null}return null}async function wo(o,e){if(!e||typeof e!="string")return{ok:!1,payload:null,protectedHeader:null};if(!o.KC_RS256_PK)throw new Error("PK is not defined");let s=`-----BEGIN PUBLIC KEY-----
40
40
  ${o.KC_RS256_PK}
41
- -----END PUBLIC KEY-----`,t=await je(s,"RS256");try{let{payload:n,protectedHeader:a}=await He(e,t);return{ok:!0,payload:n,protectedHeader:a}}catch(n){return console.error("JWT verification failed:",n),{ok:!1,payload:null,protectedHeader:null}}}async function On(o,e,s){let t=new URL(o.url);if(t.pathname==="/favicon.ico")return new Response(null,{status:204});if(t.pathname.startsWith("/.well-known/appspecific"))return new Response(null,{status:204})}import{getAgentByName as ye}from"agents";var qe=/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;async function An(o,e,s){var n,a,p,c;let t=new URL(o.url);if(t.pathname.startsWith("/a/")){let d=t.pathname.split("/"),u=d[2],l=d[3];try{if(!u)return Response.redirect(new URL("/",t.origin).toString(),302);let f;try{f=await z(u,e)}catch{return new Response("Flow not found",{status:404})}if(!f.metadata||((n=f.metadata)==null?void 0:n.status)!=="active")return new Response("NO chat",{status:404});if(((a=f.metadata)==null?void 0:a.visibility)==="private"&&!await J(o,e,s)){let m=new URL("/login",t.origin);return m.searchParams.set("nextURL",`${t.pathname}${t.search}`),Response.redirect(m.toString(),302)}if(!l){let r=crypto.randomUUID(),m=new URL(`/a/${u}/${r}`,t.origin);return Response.redirect(m.toString(),302)}if(!qe.test(l))return new Response("Id del chat no v\xE1lido",{status:400})}catch(f){return console.error("Error accessing flow KV:",f),new Response("Flow error",{status:500})}}if(t.pathname.startsWith("/api/agent/flow")){let d=t.pathname.split("/"),u=d[4],l=d[5],f=`${u}::${l}`;try{let r=await J(o,e,s);if(!r){let w=new URL(o.url).searchParams.has("access_token");console.warn(`[agents] Unauthenticated agent socket upgrade (access_token query=${w}) \u2014 Composio connections from tool editor will not apply`)}let m=new Headers(o.headers);r&&m.set("X-User-Payload",JSON.stringify(r));let i=new Request(o,{headers:m});return(await ye(e.AGENT,f)).fetch(i)}catch(r){return console.error("Error accessing agent:",r),new Response("Agent error",{status:500})}}if(t.pathname.startsWith("/api/ora/connect")){let d=t.pathname.split("/"),u=d[4],l=d[5];if(!u||!l)return new Response("Missing flowId or sessionId",{status:400});let f=o.headers.get("Authorization")||t.searchParams.get("authorization");if(!f)return new Response("Missing Authorization header",{status:401});try{let r=`${e.HX_CORE_URL}/p/v1/validation/key/agent/${u}`,i=await(await fetch(r,{method:"GET",headers:{Authorization:f}})).json();if(((p=i.payload)==null?void 0:p.flowId)!==u)return console.error("FlowId mismatch:",(c=i.payload)==null?void 0:c.flowId,"!==",u),new Response("Validation error",{status:403});let g=`${u}::${l}`,h=await J(o,e,s);if(!h){let R=new URL(o.url).searchParams.has("access_token");console.warn(`[agents] Unauthenticated agent socket upgrade (access_token query=${R}) \u2014 Composio connections from tool editor will not apply`)}let w=new Headers(o.headers);h&&w.set("X-User-Payload",JSON.stringify(h));let y=new Request(o,{headers:w});return(await ye(e.AGENT,g)).fetch(y)}catch(r){return console.error("Error in /api/ora/connect:",r),new Response("Internal error",{status:500})}}}async function bn(o,e,s){let t=new URL(o.url),n=o.method;if(!t.pathname.startsWith("/api/instances"))return;let a=await J(o,e,s);if(!a)return new Response("Unauthorized",{status:401});let p=e.HX_CORE_URL,c=e.HX_API_KEY;if(!p||!c)return console.error("Missing configuration: HX_CORE_URL or HX_API_KEY"),new Response("Internal Server Error",{status:500});let u=t.pathname.slice("/api/instances".length);u.startsWith("/")&&(u=u.slice(1)),u.endsWith("/")&&(u=u.slice(0,-1));let l="/ora/instances";u&&(l+=`/${u}`);let f=p.endsWith("/")?p.slice(0,-1):p,r=new URL(`${f}${l}`);t.searchParams.forEach((g,h)=>{r.searchParams.set(h,g)}),n==="GET"&&!u&&r.searchParams.set("filter_user_id",a.email);let m=new Headers;m.set("Authorization",c),m.set("Content-Type","application/json"),m.set("X-User-Payload",JSON.stringify(a));let i={method:n,headers:m};if(["POST","PATCH","PUT"].includes(n))try{i.body=await o.text()}catch(g){console.error("Error reading request body:",g)}try{let g=await fetch(r.toString(),i),h=await g.text();return new Response(h,{status:g.status,headers:{"Content-Type":"application/json"}})}catch(g){return console.error("Error proxying to flow instance backend:",g),new Response("Internal Server Error",{status:500})}}async function Ln(o,e,s){let t=new URL(o.url);if(o.method==="POST"&&t.pathname==="/auth/login")try{let n=await o.formData(),a=n.get("username"),p=n.get("password"),c=n.get("nextURL")||"/";if(!a||!p)return new Response("Missing username or password",{status:400});let d=new URLSearchParams;d.append("username",a),d.append("password",p),d.append("grant_type","password"),d.append("client_id",e.KC_CLIENT_ID),d.append("client_secret",e.KC_CLIENT_SECRET);let u=await fetch(`${e.KC_BASE_URL}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Cookie:"hxsecure=1"},body:d});if(!u.ok)return new Response("Unauthorized",{status:401});let l=await u.json(),f=new Response(null,{status:302,headers:{Location:c}}),r=(m,i,g)=>{f.headers.append("Set-Cookie",`${m}=${i}; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=${g}`)};return l.access_token&&r("access_token",l.access_token,l.expires_in),l.refresh_token&&r("refresh_token",l.refresh_token,l.refresh_expires_in||3600*24*30),l.id_token&&r("id_token",l.id_token,l.expires_in),f}catch(n){return console.error("Auth error:",n),new Response("Internal Server Error",{status:500})}if(t.pathname==="/auth/logout"){let n=new Response(null,{status:302,headers:{Location:"/login"}}),a=p=>{n.headers.append("Set-Cookie",`${p}=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0`)};return a("access_token"),a("refresh_token"),a("id_token"),n}if(t.pathname.startsWith("/s/")){let n=await J(o,e,s);if(!n){let a=new URL("/login",t.origin);return a.searchParams.set("nextURL",`${t.pathname}${t.search}`),Response.redirect(a.toString(),302)}return{user:n}}}export{ue as AgentDO,Ze as GENERATION_PARAM_KEYS,ve as GENERATION_PRESETS,Ee as MAX_USER_IDENTITY_LENGTH,yo as MODEL_REGISTRY_SNAPSHOT,G as NodeType,Se as PRESET_PARAM_KEYS,co as REASONING_EFFORT_LEVELS,Jt as TOOL_REGISTRY_SNAPSHOT,oo as applyPresetToOverrides,qt as buildReasoningProviderOptions,We as buildUrl,ut as clearAllContext,dt as clearAllMessages,Je as convertTempMessure,le as deleteContextToolsUpToCycle,to as deriveParamSupport,Dt as embedText,de as ensureAgentTables,De as ensureContextTable,Me as ensureMessagesTable,X as getAllMessages,pt as getContext,ae as getContextData,ft as getContextIndex,Qe as getDefaultOutVars,st as getEffectiveOutVars,ce as getMaxContextCycle,go as getModelEntry,An as handleAgentsRoutes,Ln as handleAuthRoutes,On as handleCommonRoutes,bn as handleIntancesRoutes,Ye as hashText,Kt as jsonSchemaToZod,tt as logc,b as messageTypes,so as normalizeEffectiveParams,uo as normalizeModelEntry,fo as normalizeReasoning,io as openAiReasoningParamSupport,no as openAiStandardParamSupport,me as parseCookies,bt as parseUserAuth,et as parseUserMessage,Lt as pickNodeOverrides,po as reasoningEffortLevels,Ht as reasoningExposable,mo as registerProvider,re as resolveContextRef,at as resolveModelById,nt as resolveOutVarRef,eo as resolvePreset,Vt as resolveReasoningEffort,Pt as resolveTemplate,Xe as safeParseJSON,ot as sanitizeUserIdentity,wt as sendEvent,U as serverSend,ie as setContext,ct as setMessage,lt as startEngine,lo as stripUnsupportedFromNodeData,Ke as tempTool,jt as toStreamTextSettings,ze as twitter,xn as validateFlowStart,Ge as vectorize,Ve as verifyToken,J as verifyUser,Be as walkPath,ro as workersAiParamSupport,ao as xaiParamSupport};
41
+ -----END PUBLIC KEY-----`,t=await go(s,"RS256");try{let{payload:n,protectedHeader:r}=await yo(e,t);return{ok:!0,payload:n,protectedHeader:r}}catch(n){return console.error("JWT verification failed:",n),{ok:!1,payload:null,protectedHeader:null}}}async function ur(o,e,s){let t=new URL(o.url);if(t.pathname==="/favicon.ico")return new Response(null,{status:204});if(t.pathname.startsWith("/.well-known/appspecific"))return new Response(null,{status:204})}import{getAgentByName as qe}from"agents";import{getAgentByName as xo}from"agents";import{nanoid as Ro}from"nanoid";async function wt(o,e){let s=e.sessionId||e.userId,t=e.inputs||{},n=e.runId;if(!n){let p=await Tt(o,{tenant:e.tenant,scheduleId:e.scheduleId,flowId:e.flowId,userId:e.userId,sessionId:s,triggerType:e.triggerType,inputs:t,idempotencyKey:e.idempotencyKey,label:e.label});if(!p)return{status:"error",error:"Failed to register run"};if(!p.created&&p.run.status!=="queued")return{status:"deduped",runId:p.run.id};n=p.run.id}let r={triggerId:`trg-${Ro(12)}`,triggerType:e.triggerType,tenant:e.tenant,flowId:e.flowId,userId:e.userId,sessionId:s,runId:n,scheduleId:e.scheduleId,inputs:t,idempotencyKey:e.idempotencyKey,label:e.label,nonce:e.nonce},c=await(await xo(o.AGENT,`${e.flowId}::${s}`)).enqueueTrigger(r);return c.duplicate?{status:"deduped",runId:n}:c.queued?{status:"queued",runId:n,envelope:r,taskId:c.taskId}:{status:"error",error:"Failed to queue trigger"}}var Pe="x-ora-signature",De="x-ora-timestamp",Ue="x-ora-nonce",be="x-ora-tenant",hr=300,Me=new TextEncoder;function Io(o){return[...new Uint8Array(o)].map(e=>e.toString(16).padStart(2,"0")).join("")}function To(o){try{let e=new URL(o);return`${e.origin}${e.pathname.replace(/\/$/,"")}`}catch{return o.replace(/\/$/,"")}}function Le(o){return["v1",o.timestamp,o.nonce,o.tenant,To(o.destination),o.body].join(`
42
+ `)}async function je(o,e){let s=await crypto.subtle.importKey("raw",Me.encode(o),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return Io(await crypto.subtle.sign("HMAC",s,Me.encode(e)))}function No(o,e){if(o.length!==e.length)return!1;let s=0;for(let t=0;t<o.length;t++)s|=o.charCodeAt(t)^e.charCodeAt(t);return s===0}async function wr(o){let e=String(o.timestamp??Math.floor(Date.now()/1e3)),s=await je(o.secret,Le({timestamp:e,nonce:o.nonce,tenant:o.tenant,destination:o.destination,body:o.body}));return{"content-type":"application/json",[be]:o.tenant,[De]:e,[Ue]:o.nonce,[Pe]:`v1=${s}`}}async function He(o){var f,u,m,l,d;if(!((f=o.secret)!=null&&f.trim()))return{ok:!1,error:"HX_API_KEY is not configured"};let e=(u=o.headers.get(be))==null?void 0:u.trim(),s=(m=o.headers.get(De))==null?void 0:m.trim(),t=(l=o.headers.get(Ue))==null?void 0:l.trim(),n=(d=o.headers.get(Pe))==null?void 0:d.trim();if(!e||!s||!t||!n)return{ok:!1,error:"missing signature headers"};if(!n.startsWith("v1="))return{ok:!1,error:"unsupported signature version"};let r=Number(s);if(!Number.isFinite(r))return{ok:!1,error:"invalid timestamp"};let i=Math.floor((o.now??Date.now())/1e3),c=o.toleranceSeconds??300;if(Math.abs(i-r)>c)return{ok:!1,error:"stale timestamp"};let p=await je(o.secret.trim(),Le({timestamp:s,nonce:t,tenant:e,destination:o.url,body:o.body}));return No(n.slice(3),p)?{ok:!0,tenant:e,nonce:t,timestamp:r}:{ok:!1,error:"signature mismatch"}}var Co=["manual","qstash","execute_now","hook"],q=(o,e=200)=>new Response(JSON.stringify(o),{status:e,headers:{"content-type":"application/json"}});async function Ee(o,e,s){var f;if(new URL(o.url).pathname!=="/api/triggers/dispatch")return;if(o.method!=="POST")return q({error:"Method not allowed"},405);let n=await o.text(),r=await He({secret:e.HX_API_KEY,body:n,url:o.url,headers:o.headers});if(!r.ok)return console.warn(`[triggers] rejected dispatch: ${r.error}`),q({error:"Invalid signature"},401);let i;try{i=JSON.parse(n)}catch{return q({error:"Invalid payload"},400)}if(!(i!=null&&i.runId)||!(i!=null&&i.flowId)||!(i!=null&&i.userId)||!(i!=null&&i.tenant))return q({error:"runId, flowId, userId and tenant are required"},400);if(i.tenant!==r.tenant)return q({error:"Tenant mismatch"},403);if(!Co.includes(i.triggerType))return q({error:"Unsupported triggerType"},400);let c;try{c=await K(i.flowId,e)}catch{return q({error:"Flow not found"},404)}if(!((f=c==null?void 0:c.metadata)!=null&&f.tenant)||c.metadata.tenant!==i.tenant)return console.warn(`[triggers] flow ${i.flowId} does not belong to tenant ${i.tenant}`),q({error:"Tenant mismatch"},403);let p=await wt(e,{triggerType:i.triggerType,tenant:i.tenant,scheduleId:i.scheduleId,flowId:i.flowId,userId:i.userId,sessionId:i.sessionId,runId:i.runId,inputs:i.inputs||{},idempotencyKey:i.idempotencyKey,label:i.label,nonce:r.nonce});return p.status==="error"?q({error:p.error},502):p.status==="deduped"?q({deduped:!0,runId:p.runId},200):q({accepted:!0,runId:p.runId,taskId:p.taskId},202)}var Ao=/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;async function $r(o,e,s){var r,i,c,p;let t=new URL(o.url),n=await Ee(o,e,s);if(n instanceof Response)return n;if(t.pathname.startsWith("/a/")){let f=t.pathname.split("/"),u=f[2],m=f[3];try{if(!u)return Response.redirect(new URL("/",t.origin).toString(),302);let l;try{l=await K(u,e)}catch{return new Response("Flow not found",{status:404})}if(!l.metadata||((r=l.metadata)==null?void 0:r.status)!=="active")return new Response("NO chat",{status:404});if(((i=l.metadata)==null?void 0:i.visibility)==="private"&&!await X(o,e,s)){let a=new URL("/login",t.origin);return a.searchParams.set("nextURL",`${t.pathname}${t.search}`),Response.redirect(a.toString(),302)}if(!m){let d=crypto.randomUUID(),a=new URL(`/a/${u}/${d}`,t.origin);return Response.redirect(a.toString(),302)}if(!Ao.test(m))return new Response("Id del chat no v\xE1lido",{status:400})}catch(l){return console.error("Error accessing flow KV:",l),new Response("Flow error",{status:500})}}if(t.pathname.startsWith("/api/agent/flow")){let f=t.pathname.split("/"),u=f[4],m=f[5],l=`${u}::${m}`;try{let d=await X(o,e,s);if(!d){let g=new URL(o.url).searchParams.has("access_token");console.warn(`[agents] Unauthenticated agent socket upgrade (access_token query=${g}) \u2014 Composio connections from tool editor will not apply`)}let a=new Headers(o.headers);a.delete("X-User-Payload"),d&&a.set("X-User-Payload",JSON.stringify(d));let y=new Request(o,{headers:a});return(await qe(e.AGENT,l)).fetch(y)}catch(d){return console.error("Error accessing agent:",d),new Response("Agent error",{status:500})}}if(t.pathname.startsWith("/api/ora/connect")){let f=t.pathname.split("/"),u=f[4],m=f[5];if(!u||!m)return new Response("Missing flowId or sessionId",{status:400});let l=o.headers.get("Authorization")||t.searchParams.get("authorization");if(!l)return new Response("Missing Authorization header",{status:401});try{let d=`${e.HX_CORE_URL}/p/v1/validation/key/agent/${u}`,y=await(await fetch(d,{method:"GET",headers:{Authorization:l}})).json();if(((c=y.payload)==null?void 0:c.flowId)!==u)return console.error("FlowId mismatch:",(p=y.payload)==null?void 0:p.flowId,"!==",u),new Response("Validation error",{status:403});let w=`${u}::${m}`,h=await X(o,e,s);if(!h){let $=new URL(o.url).searchParams.has("access_token");console.warn(`[agents] Unauthenticated agent socket upgrade (access_token query=${$}) \u2014 Composio connections from tool editor will not apply`)}let g=new Headers(o.headers);g.delete("X-User-Payload"),h&&g.set("X-User-Payload",JSON.stringify(h));let x=new Request(o,{headers:g});return(await qe(e.AGENT,w)).fetch(x)}catch(d){return console.error("Error in /api/ora/connect:",d),new Response("Internal error",{status:500})}}}function ot(o,e){return e.split(".").reduce((s,t)=>{if(s&&typeof s=="object")return s[t]},o)}function Pt(o,e){let s={payload:o.payload};for(let[t,n]of Object.entries(e.inputPaths||{})){let r=ot(o.payload,n);r!==void 0&&(s[t]=r)}return s}var Ve={provider:"telegram",deliveryId:o=>{let e=ot(o.payload,"update_id");return e===void 0?void 0:`telegram-${String(e)}`},toInputs:(o,e)=>{let s=ot(o.payload,"message.text");return{...Pt(o,e),...typeof s=="string"?{user_input:s}:{}}}},Ke={provider:"composio",deliveryId:o=>{let e=ot(o.payload,"id")??ot(o.payload,"data.id");return e===void 0?void 0:`composio-${String(e)}`},toInputs:Pt},Je={provider:"http",deliveryId:o=>{var e,s;return((e=o.headers)==null?void 0:e["x-delivery-id"])||((s=o.headers)==null?void 0:s["x-request-id"])},toInputs:Pt},Xe=new Map([[Ve.provider,Ve],[Ke.provider,Ke],[Je.provider,Je]]);function Mr(o){Xe.set(o.provider,o)}function _o(o){return Xe.get(o)}async function Pr(o,e,s){var n;let t=_o(e.provider);return t?wt(o,{triggerType:"hook",tenant:e.tenant,flowId:e.flowId,userId:e.userId,inputs:t.toInputs(s,e),idempotencyKey:s.deliveryId||((n=t.deliveryId)==null?void 0:n.call(t,s)),label:e.label||`${e.provider} hook`}):{status:"error",error:`No adapter registered for provider ${e.provider}`}}async function br(o,e,s){let t=new URL(o.url),n=o.method;if(!t.pathname.startsWith("/api/instances"))return;let r=await X(o,e,s);if(!r)return new Response("Unauthorized",{status:401});let i=e.HX_CORE_URL,c=e.HX_API_KEY;if(!i||!c)return console.error("Missing configuration: HX_CORE_URL or HX_API_KEY"),new Response("Internal Server Error",{status:500});let f=t.pathname.slice("/api/instances".length);f.startsWith("/")&&(f=f.slice(1)),f.endsWith("/")&&(f=f.slice(0,-1));let u="/ora/instances";f&&(u+=`/${f}`);let m=i.endsWith("/")?i.slice(0,-1):i,l=new URL(`${m}${u}`);t.searchParams.forEach((y,w)=>{l.searchParams.set(w,y)}),n==="GET"&&!f&&l.searchParams.set("filter_user_id",r.email);let d=new Headers;d.set("Authorization",c),d.set("Content-Type","application/json"),d.set("X-User-Payload",JSON.stringify(r));let a={method:n,headers:d};if(["POST","PATCH","PUT"].includes(n))try{a.body=await o.text()}catch(y){console.error("Error reading request body:",y)}try{let y=await fetch(l.toString(),a),w=await y.text();return new Response(w,{status:y.status,headers:{"Content-Type":"application/json"}})}catch(y){return console.error("Error proxying to flow instance backend:",y),new Response("Internal Server Error",{status:500})}}async function Hr(o,e,s){let t=new URL(o.url);if(o.method==="POST"&&t.pathname==="/auth/login")try{let n=await o.formData(),r=n.get("username"),i=n.get("password"),c=n.get("nextURL")||"/";if(!r||!i)return new Response("Missing username or password",{status:400});let p=new URLSearchParams;p.append("username",r),p.append("password",i),p.append("grant_type","password"),p.append("client_id",e.KC_CLIENT_ID),p.append("client_secret",e.KC_CLIENT_SECRET);let f=await fetch(`${e.KC_BASE_URL}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Cookie:"hxsecure=1"},body:p});if(!f.ok)return new Response("Unauthorized",{status:401});let u=await f.json(),m=new Response(null,{status:302,headers:{Location:c}}),l=(d,a,y)=>{m.headers.append("Set-Cookie",`${d}=${a}; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=${y}`)};return u.access_token&&l("access_token",u.access_token,u.expires_in),u.refresh_token&&l("refresh_token",u.refresh_token,u.refresh_expires_in||3600*24*30),u.id_token&&l("id_token",u.id_token,u.expires_in),m}catch(n){return console.error("Auth error:",n),new Response("Internal Server Error",{status:500})}if(t.pathname==="/auth/logout"){let n=new Response(null,{status:302,headers:{Location:"/login"}}),r=i=>{n.headers.append("Set-Cookie",`${i}=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0`)};return r("access_token"),r("refresh_token"),r("id_token"),n}if(t.pathname.startsWith("/s/")){let n=await X(o,e,s);if(!n){let r=new URL("/login",t.origin);return r.searchParams.set("nextURL",`${t.pathname}${t.search}`),Response.redirect(r.toString(),302)}return{user:n}}}export{ke as AgentDO,Uo as FLOW_INPUT_NAME_RE,Lo as GENERATION_PARAM_KEYS,Ho as GENERATION_PRESETS,bo as MAX_USER_IDENTITY_LENGTH,es as MODEL_REGISTRY_SNAPSHOT,B as NodeType,jo as PRESET_PARAM_KEYS,Bo as REASONING_EFFORT_LEVELS,St as TOOL_REGISTRY_SNAPSHOT,Ue as TRIGGER_NONCE_HEADER,Pe as TRIGGER_SIGNATURE_HEADER,hr as TRIGGER_SIGNATURE_TOLERANCE_SECONDS,be as TRIGGER_TENANT_HEADER,De as TRIGGER_TIMESTAMP_HEADER,Vo as applyPresetToOverrides,Jt as buildReasoningProviderOptions,wr as buildSignedTriggerHeaders,jt as buildTriggerMessageText,Fo as buildUrl,ho as canonicalUserEmail,pe as claimRun,mt as clearAllContext,ut as clearAllMessages,yt as completeRun,Oo as convertTempMessure,Tt as createRun,le as deleteContextToolsUpToCycle,Eo as deriveParamSupport,Pr as dispatchHookEvent,wt as dispatchTrigger,bt as embedText,ue as ensureAgentTables,Be as ensureContextTable,We as ensureMessagesTable,J as getAllMessages,ft as getContext,ae as getContextData,pt as getContextIndex,ts as getDefaultOutVars,ct as getEffectiveOutVars,Y as getFlowInputDefs,_o as getHookAdapter,de as getMaxContextCycle,os as getModelEntry,$r as handleAgentsRoutes,Hr as handleAuthRoutes,ur as handleCommonRoutes,br as handleIntancesRoutes,Ee as handleTriggerRoutes,Po as hashText,tt as initializeEngineState,te as jsonSchemaToZod,nt as logc,P as messageTypes,To as normalizeDestination,Ko as normalizeEffectiveParams,Lt as normalizeFlowInputs,Zo as normalizeModelEntry,Yo as normalizeReasoning,Xo as openAiReasoningParamSupport,Jo as openAiStandardParamSupport,Fe as parseCookies,Ht as parseUserAuth,rt as parseUserMessage,Et as pickNodeOverrides,Qo as reasoningEffortLevels,Vt as reasoningExposable,fe as recordRun,Mr as registerHookAdapter,So as registerProvider,ce as resolveContextRef,it as resolveModelById,lt as resolveOutVarRef,qo as resolvePreset,Kt as resolveReasoningEffort,Qt as resolveTemplate,et as runAgentTurn,ko as safeParseJSON,S as sanitizeUserIdentity,Ae as sendEvent,U as serverSend,ie as setContext,re as setMessage,je as signTriggerMaterial,Te as startEngine,Wo as stripUnsupportedFromNodeData,$o as tempTool,No as timingSafeEqualHex,qt as toStreamTextSettings,Le as triggerSignatureMaterial,Mo as twitter,rr as validateFlowStart,Do as vectorize,wo as verifyToken,He as verifyTriggerRequest,X as verifyUser,vo as walkPath,zo as workersAiParamSupport,Go as xaiParamSupport};
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Internal trigger surface of the tenant runtime.
3
+ *
4
+ * Every external provider (QStash today, hooks next) enters through the hx-ora gateway, which
5
+ * owns the provider credentials, resolves the tenant and registers the run. What arrives here is a
6
+ * request signed with this tenant runtime's `HX_API_KEY` and bound to this destination: the runtime authenticates
7
+ * it, confirms the flow really belongs to the claimed tenant and persists the work in the agent's
8
+ * FIFO queue, answering `202` without waiting for the agent.
9
+ */
10
+ export declare function handleTriggerRoutes(request: Request, env: Env, _ctx: ExecutionContext): Promise<Response | undefined>;
@@ -2,7 +2,8 @@ import { Agent, type Connection, type ConnectionContext, type WSMessage } from '
2
2
  import type { UserInterface } from 'lib/common/types/user-types';
3
3
  import { type Message } from '../../common/types/agent-types';
4
4
  import type { ContextIndexEntry, ContextRow, ContextUpsertInput, MemoryConfig } from '../../common/types/memory-types';
5
- import { type FlowEngineState } from '../logic/FlowEngine';
5
+ import type { TriggerEnvelope } from '../../common/types/trigger-types';
6
+ import type { FlowEngineState } from '../logic/FlowEngine';
6
7
  import type { ComposioSessionMeta } from '../utils/composio';
7
8
  import { type SecretsMap } from '../utils/secrets';
8
9
  export interface SessionEnv {
@@ -62,6 +63,40 @@ export declare class AgentDO extends Agent<Env, State> {
62
63
  onConnect(connection: Connection, ctx: ConnectionContext): Promise<void>;
63
64
  onMessage(connection: Connection, message: WSMessage): Promise<void>;
64
65
  onUserMessage(connection: Connection, message: string): Promise<void>;
66
+ /** True while the session belongs to a signed-in user; anonymous sessions are not tracked. */
67
+ hasAuditableUser(userId?: string): boolean;
68
+ /** Registers a manual turn as a run so it shows up in history and notifications. */
69
+ registerManualRun(runId: string, text: string, requestUserId?: string): Promise<unknown>;
70
+ /** Closes a manual run once its turn resolved. */
71
+ completeManualRun(runId: string, status: 'succeeded' | 'failed', error?: string): Promise<unknown>;
72
+ /**
73
+ * Persists a trigger in the DO's FIFO queue and returns immediately, so the gateway gets its
74
+ * `202` without waiting for the agent. Ordering per `flowId::sessionId` is guaranteed by the
75
+ * queue; duplicate work is neutralized twice — the signed request's nonce is single-use, and the
76
+ * run claim gates the execution itself.
77
+ *
78
+ * The DO is the right place for the nonce: it is single-threaded per session and durable, so two
79
+ * concurrent replays of the same signed request cannot both get through.
80
+ */
81
+ enqueueTrigger(envelope: TriggerEnvelope): Promise<{
82
+ queued: boolean;
83
+ duplicate?: boolean;
84
+ taskId?: string;
85
+ }>;
86
+ /**
87
+ * Records a signed request's nonce, returning false when it was already used. Entries older than
88
+ * the signature tolerance are dropped on the way, so storage cannot grow unbounded.
89
+ */
90
+ private claimTriggerNonce;
91
+ /**
92
+ * FIFO queue callback. Claims the run before executing so a retried delivery of the same
93
+ * message cannot produce a second execution, then runs the trigger as a conversation turn
94
+ * on `flowId::userId` — the persistent session keeps its history as context.
95
+ *
96
+ * A failing claim throws instead of returning quietly: the Agents SDK retries the callback, so a
97
+ * momentary hx-ora outage delays the run rather than dropping it.
98
+ */
99
+ processTrigger(envelope: TriggerEnvelope): Promise<void>;
65
100
  /**
66
101
  * Store a client-supplied session identity in persisted DO state.
67
102
  * Used as `sessions.userId` fallback when no JWT user is present; JWT always wins.
@@ -0,0 +1,43 @@
1
+ import type { Connection } from 'agents';
2
+ import type { UserInterface } from '../../common/types/user-types';
3
+ import type { UserMessagePayload } from '../../common/types/ws-message';
4
+ import { type FlowEngineEvent, type FlowEngineState } from '../logic/FlowEngine';
5
+ import type { ComposioSessionMeta } from '../utils/composio';
6
+ import { type SecretsMap } from '../utils/secrets';
7
+ /**
8
+ * Builds the initial engine state for a DO that has never been connected over WebSocket
9
+ * (HTTP `POST /message`, schedules and hooks all reach the agent without `onConnect`).
10
+ */
11
+ export declare function initializeEngineState(agent: any, env: Env): Promise<FlowEngineState | null>;
12
+ export interface AgentTurnOptions {
13
+ agent: any;
14
+ env: Env;
15
+ ctx: DurableObjectState;
16
+ payload: UserMessagePayload;
17
+ /** Live socket, when the turn came from a WebSocket message. */
18
+ connection?: Connection;
19
+ /** Pre-loaded tenant secrets (DO keeps them in memory); reloaded when missing. */
20
+ secrets?: SecretsMap;
21
+ userAuth?: SecretsMap;
22
+ composioSessions?: Record<string, ComposioSessionMeta>;
23
+ publicOrigin?: string;
24
+ skillRefCache?: Map<string, string>;
25
+ user?: UserInterface;
26
+ resolveUserId: () => string | undefined;
27
+ onServerEvent?: (event: FlowEngineEvent) => void | Promise<void>;
28
+ onError?: (error: string) => void;
29
+ onMemoryRef?: (ref: string) => void | Promise<void>;
30
+ onSecretsLoaded?: (secrets: SecretsMap) => void;
31
+ }
32
+ export interface AgentTurnResult {
33
+ status: 'completed' | 'failed';
34
+ error?: string;
35
+ engineState?: FlowEngineState;
36
+ answer?: string;
37
+ }
38
+ /**
39
+ * Single execution path shared by every trigger source: persists the user turn, refreshes
40
+ * the flow, resolves memory/secrets, runs the engine and indexes the session. Callers only
41
+ * differ in transport (WS frames, HTTP response, queued trigger).
42
+ */
43
+ export declare function runAgentTurn(options: AgentTurnOptions): Promise<AgentTurnResult>;
@@ -3,7 +3,11 @@ import { type UserMessagePayload } from '../../common/types/ws-message';
3
3
  import type { SessionEnv } from '../core/AgentDO';
4
4
  import type { FlowData } from '../types/node';
5
5
  import type { TelemetryEvent } from '../utils/telemetry';
6
- export type FlowEngine = (input?: string | UserMessagePayload) => Promise<void>;
6
+ export interface FlowEngineResult {
7
+ status: 'completed' | 'failed';
8
+ error?: string;
9
+ }
10
+ export type FlowEngine = (input?: string | UserMessagePayload) => Promise<FlowEngineResult>;
7
11
  export interface ExecutedNode {
8
12
  id: string;
9
13
  type: NodeType;
@@ -0,0 +1,42 @@
1
+ import type { FlowInputValues, TriggerEnvelope, TriggerType } from '../../common/types/trigger-types';
2
+ export interface DispatchTriggerInput {
3
+ triggerType: TriggerType;
4
+ tenant: string;
5
+ flowId: string;
6
+ /** Session owner email. Always resolved server-side, never from a provider payload. */
7
+ userId: string;
8
+ /** Defaults to `userId`, which is the operational session shared by schedules and hooks. */
9
+ sessionId?: string;
10
+ scheduleId?: string;
11
+ inputs?: FlowInputValues;
12
+ /** Provider delivery id; a repeat of the same key resolves to the same run. */
13
+ idempotencyKey?: string;
14
+ label?: string;
15
+ /**
16
+ * Run already registered upstream (the gateway registers it before dispatching). When omitted
17
+ * the run is reserved here, which is the path hooks handled inside the tenant take.
18
+ */
19
+ runId?: string;
20
+ /** Single-use id of the signed request, rejected by the agent if it repeats. */
21
+ nonce?: string;
22
+ }
23
+ export type DispatchTriggerResult = {
24
+ status: 'queued';
25
+ runId: string;
26
+ envelope: TriggerEnvelope;
27
+ taskId?: string;
28
+ } | {
29
+ status: 'deduped';
30
+ runId: string;
31
+ } | {
32
+ status: 'error';
33
+ error: string;
34
+ };
35
+ /**
36
+ * Single entry point that turns any normalized trigger into queued work.
37
+ *
38
+ * The run is reserved before queueing, but a reserved-yet-unqueued run is *not* treated as a
39
+ * duplicate: a delivery that failed between both steps would otherwise stay `queued` forever.
40
+ * Only a run that already left `queued` collapses into a dedupe.
41
+ */
42
+ export declare function dispatchTrigger(env: Env, input: DispatchTriggerInput): Promise<DispatchTriggerResult>;
@@ -0,0 +1,38 @@
1
+ import type { FlowInputValues } from '../../common/types/trigger-types';
2
+ import { type DispatchTriggerResult } from './dispatch';
3
+ /**
4
+ * Configuration stored when a hook is created. The `userId` is fixed here — provider payloads are
5
+ * never trusted to name the user, so a compromised or spoofed event cannot execute as someone else.
6
+ */
7
+ export interface HookBinding {
8
+ hookId: string;
9
+ provider: string;
10
+ tenant: string;
11
+ flowId: string;
12
+ userId: string;
13
+ label?: string;
14
+ /** Maps a declarative flow input name to a dot path inside the provider payload. */
15
+ inputPaths?: Record<string, string>;
16
+ }
17
+ export interface HookEvent {
18
+ provider: string;
19
+ payload: unknown;
20
+ /** Provider delivery id, used as the idempotency key so retries collapse into one run. */
21
+ deliveryId?: string;
22
+ headers?: Record<string, string>;
23
+ }
24
+ export interface HookAdapter {
25
+ provider: string;
26
+ /** Extracts the provider's delivery id when it is not already on the event. */
27
+ deliveryId?(event: HookEvent): string | undefined;
28
+ /** Normalizes a provider payload into declarative flow inputs. */
29
+ toInputs(event: HookEvent, binding: HookBinding): FlowInputValues;
30
+ }
31
+ export declare function registerHookAdapter(adapter: HookAdapter): void;
32
+ export declare function getHookAdapter(provider: string): HookAdapter | undefined;
33
+ /**
34
+ * Translates a provider event into the shared trigger contract and queues it, reusing the same
35
+ * run, idempotency and notification machinery as schedules. Provider-specific transports and
36
+ * their configuration UI live outside this contract.
37
+ */
38
+ export declare function dispatchHookEvent(env: Env, binding: HookBinding, event: HookEvent): Promise<DispatchTriggerResult>;
@@ -1,3 +1,4 @@
1
1
  import type { UserInterface } from 'lib/common/types/user-types';
2
+ export declare function canonicalUserEmail(payload: Record<string, unknown>): string | null;
2
3
  export declare function verifyUser(request: Request, env: Env, ctx: ExecutionContext): Promise<boolean | UserInterface | null>;
3
4
  export declare function verifyToken(env: Env, token?: string | null): Promise<any>;
@@ -0,0 +1,57 @@
1
+ import type { FlowInputValues, RunStatus, TriggerType } from '../../common/types/trigger-types';
2
+ export interface RunRecord {
3
+ id: string;
4
+ tenant: string;
5
+ scheduleId?: string | null;
6
+ flowId: string;
7
+ userId: string;
8
+ sessionId: string;
9
+ triggerType: TriggerType;
10
+ status: RunStatus;
11
+ inputs?: FlowInputValues | null;
12
+ }
13
+ export interface CreateRunInput {
14
+ id?: string;
15
+ tenant: string;
16
+ scheduleId?: string;
17
+ flowId: string;
18
+ userId: string;
19
+ sessionId: string;
20
+ triggerType: TriggerType;
21
+ inputs?: FlowInputValues;
22
+ idempotencyKey?: string;
23
+ label?: string;
24
+ }
25
+ /**
26
+ * Creates the run row, or returns the existing one when `idempotencyKey` was already seen
27
+ * (a retried delivery). `created: false` plus a still-`queued` status means the previous attempt
28
+ * never reached the queue, so the caller may safely queue it again.
29
+ */
30
+ export declare function createRun(env: Env, input: CreateRunInput): Promise<{
31
+ run: RunRecord;
32
+ created: boolean;
33
+ } | null>;
34
+ /**
35
+ * Atomically moves `queued → running`. A losing caller gets `claimed: false` and must not execute.
36
+ *
37
+ * A transport or server error is *not* a lost claim: it throws so the queue callback fails and the
38
+ * Agents SDK retries it, instead of silently dropping work the run row still expects.
39
+ */
40
+ export declare function claimRun(env: Env, runId: string): Promise<{
41
+ claimed: boolean;
42
+ run?: RunRecord;
43
+ }>;
44
+ export interface CompleteRunBody {
45
+ status: Extract<RunStatus, 'succeeded' | 'failed' | 'skipped'>;
46
+ error?: string;
47
+ summary?: string;
48
+ }
49
+ /**
50
+ * Terminal transition; also flips the run's notification back to unread.
51
+ *
52
+ * Retried a few times because the turn already happened: re-running the callback would execute the
53
+ * flow twice. If every attempt fails the run stays `running` and hx-ora's stale sweep closes it.
54
+ */
55
+ export declare function completeRun(env: Env | undefined, runId: string, body: CompleteRunBody, attempts?: number): Promise<boolean>;
56
+ /** Registers a manual run before execution so its eventual completion cannot race ahead of it. */
57
+ export declare function recordRun(env: Env | undefined, input: CreateRunInput): Promise<unknown>;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Signature of the internal trigger channel `hx-ora → ora-[tenant]`.
3
+ *
4
+ * QStash credentials live only in the gateway; tenants never see them. What reaches a tenant is a
5
+ * request signed with that tenant's Ora API key (`HX_API_KEY`), so one runtime cannot impersonate
6
+ * another tenant.
7
+ *
8
+ * The signed material covers timestamp, nonce, tenant, destination and body, so a captured request
9
+ * cannot be replayed later, against a different runtime, or with a modified payload. The mirror
10
+ * implementation lives in `hx-core-back/hx-ora/src/utils/triggerSignature.ts` and the known-answer
11
+ * test on each side keeps both byte-compatible.
12
+ */
13
+ export declare const TRIGGER_SIGNATURE_HEADER = "x-ora-signature";
14
+ export declare const TRIGGER_TIMESTAMP_HEADER = "x-ora-timestamp";
15
+ export declare const TRIGGER_NONCE_HEADER = "x-ora-nonce";
16
+ export declare const TRIGGER_TENANT_HEADER = "x-ora-tenant";
17
+ /** Accepted clock skew between gateway and tenant. Older requests are rejected outright. */
18
+ export declare const TRIGGER_SIGNATURE_TOLERANCE_SECONDS = 300;
19
+ /** Query strings and trailing slashes are not part of the identity of the destination. */
20
+ export declare function normalizeDestination(value: string): string;
21
+ export interface TriggerSignatureParts {
22
+ timestamp: string;
23
+ nonce: string;
24
+ tenant: string;
25
+ destination: string;
26
+ body: string;
27
+ }
28
+ export declare function triggerSignatureMaterial(parts: TriggerSignatureParts): string;
29
+ export declare function signTriggerMaterial(secret: string, material: string): Promise<string>;
30
+ /** Length-independent, value-independent comparison so a mismatch leaks no timing information. */
31
+ export declare function timingSafeEqualHex(a: string, b: string): boolean;
32
+ export declare function buildSignedTriggerHeaders(input: {
33
+ secret: string;
34
+ tenant: string;
35
+ destination: string;
36
+ body: string;
37
+ nonce: string;
38
+ timestamp?: number;
39
+ }): Promise<Record<string, string>>;
40
+ export type VerifyTriggerResult = {
41
+ ok: true;
42
+ tenant: string;
43
+ nonce: string;
44
+ timestamp: number;
45
+ } | {
46
+ ok: false;
47
+ error: string;
48
+ };
49
+ /**
50
+ * Validates signature, freshness, destination and tenant binding. Replay protection needs durable
51
+ * state, so the single-use nonce is enforced further in by the addressed agent, which is
52
+ * single-threaded per session.
53
+ */
54
+ export declare function verifyTriggerRequest(input: {
55
+ secret: string | undefined;
56
+ body: string;
57
+ url: string;
58
+ headers: Headers;
59
+ now?: number;
60
+ toleranceSeconds?: number;
61
+ }): Promise<VerifyTriggerResult>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hugex/ai",
3
- "version": "2.9.6",
3
+ "version": "2.9.8",
4
4
  "description": "Ora AI Agent Framework",
5
5
  "author": "a@hugex.co",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -1 +0,0 @@
1
- import{b as k}from"./chunk-OYP6D5VN.js";import{a as B}from"./chunk-V6JSMX5A.js";import{tool as rt}from"ai";import{z as C}from"zod";import{z as p}from"zod";function j(t){if(t&&typeof t=="object"&&!t.type)return p.object({});if(t.type==="object")if(t.properties){let e={},o=t.required||[];for(let[r,n]of Object.entries(t.properties)){let a=j(n),c=n!=null&&typeof n=="object"&&Object.prototype.hasOwnProperty.call(n,"default");e[r]=c?a.default(n.default):o.includes(r)?a:a.optional()}return p.object(e)}else return p.object({});else if(t.type==="array"&&t.items){let e=j(t.items);return p.array(e)}else{if(t.type==="string")return p.string();if(t.type==="number"||t.type==="integer")return p.number();if(t.type==="boolean")return p.boolean()}return p.any()}var D=/\{\{\s*secrets\.[A-Z][A-Z0-9_]*\s*\}\}/,ht=t=>D.test(t),nt=/\{\{\s*auth\.[A-Z][A-Z0-9_]*\s*\}\}/;var L=t=>D.test(t)||nt.test(t),E=t=>{let e=t.indexOf("?");return e===-1?t:`${t.slice(0,e)}?[redacted-query]`};var ot=256*1024,st=3e4,it=/\{\{\s*([^}]+?)\s*\}\}/g,ct=t=>{let e=t.toLowerCase();return e.includes("token")||e.includes("secret")||e.includes("key")||e.includes("password")||e.includes("access")||e==="authorization"},at=t=>{let e={};for(let o in t)e[o]=ct(o)?"[REDACTED]":t[o];return e},J=(t,e)=>{let o=t.indexOf(".");if(o===-1)return e[t];let r=t.slice(0,o),n=t.slice(o+1);if(r in e)return k(e[r],n)},$=(t,e,o)=>t&&t.replace(it,(r,n)=>{let a=String(n).trim();if(a.startsWith("secrets.")){let l=a.slice(8);return Object.prototype.hasOwnProperty.call(o.secrets,l)?o.secrets[l]:r}if(a.startsWith("auth.")){let l=a.slice(5);return Object.prototype.hasOwnProperty.call(o.auth,l)?o.auth[l]:r}let c=J(a,e);return c==null?"":typeof c=="string"?c:JSON.stringify(c)}),T=(t,e,o)=>{if(t==null)return t;if(typeof t=="string"){let r=t.match(/^\s*\{\{\s*([^}]+?)\s*\}\}\s*$/);if(r){let n=r[1].trim();if(n.startsWith("secrets.")){let c=n.slice(8);return Object.prototype.hasOwnProperty.call(o.secrets,c)?o.secrets[c]:t}if(n.startsWith("auth.")){let c=n.slice(5);return Object.prototype.hasOwnProperty.call(o.auth,c)?o.auth[c]:t}return J(n,e)}return $(t,e,o)}if(Array.isArray(t))return t.map(r=>T(r,e,o));if(typeof t=="object"){let r={};for(let n in t)r[n]=T(t[n],e,o);return r}return t},ut=(t,e)=>t?e?/^https?:\/\//i.test(e)?e:t.endsWith("/")&&e.startsWith("/")?t+e.slice(1):!t.endsWith("/")&&!e.startsWith("/")?`${t}/${e}`:t+e:t:e||"",dt=(t,e)=>{if(!e)return t;let o=new URL(t);for(let r in e){let n=e[r];n!==void 0&&(Array.isArray(n)?o.searchParams.set(r,n.join(",")):o.searchParams.set(r,String(n)))}return o.toString()},W=t=>{if(!t)return{};let e={};for(let o in t)t[o]!==void 0&&(e[o]=t[o]);return e},lt=t=>{let e={};for(let o in t){let r=t[o];r!=null&&(e[o]=typeof r=="string"?r:String(r))}return e},ft=(t,e,o)=>{if(!(!t||t.type==="none"||!t.value)){if(t.type==="bearer"){e.Authorization=`Bearer ${t.value}`;return}if(t.type==="apiKey"){let r=t.in||"header",n=t.param||t.header||"X-API-Key";r==="query"?o[n]=t.value:e[n]=t.value}}},pt=(t,e)=>{let o=new TextEncoder().encode(t);if(o.byteLength<=e)return{text:t,truncated:!1};let r=o.slice(0,e);return{text:new TextDecoder("utf-8",{fatal:!1}).decode(r),truncated:!0}};function yt(t,e,o,r){var U;if(t.kind!=="http")throw new Error(`customHttpTool: unsupported kind '${t.kind}' for tool '${t.name}'`);let n=t.execution||{},a=n.actions&&typeof n.actions=="object"?Object.keys(n.actions):[],c=((U=n.router)==null?void 0:U.field)||"action",l=t.inputSchema&&typeof t.inputSchema=="object"&&Object.keys(t.inputSchema).length>0?j(t.inputSchema):C.object({});if(a.length>0&&l instanceof C.ZodObject){let g=C.enum(a);l=l.extend({[c]:g})}let w=t.description||t.label||t.name,y=t.output||{},K=Number.isFinite(y.maxBytes)&&y.maxBytes>0?y.maxBytes:ot;return rt({description:w,inputSchema:l,execute:async g=>{var N;let m={secrets:e.secrets??{},auth:e.userAuth??{}},h={input:g??{},...o.context||{}},u=n,i;if(n.actions&&typeof n.actions=="object"){let s=((N=n.router)==null?void 0:N.field)||"action";if(i=g==null?void 0:g[s],!i||!n.actions[i])return{type:"error",error:`unknown action '${i}' for tool '${t.name}'`,natural:`Tool ${t.name} could not run: missing or unknown action.`};u=n.actions[i]}let H=u.url||ut(n.baseUrl,u.path);if(!H)return{type:"error",error:"missing url",natural:`Tool ${t.name} has no URL configured.`};let I=L(H),G=$(H,h,m),Q={...n.headers||{},...u.headers||{}},b=lt(W(T(Q,h,m))),X={...n.query||{},...u.query||{}},_=W(T(X,h,m)),A=(u.method||n.method||"GET").toUpperCase(),M,V=u.body!==void 0||n.body!==void 0;if(A!=="GET"&&A!=="HEAD"&&V){let s=u.body!==void 0?u.body:n.body,f=typeof s=="string"?$(s,h,m):T(s,h,m);M=typeof f=="string"?f:JSON.stringify(f),!b["Content-Type"]&&!b["content-type"]&&(b["Content-Type"]="application/json")}let R=u.auth||n.auth,Y=R?{...R,value:R.value?$(String(R.value),h,m):R.value}:void 0;ft(Y,b,_);let P=dt(G,_),v=I?E(P):P,tt=Math.min(Number.isFinite(u.timeoutMs)&&u.timeoutMs>0?u.timeoutMs:Number.isFinite(n.timeoutMs)&&n.timeoutMs>0?n.timeoutMs:15e3,st),Z={tool:t.name,action:i,stage:"request",url:v,method:A,headers:at(b)};JSON.stringify(Z),r==null||r({type:`info:tool:${t.name}:request`,content:Z});let F=new AbortController,et=setTimeout(()=>F.abort(),tt);try{let s=await fetch(P,{method:A,headers:b,body:M,signal:F.signal}),f=s.headers.get("content-type")||"",O=await s.text(),{text:x,truncated:S}=pt(O,K),d;if(y.contentType==="text"?d=x:f.includes("application/json")||y.contentType==="json"?(d=B(x),d===null&&x&&(d=x)):d=x,y.jsonPath&&d!==null&&typeof d=="object"&&(d=k(d,y.jsonPath)),!s.ok){let z={tool:t.name,action:i,stage:"http_error",status:s.status};return JSON.stringify(z),r==null||r({type:`error:tool:${t.name}:http`,content:z}),{type:"error",status:s.status,error:`HTTP ${s.status}: ${s.statusText}`,result:d,truncated:S,natural:`${t.name}${i?`:${i}`:""} failed with HTTP ${s.status}.`}}let q={tool:t.name,action:i,stage:"finish",status:s.status,truncated:S};return JSON.stringify(q),r==null||r({type:`info:tool:${t.name}:finish`,content:q}),{type:i||t.name,status:s.status,result:d,truncated:S,natural:`${t.name}${i?`:${i}`:""} completed (HTTP ${s.status}).`}}catch(s){let f=String((s==null?void 0:s.message)??s),O={tool:t.name,action:i,stage:"error",error:f};return JSON.stringify(O),r==null||r({type:`error:tool:${t.name}:execution`,content:O}),{type:"error",error:f,natural:`${t.name}${i?`:${i}`:""} failed: ${f}`}}finally{clearTimeout(et)}}})}var Pt=yt;export{ht as a,E as b,j as c,yt as d,Pt as e};
@@ -1 +0,0 @@
1
- import{Composio as eo}from"@composio/core";import{VercelProvider as io}from"@composio/vercel";import{SessionPreset as J}from"@composio/core";function A(o,n){var t;return(n==null?void 0:n.trim())||((t=o.connectionScope)==null?void 0:t.trim())||void 0}function U(o){let n=o.trim();if(!n)throw new Error("Composio connection scope is required");return n}var q=/https:\/\/connect\.composio\.dev\/link\/[^\s)\]"']+/i,z=/"redirect_?[Uu]rl"\s*:\s*"(https?:\/\/[^"]+)"/;function W(o){var t;let n=(t=o.publicOrigin)==null?void 0:t.trim();return n?n.replace(/\/$/,""):G(o.env)}function x(o){var i,e,s,c;let n=(e=(i=o.secrets)==null?void 0:i.COMPOSIO_API_KEY)==null?void 0:e.trim();if(n)return n;let t=(c=(s=o.env)==null?void 0:s.COMPOSIO_API_KEY)==null?void 0:c.trim();if(t)return t;throw new Error("COMPOSIO_API_KEY is not configured (register tenant secret or set env COMPOSIO_API_KEY)")}function Y(o){if(!o)return[];let n=[];for(let t of Object.values(o))n.push(...C(t.enable));return[...new Set(n)].sort()}function v(o){return JSON.stringify({toolkits:o.toolkits,tools:o.tools,authMode:o.authMode,authConfigs:o.authConfigs,workbench:o.workbench,sessionPreset:o.sessionPreset,sessionPreload:o.sessionPreload})}function $(o,n){var e;let t=Z(o.tools),i=o.sessionPreset==="direct_tools";return{toolkits:o.toolkits,...o.authConfigs?{authConfigs:o.authConfigs}:{},...t?{tools:t}:{},manageConnections:n.manageConnections,workbench:n.workbench,...i?{sessionPreset:J.DIRECT_TOOLS}:{},...!i&&((e=o.sessionPreload)!=null&&e.enabled)?(()=>{let s=Y(o.tools);return s.length>0?{preload:{tools:s}}:{}})():{}}}function H(o,n){var i;let t=(i=o==null?void 0:o.context)==null?void 0:i.user;return t!=null&&t.email||t!=null&&t.id?t:n.user}function F(o,n,t){var r,l,u,a;let i=H(n,o),e=(r=i==null?void 0:i.email)==null?void 0:r.trim();if(e&&e!=="default")return e;let s=(l=i==null?void 0:i.id)==null?void 0:l.trim();if(s&&s!=="default")return s;if((t==null?void 0:t.allowChatIdFallback)===!1)throw new Error("Composio user ID unavailable \u2014 log in so your tool-editor connections apply (same email as JWT preferred_username)");let c=(a=(u=n==null?void 0:n.flowData)==null?void 0:u.chatId)==null?void 0:a.trim();if(c&&c!=="default")return c;throw new Error("Composio user ID unavailable \u2014 log in (access_token cookie) or provide a chat session id")}function V(o){let n=JSON.stringify(o);return(typeof btoa=="function"?btoa(n):Buffer.from(n,"utf8").toString("base64")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function G(o){var t;let n=(t=o==null?void 0:o.ORA_PUBLIC_URL)==null?void 0:t.trim();return n?n.replace(/\/$/,""):"http://localhost:5173"}function L(o,n,t,i){let e=W(o),s=V({flowId:n??"",sessionId:t??"",toolRowId:i});return`${e}/api/composio/callback?ctx=${encodeURIComponent(s)}`}function C(o){return Array.isArray(o)?o.filter(n=>typeof n=="string"&&!!n.trim()).map(n=>n.trim()):[]}function Q(o,n){var s;let t=o.toUpperCase(),i=(s=t.split("_")[0])==null?void 0:s.toLowerCase();if(!i)return;let e=n.find(c=>c.toLowerCase()===i);return e||n.find(c=>t.startsWith(`${c.toUpperCase()}_`))}function X(o,n){let t={};for(let i of o){let e=Q(i,n);e&&(t[e]||(t[e]=[]),t[e].push(i))}return Object.fromEntries(Object.entries(t).map(([i,e])=>[i,{enable:e}]))}function Z(o){if(!o)return;let n={};for(let[t,i]of Object.entries(o)){let e=C(i.enable),s=C(i.disable);e.length?n[t]={enable:e}:s.length&&(n[t]={disable:s})}return Object.keys(n).length>0?n:void 0}function oo(o,n,t){let i=new Set(n.map(r=>r.trim()).filter(Boolean)),e={};if(o&&typeof o=="object")for(let[r,l]of Object.entries(o)){if(!i.has(r)||!l||typeof l!="object")continue;let u=l,a=C(u.enable),f=C(u.disable);a.length===0&&f.length===0||(e[r]={...a.length?{enable:a}:{},...f.length?{disable:f}:{}})}if(Object.keys(e).length>0)return e;let s=C(t==null?void 0:t.tools);if(s.length===0)return;let c=X(s,n);return Object.keys(c).length>0?c:void 0}function j(o){var r;let n=o&&typeof o=="object"?o:{},t=Array.isArray(n.toolkits)?n.toolkits.filter(l=>typeof l=="string"&&l.trim()):[];if(t.length===0)throw new Error("Composio tool execution.toolkits must be a non-empty string array");let i=oo(n.tools,t,n.preload),e=typeof n.connectionScope=="string"&&n.connectionScope.trim()?n.connectionScope.trim():void 0,s=n.sessionPreset==="direct_tools"?"direct_tools":void 0,c=((r=n.sessionPreload)==null?void 0:r.enabled)===!0?{enabled:!0}:void 0;return{toolkits:t,authMode:n.authMode==="manual"?"manual":"in_app",authConfigs:n.authConfigs,...e?{connectionScope:e}:{},...i?{tools:i}:{},manageConnections:n.manageConnections,workbench:n.workbench??{enable:!0},...s?{sessionPreset:s}:{},...c?{sessionPreload:c}:{}}}function M(o,n){var i,e;return o.authMode==="manual"?!1:{callbackUrl:((e=(i=o.manageConnections)==null?void 0:i.callbackUrl)==null?void 0:e.trim())||n}}function K(o){let n=String((o==null?void 0:o.message)??o??"").toLowerCase();return n.includes("not connected")||n.includes("not authenticated")||n.includes("connection required")||n.includes("no active connection")||n.includes("authorize")||n.includes("authentication")||n.includes("connect link")||n.includes("no connected account")||n.includes("composio_manage_connections")}function no(o){if(typeof o!="string")return;let n=o.trim();if(n.startsWith("http"))return n}function to(o){for(let n of["redirectUrl","redirect_url","composio_link_redirect_url","url","link"]){let t=no(o[n]);if(t)return d(t)??t}}function d(o){if(o&&typeof o=="object"&&!Array.isArray(o)){let i=to(o);return i||d(JSON.stringify(o))}if(typeof o!="string")return;let n=o.match(q);if(n!=null&&n[0])return n[0];let t=o.match(z);if(t!=null&&t[1]){let i=t[1].replace(/\\u0026/g,"&").replace(/\\\//g,"/");return d(i)??i}}function h(o,n){var t;if(typeof o=="string"){let i=o.toLowerCase();for(let e of(n==null?void 0:n.toolkits)??[])if(i.includes(e.toLowerCase()))return e}return(t=n==null?void 0:n.toolkits)==null?void 0:t[0]}function y(o,n,t,i,e){let s=i?d(i)??i.trim():void 0;!s||!s.startsWith("http")||o==null||o({type:"info:composio:auth_required",content:{toolkit:e,redirectUrl:s,toolRowId:n.id}})}function N(o){let n=d(o);if(n)return n;if(typeof o=="string")return d(o);try{return d(JSON.stringify(o))}catch{return}}async function so(o,n,t,i,e,s=!0){var r;let c=await o.toolkits({toolkits:n.toolkits});for(let l of c.items)if(!(l.isNoAuth||(r=l.connection)!=null&&r.isActive))try{let u=await o.authorize(l.slug,{callbackUrl:t});s&&y(e,i,n,u.redirectUrl,l.slug);break}catch(u){`${l.slug}${String(u)}`}}function ro(o,n,t,i,e=!0){let s={};for(let[c,r]of Object.entries(o)){if(!r||typeof r!="object"||typeof r.execute!="function"){s[c]=r;continue}let l=r.execute.bind(r);s[c]={...r,execute:async(...u)=>{try{let a=await l(...u);if(e){let f=N(a);f&&y(i,n,t,f,h(String(a),t))}return a}catch(a){if(K(a)){let f=N(a);y(i,n,t,f,h(String(a),t))}throw a}}}}return s}async function mo(o,n,t,i){var S,T,O,I,_,R;if(o.kind!=="composio")throw new Error(`loadComposioTools: unsupported kind '${o.kind}' for tool '${o.name}'`);let e=j(o.execution),s=x(n),c=e.authMode==="manual",r;if(c){let p=A(e,o.id);if(!p)throw new Error(`Composio manual tool '${o.name}' is missing connection scope (tool id or execution.connectionScope)`);r=U(p)}else r=F(n,t,{allowChatIdFallback:!0});let l=(S=t.flowData)==null?void 0:S.flowId,u=(T=t.flowData)==null?void 0:T.chatId,a=((O=e.manageConnections)==null?void 0:O.callbackUrl)||L(n,l,u,o.id),f=M(e,a),w=new eo({apiKey:s,provider:new io});n.composioSessions||(n.composioSessions={});let E=v(e),D=c?!1:((I=e.workbench)==null?void 0:I.enable)!==!1,g,m=n.composioSessions[o.id];m!=null&&m.sessionId&&m.userId===r&&m.configKey===E?(g=await w.use(m.sessionId),`${m.sessionId}${o.name}${r}`,void 0):(g=await w.create(r,$(e,{manageConnections:f,workbench:{enable:D}})),n.composioSessions[o.id]={sessionId:g.sessionId,userId:r,configKey:E},`${g.sessionId}${o.name}${r}${e.authMode}${e.sessionPreset??"default"}`,(_=e.sessionPreload)!=null&&_.enabled,void 0);try{let p=await g.toolkits({toolkits:e.toolkits});for(let b of p.items){let P=!!(b.isNoAuth||(R=b.connection)!=null&&R.isActive);`${b.slug}${P}${r}`}await so(g,e,a,o,i,!c)}catch(p){`${o.name}${String(p)}`}let k=await g.tools(),B=Array.isArray(k)?Object.fromEntries(k.map(p=>[p.name??p.toolName,p])):k;return ro(B,o,e,i,!c)}export{mo as a};
@@ -1 +0,0 @@
1
- var S=(a=>(a.START_NODE="startNode",a.CLASSIFIER_NODE="classifierNode",a.MEMO_NODE="memoNode",a.LLM_NODE="llmNode",a.ANSWER_NODE="answerNode",a.API_NODE="apiNode",a))(S||{});function D(t,n){if(!n)return t;if(t==null)return;let u=n.split("."),e=t;for(let f of u){if(e==null)return;e=e[f]}return e}function A(t){switch(t){case"startNode":return[{name:"user_input",path:"user_input",label:"User input",source:"default"},{name:"images",path:"images",label:"User images",type:"image",source:"default"},{name:"files",path:"files",label:"User docs",type:"file",source:"default"}];case"llmNode":return[{name:"output",path:"",label:"LLM text",source:"default"}];case"apiNode":return[{name:"ok",path:"ok",source:"default"},{name:"status",path:"status",source:"default"},{name:"data",path:"data",source:"default"}];case"classifierNode":return[{name:"classification",path:"classification",source:"default"}];case"memoNode":return[{name:"context",path:"",label:"Retrieved context",source:"default"}];case"answerNode":return[];default:return[]}}function V(t){var f;let n=A(t.type),u=((f=t.data)==null?void 0:f.outVars)||[],e=[...n];for(let i of u){let a=e.findIndex(N=>N.name===i.name);a>=0?e[a]={...i,source:"user"}:e.push({...i,source:"user"})}return e}function M(t,n){var g,s,o,d,r,c,x;if(t==="user_input")return(g=n.context)==null?void 0:g.user_input;if(t==="images")return(s=n.context)==null?void 0:s.user_images;if(t==="classified_id")return(o=n.context)==null?void 0:o.classified_id;if(t==="files"||t==="file_content")return((d=n.context)==null?void 0:d.files)||((r=n.context)==null?void 0:r.file_content);let u=t.indexOf(".");if(u===-1){let O=t;return n.nodes.find(y=>y.id===O)?(c=n.results)==null?void 0:c[O]:void 0}let e=t.substring(0,u),f=t.substring(u+1),i=n.nodes.find(O=>O.id===e);if(!i)return;let a=V(i),N=f.split(".")[0],_=a.find(O=>O.name===N);if(!_)return;let p=(x=n.results)==null?void 0:x[e],E=D(p,_.path??""),l=f.substring(N.length+1);return l?D(E,l):E}var I="\0__ORA_OB__\0",R="\0__ORA_CB__\0";function L(t,n,u,e){var p,E;if(!t)return t;let f=(e==null?void 0:e.serializeNonStrings)??!1,i=t.replace(/\\\{\{/g,I).replace(/\\\}\}/g,R),a={...u.context||{}};if((p=n.data)!=null&&p.varMapping&&Array.isArray(n.data.varMapping))for(let l of n.data.varMapping){let g=l.var||l.to,s=l.from;if(g&&s){let o=!1,d=!1;if(s==="images")o=!0;else if(s==="files"||s==="file_content")d=!0;else{let c=s.indexOf(".");if(c!==-1){let x=s.substring(0,c),O=s.substring(c+1).split(".")[0],h=u.nodes.find(y=>y.id===x);if(h){let m=V(h).find(v=>v.name===O);(m==null?void 0:m.type)==="image"&&(o=!0),(m==null?void 0:m.type)==="file"&&(d=!0)}}}if(o||d)continue;let r=M(s,u);(r==null||r==="")&&(r=l.default??""),a[g]=r}}let N=/\{\{\s*([^}]+?)\s*\}\}/g;i=i.replace(N,(l,g)=>{var o,d;let s=g.trim();if(s.startsWith("secrets.")){let r=s.slice(8);return u.secrets?Object.prototype.hasOwnProperty.call(u.secrets,r)?u.secrets[r]:((d=e==null?void 0:e.onError)==null||d.call(e,`Secret "${r}" is not defined for this tenant`),l):((o=e==null?void 0:e.onError)==null||o.call(e,`Secret reference {{ ${s} }} cannot be resolved (no secrets context)`),l)}if(Object.prototype.hasOwnProperty.call(a,s)){let r=a[s],c;return typeof r=="string"?c=r:typeof r=="object"&&r!==null?c=f?JSON.stringify(r):JSON.stringify(r,null,2):r!=null?c=f?JSON.stringify(r):String(r):c="",c}return l});let _=i.match(/\{\{\s*[^}]+\s*\}\}/g);return _&&((E=e==null?void 0:e.onError)==null||E.call(e,`Mismatch detected: Unmatched placeholders found: ${_}`)),i=i.split(I).join("{{").split(R).join("}}"),i}export{S as a,D as b,A as c,V as d,M as e,L as f};
@@ -1 +0,0 @@
1
- import{a}from"./chunk-GOWQA2OT.js";import"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{a as loadComposioTools};
@@ -1 +0,0 @@
1
- import{d as a,e as b}from"./chunk-26SLPOG6.js";import"./chunk-OYP6D5VN.js";import"./chunk-V6JSMX5A.js";import"./chunk-U56YWPSI.js";import"./chunk-3TXHFKDN.js";export{a as customHttpTool,b as default};
File without changes