@zibby/cli 0.4.14 → 0.4.17

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 (41) hide show
  1. package/dist/bin/zibby.js +2 -2
  2. package/dist/commands/init.js +64 -64
  3. package/dist/commands/workflows/generate.js +108 -108
  4. package/dist/commands/workflows/logs.js +16 -16
  5. package/dist/commands/workflows/run.js +7 -7
  6. package/dist/commands/workflows/schedule.js +10 -0
  7. package/dist/package.json +4 -2
  8. package/dist/templates/.claude/CLAUDE.md +425 -0
  9. package/dist/templates/.claude/commands/add-node.md +63 -0
  10. package/dist/templates/.claude/commands/add-skill.md +83 -0
  11. package/dist/templates/.claude/commands/new-workflow.md +61 -0
  12. package/dist/templates/.claude/commands/validate-workflow.md +67 -0
  13. package/dist/utils/session-uploader.js +1 -1
  14. package/package.json +4 -2
  15. package/templates/.claude/CLAUDE.md +425 -0
  16. package/templates/.claude/commands/add-node.md +63 -0
  17. package/templates/.claude/commands/add-skill.md +83 -0
  18. package/templates/.claude/commands/new-workflow.md +61 -0
  19. package/templates/.claude/commands/validate-workflow.md +67 -0
  20. package/templates/zibby-workflow-claude/agents-md-block.md +173 -0
  21. package/templates/zibby-workflow-claude/claude/agents/zibby-test-author.md +87 -0
  22. package/templates/zibby-workflow-claude/claude/agents/zibby-workflow-builder.md +101 -0
  23. package/templates/zibby-workflow-claude/claude/commands/zibby-add-node.md +75 -0
  24. package/templates/zibby-workflow-claude/claude/commands/zibby-debug.md +67 -0
  25. package/templates/zibby-workflow-claude/claude/commands/zibby-delete.md +37 -0
  26. package/templates/zibby-workflow-claude/claude/commands/zibby-deploy.md +87 -0
  27. package/templates/zibby-workflow-claude/claude/commands/zibby-list.md +30 -0
  28. package/templates/zibby-workflow-claude/claude/commands/zibby-memory-cost.md +39 -0
  29. package/templates/zibby-workflow-claude/claude/commands/zibby-memory-pull.md +47 -0
  30. package/templates/zibby-workflow-claude/claude/commands/zibby-memory-remote-use-hosted.md +61 -0
  31. package/templates/zibby-workflow-claude/claude/commands/zibby-memory-stats.md +38 -0
  32. package/templates/zibby-workflow-claude/claude/commands/zibby-static-ip.md +70 -0
  33. package/templates/zibby-workflow-claude/claude/commands/zibby-tail.md +53 -0
  34. package/templates/zibby-workflow-claude/claude/commands/zibby-test-debug.md +59 -0
  35. package/templates/zibby-workflow-claude/claude/commands/zibby-test-generate.md +39 -0
  36. package/templates/zibby-workflow-claude/claude/commands/zibby-test-run.md +49 -0
  37. package/templates/zibby-workflow-claude/claude/commands/zibby-test-write.md +46 -0
  38. package/templates/zibby-workflow-claude/claude/commands/zibby-trigger.md +56 -0
  39. package/templates/zibby-workflow-claude/claude/settings.json +10 -0
  40. package/templates/zibby-workflow-claude/cursor/rules/zibby-workflows.mdc +119 -0
  41. package/templates/zibby-workflow-claude/manifest.json +47 -0
@@ -1,42 +1,42 @@
1
- import e from"chalk";import{readFileSync as j,existsSync as O,writeSync as B}from"fs";import{homedir as F}from"os";import{join as z}from"path";var A="https://logs.workflows.zibby.app",J="https://logs-stream.zibby.app/",v=null;async function U(a){return v||(process.env.ZIBBY_SSE_ENDPOINT?(v=process.env.ZIBBY_SSE_ENDPOINT,v):(v=J,v))}function G(a){let t=z(F(),".zibby","config.json");O(t)||(console.log(e.red(`
1
+ import e from"chalk";import{readFileSync as j,existsSync as O,writeSync as B}from"fs";import{homedir as F}from"os";import{join as z}from"path";var A="https://logs.workflows.zibby.app",J="https://logs-stream.zibby.app/",v=null;async function U(i){return v||(process.env.ZIBBY_SSE_ENDPOINT?(v=process.env.ZIBBY_SSE_ENDPOINT,v):(v=J,v))}function G(i){let t=z(F(),".zibby","config.json");O(t)||(console.log(e.red(`
2
2
  Not authenticated`)),console.log(e.gray(` Run: zibby login
3
3
  `)),process.exit(1));let o;try{o=JSON.parse(j(t,"utf-8"))}catch{console.log(e.red(`
4
4
  Config file corrupt`)),console.log(e.gray(` Run: zibby login
5
5
  `)),process.exit(1)}let n=o.sessionToken;n||(console.log(e.red(`
6
6
  Not authenticated`)),console.log(e.gray(` Run: zibby login
7
- `)),process.exit(1));let u=a.project;return{token:n,projectId:u}}function C(a){let t=new Date(a);if(process.env.ZIBBY_LOGS_UTC==="1")return t.toISOString().replace("T"," ").replace("Z","");let o=(n,u=2)=>String(n).padStart(u,"0");return`${t.getFullYear()}-${o(t.getMonth()+1)}-${o(t.getDate())} ${o(t.getHours())}:${o(t.getMinutes())}:${o(t.getSeconds())}.${o(t.getMilliseconds(),3)}`}async function L(a,t){let o=await fetch(a,{headers:{Authorization:`Bearer ${t}`}});if(!o.ok){let n=await o.text();throw new Error(`API ${o.status}: ${n}`)}return o.json()}async function W(a,t,o,n){return a||(console.log(e.red(`
7
+ `)),process.exit(1));let u=i.project;return{token:n,projectId:u}}function C(i){let t=new Date(i);if(process.env.ZIBBY_LOGS_UTC==="1")return t.toISOString().replace("T"," ").replace("Z","");let o=(n,u=2)=>String(n).padStart(u,"0");return`${t.getFullYear()}-${o(t.getMonth()+1)}-${o(t.getDate())} ${o(t.getHours())}:${o(t.getMinutes())}:${o(t.getSeconds())}.${o(t.getMilliseconds(),3)}`}async function L(i,t){let o=await fetch(i,{headers:{Authorization:`Bearer ${t}`}});if(!o.ok){let n=await o.text();throw new Error(`API ${o.status}: ${n}`)}return o.json()}async function W(i,t,o,n){return i||(console.log(e.red(`
8
8
  Workflow UUID is required`)),console.log(e.gray(" Usage: zibby workflow logs <workflow-uuid>")),console.log(e.gray(` zibby workflow logs <workflow-uuid> -t
9
- `)),process.exit(1)),a}function D(a,t){let n=((a||"")+t).split(`
10
- `),u=n.pop()||"",i=[],f=null,s=null;for(let m=0;m<n.length;m++){let l=n[m];if(l.trim()){if(l.startsWith("id:")){f=l.slice(3).trim();continue}if(l.startsWith("event:")){let g=l.slice(6).trim();if(g==="log")continue;if(g==="status"){let c=n[m+1];if(c&&c.startsWith("data:"))try{let h=JSON.parse(c.slice(5).trim());h.status==="new_execution"?i.push({type:"newExecution",executionId:h.executionId,taskId:h.taskId}):h.status==="waiting"&&i.push({type:"waiting"})}catch{}continue}if(g==="complete"){i.push({type:"complete"});continue}if(g==="error"){let c=n[m+1];if(c&&c.startsWith("data:"))try{if(JSON.parse(c.slice(5).trim()).error==="No executions found for workflow"){s={type:"notFound"};break}}catch{}s={type:"failed"};break}continue}if(l.startsWith("data:")){let g=l.slice(5).trim();if(!g)continue;try{let c=JSON.parse(g);c.timestamp&&c.message&&i.push({type:"log",timestamp:c.timestamp,message:c.message,taskId:c.taskId})}catch{}}}}return{actions:i,remainder:u,lastEventId:f,returnSignal:s}}async function Y({token:a,executionId:t,sseEndpoint:o,stopped:n}){let u=null;try{let y=function(){let b=Array.from(I.entries()).slice(0,c);I.clear();for(let[w,p]of b)I.set(w,p);r=new Set(Array.from(I.values()).map(w=>w.taskId).filter(Boolean));for(let w of[...d.keys()])I.has(w)||d.delete(w)},x=function(S){for(let[b,w]of I)if(w.taskId===S)return b;return null},T=function(S){let b=I.get(S);!b||b.headerPrinted||(console.log(e.cyan(`
9
+ `)),process.exit(1)),i}function D(i,t){let n=((i||"")+t).split(`
10
+ `),u=n.pop()||"",a=[],f=null,s=null;for(let m=0;m<n.length;m++){let l=n[m];if(l.trim()){if(l.startsWith("id:")){f=l.slice(3).trim();continue}if(l.startsWith("event:")){let g=l.slice(6).trim();if(g==="log")continue;if(g==="status"){let c=n[m+1];if(c&&c.startsWith("data:"))try{let h=JSON.parse(c.slice(5).trim());h.status==="new_execution"?a.push({type:"newExecution",executionId:h.executionId,taskId:h.taskId}):h.status==="waiting"&&a.push({type:"waiting"})}catch{}continue}if(g==="complete"){a.push({type:"complete"});continue}if(g==="error"){let c=n[m+1];if(c&&c.startsWith("data:"))try{if(JSON.parse(c.slice(5).trim()).error==="No executions found for workflow"){s={type:"notFound"};break}}catch{}s={type:"failed"};break}continue}if(l.startsWith("data:")){let g=l.slice(5).trim();if(!g)continue;try{let c=JSON.parse(g);c.timestamp&&c.message&&a.push({type:"log",timestamp:c.timestamp,message:c.message,taskId:c.taskId})}catch{}}}}return{actions:a,remainder:u,lastEventId:f,returnSignal:s}}async function Y({token:i,executionId:t,sseEndpoint:o,stopped:n}){let u=null;try{let y=function(){let b=Array.from(I.entries()).slice(0,c);I.clear();for(let[w,p]of b)I.set(w,p);r=new Set(Array.from(I.values()).map(w=>w.taskId).filter(Boolean));for(let w of[...d.keys()])I.has(w)||d.delete(w)},x=function(S){for(let[b,w]of I)if(w.taskId===S)return b;return null},T=function(S){let b=I.get(S);!b||b.headerPrinted||(console.log(e.cyan(`
11
11
  \u250C\u2500 Execution: ${b.shortId} (task: ${b.taskSuffix})`)),console.log(e.cyan(` \u2514\u2500 Streaming logs...
12
- `)),b.headerPrinted=!0)},P=function(S){let b=e.gray(C(S.timestamp)),w=S.taskId?e.gray(`(${S.taskId.slice(-8)}) `):"";console.log(`${b} ${w}${S.message.replace(/\n$/,"")}`)},_=function(){if(!k)return;k=!1,$&&(clearTimeout($),$=null);let S=Array.from(I.entries()).reverse();for(let[b]of S){let w=d.get(b);if(!(!w||w.length===0)){T(b);for(let p of w)P(p)}}d.clear()},N=function(){k&&($&&clearTimeout($),$=setTimeout(_,h))},i=new URL(o);i.searchParams.set("jobId",t),u&&i.searchParams.set("lastEventId",u);let f=await fetch(i.toString(),{headers:{Authorization:`Bearer ${a}`,Accept:"text/event-stream"}});if(!f.ok)throw new Error(`SSE connection failed: ${f.status} ${f.statusText}`);let s=f.body.getReader(),m=new TextDecoder,l="",g=!1,c=Number(process.env.ZIBBY_LOGS_HISTORY_LIMIT)||10,h=Number(process.env.ZIBBY_LOGS_REPLAY_TIMEOUT_MS)||3e3,I=new Map,r=new Set,d=new Map,k=!0,$=null;for(N();!n.value;){let{done:S,value:b}=await s.read();if(S)break;let w=D(l,m.decode(b,{stream:!0}));l=w.remainder,w.lastEventId&&(u=w.lastEventId);for(let p of w.actions)switch(p.type){case"newExecution":{let E=`${p.executionId.slice(0,8)}...${p.executionId.slice(-4)}`,R=p.taskId?p.taskId.slice(-8):"pending";I.set(p.executionId,{shortId:E,taskSuffix:R,taskId:p.taskId||null,headerPrinted:!1}),d.has(p.executionId)||d.set(p.executionId,[]),y(),N();break}case"waiting":_(),console.log(e.gray(`
13
- Waiting for next execution...`));break;case"complete":_(),g=!0;break;case"log":{if(p.taskId&&r.size>0&&!r.has(p.taskId))break;if(k){let E=p.taskId?x(p.taskId):null;if(E){let R=d.get(E)||[];R.push(p),d.set(E,R),N()}else P(p)}else{if(p.taskId){let E=x(p.taskId);E&&T(E)}P(p)}break}}if(w.returnSignal)return w.returnSignal.type==="notFound"?{notFound:!0}:{failed:!0}}return _(),{completed:g}}catch(i){if(i.name==="AbortError")return{aborted:!0};throw i}}function H(a,{baseMs:t=500,capMs:o=3e4,rand:n=Math.random}={}){let u=Math.min(o,t*Math.pow(2,Math.max(0,a)));return Math.floor(n()*u)}async function Z({attemptStream:a,stopped:t,follow:o,logger:n,sleep:u=m=>new Promise(l=>setTimeout(l,m)),exit:i=m=>{throw new Error(`exit:${m}`)},backoff:f=H,notFoundPollMs:s=5e3}){let m=0,l=!1;for(;!t.value;){let g;try{g=await a(),m=0}catch(c){if(c.name==="AbortError"||t.value)return{reason:"aborted"};if(l||(n.error(` SSE Error: ${c.message}`),o&&n.gray(" Reconnecting..."),l=!0),!o)return i("error")??{reason:"error"};let h=f(m);m++,await u(h);continue}if(g.aborted||t.value)return{reason:"aborted"};if(g.notFound){if(o){l||(n.yellow(" No executions found yet. Waiting for workflow to be triggered..."),n.gray(" Press Ctrl+C to stop."),l=!0),await u(s);continue}return n.yellow(`
12
+ `)),b.headerPrinted=!0)},P=function(S){let b=e.gray(C(S.timestamp)),w=S.taskId?e.gray(`(${S.taskId.slice(-8)}) `):"";console.log(`${b} ${w}${S.message.replace(/\n$/,"")}`)},_=function(){if(!k)return;k=!1,$&&(clearTimeout($),$=null);let S=Array.from(I.entries()).reverse();for(let[b]of S){let w=d.get(b);if(!(!w||w.length===0)){T(b);for(let p of w)P(p)}}d.clear()},N=function(){k&&($&&clearTimeout($),$=setTimeout(_,h))},a=new URL(o);a.searchParams.set("jobId",t),u&&a.searchParams.set("lastEventId",u);let f=await fetch(a.toString(),{headers:{Authorization:`Bearer ${i}`,Accept:"text/event-stream"}});if(!f.ok)throw new Error(`SSE connection failed: ${f.status} ${f.statusText}`);let s=f.body.getReader(),m=new TextDecoder,l="",g=!1,c=Number(process.env.ZIBBY_LOGS_HISTORY_LIMIT)||10,h=Number(process.env.ZIBBY_LOGS_REPLAY_TIMEOUT_MS)||3e3,I=new Map,r=new Set,d=new Map,k=!0,$=null;for(N();!n.value;){let{done:S,value:b}=await s.read();if(S)break;let w=D(l,m.decode(b,{stream:!0}));l=w.remainder,w.lastEventId&&(u=w.lastEventId);for(let p of w.actions)switch(p.type){case"newExecution":{let E=`${p.executionId.slice(0,8)}...${p.executionId.slice(-4)}`,R=p.taskId?p.taskId.slice(-8):"pending";I.set(p.executionId,{shortId:E,taskSuffix:R,taskId:p.taskId||null,headerPrinted:!1}),d.has(p.executionId)||d.set(p.executionId,[]),y(),N();break}case"waiting":_(),console.log(e.gray(`
13
+ Waiting for next execution...`));break;case"complete":_(),g=!0;break;case"log":{if(p.taskId&&r.size>0&&!r.has(p.taskId))break;if(k){let E=p.taskId?x(p.taskId):null;if(E){let R=d.get(E)||[];R.push(p),d.set(E,R),N()}else P(p)}else{if(p.taskId){let E=x(p.taskId);E&&T(E)}P(p)}break}}if(w.returnSignal)return w.returnSignal.type==="notFound"?{notFound:!0}:{failed:!0}}return _(),{completed:g}}catch(a){if(a.name==="AbortError")return{aborted:!0};throw a}}function H(i,{baseMs:t=500,capMs:o=3e4,rand:n=Math.random}={}){let u=Math.min(o,t*Math.pow(2,Math.max(0,i)));return Math.floor(n()*u)}async function Z({attemptStream:i,stopped:t,follow:o,logger:n,sleep:u=m=>new Promise(l=>setTimeout(l,m)),exit:a=m=>{throw new Error(`exit:${m}`)},backoff:f=H,notFoundPollMs:s=5e3}){let m=0,l=!1;for(;!t.value;){let g;try{g=await i(),m=0}catch(c){if(c.name==="AbortError"||t.value)return{reason:"aborted"};if(l||(n.error(` SSE Error: ${c.message}`),o&&n.gray(" Reconnecting..."),l=!0),!o)return a("error")??{reason:"error"};let h=f(m);m++,await u(h);continue}if(g.aborted||t.value)return{reason:"aborted"};if(g.notFound){if(o){l||(n.yellow(" No executions found yet. Waiting for workflow to be triggered..."),n.gray(" Press Ctrl+C to stop."),l=!0),await u(s);continue}return n.yellow(`
14
14
  No executions found for this workflow. Trigger the workflow first.
15
- `),i("notFound")??{reason:"notFound"}}if(l&&(n.gray(` Reconnected.
15
+ `),a("notFound")??{reason:"notFound"}}if(l&&(n.gray(` Reconnected.
16
16
  `),l=!1),g.failed)return n.red(`
17
- Execution failed.`),o?{reason:"failed"}:i("failed")??{reason:"failed"};if(g.completed)return i("completed")??{reason:"completed"};if(!o)return{reason:"disconnected"}}return{reason:"stopped"}}async function V({token:a,jobId:t,follow:o,projectId:n}){console.log(e.gray(` Streaming logs for workflow ${e.cyan(t)}...`)),console.log(o?e.gray(` Press Ctrl+C to stop.
18
- `):"");let u=await U(a);if(!u)return console.log(e.yellow(` SSE endpoint not configured, using CloudWatch polling...
19
- `)),M({token:a,projectId:null,jobId:t,follow:o,limit:1e5});let i={value:!1},f=()=>{i.value=!0;try{B(2,`
17
+ Execution failed.`),o?{reason:"failed"}:a("failed")??{reason:"failed"};if(g.completed)return a("completed")??{reason:"completed"};if(!o)return{reason:"disconnected"}}return{reason:"stopped"}}async function V({token:i,jobId:t,follow:o,projectId:n}){console.log(e.gray(` Streaming logs for workflow ${e.cyan(t)}...`)),console.log(o?e.gray(` Press Ctrl+C to stop.
18
+ `):"");let u=await U(i);if(!u)return console.log(e.yellow(` SSE endpoint not configured, using CloudWatch polling...
19
+ `)),M({token:i,projectId:null,jobId:t,follow:o,limit:1e5});let a={value:!1},f=()=>{a.value=!0;try{B(2,`
20
20
  Stopped streaming.
21
- `)}catch{}process.exit(0)};process.prependListener("SIGINT",f),process.prependListener("SIGTERM",f),await Z({attemptStream:()=>Y({token:a,executionId:t,sseEndpoint:u,stopped:i}),stopped:i,follow:o,logger:{gray:s=>console.log(e.gray(s)),red:s=>console.log(e.red(s)),yellow:s=>console.log(e.yellow(s)),error:s=>console.error(e.red(s))},exit:s=>{s==="completed"&&process.exit(0),(s==="error"||s==="notFound"||s==="failed")&&process.exit(1)}})}async function M({token:a,projectId:t,jobId:o,follow:n,limit:u}){let i=t?`${A}/logs/${t}/${o}`:`${A}/job/${o}`,f=null,s=0,m=new Set,l=!1,g=0,c=5,h=()=>{l=!0,console.log(e.gray(`
21
+ `)}catch{}process.exit(0)};process.prependListener("SIGINT",f),process.prependListener("SIGTERM",f),await Z({attemptStream:()=>Y({token:i,executionId:t,sseEndpoint:u,stopped:a}),stopped:a,follow:o,logger:{gray:s=>console.log(e.gray(s)),red:s=>console.log(e.red(s)),yellow:s=>console.log(e.yellow(s)),error:s=>console.error(e.red(s))},exit:s=>{s==="completed"&&process.exit(0),(s==="error"||s==="notFound"||s==="failed")&&process.exit(1)}})}async function M({token:i,projectId:t,jobId:o,follow:n,limit:u}){let a=t?`${A}/logs/${t}/${o}`:`${A}/job/${o}`,f=null,s=0,m=new Set,l=!1,g=0,c=5,h=()=>{l=!0,console.log(e.gray(`
22
22
  Stopped tailing.
23
23
  `)),process.exit(0)};for(process.on("SIGINT",h),process.on("SIGTERM",h),console.log(e.gray(` Fetching logs for workflow ${e.cyan(o)}...`)),console.log(n?e.gray(` Press Ctrl+C to stop.
24
- `):"");!l;)try{let I=new URLSearchParams({limit:String(u)});f&&I.set("nextToken",f);let r=await L(`${i}?${I}`,a);g=0,r.message&&r.lines?.length===0&&s===0&&console.log(e.gray(` ${r.message}`)),r.status==="starting"&&r.lines?.length===0&&s===0&&console.log(e.gray(" Container starting..."));for(let y of r.lines||[]){let x=`${y.timestamp}:${y.message}`;if(m.has(x))continue;m.add(x);let T=e.gray(C(y.timestamp)),P=r.taskId?e.gray(`(${r.taskId.slice(-8)}) `):"";console.log(`${T} ${P}${y.message.replace(/\n$/,"")}`)}if(s=r.lines?.length>0?0:s+1,f=r.nextForwardToken||null,r.status==="completed"||r.status==="failed"){let y=r.status==="completed"?e.green:e.red;console.log(y(`
24
+ `):"");!l;)try{let I=new URLSearchParams({limit:String(u)});f&&I.set("nextToken",f);let r=await L(`${a}?${I}`,i);g=0,r.message&&r.lines?.length===0&&s===0&&console.log(e.gray(` ${r.message}`)),r.status==="starting"&&r.lines?.length===0&&s===0&&console.log(e.gray(" Container starting..."));for(let y of r.lines||[]){let x=`${y.timestamp}:${y.message}`;if(m.has(x))continue;m.add(x);let T=e.gray(C(y.timestamp)),P=r.taskId?e.gray(`(${r.taskId.slice(-8)}) `):"";console.log(`${T} ${P}${y.message.replace(/\n$/,"")}`)}if(s=r.lines?.length>0?0:s+1,f=r.nextForwardToken||null,r.status==="completed"||r.status==="failed"){let y=r.status==="completed"?e.green:e.red;console.log(y(`
25
25
  Job ${r.status}.`)),process.exit(r.status==="completed"?0:1)}if(!n){r.status&&console.log(e.gray(`
26
26
  Status: ${r.status}`));break}let $=r.lines?.length>0?500:s>5?5e3:2e3;await new Promise(y=>setTimeout(y,$))}catch(I){if(I.name==="AbortError")break;I.message.match(/API (400|401|403|404):/)&&(console.error(e.red(`
27
27
  ${I.message}
28
28
  `)),process.exit(1)),g++,console.error(e.red(` Error: ${I.message}`)),g>=c&&(console.error(e.red(`
29
29
  Too many consecutive errors (${c}). Stopping.
30
- `)),process.exit(1)),n||process.exit(1),await new Promise(d=>setTimeout(d,3e3))}}async function X({token:a,projectId:t,workflow:o,follow:n,limit:u}){let i=`${A}/all/${t}`,f=null,s=0,m=new Set,l=null,g=!1,c=0,h=5,I=()=>{g=!0,console.log(e.gray(`
30
+ `)),process.exit(1)),n||process.exit(1),await new Promise(d=>setTimeout(d,3e3))}}async function X({token:i,projectId:t,workflow:o,follow:n,limit:u}){let a=`${A}/all/${t}`,f=null,s=0,m=new Set,l=null,g=!1,c=0,h=5,I=()=>{g=!0,console.log(e.gray(`
31
31
  Stopped tailing.
32
32
  `)),process.exit(0)};for(process.on("SIGINT",I),process.on("SIGTERM",I),console.log(e.gray(`
33
33
  Tailing all runs for ${e.cyan(o)}...`)),console.log(n?e.gray(` Press Ctrl+C to stop.
34
- `):"");!g;)try{let r=new URLSearchParams({workflow:o,limit:String(u)});f&&r.set("nextToken",f);let d=await L(`${i}?${r}`,a);c=0,d.message&&d.lines?.length===0&&s===0&&console.log(e.gray(` ${d.message}`));for(let y of d.lines||[]){let x=`${y.timestamp}:${y.jobId}:${y.message}`;if(m.has(x))continue;m.add(x),y.jobId!==l&&(l!==null&&console.log(""),console.log(e.dim(` \u2500\u2500 ${y.jobId} \u2500\u2500`)),l=y.jobId);let T=e.gray(C(y.timestamp));console.log(`${T} ${y.message.replace(/\n$/,"")}`)}if(s=d.lines?.length>0?0:s+1,f=d.nextToken||null,!n){f&&console.log(e.gray(`
34
+ `):"");!g;)try{let r=new URLSearchParams({workflow:o,limit:String(u)});f&&r.set("nextToken",f);let d=await L(`${a}?${r}`,i);c=0,d.message&&d.lines?.length===0&&s===0&&console.log(e.gray(` ${d.message}`));for(let y of d.lines||[]){let x=`${y.timestamp}:${y.jobId}:${y.message}`;if(m.has(x))continue;m.add(x),y.jobId!==l&&(l!==null&&console.log(""),console.log(e.dim(` \u2500\u2500 ${y.jobId} \u2500\u2500`)),l=y.jobId);let T=e.gray(C(y.timestamp));console.log(`${T} ${y.message.replace(/\n$/,"")}`)}if(s=d.lines?.length>0?0:s+1,f=d.nextToken||null,!n){f&&console.log(e.gray(`
35
35
  ... more logs available. Run again or use --follow to stream.`)),d.jobCount&&console.log(e.gray(` ${d.jobCount} job(s) found.`));break}if(!d.hasRunning&&!f&&s>2){console.log(e.gray(`
36
36
  No running jobs. All caught up.`));break}let $=d.lines?.length>0?500:s>5?5e3:2e3;await new Promise(y=>setTimeout(y,$))}catch(r){if(r.name==="AbortError")break;r.message.match(/API (400|401|403|404):/)&&(console.error(e.red(`
37
37
  ${r.message}
38
38
  `)),process.exit(1)),c++,console.error(e.red(` Error: ${r.message}`)),c>=h&&(console.error(e.red(`
39
39
  Too many consecutive errors (${h}). Stopping.
40
- `)),process.exit(1)),n||process.exit(1),await new Promise(k=>setTimeout(k,3e3))}}async function oe(a,t){let{token:o,projectId:n}=G(t),u=t.follow===!0,i=t.lines?parseInt(t.lines,10):1e5;if(t.all){let s=t.workflow;return s||(console.log(e.red(`
40
+ `)),process.exit(1)),n||process.exit(1),await new Promise(k=>setTimeout(k,3e3))}}async function oe(i,t){let{token:o,projectId:n}=G(t),u=t.follow===!0,a=t.lines?parseInt(t.lines,10):1e5;if(t.all){let s=t.workflow;return s||(console.log(e.red(`
41
41
  --workflow is required with --all`)),console.log(e.gray(` Example: zibby workflow logs --workflow ticket-triage --all --project <id>
42
- `)),process.exit(1)),X({token:o,projectId:n,workflow:s,follow:u,limit:i})}let f=await W(a,t,o,n);return u?V({token:o,jobId:f,follow:u,projectId:n}):M({token:o,projectId:n,jobId:f,follow:!1,limit:i})}export{oe as logsCommand,D as parseSseChunk,Z as runReconnectLoop,H as sseBackoffMs};
42
+ `)),process.exit(1)),X({token:o,projectId:n,workflow:s,follow:u,limit:a})}let f=await W(i,t,o,n);return u?V({token:o,jobId:f,follow:u,projectId:n}):M({token:o,projectId:n,jobId:f,follow:!1,limit:a})}export{oe as logsCommand,D as parseSseChunk,Z as runReconnectLoop,H as sseBackoffMs};
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- var ce=Object.defineProperty;var le=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{for(var o in e)ce(t,o,{get:e[o],enumerable:!0})};var q={};pe(q,{uploadSessionArtifacts:()=>xe});import{readdirSync as Y,statSync as U,createReadStream as _e,existsSync as be}from"node:fs";import{join as M,relative as Oe,sep as Re,extname as Te}from"node:path";function ke(t){let e=Te(t).toLowerCase();return Ae[e]||"application/octet-stream"}function H(t){let e=[],o;try{o=Y(t)}catch{return e}for(let r of o){if(Pe.has(r)||r.startsWith("."))continue;let n=M(t,r),i;try{i=U(n)}catch{continue}i.isDirectory()?e.push(...H(n)):i.isFile()&&e.push(n)}return e}async function ve({apiUrl:t,apiKey:e,executionId:o,nodeName:r,filename:n,absolutePath:i,sizeBytes:s,contentType:f}){let p;try{let c=await fetch(`${t}/${o}/artifacts/upload-url`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({nodeName:r,filename:n,contentType:f,sizeBytes:s})});if(!c.ok){let a=await c.text();return console.warn(`[artifacts] upload-url failed for ${r}/${n}: ${c.status} ${a.slice(0,200)}`),null}p=await c.json()}catch(c){return console.warn(`[artifacts] upload-url request errored for ${r}/${n}: ${c.message}`),null}try{let c=_e(i),a=await fetch(p.url,{method:"PUT",headers:{"Content-Type":f,"Content-Length":String(s)},body:c,duplex:"half"});if(!a.ok)return console.warn(`[artifacts] S3 PUT failed for ${r}/${n}: ${a.status}`),null}catch(c){return console.warn(`[artifacts] S3 PUT errored for ${r}/${n}: ${c.message}`),null}return{nodeName:r,filename:n,s3Key:p.s3Key,contentType:f,sizeBytes:s}}async function xe({sessionPath:t,executionId:e,apiUrl:o,apiKey:r}){let n={uploaded:[],skipped:[]};if(!t||!be(t))return n;if(!o||!r||!e)return console.warn("[artifacts] uploader missing required input \u2014 skipping"),n;let i;try{i=Y(t)}catch(a){return console.warn(`[artifacts] could not read session folder ${t}: ${a.message}`),n}let s=[];for(let a of i){let d=M(t,a),g;try{g=U(d)}catch{continue}if(!g.isDirectory()||a.startsWith(".")||a.startsWith("_"))continue;let T=H(d);for(let w of T){let b=Oe(d,w).split(Re).join("/"),m;try{m=U(w).size}catch{continue}if(m>Q){n.skipped.push({nodeName:a,filename:b,reason:`size ${m} > ${Q}`});continue}if(m===0){n.skipped.push({nodeName:a,filename:b,reason:"empty"});continue}s.push({apiUrl:o,apiKey:r,executionId:e,nodeName:a,filename:b,absolutePath:w,sizeBytes:m,contentType:ke(b)})}}if(s.length===0)return n;let f=4,p=s.slice(),c=Array.from({length:Math.min(f,p.length)},async()=>{for(;p.length;){let a=p.shift(),d=await ve(a);d?n.uploaded.push(d):n.skipped.push({nodeName:a.nodeName,filename:a.filename,reason:"upload failed"})}});if(await Promise.all(c),n.uploaded.length>0)try{let a=await fetch(`${o}/${e}/artifacts`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({files:n.uploaded})});if(!a.ok){let d=await a.text();console.warn(`[artifacts] record failed: ${a.status} ${d.slice(0,200)}`)}}catch(a){console.warn(`[artifacts] record errored: ${a.message}`)}return n}var Q,Pe,Ae,X=le(()=>{Q=500*1024*1024,Pe=new Set([".DS_Store","Thumbs.db",".zibby-stop"]),Ae={".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 oe,writeFileSync as Ue,existsSync as E,readFileSync as V}from"fs";import{join as h,dirname as Ie,resolve as Z}from"path";import{pathToFileURL as C}from"url";import{execSync as Ce,spawn as ee}from"node:child_process";import{SQSClient as de,SendMessageCommand as fe}from"@aws-sdk/client-sqs";var v=null;function ue(){return v||(v=new de({region:process.env.AWS_REGION||"ap-southeast-2"})),v}async function K(t,{status:e,error:o}){let{EXECUTION_ID:r,SQS_AUTH_TOKEN:n,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:s,PROJECT_API_TOKEN:f}=t;if(!r)return;let p={executionId:r,...n&&{sqsAuthToken:n},status:e,...o&&{error:o},timestamp:new Date().toISOString()},c=i?"HTTP":s?"SQS":"NONE",a=JSON.stringify(p).length;console.log(`Sending final status: ${e} via ${c} (${(a/1024).toFixed(1)}KB)`);try{if(i)await ge(i,r,p,f);else if(s){let d=["completed","failed","insufficient_context","blocked"].includes(e)?"execution_completed":"progress_update";await he(s,r,p,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 ${e} sent via ${c}`)}catch(d){console.error(`Failed to send final status (${e}) via ${c}:`),console.error(` Payload: ${(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}`)}}async function ge(t,e,o,r){let n=`${t}/${e}/progress`,i={"Content-Type":"application/json"};r&&(i.Authorization=`Bearer ${r}`);let s=await fetch(n,{method:"POST",headers:i,body:JSON.stringify(o)});if(!s.ok){let f=await s.text();throw new Error(`HTTP ${s.status}: ${f}`)}}async function he(t,e,o,r="progress_update"){let n=JSON.stringify(o),i=(n.length/1024).toFixed(1);n.length>256*1024&&console.error(`\u274C SQS message too large: ${i}KB (limit 256KB) for ${e} [${r}]`),await ue().send(new fe({QueueUrl:t,MessageBody:n,MessageGroupId:e,MessageAttributes:{executionId:{DataType:"String",StringValue:e},messageType:{DataType:"String",StringValue:r}}}))}function W({workflowType:t,jobId:e,projectId:o,agentType:r,model:n,egressIp:i,egressKind:s}){let f="\u2500".repeat(60),p=`${r||"default"} (model: ${n||"auto"})`,c=["",f,` Workflow: ${t}`,` Job: ${e||"local"}`,` Project: ${o||"none"}`,` Agent: ${p}`];if(i||s){let a=i||"unknown",d=s||"static";c.push(` Egress: ${a} (${d})`)}return c.push(f),c.join(`
3
- `)}import{existsSync as we,writeFileSync as ye}from"fs";import{join as G}from"path";var x={width:1280,height:720},me="on",Se="tests",Ee="test-results/playwright";function $e(t={}){let e=t.viewport&&typeof t.viewport=="object"?{width:Number(t.viewport.width)||x.width,height:Number(t.viewport.height)||x.height}:x,o=typeof t.video=="string"?t.video:me,r=t.paths?.generated||Se,n=t.playwrightArtifacts!==!1,i=n?"on":"off",s=n?"only-on-failure":"off";return`// AUTO-GENERATED at workflow run start by @zibby/cli's
2
+ var ce=Object.defineProperty;var le=(t,e)=>()=>(t&&(e=t(t=0)),e);var pe=(t,e)=>{for(var o in e)ce(t,o,{get:e[o],enumerable:!0})};var q={};pe(q,{uploadSessionArtifacts:()=>Ie});import{readdirSync as H,statSync as I,createReadStream as $e,existsSync as be}from"node:fs";import{join as Y,relative as Oe,sep as Re,extname as Te}from"node:path";function ve(t){let e=Te(t).toLowerCase();return ke[e]||"application/octet-stream"}function M(t){let e=[],o;try{o=H(t)}catch{return e}for(let r of o){if(Pe.has(r)||r.startsWith(".")||Ae.has(r))continue;let n=Y(t,r),i;try{i=I(n)}catch{continue}i.isDirectory()?e.push(...M(n)):i.isFile()&&e.push(n)}return e}async function xe({apiUrl:t,apiKey:e,executionId:o,nodeName:r,filename:n,absolutePath:i,sizeBytes:s,contentType:f}){let d;try{let c=await fetch(`${t}/${o}/artifacts/upload-url`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({nodeName:r,filename:n,contentType:f,sizeBytes:s})});if(!c.ok){let a=await c.text();return console.warn(`[artifacts] upload-url failed for ${r}/${n}: ${c.status} ${a.slice(0,200)}`),null}d=await c.json()}catch(c){return console.warn(`[artifacts] upload-url request errored for ${r}/${n}: ${c.message}`),null}try{let c=$e(i),a=d.requiredHeaders?{...d.requiredHeaders,"Content-Length":String(s)}:{"Content-Type":f,"Content-Length":String(s)},p=await fetch(d.url,{method:"PUT",headers:a,body:c,duplex:"half"});if(!p.ok)return console.warn(`[artifacts] S3 PUT failed for ${r}/${n}: ${p.status}`),null}catch(c){return console.warn(`[artifacts] S3 PUT errored for ${r}/${n}: ${c.message}`),null}return{nodeName:r,filename:n,s3Key:d.s3Key,contentType:f,sizeBytes:s}}async function Ie({sessionPath:t,executionId:e,apiUrl:o,apiKey:r}){let n={uploaded:[],skipped:[]};if(!t||!be(t))return n;if(!o||!r||!e)return console.warn("[artifacts] uploader missing required input \u2014 skipping"),n;let i;try{i=H(t)}catch(a){return console.warn(`[artifacts] could not read session folder ${t}: ${a.message}`),n}let s=[];for(let a of i){let p=Y(t,a),g;try{g=I(p)}catch{continue}if(!g.isDirectory()||a.startsWith(".")||a.startsWith("_"))continue;let T=M(p);for(let w of T){let b=Oe(p,w).split(Re).join("/"),m;try{m=I(w).size}catch{continue}if(m>Q){n.skipped.push({nodeName:a,filename:b,reason:`size ${m} > ${Q}`});continue}if(m===0){n.skipped.push({nodeName:a,filename:b,reason:"empty"});continue}s.push({apiUrl:o,apiKey:r,executionId:e,nodeName:a,filename:b,absolutePath:w,sizeBytes:m,contentType:ve(b)})}}if(s.length===0)return n;let f=4,d=s.slice(),c=Array.from({length:Math.min(f,d.length)},async()=>{for(;d.length;){let a=d.shift(),p=await xe(a);p?n.uploaded.push(p):n.skipped.push({nodeName:a.nodeName,filename:a.filename,reason:"upload failed"})}});if(await Promise.all(c),n.uploaded.length>0)try{let a=await fetch(`${o}/${e}/artifacts`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify({files:n.uploaded})});if(!a.ok){let p=await a.text();console.warn(`[artifacts] record failed: ${a.status} ${p.slice(0,200)}`)}}catch(a){console.warn(`[artifacts] record errored: ${a.message}`)}return n}var Q,Pe,Ae,ke,X=le(()=>{Q=500*1024*1024,Pe=new Set([".DS_Store","Thumbs.db",".zibby-stop"]),Ae=new Set(["node_modules",".git","dist",".zibby","__tests__","__mocks__",".cache",".next",".turbo"]),ke={".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 oe,writeFileSync as Ue,existsSync as _,readFileSync as V}from"fs";import{join as h,dirname as Ce,resolve as Z}from"path";import{pathToFileURL as C}from"url";import{execSync as De,spawn as ee}from"node:child_process";import{SQSClient as de,SendMessageCommand as fe}from"@aws-sdk/client-sqs";var v=null;function ue(){return v||(v=new de({region:process.env.AWS_REGION||"ap-southeast-2"})),v}async function K(t,{status:e,error:o}){let{EXECUTION_ID:r,SQS_AUTH_TOKEN:n,PROGRESS_API_URL:i,PROGRESS_QUEUE_URL:s,PROJECT_API_TOKEN:f}=t;if(!r)return;let d={executionId:r,...n&&{sqsAuthToken:n},status:e,...o&&{error:o},timestamp:new Date().toISOString()},c=i?"HTTP":s?"SQS":"NONE",a=JSON.stringify(d).length;console.log(`Sending final status: ${e} via ${c} (${(a/1024).toFixed(1)}KB)`);try{if(i)await ge(i,r,d,f);else if(s){let p=["completed","failed","insufficient_context","blocked"].includes(e)?"execution_completed":"progress_update";await he(s,r,d,p)}else{console.warn("No transport configured for final status \u2014 neither PROGRESS_API_URL nor PROGRESS_QUEUE_URL set");return}console.log(`Final status ${e} sent via ${c}`)}catch(p){console.error(`Failed to send final status (${e}) via ${c}:`),console.error(` Payload: ${(a/1024).toFixed(1)}KB`),console.error(` Error: ${p.message}`),p.name&&console.error(` Error type: ${p.name}`),p.code&&console.error(` Error code: ${p.code}`)}}async function ge(t,e,o,r){let n=`${t}/${e}/progress`,i={"Content-Type":"application/json"};r&&(i.Authorization=`Bearer ${r}`);let s=await fetch(n,{method:"POST",headers:i,body:JSON.stringify(o)});if(!s.ok){let f=await s.text();throw new Error(`HTTP ${s.status}: ${f}`)}}async function he(t,e,o,r="progress_update"){let n=JSON.stringify(o),i=(n.length/1024).toFixed(1);n.length>256*1024&&console.error(`\u274C SQS message too large: ${i}KB (limit 256KB) for ${e} [${r}]`),await ue().send(new fe({QueueUrl:t,MessageBody:n,MessageGroupId:e,MessageAttributes:{executionId:{DataType:"String",StringValue:e},messageType:{DataType:"String",StringValue:r}}}))}function W({workflowType:t,jobId:e,projectId:o,agentType:r,model:n,egressIp:i,egressKind:s}){let f="\u2500".repeat(60),d=`${r||"default"} (model: ${n||"auto"})`,c=["",f,` Workflow: ${t}`,` Job: ${e||"local"}`,` Project: ${o||"none"}`,` Agent: ${d}`];if(i||s){let a=i||"unknown",p=s||"static";c.push(` Egress: ${a} (${p})`)}return c.push(f),c.join(`
3
+ `)}import{existsSync as we,writeFileSync as ye}from"fs";import{join as G}from"path";var x={width:1280,height:720},me="on",Se="tests",_e="test-results/playwright";function Ee(t={}){let e=t.viewport&&typeof t.viewport=="object"?{width:Number(t.viewport.width)||x.width,height:Number(t.viewport.height)||x.height}:x,o=typeof t.video=="string"?t.video:me,r=t.paths?.generated||Se,n=t.playwrightArtifacts!==!1,i=n?"on":"off",s=n?"only-on-failure":"off";return`// AUTO-GENERATED at workflow run start by @zibby/cli's
4
4
  // playwright-config-materialize.js. Derived from the bundled
5
5
  // zibby.config.json (which @zibby/workflow-deploy serialized from your
6
6
  // project's .zibby.config.mjs). Do NOT edit by hand \u2014 re-run a workflow
@@ -11,7 +11,7 @@ import { defineConfig } from '@playwright/test';
11
11
 
12
12
  export default defineConfig({
13
13
  testDir: '${r.replace(/'/g,"\\'")}',
14
- outputDir: '${Ee}',
14
+ outputDir: '${_e}',
15
15
  timeout: 60000,
16
16
  retries: 0,
17
17
  workers: 1,
@@ -26,7 +26,7 @@ export default defineConfig({
26
26
 
27
27
  reporter: [['list']],
28
28
  });
29
- `}function J(t,e){if(!t)return{written:!1,path:null,reason:"no workspaceDir"};for(let n of["js","mjs","ts"]){let i=G(t,`playwright.config.${n}`);if(we(i))return{written:!1,path:i,reason:`existing playwright.config.${n} in workspace`}}let o=G(t,"playwright.config.js"),r=$e(e||{});try{return ye(o,r,"utf-8"),{written:!0,path:o,reason:"derived from zibby.config"}}catch(n){return{written:!1,path:null,reason:`write failed: ${n.message}`}}}import"@zibby/core";var A=process.env.WORKSPACE||"/workspace";async function De(t,e){oe(e,{recursive:!0});let o=Date.now();console.log("[setup] Fetching bundle...");let r=setInterval(()=>{let i=((Date.now()-o)/1e3).toFixed(1);console.log(`[setup] still fetching (${i}s elapsed)`)},3e3);try{await new Promise((i,s)=>{let f=ee("curl",["-fsSL",t],{stdio:["ignore","pipe","inherit"]}),p=ee("tar",["-xzf","-","-C",e],{stdio:["pipe","inherit","inherit"]});f.stdout.pipe(p.stdin);let c,a,d=()=>{if(c!==void 0&&a!==void 0){if(c!==0)return s(new Error(`curl exited ${c}`));if(a!==0)return s(new Error(`tar exited ${a}`));i()}};f.on("close",g=>{c=g,d()}),p.on("close",g=>{a=g,d()}),f.on("error",s),p.on("error",s)})}finally{clearInterval(r)}let n=((Date.now()-o)/1e3).toFixed(1);return console.log(`[setup] Bundle extracted (${n}s)`),e}async function te(){let t=process.env.WORKFLOW_SOURCES_URL;if(!t)throw new Error("WORKFLOW_SOURCES_URL env var is required");let e=await fetch(t);if(!e.ok)throw new Error(`Failed to fetch sources: ${e.status} ${e.statusText}`);let o=await e.json();if(!o.sources||typeof o.sources!="object")throw new Error('Invalid sources payload \u2014 missing "sources" map');return o}function Ne(t){let e=t?.agent;if(!e)return null;if(typeof e=="string")return e;if(typeof e=="object"){if(typeof e.provider=="string")return e.provider;for(let o of["claude","cursor","codex","gemini"])if(e[o])return o}return null}function Fe(t,e){let o=Z(e),r=0;for(let[n,i]of Object.entries(t)){let s=Z(e,n);if(!s.startsWith(`${o}/`)&&s!==o){console.error(` \u26D4 Skipping unsafe path: ${n}`);continue}oe(Ie(s),{recursive:!0}),Ue(s,i,"utf-8"),r++}return r}async function je(){let t=process.env.ZIBBY_EGRESS_PROXY_URL,e=process.env.ZIBBY_EGRESS_TOKEN;if(!(!t||!e))try{let o=await import("undici"),r=new o.ProxyAgent({uri:t,token:`Bearer ${e}`});o.setGlobalDispatcher(r)}catch(o){console.warn(`[setup] Failed to install egress proxy dispatcher: ${o.message}`)}}async function Le(){if(process.env.ZIBBY_EGRESS_IP)return{ip:process.env.ZIBBY_EGRESS_IP,kind:"static"};try{let t=new AbortController,e=setTimeout(()=>t.abort(),1500),o=await fetch("https://api.ipify.org?format=json",{signal:t.signal});return clearTimeout(e),o.ok?{ip:(await o.json())?.ip||null,kind:"dynamic"}:{ip:null,kind:"dynamic"}}catch{return{ip:null,kind:"dynamic"}}}async function Be(t,e){let o=h(t,"graph.mjs");if(!E(o))throw new Error(`graph.mjs not found at ${o}`);let r=await import(C(o).href),n=e?.entryClass,i=n&&r[n]||r.default||Object.values(r).find(s=>typeof s=="function"&&s.prototype?.buildGraph);if(!i)throw new Error("No WorkflowAgent class found in graph.mjs");return i}async function rt(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let l=await import("module");l.default._initPaths&&l.default._initPaths()}await je();let{WORKFLOW_JOB_ID:t,WORKFLOW_TYPE:e,PROJECT_ID:o,AGENT_TYPE:r,MODEL:n}=process.env;e||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1));let i=process.env.WORKFLOW_BUNDLE_URL,s,f={},p,c;if(i){p=e,s=h(A,".zibby","workflows",p);try{await De(i,s);try{let l=await te();f=l.input||{},c=l.version}catch{}}catch(l){console.warn(`[setup] Bundle extract failed (${l.message}); falling back to source install`),s=null}}if(!s){let l=await te(),{sources:u,input:S,workflowType:$,version:y}=l;f=S||{},p=$||e,c=y,console.log(`[setup] Workflow v${c||"?"} (${Object.keys(u).length} files)`),s=h(A,".zibby","workflows",p);let R=Fe(u,s);console.log(`[setup] Wrote ${R} files`),console.log("[setup] Installing dependencies...");try{Ce("npm install --silent --no-audit --no-fund",{cwd:s,stdio:"inherit"}),console.log("[setup] Dependencies installed")}catch(_){console.warn(`[setup] npm install failed: ${_.message}`)}}let a={},d=h(s,"workflow.json");E(d)&&(a=JSON.parse(V(d,"utf-8")));let g={},T=h(s,"zibby.config.json");if(E(T))try{g=JSON.parse(V(T,"utf-8")),console.log("[setup] Loaded user config from zibby.config.json")}catch(l){console.warn(`[setup] Failed to parse zibby.config.json: ${l.message} \u2014 falling back to defaults`)}let w=J(A,g);w.written?console.log(`[setup] Materialized playwright.config.js \u2192 ${w.path} (${w.reason})`):w.path&&console.log(`[setup] Using existing playwright config: ${w.path}`);let b=Ne(g)||r,m=await Le();console.log(W({workflowType:e,jobId:t,projectId:o,agentType:b,model:n,egressIp:m.ip,egressKind:m.kind}));let D=await Be(s,a);console.log(`[setup] Loaded ${D.name}`);let O=[],N=h(s,"node_modules","@zibby","agent-workflow"),F=h(s,"node_modules","@zibby","core","node_modules","@zibby","agent-workflow");E(N)&&O.push({kind:"hoisted",path:N}),E(F)&&O.push({kind:"nested",path:F});let k=process.env.ZIBBY_RUN_DIAG==="1";if(k){let{readdirSync:l}=await import("fs");console.log(` [diag] @zibby/agent-workflow copies in bundle: ${O.length}`);for(let u of O)console.log(` [diag] ${u.kind}: ${u.path}`);try{let u=h(s,"node_modules","@zibby");E(u)&&console.log(` [diag] node_modules/@zibby/ contents: [${l(u).join(", ")}]`)}catch{}}let j=h(s,"node_modules","@zibby","core","dist","index.js");if(E(j)&&O.length>0)try{let l=await import(C(j).href),u=[l.AssistantStrategy,l.CursorAgentStrategy,l.ClaudeAgentStrategy,l.CodexAgentStrategy,l.GeminiAgentStrategy].filter(Boolean);for(let S of O){let $=h(S.path,"dist","index.js");if(!E($))continue;let y=await import(C($).href),R=k?y.listStrategies():null;for(let _ of u)try{y.registerStrategy(new _)}catch(ae){console.warn(` register ${_.name} into ${S.kind} failed: ${ae.message}`)}k&&console.log(` [diag] ${S.kind} registry: before=[${R.join(",")||"empty"}] after=[${y.listStrategies().join(",")||"empty"}]`)}console.log("[setup] Registered 5 agent strategies (assistant, cursor, claude, codex, gemini)")}catch(l){console.warn(`[setup] Failed to bridge strategies: ${l.message}`)}else console.warn("[setup] No @zibby/core or @zibby/agent-workflow in bundle \u2014 agent strategies may be unavailable");let ne=Date.now(),L=new D({workflow:p||e}),se=L.buildGraph(),re={...f||{},cwd:A,runId:t||`run-${Date.now()}`,config:g,input:f||{}};console.log("");let P;try{P=await se.run(L,re)}catch(l){console.error(`
30
- Workflow execution failed: ${l.message}`),console.error(l.stack),await I("failed",l.message),process.exit(1)}let B=((Date.now()-ne)/1e3).toFixed(1),ie=P?.success!==!1,z=p||e;if(process.env.UPLOAD_ARTIFACTS!=="0"){let l=P?.state?.sessionPath,u=process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE,S=process.env.PROJECT_API_TOKEN,$=process.env.WORKFLOW_JOB_ID;if(l&&u&&S&&$)try{let{uploadSessionArtifacts:y}=await Promise.resolve().then(()=>(X(),q)),{uploaded:R,skipped:_}=await y({sessionPath:l,executionId:$,apiUrl:u,apiKey:S});console.log(`[artifacts] uploaded ${R.length} file(s)${_.length?`, skipped ${_.length}`:""}`)}catch(y){console.warn(`[artifacts] uploader threw: ${y.message}`)}else console.log("[artifacts] skipping upload \u2014 sessionPath/apiUrl/apiKey/executionId missing")}ie?(console.log(`
31
- [done] ${z} completed in ${B}s`),await I("completed")):(console.error(`
32
- [done] ${z} failed after ${B}s`),await I("failed",P?.error||"Workflow execution failed"),process.exit(1))}async function I(t,e=null){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 K(o,{status:t,...e&&{error:e}})}catch(r){console.error(`\u26A0\uFE0F Failed to report status: ${r.message}`)}}export{Ne as resolveAgentFromConfig,rt as runWorkflowCommand};
29
+ `}function J(t,e){if(!t)return{written:!1,path:null,reason:"no workspaceDir"};for(let n of["js","mjs","ts"]){let i=G(t,`playwright.config.${n}`);if(we(i))return{written:!1,path:i,reason:`existing playwright.config.${n} in workspace`}}let o=G(t,"playwright.config.js"),r=Ee(e||{});try{return ye(o,r,"utf-8"),{written:!0,path:o,reason:"derived from zibby.config"}}catch(n){return{written:!1,path:null,reason:`write failed: ${n.message}`}}}import"@zibby/core";var A=process.env.WORKSPACE||"/workspace";async function Ne(t,e){oe(e,{recursive:!0});let o=Date.now();console.log("[setup] Fetching bundle...");let r=setInterval(()=>{let i=((Date.now()-o)/1e3).toFixed(1);console.log(`[setup] still fetching (${i}s elapsed)`)},3e3);try{await new Promise((i,s)=>{let f=ee("curl",["-fsSL",t],{stdio:["ignore","pipe","inherit"]}),d=ee("tar",["-xzf","-","-C",e],{stdio:["pipe","inherit","inherit"]});f.stdout.pipe(d.stdin);let c,a,p=()=>{if(c!==void 0&&a!==void 0){if(c!==0)return s(new Error(`curl exited ${c}`));if(a!==0)return s(new Error(`tar exited ${a}`));i()}};f.on("close",g=>{c=g,p()}),d.on("close",g=>{a=g,p()}),f.on("error",s),d.on("error",s)})}finally{clearInterval(r)}let n=((Date.now()-o)/1e3).toFixed(1);return console.log(`[setup] Bundle extracted (${n}s)`),e}async function te(){let t=process.env.WORKFLOW_SOURCES_URL;if(!t)throw new Error("WORKFLOW_SOURCES_URL env var is required");let e=await fetch(t);if(!e.ok)throw new Error(`Failed to fetch sources: ${e.status} ${e.statusText}`);let o=await e.json();if(!o.sources||typeof o.sources!="object")throw new Error('Invalid sources payload \u2014 missing "sources" map');return o}function Fe(t){let e=t?.agent;if(!e)return null;if(typeof e=="string")return e;if(typeof e=="object"){if(typeof e.provider=="string")return e.provider;for(let o of["claude","cursor","codex","gemini"])if(e[o])return o}return null}function Le(t,e){let o=Z(e),r=0;for(let[n,i]of Object.entries(t)){let s=Z(e,n);if(!s.startsWith(`${o}/`)&&s!==o){console.error(` \u26D4 Skipping unsafe path: ${n}`);continue}oe(Ce(s),{recursive:!0}),Ue(s,i,"utf-8"),r++}return r}async function je(){let t=process.env.ZIBBY_EGRESS_PROXY_URL,e=process.env.ZIBBY_EGRESS_TOKEN;if(!(!t||!e))try{let o=await import("undici"),r=new o.ProxyAgent({uri:t,token:`Bearer ${e}`});o.setGlobalDispatcher(r)}catch(o){console.warn(`[setup] Failed to install egress proxy dispatcher: ${o.message}`)}}async function Be(){if(process.env.ZIBBY_EGRESS_IP)return{ip:process.env.ZIBBY_EGRESS_IP,kind:"static"};try{let t=new AbortController,e=setTimeout(()=>t.abort(),1500),o=await fetch("https://api.ipify.org?format=json",{signal:t.signal});return clearTimeout(e),o.ok?{ip:(await o.json())?.ip||null,kind:"dynamic"}:{ip:null,kind:"dynamic"}}catch{return{ip:null,kind:"dynamic"}}}async function ze(t,e){let o=h(t,"graph.mjs");if(!_(o))throw new Error(`graph.mjs not found at ${o}`);let r=await import(C(o).href),n=e?.entryClass,i=n&&r[n]||r.default||Object.values(r).find(s=>typeof s=="function"&&s.prototype?.buildGraph);if(!i)throw new Error("No WorkflowAgent class found in graph.mjs");return i}async function it(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let l=await import("module");l.default._initPaths&&l.default._initPaths()}await je();let{WORKFLOW_JOB_ID:t,WORKFLOW_TYPE:e,PROJECT_ID:o,AGENT_TYPE:r,MODEL:n}=process.env;e||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1));let i=process.env.WORKFLOW_BUNDLE_URL,s,f={},d,c;if(i){d=e,s=h(A,".zibby","workflows",d);try{await Ne(i,s);try{let l=await te();f=l.input||{},c=l.version}catch{}}catch(l){console.warn(`[setup] Bundle extract failed (${l.message}); falling back to source install`),s=null}}if(!s){let l=await te(),{sources:u,input:S,workflowType:E,version:y}=l;f=S||{},d=E||e,c=y,console.log(`[setup] Workflow v${c||"?"} (${Object.keys(u).length} files)`),s=h(A,".zibby","workflows",d);let R=Le(u,s);console.log(`[setup] Wrote ${R} files`),console.log("[setup] Installing dependencies...");try{De("npm install --silent --no-audit --no-fund",{cwd:s,stdio:"inherit"}),console.log("[setup] Dependencies installed")}catch($){console.warn(`[setup] npm install failed: ${$.message}`)}}let a={},p=h(s,"workflow.json");_(p)&&(a=JSON.parse(V(p,"utf-8")));let g={},T=h(s,"zibby.config.json");if(_(T))try{g=JSON.parse(V(T,"utf-8")),console.log("[setup] Loaded user config from zibby.config.json")}catch(l){console.warn(`[setup] Failed to parse zibby.config.json: ${l.message} \u2014 falling back to defaults`)}let w=J(A,g);w.written?console.log(`[setup] Materialized playwright.config.js \u2192 ${w.path} (${w.reason})`):w.path&&console.log(`[setup] Using existing playwright config: ${w.path}`);let b=Fe(g)||r,m=await Be();console.log(W({workflowType:e,jobId:t,projectId:o,agentType:b,model:n,egressIp:m.ip,egressKind:m.kind}));let D=await ze(s,a);console.log(`[setup] Loaded ${D.name}`);let O=[],N=h(s,"node_modules","@zibby","agent-workflow"),F=h(s,"node_modules","@zibby","core","node_modules","@zibby","agent-workflow");_(N)&&O.push({kind:"hoisted",path:N}),_(F)&&O.push({kind:"nested",path:F});let k=process.env.ZIBBY_RUN_DIAG==="1";if(k){let{readdirSync:l}=await import("fs");console.log(` [diag] @zibby/agent-workflow copies in bundle: ${O.length}`);for(let u of O)console.log(` [diag] ${u.kind}: ${u.path}`);try{let u=h(s,"node_modules","@zibby");_(u)&&console.log(` [diag] node_modules/@zibby/ contents: [${l(u).join(", ")}]`)}catch{}}let L=h(s,"node_modules","@zibby","core","dist","index.js");if(_(L)&&O.length>0)try{let l=await import(C(L).href),u=[l.AssistantStrategy,l.CursorAgentStrategy,l.ClaudeAgentStrategy,l.CodexAgentStrategy,l.GeminiAgentStrategy].filter(Boolean);for(let S of O){let E=h(S.path,"dist","index.js");if(!_(E))continue;let y=await import(C(E).href),R=k?y.listStrategies():null;for(let $ of u)try{y.registerStrategy(new $)}catch(ae){console.warn(` register ${$.name} into ${S.kind} failed: ${ae.message}`)}k&&console.log(` [diag] ${S.kind} registry: before=[${R.join(",")||"empty"}] after=[${y.listStrategies().join(",")||"empty"}]`)}console.log("[setup] Registered 5 agent strategies (assistant, cursor, claude, codex, gemini)")}catch(l){console.warn(`[setup] Failed to bridge strategies: ${l.message}`)}else console.warn("[setup] No @zibby/core or @zibby/agent-workflow in bundle \u2014 agent strategies may be unavailable");let ne=Date.now(),j=new D({workflow:d||e}),se=j.buildGraph(),re={...f||{},cwd:A,runId:t||`run-${Date.now()}`,config:g,input:f||{}};console.log("");let P;try{P=await se.run(j,re)}catch(l){console.error(`
30
+ Workflow execution failed: ${l.message}`),console.error(l.stack),await U("failed",l.message),process.exit(1)}let B=((Date.now()-ne)/1e3).toFixed(1),ie=P?.success!==!1,z=d||e;if(process.env.UPLOAD_ARTIFACTS!=="0"){let l=P?.state?.sessionPath,u=process.env.PROGRESS_API_URL||process.env.ZIBBY_API_BASE,S=process.env.PROJECT_API_TOKEN,E=process.env.WORKFLOW_JOB_ID;if(l&&u&&S&&E)try{let{uploadSessionArtifacts:y}=await Promise.resolve().then(()=>(X(),q)),{uploaded:R,skipped:$}=await y({sessionPath:l,executionId:E,apiUrl:u,apiKey:S});console.log(`[artifacts] uploaded ${R.length} file(s)${$.length?`, skipped ${$.length}`:""}`)}catch(y){console.warn(`[artifacts] uploader threw: ${y.message}`)}else console.log("[artifacts] skipping upload \u2014 sessionPath/apiUrl/apiKey/executionId missing")}ie?(console.log(`
31
+ [done] ${z} completed in ${B}s`),await U("completed")):(console.error(`
32
+ [done] ${z} failed after ${B}s`),await U("failed",P?.error||"Workflow execution failed"),process.exit(1))}async function U(t,e=null){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 K(o,{status:t,...e&&{error:e}})}catch(r){console.error(`\u26A0\uFE0F Failed to report status: ${r.message}`)}}export{Fe as resolveAgentFromConfig,it as runWorkflowCommand};
@@ -0,0 +1,10 @@
1
+ var $=Object.create;var R=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var F=(u,f)=>()=>(f||u((f={exports:{}}).exports,f),f.exports);var j=(u,f,y,w)=>{if(f&&typeof f=="object"||typeof f=="function")for(let g of P(f))!z.call(u,g)&&g!==y&&R(u,g,{get:()=>f[g],enumerable:!(w=Z(f,g))||w.enumerable});return u};var V=(u,f,y)=>(y=u!=null?$(W(u)):{},j(f||!u||!u.__esModule?R(y,"default",{value:u,enumerable:!0}):y,u));var B=F((M,D)=>{(function(f,y){typeof M=="object"&&typeof D=="object"?D.exports=y():typeof define=="function"&&define.amd?define("cronstrue",[],y):typeof M=="object"?M.cronstrue=y():f.cronstrue=y()})(globalThis,()=>(()=>{"use strict";var u={949(g,d,m){Object.defineProperty(d,"__esModule",{value:!0}),d.CronParser=void 0;var r=m(515),b=(function(){function v(t,e,o){e===void 0&&(e=!0),o===void 0&&(o=!1),this.expression=t,this.dayOfWeekStartIndexZero=e,this.monthStartIndexZero=o}return v.prototype.parse=function(){var t,e,o=(t=this.expression)!==null&&t!==void 0?t:"";if(o==="@reboot")return e=["@reboot","","","","","",""],e;if(o.startsWith("@")){var n=this.parseSpecial(this.expression);e=this.extractParts(n)}else e=this.extractParts(this.expression);return this.normalize(e),this.validate(e),e},v.prototype.parseSpecial=function(t){var e={"@yearly":"0 0 1 1 *","@annually":"0 0 1 1 *","@monthly":"0 0 1 * *","@weekly":"0 0 * * 0","@daily":"0 0 * * *","@midnight":"0 0 * * *","@hourly":"0 * * * *","@reboot":"@reboot"},o=e[t];if(!o)throw new Error("Unknown special expression.");return o},v.prototype.extractParts=function(t){if(!this.expression)throw new Error("cron expression is empty");for(var e=t.trim().split(/[ ]+/),o=0;o<e.length;o++)if(e[o].includes(",")){var n=e[o].split(",").map(function(a){return a.trim()}).filter(function(a){return a!==""}).map(function(a){return isNaN(Number(a))?a:Number(a)}).filter(function(a){return a!==null&&a!==""});n.length===0&&n.push("*"),n.sort(function(a,s){return a!==null&&s!==null?a-s:0}),e[o]=n.map(function(a){return a!==null?a.toString():""}).join(",")}if(e.length<5)throw new Error("Expression has only ".concat(e.length," part").concat(e.length==1?"":"s",". At least 5 parts are required."));if(e.length==5)e.unshift(""),e.push("");else if(e.length==6){var i=/\d{4}$/.test(e[5])||e[4]=="?"||e[2]=="?";i?e.unshift(""):e.push("")}else if(e.length>7)throw new Error("Expression has ".concat(e.length," parts; too many!"));return e},v.prototype.normalize=function(t){var e=this;if(t[3]=t[3].replace("?","*"),t[5]=t[5].replace("?","*"),t[2]=t[2].replace("?","*"),t[0].indexOf("0/")==0&&(t[0]=t[0].replace("0/","*/")),t[1].indexOf("0/")==0&&(t[1]=t[1].replace("0/","*/")),t[2].indexOf("0/")==0&&(t[2]=t[2].replace("0/","*/")),t[3].indexOf("1/")==0&&(t[3]=t[3].replace("1/","*/")),t[4].indexOf("1/")==0&&(t[4]=t[4].replace("1/","*/")),t[6].indexOf("1/")==0&&(t[6]=t[6].replace("1/","*/")),t[5]=t[5].replace(/(^\d)|([^#/\s]\d)/g,function(l){var O=l.replace(/\D/,""),h=O;return e.dayOfWeekStartIndexZero?O=="7"&&(h="0"):h=(parseInt(O)-1).toString(),l.replace(O,h)}),t[5]=="L"&&(t[5]="6"),t[3]=="?"&&(t[3]="*"),t[3].indexOf("W")>-1&&(t[3].indexOf(",")>-1||t[3].indexOf("-")>-1))throw new Error("The 'W' character can be specified only when the day-of-month is a single day, not a range or list of days.");var o={SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6};for(var n in o)t[5]=t[5].replace(new RegExp(n,"gi"),o[n].toString());t[4]=t[4].replace(/(^\d{1,2})|([^#/\s]\d{1,2})/g,function(l){var O=l.replace(/\D/,""),h=O;return e.monthStartIndexZero&&(h=(parseInt(O)+1).toString()),l.replace(O,h)});var i={JAN:1,FEB:2,MAR:3,APR:4,MAY:5,JUN:6,JUL:7,AUG:8,SEP:9,OCT:10,NOV:11,DEC:12};for(var a in i)t[4]=t[4].replace(new RegExp(a,"gi"),i[a].toString());t[0]=="0"&&(t[0]=""),!/\*|\-|\,|\//.test(t[2])&&(/\*|\//.test(t[1])||/\*|\//.test(t[0]))&&(t[2]+="-".concat(t[2]));for(var s=0;s<t.length;s++)if(t[s].indexOf(",")!=-1&&(t[s]=t[s].split(",").filter(function(l){return l!==""}).join(",")||"*"),t[s]=="*/1"&&(t[s]="*"),t[s].indexOf("/")>-1&&!/^\*|\-|\,/.test(t[s])){var c=null;switch(s){case 4:c="12";break;case 5:c="6";break;case 6:c="9999";break;default:c=null;break}if(c!==null){var p=t[s].split("/");t[s]="".concat(p[0],"-").concat(c,"/").concat(p[1])}}},v.prototype.validate=function(t){var e="0-9,\\-*/";this.validateOnlyExpectedCharactersFound(t[0],e),this.validateOnlyExpectedCharactersFound(t[1],e),this.validateOnlyExpectedCharactersFound(t[2],e),this.validateOnlyExpectedCharactersFound(t[3],"0-9,\\-*/LW"),this.validateOnlyExpectedCharactersFound(t[4],e),this.validateOnlyExpectedCharactersFound(t[5],"0-9,\\-*/L#"),this.validateOnlyExpectedCharactersFound(t[6],e),this.validateAnyRanges(t)},v.prototype.validateAnyRanges=function(t){r.default.secondRange(t[0]),r.default.minuteRange(t[1]),r.default.hourRange(t[2]),r.default.dayOfMonthRange(t[3]),r.default.monthRange(t[4],this.monthStartIndexZero),r.default.dayOfWeekRange(t[5],this.dayOfWeekStartIndexZero)},v.prototype.validateOnlyExpectedCharactersFound=function(t,e){var o=t.match(new RegExp("[^".concat(e,"]+"),"gi"));if(o&&o.length)throw new Error("Expression contains invalid values: '".concat(o.toString(),"'"))},v})();d.CronParser=b},333(g,d,m){Object.defineProperty(d,"__esModule",{value:!0}),d.ExpressionDescriptor=void 0;var r=m(823),b=m(949),v=(function(){function t(e,o){if(this.expression=e,this.options=o,this.expressionParts=new Array(5),!this.options.locale&&t.defaultLocale&&(this.options.locale=t.defaultLocale),!t.locales[this.options.locale]){var n=Object.keys(t.locales)[0];console.warn("Locale '".concat(this.options.locale,"' could not be found; falling back to '").concat(n,"'.")),this.options.locale=n}this.i18n=t.locales[this.options.locale],o.use24HourTimeFormat===void 0&&(o.use24HourTimeFormat=this.i18n.use24HourTimeFormatByDefault())}return t.toString=function(e,o){var n=o===void 0?{}:o,i=n.throwExceptionOnParseError,a=i===void 0?!0:i,s=n.verbose,c=s===void 0?!1:s,p=n.dayOfWeekStartIndexZero,l=p===void 0?!0:p,O=n.monthStartIndexZero,h=O===void 0?!1:O,S=n.use24HourTimeFormat,_=n.trimHoursLeadingZero,U=_===void 0?!1:_,X=n.locale,E=X===void 0?null:X,x=n.logicalAndDayFields,A=x===void 0?!1:x,k={throwExceptionOnParseError:a,verbose:c,dayOfWeekStartIndexZero:l,monthStartIndexZero:h,use24HourTimeFormat:S,trimHoursLeadingZero:U,locale:E,logicalAndDayFields:A};k.tzOffset&&console.warn("'tzOffset' option has been deprecated and is no longer supported.");var Y=new t(e,k);return Y.getFullDescription()},t.initialize=function(e,o){o===void 0&&(o="en"),t.specialCharacters=["/","-",",","*"],t.defaultLocale=o,e.load(t.locales)},t.prototype.getFullDescription=function(){var e,o,n="";try{var i=new b.CronParser(this.expression,this.options.dayOfWeekStartIndexZero,this.options.monthStartIndexZero);if(this.expressionParts=i.parse(),this.expressionParts[0]==="@reboot")return((o=(e=this.i18n).atReboot)===null||o===void 0?void 0:o.call(e))||"Run once, at startup";var a=this.getTimeOfDayDescription(),s=this.getDayOfMonthDescription(),c=this.getMonthDescription(),p=this.getDayOfWeekDescription(),l=this.getYearDescription();n+=a+s+p+c+l,n=this.transformVerbosity(n,!!this.options.verbose),n=n.charAt(0).toLocaleUpperCase()+n.substr(1)}catch(O){if(!this.options.throwExceptionOnParseError)n=this.i18n.anErrorOccuredWhenGeneratingTheExpressionD();else throw"".concat(O)}return n},t.prototype.getTimeOfDayDescription=function(){var e=this.expressionParts[0],o=this.expressionParts[1],n=this.expressionParts[2],i="";if(!r.StringUtilities.containsAny(o,t.specialCharacters)&&!r.StringUtilities.containsAny(n,t.specialCharacters)&&!r.StringUtilities.containsAny(e,t.specialCharacters))i+=this.i18n.atSpace()+this.formatTime(n,o,e);else if(!e&&o.indexOf("-")>-1&&!(o.indexOf(",")>-1)&&!(o.indexOf("/")>-1)&&!r.StringUtilities.containsAny(n,t.specialCharacters)){var a=o.split("-");i+=r.StringUtilities.format(this.i18n.everyMinuteBetweenX0AndX1(),this.formatTime(n,a[0],""),this.formatTime(n,a[1],""))}else if(!e&&n.indexOf(",")>-1&&n.indexOf("-")==-1&&n.indexOf("/")==-1&&!r.StringUtilities.containsAny(o,t.specialCharacters)){var s=n.split(",");i+=this.i18n.at();for(var c=0;c<s.length;c++)i+=" ",i+=this.formatTime(s[c],o,""),c<s.length-2&&(i+=","),c==s.length-2&&(i+=this.i18n.spaceAnd())}else{var p=this.getSecondsDescription(),l=this.getMinutesDescription(),O=this.getHoursDescription();if(i+=p,i&&l&&(i+=", "),i+=l,l===O)return i;i&&O&&(i+=", "),i+=O}return i},t.prototype.getSecondsDescription=function(){var e=this,o=this.getSegmentDescription(this.expressionParts[0],this.i18n.everySecond(),function(n){return n},function(n){return r.StringUtilities.format(e.i18n.everyX0Seconds(n),n)},function(n){return e.i18n.secondsX0ThroughX1PastTheMinute()},function(n){return n=="0"?"":parseInt(n)<20?e.i18n.atX0SecondsPastTheMinute(n):e.i18n.atX0SecondsPastTheMinuteGt20()||e.i18n.atX0SecondsPastTheMinute(n)});return o},t.prototype.getMinutesDescription=function(){var e=this,o=this.expressionParts[0],n=this.expressionParts[2],i=this.getSegmentDescription(this.expressionParts[1],this.i18n.everyMinute(),function(a){return a},function(a){return r.StringUtilities.format(e.i18n.everyX0Minutes(a),a)},function(a){return e.i18n.minutesX0ThroughX1PastTheHour()},function(a){var s,c;try{return a=="0"&&n.indexOf("/")==-1&&o==""?e.i18n.everyHour():a=="0"?((c=(s=e.i18n).onTheHour)===null||c===void 0?void 0:c.call(s))||e.i18n.atX0MinutesPastTheHour(a):parseInt(a)<20?e.i18n.atX0MinutesPastTheHour(a):e.i18n.atX0MinutesPastTheHourGt20()||e.i18n.atX0MinutesPastTheHour(a)}catch{return e.i18n.atX0MinutesPastTheHour(a)}});return i},t.prototype.getHoursDescription=function(){var e=this,o=this.expressionParts[2],n=0,i=[];o.split("/")[0].split(",").forEach(function(c){var p=c.split("-");p.length===2&&i.push({value:p[1],index:n+1}),n+=p.length});var a=0,s=this.getSegmentDescription(o,this.i18n.everyHour(),function(c){var p=i.find(function(O){return O.value===c&&O.index===a}),l=p&&e.expressionParts[1]!=="0";return a++,l?e.formatTime(c,"59",""):e.formatTime(c,"0","")},function(c){return r.StringUtilities.format(e.i18n.everyX0Hours(c),c)},function(c){return e.i18n.betweenX0AndX1()},function(c){return e.i18n.atX0()});return s},t.prototype.getDayOfWeekDescription=function(){var e=this,o=this.i18n.daysOfTheWeek(),n=null;return this.expressionParts[5]=="*"?n="":n=this.getSegmentDescription(this.expressionParts[5],this.i18n.commaEveryDay(),function(i,a){var s=i;i.indexOf("#")>-1?s=i.substring(0,i.indexOf("#")):i.indexOf("L")>-1&&(s=s.replace("L",""));var c=parseInt(s),p=e.i18n.daysOfTheWeekInCase?e.i18n.daysOfTheWeekInCase(a)[c]:o[c];if(i.indexOf("#")>-1){var l=null,O=i.substring(i.indexOf("#")+1),h=i.substring(0,i.indexOf("#"));switch(O){case"1":l=e.i18n.first(h);break;case"2":l=e.i18n.second(h);break;case"3":l=e.i18n.third(h);break;case"4":l=e.i18n.fourth(h);break;case"5":l=e.i18n.fifth(h);break}p=l+" "+p}return p},function(i){return parseInt(i)==1?"":r.StringUtilities.format(e.i18n.commaEveryX0DaysOfTheWeek(i),i)},function(i){var a=i.substring(0,i.indexOf("-")),s=e.expressionParts[3]!="*";return s?e.i18n.commaAndX0ThroughX1(a):e.i18n.commaX0ThroughX1(a)},function(i){var a=null;if(i.indexOf("#")>-1){var s=i.substring(i.indexOf("#")+1),c=i.substring(0,i.indexOf("#"));a=e.i18n.commaOnThe(s,c).trim()+e.i18n.spaceX0OfTheMonth()}else if(i.indexOf("L")>-1)a=e.i18n.commaOnTheLastX0OfTheMonth(i.replace("L",""));else{var p=e.expressionParts[3]!="*";p?e.options.logicalAndDayFields?a=e.i18n.commaOnlyOnX0(i):a=e.i18n.commaAndOnX0():a=e.i18n.commaOnlyOnX0(i)}return a}),n},t.prototype.getMonthDescription=function(){var e=this,o=this.i18n.monthsOfTheYear(),n=this.getSegmentDescription(this.expressionParts[4],"",function(i,a){return a&&e.i18n.monthsOfTheYearInCase?e.i18n.monthsOfTheYearInCase(a)[parseInt(i)-1]:o[parseInt(i)-1]},function(i){return parseInt(i)==1?"":r.StringUtilities.format(e.i18n.commaEveryX0Months(i),i)},function(i){return e.i18n.commaMonthX0ThroughMonthX1()||e.i18n.commaX0ThroughX1()},function(i){return e.i18n.commaOnlyInMonthX0?e.i18n.commaOnlyInMonthX0():e.i18n.commaOnlyInX0()});return n},t.prototype.getDayOfMonthDescription=function(){var e=this,o=null,n=this.expressionParts[3];switch(n){case"L":o=this.i18n.commaOnTheLastDayOfTheMonth();break;case"WL":case"LW":o=this.i18n.commaOnTheLastWeekdayOfTheMonth();break;default:var i=n.match(/(\d{1,2}W)|(W\d{1,2})/);if(i){var a=parseInt(i[0].replace("W","")),s=a==1?this.i18n.firstWeekday():r.StringUtilities.format(this.i18n.weekdayNearestDayX0(),a.toString());o=r.StringUtilities.format(this.i18n.commaOnTheX0OfTheMonth(),s);break}else{var c=n.match(/L-(\d{1,2})/);if(c){var p=c[1];o=r.StringUtilities.format(this.i18n.commaDaysBeforeTheLastDayOfTheMonth(p),p);break}else{if(n=="*"&&this.expressionParts[5]!="*")return"";o=this.getSegmentDescription(n,this.i18n.commaEveryDay(),function(l){return l=="L"?e.i18n.lastDay():e.i18n.dayX0?r.StringUtilities.format(e.i18n.dayX0(),l):l},function(l){return l=="1"?e.i18n.commaEveryDay():e.i18n.commaEveryX0Days(l)},function(l){return e.i18n.commaBetweenDayX0AndX1OfTheMonth(l)},function(l){return e.i18n.commaOnDayX0OfTheMonth(l)})}break}}return o},t.prototype.getYearDescription=function(){var e=this,o=this.getSegmentDescription(this.expressionParts[6],"",function(n){return/^\d+$/.test(n)?new Date(parseInt(n),1).getFullYear().toString():n},function(n){return r.StringUtilities.format(e.i18n.commaEveryX0Years(n),n)},function(n){return e.i18n.commaYearX0ThroughYearX1()||e.i18n.commaX0ThroughX1()},function(n){return e.i18n.commaOnlyInYearX0?e.i18n.commaOnlyInYearX0():e.i18n.commaOnlyInX0()});return o},t.prototype.getSegmentDescription=function(e,o,n,i,a,s){var c=null,p=e.indexOf("/")>-1,l=e.indexOf("-")>-1,O=e.indexOf(",")>-1;if(!e)c="";else if(e==="*")c=o;else if(!p&&!l&&!O)c=r.StringUtilities.format(s(e),n(e));else if(O){for(var h=e.split(","),S="",_=0;_<h.length;_++)if(_>0&&h.length>2&&(S+=",",_<h.length-1&&(S+=" ")),_>0&&h.length>1&&(_==h.length-1||h.length==2)&&(S+="".concat(this.i18n.spaceAnd()," ")),h[_].indexOf("/")>-1||h[_].indexOf("-")>-1){var U=h[_].indexOf("-")>-1&&h[_].indexOf("/")==-1,X=this.getSegmentDescription(h[_],o,n,i,U?this.i18n.commaX0ThroughX1:a,s);U&&(X=X.replace(", ","")),S+=X}else if(!p)S+=n(h[_]);else{var E=this.getSegmentDescription(h[_],o,n,i,a,s);E&&E.startsWith(", ")&&(E=E.substring(2)),S+=E}p?c=S:c=r.StringUtilities.format(s(e),S)}else if(p){var h=e.split("/");if(c=r.StringUtilities.format(i(h[1]),h[1]),h[0].indexOf("-")>-1){var x=this.generateRangeSegmentDescription(h[0],a,n);x.indexOf(", ")!=0&&(c+=", "),c+=x}else if(h[0].indexOf("*")==-1){var A=r.StringUtilities.format(s(h[0]),n(h[0]));A=A.replace(", ",""),c+=r.StringUtilities.format(this.i18n.commaStartingX0(),A)}}else l&&(c=this.generateRangeSegmentDescription(e,a,n));return c},t.prototype.generateRangeSegmentDescription=function(e,o,n){var i="",a=e.split("-"),s=n(a[0],1),c=n(a[1],2),p=o(e);return i+=r.StringUtilities.format(p,s,c),i},t.prototype.formatTime=function(e,o,n){var i=0,a=0,s=parseInt(e)+i,c=parseInt(o)+a;c>=60?(c-=60,s+=1):c<0&&(c+=60,s-=1),s>=24?s=s-24:s<0&&(s=24+s);var p="",l=!1;this.options.use24HourTimeFormat||(l=!!(this.i18n.setPeriodBeforeTime&&this.i18n.setPeriodBeforeTime()),p=l?"".concat(this.getPeriod(s)," "):" ".concat(this.getPeriod(s)),s>12&&(s-=12),s===0&&(s=12));var O="";n&&(O=":".concat(("00"+n).substring(n.length)));var h=s.toString(),S=("00"+h).substring(h.length),_=c.toString(),U=("00"+_).substring(_.length),X=this.options.trimHoursLeadingZero?h:S;return"".concat(l?p:"").concat(X,":").concat(U).concat(O).concat(l?"":p)},t.prototype.transformVerbosity=function(e,o){if(!o&&(e=e.replace(new RegExp(", ".concat(this.i18n.everyMinute()),"g"),""),e=e.replace(new RegExp(", ".concat(this.i18n.everyHour()),"g"),""),e=e.replace(new RegExp(this.i18n.commaEveryDay(),"g"),""),e=e.replace(/\, ?$/,""),this.i18n.conciseVerbosityReplacements))for(var n=0,i=Object.entries(this.i18n.conciseVerbosityReplacements());n<i.length;n++){var a=i[n],s=a[0],c=a[1];e=e.replace(new RegExp(s,"g"),c)}return e},t.prototype.getPeriod=function(e){return e>=12?this.i18n.pm&&this.i18n.pm()||"PM":this.i18n.am&&this.i18n.am()||"AM"},t.locales={},t})();d.ExpressionDescriptor=v},747(g,d,m){Object.defineProperty(d,"__esModule",{value:!0}),d.enLocaleLoader=void 0;var r=m(486),b=(function(){function v(){}return v.prototype.load=function(t){t.en=new r.en},v})();d.enLocaleLoader=b},486(g,d){Object.defineProperty(d,"__esModule",{value:!0}),d.en=void 0;var m=(function(){function r(){}return r.prototype.atX0SecondsPastTheMinuteGt20=function(){return null},r.prototype.atX0MinutesPastTheHourGt20=function(){return null},r.prototype.commaMonthX0ThroughMonthX1=function(){return null},r.prototype.commaYearX0ThroughYearX1=function(){return null},r.prototype.use24HourTimeFormatByDefault=function(){return!1},r.prototype.anErrorOccuredWhenGeneratingTheExpressionD=function(){return"An error occurred when generating the expression description. Check the cron expression syntax."},r.prototype.everyMinute=function(){return"every minute"},r.prototype.everyHour=function(){return"every hour"},r.prototype.atSpace=function(){return"At "},r.prototype.everyMinuteBetweenX0AndX1=function(){return"Every minute between %s and %s"},r.prototype.at=function(){return"At"},r.prototype.spaceAnd=function(){return" and"},r.prototype.everySecond=function(){return"every second"},r.prototype.everyX0Seconds=function(){return"every %s seconds"},r.prototype.secondsX0ThroughX1PastTheMinute=function(){return"seconds %s through %s past the minute"},r.prototype.atX0SecondsPastTheMinute=function(){return"at %s seconds past the minute"},r.prototype.everyX0Minutes=function(){return"every %s minutes"},r.prototype.minutesX0ThroughX1PastTheHour=function(){return"minutes %s through %s past the hour"},r.prototype.atX0MinutesPastTheHour=function(){return"at %s minutes past the hour"},r.prototype.everyX0Hours=function(){return"every %s hours"},r.prototype.betweenX0AndX1=function(){return"between %s and %s"},r.prototype.atX0=function(){return"at %s"},r.prototype.commaEveryDay=function(){return", every day"},r.prototype.commaEveryX0DaysOfTheWeek=function(){return", every %s days of the week"},r.prototype.commaX0ThroughX1=function(){return", %s through %s"},r.prototype.commaAndX0ThroughX1=function(){return", %s through %s"},r.prototype.first=function(){return"first"},r.prototype.second=function(){return"second"},r.prototype.third=function(){return"third"},r.prototype.fourth=function(){return"fourth"},r.prototype.fifth=function(){return"fifth"},r.prototype.commaOnThe=function(){return", on the "},r.prototype.spaceX0OfTheMonth=function(){return" %s of the month"},r.prototype.lastDay=function(){return"the last day"},r.prototype.commaOnTheLastX0OfTheMonth=function(){return", on the last %s of the month"},r.prototype.commaOnlyOnX0=function(){return", only on %s"},r.prototype.commaAndOnX0=function(){return", and on %s"},r.prototype.commaEveryX0Months=function(){return", every %s months"},r.prototype.commaOnlyInX0=function(){return", only in %s"},r.prototype.commaOnTheLastDayOfTheMonth=function(){return", on the last day of the month"},r.prototype.commaOnTheLastWeekdayOfTheMonth=function(){return", on the last weekday of the month"},r.prototype.commaDaysBeforeTheLastDayOfTheMonth=function(){return", %s days before the last day of the month"},r.prototype.firstWeekday=function(){return"first weekday"},r.prototype.weekdayNearestDayX0=function(){return"weekday nearest day %s"},r.prototype.commaOnTheX0OfTheMonth=function(){return", on the %s of the month"},r.prototype.commaEveryX0Days=function(){return", every %s days in a month"},r.prototype.commaBetweenDayX0AndX1OfTheMonth=function(){return", between day %s and %s of the month"},r.prototype.commaOnDayX0OfTheMonth=function(){return", on day %s of the month"},r.prototype.commaEveryHour=function(){return", every hour"},r.prototype.commaEveryX0Years=function(){return", every %s years"},r.prototype.commaStartingX0=function(){return", starting %s"},r.prototype.daysOfTheWeek=function(){return["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},r.prototype.monthsOfTheYear=function(){return["January","February","March","April","May","June","July","August","September","October","November","December"]},r.prototype.atReboot=function(){return"Run once, at startup"},r.prototype.onTheHour=function(){return"on the hour"},r})();d.en=m},515(g,d){Object.defineProperty(d,"__esModule",{value:!0});function m(b,v){if(!b)throw new Error(v)}var r=(function(){function b(){}return b.secondRange=function(v){for(var t=v.split(","),e=0;e<t.length;e++)if(!isNaN(parseInt(t[e],10))){var o=parseInt(t[e],10);m(o>=0&&o<=59,"seconds part must be >= 0 and <= 59")}},b.minuteRange=function(v){for(var t=v.split(","),e=0;e<t.length;e++)if(!isNaN(parseInt(t[e],10))){var o=parseInt(t[e],10);m(o>=0&&o<=59,"minutes part must be >= 0 and <= 59")}},b.hourRange=function(v){for(var t=v.split(","),e=0;e<t.length;e++)if(!isNaN(parseInt(t[e],10))){var o=parseInt(t[e],10);m(o>=0&&o<=23,"hours part must be >= 0 and <= 23")}},b.dayOfMonthRange=function(v){for(var t=v.split(","),e=0;e<t.length;e++)if(!isNaN(parseInt(t[e],10))){var o=parseInt(t[e],10);m(o>=1&&o<=31,"DOM part must be >= 1 and <= 31")}},b.monthRange=function(v,t){for(var e=v.split(","),o=0;o<e.length;o++)if(!isNaN(parseInt(e[o],10))){var n=parseInt(e[o],10);m(n>=1&&n<=12,t?"month part must be >= 0 and <= 11":"month part must be >= 1 and <= 12")}},b.dayOfWeekRange=function(v,t){for(var e=v.split(","),o=0;o<e.length;o++)if(!isNaN(parseInt(e[o],10))){var n=parseInt(e[o],10);m(n>=0&&n<=6,t?"DOW part must be >= 0 and <= 6":"DOW part must be >= 1 and <= 7")}},b})();d.default=r},823(g,d){Object.defineProperty(d,"__esModule",{value:!0}),d.StringUtilities=void 0;var m=(function(){function r(){}return r.format=function(b){for(var v=[],t=1;t<arguments.length;t++)v[t-1]=arguments[t];return b.replace(/%s/g,function(e){for(var o=[],n=1;n<arguments.length;n++)o[n-1]=arguments[n];return v.shift()})},r.containsAny=function(b,v){return v.some(function(t){return b.indexOf(t)>-1})},r})();d.StringUtilities=m}},f={};function y(g){var d=f[g];if(d!==void 0)return d.exports;var m=f[g]={exports:{}};return u[g](m,m.exports,y),m.exports}var w={};return(()=>{var g=w;Object.defineProperty(g,"__esModule",{value:!0}),g.toString=void 0;var d=y(333),m=y(747);d.ExpressionDescriptor.initialize(new m.enLocaleLoader),g.default=d.ExpressionDescriptor;var r=d.ExpressionDescriptor.toString;g.toString=r})(),w})())});var H=V(B(),1);import T from"chalk";import{readFileSync as J,existsSync as G}from"fs";import{homedir as K}from"os";import{join as q}from"path";var I={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://account-api-prod.zibby.app",frontendUrl:process.env.ZIBBY_PROD_FRONTEND_URL||"https://studio.zibby.dev",description:"Production environment"}};function N(){let u;if(process.env.ZIBBY_API_URL)u=process.env.ZIBBY_API_URL;else{let f=process.env.ZIBBY_ENV||"prod";I[f]?u=I[f].apiUrl:u=I.prod.apiUrl}try{let f=new URL(u);return f.protocol!=="http:"&&f.protocol!=="https:"?(console.error(`\u26A0\uFE0F Invalid API URL protocol: ${f.protocol} (only http/https allowed)`),I.prod.apiUrl):u}catch{return console.error(`\u26A0\uFE0F Invalid API URL: ${u}`),I.prod.apiUrl}}function Q(u){if(!u)return null;try{return H.default.toString(u,{use24HourTimeFormat:!1,verbose:!1})}catch{return null}}function ee(u){if(u)return u;let f=q(K(),".zibby","config.json");if(G(f))try{let y=JSON.parse(J(f,"utf-8"));if(y.sessionToken)return y.sessionToken}catch{}if(process.env.ZIBBY_API_KEY)return process.env.ZIBBY_API_KEY;console.error(T.red(`
2
+ Not authenticated`)),console.error(T.gray(" Run: zibby login")),console.error(T.gray(` OR set ZIBBY_API_KEY env var
3
+ `)),process.exit(1)}function te(u=[]){let f={};for(let y of u){let w=y.indexOf("=");if(w<=0)throw new Error(`-p expects key=value, got: ${y}`);f[y.slice(0,w)]=y.slice(w+1)}return f}async function L(u,f,y,w){let g=await fetch(f,{method:u,headers:{"Content-Type":"application/json",Authorization:`Bearer ${y}`},...w!==void 0?{body:JSON.stringify(w)}:{}}),d=await g.text(),m=null;try{m=d?JSON.parse(d):null}catch{}if(!g.ok){let r=m?.error||d||`HTTP ${g.status}`;throw new Error(`API ${u} ${g.status}: ${r}`)}return m}function C(u){if(!u)return T.gray(" (no schedule)");let f=Q(u.cron),y=[` ${T.bold("Cron:")} ${T.cyan(u.cron)}${f?T.gray(` (${f})`):""}`,` ${T.bold("Timezone:")} ${u.timezone||"UTC"}`];return u.input&&Object.keys(u.input).length&&y.push(` ${T.bold("Input:")} ${JSON.stringify(u.input)}`),u.createdAt&&y.push(` ${T.bold("Created:")} ${new Date(u.createdAt).toLocaleString()}`),u.updatedAt&&u.updatedAt!==u.createdAt&&y.push(` ${T.bold("Updated:")} ${new Date(u.updatedAt).toLocaleString()}`),y.join(`
4
+ `)}async function ue(u,f,y,w={}){u||(console.error(T.red("Workflow UUID required.")),console.error(T.gray("Usage: zibby workflow schedule <uuid> [get|set <cron>|clear]")),process.exit(1));let g=ee(w.apiKey),d=N(),m=`${String(d).replace(/\/+$/,"")}/workflows/${encodeURIComponent(u)}/schedule`,r=(f||"get").toLowerCase();try{if(r==="get"){let b=await L("GET",m,g);console.log(T.bold(`
5
+ Schedule for ${u}:`)),console.log(C(b?.schedule)),console.log("");return}if(r==="set"){y||(console.error(T.red("Missing cron expression.")),console.error(T.gray('Usage: zibby workflow schedule <uuid> set "0 9 * * 1-5"')),process.exit(1));let b={cron:y};w.tz&&(b.timezone=w.tz);let v=te(w.param||[]);Object.keys(v).length&&(b.input=v);let t=await L("POST",m,g,b);console.log(T.green(`
6
+ \u2714 Schedule set for ${u}`)),console.log(C(t?.schedule)),console.log(T.gray("\n EventBridge will fire on this cron. Watch with `zibby workflow logs -t`.")),console.log("");return}if(r==="clear"||r==="delete"||r==="remove"){await L("DELETE",m,g),console.log(T.green(`
7
+ \u2714 Schedule cleared for ${u}
8
+ `));return}console.error(T.red(`Unknown action: "${f}"`)),console.error(T.gray("Valid actions: get | set <cron> | clear")),process.exit(1)}catch(b){console.error(T.red(`
9
+ \u2717 ${b.message}
10
+ `)),process.exit(1)}}export{ue as scheduleCommand};
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/cli",
3
- "version": "0.4.14",
3
+ "version": "0.4.17",
4
4
  "description": "Zibby CLI - Test automation generator and runner",
5
5
  "type": "module",
6
6
  "bin": {
@@ -35,12 +35,13 @@
35
35
  "@aws-sdk/client-sqs": "^3.1038.0",
36
36
  "@zibby/agent-workflow": "^0.3.2",
37
37
  "@zibby/core": "^0.3.6",
38
- "@zibby/ui-memory": "^1.0.0",
39
38
  "@zibby/skills": "^0.1.11",
39
+ "@zibby/ui-memory": "^1.0.0",
40
40
  "adm-zip": "^0.5.17",
41
41
  "chalk": "^5.3.0",
42
42
  "cli-highlight": "^2.1.11",
43
43
  "commander": "^12.0.0",
44
+ "cronstrue": "^3.14.0",
44
45
  "dotenv": "^17.4.1",
45
46
  "express": "^4.18.2",
46
47
  "glob": "^13.0.0",
@@ -54,6 +55,7 @@
54
55
  },
55
56
  "files": [
56
57
  "dist/",
58
+ "templates/",
57
59
  "README.md",
58
60
  "LICENSE"
59
61
  ],