@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
|
|
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
|
|
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:
|
|
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
|
|
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)&&!
|
|
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
|
|
12
|
-
'${
|
|
13
|
-
`)),process.exit(1)),t
|
|
14
|
-
Workflow with UUID '${
|
|
15
|
-
`)),process.exit(1)),
|
|
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(
|
|
18
|
-
`)),process.exit(1)}let s=await
|
|
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
|
-
`)),
|
|
21
|
-
${
|
|
22
|
-
`)),process.exit(1)}}function
|
|
23
|
-
`,"utf-8"),
|
|
24
|
-
`,"utf-8"),
|
|
25
|
-
Downloaded to ${o.bold(
|
|
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(
|
|
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
|
|
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(
|
|
32
|
-
Failed to parse ${s}: ${
|
|
33
|
-
`)),process.exit(1)}let{_meta:u,...
|
|
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: ${
|
|
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
|
|
39
|
-
`)),process.exit(1)}let
|
|
40
|
-
Workflow "${
|
|
41
|
-
`))}catch(f){
|
|
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
|
|
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
|
|
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
|
|
47
|
-
${
|
|
48
|
-
`)),process.exit(1)}}export{
|
|
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.
|
|
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
|
|
3
|
-
Zibby Custom Workflow Runner`),console.log(` Job: ${
|
|
4
|
-
Running graph (${
|
|
5
|
-
`);let
|
|
6
|
-
Workflow execution failed: ${
|
|
7
|
-
Workflow "${l||e}" completed in ${
|
|
8
|
-
Workflow "${l||e}" failed after ${
|
|
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
|
|
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=
|
|
4
|
-
Workflow not found:
|
|
5
|
-
`)),process.exit(1));let
|
|
6
|
-
${
|
|
7
|
-
`)),process.exit(1)}let
|
|
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
|
|
10
|
-
\u25B6 Run ${c} triggered`)),console.log(o.gray(` input: ${JSON.stringify(
|
|
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(
|
|
13
|
-
Endpoints:`)),console.log(o.gray(` GET http://localhost:${
|
|
14
|
-
Test with:`)),console.log(o.gray(` curl -X POST http://localhost:${
|
|
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{
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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",
|