@hugex/ai 4.0.0 → 4.1.0

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.
@@ -1 +1 @@
1
- import{h as a,i as b}from"./chunk-KJ77K3N3.js";import"./chunk-3D77ZXDC.js";import"./chunk-62G7NURX.js";import"./chunk-AKJFVR6J.js";import"./chunk-EHOK5FW2.js";import"./chunk-3K4IMMLP.js";import"./chunk-G73VSMK7.js";import"./chunk-LUS5CJY2.js";import"./chunk-HJPR76HF.js";import"./chunk-V6JSMX5A.js";import"./chunk-YLDLDEUP.js";import"./chunk-U56YWPSI.js";import"./chunk-YHXUBVN2.js";import"./chunk-3TXHFKDN.js";export{b as FlowExecutionStoppedError,a as startEngine};
1
+ import{k as a,l as b}from"./chunk-CC5VKJB7.js";import"./chunk-3D77ZXDC.js";import"./chunk-62G7NURX.js";import"./chunk-AKJFVR6J.js";import"./chunk-EHOK5FW2.js";import"./chunk-3K4IMMLP.js";import"./chunk-G73VSMK7.js";import"./chunk-LUS5CJY2.js";import"./chunk-HJPR76HF.js";import"./chunk-V6JSMX5A.js";import"./chunk-YLDLDEUP.js";import"./chunk-U56YWPSI.js";import"./chunk-YHXUBVN2.js";import"./chunk-3TXHFKDN.js";export{b as FlowExecutionStoppedError,a as startEngine};
@@ -0,0 +1,12 @@
1
+ import{a as me}from"./chunk-3D77ZXDC.js";import{a as Z,b as E,c as ge,d as yt}from"./chunk-62G7NURX.js";import{a as Le}from"./chunk-AKJFVR6J.js";import{a as ce,b as ue,d as pe,g as fe,i as xt}from"./chunk-EHOK5FW2.js";import{a as Ve,b as He}from"./chunk-3K4IMMLP.js";import{Aa as B,B as ee,Ba as Re,C as Tt,Fa as It,Ga as Te,Ha as xe,Ia as Ae,Ja as ke,Ka as Ie,L as ne,La as Ot,Ma as Oe,Na as _e,O as re,Oa as $e,P as se,Pa as be,R as ae,Ta as Fe,Wa as De,Xa as Ce,Ya as Pe,a as v,aa as le,b as Qt,db as Me,fb as je,gb as We,hb as Ue,i as Nt,ma as de,pa as at,qa as ye,r as Et,s as St,sa as we,ta as he,u as vt,ua as Ne,v as Rt,va as At,wa as kt}from"./chunk-G73VSMK7.js";import{B as ie,c as mt,d as Zt,i as te,k as ot,r as oe,s as q,v as it,w as z}from"./chunk-LUS5CJY2.js";import{a as zt,b as Gt,d as Yt}from"./chunk-YLDLDEUP.js";import{a as gt}from"./chunk-YHXUBVN2.js";import{a as ft}from"./chunk-3TXHFKDN.js";async function Be(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 w=await n.json();return{name:t.name,text:w.text||""}}catch(n){return console.error(`extractDocuments: ${t.name} threw`,n),{name:t.name,text:""}}})):[]}function eo(o,e,i){var t,n,w,p;return ot(((n=(t=i.flowData)==null?void 0:t.state)==null?void 0:n.nodes)??[],((p=(w=i.flowData)==null?void 0:w.state)==null?void 0:p.edges)??[],e.id).some(s=>s.ref===o&&(s.type==="image"||s.type==="file"))}function oo(o,e){var p,s,d,a,f,g,h;let i=Array.isArray((p=o.data)==null?void 0:p.outputMapping)?o.data.outputMapping:[];if(i.length===0)return null;let t=((d=(s=e.flowData)==null?void 0:s.state)==null?void 0:d.nodes)||[],n={},w=new Set;for(let c of i){let m=(a=c.key)==null?void 0:a.trim(),r=(f=c.from)==null?void 0:f.trim();if(!m||!r)throw new Error(`Answer node ${o.id} has an incomplete variable mapping`);if(w.has(m))throw new Error(`Answer node ${o.id} has duplicate output key "${m}"`);if(eo(r,o,e))throw new Error(`Answer node ${o.id} cannot persist binary source "${r}"`);let y=z(r,{context:e.context||{},results:e.results||{},nodes:t,edges:((h=(g=e.flowData)==null?void 0:g.state)==null?void 0:h.edges)??[],currentNodeId:o.id}),l=y.value;if(y.missing||l===void 0||l===null){if(c.default===void 0)throw new q(y.missing==="ancestor_not_executed"?"ANCESTOR_NOT_EXECUTED":"PATH_NOT_FOUND",`Answer node ${o.id} could not resolve output "${r}"`);l=c.default}n[m]=l,w.add(m)}try{JSON.stringify(n)}catch{throw new Error(`Answer node ${o.id} produced a value that is not JSON serializable`)}return n}async function _t(o,e,i,t,n,w,p){var d,a,f;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s;try{s=oo(e,i)}catch(g){throw t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(g)}}),g}s&&o.outputCollector&&o.outputCollector.add(e.id,s);try{let g=await((d=o.getMessages)==null?void 0:d.call(o))??[],h=((a=g[g.length-1])==null?void 0:a.type)==="text"?g[g.length-1].content:"NO-TEXT";p==null||p({type:"answer_node",payload:{userMessage:(f=i==null?void 0:i.context)==null?void 0:f.user_input,answer:h}})}catch(g){console.error("answerNodeRunner: failed to emit answer telemetry:",g),t==null||t({type:"debug",content:"Warning: failed to emit answer telemetry"})}n==null||n(e.id,{type:"answerNode",message:"Answer response for: "+e.data.response,saved:!0,persistenceRequested:!!s&&!!o.outputCollector,persisted:!1,...o.runId?{runId:o.runId}:{}}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}function X(o,e,i,t,n){var s,d,a,f,g;let w=(n==null?void 0:n.callerTag)??"llmNodeRunner",p=(n==null?void 0:n.serializeNonStrings)??!1;return ie(o,e,{context:i.context??{},results:i.results??{},nodes:((d=(s=i.flowData)==null?void 0:s.state)==null?void 0:d.nodes)??[],edges:((f=(a=i.flowData)==null?void 0:a.state)==null?void 0:f.edges)??[],currentNodeId:e.id,secrets:(g=n==null?void 0:n.sessionEnv)==null?void 0:g.secrets},{callerTag:w,serializeNonStrings:p,onError:h=>{t==null||t({type:`error:${w}`,content:h})}})}var $t="[redacted]",qe=8*1024;function io(o){if(o==null)return{value:o,truncated:!1};let e=typeof o=="string"?o:JSON.stringify(o),i=new TextEncoder().encode(e);if(i.byteLength<=qe){if(typeof o=="string")return{value:o,truncated:!1};try{return{value:JSON.parse(e),truncated:!1}}catch{return{value:e,truncated:!1}}}let t=i.slice(0,qe);return{value:new TextDecoder("utf-8",{fatal:!1}).decode(t),truncated:!0}}function no(o,e){return it(o,e)}var bt=(o,e,i,t,n)=>X(o,e,i,n,{callerTag:"apiNodeRunner",serializeNonStrings:!0,sessionEnv:t});async function Dt(o,e,i,t,n,w,p){var a,f,g,h,c,m;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s=null,d=Date.now();try{console.log("[apiNodeRunner] context keys:",Object.keys(i.context||{})),console.log("[apiNodeRunner] results keys:",Object.keys(i.results||{}));let r=((a=e.data)==null?void 0:a.url)||"",y=bt(r,e,i,o,t);if(console.log("[apiNodeRunner] resolved url:",Z(r)?E(y):y),!y){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,s);return}let l=(((f=e.data)==null?void 0:f.method)||"GET").toUpperCase();console.log("[apiNodeRunner] method:",l);let R=((g=e.data)==null?void 0:g.headers)||{},u={},N={};for(let U in R)if(Object.prototype.hasOwnProperty.call(R,U)){let M=String(R[U]??"");N[U]=Z(M),u[U]=bt(M,e,i,o,t)}let T,b=!1;if(l!=="GET"&&l!=="HEAD"&&((h=e.data)==null?void 0:h.body)!==void 0){let U=typeof e.data.body=="string"?e.data.body:JSON.stringify(e.data.body);b=Z(U),T=bt(U,e,i,o,t),!u["Content-Type"]&&!u["content-type"]&&(u["Content-Type"]="application/json")}let P={};for(let U in u)P[U]=N[U]?$t:u[U];console.log("[apiNodeRunner] headers:",JSON.stringify(P)),console.log("[apiNodeRunner] body:",b?$t:T),t==null||t({type:"info:apiNodeRunner:request",content:{nodeId:e.id,method:l,url:Z(r)?E(y):y,headers:P,body:b?$t:T}});let _=Number((c=e.data)==null?void 0:c.timeoutMs),j=new AbortController,k=Number.isFinite(_)&&_>0?setTimeout(()=>j.abort(),_):null,A;try{console.log("[apiNodeRunner] fetching..."),A=await fetch(y,{method:l,headers:u,body:T,signal:j.signal}),console.log("[apiNodeRunner] fetch returned status:",A.status)}finally{k&&clearTimeout(k)}let F=A.headers.get("content-type")||"";console.log("[apiNodeRunner] content-type:",F);let D=await oe(A);console.log("[apiNodeRunner] payload preview:",typeof D=="string"?D.slice(0,200):JSON.stringify(D).slice(0,200)),s={ok:A.ok,status:A.status,data:D};let $=Date.now()-d;p==null||p({type:"api_call",payload:{nodeId:e.id,url:y,method:l,status:A.status,latencyMs:$}});let{value:O,truncated:W}=io(D);t==null||t({type:"info:apiNodeRunner:response",content:{nodeId:e.id,ok:A.ok,status:A.status,latencyMs:$,data:O,truncated:W,outVars:no(e,s)}}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}catch(r){console.error("Error processing ApiNode:",r),t==null||t({type:"error:apiNodeRunner",content:`API node execution failed: ${r}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(r)}})}finally{console.log("[apiNodeRunner] final result:",(m=JSON.stringify(s))==null?void 0:m.slice(0,300)),n==null||n(e.id,s)}}var ro="[redacted]",Xe=8*1024;function Ct(o,e){if(typeof o=="string")return Z(o)?typeof e=="string"&&/^https?:\/\//i.test(e)?E(e):ro:e;if(o&&typeof o=="object"&&!Array.isArray(o)){let i={},t=e&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let[n,w]of Object.entries(o))i[n]=Ct(w,t[n]);return i}if(Array.isArray(o)){let i=Array.isArray(e)?e:[];return o.map((t,n)=>Ct(t,i[n]))}return e}function so(o){if(o==null)return{value:o,truncated:!1};let e=typeof o=="string"?o:JSON.stringify(o),i=new TextEncoder().encode(e);if(i.byteLength<=Xe){if(typeof o=="string")return{value:o,truncated:!1};try{return{value:JSON.parse(e),truncated:!1}}catch{return{value:e,truncated:!1}}}let t=i.slice(0,Xe);return{value:new TextDecoder("utf-8",{fatal:!1}).decode(t),truncated:!0}}function ao(o,e){return it(o,e)}var lo=(o,e,i,t,n)=>X(o,e,i,n,{callerTag:"toolNodeRunner",serializeNonStrings:!0,sessionEnv:t});function wt(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)?o:{}}function co(o){let e=wt(o);if(Array.isArray(e.enum)&&e.enum.length>0)return e.enum.every(n=>typeof n=="string"||typeof n=="number")?"enum":"unsupported";switch(Array.isArray(e.type)?e.type.find(t=>typeof t=="string"&&t!=="null"):e.type){case"string":return"string";case"number":return"number";case"integer":return"integer";case"boolean":return"boolean";case"object":return"object";case"array":return"array";default:return"unsupported"}}function uo(o,e){var p,s;let i={},t={},n=((p=o.data)==null?void 0:p.inputSchema)??e;if(n&&typeof n=="object"&&!Array.isArray(n)){t=wt(wt(n).properties);for(let[d,a]of Object.entries(t))i[d]=co(a);return{types:i,properties:t}}let w=(s=o.data)==null?void 0:s.argTypes;if(w&&typeof w=="object"&&!Array.isArray(w))for(let[d,a]of Object.entries(w))typeof a=="string"&&(i[d]=a);return{types:i,properties:t}}function po(o,e,i){if(o.trim()!==""){if(o==="null"&&e&&e!=="string"&&e!=="enum")return null;switch(e){case"string":return o;case"enum":{let t=wt(i).enum;if(Array.isArray(t)){let n=t.find(w=>String(w)===o);if(n!==void 0)return n}return o}case"number":{let t=Number(o);return Number.isFinite(t)?t:o}case"integer":{let t=Number.parseInt(o,10);return Number.isFinite(t)?t:o}case"boolean":return o==="true"?!0:o==="false"?!1:o;case"object":case"array":case"unsupported":try{return JSON.parse(o)}catch{return o}default:return o}}}function fo(o){return o===void 0||typeof o=="string"&&o.trim()===""}function Pt(o,e,i,t,n,w,p){if(typeof o=="string"){let s=o.includes("{{")?lo(o,e,i,t,n):o;return po(s,w,p)}if(o&&typeof o=="object"&&!Array.isArray(o)){let s={};for(let[d,a]of Object.entries(o))s[d]=Pt(a,e,i,t,n);return s}return Array.isArray(o)?o.map(s=>Pt(s,e,i,t,n)):o}function mo(o,e,i,t,n,w){let p={};for(let[s,d]of Object.entries(o)){let a=Pt(d,e,i,t,n,w.types[s],w.properties[s]);fo(a)||(p[s]=a)}return p}async function go(o,e){if(o.toolDefs)return o.toolDefs;if(!o.env)return{};if(o.getToolDefs&&(e!=null&&e.flowId)){let n=await o.getToolDefs({flowId:e.flowId,tenant:e.tenant,org:e.org});return o.toolDefs=n,n}let i=await gt(o.env),t={};for(let n of i)n!=null&&n.id&&(t[n.id]=n);return o.toolDefs=t,t}function yo(o){var e,i,t;return((e=o.data)==null?void 0:e.source)==="catalog"?"catalog":((i=o.data)==null?void 0:i.source)==="composio"?"composio":(((t=o.data)==null?void 0:t.source)==="http","http")}function wo(o,e,i){let t=xt(o.execution);if(t.authMode==="manual"){let n=ce(t,o.id);if(!n)throw new Error(`Composio tool '${o.name}' is missing connection scope`);return ue(n)}return fe(e,i,{allowChatIdFallback:!0})}async function Mt(o,e,i,t,n,w,p){var f,g,h,c,m,r,y,l;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s={ok:!1,data:null,error:null},d=Date.now(),a=yo(e);try{if(a==="catalog")throw new Error("This Tool node still uses a curated catalog connector. Reconfigure it to a tenant HTTP or connector tool.");let R=(f=e.data)!=null&&f.args&&typeof e.data.args=="object"&&!Array.isArray(e.data.args)?e.data.args:{},u=typeof((g=e.data)==null?void 0:g.toolId)=="string"?e.data.toolId.trim():"";if(!u)throw new Error("Tool nodes require toolId");let T=(await go(o,{flowId:(h=i.flowData)==null?void 0:h.flowId,tenant:(c=i.flowData)==null?void 0:c.tenant}))[u];if(!T)throw new Error(`Tool ${u} not found`);let b="";if(a==="composio"){if(T.kind!=="composio")throw new Error(`Tool ${u} is not a connector tool`);if(b=typeof((m=e.data)==null?void 0:m.toolSlug)=="string"?e.data.toolSlug.trim():"",!b)throw new Error("Connector tool nodes require toolSlug");let F=xt(T.execution);if(!pe(F.tools).includes(b))throw new Error(`Tool slug ${b} is not enabled on connector ${u}`)}else if(T.kind!=="http")throw new Error(`Tool ${u} is not an HTTP tool`);let P=uo(e,a==="http"?T.inputSchema:void 0),_=mo(R,e,i,o,t,P);if(t==null||t({type:"info:toolNodeRunner:request",content:{nodeId:e.id,source:a,toolSlug:(r=e.data)==null?void 0:r.toolSlug,toolId:(y=e.data)==null?void 0:y.toolId,args:Ct(R,_)}}),a==="composio"){let F=typeof((l=e.data)==null?void 0:l.toolVersion)=="string"?e.data.toolVersion.trim():"",D=await me(o,{toolSlug:b,connectionScope:wo(T,o,i),toolVersion:F||null,arguments:_});s={ok:D.ok,data:D.ok?D.data:null,error:D.ok?null:D.error??"Tool execution failed"}}else{let F=yt(T,o,i,t);if(!F.execute)throw new Error(`Tool ${u} is missing an execute handler`);let D=await F.execute(_,{}),$=D&&typeof D=="object"&&"error"in D&&D.error?String(D.error):null;s={ok:!$,data:D,error:$}}let j=Date.now()-d;p==null||p({type:"tool_call",payload:{nodeId:e.id,url:a==="composio"?`composio:${b}`:`tool:${u}`,method:"EXECUTE",status:s.ok?200:502,latencyMs:j}});let{value:k,truncated:A}=so(s.data);t==null||t({type:"info:toolNodeRunner:response",content:{nodeId:e.id,ok:s.ok,latencyMs:j,data:k,truncated:A,error:s.error,outVars:ao(e,s)}}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:s.ok?"success":"error",error:s.error??void 0}})}catch(R){let u=R instanceof Error?R.message:String(R);s={ok:!1,data:null,error:u},t==null||t({type:"error:toolNodeRunner",content:`Tool node execution failed: ${u}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:u}})}finally{n==null||n(e.id,s)}}var ho=1440*60*1e3,Ke=8*1024;function ze(o){if(o==null)return{value:o,truncated:!1};let e=new TextEncoder().encode(JSON.stringify(o));return e.byteLength<=Ke?{value:o,truncated:!1}:{value:new TextDecoder().decode(e.slice(0,Ke)),truncated:!0}}async function jt(o,e,i,t,n,w,p){var g,h;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s={ok:!1,data:null,error:null},d=Date.now(),a="crawl:unknown",f=c=>{let m=JSON.stringify(c);for(let r of Object.values(o.secrets??{}))r&&(m=m.split(JSON.stringify(r).slice(1,-1)).join("[redacted]"),m=m.split(encodeURIComponent(r)).join("[redacted]"));return JSON.parse(m)};try{let c=o.env;if(!(c!=null&&c.CF_ACCOUNT_ID)||!(c!=null&&c.CF_BROWSER_RUN_TOKEN))throw new Error("Crawl no configurado: faltan CF_ACCOUNT_ID / CF_BROWSER_RUN_TOKEN");let m=X(e.data.url,e,i,t,{callerTag:"crawlNodeRunner",serializeNonStrings:!0,sessionEnv:o}),r=Et(e.data,m),y=Z(e.data.url);a=`crawl:${f(new URL(m).host)}`;let l=`crawl:pending:${await St(r)}`,R=(g=o.ctx)==null?void 0:g.storage,u=await(R==null?void 0:R.get(l)),N=u&&typeof u.jobId=="string"&&u.jobId&&Number.isFinite(u.createdAt)&&Date.now()-u.createdAt>=0&&Date.now()-u.createdAt<ho;u&&!N&&await(R==null?void 0:R.delete(l)),t==null||t({type:"info:crawlNodeRunner:request",content:{nodeId:e.id,url:y?f(E(m)):m,resumeJobId:N?u.jobId:void 0}}),{result:s}=await vt({accountId:c.CF_ACCOUNT_ID,apiToken:c.CF_BROWSER_RUN_TOKEN},e.data,{url:m,...N?{resumeJobId:u.jobId}:{}}),s.error==="timeout"&&((h=s.data)!=null&&h.jobId)?await(R==null?void 0:R.put(l,{jobId:s.data.jobId,createdAt:N?u.createdAt:Date.now()})):s.data&&s.data.status!=="running"&&await(R==null?void 0:R.delete(l))}catch(c){s={ok:!1,data:null,error:c instanceof Error?c.message:String(c)},t==null||t({type:"error:crawlNodeRunner",content:f(`Crawl node execution failed: ${s.error}`)})}finally{let c=Date.now()-d;p==null||p({type:"tool_call",payload:{nodeId:e.id,url:a,method:"EXECUTE",status:s.ok?200:502,latencyMs:c}});let m=ze(f(s.data));t==null||t({type:"info:crawlNodeRunner:response",content:{nodeId:e.id,ok:s.ok,latencyMs:c,data:m.value,truncated:m.truncated,error:f(s.error),outVars:ze(f(it(e,s))).value}}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:s.ok?"success":"error",error:f(s.error)??void 0}}),n==null||n(e.id,s)}}var No=6e4,Ro=250,To=2e3;function xo(o){let e=o;if(!(e!=null&&e.WEB_SESSION)||!e.WEB_SESSION_KEY)return null;let i=e.WEB_SESSION;return t=>i.get(i.idFromName(t))}async function Wt(o,e,i,t,n,w,p){var j,k,A,F,D;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s=Date.now(),d=s+Rt.timeoutMs,a=((j=o.env)==null?void 0:j.WEB_ACTIONS_ALLOW_PRIVATE)==="true",f=Object.values(o.secrets??{}).filter($=>typeof $=="string"&&$!==""),g=[],h=()=>[...f,...g],c=$=>{t==null||t({type:$.type,content:at($.content,h())})},m={callerTag:"webActionsNodeRunner",serializeNonStrings:!0,sessionEnv:o},r={ok:!1,data:null,error:null},y="unknown",l,R,u,N,T,b=async()=>{let $=u;if(u=void 0,T=void 0,$)try{await B($.close(),Date.now()+3e3)}catch{}},P={},_=[];try{let $=e.data??{},O=ee($);if(O.length>0)throw new Error(`WebActions inv\xE1lido: ${O[0].message}`);let W=(k=o.env)==null?void 0:k.BROWSER;if(!W)throw new Error("WebActions no configurado: falta el binding BROWSER");if(typeof $.url!="string")throw new Error("WebActions inv\xE1lido: url is required.");let U=X($.url,e,i,c,m);l=U,we(U,{allowPrivate:a});let M=Array.isArray($.actions)?$.actions:[];d=s+($.timeoutMs??Rt.timeoutMs),c({type:"info:webActionsNodeRunner:request",content:{nodeId:e.id,url:Z($.url)?E(U):U,steps:M.length}});let G=V=>X(V,e,i,c,m),x={};for(let V of $.headers??[]){let H=G(V.value);H&&g.push(H),x[V.name]=H}let C=V=>{let H=V.find(Y=>Y.blocked);return H!=null&&H.blocked?(c({type:"info:webActionsNodeRunner:blocked",content:{nodeId:e.id,vendor:H.blocked.vendor,kind:H.blocked.kind}}),!0):!1},I=(A=$.session)!=null&&A.enabled?$.session:void 0,L=null,J,nt;if(I){let V=xo(o.env);if(!V)c({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"unavailable",reason:"falta WEB_SESSION o WEB_SESSION_KEY"}});else{let H=M.slice(0,I.loginSteps).map(K=>"value"in K&&typeof K.value=="string"?G(K.value):"checked"in K&&typeof K.checked=="string"?G(K.checked):"");g.push(...H.filter((K,S)=>K!==""&&["fill","select"].includes(M[S].op)));let Y=String(((F=i.flowData)==null?void 0:F.tenant)??((D=o.env)==null?void 0:D.TENANT)??"");L=V(await Te(Y,U,H,I.generation??0)),J=M[Tt(M,0,I.loginSteps)].target,nt=M[Tt(M,I.loginSteps)].target}}let{launch:lt}=await import("@cloudflare/playwright"),rt=!1,dt=lt(W).then(async V=>{if(rt){try{await B(V.close(),Date.now()+3e3)}catch{}throw new Error("timeout")}return V});try{R=await B(dt,d)}catch(V){throw rt=!0,V}let ct=R,ut=(V,H)=>({deadline:d,sensitive:g,allowPrivate:a,activity:V,indexOffset:H,resolve:G,onAmbiguous:(Y,K)=>{c({type:"info:webActionsNodeRunner:ambiguous",content:{nodeId:e.id,stepId:K.id,count:Y}})}}),Xt=async V=>{if(L)try{await B(L.save(await V.storageState({indexedDB:!0}),Date.now()),d),c({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"saved"}})}catch(H){c({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"save_failed",error:kt(H).message}})}};for(let V=0;;V++){_.length=0;for(let pt of Object.keys(P))delete P[pt];let H=L?await B(L.load(),d).catch(()=>null):null;u=await B(ct.newContext(H?{storageState:H.state}:{}),d),T=await B(u.newPage(),d),Object.keys(x).length>0&&await B(u.setExtraHTTPHeaders(x),d),await he(T,{allowPrivate:a},d),N==null||N.dispose(),N=Re(T);try{await T.goto(U,{waitUntil:"domcontentloaded",timeout:At(d)})}catch(pt){throw kt(pt)}await N.settle(d,To);let Y=0,K=!1;if(L&&I&&J&&nt)if(await Ae(T,J,nt,d)==="session")K=!0,Y=I.loginSteps,_.push(...M.slice(0,Y).map(st=>({id:st.id,op:st.op,ok:!0,ms:0,skipped:"session"}))),c({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"reused"}});else{let st=crypto.randomUUID(),Kt=await B(L.acquire(st,No),d);if(!Kt&&V===0){for(c({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"waiting"}});await B(L.busy(),d);)await new Promise(et=>setTimeout(et,Math.min(Ro,At(d))));await b();continue}try{c({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"login"}});let et=await B(It(T,M.slice(0,I.loginSteps),ut(N,0)),d);if(_.push(...et.steps),et.error)throw C(et.steps),new Error(et.error);await Xt(u)}finally{Kt&&await B(L.release(st),Date.now()+3e3).catch(()=>{})}Y=I.loginSteps}let S=await B(It(T,M.slice(Y),ut(N,Y)),d);if(_.push(...S.steps),Object.assign(P,S.extracted),S.error){if(C(S.steps))throw new Error(S.error);if(L&&K&&V===0&&J&&await xe(T,J,d)){c({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"invalidated"}}),await B(L.invalidate(),d).catch(()=>{}),await b();continue}throw new Error(S.error)}await Xt(u),r={ok:!0,error:null,data:{url:T.url(),title:await B(T.title(),d),extracted:P,steps:_}};break}}catch($){let O=$ instanceof Error?$.message:String($);r={ok:!1,error:O,data:T?await B(Ao(T,P,_,d),d).catch(()=>({url:"",title:"",extracted:P,steps:_})):null},c({type:"error:webActionsNodeRunner",content:`WebActions node execution failed: ${O}`})}finally{if(N==null||N.dispose(),R)try{await B(R.close(),Date.now()+3e3)}catch{}let $=Date.now()-s;l&&(y=Ne(l,h())),p==null||p({type:"tool_call",payload:{nodeId:e.id,url:`webActions:${y}`,method:"EXECUTE",status:r.ok?200:502,latencyMs:$}});let O=ye(at(r.data,h()));c({type:"info:webActionsNodeRunner:response",content:{nodeId:e.id,ok:r.ok,latencyMs:$,data:O.value,truncated:O.truncated,error:r.error}}),c({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:r.ok?"success":"error",error:r.error??void 0}}),r.error=at(r.error,h()),r.data&&(r.data.steps=r.data.steps.map(W=>W.error===void 0?W:{...W,error:at(W.error,h())})),n==null||n(e.id,r)}}async function Ao(o,e,i,t){let n="",w="";try{n=o.url()}catch{}try{w=await B(o.title(),t)}catch{}return{url:n,title:w,extracted:e,steps:i}}function Ge(){let o={};return{add(e,i){o[e]=i},hasOutputs(){return Object.keys(o).length>0},answerNodeIds(){return Object.keys(o)},snapshotData(){let e=Object.entries(o);return e.length===1?e[0][1]:Object.fromEntries(e)}}}function ko(o){return!!(o!=null&&o.HX_ORA_URL)&&!!(o!=null&&o.HX_API_KEY)}async function bi(o,e){if(!ko(o))throw new Error("Structured outputs require HX_ORA_URL and HX_API_KEY");let i=await fetch(`${o.HX_ORA_URL}/internal/outputs/${encodeURIComponent(e.flowId)}/${encodeURIComponent(e.sessionId)}`,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:o.HX_API_KEY},body:JSON.stringify({runId:e.runId,createdAt:e.createdAt,data:e.data,answerNodeIds:e.answerNodeIds})});if(!i.ok){let t=await i.text().catch(()=>"");throw new Error(`Structured output persistence failed with ${i.status}${t?`: ${t}`:""}`)}}var Ye=3,Ze=10,Io=new Set(["agent:start","agent:complete","agent:telemetry"]);function Oo(o){let e=o.executedNodes||[];return e.length===0?"(none)":e.map(i=>i.label?`${i.id} (${i.label})`:i.id).join(" \u2192 ")}function _o(o){let e=o.executedNodes||[];return e[e.length-1]}function Q(o,e,i){throw o==null||o({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:i.message}}),i}function $o(o,e){var w,p,s,d,a,f,g;let i=Array.isArray((w=o.data)==null?void 0:w.inputs)?o.data.inputs:[],t=((s=(p=e.flowData)==null?void 0:p.state)==null?void 0:s.nodes)||[],n={};for(let h of i){let c=(d=h.key)==null?void 0:d.trim();if(!c)continue;let m=(a=h.from)==null?void 0:a.trim();if(!m){if(h.default===void 0)continue;n[c]=h.default;continue}let r=z(m,{context:e.context||{},results:e.results||{},nodes:t,edges:((g=(f=e.flowData)==null?void 0:f.state)==null?void 0:g.edges)??[],currentNodeId:o.id}),y=r.value;if(r.missing||y===void 0||y===null){if(h.default===void 0)throw new q(r.missing==="ancestor_not_executed"?"ANCESTOR_NOT_EXECUTED":"PATH_NOT_FOUND",`Worker node ${o.id} could not resolve input "${m}"`);y=h.default}n[c]=y}return n}async function Ut(o,e,i,t,n,w,p){var j,k,A,F,D,$;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s=typeof((j=e.data)==null?void 0:j.flowId)=="string"?e.data.flowId.trim():"";s||Q(t,e,new Error(`Worker node ${e.id} is missing flowId`));let d=(k=i.flowData)==null?void 0:k.flowId,a=o.workerStack??(d?[d]:[]);a.includes(s)&&Q(t,e,new Error(`Worker node ${e.id} cannot call ${s}: cycle detected (${[...a,s].join(" \u2192 ")})`)),a.length>=Ye&&Q(t,e,new Error(`Worker node ${e.id} exceeded max nesting depth (${Ye})`));let f=o.workerCalls??{count:0};o.workerCalls=f,f.count>=Ze&&Q(t,e,new Error(`Worker node ${e.id} exceeded max worker calls per run (${Ze})`)),f.count+=1;let g;try{g=$o(e,i)}catch(O){Q(t,e,O instanceof Error?O:new Error(String(O)));return}let h=o.env;h||Q(t,e,new Error(`Worker node ${e.id} is missing runtime env`));let c,m;try{let[O,W]=await Promise.all([zt(s,h),Gt(s,h)]);m=(A=O==null?void 0:O.metadata)==null?void 0:A.tenant,c=W}catch(O){Q(t,e,new Error(`Worker node ${e.id} could not load worker ${s}: ${O instanceof Error?O.message:String(O)}`))}let r=(F=i.flowData)==null?void 0:F.tenant;(!m||m!==r)&&Q(t,e,new Error(`Worker ${s} belongs to a different tenant`));let y=Ge(),l={flowData:{...c,tenant:m,flowId:s,chatId:((D=i.flowData)==null?void 0:D.chatId)||""},executedNodes:[],context:{},results:{}},R={env:h,ctx:o.ctx,secrets:o.secrets,userAuth:o.userAuth,user:o.user,composioSessions:o.composioSessions,skillRefCache:o.skillRefCache,publicOrigin:o.publicOrigin,getOraModel:o.getOraModel,runId:o.runId,shouldStop:o.shouldStop,workerCalls:f,conn:void 0,getMessages:async()=>[],setMessages:async()=>{},agentMemory:"",outputCollector:y,workerStack:[...a,s]},u,N={onChangeState:()=>{},onServerEvent:O=>{var W;Io.has(O.type)||t==null||t({type:"worker:node",content:{workerNodeId:e.id,childNodeId:(W=O.content)==null?void 0:W.nodeId,event:O}})},onTelemetry:O=>p==null?void 0:p(O),onError:O=>{u=O},shouldStop:o.shouldStop},{startEngine:T,FlowExecutionStoppedError:b}=await import("./FlowEngine-L24RNX7Y.js"),P=await T(R,l,N)({text:"",inputs:g});if((P.status==="stopped"||await(($=o.shouldStop)==null?void 0:$.call(o)))&&Q(t,e,new b),P.status!=="completed"){let O=_o(l),W=Oo(l),U=P.error||u||"unknown error",M=O?` at node ${O.label?`${O.id} (${O.label})`:O.id}`:"";Q(t,e,new Error(`Worker ${s} failed${M}: ${U}. Path: ${W}`))}y.hasOutputs()||Q(t,e,new Error(`El worker ${s} complet\xF3 sin output estructurado. Agreg\xE1 un mapeo de salida en su nodo Answer.`));let _=(l.executedNodes||[]).map(O=>O.id);n==null||n(e.id,{ok:!0,data:y.snapshotData(),error:null,executed:_}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}async function Lt(o,e,i,t,n,w,p){var a,f,g,h,c,m,r,y;let s=Date.now(),d=(l,R={})=>t==null?void 0:t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:l,...R}});d("start");try{let l=e.data,R={context:i.context??{},results:i.results??{},nodes:((f=(a=i.flowData)==null?void 0:a.state)==null?void 0:f.nodes)??[],edges:((h=(g=i.flowData)==null?void 0:g.state)==null?void 0:h.edges)??[],currentNodeId:e.id},u=F=>{let D=R.nodes.find(W=>F.startsWith(`${W.id}.`)),$=D&&te(D).find(W=>W.name===F.slice(D.id.length+1).split(".")[0]);if(F==="images"||($==null?void 0:$.type)==="image")throw new Error("Classifier accepts text context only");let O=z(F,R);if(O.missing||O.value===void 0||O.value===null)throw new Error(`Classifier input "${F}" did not produce a value`);return O.value},N=u(l.input.message);if(typeof N!="string")throw new Error("Classifier message must be text");let T=l.input.historyTurns>0&&o.getMessages?be(await o.getMessages(),l.input.historyTurns,(c=i.context)==null?void 0:c.user_input):[],b=Object.fromEntries(l.input.vars.map(F=>[F,u(F)])),P=ke(l,{message:N,history:T,vars:b});console.log(`[classifier] node ${e.id} model=${l.model} message=${N.length}ch history=${T.length} vars=${Object.keys(b).length} options=${l.options.length} checks=${l.checks.length} estTokens=${Ie(P)}`);let _=Ot(P);if(_&&console.warn(`[classifier] node ${e.id} ${_}`),_&&(t==null||t({type:"warning:classifier",content:{nodeId:e.id,message:_}})),!((m=o.env)!=null&&m.AI))throw new Error("Classifier requires AI binding");let j;try{j=await Oe(o.env.AI,l.model,P)}finally{let F=Ot(P);F&&F!==_&&console.warn(`[classifier] node ${e.id} ${F}`),F&&F!==_&&(t==null||t({type:"warning:classifier",content:{nodeId:e.id,message:F}}))}let{result:k,usage:A}=_e(j,l);console.log(`[classifier] \u2713 node ${e.id} route=${k.route} class=${k.classification} confidence=${k.confidence} margin=${k.margin.toFixed(4)} tokens=${A.promptTokens} ${Date.now()-s}ms`),n==null||n(e.id,k),p==null||p({type:"decision_telemetry",payload:{nodeId:e.id,model:l.model,totalLatency:Date.now()-s,usage:A,route:k.route}}),d("success",{summary:{route:k.route,classification:k.classification,label:k.label,confidence:k.confidence,margin:k.margin,probabilities:Object.fromEntries(Object.entries(k.probabilities).sort((F,D)=>D[1]-F[1]).slice(0,5)),checks:k.checks}})}catch(l){console.error(`[classifier] \u2717 node ${e.id} model=${(r=e.data)==null?void 0:r.model} ${Date.now()-s}ms: ${l instanceof Error?`${l.name}: ${l.message}`:String(l)}`),n==null||n(e.id,$e()),p==null||p({type:"decision_telemetry",payload:{nodeId:e.id,model:(y=e.data)==null?void 0:y.model,totalLatency:Date.now()-s,route:"error",usage:{promptTokens:0,completionTokens:0,totalTokens:0}}}),d("error",{error:l instanceof Error&&l.message==="Clef timeout"?"Clef timeout":"Classifier decision failed",route:"error"})}}import{stepCountIs as Bo,streamText as Jo}from"ai";import{nanoid as qo}from"nanoid";import"zod";function Qe(o,e){var s,d,a,f,g;let i=((s=o.data)==null?void 0:s.attachments)??[];if(!Array.isArray(i))throw new q("INVALID_EXPRESSION",`Node ${o.id} attachments must be an array`);let t=((a=(d=e.flowData)==null?void 0:d.state)==null?void 0:a.nodes)??[],n=((g=(f=e.flowData)==null?void 0:f.state)==null?void 0:g.edges)??[],w=ot(t,n,o.id),p="";for(let h of i){if(typeof h!="string")throw new q("INVALID_EXPRESSION",`Node ${o.id} has an invalid attachment reference`);let c=w.find(r=>r.ref===h);if(!c)throw new q("OUT_OF_SCOPE",`Attachment "${h}" is not in this node's connection scope`);if(c.type!=="file"&&c.type!=="image")throw new q("UNKNOWN_OUTPUT",`Attachment "${h}" is not an image or file output`);if(c.type!=="file")continue;let m=z(h,{context:e.context??{},results:e.results??{},nodes:t,edges:n,currentNodeId:o.id});if(m.missing)throw new q(m.missing==="ancestor_not_executed"?"ANCESTOR_NOT_EXECUTED":"PATH_NOT_FOUND",`Attachment "${h}" did not produce a value`);if(typeof m.value!="string")throw new q("PATH_NOT_FOUND",`Attachment "${h}" must resolve to file text`);m.value.trim()&&(p+=(p?`
2
+
3
+ `:"")+m.value)}return p}function bo(o,e){var n,w,p,s,d;let i=((n=o.data)==null?void 0:n.attachments)??[];if(!Array.isArray(i))throw new q("INVALID_EXPRESSION",`Node ${o.id} attachments must be an array`);let t=ot(((p=(w=e.flowData)==null?void 0:w.state)==null?void 0:p.nodes)??[],((d=(s=e.flowData)==null?void 0:s.state)==null?void 0:d.edges)??[],o.id);return i.map(a=>{if(typeof a!="string")throw new q("INVALID_EXPRESSION",`Node ${o.id} has an invalid attachment reference`);let f=t.find(g=>g.ref===a);if(!f)throw new q("OUT_OF_SCOPE",`Attachment "${a}" is not in this node's connection scope`);if(f.type!=="image"&&f.type!=="file")throw new q("UNKNOWN_OUTPUT",`Attachment "${a}" is not a binary output`);return f.type==="image"?a:null}).filter(a=>a!==null)}function Ee(o,e){var n,w,p,s;let i=[],t={context:e.context??{},results:e.results??{},nodes:((w=(n=e.flowData)==null?void 0:n.state)==null?void 0:w.nodes)??[],edges:((s=(p=e.flowData)==null?void 0:p.state)==null?void 0:s.edges)??[],currentNodeId:o.id};for(let d of bo(o,e)){let a=z(d,t);if(a.missing)throw new q(a.missing==="ancestor_not_executed"?"ANCESTOR_NOT_EXECUTED":"PATH_NOT_FOUND",`Attachment "${d}" did not produce a value`);if(!Array.isArray(a.value))throw new q("PATH_NOT_FOUND",`Attachment "${d}" must resolve to an image array`);i.push(...a.value)}return i}var tt=(o,e,i)=>{o.send(e+"::"+i)};import{openai as Fo}from"@ai-sdk/openai";import{extractReasoningMiddleware as Do,wrapLanguageModel as Co}from"ai";import{createAI as Po}from"agents/models/ai-sdk";import{xai as Mo}from"@ai-sdk/xai";import{anthropic as jo}from"@ai-sdk/anthropic";import{createOpenRouter as Wo}from"@openrouter/ai-sdk-provider";var Ht={};function Vt(o){if(o!=null){if(typeof o!="string")return o;try{return JSON.parse(o)}catch{return}}}function Uo(o){return{...o,defaultParams:Vt(o.defaultParams)??o.defaultParams,capabilities:Vt(o.capabilities)??o.capabilities,price:Vt(o.price)??o.price}}async function Se(o,e,i){var f,g;if(!(e!=null&&e.getOraModel))throw new Error("resolveModelById requires a sessionEnv with getOraModel capable of fetching models dynamically.");let t=await e.getOraModel(o);if(!t)return;let n=Uo(t),w=((f=n.capabilities)==null?void 0:f.params)??Fe(n),{effectiveParams:p,adjustments:s}=Ce(n.defaultParams,i,w),d;if(Ht[n.provider])d=await Ht[n.provider](n,e,i);else if(n.provider==="openai")d=Fo(n.providerModel);else if(n.provider==="xai")d=Mo(n.providerModel);else if(n.provider==="anthropic")d=jo(n.providerModel);else if(n.provider==="openrouter")d=Wo()(n.providerModel);else if(n.provider==="workersai"||n.provider==="cloudflare"){if(!((g=e==null?void 0:e.env)!=null&&g.AI))throw new Error("Workers AI provider requires sessionEnv.env.AI binding");d=Po({binding:e.env.AI}).languageModel(n.providerModel)}else d={provider:n.provider,providerModel:n.providerModel};let a=Me(n);return a.kind==="tag"&&d&&typeof d=="object"&&"specificationVersion"in d&&(d=Co({model:d,middleware:Do({tagName:a.tagName??"think",startWithReasoning:a.startWithReasoning??!1})})),{provider:n.provider,modelHandle:d,entry:n,effectiveParams:p,paramAdjustments:s.length>0?s:void 0,reasoning:a}}function on(o,e){Ht[o]=e}var sn=(o,e)=>{`${JSON.stringify(o)}`;let i=e==null?void 0:e.DW_URL;return i?fetch(`${i}/q/telemetry/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}).then(async t=>{var n;t.ok||console.warn(`[telemetry] DW responded ${t.status} for type=${o.type}`);try{await((n=t.body)==null?void 0:n.cancel())}catch{}}).catch(t=>{console.warn("[telemetry] failed to ship event",t)}):Promise.resolve()},Lo=new Set(["tool-input-delta","tool-input-start","tool-input-end","text-start","text-end","reasoning-start","reasoning-end","start-step","finish-step","start","finish","ping","raw"]);function ve(o){return Lo.has(o)}var Vo=ft({"../tools/composioDirectTool.ts":()=>import("./composioDirectTool-ZCZRW5WU.js"),"../tools/composioTool.ts":()=>import("./composioTool-RKVCX25U.js"),"../tools/convertTempMessure.ts":()=>import("./convertTempMessure-5CAGRLBY.js"),"../tools/httpTool.ts":()=>import("./httpTool-DIQRGKMU.js"),"../tools/skillTool.ts":()=>import("./skillTool-JEAL3G33.js"),"../tools/tempTool.ts":()=>import("./tempTool-2RXAF56M.js"),"../tools/twitter.ts":()=>import("./twitter-OMDEG7T2.js"),"../tools/vectorize.ts":()=>import("./vectorize-CDB26DMD.js")});var Ho=ft({});async function Xo(o,e,i,t){var h;let n=Array.isArray((h=i==null?void 0:i.data)==null?void 0:h.tools)?i.data.tools:[];if(n.length===0)return{};let w={},p=c=>{var N,T;let m=typeof(c==null?void 0:c.description)=="string"?c.description:"",r=c==null?void 0:c.inputSchema,y;try{let b=(r==null?void 0:r.shape)??(typeof((N=r==null?void 0:r._def)==null?void 0:N.shape)=="function"?r._def.shape():(T=r==null?void 0:r._def)==null?void 0:T.shape);b&&typeof b=="object"&&(y=b)}catch{}let l=y?Object.keys(y):[],R=m?`description="${m.length>120?m.slice(0,120)+"\u2026":m}"`:"description=(none)",u=l.length?`inputSchema={${l.join(", ")}}`:"inputSchema=(none)";return`${R} ${u}`},s=(()=>{let c=[],m=[],r=[],y=[];for(let R=0;R<n.length;R++){let u=n[R];!u||typeof u!="object"||typeof u.id!="string"?y.push(R):u.kind==="builtin"?c.push(u.id):u.kind==="skill"?r.push(u.id):u.kind==="http"||u.kind==="mcp"||u.kind==="composio"?m.push(u.id):y.push(R)}let l=[];return c.length&&l.push(`builtin[${c.join(", ")}]`),m.length&&l.push(`custom[${m.join(", ")}]`),r.length&&l.push(`skill[${r.join(", ")}]`),y.length&&l.push(`invalid@[${y.join(", ")}]`),l.join(" ")||"(none)"})();console.log(`[tools] node ${i.id} requested (${n.length}): ${s}`);let d=!1,a=()=>{var c,m;return{flowId:((c=e.flowData)==null?void 0:c.flowId)??"",tenant:(m=e.flowData)==null?void 0:m.tenant}},f=async()=>{if(d&&o.toolDefs)return o.toolDefs;if(!o.env)return o.toolDefs??{};try{if(o.getToolDefs){let r=await o.getToolDefs(a());return o.toolDefs=r,d=!0,r}let c=await gt(o.env),m={};for(let r of c)r&&r.id&&(m[r.id]=r);return o.toolDefs=m,d=!0,m}catch(c){return t==null||t({type:"error:llmNodeRunner",content:`Failed to load custom tool defs: ${String(c)}`}),o.toolDefs??{}}},g=[];for(let c=0;c<n.length;c++){let m=n[c];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 ${c}: expected { kind: 'http'|'mcp'|'composio'|'builtin'|'skill', id: string, params?: any }`});continue}let r=m;if(r.kind!=="builtin"){let l=(await f())[r.id];if(!l){console.error(`[tools] \u2717 custom '${r.id}': not found for tenant`),t==null||t({type:"error:llmNodeRunner",content:`custom tool '${r.id}' not found for this tenant`});continue}if(r.kind==="composio"){try{let u=await Le(l,o,e,t),N=Object.keys(u);for(let[T,b]of Object.entries(u))w[T]=b;console.log(`[tools] \u2713 composio '${r.id}' \u2192 ${N.length} tool(s)`)}catch(u){console.error(`[tools] \u2717 composio '${r.id}': ${String(u)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading composio tool '${r.id}': ${String(u)}`})}continue}if(r.kind==="skill"){if(l.kind!=="skill"){console.error(`[tools] \u2717 skill '${r.id}': row is of kind '${l.kind}', not 'skill'`),t==null||t({type:"error:llmNodeRunner",content:`tool '${r.id}' is not a skill`});continue}let u=l.name;if(w[u]){t==null||t({type:"warn:llmNodeRunner",content:`tool name collision on '${u}' \u2014 builtin/other already registered, skipping skill '${r.id}'`});continue}try{w[u]=Ve(l,o,e,t),g.push(l);let N=typeof l.execution=="string"?JSON.parse(l.execution):l.execution||{},T=Array.isArray(N.references)?N.references.map(b=>b==null?void 0:b.name):[];console.log(`[tools] \u2713 skill '${r.id}' \u2192 '${u}' (refs: ${T.join(", ")||"none"})`),t==null||t({type:"info:skill:registered",content:{skill:u,refCount:T.length,refs:T}})}catch(N){console.error(`[tools] \u2717 skill '${r.id}': ${String(N)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading skill tool '${r.id}': ${String(N)}`})}continue}let R=l.name;if(w[R]){t==null||t({type:"warn:llmNodeRunner",content:`tool name collision on '${R}' \u2014 builtin already registered, skipping custom tool '${r.id}'`});continue}try{let u=yt(l,o,e,t);w[R]=u,console.log(`[tools] \u2713 custom '${r.id}' \u2192 '${R}'`),console.log(`[tools] ${p(w[R])}`)}catch(u){console.error(`[tools] \u2717 custom '${r.id}': ${String(u)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading custom tool '${r.id}': ${String(u)}`})}continue}if(!de[r.id]){console.error(`[tools] \u2717 builtin '${r.id}': not in registry`),t==null||t({type:"error:llmNodeRunner",content:`Tool '${r.id}' not found in registry`});continue}try{let y;try{y=await Vo(`../tools/${r.id}.ts`)}catch{y=await Ho(`../tools/${r.id}.js`)}let l;if(y[r.id])l=y[r.id];else if(y.default)l=y.default;else if(y.create)l=y.create;else{let _=Object.values(y);_.length>0&&(l=_[0])}if(!l){t==null||t({type:"error:llmNodeRunner",content:`No factory export found for tool '${r.id}'`});continue}let R,u,N={};if(r.params&&typeof r.params=="object"){if(typeof r.params.description=="string"?R=r.params.description:r.params.description!==void 0&&(t==null||t({type:"error:llmNodeRunner",content:`Invalid description for tool '${r.id}' \u2014 must be a string`})),r.params.inputSchema!==void 0){let _=r.params.inputSchema;typeof _=="object"&&(typeof _.safeParse=="function"||_._def)?u=_:typeof _=="object"&&_!==null&&_.type==="object"&&_.properties?(u=ge(_),u||t==null||t({type:"error:llmNodeRunner",content:`Invalid inputSchema for tool '${r.id}' \u2014 must be a Zod schema or JSON Schema object`})):t==null||t({type:"error:llmNodeRunner",content:`Invalid inputSchema for tool '${r.id}' \u2014 must be a Zod schema or JSON Schema object`})}r.params.defaults!==void 0?typeof r.params.defaults=="object"&&r.params.defaults!==null&&!Array.isArray(r.params.defaults)?N=r.params.defaults:(t==null||t({type:"error:llmNodeRunner",content:`Invalid defaults for tool '${r.id}' \u2014 must be an object`}),N={}):r.params.source!==void 0||r.params.target!==void 0?(t==null||t({type:"error:llmNodeRunner",content:`Invalid params for tool '${r.id}' \u2014 legacy top-level source/target not supported; use params.defaults instead`}),N={}):N={}}let T=l(o,e,N,t);R&&T&&typeof T=="object"&&(T.description=R),u&&T&&typeof T=="object"&&(T.inputSchema=u),w[r.id]=T;let b=[];R&&b.push("description"),u&&b.push("inputSchema"),Object.keys(N).length&&b.push(`defaults(${Object.keys(N).join(",")})`);let P=b.length?` [overrides: ${b.join(", ")}]`:"";console.log(`[tools] \u2713 builtin '${r.id}'${P}`),console.log(`[tools] ${p(T)}`)}catch(y){console.error(`[tools] \u2717 builtin '${r.id}': ${String(y)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading tool '${r.id}': ${String(y)}`});continue}}if(g.length>0)if(w.readSkillRef)t==null||t({type:"warn:llmNodeRunner",content:"tool name collision on 'readSkillRef' \u2014 builtin/other already registered, skipping readSkillRef tool"});else try{w.readSkillRef=He(o,g,e,t),console.log(`[tools] \u2713 registered readSkillRef tool for ${g.length} skill(s)`),t==null||t({type:"info:skill:readSkillRefRegistered",content:{skills:g.map(c=>c.name)}})}catch(c){console.error(`[tools] \u2717 failed to load readSkillRef tool: ${String(c)}`)}return w}async function Bt(o,e,i,t,n,w,p){var P,_,j,k;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s=!1;try{let A=(P=i.flowData)==null?void 0:P.state;if(A&&A.edges&&A.nodes){let F=A.edges.filter(D=>D.source===e.id);if(F.length>0){let D=A.nodes.find($=>$.id===F[0].target);D&&D.type==="answerNode"&&(s=!0)}}}catch(A){console.error("Error determining next node for streaming:",A)}let d=X(e.data.template,e,i,t,{sessionEnv:o});(!d||!d.trim())&&(d="Answer straight forward to the user, dont offer any other option to continue");let a=d,f=X(e.data.user_template||"",e,i,t,{sessionEnv:o}),g=A=>A&&Object.fromEntries(Object.keys(A).map(F=>[F,"[redacted]"])),h=o!=null&&o.secrets||o!=null&&o.userAuth?{...o,secrets:g(o.secrets),userAuth:g(o.userAuth)}:o,c=X(e.data.template,e,i,void 0,{sessionEnv:h})||a,m=X(e.data.user_template||"",e,i,void 0,{sessionEnv:h});t==null||t({type:`info:llmNodeRunner:${e.id}`,content:c}),t==null||t({type:`info:llmNodeRunner:${e.id}`,content:m});let r=(_=e==null?void 0:e.data)==null?void 0:_.window_size,y=Number(r);(!Number.isInteger(y)||y<=0)&&(y=5);let l=Ee(e,i),R=Qe(e,i);t==null||t({type:"info:llmNodeRunner:attachments",content:{nodeId:e.id,refs:Array.isArray((j=e.data)==null?void 0:j.attachments)?e.data.attachments:[],images:l.length,documents:R?1:0}});let N=(await((k=o.getMessages)==null?void 0:k.call(o))??[]).slice(-y),T=N.filter(A=>A&&typeof A.role=="string"&&typeof A.content=="string");T.length!==N.length&&console.warn(`Filtered ${N.length-T.length} invalid messages from history`);let b=zo(T,f,l,R);await Ko(d,b,o.conn,t,e,s,n,i,w,o,p)}async function Ko(o,e,i,t,n,w,p,s,d,a,f){var h;let g=Date.now();if(!((h=a.env)!=null&&h.AI))throw new Error("AI binding is required for LLM node");return new Promise(async(c,m)=>{var F,D,$,O,W,U;let r,y={},l,R="none",u=!1,N,T=!1,b=!1,P=0,_=0,j=(F=n==null?void 0:n.data)==null?void 0:F.sendReasoning,k=j!==!1;try{let M=(D=n==null?void 0:n.data)==null?void 0:D.model,G=Array.isArray(M)?M[0]:M||"gpt_5_nano",x=De(n==null?void 0:n.data),C=await Se(G,a,x);if(!C)throw new Error(`Model '${G}' not found in registry`);r=C.modelHandle,y=C.effectiveParams||{},R=C.reasoning.kind;let I=We(C.reasoning,($=n==null?void 0:n.data)==null?void 0:$.reasoningEffort);u=k&&je(C.reasoning);let L=typeof((O=n==null?void 0:n.data)==null?void 0:O.reasoningMaxTokens)=="number"?n.data.reasoningMaxTokens:void 0;l=Ue(C.provider,{effort:I,exposeReasoning:u,maxTokens:L}),I&&(t==null||t({type:"info:llmNodeRunner:reasoningEffort",content:I})),console.log(`[reasoning] ${JSON.stringify({model:G,provider:C.provider,capability:C.reasoning,requestedEffort:((W=n==null?void 0:n.data)==null?void 0:W.reasoningEffort)??null,resolvedEffort:I??null,sendReasoning:k,exposeReasoning:u,providerOptions:l??null},null,2)}`);for(let J of C.paramAdjustments??[])t==null||t({type:"warn:llmNodeRunner",content:J});t==null||t({type:"info:llmNodeRunner:model",content:G}),t==null||t({type:"info:llmNodeRunner:generationParams",content:{...(U=n==null?void 0:n.data)!=null&&U.generationPreset?{preset:n.data.generationPreset}:{},...y,...R!=="none"?{reasoning:R,configuredSendReasoning:j,sendReasoning:k,exposeReasoning:u,...I?{effort:I}:{}}:{}}})}catch(M){throw t==null||t({type:"error:llmNodeRunner",content:`Model error: ${String(M)}`}),M}let A=await Xo(a,s,n,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 M=Jo({model:r,system:o,messages:e,stopWhen:(()=>{var J;let C=!!A.readSkillRef?10:5,I=Number(((J=n.data)==null?void 0:J.max_steps)??C),L=Number.isFinite(I)?Math.max(1,Math.min(30,I)):C;return Bo(L)})(),...Pe(y),...l?{providerOptions:l}:{},tools:A,onFinish:async x=>{var lt,rt,dt,ct;let C=x.text||"",I=x.reasoningText??((lt=x.reasoning)==null?void 0:lt.text)??"";if(console.log(`[reasoning] done: deltas=${P} chars=${_} result.reasoningText=${I.length} finishReason=${x.finishReason??"n/a"} reasoningTokens=${((dt=(rt=x.usage)==null?void 0:rt.outputTokenDetails)==null?void 0:dt.reasoningTokens)??((ct=x.usage)==null?void 0:ct.reasoningTokens)??"n/a"}`),k&&u&&!T&&I&&i){T=!0;try{tt(i,v.SERVER_REASONING_STREAM,I)}catch(ut){console.warn("Failed to send finished reasoning over connection",ut)}}let L={id:qo(),role:"assistant",type:"text",content:C,ts:Date.now()};w&&(a.setMessages?await a.setMessages(L):t==null||t({type:"error:llmNodeRunner",content:"setMessages callback missing"})),i&&k&&T&&!b&&(b=!0,tt(i,v.SERVER_REASONING_STREAM_COMPLETE,JSON.stringify({}))),w&&i&&tt(i,v.SERVER_TEXT_STREAM_COMPLETE,JSON.stringify({})),p==null||p((n==null?void 0:n.id)||"llm_result",C),t==null||t({type:"info:llmNodeRunner:onFinish",content:JSON.stringify(x)});let J=Date.now()-g,nt=N?N-g:void 0;f==null||f({type:"llm_telemetry",payload:{nodeId:n.id,totalLatency:J,timeToFirstToken:nt,model:x.response.modelId,usage:x.usage}}),f==null||f({type:"llm_result",payload:{result:x}})},onStepFinish:async x=>{let C=(I,L=200)=>{let J=typeof I=="string"?I:JSON.stringify(I);return J?J.length>L?`${J.slice(0,L)}\u2026(+${J.length-L})`:J:""};if(x.toolCalls&&x.toolCalls.length>0){for(let I of x.toolCalls)console.log(`[tools] \u2192 ${I.toolName}(${C(I.args??I.input)})`);t==null||t({type:`info:llmNodeRunner:toolCalls:${n.id}`,content:JSON.stringify(x.toolCalls)})}if(x.toolResults&&x.toolResults.length>0){for(let I of x.toolResults)console.log(`[tools] \u2190 ${I.toolName} \u2192 ${C(I.result??I.output)}`);t==null||t({type:`info:llmNodeRunner:toolResults:${n.id}`,content:JSON.stringify(x.toolResults)})}},experimental_onToolCallStart:x=>{var C;t==null||t({type:"tool:execution",content:{nodeId:n.id,toolName:(C=x==null?void 0:x.toolCall)==null?void 0:C.toolName,status:"start"}})},experimental_onToolCallFinish:x=>{var C,I;t==null||t({type:"tool:execution",content:{nodeId:n.id,toolName:(C=x==null?void 0:x.toolCall)==null?void 0:C.toolName,status:((I=x==null?void 0:x.toolOutput)==null?void 0:I.type)==="tool-error"?"error":"success"}})},onError:x=>{t==null||t({type:"error:llmNodeRunner",content:"Execution error"}),m(x)},onChunk:x=>{if(x.chunk.type==="reasoning-delta"){let I=x.chunk.text??x.chunk.delta??"";if(I&&(T=!0,P+=1,_+=I.length,P===1&&console.log("[reasoning] \u2713 first reasoning-delta received")),k&&i&&I)try{tt(i,v.SERVER_REASONING_STREAM,I)}catch(L){console.warn("Failed to send reasoning chunk over connection",L)}return}if(x.chunk.type==="text-delta"){if(N||(N=Date.now()),i&&k&&T&&!b){b=!0;try{tt(i,v.SERVER_REASONING_STREAM_COMPLETE,JSON.stringify({}))}catch(I){console.warn("Failed to send reasoning complete over connection",I)}}return}if(ve(x.chunk.type))return;f==null||f({type:x.chunk.type,payload:{nodeId:n.id,chunk:x.chunk}});let C=`llm_chunk:${x.chunk.type}`;t==null||t({type:C,content:{...x}})}}),G=async()=>{let x="";for await(let C of M.fullStream)if(C.type==="text-delta"){if(x+=C.text,w&&i)try{tt(i,v.SERVER_TEXT_STREAM,C.text)}catch(I){console.warn("Failed to send chunk over connection",I)}}else if(C.type==="finish-step"&&C.finishReason==="tool-calls"){if(w&&i&&x.trim())try{tt(i,v.SERVER_TEXT_STREAM_COMPLETE,JSON.stringify({}))}catch(I){console.warn("Failed to flush text segment over connection",I)}x=""}};await Promise.all([M,G()]),c(),t==null||t({type:"node:execution",content:{nodeId:n.id,nodeType:n.type,status:"success"}})}catch(M){t==null||t({type:"node:execution",content:{nodeId:n.id,nodeType:n.type,status:"error",error:String(M)}}),m(M)}})}function zo(o,e,i,t){let n=!!(i&&i.length>0),w=!!t,p=n||w,d=o.length>0&&o[o.length-1].role==="user"?o[o.length-1]:void 0,a=f=>{let g=[],h="";if(w&&(h+=`[Attached files]
4
+ ${t}
5
+ [End of attached files]
6
+
7
+ `),f&&(h+=f),h&&g.push({type:"text",text:h}),n)for(let c of i)g.push({type:"image",image:c.data,mimeType:c.mimeType});return g};return e&&d&&d.content===e?[...o.slice(0,-1).map(g=>({role:g.role,content:g.content})),{role:"user",content:a(e)}]:e?[...o.map(f=>({role:f.role,content:f.content})),{role:"user",content:a(e)}]:p&&d?[...o.slice(0,-1).map(g=>({role:g.role,content:g.content})),{role:"user",content:a(d.content)}]:o.map(f=>({role:f.role,content:f.content}))}async function Jt(o,e,i,t,n,w,p){var f,g,h,c,m,r,y;console.log(`**** MEMO Node id: ${e.id} ****`),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s="",d=!1,a=Date.now();try{t==null||t({type:"info:memoNodeRunner",content:"Starting memo node execution"});let l=String(((f=e.data)==null?void 0:f.query_key)||"user_input"),R=z(l,{context:i.context??{},results:i.results??{},nodes:((h=(g=i.flowData)==null?void 0:g.state)==null?void 0:h.nodes)??[],edges:((m=(c=i.flowData)==null?void 0:c.state)==null?void 0:m.edges)??[],currentNodeId:e.id});if(R.missing)throw new Error(`Memo query "${l}" did not produce a value`);if(!o.env||!o.ctx){t==null||t({type:"error:memoNodeRunner",content:"Missing env or ctx"}),n==null||n(e.id,s);return}if(!e.data.rag_id){t==null||t({type:"error:memoNodeRunner",content:"Missing rag_id"}),n==null||n(e.id,s);return}let u=String(R.value??"");t==null||t({type:"info:memoNodeRunner",content:`Query text: ${u}`}),t==null||t({type:"info:memoNodeRunner",content:"Generating embedding for query"});let N=await Yt(o,u,!0);t==null||t({type:"info:memoNodeRunner",content:`Embedding generated successfully, length: ${N.data[0].length}`});let T=Array.isArray(e.data.rag_id)?e.data.rag_id:[e.data.rag_id],b=[];for(let k of T){t==null||t({type:"info:memoNodeRunner",content:`Executing RAG query with namespace: ${k}`});let A=await o.env[`VDB_${(r=i.flowData)==null?void 0:r.tenant}_1024`].query(N.data[0],{namespace:k,topK:e.data.topk,returnMetadata:"all"});t==null||t({type:"info:memoNodeRunner",content:`RAG query completed for namespace ${k}, matches: ${((y=A.matches)==null?void 0:y.length)||0}`}),Array.isArray(A.matches)&&b.push(...A.matches)}let P=Date.now()-a;s=b.map(k=>{var A;return(A=k.metadata)==null?void 0:A.value}).filter(k=>typeof k=="string").join(`
8
+
9
+ `),p==null||p({type:"memo_search",payload:{nodeId:e.id,searchLatencyMs:P,retrievedContext:s}}),t==null||t({type:"info:memoNodeRunner",content:`Context retrieval complete, length: ${s.length}, preview: ${s.substring(0,200)}...`}),t==null||t({type:"info:memoNodeRunner",content:"Memo node execution completed successfully"}),d=!0}catch(l){throw console.error("Error processing MemoNode:",l),t==null||t({type:"error:memoNodeRunner",content:`Memo node execution failed: ${l}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(l)}}),l}finally{d&&(n==null||n(e.id,s),t==null||t({type:"info:memoNodeRunner",content:`onResult called with context length: ${s.length}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}}))}}async function qt(o,e,i,t,n,w,p){var f,g,h,c,m,r,y,l;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:i}),p==null||p({type:"start_node",payload:{userMessage:(f=i==null?void 0:i.context)==null?void 0:f.user_input}});let s=((g=e.data)==null?void 0:g.allow_images)!==!1,d=((h=e.data)==null?void 0:h.allow_documents)!==!1;!s&&(i!=null&&i.context)&&(i.context.user_images=[],w==null||w({...i})),!d&&(i!=null&&i.context)&&(i.context.files="",w==null||w({...i}));let a={};for(let R of mt(e.data))a[R.name]=(c=i==null?void 0:i.context)==null?void 0:c[R.name];n==null||n(e.id,{...a,user_input:(m=i==null?void 0:i.context)==null?void 0:m.user_input,images:s?(r=i==null?void 0:i.context)==null?void 0:r.user_images:[],files:d?(y=i==null?void 0:i.context)==null?void 0:y.files:"",memory:((l=i==null?void 0:i.context)==null?void 0:l.memory)??""}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}function nr(o,e,i){let t=e;async function n(){var a;if(await((a=i==null?void 0:i.shouldStop)==null?void 0:a.call(i)))throw new ht}async function w(a){let f=a;for(t.executedNodes=t.executedNodes||[],t.context=t.context||{},t.results=t.results||{};f&&f.id;)await n(),await p(f),await n(),f=Yo(f,t.flowData,t)}async function p(a){var m,r;let f=d[a.type];if(!f){(m=i==null?void 0:i.onError)==null||m.call(i,`Unknown node type: ${a.type}`);return}t.executedNodes=t.executedNodes||[],t.executedNodes.push({id:a.id,type:a.type,label:typeof((r=a.data)==null?void 0:r.label)=="string"?a.data.label:void 0}),t.lastNodeId=a.id;let g=y=>{var l;return(l=i==null?void 0:i.onServerEvent)==null?void 0:l.call(i,{...y,ts:Date.now()})},h=y=>{var l,R;if((l=i==null?void 0:i.onTelemetry)==null||l.call(i,y),y.type==="llm_telemetry"||y.type==="decision_telemetry"||y.type==="memory_update"){let u=(R=y.payload)==null?void 0:R.usage;u&&(t.tokenUsage=t.tokenUsage||{promptTokens:0,completionTokens:0,totalTokens:0},t.tokenUsage.promptTokens+=u.promptTokens||0,t.tokenUsage.completionTokens+=u.completionTokens||0,t.tokenUsage.totalTokens+=u.totalTokens||0)}};return await f(o,a,t,g,(y,l)=>{t.results[y]=l},i==null?void 0:i.onChangeState,h)}let s=async a=>{var c,m,r,y,l,R,u;let f=Date.now(),g="completed",h;try{await n();let N=typeof a=="string"?Qt(a):a,T=(N==null?void 0:N.text)||"",b=(N==null?void 0:N.images)||[],P=(N==null?void 0:N.documents)||[],_=await Be(P,o.env),j=_.length>0?_.map(F=>`--- file: ${F.name} ---
10
+ ${F.text}`).join(`
11
+
12
+ `):"";t.context={user_input:T,user_images:b,files:j},t.tokenUsage={promptTokens:0,completionTokens:0,totalTokens:0},t.executedNodes=[],(c=i==null?void 0:i.onServerEvent)==null||c.call(i,{type:"agent:start",content:"Execution started",timestamp:Date.now()});let{startNode:k,error:A}=Go(t.flowData);if(!k)g="failed",h=A||"Flow Format Error",(m=i==null?void 0:i.onError)==null||m.call(i,h);else{let F=mt(k.data),{values:D,errors:$}=Zt(F,N==null?void 0:N.inputs);if($.length>0)return g="failed",h=`Invalid flow inputs: ${$.join("; ")}`,(r=i==null?void 0:i.onError)==null||r.call(i,h),{status:g,error:h};if(t.context={...t.context,inputs:D,...D},t.context.user_input||(t.context.user_input=T),se(k.data)){let O=ne(ae(k.data));t.context.memory=re(o.agentMemory||"",O).content}else t.context.memory="";await w(k),(y=i==null?void 0:i.onServerEvent)==null||y.call(i,{type:"agent:telemetry",content:{durationMs:Date.now()-f,tokenUsage:t.tokenUsage},timestamp:Date.now()})}}catch(N){N instanceof ht?(g="stopped",h=N.message,(l=i==null?void 0:i.onServerEvent)==null||l.call(i,{type:"agent:stopped",content:h,timestamp:Date.now()})):(g="failed",h=N instanceof Error?N.message:"Agent execution failed",(R=i==null?void 0:i.onError)==null||R.call(i,h))}finally{(u=i==null?void 0:i.onServerEvent)==null||u.call(i,{type:"agent:complete",content:{status:g,durationMs:Date.now()-f},timestamp:Date.now()})}return{status:g,error:h}},d={startNode:qt,classifierNode:Lt,llmNode:Bt,memoNode:Jt,answerNode:_t,apiNode:Dt,toolNode:Mt,workerNode:Ut,crawlNode:jt,webActionsNode:Wt};return s}var ht=class extends Error{constructor(){super("Stopped by user"),this.name="FlowExecutionStoppedError"}};function Go(o){let e=(o==null?void 0:o.state)??o,i=le(e);return i.length?{error:i[0].message}:{startNode:e.nodes.find(t=>t.type==="startNode")}}function to(o,e){var i;return((i=o.state)==null?void 0:i.nodes.find(t=>t.id===e))||null}function Yo(o,e,i){var w;let t=e==null?void 0:e.state;if(!t)return null;let n=t.edges.filter(p=>p.source===o.id);if(o.type==="classifierNode"){let p=(w=i==null?void 0:i.results)==null?void 0:w[o.id];if(!p||!["class","uncertain","blocked","error"].includes(p.route))throw new Error(`Classifier ${o.id}: missing decision result`);let s=p.route,d=g=>n.find(h=>h.sourceHandle===Nt(g,p.classification)),a=d(s);if(!a&&s==="blocked"&&(s=p.confidence<o.data.confidence.threshold||p.margin<o.data.confidence.margin?"uncertain":"class",a=d(s)),!a&&s==="uncertain"&&(s="class",a=d(s)),!a)throw new Error(`Classifier ${o.id}: no connected edge for ${Nt(s,p.classification)}`);let f=to(e,a.target);if(!f)throw new Error(`Classifier ${o.id}: edge target ${a.target} does not exist`);return f}return n.length===0?null:to(e,n[0].target)}export{tt as a,oo as b,Ge as c,bi as d,Uo as e,Se as f,on as g,sn as h,Lo as i,ve as j,nr as k,ht as l};
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import{a as k,b as ts,c as Le,d as Fe,e as Js,f as We,g as Ys,h as Ge,i as Bs}from"./chunk-KJ77K3N3.js";import"./chunk-3D77ZXDC.js";import{c as ns}from"./chunk-62G7NURX.js";import"./chunk-AKJFVR6J.js";import"./chunk-EHOK5FW2.js";import"./chunk-3K4IMMLP.js";import{a as Zs,b as Qs,c as eo,d as to,e as no}from"./chunk-GHMAKIZO.js";import{$ as jr,$a as Ks,A as or,Aa as ys,B as ar,Ba as hs,C as ir,Ca as ws,D as cr,Da as Ss,E as ur,Ea as Rs,F as lr,Fa as Es,G as Or,Ga as Ts,H as Pr,Ha as Is,I as vr,Ia as xs,J as Mr,Ja as As,K as Cr,Ka as ks,L as Ue,La as bs,M as j,Ma as _s,N as Nr,Na as Us,O as Oe,Oa as Os,P as Pe,Pa as Ps,Q as ve,Qa as vs,R as Me,Ra as Ms,S as Ce,Sa as Cs,T as Ne,Ta as Ns,U as Y,Ua as Ds,V as De,Va as $s,W as $e,Wa as Ls,X as Dr,Xa as Fs,Y as $r,Ya as je,Z as Lr,Za as js,_ as Fr,_a as Hs,a as I,aa as Hr,ab as Ws,b as be,ba as Kr,bb as Gs,c as Mn,ca as Wr,cb as Xs,d as M,da as Gr,db as qs,e as _e,ea as Xr,eb as zs,f as Cn,fa as qr,fb as Vs,g as Nn,ga as zr,gb as He,h as Dn,ha as Vr,hb as Ke,i as $n,ia as Jr,j as Ln,ja as Yr,k as Fn,ka as Br,l as jn,la as Qr,m as Hn,ma as es,n as Kn,na as rs,o as Wn,oa as ss,p as Gn,pa as os,q as Xn,qa as as,r as qn,ra as is,s as zn,sa as cs,t as Vn,ta as us,u as Jn,ua as ls,v as er,va as ds,w as tr,wa as ms,x as nr,xa as ps,y as rr,ya as fs,z as sr,za as gs}from"./chunk-G73VSMK7.js";import{A as _r,B as Ur,a as F,b as Pn,c as Ae,d as vn,e as ke,f as Yn,g as Bn,h as Zn,i as Qn,j as dr,k as mr,l as pr,m as fr,n as gr,o as yr,p as hr,q as wr,r as Sr,s as Rr,t as Er,u as Tr,v as Ir,w as xr,x as Ar,y as kr,z as br}from"./chunk-LUS5CJY2.js";import{a as Zr}from"./chunk-HJPR76HF.js";import{a as In}from"./chunk-RYHQGPX5.js";import{a as xn}from"./chunk-R6EKV3WR.js";import{a as bn}from"./chunk-6HY7QUMP.js";import{a as An,b as kn}from"./chunk-V6JSMX5A.js";import{a as On}from"./chunk-Q7QHJJGR.js";import{a as U,b as v,c as _n,d as Un}from"./chunk-YLDLDEUP.js";import{a as xe}from"./chunk-U56YWPSI.js";import"./chunk-YHXUBVN2.js";import"./chunk-3TXHFKDN.js";import{Agent as ut}from"agents";import{nanoid as nn}from"nanoid";async function _t(t){t.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 Xe(t,e){t.sql`INSERT INTO messages (id, role, type, content, ts) VALUES (${e.id}, ${e.role}, ${e.type}, ${e.content}, ${e.ts})`}async function O(t){return t.sql`SELECT id, role, type, content, ts FROM messages ORDER BY ts ASC`}async function H(t){t.sql`DELETE FROM messages`}async function qe(t){await _t(t)}function B(t){return{"Content-Type":"application/json",Authorization:t.HX_API_KEY}}function K(t){return!!(t!=null&&t.HX_ORA_URL)&&!!(t!=null&&t.HX_API_KEY)}var Ut="anonymous:";function ze(t,e){return(t==null?void 0:t.trim())||`${Ut}${e}`}async function Z(t,e){if(!K(t))return null;let r=await fetch(`${t.HX_ORA_URL}/internal/runs`,{method:"POST",headers:B(t),body:JSON.stringify(e)});return r.ok?await r.json():(console.error("[oraTriggers] createRun failed",r.status,await r.text().catch(()=>"")),null)}async function C(t,e){if(!K(t))return{claimed:!0};let r=await fetch(`${t.HX_ORA_URL}/internal/runs/${encodeURIComponent(e)}/claim`,{method:"POST",headers:B(t)});if(!r.ok){let n=await r.text().catch(()=>"");throw new Error(`claimRun ${e} failed with ${r.status}: ${n}`)}return await r.json()}async function W(t,e,r,n=3){if(!K(t))return!0;for(let s=1;s<=n;s++){try{let o=await fetch(`${t.HX_ORA_URL}/internal/runs/${encodeURIComponent(e)}/complete`,{method:"POST",headers:B(t),body:JSON.stringify(r)});if(o.ok||o.status===409)return!0;if(o.status===404)return console.error(`[oraTriggers] completeRun ${e} rejected with 404`),!1;console.warn(`[oraTriggers] completeRun ${e} attempt ${s} failed with ${o.status}`)}catch(o){console.warn(`[oraTriggers] completeRun ${e} attempt ${s} threw`,o)}s<n&&await new Promise(o=>setTimeout(o,250*s))}return console.error(`[oraTriggers] completeRun ${e} exhausted ${n} attempts; hx-ora will time the run out`),!1}async function Ve(t,e){if(!K(t))return Promise.resolve();try{return await Z(t,e)}catch(r){return console.error("[oraTriggers] recordRun failed",r),null}}var Q=Object.freeze({}),Ot="__SYSTEM_";function ee(t){return t.startsWith(Ot)}function Pt(t){let e={};for(let[r,n]of Object.entries(t))ee(r)||(e[r]=n);return Object.freeze(e)}function G(t){return(typeof t=="string"?t.trim():"")||"default"}async function Je(t,e,r){if(!e)return Q;let n=G(r);if(t.HX_ORA_URL&&t.HX_API_KEY)try{let o=new URL(`${t.HX_ORA_URL.replace(/\/$/,"")}/internal/secrets`);o.searchParams.set("org",n);let a=await fetch(o,{headers:{Authorization:t.HX_API_KEY}});if(a.ok){let i=await a.json();if(i.secrets)return Pt(i.secrets)}else console.warn(`[secrets] API failed with status ${a.status}, falling back to KV`)}catch(o){console.error("[secrets] API request failed, falling back to KV",o)}let s=t.ORA_SECRETS;if(!s)return Q;try{let o={};return await vt(s,`${e}:${n}:`,o),n==="default"&&await Mt(s,e,o),Object.freeze(o)}catch(o){return console.error("[secrets] failed to load tenant secrets from KV",{tenant:e,org:n,err:o}),Q}}async function vt(t,e,r){let n=await t.list({prefix:e,limit:1e3});n.list_complete===!1&&console.warn(`[secrets] prefix=${e} exceeded list page; truncating to first 1000 keys`);let s=n.keys.filter(a=>{let i=a.name.slice(e.length);return i.length>0&&!i.includes(":")&&!ee(i)}),o=await Promise.all(s.map(async a=>{let i=await t.get(a.name);return i!==null?[a.name.slice(e.length),i]:null}));for(let a of o){if(!a)continue;let[i,c]=a;i&&(r[i]=c)}}async function Mt(t,e,r){let n=`${e}:`,s=await t.list({prefix:n,limit:1e3});s.list_complete===!1&&console.warn(`[secrets] tenant=${e} legacy secrets exceeded list page; truncating to first 1000 keys`);let o=s.keys.filter(i=>{let c=i.name.slice(n.length);return c.length>0&&!c.includes(":")&&!ee(c)}),a=await Promise.all(o.map(async i=>{let c=i.name.slice(n.length);if(c in r)return null;let u=await t.get(i.name);return u!==null?[c,u]:null}));for(let i of a){if(!i)continue;let[c,u]=i;c&&(r[c]=u)}}function X(t){var s;let e=((s=t==null?void 0:t.flowData)==null?void 0:s.state)??(t==null?void 0:t.flowData),n=((e==null?void 0:e.nodes)??[]).find(o=>o.type==="startNode");return n==null?void 0:n.data}import{nanoid as Zt}from"nanoid";import{streamText as Ct}from"ai";var Nt={short:`Up to ${j("short")} markdown lines (one fact or bullet per line). Keep constraints, working agreements, and the outline of anything already settled.`,medium:`Up to ${j("medium")} markdown lines. Group bullets by whatever this session is about (actors, constraints, decisions, current plan/state, open work). Under-remembering is worse than a few extra lines.`,long:`Up to ${j("long")} markdown lines. Same as medium, with one-line context on a decision or plan block when later turns will need it.`},Dt=12,$t=400,Ye=700;function Lt(t,e=Dt){let r=t.filter(s=>s.role==="user"||s.role==="assistant").slice(-e),n=[];for(let s of r){let o=typeof s.content=="string"?s.content:JSON.stringify(s.content??""),a=s.role==="assistant"?Ye:$t,i=o.trim().replace(/\s+/g," ").slice(0,a);i&&n.push(`${s.role==="user"?"U":"A"}: ${i}`)}return n.join(`
2
- `)}function Ft(t){let e=t??{},r=e.promptTokens??e.inputTokens??0,n=e.completionTokens??e.outputTokens??0,s=e.totalTokens??r+n;return{promptTokens:r,completionTokens:n,totalTokens:s}}function jt(t){var e;for(let r=t.length-1;r>=0;r--)if(((e=t[r])==null?void 0:e.role)==="assistant"&&typeof t[r].content=="string")return t[r].content;return""}function Ht(t){var s,o;let e=((s=t.flowData)==null?void 0:s.state)??t.flowData,r=(e==null?void 0:e.nodes)??[],n=[];for(let a of r){if(a.type!=="answerNode")continue;let i=(o=t.results)==null?void 0:o[a.id];i!=null&&n.push(typeof i=="string"?i:JSON.stringify(i))}return n.join(`
3
- `)}function Kt(t){var n;let e=["You maintain a KEYPOINT memory for one agent session so later turns can continue without re-asking.",`Hard limit: ${t.maxTokens} tokens.`,Nt[t.length],"The session domain is unknown: personal, operational, technical, or mixed. Do not assume a personal-coaching frame.","Store facts that will still matter: who/what is in play, constraints and invariants, preferences, decisions, current state of the work, and the outline of anything the user accepted or asked to keep.","When something was confirmed (a plan, a process, a design, a sequence), keep a compact outline \u2014 enough to resume the next part \u2014 not the assistant\u2019s full wording.","Keep earlier facts unless the user superseded them. Merge, update, dedupe. Do not collapse memory to a single identity line plus one decision.","Never copy the conversation. Never write User:/Assistant:/U:/A: lines. Drop greetings, filler, and unanswered assistant questions.","If this turn added nothing durable, return the current memory unchanged.","If memory is empty and nothing durable happened, return exactly: (none)","Use the same language as the user. Return only the bullet list \u2014 no preamble."].join(" "),r=["Current keypoint memory:",'"""',t.previous.trim()||"(empty)",'"""',"","Recent session (for extraction only; do not transcribe):",'"""',((n=t.recentTurns)==null?void 0:n.trim())||"(none)",'"""',"","This turn:",`User said: ${t.userText.trim()||"(empty)"}`,t.assistantText.trim()?`Latest assistant reply (extract accepted plan/facts only): ${t.assistantText.trim().slice(0,Ye)}`:"",t.answers.trim()?`Answer outputs:
1
+ import{a as _,b as hs,c as Be,d as Ze,e as mo,f as nt,g as fo,h as rt,i as po,j as go,k as st,l as yo}from"./chunk-CC5VKJB7.js";import"./chunk-3D77ZXDC.js";import{c as ws}from"./chunk-62G7NURX.js";import"./chunk-AKJFVR6J.js";import"./chunk-EHOK5FW2.js";import"./chunk-3K4IMMLP.js";import{a as ho,b as wo,c as Ro,d as So,e as Eo}from"./chunk-GHMAKIZO.js";import{$ as ns,$a as so,A as Er,Aa as Ps,B as Tr,Ba as Ms,C as Ir,Ca as Cs,D as xr,Da as Ds,E as Ar,Ea as Ns,F as kr,Fa as $s,G as zr,Ga as Ls,H as qr,Ha as Fs,I as Vr,Ia as Hs,J as Yr,Ja as js,K as Jr,Ka as Ks,L as Ke,La as Gs,M as J,Ma as Ws,N as Br,Na as Xs,O as Ge,Oa as zs,P as We,Pa as qs,Q as Xe,Qa as Vs,R as ze,Ra as Ys,S as qe,Sa as Js,T as Ve,Ta as Bs,U as ce,Ua as Zs,V as Ye,Va as Qs,W as Je,Wa as eo,X as Zr,Xa as to,Y as Qr,Ya as Qe,Z as es,Za as no,_ as ts,_a as ro,a as A,aa as rs,ab as oo,b as Fe,ba as ss,bb as ao,c as Yn,ca as os,cb as io,d as j,da as as,db as co,e as He,ea as is,eb as lo,f as Jn,fa as cs,fb as uo,g as Bn,ga as ls,gb as et,h as Zn,ha as us,hb as tt,i as Qn,ia as ds,j as er,ja as ms,k as tr,ka as fs,l as nr,la as gs,m as rr,ma as ys,n as sr,na as Rs,o as or,oa as Ss,p as ar,pa as Es,q as ir,qa as Ts,r as cr,ra as Is,s as lr,sa as xs,t as ur,ta as As,u as dr,ua as ks,v as yr,va as bs,w as hr,wa as _s,x as wr,xa as Us,y as Rr,ya as vs,z as Sr,za as Os}from"./chunk-G73VSMK7.js";import{A as Wr,B as Xr,a as Y,b as qn,c as $e,d as Vn,e as Le,f as mr,g as fr,h as pr,i as gr,j as br,k as _r,l as Ur,m as vr,n as Or,o as Pr,p as Mr,q as Cr,r as Dr,s as Nr,t as $r,u as Lr,v as Fr,w as Hr,x as jr,y as Kr,z as Gr}from"./chunk-LUS5CJY2.js";import{a as ps}from"./chunk-HJPR76HF.js";import{a as Fn}from"./chunk-RYHQGPX5.js";import{a as Hn}from"./chunk-R6EKV3WR.js";import{a as Gn}from"./chunk-6HY7QUMP.js";import{a as jn,b as Kn}from"./chunk-V6JSMX5A.js";import{a as zn}from"./chunk-Q7QHJJGR.js";import{a as P,b as N,c as Wn,d as Xn}from"./chunk-YLDLDEUP.js";import{a as Ln}from"./chunk-U56YWPSI.js";import{a as je}from"./chunk-YHXUBVN2.js";import"./chunk-3TXHFKDN.js";import{Agent as xt}from"agents";import{nanoid as hn}from"nanoid";async function Gt(t){t.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 ot(t,e){t.sql`INSERT INTO messages (id, role, type, content, ts) VALUES (${e.id}, ${e.role}, ${e.type}, ${e.content}, ${e.ts})`}async function C(t){return t.sql`SELECT id, role, type, content, ts FROM messages ORDER BY ts ASC`}async function B(t){t.sql`DELETE FROM messages`}async function at(t){await Gt(t)}var le=Object.freeze({}),Wt="__SYSTEM_";function ue(t){return t.startsWith(Wt)}function Xt(t){let e={};for(let[r,n]of Object.entries(t))ue(r)||(e[r]=n);return Object.freeze(e)}function $(t){return(typeof t=="string"?t.trim():"")||"default"}async function it(t,e,r){if(!e)return le;let n=$(r);if(t.HX_ORA_URL&&t.HX_API_KEY)try{let a=new URL(`${t.HX_ORA_URL.replace(/\/$/,"")}/internal/secrets`);a.searchParams.set("org",n);let o=await fetch(a,{headers:{Authorization:t.HX_API_KEY}});if(o.ok){let i=await o.json();if(i.secrets)return Xt(i.secrets)}else console.warn(`[secrets] API failed with status ${o.status}, falling back to KV`)}catch(a){console.error("[secrets] API request failed, falling back to KV",a)}let s=t.ORA_SECRETS;if(!s)return le;try{let a={};return await zt(s,`${e}:${n}:`,a),n==="default"&&await qt(s,e,a),Object.freeze(a)}catch(a){return console.error("[secrets] failed to load tenant secrets from KV",{tenant:e,org:n,err:a}),le}}async function zt(t,e,r){let n=await t.list({prefix:e,limit:1e3});n.list_complete===!1&&console.warn(`[secrets] prefix=${e} exceeded list page; truncating to first 1000 keys`);let s=n.keys.filter(o=>{let i=o.name.slice(e.length);return i.length>0&&!i.includes(":")&&!ue(i)}),a=await Promise.all(s.map(async o=>{let i=await t.get(o.name);return i!==null?[o.name.slice(e.length),i]:null}));for(let o of a){if(!o)continue;let[i,c]=o;i&&(r[i]=c)}}async function qt(t,e,r){let n=`${e}:`,s=await t.list({prefix:n,limit:1e3});s.list_complete===!1&&console.warn(`[secrets] tenant=${e} legacy secrets exceeded list page; truncating to first 1000 keys`);let a=s.keys.filter(i=>{let c=i.name.slice(n.length);return c.length>0&&!c.includes(":")&&!ue(c)}),o=await Promise.all(a.map(async i=>{let c=i.name.slice(n.length);if(c in r)return null;let l=await t.get(i.name);return l!==null?[c,l]:null}));for(let i of o){if(!i)continue;let[c,l]=i;c&&(r[c]=l)}}var Vt=3e4;function Yt(t){let e=t.org??"default";return JSON.stringify([t.flowId,t.tenant??"",e])}var Z=class{ttlMs;entries=new Map;inFlight=new Map;generation=0;backendUrl="";backendKeyRef="";constructor(e=Vt){this.ttlMs=e}clear(){this.generation+=1,this.entries.clear(),this.inFlight.clear(),this.backendUrl="",this.backendKeyRef=""}ensureBackend(e){let r=e.HX_ORA_URL??"",n=e.HX_API_KEY??"";return!r||!n?!1:((r!==this.backendUrl||n!==this.backendKeyRef)&&(this.backendUrl=r,this.backendKeyRef=n,this.generation+=1,this.entries.clear(),this.inFlight.clear()),!0)}async load(e,r){if(!this.ensureBackend(e))return{};let n=Yt(r),s=Date.now(),a=this.entries.get(n);if(a&&a.expiresAt>s)return a.value;let o=this.inFlight.get(n);if(o)return o;let i=this.generation,c;c=(async()=>{try{let l=await je(e),u={};for(let d of l)d!=null&&d.id&&(u[d.id]=d);return i===this.generation&&this.entries.set(n,{expiresAt:Date.now()+this.ttlMs,value:u}),u}finally{this.inFlight.get(n)===c&&this.inFlight.delete(n)}})(),this.inFlight.set(n,c);try{return await c}catch(l){throw i===this.generation&&this.entries.delete(n),l}}};function ct(t){return $(t)}function de(t){return{"Content-Type":"application/json",Authorization:t.HX_API_KEY}}function Q(t){return!!(t!=null&&t.HX_ORA_URL)&&!!(t!=null&&t.HX_API_KEY)}var Jt="anonymous:";function lt(t,e){return(t==null?void 0:t.trim())||`${Jt}${e}`}async function me(t,e){if(!Q(t))return null;let r=await fetch(`${t.HX_ORA_URL}/internal/runs`,{method:"POST",headers:de(t),body:JSON.stringify(e)});return r.ok?await r.json():(console.error("[oraTriggers] createRun failed",r.status,await r.text().catch(()=>"")),null)}async function K(t,e){if(!Q(t))return{claimed:!0};let r=await fetch(`${t.HX_ORA_URL}/internal/runs/${encodeURIComponent(e)}/claim`,{method:"POST",headers:de(t)});if(!r.ok){let n=await r.text().catch(()=>"");throw new Error(`claimRun ${e} failed with ${r.status}: ${n}`)}return await r.json()}async function ee(t,e,r,n=3){if(!Q(t))return!0;for(let s=1;s<=n;s++){try{let a=await fetch(`${t.HX_ORA_URL}/internal/runs/${encodeURIComponent(e)}/complete`,{method:"POST",headers:de(t),body:JSON.stringify(r)});if(a.ok||a.status===409)return!0;if(a.status===404)return console.error(`[oraTriggers] completeRun ${e} rejected with 404`),!1;console.warn(`[oraTriggers] completeRun ${e} attempt ${s} failed with ${a.status}`)}catch(a){console.warn(`[oraTriggers] completeRun ${e} attempt ${s} threw`,a)}s<n&&await new Promise(a=>setTimeout(a,250*s))}return console.error(`[oraTriggers] completeRun ${e} exhausted ${n} attempts; hx-ora will time the run out`),!1}async function ut(t,e){if(!Q(t))return Promise.resolve();try{return await me(t,e)}catch(r){return console.error("[oraTriggers] recordRun failed",r),null}}function te(t){var s;let e=((s=t==null?void 0:t.flowData)==null?void 0:s.state)??(t==null?void 0:t.flowData),n=((e==null?void 0:e.nodes)??[]).find(a=>a.type==="startNode");return n==null?void 0:n.data}import{nanoid as pn}from"nanoid";import{generateText as Bt}from"ai";var Zt={short:`Up to ${J("short")} markdown lines (one fact or bullet per line). Keep constraints, working agreements, and the outline of anything already settled.`,medium:`Up to ${J("medium")} markdown lines. Group bullets by whatever this session is about (actors, constraints, decisions, current plan/state, open work). Under-remembering is worse than a few extra lines.`,long:`Up to ${J("long")} markdown lines. Same as medium, with one-line context on a decision or plan block when later turns will need it.`},Qt=12,en=400,dt=700;function tn(t,e=Qt){let r=t.filter(s=>s.role==="user"||s.role==="assistant").slice(-e),n=[];for(let s of r){let a=typeof s.content=="string"?s.content:JSON.stringify(s.content??""),o=s.role==="assistant"?dt:en,i=a.trim().replace(/\s+/g," ").slice(0,o);i&&n.push(`${s.role==="user"?"U":"A"}: ${i}`)}return n.join(`
2
+ `)}function nn(t){let e=t??{},r=e.promptTokens??e.inputTokens??0,n=e.completionTokens??e.outputTokens??0,s=e.totalTokens??r+n;return{promptTokens:r,completionTokens:n,totalTokens:s}}function rn(t){var e;for(let r=t.length-1;r>=0;r--)if(((e=t[r])==null?void 0:e.role)==="assistant"&&typeof t[r].content=="string")return t[r].content;return""}function sn(t){var s,a;let e=((s=t.flowData)==null?void 0:s.state)??t.flowData,r=(e==null?void 0:e.nodes)??[],n=[];for(let o of r){if(o.type!=="answerNode")continue;let i=(a=t.results)==null?void 0:a[o.id];i!=null&&n.push(typeof i=="string"?i:JSON.stringify(i))}return n.join(`
3
+ `)}function on(t){var n;let e=["You maintain a KEYPOINT memory for one agent session so later turns can continue without re-asking.",`Hard limit: ${t.maxTokens} tokens.`,Zt[t.length],"The session domain is unknown: personal, operational, technical, or mixed. Do not assume a personal-coaching frame.","Store facts that will still matter: who/what is in play, constraints and invariants, preferences, decisions, current state of the work, and the outline of anything the user accepted or asked to keep.","When something was confirmed (a plan, a process, a design, a sequence), keep a compact outline \u2014 enough to resume the next part \u2014 not the assistant\u2019s full wording.","Keep earlier facts unless the user superseded them. Merge, update, dedupe. Do not collapse memory to a single identity line plus one decision.","Never copy the conversation. Never write User:/Assistant:/U:/A: lines. Drop greetings, filler, and unanswered assistant questions.","If this turn added nothing durable, return the current memory unchanged.","If memory is empty and nothing durable happened, return exactly: (none)","Use the same language as the user. Return only the bullet list \u2014 no preamble."].join(" "),r=["Current keypoint memory:",'"""',t.previous.trim()||"(empty)",'"""',"","Recent session (for extraction only; do not transcribe):",'"""',((n=t.recentTurns)==null?void 0:n.trim())||"(none)",'"""',"","This turn:",`User said: ${t.userText.trim()||"(empty)"}`,t.assistantText.trim()?`Latest assistant reply (extract accepted plan/facts only): ${t.assistantText.trim().slice(0,dt)}`:"",t.answers.trim()?`Answer outputs:
4
4
  ${t.answers.trim()}`:""].filter(Boolean).join(`
5
- `);return{system:e,user:r}}function Wt(t){return $e(t.previous,De(t.userText),t.maxTokens)}async function Gt(t){let e="",r;for await(let n of t.fullStream)n.type==="text-delta"&&(e+=n.text??n.delta??""),n.type==="error"&&(r=n.error instanceof Error?n.error.message:String(n.error??"stream error"));return{text:e.trim(),error:r}}async function Xt(t){if(t.fullStream&&typeof t.fullStream[Symbol.asyncIterator]=="function")return Gt({fullStream:t.fullStream});try{return{text:((typeof t.text=="string"?t.text:await t.text)||"").trim()}}catch(e){return{text:"",error:e instanceof Error?e.message:String(e)}}}async function Be(t){var u;let e=X(t.engineState);if(!e)return{status:"skipped",reason:"start_node_missing"};if(!Pe(e))return{status:"skipped",reason:"memory_disabled"};let r=Me(e),n=Ue(r),s=ve(e),o=Y(t.previousContent||""),a=jt(t.messages),i=Ht(t.engineState),c=l=>{let p=Wt({previous:o,userText:t.userText,maxTokens:n});return{status:"written",content:p,truncated:!1,modelId:s,fallback:!0,error:p?void 0:l}};try{let l=await We(s,t.sessionEnv,{maxOutputTokens:n});if(!l)throw new Error(`Memory model '${s}' not found in registry`);let p=Ce(r,(u=l.reasoning)==null?void 0:u.kind),{system:g,user:m}=Kt({previous:o,userText:t.userText,assistantText:a,answers:i,length:r,maxTokens:n,recentTurns:Lt(t.messages)}),y=He(l.reasoning),f=Ke(l.provider,{effort:y,exposeReasoning:!1,maxTokens:p}),h=Ct({model:l.modelHandle,system:g,messages:[{role:"user",content:m}],...je({...l.effectiveParams??{},maxOutputTokens:p}),...f?{providerOptions:f}:{}}),R=await Xt(h),S=Ft(await h.usage),T=Y(R.text);if(Ne(T)&&(T=""),!T)return{...c(R.error||"Memory model returned empty text"),usage:S};let x=Oe(T,n);return{status:"written",content:x.content,truncated:x.truncated,usage:S,modelId:s}}catch(l){let p=l instanceof Error?l.message:"Memory update failed";return console.error("Memory update failed:",l),c(p)}}async function Ze(t,e){var n,s;let r=(n=e==null?void 0:e.flowData)==null?void 0:n.flowId;if(!(t!=null&&t.HX_CORE_URL)||!r)return{engineState:e,refreshed:!1};try{let o=await v(r,t),a={...e,flowData:{...o,tenant:e.flowData.tenant,flowId:r,chatId:e.flowData.chatId}},i=o==null?void 0:o.stateVersion,c=typeof i=="number"&&i!==((s=e.flowData)==null?void 0:s.stateVersion);return{engineState:a,refreshed:c}}catch(o){return console.error(`[flowRefresh] fetch failed for flow ${r}:`,o),{engineState:e,refreshed:!1}}}function qt(t,e){let r=[],n=s=>{if(s)for(let[o,a]of Object.entries(s))typeof a=="string"&&a.length>=8&&r.push({name:o,value:a})};return n(t),n(e),r.sort((s,o)=>o.value.length-s.value.length),r}function Qe(t,e){let r=t;for(let n of e)r.includes(n.value)&&(r=r.split(n.value).join(`[redacted:${n.name}]`));return r}function te(t,e){if(typeof t=="string")return Qe(t,e);if(Array.isArray(t))return t.map(r=>te(r,e));if(t!==null&&typeof t=="object"){let r={};for(let[n,s]of Object.entries(t))r[Qe(n,e)]=te(s,e);return r}return t}function ne(t,e,r){let n=qt(e,r);return n.length===0?t:te(t,n)}function et(t,e){return!t||!t.HX_ORA_URL||!t.HX_API_KEY?Promise.resolve():fetch(`${t.HX_ORA_URL}/internal/sessions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:t.HX_API_KEY},body:JSON.stringify(e)}).catch(r=>{console.error("[sessionIndex] failed to index session",r)})}var tt=async(t,e)=>{fetch(`${e.DW_URL}/q/telemetry/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),`${JSON.stringify(t)}`};var nt=["image/png","image/jpeg","image/webp","image/gif"];var zt=/^data:([^;,]*)((?:;[^;,]*)*?);base64,/i,Vt=/^[A-Za-z0-9+/]*={0,2}$/;function Jt(t){var n;let e=t,r;if(/^data:/i.test(e)){let s=zt.exec(e);if(!s)return{error:"must be base64 or a base64 data URL"};r=((n=s[1])==null?void 0:n.trim().toLowerCase())||void 0,e=e.slice(s[0].length)}return e=e.replace(/\s+/g,""),!e||e.length%4!==0||!Vt.test(e)?{error:"is not valid base64"}:{data:e,dataUrlMime:r}}function re(t){let e=t.endsWith("==")?2:t.endsWith("=")?1:0;return t.length/4*3-e}function st(t,e){if(typeof t.data!="string"||!t.data)return`${e}.data must be a non-empty string`;let r=Jt(t.data);if("error"in r)return`${e}.data ${r.error}`;let n=re(r.data);return n>8388608?`${e} is ${n} bytes; the limit is 8388608 bytes`:{...r,size:n}}function Yt(t){if(!Array.isArray(t))return"images must be an array of { mimeType, data }";if(t.length>4)return"images accepts at most 4 items";let e=[];for(let[r,n]of t.entries()){let s=`images[${r}]`;if(!n||typeof n!="object"||Array.isArray(n))return`${s} must be an object { mimeType, data }`;let o=n,a=st(o,s);if(typeof a=="string")return a;let c=(typeof o.mimeType=="string"?o.mimeType.trim().toLowerCase():"")||a.dataUrlMime||"";if(!nt.includes(c))return`${s}.mimeType must be one of ${nt.join(", ")}`;e.push({mimeType:c,data:a.data})}return e}function Bt(t){if(!Array.isArray(t))return"documents must be an array of { name, mimeType, data }";if(t.length>4)return"documents accepts at most 4 items";let e=[];for(let[r,n]of t.entries()){let s=`documents[${r}]`;if(!n||typeof n!="object"||Array.isArray(n))return`${s} must be an object { name, mimeType, data }`;let o=n,a=typeof o.name=="string"?o.name.trim():"";if(!a)return`${s}.name must be a non-empty string`;let i=st(o,s);if(typeof i=="string")return i;let u=(typeof o.mimeType=="string"?o.mimeType.trim():"")||i.dataUrlMime||"application/octet-stream";e.push({name:a,mimeType:u,data:i.data})}return e}function ot(t){let e,r;if(t.images!==void 0&&t.images!==null){let n=Yt(t.images);if(typeof n=="string")return{ok:!1,error:n};n.length&&(e=n)}if(t.documents!==void 0&&t.documents!==null){let n=Bt(t.documents);if(typeof n=="string")return{ok:!1,error:n};n.length&&(r=n)}return{ok:!0,...e?{images:e}:{},...r?{documents:r}:{}}}function at(t){return{images:(t.images??[]).map(e=>({mimeType:e.mimeType,bytes:re(e.data)})),documents:(t.documents??[]).map(e=>({mimeType:e.mimeType,bytes:re(e.data)}))}}function rt(t){return Array.isArray(t)&&t.some(e=>e&&typeof e=="object"&&typeof e.data=="string")}function N(t){if(!t||typeof t!="object")return t;let e={...t};if(t.context&&typeof t.context=="object"&&(e.context={...t.context},rt(e.context.user_images)&&(e.context.user_images=[])),t.results&&typeof t.results=="object"){let r={...t.results};for(let[n,s]of Object.entries(r))s&&typeof s=="object"&&rt(s.images)&&(r[n]={...s,images:[]});e.results=r}return e}async function D(t,e){var o;let r=t.id||t.name||"",[n,s]=String(r).split("::");if(!n||!s)return null;try{let i=(o=(await U(n,e)).metadata)==null?void 0:o.tenant,u={flowData:{...await v(n,e),tenant:i,flowId:n,chatId:s},executedNodes:[],context:{}};return t.setState({...t.state,engineState:u}),u}catch(a){return console.error("Failed to initialize engine state:",a),null}}async function Qt(t,e,r){var n;if(e&&t.HX_CORE_URL&&t.HX_API_KEY)try{let s=await U(e,t),o=(n=s==null?void 0:s.metadata)==null?void 0:n.org;if(typeof o=="string"&&o.trim())return G(o)}catch(s){console.warn(`[secrets] could not read org for flow ${e}`,s)}return G(r)}async function $(t){var ce,ue,le,de,me,pe,fe,ge,ye,he,we;let{agent:e,env:r,ctx:n,payload:s,connection:o}=t,a=Date.now(),i=[],c=t.runId?Le():void 0,u=async()=>await O(e),l=async d=>{await Xe(e,d)},p=async d=>{if(e.state.modelsCache&&e.state.modelsCache[d])return e.state.modelsCache[d];try{let{fetchOraModel:w}=await import("./oraApi-YIJGMXX7.js"),A=await w(d,r);return e.setState({...e.state,modelsCache:{...e.state.modelsCache||{},[d]:A}}),A}catch(w){throw console.error(`Error fetching model ${d}:`,w),w}},g={id:Zt(),role:"user",type:"text",content:s.text,images:s.images,ts:Date.now()};await l(g);let m={onChangeState:d=>{e.setState({...e.state,engineState:N(d)})},onServerEvent:async d=>{var w;await((w=t.onServerEvent)==null?void 0:w.call(t,d)),i.push(d.type==="info:flow"&&d.content?{...d,content:N(d.content)}:d)},onTelemetry:async d=>{var _,Se,Re,Ee,Te,Ie;let w=t.user,A=typeof(w==null?void 0:w.org)=="string"&&w.org.trim()?w.org.trim():"default";await tt({...d,userId:t.resolveUserId(),tenant:((Se=(_=e.state.engineState)==null?void 0:_.flowData)==null?void 0:Se.tenant)||"",org:A,flowId:((Ee=(Re=e.state.engineState)==null?void 0:Re.flowData)==null?void 0:Ee.flowId)||"",sessionId:((Ie=(Te=e.state.engineState)==null?void 0:Te.flowData)==null?void 0:Ie.chatId)||""},r)},onError:d=>{var w;(w=t.onError)==null||w.call(t,d),e.setState({...e.state,error:d})},shouldStop:t.shouldStop},y=e.state.engineState?{...e.state.engineState}:null;if(y){let{engineState:d,refreshed:w}=await Ze(r,y);y=d,w&&e.setState({...e.state,engineState:y,modelsCache:{}})}else if(y=await D(e,r),!y){let d="Failed to initialize agent";return m.onError(d),{status:"failed",error:d,path:[]}}let f=t.user??void 0,h=(ce=y.flowData)==null?void 0:ce.tenant,R=await Qt(r,(ue=y.flowData)==null?void 0:ue.flowId,f==null?void 0:f.org),S=h?await Je(r,h,R):{};(le=t.onSecretsLoaded)==null||le.call(t,S),y={...y,context:{...y.context||{},user:f}},e.setState({...e.state,user:f,engineState:y});let T={env:r,ctx:n,conn:o,getMessages:u,setMessages:l,getOraModel:p,secrets:S,userAuth:t.userAuth,user:f,composioSessions:t.composioSessions,publicOrigin:t.publicOrigin,skillRefCache:t.skillRefCache,runId:t.runId,outputCollector:c,agentMemory:typeof((de=e.state.memory)==null?void 0:de.content)=="string"?e.state.memory.content:"",shouldStop:t.shouldStop,workerStack:(me=y.flowData)!=null&&me.flowId?[y.flowData.flowId]:[],workerCalls:{count:0}},x=await Ge(T,y,m)(s),E=e.state.engineState??y;if(x.status==="completed")try{let d=await Be({sessionEnv:T,engineState:E,previousContent:typeof((pe=e.state.memory)==null?void 0:pe.content)=="string"?e.state.memory.content:"",userText:s.text||"",messages:await u()});if(d.status==="skipped")await m.onServerEvent({type:"agent:memory",content:{skipped:!0,reason:d.reason},timestamp:Date.now()});else if(!d.content.trim())await m.onServerEvent({type:"agent:memory",content:{updated:!1,empty:!0,error:d.error,fallback:d.fallback},timestamp:Date.now()});else{let w={promptTokens:((fe=E.tokenUsage)==null?void 0:fe.promptTokens)??0,completionTokens:((ge=E.tokenUsage)==null?void 0:ge.completionTokens)??0,totalTokens:((ye=E.tokenUsage)==null?void 0:ye.totalTokens)??0};d.usage&&(w.promptTokens+=d.usage.promptTokens,w.completionTokens+=d.usage.completionTokens,w.totalTokens+=d.usage.totalTokens),E={...E,tokenUsage:w},e.setState({...e.state,engineState:N(E),memory:{content:d.content,updatedTs:Date.now(),...d.error?{lastError:d.error}:{},...d.fallback?{fallback:!0}:{}}}),await m.onTelemetry({type:"memory_update",payload:{model:d.modelId,truncated:d.truncated,usage:d.usage,fallback:d.fallback,error:d.error}}),await m.onServerEvent({type:"agent:memory",content:{updated:!0,truncated:d.truncated,fallback:d.fallback,error:d.error},timestamp:Date.now()})}}catch(d){let w=d instanceof Error?d.message:"Memory update failed";console.error("Memory update failed:",d),await m.onServerEvent({type:"agent:memory",content:{error:w},timestamp:Date.now()})}if(x.status==="completed"&&t.runId&&(c!=null&&c.hasOutputs())){let{flowId:d,chatId:w}=E.flowData??{};if(!d||!w)x={status:"failed",error:"Structured output persistence requires flowId and sessionId"};else try{await Fe(r,{flowId:d,sessionId:w,runId:t.runId,createdAt:new Date(a).toISOString(),data:c.snapshotData(),answerNodeIds:c.answerNodeIds()});let A={...E.results||{}};for(let _ of c.answerNodeIds())A[_]={...A[_]||{},persisted:!0,runId:t.runId};E={...E,results:A},e.setState({...e.state,engineState:N(E)})}catch(A){let _=A instanceof Error?A.message:"Structured output persistence failed";m.onError(_),await m.onServerEvent({type:"error:answer-output",content:{runId:t.runId,error:_},timestamp:Date.now()}),x={status:"failed",error:_}}}let{tenant:L,flowId:V,chatId:J}=E.flowData??{},At=(he=E.flowData)==null?void 0:he.org;L&&V&&J&&n.waitUntil(et(r,{id:`${V}::${J}`,tenant:L,org:At,flowId:V,sessionId:J,userId:t.resolveUserId(),title:(we=s.text)==null?void 0:we.slice(0,120),turnTs:a,events:i})),e.setState({...e.state,lastUpdated:new Date});let kt=(E.executedNodes??[]).flatMap(d=>typeof(d==null?void 0:d.id)=="string"?[d.id]:[]),bt=typeof x.error=="string"?ne(x.error,S,t.userAuth):x.error,ie=c!=null&&c.hasOutputs()?ne(c.snapshotData(),S,t.userAuth):void 0;return{status:x.status,error:bt,engineState:E,path:kt,...ie!==void 0?{outputs:ie}:{}}}import{nanoid as en}from"nanoid";function tn(t){let e=t.headers.get("X-User-Payload");if(!e)return null;try{let r=JSON.parse(e),n=typeof(r==null?void 0:r.email)=="string"?M(r.email):null;return n?{...r,email:n}:null}catch{return null}}async function it(t,e,r,n){var s;try{let o=await e.json().catch(()=>null);if(!o||typeof o!="object"||Array.isArray(o))return new Response(JSON.stringify({error:"Body must be a JSON object"}),{status:400,headers:{"content-type":"application/json"}});let a=o.message;if(!a||typeof a!="string")return new Response(JSON.stringify({error:"Invalid message"}),{status:400,headers:{"content-type":"application/json"}});let i=ot(o);if(!i.ok)return new Response(JSON.stringify({error:`Invalid attachments: ${i.error}`}),{status:400,headers:{"content-type":"application/json"}});let{images:c,documents:u}=i;(c||u)&&console.log("[AgentHTTP] turn attachments",JSON.stringify(at({images:c,documents:u})));let l=typeof o.userId=="string"?M(o.userId):null,p=tn(e),g=p==null?void 0:p.email;p?t.setState({...t.state,user:p,injectedUserId:g}):l&&!((s=t.state.user)!=null&&s.email)&&t.setState({...t.state,injectedUserId:l});let m=()=>g??l??t.state.injectedUserId??void 0;t.skillRefCache||(t.skillRefCache=new Map);let y=o.inputs&&typeof o.inputs=="object"?o.inputs:void 0;if(!t.state.engineState&&!await D(t,r))return new Response(JSON.stringify({error:"Failed to initialize agent"}),{status:500,headers:{"content-type":"application/json"}});let f=`run-${en(12)}`;await t.registerManualRun(f,a,m()),await C(r,f).catch(T=>{console.warn(`[AgentHTTP] could not mark manual run ${f} as running`,T)});let h;try{h=await $({agent:t,env:r,ctx:n,payload:{text:a,...c?{images:c}:{},...u?{documents:u}:{},inputs:y},skillRefCache:t.skillRefCache,user:p??void 0,resolveUserId:m,runId:f,shouldStop:()=>t.isRunStopRequested(f)}),n.waitUntil(t.completeManualRun(f,h.status==="completed"?"succeeded":h.status==="stopped"?"skipped":"failed",h.error))}finally{await t.clearRunStopRequest(f)}if(h.status==="failed")return new Response(JSON.stringify({error:h.error||"Agent execution failed",runId:f,path:h.path??[]}),{status:500,headers:{"content-type":"application/json"}});if(h.status==="stopped")return new Response(JSON.stringify({error:h.error||"Stopped by user"}),{status:409,headers:{"content-type":"application/json"}});let S=(await O(t)).reverse().find(T=>T.role==="assistant");return new Response(JSON.stringify({answer:(S==null?void 0:S.content)||"",runId:f,path:h.path??[],...h.outputs!==void 0?{outputs:h.outputs}:{}}),{headers:{"content-type":"application/json"}})}catch(o){return new Response(JSON.stringify({error:o.message}),{status:500,headers:{"content-type":"application/json"}})}}async function ct(t){try{return await H(t),t.skillRefCache&&t.skillRefCache.clear(),t.setState({...t.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 lt="trigger:nonce:",rn=900*1e3,se="run:stop:",dt=class extends ut{initialState={user:void 0,injectedUserId:null,sessionId:null,lastUpdated:null,modelsCache:{},memory:void 0};constructor(e,r){super(e,r),this.requireStateValidation()}validateStateChange(e,r){if(r!=="server")throw new Error("Client state updates are forbidden")}requireStateValidation(){if(typeof ut.prototype.validateStateChange!="function")throw new Error("AgentDO requires agents >= 0.8.7 with validateStateChange; upgrade the tenant SDK")}resolveSessionUserId(){return this.state.injectedUserId??void 0}secrets=Object.freeze({});userAuth={};composioSessions={};skillRefCache=new Map;publicOrigin;async inspectPersistedSession(e){return e==="state"?{state:this.state}:e==="memory"?{memory:this.state.memory??null}:{messages:await O(this)}}async requestRunStop(e){return e!=null&&e.trim()?(await this.ctx.storage.put(`${se}${e}`,Date.now()),{accepted:!0}):{accepted:!1}}async isRunStopRequested(e){return!!await this.ctx.storage.get(`${se}${e}`)}async clearRunStopRequest(e){await this.ctx.storage.delete(`${se}${e}`)}async onRequest(e){this.requireStateValidation();let r=new URL(e.url);if(r.pathname.endsWith("/state"))return new Response(JSON.stringify(this.state),{headers:{"content-type":"application/json"}});if(r.pathname.endsWith("/history")){let n=await O(this);return new Response(JSON.stringify(n),{headers:{"content-type":"application/json"}})}return e.method==="POST"&&r.pathname.endsWith("/message")?it(this,e,this.env,this.ctx):e.method==="DELETE"&&r.pathname.endsWith("/clear")?ct(this):new Response("Ready to assist.")}async onConnect(e,r){var m,y,f,h,R;this.requireStateValidation();let n=this.name||e.server||"",[s,o]=n.split("::"),i=(m=(await U(s,this.env)).metadata)==null?void 0:m.tenant;this.userAuth={},this.composioSessions={},this.publicOrigin=void 0;let c=null;if(r.request){try{this.publicOrigin=new URL(r.request.url).origin}catch{}let S=r.request.headers.get("X-User-Payload");if(S)try{c=JSON.parse(S)}catch(T){console.warn("Failed to parse X-User-Payload",T)}}e.setState({...e.state,authorizedUser:c});let u=await v(s,this.env);this.setState({...this.state,user:c||null,sessionId:o,engineState:{flowData:{...u,tenant:i,flowId:s,chatId:o},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 l=await O(this);k(e,I.SERVER_HISTORY,JSON.stringify({messages:l}));let g=(((y=u==null?void 0:u.state)==null?void 0:y.nodes)??(u==null?void 0:u.nodes)??[]).find(S=>S.type==="startNode");if(g){let S={allow_images:((f=g.data)==null?void 0:f.allow_images)??!1,allow_documents:((h=g.data)==null?void 0:h.allow_documents)??!1,greeting:(R=g.data)==null?void 0:R.greeting};k(e,I.SERVER_CONFIG,JSON.stringify(S))}}async onMessage(e,r){if(typeof r!="string")return;let n=r.indexOf(":");if(n===-1)return;let s=r.substring(0,n),o=r.substring(n+1);if(!s||!o)return;let i={[I.USER_MESSAGE]:c=>this.onUserMessage(e,c),[I.USER_CLEAR_HISTORY]:()=>this.onClearHistory(e),[I.USER_AUTH]:c=>this.onUserAuth(e,c),[I.USER_IDENTITY]:c=>this.onUserIdentity(e,c)}[s];i&&await i(o)}async onUserMessage(e,r){var i;let n=be(r),s=((i=e.state)==null?void 0:i.authorizedUser)??void 0,o=()=>(s==null?void 0:s.email)??this.resolveSessionUserId(),a=`run-${nn(12)}`;await this.registerManualRun(a,n.text,o()),await C(this.env,a).catch(c=>{console.warn(`[AgentDO] could not mark manual run ${a} as running`,c)});try{let c=await $({agent:this,env:this.env,ctx:this.ctx,payload:n,connection:e,userAuth:this.userAuth,composioSessions:this.composioSessions,publicOrigin:this.publicOrigin,skillRefCache:this.skillRefCache,user:s,resolveUserId:o,runId:a,shouldStop:()=>this.isRunStopRequested(a),onServerEvent:u=>{k(e,I.SERVER_EVENT,JSON.stringify(u))},onError:u=>{k(e,I.SERVER_ERROR,u)},onSecretsLoaded:u=>{this.secrets=u}});this.ctx.waitUntil(this.completeManualRun(a,c.status==="completed"?"succeeded":c.status==="stopped"?"skipped":"failed",c.error))}finally{await this.clearRunStopRequest(a)}}registerManualRun(e,r,n){var c;let{tenant:s,flowId:o,chatId:a}=((c=this.state.engineState)==null?void 0:c.flowData)??{};if(!s||!o||!a)return Promise.resolve();let i=ze(n||this.resolveSessionUserId(),a);return Ve(this.env,{id:e,tenant:s,flowId:o,userId:i,sessionId:a,label:r==null?void 0:r.slice(0,120)})}completeManualRun(e,r,n){return W(this.env,e,{status:r,error:n})}async enqueueTrigger(e){var s;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 r=e.runAsUserId;return r&&!((s=this.state.user)!=null&&s.email)&&this.state.injectedUserId!==r&&this.setState({...this.state,injectedUserId:r}),{queued:!0,taskId:await this.queue("processTrigger",e)}}async claimTriggerNonce(e){let r=`${lt}${e}`;if(await this.ctx.storage.get(r))return!1;let n=Date.now();await this.ctx.storage.put(r,n);let o=[...(await this.ctx.storage.list({prefix:lt})).entries()].filter(([,a])=>n-a>rn).map(([a])=>a);return o.length>0&&await this.ctx.storage.delete(o),!0}async processTrigger(e){if(!(await C(this.env,e.runId)).claimed){console.warn(`[AgentDO] activation ${e.activationId} skipped \u2014 run ${e.runId} already claimed`);return}try{this.state.engineState||await D(this,this.env);let n=Ae(X(this.state.engineState)),s=ke(n,e.inputs||{},e.label),o=await $({agent:this,env:this.env,ctx:this.ctx,payload:{text:s,inputs:e.inputs||{}},composioSessions:this.composioSessions,skillRefCache:this.skillRefCache,resolveUserId:()=>e.runAsUserId||this.resolveSessionUserId(),runId:e.runId,shouldStop:()=>this.isRunStopRequested(e.runId),onSecretsLoaded:a=>{this.secrets=a}});await W(this.env,e.runId,{status:o.status==="completed"?"succeeded":o.status==="stopped"?"skipped":"failed",error:o.error})}catch(n){let s=n instanceof Error?n.message:"Trigger execution failed";throw await W(this.env,e.runId,{status:"failed",error:s}),n}finally{await this.clearRunStopRequest(e.runId)}}async onUserIdentity(e,r){let n=M(r);if(!n){k(e,I.SERVER_ERROR,"Invalid identity payload");return}this.setState({...this.state,injectedUserId:n}),k(e,I.SERVER_EVENT,JSON.stringify({type:"info:identity",content:{set:!0}}))}async onUserAuth(e,r){let n=_e(r);if(!n){k(e,I.SERVER_ERROR,"Invalid auth payload");return}let s=n.value.trim();s===""?delete this.userAuth[n.name]:this.userAuth[n.name]=n.value,k(e,I.SERVER_EVENT,JSON.stringify({type:"info:auth",content:{name:n.name,set:s!==""}}))}async onClearHistory(e){await H(this),this.userAuth={},this.composioSessions={},this.skillRefCache.clear(),this.setState({...this.state,error:"",engineState:this.state.engineState,memory:this.state.memory,modelsCache:{},lastUpdated:new Date}),e&&k(e,I.SERVER_HISTORY,JSON.stringify({messages:[]}))}async onStart(){`${JSON.stringify(this.state)}`,await qe(this);let e=await O(this);`${JSON.stringify(e)}`}async onClose(e,r,n,s){console.log(`Session closed: ${this.state.sessionId} ${r} - ${n}`)}async onError(e){console.error("AgentDO encountered an error:",e)}};import{DurableObject as sn}from"cloudflare:workers";var on=720*60*60*1e3,mt=class extends sn{cryptoKey;async load(){let e=await this.ctx.storage.get("state");if(!e)return null;await this.touch();try{let r=await crypto.subtle.decrypt({name:"AES-GCM",iv:e.iv},await this.key(),e.data);return{state:JSON.parse(new TextDecoder().decode(r)),updatedAt:e.updatedAt}}catch{return await this.ctx.storage.delete("state"),null}}async save(e,r){let n=await this.ctx.storage.get("state");if(n&&n.updatedAt>r)return;let s=crypto.getRandomValues(new Uint8Array(12)),o=await crypto.subtle.encrypt({name:"AES-GCM",iv:s},await this.key(),new TextEncoder().encode(JSON.stringify(e)));await this.ctx.storage.put("state",{iv:s.buffer,data:o,updatedAt:r}),await this.touch()}async invalidate(){await this.ctx.storage.delete("state")}async acquire(e,r){let n=await this.ctx.storage.get("lease");return n&&n.holder!==e&&n.until>Date.now()?!1:(await this.ctx.storage.put("lease",{holder:e,until:Date.now()+r}),!0)}async release(e){let r=await this.ctx.storage.get("lease");(r==null?void 0:r.holder)===e&&await this.ctx.storage.delete("lease")}async busy(){let e=await this.ctx.storage.get("lease");return!!e&&e.until>Date.now()}async alarm(){await this.ctx.storage.deleteAll()}async touch(){await this.ctx.storage.setAlarm(Date.now()+on)}key(){return this.cryptoKey??=(async()=>{let e=Uint8Array.from(atob(this.env.WEB_SESSION_KEY??""),r=>r.charCodeAt(0));if(e.length!==32)throw new Error("WEB_SESSION_KEY must be 32 bytes in base64");return crypto.subtle.importKey("raw",e,"AES-GCM",!1,["encrypt","decrypt"])})(),this.cryptoKey}};function ua(t){let e=t.state;if(!e)return null;let r=["startNode","answerNode"];for(let n of r)if(!e.nodes.some(o=>o.type===n))return!1;return e.nodes.find(n=>n.type==="startNode")}import{importSPKI as an,jwtVerify as cn}from"jose";function q(t){let e={};if(!t)return e;let r=t.split(";");for(let n of r){let s=n.indexOf("=");if(s>-1){let o=n.slice(0,s).trim(),a=n.slice(s+1).trim();o&&(e[o]=decodeURIComponent(a))}}return e}function un(t){return(typeof t.email=="string"?t.email.trim():"")||null}async function P(t,e,r){let n=q(t.headers.get("cookie")),s=new URL(t.url),o=n.access_token||s.searchParams.get("access_token"),a=await ln(e,o);if(a.ok){let i=a.payload,c=un(i);return c?{id:i.sub,email:c,name:i.name,first_name:i.given_name,last_name:i.family_name,tenant:i.tenant,org:typeof i.org=="string"?i.org:null,roles:i["ora-roles"],db_name:i.db_name||null,user_id:i.user_id||null}:null}return null}async function ln(t,e){if(!e||typeof e!="string")return{ok:!1,payload:null,protectedHeader:null};if(!t.KC_RS256_PK)throw new Error("PK is not defined");let r=`-----BEGIN PUBLIC KEY-----
5
+ `);return{system:e,user:r}}function an(t){return Je(t.previous,Ye(t.userText),t.maxTokens)}async function mt(t){var l;let e=te(t.engineState);if(!e)return{status:"skipped",reason:"start_node_missing"};if(!We(e))return{status:"skipped",reason:"memory_disabled"};let r=ze(e),n=Ke(r),s=Xe(e),a=ce(t.previousContent||""),o=rn(t.messages),i=sn(t.engineState),c=u=>{let d=an({previous:a,userText:t.userText,maxTokens:n});return{status:"written",content:d,truncated:!1,modelId:s,fallback:!0,error:d?void 0:u}};try{let u=await nt(s,t.sessionEnv,{maxOutputTokens:n});if(!u)throw new Error(`Memory model '${s}' not found in registry`);let d=qe(r,(l=u.reasoning)==null?void 0:l.kind),{system:g,user:m}=on({previous:a,userText:t.userText,assistantText:o,answers:i,length:r,maxTokens:n,recentTurns:tn(t.messages)}),y=et(u.reasoning),h=tt(u.provider,{effort:y,exposeReasoning:!1,maxTokens:d}),p=await Bt({model:u.modelHandle,system:g,messages:[{role:"user",content:m}],...Qe({...u.effectiveParams??{},maxOutputTokens:d}),...h?{providerOptions:h}:{}}),S=nn(p.usage),R=ce((p.text||"").trim());if(Ve(R)&&(R=""),!R)return{...c("Memory model returned empty text"),usage:S};let k=Ge(R,n);return{status:"written",content:k.content,truncated:k.truncated,usage:S,modelId:s}}catch(u){let d=u instanceof Error?u.message:"Memory update failed";return console.error("Memory update failed:",u),c(d)}}async function ft(t,e){var n,s;let r=(n=e==null?void 0:e.flowData)==null?void 0:n.flowId;if(!(t!=null&&t.HX_CORE_URL)||!r)return{engineState:e,refreshed:!1};try{let a=await N(r,t),o={...e,flowData:{...a,tenant:e.flowData.tenant,flowId:r,chatId:e.flowData.chatId}},i=a==null?void 0:a.stateVersion,c=typeof i=="number"&&i!==((s=e.flowData)==null?void 0:s.stateVersion);return{engineState:o,refreshed:c}}catch(a){return console.error(`[flowRefresh] fetch failed for flow ${r}:`,a),{engineState:e,refreshed:!1}}}function cn(t,e){let r=[],n=s=>{if(s)for(let[a,o]of Object.entries(s))typeof o=="string"&&o.length>=8&&r.push({name:a,value:o})};return n(t),n(e),r.sort((s,a)=>a.value.length-s.value.length),r}function pt(t,e){let r=t;for(let n of e)r.includes(n.value)&&(r=r.split(n.value).join(`[redacted:${n.name}]`));return r}function fe(t,e){if(typeof t=="string")return pt(t,e);if(Array.isArray(t))return t.map(r=>fe(r,e));if(t!==null&&typeof t=="object"){let r={};for(let[n,s]of Object.entries(t))r[pt(n,e)]=fe(s,e);return r}return t}function pe(t,e,r){let n=cn(e,r);return n.length===0?t:fe(t,n)}function gt(t,e){return!t||!t.HX_ORA_URL||!t.HX_API_KEY?Promise.resolve():fetch(`${t.HX_ORA_URL}/internal/sessions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:t.HX_API_KEY},body:JSON.stringify(e)}).catch(r=>{console.error("[sessionIndex] failed to index session",r)})}var yt=["image/png","image/jpeg","image/webp","image/gif"];var ln=/^data:([^;,]*)((?:;[^;,]*)*?);base64,/i,un=/^[A-Za-z0-9+/]*={0,2}$/;function dn(t){var n;let e=t,r;if(/^data:/i.test(e)){let s=ln.exec(e);if(!s)return{error:"must be base64 or a base64 data URL"};r=((n=s[1])==null?void 0:n.trim().toLowerCase())||void 0,e=e.slice(s[0].length)}return e=e.replace(/\s+/g,""),!e||e.length%4!==0||!un.test(e)?{error:"is not valid base64"}:{data:e,dataUrlMime:r}}function ge(t){let e=t.endsWith("==")?2:t.endsWith("=")?1:0;return t.length/4*3-e}function wt(t,e){if(typeof t.data!="string"||!t.data)return`${e}.data must be a non-empty string`;let r=dn(t.data);if("error"in r)return`${e}.data ${r.error}`;let n=ge(r.data);return n>8388608?`${e} is ${n} bytes; the limit is 8388608 bytes`:{...r,size:n}}function mn(t){if(!Array.isArray(t))return"images must be an array of { mimeType, data }";if(t.length>4)return"images accepts at most 4 items";let e=[];for(let[r,n]of t.entries()){let s=`images[${r}]`;if(!n||typeof n!="object"||Array.isArray(n))return`${s} must be an object { mimeType, data }`;let a=n,o=wt(a,s);if(typeof o=="string")return o;let c=(typeof a.mimeType=="string"?a.mimeType.trim().toLowerCase():"")||o.dataUrlMime||"";if(!yt.includes(c))return`${s}.mimeType must be one of ${yt.join(", ")}`;e.push({mimeType:c,data:o.data})}return e}function fn(t){if(!Array.isArray(t))return"documents must be an array of { name, mimeType, data }";if(t.length>4)return"documents accepts at most 4 items";let e=[];for(let[r,n]of t.entries()){let s=`documents[${r}]`;if(!n||typeof n!="object"||Array.isArray(n))return`${s} must be an object { name, mimeType, data }`;let a=n,o=typeof a.name=="string"?a.name.trim():"";if(!o)return`${s}.name must be a non-empty string`;let i=wt(a,s);if(typeof i=="string")return i;let l=(typeof a.mimeType=="string"?a.mimeType.trim():"")||i.dataUrlMime||"application/octet-stream";e.push({name:o,mimeType:l,data:i.data})}return e}function Rt(t){let e,r;if(t.images!==void 0&&t.images!==null){let n=mn(t.images);if(typeof n=="string")return{ok:!1,error:n};n.length&&(e=n)}if(t.documents!==void 0&&t.documents!==null){let n=fn(t.documents);if(typeof n=="string")return{ok:!1,error:n};n.length&&(r=n)}return{ok:!0,...e?{images:e}:{},...r?{documents:r}:{}}}function St(t){return{images:(t.images??[]).map(e=>({mimeType:e.mimeType,bytes:ge(e.data)})),documents:(t.documents??[]).map(e=>({mimeType:e.mimeType,bytes:ge(e.data)}))}}function ht(t){return Array.isArray(t)&&t.some(e=>e&&typeof e=="object"&&typeof e.data=="string")}function ne(t){if(!t||typeof t!="object")return t;let e={...t};if(t.context&&typeof t.context=="object"&&(e.context={...t.context},ht(e.context.user_images)&&(e.context.user_images=[])),t.results&&typeof t.results=="object"){let r={...t.results};for(let[n,s]of Object.entries(r))s&&typeof s=="object"&&ht(s.images)&&(r[n]={...s,images:[]});e.results=r}return e}async function G(t,e){var a;let r=t.id||t.name||"",[n,s]=String(r).split("::");if(!n||!s)return null;try{typeof t.invalidateToolDefsCache=="function"&&t.invalidateToolDefsCache();let[o,i]=await Promise.all([P(n,e),N(n,e)]),c=(a=o.metadata)==null?void 0:a.tenant,l={flowData:{...i,tenant:c,flowId:n,chatId:s},executedNodes:[],context:{}};return t.setState({...t.state,engineState:l}),l}catch(o){return console.error("Failed to initialize engine state:",o),null}}async function Et(t,e,r){var n;if(e&&t.HX_CORE_URL&&t.HX_API_KEY)try{let s=await P(e,t),a=(n=s==null?void 0:s.metadata)==null?void 0:n.org;if(typeof a=="string"&&a.trim())return $(a)}catch(s){console.warn(`[secrets] could not read org for flow ${e}`,s)}return $(r)}async function W(t){var Ee,Te,Ie,xe,Ae,ke,be,_e,Ue,ve,Oe,Pe,Me;let{agent:e,env:r,ctx:n,payload:s,connection:a}=t,o=Date.now(),i=[],c=t.runId?Be():void 0,l=async()=>await C(e),u=async f=>{await ot(e,f)},d=async f=>{if(e.state.modelsCache&&e.state.modelsCache[f])return e.state.modelsCache[f];try{let{fetchOraModel:E}=await import("./oraApi-YIJGMXX7.js"),b=await E(f,r);return e.setState({...e.state,modelsCache:{...e.state.modelsCache||{},[f]:b}}),b}catch(E){throw console.error(`Error fetching model ${f}:`,E),E}},g={id:pn(),role:"user",type:"text",content:s.text,images:s.images,ts:Date.now()};await u(g);let m={onChangeState:f=>{e.setState({...e.state,engineState:ne(f)})},onServerEvent:async f=>{var E;await((E=t.onServerEvent)==null?void 0:E.call(t,f)),i.push(f.type==="info:flow"&&f.content?{...f,content:ne(f.content)}:f)},onTelemetry:f=>{var F,X,z,q,T,I,O;let E=t.user,b=typeof(E==null?void 0:E.org)=="string"&&E.org.trim()?E.org.trim():"default",L=rt({...f,userId:t.resolveUserId(),tenant:((X=(F=e.state.engineState)==null?void 0:F.flowData)==null?void 0:X.tenant)||"",org:b,flowId:((q=(z=e.state.engineState)==null?void 0:z.flowData)==null?void 0:q.flowId)||"",sessionId:((I=(T=e.state.engineState)==null?void 0:T.flowData)==null?void 0:I.chatId)||""},r);return(O=n==null?void 0:n.waitUntil)==null||O.call(n,L),L},onError:f=>{var E;(E=t.onError)==null||E.call(t,f),e.setState({...e.state,error:f})},shouldStop:t.shouldStop},y=e.state.engineState?{...e.state.engineState}:null,h=!!y;if(!y&&(y=await G(e,r),!y)){let f="Failed to initialize agent";return m.onError(f),{status:"failed",error:f,path:[]}}let p=t.user??void 0,S="default",R={};if(h){let f=(Ee=y.flowData)==null?void 0:Ee.flowId,[E,b]=await Promise.all([ft(r,y),Et(r,f,p==null?void 0:p.org)]);S=b,y=E.engineState,E.refreshed&&(typeof e.invalidateToolDefsCache=="function"&&e.invalidateToolDefsCache(),e.setState({...e.state,engineState:y,modelsCache:{}}))}else S=await Et(r,(Te=y.flowData)==null?void 0:Te.flowId,p==null?void 0:p.org);let k=(Ie=y.flowData)==null?void 0:Ie.tenant;R=k?await it(r,k,S):{},(xe=t.onSecretsLoaded)==null||xe.call(t,R),y={...y,context:{...y.context||{},user:p}},e.setState({...e.state,user:p,engineState:y});let oe={env:r,ctx:n,conn:a,getMessages:l,setMessages:u,getOraModel:d,secrets:R,userAuth:t.userAuth,user:p,composioSessions:t.composioSessions,publicOrigin:t.publicOrigin,skillRefCache:t.skillRefCache,runId:t.runId,outputCollector:c,agentMemory:typeof((Ae=e.state.memory)==null?void 0:Ae.content)=="string"?e.state.memory.content:"",shouldStop:t.shouldStop,workerStack:(ke=y.flowData)!=null&&ke.flowId?[y.flowData.flowId]:[],workerCalls:{count:0},getToolDefs:typeof e.loadToolDefs=="function"?f=>e.loadToolDefs(r,{flowId:f.flowId,tenant:f.tenant,org:f.org??S}):void 0},M=await st(oe,y,m)(s),v=e.state.engineState??y;if(M.status==="completed"){let f=v,E=typeof((be=e.state.memory)==null?void 0:be.content)=="string"?e.state.memory.content:"",b=t.runId,{flowId:L,chatId:F}=f.flowData??{},X=!!(b&&(c!=null&&c.hasOutputs())),z=(async()=>{try{let w=await l();return{ok:!0,written:await mt({sessionEnv:oe,engineState:f,previousContent:E,userText:s.text||"",messages:w})}}catch(w){let x=w instanceof Error?w.message:"Memory update failed";return console.error("Memory update failed:",w),{ok:!1,message:x}}})(),q=(async()=>{if(!X||!b||!c)return{kind:"skipped"};if(!L||!F)return{kind:"missing-ids"};let w=c.snapshotData(),x=c.answerNodeIds();try{return await Ze(r,{flowId:L,sessionId:F,runId:b,createdAt:new Date(o).toISOString(),data:w,answerNodeIds:x}),{kind:"persisted",answerNodeIds:x,runId:b}}catch(Ne){return{kind:"failed",message:Ne instanceof Error?Ne.message:"Structured output persistence failed",runId:b}}})(),[T,I]=await Promise.all([z,q]),O=f,V;if(T.ok&&T.written.status!=="skipped"&&T.written.content.trim()){let w=T.written,x={promptTokens:((_e=f.tokenUsage)==null?void 0:_e.promptTokens)??0,completionTokens:((Ue=f.tokenUsage)==null?void 0:Ue.completionTokens)??0,totalTokens:((ve=f.tokenUsage)==null?void 0:ve.totalTokens)??0};w.usage&&(x.promptTokens+=w.usage.promptTokens,x.completionTokens+=w.usage.completionTokens,x.totalTokens+=w.usage.totalTokens),O={...O,tokenUsage:x},V={content:w.content,updatedTs:Date.now(),...w.error?{lastError:w.error}:{},...w.fallback?{fallback:!0}:{}}}if(I.kind==="persisted"){let w={...O.results||{}};for(let x of I.answerNodeIds)w[x]={...w[x]||{},persisted:!0,runId:I.runId};O={...O,results:w}}else I.kind==="missing-ids"?M={status:"failed",error:"Structured output persistence requires flowId and sessionId"}:I.kind==="failed"&&(M={status:"failed",error:I.message});v=O;let Ce=!!V,De=I.kind==="persisted",H=I.kind==="failed"?I.message:void 0;(Ce||De||H)&&e.setState({...e.state,...Ce||De?{engineState:ne(v)}:{},...V?{memory:V}:{},...H?{error:H}:{}}),H&&((Oe=t.onError)==null||Oe.call(t,H));try{if(!T.ok)await m.onServerEvent({type:"agent:memory",content:{error:T.message},timestamp:Date.now()});else if(T.written.status==="skipped")await m.onServerEvent({type:"agent:memory",content:{skipped:!0,reason:T.written.reason},timestamp:Date.now()});else if(!T.written.content.trim())await m.onServerEvent({type:"agent:memory",content:{updated:!1,empty:!0,error:T.written.error,fallback:T.written.fallback},timestamp:Date.now()});else{let w=T.written;await m.onTelemetry({type:"memory_update",payload:{model:w.modelId,truncated:w.truncated,usage:w.usage,fallback:w.fallback,error:w.error}}),await m.onServerEvent({type:"agent:memory",content:{updated:!0,truncated:w.truncated,fallback:w.fallback,error:w.error},timestamp:Date.now()})}}catch(w){let x=w instanceof Error?w.message:"Memory update failed";console.error("Memory update failed:",w),await m.onServerEvent({type:"agent:memory",content:{error:x},timestamp:Date.now()})}I.kind==="failed"&&await m.onServerEvent({type:"error:answer-output",content:{runId:I.runId,error:I.message},timestamp:Date.now()})}let{tenant:Re,flowId:ae,chatId:ie}=v.flowData??{},Ht=(Pe=v.flowData)==null?void 0:Pe.org;Re&&ae&&ie&&n.waitUntil(gt(r,{id:`${ae}::${ie}`,tenant:Re,org:Ht,flowId:ae,sessionId:ie,userId:t.resolveUserId(),title:(Me=s.text)==null?void 0:Me.slice(0,120),turnTs:o,events:i})),e.setState({...e.state,lastUpdated:new Date});let jt=(v.executedNodes??[]).flatMap(f=>typeof(f==null?void 0:f.id)=="string"?[f.id]:[]),Kt=typeof M.error=="string"?pe(M.error,R,t.userAuth):M.error,Se=c!=null&&c.hasOutputs()?pe(c.snapshotData(),R,t.userAuth):void 0;return{status:M.status,error:Kt,engineState:v,path:jt,...Se!==void 0?{outputs:Se}:{}}}import{nanoid as gn}from"nanoid";function yn(t){let e=t.headers.get("X-User-Payload");if(!e)return null;try{let r=JSON.parse(e),n=typeof(r==null?void 0:r.email)=="string"?j(r.email):null;return n?{...r,email:n}:null}catch{return null}}async function Tt(t,e,r,n){var s;try{let a=await e.json().catch(()=>null);if(!a||typeof a!="object"||Array.isArray(a))return new Response(JSON.stringify({error:"Body must be a JSON object"}),{status:400,headers:{"content-type":"application/json"}});let o=a.message;if(!o||typeof o!="string")return new Response(JSON.stringify({error:"Invalid message"}),{status:400,headers:{"content-type":"application/json"}});let i=Rt(a);if(!i.ok)return new Response(JSON.stringify({error:`Invalid attachments: ${i.error}`}),{status:400,headers:{"content-type":"application/json"}});let{images:c,documents:l}=i;(c||l)&&console.log("[AgentHTTP] turn attachments",JSON.stringify(St({images:c,documents:l})));let u=typeof a.userId=="string"?j(a.userId):null,d=yn(e),g=d==null?void 0:d.email;d?t.setState({...t.state,user:d,injectedUserId:g}):u&&!((s=t.state.user)!=null&&s.email)&&t.setState({...t.state,injectedUserId:u});let m=()=>g??u??t.state.injectedUserId??void 0;t.skillRefCache||(t.skillRefCache=new Map);let y=a.inputs&&typeof a.inputs=="object"?a.inputs:void 0;if(!t.state.engineState&&!await G(t,r))return new Response(JSON.stringify({error:"Failed to initialize agent"}),{status:500,headers:{"content-type":"application/json"}});let h=`run-${gn(12)}`;await t.registerManualRun(h,o,m()),await K(r,h).catch(k=>{console.warn(`[AgentHTTP] could not mark manual run ${h} as running`,k)});let p;try{p=await W({agent:t,env:r,ctx:n,payload:{text:o,...c?{images:c}:{},...l?{documents:l}:{},inputs:y},skillRefCache:t.skillRefCache,user:d??void 0,resolveUserId:m,runId:h,shouldStop:()=>t.isRunStopRequested(h)}),n.waitUntil(t.completeManualRun(h,p.status==="completed"?"succeeded":p.status==="stopped"?"skipped":"failed",p.error))}finally{await t.clearRunStopRequest(h)}if(p.status==="failed")return new Response(JSON.stringify({error:p.error||"Agent execution failed",runId:h,path:p.path??[]}),{status:500,headers:{"content-type":"application/json"}});if(p.status==="stopped")return new Response(JSON.stringify({error:p.error||"Stopped by user"}),{status:409,headers:{"content-type":"application/json"}});let R=(await C(t)).reverse().find(k=>k.role==="assistant");return new Response(JSON.stringify({answer:(R==null?void 0:R.content)||"",runId:h,path:p.path??[],...p.outputs!==void 0?{outputs:p.outputs}:{}}),{headers:{"content-type":"application/json"}})}catch(a){return new Response(JSON.stringify({error:a.message}),{status:500,headers:{"content-type":"application/json"}})}}async function It(t){try{return await B(t),t.skillRefCache&&t.skillRefCache.clear(),t.setState({...t.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 At="trigger:nonce:",wn=900*1e3,ye="run:stop:",kt=class extends xt{initialState={user:void 0,injectedUserId:null,sessionId:null,lastUpdated:null,modelsCache:{},memory:void 0};constructor(e,r){super(e,r),this.requireStateValidation()}validateStateChange(e,r){if(r!=="server")throw new Error("Client state updates are forbidden")}requireStateValidation(){if(typeof xt.prototype.validateStateChange!="function")throw new Error("AgentDO requires agents >= 0.8.7 with validateStateChange; upgrade the tenant SDK")}resolveSessionUserId(){return this.state.injectedUserId??void 0}secrets=Object.freeze({});userAuth={};composioSessions={};skillRefCache=new Map;publicOrigin;toolDefsCache=new Z;invalidateToolDefsCache(){this.toolDefsCache.clear()}async loadToolDefs(e,r){return this.toolDefsCache.load(e,{...r,org:ct(r.org)})}async inspectPersistedSession(e){return e==="state"?{state:this.state}:e==="memory"?{memory:this.state.memory??null}:{messages:await C(this)}}async requestRunStop(e){return e!=null&&e.trim()?(await this.ctx.storage.put(`${ye}${e}`,Date.now()),{accepted:!0}):{accepted:!1}}async isRunStopRequested(e){return!!await this.ctx.storage.get(`${ye}${e}`)}async clearRunStopRequest(e){await this.ctx.storage.delete(`${ye}${e}`)}async onRequest(e){this.requireStateValidation();let r=new URL(e.url);if(r.pathname.endsWith("/state"))return new Response(JSON.stringify(this.state),{headers:{"content-type":"application/json"}});if(r.pathname.endsWith("/history")){let n=await C(this);return new Response(JSON.stringify(n),{headers:{"content-type":"application/json"}})}return e.method==="POST"&&r.pathname.endsWith("/message")?Tt(this,e,this.env,this.ctx):e.method==="DELETE"&&r.pathname.endsWith("/clear")?It(this):new Response("Ready to assist.")}async onConnect(e,r){var m,y,h,p,S;this.requireStateValidation();let n=this.name||e.server||"",[s,a]=n.split("::");this.userAuth={},this.composioSessions={},this.publicOrigin=void 0,this.toolDefsCache.clear();let[o,i]=await Promise.all([P(s,this.env),N(s,this.env)]),c=(m=o.metadata)==null?void 0:m.tenant,l=null;if(r.request){try{this.publicOrigin=new URL(r.request.url).origin}catch{}let R=r.request.headers.get("X-User-Payload");if(R)try{l=JSON.parse(R)}catch(k){console.warn("Failed to parse X-User-Payload",k)}}e.setState({...e.state,authorizedUser:l}),this.setState({...this.state,user:l||null,sessionId:a,engineState:{flowData:{...i,tenant:c,flowId:s,chatId:a},executedNodes:[],context:l?{user:l}:{}}}),l||console.warn("[AgentDO] WebSocket connected without authenticated user \u2014 Composio manual auth requires login (access_token on socket URL)");let u=await C(this);_(e,A.SERVER_HISTORY,JSON.stringify({messages:u}));let g=(((y=i==null?void 0:i.state)==null?void 0:y.nodes)??(i==null?void 0:i.nodes)??[]).find(R=>R.type==="startNode");if(g){let R={allow_images:((h=g.data)==null?void 0:h.allow_images)??!1,allow_documents:((p=g.data)==null?void 0:p.allow_documents)??!1,greeting:(S=g.data)==null?void 0:S.greeting};_(e,A.SERVER_CONFIG,JSON.stringify(R))}}async onMessage(e,r){if(typeof r!="string")return;let n=r.indexOf(":");if(n===-1)return;let s=r.substring(0,n),a=r.substring(n+1);if(!s||!a)return;let i={[A.USER_MESSAGE]:c=>this.onUserMessage(e,c),[A.USER_CLEAR_HISTORY]:()=>this.onClearHistory(e),[A.USER_AUTH]:c=>this.onUserAuth(e,c),[A.USER_IDENTITY]:c=>this.onUserIdentity(e,c)}[s];i&&await i(a)}async onUserMessage(e,r){var i;let n=Fe(r),s=((i=e.state)==null?void 0:i.authorizedUser)??void 0,a=()=>(s==null?void 0:s.email)??this.resolveSessionUserId(),o=`run-${hn(12)}`;await this.registerManualRun(o,n.text,a()),await K(this.env,o).catch(c=>{console.warn(`[AgentDO] could not mark manual run ${o} as running`,c)});try{let c=await W({agent:this,env:this.env,ctx:this.ctx,payload:n,connection:e,userAuth:this.userAuth,composioSessions:this.composioSessions,publicOrigin:this.publicOrigin,skillRefCache:this.skillRefCache,user:s,resolveUserId:a,runId:o,shouldStop:()=>this.isRunStopRequested(o),onServerEvent:l=>{_(e,A.SERVER_EVENT,JSON.stringify(l))},onError:l=>{_(e,A.SERVER_ERROR,l)},onSecretsLoaded:l=>{this.secrets=l}});this.ctx.waitUntil(this.completeManualRun(o,c.status==="completed"?"succeeded":c.status==="stopped"?"skipped":"failed",c.error))}finally{await this.clearRunStopRequest(o)}}registerManualRun(e,r,n){var c;let{tenant:s,flowId:a,chatId:o}=((c=this.state.engineState)==null?void 0:c.flowData)??{};if(!s||!a||!o)return Promise.resolve();let i=lt(n||this.resolveSessionUserId(),o);return ut(this.env,{id:e,tenant:s,flowId:a,userId:i,sessionId:o,label:r==null?void 0:r.slice(0,120)})}completeManualRun(e,r,n){return ee(this.env,e,{status:r,error:n})}async enqueueTrigger(e){var s;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 r=e.runAsUserId;return r&&!((s=this.state.user)!=null&&s.email)&&this.state.injectedUserId!==r&&this.setState({...this.state,injectedUserId:r}),{queued:!0,taskId:await this.queue("processTrigger",e)}}async claimTriggerNonce(e){let r=`${At}${e}`;if(await this.ctx.storage.get(r))return!1;let n=Date.now();await this.ctx.storage.put(r,n);let a=[...(await this.ctx.storage.list({prefix:At})).entries()].filter(([,o])=>n-o>wn).map(([o])=>o);return a.length>0&&await this.ctx.storage.delete(a),!0}async processTrigger(e){if(!(await K(this.env,e.runId)).claimed){console.warn(`[AgentDO] activation ${e.activationId} skipped \u2014 run ${e.runId} already claimed`);return}try{this.state.engineState||await G(this,this.env);let n=$e(te(this.state.engineState)),s=Le(n,e.inputs||{},e.label),a=await W({agent:this,env:this.env,ctx:this.ctx,payload:{text:s,inputs:e.inputs||{}},composioSessions:this.composioSessions,skillRefCache:this.skillRefCache,resolveUserId:()=>e.runAsUserId||this.resolveSessionUserId(),runId:e.runId,shouldStop:()=>this.isRunStopRequested(e.runId),onSecretsLoaded:o=>{this.secrets=o}});await ee(this.env,e.runId,{status:a.status==="completed"?"succeeded":a.status==="stopped"?"skipped":"failed",error:a.error})}catch(n){let s=n instanceof Error?n.message:"Trigger execution failed";throw await ee(this.env,e.runId,{status:"failed",error:s}),n}finally{await this.clearRunStopRequest(e.runId)}}async onUserIdentity(e,r){let n=j(r);if(!n){_(e,A.SERVER_ERROR,"Invalid identity payload");return}this.setState({...this.state,injectedUserId:n}),_(e,A.SERVER_EVENT,JSON.stringify({type:"info:identity",content:{set:!0}}))}async onUserAuth(e,r){let n=He(r);if(!n){_(e,A.SERVER_ERROR,"Invalid auth payload");return}let s=n.value.trim();s===""?delete this.userAuth[n.name]:this.userAuth[n.name]=n.value,_(e,A.SERVER_EVENT,JSON.stringify({type:"info:auth",content:{name:n.name,set:s!==""}}))}async onClearHistory(e){await B(this),this.userAuth={},this.composioSessions={},this.skillRefCache.clear(),this.toolDefsCache.clear(),this.setState({...this.state,error:"",engineState:this.state.engineState,memory:this.state.memory,modelsCache:{},lastUpdated:new Date}),e&&_(e,A.SERVER_HISTORY,JSON.stringify({messages:[]}))}async onStart(){await at(this)}async onClose(e,r,n,s){console.log(`Session closed: ${this.state.sessionId} ${r} - ${n}`)}async onError(e){console.error("AgentDO encountered an error:",e)}};import{DurableObject as Rn}from"cloudflare:workers";var Sn=720*60*60*1e3,bt=class extends Rn{cryptoKey;async load(){let e=await this.ctx.storage.get("state");if(!e)return null;await this.touch();try{let r=await crypto.subtle.decrypt({name:"AES-GCM",iv:e.iv},await this.key(),e.data);return{state:JSON.parse(new TextDecoder().decode(r)),updatedAt:e.updatedAt}}catch{return await this.ctx.storage.delete("state"),null}}async save(e,r){let n=await this.ctx.storage.get("state");if(n&&n.updatedAt>r)return;let s=crypto.getRandomValues(new Uint8Array(12)),a=await crypto.subtle.encrypt({name:"AES-GCM",iv:s},await this.key(),new TextEncoder().encode(JSON.stringify(e)));await this.ctx.storage.put("state",{iv:s.buffer,data:a,updatedAt:r}),await this.touch()}async invalidate(){await this.ctx.storage.delete("state")}async acquire(e,r){let n=await this.ctx.storage.get("lease");return n&&n.holder!==e&&n.until>Date.now()?!1:(await this.ctx.storage.put("lease",{holder:e,until:Date.now()+r}),!0)}async release(e){let r=await this.ctx.storage.get("lease");(r==null?void 0:r.holder)===e&&await this.ctx.storage.delete("lease")}async busy(){let e=await this.ctx.storage.get("lease");return!!e&&e.until>Date.now()}async alarm(){await this.ctx.storage.deleteAll()}async touch(){await this.ctx.storage.setAlarm(Date.now()+Sn)}key(){return this.cryptoKey??=(async()=>{let e=Uint8Array.from(atob(this.env.WEB_SESSION_KEY??""),r=>r.charCodeAt(0));if(e.length!==32)throw new Error("WEB_SESSION_KEY must be 32 bytes in base64");return crypto.subtle.importKey("raw",e,"AES-GCM",!1,["encrypt","decrypt"])})(),this.cryptoKey}};function _a(t){let e=t.state;if(!e)return null;let r=["startNode","answerNode"];for(let n of r)if(!e.nodes.some(a=>a.type===n))return!1;return e.nodes.find(n=>n.type==="startNode")}import{importSPKI as En,jwtVerify as Tn}from"jose";function re(t){let e={};if(!t)return e;let r=t.split(";");for(let n of r){let s=n.indexOf("=");if(s>-1){let a=n.slice(0,s).trim(),o=n.slice(s+1).trim();a&&(e[a]=decodeURIComponent(o))}}return e}function In(t){return(typeof t.email=="string"?t.email.trim():"")||null}async function D(t,e,r){let n=re(t.headers.get("cookie")),s=new URL(t.url),a=n.access_token||s.searchParams.get("access_token"),o=await xn(e,a);if(o.ok){let i=o.payload,c=In(i);return c?{id:i.sub,email:c,name:i.name,first_name:i.given_name,last_name:i.family_name,tenant:i.tenant,org:typeof i.org=="string"?i.org:null,roles:i["ora-roles"],db_name:i.db_name||null,user_id:i.user_id||null}:null}return null}async function xn(t,e){if(!e||typeof e!="string")return{ok:!1,payload:null,protectedHeader:null};if(!t.KC_RS256_PK)throw new Error("PK is not defined");let r=`-----BEGIN PUBLIC KEY-----
6
6
  ${t.KC_RS256_PK}
7
- -----END PUBLIC KEY-----`,n=await an(r,"RS256");try{let{payload:s,protectedHeader:o}=await cn(e,n);return{ok:!0,payload:s,protectedHeader:o}}catch(s){return console.error("JWT verification failed:",s),{ok:!1,payload:null,protectedHeader:null}}}async function ga(t,e,r){let n=new URL(t.url);if(n.pathname==="/favicon.ico")return new Response(null,{status:204});if(n.pathname.startsWith("/.well-known/appspecific"))return new Response(null,{status:204})}import{getAgentByName as z}from"agents";import{getAgentByName as dn}from"agents";async function pt(t,e){let r=e.sessionId||e.runAsUserId,n=e.inputs||{},s=e.runId;if(!s){let c=await Z(t,{tenant:e.tenant,flowId:e.flowId,userId:e.runAsUserId,sessionId:r,triggerId:e.triggerId,triggerKind:e.triggerKind,invocationMode:e.invocationMode,activationId:e.activationId,deliveryId:void 0,externalDeliveryId:e.externalDeliveryId,correlationKey:e.correlationKey,inputs:n,label:e.label});if(!c)return{status:"error",error:"Failed to register run"};if(!c.created&&c.run.status!=="queued")return{status:"deduped",runId:c.run.id};s=c.run.id}let o={...e,sessionId:r,runId:s,inputs:n},i=await(await dn(t.AGENT,`${e.flowId}::${r}`)).enqueueTrigger(o);return i.duplicate?{status:"deduped",runId:s}:i.queued?{status:"queued",runId:s,activation:o,taskId:i.taskId}:{status:"error",error:"Failed to queue trigger"}}var gt="x-ora-signature",yt="x-ora-timestamp",ht="x-ora-nonce",wt="x-ora-tenant",Ra=300,ft=new TextEncoder;function mn(t){return[...new Uint8Array(t)].map(e=>e.toString(16).padStart(2,"0")).join("")}function pn(t){try{let e=new URL(t);return`${e.origin}${e.pathname.replace(/\/$/,"")}`}catch{return t.replace(/\/$/,"")}}function St(t){return["v1",t.timestamp,t.nonce,t.tenant,pn(t.destination),t.body].join(`
8
- `)}async function Rt(t,e){let r=await crypto.subtle.importKey("raw",ft.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return mn(await crypto.subtle.sign("HMAC",r,ft.encode(e)))}function fn(t,e){if(t.length!==e.length)return!1;let r=0;for(let n=0;n<t.length;n++)r|=t.charCodeAt(n)^e.charCodeAt(n);return r===0}async function Ea(t){let e=String(t.timestamp??Math.floor(Date.now()/1e3)),r=await Rt(t.secret,St({timestamp:e,nonce:t.nonce,tenant:t.tenant,destination:t.destination,body:t.body}));return{"content-type":"application/json",[wt]:t.tenant,[yt]:e,[ht]:t.nonce,[gt]:`v1=${r}`}}async function Et(t){var u,l,p,g,m;if(!((u=t.secret)!=null&&u.trim()))return{ok:!1,error:"HX_API_KEY is not configured"};let e=(l=t.headers.get(wt))==null?void 0:l.trim(),r=(p=t.headers.get(yt))==null?void 0:p.trim(),n=(g=t.headers.get(ht))==null?void 0:g.trim(),s=(m=t.headers.get(gt))==null?void 0:m.trim();if(!e||!r||!n||!s)return{ok:!1,error:"missing signature headers"};if(!s.startsWith("v1="))return{ok:!1,error:"unsupported signature version"};let o=Number(r);if(!Number.isFinite(o))return{ok:!1,error:"invalid timestamp"};let a=Math.floor((t.now??Date.now())/1e3),i=t.toleranceSeconds??300;if(Math.abs(a-o)>i)return{ok:!1,error:"stale timestamp"};let c=await Rt(t.secret.trim(),St({timestamp:r,nonce:n,tenant:e,destination:t.url,body:t.body}));return fn(s.slice(3),c)?{ok:!0,tenant:e,nonce:n,timestamp:o}:{ok:!1,error:"signature mismatch"}}var b=(t,e=200)=>new Response(JSON.stringify(t),{status:e,headers:{"content-type":"application/json"}});async function Tt(t,e,r){var u;if(new URL(t.url).pathname!=="/api/triggers/dispatch")return;if(t.method!=="POST")return b({error:"Method not allowed"},405);let s=await t.text(),o=await Et({secret:e.HX_API_KEY,body:s,url:t.url,headers:t.headers});if(!o.ok)return console.warn(`[triggers] rejected dispatch: ${o.error}`),b({error:"Invalid signature"},401);let a;try{a=JSON.parse(s)}catch{return b({error:"Invalid payload"},400)}if(!(a!=null&&a.runId)||!(a!=null&&a.flowId)||!(a!=null&&a.runAsUserId)||!(a!=null&&a.tenant)||!(a!=null&&a.activationId)||!(a!=null&&a.triggerId)||!(a!=null&&a.triggerKind)||!(a!=null&&a.invocationMode))return b({error:"activationId, triggerId, triggerKind, invocationMode, runId, flowId, runAsUserId and tenant are required"},400);if(a.tenant!==o.tenant)return b({error:"Tenant mismatch"},403);let i;try{i=await U(a.flowId,e)}catch{return b({error:"Flow not found"},404)}if(!((u=i==null?void 0:i.metadata)!=null&&u.tenant)||i.metadata.tenant!==a.tenant)return console.warn(`[triggers] flow ${a.flowId} does not belong to tenant ${a.tenant}`),b({error:"Tenant mismatch"},403);let c=await pt(e,{...a,sessionId:a.sessionId||a.runAsUserId,nonce:o.nonce});return c.status==="error"?b({error:c.error},502):c.status==="deduped"?b({deduped:!0,runId:c.runId},200):b({accepted:!0,runId:c.runId,taskId:c.taskId},202)}var oe=/^[A-Za-z0-9_-]{1,64}$/;async function ae(t,e,r,n,s,o=!1){let a=(g,m)=>({response:new Response(g,{status:m})});if(!/^[A-Za-z0-9_-]+$/.test(n))return a("Invalid flowId",400);if((!o||s)&&(!s||!oe.test(s)))return a("Invalid sessionId",400);let i;try{i=await U(n,e)}catch{return a("Flow not found",404)}let c=i==null?void 0:i.metadata;if(!c||!["active","activo"].includes(c.status))return a("Flow not found",404);if(!e.TENANT||c.tenant!==e.TENANT)return a("Forbidden",403);let u=await P(t,e,r),l=u&&typeof u=="object"?u:void 0;if(l&&l.tenant!==e.TENANT)return a("Forbidden",403);if(c.visibility==="public")return{user:l};if(!l){if(!o)return a("Unauthorized",401);let g=new URL(t.url),m=new URL("/login",g.origin);return m.searchParams.set("nextURL",`${g.pathname}${g.search}`),{response:Response.redirect(m.toString(),302)}}if((c.org||"default")!==(l.org||"default"))return a("Forbidden",403);let p=q(t.headers.get("cookie")).access_token||new URL(t.url).searchParams.get("access_token");if(!p)return a("Unauthorized",401);try{let g=await fetch(`${e.HX_CORE_URL}/flows/${encodeURIComponent(n)}`,{headers:{Authorization:p},cache:"no-store"});if(!g.ok||(await g.json()).id!==n)return a("Forbidden",403)}catch{return a("Forbidden",403)}return{user:l}}var gn=/^[A-Za-z0-9_-]+$/,yn=new Set(["state","messages","memory"]);async function hn(t,e){let r=new URL(t.url);if(!r.pathname.startsWith("/api/internal/sessions/"))return;let n=r.pathname.split("/");if(n[6]!=="runs"||n[8]!=="stop"||n.length!==9)return;if(t.method!=="POST")return new Response("Method not allowed",{status:405});if(!e.HX_API_KEY||t.headers.get("Authorization")!==e.HX_API_KEY)return new Response("Unauthorized",{status:401});let s=decodeURIComponent(n[4]||""),o=decodeURIComponent(n[5]||""),a=decodeURIComponent(n[7]||"");if(!s||!o||!a)return new Response("Not found",{status:404});try{let i=await z(e.AGENT,`${s}::${o}`);return Response.json(await i.requestRunStop(a))}catch(i){return console.error("[agents] failed to request run stop",i),Response.json({error:"Failed to stop run"},{status:502})}}async function wn(t,e){let r=new URL(t.url);if(!r.pathname.startsWith("/api/internal/sessions/"))return;if(t.method!=="GET")return new Response("Method not allowed",{status:405});let n=t.headers.get("Authorization")||"";if(!e.HX_API_KEY||n!==e.HX_API_KEY)return new Response("Unauthorized",{status:401});let s=r.pathname.split("/"),o=decodeURIComponent(s[4]||""),a=decodeURIComponent(s[5]||""),i=s[6];if(!o||!a||!i||!yn.has(i))return new Response("Not found",{status:404});try{let u=await(await z(e.AGENT,`${o}::${a}`)).inspectPersistedSession(i);return Response.json(u)}catch(c){return console.error("[agents] failed to inspect persisted session",c),Response.json({error:"Failed to inspect persisted session"},{status:502})}}async function Na(t,e,r){var i,c;let n=new URL(t.url),s=await Tt(t,e,r);if(s instanceof Response)return s;let o=await hn(t,e);if(o instanceof Response)return o;let a=await wn(t,e);if(a instanceof Response)return a;if(n.pathname.startsWith("/a/")){let u=n.pathname.split("/"),l=u[2],p=u[3];try{if(!l)return Response.redirect(new URL("/",n.origin).toString(),302);let g=await ae(t,e,r,l,p,!0);if(g.response)return g.response;if(!p){let m=crypto.randomUUID(),y=new URL(`/a/${l}/${m}`,n.origin);return Response.redirect(y.toString(),302)}}catch(g){return console.error("Error accessing flow KV:",g),new Response("Flow error",{status:500})}}if(n.pathname.startsWith("/api/agent/flow/")){let u=n.pathname.split("/"),l=u[4],p=u[5];return It(t,e,r,l,p)}if(n.pathname.startsWith("/api/ora/connect")){let u=n.pathname.split("/"),l=u[4],p=u[5];if(!l||!p)return new Response("Missing flowId or sessionId",{status:400});let g=t.headers.get("Authorization")||n.searchParams.get("authorization");if(!g)return new Response("Missing Authorization header",{status:401});try{let m=`${e.HX_CORE_URL}/p/v1/validation/key/agent/${l}`,f=await(await fetch(m,{method:"GET",headers:{Authorization:g}})).json();if(((i=f.payload)==null?void 0:i.flowId)!==l)return console.error("FlowId mismatch:",(c=f.payload)==null?void 0:c.flowId,"!==",l),new Response("Validation error",{status:403});let h=`${l}::${p}`,R=await P(t,e,r);if(!R){let L=new URL(t.url).searchParams.has("access_token");console.warn(`[agents] Unauthenticated agent socket upgrade (access_token query=${L}) \u2014 Composio connections from tool editor will not apply`)}let S=new Headers(t.headers);S.delete("X-User-Payload"),R&&S.set("X-User-Payload",JSON.stringify(R));let T=new Request(t,{headers:S});return(await z(e.AGENT,h)).fetch(T)}catch(m){return console.error("Error in /api/ora/connect:",m),new Response("Internal error",{status:500})}}}async function It(t,e,r,n,s){let o=`${n}::${s}`;try{let a=await ae(t,e,r,n,s);if(a.response)return a.response;let i=a.user,c=new Headers(t.headers);c.delete("X-User-Payload"),i&&c.set("X-User-Payload",JSON.stringify(i));let u=new Request(t,{headers:c});return(await z(e.AGENT,o)).fetch(u)}catch(a){return console.error("Error accessing agent:",a),new Response("Agent error",{status:500})}}var Da=async(t,e,r,n)=>{if(!(n!=null&&n.flowId)||!gn.test(n.flowId)||!(n!=null&&n.sessionId)||!oe.test(n.sessionId))return new Response("Not found",{status:404});let s=new URL(`/api/agent/flow/${n.flowId}/${n.sessionId}`,t.url),o=new Headers;for(let[c,u]of t.headers.entries())c.toLowerCase().startsWith("x-")||o.append(c,u);let a={method:t.method,headers:o};t.body&&t.method!=="GET"&&t.method!=="HEAD"&&(a.body=t.body,a.duplex="half");let i=new Request(s.toString(),a);return It(i,e,r,n.flowId,n.sessionId)};async function Fa(t,e,r){let n=new URL(t.url),s=t.method;if(!n.pathname.startsWith("/api/instances"))return;let o=await P(t,e,r);if(!o)return new Response("Unauthorized",{status:401});let a=e.HX_CORE_URL,i=e.HX_API_KEY;if(!a||!i)return console.error("Missing configuration: HX_CORE_URL or HX_API_KEY"),new Response("Internal Server Error",{status:500});let u=n.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 p=a.endsWith("/")?a.slice(0,-1):a,g=new URL(`${p}${l}`);n.searchParams.forEach((f,h)=>{g.searchParams.set(h,f)}),s==="GET"&&!u&&g.searchParams.set("filter_user_id",o.email);let m=new Headers;m.set("Authorization",i),m.set("Content-Type","application/json"),m.set("X-User-Payload",JSON.stringify(o));let y={method:s,headers:m};if(["POST","PATCH","PUT"].includes(s))try{y.body=await t.text()}catch(f){console.error("Error reading request body:",f)}try{let f=await fetch(g.toString(),y),h=await f.text();return new Response(h,{status:f.status,headers:{"Content-Type":"application/json"}})}catch(f){return console.error("Error proxying to flow instance backend:",f),new Response("Internal Server Error",{status:500})}}async function Ka(t,e,r){let n=new URL(t.url);if(t.method==="POST"&&n.pathname==="/auth/login")try{let s=await t.formData(),o=s.get("username"),a=s.get("password"),i=s.get("nextURL")||"/";if(!o||!a)return new Response("Missing username or password",{status:400});let c=new URLSearchParams;c.append("username",o),c.append("password",a),c.append("grant_type","password"),c.append("client_id",e.KC_CLIENT_ID),c.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:c});if(!u.ok)return new Response("Unauthorized",{status:401});let l=await u.json(),p=new Response(null,{status:302,headers:{Location:i}}),m=n.protocol==="https:"?"; Secure":"",y=(f,h,R)=>{p.headers.append("Set-Cookie",`${f}=${h}; Path=/; HttpOnly${m}; SameSite=Lax; Max-Age=${R}`)};return l.access_token&&y("access_token",l.access_token,l.expires_in),l.refresh_token&&y("refresh_token",l.refresh_token,l.refresh_expires_in||3600*24*30),l.id_token&&y("id_token",l.id_token,l.expires_in),p}catch(s){return console.error("Auth error:",s),new Response("Internal Server Error",{status:500})}if(n.pathname==="/auth/logout"){let s=new Response(null,{status:302,headers:{Location:"/login"}}),o=a=>{s.headers.append("Set-Cookie",`${a}=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0`)};return o("access_token"),o("refresh_token"),o("id_token"),s}if(n.pathname.startsWith("/s/")){let s=await P(t,e,r);if(!s){let o=new URL("/login",n.origin);return o.searchParams.set("nextURL",`${n.pathname}${n.search}`),Response.redirect(o.toString(),302)}return{user:s}}}import{WorkerEntrypoint as Sn}from"cloudflare:workers";import{getAgentByName as Rn}from"agents";var En=/^[A-Za-z0-9_-]+$/,Tn=/^art-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,xt=class extends Sn{async ask(e,r){var n,s,o,a;try{if(!e||typeof e!="string"||!En.test(e))throw console.error("[ArtifactWorkerGateway] invalid flowId:",e),new Error("Artifact worker request failed");if(!r||typeof r.message!="string")throw console.error("[ArtifactWorkerGateway] invalid input: message is required"),new Error("Artifact worker request failed");let i;if(r.sessionId!==void 0){if(typeof r.sessionId!="string"||!Tn.test(r.sessionId))throw console.error("[ArtifactWorkerGateway] invalid sessionId:",r.sessionId),new Error("Artifact worker request failed");i=r.sessionId}else i=`art-${crypto.randomUUID()}`;let c=(s=(n=this.ctx)==null?void 0:n.props)==null?void 0:s.slug,u=(a=(o=this.ctx)==null?void 0:o.props)==null?void 0:a.artifactUuid;if(!c||!u)throw console.error("[ArtifactWorkerGateway] missing slug or artifactUuid in gateway context props"),new Error("Artifact worker request failed");let l=this.env.ARTIFACT;if(!l)throw console.error("[ArtifactWorkerGateway] ARTIFACT binding not configured"),new Error("Artifact worker request failed");let p=l.idFromName(c),m=await l.get(p).allowsWorker({flowId:e,mode:"server",artifactUuid:u});if(!(m!=null&&m.ok))throw console.error(`[ArtifactWorkerGateway] grant check failed for flow ${e} on artifact ${c}`),new Error("Artifact worker request failed");let y=await Rn(this.env.AGENT,`${e}::${i}`),f={message:r.message};r.inputs&&typeof r.inputs=="object"&&(f.inputs=r.inputs);let h=new Request("http://localhost/message",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(f)}),R=await y.fetch(h);if(!R.ok)throw console.error(`[ArtifactWorkerGateway] agent returned status ${R.status}`),new Error("Artifact worker request failed");let S=await R.json();return{text:typeof(S==null?void 0:S.answer)=="string"?S.answer:"",sessionId:i}}catch(i){throw(i==null?void 0:i.message)==="Artifact worker request failed"?i:(console.error("[ArtifactWorkerGateway] unexpected error in ask:",i),new Error("Artifact worker request failed"))}}};export{Ut as ANONYMOUS_RUN_USER_PREFIX,dt as AgentDO,xt as ArtifactWorkerGateway,Nn as CLASSIFIER_DEFAULTS,Dn as CLASSIFIER_RESERVED_HANDLES,Cn as CLEF_MODELS,Gn as CRAWL_DEFAULTS,Xn as CRAWL_LIMITS,vr as DEFAULT_MEMORY_LENGTH,Mr as DEFAULT_MEMORY_MODEL,ss as EVENT_PREVIEW_BYTES,rs as EXTRACT_MAX_CHARS,Pn as FLOW_INPUT_NAME_RE,Bs as FlowExecutionStoppedError,vs as GENERATION_PARAM_KEYS,Cs as GENERATION_PRESETS,jr as ISSUE_SEVERITY,Mn as MAX_USER_IDENTITY_LENGTH,Or as MEMORY_LENGTH_MD_LINES,Pr as MEMORY_LENGTH_TOKENS,Zs as MODEL_REGISTRY_SNAPSHOT,cr as NODE_CATALOG,F as NodeType,Yn as OUT_VAR_NAME_RE,Ms as PRESET_PARAM_KEYS,Xs as REASONING_EFFORT_LEVELS,eo as TENANT_ONLY_NODES,es as TOOL_REGISTRY_SNAPSHOT,ht as TRIGGER_NONCE_HEADER,gt as TRIGGER_SIGNATURE_HEADER,Ra as TRIGGER_SIGNATURE_TOLERANCE_SECONDS,wt as TRIGGER_TENANT_HEADER,yt as TRIGGER_TIMESTAMP_HEADER,Rr as VariableResolutionError,er as WEB_ACTIONS_DEFAULTS,tr as WEB_ACTIONS_LIMITS,sr as WEB_ACTION_EXTRACT_AS,rr as WEB_ACTION_LOCATOR_KINDS,nr as WEB_ACTION_OPS,or as WEB_ACTION_SELECT_MATCH,on as WEB_SESSION_IDLE_TTL_MS,Ln as WORKER_GRAPH_DEFS,Fn as WORKER_GRAPH_SCHEMA,jn as WORKER_OP_SCHEMA,Br as WORKER_TEMPLATES,mt as WebSessionDO,$s as applyPresetToOverrides,Jr as applyWorkerOps,Da as artifactAgentProxy,is as assertHttpUrl,cs as assertPublicHttpUrl,ds as budgetTimeout,As as buildClefRequest,qn as buildCrawlRequestBody,Ke as buildReasoningProviderOptions,pr as buildScope,Ea as buildSignedTriggerHeaders,ke as buildTriggerMessageText,kn as buildUrl,zr as canonicalGraph,un as canonicalUserEmail,Oe as capMemoryContent,C as claimRun,Os as classifierErrorResult,$n as classifierHandle,Qr as classifierIdFromLabel,Gr as classifyIssues,Ss as classifySiteBlock,H as clearAllMessages,bs as clefTruncationWarning,ps as clipExtract,Lr as collectExternalRefs,Dr as collectNodeRefs,W as completeRun,In as convertTempMessure,zn as crawlRequestKey,Z as createRun,ur as defaultNodeData,Ns as deriveParamSupport,Yr as detectInlineCredentials,ws as detectSiteBlock,xs as detectWebSession,Vr as diffGraphs,pt as dispatchTrigger,Xr as edgeId,Un as embedText,Zr as enabledComposioSlugs,qe as ensureAgentTables,_t as ensureMessagesTable,ks as estimateClefTokens,Nr as estimateTokens,Ir as extractOutVarValues,br as extractTemplateReferences,De as extractUserKeypoints,fr as findScopedSourceNode,ir as firstTargetStep,It as forwardToAgentFlow,O as getAllMessages,dr as getAncestorNodeIds,Bn as getDefaultOutVars,Qn as getEffectiveOutVars,Ae as getFlowInputDefs,Qs as getModelEntry,gr as getRefTail,mr as getUpstreamOutVars,Na as handleAgentsRoutes,Ka as handleAuthRoutes,ga as handleCommonRoutes,Fa as handleIntancesRoutes,wn as handlePersistedSessionInspection,hn as handleSessionRunControl,Tt as handleTriggerRoutes,_n as hashText,D as initializeEngineState,no as inspectWebPage,us as installWebNavigationGuard,yr as isBinaryOutVar,hr as isJsonContentType,to as isNodeTypeAllowedForTenant,Pe as isStartMemoryEnabled,Wr as issueFingerprint,ns as jsonSchemaToZod,xe as logc,Ne as looksLikeTranscript,Ce as memoryGenerationMaxTokens,j as memoryMdLineLimit,Ue as memoryTokenLimit,$e as mergeKeypointMemory,I as messageTypes,Fr as newExternalRefs,qr as nextNodeId,ms as normalizeActionError,pn as normalizeDestination,Fs as normalizeEffectiveParams,vn as normalizeFlowInputs,Js as normalizeModelEntry,qs as normalizeReasoning,Hs as openAiReasoningParamSupport,js as openAiStandardParamSupport,Us as parseClefResponse,q as parseCookies,Cr as parseMemoryLength,wr as parsePayloadText,kr as parseTemplateExpression,_e as parseUserAuth,be as parseUserMessage,Kn as parseWorkerGraph,Wn as parseWorkerOps,Ls as pickNodeOverrides,Sr as readFetchPayload,zs as reasoningEffortLevels,Vs as reasoningExposable,Ve as recordRun,os as redact,ls as redactedHost,Ys as registerProvider,ts as resolveAnswerMappings,We as resolveModelById,Ar as resolveOutVarRef,Tr as resolveOutVarValue,Ds as resolvePreset,He as resolveReasoningEffort,xr as resolveReference,ze as resolveRunUserId,gs as resolveTarget,Ur as resolveTemplate,$r as rewriteNodeDataRefs,_r as rewriteTemplateNodeRefs,$ as runAgentTurn,_s as runClef,Jn as runCrawl,Es as runWebActionSteps,An as safeParseJSON,Y as sanitizeMemoryDocument,M as sanitizeUserIdentity,Hn as schemaErrors,Ps as selectClefHistory,tt as sendEvent,k as serverSend,Xe as setMessage,Vn as shapeCrawlOutput,Rt as signTriggerMaterial,Ge as startEngine,Me as startMemoryLength,ve as startMemoryModel,Gs as stripUnsupportedFromNodeData,Is as targetPresent,xn as tempTool,fn as timingSafeEqualHex,fs as toLocator,je as toStreamTextSettings,hs as trackWebActivity,St as triggerSignatureMaterial,as as truncateForEvent,bn as twitter,Kr as validateAuthoring,lr as validateClassifierData,ua as validateFlowStart,Hr as validateFlowStructure,Zn as validateOutVars,ar as validateWebActionsData,On as vectorize,Rs as vendorFromCookieNames,ln as verifyToken,Et as verifyTriggerRequest,P as verifyUser,Er as walkPath,Ts as webSessionKey,ys as withinWebDeadline,Ws as workersAiParamSupport,Ks as xaiParamSupport};
7
+ -----END PUBLIC KEY-----`,n=await En(r,"RS256");try{let{payload:s,protectedHeader:a}=await Tn(e,n);return{ok:!0,payload:s,protectedHeader:a}}catch(s){return console.error("JWT verification failed:",s),{ok:!1,payload:null,protectedHeader:null}}}async function Ca(t,e,r){let n=new URL(t.url);if(n.pathname==="/favicon.ico")return new Response(null,{status:204});if(n.pathname.startsWith("/.well-known/appspecific"))return new Response(null,{status:204})}import{getAgentByName as se}from"agents";import{getAgentByName as An}from"agents";async function _t(t,e){let r=e.sessionId||e.runAsUserId,n=e.inputs||{},s=e.runId;if(!s){let c=await me(t,{tenant:e.tenant,flowId:e.flowId,userId:e.runAsUserId,sessionId:r,triggerId:e.triggerId,triggerKind:e.triggerKind,invocationMode:e.invocationMode,activationId:e.activationId,deliveryId:void 0,externalDeliveryId:e.externalDeliveryId,correlationKey:e.correlationKey,inputs:n,label:e.label});if(!c)return{status:"error",error:"Failed to register run"};if(!c.created&&c.run.status!=="queued")return{status:"deduped",runId:c.run.id};s=c.run.id}let a={...e,sessionId:r,runId:s,inputs:n},i=await(await An(t.AGENT,`${e.flowId}::${r}`)).enqueueTrigger(a);return i.duplicate?{status:"deduped",runId:s}:i.queued?{status:"queued",runId:s,activation:a,taskId:i.taskId}:{status:"error",error:"Failed to queue trigger"}}var vt="x-ora-signature",Ot="x-ora-timestamp",Pt="x-ora-nonce",Mt="x-ora-tenant",Fa=300,Ut=new TextEncoder;function kn(t){return[...new Uint8Array(t)].map(e=>e.toString(16).padStart(2,"0")).join("")}function bn(t){try{let e=new URL(t);return`${e.origin}${e.pathname.replace(/\/$/,"")}`}catch{return t.replace(/\/$/,"")}}function Ct(t){return["v1",t.timestamp,t.nonce,t.tenant,bn(t.destination),t.body].join(`
8
+ `)}async function Dt(t,e){let r=await crypto.subtle.importKey("raw",Ut.encode(t),{name:"HMAC",hash:"SHA-256"},!1,["sign"]);return kn(await crypto.subtle.sign("HMAC",r,Ut.encode(e)))}function _n(t,e){if(t.length!==e.length)return!1;let r=0;for(let n=0;n<t.length;n++)r|=t.charCodeAt(n)^e.charCodeAt(n);return r===0}async function Ha(t){let e=String(t.timestamp??Math.floor(Date.now()/1e3)),r=await Dt(t.secret,Ct({timestamp:e,nonce:t.nonce,tenant:t.tenant,destination:t.destination,body:t.body}));return{"content-type":"application/json",[Mt]:t.tenant,[Ot]:e,[Pt]:t.nonce,[vt]:`v1=${r}`}}async function Nt(t){var l,u,d,g,m;if(!((l=t.secret)!=null&&l.trim()))return{ok:!1,error:"HX_API_KEY is not configured"};let e=(u=t.headers.get(Mt))==null?void 0:u.trim(),r=(d=t.headers.get(Ot))==null?void 0:d.trim(),n=(g=t.headers.get(Pt))==null?void 0:g.trim(),s=(m=t.headers.get(vt))==null?void 0:m.trim();if(!e||!r||!n||!s)return{ok:!1,error:"missing signature headers"};if(!s.startsWith("v1="))return{ok:!1,error:"unsupported signature version"};let a=Number(r);if(!Number.isFinite(a))return{ok:!1,error:"invalid timestamp"};let o=Math.floor((t.now??Date.now())/1e3),i=t.toleranceSeconds??300;if(Math.abs(o-a)>i)return{ok:!1,error:"stale timestamp"};let c=await Dt(t.secret.trim(),Ct({timestamp:r,nonce:n,tenant:e,destination:t.url,body:t.body}));return _n(s.slice(3),c)?{ok:!0,tenant:e,nonce:n,timestamp:a}:{ok:!1,error:"signature mismatch"}}var U=(t,e=200)=>new Response(JSON.stringify(t),{status:e,headers:{"content-type":"application/json"}});async function $t(t,e,r){var l;if(new URL(t.url).pathname!=="/api/triggers/dispatch")return;if(t.method!=="POST")return U({error:"Method not allowed"},405);let s=await t.text(),a=await Nt({secret:e.HX_API_KEY,body:s,url:t.url,headers:t.headers});if(!a.ok)return console.warn(`[triggers] rejected dispatch: ${a.error}`),U({error:"Invalid signature"},401);let o;try{o=JSON.parse(s)}catch{return U({error:"Invalid payload"},400)}if(!(o!=null&&o.runId)||!(o!=null&&o.flowId)||!(o!=null&&o.runAsUserId)||!(o!=null&&o.tenant)||!(o!=null&&o.activationId)||!(o!=null&&o.triggerId)||!(o!=null&&o.triggerKind)||!(o!=null&&o.invocationMode))return U({error:"activationId, triggerId, triggerKind, invocationMode, runId, flowId, runAsUserId and tenant are required"},400);if(o.tenant!==a.tenant)return U({error:"Tenant mismatch"},403);let i;try{i=await P(o.flowId,e)}catch{return U({error:"Flow not found"},404)}if(!((l=i==null?void 0:i.metadata)!=null&&l.tenant)||i.metadata.tenant!==o.tenant)return console.warn(`[triggers] flow ${o.flowId} does not belong to tenant ${o.tenant}`),U({error:"Tenant mismatch"},403);let c=await _t(e,{...o,sessionId:o.sessionId||o.runAsUserId,nonce:a.nonce});return c.status==="error"?U({error:c.error},502):c.status==="deduped"?U({deduped:!0,runId:c.runId},200):U({accepted:!0,runId:c.runId,taskId:c.taskId},202)}var he=/^[A-Za-z0-9_-]{1,64}$/;async function we(t,e,r,n,s,a=!1){let o=(g,m)=>({response:new Response(g,{status:m})});if(!/^[A-Za-z0-9_-]+$/.test(n))return o("Invalid flowId",400);if((!a||s)&&(!s||!he.test(s)))return o("Invalid sessionId",400);let i;try{i=await P(n,e)}catch{return o("Flow not found",404)}let c=i==null?void 0:i.metadata;if(!c||!["active","activo"].includes(c.status))return o("Flow not found",404);if(!e.TENANT||c.tenant!==e.TENANT)return o("Forbidden",403);let l=await D(t,e,r),u=l&&typeof l=="object"?l:void 0;if(u&&u.tenant!==e.TENANT)return o("Forbidden",403);if(c.visibility==="public")return{user:u};if(!u){if(!a)return o("Unauthorized",401);let g=new URL(t.url),m=new URL("/login",g.origin);return m.searchParams.set("nextURL",`${g.pathname}${g.search}`),{response:Response.redirect(m.toString(),302)}}if((c.org||"default")!==(u.org||"default"))return o("Forbidden",403);let d=re(t.headers.get("cookie")).access_token||new URL(t.url).searchParams.get("access_token");if(!d)return o("Unauthorized",401);try{let g=await fetch(`${e.HX_CORE_URL}/flows/${encodeURIComponent(n)}`,{headers:{Authorization:d},cache:"no-store"});if(!g.ok||(await g.json()).id!==n)return o("Forbidden",403)}catch{return o("Forbidden",403)}return{user:u}}var Un=/^[A-Za-z0-9_-]+$/,vn=new Set(["state","messages","memory"]);async function On(t,e){let r=new URL(t.url);if(!r.pathname.startsWith("/api/internal/sessions/"))return;let n=r.pathname.split("/");if(n[6]!=="runs"||n[8]!=="stop"||n.length!==9)return;if(t.method!=="POST")return new Response("Method not allowed",{status:405});if(!e.HX_API_KEY||t.headers.get("Authorization")!==e.HX_API_KEY)return new Response("Unauthorized",{status:401});let s=decodeURIComponent(n[4]||""),a=decodeURIComponent(n[5]||""),o=decodeURIComponent(n[7]||"");if(!s||!a||!o)return new Response("Not found",{status:404});try{let i=await se(e.AGENT,`${s}::${a}`);return Response.json(await i.requestRunStop(o))}catch(i){return console.error("[agents] failed to request run stop",i),Response.json({error:"Failed to stop run"},{status:502})}}async function Pn(t,e){let r=new URL(t.url);if(!r.pathname.startsWith("/api/internal/sessions/"))return;if(t.method!=="GET")return new Response("Method not allowed",{status:405});let n=t.headers.get("Authorization")||"";if(!e.HX_API_KEY||n!==e.HX_API_KEY)return new Response("Unauthorized",{status:401});let s=r.pathname.split("/"),a=decodeURIComponent(s[4]||""),o=decodeURIComponent(s[5]||""),i=s[6];if(!a||!o||!i||!vn.has(i))return new Response("Not found",{status:404});try{let l=await(await se(e.AGENT,`${a}::${o}`)).inspectPersistedSession(i);return Response.json(l)}catch(c){return console.error("[agents] failed to inspect persisted session",c),Response.json({error:"Failed to inspect persisted session"},{status:502})}}async function ei(t,e,r){var i,c;let n=new URL(t.url),s=await $t(t,e,r);if(s instanceof Response)return s;let a=await On(t,e);if(a instanceof Response)return a;let o=await Pn(t,e);if(o instanceof Response)return o;if(n.pathname.startsWith("/a/")){let l=n.pathname.split("/"),u=l[2],d=l[3];try{if(!u)return Response.redirect(new URL("/",n.origin).toString(),302);let g=await we(t,e,r,u,d,!0);if(g.response)return g.response;if(!d){let m=crypto.randomUUID(),y=new URL(`/a/${u}/${m}`,n.origin);return Response.redirect(y.toString(),302)}}catch(g){return console.error("Error accessing flow KV:",g),new Response("Flow error",{status:500})}}if(n.pathname.startsWith("/api/agent/flow/")){let l=n.pathname.split("/"),u=l[4],d=l[5];return Lt(t,e,r,u,d)}if(n.pathname.startsWith("/api/ora/connect")){let l=n.pathname.split("/"),u=l[4],d=l[5];if(!u||!d)return new Response("Missing flowId or sessionId",{status:400});let g=t.headers.get("Authorization")||n.searchParams.get("authorization");if(!g)return new Response("Missing Authorization header",{status:401});try{let m=`${e.HX_CORE_URL}/p/v1/validation/key/agent/${u}`,h=await(await fetch(m,{method:"GET",headers:{Authorization:g}})).json();if(((i=h.payload)==null?void 0:i.flowId)!==u)return console.error("FlowId mismatch:",(c=h.payload)==null?void 0:c.flowId,"!==",u),new Response("Validation error",{status:403});let p=`${u}::${d}`,S=await D(t,e,r);if(!S){let v=new URL(t.url).searchParams.has("access_token");console.warn(`[agents] Unauthenticated agent socket upgrade (access_token query=${v}) \u2014 Composio connections from tool editor will not apply`)}let R=new Headers(t.headers);R.delete("X-User-Payload"),S&&R.set("X-User-Payload",JSON.stringify(S));let k=new Request(t,{headers:R});return(await se(e.AGENT,p)).fetch(k)}catch(m){return console.error("Error in /api/ora/connect:",m),new Response("Internal error",{status:500})}}}async function Lt(t,e,r,n,s){let a=`${n}::${s}`;try{let o=await we(t,e,r,n,s);if(o.response)return o.response;let i=o.user,c=new Headers(t.headers);c.delete("X-User-Payload"),i&&c.set("X-User-Payload",JSON.stringify(i));let l=new Request(t,{headers:c});return(await se(e.AGENT,a)).fetch(l)}catch(o){return console.error("Error accessing agent:",o),new Response("Agent error",{status:500})}}var ti=async(t,e,r,n)=>{if(!(n!=null&&n.flowId)||!Un.test(n.flowId)||!(n!=null&&n.sessionId)||!he.test(n.sessionId))return new Response("Not found",{status:404});let s=new URL(`/api/agent/flow/${n.flowId}/${n.sessionId}`,t.url),a=new Headers;for(let[c,l]of t.headers.entries())c.toLowerCase().startsWith("x-")||a.append(c,l);let o={method:t.method,headers:a};t.body&&t.method!=="GET"&&t.method!=="HEAD"&&(o.body=t.body,o.duplex="half");let i=new Request(s.toString(),o);return Lt(i,e,r,n.flowId,n.sessionId)};async function si(t,e,r){let n=new URL(t.url),s=t.method;if(!n.pathname.startsWith("/api/instances"))return;let a=await D(t,e,r);if(!a)return new Response("Unauthorized",{status:401});let o=e.HX_CORE_URL,i=e.HX_API_KEY;if(!o||!i)return console.error("Missing configuration: HX_CORE_URL or HX_API_KEY"),new Response("Internal Server Error",{status:500});let l=n.pathname.slice("/api/instances".length);l.startsWith("/")&&(l=l.slice(1)),l.endsWith("/")&&(l=l.slice(0,-1));let u="/ora/instances";l&&(u+=`/${l}`);let d=o.endsWith("/")?o.slice(0,-1):o,g=new URL(`${d}${u}`);n.searchParams.forEach((h,p)=>{g.searchParams.set(p,h)}),s==="GET"&&!l&&g.searchParams.set("filter_user_id",a.email);let m=new Headers;m.set("Authorization",i),m.set("Content-Type","application/json"),m.set("X-User-Payload",JSON.stringify(a));let y={method:s,headers:m};if(["POST","PATCH","PUT"].includes(s))try{y.body=await t.text()}catch(h){console.error("Error reading request body:",h)}try{let h=await fetch(g.toString(),y),p=await h.text();return new Response(p,{status:h.status,headers:{"Content-Type":"application/json"}})}catch(h){return console.error("Error proxying to flow instance backend:",h),new Response("Internal Server Error",{status:500})}}async function ii(t,e,r){let n=new URL(t.url);if(t.method==="POST"&&n.pathname==="/auth/login")try{let s=await t.formData(),a=s.get("username"),o=s.get("password"),i=s.get("nextURL")||"/";if(!a||!o)return new Response("Missing username or password",{status:400});let c=new URLSearchParams;c.append("username",a),c.append("password",o),c.append("grant_type","password"),c.append("client_id",e.KC_CLIENT_ID),c.append("client_secret",e.KC_CLIENT_SECRET);let l=await fetch(`${e.KC_BASE_URL}/protocol/openid-connect/token`,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Cookie:"hxsecure=1"},body:c});if(!l.ok)return new Response("Unauthorized",{status:401});let u=await l.json(),d=new Response(null,{status:302,headers:{Location:i}}),m=n.protocol==="https:"?"; Secure":"",y=(h,p,S)=>{d.headers.append("Set-Cookie",`${h}=${p}; Path=/; HttpOnly${m}; SameSite=Lax; Max-Age=${S}`)};return u.access_token&&y("access_token",u.access_token,u.expires_in),u.refresh_token&&y("refresh_token",u.refresh_token,u.refresh_expires_in||3600*24*30),u.id_token&&y("id_token",u.id_token,u.expires_in),d}catch(s){return console.error("Auth error:",s),new Response("Internal Server Error",{status:500})}if(n.pathname==="/auth/logout"){let s=new Response(null,{status:302,headers:{Location:"/login"}}),a=o=>{s.headers.append("Set-Cookie",`${o}=; Path=/; HttpOnly; Secure; SameSite=Strict; Max-Age=0`)};return a("access_token"),a("refresh_token"),a("id_token"),s}if(n.pathname.startsWith("/s/")){let s=await D(t,e,r);if(!s){let a=new URL("/login",n.origin);return a.searchParams.set("nextURL",`${n.pathname}${n.search}`),Response.redirect(a.toString(),302)}return{user:s}}}import{WorkerEntrypoint as Mn}from"cloudflare:workers";import{getAgentByName as Cn}from"agents";var Dn=/^[A-Za-z0-9_-]+$/,Nn=/^art-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Ft=class extends Mn{async ask(e,r){var n,s,a,o;try{if(!e||typeof e!="string"||!Dn.test(e))throw console.error("[ArtifactWorkerGateway] invalid flowId:",e),new Error("Artifact worker request failed");if(!r||typeof r.message!="string")throw console.error("[ArtifactWorkerGateway] invalid input: message is required"),new Error("Artifact worker request failed");let i;if(r.sessionId!==void 0){if(typeof r.sessionId!="string"||!Nn.test(r.sessionId))throw console.error("[ArtifactWorkerGateway] invalid sessionId:",r.sessionId),new Error("Artifact worker request failed");i=r.sessionId}else i=`art-${crypto.randomUUID()}`;let c=(s=(n=this.ctx)==null?void 0:n.props)==null?void 0:s.slug,l=(o=(a=this.ctx)==null?void 0:a.props)==null?void 0:o.artifactUuid;if(!c||!l)throw console.error("[ArtifactWorkerGateway] missing slug or artifactUuid in gateway context props"),new Error("Artifact worker request failed");let u=this.env.ARTIFACT;if(!u)throw console.error("[ArtifactWorkerGateway] ARTIFACT binding not configured"),new Error("Artifact worker request failed");let d=u.idFromName(c),m=await u.get(d).allowsWorker({flowId:e,mode:"server",artifactUuid:l});if(!(m!=null&&m.ok))throw console.error(`[ArtifactWorkerGateway] grant check failed for flow ${e} on artifact ${c}`),new Error("Artifact worker request failed");let y=await Cn(this.env.AGENT,`${e}::${i}`),h={message:r.message};r.inputs&&typeof r.inputs=="object"&&(h.inputs=r.inputs);let p=new Request("http://localhost/message",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(h)}),S=await y.fetch(p);if(!S.ok)throw console.error(`[ArtifactWorkerGateway] agent returned status ${S.status}`),new Error("Artifact worker request failed");let R=await S.json();return{text:typeof(R==null?void 0:R.answer)=="string"?R.answer:"",sessionId:i}}catch(i){throw(i==null?void 0:i.message)==="Artifact worker request failed"?i:(console.error("[ArtifactWorkerGateway] unexpected error in ask:",i),new Error("Artifact worker request failed"))}}};export{Jt as ANONYMOUS_RUN_USER_PREFIX,kt as AgentDO,Ft as ArtifactWorkerGateway,Bn as CLASSIFIER_DEFAULTS,Zn as CLASSIFIER_RESERVED_HANDLES,Jn as CLEF_MODELS,ar as CRAWL_DEFAULTS,ir as CRAWL_LIMITS,Vr as DEFAULT_MEMORY_LENGTH,Yr as DEFAULT_MEMORY_MODEL,Ss as EVENT_PREVIEW_BYTES,Rs as EXTRACT_MAX_CHARS,qn as FLOW_INPUT_NAME_RE,yo as FlowExecutionStoppedError,Vs as GENERATION_PARAM_KEYS,Js as GENERATION_PRESETS,ns as ISSUE_SEVERITY,po as LLM_TELEMETRY_CHUNK_FILTER,Yn as MAX_USER_IDENTITY_LENGTH,zr as MEMORY_LENGTH_MD_LINES,qr as MEMORY_LENGTH_TOKENS,ho as MODEL_REGISTRY_SNAPSHOT,xr as NODE_CATALOG,Y as NodeType,mr as OUT_VAR_NAME_RE,Ys as PRESET_PARAM_KEYS,io as REASONING_EFFORT_LEVELS,Ro as TENANT_ONLY_NODES,ys as TOOL_REGISTRY_SNAPSHOT,Pt as TRIGGER_NONCE_HEADER,vt as TRIGGER_SIGNATURE_HEADER,Fa as TRIGGER_SIGNATURE_TOLERANCE_SECONDS,Mt as TRIGGER_TENANT_HEADER,Ot as TRIGGER_TIMESTAMP_HEADER,Nr as VariableResolutionError,yr as WEB_ACTIONS_DEFAULTS,hr as WEB_ACTIONS_LIMITS,Sr as WEB_ACTION_EXTRACT_AS,Rr as WEB_ACTION_LOCATOR_KINDS,wr as WEB_ACTION_OPS,Er as WEB_ACTION_SELECT_MATCH,Sn as WEB_SESSION_IDLE_TTL_MS,er as WORKER_GRAPH_DEFS,tr as WORKER_GRAPH_SCHEMA,nr as WORKER_OP_SCHEMA,fs as WORKER_TEMPLATES,bt as WebSessionDO,Qs as applyPresetToOverrides,ds as applyWorkerOps,ti as artifactAgentProxy,Is as assertHttpUrl,xs as assertPublicHttpUrl,bs as budgetTimeout,js as buildClefRequest,cr as buildCrawlRequestBody,tt as buildReasoningProviderOptions,Ur as buildScope,Ha as buildSignedTriggerHeaders,Le as buildTriggerMessageText,Kn as buildUrl,ls as canonicalGraph,In as canonicalUserEmail,Ge as capMemoryContent,K as claimRun,zs as classifierErrorResult,Qn as classifierHandle,gs as classifierIdFromLabel,as as classifyIssues,Ds as classifySiteBlock,B as clearAllMessages,Gs as clefTruncationWarning,Us as clipExtract,es as collectExternalRefs,Zr as collectNodeRefs,ee as completeRun,Fn as convertTempMessure,lr as crawlRequestKey,me as createRun,Ar as defaultNodeData,Bs as deriveParamSupport,ms as detectInlineCredentials,Cs as detectSiteBlock,Hs as detectWebSession,us as diffGraphs,_t as dispatchTrigger,is as edgeId,Xn as embedText,ps as enabledComposioSlugs,at as ensureAgentTables,Gt as ensureMessagesTable,Ks as estimateClefTokens,Br as estimateTokens,Fr as extractOutVarValues,Gr as extractTemplateReferences,Ye as extractUserKeypoints,vr as findScopedSourceNode,Ir as firstTargetStep,Lt as forwardToAgentFlow,C as getAllMessages,br as getAncestorNodeIds,fr as getDefaultOutVars,gr as getEffectiveOutVars,$e as getFlowInputDefs,wo as getModelEntry,Or as getRefTail,_r as getUpstreamOutVars,ei as handleAgentsRoutes,ii as handleAuthRoutes,Ca as handleCommonRoutes,si as handleIntancesRoutes,Pn as handlePersistedSessionInspection,On as handleSessionRunControl,$t as handleTriggerRoutes,Wn as hashText,G as initializeEngineState,Eo as inspectWebPage,As as installWebNavigationGuard,Pr as isBinaryOutVar,go as isFilteredLlmTelemetryChunk,Mr as isJsonContentType,So as isNodeTypeAllowedForTenant,We as isStartMemoryEnabled,os as issueFingerprint,ws as jsonSchemaToZod,Ln as logc,Ve as looksLikeTranscript,qe as memoryGenerationMaxTokens,J as memoryMdLineLimit,Ke as memoryTokenLimit,Je as mergeKeypointMemory,A as messageTypes,ts as newExternalRefs,cs as nextNodeId,_s as normalizeActionError,bn as normalizeDestination,to as normalizeEffectiveParams,Vn as normalizeFlowInputs,mo as normalizeModelEntry,co as normalizeReasoning,ro as openAiReasoningParamSupport,no as openAiStandardParamSupport,Xs as parseClefResponse,re as parseCookies,Jr as parseMemoryLength,Cr as parsePayloadText,Kr as parseTemplateExpression,He as parseUserAuth,Fe as parseUserMessage,sr as parseWorkerGraph,or as parseWorkerOps,eo as pickNodeOverrides,Dr as readFetchPayload,lo as reasoningEffortLevels,uo as reasoningExposable,ut as recordRun,Es as redact,ks as redactedHost,fo as registerProvider,hs as resolveAnswerMappings,nt as resolveModelById,jr as resolveOutVarRef,Lr as resolveOutVarValue,Zs as resolvePreset,et as resolveReasoningEffort,Hr as resolveReference,lt as resolveRunUserId,Os as resolveTarget,Xr as resolveTemplate,Qr as rewriteNodeDataRefs,Wr as rewriteTemplateNodeRefs,W as runAgentTurn,Ws as runClef,dr as runCrawl,$s as runWebActionSteps,jn as safeParseJSON,ce as sanitizeMemoryDocument,j as sanitizeUserIdentity,rr as schemaErrors,qs as selectClefHistory,rt as sendEvent,_ as serverSend,ot as setMessage,ur as shapeCrawlOutput,Dt as signTriggerMaterial,st as startEngine,ze as startMemoryLength,Xe as startMemoryModel,ao as stripUnsupportedFromNodeData,Fs as targetPresent,Hn as tempTool,_n as timingSafeEqualHex,vs as toLocator,Qe as toStreamTextSettings,Ms as trackWebActivity,Ct as triggerSignatureMaterial,Ts as truncateForEvent,Gn as twitter,ss as validateAuthoring,kr as validateClassifierData,_a as validateFlowStart,rs as validateFlowStructure,pr as validateOutVars,Tr as validateWebActionsData,zn as vectorize,Ns as vendorFromCookieNames,xn as verifyToken,Nt as verifyTriggerRequest,D as verifyUser,$r as walkPath,Ls as webSessionKey,Ps as withinWebDeadline,oo as workersAiParamSupport,so as xaiParamSupport};
@@ -5,6 +5,7 @@ import type { TriggerActivation } from '../../common/types/trigger-types';
5
5
  import type { FlowEngineState } from '../logic/FlowEngine';
6
6
  import type { ComposioSessionMeta } from '../utils/composio';
7
7
  import type { RunOutputCollector } from '../utils/oraOutputs';
8
+ import { type ToolDefsScope } from '../utils/toolDefsCache';
8
9
  import { type SecretsMap } from '../utils/secrets';
9
10
  export interface SessionEnv {
10
11
  env?: Env;
@@ -19,6 +20,8 @@ export interface SessionEnv {
19
20
  userAuth?: SecretsMap;
20
21
  /** Custom tool definitions for the tenant, lazy-loaded on first custom-tool reference and cached for the session. Keyed by row.id. */
21
22
  toolDefs?: Record<string, any>;
23
+ /** Server-only loader backed by the DO tool-defs cache (scope per flow/tenant/org). */
24
+ getToolDefs?: (scope: ToolDefsScope) => Promise<Record<string, any>>;
22
25
  /** In-memory cache for skill references fetched during this session. Keyed by toolId:refName. */
23
26
  skillRefCache?: Map<string, string>;
24
27
  /** Composio session metadata keyed by composio tool row id — reused within the agent chat session. */
@@ -90,6 +93,9 @@ export declare class AgentDO extends Agent<Env, State> {
90
93
  private skillRefCache;
91
94
  /** Public origin from the active socket upgrade (used for OAuth callback URLs). */
92
95
  private publicOrigin?;
96
+ private readonly toolDefsCache;
97
+ invalidateToolDefsCache(): void;
98
+ loadToolDefs(env: Env, scope: ToolDefsScope): Promise<Record<string, any>>;
93
99
  /**
94
100
  * Internal audit surface used by the tenant runtime. Only functional persisted data is
95
101
  * returned: Agents SDK state plus the DO SQLite messages table. Runtime secrets,
@@ -9,3 +9,6 @@ export interface TelemetryEvent {
9
9
  timestamp?: string;
10
10
  }
11
11
  export declare const sendEvent: (event: TelemetryEvent, env: Env) => Promise<void>;
12
+ /** Chunk types omitted from telemetry, WS fan-out and turnEvents (high-frequency AI SDK boundaries). */
13
+ export declare const LLM_TELEMETRY_CHUNK_FILTER: Set<string>;
14
+ export declare function isFilteredLlmTelemetryChunk(chunkType: string): boolean;
@@ -0,0 +1,22 @@
1
+ import type { ToolRow } from '../tools/httpTool';
2
+ export type ToolDefsScope = {
3
+ flowId: string;
4
+ tenant?: string;
5
+ org?: string;
6
+ };
7
+ /** In-memory tool-defs cache for a single DO isolate (never synced state). */
8
+ export declare class ToolDefsCache {
9
+ private readonly ttlMs;
10
+ private entries;
11
+ private inFlight;
12
+ private generation;
13
+ /** Active backend — private comparison only; never part of map keys. */
14
+ private backendUrl;
15
+ private backendKeyRef;
16
+ constructor(ttlMs?: number);
17
+ clear(): void;
18
+ /** Binds or rotates backend synchronously (no await) before any fetch. */
19
+ private ensureBackend;
20
+ load(env: Env, scope: ToolDefsScope): Promise<Record<string, ToolRow>>;
21
+ }
22
+ export declare function normalizeToolDefsOrg(org: string | null | undefined): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hugex/ai",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "Ora AI Agent Framework",
5
5
  "author": "a@hugex.co",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -1,12 +0,0 @@
1
- import{a as fe}from"./chunk-3D77ZXDC.js";import{a as Z,b as E,c as me,d as yt}from"./chunk-62G7NURX.js";import{a as Ue}from"./chunk-AKJFVR6J.js";import{a as de,b as le,d as ue,g as pe,i as At}from"./chunk-EHOK5FW2.js";import{a as Le,b as Ve}from"./chunk-3K4IMMLP.js";import{Aa as B,B as te,Ba as Ne,C as Tt,Fa as Ot,Ga as Re,Ha as Te,Ia as Ae,Ja as xe,Ka as ke,L as ie,La as _t,Ma as Oe,Na as _e,O as ne,Oa as Ie,P as re,Pa as $e,R as se,Ta as be,Wa as Fe,Xa as De,Ya as Ce,a as v,aa as ae,b as Zt,db as Pe,fb as Me,gb as je,hb as We,i as Nt,ma as ce,pa as at,qa as ge,r as Qt,s as Et,sa as ye,ta as we,u as St,ua as he,v as Rt,va as xt,wa as kt}from"./chunk-G73VSMK7.js";import{B as oe,c as mt,d as Yt,i as vt,k as ot,r as ee,s as q,v as it,w as z}from"./chunk-LUS5CJY2.js";import{a as Kt,b as zt,d as Gt}from"./chunk-YLDLDEUP.js";import{a as gt}from"./chunk-YHXUBVN2.js";import{a as ft}from"./chunk-3TXHFKDN.js";async function He(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 h=await n.json();return{name:t.name,text:h.text||""}}catch(n){return console.error(`extractDocuments: ${t.name} threw`,n),{name:t.name,text:""}}})):[]}function to(o,e,i){var t,n,h,f;return ot(((n=(t=i.flowData)==null?void 0:t.state)==null?void 0:n.nodes)??[],((f=(h=i.flowData)==null?void 0:h.state)==null?void 0:f.edges)??[],e.id).some(s=>s.ref===o&&(s.type==="image"||s.type==="file"))}function eo(o,e){var f,s,d,a,p,w,l;let i=Array.isArray((f=o.data)==null?void 0:f.outputMapping)?o.data.outputMapping:[];if(i.length===0)return null;let t=((d=(s=e.flowData)==null?void 0:s.state)==null?void 0:d.nodes)||[],n={},h=new Set;for(let u of i){let r=(a=u.key)==null?void 0:a.trim(),g=(p=u.from)==null?void 0:p.trim();if(!r||!g)throw new Error(`Answer node ${o.id} has an incomplete variable mapping`);if(h.has(r))throw new Error(`Answer node ${o.id} has duplicate output key "${r}"`);if(to(g,o,e))throw new Error(`Answer node ${o.id} cannot persist binary source "${g}"`);let m=z(g,{context:e.context||{},results:e.results||{},nodes:t,edges:((l=(w=e.flowData)==null?void 0:w.state)==null?void 0:l.edges)??[],currentNodeId:o.id}),c=m.value;if(m.missing||c===void 0||c===null){if(u.default===void 0)throw new q(m.missing==="ancestor_not_executed"?"ANCESTOR_NOT_EXECUTED":"PATH_NOT_FOUND",`Answer node ${o.id} could not resolve output "${g}"`);c=u.default}n[r]=c,h.add(r)}try{JSON.stringify(n)}catch{throw new Error(`Answer node ${o.id} produced a value that is not JSON serializable`)}return n}async function It(o,e,i,t,n,h,f){var d,a,p;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s;try{s=eo(e,i)}catch(w){throw t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(w)}}),w}s&&o.outputCollector&&o.outputCollector.add(e.id,s);try{let w=await((d=o.getMessages)==null?void 0:d.call(o))??[],l=((a=w[w.length-1])==null?void 0:a.type)==="text"?w[w.length-1].content:"NO-TEXT";f==null||f({type:"answer_node",payload:{userMessage:(p=i==null?void 0:i.context)==null?void 0:p.user_input,answer:l}})}catch(w){console.error("answerNodeRunner: failed to emit answer telemetry:",w),t==null||t({type:"debug",content:"Warning: failed to emit answer telemetry"})}n==null||n(e.id,{type:"answerNode",message:"Answer response for: "+e.data.response,saved:!0,persistenceRequested:!!s&&!!o.outputCollector,persisted:!1,...o.runId?{runId:o.runId}:{}}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}function X(o,e,i,t,n){var s,d,a,p,w;let h=(n==null?void 0:n.callerTag)??"llmNodeRunner",f=(n==null?void 0:n.serializeNonStrings)??!1;return oe(o,e,{context:i.context??{},results:i.results??{},nodes:((d=(s=i.flowData)==null?void 0:s.state)==null?void 0:d.nodes)??[],edges:((p=(a=i.flowData)==null?void 0:a.state)==null?void 0:p.edges)??[],currentNodeId:e.id,secrets:(w=n==null?void 0:n.sessionEnv)==null?void 0:w.secrets},{callerTag:h,serializeNonStrings:f,onError:l=>{t==null||t({type:`error:${h}`,content:l})}})}var $t="[redacted]",Je=8*1024;function oo(o){if(o==null)return{value:o,truncated:!1};let e=typeof o=="string"?o:JSON.stringify(o),i=new TextEncoder().encode(e);if(i.byteLength<=Je){if(typeof o=="string")return{value:o,truncated:!1};try{return{value:JSON.parse(e),truncated:!1}}catch{return{value:e,truncated:!1}}}let t=i.slice(0,Je);return{value:new TextDecoder("utf-8",{fatal:!1}).decode(t),truncated:!0}}function io(o,e){return it(o,e)}var bt=(o,e,i,t,n)=>X(o,e,i,n,{callerTag:"apiNodeRunner",serializeNonStrings:!0,sessionEnv:t});async function Ft(o,e,i,t,n,h,f){var a,p,w,l,u,r;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s=null,d=Date.now();try{console.log("[apiNodeRunner] context keys:",Object.keys(i.context||{})),console.log("[apiNodeRunner] results keys:",Object.keys(i.results||{}));let g=((a=e.data)==null?void 0:a.url)||"",m=bt(g,e,i,o,t);if(console.log("[apiNodeRunner] resolved url:",Z(g)?E(m):m),!m){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,s);return}let c=(((p=e.data)==null?void 0:p.method)||"GET").toUpperCase();console.log("[apiNodeRunner] method:",c);let y=((w=e.data)==null?void 0:w.headers)||{},R={},N={};for(let j in y)if(Object.prototype.hasOwnProperty.call(y,j)){let M=String(y[j]??"");N[j]=Z(M),R[j]=bt(M,e,i,o,t)}let A,C=!1;if(c!=="GET"&&c!=="HEAD"&&((l=e.data)==null?void 0:l.body)!==void 0){let j=typeof e.data.body=="string"?e.data.body:JSON.stringify(e.data.body);C=Z(j),A=bt(j,e,i,o,t),!R["Content-Type"]&&!R["content-type"]&&(R["Content-Type"]="application/json")}let I={};for(let j in R)I[j]=N[j]?$t:R[j];console.log("[apiNodeRunner] headers:",JSON.stringify(I)),console.log("[apiNodeRunner] body:",C?$t:A),t==null||t({type:"info:apiNodeRunner:request",content:{nodeId:e.id,method:c,url:Z(g)?E(m):m,headers:I,body:C?$t:A}});let D=Number((u=e.data)==null?void 0:u.timeoutMs),U=new AbortController,x=Number.isFinite(D)&&D>0?setTimeout(()=>U.abort(),D):null,T;try{console.log("[apiNodeRunner] fetching..."),T=await fetch(m,{method:c,headers:R,body:A,signal:U.signal}),console.log("[apiNodeRunner] fetch returned status:",T.status)}finally{x&&clearTimeout(x)}let b=T.headers.get("content-type")||"";console.log("[apiNodeRunner] content-type:",b);let P=await ee(T);console.log("[apiNodeRunner] payload preview:",typeof P=="string"?P.slice(0,200):JSON.stringify(P).slice(0,200)),s={ok:T.ok,status:T.status,data:P};let $=Date.now()-d;f==null||f({type:"api_call",payload:{nodeId:e.id,url:m,method:c,status:T.status,latencyMs:$}});let{value:_,truncated:V}=oo(P);t==null||t({type:"info:apiNodeRunner:response",content:{nodeId:e.id,ok:T.ok,status:T.status,latencyMs:$,data:_,truncated:V,outVars:io(e,s)}}),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:",(r=JSON.stringify(s))==null?void 0:r.slice(0,300)),n==null||n(e.id,s)}}var no="[redacted]",Xe=8*1024;function Dt(o,e){if(typeof o=="string")return Z(o)?typeof e=="string"&&/^https?:\/\//i.test(e)?E(e):no:e;if(o&&typeof o=="object"&&!Array.isArray(o)){let i={},t=e&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let[n,h]of Object.entries(o))i[n]=Dt(h,t[n]);return i}if(Array.isArray(o)){let i=Array.isArray(e)?e:[];return o.map((t,n)=>Dt(t,i[n]))}return e}function ro(o){if(o==null)return{value:o,truncated:!1};let e=typeof o=="string"?o:JSON.stringify(o),i=new TextEncoder().encode(e);if(i.byteLength<=Xe){if(typeof o=="string")return{value:o,truncated:!1};try{return{value:JSON.parse(e),truncated:!1}}catch{return{value:e,truncated:!1}}}let t=i.slice(0,Xe);return{value:new TextDecoder("utf-8",{fatal:!1}).decode(t),truncated:!0}}function so(o,e){return it(o,e)}var ao=(o,e,i,t,n)=>X(o,e,i,n,{callerTag:"toolNodeRunner",serializeNonStrings:!0,sessionEnv:t});function wt(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)?o:{}}function co(o){let e=wt(o);if(Array.isArray(e.enum)&&e.enum.length>0)return e.enum.every(n=>typeof n=="string"||typeof n=="number")?"enum":"unsupported";switch(Array.isArray(e.type)?e.type.find(t=>typeof t=="string"&&t!=="null"):e.type){case"string":return"string";case"number":return"number";case"integer":return"integer";case"boolean":return"boolean";case"object":return"object";case"array":return"array";default:return"unsupported"}}function lo(o,e){var f,s;let i={},t={},n=((f=o.data)==null?void 0:f.inputSchema)??e;if(n&&typeof n=="object"&&!Array.isArray(n)){t=wt(wt(n).properties);for(let[d,a]of Object.entries(t))i[d]=co(a);return{types:i,properties:t}}let h=(s=o.data)==null?void 0:s.argTypes;if(h&&typeof h=="object"&&!Array.isArray(h))for(let[d,a]of Object.entries(h))typeof a=="string"&&(i[d]=a);return{types:i,properties:t}}function uo(o,e,i){if(o.trim()!==""){if(o==="null"&&e&&e!=="string"&&e!=="enum")return null;switch(e){case"string":return o;case"enum":{let t=wt(i).enum;if(Array.isArray(t)){let n=t.find(h=>String(h)===o);if(n!==void 0)return n}return o}case"number":{let t=Number(o);return Number.isFinite(t)?t:o}case"integer":{let t=Number.parseInt(o,10);return Number.isFinite(t)?t:o}case"boolean":return o==="true"?!0:o==="false"?!1:o;case"object":case"array":case"unsupported":try{return JSON.parse(o)}catch{return o}default:return o}}}function po(o){return o===void 0||typeof o=="string"&&o.trim()===""}function Ct(o,e,i,t,n,h,f){if(typeof o=="string"){let s=o.includes("{{")?ao(o,e,i,t,n):o;return uo(s,h,f)}if(o&&typeof o=="object"&&!Array.isArray(o)){let s={};for(let[d,a]of Object.entries(o))s[d]=Ct(a,e,i,t,n);return s}return Array.isArray(o)?o.map(s=>Ct(s,e,i,t,n)):o}function fo(o,e,i,t,n,h){let f={};for(let[s,d]of Object.entries(o)){let a=Ct(d,e,i,t,n,h.types[s],h.properties[s]);po(a)||(f[s]=a)}return f}async function mo(o){if(o.toolDefs)return o.toolDefs;if(!o.env)return o.toolDefs={},o.toolDefs;let e=await gt(o.env),i={};for(let t of e)t!=null&&t.id&&(i[t.id]=t);return o.toolDefs=i,i}function go(o){var e,i,t;return((e=o.data)==null?void 0:e.source)==="catalog"?"catalog":((i=o.data)==null?void 0:i.source)==="composio"?"composio":(((t=o.data)==null?void 0:t.source)==="http","http")}function yo(o,e,i){let t=At(o.execution);if(t.authMode==="manual"){let n=de(t,o.id);if(!n)throw new Error(`Composio tool '${o.name}' is missing connection scope`);return le(n)}return pe(e,i,{allowChatIdFallback:!0})}async function Pt(o,e,i,t,n,h,f){var p,w,l,u,r,g;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s={ok:!1,data:null,error:null},d=Date.now(),a=go(e);try{if(a==="catalog")throw new Error("This Tool node still uses a curated catalog connector. Reconfigure it to a tenant HTTP or connector tool.");let m=(p=e.data)!=null&&p.args&&typeof e.data.args=="object"&&!Array.isArray(e.data.args)?e.data.args:{},c=typeof((w=e.data)==null?void 0:w.toolId)=="string"?e.data.toolId.trim():"";if(!c)throw new Error("Tool nodes require toolId");let R=(await mo(o))[c];if(!R)throw new Error(`Tool ${c} not found`);let N="";if(a==="composio"){if(R.kind!=="composio")throw new Error(`Tool ${c} is not a connector tool`);if(N=typeof((l=e.data)==null?void 0:l.toolSlug)=="string"?e.data.toolSlug.trim():"",!N)throw new Error("Connector tool nodes require toolSlug");let x=At(R.execution);if(!ue(x.tools).includes(N))throw new Error(`Tool slug ${N} is not enabled on connector ${c}`)}else if(R.kind!=="http")throw new Error(`Tool ${c} is not an HTTP tool`);let A=lo(e,a==="http"?R.inputSchema:void 0),C=fo(m,e,i,o,t,A);if(t==null||t({type:"info:toolNodeRunner:request",content:{nodeId:e.id,source:a,toolSlug:(u=e.data)==null?void 0:u.toolSlug,toolId:(r=e.data)==null?void 0:r.toolId,args:Dt(m,C)}}),a==="composio"){let x=typeof((g=e.data)==null?void 0:g.toolVersion)=="string"?e.data.toolVersion.trim():"",T=await fe(o,{toolSlug:N,connectionScope:yo(R,o,i),toolVersion:x||null,arguments:C});s={ok:T.ok,data:T.ok?T.data:null,error:T.ok?null:T.error??"Tool execution failed"}}else{let x=yt(R,o,i,t);if(!x.execute)throw new Error(`Tool ${c} is missing an execute handler`);let T=await x.execute(C,{}),b=T&&typeof T=="object"&&"error"in T&&T.error?String(T.error):null;s={ok:!b,data:T,error:b}}let I=Date.now()-d;f==null||f({type:"tool_call",payload:{nodeId:e.id,url:a==="composio"?`composio:${N}`:`tool:${c}`,method:"EXECUTE",status:s.ok?200:502,latencyMs:I}});let{value:D,truncated:U}=ro(s.data);t==null||t({type:"info:toolNodeRunner:response",content:{nodeId:e.id,ok:s.ok,latencyMs:I,data:D,truncated:U,error:s.error,outVars:so(e,s)}}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:s.ok?"success":"error",error:s.error??void 0}})}catch(m){let c=m instanceof Error?m.message:String(m);s={ok:!1,data:null,error:c},t==null||t({type:"error:toolNodeRunner",content:`Tool node execution failed: ${c}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:c}})}finally{n==null||n(e.id,s)}}var wo=1440*60*1e3,Ke=8*1024;function ze(o){if(o==null)return{value:o,truncated:!1};let e=new TextEncoder().encode(JSON.stringify(o));return e.byteLength<=Ke?{value:o,truncated:!1}:{value:new TextDecoder().decode(e.slice(0,Ke)),truncated:!0}}async function Mt(o,e,i,t,n,h,f){var w,l;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s={ok:!1,data:null,error:null},d=Date.now(),a="crawl:unknown",p=u=>{let r=JSON.stringify(u);for(let g of Object.values(o.secrets??{}))g&&(r=r.split(JSON.stringify(g).slice(1,-1)).join("[redacted]"),r=r.split(encodeURIComponent(g)).join("[redacted]"));return JSON.parse(r)};try{let u=o.env;if(!(u!=null&&u.CF_ACCOUNT_ID)||!(u!=null&&u.CF_BROWSER_RUN_TOKEN))throw new Error("Crawl no configurado: faltan CF_ACCOUNT_ID / CF_BROWSER_RUN_TOKEN");let r=X(e.data.url,e,i,t,{callerTag:"crawlNodeRunner",serializeNonStrings:!0,sessionEnv:o}),g=Qt(e.data,r),m=Z(e.data.url);a=`crawl:${p(new URL(r).host)}`;let c=`crawl:pending:${await Et(g)}`,y=(w=o.ctx)==null?void 0:w.storage,R=await(y==null?void 0:y.get(c)),N=R&&typeof R.jobId=="string"&&R.jobId&&Number.isFinite(R.createdAt)&&Date.now()-R.createdAt>=0&&Date.now()-R.createdAt<wo;R&&!N&&await(y==null?void 0:y.delete(c)),t==null||t({type:"info:crawlNodeRunner:request",content:{nodeId:e.id,url:m?p(E(r)):r,resumeJobId:N?R.jobId:void 0}}),{result:s}=await St({accountId:u.CF_ACCOUNT_ID,apiToken:u.CF_BROWSER_RUN_TOKEN},e.data,{url:r,...N?{resumeJobId:R.jobId}:{}}),s.error==="timeout"&&((l=s.data)!=null&&l.jobId)?await(y==null?void 0:y.put(c,{jobId:s.data.jobId,createdAt:N?R.createdAt:Date.now()})):s.data&&s.data.status!=="running"&&await(y==null?void 0:y.delete(c))}catch(u){s={ok:!1,data:null,error:u instanceof Error?u.message:String(u)},t==null||t({type:"error:crawlNodeRunner",content:p(`Crawl node execution failed: ${s.error}`)})}finally{let u=Date.now()-d;f==null||f({type:"tool_call",payload:{nodeId:e.id,url:a,method:"EXECUTE",status:s.ok?200:502,latencyMs:u}});let r=ze(p(s.data));t==null||t({type:"info:crawlNodeRunner:response",content:{nodeId:e.id,ok:s.ok,latencyMs:u,data:r.value,truncated:r.truncated,error:p(s.error),outVars:ze(p(it(e,s))).value}}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:s.ok?"success":"error",error:p(s.error)??void 0}}),n==null||n(e.id,s)}}var ho=6e4,No=250,Ro=2e3;function To(o){let e=o;if(!(e!=null&&e.WEB_SESSION)||!e.WEB_SESSION_KEY)return null;let i=e.WEB_SESSION;return t=>i.get(i.idFromName(t))}async function jt(o,e,i,t,n,h,f){var U,x,T,b,P;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s=Date.now(),d=s+Rt.timeoutMs,a=((U=o.env)==null?void 0:U.WEB_ACTIONS_ALLOW_PRIVATE)==="true",p=Object.values(o.secrets??{}).filter($=>typeof $=="string"&&$!==""),w=[],l=()=>[...p,...w],u=$=>{t==null||t({type:$.type,content:at($.content,l())})},r={callerTag:"webActionsNodeRunner",serializeNonStrings:!0,sessionEnv:o},g={ok:!1,data:null,error:null},m="unknown",c,y,R,N,A,C=async()=>{let $=R;if(R=void 0,A=void 0,$)try{await B($.close(),Date.now()+3e3)}catch{}},I={},D=[];try{let $=e.data??{},_=te($);if(_.length>0)throw new Error(`WebActions inv\xE1lido: ${_[0].message}`);let V=(x=o.env)==null?void 0:x.BROWSER;if(!V)throw new Error("WebActions no configurado: falta el binding BROWSER");if(typeof $.url!="string")throw new Error("WebActions inv\xE1lido: url is required.");let j=X($.url,e,i,u,r);c=j,ye(j,{allowPrivate:a});let M=Array.isArray($.actions)?$.actions:[];d=s+($.timeoutMs??Rt.timeoutMs),u({type:"info:webActionsNodeRunner:request",content:{nodeId:e.id,url:Z($.url)?E(j):j,steps:M.length}});let G=L=>X(L,e,i,u,r),k={};for(let L of $.headers??[]){let H=G(L.value);H&&w.push(H),k[L.name]=H}let F=L=>{let H=L.find(Y=>Y.blocked);return H!=null&&H.blocked?(u({type:"info:webActionsNodeRunner:blocked",content:{nodeId:e.id,vendor:H.blocked.vendor,kind:H.blocked.kind}}),!0):!1},O=(T=$.session)!=null&&T.enabled?$.session:void 0,W=null,J,nt;if(O){let L=To(o.env);if(!L)u({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"unavailable",reason:"falta WEB_SESSION o WEB_SESSION_KEY"}});else{let H=M.slice(0,O.loginSteps).map(K=>"value"in K&&typeof K.value=="string"?G(K.value):"checked"in K&&typeof K.checked=="string"?G(K.checked):"");w.push(...H.filter((K,S)=>K!==""&&["fill","select"].includes(M[S].op)));let Y=String(((b=i.flowData)==null?void 0:b.tenant)??((P=o.env)==null?void 0:P.TENANT)??"");W=L(await Re(Y,j,H,O.generation??0)),J=M[Tt(M,0,O.loginSteps)].target,nt=M[Tt(M,O.loginSteps)].target}}let{launch:ct}=await import("@cloudflare/playwright"),rt=!1,dt=ct(V).then(async L=>{if(rt){try{await B(L.close(),Date.now()+3e3)}catch{}throw new Error("timeout")}return L});try{y=await B(dt,d)}catch(L){throw rt=!0,L}let lt=y,ut=(L,H)=>({deadline:d,sensitive:w,allowPrivate:a,activity:L,indexOffset:H,resolve:G,onAmbiguous:(Y,K)=>{u({type:"info:webActionsNodeRunner:ambiguous",content:{nodeId:e.id,stepId:K.id,count:Y}})}}),qt=async L=>{if(W)try{await B(W.save(await L.storageState({indexedDB:!0}),Date.now()),d),u({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"saved"}})}catch(H){u({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"save_failed",error:kt(H).message}})}};for(let L=0;;L++){D.length=0;for(let pt of Object.keys(I))delete I[pt];let H=W?await B(W.load(),d).catch(()=>null):null;R=await B(lt.newContext(H?{storageState:H.state}:{}),d),A=await B(R.newPage(),d),Object.keys(k).length>0&&await B(R.setExtraHTTPHeaders(k),d),await we(A,{allowPrivate:a},d),N==null||N.dispose(),N=Ne(A);try{await A.goto(j,{waitUntil:"domcontentloaded",timeout:xt(d)})}catch(pt){throw kt(pt)}await N.settle(d,Ro);let Y=0,K=!1;if(W&&O&&J&&nt)if(await Ae(A,J,nt,d)==="session")K=!0,Y=O.loginSteps,D.push(...M.slice(0,Y).map(st=>({id:st.id,op:st.op,ok:!0,ms:0,skipped:"session"}))),u({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"reused"}});else{let st=crypto.randomUUID(),Xt=await B(W.acquire(st,ho),d);if(!Xt&&L===0){for(u({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"waiting"}});await B(W.busy(),d);)await new Promise(et=>setTimeout(et,Math.min(No,xt(d))));await C();continue}try{u({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"login"}});let et=await B(Ot(A,M.slice(0,O.loginSteps),ut(N,0)),d);if(D.push(...et.steps),et.error)throw F(et.steps),new Error(et.error);await qt(R)}finally{Xt&&await B(W.release(st),Date.now()+3e3).catch(()=>{})}Y=O.loginSteps}let S=await B(Ot(A,M.slice(Y),ut(N,Y)),d);if(D.push(...S.steps),Object.assign(I,S.extracted),S.error){if(F(S.steps))throw new Error(S.error);if(W&&K&&L===0&&J&&await Te(A,J,d)){u({type:"info:webActionsNodeRunner:session",content:{nodeId:e.id,mode:"invalidated"}}),await B(W.invalidate(),d).catch(()=>{}),await C();continue}throw new Error(S.error)}await qt(R),g={ok:!0,error:null,data:{url:A.url(),title:await B(A.title(),d),extracted:I,steps:D}};break}}catch($){let _=$ instanceof Error?$.message:String($);g={ok:!1,error:_,data:A?await B(Ao(A,I,D,d),d).catch(()=>({url:"",title:"",extracted:I,steps:D})):null},u({type:"error:webActionsNodeRunner",content:`WebActions node execution failed: ${_}`})}finally{if(N==null||N.dispose(),y)try{await B(y.close(),Date.now()+3e3)}catch{}let $=Date.now()-s;c&&(m=he(c,l())),f==null||f({type:"tool_call",payload:{nodeId:e.id,url:`webActions:${m}`,method:"EXECUTE",status:g.ok?200:502,latencyMs:$}});let _=ge(at(g.data,l()));u({type:"info:webActionsNodeRunner:response",content:{nodeId:e.id,ok:g.ok,latencyMs:$,data:_.value,truncated:_.truncated,error:g.error}}),u({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:g.ok?"success":"error",error:g.error??void 0}}),g.error=at(g.error,l()),g.data&&(g.data.steps=g.data.steps.map(V=>V.error===void 0?V:{...V,error:at(V.error,l())})),n==null||n(e.id,g)}}async function Ao(o,e,i,t){let n="",h="";try{n=o.url()}catch{}try{h=await B(o.title(),t)}catch{}return{url:n,title:h,extracted:e,steps:i}}function Ge(){let o={};return{add(e,i){o[e]=i},hasOutputs(){return Object.keys(o).length>0},answerNodeIds(){return Object.keys(o)},snapshotData(){let e=Object.entries(o);return e.length===1?e[0][1]:Object.fromEntries(e)}}}function xo(o){return!!(o!=null&&o.HX_ORA_URL)&&!!(o!=null&&o.HX_API_KEY)}async function Ii(o,e){if(!xo(o))throw new Error("Structured outputs require HX_ORA_URL and HX_API_KEY");let i=await fetch(`${o.HX_ORA_URL}/internal/outputs/${encodeURIComponent(e.flowId)}/${encodeURIComponent(e.sessionId)}`,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:o.HX_API_KEY},body:JSON.stringify({runId:e.runId,createdAt:e.createdAt,data:e.data,answerNodeIds:e.answerNodeIds})});if(!i.ok){let t=await i.text().catch(()=>"");throw new Error(`Structured output persistence failed with ${i.status}${t?`: ${t}`:""}`)}}var Ye=3,Ze=10,ko=new Set(["agent:start","agent:complete","agent:telemetry"]);function Oo(o){let e=o.executedNodes||[];return e.length===0?"(none)":e.map(i=>i.label?`${i.id} (${i.label})`:i.id).join(" \u2192 ")}function _o(o){let e=o.executedNodes||[];return e[e.length-1]}function Q(o,e,i){throw o==null||o({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:i.message}}),i}function Io(o,e){var h,f,s,d,a,p,w;let i=Array.isArray((h=o.data)==null?void 0:h.inputs)?o.data.inputs:[],t=((s=(f=e.flowData)==null?void 0:f.state)==null?void 0:s.nodes)||[],n={};for(let l of i){let u=(d=l.key)==null?void 0:d.trim();if(!u)continue;let r=(a=l.from)==null?void 0:a.trim();if(!r){if(l.default===void 0)continue;n[u]=l.default;continue}let g=z(r,{context:e.context||{},results:e.results||{},nodes:t,edges:((w=(p=e.flowData)==null?void 0:p.state)==null?void 0:w.edges)??[],currentNodeId:o.id}),m=g.value;if(g.missing||m===void 0||m===null){if(l.default===void 0)throw new q(g.missing==="ancestor_not_executed"?"ANCESTOR_NOT_EXECUTED":"PATH_NOT_FOUND",`Worker node ${o.id} could not resolve input "${r}"`);m=l.default}n[u]=m}return n}async function Wt(o,e,i,t,n,h,f){var U,x,T,b,P,$;t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s=typeof((U=e.data)==null?void 0:U.flowId)=="string"?e.data.flowId.trim():"";s||Q(t,e,new Error(`Worker node ${e.id} is missing flowId`));let d=(x=i.flowData)==null?void 0:x.flowId,a=o.workerStack??(d?[d]:[]);a.includes(s)&&Q(t,e,new Error(`Worker node ${e.id} cannot call ${s}: cycle detected (${[...a,s].join(" \u2192 ")})`)),a.length>=Ye&&Q(t,e,new Error(`Worker node ${e.id} exceeded max nesting depth (${Ye})`));let p=o.workerCalls??{count:0};o.workerCalls=p,p.count>=Ze&&Q(t,e,new Error(`Worker node ${e.id} exceeded max worker calls per run (${Ze})`)),p.count+=1;let w;try{w=Io(e,i)}catch(_){Q(t,e,_ instanceof Error?_:new Error(String(_)));return}let l=o.env;l||Q(t,e,new Error(`Worker node ${e.id} is missing runtime env`));let u,r;try{let _=await Kt(s,l);r=(T=_==null?void 0:_.metadata)==null?void 0:T.tenant,u=await zt(s,l)}catch(_){Q(t,e,new Error(`Worker node ${e.id} could not load worker ${s}: ${_ instanceof Error?_.message:String(_)}`))}let g=(b=i.flowData)==null?void 0:b.tenant;(!r||r!==g)&&Q(t,e,new Error(`Worker ${s} belongs to a different tenant`));let m=Ge(),c={flowData:{...u,tenant:r,flowId:s,chatId:((P=i.flowData)==null?void 0:P.chatId)||""},executedNodes:[],context:{},results:{}},y={env:l,ctx:o.ctx,secrets:o.secrets,userAuth:o.userAuth,user:o.user,toolDefs:o.toolDefs,composioSessions:o.composioSessions,skillRefCache:o.skillRefCache,publicOrigin:o.publicOrigin,getOraModel:o.getOraModel,runId:o.runId,shouldStop:o.shouldStop,workerCalls:p,conn:void 0,getMessages:async()=>[],setMessages:async()=>{},agentMemory:"",outputCollector:m,workerStack:[...a,s]},R,N={onChangeState:()=>{},onServerEvent:_=>{var V;ko.has(_.type)||t==null||t({type:"worker:node",content:{workerNodeId:e.id,childNodeId:(V=_.content)==null?void 0:V.nodeId,event:_}})},onTelemetry:_=>f==null?void 0:f(_),onError:_=>{R=_},shouldStop:o.shouldStop},{startEngine:A,FlowExecutionStoppedError:C}=await import("./FlowEngine-WHR6D4VH.js"),I=await A(y,c,N)({text:"",inputs:w});if((I.status==="stopped"||await(($=o.shouldStop)==null?void 0:$.call(o)))&&Q(t,e,new C),I.status!=="completed"){let _=_o(c),V=Oo(c),j=I.error||R||"unknown error",M=_?` at node ${_.label?`${_.id} (${_.label})`:_.id}`:"";Q(t,e,new Error(`Worker ${s} failed${M}: ${j}. Path: ${V}`))}m.hasOutputs()||Q(t,e,new Error(`El worker ${s} complet\xF3 sin output estructurado. Agreg\xE1 un mapeo de salida en su nodo Answer.`));let D=(c.executedNodes||[]).map(_=>_.id);n==null||n(e.id,{ok:!0,data:m.snapshotData(),error:null,executed:D}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}async function Ut(o,e,i,t,n,h,f){var a,p,w,l,u,r,g,m;let s=Date.now(),d=(c,y={})=>t==null?void 0:t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:c,...y}});d("start");try{let c=e.data,y={context:i.context??{},results:i.results??{},nodes:((p=(a=i.flowData)==null?void 0:a.state)==null?void 0:p.nodes)??[],edges:((l=(w=i.flowData)==null?void 0:w.state)==null?void 0:l.edges)??[],currentNodeId:e.id},R=b=>{let P=y.nodes.find(V=>b.startsWith(`${V.id}.`)),$=P&&vt(P).find(V=>V.name===b.slice(P.id.length+1).split(".")[0]);if(b==="images"||($==null?void 0:$.type)==="image")throw new Error("Classifier accepts text context only");let _=z(b,y);if(_.missing||_.value===void 0||_.value===null)throw new Error(`Classifier input "${b}" did not produce a value`);return _.value},N=R(c.input.message);if(typeof N!="string")throw new Error("Classifier message must be text");let A=c.input.historyTurns>0&&o.getMessages?$e(await o.getMessages(),c.input.historyTurns,(u=i.context)==null?void 0:u.user_input):[],C=Object.fromEntries(c.input.vars.map(b=>[b,R(b)])),I=xe(c,{message:N,history:A,vars:C});console.log(`[classifier] node ${e.id} model=${c.model} message=${N.length}ch history=${A.length} vars=${Object.keys(C).length} options=${c.options.length} checks=${c.checks.length} estTokens=${ke(I)}`);let D=_t(I);if(D&&console.warn(`[classifier] node ${e.id} ${D}`),D&&(t==null||t({type:"warning:classifier",content:{nodeId:e.id,message:D}})),!((r=o.env)!=null&&r.AI))throw new Error("Classifier requires AI binding");let U;try{U=await Oe(o.env.AI,c.model,I)}finally{let b=_t(I);b&&b!==D&&console.warn(`[classifier] node ${e.id} ${b}`),b&&b!==D&&(t==null||t({type:"warning:classifier",content:{nodeId:e.id,message:b}}))}let{result:x,usage:T}=_e(U,c);console.log(`[classifier] \u2713 node ${e.id} route=${x.route} class=${x.classification} confidence=${x.confidence} margin=${x.margin.toFixed(4)} tokens=${T.promptTokens} ${Date.now()-s}ms`),n==null||n(e.id,x),f==null||f({type:"decision_telemetry",payload:{nodeId:e.id,model:c.model,totalLatency:Date.now()-s,usage:T,route:x.route}}),d("success",{summary:{route:x.route,classification:x.classification,label:x.label,confidence:x.confidence,margin:x.margin,probabilities:Object.fromEntries(Object.entries(x.probabilities).sort((b,P)=>P[1]-b[1]).slice(0,5)),checks:x.checks}})}catch(c){console.error(`[classifier] \u2717 node ${e.id} model=${(g=e.data)==null?void 0:g.model} ${Date.now()-s}ms: ${c instanceof Error?`${c.name}: ${c.message}`:String(c)}`),n==null||n(e.id,Ie()),f==null||f({type:"decision_telemetry",payload:{nodeId:e.id,model:(m=e.data)==null?void 0:m.model,totalLatency:Date.now()-s,route:"error",usage:{promptTokens:0,completionTokens:0,totalTokens:0}}}),d("error",{error:c instanceof Error&&c.message==="Clef timeout"?"Clef timeout":"Classifier decision failed",route:"error"})}}import{stepCountIs as Vo,streamText as Ho}from"ai";import{nanoid as Bo}from"nanoid";import"zod";function Qe(o,e){var s,d,a,p,w;let i=((s=o.data)==null?void 0:s.attachments)??[];if(!Array.isArray(i))throw new q("INVALID_EXPRESSION",`Node ${o.id} attachments must be an array`);let t=((a=(d=e.flowData)==null?void 0:d.state)==null?void 0:a.nodes)??[],n=((w=(p=e.flowData)==null?void 0:p.state)==null?void 0:w.edges)??[],h=ot(t,n,o.id),f="";for(let l of i){if(typeof l!="string")throw new q("INVALID_EXPRESSION",`Node ${o.id} has an invalid attachment reference`);let u=h.find(g=>g.ref===l);if(!u)throw new q("OUT_OF_SCOPE",`Attachment "${l}" is not in this node's connection scope`);if(u.type!=="file"&&u.type!=="image")throw new q("UNKNOWN_OUTPUT",`Attachment "${l}" is not an image or file output`);if(u.type!=="file")continue;let r=z(l,{context:e.context??{},results:e.results??{},nodes:t,edges:n,currentNodeId:o.id});if(r.missing)throw new q(r.missing==="ancestor_not_executed"?"ANCESTOR_NOT_EXECUTED":"PATH_NOT_FOUND",`Attachment "${l}" did not produce a value`);if(typeof r.value!="string")throw new q("PATH_NOT_FOUND",`Attachment "${l}" must resolve to file text`);r.value.trim()&&(f+=(f?`
2
-
3
- `:"")+r.value)}return f}function $o(o,e){var n,h,f,s,d;let i=((n=o.data)==null?void 0:n.attachments)??[];if(!Array.isArray(i))throw new q("INVALID_EXPRESSION",`Node ${o.id} attachments must be an array`);let t=ot(((f=(h=e.flowData)==null?void 0:h.state)==null?void 0:f.nodes)??[],((d=(s=e.flowData)==null?void 0:s.state)==null?void 0:d.edges)??[],o.id);return i.map(a=>{if(typeof a!="string")throw new q("INVALID_EXPRESSION",`Node ${o.id} has an invalid attachment reference`);let p=t.find(w=>w.ref===a);if(!p)throw new q("OUT_OF_SCOPE",`Attachment "${a}" is not in this node's connection scope`);if(p.type!=="image"&&p.type!=="file")throw new q("UNKNOWN_OUTPUT",`Attachment "${a}" is not a binary output`);return p.type==="image"?a:null}).filter(a=>a!==null)}function Ee(o,e){var n,h,f,s;let i=[],t={context:e.context??{},results:e.results??{},nodes:((h=(n=e.flowData)==null?void 0:n.state)==null?void 0:h.nodes)??[],edges:((s=(f=e.flowData)==null?void 0:f.state)==null?void 0:s.edges)??[],currentNodeId:o.id};for(let d of $o(o,e)){let a=z(d,t);if(a.missing)throw new q(a.missing==="ancestor_not_executed"?"ANCESTOR_NOT_EXECUTED":"PATH_NOT_FOUND",`Attachment "${d}" did not produce a value`);if(!Array.isArray(a.value))throw new q("PATH_NOT_FOUND",`Attachment "${d}" must resolve to an image array`);i.push(...a.value)}return i}var tt=(o,e,i)=>{o.send(e+"::"+i)};import{openai as bo}from"@ai-sdk/openai";import{extractReasoningMiddleware as Fo,wrapLanguageModel as Do}from"ai";import{createAI as Co}from"agents/models/ai-sdk";import{xai as Po}from"@ai-sdk/xai";import{anthropic as Mo}from"@ai-sdk/anthropic";import{createOpenRouter as jo}from"@openrouter/ai-sdk-provider";var Vt={};function Lt(o){if(o!=null){if(typeof o!="string")return o;try{return JSON.parse(o)}catch{return}}}function Wo(o){return{...o,defaultParams:Lt(o.defaultParams)??o.defaultParams,capabilities:Lt(o.capabilities)??o.capabilities,price:Lt(o.price)??o.price}}async function Se(o,e,i){var p,w;if(!(e!=null&&e.getOraModel))throw new Error("resolveModelById requires a sessionEnv with getOraModel capable of fetching models dynamically.");let t=await e.getOraModel(o);if(!t)return;let n=Wo(t),h=((p=n.capabilities)==null?void 0:p.params)??be(n),{effectiveParams:f,adjustments:s}=De(n.defaultParams,i,h),d;if(Vt[n.provider])d=await Vt[n.provider](n,e,i);else if(n.provider==="openai")d=bo(n.providerModel);else if(n.provider==="xai")d=Po(n.providerModel);else if(n.provider==="anthropic")d=Mo(n.providerModel);else if(n.provider==="openrouter")d=jo()(n.providerModel);else if(n.provider==="workersai"||n.provider==="cloudflare"){if(!((w=e==null?void 0:e.env)!=null&&w.AI))throw new Error("Workers AI provider requires sessionEnv.env.AI binding");d=Co({binding:e.env.AI}).languageModel(n.providerModel)}else d={provider:n.provider,providerModel:n.providerModel};let a=Pe(n);return a.kind==="tag"&&d&&typeof d=="object"&&"specificationVersion"in d&&(d=Do({model:d,middleware:Fo({tagName:a.tagName??"think",startWithReasoning:a.startWithReasoning??!1})})),{provider:n.provider,modelHandle:d,entry:n,effectiveParams:f,paramAdjustments:s.length>0?s:void 0,reasoning:a}}function tn(o,e){Vt[o]=e}var Uo=ft({"../tools/composioDirectTool.ts":()=>import("./composioDirectTool-ZCZRW5WU.js"),"../tools/composioTool.ts":()=>import("./composioTool-RKVCX25U.js"),"../tools/convertTempMessure.ts":()=>import("./convertTempMessure-5CAGRLBY.js"),"../tools/httpTool.ts":()=>import("./httpTool-DIQRGKMU.js"),"../tools/skillTool.ts":()=>import("./skillTool-JEAL3G33.js"),"../tools/tempTool.ts":()=>import("./tempTool-2RXAF56M.js"),"../tools/twitter.ts":()=>import("./twitter-OMDEG7T2.js"),"../tools/vectorize.ts":()=>import("./vectorize-CDB26DMD.js")});var Lo=ft({});async function Jo(o,e,i,t){var w;let n=Array.isArray((w=i==null?void 0:i.data)==null?void 0:w.tools)?i.data.tools:[];if(n.length===0)return{};let h={},f=l=>{var R,N;let u=typeof(l==null?void 0:l.description)=="string"?l.description:"",r=l==null?void 0:l.inputSchema,g;try{let A=(r==null?void 0:r.shape)??(typeof((R=r==null?void 0:r._def)==null?void 0:R.shape)=="function"?r._def.shape():(N=r==null?void 0:r._def)==null?void 0:N.shape);A&&typeof A=="object"&&(g=A)}catch{}let m=g?Object.keys(g):[],c=u?`description="${u.length>120?u.slice(0,120)+"\u2026":u}"`:"description=(none)",y=m.length?`inputSchema={${m.join(", ")}}`:"inputSchema=(none)";return`${c} ${y}`},s=(()=>{let l=[],u=[],r=[],g=[];for(let c=0;c<n.length;c++){let y=n[c];!y||typeof y!="object"||typeof y.id!="string"?g.push(c):y.kind==="builtin"?l.push(y.id):y.kind==="skill"?r.push(y.id):y.kind==="http"||y.kind==="mcp"||y.kind==="composio"?u.push(y.id):g.push(c)}let m=[];return l.length&&m.push(`builtin[${l.join(", ")}]`),u.length&&m.push(`custom[${u.join(", ")}]`),r.length&&m.push(`skill[${r.join(", ")}]`),g.length&&m.push(`invalid@[${g.join(", ")}]`),m.join(" ")||"(none)"})();console.log(`[tools] node ${i.id} requested (${n.length}): ${s}`);let d=!1,a=async()=>{if(d&&o.toolDefs)return o.toolDefs;if(!o.env)return o.toolDefs=o.toolDefs||{},d=!0,o.toolDefs;try{let l=await gt(o.env),u={};for(let r of l)r&&r.id&&(u[r.id]=r);o.toolDefs=u}catch(l){t==null||t({type:"error:llmNodeRunner",content:`Failed to load custom tool defs: ${String(l)}`}),o.toolDefs=o.toolDefs||{}}return d=!0,o.toolDefs},p=[];for(let l=0;l<n.length;l++){let u=n[l];if(!u||typeof u!="object"||typeof u.id!="string"||u.kind!=="builtin"&&u.kind!=="http"&&u.kind!=="mcp"&&u.kind!=="composio"&&u.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 r=u;if(r.kind!=="builtin"){let m=(await a())[r.id];if(!m){console.error(`[tools] \u2717 custom '${r.id}': not found for tenant`),t==null||t({type:"error:llmNodeRunner",content:`custom tool '${r.id}' not found for this tenant`});continue}if(r.kind==="composio"){try{let y=await Ue(m,o,e,t),R=Object.keys(y);for(let[N,A]of Object.entries(y))h[N]=A;console.log(`[tools] \u2713 composio '${r.id}' \u2192 ${R.length} tool(s)`)}catch(y){console.error(`[tools] \u2717 composio '${r.id}': ${String(y)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading composio tool '${r.id}': ${String(y)}`})}continue}if(r.kind==="skill"){if(m.kind!=="skill"){console.error(`[tools] \u2717 skill '${r.id}': row is of kind '${m.kind}', not 'skill'`),t==null||t({type:"error:llmNodeRunner",content:`tool '${r.id}' is not a skill`});continue}let y=m.name;if(h[y]){t==null||t({type:"warn:llmNodeRunner",content:`tool name collision on '${y}' \u2014 builtin/other already registered, skipping skill '${r.id}'`});continue}try{h[y]=Le(m,o,e,t),p.push(m);let R=typeof m.execution=="string"?JSON.parse(m.execution):m.execution||{},N=Array.isArray(R.references)?R.references.map(A=>A==null?void 0:A.name):[];console.log(`[tools] \u2713 skill '${r.id}' \u2192 '${y}' (refs: ${N.join(", ")||"none"})`),t==null||t({type:"info:skill:registered",content:{skill:y,refCount:N.length,refs:N}})}catch(R){console.error(`[tools] \u2717 skill '${r.id}': ${String(R)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading skill tool '${r.id}': ${String(R)}`})}continue}let c=m.name;if(h[c]){t==null||t({type:"warn:llmNodeRunner",content:`tool name collision on '${c}' \u2014 builtin already registered, skipping custom tool '${r.id}'`});continue}try{let y=yt(m,o,e,t);h[c]=y,console.log(`[tools] \u2713 custom '${r.id}' \u2192 '${c}'`),console.log(`[tools] ${f(h[c])}`)}catch(y){console.error(`[tools] \u2717 custom '${r.id}': ${String(y)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading custom tool '${r.id}': ${String(y)}`})}continue}if(!ce[r.id]){console.error(`[tools] \u2717 builtin '${r.id}': not in registry`),t==null||t({type:"error:llmNodeRunner",content:`Tool '${r.id}' not found in registry`});continue}try{let g;try{g=await Uo(`../tools/${r.id}.ts`)}catch{g=await Lo(`../tools/${r.id}.js`)}let m;if(g[r.id])m=g[r.id];else if(g.default)m=g.default;else if(g.create)m=g.create;else{let I=Object.values(g);I.length>0&&(m=I[0])}if(!m){t==null||t({type:"error:llmNodeRunner",content:`No factory export found for tool '${r.id}'`});continue}let c,y,R={};if(r.params&&typeof r.params=="object"){if(typeof r.params.description=="string"?c=r.params.description:r.params.description!==void 0&&(t==null||t({type:"error:llmNodeRunner",content:`Invalid description for tool '${r.id}' \u2014 must be a string`})),r.params.inputSchema!==void 0){let I=r.params.inputSchema;typeof I=="object"&&(typeof I.safeParse=="function"||I._def)?y=I:typeof I=="object"&&I!==null&&I.type==="object"&&I.properties?(y=me(I),y||t==null||t({type:"error:llmNodeRunner",content:`Invalid inputSchema for tool '${r.id}' \u2014 must be a Zod schema or JSON Schema object`})):t==null||t({type:"error:llmNodeRunner",content:`Invalid inputSchema for tool '${r.id}' \u2014 must be a Zod schema or JSON Schema object`})}r.params.defaults!==void 0?typeof r.params.defaults=="object"&&r.params.defaults!==null&&!Array.isArray(r.params.defaults)?R=r.params.defaults:(t==null||t({type:"error:llmNodeRunner",content:`Invalid defaults for tool '${r.id}' \u2014 must be an object`}),R={}):r.params.source!==void 0||r.params.target!==void 0?(t==null||t({type:"error:llmNodeRunner",content:`Invalid params for tool '${r.id}' \u2014 legacy top-level source/target not supported; use params.defaults instead`}),R={}):R={}}let N=m(o,e,R,t);c&&N&&typeof N=="object"&&(N.description=c),y&&N&&typeof N=="object"&&(N.inputSchema=y),h[r.id]=N;let A=[];c&&A.push("description"),y&&A.push("inputSchema"),Object.keys(R).length&&A.push(`defaults(${Object.keys(R).join(",")})`);let C=A.length?` [overrides: ${A.join(", ")}]`:"";console.log(`[tools] \u2713 builtin '${r.id}'${C}`),console.log(`[tools] ${f(N)}`)}catch(g){console.error(`[tools] \u2717 builtin '${r.id}': ${String(g)}`),t==null||t({type:"error:llmNodeRunner",content:`Error loading tool '${r.id}': ${String(g)}`});continue}}if(p.length>0)if(h.readSkillRef)t==null||t({type:"warn:llmNodeRunner",content:"tool name collision on 'readSkillRef' \u2014 builtin/other already registered, skipping readSkillRef tool"});else try{h.readSkillRef=Ve(o,p,e,t),console.log(`[tools] \u2713 registered readSkillRef tool for ${p.length} skill(s)`),t==null||t({type:"info:skill:readSkillRefRegistered",content:{skills:p.map(l=>l.name)}})}catch(l){console.error(`[tools] \u2717 failed to load readSkillRef tool: ${String(l)}`)}return h}async function Ht(o,e,i,t,n,h,f){var I,D,U,x;`${e.id}`,t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s=!1;try{let T=(I=i.flowData)==null?void 0:I.state;if(T&&T.edges&&T.nodes){let b=T.edges.filter(P=>P.source===e.id);if(b.length>0){let P=T.nodes.find($=>$.id===b[0].target);P&&P.type==="answerNode"&&(s=!0)}}}catch(T){console.error("Error determining next node for streaming:",T)}let d=X(e.data.template,e,i,t,{sessionEnv:o});(!d||!d.trim())&&(d="Answer straight forward to the user, dont offer any other option to continue");let a=d,p=X(e.data.user_template||"",e,i,t,{sessionEnv:o}),w=T=>T&&Object.fromEntries(Object.keys(T).map(b=>[b,"[redacted]"])),l=o!=null&&o.secrets||o!=null&&o.userAuth?{...o,secrets:w(o.secrets),userAuth:w(o.userAuth)}:o,u=X(e.data.template,e,i,void 0,{sessionEnv:l})||a,r=X(e.data.user_template||"",e,i,void 0,{sessionEnv:l});t==null||t({type:`info:llmNodeRunner:${e.id}`,content:u}),t==null||t({type:`info:llmNodeRunner:${e.id}`,content:r});let g=(D=e==null?void 0:e.data)==null?void 0:D.window_size,m=Number(g);(!Number.isInteger(m)||m<=0)&&(m=5);let c=Ee(e,i),y=Qe(e,i);t==null||t({type:"info:llmNodeRunner:attachments",content:{nodeId:e.id,refs:Array.isArray((U=e.data)==null?void 0:U.attachments)?e.data.attachments:[],images:c.length,documents:y?1:0}});let N=(await((x=o.getMessages)==null?void 0:x.call(o))??[]).slice(-m),A=N.filter(T=>T&&typeof T.role=="string"&&typeof T.content=="string");A.length!==N.length&&console.warn(`Filtered ${N.length-A.length} invalid messages from history`);let C=Xo(A,p,c,y);await qo(d,C,o.conn,t,e,s,n,i,h,o,f)}async function qo(o,e,i,t,n,h,f,s,d,a,p){var l;let w=Date.now();if(!((l=a.env)!=null&&l.AI))throw new Error("AI binding is required for LLM node");return new Promise(async(u,r)=>{var b,P,$,_,V,j;let g,m={},c,y="none",R=!1,N,A=!1,C=!1,I=0,D=0,U=(b=n==null?void 0:n.data)==null?void 0:b.sendReasoning,x=U!==!1;try{let M=(P=n==null?void 0:n.data)==null?void 0:P.model,G=Array.isArray(M)?M[0]:M||"gpt_5_nano",k=Fe(n==null?void 0:n.data),F=await Se(G,a,k);if(!F)throw new Error(`Model '${G}' not found in registry`);g=F.modelHandle,m=F.effectiveParams||{},y=F.reasoning.kind;let O=je(F.reasoning,($=n==null?void 0:n.data)==null?void 0:$.reasoningEffort);R=x&&Me(F.reasoning);let W=typeof((_=n==null?void 0:n.data)==null?void 0:_.reasoningMaxTokens)=="number"?n.data.reasoningMaxTokens:void 0;c=We(F.provider,{effort:O,exposeReasoning:R,maxTokens:W}),O&&(t==null||t({type:"info:llmNodeRunner:reasoningEffort",content:O})),console.log(`[reasoning] ${JSON.stringify({model:G,provider:F.provider,capability:F.reasoning,requestedEffort:((V=n==null?void 0:n.data)==null?void 0:V.reasoningEffort)??null,resolvedEffort:O??null,sendReasoning:x,exposeReasoning:R,providerOptions:c??null},null,2)}`);for(let J of F.paramAdjustments??[])t==null||t({type:"warn:llmNodeRunner",content:J});t==null||t({type:"info:llmNodeRunner:model",content:G}),t==null||t({type:"info:llmNodeRunner:generationParams",content:{...(j=n==null?void 0:n.data)!=null&&j.generationPreset?{preset:n.data.generationPreset}:{},...m,...y!=="none"?{reasoning:y,configuredSendReasoning:U,sendReasoning:x,exposeReasoning:R,...O?{effort:O}:{}}:{}}})}catch(M){throw t==null||t({type:"error:llmNodeRunner",content:`Model error: ${String(M)}`}),M}let T=await Jo(a,s,n,t);console.log(`[tools] node ${n.id} loaded ${Object.keys(T).length}: ${Object.keys(T).join(", ")||"(none)"}`),t==null||t({type:"info:llmNodeRunner:toolsLoaded",content:{nodeId:n.id,tools:Object.keys(T)}});try{let M=Ho({model:g,system:o,messages:e,stopWhen:(()=>{var J;let F=!!T.readSkillRef?10:5,O=Number(((J=n.data)==null?void 0:J.max_steps)??F),W=Number.isFinite(O)?Math.max(1,Math.min(30,O)):F;return Vo(W)})(),...Ce(m),...c?{providerOptions:c}:{},tools:T,onFinish:async k=>{var ct,rt,dt,lt;let F=k.text||"",O=k.reasoningText??((ct=k.reasoning)==null?void 0:ct.text)??"";if(console.log(`[reasoning] done: deltas=${I} chars=${D} result.reasoningText=${O.length} finishReason=${k.finishReason??"n/a"} reasoningTokens=${((dt=(rt=k.usage)==null?void 0:rt.outputTokenDetails)==null?void 0:dt.reasoningTokens)??((lt=k.usage)==null?void 0:lt.reasoningTokens)??"n/a"}`),x&&R&&!A&&O&&i){A=!0;try{tt(i,v.SERVER_REASONING_STREAM,O)}catch(ut){console.warn("Failed to send finished reasoning over connection",ut)}}let W={id:Bo(),role:"assistant",type:"text",content:F,ts:Date.now()};h&&(a.setMessages?await a.setMessages(W):t==null||t({type:"error:llmNodeRunner",content:"setMessages callback missing"})),i&&x&&A&&!C&&(C=!0,tt(i,v.SERVER_REASONING_STREAM_COMPLETE,JSON.stringify({}))),h&&i&&tt(i,v.SERVER_TEXT_STREAM_COMPLETE,JSON.stringify({})),f==null||f((n==null?void 0:n.id)||"llm_result",F),t==null||t({type:"info:llmNodeRunner:onFinish",content:JSON.stringify(k)});let J=Date.now()-w,nt=N?N-w:void 0;p==null||p({type:"llm_telemetry",payload:{nodeId:n.id,totalLatency:J,timeToFirstToken:nt,model:k.response.modelId,usage:k.usage}}),p==null||p({type:"llm_result",payload:{result:k}})},onStepFinish:async k=>{let F=(O,W=200)=>{let J=typeof O=="string"?O:JSON.stringify(O);return J?J.length>W?`${J.slice(0,W)}\u2026(+${J.length-W})`:J:""};if(k.toolCalls&&k.toolCalls.length>0){for(let O of k.toolCalls)console.log(`[tools] \u2192 ${O.toolName}(${F(O.args??O.input)})`);t==null||t({type:`info:llmNodeRunner:toolCalls:${n.id}`,content:JSON.stringify(k.toolCalls)})}if(k.toolResults&&k.toolResults.length>0){for(let O of k.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(k.toolResults)})}},experimental_onToolCallStart:k=>{var F;t==null||t({type:"tool:execution",content:{nodeId:n.id,toolName:(F=k==null?void 0:k.toolCall)==null?void 0:F.toolName,status:"start"}})},experimental_onToolCallFinish:k=>{var F,O;t==null||t({type:"tool:execution",content:{nodeId:n.id,toolName:(F=k==null?void 0:k.toolCall)==null?void 0:F.toolName,status:((O=k==null?void 0:k.toolOutput)==null?void 0:O.type)==="tool-error"?"error":"success"}})},onError:k=>{t==null||t({type:"error:llmNodeRunner",content:"Execution error"}),r(k)},onChunk:k=>{if(k.chunk.type==="reasoning-delta"){let O=k.chunk.text??k.chunk.delta??"";if(O&&(A=!0,I+=1,D+=O.length,I===1&&console.log("[reasoning] \u2713 first reasoning-delta received")),x&&i&&O)try{tt(i,v.SERVER_REASONING_STREAM,O)}catch(W){console.warn("Failed to send reasoning chunk over connection",W)}return}if(k.chunk.type==="text-delta"){if(N||(N=Date.now()),i&&x&&A&&!C){C=!0;try{tt(i,v.SERVER_REASONING_STREAM_COMPLETE,JSON.stringify({}))}catch(O){console.warn("Failed to send reasoning complete over connection",O)}}return}p==null||p({type:k.chunk.type,payload:{nodeId:n.id,chunk:k.chunk}});let F=`llm_chunk:${k.chunk.type}`;t==null||t({type:F,content:{...k}})}}),G=async()=>{let k="";for await(let F of M.fullStream)if(F.type==="text-delta"){if(k+=F.text,h&&i)try{tt(i,v.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(h&&i&&k.trim())try{tt(i,v.SERVER_TEXT_STREAM_COMPLETE,JSON.stringify({}))}catch(O){console.warn("Failed to flush text segment over connection",O)}k=""}};await Promise.all([M,G()]),u(),t==null||t({type:"node:execution",content:{nodeId:n.id,nodeType:n.type,status:"success"}})}catch(M){t==null||t({type:"node:execution",content:{nodeId:n.id,nodeType:n.type,status:"error",error:String(M)}}),r(M)}})}function Xo(o,e,i,t){let n=!!(i&&i.length>0),h=!!t,f=n||h,d=o.length>0&&o[o.length-1].role==="user"?o[o.length-1]:void 0,a=p=>{let w=[],l="";if(h&&(l+=`[Attached files]
4
- ${t}
5
- [End of attached files]
6
-
7
- `),p&&(l+=p),l&&w.push({type:"text",text:l}),n)for(let u of i)w.push({type:"image",image:u.data,mimeType:u.mimeType});return w};return e&&d&&d.content===e?[...o.slice(0,-1).map(w=>({role:w.role,content:w.content})),{role:"user",content:a(e)}]:e?[...o.map(p=>({role:p.role,content:p.content})),{role:"user",content:a(e)}]:f&&d?[...o.slice(0,-1).map(w=>({role:w.role,content:w.content})),{role:"user",content:a(d.content)}]:o.map(p=>({role:p.role,content:p.content}))}async function Bt(o,e,i,t,n,h,f){var p,w,l,u,r,g,m;console.log(`**** MEMO Node id: ${e.id} ****`),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"start"}});let s="",d=!1,a=Date.now();try{t==null||t({type:"info:memoNodeRunner",content:"Starting memo node execution"});let c=String(((p=e.data)==null?void 0:p.query_key)||"user_input"),y=z(c,{context:i.context??{},results:i.results??{},nodes:((l=(w=i.flowData)==null?void 0:w.state)==null?void 0:l.nodes)??[],edges:((r=(u=i.flowData)==null?void 0:u.state)==null?void 0:r.edges)??[],currentNodeId:e.id});if(y.missing)throw new Error(`Memo query "${c}" did not produce a value`);if(!o.env||!o.ctx){t==null||t({type:"error:memoNodeRunner",content:"Missing env or ctx"}),n==null||n(e.id,s);return}if(!e.data.rag_id){t==null||t({type:"error:memoNodeRunner",content:"Missing rag_id"}),n==null||n(e.id,s);return}let R=String(y.value??"");t==null||t({type:"info:memoNodeRunner",content:`Query text: ${R}`}),t==null||t({type:"info:memoNodeRunner",content:"Generating embedding for query"});let N=await Gt(o,R,!0);t==null||t({type:"info:memoNodeRunner",content:`Embedding generated successfully, length: ${N.data[0].length}`});let A=Array.isArray(e.data.rag_id)?e.data.rag_id:[e.data.rag_id],C=[];for(let x of A){t==null||t({type:"info:memoNodeRunner",content:`Executing RAG query with namespace: ${x}`});let T=await o.env[`VDB_${(g=i.flowData)==null?void 0:g.tenant}_1024`].query(N.data[0],{namespace:x,topK:e.data.topk,returnMetadata:"all"});t==null||t({type:"info:memoNodeRunner",content:`RAG query completed for namespace ${x}, matches: ${((m=T.matches)==null?void 0:m.length)||0}`}),Array.isArray(T.matches)&&C.push(...T.matches)}let I=Date.now()-a;s=C.map(x=>{var T;return(T=x.metadata)==null?void 0:T.value}).filter(x=>typeof x=="string").join(`
8
-
9
- `),f==null||f({type:"memo_search",payload:{nodeId:e.id,searchLatencyMs:I,retrievedContext:s}}),t==null||t({type:"info:memoNodeRunner",content:`Context retrieval complete, length: ${s.length}, preview: ${s.substring(0,200)}...`}),t==null||t({type:"info:memoNodeRunner",content:"Memo node execution completed successfully"}),d=!0}catch(c){throw console.error("Error processing MemoNode:",c),t==null||t({type:"error:memoNodeRunner",content:`Memo node execution failed: ${c}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"error",error:String(c)}}),c}finally{d&&(n==null||n(e.id,s),t==null||t({type:"info:memoNodeRunner",content:`onResult called with context length: ${s.length}`}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}}))}}async function Jt(o,e,i,t,n,h,f){var p,w,l,u,r,g,m,c;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:i}),f==null||f({type:"start_node",payload:{userMessage:(p=i==null?void 0:i.context)==null?void 0:p.user_input}});let s=((w=e.data)==null?void 0:w.allow_images)!==!1,d=((l=e.data)==null?void 0:l.allow_documents)!==!1;!s&&(i!=null&&i.context)&&(i.context.user_images=[],h==null||h({...i})),!d&&(i!=null&&i.context)&&(i.context.files="",h==null||h({...i}));let a={};for(let y of mt(e.data))a[y.name]=(u=i==null?void 0:i.context)==null?void 0:u[y.name];n==null||n(e.id,{...a,user_input:(r=i==null?void 0:i.context)==null?void 0:r.user_input,images:s?(g=i==null?void 0:i.context)==null?void 0:g.user_images:[],files:d?(m=i==null?void 0:i.context)==null?void 0:m.files:"",memory:((c=i==null?void 0:i.context)==null?void 0:c.memory)??""}),t==null||t({type:"node:execution",content:{nodeId:e.id,nodeType:e.type,status:"success"}})}function Sn(o,e,i){let t=e;async function n(){var a;if(await((a=i==null?void 0:i.shouldStop)==null?void 0:a.call(i)))throw new ht}async function h(a){let p=a;for(t.executedNodes=t.executedNodes||[],t.context=t.context||{},t.results=t.results||{};p&&p.id;)await n(),await f(p),await n(),p=zo(p,t.flowData,t)}async function f(a){var r,g;let p=d[a.type];if(!p){(r=i==null?void 0:i.onError)==null||r.call(i,`Unknown node type: ${a.type}`);return}t.executedNodes=t.executedNodes||[],t.executedNodes.push({id:a.id,type:a.type,label:typeof((g=a.data)==null?void 0:g.label)=="string"?a.data.label:void 0}),t.lastNodeId=a.id;let w=m=>{var c;return(c=i==null?void 0:i.onServerEvent)==null?void 0:c.call(i,{...m,ts:Date.now()})},l=m=>{var c,y;if((c=i==null?void 0:i.onTelemetry)==null||c.call(i,m),m.type==="llm_telemetry"||m.type==="decision_telemetry"||m.type==="memory_update"){let R=(y=m.payload)==null?void 0:y.usage;R&&(t.tokenUsage=t.tokenUsage||{promptTokens:0,completionTokens:0,totalTokens:0},t.tokenUsage.promptTokens+=R.promptTokens||0,t.tokenUsage.completionTokens+=R.completionTokens||0,t.tokenUsage.totalTokens+=R.totalTokens||0)}};return await p(o,a,t,w,(m,c)=>{t.results[m]=c},i==null?void 0:i.onChangeState,l)}let s=async a=>{var u,r,g,m,c,y,R;let p=Date.now(),w="completed",l;try{await n();let N=typeof a=="string"?Zt(a):a,A=(N==null?void 0:N.text)||"",C=(N==null?void 0:N.images)||[],I=(N==null?void 0:N.documents)||[],D=await He(I,o.env),U=D.length>0?D.map(b=>`--- file: ${b.name} ---
10
- ${b.text}`).join(`
11
-
12
- `):"";t.context={user_input:A,user_images:C,files:U},t.tokenUsage={promptTokens:0,completionTokens:0,totalTokens:0},t.executedNodes=[],(u=i==null?void 0:i.onServerEvent)==null||u.call(i,{type:"agent:start",content:"Execution started",timestamp:Date.now()});let{startNode:x,error:T}=Ko(t.flowData);if(!x)w="failed",l=T||"Flow Format Error",(r=i==null?void 0:i.onError)==null||r.call(i,l);else{let b=mt(x.data),{values:P,errors:$}=Yt(b,N==null?void 0:N.inputs);if($.length>0)return w="failed",l=`Invalid flow inputs: ${$.join("; ")}`,(g=i==null?void 0:i.onError)==null||g.call(i,l),{status:w,error:l};if(t.context={...t.context,inputs:P,...P},t.context.user_input||(t.context.user_input=A),re(x.data)){let _=ie(se(x.data));t.context.memory=ne(o.agentMemory||"",_).content}else t.context.memory="";await h(x),(m=i==null?void 0:i.onServerEvent)==null||m.call(i,{type:"agent:telemetry",content:{durationMs:Date.now()-p,tokenUsage:t.tokenUsage},timestamp:Date.now()})}}catch(N){N instanceof ht?(w="stopped",l=N.message,(c=i==null?void 0:i.onServerEvent)==null||c.call(i,{type:"agent:stopped",content:l,timestamp:Date.now()})):(w="failed",l=N instanceof Error?N.message:"Agent execution failed",(y=i==null?void 0:i.onError)==null||y.call(i,l))}finally{(R=i==null?void 0:i.onServerEvent)==null||R.call(i,{type:"agent:complete",content:{status:w,durationMs:Date.now()-p},timestamp:Date.now()})}return{status:w,error:l}},d={startNode:Jt,classifierNode:Ut,llmNode:Ht,memoNode:Bt,answerNode:It,apiNode:Ft,toolNode:Pt,workerNode:Wt,crawlNode:Mt,webActionsNode:jt};return s}var ht=class extends Error{constructor(){super("Stopped by user"),this.name="FlowExecutionStoppedError"}};function Ko(o){let e=(o==null?void 0:o.state)??o,i=ae(e);return i.length?{error:i[0].message}:{startNode:e.nodes.find(t=>t.type==="startNode")}}function ve(o,e){var i;return((i=o.state)==null?void 0:i.nodes.find(t=>t.id===e))||null}function zo(o,e,i){var h;let t=e==null?void 0:e.state;if(!t)return null;let n=t.edges.filter(f=>f.source===o.id);if(o.type==="classifierNode"){let f=(h=i==null?void 0:i.results)==null?void 0:h[o.id];if(!f||!["class","uncertain","blocked","error"].includes(f.route))throw new Error(`Classifier ${o.id}: missing decision result`);let s=f.route,d=w=>n.find(l=>l.sourceHandle===Nt(w,f.classification)),a=d(s);if(!a&&s==="blocked"&&(s=f.confidence<o.data.confidence.threshold||f.margin<o.data.confidence.margin?"uncertain":"class",a=d(s)),!a&&s==="uncertain"&&(s="class",a=d(s)),!a)throw new Error(`Classifier ${o.id}: no connected edge for ${Nt(s,f.classification)}`);let p=ve(e,a.target);if(!p)throw new Error(`Classifier ${o.id}: edge target ${a.target} does not exist`);return p}return n.length===0?null:ve(e,n[0].target)}export{tt as a,eo as b,Ge as c,Ii as d,Wo as e,Se as f,tn as g,Sn as h,ht as i};