@zibby/cli 0.1.82 → 0.1.85

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,48 +1,48 @@
1
- import{readFileSync as C,writeFileSync as U,existsSync as b,mkdirSync as P}from"fs";import{resolve as N,join as w}from"path";import o from"chalk";import v from"ora";import R from"dotenv";import z from"inquirer";var m={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.app",description:"Production environment"}};function I(){let n;if(process.env.ZIBBY_API_URL)n=process.env.ZIBBY_API_URL;else{let e=process.env.ZIBBY_ENV||"prod";m[e]?n=m[e].apiUrl:n=m.prod.apiUrl}try{let e=new URL(n);return e.protocol!=="http:"&&e.protocol!=="https:"?(console.error(`\u26A0\uFE0F Invalid API URL protocol: ${e.protocol} (only http/https allowed)`),m.prod.apiUrl):n}catch{return console.error(`\u26A0\uFE0F Invalid API URL: ${n}`),m.prod.apiUrl}}function j(){let n=process.env.ZIBBY_ENV||"prod";return m[n]||m.prod}import{validateGraphConfig as Y,generateWorkflowCode as S,generateNodeConfigsJson as L}from"@zibby/agent-workflow";import"@zibby/core/templates/register-nodes.js";R.config();async function Z(n){let e=I(),i=v("Fetching projects...").start();try{let c=await fetch(`${e}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}});c.ok||(i.fail("Failed to fetch projects"),process.exit(1));let t=await c.json();Array.isArray(t)||(t.projects&&Array.isArray(t.projects)?t=t.projects:t.data&&Array.isArray(t.data)?t=t.data:(i.fail("Unexpected response format"),process.exit(1))),(!t||t.length===0)&&(i.fail("No projects found"),process.exit(1)),i.stop();let a=t.map(r=>({name:`${r.name||"Unnamed"} (${r.id||"no-id"})`,value:r.id})),{projectId:d}=await z.prompt([{type:"list",name:"projectId",message:"Select a project:",choices:a}]);return d}catch(c){i.fail(`Error: ${c.message}`),process.exit(1)}}function B(n){let e=n.apiKey||process.env.ZIBBY_API_KEY;e||(console.log(o.red(`
1
+ import{readFileSync as Y,writeFileSync as U,existsSync as k,mkdirSync as x}from"fs";import{resolve as S,join as w}from"path";import o from"chalk";import v from"ora";import F from"dotenv";import L from"inquirer";var $={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.app",description:"Production environment"}};function I(){let t;if(process.env.ZIBBY_API_URL)t=process.env.ZIBBY_API_URL;else{let e=process.env.ZIBBY_ENV||"prod";$[e]?t=$[e].apiUrl:t=$.prod.apiUrl}try{let e=new URL(t);return e.protocol!=="http:"&&e.protocol!=="https:"?(console.error(`\u26A0\uFE0F Invalid API URL protocol: ${e.protocol} (only http/https allowed)`),$.prod.apiUrl):t}catch{return console.error(`\u26A0\uFE0F Invalid API URL: ${t}`),$.prod.apiUrl}}function b(){let t=process.env.ZIBBY_ENV||"prod";return $[t]||$.prod}import{existsSync as z}from"fs";import{join as R}from"path";import{pathToFileURL as N}from"url";async function P(t){let e=R(t,".zibby.config.mjs");if(!z(e))throw new Error(".zibby.config.mjs not found");try{let n=await import(N(e).href);return n.default||n}catch(n){throw new Error(`Failed to load .zibby.config.mjs: ${n.message}`,{cause:n})}}import{validateGraphConfig as Z,generateWorkflowCode as O,generateNodeConfigsJson as K}from"@zibby/agent-workflow";import"@zibby/core/templates/register-nodes.js";F.config();async function J(t){let e=I(),n=v("Fetching projects...").start();try{let l=await fetch(`${e}/projects`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`}});l.ok||(n.fail("Failed to fetch projects"),process.exit(1));let r=await l.json();Array.isArray(r)||(r.projects&&Array.isArray(r.projects)?r=r.projects:r.data&&Array.isArray(r.data)?r=r.data:(n.fail("Unexpected response format"),process.exit(1))),(!r||r.length===0)&&(n.fail("No projects found"),process.exit(1)),n.stop();let p=r.map(a=>({name:`${a.name||"Unnamed"} (${a.id||"no-id"})`,value:a.id})),{projectId:c}=await L.prompt([{type:"list",name:"projectId",message:"Select a project:",choices:p}]);return c}catch(l){n.fail(`Error: ${l.message}`),process.exit(1)}}function B(t){let e=t.apiKey||process.env.ZIBBY_API_KEY;e||(console.log(o.red(`
2
2
  ZIBBY_API_KEY not set`)),console.log(o.gray(` Add to .env: ZIBBY_API_KEY=zby_xxx
3
- `)),process.exit(1));let i=n.project||process.env.ZIBBY_PROJECT_ID;return i||(console.log(o.red(`
3
+ `)),process.exit(1));let n=t.project||process.env.ZIBBY_PROJECT_ID;return n||(console.log(o.red(`
4
4
  --project or ZIBBY_PROJECT_ID is required`)),console.log(o.gray(` Example: zibby workflow download --project <id> --type analysis
5
- `)),process.exit(1)),{apiKey:e,projectId:i}}async function F(n){let e=n.apiKey||process.env.ZIBBY_API_KEY;e||(console.log(o.red(`
5
+ `)),process.exit(1)),{apiKey:e,projectId:n}}async function W(t){let e=t.apiKey||process.env.ZIBBY_API_KEY;e||(console.log(o.red(`
6
6
  ZIBBY_API_KEY not set`)),console.log(o.gray(` Add to .env: ZIBBY_API_KEY=zby_xxx
7
- `)),process.exit(1));let i=n.project||process.env.ZIBBY_PROJECT_ID;return i||(i=await Z(e)),{apiKey:e,projectId:i}}var _=["analysis","implementation","run_test"],O=/^[a-z][a-z0-9_-]{0,62}[a-z0-9]$/;function x(n){let e=n.type;return e||(console.log(o.red(`
7
+ `)),process.exit(1));let n=t.project||process.env.ZIBBY_PROJECT_ID;return n||(n=await J(e)),{apiKey:e,projectId:n}}var _=["analysis","implementation","run_test"],G=/^[a-z][a-z0-9_-]{0,62}[a-z0-9]$/;function D(t){let e=t.type;return e||(console.log(o.red(`
8
8
  --type is required`)),console.log(o.gray(` Built-in types: ${_.join(", ")}`)),console.log(o.gray(` Custom workflows: any lowercase slug (e.g., ticket-triage)
9
- `)),process.exit(1)),!_.includes(e)&&!O.test(e)&&(console.log(o.red(`
9
+ `)),process.exit(1)),!_.includes(e)&&!G.test(e)&&(console.log(o.red(`
10
10
  Invalid workflow type: "${e}"`)),console.log(o.gray(` Built-in: ${_.join(", ")}`)),console.log(o.gray(` Custom: lowercase letters, digits, hyphens (2\u201364 chars)
11
- `)),process.exit(1)),e}var K=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function J(n,e){let i=I(),c={"Content-Type":"application/json",Authorization:`Bearer ${e}`},t=await fetch(`${i}/projects`,{method:"GET",headers:c});if(!t.ok)throw new Error(`Failed to list projects: HTTP ${t.status}`);let{projects:a=[]}=await t.json();for(let d of a){let r=await fetch(`${i}/projects/${d.projectId}/workflows`,{method:"GET",headers:c});if(!r.ok)continue;let s=await r.json(),l=(Array.isArray(s)?s:[]).find(p=>p.uuid===n);if(l){let p=l.workflowType||l.name;return{projectId:d.projectId,workflowType:p}}}return null}async function to(n){let e=j(),i,c,t;if(n.uuid){K.test(n.uuid)||(console.log(o.red(`
12
- '${n.uuid}' is not a UUID.`)),console.log(o.gray(" Cloud workflows are identified by UUID. Run `zibby workflow list` to find yours,")),console.log(o.gray(` or use --type <built-in> for built-in workflow types.
13
- `)),process.exit(1)),t=n.apiKey||process.env.ZIBBY_API_KEY,t||(t=B({...n,project:"pending"}).apiKey);let d=await J(n.uuid,t);d||(console.log(o.red(`
14
- Workflow with UUID '${n.uuid}' not found in any of your projects.`)),console.log(o.gray(` Check: zibby workflow list
15
- `)),process.exit(1)),i=d.projectId,c=d.workflowType}else{let d=B(n);t=d.apiKey,i=d.projectId,c=x(n)}console.log(o.bold.cyan(`
11
+ `)),process.exit(1)),e}var V=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function q(t,e){let n=I(),l={"Content-Type":"application/json",Authorization:`Bearer ${e}`},r=await fetch(`${n}/projects`,{method:"GET",headers:l});if(!r.ok)throw new Error(`Failed to list projects: HTTP ${r.status}`);let{projects:p=[]}=await r.json();for(let c of p){let a=await fetch(`${n}/projects/${c.projectId}/workflows`,{method:"GET",headers:l});if(!a.ok)continue;let s=await a.json(),d=(Array.isArray(s)?s:[]).find(i=>i.uuid===t);if(d){let i=d.workflowType||d.name;return{projectId:c.projectId,workflowType:i}}}return null}async function go(t){let e=b(),n,l,r;if(t.uuid){V.test(t.uuid)||(console.log(o.red(`
12
+ '${t.uuid}' is not a UUID.`)),console.log(o.gray(" Cloud workflows are identified by UUID. Run `zibby workflow list` to find yours,")),console.log(o.gray(` or use --type <built-in> for built-in workflow types.
13
+ `)),process.exit(1)),r=t.apiKey||process.env.ZIBBY_API_KEY,r||(r=B({...t,project:"pending"}).apiKey);let c=await q(t.uuid,r);c||(console.log(o.red(`
14
+ Workflow with UUID '${t.uuid}' not found in any of your projects.`)),console.log(o.gray(` Check: zibby workflow list
15
+ `)),process.exit(1)),n=c.projectId,l=c.workflowType}else{let c=B(t);r=c.apiKey,n=c.projectId,l=D(t)}console.log(o.bold.cyan(`
16
16
  Zibby Workflow Download
17
- `)),console.log(o.gray(" ".padEnd(52,"-"))),console.log(o.white(` Environment: ${o.cyan(e.name)}`)),console.log(o.white(` Project: ${o.cyan(i)}`)),console.log(o.white(` Type: ${o.cyan(c)}`)),console.log(o.gray(" ".padEnd(52,"-")));let a=v(" Fetching workflow from cloud...").start();try{let d=I(),r=await fetch(`${d}/projects/${i}/workflows/${c}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`}});if(!r.ok){let p=await r.text();a.fail(` API error: ${r.status}`),console.log(o.red(` ${p}
18
- `)),process.exit(1)}let s=await r.json();!s.graph&&s.isDefault?a.info(" No custom workflow saved -- downloading default graph"):a.succeed(` Fetched workflow (v${s.version||0})`);let l=s.graph||null;if(!l){console.log(o.yellow(`
17
+ `)),console.log(o.gray(" ".padEnd(52,"-"))),console.log(o.white(` Environment: ${o.cyan(e.name)}`)),console.log(o.white(` Project: ${o.cyan(n)}`)),console.log(o.white(` Type: ${o.cyan(l)}`)),console.log(o.gray(" ".padEnd(52,"-")));let p=v(" Fetching workflow from cloud...").start();try{let c=I(),a=await fetch(`${c}/projects/${n}/workflows/${l}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`}});if(!a.ok){let i=await a.text();p.fail(` API error: ${a.status}`),console.log(o.red(` ${i}
18
+ `)),process.exit(1)}let s=await a.json();!s.graph&&s.isDefault?p.info(" No custom workflow saved -- downloading default graph"):p.succeed(` Fetched workflow (v${s.version||0})`);let d=s.graph||null;if(!d){console.log(o.yellow(`
19
19
  No graph config available for this workflow.`)),console.log(o.gray(" The project is using the built-in default graph.")),console.log(o.gray(` Edit the graph in the UI first, or use --include-default to download the default.
20
- `)),n.includeDefault||process.exit(0),a.start(" Fetching default graph...");let{getDefaultGraph:p}=await import("@zibby/core/templates/graphs/index.js"),g=p(c);return g||(a.fail(` No default graph found for type "${c}"`),process.exit(1)),D(c,{graph:g,version:0,isDefault:!0,projectId:i,workflowType:c,sources:null,uuid:null},n)}return D(c,{graph:l,version:s.version||0,isDefault:s.isDefault||!1,projectId:i,workflowType:c,sources:s.sources||null,uuid:s.uuid||s.workflowUuid||null},n)}catch(d){a.fail(" Download failed"),console.log(o.red(`
21
- ${d.message}
22
- `)),process.exit(1)}}function D(n,e,i){let c=process.cwd(),t=i.output||w(c,".zibby","workflows"),a=w(t,n);b(a)||P(a,{recursive:!0});let d={projectId:e.projectId,workflowType:e.workflowType,version:e.version,isDefault:e.isDefault},r=[];if(e.sources&&typeof e.sources=="object"&&Object.keys(e.sources).length>0)for(let[l,p]of Object.entries(e.sources)){if(l.includes("..")||l.startsWith("/")){console.log(o.yellow(` \u26A0 Skipping unsafe source path: ${l}`));continue}let g=w(a,l),h=w(g,"..");b(h)||P(h,{recursive:!0}),U(g,p,"utf-8"),r.push(l)}else{let l=w(a,"graph.mjs");U(l,S(e.graph,d),"utf-8"),r.push("graph.mjs");let p=e.graph.nodeConfigs||{},g=L(p),h=w(a,"workflow.config.json");U(h,`${JSON.stringify(g,null,2)}
23
- `,"utf-8"),r.push("workflow.config.json")}if(e.uuid){let l={uuid:e.uuid,name:n,projectId:e.projectId,version:e.version,downloadedAt:new Date().toISOString()};U(w(a,".zibby-deploy.json"),`${JSON.stringify(l,null,2)}
24
- `,"utf-8"),r.push(".zibby-deploy.json")}let s=`.zibby/workflows/${n}/`;console.log(o.green(`
25
- Downloaded to ${o.bold(s)}`));for(let l of r)console.log(o.gray(` ${l}`));console.log(""),console.log(o.gray(` Version: ${e.version}`)),console.log(o.gray(` Nodes: ${e.graph.nodes?.length||0}`)),console.log(o.gray(` Edges: ${e.graph.edges?.length||0}`)),e.uuid&&console.log(o.gray(` UUID: ${e.uuid}`)),console.log(""),console.log(o.white(" Next steps:")),console.log(o.cyan(` cd ${s} && npm install `)+o.gray("Install workflow deps")),console.log(o.cyan(` zibby workflow start ${n} `)+o.gray("Run locally")),console.log(o.cyan(` zibby workflow deploy ${n} `)+o.gray("Re-deploy after changes (same UUID)")),console.log("")}async function ro(n){let e=j(),{apiKey:i,projectId:c}=await F(n),t=x(n);console.log(o.bold.cyan(`
20
+ `)),t.includeDefault||process.exit(0),p.start(" Fetching default graph...");let{getDefaultGraph:i}=await import("@zibby/core/templates/graphs/index.js"),g=i(l);return g||(p.fail(` No default graph found for type "${l}"`),process.exit(1)),C(l,{graph:g,version:0,isDefault:!0,projectId:n,workflowType:l,sources:null,uuid:null},t)}return C(l,{graph:d,version:s.version||0,isDefault:s.isDefault||!1,projectId:n,workflowType:l,sources:s.sources||null,uuid:s.uuid||s.workflowUuid||null},t)}catch(c){p.fail(" Download failed"),console.log(o.red(`
21
+ ${c.message}
22
+ `)),process.exit(1)}}async function C(t,e,n){let l=process.cwd(),r=".zibby/workflows";if(!n.output)try{r=(await P(l))?.paths?.workflows||".zibby/workflows"}catch{}let p=n.output||w(l,r),c=w(p,t);k(c)||x(c,{recursive:!0});let a={projectId:e.projectId,workflowType:e.workflowType,version:e.version,isDefault:e.isDefault},s=[];if(e.sources&&typeof e.sources=="object"&&Object.keys(e.sources).length>0)for(let[i,g]of Object.entries(e.sources)){if(i.includes("..")||i.startsWith("/")){console.log(o.yellow(` \u26A0 Skipping unsafe source path: ${i}`));continue}let y=w(c,i),h=w(y,"..");k(h)||x(h,{recursive:!0}),U(y,g,"utf-8"),s.push(i)}else{let i=w(c,"graph.mjs");U(i,O(e.graph,a),"utf-8"),s.push("graph.mjs");let g=e.graph.nodeConfigs||{},y=K(g),h=w(c,"workflow.config.json");U(h,`${JSON.stringify(y,null,2)}
23
+ `,"utf-8"),s.push("workflow.config.json")}if(e.uuid){let i={uuid:e.uuid,name:t,projectId:e.projectId,version:e.version,downloadedAt:new Date().toISOString()};U(w(c,".zibby-deploy.json"),`${JSON.stringify(i,null,2)}
24
+ `,"utf-8"),s.push(".zibby-deploy.json")}let d=`.zibby/workflows/${t}/`;console.log(o.green(`
25
+ Downloaded to ${o.bold(d)}`));for(let i of s)console.log(o.gray(` ${i}`));console.log(""),console.log(o.gray(` Version: ${e.version}`)),console.log(o.gray(` Nodes: ${e.graph.nodes?.length||0}`)),console.log(o.gray(` Edges: ${e.graph.edges?.length||0}`)),e.uuid&&console.log(o.gray(` UUID: ${e.uuid}`)),console.log(""),console.log(o.white(" Next steps:")),console.log(o.cyan(` cd ${d} && npm install `)+o.gray("Install workflow deps")),console.log(o.cyan(` zibby workflow start ${t} `)+o.gray("Run locally")),console.log(o.cyan(` zibby workflow deploy ${t} `)+o.gray("Re-deploy after changes (same UUID)")),console.log("")}async function uo(t){let e=b(),{apiKey:n,projectId:l}=await W(t),r=D(t);console.log(o.bold.cyan(`
26
26
  Zibby Workflow Upload
27
- `)),console.log(o.gray(" ".padEnd(52,"-"))),console.log(o.white(` Environment: ${o.cyan(e.name)}`)),console.log(o.white(` Project: ${o.cyan(c)}`)),console.log(o.white(` Type: ${o.cyan(t)}`)),console.log(o.gray(" ".padEnd(52,"-")));let a=process.cwd(),d=w(a,".zibby",`workflow-${t}.json`),r=w(a,".zibby",`workflow-${t}.js`),s=n.file||(b(r)?r:d);b(s)||(console.log(o.red(`
27
+ `)),console.log(o.gray(" ".padEnd(52,"-"))),console.log(o.white(` Environment: ${o.cyan(e.name)}`)),console.log(o.white(` Project: ${o.cyan(l)}`)),console.log(o.white(` Type: ${o.cyan(r)}`)),console.log(o.gray(" ".padEnd(52,"-")));let p=process.cwd(),c=w(p,".zibby",`workflow-${r}.json`),a=w(p,".zibby",`workflow-${r}.js`),s=t.file||(k(a)?a:c);k(s)||(console.log(o.red(`
28
28
  File not found: ${s}`)),console.log(o.gray(` Download a workflow first: zibby workflow download --project <id> --type <type>
29
- `)),process.exit(1));let l=s.endsWith(".js")||s.endsWith(".mjs"),p;if(l){let f=v(" Loading JS workflow module...").start();try{let{pathToFileURL:u}=await import("url"),y=await import(u(N(s)).href),$=y.buildGraph();p=$.serialize();let E=y.nodeConfigs||{};if(Object.keys(E).length>0)for(let[A,T]of Object.entries(E))p.nodeConfigs[A]={...T,...p.nodeConfigs[A]};f.succeed(` Loaded JS module (${$.nodes.size} nodes)`)}catch(u){f.fail(" Failed to load JS module"),console.log(o.red(`
29
+ `)),process.exit(1));let d=s.endsWith(".js")||s.endsWith(".mjs"),i;if(d){let f=v(" Loading JS workflow module...").start();try{let{pathToFileURL:u}=await import("url"),m=await import(u(S(s)).href),j=m.buildGraph();i=j.serialize();let E=m.nodeConfigs||{};if(Object.keys(E).length>0)for(let[A,T]of Object.entries(E))i.nodeConfigs[A]={...T,...i.nodeConfigs[A]};f.succeed(` Loaded JS module (${j.nodes.size} nodes)`)}catch(u){f.fail(" Failed to load JS module"),console.log(o.red(`
30
30
  ${u.message}
31
- `)),process.exit(1)}}else{let f;try{f=JSON.parse(C(s,"utf-8"))}catch($){console.log(o.red(`
32
- Failed to parse ${s}: ${$.message}
33
- `)),process.exit(1)}let{_meta:u,...y}=f;p=y}(!p.nodes||!p.edges)&&(console.log(o.red(`
31
+ `)),process.exit(1)}}else{let f;try{f=JSON.parse(Y(s,"utf-8"))}catch(j){console.log(o.red(`
32
+ Failed to parse ${s}: ${j.message}
33
+ `)),process.exit(1)}let{_meta:u,...m}=f;i=m}(!i.nodes||!i.edges)&&(console.log(o.red(`
34
34
  Invalid workflow file: missing nodes or edges`)),console.log(o.gray(` The file should contain { nodes: [...], edges: [...], nodeConfigs: {...} }
35
35
  `)),process.exit(1)),console.log(o.gray(`
36
- File: ${s}`)),console.log(o.gray(` Format: ${l?"JavaScript (serialized via graph.serialize())":"JSON"}`)),console.log(o.gray(` Nodes: ${p.nodes.length}`)),console.log(o.gray(` Edges: ${p.edges.length}`));let g=v(" Validating graph...").start(),h=Y(p);if(!h.valid){g.fail(" Graph validation failed"),console.log("");for(let f of h.errors)console.log(o.red(` ${f}`));console.log(o.gray(`
36
+ File: ${s}`)),console.log(o.gray(` Format: ${d?"JavaScript (serialized via graph.serialize())":"JSON"}`)),console.log(o.gray(` Nodes: ${i.nodes.length}`)),console.log(o.gray(` Edges: ${i.edges.length}`));let g=v(" Validating graph...").start(),y=Z(i);if(!y.valid){g.fail(" Graph validation failed"),console.log("");for(let f of y.errors)console.log(o.red(` ${f}`));console.log(o.gray(`
37
37
  Fix the errors above and try again.
38
- `)),process.exit(1)}g.succeed(" Graph is valid");let k=v(" Uploading to cloud...").start();try{let f=I(),u=await fetch(`${f}/projects/${c}/workflows/${t}`,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify({graph:p})});if(!u.ok){let $=await u.text();k.fail(` API error: ${u.status}`),console.log(o.red(` ${$}
39
- `)),process.exit(1)}let y=await u.json();k.succeed(` Uploaded successfully (v${y.version})`),console.log(o.green(`
40
- Workflow "${t}" updated to version ${y.version}`)),console.log(o.gray(` Project: ${c}
41
- `))}catch(f){k.fail(" Upload failed"),console.log(o.red(`
38
+ `)),process.exit(1)}g.succeed(" Graph is valid");let h=v(" Uploading to cloud...").start();try{let f=I(),u=await fetch(`${f}/projects/${l}/workflows/${r}`,{method:"PUT",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify({graph:i})});if(!u.ok){let j=await u.text();h.fail(` API error: ${u.status}`),console.log(o.red(` ${j}
39
+ `)),process.exit(1)}let m=await u.json();h.succeed(` Uploaded successfully (v${m.version})`),console.log(o.green(`
40
+ Workflow "${r}" updated to version ${m.version}`)),console.log(o.gray(` Project: ${l}
41
+ `))}catch(f){h.fail(" Upload failed"),console.log(o.red(`
42
42
  ${f.message}
43
- `)),process.exit(1)}}var W=["analysis","implementation","run_test"];async function so(n){let e=j(),{apiKey:i,projectId:c}=B(n);console.log(o.bold.cyan(`
43
+ `)),process.exit(1)}}var M=["analysis","implementation","run_test"];async function wo(t){let e=b(),{apiKey:n,projectId:l}=B(t);console.log(o.bold.cyan(`
44
44
  Zibby Workflows
45
- `));let t=v(" Fetching workflows...").start();try{let a=I(),d=[];for(let r of W){let s=await fetch(`${a}/projects/${c}/workflows/${r}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`}});if(s.ok){let l=await s.json();d.push({type:r,version:l.version||0,isDefault:l.isDefault!==!1&&!l.graph,nodes:l.graph?.nodes?.length||0,updatedAt:l.updatedAt||null})}}t.succeed(` Fetched workflows
46
- `),console.log(o.gray(" ".padEnd(70,"-"))),console.log(o.white(" Type".padEnd(20))+o.white("Version".padEnd(10))+o.white("Nodes".padEnd(10))+o.white("Status".padEnd(15))+o.white("Updated")),console.log(o.gray(" ".padEnd(70,"-")));for(let r of d){let s=r.isDefault?o.gray("default"):o.green("custom"),l=r.updatedAt?new Date(r.updatedAt).toLocaleDateString():o.gray("-");console.log(` ${o.cyan(r.type.padEnd(18))}${String(r.version).padEnd(10)}${String(r.nodes).padEnd(10)}${s.padEnd(15)}${l}`)}console.log(o.gray(" ".padEnd(70,"-"))),console.log("")}catch(a){t.fail(" Failed to fetch workflows"),console.log(o.red(`
47
- ${a.message}
48
- `)),process.exit(1)}}export{to as workflowDownloadCommand,so as workflowListCommand,ro as workflowUploadCommand};
45
+ `));let r=v(" Fetching workflows...").start();try{let p=I(),c=[];for(let a of M){let s=await fetch(`${p}/projects/${l}/workflows/${a}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`}});if(s.ok){let d=await s.json();c.push({type:a,version:d.version||0,isDefault:d.isDefault!==!1&&!d.graph,nodes:d.graph?.nodes?.length||0,updatedAt:d.updatedAt||null})}}r.succeed(` Fetched workflows
46
+ `),console.log(o.gray(" ".padEnd(70,"-"))),console.log(o.white(" Type".padEnd(20))+o.white("Version".padEnd(10))+o.white("Nodes".padEnd(10))+o.white("Status".padEnd(15))+o.white("Updated")),console.log(o.gray(" ".padEnd(70,"-")));for(let a of c){let s=a.isDefault?o.gray("default"):o.green("custom"),d=a.updatedAt?new Date(a.updatedAt).toLocaleDateString():o.gray("-");console.log(` ${o.cyan(a.type.padEnd(18))}${String(a.version).padEnd(10)}${String(a.nodes).padEnd(10)}${s.padEnd(15)}${d}`)}console.log(o.gray(" ".padEnd(70,"-"))),console.log("")}catch(p){r.fail(" Failed to fetch workflows"),console.log(o.red(`
47
+ ${p.message}
48
+ `)),process.exit(1)}}export{go as workflowDownloadCommand,wo as workflowListCommand,uo as workflowUploadCommand};
@@ -128,7 +128,7 @@ Analyze the input and return a summary with a status.\`,
128
128
  outputSchema: ExampleOutputSchema,
129
129
  };
130
130
  `}function D(o,n){return`${JSON.stringify({name:o,description:`${n} workflow`,entryClass:n,triggers:{api:!0}},null,2)}
131
- `}function Z(){return`${JSON.stringify({type:"module",dependencies:{"@zibby/core":"^0.1.45"}},null,2)}
131
+ `}function Z(){return`${JSON.stringify({type:"module",dependencies:{"@zibby/core":"^0.1.47"}},null,2)}
132
132
  `}async function Ze(o,n={}){let e;o?e=o.toLowerCase():(e=Y(),console.log(t.gray(`
133
133
  No name provided \u2014 generated: ${t.white(e)}`))),T.test(e)||(console.log(t.red(`
134
134
  Invalid workflow name: "${o}"`)),console.log(t.gray(" Must be lowercase, start with a letter, use only a-z, 0-9, hyphens")),console.log(t.gray(" Length: 2\u201364 characters")),console.log(t.gray(` Example: ticket-triage, pr-review, deploy-checker
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import{mkdirSync as U,writeFileSync as B,existsSync as x}from"fs";import{join as w,dirname as G,resolve as y}from"path";import{pathToFileURL as Q}from"url";import{execSync as J,spawn as P}from"node:child_process";import{SQSClient as L,SendMessageCommand as b}from"@aws-sdk/client-sqs";var E=null;function W(){return E||(E=new L({region:process.env.AWS_REGION||"ap-southeast-2"})),E}async function h(s,{status:e,error:t}){let{EXECUTION_ID:n,SQS_AUTH_TOKEN:i,PROGRESS_API_URL:r,PROGRESS_QUEUE_URL:o,PROJECT_API_TOKEN:f}=s;if(!n)return;let l={executionId:n,...i&&{sqsAuthToken:i},status:e,...t&&{error:t},timestamp:new Date().toISOString()},d=r?"HTTP":o?"SQS":"NONE",u=JSON.stringify(l).length;console.log(`Sending final status: ${e} via ${d} (${(u/1024).toFixed(1)}KB)`);try{if(r)await K(r,n,l,f);else if(o){let c=["completed","failed","insufficient_context","blocked"].includes(e)?"execution_completed":"progress_update";await D(o,n,l,c)}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 ${d}`)}catch(c){console.error(`Failed to send final status (${e}) via ${d}:`),console.error(` Payload: ${(u/1024).toFixed(1)}KB`),console.error(` Error: ${c.message}`),c.name&&console.error(` Error type: ${c.name}`),c.code&&console.error(` Error code: ${c.code}`)}}async function K(s,e,t,n){let i=`${s}/${e}/progress`,r={"Content-Type":"application/json"};n&&(r.Authorization=`Bearer ${n}`);let o=await fetch(i,{method:"POST",headers:r,body:JSON.stringify(t)});if(!o.ok){let f=await o.text();throw new Error(`HTTP ${o.status}: ${f}`)}}async function D(s,e,t,n="progress_update"){let i=JSON.stringify(t),r=(i.length/1024).toFixed(1);i.length>256*1024&&console.error(`\u274C SQS message too large: ${r}KB (limit 256KB) for ${e} [${n}]`),await W().send(new b({QueueUrl:s,MessageBody:i,MessageGroupId:e,MessageAttributes:{executionId:{DataType:"String",StringValue:e},messageType:{DataType:"String",StringValue:n}}}))}import"@zibby/core";var _=process.env.WORKSPACE||"/workspace";async function H(s,e){U(e,{recursive:!0});let t=Date.now();console.log("Fetching pre-built bundle (streaming curl \u2192 tar)...");let n=setInterval(()=>{let r=((Date.now()-t)/1e3).toFixed(1);console.log(` ...still extracting (${r}s elapsed)`)},3e3);try{await new Promise((r,o)=>{let f=P("curl",["-fsSL",s],{stdio:["ignore","pipe","inherit"]}),l=P("tar",["-xzf","-","-C",e],{stdio:["pipe","inherit","inherit"]});f.stdout.pipe(l.stdin);let d,u,c=()=>{if(d!==void 0&&u!==void 0){if(d!==0)return o(new Error(`curl exited ${d}`));if(u!==0)return o(new Error(`tar exited ${u}`));r()}};f.on("close",p=>{d=p,c()}),l.on("close",p=>{u=p,c()}),f.on("error",o),l.on("error",o)})}finally{clearInterval(n)}let i=((Date.now()-t)/1e3).toFixed(1);return console.log(` Bundle extracted in ${i}s`),e}async function T(){let s=process.env.WORKFLOW_SOURCES_URL;if(!s)throw new Error("WORKFLOW_SOURCES_URL env var is required");console.log("Fetching workflow sources via pre-signed URL...");let e=await fetch(s);if(!e.ok)throw new Error(`Failed to fetch sources: ${e.status} ${e.statusText}`);let t=await e.json();if(!t.sources||typeof t.sources!="object")throw new Error('Invalid sources payload \u2014 missing "sources" map');return t}function M(s,e){let t=y(e),n=0;for(let[i,r]of Object.entries(s)){let o=y(e,i);if(!o.startsWith(`${t}/`)&&o!==t){console.error(` \u26D4 Skipping unsafe path: ${i}`);continue}U(G(o),{recursive:!0}),B(o,r,"utf-8"),n++}return n}async function j(s,e){let t=w(s,"graph.mjs");if(!x(t))throw new Error(`graph.mjs not found at ${t}`);let n=await import(Q(t).href),i=e?.entryClass,r=i&&n[i]||n.default||Object.values(n).find(o=>typeof o=="function"&&o.prototype?.buildGraph);if(!r)throw new Error("No WorkflowAgent class found in graph.mjs");return r}async function ne(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let a=await import("module");a.default._initPaths&&a.default._initPaths()}let{WORKFLOW_JOB_ID:s,WORKFLOW_TYPE:e,PROJECT_ID:t,AGENT_TYPE:n,MODEL:i}=process.env;e||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1)),console.log(`
3
- Zibby Custom Workflow Runner`),console.log(` Job: ${s||"local"}`),console.log(` Workflow: ${e}`),console.log(` Project: ${t||"none"}`),console.log(` Agent: ${n||"default"}`),console.log(` Model: ${i||"auto"}`),console.log("\u2500".repeat(60));let r=process.env.WORKFLOW_BUNDLE_URL,o,f={},l,d;if(r){l=e,o=w(_,".zibby","workflows",l);try{await H(r,o),console.log(" Extracted pre-built bundle (no npm install needed)");try{let a=await T();f=a.input||{},d=a.version}catch(a){console.warn(` Could not fetch input payload: ${a.message}`)}}catch(a){console.warn(` Bundle extract failed (${a.message}); falling back to source install`),o=null}}if(!o){let a=await T(),{sources:$,input:v,workflowType:N,version:k}=a;f=v||{},l=N||e,d=k,console.log(` Workflow v${d||"?"} \u2014 ${Object.keys($).length} source files`),o=w(_,".zibby","workflows",l);let C=M($,o);console.log(` Wrote ${C} files to ${o}`),console.log(" Installing dependencies...");try{J("npm install --silent --no-audit --no-fund",{cwd:o,stdio:"inherit"}),console.log(" Dependencies installed")}catch(F){console.warn(` npm install failed: ${F.message}`)}}let u={},c=w(o,"workflow.json");if(x(c)){let{readFileSync:a}=await import("fs");u=JSON.parse(a(c,"utf-8"))}let p=await j(o,u);console.log(` Loaded ${p.name}`);let I=Date.now(),g=new p({workflow:l||e}),O=g.buildGraph(),A={input:f||{},cwd:_,runId:s||`run-${Date.now()}`};console.log(`
4
- Running graph (${O.nodes?.size||"?"} nodes)...
5
- `);let S;try{S=await O.run(g,A)}catch(a){console.error(`
6
- Workflow execution failed: ${a.message}`),console.error(a.stack),await m("failed",a.message),process.exit(1)}let R=((Date.now()-I)/1e3).toFixed(1);S?.success!==!1?(console.log(`
7
- Workflow "${l||e}" completed in ${R}s`),await m("completed")):(console.error(`
8
- Workflow "${l||e}" failed after ${R}s`),await m("failed",S?.error||"Workflow execution failed"),process.exit(1)),g.onComplete&&await g.onComplete(S)}async function m(s,e=null){let t={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(t.EXECUTION_ID)try{await h(t,{status:s,...e&&{error:e}})}catch(n){console.error(`\u26A0\uFE0F Failed to report status: ${n.message}`)}}export{ne as runWorkflowCommand};
2
+ import{mkdirSync as K,writeFileSync as q,existsSync as p}from"fs";import{join as g,dirname as X,resolve as F}from"path";import{pathToFileURL as U}from"url";import{execSync as V,spawn as L}from"node:child_process";import{SQSClient as Q,SendMessageCommand as J}from"@aws-sdk/client-sqs";var b=null;function j(){return b||(b=new Q({region:process.env.AWS_REGION||"ap-southeast-2"})),b}async function N(i,{status:e,error:n}){let{EXECUTION_ID:s,SQS_AUTH_TOKEN:a,PROGRESS_API_URL:r,PROGRESS_QUEUE_URL:o,PROJECT_API_TOKEN:f}=i;if(!s)return;let l={executionId:s,...a&&{sqsAuthToken:a},status:e,...n&&{error:n},timestamp:new Date().toISOString()},d=r?"HTTP":o?"SQS":"NONE",u=JSON.stringify(l).length;console.log(`Sending final status: ${e} via ${d} (${(u/1024).toFixed(1)}KB)`);try{if(r)await H(r,s,l,f);else if(o){let c=["completed","failed","insufficient_context","blocked"].includes(e)?"execution_completed":"progress_update";await M(o,s,l,c)}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 ${d}`)}catch(c){console.error(`Failed to send final status (${e}) via ${d}:`),console.error(` Payload: ${(u/1024).toFixed(1)}KB`),console.error(` Error: ${c.message}`),c.name&&console.error(` Error type: ${c.name}`),c.code&&console.error(` Error code: ${c.code}`)}}async function H(i,e,n,s){let a=`${i}/${e}/progress`,r={"Content-Type":"application/json"};s&&(r.Authorization=`Bearer ${s}`);let o=await fetch(a,{method:"POST",headers:r,body:JSON.stringify(n)});if(!o.ok){let f=await o.text();throw new Error(`HTTP ${o.status}: ${f}`)}}async function M(i,e,n,s="progress_update"){let a=JSON.stringify(n),r=(a.length/1024).toFixed(1);a.length>256*1024&&console.error(`\u274C SQS message too large: ${r}KB (limit 256KB) for ${e} [${s}]`),await j().send(new J({QueueUrl:i,MessageBody:a,MessageGroupId:e,MessageAttributes:{executionId:{DataType:"String",StringValue:e},messageType:{DataType:"String",StringValue:s}}}))}import"@zibby/core";var P=process.env.WORKSPACE||"/workspace";async function Y(i,e){K(e,{recursive:!0});let n=Date.now();console.log("Fetching pre-built bundle (streaming curl \u2192 tar)...");let s=setInterval(()=>{let r=((Date.now()-n)/1e3).toFixed(1);console.log(` ...still extracting (${r}s elapsed)`)},3e3);try{await new Promise((r,o)=>{let f=L("curl",["-fsSL",i],{stdio:["ignore","pipe","inherit"]}),l=L("tar",["-xzf","-","-C",e],{stdio:["pipe","inherit","inherit"]});f.stdout.pipe(l.stdin);let d,u,c=()=>{if(d!==void 0&&u!==void 0){if(d!==0)return o(new Error(`curl exited ${d}`));if(u!==0)return o(new Error(`tar exited ${u}`));r()}};f.on("close",w=>{d=w,c()}),l.on("close",w=>{u=w,c()}),f.on("error",o),l.on("error",o)})}finally{clearInterval(s)}let a=((Date.now()-n)/1e3).toFixed(1);return console.log(` Bundle extracted in ${a}s`),e}async function W(){let i=process.env.WORKFLOW_SOURCES_URL;if(!i)throw new Error("WORKFLOW_SOURCES_URL env var is required");console.log("Fetching workflow sources via pre-signed URL...");let e=await fetch(i);if(!e.ok)throw new Error(`Failed to fetch sources: ${e.status} ${e.statusText}`);let n=await e.json();if(!n.sources||typeof n.sources!="object")throw new Error('Invalid sources payload \u2014 missing "sources" map');return n}function Z(i,e){let n=F(e),s=0;for(let[a,r]of Object.entries(i)){let o=F(e,a);if(!o.startsWith(`${n}/`)&&o!==n){console.error(` \u26D4 Skipping unsafe path: ${a}`);continue}K(X(o),{recursive:!0}),q(o,r,"utf-8"),s++}return s}async function ee(i,e){let n=g(i,"graph.mjs");if(!p(n))throw new Error(`graph.mjs not found at ${n}`);let s=await import(U(n).href),a=e?.entryClass,r=a&&s[a]||s.default||Object.values(s).find(o=>typeof o=="function"&&o.prototype?.buildGraph);if(!r)throw new Error("No WorkflowAgent class found in graph.mjs");return r}async function de(){if(!process.env.NODE_PATH){process.env.NODE_PATH="/opt/zibby/packages";let t=await import("module");t.default._initPaths&&t.default._initPaths()}let{WORKFLOW_JOB_ID:i,WORKFLOW_TYPE:e,PROJECT_ID:n,AGENT_TYPE:s,MODEL:a}=process.env;e||(console.error("Missing WORKFLOW_TYPE env var"),process.exit(1)),console.log(`
3
+ Zibby Custom Workflow Runner`),console.log(` Job: ${i||"local"}`),console.log(` Workflow: ${e}`),console.log(` Project: ${n||"none"}`),console.log(` Agent: ${s||"default"}`),console.log(` Model: ${a||"auto"}`),console.log("\u2500".repeat(60));let r=process.env.WORKFLOW_BUNDLE_URL,o,f={},l,d;if(r){l=e,o=g(P,".zibby","workflows",l);try{await Y(r,o),console.log(" Extracted pre-built bundle (no npm install needed)");try{let t=await W();f=t.input||{},d=t.version}catch(t){console.warn(` Could not fetch input payload: ${t.message}`)}}catch(t){console.warn(` Bundle extract failed (${t.message}); falling back to source install`),o=null}}if(!o){let t=await W(),{sources:h,input:m,workflowType:O,version:y}=t;f=m||{},l=O||e,d=y,console.log(` Workflow v${d||"?"} \u2014 ${Object.keys(h).length} source files`),o=g(P,".zibby","workflows",l);let $=Z(h,o);console.log(` Wrote ${$} files to ${o}`),console.log(" Installing dependencies...");try{V("npm install --silent --no-audit --no-fund",{cwd:o,stdio:"inherit"}),console.log(" Dependencies installed")}catch(R){console.warn(` npm install failed: ${R.message}`)}}let u={},c=g(o,"workflow.json");if(p(c)){let{readFileSync:t}=await import("fs");u=JSON.parse(t(c,"utf-8"))}let w=await ee(o,u);console.log(` Loaded ${w.name}`);let{readdirSync:D}=await import("fs"),S=[],x=g(o,"node_modules","@zibby","agent-workflow"),A=g(o,"node_modules","@zibby","core","node_modules","@zibby","agent-workflow");p(x)&&S.push({kind:"hoisted",path:x}),p(A)&&S.push({kind:"nested",path:A}),console.log(` [diag] @zibby/agent-workflow copies in bundle: ${S.length}`);for(let t of S)console.log(` [diag] ${t.kind}: ${t.path}`);try{let t=g(o,"node_modules","@zibby");p(t)&&console.log(` [diag] node_modules/@zibby/ contents: [${D(t).join(", ")}]`)}catch{}let k=g(o,"node_modules","@zibby","core","dist","index.js");if(p(k)&&S.length>0)try{let t=await import(U(k).href),h=[t.AssistantStrategy,t.CursorAgentStrategy,t.ClaudeAgentStrategy,t.CodexAgentStrategy,t.GeminiAgentStrategy].filter(Boolean);for(let m of S){let O=g(m.path,"dist","index.js");if(!p(O))continue;let y=await import(U(O).href),$=y.listStrategies();for(let v of h)try{y.registerStrategy(new v)}catch(z){console.warn(` [diag] register ${v.name} into ${m.kind} failed: ${z.message}`)}let R=y.listStrategies();console.log(` [diag] ${m.kind} registry: before=[${$.join(",")||"empty"}] after=[${R.join(",")||"empty"}]`)}console.log(" Registered built-in agent strategies (cursor/claude/codex/gemini/assistant)")}catch(t){console.warn(` Failed to bridge strategies into bundle: ${t.message}`)}else console.warn(" No @zibby/core or @zibby/agent-workflow in bundle \u2014 agent strategies may be unavailable");let B=Date.now(),E=new w({workflow:l||e}),C=E.buildGraph(),G={input:f||{},cwd:P,runId:i||`run-${Date.now()}`};console.log(`
4
+ Running graph (${C.nodes?.size||"?"} nodes)...
5
+ `);let _;try{_=await C.run(E,G)}catch(t){console.error(`
6
+ Workflow execution failed: ${t.message}`),console.error(t.stack),await T("failed",t.message),process.exit(1)}let I=((Date.now()-B)/1e3).toFixed(1);_?.success!==!1?(console.log(`
7
+ Workflow "${l||e}" completed in ${I}s`),await T("completed")):(console.error(`
8
+ Workflow "${l||e}" failed after ${I}s`),await T("failed",_?.error||"Workflow execution failed"),process.exit(1)),E.onComplete&&await E.onComplete(_)}async function T(i,e=null){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 N(n,{status:i,...e&&{error:e}})}catch(s){console.error(`\u26A0\uFE0F Failed to report status: ${s.message}`)}}export{de as runWorkflowCommand};
@@ -1,16 +1,16 @@
1
- import{existsSync as y}from"fs";import{readFile as j}from"fs/promises";import{join as m}from"path";import{pathToFileURL as E}from"url";import o from"chalk";import T from"ora";var W=3848;function S(e){let n=process.cwd();return m(n,".zibby","workflows",e)}async function z(e,n){let t=m(e,"graph.mjs");if(!y(t))throw new Error(`graph.mjs not found in .zibby/workflows/${n}/`);let l=await O(e,n),a=await import(E(t).href),s=l.entryClass,i=s&&a[s]||a.default||Object.values(a).find(r=>typeof r=="function"&&r.prototype?.buildGraph);if(!i)throw new Error("No WorkflowAgent class found in graph.mjs. Export a class with buildGraph() method.");return{AgentClass:i,manifest:l}}async function O(e,n){let t=m(e,"workflow.json");if(!y(t))return{name:n,triggers:{api:!0}};let l=await j(t,"utf-8");return JSON.parse(l)}async function A(e,n){e||(console.log(o.red(`
1
+ import{existsSync as h}from"fs";import{readFile as W}from"fs/promises";import{join as k}from"path";import{pathToFileURL as F}from"url";import o from"chalk";import R from"ora";import{existsSync as T}from"fs";import{join as z}from"path";import{pathToFileURL as S}from"url";async function j(n){let e=z(n,".zibby.config.mjs");if(!T(e))throw new Error(".zibby.config.mjs not found");try{let t=await import(S(e).href);return t.default||t}catch(t){throw new Error(`Failed to load .zibby.config.mjs: ${t.message}`,{cause:t})}}var L=3848;async function O(n){try{return(await j(n))?.paths?.workflows||".zibby/workflows"}catch{return".zibby/workflows"}}async function U(n,e,t){let s=k(n,"graph.mjs");if(!h(s))throw new Error(`graph.mjs not found in ${t}/${e}/`);let a=await v(n,e),l=await import(F(s).href),i=a.entryClass,r=i&&l[i]||l.default||Object.values(l).find(f=>typeof f=="function"&&f.prototype?.buildGraph);if(!r)throw new Error("No WorkflowAgent class found in graph.mjs. Export a class with buildGraph() method.");return{AgentClass:r,manifest:a}}async function v(n,e){let t=k(n,"workflow.json");if(!h(t))return{name:e,triggers:{api:!0}};let s=await W(t,"utf-8");return JSON.parse(s)}async function X(n,e){n||(console.log(o.red(`
2
2
  Workflow name is required`)),console.log(o.gray(" Usage: zibby workflow start <workflow-name>")),console.log(o.gray(` Example: zibby workflow start ticket-triage
3
- `)),process.exit(1));let t=e.toLowerCase(),l=S(t);y(l)||(console.log(o.red(`
4
- Workflow not found: .zibby/workflows/${t}/`)),console.log(o.gray(" Create one first:")),console.log(o.cyan(` zibby workflow new ${t}
5
- `)),process.exit(1));let a=T(` Loading workflow "${t}"...`).start(),s,i;try{({AgentClass:s,manifest:i}=await z(l,t)),a.succeed(` Loaded ${o.bold(i.entryClass||s.name)} (${t})`)}catch(g){a.fail(" Failed to load workflow"),console.log(o.red(`
6
- ${g.message}
7
- `)),process.exit(1)}let r=parseInt(n.port,10)||W,f;try{f=(await import("express")).default}catch{console.log(o.red(`
3
+ `)),process.exit(1));let t=n.toLowerCase(),s=process.cwd(),a=await O(s),l=k(s,a,t);h(l)||(console.log(o.red(`
4
+ Workflow not found: ${a}/${t}/`)),console.log(o.gray(" Create one first:")),console.log(o.cyan(` zibby workflow new ${t}
5
+ `)),process.exit(1));let i=R(` Loading workflow "${t}"...`).start(),r,f;try{({AgentClass:r,manifest:f}=await U(l,t,a)),i.succeed(` Loaded ${o.bold(f.entryClass||r.name)} (${t})`)}catch(w){i.fail(" Failed to load workflow"),console.log(o.red(`
6
+ ${w.message}
7
+ `)),process.exit(1)}let g=parseInt(e.port,10)||L,u;try{u=(await import("express")).default}catch{console.log(o.red(`
8
8
  express is required for local workflow server`)),console.log(o.gray(` npm install express
9
- `)),process.exit(1)}let w=f();w.use(f.json({limit:"1mb"})),w.get("/health",(g,d)=>{d.json({status:"ok",workflow:t,class:s.name})}),w.post("/trigger",async(g,d)=>{let c=`local-${Date.now()}`,h=g.body.input||g.body||{};console.log(o.cyan(`
10
- \u25B6 Run ${c} triggered`)),console.log(o.gray(` input: ${JSON.stringify(h).slice(0,200)}`)),d.status(202).json({runId:c,status:"running",workflow:t});try{let u=Date.now(),p=new s({workflow:t}),$=p.buildGraph(),C={input:h,cwd:process.cwd(),runId:c},k=await $.run(p,C),b=((Date.now()-u)/1e3).toFixed(1),x=k?.success!==!1;console.log(x?o.green(` \u2714 Run ${c} succeeded (${b}s)`):o.red(` \u2716 Run ${c} failed (${b}s)`)),p.onComplete&&await p.onComplete(k)}catch(u){console.log(o.red(` \u2716 Run ${c} error: ${u.message}`))}}),w.listen(r,()=>{console.log(o.bold.cyan(`
9
+ `)),process.exit(1)}let p=u();p.use(u.json({limit:"1mb"})),p.get("/health",(w,y)=>{y.json({status:"ok",workflow:t,class:r.name})}),p.post("/trigger",async(w,y)=>{let c=`local-${Date.now()}`,b=w.body.input||w.body||{};console.log(o.cyan(`
10
+ \u25B6 Run ${c} triggered`)),console.log(o.gray(` input: ${JSON.stringify(b).slice(0,200)}`)),y.status(202).json({runId:c,status:"running",workflow:t});try{let m=Date.now(),d=new r({workflow:t}),x=d.buildGraph(),E={input:b,cwd:process.cwd(),runId:c},$=await x.run(d,E),C=((Date.now()-m)/1e3).toFixed(1),P=$?.success!==!1;console.log(P?o.green(` \u2714 Run ${c} succeeded (${C}s)`):o.red(` \u2716 Run ${c} failed (${C}s)`)),d.onComplete&&await d.onComplete($)}catch(m){console.log(o.red(` \u2716 Run ${c} error: ${m.message}`))}}),p.listen(g,()=>{console.log(o.bold.cyan(`
11
11
  Zibby Workflow Server \u2014 ${t}
12
- `)),console.log(o.gray(" ".padEnd(56,"-"))),console.log(o.white(` Workflow: ${o.cyan(t)}`)),console.log(o.white(` Class: ${o.cyan(s.name)}`)),console.log(o.white(` Port: ${o.cyan(r)}`)),console.log(o.gray(" ".padEnd(56,"-"))),console.log(o.white(`
13
- Endpoints:`)),console.log(o.gray(` GET http://localhost:${r}/health`)),console.log(o.cyan(` POST http://localhost:${r}/trigger`)),console.log(o.white(`
14
- Test with:`)),console.log(o.gray(` curl -X POST http://localhost:${r}/trigger \\`)),console.log(o.gray(' -H "Content-Type: application/json" \\')),console.log(o.gray(` -d '{"input": {"key": "value"}}'
12
+ `)),console.log(o.gray(" ".padEnd(56,"-"))),console.log(o.white(` Workflow: ${o.cyan(t)}`)),console.log(o.white(` Class: ${o.cyan(r.name)}`)),console.log(o.white(` Port: ${o.cyan(g)}`)),console.log(o.gray(" ".padEnd(56,"-"))),console.log(o.white(`
13
+ Endpoints:`)),console.log(o.gray(` GET http://localhost:${g}/health`)),console.log(o.cyan(` POST http://localhost:${g}/trigger`)),console.log(o.white(`
14
+ Test with:`)),console.log(o.gray(` curl -X POST http://localhost:${g}/trigger \\`)),console.log(o.gray(' -H "Content-Type: application/json" \\')),console.log(o.gray(` -d '{"input": {"key": "value"}}'
15
15
  `)),console.log(o.gray(` Ctrl+C to stop
16
- `))})}export{A as startWorkflowCommand};
16
+ `))})}export{X as startWorkflowCommand};
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/cli",
3
- "version": "0.1.82",
3
+ "version": "0.1.85",
4
4
  "description": "Zibby CLI - Test automation generator and runner",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "scripts": {
10
10
  "build": "node ../scripts/build.mjs --extra-dirs bin",
11
- "test": "vitest run test/auth*.test.js test/two-layer-auth.test.js test/trigger-params.test.js test/trigger-helpers.test.js test/deploy-helpers.test.js test/cli-namespace-consistency.test.js test/cli-workflow-subcommands.test.js",
11
+ "test": "vitest run test/auth*.test.js test/two-layer-auth.test.js test/trigger-params.test.js test/trigger-helpers.test.js test/deploy-helpers.test.js test/cli-namespace-consistency.test.js test/cli-workflow-subcommands.test.js test/run-bundle-core-import.test.js test/start-respects-config.test.js",
12
12
  "test:unit": "vitest run src/",
13
13
  "test:auth": "vitest run test/auth*.test.js test/two-layer-auth.test.js",
14
14
  "lint": "eslint .",
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@aws-sdk/client-sqs": "^3.1038.0",
36
36
  "@zibby/agent-workflow": "^0.1.2",
37
- "@zibby/core": "^0.1.45",
37
+ "@zibby/core": "^0.1.47",
38
38
  "@zibby/memory": "^0.1.5",
39
39
  "@zibby/skills": "^0.1.11",
40
40
  "adm-zip": "^0.5.17",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zibby/cli",
3
- "version": "0.1.82",
3
+ "version": "0.1.85",
4
4
  "description": "Zibby CLI - Test automation generator and runner",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "scripts": {
10
10
  "build": "node ../scripts/build.mjs --extra-dirs bin",
11
- "test": "vitest run test/auth*.test.js test/two-layer-auth.test.js test/trigger-params.test.js test/trigger-helpers.test.js test/deploy-helpers.test.js test/cli-namespace-consistency.test.js test/cli-workflow-subcommands.test.js",
11
+ "test": "vitest run test/auth*.test.js test/two-layer-auth.test.js test/trigger-params.test.js test/trigger-helpers.test.js test/deploy-helpers.test.js test/cli-namespace-consistency.test.js test/cli-workflow-subcommands.test.js test/run-bundle-core-import.test.js test/start-respects-config.test.js",
12
12
  "test:unit": "vitest run src/",
13
13
  "test:auth": "vitest run test/auth*.test.js test/two-layer-auth.test.js",
14
14
  "lint": "eslint .",
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@aws-sdk/client-sqs": "^3.1038.0",
36
36
  "@zibby/agent-workflow": "^0.1.2",
37
- "@zibby/core": "^0.1.45",
37
+ "@zibby/core": "^0.1.47",
38
38
  "@zibby/memory": "^0.1.5",
39
39
  "@zibby/skills": "^0.1.11",
40
40
  "adm-zip": "^0.5.17",