@zibby/cli 0.7.0 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/bin/zibby.js +20 -19
  2. package/dist/commands/init.js +6 -6
  3. package/dist/commands/workflows/generate.js +33 -33
  4. package/dist/commands/workflows/logs.js +37 -37
  5. package/dist/commands/workflows/run.js +26 -26
  6. package/dist/commands/workflows/trigger.js +37 -37
  7. package/dist/package.json +4 -4
  8. package/dist/templates/.claude/commands/zibby-app-upgrade.md +1 -1
  9. package/dist/templates/zibby-workflow-claude/agents-md-block.md +23 -23
  10. package/dist/templates/zibby-workflow-claude/claude/agents/zibby-workflow-builder.md +24 -24
  11. package/dist/templates/zibby-workflow-claude/claude/commands/zibby-add-node.md +18 -18
  12. package/dist/templates/zibby-workflow-claude/claude/commands/zibby-debug.md +10 -10
  13. package/dist/templates/zibby-workflow-claude/claude/commands/zibby-delete.md +7 -7
  14. package/dist/templates/zibby-workflow-claude/claude/commands/zibby-deploy.md +26 -26
  15. package/dist/templates/zibby-workflow-claude/claude/commands/zibby-list.md +8 -8
  16. package/dist/templates/zibby-workflow-claude/claude/commands/zibby-static-ip.md +13 -13
  17. package/dist/templates/zibby-workflow-claude/claude/commands/zibby-tail.md +13 -13
  18. package/dist/templates/zibby-workflow-claude/claude/commands/zibby-trigger.md +16 -16
  19. package/dist/templates/zibby-workflow-claude/cursor/rules/zibby-workflows.mdc +19 -19
  20. package/dist/templates/zibby-workflow-claude/manifest.json +1 -1
  21. package/package.json +4 -4
  22. package/templates/.claude/commands/zibby-app-upgrade.md +1 -1
  23. package/templates/zibby-workflow-claude/agents-md-block.md +23 -23
  24. package/templates/zibby-workflow-claude/claude/agents/zibby-workflow-builder.md +24 -24
  25. package/templates/zibby-workflow-claude/claude/commands/zibby-add-node.md +18 -18
  26. package/templates/zibby-workflow-claude/claude/commands/zibby-debug.md +10 -10
  27. package/templates/zibby-workflow-claude/claude/commands/zibby-delete.md +7 -7
  28. package/templates/zibby-workflow-claude/claude/commands/zibby-deploy.md +26 -26
  29. package/templates/zibby-workflow-claude/claude/commands/zibby-list.md +8 -8
  30. package/templates/zibby-workflow-claude/claude/commands/zibby-static-ip.md +13 -13
  31. package/templates/zibby-workflow-claude/claude/commands/zibby-tail.md +13 -13
  32. package/templates/zibby-workflow-claude/claude/commands/zibby-trigger.md +16 -16
  33. package/templates/zibby-workflow-claude/cursor/rules/zibby-workflows.mdc +19 -19
  34. package/templates/zibby-workflow-claude/manifest.json +1 -1
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
- var Ct=Object.defineProperty;var Ce=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var y=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ne=(e,t)=>{for(var r in t)Ct(e,r,{get:t[r],enumerable:!0})};var He,Je=y(()=>{He="ffffffff-ffff-ffff-ffff-ffffffffffff"});var Me,Qe=y(()=>{Me="00000000-0000-0000-0000-000000000000"});var Ye,qe=y(()=>{Ye=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i});function Vt(e){return typeof e=="string"&&Ye.test(e)}var F,J=y(()=>{qe();F=Vt});function Xt(e){if(!F(e))throw TypeError("Invalid UUID");let t;return Uint8Array.of((t=parseInt(e.slice(0,8),16))>>>24,t>>>16&255,t>>>8&255,t&255,(t=parseInt(e.slice(9,13),16))>>>8,t&255,(t=parseInt(e.slice(14,18),16))>>>8,t&255,(t=parseInt(e.slice(19,23),16))>>>8,t&255,(t=parseInt(e.slice(24,36),16))/1099511627776&255,t/4294967296&255,t>>>24&255,t>>>16&255,t>>>8&255,t&255)}var C,M=y(()=>{J();C=Xt});function U(e,t=0){return($[e[t+0]]+$[e[t+1]]+$[e[t+2]]+$[e[t+3]]+"-"+$[e[t+4]]+$[e[t+5]]+"-"+$[e[t+6]]+$[e[t+7]]+"-"+$[e[t+8]]+$[e[t+9]]+"-"+$[e[t+10]]+$[e[t+11]]+$[e[t+12]]+$[e[t+13]]+$[e[t+14]]+$[e[t+15]]).toLowerCase()}function Zt(e,t=0){let r=U(e,t);if(!F(r))throw TypeError("Stringified UUID is invalid");return r}var $,Ve,N=y(()=>{J();$=[];for(let e=0;e<256;++e)$.push((e+256).toString(16).slice(1));Ve=Zt});import{randomFillSync as er}from"crypto";function j(){return re>oe.length-16&&(er(oe),re=0),oe.slice(re,re+=16)}var oe,re,ne=y(()=>{oe=new Uint8Array(256),re=oe.length});function tr(e,t,r){let o,n=e?._v6??!1;if(e){let s=Object.keys(e);s.length===1&&s[0]==="_v6"&&(e=void 0)}if(e)o=Xe(e.random??e.rng?.()??j(),e.msecs,e.nsecs,e.clockseq,e.node,t,r);else{let s=Date.now(),i=j();rr(Q,s,i),o=Xe(i,Q.msecs,Q.nsecs,n?void 0:Q.clockseq,n?void 0:Q.node,t,r)}return t??U(o)}function rr(e,t,r){return e.msecs??=-1/0,e.nsecs??=0,t===e.msecs?(e.nsecs++,e.nsecs>=1e4&&(e.node=void 0,e.nsecs=0)):t>e.msecs?e.nsecs=0:t<e.msecs&&(e.node=void 0),e.node||(e.node=r.slice(10,16),e.node[0]|=1,e.clockseq=(r[8]<<8|r[9])&16383),e.msecs=t,e}function Xe(e,t,r,o,n,s,i=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(!s)s=new Uint8Array(16),i=0;else if(i<0||i+16>s.length)throw new RangeError(`UUID byte range ${i}:${i+15} is out of buffer bounds`);t??=Date.now(),r??=0,o??=(e[8]<<8|e[9])&16383,n??=e.slice(10,16),t+=122192928e5;let f=((t&268435455)*1e4+r)%4294967296;s[i++]=f>>>24&255,s[i++]=f>>>16&255,s[i++]=f>>>8&255,s[i++]=f&255;let a=t/4294967296*1e4&268435455;s[i++]=a>>>8&255,s[i++]=a&255,s[i++]=a>>>24&15|16,s[i++]=a>>>16&255,s[i++]=o>>>8|128,s[i++]=o&255;for(let l=0;l<6;++l)s[i++]=n[l];return s}var Q,se,he=y(()=>{ne();N();Q={};se=tr});function Y(e){let t=typeof e=="string"?C(e):e,r=or(t);return typeof e=="string"?U(r):r}function or(e){return Uint8Array.of((e[6]&15)<<4|e[7]>>4&15,(e[7]&15)<<4|(e[4]&240)>>4,(e[4]&15)<<4|(e[5]&240)>>4,(e[5]&15)<<4|(e[0]&240)>>4,(e[0]&15)<<4|(e[1]&240)>>4,(e[1]&15)<<4|(e[2]&240)>>4,96|e[2]&15,e[3],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}var we=y(()=>{M();N()});import{createHash as nr}from"crypto";function sr(e){return Array.isArray(e)?e=Buffer.from(e):typeof e=="string"&&(e=Buffer.from(e,"utf8")),nr("md5").update(e).digest()}var Ze,et=y(()=>{Ze=sr});function ir(e){e=unescape(encodeURIComponent(e));let t=new Uint8Array(e.length);for(let r=0;r<e.length;++r)t[r]=e.charCodeAt(r);return t}function q(e,t,r,o,n,s){let i=typeof r=="string"?ir(r):r,f=typeof o=="string"?C(o):o;if(typeof o=="string"&&(o=C(o)),o?.length!==16)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");let a=new Uint8Array(16+i.length);if(a.set(f),a.set(i,f.length),a=t(a),a[6]=a[6]&15|e,a[8]=a[8]&63|128,n){if(s=s||0,s<0||s+16>n.length)throw new RangeError(`UUID byte range ${s}:${s+15} is out of buffer bounds`);for(let l=0;l<16;++l)n[s+l]=a[l];return n}return U(a)}var ie,ae,Se=y(()=>{M();N();ie="6ba7b810-9dad-11d1-80b4-00c04fd430c8",ae="6ba7b811-9dad-11d1-80b4-00c04fd430c8"});function ye(e,t,r,o){return q(48,Ze,e,t,r,o)}var tt,rt=y(()=>{et();Se();ye.DNS=ie;ye.URL=ae;tt=ye});import{randomUUID as ar}from"crypto";var xe,ot=y(()=>{xe={randomUUID:ar}});function cr(e,t,r){if(xe.randomUUID&&!t&&!e)return xe.randomUUID();e=e||{};let o=e.random??e.rng?.()??j();if(o.length<16)throw new Error("Random bytes length must be >= 16");if(o[6]=o[6]&15|64,o[8]=o[8]&63|128,t){if(r=r||0,r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let n=0;n<16;++n)t[r+n]=o[n];return t}return U(o)}var nt,st=y(()=>{ot();ne();N();nt=cr});import{createHash as lr}from"crypto";function fr(e){return Array.isArray(e)?e=Buffer.from(e):typeof e=="string"&&(e=Buffer.from(e,"utf8")),lr("sha1").update(e).digest()}var it,at=y(()=>{it=fr});function _e(e,t,r,o){return q(80,it,e,t,r,o)}var ct,lt=y(()=>{at();Se();_e.DNS=ie;_e.URL=ae;ct=_e});function pr(e,t,r){e??={},r??=0;let o=se({...e,_v6:!0},new Uint8Array(16));if(o=Y(o),t){if(r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let n=0;n<16;n++)t[r+n]=o[n];return t}return U(o)}var ft,pt=y(()=>{N();he();we();ft=pr});function Ee(e){let t=typeof e=="string"?C(e):e,r=dr(t);return typeof e=="string"?U(r):r}function dr(e){return Uint8Array.of((e[3]&15)<<4|e[4]>>4&15,(e[4]&15)<<4|(e[5]&240)>>4,(e[5]&15)<<4|e[6]&15,e[7],(e[1]&15)<<4|(e[2]&240)>>4,(e[2]&15)<<4|(e[3]&240)>>4,16|(e[0]&240)>>4,(e[0]&15)<<4|(e[1]&240)>>4,e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}var dt=y(()=>{M();N()});function ur(e,t,r){let o;if(e)o=ut(e.random??e.rng?.()??j(),e.msecs,e.seq,t,r);else{let n=Date.now(),s=j();gr($e,n,s),o=ut(s,$e.msecs,$e.seq,t,r)}return t??U(o)}function gr(e,t,r){return e.msecs??=-1/0,e.seq??=0,t>e.msecs?(e.seq=r[6]<<23|r[7]<<16|r[8]<<8|r[9],e.msecs=t):(e.seq=e.seq+1|0,e.seq===0&&e.msecs++),e}function ut(e,t,r,o,n=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(!o)o=new Uint8Array(16),n=0;else if(n<0||n+16>o.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);return t??=Date.now(),r??=e[6]*127<<24|e[7]<<16|e[8]<<8|e[9],o[n++]=t/1099511627776&255,o[n++]=t/4294967296&255,o[n++]=t/16777216&255,o[n++]=t/65536&255,o[n++]=t/256&255,o[n++]=t&255,o[n++]=112|r>>>28&15,o[n++]=r>>>20&255,o[n++]=128|r>>>14&63,o[n++]=r>>>6&255,o[n++]=r<<2&255|e[10]&3,o[n++]=e[11],o[n++]=e[12],o[n++]=e[13],o[n++]=e[14],o[n++]=e[15],o}var $e,gt,mt=y(()=>{ne();N();$e={};gt=ur});function mr(e){if(!F(e))throw TypeError("Invalid UUID");return parseInt(e.slice(14,15),16)}var ht,wt=y(()=>{J();ht=mr});var St={};Ne(St,{MAX:()=>He,NIL:()=>Me,parse:()=>C,stringify:()=>Ve,v1:()=>se,v1ToV6:()=>Y,v3:()=>tt,v4:()=>nt,v5:()=>ct,v6:()=>ft,v6ToV1:()=>Ee,v7:()=>gt,validate:()=>F,version:()=>ht});var yt=y(()=>{Je();Qe();M();N();he();we();rt();st();lt();pt();dt();mt();J();wt()});var Rt={};Ne(Rt,{uploadSessionArtifacts:()=>Or});import{readdirSync as _t,statSync as Re,createReadStream as hr,existsSync as wr}from"node:fs";import{join as Et,relative as Sr,sep as yr,extname as xr}from"node:path";function Rr(e){let t=xr(e).toLowerCase();return $r[t]||"application/octet-stream"}function $t(e){let t=[],r;try{r=_t(e)}catch{return t}for(let o of r){if(_r.has(o)||o.startsWith(".")||Er.has(o))continue;let n=Et(e,o),s;try{s=Re(n)}catch{continue}s.isDirectory()?t.push(...$t(n)):s.isFile()&&t.push(n)}return t}async function Ur({apiUrl:e,apiKey:t,executionId:r,nodeName:o,filename:n,absolutePath:s,sizeBytes:i,contentType:f}){let a;try{let l=await fetch(`${e}/${r}/artifacts/upload-url`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({nodeName:o,filename:n,contentType:f,sizeBytes:i})});if(!l.ok){let c=await l.text();return console.warn(`[artifacts] upload-url failed for ${o}/${n}: ${l.status} ${c.slice(0,200)}`),null}a=await l.json()}catch(l){return console.warn(`[artifacts] upload-url request errored for ${o}/${n}: ${l.message}`),null}try{let l=hr(s),c=a.requiredHeaders?{...a.requiredHeaders,"Content-Length":String(i)}:{"Content-Type":f,"Content-Length":String(i)},p=await fetch(a.url,{method:"PUT",headers:c,body:l,duplex:"half"});if(!p.ok)return console.warn(`[artifacts] S3 PUT failed for ${o}/${n}: ${p.status}`),null}catch(l){return console.warn(`[artifacts] S3 PUT errored for ${o}/${n}: ${l.message}`),null}return{nodeName:o,filename:n,s3Key:a.s3Key,contentType:f,sizeBytes:i}}async function Or({sessionPath:e,executionId:t,apiUrl:r,apiKey:o}){let n={uploaded:[],skipped:[]};if(!e||!wr(e))return n;if(!r||!o||!t)return console.warn("[artifacts] uploader missing required input \u2014 skipping"),n;let s;try{s=_t(e)}catch(c){return console.warn(`[artifacts] could not read session folder ${e}: ${c.message}`),n}let i=[];for(let c of s){let p=Et(e,c),d;try{d=Re(p)}catch{continue}if(!d.isDirectory()||c.startsWith(".")||c.startsWith("_"))continue;let R=$t(p);for(let S of R){let I=Sr(p,S).split(yr).join("/"),_;try{_=Re(S).size}catch{continue}if(_>xt){n.skipped.push({nodeName:c,filename:I,reason:`size ${_} > ${xt}`});continue}if(_===0){n.skipped.push({nodeName:c,filename:I,reason:"empty"});continue}i.push({apiUrl:r,apiKey:o,executionId:t,nodeName:c,filename:I,absolutePath:S,sizeBytes:_,contentType:Rr(I)})}}if(i.length===0)return n;let f=4,a=i.slice(),l=Array.from({length:Math.min(f,a.length)},async()=>{for(;a.length;){let c=a.shift(),p=await Ur(c);p?n.uploaded.push(p):n.skipped.push({nodeName:c.nodeName,filename:c.filename,reason:"upload failed"})}});if(await Promise.all(l),n.uploaded.length>0)try{let c=await fetch(`${r}/${t}/artifacts`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},body:JSON.stringify({files:n.uploaded})});if(!c.ok){let p=await c.text();console.warn(`[artifacts] record failed: ${c.status} ${p.slice(0,200)}`)}}catch(c){console.warn(`[artifacts] record errored: ${c.message}`)}return n}var xt,_r,Er,$r,Ut=y(()=>{xt=500*1024*1024,_r=new Set([".DS_Store","Thumbs.db",".zibby-stop"]),Er=new Set(["node_modules",".git","dist",".zibby","__tests__","__mocks__",".cache",".next",".turbo"]),$r={".webm":"video/webm",".mp4":"video/mp4",".mov":"video/quicktime",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".txt":"text/plain",".md":"text/markdown",".csv":"text/csv",".log":"text/plain",".json":"application/json",".yaml":"application/yaml",".yml":"application/yaml",".pdf":"application/pdf",".zip":"application/zip",".tar":"application/x-tar",".gz":"application/gzip"}});import{mkdirSync as Pt,writeFileSync as Ir,existsSync as G,readFileSync as Ot}from"fs";import{join as D,dirname as Tr,resolve as It}from"path";import{pathToFileURL as Oe}from"url";import{spawn as Ie}from"node:child_process";import{SQSClient as Nt,SendMessageCommand as jt}from"@aws-sdk/client-sqs";var pe=null;function Kt(){return pe||(pe=new Nt({region:process.env.AWS_REGION||"ap-southeast-2"})),pe}async function de(e,t,r,o){let{EXECUTION_ID:n,SQS_AUTH_TOKEN:s,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:f,PROJECT_API_TOKEN:a}=o;if(!n)return;let l={executionId:n,...s&&{sqsAuthToken:s},step:{name:e,status:t,logs:r,timestamp:new Date().toISOString(),...t==="success"&&{completedAt:new Date().toISOString()}},status:t==="failed"?"failed":"running"};try{i?await ue(i,n,l,a):f&&await ge(f,n,l)}catch(c){console.error(`\u26A0\uFE0F Failed to send progress: ${c.message}`)}}async function je(e,t,r){let{EXECUTION_ID:o,SQS_AUTH_TOKEN:n,PROGRESS_API_URL:s,PROGRESS_QUEUE_URL:i,PROJECT_API_TOKEN:f}=e;if(!o||!r)return;let a=JSON.stringify(r).length;console.log(`Sending artifact: ${t} (${(a/1024).toFixed(1)}KB)`);let l={executionId:o,...n&&{sqsAuthToken:n},artifacts:{[t]:r},timestamp:new Date().toISOString()},c=s?"HTTP":i?"SQS":"NONE",p=JSON.stringify(l).length;try{if(s)await ue(s,o,l,f);else if(i)await ge(i,o,l);else{console.warn(`\u26A0\uFE0F No transport configured for artifact ${t} \u2014 neither PROGRESS_API_URL nor PROGRESS_QUEUE_URL set`);return}console.log(`Artifact ${t} sent via ${c} (payload=${(p/1024).toFixed(1)}KB, value=${(a/1024).toFixed(1)}KB)`)}catch(d){console.error(`Failed to send artifact ${t} via ${c}:`),console.error(` Payload size: ${(p/1024).toFixed(1)}KB, Value size: ${(a/1024).toFixed(1)}KB`),console.error(` Error: ${d.message}`),d.name&&console.error(` Error type: ${d.name}`),d.code&&console.error(` Error code: ${d.code}`),p>256*1024&&console.error(" \u26A0\uFE0F Message exceeds SQS 256KB limit! Consider splitting or compressing.")}}async function Ke(e,{status:t,error:r,finalState:o}){let{EXECUTION_ID:n,SQS_AUTH_TOKEN:s,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:f,PROJECT_API_TOKEN:a}=e;if(!n)return;let l={executionId:n,...s&&{sqsAuthToken:s},status:t,...r&&{error:r},...o&&typeof o=="object"&&Object.keys(o).length>0?{finalState:o}:{},timestamp:new Date().toISOString()},c=i?"HTTP":f?"SQS":"NONE",p=JSON.stringify(l).length;console.log(`Sending final status: ${t} via ${c} (${(p/1024).toFixed(1)}KB)`);try{if(i)await ue(i,n,l,a);else if(f){let d=["completed","failed","insufficient_context","blocked"].includes(t)?"execution_completed":"progress_update";await ge(f,n,l,d)}else{console.warn("No transport configured for final status \u2014 neither PROGRESS_API_URL nor PROGRESS_QUEUE_URL set");return}console.log(`Final status ${t} sent via ${c}`)}catch(d){console.error(`Failed to send final status (${t}) via ${c}:`),console.error(` Payload: ${(p/1024).toFixed(1)}KB`),console.error(` Error: ${d.message}`),d.name&&console.error(` Error type: ${d.name}`),d.code&&console.error(` Error code: ${d.code}`)}}async function ue(e,t,r,o){let n=`${e}/${t}/progress`,s={"Content-Type":"application/json"};o&&(s.Authorization=`Bearer ${o}`);let i=await fetch(n,{method:"POST",headers:s,body:JSON.stringify(r)});if(!i.ok){let f=await i.text();throw new Error(`HTTP ${i.status}: ${f}`)}}async function ge(e,t,r,o="progress_update"){let n=JSON.stringify(r),s=(n.length/1024).toFixed(1);n.length>256*1024&&console.error(`\u274C SQS message too large: ${s}KB (limit 256KB) for ${t} [${o}]`),await Kt().send(new jt({QueueUrl:e,MessageBody:n,MessageGroupId:t,MessageAttributes:{executionId:{DataType:"String",StringValue:t},messageType:{DataType:"String",StringValue:o}}}))}function Ft(e,t){try{let r=e?.sessionPath||e?.SESSION_PATH||process.env.ZIBBY_SESSION_PATH;if(!r||!t)return null;let o=Ce("fs"),s=Ce("path").join(r,t,"usage.json");if(!o.existsSync(s))return null;let i=o.readFileSync(s,"utf-8"),f=JSON.parse(i);return!f.input_tokens&&!f.output_tokens&&!f.inputTokens&&!f.outputTokens?null:f}catch{return null}}function Fe(e,t,r=null){return async function(n,s,i){let f=Date.now(),a=[],l="",c=console.log,p=process.stdout.write.bind(process.stdout),d=process.stderr.write.bind(process.stderr),R=!1;console.log=(...w)=>{let u=w.map(h=>typeof h=="string"?h:JSON.stringify(h)).join(" ");a.push(u),R=!0,c(...w),R=!1};let S="";process.stdout.write=(w,u,h)=>{if(!R){let x=typeof w=="string"?w:w.toString();S+=x;let m=S.split(`
3
- `);S=m.pop()||"";for(let O of m){let b=O.trim();b&&a.push(b)}}return p(w,u,h)},c(`[Middleware] Started capturing logs for ${n}`);let I=!1,_=setInterval(()=>{if(I)return;let w=a.join(`
4
- `);w!==l&&w.length>0&&(l=w,d(`\u{1F4E1} [Middleware] Sending live update for ${n}: ${w.length} chars, ${a.length} lines
5
- `),e(n,"in_progress",w,i).catch(u=>{d(`\u26A0\uFE0F [Middleware] Failed to send live update: ${u.message}
6
- `)}))},500);try{await e(n,"in_progress","",i);let w=await s(),u=((Date.now()-f)/1e3).toFixed(1);I=!0,clearInterval(_),await new Promise(m=>setImmediate(m)),console.log=c,process.stdout.write=p,S.trim()&&(a.push(S.trim()),S="");let h=a.join(`
7
- `);d(`\u{1F4E1} [Middleware] Sending final update for ${n}: ${h.length} chars, ${a.length} total lines captured
8
- `);let x=Ft(i,n);if(x)try{await t(i,`usage_${n}`,x)}catch(m){d(`\u26A0\uFE0F [Middleware] usage ship failed for ${n}: ${m.message}
9
- `)}if(w.success){if(await e(n,"success",h||`Completed in ${u}s`,i),r)try{let m=r(n,w);m&&m.key&&m.value&&await t(i,m.key,m.value)}catch(m){d(`\u26A0\uFE0F [Middleware] artifactExtractor for ${n} threw: ${m.message}
10
- `)}}else await e(n,"failed",`${h}
2
+ var Nt=Object.defineProperty;var Ne=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var S=(e,t)=>()=>(e&&(t=e(e=0)),t);var je=(e,t)=>{for(var r in t)Nt(e,r,{get:t[r],enumerable:!0})};var Je,Me=S(()=>{Je="ffffffff-ffff-ffff-ffff-ffffffffffff"});var Qe,Ye=S(()=>{Qe="00000000-0000-0000-0000-000000000000"});var qe,Ve=S(()=>{qe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i});function Xt(e){return typeof e=="string"&&qe.test(e)}var F,J=S(()=>{Ve();F=Xt});function Zt(e){if(!F(e))throw TypeError("Invalid UUID");let t;return Uint8Array.of((t=parseInt(e.slice(0,8),16))>>>24,t>>>16&255,t>>>8&255,t&255,(t=parseInt(e.slice(9,13),16))>>>8,t&255,(t=parseInt(e.slice(14,18),16))>>>8,t&255,(t=parseInt(e.slice(19,23),16))>>>8,t&255,(t=parseInt(e.slice(24,36),16))/1099511627776&255,t/4294967296&255,t>>>24&255,t>>>16&255,t>>>8&255,t&255)}var N,M=S(()=>{J();N=Zt});function O(e,t=0){return(_[e[t+0]]+_[e[t+1]]+_[e[t+2]]+_[e[t+3]]+"-"+_[e[t+4]]+_[e[t+5]]+"-"+_[e[t+6]]+_[e[t+7]]+"-"+_[e[t+8]]+_[e[t+9]]+"-"+_[e[t+10]]+_[e[t+11]]+_[e[t+12]]+_[e[t+13]]+_[e[t+14]]+_[e[t+15]]).toLowerCase()}function er(e,t=0){let r=O(e,t);if(!F(r))throw TypeError("Stringified UUID is invalid");return r}var _,Xe,j=S(()=>{J();_=[];for(let e=0;e<256;++e)_.push((e+256).toString(16).slice(1));Xe=er});import{randomFillSync as tr}from"crypto";function K(){return re>oe.length-16&&(tr(oe),re=0),oe.slice(re,re+=16)}var oe,re,ne=S(()=>{oe=new Uint8Array(256),re=oe.length});function rr(e,t,r){let o,n=e?._v6??!1;if(e){let s=Object.keys(e);s.length===1&&s[0]==="_v6"&&(e=void 0)}if(e)o=Ze(e.random??e.rng?.()??K(),e.msecs,e.nsecs,e.clockseq,e.node,t,r);else{let s=Date.now(),i=K();or(Q,s,i),o=Ze(i,Q.msecs,Q.nsecs,n?void 0:Q.clockseq,n?void 0:Q.node,t,r)}return t??O(o)}function or(e,t,r){return e.msecs??=-1/0,e.nsecs??=0,t===e.msecs?(e.nsecs++,e.nsecs>=1e4&&(e.node=void 0,e.nsecs=0)):t>e.msecs?e.nsecs=0:t<e.msecs&&(e.node=void 0),e.node||(e.node=r.slice(10,16),e.node[0]|=1,e.clockseq=(r[8]<<8|r[9])&16383),e.msecs=t,e}function Ze(e,t,r,o,n,s,i=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(!s)s=new Uint8Array(16),i=0;else if(i<0||i+16>s.length)throw new RangeError(`UUID byte range ${i}:${i+15} is out of buffer bounds`);t??=Date.now(),r??=0,o??=(e[8]<<8|e[9])&16383,n??=e.slice(10,16),t+=122192928e5;let f=((t&268435455)*1e4+r)%4294967296;s[i++]=f>>>24&255,s[i++]=f>>>16&255,s[i++]=f>>>8&255,s[i++]=f&255;let a=t/4294967296*1e4&268435455;s[i++]=a>>>8&255,s[i++]=a&255,s[i++]=a>>>24&15|16,s[i++]=a>>>16&255,s[i++]=o>>>8|128,s[i++]=o&255;for(let l=0;l<6;++l)s[i++]=n[l];return s}var Q,se,he=S(()=>{ne();j();Q={};se=rr});function Y(e){let t=typeof e=="string"?N(e):e,r=nr(t);return typeof e=="string"?O(r):r}function nr(e){return Uint8Array.of((e[6]&15)<<4|e[7]>>4&15,(e[7]&15)<<4|(e[4]&240)>>4,(e[4]&15)<<4|(e[5]&240)>>4,(e[5]&15)<<4|(e[0]&240)>>4,(e[0]&15)<<4|(e[1]&240)>>4,(e[1]&15)<<4|(e[2]&240)>>4,96|e[2]&15,e[3],e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}var we=S(()=>{M();j()});import{createHash as sr}from"crypto";function ir(e){return Array.isArray(e)?e=Buffer.from(e):typeof e=="string"&&(e=Buffer.from(e,"utf8")),sr("md5").update(e).digest()}var et,tt=S(()=>{et=ir});function ar(e){e=unescape(encodeURIComponent(e));let t=new Uint8Array(e.length);for(let r=0;r<e.length;++r)t[r]=e.charCodeAt(r);return t}function q(e,t,r,o,n,s){let i=typeof r=="string"?ar(r):r,f=typeof o=="string"?N(o):o;if(typeof o=="string"&&(o=N(o)),o?.length!==16)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");let a=new Uint8Array(16+i.length);if(a.set(f),a.set(i,f.length),a=t(a),a[6]=a[6]&15|e,a[8]=a[8]&63|128,n){if(s=s||0,s<0||s+16>n.length)throw new RangeError(`UUID byte range ${s}:${s+15} is out of buffer bounds`);for(let l=0;l<16;++l)n[s+l]=a[l];return n}return O(a)}var ie,ae,Se=S(()=>{M();j();ie="6ba7b810-9dad-11d1-80b4-00c04fd430c8",ae="6ba7b811-9dad-11d1-80b4-00c04fd430c8"});function ye(e,t,r,o){return q(48,et,e,t,r,o)}var rt,ot=S(()=>{tt();Se();ye.DNS=ie;ye.URL=ae;rt=ye});import{randomUUID as cr}from"crypto";var xe,nt=S(()=>{xe={randomUUID:cr}});function lr(e,t,r){if(xe.randomUUID&&!t&&!e)return xe.randomUUID();e=e||{};let o=e.random??e.rng?.()??K();if(o.length<16)throw new Error("Random bytes length must be >= 16");if(o[6]=o[6]&15|64,o[8]=o[8]&63|128,t){if(r=r||0,r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let n=0;n<16;++n)t[r+n]=o[n];return t}return O(o)}var st,it=S(()=>{nt();ne();j();st=lr});import{createHash as fr}from"crypto";function pr(e){return Array.isArray(e)?e=Buffer.from(e):typeof e=="string"&&(e=Buffer.from(e,"utf8")),fr("sha1").update(e).digest()}var at,ct=S(()=>{at=pr});function _e(e,t,r,o){return q(80,at,e,t,r,o)}var lt,ft=S(()=>{ct();Se();_e.DNS=ie;_e.URL=ae;lt=_e});function dr(e,t,r){e??={},r??=0;let o=se({...e,_v6:!0},new Uint8Array(16));if(o=Y(o),t){if(r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let n=0;n<16;n++)t[r+n]=o[n];return t}return O(o)}var pt,dt=S(()=>{j();he();we();pt=dr});function Ee(e){let t=typeof e=="string"?N(e):e,r=ur(t);return typeof e=="string"?O(r):r}function ur(e){return Uint8Array.of((e[3]&15)<<4|e[4]>>4&15,(e[4]&15)<<4|(e[5]&240)>>4,(e[5]&15)<<4|e[6]&15,e[7],(e[1]&15)<<4|(e[2]&240)>>4,(e[2]&15)<<4|(e[3]&240)>>4,16|(e[0]&240)>>4,(e[0]&15)<<4|(e[1]&240)>>4,e[8],e[9],e[10],e[11],e[12],e[13],e[14],e[15])}var ut=S(()=>{M();j()});function gr(e,t,r){let o;if(e)o=gt(e.random??e.rng?.()??K(),e.msecs,e.seq,t,r);else{let n=Date.now(),s=K();mr($e,n,s),o=gt(s,$e.msecs,$e.seq,t,r)}return t??O(o)}function mr(e,t,r){return e.msecs??=-1/0,e.seq??=0,t>e.msecs?(e.seq=r[6]<<23|r[7]<<16|r[8]<<8|r[9],e.msecs=t):(e.seq=e.seq+1|0,e.seq===0&&e.msecs++),e}function gt(e,t,r,o,n=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(!o)o=new Uint8Array(16),n=0;else if(n<0||n+16>o.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);return t??=Date.now(),r??=e[6]*127<<24|e[7]<<16|e[8]<<8|e[9],o[n++]=t/1099511627776&255,o[n++]=t/4294967296&255,o[n++]=t/16777216&255,o[n++]=t/65536&255,o[n++]=t/256&255,o[n++]=t&255,o[n++]=112|r>>>28&15,o[n++]=r>>>20&255,o[n++]=128|r>>>14&63,o[n++]=r>>>6&255,o[n++]=r<<2&255|e[10]&3,o[n++]=e[11],o[n++]=e[12],o[n++]=e[13],o[n++]=e[14],o[n++]=e[15],o}var $e,mt,ht=S(()=>{ne();j();$e={};mt=gr});function hr(e){if(!F(e))throw TypeError("Invalid UUID");return parseInt(e.slice(14,15),16)}var wt,St=S(()=>{J();wt=hr});var yt={};je(yt,{MAX:()=>Je,NIL:()=>Qe,parse:()=>N,stringify:()=>Xe,v1:()=>se,v1ToV6:()=>Y,v3:()=>rt,v4:()=>st,v5:()=>lt,v6:()=>pt,v6ToV1:()=>Ee,v7:()=>mt,validate:()=>F,version:()=>wt});var xt=S(()=>{Me();Ye();M();j();he();we();ot();it();ft();dt();ut();ht();J();St()});var Ot={};je(Ot,{uploadSessionArtifacts:()=>Ir});import{readdirSync as Et,statSync as Re,createReadStream as wr,existsSync as Sr}from"node:fs";import{join as $t,relative as yr,sep as xr,extname as _r}from"node:path";function Or(e){let t=_r(e).toLowerCase();return Rr[t]||"application/octet-stream"}function Rt(e){let t=[],r;try{r=Et(e)}catch{return t}for(let o of r){if(Er.has(o)||o.startsWith(".")||$r.has(o))continue;let n=$t(e,o),s;try{s=Re(n)}catch{continue}s.isDirectory()?t.push(...Rt(n)):s.isFile()&&t.push(n)}return t}async function Ur({apiUrl:e,apiKey:t,executionId:r,nodeName:o,filename:n,absolutePath:s,sizeBytes:i,contentType:f}){let a;try{let l=await fetch(`${e}/${r}/artifacts/upload-url`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({nodeName:o,filename:n,contentType:f,sizeBytes:i})});if(!l.ok){let c=await l.text();return console.warn(`[artifacts] upload-url failed for ${o}/${n}: ${l.status} ${c.slice(0,200)}`),null}a=await l.json()}catch(l){return console.warn(`[artifacts] upload-url request errored for ${o}/${n}: ${l.message}`),null}try{let l=wr(s),c=a.requiredHeaders?{...a.requiredHeaders,"Content-Length":String(i)}:{"Content-Type":f,"Content-Length":String(i)},d=await fetch(a.url,{method:"PUT",headers:c,body:l,duplex:"half"});if(!d.ok)return console.warn(`[artifacts] S3 PUT failed for ${o}/${n}: ${d.status}`),null}catch(l){return console.warn(`[artifacts] S3 PUT errored for ${o}/${n}: ${l.message}`),null}return{nodeName:o,filename:n,s3Key:a.s3Key,contentType:f,sizeBytes:i}}async function Ir({sessionPath:e,executionId:t,apiUrl:r,apiKey:o}){let n={uploaded:[],skipped:[]};if(!e||!Sr(e))return n;if(!r||!o||!t)return console.warn("[artifacts] uploader missing required input \u2014 skipping"),n;let s;try{s=Et(e)}catch(c){return console.warn(`[artifacts] could not read session folder ${e}: ${c.message}`),n}let i=[];for(let c of s){let d=$t(e,c),u;try{u=Re(d)}catch{continue}if(!u.isDirectory()||c.startsWith(".")||c.startsWith("_"))continue;let $=Rt(d);for(let y of $){let U=yr(d,y).split(xr).join("/"),R;try{R=Re(y).size}catch{continue}if(R>_t){n.skipped.push({nodeName:c,filename:U,reason:`size ${R} > ${_t}`});continue}if(R===0){n.skipped.push({nodeName:c,filename:U,reason:"empty"});continue}i.push({apiUrl:r,apiKey:o,executionId:t,nodeName:c,filename:U,absolutePath:y,sizeBytes:R,contentType:Or(U)})}}if(i.length===0)return n;let f=4,a=i.slice(),l=Array.from({length:Math.min(f,a.length)},async()=>{for(;a.length;){let c=a.shift(),d=await Ur(c);d?n.uploaded.push(d):n.skipped.push({nodeName:c.nodeName,filename:c.filename,reason:"upload failed"})}});if(await Promise.all(l),n.uploaded.length>0)try{let c=await fetch(`${r}/${t}/artifacts`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},body:JSON.stringify({files:n.uploaded})});if(!c.ok){let d=await c.text();console.warn(`[artifacts] record failed: ${c.status} ${d.slice(0,200)}`)}}catch(c){console.warn(`[artifacts] record errored: ${c.message}`)}return n}var _t,Er,$r,Rr,Ut=S(()=>{_t=500*1024*1024,Er=new Set([".DS_Store","Thumbs.db",".zibby-stop"]),$r=new Set(["node_modules",".git","dist",".zibby","__tests__","__mocks__",".cache",".next",".turbo"]),Rr={".webm":"video/webm",".mp4":"video/mp4",".mov":"video/quicktime",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".txt":"text/plain",".md":"text/markdown",".csv":"text/csv",".log":"text/plain",".json":"application/json",".yaml":"application/yaml",".yml":"application/yaml",".pdf":"application/pdf",".zip":"application/zip",".tar":"application/x-tar",".gz":"application/gzip"}});import{mkdirSync as At,writeFileSync as Tr,existsSync as G,readFileSync as It}from"fs";import{join as b,dirname as Pr,resolve as Tt}from"path";import{pathToFileURL as Ue}from"url";import{spawn as Ie}from"node:child_process";import{SQSClient as jt,SendMessageCommand as Kt}from"@aws-sdk/client-sqs";var pe=null;function Ft(){return pe||(pe=new jt({region:process.env.AWS_REGION||"ap-southeast-2"})),pe}async function de(e,t,r,o){let{EXECUTION_ID:n,SQS_AUTH_TOKEN:s,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:f,PROJECT_API_TOKEN:a}=o;if(!n)return;let l={executionId:n,...s&&{sqsAuthToken:s},step:{name:e,status:t,logs:r,timestamp:new Date().toISOString(),...t==="success"&&{completedAt:new Date().toISOString()}},status:t==="failed"?"failed":"running"};try{i?await ue(i,n,l,a):f&&await ge(f,n,l)}catch(c){console.error(`\u26A0\uFE0F Failed to send progress: ${c.message}`)}}async function Ke(e,t,r){let{EXECUTION_ID:o,SQS_AUTH_TOKEN:n,PROGRESS_API_URL:s,PROGRESS_QUEUE_URL:i,PROJECT_API_TOKEN:f}=e;if(!o||!r)return;let a=JSON.stringify(r).length;console.log(`Sending artifact: ${t} (${(a/1024).toFixed(1)}KB)`);let l={executionId:o,...n&&{sqsAuthToken:n},artifacts:{[t]:r},timestamp:new Date().toISOString()},c=s?"HTTP":i?"SQS":"NONE",d=JSON.stringify(l).length;try{if(s)await ue(s,o,l,f);else if(i)await ge(i,o,l);else{console.warn(`\u26A0\uFE0F No transport configured for artifact ${t} \u2014 neither PROGRESS_API_URL nor PROGRESS_QUEUE_URL set`);return}console.log(`Artifact ${t} sent via ${c} (payload=${(d/1024).toFixed(1)}KB, value=${(a/1024).toFixed(1)}KB)`)}catch(u){console.error(`Failed to send artifact ${t} via ${c}:`),console.error(` Payload size: ${(d/1024).toFixed(1)}KB, Value size: ${(a/1024).toFixed(1)}KB`),console.error(` Error: ${u.message}`),u.name&&console.error(` Error type: ${u.name}`),u.code&&console.error(` Error code: ${u.code}`),d>256*1024&&console.error(" \u26A0\uFE0F Message exceeds SQS 256KB limit! Consider splitting or compressing.")}}async function Fe(e,{status:t,error:r,finalState:o}){let{EXECUTION_ID:n,SQS_AUTH_TOKEN:s,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:f,PROJECT_API_TOKEN:a}=e;if(!n)return;let l={executionId:n,...s&&{sqsAuthToken:s},status:t,...r&&{error:r},...o&&typeof o=="object"&&Object.keys(o).length>0?{finalState:o}:{},timestamp:new Date().toISOString()},c=i?"HTTP":f?"SQS":"NONE",d=JSON.stringify(l).length;console.log(`Sending final status: ${t} via ${c} (${(d/1024).toFixed(1)}KB)`);try{if(i)await ue(i,n,l,a);else if(f){let u=["completed","failed","insufficient_context","blocked"].includes(t)?"execution_completed":"progress_update";await ge(f,n,l,u)}else{console.warn("No transport configured for final status \u2014 neither PROGRESS_API_URL nor PROGRESS_QUEUE_URL set");return}console.log(`Final status ${t} sent via ${c}`)}catch(u){console.error(`Failed to send final status (${t}) via ${c}:`),console.error(` Payload: ${(d/1024).toFixed(1)}KB`),console.error(` Error: ${u.message}`),u.name&&console.error(` Error type: ${u.name}`),u.code&&console.error(` Error code: ${u.code}`)}}async function ue(e,t,r,o){let n=`${e}/${t}/progress`,s={"Content-Type":"application/json"};o&&(s.Authorization=`Bearer ${o}`);let i=await fetch(n,{method:"POST",headers:s,body:JSON.stringify(r)});if(!i.ok){let f=await i.text();throw new Error(`HTTP ${i.status}: ${f}`)}}async function ge(e,t,r,o="progress_update"){let n=JSON.stringify(r),s=(n.length/1024).toFixed(1);n.length>256*1024&&console.error(`\u274C SQS message too large: ${s}KB (limit 256KB) for ${t} [${o}]`),await Ft().send(new Kt({QueueUrl:e,MessageBody:n,MessageGroupId:t,MessageAttributes:{executionId:{DataType:"String",StringValue:t},messageType:{DataType:"String",StringValue:o}}}))}function Gt(e,t){try{let r=e?.sessionPath||e?.SESSION_PATH||process.env.ZIBBY_SESSION_PATH;if(!r||!t)return null;let o=Ne("fs"),s=Ne("path").join(r,t,"usage.json");if(!o.existsSync(s))return null;let i=o.readFileSync(s,"utf-8"),f=JSON.parse(i);return!f.input_tokens&&!f.output_tokens&&!f.inputTokens&&!f.outputTokens?null:f}catch{return null}}function Ge(e,t,r=null){return async function(n,s,i){let f=Date.now(),a=[],l="",c=console.log,d=process.stdout.write.bind(process.stdout),u=process.stderr.write.bind(process.stderr),$=!1;console.log=(...h)=>{let g=h.map(w=>typeof w=="string"?w:JSON.stringify(w)).join(" ");a.push(g),$=!0,c(...h),$=!1};let y="";process.stdout.write=(h,g,w)=>{if(!$){let E=typeof h=="string"?h:h.toString();y+=E;let m=y.split(`
3
+ `);y=m.pop()||"";for(let I of m){let D=I.trim();D&&a.push(D)}}return d(h,g,w)},c(`[Middleware] Started capturing logs for ${n}`);let U=!1,R=setInterval(()=>{if(U)return;let h=a.join(`
4
+ `);h!==l&&h.length>0&&(l=h,u(`\u{1F4E1} [Middleware] Sending live update for ${n}: ${h.length} chars, ${a.length} lines
5
+ `),e(n,"in_progress",h,i).catch(g=>{u(`\u26A0\uFE0F [Middleware] Failed to send live update: ${g.message}
6
+ `)}))},500);try{await e(n,"in_progress","",i);let h=await s(),g=((Date.now()-f)/1e3).toFixed(1);U=!0,clearInterval(R),await new Promise(m=>setImmediate(m)),console.log=c,process.stdout.write=d,y.trim()&&(a.push(y.trim()),y="");let w=a.join(`
7
+ `);u(`\u{1F4E1} [Middleware] Sending final update for ${n}: ${w.length} chars, ${a.length} total lines captured
8
+ `);let E=Gt(i,n);if(E)try{await t(i,`usage_${n}`,E)}catch(m){u(`\u26A0\uFE0F [Middleware] usage ship failed for ${n}: ${m.message}
9
+ `)}if(h.success){if(await e(n,"success",w||`Completed in ${g}s`,i),r)try{let m=r(n,h);m&&m.key&&m.value&&await t(i,m.key,m.value)}catch(m){u(`\u26A0\uFE0F [Middleware] artifactExtractor for ${n} threw: ${m.message}
10
+ `)}}else await e(n,"failed",`${w}
11
11
 
12
- Error: ${w.error}`,i);return w}catch(w){I=!0,clearInterval(_),await new Promise(h=>setImmediate(h)),console.log=c,process.stdout.write=p;let u=`${a.join(`
12
+ Error: ${h.error}`,i);return h}catch(h){U=!0,clearInterval(R),await new Promise(w=>setImmediate(w)),console.log=c,process.stdout.write=d;let g=`${a.join(`
13
13
  `)}
14
14
 
15
- Error: ${w.message}`;throw await e(n,"failed",u,i),w}}}import{existsSync as Gt,readFileSync as zt}from"fs";var Bt="/tmp/zibby-entrypoint-setup.log",Wt=500;function B(e){return e.replace(/\r/g,"").trimEnd()}function Ge({reportProgressFn:e,state:t,entrypointLogPath:r=Bt}={}){if(!t||!t.EXECUTION_ID)return{finalize:async()=>{},getBuffer:()=>""};let o=[],n=0,s=!1;try{if(Gt(r)){let u=zt(r,"utf-8");for(let h of u.split(`
16
- `)){let x=B(h);x&&o.push(x)}}}catch{}let i=console.log,f=console.warn,a=console.error,l=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr),p=!1,d=u=>(...h)=>{let x=h.map(m=>typeof m=="string"?m:(()=>{try{return JSON.stringify(m)}catch{return String(m)}})()).join(" ");for(let m of x.split(`
17
- `)){let O=B(m);O&&o.push(O)}p=!0;try{u(...h)}finally{p=!1}};console.log=d(i),console.warn=d(f),console.error=d(a);let R="",S="";process.stdout.write=(u,h,x)=>{if(!p){let m=typeof u=="string"?u:u.toString();R+=m;let O=R.split(`
18
- `);R=O.pop()||"";for(let b of O){let K=B(b);K&&o.push(K)}}return l(u,h,x)},process.stderr.write=(u,h,x)=>{if(!p){let m=typeof u=="string"?u:u.toString();S+=m;let O=S.split(`
19
- `);S=O.pop()||"";for(let b of O){let K=B(b);K&&o.push(K)}}return c(u,h,x)};let _=setInterval(()=>{if(s)return;let u=o.join(`
20
- `);u.length!==n&&(n=u.length,e("setup","in_progress",u,t).catch(h=>{c(`[setup-progress] flush failed: ${h.message}
21
- `)}))},Wt);return _.unref&&_.unref(),{finalize:async()=>{if(s)return;s=!0,clearInterval(_),console.log=i,console.warn=f,console.error=a,process.stdout.write=l,process.stderr.write=c,R.trim()&&(o.push(B(R)),R=""),S.trim()&&(o.push(B(S)),S="");let u=o.join(`
22
- `);if(u.length>0)try{await e("setup","in_progress",u,t)}catch(h){c(`[setup-progress] final flush failed: ${h.message}
15
+ Error: ${h.message}`;throw await e(n,"failed",g,i),h}}}import{existsSync as zt,readFileSync as Bt}from"fs";var Wt="/tmp/zibby-entrypoint-setup.log",Ht=500;function B(e){return e.replace(/\r/g,"").trimEnd()}function ze({reportProgressFn:e,state:t,entrypointLogPath:r=Wt}={}){if(!t||!t.EXECUTION_ID)return{finalize:async()=>{},getBuffer:()=>""};let o=[],n=0,s=!1;try{if(zt(r)){let g=Bt(r,"utf-8");for(let w of g.split(`
16
+ `)){let E=B(w);E&&o.push(E)}}}catch{}let i=console.log,f=console.warn,a=console.error,l=process.stdout.write.bind(process.stdout),c=process.stderr.write.bind(process.stderr),d=!1,u=g=>(...w)=>{let E=w.map(m=>typeof m=="string"?m:(()=>{try{return JSON.stringify(m)}catch{return String(m)}})()).join(" ");for(let m of E.split(`
17
+ `)){let I=B(m);I&&o.push(I)}d=!0;try{g(...w)}finally{d=!1}};console.log=u(i),console.warn=u(f),console.error=u(a);let $="",y="";process.stdout.write=(g,w,E)=>{if(!d){let m=typeof g=="string"?g:g.toString();$+=m;let I=$.split(`
18
+ `);$=I.pop()||"";for(let D of I){let L=B(D);L&&o.push(L)}}return l(g,w,E)},process.stderr.write=(g,w,E)=>{if(!d){let m=typeof g=="string"?g:g.toString();y+=m;let I=y.split(`
19
+ `);y=I.pop()||"";for(let D of I){let L=B(D);L&&o.push(L)}}return c(g,w,E)};let R=setInterval(()=>{if(s)return;let g=o.join(`
20
+ `);g.length!==n&&(n=g.length,e("setup","in_progress",g,t).catch(w=>{c(`[setup-progress] flush failed: ${w.message}
21
+ `)}))},Ht);return R.unref&&R.unref(),{finalize:async()=>{if(s)return;s=!0,clearInterval(R),console.log=i,console.warn=f,console.error=a,process.stdout.write=l,process.stderr.write=c,$.trim()&&(o.push(B($)),$=""),y.trim()&&(o.push(B(y)),y="");let g=o.join(`
22
+ `);if(g.length>0)try{await e("setup","in_progress",g,t)}catch(w){c(`[setup-progress] final flush failed: ${w.message}
23
23
  `)}},getBuffer:()=>o.join(`
24
- `)}}function ze({workflowType:e,jobId:t,projectId:r,agentType:o,model:n,egressIp:s,egressKind:i}){let f="\u2500".repeat(60),a=`${o||"default"} (model: ${n||"auto"})`,l=["",f,` Workflow: ${e}`,` Job: ${t||"local"}`,` Project: ${r||"none"}`,` Agent: ${a}`];if(s||i){let c=s||"unknown",p=i||"static";l.push(` Egress: ${c} (${p})`)}return l.push(f),l.join(`
25
- `)}import{existsSync as Ht,writeFileSync as Jt}from"fs";import{join as Be}from"path";var me={width:1280,height:720},Mt="on",Qt="tests",Yt="test-results/playwright";function qt(e={}){let t=e.viewport&&typeof e.viewport=="object"?{width:Number(e.viewport.width)||me.width,height:Number(e.viewport.height)||me.height}:me,r=typeof e.video=="string"?e.video:Mt,o=e.paths?.generated||Qt,n=e.playwrightArtifacts!==!1,s=n?"on":"off",i=n?"only-on-failure":"off";return`// AUTO-GENERATED at workflow run start by @zibby/cli's
24
+ `)}}function Be({workflowType:e,jobId:t,projectId:r,agentType:o,model:n,egressIp:s,egressKind:i}){let f="\u2500".repeat(60),a=`${o||"default"} (model: ${n||"auto"})`,l=["",f,` Workflow: ${e}`,` Job: ${t||"local"}`,` Project: ${r||"none"}`,` Agent: ${a}`];if(s||i){let c=s||"unknown",d=i||"static";l.push(` Egress: ${c} (${d})`)}return l.push(f),l.join(`
25
+ `)}import{existsSync as Jt,writeFileSync as Mt}from"fs";import{join as We}from"path";var me={width:1280,height:720},Qt="on",Yt="tests",qt="test-results/playwright";function Vt(e={}){let t=e.viewport&&typeof e.viewport=="object"?{width:Number(e.viewport.width)||me.width,height:Number(e.viewport.height)||me.height}:me,r=typeof e.video=="string"?e.video:Qt,o=e.paths?.generated||Yt,n=e.playwrightArtifacts!==!1,s=n?"on":"off",i=n?"only-on-failure":"off";return`// AUTO-GENERATED at workflow run start by @zibby/cli's
26
26
  // playwright-config-materialize.js. Derived from the bundled
27
27
  // zibby.config.json (which @zibby/workflow-deploy serialized from your
28
28
  // project's .zibby.config.mjs). Do NOT edit by hand \u2014 re-run a workflow
@@ -33,7 +33,7 @@ import { defineConfig } from '@playwright/test';
33
33
 
34
34
  export default defineConfig({
35
35
  testDir: '${o.replace(/'/g,"\\'")}',
36
- outputDir: '${Yt}',
36
+ outputDir: '${qt}',
37
37
  timeout: 60000,
38
38
  retries: 0,
39
39
  workers: 1,
@@ -48,8 +48,8 @@ export default defineConfig({
48
48
 
49
49
  reporter: [['list']],
50
50
  });
51
- `}function We(e,t){if(!e)return{written:!1,path:null,reason:"no workspaceDir"};for(let n of["js","mjs","ts"]){let s=Be(e,`playwright.config.${n}`);if(Ht(s))return{written:!1,path:s,reason:`existing playwright.config.${n} in workspace`}}let r=Be(e,"playwright.config.js"),o=qt(t||{});try{return Jt(r,o,"utf-8"),{written:!0,path:r,reason:"derived from zibby.config"}}catch(n){return{written:!1,path:null,reason:`write failed: ${n.message}`}}}import"@zibby/core";var V=process.env.WORKSPACE||"/workspace";async function Pr(e,t){Pt(t,{recursive:!0});let r=Date.now();console.log("[setup] Fetching bundle...");let o=setInterval(()=>{let s=((Date.now()-r)/1e3).toFixed(1);console.log(`[setup] still fetching (${s}s elapsed)`)},3e3);try{await new Promise((s,i)=>{let f=Ie("curl",["-fsSL",e],{stdio:["ignore","pipe","inherit"]}),a=Ie("tar",["-xzf","-","-C",t],{stdio:["pipe","inherit","inherit"]});f.stdout.pipe(a.stdin);let l,c,p=()=>{if(l!==void 0&&c!==void 0){if(l!==0)return i(new Error(`curl exited ${l}`));if(c!==0)return i(new Error(`tar exited ${c}`));s()}};f.on("close",d=>{l=d,p()}),a.on("close",d=>{c=d,p()}),f.on("error",i),a.on("error",i)})}finally{clearInterval(o)}let n=((Date.now()-r)/1e3).toFixed(1);return console.log(`[setup] Bundle extracted (${n}s)`),t}async function Tt(){let e=process.env.WORKFLOW_SOURCES_URL;if(!e)throw new Error("WORKFLOW_SOURCES_URL env var is required");let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch sources: ${t.status} ${t.statusText}`);let r=await t.json();if(!r.sources||typeof r.sources!="object")throw new Error('Invalid sources payload \u2014 missing "sources" map');return r}function Ar(e){let t=e?.agent;if(!t)return null;if(typeof t=="string")return t;if(typeof t=="object"){if(typeof t.provider=="string")return t.provider;for(let r of["claude","cursor","codex","gemini"])if(t[r])return r}return null}function vr(e,t){let r=It(t),o=0;for(let[n,s]of Object.entries(e)){let i=It(t,n);if(!i.startsWith(`${r}/`)&&i!==r){console.error(` \u26D4 Skipping unsafe path: ${n}`);continue}Pt(Tr(i),{recursive:!0}),Ir(i,s,"utf-8"),o++}return o}async function br(){let e=process.env.ZIBBY_EGRESS_PROXY_URL,t=process.env.ZIBBY_EGRESS_TOKEN;if(!(!e||!t))try{let r=await import("undici"),o=new r.ProxyAgent({uri:e,token:`Bearer ${t}`});r.setGlobalDispatcher(o)}catch(r){console.warn(`[setup] Failed to install egress proxy dispatcher: ${r.message}`)}}async function Dr(){if(process.env.ZIBBY_EGRESS_IP)return{ip:process.env.ZIBBY_EGRESS_IP,kind:"static"};try{let e=new AbortController,t=setTimeout(()=>e.abort(),1500),r=await fetch("https://api.ipify.org?format=json",{signal:e.signal});return clearTimeout(t),r.ok?{ip:(await r.json())?.ip||null,kind:"dynamic"}:{ip:null,kind:"dynamic"}}catch{return{ip:null,kind:"dynamic"}}}async function Lr(e,t){let r=D(e,"graph.mjs");if(!G(r))throw new Error(`graph.mjs not found at ${r}`);let o=await import(Oe(r).href),n=t?.entryClass,s=n&&o[n]||o.default||Object.values(o).find(i=>typeof i=="function"&&i.prototype?.buildGraph);if(!s)throw new Error("No WorkflowAgent class found in graph.mjs");return s}async function gn(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let g=await import("module");g.default._initPaths&&g.default._initPaths()}let e={EXECUTION_ID:process.env.EXECUTION_ID||process.env.WORKFLOW_JOB_ID||"",PROGRESS_API_URL:process.env.PROGRESS_API_URL||"",PROGRESS_QUEUE_URL:process.env.PROGRESS_QUEUE_URL||"",SQS_AUTH_TOKEN:process.env.SQS_AUTH_TOKEN||"",PROJECT_API_TOKEN:process.env.PROJECT_API_TOKEN||""},t=Ge({reportProgressFn:de,state:e});await br();let{WORKFLOW_JOB_ID:r,WORKFLOW_TYPE:o,PROJECT_ID:n,AGENT_TYPE:s,MODEL:i}=process.env;o||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1));let f=process.env.WORKFLOW_BUNDLE_URL,a,l={},c,p;if(f){c=o,a=D(V,".zibby","workflows",c);try{await Pr(f,a);try{let g=await Tt();l=g.input||{},p=g.version}catch{}}catch(g){console.warn(`[setup] Bundle extract failed (${g.message}); falling back to source install`),a=null}}if(!a){let g=await Tt(),{sources:E,input:T,workflowType:A,version:P}=g;l=T||{},c=A||o,p=P,console.log(`[setup] Workflow v${p||"?"} (${Object.keys(E).length} files)`),a=D(V,".zibby","workflows",c);let L=vr(E,a);console.log(`[setup] Wrote ${L} files`),console.log("[setup] Installing dependencies...");let v=Date.now();try{await new Promise((Lt,ve)=>{let Z=Ie("npm",["install","--silent","--no-audit","--no-fund"],{cwd:a,stdio:["ignore","pipe","pipe"]}),be=(k,De)=>{let ee="";k.on("data",te=>{ee+=te.toString();let Le=ee.split(`
52
- `);ee=Le.pop()||"";for(let kt of Le){let ke=kt.replace(/\r/g,"").trimEnd();ke&&De(ke)}}),k.on("end",()=>{let te=ee.replace(/\r/g,"").trimEnd();te&&De(te)})};be(Z.stdout,k=>console.log(`[npm] ${k}`)),be(Z.stderr,k=>console.warn(`[npm] ${k}`)),Z.on("error",ve),Z.on("close",k=>{k===0?Lt():ve(new Error(`npm install exited with code ${k}`))})});let H=((Date.now()-v)/1e3).toFixed(1);console.log(`[setup] Dependencies installed (${H}s)`)}catch(H){console.warn(`[setup] npm install failed: ${H.message}`)}}let d={},R=D(a,"workflow.json");G(R)&&(d=JSON.parse(Ot(R,"utf-8")));let S={},I=D(a,"zibby.config.json");if(G(I))try{S=JSON.parse(Ot(I,"utf-8")),console.log("[setup] Loaded user config from zibby.config.json")}catch(g){console.warn(`[setup] Failed to parse zibby.config.json: ${g.message} \u2014 falling back to defaults`)}let _=We(V,S);_.written?console.log(`[setup] Materialized playwright.config.js \u2192 ${_.path} (${_.reason})`):_.path&&console.log(`[setup] Using existing playwright config: ${_.path}`);let w=Ar(S)||s,u=await Dr();console.log(ze({workflowType:o,jobId:r,projectId:n,agentType:w,model:i,egressIp:u.ip,egressKind:u.kind}));let h=await Lr(a,d);console.log(`[setup] Loaded ${h.name}`);let x=[],m=D(a,"node_modules","@zibby","agent-workflow"),O=D(a,"node_modules","@zibby","core","node_modules","@zibby","agent-workflow");G(m)&&x.push({kind:"hoisted",path:m}),G(O)&&x.push({kind:"nested",path:O});let b=process.env.ZIBBY_RUN_DIAG==="1";if(b){let{readdirSync:g}=await import("fs");console.log(` [diag] @zibby/agent-workflow copies in bundle: ${x.length}`);for(let E of x)console.log(` [diag] ${E.kind}: ${E.path}`);try{let E=D(a,"node_modules","@zibby");G(E)&&console.log(` [diag] node_modules/@zibby/ contents: [${g(E).join(", ")}]`)}catch{}}let K=D(a,"node_modules","@zibby","core","dist","index.js");if(G(K)&&x.length>0)try{let g=await import(Oe(K).href),E=[g.AssistantStrategy,g.CursorAgentStrategy,g.ClaudeAgentStrategy,g.CodexAgentStrategy,g.GeminiAgentStrategy].filter(Boolean);for(let T of x){let A=D(T.path,"dist","index.js");if(!G(A))continue;let P=await import(Oe(A).href),L=b?P.listStrategies():null;for(let v of E)try{P.registerStrategy(new v)}catch(H){console.warn(` register ${v.name} into ${T.kind} failed: ${H.message}`)}b&&console.log(` [diag] ${T.kind} registry: before=[${L.join(",")||"empty"}] after=[${P.listStrategies().join(",")||"empty"}]`)}console.log("[setup] Registered 5 agent strategies (assistant, cursor, claude, codex, gemini)")}catch(g){console.warn(`[setup] Failed to bridge strategies: ${g.message}`)}else console.warn("[setup] No @zibby/core or @zibby/agent-workflow in bundle \u2014 agent strategies may be unavailable");let At=Date.now(),Te=new h({workflow:c||o}),ce=Te.buildGraph(),vt=Fe(de,je);Array.isArray(ce.middleware)?ce.middleware.push(vt):console.warn("[run] graph.middleware not an array \u2014 per-node progress reporting disabled for this run");let W=process.env.WORKFLOW_UUID||null,X=process.env.ZIBBY_CONVERSATION_ID||null,le=!1;if(W&&X)try{let{v5:g}=await Promise.resolve().then(()=>(yt(),St)),E=g(`${W}:${X}`,"6ba7b810-9dad-11d1-80b4-00c04fd430c8"),T=(process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE||"").replace(/\/executions\/?$/,"").replace(/\/+$/,""),A=process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] sessionId=${E} apiUrl=${T?"set":"unset"} apiKey=${A?"set":"unset"}`),T&&A){let P=`${T}/workflows/${encodeURIComponent(W)}/sessions/${encodeURIComponent(E)}`,L=await fetch(P,{method:"GET",headers:{Authorization:`Bearer ${A}`}});if(process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] GET ${P} \u2192 HTTP ${L.status}`),L.ok){let v=await L.json().catch(()=>({}));le=Array.isArray(v?.entries)&&v.entries.length>0,process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] hasPriorSession=${le} entries=${v?.entries?.length??"n/a"}`)}}}catch(g){process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] threw: ${g.message}`)}let fe=null;try{process.env.REPOS&&(fe=JSON.parse(process.env.REPOS))}catch{}let bt={...l||{},cwd:V,runId:r||`run-${Date.now()}`,config:S,input:l||{},...W?{workflowUuid:W}:{},...X?{conversationId:X}:{},...le?{hasPriorSession:!0}:{},workspace:V,...fe?{repos:fe}:{},...process.env.GITHUB_TOKEN?{githubToken:process.env.GITHUB_TOKEN}:{},EXECUTION_ID:process.env.EXECUTION_ID||r||"",PROGRESS_API_URL:process.env.PROGRESS_API_URL||"",PROGRESS_QUEUE_URL:process.env.PROGRESS_QUEUE_URL||"",SQS_AUTH_TOKEN:process.env.SQS_AUTH_TOKEN||"",PROJECT_API_TOKEN:process.env.PROJECT_API_TOKEN||""};await t.finalize(),console.log("");let z;try{z=await ce.run(Te,bt)}catch(g){console.error(`
53
- Workflow execution failed: ${g.message}`),console.error(g.stack),await Ue("failed",g.message),process.exit(1)}let Pe=((Date.now()-At)/1e3).toFixed(1),Dt=z?.success!==!1,Ae=c||o;if(process.env.UPLOAD_ARTIFACTS!=="0"){let g=z?.state?.sessionPath,E=process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE,T=process.env.PROJECT_API_TOKEN,A=process.env.WORKFLOW_JOB_ID;if(g&&E&&T&&A)try{let{uploadSessionArtifacts:P}=await Promise.resolve().then(()=>(Ut(),Rt)),{uploaded:L,skipped:v}=await P({sessionPath:g,executionId:A,apiUrl:E,apiKey:T});console.log(`[artifacts] uploaded ${L.length} file(s)${v.length?`, skipped ${v.length}`:""}`)}catch(P){console.warn(`[artifacts] uploader threw: ${P.message}`)}else console.log("[artifacts] skipping upload \u2014 sessionPath/apiUrl/apiKey/executionId missing")}Dt?(console.log(`
54
- [done] ${Ae} completed in ${Pe}s`),await Ue("completed",null,z?.state)):(console.error(`
55
- [done] ${Ae} failed after ${Pe}s`),await Ue("failed",z?.error||"Workflow execution failed",z?.state),process.exit(1))}async function Ue(e,t=null,r=void 0){let o={EXECUTION_ID:process.env.WORKFLOW_JOB_ID,PROGRESS_API_URL:process.env.PROGRESS_API_URL,PROGRESS_QUEUE_URL:process.env.PROGRESS_QUEUE_URL,PROJECT_API_TOKEN:process.env.PROJECT_API_TOKEN,SQS_AUTH_TOKEN:process.env.SQS_AUTH_TOKEN};if(o.EXECUTION_ID)try{await Ke(o,{status:e,...t&&{error:t},...r?{finalState:r}:{}})}catch(n){console.error(`\u26A0\uFE0F Failed to report status: ${n.message}`)}}export{Ar as resolveAgentFromConfig,gn as runWorkflowCommand};
51
+ `}function He(e,t){if(!e)return{written:!1,path:null,reason:"no workspaceDir"};for(let n of["js","mjs","ts"]){let s=We(e,`playwright.config.${n}`);if(Jt(s))return{written:!1,path:s,reason:`existing playwright.config.${n} in workspace`}}let r=We(e,"playwright.config.js"),o=Vt(t||{});try{return Mt(r,o,"utf-8"),{written:!0,path:r,reason:"derived from zibby.config"}}catch(n){return{written:!1,path:null,reason:`write failed: ${n.message}`}}}import"@zibby/core";var V=process.env.WORKSPACE||"/workspace";async function Ar(e,t){At(t,{recursive:!0});let r=Date.now();console.log("[setup] Fetching bundle...");let o=setInterval(()=>{let s=((Date.now()-r)/1e3).toFixed(1);console.log(`[setup] still fetching (${s}s elapsed)`)},3e3);try{await new Promise((s,i)=>{let f=Ie("curl",["-fsSL",e],{stdio:["ignore","pipe","inherit"]}),a=Ie("tar",["-xzf","-","-C",t],{stdio:["pipe","inherit","inherit"]});f.stdout.pipe(a.stdin);let l,c,d=()=>{if(l!==void 0&&c!==void 0){if(l!==0)return i(new Error(`curl exited ${l}`));if(c!==0)return i(new Error(`tar exited ${c}`));s()}};f.on("close",u=>{l=u,d()}),a.on("close",u=>{c=u,d()}),f.on("error",i),a.on("error",i)})}finally{clearInterval(o)}let n=((Date.now()-r)/1e3).toFixed(1);return console.log(`[setup] Bundle extracted (${n}s)`),t}async function Pt(){let e=process.env.WORKFLOW_SOURCES_URL;if(!e)throw new Error("WORKFLOW_SOURCES_URL env var is required");let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch sources: ${t.status} ${t.statusText}`);let r=await t.json();if(!r.sources||typeof r.sources!="object")throw new Error('Invalid sources payload \u2014 missing "sources" map');return r}function vr(e){let t=e?.agent;if(!t)return null;if(typeof t=="string")return t;if(typeof t=="object"){if(typeof t.provider=="string")return t.provider;for(let r of["claude","cursor","codex","gemini"])if(t[r])return r}return null}function br(e,t){let r=Tt(t),o=0;for(let[n,s]of Object.entries(e)){let i=Tt(t,n);if(!i.startsWith(`${r}/`)&&i!==r){console.error(` \u26D4 Skipping unsafe path: ${n}`);continue}At(Pr(i),{recursive:!0}),Tr(i,s,"utf-8"),o++}return o}async function Dr(){let e=process.env.ZIBBY_EGRESS_PROXY_URL,t=process.env.ZIBBY_EGRESS_TOKEN;if(!(!e||!t))try{let r=await import("undici"),o=new r.ProxyAgent({uri:e,token:`Bearer ${t}`});r.setGlobalDispatcher(o)}catch(r){console.warn(`[setup] Failed to install egress proxy dispatcher: ${r.message}`)}}async function Lr(){if(process.env.ZIBBY_EGRESS_IP)return{ip:process.env.ZIBBY_EGRESS_IP,kind:"static"};try{let e=new AbortController,t=setTimeout(()=>e.abort(),1500),r=await fetch("https://api.ipify.org?format=json",{signal:e.signal});return clearTimeout(t),r.ok?{ip:(await r.json())?.ip||null,kind:"dynamic"}:{ip:null,kind:"dynamic"}}catch{return{ip:null,kind:"dynamic"}}}async function Cr(e,t){let r=b(e,"graph.mjs");if(!G(r))throw new Error(`graph.mjs not found at ${r}`);let o=await import(Ue(r).href),n=t?.entryClass,s=n&&o[n]||o.default||Object.values(o).find(i=>typeof i=="function"&&i.prototype?.buildGraph);if(!s)throw new Error("No WorkflowAgent class found in graph.mjs");return s}async function mn(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let p=await import("module");p.default._initPaths&&p.default._initPaths()}let e={EXECUTION_ID:process.env.EXECUTION_ID||process.env.WORKFLOW_JOB_ID||"",PROGRESS_API_URL:process.env.PROGRESS_API_URL||"",PROGRESS_QUEUE_URL:process.env.PROGRESS_QUEUE_URL||"",SQS_AUTH_TOKEN:process.env.SQS_AUTH_TOKEN||"",PROJECT_API_TOKEN:process.env.PROJECT_API_TOKEN||""},t=ze({reportProgressFn:de,state:e});await Dr();let{WORKFLOW_JOB_ID:r,WORKFLOW_TYPE:o,PROJECT_ID:n,AGENT_TYPE:s,MODEL:i}=process.env;o||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1));let f=process.env.WORKFLOW_BUNDLE_URL,a,l={},c,d,u={};if(f){c=o,a=b(V,".zibby","workflows",c);try{await Ar(f,a);try{let p=await Pt();l=p.input||{},d=p.version,p.nodeConfigs&&typeof p.nodeConfigs=="object"&&(u=p.nodeConfigs)}catch{}}catch(p){console.warn(`[setup] Bundle extract failed (${p.message}); falling back to source install`),a=null}}if(!a){let p=await Pt(),{sources:x,input:T,workflowType:A,version:P}=p;l=T||{},c=A||o,d=P,p.nodeConfigs&&typeof p.nodeConfigs=="object"&&(u=p.nodeConfigs),console.log(`[setup] Workflow v${d||"?"} (${Object.keys(x).length} files)`),a=b(V,".zibby","workflows",c);let C=br(x,a);console.log(`[setup] Wrote ${C} files`),console.log("[setup] Installing dependencies...");let v=Date.now();try{await new Promise((Ct,be)=>{let Z=Ie("npm",["install","--silent","--no-audit","--no-fund"],{cwd:a,stdio:["ignore","pipe","pipe"]}),De=(k,Le)=>{let ee="";k.on("data",te=>{ee+=te.toString();let Ce=ee.split(`
52
+ `);ee=Ce.pop()||"";for(let kt of Ce){let ke=kt.replace(/\r/g,"").trimEnd();ke&&Le(ke)}}),k.on("end",()=>{let te=ee.replace(/\r/g,"").trimEnd();te&&Le(te)})};De(Z.stdout,k=>console.log(`[npm] ${k}`)),De(Z.stderr,k=>console.warn(`[npm] ${k}`)),Z.on("error",be),Z.on("close",k=>{k===0?Ct():be(new Error(`npm install exited with code ${k}`))})});let H=((Date.now()-v)/1e3).toFixed(1);console.log(`[setup] Dependencies installed (${H}s)`)}catch(H){console.warn(`[setup] npm install failed: ${H.message}`)}}let $={},y=b(a,"workflow.json");G(y)&&($=JSON.parse(It(y,"utf-8")));let U={},R=b(a,"zibby.config.json");if(G(R))try{U=JSON.parse(It(R,"utf-8")),console.log("[setup] Loaded user config from zibby.config.json")}catch(p){console.warn(`[setup] Failed to parse zibby.config.json: ${p.message} \u2014 falling back to defaults`)}let h=He(V,U);h.written?console.log(`[setup] Materialized playwright.config.js \u2192 ${h.path} (${h.reason})`):h.path&&console.log(`[setup] Using existing playwright config: ${h.path}`);let g=vr(U)||s,w=await Lr();console.log(Be({workflowType:o,jobId:r,projectId:n,agentType:g,model:i,egressIp:w.ip,egressKind:w.kind}));let E=await Cr(a,$);console.log(`[setup] Loaded ${E.name}`);let m=[],I=b(a,"node_modules","@zibby","agent-workflow"),D=b(a,"node_modules","@zibby","core","node_modules","@zibby","agent-workflow");G(I)&&m.push({kind:"hoisted",path:I}),G(D)&&m.push({kind:"nested",path:D});let L=process.env.ZIBBY_RUN_DIAG==="1";if(L){let{readdirSync:p}=await import("fs");console.log(` [diag] @zibby/agent-workflow copies in bundle: ${m.length}`);for(let x of m)console.log(` [diag] ${x.kind}: ${x.path}`);try{let x=b(a,"node_modules","@zibby");G(x)&&console.log(` [diag] node_modules/@zibby/ contents: [${p(x).join(", ")}]`)}catch{}}let Te=b(a,"node_modules","@zibby","core","dist","index.js");if(G(Te)&&m.length>0)try{let p=await import(Ue(Te).href),x=[p.AssistantStrategy,p.CursorAgentStrategy,p.ClaudeAgentStrategy,p.CodexAgentStrategy,p.GeminiAgentStrategy].filter(Boolean);for(let T of m){let A=b(T.path,"dist","index.js");if(!G(A))continue;let P=await import(Ue(A).href),C=L?P.listStrategies():null;for(let v of x)try{P.registerStrategy(new v)}catch(H){console.warn(` register ${v.name} into ${T.kind} failed: ${H.message}`)}L&&console.log(` [diag] ${T.kind} registry: before=[${C.join(",")||"empty"}] after=[${P.listStrategies().join(",")||"empty"}]`)}console.log("[setup] Registered 5 agent strategies (assistant, cursor, claude, codex, gemini)")}catch(p){console.warn(`[setup] Failed to bridge strategies: ${p.message}`)}else console.warn("[setup] No @zibby/core or @zibby/agent-workflow in bundle \u2014 agent strategies may be unavailable");let vt=Date.now(),Pe=new E({workflow:c||o}),ce=Pe.buildGraph(),bt=Ge(de,Ke);Array.isArray(ce.middleware)?ce.middleware.push(bt):console.warn("[run] graph.middleware not an array \u2014 per-node progress reporting disabled for this run");let W=process.env.WORKFLOW_UUID||null,X=process.env.ZIBBY_CONVERSATION_ID||null,le=!1;if(W&&X)try{let{v5:p}=await Promise.resolve().then(()=>(xt(),yt)),x=p(`${W}:${X}`,"6ba7b810-9dad-11d1-80b4-00c04fd430c8"),T=(process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE||"").replace(/\/executions\/?$/,"").replace(/\/+$/,""),A=process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] sessionId=${x} apiUrl=${T?"set":"unset"} apiKey=${A?"set":"unset"}`),T&&A){let P=`${T}/workflows/${encodeURIComponent(W)}/sessions/${encodeURIComponent(x)}`,C=await fetch(P,{method:"GET",headers:{Authorization:`Bearer ${A}`}});if(process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] GET ${P} \u2192 HTTP ${C.status}`),C.ok){let v=await C.json().catch(()=>({}));le=Array.isArray(v?.entries)&&v.entries.length>0,process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] hasPriorSession=${le} entries=${v?.entries?.length??"n/a"}`)}}}catch(p){process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] threw: ${p.message}`)}let fe=null;try{process.env.REPOS&&(fe=JSON.parse(process.env.REPOS))}catch{}let Dt={...l||{},cwd:V,runId:r||`run-${Date.now()}`,config:U,input:l||{},...u&&Object.keys(u).length>0?{nodeConfigs:u}:{},...W?{workflowUuid:W}:{},...X?{conversationId:X}:{},...le?{hasPriorSession:!0}:{},workspace:V,...fe?{repos:fe}:{},...process.env.GITHUB_TOKEN?{githubToken:process.env.GITHUB_TOKEN}:{},EXECUTION_ID:process.env.EXECUTION_ID||r||"",PROGRESS_API_URL:process.env.PROGRESS_API_URL||"",PROGRESS_QUEUE_URL:process.env.PROGRESS_QUEUE_URL||"",SQS_AUTH_TOKEN:process.env.SQS_AUTH_TOKEN||"",PROJECT_API_TOKEN:process.env.PROJECT_API_TOKEN||""};await t.finalize(),console.log("");let z;try{z=await ce.run(Pe,Dt)}catch(p){console.error(`
53
+ Workflow execution failed: ${p.message}`),console.error(p.stack),await Oe("failed",p.message),process.exit(1)}let Ae=((Date.now()-vt)/1e3).toFixed(1),Lt=z?.success!==!1,ve=c||o;if(process.env.UPLOAD_ARTIFACTS!=="0"){let p=z?.state?.sessionPath,x=process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE,T=process.env.PROJECT_API_TOKEN,A=process.env.WORKFLOW_JOB_ID;if(p&&x&&T&&A)try{let{uploadSessionArtifacts:P}=await Promise.resolve().then(()=>(Ut(),Ot)),{uploaded:C,skipped:v}=await P({sessionPath:p,executionId:A,apiUrl:x,apiKey:T});console.log(`[artifacts] uploaded ${C.length} file(s)${v.length?`, skipped ${v.length}`:""}`)}catch(P){console.warn(`[artifacts] uploader threw: ${P.message}`)}else console.log("[artifacts] skipping upload \u2014 sessionPath/apiUrl/apiKey/executionId missing")}Lt?(console.log(`
54
+ [done] ${ve} completed in ${Ae}s`),await Oe("completed",null,z?.state)):(console.error(`
55
+ [done] ${ve} failed after ${Ae}s`),await Oe("failed",z?.error||"Workflow execution failed",z?.state),process.exit(1))}async function Oe(e,t=null,r=void 0){let o={EXECUTION_ID:process.env.WORKFLOW_JOB_ID,PROGRESS_API_URL:process.env.PROGRESS_API_URL,PROGRESS_QUEUE_URL:process.env.PROGRESS_QUEUE_URL,PROJECT_API_TOKEN:process.env.PROJECT_API_TOKEN,SQS_AUTH_TOKEN:process.env.SQS_AUTH_TOKEN};if(o.EXECUTION_ID)try{await Fe(o,{status:e,...t&&{error:t},...r?{finalState:r}:{}})}catch(n){console.error(`\u26A0\uFE0F Failed to report status: ${n.message}`)}}export{vr as resolveAgentFromConfig,mn as runWorkflowCommand};
@@ -1,63 +1,63 @@
1
- var K=Object.defineProperty;var q=(o,e)=>()=>(o&&(e=o(o=0)),e);var H=(o,e)=>{for(var t in e)K(o,t,{get:e[t],enumerable:!0})};var G={};H(G,{logsCommand:()=>me,parseSseChunk:()=>F,runReconnectLoop:()=>J,sseBackoffMs:()=>M});import i from"chalk";import{readFileSync as ne,existsSync as re,writeSync as se}from"fs";import{homedir as ie}from"os";import{join as le}from"path";async function ce(o){return T||(process.env.ZIBBY_SSE_ENDPOINT?(T=process.env.ZIBBY_SSE_ENDPOINT,T):(T=ae,T))}function fe(o){let e=le(ie(),".zibby","config.json");re(e)||(console.log(i.red(`
1
+ var ee=Object.defineProperty;var z=(o,e)=>()=>(o&&(e=o(o=0)),e);var oe=(o,e)=>{for(var t in e)ee(o,t,{get:e[t],enumerable:!0})};function v(){let o;if(process.env.ZIBBY_API_URL)o=process.env.ZIBBY_API_URL;else{let e=process.env.ZIBBY_ENV||"prod";j[e]?o=j[e].apiUrl:o=j.prod.apiUrl}try{let e=new URL(o);return e.protocol!=="http:"&&e.protocol!=="https:"?(console.error(`\u26A0\uFE0F Invalid API URL protocol: ${e.protocol} (only http/https allowed)`),j.prod.apiUrl):o}catch{return console.error(`\u26A0\uFE0F Invalid API URL: ${o}`),j.prod.apiUrl}}var j,A=z(()=>{j={local:{name:"Local Development",apiUrl:"http://localhost:3001",accountApiUrl:"http://localhost:3001",frontendUrl:"http://localhost:3000",description:"Local backend running on port 3001"},prod:{name:"Production",apiUrl:process.env.ZIBBY_PROD_API_URL||"https://api-prod.zibby.app",accountApiUrl:process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app",frontendUrl:process.env.ZIBBY_PROD_FRONTEND_URL||"https://studio.zibby.dev",description:"Production environment"}}});var H={};oe(H,{logsCommand:()=>Ie,parseSseChunk:()=>W,runReconnectLoop:()=>V,sseBackoffMs:()=>G});import i from"chalk";import{readFileSync as ae,existsSync as ce,writeSync as B}from"fs";import{homedir as le}from"os";import{join as fe}from"path";async function ue(o){return _||(process.env.ZIBBY_SSE_ENDPOINT?(_=process.env.ZIBBY_SSE_ENDPOINT,_):(_=pe,_))}function de(o){let e=fe(le(),".zibby","config.json");ce(e)||(console.log(i.red(`
2
2
  Not authenticated`)),console.log(i.gray(` Run: zibby login
3
- `)),process.exit(1));let t;try{t=JSON.parse(ne(e,"utf-8"))}catch{console.log(i.red(`
3
+ `)),process.exit(1));let t;try{t=JSON.parse(ae(e,"utf-8"))}catch{console.log(i.red(`
4
4
  Config file corrupt`)),console.log(i.gray(` Run: zibby login
5
5
  `)),process.exit(1)}let n=t.sessionToken;n||(console.log(i.red(`
6
6
  Not authenticated`)),console.log(i.gray(` Run: zibby login
7
- `)),process.exit(1));let s=o.project;return{token:n,projectId:s}}function B(o){let e=new Date(o);if(process.env.ZIBBY_LOGS_UTC==="1")return e.toISOString().replace("T"," ").replace("Z","");let t=(n,s=2)=>String(n).padStart(s,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}.${t(e.getMilliseconds(),3)}`}async function Y(o,e){let t=await fetch(o,{headers:{Authorization:`Bearer ${e}`}});if(!t.ok){let n=await t.text();throw new Error(`API ${t.status}: ${n}`)}return t.json()}async function pe(o,e,t,n){return o||(console.log(i.red(`
7
+ `)),process.exit(1));let s=o.project;return{token:n,projectId:s}}function L(o){let e=new Date(o);if(process.env.ZIBBY_LOGS_UTC==="1")return e.toISOString().replace("T"," ").replace("Z","");let t=(n,s=2)=>String(n).padStart(s,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}.${t(e.getMilliseconds(),3)}`}async function J(o,e){let t=await fetch(o,{headers:{Authorization:`Bearer ${e}`}});if(!t.ok){let n=await t.text();throw new Error(`API ${t.status}: ${n}`)}return t.json()}async function ge(o,e,t,n){return o||(console.log(i.red(`
8
8
  Workflow UUID is required`)),console.log(i.gray(" Usage: zibby workflow logs <workflow-uuid>")),console.log(i.gray(` zibby workflow logs <workflow-uuid> -t
9
- `)),process.exit(1)),o}function F(o,e){let n=((o||"")+e).split(`
10
- `),s=n.pop()||"",l=[],a=null,r=null;for(let c=0;c<n.length;c++){let f=n[c];if(f.trim()){if(f.startsWith("id:")){a=f.slice(3).trim();continue}if(f.startsWith("event:")){let d=f.slice(6).trim();if(d==="log")continue;if(d==="status"){let p=n[c+1];if(p&&p.startsWith("data:"))try{let g=JSON.parse(p.slice(5).trim());g.status==="new_execution"?l.push({type:"newExecution",executionId:g.executionId,taskId:g.taskId}):g.status==="waiting"&&l.push({type:"waiting"})}catch{}continue}if(d==="complete"){l.push({type:"complete"});continue}if(d==="error"){let p=n[c+1];if(p&&p.startsWith("data:"))try{if(JSON.parse(p.slice(5).trim()).error==="No executions found for workflow"){r={type:"notFound"};break}}catch{}r={type:"failed"};break}continue}if(f.startsWith("data:")){let d=f.slice(5).trim();if(!d)continue;try{let p=JSON.parse(d);p.timestamp&&p.message&&l.push({type:"log",timestamp:p.timestamp,message:p.message,taskId:p.taskId})}catch{}}}}return{actions:l,remainder:s,lastEventId:a,returnSignal:r}}async function ue({token:o,executionId:e,sseEndpoint:t,stopped:n}){let s=null;try{let h=function(){let $=Array.from(y.entries()).slice(0,p);y.clear();for(let[I,w]of $)y.set(I,w);u=new Set(Array.from(y.values()).map(I=>I.taskId).filter(Boolean));for(let I of[...m.keys()])y.has(I)||m.delete(I)},E=function(b){for(let[$,I]of y)if(I.taskId===b)return $;return null},v=function(b){let $=y.get(b);!$||$.headerPrinted||(console.log(i.cyan(`
9
+ `)),process.exit(1)),o}function W(o,e){let n=((o||"")+e).split(`
10
+ `),s=n.pop()||"",a=[],c=null,l=null;for(let r=0;r<n.length;r++){let f=n[r];if(f.trim()){if(f.startsWith("id:")){c=f.slice(3).trim();continue}if(f.startsWith("event:")){let u=f.slice(6).trim();if(u==="log")continue;if(u==="status"){let p=n[r+1];if(p&&p.startsWith("data:"))try{let g=JSON.parse(p.slice(5).trim());g.status==="new_execution"?a.push({type:"newExecution",executionId:g.executionId,taskId:g.taskId}):g.status==="waiting"&&a.push({type:"waiting"})}catch{}continue}if(u==="complete"){a.push({type:"complete"});continue}if(u==="error"){let p=n[r+1];if(p&&p.startsWith("data:"))try{if(JSON.parse(p.slice(5).trim()).error==="No executions found for workflow"){l={type:"notFound"};break}}catch{}l={type:"failed"};break}continue}if(f.startsWith("data:")){let u=f.slice(5).trim();if(!u)continue;try{let p=JSON.parse(u);p.timestamp&&p.message&&a.push({type:"log",timestamp:p.timestamp,message:p.message,taskId:p.taskId})}catch{}}}}return{actions:a,remainder:s,lastEventId:c,returnSignal:l}}async function me({token:o,executionId:e,sseEndpoint:t,stopped:n}){let s=null;try{let h=function(){let $=Array.from(y.entries()).slice(0,p);y.clear();for(let[I,w]of $)y.set(I,w);d=new Set(Array.from(y.values()).map(I=>I.taskId).filter(Boolean));for(let I of[...m.keys()])y.has(I)||m.delete(I)},S=function(b){for(let[$,I]of y)if(I.taskId===b)return $;return null},T=function(b){let $=y.get(b);!$||$.headerPrinted||(console.log(i.cyan(`
11
11
  \u250C\u2500 Execution: ${$.shortId} (task: ${$.taskSuffix})`)),console.log(i.cyan(` \u2514\u2500 Streaming logs...
12
- `)),$.headerPrinted=!0)},_=function(b){let $=i.gray(B(b.timestamp)),I=b.taskId?i.gray(`(${b.taskId.slice(-8)}) `):"";console.log(`${$} ${I}${b.message.replace(/\n$/,"")}`)},R=function(){if(!k)return;k=!1,x&&(clearTimeout(x),x=null);let b=Array.from(y.entries()).reverse();for(let[$]of b){let I=m.get($);if(!(!I||I.length===0)){v($);for(let w of I)_(w)}}m.clear()},P=function(){k&&(x&&clearTimeout(x),x=setTimeout(R,g))},l=new URL(t);l.searchParams.set("jobId",e),s&&l.searchParams.set("lastEventId",s);let a=await fetch(l.toString(),{headers:{Authorization:`Bearer ${o}`,Accept:"text/event-stream"}});if(!a.ok)throw new Error(`SSE connection failed: ${a.status} ${a.statusText}`);let r=a.body.getReader(),c=new TextDecoder,f="",d=!1,p=Number(process.env.ZIBBY_LOGS_HISTORY_LIMIT)||10,g=Number(process.env.ZIBBY_LOGS_REPLAY_TIMEOUT_MS)||3e3,y=new Map,u=new Set,m=new Map,k=!0,x=null;for(P();!n.value;){let{done:b,value:$}=await r.read();if(b)break;let I=F(f,c.decode($,{stream:!0}));f=I.remainder,I.lastEventId&&(s=I.lastEventId);for(let w of I.actions)switch(w.type){case"newExecution":{let S=`${w.executionId.slice(0,8)}...${w.executionId.slice(-4)}`,N=w.taskId?w.taskId.slice(-8):"pending";y.set(w.executionId,{shortId:S,taskSuffix:N,taskId:w.taskId||null,headerPrinted:!1}),m.has(w.executionId)||m.set(w.executionId,[]),h(),P();break}case"waiting":R(),console.log(i.gray(`
13
- Waiting for next execution...`));break;case"complete":R(),d=!0;break;case"log":{if(w.taskId&&u.size>0&&!u.has(w.taskId))break;if(k){let S=w.taskId?E(w.taskId):null;if(S){let N=m.get(S)||[];N.push(w),m.set(S,N),P()}else _(w)}else{if(w.taskId){let S=E(w.taskId);S&&v(S)}_(w)}break}}if(I.returnSignal)return I.returnSignal.type==="notFound"?{notFound:!0}:{failed:!0}}return R(),{completed:d}}catch(l){if(l.name==="AbortError")return{aborted:!0};throw l}}function M(o,{baseMs:e=500,capMs:t=3e4,rand:n=Math.random}={}){let s=Math.min(t,e*Math.pow(2,Math.max(0,o)));return Math.floor(n()*s)}async function J({attemptStream:o,stopped:e,follow:t,logger:n,sleep:s=c=>new Promise(f=>setTimeout(f,c)),exit:l=c=>{throw new Error(`exit:${c}`)},backoff:a=M,notFoundPollMs:r=5e3}){let c=0,f=!1;for(;!e.value;){let d;try{d=await o(),c=0}catch(p){if(p.name==="AbortError"||e.value)return{reason:"aborted"};if(f||(n.error(` SSE Error: ${p.message}`),t&&n.gray(" Reconnecting..."),f=!0),!t)return l("error")??{reason:"error"};let g=a(c);c++,await s(g);continue}if(d.aborted||e.value)return{reason:"aborted"};if(d.notFound){if(t){f||(n.yellow(" No executions found yet. Waiting for workflow to be triggered..."),n.gray(" Press Ctrl+C to stop."),f=!0),await s(r);continue}return n.yellow(`
12
+ `)),$.headerPrinted=!0)},U=function(b){let $=i.gray(L(b.timestamp)),I=b.taskId?i.gray(`(${b.taskId.slice(-8)}) `):"";console.log(`${$} ${I}${b.message.replace(/\n$/,"")}`)},R=function(){if(!k)return;k=!1,x&&(clearTimeout(x),x=null);let b=Array.from(y.entries()).reverse();for(let[$]of b){let I=m.get($);if(!(!I||I.length===0)){T($);for(let w of I)U(w)}}m.clear()},P=function(){k&&(x&&clearTimeout(x),x=setTimeout(R,g))},a=new URL(t);a.searchParams.set("jobId",e),s&&a.searchParams.set("lastEventId",s);let c=await fetch(a.toString(),{headers:{Authorization:`Bearer ${o}`,Accept:"text/event-stream"}});if(!c.ok)throw new Error(`SSE connection failed: ${c.status} ${c.statusText}`);let l=c.body.getReader(),r=new TextDecoder,f="",u=!1,p=Number(process.env.ZIBBY_LOGS_HISTORY_LIMIT)||10,g=Number(process.env.ZIBBY_LOGS_REPLAY_TIMEOUT_MS)||3e3,y=new Map,d=new Set,m=new Map,k=!0,x=null;for(P();!n.value;){let{done:b,value:$}=await l.read();if(b)break;let I=W(f,r.decode($,{stream:!0}));f=I.remainder,I.lastEventId&&(s=I.lastEventId);for(let w of I.actions)switch(w.type){case"newExecution":{let E=`${w.executionId.slice(0,8)}...${w.executionId.slice(-4)}`,N=w.taskId?w.taskId.slice(-8):"pending";y.set(w.executionId,{shortId:E,taskSuffix:N,taskId:w.taskId||null,headerPrinted:!1}),m.has(w.executionId)||m.set(w.executionId,[]),h(),P();break}case"waiting":R(),console.log(i.gray(`
13
+ Waiting for next execution...`));break;case"complete":R(),u=!0;break;case"log":{if(w.taskId&&d.size>0&&!d.has(w.taskId))break;if(k){let E=w.taskId?S(w.taskId):null;if(E){let N=m.get(E)||[];N.push(w),m.set(E,N),P()}else U(w)}else{if(w.taskId){let E=S(w.taskId);E&&T(E)}U(w)}break}}if(I.returnSignal)return I.returnSignal.type==="notFound"?{notFound:!0}:{failed:!0}}return R(),{completed:u}}catch(a){if(a.name==="AbortError")return{aborted:!0};throw a}}function G(o,{baseMs:e=500,capMs:t=3e4,rand:n=Math.random}={}){let s=Math.min(t,e*Math.pow(2,Math.max(0,o)));return Math.floor(n()*s)}async function V({attemptStream:o,stopped:e,follow:t,logger:n,sleep:s=r=>new Promise(f=>setTimeout(f,r)),exit:a=r=>{throw new Error(`exit:${r}`)},backoff:c=G,notFoundPollMs:l=5e3}){let r=0,f=!1;for(;!e.value;){let u;try{u=await o(),r=0}catch(p){if(p.name==="AbortError"||e.value)return{reason:"aborted"};if(f||(n.error(` SSE Error: ${p.message}`),t&&n.gray(" Reconnecting..."),f=!0),!t)return a("error")??{reason:"error"};let g=c(r);r++,await s(g);continue}if(u.aborted||e.value)return{reason:"aborted"};if(u.notFound){if(t){f||(n.yellow(" No executions found yet. Waiting for workflow to be triggered..."),n.gray(" Press Ctrl+C to stop."),f=!0),await s(l);continue}return n.yellow(`
14
14
  No executions found for this workflow. Trigger the workflow first.
15
- `),l("notFound")??{reason:"notFound"}}if(f&&(n.gray(` Reconnected.
16
- `),f=!1),d.failed)return n.red(`
17
- Execution failed.`),t?{reason:"failed"}:l("failed")??{reason:"failed"};if(d.completed)return l("completed")??{reason:"completed"};if(!t)return{reason:"disconnected"}}return{reason:"stopped"}}async function de({token:o,jobId:e,follow:t,projectId:n}){console.log(i.gray(` Streaming logs for workflow ${i.cyan(e)}...`)),console.log(t?i.gray(` Press Ctrl+C to stop.
18
- `):"");let s=await ce(o);if(!s)return console.log(i.yellow(` SSE endpoint not configured, using CloudWatch polling...
19
- `)),Z({token:o,projectId:null,jobId:e,follow:t,limit:1e5});let l={value:!1},a=()=>{l.value=!0;try{se(2,`
15
+ `),a("notFound")??{reason:"notFound"}}if(f&&(n.gray(` Reconnected.
16
+ `),f=!1),u.failed)return n.red(`
17
+ Execution failed.`),t?{reason:"failed"}:a("failed")??{reason:"failed"};if(u.completed)return a("completed")??{reason:"completed"};if(!t)return{reason:"disconnected"}}return{reason:"stopped"}}async function K(o){if(process.env.ZIBBY_SSE_NO_WAKE==="1")return{state:"unknown"};try{let e=v().replace(/\/$/,""),t=await fetch(`${e}/logs/wake`,{method:"POST",headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});if(!t.ok)return{state:"unknown"};let n=await t.json().catch(()=>({}));return n&&(n.state==="ready"||n.state==="warming")?{state:n.state}:{state:"unknown"}}catch{return{state:"unknown"}}}async function ye(o,{timeoutMs:e=9e4,pollMs:t=3e3}={}){let n=Date.now(),s=0,a=process.stderr.isTTY,c=()=>{if(!a)return;let f=Math.round((Date.now()-n)/1e3),u=Z[s++%Z.length];try{B(2,`\r ${i.cyan(u)} Starting log stream\u2026 (~60s on first connect) ${i.gray(`${f}s`)} `)}catch{}},l=()=>{if(a)try{B(2,`\r${" ".repeat(64)}\r`)}catch{}};a||console.log(i.gray(" Starting log stream\u2026 (~60s on first connect)"));let r=a?setInterval(c,120):null;try{for(;Date.now()-n<e;){let{state:f}=await K(o);if(f==="ready")break;await new Promise(u=>setTimeout(u,t))}}finally{r&&clearInterval(r),l()}}async function we({token:o,jobId:e,follow:t,projectId:n}){(await K(o)).state==="warming"&&await ye(o),console.log(i.gray(` Streaming logs for workflow ${i.cyan(e)}...`)),console.log(t?i.gray(` Press Ctrl+C to stop.
18
+ `):"");let a=await ue(o);if(!a)return console.log(i.yellow(` SSE endpoint not configured, using CloudWatch polling...
19
+ `)),q({token:o,projectId:null,jobId:e,follow:t,limit:1e5});let c={value:!1},l=()=>{c.value=!0;try{B(2,`
20
20
  Stopped streaming.
21
- `)}catch{}process.exit(0)};process.prependListener("SIGINT",a),process.prependListener("SIGTERM",a),await J({attemptStream:()=>ue({token:o,executionId:e,sseEndpoint:s,stopped:l}),stopped:l,follow:t,logger:{gray:r=>console.log(i.gray(r)),red:r=>console.log(i.red(r)),yellow:r=>console.log(i.yellow(r)),error:r=>console.error(i.red(r))},exit:r=>{r==="completed"&&process.exit(0),(r==="error"||r==="notFound"||r==="failed")&&process.exit(1)}})}async function Z({token:o,projectId:e,jobId:t,follow:n,limit:s}){let l=e?`${A}/logs/${e}/${t}`:`${A}/job/${t}`,a=null,r=0,c=new Set,f=!1,d=0,p=5,g=()=>{f=!0,console.log(i.gray(`
21
+ `)}catch{}process.exit(0)};process.prependListener("SIGINT",l),process.prependListener("SIGTERM",l),await V({attemptStream:()=>me({token:o,executionId:e,sseEndpoint:a,stopped:c}),stopped:c,follow:t,logger:{gray:r=>console.log(i.gray(r)),red:r=>console.log(i.red(r)),yellow:r=>console.log(i.yellow(r)),error:r=>console.error(i.red(r))},exit:r=>{r==="completed"&&process.exit(0),(r==="error"||r==="notFound"||r==="failed")&&process.exit(1)}})}async function q({token:o,projectId:e,jobId:t,follow:n,limit:s}){let a=e?`${C}/logs/${e}/${t}`:`${C}/job/${t}`,c=null,l=0,r=new Set,f=!1,u=0,p=5,g=()=>{f=!0,console.log(i.gray(`
22
22
  Stopped tailing.
23
23
  `)),process.exit(0)};for(process.on("SIGINT",g),process.on("SIGTERM",g),console.log(i.gray(` Fetching logs for workflow ${i.cyan(t)}...`)),console.log(n?i.gray(` Press Ctrl+C to stop.
24
- `):"");!f;)try{let y=new URLSearchParams({limit:String(s)});a&&y.set("nextToken",a);let u=await Y(`${l}?${y}`,o);d=0,u.message&&u.lines?.length===0&&r===0&&console.log(i.gray(` ${u.message}`)),u.status==="starting"&&u.lines?.length===0&&r===0&&console.log(i.gray(" Container starting..."));for(let h of u.lines||[]){let E=`${h.timestamp}:${h.message}`;if(c.has(E))continue;c.add(E);let v=i.gray(B(h.timestamp)),_=u.taskId?i.gray(`(${u.taskId.slice(-8)}) `):"";console.log(`${v} ${_}${h.message.replace(/\n$/,"")}`)}if(r=u.lines?.length>0?0:r+1,a=u.nextForwardToken||null,u.status==="completed"||u.status==="failed"){let h=u.status==="completed"?i.green:i.red;console.log(h(`
25
- Job ${u.status}.`)),process.exit(u.status==="completed"?0:1)}if(!n){u.status&&console.log(i.gray(`
26
- Status: ${u.status}`));break}let x=u.lines?.length>0?500:r>5?5e3:2e3;await new Promise(h=>setTimeout(h,x))}catch(y){if(y.name==="AbortError")break;y.message.match(/API (400|401|403|404):/)&&(console.error(i.red(`
24
+ `):"");!f;)try{let y=new URLSearchParams({limit:String(s)});c&&y.set("nextToken",c);let d=await J(`${a}?${y}`,o);u=0,d.message&&d.lines?.length===0&&l===0&&console.log(i.gray(` ${d.message}`)),d.status==="starting"&&d.lines?.length===0&&l===0&&console.log(i.gray(" Container starting..."));for(let h of d.lines||[]){let S=`${h.timestamp}:${h.message}`;if(r.has(S))continue;r.add(S);let T=i.gray(L(h.timestamp)),U=d.taskId?i.gray(`(${d.taskId.slice(-8)}) `):"";console.log(`${T} ${U}${h.message.replace(/\n$/,"")}`)}if(l=d.lines?.length>0?0:l+1,c=d.nextForwardToken||null,d.status==="completed"||d.status==="failed"){let h=d.status==="completed"?i.green:i.red;console.log(h(`
25
+ Job ${d.status}.`)),process.exit(d.status==="completed"?0:1)}if(!n){d.status&&console.log(i.gray(`
26
+ Status: ${d.status}`));break}let x=d.lines?.length>0?500:l>5?5e3:2e3;await new Promise(h=>setTimeout(h,x))}catch(y){if(y.name==="AbortError")break;y.message.match(/API (400|401|403|404):/)&&(console.error(i.red(`
27
27
  ${y.message}
28
- `)),process.exit(1)),d++,console.error(i.red(` Error: ${y.message}`)),d>=p&&(console.error(i.red(`
28
+ `)),process.exit(1)),u++,console.error(i.red(` Error: ${y.message}`)),u>=p&&(console.error(i.red(`
29
29
  Too many consecutive errors (${p}). Stopping.
30
- `)),process.exit(1)),n||process.exit(1),await new Promise(m=>setTimeout(m,3e3))}}async function ge({token:o,projectId:e,workflow:t,follow:n,limit:s}){let l=`${A}/all/${e}`,a=null,r=0,c=new Set,f=null,d=!1,p=0,g=5,y=()=>{d=!0,console.log(i.gray(`
30
+ `)),process.exit(1)),n||process.exit(1),await new Promise(m=>setTimeout(m,3e3))}}async function he({token:o,projectId:e,workflow:t,follow:n,limit:s}){let a=`${C}/all/${e}`,c=null,l=0,r=new Set,f=null,u=!1,p=0,g=5,y=()=>{u=!0,console.log(i.gray(`
31
31
  Stopped tailing.
32
32
  `)),process.exit(0)};for(process.on("SIGINT",y),process.on("SIGTERM",y),console.log(i.gray(`
33
33
  Tailing all runs for ${i.cyan(t)}...`)),console.log(n?i.gray(` Press Ctrl+C to stop.
34
- `):"");!d;)try{let u=new URLSearchParams({workflow:t,limit:String(s)});a&&u.set("nextToken",a);let m=await Y(`${l}?${u}`,o);p=0,m.message&&m.lines?.length===0&&r===0&&console.log(i.gray(` ${m.message}`));for(let h of m.lines||[]){let E=`${h.timestamp}:${h.jobId}:${h.message}`;if(c.has(E))continue;c.add(E),h.jobId!==f&&(f!==null&&console.log(""),console.log(i.dim(` \u2500\u2500 ${h.jobId} \u2500\u2500`)),f=h.jobId);let v=i.gray(B(h.timestamp));console.log(`${v} ${h.message.replace(/\n$/,"")}`)}if(r=m.lines?.length>0?0:r+1,a=m.nextToken||null,!n){a&&console.log(i.gray(`
35
- ... more logs available. Run again or use --follow to stream.`)),m.jobCount&&console.log(i.gray(` ${m.jobCount} job(s) found.`));break}if(!m.hasRunning&&!a&&r>2){console.log(i.gray(`
36
- No running jobs. All caught up.`));break}let x=m.lines?.length>0?500:r>5?5e3:2e3;await new Promise(h=>setTimeout(h,x))}catch(u){if(u.name==="AbortError")break;u.message.match(/API (400|401|403|404):/)&&(console.error(i.red(`
37
- ${u.message}
38
- `)),process.exit(1)),p++,console.error(i.red(` Error: ${u.message}`)),p>=g&&(console.error(i.red(`
34
+ `):"");!u;)try{let d=new URLSearchParams({workflow:t,limit:String(s)});c&&d.set("nextToken",c);let m=await J(`${a}?${d}`,o);p=0,m.message&&m.lines?.length===0&&l===0&&console.log(i.gray(` ${m.message}`));for(let h of m.lines||[]){let S=`${h.timestamp}:${h.jobId}:${h.message}`;if(r.has(S))continue;r.add(S),h.jobId!==f&&(f!==null&&console.log(""),console.log(i.dim(` \u2500\u2500 ${h.jobId} \u2500\u2500`)),f=h.jobId);let T=i.gray(L(h.timestamp));console.log(`${T} ${h.message.replace(/\n$/,"")}`)}if(l=m.lines?.length>0?0:l+1,c=m.nextToken||null,!n){c&&console.log(i.gray(`
35
+ ... more logs available. Run again or use --follow to stream.`)),m.jobCount&&console.log(i.gray(` ${m.jobCount} job(s) found.`));break}if(!m.hasRunning&&!c&&l>2){console.log(i.gray(`
36
+ No running jobs. All caught up.`));break}let x=m.lines?.length>0?500:l>5?5e3:2e3;await new Promise(h=>setTimeout(h,x))}catch(d){if(d.name==="AbortError")break;d.message.match(/API (400|401|403|404):/)&&(console.error(i.red(`
37
+ ${d.message}
38
+ `)),process.exit(1)),p++,console.error(i.red(` Error: ${d.message}`)),p>=g&&(console.error(i.red(`
39
39
  Too many consecutive errors (${g}). Stopping.
40
- `)),process.exit(1)),n||process.exit(1),await new Promise(k=>setTimeout(k,3e3))}}async function me(o,e){let{token:t,projectId:n}=fe(e),s=e.follow===!0,l=e.lines?parseInt(e.lines,10):1e5;if(e.all){let r=e.workflow;return r||(console.log(i.red(`
40
+ `)),process.exit(1)),n||process.exit(1),await new Promise(k=>setTimeout(k,3e3))}}async function Ie(o,e){let{token:t,projectId:n}=de(e),s=e.follow===!0,a=e.lines?parseInt(e.lines,10):1e5;if(e.all){let l=e.workflow;return l||(console.log(i.red(`
41
41
  --workflow is required with --all`)),console.log(i.gray(` Example: zibby workflow logs --workflow ticket-triage --all --project <id>
42
- `)),process.exit(1)),ge({token:t,projectId:n,workflow:r,follow:s,limit:l})}let a=await pe(o,e,t,n);return s?de({token:t,jobId:a,follow:s,projectId:n}):Z({token:t,projectId:n,jobId:a,follow:!1,limit:l})}var A,ae,T,W=q(()=>{A="https://logs.workflows.zibby.app",ae="https://logs-stream.zibby.app/",T=null});import C from"ora";import{select as V}from"@inquirer/prompts";import{readFileSync as ye,existsSync as we}from"fs";import{homedir as he}from"os";import{join as Ie}from"path";var U={local:{name:"Local Development",apiUrl:"http://localhost:3001",accountApiUrl:"http://localhost:3001",frontendUrl:"http://localhost:3000",description:"Local backend running on port 3001"},prod:{name:"Production",apiUrl:process.env.ZIBBY_PROD_API_URL||"https://api-prod.zibby.app",accountApiUrl:process.env.ZIBBY_PROD_ACCOUNT_API_URL||"https://api-prod.zibby.app",frontendUrl:process.env.ZIBBY_PROD_FRONTEND_URL||"https://studio.zibby.dev",description:"Production environment"}};function j(){let o;if(process.env.ZIBBY_API_URL)o=process.env.ZIBBY_API_URL;else{let e=process.env.ZIBBY_ENV||"prod";U[e]?o=U[e].apiUrl:o=U.prod.apiUrl}try{let e=new URL(o);return e.protocol!=="http:"&&e.protocol!=="https:"?(console.error(`\u26A0\uFE0F Invalid API URL protocol: ${e.protocol} (only http/https allowed)`),U.prod.apiUrl):o}catch{return console.error(`\u26A0\uFE0F Invalid API URL: ${o}`),U.prod.apiUrl}}var X=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function L(o){return o?X.test(o)?{ok:!0}:{ok:!1,error:`'${o}' is not a UUID. Cloud workflows are identified by UUID only. Run \`zibby workflow list\` to find yours, or run \`zibby workflow trigger\` with no argument for interactive selection.`}:{ok:!0}}import{existsSync as Q,readFileSync as ee}from"fs";import{resolve as oe}from"path";function O(o){return o==="true"?!0:o==="false"?!1:o==="null"?null:o!==""&&!isNaN(Number(o))?Number(o):o}function z(o){let e={};for(let t of o||[]){let n=t.indexOf("=");if(n===-1){console.warn(` Warning: ignored param "${t}" \u2014 expected key=value format`);continue}let s=t.slice(0,n).trim(),l=O(t.slice(n+1)),a=s.split("."),r=e;for(let c=0;c<a.length-1;c++)(typeof r[a[c]]!="object"||r[a[c]]===null)&&(r[a[c]]={}),r=r[a[c]];r[a[a.length-1]]=l}return e}function te(o){let e=oe(o);Q(e)||(console.log(`
42
+ `)),process.exit(1)),he({token:t,projectId:n,workflow:l,follow:s,limit:a})}let c=await ge(o,e,t,n);return s?we({token:t,jobId:c,follow:s,projectId:n}):q({token:t,projectId:n,jobId:c,follow:!1,limit:a})}var C,pe,_,Z,X=z(()=>{A();C="https://logs.workflows.zibby.app",pe="https://logs-stream.zibby.app/",_=null;Z=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]});A();import O from"ora";import{select as Q}from"@inquirer/prompts";import{readFileSync as $e,existsSync as be}from"fs";import{homedir as ke}from"os";import{join as xe}from"path";var te=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function D(o){return o?te.test(o)?{ok:!0}:{ok:!1,error:`'${o}' is not a UUID. Cloud workflows are identified by UUID only. Run \`zibby workflow list\` to find yours, or run \`zibby workflow trigger\` with no argument for interactive selection.`}:{ok:!0}}import{existsSync as ne,readFileSync as re}from"fs";import{resolve as se}from"path";function F(o){return o==="true"?!0:o==="false"?!1:o==="null"?null:o!==""&&!isNaN(Number(o))?Number(o):o}function Y(o){let e={};for(let t of o||[]){let n=t.indexOf("=");if(n===-1){console.warn(` Warning: ignored param "${t}" \u2014 expected key=value format`);continue}let s=t.slice(0,n).trim(),a=F(t.slice(n+1)),c=s.split("."),l=e;for(let r=0;r<c.length-1;r++)(typeof l[c[r]]!="object"||l[c[r]]===null)&&(l[c[r]]={}),l=l[c[r]];l[c[c.length-1]]=a}return e}function ie(o){let e=se(o);ne(e)||(console.log(`
43
43
  Error: --input-file not found: ${o}
44
- `),process.exit(1));try{return JSON.parse(ee(e,"utf-8"))}catch(t){console.log(`
44
+ `),process.exit(1));try{return JSON.parse(re(e,"utf-8"))}catch(t){console.log(`
45
45
  Error: --input-file is not valid JSON: ${t.message}
46
- `),process.exit(1)}}function D(o){let e={};if(o.inputFile&&(e={...te(o.inputFile)}),o.input)try{e={...e,...JSON.parse(o.input)}}catch(t){console.log(`
46
+ `),process.exit(1)}}function M(o){let e={};if(o.inputFile&&(e={...ie(o.inputFile)}),o.input)try{e={...e,...JSON.parse(o.input)}}catch(t){console.log(`
47
47
  Error: --input is not valid JSON`),console.log(` ${t.message}
48
- `),process.exit(1)}return o.param?.length&&(e={...e,...z(o.param)}),e}function $e(){let o=Ie(he(),".zibby","config.json");if(we(o))try{let t=JSON.parse(ye(o,"utf-8"));if(t.sessionToken)return t.sessionToken}catch{}let e=process.env.ZIBBY_API_KEY;if(e)return e;console.log(`
48
+ `),process.exit(1)}return o.param?.length&&(e={...e,...Y(o.param)}),e}function Se(){let o=xe(ke(),".zibby","config.json");if(be(o))try{let t=JSON.parse($e(o,"utf-8"));if(t.sessionToken)return t.sessionToken}catch{}let e=process.env.ZIBBY_API_KEY;if(e)return e;console.log(`
49
49
  Not authenticated`),console.log(" Run: zibby login"),console.log(` OR set ZIBBY_API_KEY env var (for CI/CD)
50
- `),process.exit(1)}async function be(o){let e=j(),t=C("Fetching projects...").start();try{let n=await fetch(`${e}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}});n.ok||(t.fail("Failed to fetch projects"),process.exit(1));let s=await n.json();Array.isArray(s)||(s.projects?s=s.projects:s.data&&(s=s.data)),(!s||s.length===0)&&(t.fail("No projects found"),process.exit(1)),t.succeed(`Found ${s.length} project${s.length===1?"":"s"}`),console.log("");let l=s.map(a=>({name:`${a.name||"Unnamed"} (${a.projectId||a.id})`,value:a.projectId||a.id}));return await V({message:"Select a project:",choices:l})}catch(n){t.fail(`Error: ${n.message}`),process.exit(1)}}async function ke(o,e){let t=j(),n=C("Fetching deployed workflows...").start();try{let s=["analysis","implementation","run_test"],l=[];for(let r of s){let c=await fetch(`${t}/projects/${o}/workflows/${r}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(c.ok){let f=await c.json();f.graph&&l.push({name:r,version:f.version||0,isDefault:f.isDefault!==!1})}}l.length===0&&(n.fail("No deployed workflows found for this project"),process.exit(1)),n.succeed(`Found ${l.length} deployed workflow${l.length===1?"":"s"}`),console.log("");let a=l.map(r=>({name:`${r.name} (v${r.version})${r.isDefault?" [default]":""}`,value:r.name}));return await V({message:"Select a workflow to trigger:",choices:a})}catch(s){n.fail(`Error: ${s.message}`),process.exit(1)}}async function Ye(o,e={}){let t=L(o);t.ok||(console.log(`
50
+ `),process.exit(1)}async function Ee(o){let e=v(),t=O("Fetching projects...").start();try{let n=await fetch(`${e}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`}});n.ok||(t.fail("Failed to fetch projects"),process.exit(1));let s=await n.json();Array.isArray(s)||(s.projects?s=s.projects:s.data&&(s=s.data)),(!s||s.length===0)&&(t.fail("No projects found"),process.exit(1)),t.succeed(`Found ${s.length} project${s.length===1?"":"s"}`),console.log("");let a=s.map(c=>({name:`${c.name||"Unnamed"} (${c.projectId||c.id})`,value:c.projectId||c.id}));return await Q({message:"Select a project:",choices:a})}catch(n){t.fail(`Error: ${n.message}`),process.exit(1)}}async function ve(o,e){let t=v(),n=O("Fetching deployed workflows...").start();try{let s=["analysis","implementation","run_test"],a=[];for(let l of s){let r=await fetch(`${t}/projects/${o}/workflows/${l}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(r.ok){let f=await r.json();f.graph&&a.push({name:l,version:f.version||0,isDefault:f.isDefault!==!1})}}a.length===0&&(n.fail("No deployed workflows found for this project"),process.exit(1)),n.succeed(`Found ${a.length} deployed workflow${a.length===1?"":"s"}`),console.log("");let c=a.map(l=>({name:`${l.name} (v${l.version})${l.isDefault?" [default]":""}`,value:l.name}));return await Q({message:"Select a workflow to trigger:",choices:c})}catch(s){n.fail(`Error: ${s.message}`),process.exit(1)}}async function We(o,e={}){let t=D(o);t.ok||(console.log(`
51
51
  Error: ${t.error}
52
- `),process.exit(1));let n=$e(),s=e.project||process.env.ZIBBY_PROJECT_ID,l;if(o){let c=j();try{let f=await fetch(`${c}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}});if(f.ok){let p=(await f.json()).projects||[];for(let g of p){let y=await fetch(`${c}/projects/${g.projectId}/workflows`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}});if(y.ok){let m=(await y.json()).find(k=>k.uuid===o);if(m){s=g.projectId,l=m.workflowType||m.name,console.log(`
53
- \u2713 Found workflow "${l}" (UUID: ${o})
54
- `);break}}}(!l||l===o)&&(console.log(`
52
+ `),process.exit(1));let n=Se(),s=e.project||process.env.ZIBBY_PROJECT_ID,a;if(o){let r=v();try{let f=await fetch(`${r}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}});if(f.ok){let p=(await f.json()).projects||[];for(let g of p){let y=await fetch(`${r}/projects/${g.projectId}/workflows`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}});if(y.ok){let m=(await y.json()).find(k=>k.uuid===o);if(m){s=g.projectId,a=m.workflowType||m.name,console.log(`
53
+ \u2713 Found workflow "${a}" (UUID: ${o})
54
+ `);break}}}(!a||a===o)&&(console.log(`
55
55
  Error: Workflow with UUID "${o}" not found`),console.log(` Check: zibby workflow list
56
56
  `),process.exit(1))}}catch(f){console.log(`
57
57
  Error looking up workflow UUID: ${f.message}
58
- `),process.exit(1)}}s||(console.log(""),s=await be(n)),l||(console.log(""),l=await ke(s,n));let a=D(e);if(console.log(`
58
+ `),process.exit(1)}}s||(console.log(""),s=await Ee(n)),a||(console.log(""),a=await ve(s,n));let c=M(e);if(console.log(`
59
59
  Triggering Workflow
60
- `),console.log(" ".padEnd(60,"-")),console.log(` Workflow: ${l}`),console.log(` Project: ${s}`),Object.keys(a).length>0){let c=JSON.stringify(a);console.log(` Input: ${c.length>60?`${c.substring(0,57)}...`:c}`)}e.idempotencyKey&&console.log(` Idempotency: ${e.idempotencyKey}`),console.log(" ".padEnd(60,"-")),console.log("");let r=C("Triggering workflow execution...").start();try{let c=j(),f={input:a};e.idempotencyKey&&(f.idempotencyKey=e.idempotencyKey);let d=await fetch(`${c}/projects/${s}/workflows/${l}/trigger`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(f)});if(!d.ok){let g=await d.json().catch(()=>({}));d.status===429&&(r.fail("Quota exceeded"),console.log(`
61
- Your workflow execution quota has been exceeded`),g.quotaInfo&&(console.log(` Used: ${g.quotaInfo.used}/${g.quotaInfo.limit} executions`),console.log(` Plan: ${g.quotaInfo.planId}`),g.quotaInfo.periodEnd&&console.log(` Resets: ${new Date(g.quotaInfo.periodEnd).toLocaleDateString()}`)),console.log(""),process.exit(1)),r.fail("Trigger failed"),console.log(` Error: ${g.message||d.statusText}
62
- `),process.exit(1)}let p=await d.json();if(r.succeed("Workflow triggered successfully"),console.log(""),console.log(" Job Details:"),console.log(` Job ID: ${p.jobId}`),console.log(` Status: ${p.status}`),console.log(` Version: ${p.version}`),console.log(` Triggered: ${new Date(p.triggeredAt).toLocaleString()}`),console.log(""),e.follow){console.log(" Streaming logs (Ctrl+C to stop)..."),console.log("");let{logsCommand:g}=await Promise.resolve().then(()=>(W(),G));return g(p.jobId,{follow:!0,project:s,apiKey:e.apiKey})}console.log(" Monitor execution:"),o?(console.log(` zibby workflow logs ${o}`),console.log(` zibby workflow logs ${o} -t`)):(console.log(` zibby workflow logs --workflow ${l} --project ${s}`),console.log(` zibby workflow logs --workflow ${l} --project ${s} -t`)),console.log("")}catch(c){r.fail("Trigger failed"),console.log(` Error: ${c.message}
63
- `),process.exit(1)}}export{O as coerceValue,z as parseParams,D as resolveInput,Ye as triggerWorkflowCommand};
60
+ `),console.log(" ".padEnd(60,"-")),console.log(` Workflow: ${a}`),console.log(` Project: ${s}`),Object.keys(c).length>0){let r=JSON.stringify(c);console.log(` Input: ${r.length>60?`${r.substring(0,57)}...`:r}`)}e.idempotencyKey&&console.log(` Idempotency: ${e.idempotencyKey}`),console.log(" ".padEnd(60,"-")),console.log("");let l=O("Triggering workflow execution...").start();try{let r=v(),f={input:c};e.idempotencyKey&&(f.idempotencyKey=e.idempotencyKey);let u=await fetch(`${r}/projects/${s}/workflows/${a}/trigger`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(f)});if(!u.ok){let g=await u.json().catch(()=>({}));u.status===429&&(l.fail("Quota exceeded"),console.log(`
61
+ Your workflow execution quota has been exceeded`),g.quotaInfo&&(console.log(` Used: ${g.quotaInfo.used}/${g.quotaInfo.limit} executions`),console.log(` Plan: ${g.quotaInfo.planId}`),g.quotaInfo.periodEnd&&console.log(` Resets: ${new Date(g.quotaInfo.periodEnd).toLocaleDateString()}`)),console.log(""),process.exit(1)),l.fail("Trigger failed"),console.log(` Error: ${g.message||u.statusText}
62
+ `),process.exit(1)}let p=await u.json();if(l.succeed("Workflow triggered successfully"),console.log(""),console.log(" Job Details:"),console.log(` Job ID: ${p.jobId}`),console.log(` Status: ${p.status}`),console.log(` Version: ${p.version}`),console.log(` Triggered: ${new Date(p.triggeredAt).toLocaleString()}`),console.log(""),e.follow){console.log(" Streaming logs (Ctrl+C to stop)..."),console.log("");let{logsCommand:g}=await Promise.resolve().then(()=>(X(),H));return g(p.jobId,{follow:!0,project:s,apiKey:e.apiKey})}console.log(" Monitor execution:"),o?(console.log(` zibby workflow logs ${o}`),console.log(` zibby workflow logs ${o} -t`)):(console.log(` zibby workflow logs --workflow ${a} --project ${s}`),console.log(` zibby workflow logs --workflow ${a} --project ${s} -t`)),console.log("")}catch(r){l.fail("Trigger failed"),console.log(` Error: ${r.message}
63
+ `),process.exit(1)}}export{F as coerceValue,Y as parseParams,M as resolveInput,We as triggerWorkflowCommand};
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/cli",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Zibby CLI - Test automation generator and runner",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,10 +27,10 @@
27
27
  "homepage": "https://zibby.dev",
28
28
  "repository": {
29
29
  "type": "git",
30
- "url": "https://github.com/ZibbyHQ/zibby-agent"
30
+ "url": "https://github.com/ZibbyDev/zibby-agent"
31
31
  },
32
32
  "bugs": {
33
- "url": "https://github.com/ZibbyHQ/zibby-agent/issues"
33
+ "url": "https://github.com/ZibbyDev/zibby-agent/issues"
34
34
  },
35
35
  "dependencies": {
36
36
  "@aws-sdk/client-sqs": "^3.1038.0",
@@ -50,7 +50,7 @@
50
50
  "glob": "^13.0.0",
51
51
  "handlebars": "^4.7.9",
52
52
  "inquirer": "^13.4.1",
53
- "mem0ai": "npm:@zibby/mem0ai@^3.0.2",
53
+ "mem0ai": "npm:@zibby/mem0ai@^3.0.5",
54
54
  "open": "^10.2.0",
55
55
  "ora": "^8.0.1",
56
56
  "tar": "^7.5.2",
@@ -26,7 +26,7 @@ For goal-mode instances, an upgrade gives the supervisor newer tool definitions,
26
26
  ```
27
27
  Bash(zibby app status <instanceId>)
28
28
  ```
29
- Look at `agentOpsVersion` (or the equivalent — it's in the JSON). Compare to the latest tag at https://github.com/ZibbyHQ/agent-ops/releases.
29
+ Look at `agentOpsVersion` (or the equivalent — it's in the JSON). Compare to the latest tag at https://github.com/ZibbyDev/agent-ops/releases.
30
30
 
31
31
  3. **Decide the target.**
32
32
  - If user said "upgrade" without specifying → use `--version` of the latest stable tag (don't blindly use `:latest` floating tag; pin it).
@@ -3,7 +3,7 @@
3
3
 
4
4
  This project uses **Zibby** — there are two surfaces:
5
5
 
6
- 1. **Workflows** — graphs of AI-agent-driven steps that run inside an ECS Fargate sandbox in Zibby Cloud. Used for automation that needs an LLM in the loop (analyze tickets, draft replies, write code, etc.).
6
+ 1. **Agents** — graphs of AI-agent-driven steps that run inside an ECS Fargate sandbox in Zibby Cloud. Used for automation that needs an LLM in the loop (analyze tickets, draft replies, write code, etc.).
7
7
 
8
8
  2. **Tests** — plain-language `.txt` specs that Zibby's runner converts to Playwright executions. Produces video + JSON results. Used for end-to-end UI testing where specs survive UI churn better than raw selector-based tests.
9
9
 
@@ -11,7 +11,7 @@ Both share `.zibby.config.mjs` at the project root.
11
11
 
12
12
  ---
13
13
 
14
- ### Workflows
14
+ ### Agents
15
15
 
16
16
  Files:
17
17
  ```
@@ -28,22 +28,22 @@ Each node has `async run(ctx)` where `ctx` provides:
28
28
  - `ctx.input` — outputs from upstream nodes
29
29
  - `ctx.agent({ prompt, schema })` — call the configured LLM with structured output
30
30
  - `ctx.shell(cmd)` — run shell in the sandbox (egress proxy enabled)
31
- - `ctx.log(...)` — emit a log line (visible via `zibby workflow logs`)
31
+ - `ctx.log(...)` — emit a log line (visible via `zibby agent logs`)
32
32
 
33
33
  Common dev loop:
34
34
  ```
35
- zibby workflow new <name> # scaffold
36
- zibby workflow run <name> # one-shot local run (preferred for the dev loop)
37
- zibby workflow run <name> -p k=v # with input
38
- zibby workflow deploy <name> # build + push to Zibby Cloud
39
- zibby workflow trigger <uuid> # invoke the cloud workflow
40
- zibby workflow logs <uuid> -t # tail live logs (docker-compose-style)
41
- zibby workflow list # find UUIDs and statuses (local + cloud)
42
- zibby workflow download <uuid> # pull the cloud workflow source back to .zibby/workflows/
43
- zibby workflow delete <uuid> # remove a deployed workflow
35
+ zibby agent new <name> # scaffold
36
+ zibby agent run <name> # one-shot local run (preferred for the dev loop)
37
+ zibby agent run <name> -p k=v # with input
38
+ zibby agent deploy <name> # build + push to Zibby Cloud
39
+ zibby agent trigger <uuid> # invoke the cloud agent
40
+ zibby agent logs <uuid> -t # tail live logs (docker-compose-style)
41
+ zibby agent list # find UUIDs and statuses (local + cloud)
42
+ zibby agent download <uuid> # pull the cloud agent source back to .zibby/workflows/
43
+ zibby agent delete <uuid> # remove a deployed agent
44
44
  ```
45
45
 
46
- **`run` vs `start`.** `workflow run` is the one-shot CLI iteration command — load the graph, execute it once, print the result, exit. That's the right primitive for the dev loop and for CI/CD. `workflow start` is a *long-lived* local dev server (default port 3848) used by Studio for replay/debug; for plain CLI iteration always prefer `run`.
46
+ **`run` vs `start`.** `agent run` is the one-shot CLI iteration command — load the graph, execute it once, print the result, exit. That's the right primitive for the dev loop and for CI/CD. `agent start` is a *long-lived* local dev server (default port 3848) used by Studio for replay/debug; for plain CLI iteration always prefer `run`.
47
47
 
48
48
  `run` and `trigger` accept the same input flag surface — flip the verb to switch between local and cloud:
49
49
  - `-p key=value` (repeatable) — highest precedence
@@ -52,20 +52,20 @@ zibby workflow delete <uuid> # remove a deployed workflow
52
52
 
53
53
  Static outbound IPs (for customers behind firewalls): see `--dedicated-ip` flag on `deploy`.
54
54
 
55
- #### Per-workflow env vars
55
+ #### Per-agent env vars
56
56
 
57
- Each deployed workflow has its own encrypted env-var bag (KMS-backed). Vars get injected into the Fargate task at trigger time, and **workflow env wins over project secrets on conflict**. Use this for per-pipeline credentials (different `ANTHROPIC_API_KEY` per workflow, a workflow-only `DATABASE_URL`, etc.).
57
+ Each deployed agent has its own encrypted env-var bag (KMS-backed). Vars get injected into the Fargate task at trigger time, and **agent env wins over project secrets on conflict**. Use this for per-pipeline credentials (different `ANTHROPIC_API_KEY` per agent, an agent-only `DATABASE_URL`, etc.).
58
58
 
59
59
  ```
60
- zibby workflow env list <uuid> # show key names (values never returned)
61
- zibby workflow env set <uuid> ANTHROPIC_API_KEY=sk-… # add or rotate one key
62
- zibby workflow env unset <uuid> OLD_KEY # remove one key
63
- zibby workflow env push <uuid> --file .env [--file .env.prod] # bulk replace from .env files
60
+ zibby agent env list <uuid> # show key names (values never returned)
61
+ zibby agent env set <uuid> ANTHROPIC_API_KEY=sk-… # add or rotate one key
62
+ zibby agent env unset <uuid> OLD_KEY # remove one key
63
+ zibby agent env push <uuid> --file .env [--file .env.prod] # bulk replace from .env files
64
64
  ```
65
65
 
66
66
  Fast path on first deploy — sync a `.env` in one shot:
67
67
  ```
68
- zibby workflow deploy my-pipeline --env .env [--env .env.prod]
68
+ zibby agent deploy my-pipeline --env .env [--env .env.prod]
69
69
  ```
70
70
  The CLI deploys, then runs `push` against the freshly-minted UUID.
71
71
 
@@ -138,10 +138,10 @@ The `zibby` command might be on PATH (if installed globally via npm) OR not —
138
138
 
139
139
  ```
140
140
  # Try first:
141
- zibby workflow list
141
+ zibby agent list
142
142
 
143
143
  # If "command not found":
144
- ./.zibby/bin/zibby workflow list
144
+ ./.zibby/bin/zibby agent list
145
145
  ```
146
146
 
147
147
  Don't waste time on `npx @zibby/cli` — not always published.
@@ -150,7 +150,7 @@ Don't waste time on `npx @zibby/cli` — not always published.
150
150
 
151
151
  ### Reference (always prefer canonical docs over these notes)
152
152
 
153
- **Workflows**
153
+ **Agents**
154
154
  - Concepts: https://docs.zibby.app/workflows
155
155
  - Node SDK (ctx.*): https://docs.zibby.app/workflows/sdk
156
156
  - Deploying & bundling: https://docs.zibby.app/workflows/deploying