@zibby/agent-workflow 0.4.5 → 0.4.7

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.
package/dist/graph.js CHANGED
@@ -1,37 +1,37 @@
1
- var _e=Object.defineProperty;var Q=(r,t)=>()=>(r&&(t=r(r=0)),t);var Rt=(r,t)=>{for(var e in t)_e(r,e,{get:t[e],enumerable:!0})};var Ct,Ie,rt,I,Y=Q(()=>{Ct=()=>{},Ie={debug:Ct,info:Ct,warn:(...r)=>console.warn("[workflow]",...r),error:(...r)=>console.error("[workflow]",...r)},rt={impl:Ie},I={debug:(...r)=>rt.impl.debug?.(...r),info:(...r)=>rt.impl.info?.(...r),warn:(...r)=>rt.impl.warn?.(...r),error:(...r)=>rt.impl.error?.(...r)}});var Jt=Q(()=>{});var Yt={};Rt(Yt,{clearSkills:()=>ke,getAllSkills:()=>ve,getSkill:()=>dt,hasSkill:()=>Te,listSkillIds:()=>Ae,registerSkill:()=>$e});function $e(r){if(!r||typeof r.id!="string")throw new Error("Skill definition must include a string id");H.set(r.id,Object.freeze({...r}))}function dt(r){return H.get(r)||null}function Te(r){return H.has(r)}function ve(){return new Map(H)}function Ae(){return Array.from(H.keys())}function ke(){H.clear()}var pt,H,ht=Q(()=>{pt=Symbol.for("@zibby/agent-workflow.skills");globalThis[pt]||(globalThis[pt]=new Map);H=globalThis[pt]});var gt={};Rt(gt,{getAgentStrategy:()=>Zt,invokeAgent:()=>Pe,listStrategies:()=>Oe,registerStrategy:()=>xe});function xe(r){if(!r||typeof r.getName!="function"||typeof r.invoke!="function")throw new Error("strategy must implement getName() and invoke() (AgentStrategy shape)");let t=D.findIndex(e=>e.getName()===r.getName());t>=0?D[t]=r:D.push(r)}function Oe(){return D.map(r=>r.getName())}function Zt(r={}){let{state:t={},preferredAgent:e=null}=r,o=e||t.agentType||process.env.AGENT_TYPE;if(!o){let n=D.map(i=>i.getName()).join(", ")||"none registered";throw new Error(`No agent specified. Set agentType in state or AGENT_TYPE env var. Available: ${n}`)}I.debug(`[workflow] agent selection: requested=${o}`);let s=D.find(n=>n.getName()===o);if(!s){let n=D.map(i=>i.getName()).join(", ")||"none registered";throw new Error(`Unknown agent '${o}'. Available: ${n}`)}if(!s.canHandle(r))throw new Error(`Agent '${o}' is not available in this environment. Check credentials/environment.`);return I.debug(`[workflow] using agent: ${s.getName()}`),s}async function Pe(r,t={},e={}){let o=Zt(t),s=t.state?.config||e.config||{},n=s.models||{},i=e.nodeName&&n[e.nodeName]||null,a=n.default||null,c=s.agent?.[o.name]?.model||null,l=i||a||c||e.model||null,p={...e,model:l,workspace:t.state?.workspace||e.workspace,schema:e.schema||t.schema,images:e.images||t.images||[],skills:e.skills||t.skills||[],config:s},d=r,g=p.skills||[];if(g.length>0&&!e.skipPromptFragments){let y=g.map(w=>{let T=dt(w)?.promptFragment;return typeof T=="function"?T():T}).filter(Boolean);y.length>0&&(d+=`
1
+ var Ee=Object.defineProperty;var et=(r,t)=>()=>(r&&(t=r(r=0)),t);var Bt=(r,t)=>{for(var e in t)Ee(r,e,{get:t[e],enumerable:!0})};var Ct,$e,ot,w,K=et(()=>{Ct=()=>{},$e={debug:Ct,info:Ct,warn:(...r)=>console.warn("[workflow]",...r),error:(...r)=>console.error("[workflow]",...r)},ot={impl:$e},w={debug:(...r)=>ot.impl.debug?.(...r),info:(...r)=>ot.impl.info?.(...r),warn:(...r)=>ot.impl.warn?.(...r),error:(...r)=>ot.impl.error?.(...r)}});var Yt=et(()=>{});var Zt={};Bt(Zt,{clearSkills:()=>Pe,getAllSkills:()=>xe,getSkill:()=>gt,hasSkill:()=>ke,listSkillIds:()=>Oe,registerSkill:()=>Ae});function Ae(r){if(!r||typeof r.id!="string")throw new Error("Skill definition must include a string id");Z.set(r.id,Object.freeze({...r}))}function gt(r){return Z.get(r)||null}function ke(r){return Z.has(r)}function xe(){return new Map(Z)}function Oe(){return Array.from(Z.keys())}function Pe(){Z.clear()}var ft,Z,mt=et(()=>{ft=Symbol.for("@zibby/agent-workflow.skills");globalThis[ft]||(globalThis[ft]=new Map);Z=globalThis[ft]});var wt={};Bt(wt,{getAgentStrategy:()=>zt,invokeAgent:()=>Be,listStrategies:()=>Re,registerStrategy:()=>Ne});function Ne(r){if(!r||typeof r.getName!="function"||typeof r.invoke!="function")throw new Error("strategy must implement getName() and invoke() (AgentStrategy shape)");let t=U.findIndex(e=>e.getName()===r.getName());t>=0?U[t]=r:U.push(r)}function Re(){return U.map(r=>r.getName())}function zt(r={}){let{state:t={},preferredAgent:e=null}=r,s=e||t.agentType||process.env.AGENT_TYPE;if(!s){let n=U.map(i=>i.getName()).join(", ")||"none registered";throw new Error(`No agent specified. Set agentType in state or AGENT_TYPE env var. Available: ${n}`)}w.debug(`[workflow] agent selection: requested=${s}`);let o=U.find(n=>n.getName()===s);if(!o){let n=U.map(i=>i.getName()).join(", ")||"none registered";throw new Error(`Unknown agent '${s}'. Available: ${n}`)}if(!o.canHandle(r))throw new Error(`Agent '${s}' is not available in this environment. Check credentials/environment.`);return w.debug(`[workflow] using agent: ${o.getName()}`),o}async function Be(r,t={},e={}){let s=zt(t),o=t.state?.config||e.config||{},n=o.models||{},i=e.nodeName&&n[e.nodeName]||null,a=n.default||null,c=o.agent?.[s.name]?.model||null,l=i||a||c||e.model||null,u={...e,model:l,workspace:t.state?.workspace||e.workspace,schema:e.schema||t.schema,images:e.images||t.images||[],skills:e.skills||t.skills||[],config:o},p=r,h=u.skills||[];if(h.length>0&&!e.skipPromptFragments){let I=h.map(b=>{let $=gt(b)?.promptFragment;return typeof $=="function"?$():$}).filter(Boolean);I.length>0&&(p+=`
2
2
 
3
- ${y.join(`
3
+ ${I.join(`
4
4
 
5
- `)}`)}let m=t.state?._currentNodeConfig?.extraPromptInstructions?.trim();return m&&(d+=`
5
+ `)}`)}let m=t.state?._currentNodeConfig?.extraPromptInstructions?.trim();return m&&(p+=`
6
6
 
7
7
  \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
8
8
  PRIORITY OVERRIDE \u2014 THE FOLLOWING INSTRUCTIONS TAKE PRECEDENCE OVER ALL PREVIOUS CONTENT
9
9
  \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
10
10
 
11
11
  ${m}
12
- `),I.debug(`[workflow] prompt length: ${d.length} chars`),o.invoke(d,p)}var ft,D,mt=Q(()=>{Jt();Y();ht();ft=Symbol.for("@zibby/agent-workflow.strategies");globalThis[ft]||(globalThis[ft]=[]);D=globalThis[ft]});var ye=new Set(["__proto__","constructor","prototype"]);function at(r){if(ye.has(r))throw new Error(`Invalid state key: "${r}"`)}var tt=class{constructor(t={}){this._state=Object.create(null),Object.assign(this._state,{messages:[],errors:[],artifacts:{},metadata:{},...t}),this._history=[]}get(t){return this._state[t]}set(t,e){at(t),this._history.push({...this._state}),this._state[t]=e}update(t){let e=Object.getOwnPropertyNames(t);for(let o of e)at(o);this._history.push({...this._state});for(let o of e)this._state[o]=t[o]}append(t,e){at(t),this._history.push({...this._state}),Array.isArray(this._state[t])||(this._state[t]=[]),this._state[t].push(e)}getAll(){return{...this._state}}rollback(){this._history.length>0&&(this._state=this._history.pop())}};var et=class{constructor(t){this.schema=t}parse(t){let e=t.match(/```json\s*([\s\S]*?)\s*```/);if(e)return this.validate(JSON.parse(e[1]));let o=[t.match(/\{[\s\S]*?\}/),t.match(/\{[\s\S]*\}/)].filter(Boolean).map(s=>s[0]);for(let s of o)try{return this.validate(JSON.parse(s))}catch(n){if(!(n instanceof SyntaxError))throw n}return this.validate({result:t.trim()})}validate(t){let e=[];for(let[o,s]of Object.entries(this.schema)){if(s.required&&!(o in t)&&e.push(`Missing required field: ${o}`),o in t&&s.type){let n=typeof t[o];n!==s.type&&e.push(`Field '${o}' expected ${s.type}, got ${n}`)}if(s.validate&&o in t){let n=s.validate(t[o]);n&&e.push(`Field '${o}': ${n}`)}}if(e.length>0)throw new Error(`Output validation failed:
12
+ `),w.debug(`[workflow] prompt length: ${p.length} chars`),s.invoke(p,u)}var St,U,_t=et(()=>{Yt();K();mt();St=Symbol.for("@zibby/agent-workflow.strategies");globalThis[St]||(globalThis[St]=[]);U=globalThis[St]});var be=new Set(["__proto__","constructor","prototype"]);function ut(r){if(be.has(r))throw new Error(`Invalid state key: "${r}"`)}var rt=class{constructor(t={}){this._state=Object.create(null),Object.assign(this._state,{messages:[],errors:[],artifacts:{},metadata:{},...t}),this._history=[]}get(t){return this._state[t]}set(t,e){ut(t),this._history.push({...this._state}),this._state[t]=e}update(t){let e=Object.getOwnPropertyNames(t);for(let s of e)ut(s);this._history.push({...this._state});for(let s of e)this._state[s]=t[s]}append(t,e){ut(t),this._history.push({...this._state}),Array.isArray(this._state[t])||(this._state[t]=[]),this._state[t].push(e)}getAll(){return{...this._state}}rollback(){this._history.length>0&&(this._state=this._history.pop())}};var st=class{constructor(t){this.schema=t}parse(t){let e=t.match(/```json\s*([\s\S]*?)\s*```/);if(e)return this.validate(JSON.parse(e[1]));let s=[t.match(/\{[\s\S]*?\}/),t.match(/\{[\s\S]*\}/)].filter(Boolean).map(o=>o[0]);for(let o of s)try{return this.validate(JSON.parse(o))}catch(n){if(!(n instanceof SyntaxError))throw n}return this.validate({result:t.trim()})}validate(t){let e=[];for(let[s,o]of Object.entries(this.schema)){if(o.required&&!(s in t)&&e.push(`Missing required field: ${s}`),s in t&&o.type){let n=typeof t[s];n!==o.type&&e.push(`Field '${s}' expected ${o.type}, got ${n}`)}if(o.validate&&s in t){let n=o.validate(t[s]);n&&e.push(`Field '${s}': ${n}`)}}if(e.length>0)throw new Error(`Output validation failed:
13
13
  ${e.join(`
14
- `)}`);return t}};Y();import{writeFileSync as St,readFileSync as zt,existsSync as Kt,mkdirSync as Ne}from"node:fs";import{join as wt,dirname as Re}from"node:path";import v from"chalk";var Ee="__WORKFLOW_GRAPH_LOG__",Z=v.gray("\u2502"),be=v.gray("\u250C"),Bt=v.gray("\u2514"),ct=v.green("\u25C6"),Mt=v.hex("#c084fc")("\u25C6"),Dt=v.hex("#2dd4bf")("\u25C6"),lt=v.red("\u25C6"),Lt=`${Z} `,jt=2;function Ut(r){return r<1e3?`${r}ms`:`${(r/1e3).toFixed(1)}s`}function Wt(r,t){return(e,o,s)=>{if(typeof e!="string")return r(e,o,s);let n=process.stdout.columns||120,i="";for(let a=0;a<e.length;a++){let c=e[a];t.lineStart&&(i+=Lt,t.col=jt,t.lineStart=!1),c===`
14
+ `)}`);return t}};K();import{writeFileSync as yt,readFileSync as Kt,existsSync as qt,mkdirSync as Ce}from"node:fs";import{join as It,dirname as Me}from"node:path";import A from"chalk";var Te="__WORKFLOW_GRAPH_LOG__",q=A.gray("\u2502"),ve=A.gray("\u250C"),Mt=A.gray("\u2514"),pt=A.green("\u25C6"),Dt=A.hex("#c084fc")("\u25C6"),Lt=A.hex("#2dd4bf")("\u25C6"),dt=A.red("\u25C6"),jt=`${q} `,Ut=2;function Wt(r){return r<1e3?`${r}ms`:`${(r/1e3).toFixed(1)}s`}function Ft(r,t){return(e,s,o)=>{if(typeof e!="string")return r(e,s,o);let n=process.stdout.columns||120,i="";for(let a=0;a<e.length;a++){let c=e[a];t.lineStart&&(i+=jt,t.col=Ut,t.lineStart=!1),c===`
15
15
  `?(i+=c,t.lineStart=!0,t.col=0,t.inEsc=!1):c==="\x1B"?(t.inEsc=!0,i+=c):t.inEsc?(i+=c,(c>="A"&&c<="Z"||c>="a"&&c<="z")&&(t.inEsc=!1)):(t.col++,i+=c,t.col>=n&&(i+=`
16
- ${Lt}`,t.col=jt))}return r(i,o,s)}}var ut=class{constructor(){this._currentNode=null,this._origStdoutWrite=null,this._origStderrWrite=null,this._emitWorkflowGraphMarkers=String(process.env.ZIBBY_EMIT_GRAPH_MARKERS||"").trim()==="1"||String(process.env.ZIBBY_WORKFLOW_GRAPH_LOG_MARKERS||"").trim()==="1"}get isInsideNode(){return this._currentNode!==null}_startIntercepting(){this._origStdoutWrite=process.stdout.write.bind(process.stdout),this._origStderrWrite=process.stderr.write.bind(process.stderr);let t={lineStart:!0,col:0,inEsc:!1},e={lineStart:!0,col:0,inEsc:!1};this._outState=t,this._errState=e,process.stdout.write=Wt(this._origStdoutWrite,t),process.stderr.write=Wt(this._origStderrWrite,e)}_stopIntercepting(){this._origStdoutWrite&&(this._outState&&!this._outState.lineStart&&this._origStdoutWrite(`
16
+ ${jt}`,t.col=Ut))}return r(i,s,o)}}var ht=class{constructor(){this._currentNode=null,this._origStdoutWrite=null,this._origStderrWrite=null,this._emitWorkflowGraphMarkers=String(process.env.ZIBBY_EMIT_GRAPH_MARKERS||"").trim()==="1"||String(process.env.ZIBBY_WORKFLOW_GRAPH_LOG_MARKERS||"").trim()==="1"}get isInsideNode(){return this._currentNode!==null}_startIntercepting(){this._origStdoutWrite=process.stdout.write.bind(process.stdout),this._origStderrWrite=process.stderr.write.bind(process.stderr);let t={lineStart:!0,col:0,inEsc:!1},e={lineStart:!0,col:0,inEsc:!1};this._outState=t,this._errState=e,process.stdout.write=Ft(this._origStdoutWrite,t),process.stderr.write=Ft(this._origStderrWrite,e)}_stopIntercepting(){this._origStdoutWrite&&(this._outState&&!this._outState.lineStart&&this._origStdoutWrite(`
17
17
  `),process.stdout.write=this._origStdoutWrite),this._origStderrWrite&&(this._errState&&!this._errState.lineStart&&this._origStderrWrite(`
18
18
  `),process.stderr.write=this._origStderrWrite),this._origStdoutWrite=null,this._origStderrWrite=null}_rawWrite(t){(this._origStdoutWrite||process.stdout.write.bind(process.stdout))(`${t}
19
- `)}_emitGraphLogMarker(t){if(!this._emitWorkflowGraphMarkers)return;let e=`${Ee}${JSON.stringify(t)}
19
+ `)}_emitGraphLogMarker(t){if(!this._emitWorkflowGraphMarkers)return;let e=`${Te}${JSON.stringify(t)}
20
20
  `;this._origStdoutWrite?this._origStdoutWrite(e):process.stdout.write(e)}_writeDot(t,e){this._origStdoutWrite?(this._outState&&!this._outState.lineStart&&(this._origStdoutWrite(`
21
21
  `),this._outState.lineStart=!0,this._outState.col=0),this._origStdoutWrite(`${t} ${e}
22
22
  `)):process.stdout.write.bind(process.stdout)(`${t} ${e}
23
- `)}step(t){this._origStdoutWrite?this._writeDot(ct,t):process.stdout.write.bind(process.stdout)(`${Z} ${ct} ${t}
24
- `)}stepInfo(t){this.step(t)}stepTool(t){this._origStdoutWrite?this._writeDot(Mt,t):process.stdout.write.bind(process.stdout)(`${Z} ${Mt} ${t}
25
- `)}stepMemory(t){let e=v.hex("#2dd4bf")(t);this._origStdoutWrite?this._writeDot(Dt,e):process.stdout.write.bind(process.stdout)(`${Z} ${Dt} ${e}
26
- `)}stepFail(t){this._origStdoutWrite?this._writeDot(lt,v.red(t)):process.stdout.write.bind(process.stdout)(`${Z} ${lt} ${v.red(t)}
27
- `)}nodeStart(t){this._currentNode=t,this._emitGraphLogMarker({phase:"node_begin",node:t}),this._rawWrite(`${be} ${t}`),this._startIntercepting()}nodeComplete(t,e={}){this._stopIntercepting();let{duration:o,details:s}=e;if(s)for(let i of s)this._rawWrite(`${ct} ${i}`);let n=o?v.dim(` ${Ut(o)}`):"";this._rawWrite(`${Bt} ${v.green("done")}${n}`),this._emitGraphLogMarker({phase:"node_end",node:t}),this._rawWrite("")}nodeFailed(t,e,o={}){this._stopIntercepting();let{duration:s}=o,n=s?v.dim(` ${Ut(s)}`):"";this._rawWrite(`${lt} ${v.red(e)}`),this._rawWrite(`${Bt} ${v.red("failed")}${n}`),this._emitGraphLogMarker({phase:"node_end",node:t}),this._rawWrite("")}route(t,e){this._rawWrite(v.dim(` ${t} \u2192 ${e}`)),this._rawWrite("")}graphComplete(){}},A=new ut;var st=".zibby/output",Ft="sessions",G=".session-info.json",Gt=".zibby-stop";var Ht=["CI_JOB_ID","GITHUB_RUN_ID","CIRCLE_WORKFLOW_ID","BUILD_ID"];var M=class{constructor(t){if(this.config=t,this.name=t.name,this.prompt=t.prompt,this.outputSchema=t.outputSchema,!this.outputSchema&&!t._isCustomCode)throw new Error(`Node '${this.name}' must define outputSchema (Zod schema). This defines the contract for what the node returns to state.`);this.isZodSchema=this.outputSchema&&typeof this.outputSchema._def<"u",this.parser=t.outputSchema&&!this.isZodSchema?new et(t.outputSchema):null,this.retries=t.retries||0,this.onComplete=t.onComplete,this.customExecute=t.execute}async execute(t,e){let o=()=>e&&typeof e.getAll=="function"?e.getAll():t,s=d=>e&&typeof e.get=="function"?e.get(d):t?.[d];if(typeof this.customExecute=="function"){I.debug(`[workflow] node '${this.name}': custom execute (skipping LLM)`);try{let d=await this.customExecute(t);return typeof d=="object"&&d!==null&&d.success===!1?{success:!1,error:d.error||"Node execution failed",raw:d.raw||null}:this.isZodSchema?(I.debug(`[workflow] node '${this.name}': validating output schema`),{success:!0,output:this.outputSchema.parse(d),raw:null}):{success:!0,output:d,raw:null}}catch(d){return I.error(`[workflow] node '${this.name}' failed: ${d.message}`),d.name==="ZodError"&&I.error(`Schema errors: ${JSON.stringify(d.issues||d.errors,null,2)}`),{success:!1,error:d.message,raw:null}}}let n=typeof this.prompt=="function"?this.prompt(o()):this.prompt,i=s("_skillHints");i&&(n=`${i}
23
+ `)}step(t){this._origStdoutWrite?this._writeDot(pt,t):process.stdout.write.bind(process.stdout)(`${q} ${pt} ${t}
24
+ `)}stepInfo(t){this.step(t)}stepTool(t){this._origStdoutWrite?this._writeDot(Dt,t):process.stdout.write.bind(process.stdout)(`${q} ${Dt} ${t}
25
+ `)}stepMemory(t){let e=A.hex("#2dd4bf")(t);this._origStdoutWrite?this._writeDot(Lt,e):process.stdout.write.bind(process.stdout)(`${q} ${Lt} ${e}
26
+ `)}stepFail(t){this._origStdoutWrite?this._writeDot(dt,A.red(t)):process.stdout.write.bind(process.stdout)(`${q} ${dt} ${A.red(t)}
27
+ `)}nodeStart(t){this._currentNode=t,this._emitGraphLogMarker({phase:"node_begin",node:t}),this._rawWrite(`${ve} ${t}`),this._startIntercepting()}nodeComplete(t,e={}){this._stopIntercepting();let{duration:s,details:o}=e;if(o)for(let i of o)this._rawWrite(`${pt} ${i}`);let n=s?A.dim(` ${Wt(s)}`):"";this._rawWrite(`${Mt} ${A.green("done")}${n}`),this._emitGraphLogMarker({phase:"node_end",node:t}),this._rawWrite("")}nodeFailed(t,e,s={}){this._stopIntercepting();let{duration:o}=s,n=o?A.dim(` ${Wt(o)}`):"";this._rawWrite(`${dt} ${A.red(e)}`),this._rawWrite(`${Mt} ${A.red("failed")}${n}`),this._emitGraphLogMarker({phase:"node_end",node:t}),this._rawWrite("")}route(t,e){this._rawWrite(A.dim(` ${t} \u2192 ${e}`)),this._rawWrite("")}graphComplete(){}},k=new ht;var nt=".zibby/output",Gt="sessions",Y=".session-info.json",Ht=".zibby-stop";var Jt=["CI_JOB_ID","GITHUB_RUN_ID","CIRCLE_WORKFLOW_ID","BUILD_ID"];var L=class{constructor(t){if(this.config=t,this.name=t.name,this.prompt=t.prompt,this.outputSchema=t.outputSchema,!this.outputSchema&&!t._isCustomCode)throw new Error(`Node '${this.name}' must define outputSchema (Zod schema). This defines the contract for what the node returns to state.`);this.isZodSchema=this.outputSchema&&typeof this.outputSchema._def<"u",this.parser=t.outputSchema&&!this.isZodSchema?new st(t.outputSchema):null,this.retries=t.retries||0,this.onComplete=t.onComplete,this.customExecute=t.execute}async execute(t,e){let s=()=>e&&typeof e.getAll=="function"?e.getAll():t,o=p=>e&&typeof e.get=="function"?e.get(p):t?.[p];if(typeof this.customExecute=="function"){w.debug(`[workflow] node '${this.name}': custom execute (skipping LLM)`);try{let p=await this.customExecute(t);return typeof p=="object"&&p!==null&&p.success===!1?{success:!1,error:p.error||"Node execution failed",raw:p.raw||null}:this.isZodSchema?(w.debug(`[workflow] node '${this.name}': validating output schema`),{success:!0,output:this.outputSchema.parse(p),raw:null}):{success:!0,output:p,raw:null}}catch(p){return w.error(`[workflow] node '${this.name}' failed: ${p.message}`),p.name==="ZodError"&&w.error(`Schema errors: ${JSON.stringify(p.issues||p.errors,null,2)}`),{success:!1,error:p.message,raw:null}}}let n=typeof this.prompt=="function"?this.prompt(s()):this.prompt,i=o("_skillHints");i&&(n=`${i}
28
28
 
29
- ${n}`);let a=o(),c=a.cwd||process.cwd(),l=a.sessionPath;try{if(l){let d=wt(l,G);if(Kt(d)){let m=JSON.parse(zt(d,"utf-8"));m.currentNode=this.name,St(d,JSON.stringify(m,null,2),"utf-8")}let g=wt(l,"..",G);if(Kt(g))try{let m=JSON.parse(zt(g,"utf-8"));m.currentNode=this.name,St(g,JSON.stringify(m,null,2),"utf-8")}catch{}}}catch(d){I.debug(`[workflow] could not update session info: ${d.message}`)}let p=null;for(let d=0;d<=this.retries;d++)try{I.debug(`[workflow] node '${this.name}' attempt ${d}`);let g=o().config||{},m=g.agents||{},y=this.config.agent??m[this.name]??null,w={state:o()};y&&(w.preferredAgent=y);let T={workspace:c,schema:this.isZodSchema?this.outputSchema:null,skills:this.config.skills||[],sessionPath:l,config:g,nodeName:this.name,timeout:this.config?.timeout||3e5},P=t?._coreInvokeAgent;P||(P=(await Promise.resolve().then(()=>(mt(),gt))).invokeAgent);let u=await P(n,w,T),f,b;if(typeof u=="string"?(f=u,b=null):u.structured?(f=u.raw||JSON.stringify(u.structured,null,2),b=u.structured):(f=u.raw||JSON.stringify(u,null,2),b=u.extracted||null),l)try{let h=wt(l,this.name,"raw_stream_output.txt");Ne(Re(h),{recursive:!0}),St(h,typeof f=="string"?f:JSON.stringify(f),"utf-8")}catch(h){I.debug(`[workflow] could not save raw output: ${h.message}`)}if(this.isZodSchema&&b){I.info(`[workflow] node '${this.name}': output validated: ${JSON.stringify(b,null,2)}`);let h=b;if(typeof this.onComplete=="function")try{h=await this.onComplete(o(),b)}catch(E){I.warn(`[workflow] onComplete hook failed: ${E.message}`)}return{success:!0,output:h,raw:f}}if(typeof this.onComplete=="function")try{return{success:!0,output:await this.onComplete(o(),{raw:f}),raw:f}}catch(h){throw new Error(`onComplete failed: ${h.message}`,{cause:h})}if(this.parser){let h=this.parser.parse(f);return I.info(`[workflow] node '${this.name}': parsed output: ${JSON.stringify(h,null,2)}`),A.step("Output parsed"),{success:!0,output:h,raw:f}}return{success:!0,output:f,raw:f}}catch(g){p=g,d<this.retries&&I.info(`[workflow] node '${this.name}' failed, retrying (${d+1}/${this.retries})\u2026`)}return{success:!1,error:p.message,raw:null}}},ot=class extends M{constructor(t){super({...t,_isCustomCode:!0}),this.condition=t.condition}async execute(t,e){let o=e&&typeof e.getAll=="function"?e.getAll():t;return{success:!0,output:{nextNode:this.condition(o)},raw:null}}};Y();Y();import{mkdirSync as Me,existsSync as z,statSync as Nr}from"node:fs";import{spawn as ee}from"node:child_process";import{join as K}from"node:path";import{pathToFileURL as De}from"node:url";import{AsyncLocalStorage as Ce}from"node:async_hooks";var _t=new Ce;function yt(){let r=_t.getStore();return r||Object.freeze({executionId:process.env.EXECUTION_ID||null,parentExecutionId:process.env.PARENT_EXECUTION_ID||null,depth:0,conversationId:process.env.ZIBBY_CONVERSATION_ID||null,dispatchMode:process.env.DISPATCH_MODE||null})}function qt(r,t){let e=_t.getStore()||yt(),o=Object.freeze({executionId:r.executionId,parentExecutionId:r.parentExecutionId??e.executionId??null,depth:(e.depth||0)+(r.executionId!==e.executionId?1:0),conversationId:r.conversationId!==void 0?r.conversationId:e.conversationId??null,dispatchMode:r.dispatchMode??null});return _t.run(o,t)}var It=new Map,Et=new Map,Vt=new Map;function Xt(r,t,e={}){if(!r||typeof r!="string")throw new Error("subgraph-registry.register: name required");if(typeof t!="function")throw new Error("subgraph-registry.register: factory must be a function");It.set(r,t),Et.set(r,"ready"),Vt.set(r,{...e,cachedAt:Date.now()})}function Qt(r,t){Et.set(r,"failed"),Vt.set(r,{error:t?.message||String(t),failedAt:Date.now()}),It.delete(r)}function te(r){return Et.get(r)==="ready"?It.get(r):null}var Le=process.env.ZIBBY_SUBGRAPH_CACHE_DIR||"/tmp/zibby/subgraphs";function je(){return Number(process.env.ZIBBY_SUBGRAPH_MAX_DEPTH||10)}function Ue(){return`node${(process.versions?.node||"").split(".")[0]||"unknown"}-${process.platform}-${process.arch}`}var k=class extends Error{constructor(t,e){super(`in-process sub-graph fallback: ${t}${e?` (${e})`:""}`),this.fallback=!0,this.reason=t,this.detail=e||null,this.name="SubgraphFallback"}};function We(){let r=(process.env.SUBGRAPH_INTERNAL_URL||"").replace(/\/$/,""),t=(process.env.PROGRESS_API_URL||"").replace(/\/executions\/?$/,""),e=r||t,o=process.env.PROJECT_ID,s=process.env.PROJECT_API_TOKEN;if(!e||!o||!s)throw new k("env","SUBGRAPH_INTERNAL_URL/PROGRESS_API_URL/PROJECT_ID/PROJECT_API_TOKEN missing");return{apiBase:e,projectId:o,authToken:s}}async function Fe({apiBase:r,authToken:t,body:e}){let o;try{o=await fetch(`${r}/internal/subgraph/begin`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(e)})}catch(n){throw new k("network",`begin fetch failed: ${n.message}`)}let s=null;try{s=await o.json()}catch{}if(!o.ok){if(o.status===404){let n=new Error(`Sub-graph child '${e.childWorkflowType}' not found in project`);throw n.code="SUBGRAPH_NOT_FOUND",n.status=404,n}if(o.status===429){let n=s?.quotaInfo||{},i=new Error(`Sub-graph blocked by quota (${n.used??"?"}/${n.limit??"?"} on ${n.planId||"plan"})`);throw i.code="SUBGRAPH_QUOTA_EXCEEDED",i.status=429,i.quotaInfo=n,i}if(o.status===400&&s?.validationErrors){let n=new Error(`Sub-graph rejected input: ${s?.error||s?.message||"validation failed"}`);throw n.code="SUBGRAPH_INVALID_INPUT",n.status=400,n.validationErrors=s.validationErrors,n.missing=s.missing,n}throw new k("begin-status",`begin returned ${o.status}`)}return s?.data||s}async function L({apiBase:r,authToken:t,payload:e}){try{let o=await fetch(`${r}/internal/subgraph/finalize`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(e)});o.ok||I.warn(`[in-process subgraph] finalize returned ${o.status} for ${e.childExecutionId}`)}catch(o){I.warn(`[in-process subgraph] finalize failed: ${o.message}`)}}async function Ge(r,t){let e=K(t,".ready"),o=K(t,"graph.mjs");if(z(e)&&z(o))return;Me(t,{recursive:!0});let s=K(t,".lock"),n=!1;try{let{openSync:i,closeSync:a}=await import("node:fs"),c=i(s,"wx");a(c),n=!0}catch(i){if(i.code!=="EEXIST")throw i}if(!n){let i=Date.now()+3e4;for(;Date.now()<i;){if(z(e)&&z(o))return;await new Promise(a=>setTimeout(a,100))}throw new k("bundle-extract-timeout","sibling extract did not complete within 30s")}try{await new Promise((c,l)=>{let p=ee("curl",["-fsSL",r],{stdio:["ignore","pipe","inherit"]}),d=ee("tar",["-xzf","-","-C",t],{stdio:["pipe","inherit","inherit"]});p.stdout.pipe(d.stdin);let g,m,y=()=>{if(g!==void 0&&m!==void 0){if(g!==0)return l(new Error(`curl exited ${g}`));if(m!==0)return l(new Error(`tar exited ${m}`));c()}};p.on("close",w=>{g=w,y()}),d.on("close",w=>{m=w,y()}),p.on("error",l),d.on("error",l)});let{writeFileSync:i,unlinkSync:a}=await import("node:fs");i(e,"");try{a(s)}catch{}}catch(i){try{let{unlinkSync:a}=await import("node:fs");a(s)}catch{}throw new k("bundle-extract-failed",i.message)}}async function He(r){let t=K(r,"graph.mjs");if(!z(t))throw new k("entry-missing",`graph.mjs missing under ${r}`);let e;try{e=await import(De(t).href)}catch(s){throw new k("import-failed",`${s?.code||s?.name||"unknown"}: ${s.message}`)}let o=e.default||Object.values(e).find(s=>typeof s=="function"&&s.prototype?.buildGraph);if(!o)throw new k("entry-class-missing","no buildGraph() class export found");return o}async function re(r,t={}){if(!r||typeof r!="string")throw new Error("runInProcessSubgraph: workflowName (string) is required");let e=yt(),o=je();if((e.depth||0)>=o)throw new k("depth-exceeded",`depth ${e.depth} \u2265 MAX_DEPTH ${o}`);let s;try{s=We()}catch(h){throw h}I.debug(`[in-process subgraph] begin '${r}' parent=${e.executionId||"<root>"}`);let n=await Fe({apiBase:s.apiBase,authToken:s.authToken,body:{parentExecutionId:e.executionId,childWorkflowType:r,input:t.input||{},...t.conversationId?{conversationId:t.conversationId}:{}}}),{childExecutionId:i,runtimeTag:a,bundlePresignedUrl:c,sourcesPresignedUrl:l,workflowVersion:p,workflowUuid:d,bundleReady:g}=n,m=Ue();if(a&&a!==m)throw await L({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:i,status:"canceled",error:{message:`runtimeTag mismatch: parent=${m} child=${a}`,code:"RUNTIME_MISMATCH"}}}),new k("runtime-mismatch",`${m} vs ${a}`);if(!g||!c)throw await L({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:i,status:"canceled",error:{message:"bundle not ready for in-process; falling back to HTTP",code:"NO_BUNDLE"}}}),new k("no-bundle","workflow bundle not built yet");let y=te(r);if(!y){let h=K(Le,`${d}@${p||"0"}`);try{await Ge(c,h)}catch(E){throw E.fallback&&await L({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:i,status:"failed",error:{message:E.message,code:E.reason}}}),E}try{y=await He(h),Xt(r,y,{workflowUuid:d,version:p,runtimeTag:a,cacheDir:h})}catch(E){throw Qt(r,E),await L({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:i,status:"failed",error:{message:E.message,code:E.reason||"IMPORT_FAILED"}}}),E.fallback?E:new k("import-failed",E.message)}}let w=Date.now(),P=await(typeof y=="function"&&y.prototype?.buildGraph?new y:y).buildGraph(),u={...t.input||{}},f,b;try{f=await qt({executionId:i,parentExecutionId:e.executionId,conversationId:t.conversationId!==void 0?t.conversationId:e.conversationId,dispatchMode:"inprocess"},()=>P.run(t.parentAgent,u,{signal:t.signal})),b=f&&typeof f=="object"&&"state"in f?f.state:f}catch(h){throw await L({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:i,status:"failed",error:{message:h.message,code:h.code||"CHILD_THREW",stack:h.stack},durationMs:Date.now()-w}}),h}if(f&&typeof f=="object"&&f.stoppedExternally){await L({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:i,status:"canceled",finalState:b,durationMs:Date.now()-w}});let h=new Error(`Sub-graph '${r}' canceled by parent abort`);throw h.code="SUBGRAPH_CANCELED",h.subgraphJobId=i,h}return await L({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:i,status:"completed",finalState:b,durationMs:Date.now()-w}}),{finalState:b,executionId:i}}var Je=2e3,Ye=600*1e3,Ze=new Set(["completed","failed","canceled","timeout"]);function ze(){let r=process.env.PROGRESS_API_URL;if(!r)throw new Error("Sub-graph dispatch requires PROGRESS_API_URL env var (set automatically on cloud runs). Sub-graphs are not supported in local in-process runs yet \u2014 deploy the parent and child to cloud.");return r.replace(/\/executions\/?$/,"")}function Ke(){let r=process.env.PROJECT_ID;if(!r)throw new Error("Sub-graph dispatch requires PROJECT_ID env var.");return r}function qe(){let r=process.env.PROJECT_API_TOKEN;if(!r)throw new Error("Sub-graph dispatch requires PROJECT_API_TOKEN env var.");return r}function Ve(){return process.env.EXECUTION_ID||null}function se(r,t){return t==null?r:typeof t=="function"?t(r):typeof t=="string"?t.split(".").reduce((e,o)=>e==null?e:e[o],r):r}async function oe(r,t={}){if(!r||typeof r!="string")throw new Error("dispatchSubgraph: workflowName (string) is required");if(process.env.ZIBBY_INPROCESS_SUBGRAPH!=="0"&&!t.async)try{I.debug(`[sub-graph] trying in-process for '${r}'`);let{finalState:u}=await re(r,{input:t.input,conversationId:t.conversationId,signal:t.signal,parentAgent:t.parentAgent}),f=se(u,t.output);return I.info(`[sub-graph] '${r}' completed in-process`),f}catch(u){if(u instanceof k||u?.fallback)I.info(`[sub-graph] in-process fallback for '${r}': ${u.reason||"unknown"} \u2014 using HTTP`);else throw u}let e=ze(),o=Ke(),s=qe(),n=Ve(),i=`${e}/projects/${encodeURIComponent(o)}/workflows/${encodeURIComponent(r)}/trigger`,a={input:t.input||{},...n?{parentExecutionId:n}:{},...t.conversationId?{conversationId:t.conversationId}:{}};I.info(`[sub-graph] dispatching '${r}' (${t.async?"async":"sync"}) from parent ${n||"<none>"}`);let c=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${s}`},body:JSON.stringify(a)});if(!c.ok){let u=null,f="";try{u=await c.json(),f=u?.error||u?.message||JSON.stringify(u)}catch{f=await c.text().catch(()=>"")}if(c.status===429){let h=u?.quotaInfo||{},E=new Error(`Sub-graph '${r}' blocked by execution quota (${h.used??"?"}/${h.limit??"?"} on plan ${h.planId||"unknown"}). Sub-workflow runs count toward the same monthly cap as user-triggered runs.`);throw E.code="SUBGRAPH_QUOTA_EXCEEDED",E.status=429,E.subgraph=r,E.quotaInfo=h,E}if(c.status===400){let h=new Error(`Sub-graph '${r}' rejected input: ${f}`);throw h.code="SUBGRAPH_INVALID_INPUT",h.status=400,h.subgraph=r,h.validationErrors=u?.validationErrors||null,h.missing=u?.missing||null,h}let b=new Error(`Sub-graph '${r}' trigger rejected (${c.status}): ${f}`);throw b.code="SUBGRAPH_TRIGGER_FAILED",b.status=c.status,b.subgraph=r,b}let l=await c.json(),p=l?.data?.jobId||l?.jobId;if(!p)throw new Error(`Sub-graph '${r}' trigger returned no jobId: ${JSON.stringify(l).slice(0,200)}`);if(t.async)return I.info(`[sub-graph] async dispatch of '${r}' \u2192 jobId=${p} (not waiting)`),{jobId:p,status:"accepted",workflow:r};let d=Number.isFinite(t.timeoutMs)?t.timeoutMs:Ye,g=Number.isFinite(t.pollIntervalMs)?t.pollIntervalMs:Je,m=`${e}/executions/${encodeURIComponent(p)}`,y=Date.now()+d,w="accepted",T=0;for(;Date.now()<y;){await new Promise(h=>setTimeout(h,g)),T+=1;let u=await fetch(m,{headers:{Authorization:`Bearer ${s}`}});if(!u.ok){if(u.status>=500){I.warn(`[sub-graph] status poll for ${p} returned ${u.status}, will retry`);continue}throw new Error(`Sub-graph status poll failed for ${p}: ${u.status}`)}let f=await u.json(),b=f?.data||f?.execution||f;if(w=b?.status||w,Ze.has(w)){if(w!=="completed"){let U=new Error(`Sub-graph '${r}' (${p}) ended in status '${w}'`);throw U.subgraphJobId=p,U.subgraphStatus=w,U}let h=b?.finalState||b?.state||{},E=se(h,t.output);return I.info(`[sub-graph] '${r}' (${p}) completed after ${T} polls`),E}}let P=new Error(`Sub-graph '${r}' (${p}) timed out after ${Math.round(d/1e3)}s (last status: ${w})`);throw P.subgraphJobId=p,P.subgraphStatus=w,P}import{existsSync as ne,readFileSync as Xe}from"node:fs";import{join as bt,dirname as ie}from"node:path";var nt=class{static async loadContext(t,e,o={}){let s={},n=o.filenames||["CONTEXT.md","AGENTS.md"];if(t){let a=ie(bt(e,t));for(let c of n){let l=await this.findAndMergeContextFiles(c,a,e);if(l){let p=c.replace(/\.[^.]+$/,"").toLowerCase();s[p]=l}}}let i=o.discovery||{};for(let[a,c]of Object.entries(i))try{let l=bt(e,c);ne(l)&&(s[a]=await this.loadFile(l))}catch(l){console.warn(`[workflow] could not load context '${a}' from '${c}': ${l.message}`)}return s}static async findAndMergeContextFiles(t,e,o){let s=[],n=e;for(;n.startsWith(o);){let i=bt(n,t);if(ne(i))try{s.unshift(await this.loadFile(i))}catch(c){console.warn(`[workflow] could not load ${t} from ${i}: ${c.message}`)}let a=ie(n);if(a===n)break;n=a}return s.length===0?null:s.every(i=>typeof i=="string")?s.join(`
29
+ ${n}`);let a=s(),c=a.cwd||process.cwd(),l=a.sessionPath;try{if(l){let p=It(l,Y);if(qt(p)){let m=JSON.parse(Kt(p,"utf-8"));m.currentNode=this.name,yt(p,JSON.stringify(m,null,2),"utf-8")}let h=It(l,"..",Y);if(qt(h))try{let m=JSON.parse(Kt(h,"utf-8"));m.currentNode=this.name,yt(h,JSON.stringify(m,null,2),"utf-8")}catch{}}}catch(p){w.debug(`[workflow] could not update session info: ${p.message}`)}let u=null;for(let p=0;p<=this.retries;p++)try{w.debug(`[workflow] node '${this.name}' attempt ${p}`);let h=s().config||{},m=h.agents||{},I=this.config.agent??m[this.name]??null,b={state:s()};I&&(b.preferredAgent=I);let $={workspace:c,schema:this.isZodSchema?this.outputSchema:null,skills:this.config.skills||[],sessionPath:l,config:h,nodeName:this.name,timeout:this.config?.timeout||3e5},T=t?._coreInvokeAgent;T||(T=(await Promise.resolve().then(()=>(_t(),wt))).invokeAgent);let d=await T(n,b,$),y,f;if(typeof d=="string"?(y=d,f=null):d.structured?(y=d.raw||JSON.stringify(d.structured,null,2),f=d.structured):(y=d.raw||JSON.stringify(d,null,2),f=d.extracted||null),l)try{let g=It(l,this.name,"raw_stream_output.txt");Ce(Me(g),{recursive:!0}),yt(g,typeof y=="string"?y:JSON.stringify(y),"utf-8")}catch(g){w.debug(`[workflow] could not save raw output: ${g.message}`)}if(this.isZodSchema&&f){w.info(`[workflow] node '${this.name}': output validated: ${JSON.stringify(f,null,2)}`);let g=f;if(typeof this.onComplete=="function")try{g=await this.onComplete(s(),f)}catch(B){w.warn(`[workflow] onComplete hook failed: ${B.message}`)}return{success:!0,output:g,raw:y}}if(typeof this.onComplete=="function")try{return{success:!0,output:await this.onComplete(s(),{raw:y}),raw:y}}catch(g){throw new Error(`onComplete failed: ${g.message}`,{cause:g})}if(this.parser){let g=this.parser.parse(y);return w.info(`[workflow] node '${this.name}': parsed output: ${JSON.stringify(g,null,2)}`),k.step("Output parsed"),{success:!0,output:g,raw:y}}return{success:!0,output:y,raw:y}}catch(h){u=h,p<this.retries&&w.info(`[workflow] node '${this.name}' failed, retrying (${p+1}/${this.retries})\u2026`)}return{success:!1,error:u.message,raw:null}}},it=class extends L{constructor(t){super({...t,_isCustomCode:!0}),this.condition=t.condition}async execute(t,e){let s=e&&typeof e.getAll=="function"?e.getAll():t;return{success:!0,output:{nextNode:this.condition(s)},raw:null}}};K();K();import{mkdirSync as je,existsSync as F,statSync as se,readdirSync as oe,rmSync as Ue}from"node:fs";import{spawn as re}from"node:child_process";import{join as j}from"node:path";import{pathToFileURL as We}from"node:url";import{AsyncLocalStorage as De}from"node:async_hooks";var Et=new De;function V(){let r=Et.getStore();return r||Object.freeze({executionId:process.env.EXECUTION_ID||null,parentExecutionId:process.env.PARENT_EXECUTION_ID||null,depth:0,conversationId:process.env.ZIBBY_CONVERSATION_ID||null,dispatchMode:process.env.DISPATCH_MODE||null})}function Vt(r,t){let e=Et.getStore()||V(),s=Object.freeze({executionId:r.executionId,parentExecutionId:r.parentExecutionId??e.executionId??null,depth:(e.depth||0)+(r.executionId!==e.executionId?1:0),conversationId:r.conversationId!==void 0?r.conversationId:e.conversationId??null,dispatchMode:r.dispatchMode??null});return Et.run(s,t)}var bt=new Map,$t=new Map,Xt=new Map;function Qt(r,t,e={}){if(!r||typeof r!="string")throw new Error("subgraph-registry.register: name required");if(typeof t!="function")throw new Error("subgraph-registry.register: factory must be a function");bt.set(r,t),$t.set(r,"ready"),Xt.set(r,{...e,cachedAt:Date.now()})}function te(r,t){$t.set(r,"failed"),Xt.set(r,{error:t?.message||String(t),failedAt:Date.now()}),bt.delete(r)}function ee(r){return $t.get(r)==="ready"?bt.get(r):null}var at=process.env.ZIBBY_SUBGRAPH_CACHE_DIR||"/tmp/zibby/subgraphs";function Fe(){return`node${(process.versions?.node||"").split(".")[0]||"unknown"}-${process.platform}-${process.arch}`}var x=class extends Error{constructor(t,e){super(`in-process sub-graph fallback: ${t}${e?` (${e})`:""}`),this.fallback=!0,this.reason=t,this.detail=e||null,this.name="SubgraphFallback"}};function Ge(){let r=(process.env.SUBGRAPH_INTERNAL_URL||"").replace(/\/$/,""),t=(process.env.PROGRESS_API_URL||"").replace(/\/executions\/?$/,""),e=r||t,s=process.env.PROJECT_ID,o=process.env.PROJECT_API_TOKEN;if(!e||!s||!o)throw new x("env","SUBGRAPH_INTERNAL_URL/PROGRESS_API_URL/PROJECT_ID/PROJECT_API_TOKEN missing");return{apiBase:e,projectId:s,authToken:o}}async function He({apiBase:r,authToken:t,body:e}){let s;try{s=await fetch(`${r}/internal/subgraph/begin`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(e)})}catch(n){throw new x("network",`begin fetch failed: ${n.message}`)}let o=null;try{o=await s.json()}catch{}if(!s.ok){if(s.status===404){let n=new Error(`Sub-graph child '${e.childWorkflowType}' not found in project`);throw n.code="SUBGRAPH_NOT_FOUND",n.status=404,n}if(s.status===429){let n=o?.quotaInfo||{},i=new Error(`Sub-graph blocked by quota (${n.used??"?"}/${n.limit??"?"} on ${n.planId||"plan"})`);throw i.code="SUBGRAPH_QUOTA_EXCEEDED",i.status=429,i.quotaInfo=n,i}if(s.status===400&&o?.validationErrors){let n=new Error(`Sub-graph rejected input: ${o?.error||o?.message||"validation failed"}`);throw n.code="SUBGRAPH_INVALID_INPUT",n.status=400,n.validationErrors=o.validationErrors,n.missing=o.missing,n}throw new x("begin-status",`begin returned ${s.status}`)}return o?.data||o}async function W({apiBase:r,authToken:t,payload:e}){try{let s=await fetch(`${r}/internal/subgraph/finalize`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(e)});s.ok||w.warn(`[in-process subgraph] finalize returned ${s.status} for ${e.childExecutionId}`)}catch(s){w.warn(`[in-process subgraph] finalize failed: ${s.message}`)}}async function Je(r,t){let e=j(t,".ready"),s=j(t,"graph.mjs");if(F(e)&&F(s))return;je(t,{recursive:!0});let o=j(t,".lock"),n=!1;try{let{openSync:i,closeSync:a}=await import("node:fs"),c=i(o,"wx");a(c),n=!0}catch(i){if(i.code!=="EEXIST")throw i}if(!n){let i=Date.now()+3e4;for(;Date.now()<i;){if(F(e)&&F(s))return;await new Promise(a=>setTimeout(a,100))}throw new x("bundle-extract-timeout","sibling extract did not complete within 30s")}try{await new Promise((c,l)=>{let u=re("curl",["-fsSL",r],{stdio:["ignore","pipe","inherit"]}),p=re("tar",["-xzf","-","-C",t],{stdio:["pipe","inherit","inherit"]});u.stdout.pipe(p.stdin);let h,m,I=()=>{if(h!==void 0&&m!==void 0){if(h!==0)return l(new Error(`curl exited ${h}`));if(m!==0)return l(new Error(`tar exited ${m}`));c()}};u.on("close",b=>{h=b,I()}),p.on("close",b=>{m=b,I()}),u.on("error",l),p.on("error",l)});let{writeFileSync:i,unlinkSync:a}=await import("node:fs");i(e,"");try{a(o)}catch{}}catch(i){try{let{unlinkSync:a}=await import("node:fs");a(o)}catch{}throw new x("bundle-extract-failed",i.message)}}async function Ye(r){let t=j(r,"graph.mjs");if(!F(t))throw new x("entry-missing",`graph.mjs missing under ${r}`);let e;try{e=await import(We(t).href)}catch(o){throw new x("import-failed",`${o?.code||o?.name||"unknown"}: ${o.message}`)}let s=e.default||Object.values(e).find(o=>typeof o=="function"&&o.prototype?.buildGraph);if(!s)throw new x("entry-class-missing","no buildGraph() class export found");return s}async function ne(r,t={}){if(!r||typeof r!="string")throw new Error("runInProcessSubgraph: workflowName (string) is required");let e=V(),s;try{s=Ge()}catch(f){throw f}w.debug(`[in-process subgraph] begin '${r}' parent=${e.executionId||"<root>"}`);let o=await He({apiBase:s.apiBase,authToken:s.authToken,body:{parentExecutionId:e.executionId,childWorkflowType:r,input:t.input||{},...t.conversationId?{conversationId:t.conversationId}:{}}}),{childExecutionId:n,runtimeTag:i,bundlePresignedUrl:a,sourcesPresignedUrl:c,workflowVersion:l,workflowUuid:u,bundleReady:p}=o,h=Fe();if(i&&i!==h)throw await W({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:n,status:"canceled",error:{message:`runtimeTag mismatch: parent=${h} child=${i}`,code:"RUNTIME_MISMATCH"}}}),new x("runtime-mismatch",`${h} vs ${i}`);if(!p||!a)throw await W({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:n,status:"canceled",error:{message:"bundle not ready for in-process; falling back to HTTP",code:"NO_BUNDLE"}}}),new x("no-bundle","workflow bundle not built yet");let m=ee(r);if(!m){let f=j(at,`${u}@${l||"0"}`);try{await Je(a,f);try{ze()}catch{}}catch(g){throw g.fallback&&await W({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:n,status:"failed",error:{message:g.message,code:g.reason}}}),g}try{m=await Ye(f),Qt(r,m,{workflowUuid:u,version:l,runtimeTag:i,cacheDir:f})}catch(g){throw te(r,g),await W({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:n,status:"failed",error:{message:g.message,code:g.reason||"IMPORT_FAILED"}}}),g.fallback?g:new x("import-failed",g.message)}}let I=Date.now(),$=await(typeof m=="function"&&m.prototype?.buildGraph?new m:m).buildGraph(),T={...t.input||{}},d,y;try{d=await Vt({executionId:n,parentExecutionId:e.executionId,conversationId:t.conversationId!==void 0?t.conversationId:e.conversationId,dispatchMode:"inprocess"},()=>$.run(t.parentAgent,T,{signal:t.signal})),y=d&&typeof d=="object"&&"state"in d?d.state:d}catch(f){throw await W({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:n,status:"failed",error:{message:f.message,code:f.code||"CHILD_THREW",stack:f.stack},durationMs:Date.now()-I}}),f}if(d&&typeof d=="object"&&d.stoppedExternally){await W({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:n,status:"canceled",finalState:y,durationMs:Date.now()-I}});let f=new Error(`Sub-graph '${r}' canceled by parent abort`);throw f.code="SUBGRAPH_CANCELED",f.subgraphJobId=n,f}return await W({apiBase:s.apiBase,authToken:s.authToken,payload:{childExecutionId:n,status:"completed",finalState:y,durationMs:Date.now()-I}}),{finalState:y,executionId:n}}function Ze(r){let t=0,e=[r];for(;e.length;){let s=e.pop(),o;try{o=se(s)}catch{continue}if(o.isDirectory()){let n;try{n=oe(s)}catch{continue}for(let i of n)e.push(j(s,i))}else t+=o.size}return t}function ze({cap:r=Number(process.env.ZIBBY_SUBGRAPH_CACHE_CAP_BYTES||2*1024*1024*1024)}={}){try{if(!F(at))return{evicted:0,freedBytes:0};let t=oe(at),e=[],s=0;for(let a of t){let c=j(at,a),l;try{l=se(c)}catch{continue}let u=l.isDirectory()?Ze(c):l.size;s+=u,e.push({name:a,full:c,size:u,mtimeMs:l.mtimeMs})}if(s<=r)return{evicted:0,freedBytes:0,totalBytes:s};e.sort((a,c)=>a.mtimeMs-c.mtimeMs);let o=Math.floor(r*.7),n=0,i=0;for(let a of e){if(s-n<=o)break;if(!F(j(a.full,".lock")))try{Ue(a.full,{recursive:!0,force:!0}),n+=a.size,i+=1}catch(c){w.debug(`[sub-graph cache] evict skip ${a.name}: ${c.message}`)}}return i>0&&w.info(`[sub-graph cache] evicted ${i} entr(y/ies), freed ${(n/1024/1024).toFixed(1)}MB`),{evicted:i,freedBytes:n,totalBytes:s-n}}catch(t){return w.debug(`[sub-graph cache] evict failed: ${t.message}`),{evicted:0,freedBytes:0}}}var Ke=2e3,qe=600*1e3,Ve=new Set(["completed","failed","canceled","timeout"]);function Xe(){let r=process.env.PROGRESS_API_URL;if(!r)throw new Error("Sub-graph dispatch requires PROGRESS_API_URL env var (set automatically on cloud runs). Sub-graphs are not supported in local in-process runs yet \u2014 deploy the parent and child to cloud.");return r.replace(/\/executions\/?$/,"")}function Qe(){let r=process.env.PROJECT_ID;if(!r)throw new Error("Sub-graph dispatch requires PROJECT_ID env var.");return r}function tr(){let r=process.env.PROJECT_API_TOKEN;if(!r)throw new Error("Sub-graph dispatch requires PROJECT_API_TOKEN env var.");return r}function er(){return process.env.EXECUTION_ID||null}function ie(r,t){return t==null?r:typeof t=="function"?t(r):typeof t=="string"?t.split(".").reduce((e,s)=>e==null?e:e[s],r):r}async function ae(r,t={}){if(!r||typeof r!="string")throw new Error("dispatchSubgraph: workflowName (string) is required");let e=V(),s=Number(process.env.ZIBBY_SUBGRAPH_MAX_DEPTH||10);if((e.depth||0)>=s)throw new Error(`dispatchSubgraph('${r}'): sub-graph depth ${e.depth} reached cap of ${s}. Restructure the graph or raise ZIBBY_SUBGRAPH_MAX_DEPTH.`);if(process.env.ZIBBY_INPROCESS_SUBGRAPH!=="0"&&!t.async)try{w.debug(`[sub-graph] trying in-process for '${r}'`);let{finalState:f}=await ne(r,{input:t.input,conversationId:t.conversationId,signal:t.signal,parentAgent:t.parentAgent}),g=ie(f,t.output);return w.info(`[sub-graph] '${r}' completed in-process`),g}catch(f){if(f instanceof x||f?.fallback)w.info(`[sub-graph] in-process fallback for '${r}': ${f.reason||"unknown"} \u2014 using HTTP`);else throw f}let o=Xe(),n=Qe(),i=tr(),a=er(),c=`${o}/projects/${encodeURIComponent(n)}/workflows/${encodeURIComponent(r)}/trigger`,l={input:t.input||{},...a?{parentExecutionId:a}:{},...t.conversationId?{conversationId:t.conversationId}:{}};w.info(`[sub-graph] dispatching '${r}' (${t.async?"async":"sync"}) from parent ${a||"<none>"}`);let u=await fetch(c,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(l)});if(!u.ok){let f=null,g="";try{f=await u.json(),g=f?.error||f?.message||JSON.stringify(f)}catch{g=await u.text().catch(()=>"")}if(u.status===429){let v=f?.quotaInfo||{},M=new Error(`Sub-graph '${r}' blocked by execution quota (${v.used??"?"}/${v.limit??"?"} on plan ${v.planId||"unknown"}). Sub-workflow runs count toward the same monthly cap as user-triggered runs.`);throw M.code="SUBGRAPH_QUOTA_EXCEEDED",M.status=429,M.subgraph=r,M.quotaInfo=v,M}if(u.status===400){let v=new Error(`Sub-graph '${r}' rejected input: ${g}`);throw v.code="SUBGRAPH_INVALID_INPUT",v.status=400,v.subgraph=r,v.validationErrors=f?.validationErrors||null,v.missing=f?.missing||null,v}let B=new Error(`Sub-graph '${r}' trigger rejected (${u.status}): ${g}`);throw B.code="SUBGRAPH_TRIGGER_FAILED",B.status=u.status,B.subgraph=r,B}let p=await u.json(),h=p?.data?.jobId||p?.jobId;if(!h)throw new Error(`Sub-graph '${r}' trigger returned no jobId: ${JSON.stringify(p).slice(0,200)}`);if(t.async)return w.info(`[sub-graph] async dispatch of '${r}' \u2192 jobId=${h} (not waiting)`),{jobId:h,status:"accepted",workflow:r};let m=Number.isFinite(t.timeoutMs)?t.timeoutMs:qe,I=Number.isFinite(t.pollIntervalMs)?t.pollIntervalMs:Ke,b=`${o}/executions/${encodeURIComponent(h)}`,$=Date.now()+m,T="accepted",d=0;for(;Date.now()<$;){await new Promise(v=>setTimeout(v,I)),d+=1;let f=await fetch(b,{headers:{Authorization:`Bearer ${i}`}});if(!f.ok){if(f.status>=500){w.warn(`[sub-graph] status poll for ${h} returned ${f.status}, will retry`);continue}throw new Error(`Sub-graph status poll failed for ${h}: ${f.status}`)}let g=await f.json(),B=g?.data||g?.execution||g;if(T=B?.status||T,Ve.has(T)){if(T!=="completed"){let S=new Error(`Sub-graph '${r}' (${h}) ended in status '${T}'`);throw S.subgraphJobId=h,S.subgraphStatus=T,S}let v=B?.finalState||B?.state||{},M=ie(v,t.output);return w.info(`[sub-graph] '${r}' (${h}) completed after ${d} polls`),M}}let y=new Error(`Sub-graph '${r}' (${h}) timed out after ${Math.round(m/1e3)}s (last status: ${T})`);throw y.subgraphJobId=h,y.subgraphStatus=T,y}import{existsSync as ce,readFileSync as rr}from"node:fs";import{join as Tt,dirname as le}from"node:path";var ct=class{static async loadContext(t,e,s={}){let o={},n=s.filenames||["CONTEXT.md","AGENTS.md"];if(t){let a=le(Tt(e,t));for(let c of n){let l=await this.findAndMergeContextFiles(c,a,e);if(l){let u=c.replace(/\.[^.]+$/,"").toLowerCase();o[u]=l}}}let i=s.discovery||{};for(let[a,c]of Object.entries(i))try{let l=Tt(e,c);ce(l)&&(o[a]=await this.loadFile(l))}catch(l){console.warn(`[workflow] could not load context '${a}' from '${c}': ${l.message}`)}return o}static async findAndMergeContextFiles(t,e,s){let o=[],n=e;for(;n.startsWith(s);){let i=Tt(n,t);if(ce(i))try{o.unshift(await this.loadFile(i))}catch(c){console.warn(`[workflow] could not load ${t} from ${i}: ${c.message}`)}let a=le(n);if(a===n)break;n=a}return o.length===0?null:o.every(i=>typeof i=="string")?o.join(`
30
30
 
31
31
  ---
32
32
 
33
- `):s.every(i=>typeof i=="object")?Object.assign({},...s):s[s.length-1]}static async loadFile(t){let e=Xe(t,"utf-8");if(t.endsWith(".json"))return JSON.parse(e);if(t.endsWith(".js")||t.endsWith(".mjs")){let{pathToFileURL:o}=await import("url"),s=await import(o(t).href);return s.default||s}return e}};import{mkdirSync as ue,existsSync as $t,writeFileSync as ae,unlinkSync as Qe}from"node:fs";import{join as j,resolve as pe}from"node:path";import{config as tr}from"dotenv";import{zodToJsonSchema as ce}from"zod-to-json-schema";import er from"handlebars";function rr({traceFrom:r,sessionId:t,sessionPath:e,idSource:o,mkdirFresh:s}){if(!(process.env.ZIBBY_SESSION_LOG==="1"||process.env.ZIBBY_SESSION_LOG==="true"))return;let i=typeof process.ppid=="number"?process.ppid:"n/a",a=`[zibby:session] from=${r} pid=${process.pid} ppid=${i} sessionId=${t} source=${o} mkdir=${s?"yes":"no"} path=${e}`;if(console.log(a),process.env.ZIBBY_TRACE_SESSION==="1"||process.env.ZIBBY_TRACE_SESSION==="true"){let p=(new Error("session trace").stack||"").split(`
33
+ `):o.every(i=>typeof i=="object")?Object.assign({},...o):o[o.length-1]}static async loadFile(t){let e=rr(t,"utf-8");if(t.endsWith(".json"))return JSON.parse(e);if(t.endsWith(".js")||t.endsWith(".mjs")){let{pathToFileURL:s}=await import("url"),o=await import(s(t).href);return o.default||o}return e}};import{mkdirSync as he,existsSync as vt,writeFileSync as ue,unlinkSync as sr}from"node:fs";import{join as G,resolve as fe}from"node:path";import{config as or}from"dotenv";import{zodToJsonSchema as pe}from"zod-to-json-schema";import nr from"handlebars";function ir({traceFrom:r,sessionId:t,sessionPath:e,idSource:s,mkdirFresh:o}){if(!(process.env.ZIBBY_SESSION_LOG==="1"||process.env.ZIBBY_SESSION_LOG==="true"))return;let i=typeof process.ppid=="number"?process.ppid:"n/a",a=`[zibby:session] from=${r} pid=${process.pid} ppid=${i} sessionId=${t} source=${s} mkdir=${o?"yes":"no"} path=${e}`;if(console.log(a),process.env.ZIBBY_TRACE_SESSION==="1"||process.env.ZIBBY_TRACE_SESSION==="true"){let u=(new Error("session trace").stack||"").split(`
34
34
  `).slice(2,14).join(`
35
35
  `);console.log(`[zibby:session] stack (${r}):
36
- ${p}`)}}function sr(){return process.env.ZIBBY_TRUST_SESSION_ENV==="1"||process.env.ZIBBY_TRUST_SESSION_ENV==="true"||process.env.ZIBBY_KEEP_SESSION_ENV==="1"||process.env.ZIBBY_KEEP_SESSION_ENV==="true"}function or(){if(!(process.env.ZIBBY_PIN_SESSION_PATH==="1"||process.env.ZIBBY_PIN_SESSION_PATH==="true"))return;let t=process.env.ZIBBY_SESSION_PATH;if(!(t==null||String(t).trim()===""))try{return pe(String(t).trim())}catch{return String(t).trim()}}function nr(){sr()||(delete process.env.ZIBBY_SESSION_PATH,delete process.env.ZIBBY_SESSION_ID)}function ir({sessionPath:r,sessionId:t}){r&&typeof r=="string"&&(process.env.ZIBBY_SESSION_PATH=r),t!=null&&String(t).trim()!==""&&(process.env.ZIBBY_SESSION_ID=String(t).trim())}function ar(r={}){let t=Ht.map(n=>process.env[n]).find(Boolean),e=Math.random().toString(36).slice(2,6),o=t||`${Date.now()}_${e}`,s=r.paths?.sessionPrefix;return s?`${s}_${o}`:o}function cr({cwd:r=process.cwd(),config:t={},initialState:e={},traceFrom:o="resolveWorkflowSession"}={}){let s=e.sessionPath,n=e.sessionTimestamp,i="initialState.sessionPath";if(!s&&process.env.ZIBBY_SESSION_PATH)try{let l=pe(String(process.env.ZIBBY_SESSION_PATH));l&&(s=l,i="ZIBBY_SESSION_PATH")}catch{}let a;if(s)a=String(s).split(/[/\\]/).filter(Boolean).pop(),n==null&&(n=Date.now());else{let l=process.env.ZIBBY_SESSION_ID&&String(process.env.ZIBBY_SESSION_ID).trim();if(l)a=l,i="ZIBBY_SESSION_ID";else{let d=t.sessionId!=null?String(t.sessionId).trim():"";d&&d!=="last"?(a=d,i="config.sessionId"):(a=ar(t),i="generated")}n=n??Date.now();let p=t.paths?.output||st;s=j(r,p,Ft,a)}let c=!$t(s);return c&&ue(s,{recursive:!0}),(c||i!=="initialState.sessionPath")&&rr({traceFrom:o,sessionId:a,sessionPath:s,idSource:i,mkdirFresh:c}),ir({sessionPath:s,sessionId:a}),{sessionPath:s,sessionId:a,sessionTimestamp:n}}var le=class{constructor(t={}){this.nodes=new Map,this.edges=new Map,this.entryPoint=null,this.middleware=Array.isArray(t.middleware)?[...t.middleware]:[],t.nodeMiddleware&&this.middleware.push(t.nodeMiddleware),this.nodeTypeMap=new Map,this.conditionalCodeMap=new Map,this.stateSchema=t.stateSchema||null,this.inputSchema=t.inputSchema||null,this.contextSchema=t.contextSchema||null,this.nodePrompts=new Map,this.nodeOptions=new Map,this._invokeAgent=t.invokeAgent||null,this._compiledPrompts=new Map}setInputSchema(t){return this.inputSchema=t,this}setContextSchema(t){return this.contextSchema=t,this}setStateSchema(t){return this.stateSchema=t,this}getInputSchema(){return this.inputSchema}getContextSchema(){return this.contextSchema}getStateSchema(){return this.stateSchema}_runtimeSchema(){if(this.inputSchema&&this.contextSchema)try{return this.inputSchema.merge(this.contextSchema)}catch{}return this.inputSchema&&!this.contextSchema?this.inputSchema:this.stateSchema}addNode(t,e,o={}){if(!(e instanceof M)&&e&&typeof e=="object"&&typeof e.workflow=="string"){let n=e,i={name:t,_isCustomCode:!0,retries:n.retries,onComplete:n.onComplete,execute:async c=>{let l=c?.state&&typeof c.state.getAll=="function"?c.state.getAll():c,p;return typeof n.input=="function"?p=n.input(l):n.input&&typeof n.input=="object"?p=n.input:p={},oe(n.workflow,{input:p,async:n.async===!0,conversationId:typeof n.conversationId=="function"?n.conversationId(l):n.conversationId,output:n.output,timeoutMs:n.timeoutMs,pollIntervalMs:n.pollIntervalMs,signal:l?._signal,parentAgent:c?.agent})}},a=new M(i);return a.name=t,this.nodes.set(t,a),o.prompt&&this.nodePrompts.set(t,o.prompt),Object.keys(o).length>0&&this.nodeOptions.set(t,o),this}let s=e instanceof M?e:new M(e);return s.name=t,this.nodes.set(t,s),o.prompt&&this.nodePrompts.set(t,o.prompt),Object.keys(o).length>0&&this.nodeOptions.set(t,o),this}addConditionalNode(t,e){return this.nodes.set(t,new ot({...e,name:t})),this}addEdge(t,e){return this.edges.set(t,e),this}setNodeType(t,e){return this.nodeTypeMap.set(t,e),this}addConditionalEdges(t,e,{labels:o}={}){return this.edges.set(t,{conditional:!0,routes:e,labels:o}),typeof e=="function"&&this.conditionalCodeMap.set(t,e.toString()),this}setEntryPoint(t){return this.entryPoint=t,this}use(t){return typeof t=="function"&&this.middleware.push(t),this}_composeMiddleware(t,e,o,s,n){let i=o;for(let a=t.length-1;a>=0;a--){let c=t[a],l=i;i=()=>c(e,l,s,n)}return i()}serialize(){let t=[],e={};for(let[l,p]of this.nodes){let d=this.nodeTypeMap.get(l)||l;t.push({id:l,type:d,data:{nodeType:d,label:l}});let g={};p._isCustomCode&&typeof p.execute=="function"&&(g.customCode=p.execute.toString());let m=this.nodePrompts.get(l);if(m&&(g.prompt=m),typeof p.customExecute=="function"&&(g.executeCode=p.customExecute.toString()),p.outputSchema)try{if(typeof p.outputSchema._def<"u"){let T=ce(p.outputSchema,{target:"openApi3"});g.outputSchema={jsonSchema:T,variables:this._flattenJsonSchemaToVariables(T)}}else g.outputSchema={schema:p.outputSchema}}catch(T){console.warn(`[workflow] failed to convert schema for ${l}:`,T.message)}let y=(this.resolvedToolsMap||{})[l];y?.toolIds&&(g.tools=y.toolIds);let w=Array.isArray(p?.config?.skills)?p.config.skills:Array.isArray(p?.skills)?p.skills:null;w&&w.length>0&&(g.skills=[...w]),Object.keys(g).length>0&&(e[l]=g)}let o=[];for(let[l,p]of this.edges)if(typeof p=="string")o.push({source:l,target:p});else if(p.conditional){let d=this.conditionalCodeMap.get(l)||p.routes.toString(),g=this._inferConditionalTargets(p.routes),m=p.labels||{};for(let y of g){let w={source:l,target:y,data:{conditionalCode:d}};m[y]&&(w.label=m[y]),o.push(w)}}let s=l=>{if(!l)return null;try{return ce(l,{target:"openApi3"})}catch{return null}},n=this._runtimeSchema(),i=s(n||this.stateSchema),a=s(this.inputSchema),c=s(this.contextSchema);return{nodes:t,edges:o,nodeConfigs:e,stateSchema:i,inputSchema:a,contextSchema:c}}_inferConditionalTargets(t){let e=t.toString(),o=new Set,s=/return\s+['"]([^'"]+)['"]/g,n;for(;(n=s.exec(e))!==null;)o.add(n[1]);return[...o]}_flattenJsonSchemaToVariables(t,e=""){let o=t;if(t.$ref&&t.definitions){let s=t.$ref.replace("#/definitions/","");o=t.definitions[s]||t}return this._flattenSchema(o,e)}_flattenSchema(t,e=""){if(!t||typeof t!="object")return[];let o=[],s=t.properties||{},n=t.required||[];for(let[i,a]of Object.entries(s)){let c=e?`${e}.${i}`:i;o.push({path:c,type:a.type||"unknown",label:a.description||this._formatLabel(i),optional:!n.includes(i)}),a.type==="object"&&a.properties&&o.push(...this._flattenSchema(a,c)),a.type==="array"&&a.items?.type==="object"&&a.items.properties&&o.push(...this._flattenSchema(a.items,`${c}[]`))}return o}_formatLabel(t){return t.replace(/([A-Z])/g," $1").replace(/^./,e=>e.toUpperCase()).trim()}_summarizeNodeOutput(t,e){if(!e||typeof e!="object")return[];let o=[];e.success!==void 0&&o.push(`Result: ${e.success?"passed":"failed"}`);for(let[s,n]of Object.entries(e))if(!(s==="success"||s==="raw"||s==="nextNode")){if(typeof n=="string"&&n.length<=80)o.push(`${s}: ${n}`);else if(Array.isArray(n)){let i=n.length,a=n.filter(l=>l?.passed===!0).length,c=n.some(l=>l?.passed!==void 0);o.push(c?`${s}: ${a}/${i} passed${i-a?`, ${i-a} failed`:""}`:`${s}: ${i} items`)}if(o.length>=4)break}return o}async run(t,e={},o={}){if(!this.entryPoint)throw new Error("No entry point set for graph");let s=new AbortController;o.signal&&(o.signal.aborted?s.abort():o.signal.addEventListener("abort",()=>s.abort(),{once:!0}));let n=o.strategyAbortTimeoutMs??e.config?.strategyAbortTimeoutMs??5e3,i=e.cwd||process.cwd();tr({path:j(i,".env")});let a=e.config||{};if(!a||Object.keys(a).length===0)try{let _=j(i,".zibby.config.js");$t(_)&&(a=(await import(_)).default||{})}catch{}process.env.EXECUTION_ID&&!a.agent?.strictMode&&(a.agent={...a.agent,strictMode:!0});let c=e.agentType;if(!c){let _=a?.agent;_?.provider?c=_.provider:_?.gemini?c="gemini":_?.claude?c="claude":_?.cursor?c="cursor":_?.codex?c="codex":c=process.env.AGENT_TYPE||"cursor"}let l=e.contextConfig||t?.config?.contextConfig||t?.config?.context||a?.context||{},p=this._runtimeSchema();if(p){let _=p.safeParse(e);if(!_.success){let x=_.error.issues.map(O=>`${O.path.join(".")}: ${O.message}`);throw console.error("\u274C Initial state validation failed:"),x.forEach(O=>console.error(` - ${O}`)),new Error(`State validation failed: ${x.join(", ")}`)}A.step("State validated against schema")}let d=or(),g=e.sessionPath||d;g||nr();let{sessionPath:m,sessionTimestamp:y,sessionId:w}=cr({cwd:i,config:a,traceFrom:"WorkflowGraph.run",initialState:{sessionPath:g,sessionTimestamp:e.sessionTimestamp}});A.step(`Session ${w}`);let T=await nt.loadContext(e.specPath||"",i,l);Object.keys(T).length>0&&A.step(`Context loaded: ${Object.keys(T).join(", ")}`);let P=e.outputPath;!P&&e.specPath&&(t?.calculateOutputPath?P=t.calculateOutputPath(e.specPath):console.warn(`\u26A0\uFE0F outputPath not resolved (specPath=${e.specPath})`));let u=new tt({...e,config:a,agentType:c,outputPath:P,sessionPath:m,sessionTimestamp:y,context:T,resolvedTools:this.resolvedToolsMap||{},_signal:s.signal}),f=new Map;try{await import("@zibby/skills")}catch{}let{getSkill:b}=await Promise.resolve().then(()=>(ht(),Yt)),h=a.skills&&typeof a.skills=="object"?a.skills:{},E=Object.values(h).filter(_=>_&&typeof _=="object"&&typeof _.id=="string"),U=_=>{for(let x of E)if(x.id===_)return x;return b(_)},Tt=new Set;for(let[,_]of this.nodes)for(let x of _.config?.skills||[])Tt.add(x);for(let _ of Tt){let x=U(_);if(typeof x?.middleware=="function")try{let O=await x.middleware();typeof O=="function"&&f.set(_,O)}catch{}}let S=this.entryPoint,q=[],vt=a?.recursionLimit??100,de=0;try{for(;S&&S!=="END";){if(++de>vt)throw new Error(`Workflow exceeded recursion limit (${vt}) \u2014 likely a cyclic conditional route. Set config.recursionLimit if you need a higher cap.`);let x=j(m,Gt);if($t(x)){try{Qe(x)}catch{}s.abort()}if(s.signal.aborted)return console.warn(`
37
- \u{1F6D1} External stop requested \u2014 ending workflow.`),A.step("Workflow stopped externally"),{success:!0,state:u.getAll(),executionLog:q,stoppedExternally:!0};let O=this.nodes.get(S);if(!O)throw new Error(`Node '${S}' not found in graph`);let At=JSON.stringify({sessionPath:m,sessionTimestamp:y,currentNode:S,createdAt:new Date().toISOString(),config:u.get("config")}),he=j(m,G);ae(he,At,"utf-8");let kt=u.get("config")?.paths?.output||st,fe=j(i,kt,G);ue(j(i,kt),{recursive:!0});try{ae(fe,At,"utf-8")}catch{}let xt=e.onPipelineProgress;if(typeof xt=="function")try{xt({cwd:i,sessionPath:m,sessionId:w,outputBase:u.get("config")?.paths?.output||st,currentNode:S})}catch{}let ge=(this.resolvedToolsMap||{})[S]||null;u.set("_currentNodeTools",ge);let me=u.get("nodeConfigs")||{};u.set("_currentNodeConfig",me[S]||{}),A.nodeStart(S);let Ot=Date.now(),V=this.nodePrompts.get(S);if(!this._invokeAgent){let N=await Promise.resolve().then(()=>(mt(),gt));this._invokeAgent=N.invokeAgent}let Se=this._invokeAgent,it={},we=O.config?.skills||[];for(let N of we){let R=U(N);if(typeof R?.invokeAgentOptions=="function")try{let $=R.invokeAgentOptions(u.getAll(),{agentType:u.get("agentType"),nodeName:S});$&&typeof $=="object"&&(it={...it,...$})}catch($){console.warn(`[graph] skill '${N}' invokeAgentOptions threw: ${$.message}`)}}let Pt=async(N,R,$={})=>{let C=Se(N,R,{...it,...$,signal:s.signal});return C.catch(()=>{}),s.signal.aborted?C:Promise.race([C,new Promise((W,F)=>{let B=()=>{setTimeout(()=>{let J=new Error(`Strategy ignored AbortSignal \u2014 engine deadman fired after ${n}ms`);J.name="AbortError",F(J)},n)};s.signal.addEventListener("abort",B,{once:!0})})])},Nt={state:u,invokeAgent:async(N={},R={})=>{let $=R.prompt||"";if(V){let C=this._compiledPrompts.get(S);C||(C=er.compile(V,{noEscape:!0}),this._compiledPrompts.set(S,C));try{$=C(N)}catch(W){throw console.error(`\u274C Template rendering failed for node '${S}':`,W.message),new Error(`Template rendering failed: ${W.message}`,{cause:W})}}else if(!$)throw new Error(`No prompt template configured for node '${S}' and no prompt provided in options`);return Pt($,{state:u.getAll(),images:R.images||[]},{model:R.model||u.get("model"),workspace:u.get("workspace"),schema:R.schema,...R,signal:s.signal})},_coreInvokeAgent:Pt,agent:t,nodeId:S,promptTemplate:V,getPromptTemplate:()=>V,...u.getAll()};try{let N=(O.config?.skills||[]).map(B=>f.get(B)).filter(Boolean),R=[...this.middleware,...N],$;R.length>0?$=await this._composeMiddleware(R,S,async()=>O.execute(Nt,u),u.getAll(),u):$=await O.execute(Nt,u);let C=Date.now()-Ot;if(q.push({node:S,success:$.success,duration:C,timestamp:new Date().toISOString()}),!$.success){if(s.signal.aborted)return A.step("Workflow stopped externally"),{success:!0,state:u.getAll(),executionLog:q,stoppedExternally:!0};u.append("errors",{node:S,error:$.error});let B=O.config?.retries||0,J=`${S}_retries`,X=u.getAll()[J]||0;if(X<B){A.stepInfo(`Retrying (attempt ${X+1}/${B})`),u.update({[J]:X+1,[`${S}_raw`]:$.raw});continue}throw A.nodeFailed(S,$.error,{duration:C}),new Error(`Node '${S}' failed after ${X} attempts: ${$.error}`)}u.update({[S]:$.output});let W=this._summarizeNodeOutput(S,$.output);A.nodeComplete(S,{duration:C,details:W});let F=this.edges.get(S);if(!F)S="END";else if(F.conditional){let B=F.routes(u.getAll());A.route(S,B),S=B}else S=F}catch(N){throw A.isInsideNode&&A.nodeFailed(S,N.message,{duration:Date.now()-Ot}),u.set("failed",!0),u.set("failedAt",S),N}}A.graphComplete();let _={success:!0,state:u.getAll(),executionLog:q};return t&&typeof t.onComplete=="function"&&await t.onComplete(_),_}finally{if(t&&typeof t.cleanup=="function")try{await t.cleanup()}catch(_){console.warn(`[workflow] agent.cleanup() failed: ${_.message}`)}}}};export{le as WorkflowGraph,nr as clearInheritedSessionEnvForFreshRun,ar as generateWorkflowSessionId,or as readPinnedSessionPathFromEnv,cr as resolveWorkflowSession,sr as shouldTrustInheritedSessionEnv,ir as syncProcessEnvToSession};
36
+ ${u}`)}}function ar(){return process.env.ZIBBY_TRUST_SESSION_ENV==="1"||process.env.ZIBBY_TRUST_SESSION_ENV==="true"||process.env.ZIBBY_KEEP_SESSION_ENV==="1"||process.env.ZIBBY_KEEP_SESSION_ENV==="true"}function cr(){if(!(process.env.ZIBBY_PIN_SESSION_PATH==="1"||process.env.ZIBBY_PIN_SESSION_PATH==="true"))return;let t=process.env.ZIBBY_SESSION_PATH;if(!(t==null||String(t).trim()===""))try{return fe(String(t).trim())}catch{return String(t).trim()}}function lr(){ar()||(delete process.env.ZIBBY_SESSION_PATH,delete process.env.ZIBBY_SESSION_ID)}function ur({sessionPath:r,sessionId:t}){r&&typeof r=="string"&&(process.env.ZIBBY_SESSION_PATH=r),t!=null&&String(t).trim()!==""&&(process.env.ZIBBY_SESSION_ID=String(t).trim())}function pr(r={}){let t=Jt.map(n=>process.env[n]).find(Boolean),e=Math.random().toString(36).slice(2,6),s=t||`${Date.now()}_${e}`,o=r.paths?.sessionPrefix;return o?`${o}_${s}`:s}function dr({cwd:r=process.cwd(),config:t={},initialState:e={},traceFrom:s="resolveWorkflowSession"}={}){let o=e.sessionPath,n=e.sessionTimestamp,i="initialState.sessionPath";if(!o&&process.env.ZIBBY_SESSION_PATH)try{let l=fe(String(process.env.ZIBBY_SESSION_PATH));l&&(o=l,i="ZIBBY_SESSION_PATH")}catch{}let a;if(o)a=String(o).split(/[/\\]/).filter(Boolean).pop(),n==null&&(n=Date.now());else{let l=process.env.ZIBBY_SESSION_ID&&String(process.env.ZIBBY_SESSION_ID).trim();if(l)a=l,i="ZIBBY_SESSION_ID";else{let p=t.sessionId!=null?String(t.sessionId).trim():"";p&&p!=="last"?(a=p,i="config.sessionId"):(a=pr(t),i="generated")}n=n??Date.now();let u=t.paths?.output||nt;o=G(r,u,Gt,a)}let c=!vt(o);return c&&he(o,{recursive:!0}),(c||i!=="initialState.sessionPath")&&ir({traceFrom:s,sessionId:a,sessionPath:o,idSource:i,mkdirFresh:c}),ur({sessionPath:o,sessionId:a}),{sessionPath:o,sessionId:a,sessionTimestamp:n}}var de=class{constructor(t={}){this.nodes=new Map,this.edges=new Map,this.entryPoint=null,this.middleware=Array.isArray(t.middleware)?[...t.middleware]:[],t.nodeMiddleware&&this.middleware.push(t.nodeMiddleware),this.nodeTypeMap=new Map,this.conditionalCodeMap=new Map,this.stateSchema=t.stateSchema||null,this.inputSchema=t.inputSchema||null,this.contextSchema=t.contextSchema||null,this.nodePrompts=new Map,this.nodeOptions=new Map,this._invokeAgent=t.invokeAgent||null,this._compiledPrompts=new Map}setInputSchema(t){return this.inputSchema=t,this}setContextSchema(t){return this.contextSchema=t,this}setStateSchema(t){return this.stateSchema=t,this}getInputSchema(){return this.inputSchema}getContextSchema(){return this.contextSchema}getStateSchema(){return this.stateSchema}_runtimeSchema(){if(this.inputSchema&&this.contextSchema)try{return this.inputSchema.merge(this.contextSchema)}catch{}return this.inputSchema&&!this.contextSchema?this.inputSchema:this.stateSchema}addNode(t,e,s={}){if(!(e instanceof L)&&e&&typeof e=="object"&&typeof e.workflow=="string"){let n=e,i={name:t,_isCustomCode:!0,retries:n.retries,onComplete:n.onComplete,execute:async c=>{let l=c?.state&&typeof c.state.getAll=="function"?c.state.getAll():c,u;return typeof n.input=="function"?u=n.input(l):n.input&&typeof n.input=="object"?u=n.input:u={},ae(n.workflow,{input:u,async:n.async===!0,conversationId:typeof n.conversationId=="function"?n.conversationId(l):n.conversationId,output:n.output,timeoutMs:n.timeoutMs,pollIntervalMs:n.pollIntervalMs,signal:l?._signal,parentAgent:c?.agent})}},a=new L(i);return a.name=t,this.nodes.set(t,a),s.prompt&&this.nodePrompts.set(t,s.prompt),Object.keys(s).length>0&&this.nodeOptions.set(t,s),this}let o=e instanceof L?e:new L(e);return o.name=t,this.nodes.set(t,o),s.prompt&&this.nodePrompts.set(t,s.prompt),Object.keys(s).length>0&&this.nodeOptions.set(t,s),this}addConditionalNode(t,e){return this.nodes.set(t,new it({...e,name:t})),this}addEdge(t,e){return this.edges.set(t,e),this}setNodeType(t,e){return this.nodeTypeMap.set(t,e),this}addConditionalEdges(t,e,{labels:s}={}){return this.edges.set(t,{conditional:!0,routes:e,labels:s}),typeof e=="function"&&this.conditionalCodeMap.set(t,e.toString()),this}setEntryPoint(t){return this.entryPoint=t,this}use(t){return typeof t=="function"&&this.middleware.push(t),this}_composeMiddleware(t,e,s,o,n){let i=s;for(let a=t.length-1;a>=0;a--){let c=t[a],l=i;i=()=>c(e,l,o,n)}return i()}serialize(){let t=[],e={};for(let[l,u]of this.nodes){let p=this.nodeTypeMap.get(l)||l;t.push({id:l,type:p,data:{nodeType:p,label:l}});let h={};u._isCustomCode&&typeof u.execute=="function"&&(h.customCode=u.execute.toString());let m=this.nodePrompts.get(l);if(m&&(h.prompt=m),typeof u.customExecute=="function"&&(h.executeCode=u.customExecute.toString()),u.outputSchema)try{if(typeof u.outputSchema._def<"u"){let $=pe(u.outputSchema,{target:"openApi3"});h.outputSchema={jsonSchema:$,variables:this._flattenJsonSchemaToVariables($)}}else h.outputSchema={schema:u.outputSchema}}catch($){console.warn(`[workflow] failed to convert schema for ${l}:`,$.message)}let I=(this.resolvedToolsMap||{})[l];I?.toolIds&&(h.tools=I.toolIds);let b=Array.isArray(u?.config?.skills)?u.config.skills:Array.isArray(u?.skills)?u.skills:null;b&&b.length>0&&(h.skills=[...b]),Object.keys(h).length>0&&(e[l]=h)}let s=[];for(let[l,u]of this.edges)if(typeof u=="string")s.push({source:l,target:u});else if(u.conditional){let p=this.conditionalCodeMap.get(l)||u.routes.toString(),h=this._inferConditionalTargets(u.routes),m=u.labels||{};for(let I of h){let b={source:l,target:I,data:{conditionalCode:p}};m[I]&&(b.label=m[I]),s.push(b)}}let o=l=>{if(!l)return null;try{return pe(l,{target:"openApi3"})}catch{return null}},n=this._runtimeSchema(),i=o(n||this.stateSchema),a=o(this.inputSchema),c=o(this.contextSchema);return{nodes:t,edges:s,nodeConfigs:e,stateSchema:i,inputSchema:a,contextSchema:c}}_inferConditionalTargets(t){let e=t.toString(),s=new Set,o=/return\s+['"]([^'"]+)['"]/g,n;for(;(n=o.exec(e))!==null;)s.add(n[1]);return[...s]}_flattenJsonSchemaToVariables(t,e=""){let s=t;if(t.$ref&&t.definitions){let o=t.$ref.replace("#/definitions/","");s=t.definitions[o]||t}return this._flattenSchema(s,e)}_flattenSchema(t,e=""){if(!t||typeof t!="object")return[];let s=[],o=t.properties||{},n=t.required||[];for(let[i,a]of Object.entries(o)){let c=e?`${e}.${i}`:i;s.push({path:c,type:a.type||"unknown",label:a.description||this._formatLabel(i),optional:!n.includes(i)}),a.type==="object"&&a.properties&&s.push(...this._flattenSchema(a,c)),a.type==="array"&&a.items?.type==="object"&&a.items.properties&&s.push(...this._flattenSchema(a.items,`${c}[]`))}return s}_formatLabel(t){return t.replace(/([A-Z])/g," $1").replace(/^./,e=>e.toUpperCase()).trim()}_summarizeNodeOutput(t,e){if(!e||typeof e!="object")return[];let s=[];e.success!==void 0&&s.push(`Result: ${e.success?"passed":"failed"}`);for(let[o,n]of Object.entries(e))if(!(o==="success"||o==="raw"||o==="nextNode")){if(typeof n=="string"&&n.length<=80)s.push(`${o}: ${n}`);else if(Array.isArray(n)){let i=n.length,a=n.filter(l=>l?.passed===!0).length,c=n.some(l=>l?.passed!==void 0);s.push(c?`${o}: ${a}/${i} passed${i-a?`, ${i-a} failed`:""}`:`${o}: ${i} items`)}if(s.length>=4)break}return s}async run(t,e={},s={}){if(!this.entryPoint)throw new Error("No entry point set for graph");let o=new AbortController;s.signal&&(s.signal.aborted?o.abort():s.signal.addEventListener("abort",()=>o.abort(),{once:!0}));let n=s.strategyAbortTimeoutMs??e.config?.strategyAbortTimeoutMs??5e3,i=e.cwd||process.cwd();or({path:G(i,".env")});let a=e.config||{};if(!a||Object.keys(a).length===0)try{let _=G(i,".zibby.config.js");vt(_)&&(a=(await import(_)).default||{})}catch{}process.env.EXECUTION_ID&&!a.agent?.strictMode&&(a.agent={...a.agent,strictMode:!0});let c=e.agentType;if(!c){let _=a?.agent;_?.provider?c=_.provider:_?.gemini?c="gemini":_?.claude?c="claude":_?.cursor?c="cursor":_?.codex?c="codex":c=process.env.AGENT_TYPE||"cursor"}let l=e.contextConfig||t?.config?.contextConfig||t?.config?.context||a?.context||{},u=this._runtimeSchema();if(u){let _=u.safeParse(e);if(!_.success){let O=_.error.issues.map(P=>`${P.path.join(".")}: ${P.message}`);throw console.error("\u274C Initial state validation failed:"),O.forEach(P=>console.error(` - ${P}`)),new Error(`State validation failed: ${O.join(", ")}`)}k.step("State validated against schema")}let p=cr(),h=e.sessionPath||p;h||lr();let{sessionPath:m,sessionTimestamp:I,sessionId:b}=dr({cwd:i,config:a,traceFrom:"WorkflowGraph.run",initialState:{sessionPath:h,sessionTimestamp:e.sessionTimestamp}});k.step(`Session ${b}`);let $=await ct.loadContext(e.specPath||"",i,l);Object.keys($).length>0&&k.step(`Context loaded: ${Object.keys($).join(", ")}`);let T=e.outputPath;!T&&e.specPath&&(t?.calculateOutputPath?T=t.calculateOutputPath(e.specPath):console.warn(`\u26A0\uFE0F outputPath not resolved (specPath=${e.specPath})`));let d=new rt({...e,config:a,agentType:c,outputPath:T,sessionPath:m,sessionTimestamp:I,context:$,resolvedTools:this.resolvedToolsMap||{},_signal:o.signal}),y=new Map;try{await import("@zibby/skills")}catch{}let{getSkill:f}=await Promise.resolve().then(()=>(mt(),Zt)),g=a.skills&&typeof a.skills=="object"?a.skills:{},B=Object.values(g).filter(_=>_&&typeof _=="object"&&typeof _.id=="string"),v=_=>{for(let O of B)if(O.id===_)return O;return f(_)},M=new Set;for(let[,_]of this.nodes)for(let O of _.config?.skills||[])M.add(O);for(let _ of M){let O=v(_);if(typeof O?.middleware=="function")try{let P=await O.middleware();typeof P=="function"&&y.set(_,P)}catch{}}let S=this.entryPoint,X=[],At=a?.recursionLimit??100,ge=0;try{for(;S&&S!=="END";){if(++ge>At)throw new Error(`Workflow exceeded recursion limit (${At}) \u2014 likely a cyclic conditional route. Set config.recursionLimit if you need a higher cap.`);let O=G(m,Ht);if(vt(O)){try{sr(O)}catch{}o.abort()}if(o.signal.aborted)return console.warn(`
37
+ \u{1F6D1} External stop requested \u2014 ending workflow.`),k.step("Workflow stopped externally"),{success:!0,state:d.getAll(),executionLog:X,stoppedExternally:!0};let P=this.nodes.get(S);if(!P)throw new Error(`Node '${S}' not found in graph`);let kt=JSON.stringify({sessionPath:m,sessionTimestamp:I,currentNode:S,createdAt:new Date().toISOString(),config:d.get("config")}),me=G(m,Y);ue(me,kt,"utf-8");let xt=d.get("config")?.paths?.output||nt,Se=G(i,xt,Y);he(G(i,xt),{recursive:!0});try{ue(Se,kt,"utf-8")}catch{}let Ot=e.onPipelineProgress;if(typeof Ot=="function")try{Ot({cwd:i,sessionPath:m,sessionId:b,outputBase:d.get("config")?.paths?.output||nt,currentNode:S})}catch{}let we=(this.resolvedToolsMap||{})[S]||null;d.set("_currentNodeTools",we);let _e=d.get("nodeConfigs")||{};d.set("_currentNodeConfig",_e[S]||{}),k.nodeStart(S);let Pt=Date.now(),Q=this.nodePrompts.get(S);if(!this._invokeAgent){let N=await Promise.resolve().then(()=>(_t(),wt));this._invokeAgent=N.invokeAgent}let ye=this._invokeAgent,lt={},Ie=P.config?.skills||[];for(let N of Ie){let R=v(N);if(typeof R?.invokeAgentOptions=="function")try{let E=R.invokeAgentOptions(d.getAll(),{agentType:d.get("agentType"),nodeName:S});E&&typeof E=="object"&&(lt={...lt,...E})}catch(E){console.warn(`[graph] skill '${N}' invokeAgentOptions threw: ${E.message}`)}}let Nt=async(N,R,E={})=>{let C=ye(N,R,{...lt,...E,signal:o.signal});return C.catch(()=>{}),o.signal.aborted?C:Promise.race([C,new Promise((H,J)=>{let D=()=>{setTimeout(()=>{let z=new Error(`Strategy ignored AbortSignal \u2014 engine deadman fired after ${n}ms`);z.name="AbortError",J(z)},n)};o.signal.addEventListener("abort",D,{once:!0})})])},Rt={state:d,invokeAgent:async(N={},R={})=>{let E=R.prompt||"";if(Q){let C=this._compiledPrompts.get(S);C||(C=nr.compile(Q,{noEscape:!0}),this._compiledPrompts.set(S,C));try{E=C(N)}catch(H){throw console.error(`\u274C Template rendering failed for node '${S}':`,H.message),new Error(`Template rendering failed: ${H.message}`,{cause:H})}}else if(!E)throw new Error(`No prompt template configured for node '${S}' and no prompt provided in options`);return Nt(E,{state:d.getAll(),images:R.images||[]},{model:R.model||d.get("model"),workspace:d.get("workspace"),schema:R.schema,...R,signal:o.signal})},_coreInvokeAgent:Nt,agent:t,nodeId:S,promptTemplate:Q,getPromptTemplate:()=>Q,...d.getAll()};try{let N=(P.config?.skills||[]).map(D=>y.get(D)).filter(Boolean),R=[...this.middleware,...N],E;R.length>0?E=await this._composeMiddleware(R,S,async()=>P.execute(Rt,d),d.getAll(),d):E=await P.execute(Rt,d);let C=Date.now()-Pt;if(X.push({node:S,success:E.success,duration:C,timestamp:new Date().toISOString()}),!E.success){if(o.signal.aborted)return k.step("Workflow stopped externally"),{success:!0,state:d.getAll(),executionLog:X,stoppedExternally:!0};d.append("errors",{node:S,error:E.error});let D=P.config?.retries||0,z=`${S}_retries`,tt=d.getAll()[z]||0;if(tt<D){k.stepInfo(`Retrying (attempt ${tt+1}/${D})`),d.update({[z]:tt+1,[`${S}_raw`]:E.raw});continue}throw k.nodeFailed(S,E.error,{duration:C}),new Error(`Node '${S}' failed after ${tt} attempts: ${E.error}`)}d.update({[S]:E.output});let H=this._summarizeNodeOutput(S,E.output);k.nodeComplete(S,{duration:C,details:H});let J=this.edges.get(S);if(!J)S="END";else if(J.conditional){let D=J.routes(d.getAll());k.route(S,D),S=D}else S=J}catch(N){throw k.isInsideNode&&k.nodeFailed(S,N.message,{duration:Date.now()-Pt}),d.set("failed",!0),d.set("failedAt",S),N}}k.graphComplete();let _={success:!0,state:d.getAll(),executionLog:X};return t&&typeof t.onComplete=="function"&&await t.onComplete(_),_}finally{if(t&&typeof t.cleanup=="function")try{await t.cleanup()}catch(_){console.warn(`[workflow] agent.cleanup() failed: ${_.message}`)}}}};export{de as WorkflowGraph,lr as clearInheritedSessionEnvForFreshRun,pr as generateWorkflowSessionId,cr as readPinnedSessionPathFromEnv,dr as resolveWorkflowSession,ar as shouldTrustInheritedSessionEnv,ur as syncProcessEnvToSession};
@@ -40,12 +40,35 @@ export function runInProcessSubgraph(workflowName: string, options?: {
40
40
  finalState: object;
41
41
  executionId: string;
42
42
  }>;
43
- /** Best-effort cache size probe used by metrics and by the eventual
44
- * LRU sweep. Returns total bytes under CACHE_ROOT or 0 if nothing yet. */
43
+ /** Best-effort cache size probe. Returns total bytes under CACHE_ROOT
44
+ * or 0 if nothing yet. Used by metrics + by `evictCacheIfOver()` below. */
45
45
  export function getCacheStats(): {
46
46
  bytes: number;
47
47
  entries: any;
48
48
  };
49
+ /**
50
+ * LRU-ish cache eviction. Called opportunistically after each successful
51
+ * bundle extract — when CACHE_ROOT exceeds `cap` bytes (default 2 GB,
52
+ * tunable via `ZIBBY_SUBGRAPH_CACHE_CAP_BYTES`), the oldest sub-trees
53
+ * by mtime are deleted until total falls below 70% of cap. Skips trees
54
+ * that look in-use (`.lock` sentinel still present).
55
+ *
56
+ * "LRU-ish" because we use mtime, not real access tracking — Node fs
57
+ * doesn't update atime by default on most file systems. mtime gets bumped
58
+ * on each fresh extract, so cold versions naturally rank older. Good
59
+ * enough for warm-pool cleanup; not a replacement for a real LRU cache.
60
+ */
61
+ export function evictCacheIfOver({ cap }?: {
62
+ cap?: number;
63
+ }): {
64
+ evicted: number;
65
+ freedBytes: number;
66
+ totalBytes?: undefined;
67
+ } | {
68
+ evicted: number;
69
+ freedBytes: number;
70
+ totalBytes: number;
71
+ };
49
72
  /**
50
73
  * Typed marker that callers should drop back to the HTTP/trigger path.
51
74
  * Carries `.reason` for observability + a Boolean tag so a `catch` block
@@ -1 +1 @@
1
- var L=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(n,r)=>(typeof require<"u"?require:n)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});import{mkdirSync as F,existsSync as b,statSync as q}from"node:fs";import{spawn as M}from"node:child_process";import{join as E}from"node:path";import{pathToFileURL as J}from"node:url";var R=()=>{},N={debug:R,info:R,warn:(...e)=>console.warn("[workflow]",...e),error:(...e)=>console.error("[workflow]",...e)},_={impl:N};var S={debug:(...e)=>_.impl.debug?.(...e),info:(...e)=>_.impl.info?.(...e),warn:(...e)=>_.impl.warn?.(...e),error:(...e)=>_.impl.error?.(...e)};import{AsyncLocalStorage as G}from"node:async_hooks";var $=new G;function B(){let e=$.getStore();return e||Object.freeze({executionId:process.env.EXECUTION_ID||null,parentExecutionId:process.env.PARENT_EXECUTION_ID||null,depth:0,conversationId:process.env.ZIBBY_CONVERSATION_ID||null,dispatchMode:process.env.DISPATCH_MODE||null})}function C(e,n){let r=$.getStore()||B(),o=Object.freeze({executionId:e.executionId,parentExecutionId:e.parentExecutionId??r.executionId??null,depth:(r.depth||0)+(e.executionId!==r.executionId?1:0),conversationId:e.conversationId!==void 0?e.conversationId:r.conversationId??null,dispatchMode:e.dispatchMode??null});return $.run(o,n)}var A=new Map,v=new Map,P=new Map;function O(e,n,r={}){if(!e||typeof e!="string")throw new Error("subgraph-registry.register: name required");if(typeof n!="function")throw new Error("subgraph-registry.register: factory must be a function");A.set(e,n),v.set(e,"ready"),P.set(e,{...r,cachedAt:Date.now()})}function D(e,n){v.set(e,"failed"),P.set(e,{error:n?.message||String(n),failedAt:Date.now()}),A.delete(e)}function U(e){return v.get(e)==="ready"?A.get(e):null}var k=process.env.ZIBBY_SUBGRAPH_CACHE_DIR||"/tmp/zibby/subgraphs";function X(){return Number(process.env.ZIBBY_SUBGRAPH_MAX_DEPTH||10)}function V(){return`node${(process.versions?.node||"").split(".")[0]||"unknown"}-${process.platform}-${process.arch}`}var c=class extends Error{constructor(n,r){super(`in-process sub-graph fallback: ${n}${r?` (${r})`:""}`),this.fallback=!0,this.reason=n,this.detail=r||null,this.name="SubgraphFallback"}};function W(){let e=(process.env.SUBGRAPH_INTERNAL_URL||"").replace(/\/$/,""),n=(process.env.PROGRESS_API_URL||"").replace(/\/executions\/?$/,""),r=e||n,o=process.env.PROJECT_ID,t=process.env.PROJECT_API_TOKEN;if(!r||!o||!t)throw new c("env","SUBGRAPH_INTERNAL_URL/PROGRESS_API_URL/PROJECT_ID/PROJECT_API_TOKEN missing");return{apiBase:r,projectId:o,authToken:t}}async function Y({apiBase:e,authToken:n,body:r}){let o;try{o=await fetch(`${e}/internal/subgraph/begin`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(r)})}catch(s){throw new c("network",`begin fetch failed: ${s.message}`)}let t=null;try{t=await o.json()}catch{}if(!o.ok){if(o.status===404){let s=new Error(`Sub-graph child '${r.childWorkflowType}' not found in project`);throw s.code="SUBGRAPH_NOT_FOUND",s.status=404,s}if(o.status===429){let s=t?.quotaInfo||{},a=new Error(`Sub-graph blocked by quota (${s.used??"?"}/${s.limit??"?"} on ${s.planId||"plan"})`);throw a.code="SUBGRAPH_QUOTA_EXCEEDED",a.status=429,a.quotaInfo=s,a}if(o.status===400&&t?.validationErrors){let s=new Error(`Sub-graph rejected input: ${t?.error||t?.message||"validation failed"}`);throw s.code="SUBGRAPH_INVALID_INPUT",s.status=400,s.validationErrors=t.validationErrors,s.missing=t.missing,s}throw new c("begin-status",`begin returned ${o.status}`)}return t?.data||t}async function g({apiBase:e,authToken:n,payload:r}){try{let o=await fetch(`${e}/internal/subgraph/finalize`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(r)});o.ok||S.warn(`[in-process subgraph] finalize returned ${o.status} for ${r.childExecutionId}`)}catch(o){S.warn(`[in-process subgraph] finalize failed: ${o.message}`)}}async function Z(e,n){let r=E(n,".ready"),o=E(n,"graph.mjs");if(b(r)&&b(o))return;F(n,{recursive:!0});let t=E(n,".lock"),s=!1;try{let{openSync:a,closeSync:u}=await import("node:fs"),w=a(t,"wx");u(w),s=!0}catch(a){if(a.code!=="EEXIST")throw a}if(!s){let a=Date.now()+3e4;for(;Date.now()<a;){if(b(r)&&b(o))return;await new Promise(u=>setTimeout(u,100))}throw new c("bundle-extract-timeout","sibling extract did not complete within 30s")}try{await new Promise((w,x)=>{let I=M("curl",["-fsSL",e],{stdio:["ignore","pipe","inherit"]}),y=M("tar",["-xzf","-","-C",n],{stdio:["pipe","inherit","inherit"]});I.stdout.pipe(y.stdin);let m,h,l=()=>{if(m!==void 0&&h!==void 0){if(m!==0)return x(new Error(`curl exited ${m}`));if(h!==0)return x(new Error(`tar exited ${h}`));w()}};I.on("close",f=>{m=f,l()}),y.on("close",f=>{h=f,l()}),I.on("error",x),y.on("error",x)});let{writeFileSync:a,unlinkSync:u}=await import("node:fs");a(r,"");try{u(t)}catch{}}catch(a){try{let{unlinkSync:u}=await import("node:fs");u(t)}catch{}throw new c("bundle-extract-failed",a.message)}}async function K(e){let n=E(e,"graph.mjs");if(!b(n))throw new c("entry-missing",`graph.mjs missing under ${e}`);let r;try{r=await import(J(n).href)}catch(t){throw new c("import-failed",`${t?.code||t?.name||"unknown"}: ${t.message}`)}let o=r.default||Object.values(r).find(t=>typeof t=="function"&&t.prototype?.buildGraph);if(!o)throw new c("entry-class-missing","no buildGraph() class export found");return o}async function de(e,n={}){if(!e||typeof e!="string")throw new Error("runInProcessSubgraph: workflowName (string) is required");let r=B(),o=X();if((r.depth||0)>=o)throw new c("depth-exceeded",`depth ${r.depth} \u2265 MAX_DEPTH ${o}`);let t;try{t=W()}catch(i){throw i}S.debug(`[in-process subgraph] begin '${e}' parent=${r.executionId||"<root>"}`);let s=await Y({apiBase:t.apiBase,authToken:t.authToken,body:{parentExecutionId:r.executionId,childWorkflowType:e,input:n.input||{},...n.conversationId?{conversationId:n.conversationId}:{}}}),{childExecutionId:a,runtimeTag:u,bundlePresignedUrl:w,sourcesPresignedUrl:x,workflowVersion:I,workflowUuid:y,bundleReady:m}=s,h=V();if(u&&u!==h)throw await g({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:a,status:"canceled",error:{message:`runtimeTag mismatch: parent=${h} child=${u}`,code:"RUNTIME_MISMATCH"}}}),new c("runtime-mismatch",`${h} vs ${u}`);if(!m||!w)throw await g({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:a,status:"canceled",error:{message:"bundle not ready for in-process; falling back to HTTP",code:"NO_BUNDLE"}}}),new c("no-bundle","workflow bundle not built yet");let l=U(e);if(!l){let i=E(k,`${y}@${I||"0"}`);try{await Z(w,i)}catch(d){throw d.fallback&&await g({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:a,status:"failed",error:{message:d.message,code:d.reason}}}),d}try{l=await K(i),O(e,l,{workflowUuid:y,version:I,runtimeTag:u,cacheDir:i})}catch(d){throw D(e,d),await g({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:a,status:"failed",error:{message:d.message,code:d.reason||"IMPORT_FAILED"}}}),d.fallback?d:new c("import-failed",d.message)}}let f=Date.now(),H=await(typeof l=="function"&&l.prototype?.buildGraph?new l:l).buildGraph(),j={...n.input||{}},p,T;try{p=await C({executionId:a,parentExecutionId:r.executionId,conversationId:n.conversationId!==void 0?n.conversationId:r.conversationId,dispatchMode:"inprocess"},()=>H.run(n.parentAgent,j,{signal:n.signal})),T=p&&typeof p=="object"&&"state"in p?p.state:p}catch(i){throw await g({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:a,status:"failed",error:{message:i.message,code:i.code||"CHILD_THREW",stack:i.stack},durationMs:Date.now()-f}}),i}if(p&&typeof p=="object"&&p.stoppedExternally){await g({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:a,status:"canceled",finalState:T,durationMs:Date.now()-f}});let i=new Error(`Sub-graph '${e}' canceled by parent abort`);throw i.code="SUBGRAPH_CANCELED",i.subgraphJobId=a,i}return await g({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:a,status:"completed",finalState:T,durationMs:Date.now()-f}}),{finalState:T,executionId:a}}function le(){try{if(!b(k))return{bytes:0,entries:0};let{readdirSync:e}=L("node:fs"),n=e(k),r=0;for(let o of n)try{r+=q(E(k,o)).size}catch{}return{bytes:r,entries:n.length}}catch{return{bytes:0,entries:0}}}export{c as SubgraphFallback,le as getCacheStats,de as runInProcessSubgraph};
1
+ import{mkdirSync as q,existsSync as m,statSync as z,readdirSync as C,rmSync as X}from"node:fs";import{spawn as j}from"node:child_process";import{join as w}from"node:path";import{pathToFileURL as Y}from"node:url";var R=()=>{},G={debug:R,info:R,warn:(...e)=>console.warn("[workflow]",...e),error:(...e)=>console.error("[workflow]",...e)},B={impl:G};var I={debug:(...e)=>B.impl.debug?.(...e),info:(...e)=>B.impl.info?.(...e),warn:(...e)=>B.impl.warn?.(...e),error:(...e)=>B.impl.error?.(...e)};import{AsyncLocalStorage as F}from"node:async_hooks";var k=new F;function v(){let e=k.getStore();return e||Object.freeze({executionId:process.env.EXECUTION_ID||null,parentExecutionId:process.env.PARENT_EXECUTION_ID||null,depth:0,conversationId:process.env.ZIBBY_CONVERSATION_ID||null,dispatchMode:process.env.DISPATCH_MODE||null})}function P(e,n){let r=k.getStore()||v(),t=Object.freeze({executionId:e.executionId,parentExecutionId:e.parentExecutionId??r.executionId??null,depth:(r.depth||0)+(e.executionId!==r.executionId?1:0),conversationId:e.conversationId!==void 0?e.conversationId:r.conversationId??null,dispatchMode:e.dispatchMode??null});return k.run(t,n)}var $=new Map,A=new Map,O=new Map;function D(e,n,r={}){if(!e||typeof e!="string")throw new Error("subgraph-registry.register: name required");if(typeof n!="function")throw new Error("subgraph-registry.register: factory must be a function");$.set(e,n),A.set(e,"ready"),O.set(e,{...r,cachedAt:Date.now()})}function M(e,n){A.set(e,"failed"),O.set(e,{error:n?.message||String(n),failedAt:Date.now()}),$.delete(e)}function U(e){return A.get(e)==="ready"?$.get(e):null}var E=process.env.ZIBBY_SUBGRAPH_CACHE_DIR||"/tmp/zibby/subgraphs";function V(){return`node${(process.versions?.node||"").split(".")[0]||"unknown"}-${process.platform}-${process.arch}`}var u=class extends Error{constructor(n,r){super(`in-process sub-graph fallback: ${n}${r?` (${r})`:""}`),this.fallback=!0,this.reason=n,this.detail=r||null,this.name="SubgraphFallback"}};function W(){let e=(process.env.SUBGRAPH_INTERNAL_URL||"").replace(/\/$/,""),n=(process.env.PROGRESS_API_URL||"").replace(/\/executions\/?$/,""),r=e||n,t=process.env.PROJECT_ID,s=process.env.PROJECT_API_TOKEN;if(!r||!t||!s)throw new u("env","SUBGRAPH_INTERNAL_URL/PROGRESS_API_URL/PROJECT_ID/PROJECT_API_TOKEN missing");return{apiBase:r,projectId:t,authToken:s}}async function Z({apiBase:e,authToken:n,body:r}){let t;try{t=await fetch(`${e}/internal/subgraph/begin`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(r)})}catch(o){throw new u("network",`begin fetch failed: ${o.message}`)}let s=null;try{s=await t.json()}catch{}if(!t.ok){if(t.status===404){let o=new Error(`Sub-graph child '${r.childWorkflowType}' not found in project`);throw o.code="SUBGRAPH_NOT_FOUND",o.status=404,o}if(t.status===429){let o=s?.quotaInfo||{},a=new Error(`Sub-graph blocked by quota (${o.used??"?"}/${o.limit??"?"} on ${o.planId||"plan"})`);throw a.code="SUBGRAPH_QUOTA_EXCEEDED",a.status=429,a.quotaInfo=o,a}if(t.status===400&&s?.validationErrors){let o=new Error(`Sub-graph rejected input: ${s?.error||s?.message||"validation failed"}`);throw o.code="SUBGRAPH_INVALID_INPUT",o.status=400,o.validationErrors=s.validationErrors,o.missing=s.missing,o}throw new u("begin-status",`begin returned ${t.status}`)}return s?.data||s}async function b({apiBase:e,authToken:n,payload:r}){try{let t=await fetch(`${e}/internal/subgraph/finalize`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(r)});t.ok||I.warn(`[in-process subgraph] finalize returned ${t.status} for ${r.childExecutionId}`)}catch(t){I.warn(`[in-process subgraph] finalize failed: ${t.message}`)}}async function K(e,n){let r=w(n,".ready"),t=w(n,"graph.mjs");if(m(r)&&m(t))return;q(n,{recursive:!0});let s=w(n,".lock"),o=!1;try{let{openSync:a,closeSync:i}=await import("node:fs"),l=a(s,"wx");i(l),o=!0}catch(a){if(a.code!=="EEXIST")throw a}if(!o){let a=Date.now()+3e4;for(;Date.now()<a;){if(m(r)&&m(t))return;await new Promise(i=>setTimeout(i,100))}throw new u("bundle-extract-timeout","sibling extract did not complete within 30s")}try{await new Promise((l,d)=>{let h=j("curl",["-fsSL",e],{stdio:["ignore","pipe","inherit"]}),T=j("tar",["-xzf","-","-C",n],{stdio:["pipe","inherit","inherit"]});h.stdout.pipe(T.stdin);let y,p,x=()=>{if(y!==void 0&&p!==void 0){if(y!==0)return d(new Error(`curl exited ${y}`));if(p!==0)return d(new Error(`tar exited ${p}`));l()}};h.on("close",S=>{y=S,x()}),T.on("close",S=>{p=S,x()}),h.on("error",d),T.on("error",d)});let{writeFileSync:a,unlinkSync:i}=await import("node:fs");a(r,"");try{i(s)}catch{}}catch(a){try{let{unlinkSync:i}=await import("node:fs");i(s)}catch{}throw new u("bundle-extract-failed",a.message)}}async function Q(e){let n=w(e,"graph.mjs");if(!m(n))throw new u("entry-missing",`graph.mjs missing under ${e}`);let r;try{r=await import(Y(n).href)}catch(s){throw new u("import-failed",`${s?.code||s?.name||"unknown"}: ${s.message}`)}let t=r.default||Object.values(r).find(s=>typeof s=="function"&&s.prototype?.buildGraph);if(!t)throw new u("entry-class-missing","no buildGraph() class export found");return t}async function le(e,n={}){if(!e||typeof e!="string")throw new Error("runInProcessSubgraph: workflowName (string) is required");let r=v(),t;try{t=W()}catch(c){throw c}I.debug(`[in-process subgraph] begin '${e}' parent=${r.executionId||"<root>"}`);let s=await Z({apiBase:t.apiBase,authToken:t.authToken,body:{parentExecutionId:r.executionId,childWorkflowType:e,input:n.input||{},...n.conversationId?{conversationId:n.conversationId}:{}}}),{childExecutionId:o,runtimeTag:a,bundlePresignedUrl:i,sourcesPresignedUrl:l,workflowVersion:d,workflowUuid:h,bundleReady:T}=s,y=V();if(a&&a!==y)throw await b({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:o,status:"canceled",error:{message:`runtimeTag mismatch: parent=${y} child=${a}`,code:"RUNTIME_MISMATCH"}}}),new u("runtime-mismatch",`${y} vs ${a}`);if(!T||!i)throw await b({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:o,status:"canceled",error:{message:"bundle not ready for in-process; falling back to HTTP",code:"NO_BUNDLE"}}}),new u("no-bundle","workflow bundle not built yet");let p=U(e);if(!p){let c=w(E,`${h}@${d||"0"}`);try{await K(i,c);try{ee()}catch{}}catch(f){throw f.fallback&&await b({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:o,status:"failed",error:{message:f.message,code:f.reason}}}),f}try{p=await Q(c),D(e,p,{workflowUuid:h,version:d,runtimeTag:a,cacheDir:c})}catch(f){throw M(e,f),await b({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:o,status:"failed",error:{message:f.message,code:f.reason||"IMPORT_FAILED"}}}),f.fallback?f:new u("import-failed",f.message)}}let x=Date.now(),L=await(typeof p=="function"&&p.prototype?.buildGraph?new p:p).buildGraph(),N={...n.input||{}},g,_;try{g=await P({executionId:o,parentExecutionId:r.executionId,conversationId:n.conversationId!==void 0?n.conversationId:r.conversationId,dispatchMode:"inprocess"},()=>L.run(n.parentAgent,N,{signal:n.signal})),_=g&&typeof g=="object"&&"state"in g?g.state:g}catch(c){throw await b({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:o,status:"failed",error:{message:c.message,code:c.code||"CHILD_THREW",stack:c.stack},durationMs:Date.now()-x}}),c}if(g&&typeof g=="object"&&g.stoppedExternally){await b({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:o,status:"canceled",finalState:_,durationMs:Date.now()-x}});let c=new Error(`Sub-graph '${e}' canceled by parent abort`);throw c.code="SUBGRAPH_CANCELED",c.subgraphJobId=o,c}return await b({apiBase:t.apiBase,authToken:t.authToken,payload:{childExecutionId:o,status:"completed",finalState:_,durationMs:Date.now()-x}}),{finalState:_,executionId:o}}function de(){try{if(!m(E))return{bytes:0,entries:0};let e=C(E),n=0;for(let r of e)try{n+=H(w(E,r))}catch{}return{bytes:n,entries:e.length}}catch{return{bytes:0,entries:0}}}function H(e){let n=0,r=[e];for(;r.length;){let t=r.pop(),s;try{s=z(t)}catch{continue}if(s.isDirectory()){let o;try{o=C(t)}catch{continue}for(let a of o)r.push(w(t,a))}else n+=s.size}return n}function ee({cap:e=Number(process.env.ZIBBY_SUBGRAPH_CACHE_CAP_BYTES||2*1024*1024*1024)}={}){try{if(!m(E))return{evicted:0,freedBytes:0};let n=C(E),r=[],t=0;for(let i of n){let l=w(E,i),d;try{d=z(l)}catch{continue}let h=d.isDirectory()?H(l):d.size;t+=h,r.push({name:i,full:l,size:h,mtimeMs:d.mtimeMs})}if(t<=e)return{evicted:0,freedBytes:0,totalBytes:t};r.sort((i,l)=>i.mtimeMs-l.mtimeMs);let s=Math.floor(e*.7),o=0,a=0;for(let i of r){if(t-o<=s)break;if(!m(w(i.full,".lock")))try{X(i.full,{recursive:!0,force:!0}),o+=i.size,a+=1}catch(l){I.debug(`[sub-graph cache] evict skip ${i.name}: ${l.message}`)}}return a>0&&I.info(`[sub-graph cache] evicted ${a} entr(y/ies), freed ${(o/1024/1024).toFixed(1)}MB`),{evicted:a,freedBytes:o,totalBytes:t-o}}catch(n){return I.debug(`[sub-graph cache] evict failed: ${n.message}`),{evicted:0,freedBytes:0}}}export{u as SubgraphFallback,ee as evictCacheIfOver,de as getCacheStats,le as runInProcessSubgraph};