@zibby/cli 0.4.33 → 0.4.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,19 @@
1
1
  #!/usr/bin/env node
2
- var St=Object.defineProperty;var m=(e,t)=>()=>(e&&(t=e(e=0)),t);var _e=(e,t)=>{for(var r in t)St(e,r,{get:t[r],enumerable:!0})};var ve,Pe=m(()=>{ve="ffffffff-ffff-ffff-ffff-ffffffffffff"});var be,De=m(()=>{be="00000000-0000-0000-0000-000000000000"});var ke,Le=m(()=>{ke=/^(?:[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"&&ke.test(e)}var L,K=m(()=>{Le();L=vt});function Pt(e){if(!L(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 P,z=m(()=>{K();P=Pt});function S(e,t=0){return(w[e[t+0]]+w[e[t+1]]+w[e[t+2]]+w[e[t+3]]+"-"+w[e[t+4]]+w[e[t+5]]+"-"+w[e[t+6]]+w[e[t+7]]+"-"+w[e[t+8]]+w[e[t+9]]+"-"+w[e[t+10]]+w[e[t+11]]+w[e[t+12]]+w[e[t+13]]+w[e[t+14]]+w[e[t+15]]).toLowerCase()}function bt(e,t=0){let r=S(e,t);if(!L(r))throw TypeError("Stringified UUID is invalid");return r}var w,Ce,b=m(()=>{K();w=[];for(let e=0;e<256;++e)w.push((e+256).toString(16).slice(1));Ce=bt});import{randomFillSync as Dt}from"crypto";function D(){return Q>V.length-16&&(Dt(V),Q=0),V.slice(Q,Q+=16)}var V,Q,q=m(()=>{V=new Uint8Array(256),Q=V.length});function kt(e,t,r){let n,o=e?._v6??!1;if(e){let s=Object.keys(e);s.length===1&&s[0]==="_v6"&&(e=void 0)}if(e)n=Ne(e.random??e.rng?.()??D(),e.msecs,e.nsecs,e.clockseq,e.node,t,r);else{let s=Date.now(),i=D();Lt(G,s,i),n=Ne(i,G.msecs,G.nsecs,o?void 0:G.clockseq,o?void 0:G.node,t,r)}return t??S(n)}function Lt(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 Ne(e,t,r,n,o,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,n??=(e[8]<<8|e[9])&16383,o??=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++]=n>>>8|128,s[i++]=n&255;for(let c=0;c<6;++c)s[i++]=o[c];return s}var G,Z,ce=m(()=>{q();b();G={};Z=kt});function W(e){let t=typeof e=="string"?P(e):e,r=Ct(t);return typeof e=="string"?S(r):r}function Ct(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 le=m(()=>{z();b()});import{createHash as Nt}from"crypto";function jt(e){return Array.isArray(e)?e=Buffer.from(e):typeof e=="string"&&(e=Buffer.from(e,"utf8")),Nt("md5").update(e).digest()}var je,Fe=m(()=>{je=jt});function Ft(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 B(e,t,r,n,o,s){let i=typeof r=="string"?Ft(r):r,f=typeof n=="string"?P(n):n;if(typeof n=="string"&&(n=P(n)),n?.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,o){if(s=s||0,s<0||s+16>o.length)throw new RangeError(`UUID byte range ${s}:${s+15} is out of buffer bounds`);for(let c=0;c<16;++c)o[s+c]=a[c];return o}return S(a)}var X,ee,fe=m(()=>{z();b();X="6ba7b810-9dad-11d1-80b4-00c04fd430c8",ee="6ba7b811-9dad-11d1-80b4-00c04fd430c8"});function pe(e,t,r,n){return B(48,je,e,t,r,n)}var Ke,ze=m(()=>{Fe();fe();pe.DNS=X;pe.URL=ee;Ke=pe});import{randomUUID as Kt}from"crypto";var de,Ge=m(()=>{de={randomUUID:Kt}});function zt(e,t,r){if(de.randomUUID&&!t&&!e)return de.randomUUID();e=e||{};let n=e.random??e.rng?.()??D();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[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 o=0;o<16;++o)t[r+o]=n[o];return t}return S(n)}var We,Be=m(()=>{Ge();q();b();We=zt});import{createHash as Gt}from"crypto";function Wt(e){return Array.isArray(e)?e=Buffer.from(e):typeof e=="string"&&(e=Buffer.from(e,"utf8")),Gt("sha1").update(e).digest()}var Me,Je=m(()=>{Me=Wt});function ue(e,t,r,n){return B(80,Me,e,t,r,n)}var He,Ye=m(()=>{Je();fe();ue.DNS=X;ue.URL=ee;He=ue});function Bt(e,t,r){e??={},r??=0;let n=Z({...e,_v6:!0},new Uint8Array(16));if(n=W(n),t){if(r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let o=0;o<16;o++)t[r+o]=n[o];return t}return S(n)}var Qe,Ve=m(()=>{b();ce();le();Qe=Bt});function ge(e){let t=typeof e=="string"?P(e):e,r=Mt(t);return typeof e=="string"?S(r):r}function Mt(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 qe=m(()=>{z();b()});function Jt(e,t,r){let n;if(e)n=Ze(e.random??e.rng?.()??D(),e.msecs,e.seq,t,r);else{let o=Date.now(),s=D();Ht(me,o,s),n=Ze(s,me.msecs,me.seq,t,r)}return t??S(n)}function Ht(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 Ze(e,t,r,n,o=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(!n)n=new Uint8Array(16),o=0;else if(o<0||o+16>n.length)throw new RangeError(`UUID byte range ${o}:${o+15} is out of buffer bounds`);return t??=Date.now(),r??=e[6]*127<<24|e[7]<<16|e[8]<<8|e[9],n[o++]=t/1099511627776&255,n[o++]=t/4294967296&255,n[o++]=t/16777216&255,n[o++]=t/65536&255,n[o++]=t/256&255,n[o++]=t&255,n[o++]=112|r>>>28&15,n[o++]=r>>>20&255,n[o++]=128|r>>>14&63,n[o++]=r>>>6&255,n[o++]=r<<2&255|e[10]&3,n[o++]=e[11],n[o++]=e[12],n[o++]=e[13],n[o++]=e[14],n[o++]=e[15],n}var me,Xe,et=m(()=>{q();b();me={};Xe=Jt});function Yt(e){if(!L(e))throw TypeError("Invalid UUID");return parseInt(e.slice(14,15),16)}var tt,rt=m(()=>{K();tt=Yt});var ot={};_e(ot,{MAX:()=>ve,NIL:()=>be,parse:()=>P,stringify:()=>Ce,v1:()=>Z,v1ToV6:()=>W,v3:()=>Ke,v4:()=>We,v5:()=>He,v6:()=>Qe,v6ToV1:()=>ge,v7:()=>Xe,validate:()=>L,version:()=>tt});var nt=m(()=>{Pe();De();z();b();ce();le();ze();Be();Ye();Ve();qe();et();K();rt()});var lt={};_e(lt,{uploadSessionArtifacts:()=>ir});import{readdirSync as st,statSync as he,createReadStream as Qt,existsSync as Vt}from"node:fs";import{join as at,relative as qt,sep as Zt,extname as Xt}from"node:path";function or(e){let t=Xt(e).toLowerCase();return rr[t]||"application/octet-stream"}function ct(e){let t=[],r;try{r=st(e)}catch{return t}for(let n of r){if(er.has(n)||n.startsWith(".")||tr.has(n))continue;let o=at(e,n),s;try{s=he(o)}catch{continue}s.isDirectory()?t.push(...ct(o)):s.isFile()&&t.push(o)}return t}async function nr({apiUrl:e,apiKey:t,executionId:r,nodeName:n,filename:o,absolutePath:s,sizeBytes:i,contentType:f}){let a;try{let c=await fetch(`${e}/${r}/artifacts/upload-url`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({nodeName:n,filename:o,contentType:f,sizeBytes:i})});if(!c.ok){let l=await c.text();return console.warn(`[artifacts] upload-url failed for ${n}/${o}: ${c.status} ${l.slice(0,200)}`),null}a=await c.json()}catch(c){return console.warn(`[artifacts] upload-url request errored for ${n}/${o}: ${c.message}`),null}try{let c=Qt(s),l=a.requiredHeaders?{...a.requiredHeaders,"Content-Length":String(i)}:{"Content-Type":f,"Content-Length":String(i)},d=await fetch(a.url,{method:"PUT",headers:l,body:c,duplex:"half"});if(!d.ok)return console.warn(`[artifacts] S3 PUT failed for ${n}/${o}: ${d.status}`),null}catch(c){return console.warn(`[artifacts] S3 PUT errored for ${n}/${o}: ${c.message}`),null}return{nodeName:n,filename:o,s3Key:a.s3Key,contentType:f,sizeBytes:i}}async function ir({sessionPath:e,executionId:t,apiUrl:r,apiKey:n}){let o={uploaded:[],skipped:[]};if(!e||!Vt(e))return o;if(!r||!n||!t)return console.warn("[artifacts] uploader missing required input \u2014 skipping"),o;let s;try{s=st(e)}catch(l){return console.warn(`[artifacts] could not read session folder ${e}: ${l.message}`),o}let i=[];for(let l of s){let d=at(e,l),u;try{u=he(d)}catch{continue}if(!u.isDirectory()||l.startsWith(".")||l.startsWith("_"))continue;let k=ct(d);for(let x of k){let T=qt(d,x).split(Zt).join("/"),U;try{U=he(x).size}catch{continue}if(U>it){o.skipped.push({nodeName:l,filename:T,reason:`size ${U} > ${it}`});continue}if(U===0){o.skipped.push({nodeName:l,filename:T,reason:"empty"});continue}i.push({apiUrl:r,apiKey:n,executionId:t,nodeName:l,filename:T,absolutePath:x,sizeBytes:U,contentType:or(T)})}}if(i.length===0)return o;let f=4,a=i.slice(),c=Array.from({length:Math.min(f,a.length)},async()=>{for(;a.length;){let l=a.shift(),d=await nr(l);d?o.uploaded.push(d):o.skipped.push({nodeName:l.nodeName,filename:l.filename,reason:"upload failed"})}});if(await Promise.all(c),o.uploaded.length>0)try{let l=await fetch(`${r}/${t}/artifacts`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({files:o.uploaded})});if(!l.ok){let d=await l.text();console.warn(`[artifacts] record failed: ${l.status} ${d.slice(0,200)}`)}}catch(l){console.warn(`[artifacts] record errored: ${l.message}`)}return o}var it,er,tr,rr,ft=m(()=>{it=500*1024*1024,er=new Set([".DS_Store","Thumbs.db",".zibby-stop"]),tr=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 mt,writeFileSync as sr,existsSync as C,readFileSync as pt}from"fs";import{join as A,dirname as ar,resolve as dt}from"path";import{pathToFileURL as xe}from"url";import{execSync as cr,spawn as ut}from"node:child_process";import{SQSClient as $t,SendMessageCommand as _t}from"@aws-sdk/client-sqs";var ne=null;function Et(){return ne||(ne=new $t({region:process.env.AWS_REGION||"ap-southeast-2"})),ne}async function Ee(e,t,r,n){let{EXECUTION_ID:o,SQS_AUTH_TOKEN:s,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:f,PROJECT_API_TOKEN:a}=n;if(!o)return;let c={executionId:o,...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 ie(i,o,c,a):f&&await se(f,o,c)}catch(l){console.error(`\u26A0\uFE0F Failed to send progress: ${l.message}`)}}async function Re(e,t,r){let{EXECUTION_ID:n,SQS_AUTH_TOKEN:o,PROGRESS_API_URL:s,PROGRESS_QUEUE_URL:i,PROJECT_API_TOKEN:f}=e;if(!n||!r)return;let a=JSON.stringify(r).length;console.log(`Sending artifact: ${t} (${(a/1024).toFixed(1)}KB)`);let c={executionId:n,...o&&{sqsAuthToken:o},artifacts:{[t]:r},timestamp:new Date().toISOString()},l=s?"HTTP":i?"SQS":"NONE",d=JSON.stringify(c).length;try{if(s)await ie(s,n,c,f);else if(i)await se(i,n,c);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 ${l} (payload=${(d/1024).toFixed(1)}KB, value=${(a/1024).toFixed(1)}KB)`)}catch(u){console.error(`Failed to send artifact ${t} via ${l}:`),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 Ue(e,{status:t,error:r,finalState:n}){let{EXECUTION_ID:o,SQS_AUTH_TOKEN:s,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:f,PROJECT_API_TOKEN:a}=e;if(!o)return;let c={executionId:o,...s&&{sqsAuthToken:s},status:t,...r&&{error:r},...n&&typeof n=="object"&&Object.keys(n).length>0?{finalState:n}:{},timestamp:new Date().toISOString()},l=i?"HTTP":f?"SQS":"NONE",d=JSON.stringify(c).length;console.log(`Sending final status: ${t} via ${l} (${(d/1024).toFixed(1)}KB)`);try{if(i)await ie(i,o,c,a);else if(f){let u=["completed","failed","insufficient_context","blocked"].includes(t)?"execution_completed":"progress_update";await se(f,o,c,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 ${l}`)}catch(u){console.error(`Failed to send final status (${t}) via ${l}:`),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 ie(e,t,r,n){let o=`${e}/${t}/progress`,s={"Content-Type":"application/json"};n&&(s.Authorization=`Bearer ${n}`);let i=await fetch(o,{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 se(e,t,r,n="progress_update"){let o=JSON.stringify(r),s=(o.length/1024).toFixed(1);o.length>256*1024&&console.error(`\u274C SQS message too large: ${s}KB (limit 256KB) for ${t} [${n}]`),await Et().send(new _t({QueueUrl:e,MessageBody:o,MessageGroupId:t,MessageAttributes:{executionId:{DataType:"String",StringValue:t},messageType:{DataType:"String",StringValue:n}}}))}function Ie(e,t,r=null){return async function(o,s,i){let f=Date.now(),a=[],c="",l=console.log,d=process.stdout.write.bind(process.stdout),u=process.stderr.write.bind(process.stderr),k=!1;console.log=(...g)=>{let y=g.map($=>typeof $=="string"?$:JSON.stringify($)).join(" ");a.push(y),k=!0,l(...g),k=!1};let x="";process.stdout.write=(g,y,$)=>{if(!k){let _=typeof g=="string"?g:g.toString();x+=_;let N=x.split(`
3
- `);x=N.pop()||"";for(let J of N){let H=J.trim();H&&a.push(H)}}return d(g,y,$)},l(`[Middleware] Started capturing logs for ${o}`);let T=!1,U=setInterval(()=>{if(T)return;let g=a.join(`
4
- `);g!==c&&g.length>0&&(c=g,u(`\u{1F4E1} [Middleware] Sending live update for ${o}: ${g.length} chars, ${a.length} lines
5
- `),e(o,"in_progress",g,i).catch(y=>{u(`\u26A0\uFE0F [Middleware] Failed to send live update: ${y.message}
6
- `)}))},500);try{await e(o,"in_progress","",i);let g=await s(),y=((Date.now()-f)/1e3).toFixed(1);T=!0,clearInterval(U),await new Promise(_=>setImmediate(_)),console.log=l,process.stdout.write=d,x.trim()&&(a.push(x.trim()),x="");let $=a.join(`
7
- `);if(u(`\u{1F4E1} [Middleware] Sending final update for ${o}: ${$.length} chars, ${a.length} total lines captured
8
- `),g.success){if(await e(o,"success",$||`Completed in ${y}s`,i),r)try{let _=r(o,g);_&&_.key&&_.value&&await t(i,_.key,_.value)}catch(_){u(`\u26A0\uFE0F [Middleware] artifactExtractor for ${o} threw: ${_.message}
9
- `)}}else await e(o,"failed",`${$}
2
+ var _t=Object.defineProperty;var Ee=(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 m=(e,t)=>()=>(e&&(t=e(e=0)),t);var $e=(e,t)=>{for(var r in t)_t(e,r,{get:t[r],enumerable:!0})};var ve,be=m(()=>{ve="ffffffff-ffff-ffff-ffff-ffffffffffff"});var De,ke=m(()=>{De="00000000-0000-0000-0000-000000000000"});var Le,Ce=m(()=>{Le=/^(?:[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 bt(e){return typeof e=="string"&&Le.test(e)}var L,F=m(()=>{Ce();L=bt});function Dt(e){if(!L(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 v,G=m(()=>{F();v=Dt});function _(e,t=0){return(y[e[t+0]]+y[e[t+1]]+y[e[t+2]]+y[e[t+3]]+"-"+y[e[t+4]]+y[e[t+5]]+"-"+y[e[t+6]]+y[e[t+7]]+"-"+y[e[t+8]]+y[e[t+9]]+"-"+y[e[t+10]]+y[e[t+11]]+y[e[t+12]]+y[e[t+13]]+y[e[t+14]]+y[e[t+15]]).toLowerCase()}function kt(e,t=0){let r=_(e,t);if(!L(r))throw TypeError("Stringified UUID is invalid");return r}var y,Ne,b=m(()=>{F();y=[];for(let e=0;e<256;++e)y.push((e+256).toString(16).slice(1));Ne=kt});import{randomFillSync as Lt}from"crypto";function D(){return Y>q.length-16&&(Lt(q),Y=0),q.slice(Y,Y+=16)}var q,Y,V=m(()=>{q=new Uint8Array(256),Y=q.length});function Ct(e,t,r){let n,o=e?._v6??!1;if(e){let s=Object.keys(e);s.length===1&&s[0]==="_v6"&&(e=void 0)}if(e)n=je(e.random??e.rng?.()??D(),e.msecs,e.nsecs,e.clockseq,e.node,t,r);else{let s=Date.now(),i=D();Nt(z,s,i),n=je(i,z.msecs,z.nsecs,o?void 0:z.clockseq,o?void 0:z.node,t,r)}return t??_(n)}function Nt(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 je(e,t,r,n,o,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,n??=(e[8]<<8|e[9])&16383,o??=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++]=n>>>8|128,s[i++]=n&255;for(let c=0;c<6;++c)s[i++]=o[c];return s}var z,Z,ce=m(()=>{V();b();z={};Z=Ct});function B(e){let t=typeof e=="string"?v(e):e,r=jt(t);return typeof e=="string"?_(r):r}function jt(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 le=m(()=>{G();b()});import{createHash as Kt}from"crypto";function Ft(e){return Array.isArray(e)?e=Buffer.from(e):typeof e=="string"&&(e=Buffer.from(e,"utf8")),Kt("md5").update(e).digest()}var Ke,Fe=m(()=>{Ke=Ft});function Gt(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 W(e,t,r,n,o,s){let i=typeof r=="string"?Gt(r):r,f=typeof n=="string"?v(n):n;if(typeof n=="string"&&(n=v(n)),n?.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,o){if(s=s||0,s<0||s+16>o.length)throw new RangeError(`UUID byte range ${s}:${s+15} is out of buffer bounds`);for(let c=0;c<16;++c)o[s+c]=a[c];return o}return _(a)}var X,ee,fe=m(()=>{G();b();X="6ba7b810-9dad-11d1-80b4-00c04fd430c8",ee="6ba7b811-9dad-11d1-80b4-00c04fd430c8"});function pe(e,t,r,n){return W(48,Ke,e,t,r,n)}var Ge,ze=m(()=>{Fe();fe();pe.DNS=X;pe.URL=ee;Ge=pe});import{randomUUID as zt}from"crypto";var de,Be=m(()=>{de={randomUUID:zt}});function Bt(e,t,r){if(de.randomUUID&&!t&&!e)return de.randomUUID();e=e||{};let n=e.random??e.rng?.()??D();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=n[6]&15|64,n[8]=n[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 o=0;o<16;++o)t[r+o]=n[o];return t}return _(n)}var We,He=m(()=>{Be();V();b();We=Bt});import{createHash as Wt}from"crypto";function Ht(e){return Array.isArray(e)?e=Buffer.from(e):typeof e=="string"&&(e=Buffer.from(e,"utf8")),Wt("sha1").update(e).digest()}var Je,Me=m(()=>{Je=Ht});function ue(e,t,r,n){return W(80,Je,e,t,r,n)}var Qe,Ye=m(()=>{Me();fe();ue.DNS=X;ue.URL=ee;Qe=ue});function Jt(e,t,r){e??={},r??=0;let n=Z({...e,_v6:!0},new Uint8Array(16));if(n=B(n),t){if(r<0||r+16>t.length)throw new RangeError(`UUID byte range ${r}:${r+15} is out of buffer bounds`);for(let o=0;o<16;o++)t[r+o]=n[o];return t}return _(n)}var qe,Ve=m(()=>{b();ce();le();qe=Jt});function ge(e){let t=typeof e=="string"?v(e):e,r=Mt(t);return typeof e=="string"?_(r):r}function Mt(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 Ze=m(()=>{G();b()});function Qt(e,t,r){let n;if(e)n=Xe(e.random??e.rng?.()??D(),e.msecs,e.seq,t,r);else{let o=Date.now(),s=D();Yt(me,o,s),n=Xe(s,me.msecs,me.seq,t,r)}return t??_(n)}function Yt(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 Xe(e,t,r,n,o=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(!n)n=new Uint8Array(16),o=0;else if(o<0||o+16>n.length)throw new RangeError(`UUID byte range ${o}:${o+15} is out of buffer bounds`);return t??=Date.now(),r??=e[6]*127<<24|e[7]<<16|e[8]<<8|e[9],n[o++]=t/1099511627776&255,n[o++]=t/4294967296&255,n[o++]=t/16777216&255,n[o++]=t/65536&255,n[o++]=t/256&255,n[o++]=t&255,n[o++]=112|r>>>28&15,n[o++]=r>>>20&255,n[o++]=128|r>>>14&63,n[o++]=r>>>6&255,n[o++]=r<<2&255|e[10]&3,n[o++]=e[11],n[o++]=e[12],n[o++]=e[13],n[o++]=e[14],n[o++]=e[15],n}var me,et,tt=m(()=>{V();b();me={};et=Qt});function qt(e){if(!L(e))throw TypeError("Invalid UUID");return parseInt(e.slice(14,15),16)}var rt,ot=m(()=>{F();rt=qt});var nt={};$e(nt,{MAX:()=>ve,NIL:()=>De,parse:()=>v,stringify:()=>Ne,v1:()=>Z,v1ToV6:()=>B,v3:()=>Ge,v4:()=>We,v5:()=>Qe,v6:()=>qe,v6ToV1:()=>ge,v7:()=>et,validate:()=>L,version:()=>rt});var it=m(()=>{be();ke();G();b();ce();le();ze();He();Ye();Ve();Ze();tt();F();ot()});var ft={};$e(ft,{uploadSessionArtifacts:()=>ar});import{readdirSync as at,statSync as he,createReadStream as Vt,existsSync as Zt}from"node:fs";import{join as ct,relative as Xt,sep as er,extname as tr}from"node:path";function ir(e){let t=tr(e).toLowerCase();return nr[t]||"application/octet-stream"}function lt(e){let t=[],r;try{r=at(e)}catch{return t}for(let n of r){if(rr.has(n)||n.startsWith(".")||or.has(n))continue;let o=ct(e,n),s;try{s=he(o)}catch{continue}s.isDirectory()?t.push(...lt(o)):s.isFile()&&t.push(o)}return t}async function sr({apiUrl:e,apiKey:t,executionId:r,nodeName:n,filename:o,absolutePath:s,sizeBytes:i,contentType:f}){let a;try{let c=await fetch(`${e}/${r}/artifacts/upload-url`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({nodeName:n,filename:o,contentType:f,sizeBytes:i})});if(!c.ok){let l=await c.text();return console.warn(`[artifacts] upload-url failed for ${n}/${o}: ${c.status} ${l.slice(0,200)}`),null}a=await c.json()}catch(c){return console.warn(`[artifacts] upload-url request errored for ${n}/${o}: ${c.message}`),null}try{let c=Vt(s),l=a.requiredHeaders?{...a.requiredHeaders,"Content-Length":String(i)}:{"Content-Type":f,"Content-Length":String(i)},u=await fetch(a.url,{method:"PUT",headers:l,body:c,duplex:"half"});if(!u.ok)return console.warn(`[artifacts] S3 PUT failed for ${n}/${o}: ${u.status}`),null}catch(c){return console.warn(`[artifacts] S3 PUT errored for ${n}/${o}: ${c.message}`),null}return{nodeName:n,filename:o,s3Key:a.s3Key,contentType:f,sizeBytes:i}}async function ar({sessionPath:e,executionId:t,apiUrl:r,apiKey:n}){let o={uploaded:[],skipped:[]};if(!e||!Zt(e))return o;if(!r||!n||!t)return console.warn("[artifacts] uploader missing required input \u2014 skipping"),o;let s;try{s=at(e)}catch(l){return console.warn(`[artifacts] could not read session folder ${e}: ${l.message}`),o}let i=[];for(let l of s){let u=ct(e,l),d;try{d=he(u)}catch{continue}if(!d.isDirectory()||l.startsWith(".")||l.startsWith("_"))continue;let k=lt(u);for(let x of k){let T=Xt(u,x).split(er).join("/"),U;try{U=he(x).size}catch{continue}if(U>st){o.skipped.push({nodeName:l,filename:T,reason:`size ${U} > ${st}`});continue}if(U===0){o.skipped.push({nodeName:l,filename:T,reason:"empty"});continue}i.push({apiUrl:r,apiKey:n,executionId:t,nodeName:l,filename:T,absolutePath:x,sizeBytes:U,contentType:ir(T)})}}if(i.length===0)return o;let f=4,a=i.slice(),c=Array.from({length:Math.min(f,a.length)},async()=>{for(;a.length;){let l=a.shift(),u=await sr(l);u?o.uploaded.push(u):o.skipped.push({nodeName:l.nodeName,filename:l.filename,reason:"upload failed"})}});if(await Promise.all(c),o.uploaded.length>0)try{let l=await fetch(`${r}/${t}/artifacts`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({files:o.uploaded})});if(!l.ok){let u=await l.text();console.warn(`[artifacts] record failed: ${l.status} ${u.slice(0,200)}`)}}catch(l){console.warn(`[artifacts] record errored: ${l.message}`)}return o}var st,rr,or,nr,pt=m(()=>{st=500*1024*1024,rr=new Set([".DS_Store","Thumbs.db",".zibby-stop"]),or=new Set(["node_modules",".git","dist",".zibby","__tests__","__mocks__",".cache",".next",".turbo"]),nr={".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 ht,writeFileSync as cr,existsSync as C,readFileSync as dt}from"fs";import{join as A,dirname as lr,resolve as ut}from"path";import{pathToFileURL as ye}from"url";import{execSync as fr,spawn as gt}from"node:child_process";import{SQSClient as Et,SendMessageCommand as $t}from"@aws-sdk/client-sqs";var ne=null;function Rt(){return ne||(ne=new Et({region:process.env.AWS_REGION||"ap-southeast-2"})),ne}async function Re(e,t,r,n){let{EXECUTION_ID:o,SQS_AUTH_TOKEN:s,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:f,PROJECT_API_TOKEN:a}=n;if(!o)return;let c={executionId:o,...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 ie(i,o,c,a):f&&await se(f,o,c)}catch(l){console.error(`\u26A0\uFE0F Failed to send progress: ${l.message}`)}}async function Ue(e,t,r){let{EXECUTION_ID:n,SQS_AUTH_TOKEN:o,PROGRESS_API_URL:s,PROGRESS_QUEUE_URL:i,PROJECT_API_TOKEN:f}=e;if(!n||!r)return;let a=JSON.stringify(r).length;console.log(`Sending artifact: ${t} (${(a/1024).toFixed(1)}KB)`);let c={executionId:n,...o&&{sqsAuthToken:o},artifacts:{[t]:r},timestamp:new Date().toISOString()},l=s?"HTTP":i?"SQS":"NONE",u=JSON.stringify(c).length;try{if(s)await ie(s,n,c,f);else if(i)await se(i,n,c);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 ${l} (payload=${(u/1024).toFixed(1)}KB, value=${(a/1024).toFixed(1)}KB)`)}catch(d){console.error(`Failed to send artifact ${t} via ${l}:`),console.error(` Payload size: ${(u/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}`),u>256*1024&&console.error(" \u26A0\uFE0F Message exceeds SQS 256KB limit! Consider splitting or compressing.")}}async function Oe(e,{status:t,error:r,finalState:n}){let{EXECUTION_ID:o,SQS_AUTH_TOKEN:s,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:f,PROJECT_API_TOKEN:a}=e;if(!o)return;let c={executionId:o,...s&&{sqsAuthToken:s},status:t,...r&&{error:r},...n&&typeof n=="object"&&Object.keys(n).length>0?{finalState:n}:{},timestamp:new Date().toISOString()},l=i?"HTTP":f?"SQS":"NONE",u=JSON.stringify(c).length;console.log(`Sending final status: ${t} via ${l} (${(u/1024).toFixed(1)}KB)`);try{if(i)await ie(i,o,c,a);else if(f){let d=["completed","failed","insufficient_context","blocked"].includes(t)?"execution_completed":"progress_update";await se(f,o,c,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 ${l}`)}catch(d){console.error(`Failed to send final status (${t}) via ${l}:`),console.error(` Payload: ${(u/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 ie(e,t,r,n){let o=`${e}/${t}/progress`,s={"Content-Type":"application/json"};n&&(s.Authorization=`Bearer ${n}`);let i=await fetch(o,{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 se(e,t,r,n="progress_update"){let o=JSON.stringify(r),s=(o.length/1024).toFixed(1);o.length>256*1024&&console.error(`\u274C SQS message too large: ${s}KB (limit 256KB) for ${t} [${n}]`),await Rt().send(new $t({QueueUrl:e,MessageBody:o,MessageGroupId:t,MessageAttributes:{executionId:{DataType:"String",StringValue:t},messageType:{DataType:"String",StringValue:n}}}))}function Ut(e,t){try{let r=e?.sessionPath||e?.SESSION_PATH||process.env.ZIBBY_SESSION_PATH;if(!r||!t)return null;let n=Ee("fs"),s=Ee("path").join(r,t,"usage.json");if(!n.existsSync(s))return null;let i=n.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 Ie(e,t,r=null){return async function(o,s,i){let f=Date.now(),a=[],c="",l=console.log,u=process.stdout.write.bind(process.stdout),d=process.stderr.write.bind(process.stderr),k=!1;console.log=(...g)=>{let S=g.map(E=>typeof E=="string"?E:JSON.stringify(E)).join(" ");a.push(S),k=!0,l(...g),k=!1};let x="";process.stdout.write=(g,S,E)=>{if(!k){let N=typeof g=="string"?g:g.toString();x+=N;let h=x.split(`
3
+ `);x=h.pop()||"";for(let J of h){let M=J.trim();M&&a.push(M)}}return u(g,S,E)},l(`[Middleware] Started capturing logs for ${o}`);let T=!1,U=setInterval(()=>{if(T)return;let g=a.join(`
4
+ `);g!==c&&g.length>0&&(c=g,d(`\u{1F4E1} [Middleware] Sending live update for ${o}: ${g.length} chars, ${a.length} lines
5
+ `),e(o,"in_progress",g,i).catch(S=>{d(`\u26A0\uFE0F [Middleware] Failed to send live update: ${S.message}
6
+ `)}))},500);try{await e(o,"in_progress","",i);let g=await s(),S=((Date.now()-f)/1e3).toFixed(1);T=!0,clearInterval(U),await new Promise(h=>setImmediate(h)),console.log=l,process.stdout.write=u,x.trim()&&(a.push(x.trim()),x="");let E=a.join(`
7
+ `);d(`\u{1F4E1} [Middleware] Sending final update for ${o}: ${E.length} chars, ${a.length} total lines captured
8
+ `);let N=Ut(i,o);if(N)try{await t(i,`usage_${o}`,N)}catch(h){d(`\u26A0\uFE0F [Middleware] usage ship failed for ${o}: ${h.message}
9
+ `)}if(g.success){if(await e(o,"success",E||`Completed in ${S}s`,i),r)try{let h=r(o,g);h&&h.key&&h.value&&await t(i,h.key,h.value)}catch(h){d(`\u26A0\uFE0F [Middleware] artifactExtractor for ${o} threw: ${h.message}
10
+ `)}}else await e(o,"failed",`${E}
10
11
 
11
- Error: ${g.error}`,i);return g}catch(g){T=!0,clearInterval(U),await new Promise($=>setImmediate($)),console.log=l,process.stdout.write=d;let y=`${a.join(`
12
+ Error: ${g.error}`,i);return g}catch(g){T=!0,clearInterval(U),await new Promise(E=>setImmediate(E)),console.log=l,process.stdout.write=u;let S=`${a.join(`
12
13
  `)}
13
14
 
14
- Error: ${g.message}`;throw await e(o,"failed",y,i),g}}}function Oe({workflowType:e,jobId:t,projectId:r,agentType:n,model:o,egressIp:s,egressKind:i}){let f="\u2500".repeat(60),a=`${n||"default"} (model: ${o||"auto"})`,c=["",f,` Workflow: ${e}`,` Job: ${t||"local"}`,` Project: ${r||"none"}`,` Agent: ${a}`];if(s||i){let l=s||"unknown",d=i||"static";c.push(` Egress: ${l} (${d})`)}return c.push(f),c.join(`
15
- `)}import{existsSync as Rt,writeFileSync as Ut}from"fs";import{join as Te}from"path";var ae={width:1280,height:720},It="on",Ot="tests",Tt="test-results/playwright";function At(e={}){let t=e.viewport&&typeof e.viewport=="object"?{width:Number(e.viewport.width)||ae.width,height:Number(e.viewport.height)||ae.height}:ae,r=typeof e.video=="string"?e.video:It,n=e.paths?.generated||Ot,o=e.playwrightArtifacts!==!1,s=o?"on":"off",i=o?"only-on-failure":"off";return`// AUTO-GENERATED at workflow run start by @zibby/cli's
15
+ Error: ${g.message}`;throw await e(o,"failed",S,i),g}}}function Te({workflowType:e,jobId:t,projectId:r,agentType:n,model:o,egressIp:s,egressKind:i}){let f="\u2500".repeat(60),a=`${n||"default"} (model: ${o||"auto"})`,c=["",f,` Workflow: ${e}`,` Job: ${t||"local"}`,` Project: ${r||"none"}`,` Agent: ${a}`];if(s||i){let l=s||"unknown",u=i||"static";c.push(` Egress: ${l} (${u})`)}return c.push(f),c.join(`
16
+ `)}import{existsSync as Ot,writeFileSync as It}from"fs";import{join as Ae}from"path";var ae={width:1280,height:720},Tt="on",At="tests",Pt="test-results/playwright";function vt(e={}){let t=e.viewport&&typeof e.viewport=="object"?{width:Number(e.viewport.width)||ae.width,height:Number(e.viewport.height)||ae.height}:ae,r=typeof e.video=="string"?e.video:Tt,n=e.paths?.generated||At,o=e.playwrightArtifacts!==!1,s=o?"on":"off",i=o?"only-on-failure":"off";return`// AUTO-GENERATED at workflow run start by @zibby/cli's
16
17
  // playwright-config-materialize.js. Derived from the bundled
17
18
  // zibby.config.json (which @zibby/workflow-deploy serialized from your
18
19
  // project's .zibby.config.mjs). Do NOT edit by hand \u2014 re-run a workflow
@@ -23,7 +24,7 @@ import { defineConfig } from '@playwright/test';
23
24
 
24
25
  export default defineConfig({
25
26
  testDir: '${n.replace(/'/g,"\\'")}',
26
- outputDir: '${Tt}',
27
+ outputDir: '${Pt}',
27
28
  timeout: 60000,
28
29
  retries: 0,
29
30
  workers: 1,
@@ -38,7 +39,7 @@ export default defineConfig({
38
39
 
39
40
  reporter: [['list']],
40
41
  });
41
- `}function Ae(e,t){if(!e)return{written:!1,path:null,reason:"no workspaceDir"};for(let o of["js","mjs","ts"]){let s=Te(e,`playwright.config.${o}`);if(Rt(s))return{written:!1,path:s,reason:`existing playwright.config.${o} in workspace`}}let r=Te(e,"playwright.config.js"),n=At(t||{});try{return Ut(r,n,"utf-8"),{written:!0,path:r,reason:"derived from zibby.config"}}catch(o){return{written:!1,path:null,reason:`write failed: ${o.message}`}}}import"@zibby/core";var M=process.env.WORKSPACE||"/workspace";async function lr(e,t){mt(t,{recursive:!0});let r=Date.now();console.log("[setup] Fetching bundle...");let n=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=ut("curl",["-fsSL",e],{stdio:["ignore","pipe","inherit"]}),a=ut("tar",["-xzf","-","-C",t],{stdio:["pipe","inherit","inherit"]});f.stdout.pipe(a.stdin);let c,l,d=()=>{if(c!==void 0&&l!==void 0){if(c!==0)return i(new Error(`curl exited ${c}`));if(l!==0)return i(new Error(`tar exited ${l}`));s()}};f.on("close",u=>{c=u,d()}),a.on("close",u=>{l=u,d()}),f.on("error",i),a.on("error",i)})}finally{clearInterval(n)}let o=((Date.now()-r)/1e3).toFixed(1);return console.log(`[setup] Bundle extracted (${o}s)`),t}async function gt(){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 fr(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 pr(e,t){let r=dt(t),n=0;for(let[o,s]of Object.entries(e)){let i=dt(t,o);if(!i.startsWith(`${r}/`)&&i!==r){console.error(` \u26D4 Skipping unsafe path: ${o}`);continue}mt(ar(i),{recursive:!0}),sr(i,s,"utf-8"),n++}return n}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"),n=new r.ProxyAgent({uri:e,token:`Bearer ${t}`});r.setGlobalDispatcher(n)}catch(r){console.warn(`[setup] Failed to install egress proxy dispatcher: ${r.message}`)}}async function ur(){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 gr(e,t){let r=A(e,"graph.mjs");if(!C(r))throw new Error(`graph.mjs not found at ${r}`);let n=await import(xe(r).href),o=t?.entryClass,s=o&&n[o]||n.default||Object.values(n).find(i=>typeof i=="function"&&i.prototype?.buildGraph);if(!s)throw new Error("No WorkflowAgent class found in graph.mjs");return s}async function Bo(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let p=await import("module");p.default._initPaths&&p.default._initPaths()}await dr();let{WORKFLOW_JOB_ID:e,WORKFLOW_TYPE:t,PROJECT_ID:r,AGENT_TYPE:n,MODEL:o}=process.env;t||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1));let s=process.env.WORKFLOW_BUNDLE_URL,i,f={},a,c;if(s){a=t,i=A(M,".zibby","workflows",a);try{await lr(s,i);try{let p=await gt();f=p.input||{},c=p.version}catch{}}catch(p){console.warn(`[setup] Bundle extract failed (${p.message}); falling back to source install`),i=null}}if(!i){let p=await gt(),{sources:h,input:E,workflowType:I,version:R}=p;f=E||{},a=I||t,c=R,console.log(`[setup] Workflow v${c||"?"} (${Object.keys(h).length} files)`),i=A(M,".zibby","workflows",a);let v=pr(h,i);console.log(`[setup] Wrote ${v} files`),console.log("[setup] Installing dependencies...");try{cr("npm install --silent --no-audit --no-fund",{cwd:i,stdio:"inherit"}),console.log("[setup] Dependencies installed")}catch(O){console.warn(`[setup] npm install failed: ${O.message}`)}}let l={},d=A(i,"workflow.json");C(d)&&(l=JSON.parse(pt(d,"utf-8")));let u={},k=A(i,"zibby.config.json");if(C(k))try{u=JSON.parse(pt(k,"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 x=Ae(M,u);x.written?console.log(`[setup] Materialized playwright.config.js \u2192 ${x.path} (${x.reason})`):x.path&&console.log(`[setup] Using existing playwright config: ${x.path}`);let T=fr(u)||n,U=await ur();console.log(Oe({workflowType:t,jobId:e,projectId:r,agentType:T,model:o,egressIp:U.ip,egressKind:U.kind}));let g=await gr(i,l);console.log(`[setup] Loaded ${g.name}`);let y=[],$=A(i,"node_modules","@zibby","agent-workflow"),_=A(i,"node_modules","@zibby","core","node_modules","@zibby","agent-workflow");C($)&&y.push({kind:"hoisted",path:$}),C(_)&&y.push({kind:"nested",path:_});let N=process.env.ZIBBY_RUN_DIAG==="1";if(N){let{readdirSync:p}=await import("fs");console.log(` [diag] @zibby/agent-workflow copies in bundle: ${y.length}`);for(let h of y)console.log(` [diag] ${h.kind}: ${h.path}`);try{let h=A(i,"node_modules","@zibby");C(h)&&console.log(` [diag] node_modules/@zibby/ contents: [${p(h).join(", ")}]`)}catch{}}let J=A(i,"node_modules","@zibby","core","dist","index.js");if(C(J)&&y.length>0)try{let p=await import(xe(J).href),h=[p.AssistantStrategy,p.CursorAgentStrategy,p.ClaudeAgentStrategy,p.CodexAgentStrategy,p.GeminiAgentStrategy].filter(Boolean);for(let E of y){let I=A(E.path,"dist","index.js");if(!C(I))continue;let R=await import(xe(I).href),v=N?R.listStrategies():null;for(let O of h)try{R.registerStrategy(new O)}catch(yt){console.warn(` register ${O.name} into ${E.kind} failed: ${yt.message}`)}N&&console.log(` [diag] ${E.kind} registry: before=[${v.join(",")||"empty"}] after=[${R.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 H=Date.now(),ye=new g({workflow:a||t}),te=ye.buildGraph(),ht=Ie(Ee,Re);Array.isArray(te.middleware)?te.middleware.push(ht):console.warn("[run] graph.middleware not an array \u2014 per-node progress reporting disabled for this run");let F=process.env.WORKFLOW_UUID||null,Y=process.env.ZIBBY_CONVERSATION_ID||null,re=!1;if(F&&Y)try{let{v5:p}=await Promise.resolve().then(()=>(nt(),ot)),h=p(`${F}:${Y}`,"6ba7b810-9dad-11d1-80b4-00c04fd430c8"),E=(process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE||"").replace(/\/executions\/?$/,"").replace(/\/+$/,""),I=process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] sessionId=${h} apiUrl=${E?"set":"unset"} apiKey=${I?"set":"unset"}`),E&&I){let R=`${E}/workflows/${encodeURIComponent(F)}/sessions/${encodeURIComponent(h)}`,v=await fetch(R,{method:"GET",headers:{Authorization:`Bearer ${I}`}});if(process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] GET ${R} \u2192 HTTP ${v.status}`),v.ok){let O=await v.json().catch(()=>({}));re=Array.isArray(O?.entries)&&O.entries.length>0,process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] hasPriorSession=${re} entries=${O?.entries?.length??"n/a"}`)}}}catch(p){process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] threw: ${p.message}`)}let oe=null;try{process.env.REPOS&&(oe=JSON.parse(process.env.REPOS))}catch{}let wt={...f||{},cwd:M,runId:e||`run-${Date.now()}`,config:u,input:f||{},...F?{workflowUuid:F}:{},...Y?{conversationId:Y}:{},...re?{hasPriorSession:!0}:{},workspace:M,...oe?{repos:oe}:{},...process.env.GITHUB_TOKEN?{githubToken:process.env.GITHUB_TOKEN}:{}};console.log("");let j;try{j=await te.run(ye,wt)}catch(p){console.error(`
42
- Workflow execution failed: ${p.message}`),console.error(p.stack),await we("failed",p.message),process.exit(1)}let Se=((Date.now()-H)/1e3).toFixed(1),xt=j?.success!==!1,$e=a||t;if(process.env.UPLOAD_ARTIFACTS!=="0"){let p=j?.state?.sessionPath,h=process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE,E=process.env.PROJECT_API_TOKEN,I=process.env.WORKFLOW_JOB_ID;if(p&&h&&E&&I)try{let{uploadSessionArtifacts:R}=await Promise.resolve().then(()=>(ft(),lt)),{uploaded:v,skipped:O}=await R({sessionPath:p,executionId:I,apiUrl:h,apiKey:E});console.log(`[artifacts] uploaded ${v.length} file(s)${O.length?`, skipped ${O.length}`:""}`)}catch(R){console.warn(`[artifacts] uploader threw: ${R.message}`)}else console.log("[artifacts] skipping upload \u2014 sessionPath/apiUrl/apiKey/executionId missing")}xt?(console.log(`
43
- [done] ${$e} completed in ${Se}s`),await we("completed",null,j?.state)):(console.error(`
44
- [done] ${$e} failed after ${Se}s`),await we("failed",j?.error||"Workflow execution failed",j?.state),process.exit(1))}async function we(e,t=null,r=void 0){let n={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(n.EXECUTION_ID)try{await Ue(n,{status:e,...t&&{error:t},...r?{finalState:r}:{}})}catch(o){console.error(`\u26A0\uFE0F Failed to report status: ${o.message}`)}}export{fr as resolveAgentFromConfig,Bo as runWorkflowCommand};
42
+ `}function Pe(e,t){if(!e)return{written:!1,path:null,reason:"no workspaceDir"};for(let o of["js","mjs","ts"]){let s=Ae(e,`playwright.config.${o}`);if(Ot(s))return{written:!1,path:s,reason:`existing playwright.config.${o} in workspace`}}let r=Ae(e,"playwright.config.js"),n=vt(t||{});try{return It(r,n,"utf-8"),{written:!0,path:r,reason:"derived from zibby.config"}}catch(o){return{written:!1,path:null,reason:`write failed: ${o.message}`}}}import"@zibby/core";var H=process.env.WORKSPACE||"/workspace";async function pr(e,t){ht(t,{recursive:!0});let r=Date.now();console.log("[setup] Fetching bundle...");let n=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=gt("curl",["-fsSL",e],{stdio:["ignore","pipe","inherit"]}),a=gt("tar",["-xzf","-","-C",t],{stdio:["pipe","inherit","inherit"]});f.stdout.pipe(a.stdin);let c,l,u=()=>{if(c!==void 0&&l!==void 0){if(c!==0)return i(new Error(`curl exited ${c}`));if(l!==0)return i(new Error(`tar exited ${l}`));s()}};f.on("close",d=>{c=d,u()}),a.on("close",d=>{l=d,u()}),f.on("error",i),a.on("error",i)})}finally{clearInterval(n)}let o=((Date.now()-r)/1e3).toFixed(1);return console.log(`[setup] Bundle extracted (${o}s)`),t}async function mt(){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 dr(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 ur(e,t){let r=ut(t),n=0;for(let[o,s]of Object.entries(e)){let i=ut(t,o);if(!i.startsWith(`${r}/`)&&i!==r){console.error(` \u26D4 Skipping unsafe path: ${o}`);continue}ht(lr(i),{recursive:!0}),cr(i,s,"utf-8"),n++}return n}async function gr(){let e=process.env.ZIBBY_EGRESS_PROXY_URL,t=process.env.ZIBBY_EGRESS_TOKEN;if(!(!e||!t))try{let r=await import("undici"),n=new r.ProxyAgent({uri:e,token:`Bearer ${t}`});r.setGlobalDispatcher(n)}catch(r){console.warn(`[setup] Failed to install egress proxy dispatcher: ${r.message}`)}}async function mr(){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 hr(e,t){let r=A(e,"graph.mjs");if(!C(r))throw new Error(`graph.mjs not found at ${r}`);let n=await import(ye(r).href),o=t?.entryClass,s=o&&n[o]||n.default||Object.values(n).find(i=>typeof i=="function"&&i.prototype?.buildGraph);if(!s)throw new Error("No WorkflowAgent class found in graph.mjs");return s}async function Jo(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let p=await import("module");p.default._initPaths&&p.default._initPaths()}await gr();let{WORKFLOW_JOB_ID:e,WORKFLOW_TYPE:t,PROJECT_ID:r,AGENT_TYPE:n,MODEL:o}=process.env;t||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1));let s=process.env.WORKFLOW_BUNDLE_URL,i,f={},a,c;if(s){a=t,i=A(H,".zibby","workflows",a);try{await pr(s,i);try{let p=await mt();f=p.input||{},c=p.version}catch{}}catch(p){console.warn(`[setup] Bundle extract failed (${p.message}); falling back to source install`),i=null}}if(!i){let p=await mt(),{sources:w,input:$,workflowType:O,version:R}=p;f=$||{},a=O||t,c=R,console.log(`[setup] Workflow v${c||"?"} (${Object.keys(w).length} files)`),i=A(H,".zibby","workflows",a);let P=ur(w,i);console.log(`[setup] Wrote ${P} files`),console.log("[setup] Installing dependencies...");try{fr("npm install --silent --no-audit --no-fund",{cwd:i,stdio:"inherit"}),console.log("[setup] Dependencies installed")}catch(I){console.warn(`[setup] npm install failed: ${I.message}`)}}let l={},u=A(i,"workflow.json");C(u)&&(l=JSON.parse(dt(u,"utf-8")));let d={},k=A(i,"zibby.config.json");if(C(k))try{d=JSON.parse(dt(k,"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 x=Pe(H,d);x.written?console.log(`[setup] Materialized playwright.config.js \u2192 ${x.path} (${x.reason})`):x.path&&console.log(`[setup] Using existing playwright config: ${x.path}`);let T=dr(d)||n,U=await mr();console.log(Te({workflowType:t,jobId:e,projectId:r,agentType:T,model:o,egressIp:U.ip,egressKind:U.kind}));let g=await hr(i,l);console.log(`[setup] Loaded ${g.name}`);let S=[],E=A(i,"node_modules","@zibby","agent-workflow"),N=A(i,"node_modules","@zibby","core","node_modules","@zibby","agent-workflow");C(E)&&S.push({kind:"hoisted",path:E}),C(N)&&S.push({kind:"nested",path:N});let h=process.env.ZIBBY_RUN_DIAG==="1";if(h){let{readdirSync:p}=await import("fs");console.log(` [diag] @zibby/agent-workflow copies in bundle: ${S.length}`);for(let w of S)console.log(` [diag] ${w.kind}: ${w.path}`);try{let w=A(i,"node_modules","@zibby");C(w)&&console.log(` [diag] node_modules/@zibby/ contents: [${p(w).join(", ")}]`)}catch{}}let J=A(i,"node_modules","@zibby","core","dist","index.js");if(C(J)&&S.length>0)try{let p=await import(ye(J).href),w=[p.AssistantStrategy,p.CursorAgentStrategy,p.ClaudeAgentStrategy,p.CodexAgentStrategy,p.GeminiAgentStrategy].filter(Boolean);for(let $ of S){let O=A($.path,"dist","index.js");if(!C(O))continue;let R=await import(ye(O).href),P=h?R.listStrategies():null;for(let I of w)try{R.registerStrategy(new I)}catch(St){console.warn(` register ${I.name} into ${$.kind} failed: ${St.message}`)}h&&console.log(` [diag] ${$.kind} registry: before=[${P.join(",")||"empty"}] after=[${R.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 M=Date.now(),xe=new g({workflow:a||t}),te=xe.buildGraph(),wt=Ie(Re,Ue);Array.isArray(te.middleware)?te.middleware.push(wt):console.warn("[run] graph.middleware not an array \u2014 per-node progress reporting disabled for this run");let K=process.env.WORKFLOW_UUID||null,Q=process.env.ZIBBY_CONVERSATION_ID||null,re=!1;if(K&&Q)try{let{v5:p}=await Promise.resolve().then(()=>(it(),nt)),w=p(`${K}:${Q}`,"6ba7b810-9dad-11d1-80b4-00c04fd430c8"),$=(process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE||"").replace(/\/executions\/?$/,"").replace(/\/+$/,""),O=process.env.PROJECT_API_TOKEN;if(process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] sessionId=${w} apiUrl=${$?"set":"unset"} apiKey=${O?"set":"unset"}`),$&&O){let R=`${$}/workflows/${encodeURIComponent(K)}/sessions/${encodeURIComponent(w)}`,P=await fetch(R,{method:"GET",headers:{Authorization:`Bearer ${O}`}});if(process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] GET ${R} \u2192 HTTP ${P.status}`),P.ok){let I=await P.json().catch(()=>({}));re=Array.isArray(I?.entries)&&I.entries.length>0,process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] hasPriorSession=${re} entries=${I?.entries?.length??"n/a"}`)}}}catch(p){process.env.ZIBBY_SDK_DEBUG==="1"&&console.log(`[session-preflight] threw: ${p.message}`)}let oe=null;try{process.env.REPOS&&(oe=JSON.parse(process.env.REPOS))}catch{}let yt={...f||{},cwd:H,runId:e||`run-${Date.now()}`,config:d,input:f||{},...K?{workflowUuid:K}:{},...Q?{conversationId:Q}:{},...re?{hasPriorSession:!0}:{},workspace:H,...oe?{repos:oe}:{},...process.env.GITHUB_TOKEN?{githubToken:process.env.GITHUB_TOKEN}:{},EXECUTION_ID:process.env.EXECUTION_ID||e||"",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||""};console.log("");let j;try{j=await te.run(xe,yt)}catch(p){console.error(`
43
+ Workflow execution failed: ${p.message}`),console.error(p.stack),await we("failed",p.message),process.exit(1)}let Se=((Date.now()-M)/1e3).toFixed(1),xt=j?.success!==!1,_e=a||t;if(process.env.UPLOAD_ARTIFACTS!=="0"){let p=j?.state?.sessionPath,w=process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE,$=process.env.PROJECT_API_TOKEN,O=process.env.WORKFLOW_JOB_ID;if(p&&w&&$&&O)try{let{uploadSessionArtifacts:R}=await Promise.resolve().then(()=>(pt(),ft)),{uploaded:P,skipped:I}=await R({sessionPath:p,executionId:O,apiUrl:w,apiKey:$});console.log(`[artifacts] uploaded ${P.length} file(s)${I.length?`, skipped ${I.length}`:""}`)}catch(R){console.warn(`[artifacts] uploader threw: ${R.message}`)}else console.log("[artifacts] skipping upload \u2014 sessionPath/apiUrl/apiKey/executionId missing")}xt?(console.log(`
44
+ [done] ${_e} completed in ${Se}s`),await we("completed",null,j?.state)):(console.error(`
45
+ [done] ${_e} failed after ${Se}s`),await we("failed",j?.error||"Workflow execution failed",j?.state),process.exit(1))}async function we(e,t=null,r=void 0){let n={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(n.EXECUTION_ID)try{await Oe(n,{status:e,...t&&{error:t},...r?{finalState:r}:{}})}catch(o){console.error(`\u26A0\uFE0F Failed to report status: ${o.message}`)}}export{dr as resolveAgentFromConfig,Jo as runWorkflowCommand};
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/cli",
3
- "version": "0.4.33",
3
+ "version": "0.4.35",
4
4
  "description": "Zibby CLI - Test automation generator and runner",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,13 +1,14 @@
1
- function I(a,v,w=null){return async function(i,L,o){let y=Date.now(),n=[],p="",c=console.log,u=process.stdout.write.bind(process.stdout),d=process.stderr.write.bind(process.stderr),g=!1;console.log=(...t)=>{let s=t.map(e=>typeof e=="string"?e:JSON.stringify(e)).join(" ");n.push(s),g=!0,c(...t),g=!1};let l="";process.stdout.write=(t,s,e)=>{if(!g){let r=typeof t=="string"?t:t.toString();l+=r;let h=l.split(`
2
- `);l=h.pop()||"";for(let S of h){let m=S.trim();m&&n.push(m)}}return u(t,s,e)},c(`[Middleware] Started capturing logs for ${i}`);let f=!1,$=setInterval(()=>{if(f)return;let t=n.join(`
3
- `);t!==p&&t.length>0&&(p=t,d(`\u{1F4E1} [Middleware] Sending live update for ${i}: ${t.length} chars, ${n.length} lines
4
- `),a(i,"in_progress",t,o).catch(s=>{d(`\u26A0\uFE0F [Middleware] Failed to send live update: ${s.message}
5
- `)}))},500);try{await a(i,"in_progress","",o);let t=await L(),s=((Date.now()-y)/1e3).toFixed(1);f=!0,clearInterval($),await new Promise(r=>setImmediate(r)),console.log=c,process.stdout.write=u,l.trim()&&(n.push(l.trim()),l="");let e=n.join(`
6
- `);if(d(`\u{1F4E1} [Middleware] Sending final update for ${i}: ${e.length} chars, ${n.length} total lines captured
7
- `),t.success){if(await a(i,"success",e||`Completed in ${s}s`,o),w)try{let r=w(i,t);r&&r.key&&r.value&&await v(o,r.key,r.value)}catch(r){d(`\u26A0\uFE0F [Middleware] artifactExtractor for ${i} threw: ${r.message}
8
- `)}}else await a(i,"failed",`${e}
1
+ var M=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(a,c)=>(typeof require<"u"?require:a)[c]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});function m(r,a){try{let c=r?.sessionPath||r?.SESSION_PATH||process.env.ZIBBY_SESSION_PATH;if(!c||!a)return null;let h=M("fs"),g=M("path").join(c,a,"usage.json");if(!h.existsSync(g))return null;let n=h.readFileSync(g,"utf-8"),u=JSON.parse(n);return!u.input_tokens&&!u.output_tokens&&!u.inputTokens&&!u.outputTokens?null:u}catch{return null}}function E(r,a,c=null){return async function(e,g,n){let u=Date.now(),l=[],v="",p=console.log,$=process.stdout.write.bind(process.stdout),f=process.stderr.write.bind(process.stderr),S=!1;console.log=(...t)=>{let o=t.map(i=>typeof i=="string"?i:JSON.stringify(i)).join(" ");l.push(o),S=!0,p(...t),S=!1};let d="";process.stdout.write=(t,o,i)=>{if(!S){let w=typeof t=="string"?t:t.toString();d+=w;let s=d.split(`
2
+ `);d=s.pop()||"";for(let _ of s){let L=_.trim();L&&l.push(L)}}return $(t,o,i)},p(`[Middleware] Started capturing logs for ${e}`);let y=!1,I=setInterval(()=>{if(y)return;let t=l.join(`
3
+ `);t!==v&&t.length>0&&(v=t,f(`\u{1F4E1} [Middleware] Sending live update for ${e}: ${t.length} chars, ${l.length} lines
4
+ `),r(e,"in_progress",t,n).catch(o=>{f(`\u26A0\uFE0F [Middleware] Failed to send live update: ${o.message}
5
+ `)}))},500);try{await r(e,"in_progress","",n);let t=await g(),o=((Date.now()-u)/1e3).toFixed(1);y=!0,clearInterval(I),await new Promise(s=>setImmediate(s)),console.log=p,process.stdout.write=$,d.trim()&&(l.push(d.trim()),d="");let i=l.join(`
6
+ `);f(`\u{1F4E1} [Middleware] Sending final update for ${e}: ${i.length} chars, ${l.length} total lines captured
7
+ `);let w=m(n,e);if(w)try{await a(n,`usage_${e}`,w)}catch(s){f(`\u26A0\uFE0F [Middleware] usage ship failed for ${e}: ${s.message}
8
+ `)}if(t.success){if(await r(e,"success",i||`Completed in ${o}s`,n),c)try{let s=c(e,t);s&&s.key&&s.value&&await a(n,s.key,s.value)}catch(s){f(`\u26A0\uFE0F [Middleware] artifactExtractor for ${e} threw: ${s.message}
9
+ `)}}else await r(e,"failed",`${i}
9
10
 
10
- Error: ${t.error}`,o);return t}catch(t){f=!0,clearInterval($),await new Promise(e=>setImmediate(e)),console.log=c,process.stdout.write=u;let s=`${n.join(`
11
+ Error: ${t.error}`,n);return t}catch(t){y=!0,clearInterval(I),await new Promise(i=>setImmediate(i)),console.log=p,process.stdout.write=$;let o=`${l.join(`
11
12
  `)}
12
13
 
13
- Error: ${t.message}`;throw await a(i,"failed",s,o),t}}}export{I as createLogCapturingMiddleware};
14
+ Error: ${t.message}`;throw await r(e,"failed",o,n),t}}}export{E as createLogCapturingMiddleware};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/cli",
3
- "version": "0.4.33",
3
+ "version": "0.4.35",
4
4
  "description": "Zibby CLI - Test automation generator and runner",
5
5
  "type": "module",
6
6
  "bin": {