kenobi-pages 0.1.12 → 0.1.14

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.
package/bin/cli.mjs CHANGED
@@ -1,24 +1,22 @@
1
1
  #!/usr/bin/env node
2
- var C=Object.defineProperty;var c=(e,o)=>C(e,"name",{value:o,configurable:!0});import{existsSync as v,readFileSync as I,writeFileSync as $,appendFileSync as j}from"node:fs";import{readFile as K}from"node:fs/promises";import{resolve as y}from"node:path";import{createInterface as L}from"node:readline";var O="https://kenobi.ai",u="KENOBI_PAGES_KEY",A=[".env.local",".env",".env.development",".env.development.local"],T=c(()=>{let e={},o=process.cwd();for(let n of A){let s=y(o,n);if(!v(s))continue;let r=I(s,"utf-8");for(let i of r.split(`
3
- `)){let a=i.trim();if(!a||a.startsWith("#"))continue;let t=a.match(/^([A-Z_][A-Z0-9_]*)=["']?([^"']*)["']?$/);t&&(e[t[1]]??=t[2])}}return e},"loadEnvFromCwd"),x=null,N=c(e=>process.env[e]?process.env[e]:(x??=T(),x[e]),"getEnvVar"),F=c(()=>{let e=N(u);return e||(console.error("Error: No API key found."),console.error(""),console.error("Run 'npx kenobi-pages init' to set up your API key,"),console.error("or add KENOBI_PAGES_KEY to your project's env file (e.g. .env or .env.local)."),process.exit(1)),e},"getApiKey"),J=c(()=>(N("KENOBI_BASE_URL")??O).replace(/\/+$/,""),"getBaseUrl"),g=c(async(e,o={})=>{let n=`${J()}${e}`,s=await fetch(n,{method:o.method??"GET",headers:{"x-kenobi-key":F(),"Content-Type":"application/json"},body:o.body?JSON.stringify(o.body):void 0});if(!s.ok){let r=await s.text().catch(()=>"Unknown error"),i=s.status===401||s.status===403?4:s.status===404?3:1;console.error(`Error ${s.status}: ${r}`),i===4&&console.error("If you're using a custom base URL, make sure KENOBI_BASE_URL is set in your project's env file."),process.exit(i)}return s.json()},"fetchKenobi"),h=c(e=>new Promise(o=>{let n=L({input:process.stdin,output:process.stderr});n.question(e,s=>{n.close(),o(s.trim())})}),"prompt"),_=c(()=>new Promise((e,o)=>{let n="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",s=>{n+=s}),process.stdin.on("end",()=>e(n)),process.stdin.on("error",o),process.stdin.isTTY&&e("")}),"readStdin"),P=c(async e=>{let o=e.indexOf("--file");return o!==-1&&e[o+1]?K(e[o+1],"utf-8"):null},"parseFileArg"),B=c(()=>{let e=process.cwd();return A.filter(o=>v(y(e,o)))},"discoverEnvFiles"),S=c((e,o,n)=>{let s=I(e,"utf-8");if(s.includes(o)){console.error(` \u2713 ${o} already present in ${e.split("/").pop()}`);return}let r=s.endsWith(`
2
+ var R=Object.defineProperty;var t=(e,o)=>R(e,"name",{value:o,configurable:!0});import{existsSync as S,readFileSync as E,writeFileSync as $,appendFileSync as _}from"node:fs";import{readFile as U}from"node:fs/promises";import{resolve as k}from"node:path";import{createInterface as j}from"node:readline";var T="https://kenobi.ai",w="KENOBI_PAGES_KEY",I=[".env.local",".env",".env.development",".env.development.local"],F=t(()=>{let e={},o=process.cwd();for(let n of I){let s=k(o,n);if(!S(s))continue;let r=E(s,"utf-8");for(let i of r.split(`
3
+ `)){let c=i.trim();if(!c||c.startsWith("#"))continue;let a=c.match(/^([A-Z_][A-Z0-9_]*)=["']?([^"']*)["']?$/);a&&(e[a[1]]??=a[2])}}return e},"loadEnvFromCwd"),v=null,O=t(e=>process.env[e]?process.env[e]:(v??=F(),v[e]),"getEnvVar"),J=t(()=>{let e=O(w);return e||(console.error("Error: No API key found."),console.error(""),console.error("Run 'npx kenobi-pages init' to set up your API key,"),console.error("or add KENOBI_PAGES_KEY to your project's env file (e.g. .env or .env.local)."),process.exit(1)),e},"getApiKey"),K=t(()=>(O("KENOBI_BASE_URL")??T).replace(/\/+$/,""),"getBaseUrl"),p=t(async(e,o={})=>{let n=`${K()}${e}`,s=await fetch(n,{method:o.method??"GET",headers:{"x-kenobi-key":J(),"Content-Type":"application/json"},body:o.body?JSON.stringify(o.body):void 0});if(!s.ok){let r=await s.text().catch(()=>"Unknown error"),i=s.status===401||s.status===403?4:s.status===404?3:1;console.error(`Error ${s.status}: ${r}`),i===4&&console.error("If you're using a custom base URL, make sure KENOBI_BASE_URL is set in your project's env file."),process.exit(i)}return s.json()},"fetchKenobi"),y=t(e=>new Promise(o=>{let n=j({input:process.stdin,output:process.stderr});n.question(e,s=>{n.close(),o(s.trim())})}),"prompt"),A=t(()=>new Promise((e,o)=>{let n="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",s=>{n+=s}),process.stdin.on("end",()=>e(n)),process.stdin.on("error",o),process.stdin.isTTY&&e("")}),"readStdin"),P=t(async e=>{let o=e.indexOf("--file");return o!==-1&&e[o+1]?U(e[o+1],"utf-8"):null},"parseFileArg"),L=t(()=>{let e=process.cwd();return I.filter(o=>S(k(e,o)))},"discoverEnvFiles"),B=t((e,o,n)=>{let s=E(e,"utf-8");if(s.includes(o)){console.error(` \u2713 ${o} already present in ${e.split("/").pop()}`);return}let r=s.endsWith(`
4
4
  `)?"":`
5
- `;j(e,`${r}${o}="${n}"
6
- `),console.error(` \u2713 Added ${o} to ${e.split("/").pop()}`)},"appendEnvVar"),W=c((e,o,n)=>{S(e,u,o),n&&S(e,"KENOBI_BASE_URL",n)},"appendKeyToEnvFile"),D=c(async()=>{console.error(""),console.error(" Kenobi Pages \u2014 Setup"),console.error(""),console.error(" Find your API key at: https://kenobi.ai/testing/cortex"),console.error("");let e=await h(" Paste your API key (pk_live_... or pk_test_...): ");e||(console.error(" No key provided. Aborting."),process.exit(1)),!e.startsWith("pk_live_")&&!e.startsWith("pk_test_")&&(console.error(` Warning: "${e}" doesn't look like a Kenobi key (expected pk_live_... or pk_test_...).`),(await h(" Continue anyway? (y/N): ")).toLowerCase()!=="y"&&(console.error(" Aborting."),process.exit(1)));let o=process.env.KENOBI_BASE_URL,s=await h(` Custom API host? (leave blank for ${O}): `)||o||void 0;console.error("");let r=B();if(r.length>0){console.error(""),console.error(" Found env files in this project:"),r.forEach((t,l)=>console.error(` ${l+1}. ${t}`)),console.error(` ${r.length+1}. Create a new file`),console.error(` ${r.length+2}. Skip`),console.error("");let i=await h(` Which file should ${u} be added to? [1]: `),a=i===""?0:parseInt(i,10)-1;if(a===r.length){let t=await h(" Filename (e.g. .env.local): ");if(t){let l=y(process.cwd(),t),w=`${u}="${e}"
7
- `;s&&(w+=`KENOBI_BASE_URL="${s}"
8
- `),$(l,w),console.error(` \u2713 Created ${t} with ${u}`)}}else a>=0&&a<r.length&&W(y(process.cwd(),r[a]),e,s)}else{console.error("");let i=await h(" No env files found. Create one? (filename or 'n' to skip) [.env.local]: "),a=c(()=>{let t=`${u}="${e}"
9
- `;return s&&(t+=`KENOBI_BASE_URL="${s}"
10
- `),t},"buildEnvContent");if(i.toLowerCase()!=="n"&&i!==""){let t=y(process.cwd(),i);$(t,a()),console.error(` \u2713 Created ${i} with ${u}`)}else if(i===""){let t=y(process.cwd(),".env.local");$(t,a()),console.error(` \u2713 Created .env.local with ${u}`)}}console.error(""),console.error(" Done! Your agent can now use kenobi-pages commands."),console.error(" Run 'npx kenobi-pages --help' to see what's available."),console.error("")},"initCommand"),G=c(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages schema get <workflowId>"),process.exit(2));let n=await g(`/api/v1/pages/${o}/schema`);console.log(JSON.stringify(n,null,2))},"schemaGet"),E=c((e,o)=>{let n=" ".repeat(o);switch(e.type){case"string":case"url":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return e.items?.type==="object"&&e.items.fields?`Array<{
11
- ${Object.entries(e.items.fields).map(([i,a])=>`${n} ${i}: ${E(a,o+2)}`).join(`
5
+ `;_(e,`${r}${o}="${n}"
6
+ `),console.error(` \u2713 Added ${o} to ${e.split("/").pop()}`)},"appendEnvVar"),W=t((e,o)=>{B(e,w,o)},"appendKeyToEnvFile"),D=t(async()=>{console.error(""),console.error(" Kenobi Pages \u2014 Setup"),console.error(""),console.error(" Find your API key at: https://kenobi.ai/setup"),console.error("");let e=await y(" Paste your API key (pk_live_... or pk_test_...): ");e||(console.error(" No key provided. Aborting."),process.exit(1)),!e.startsWith("pk_live_")&&!e.startsWith("pk_test_")&&(console.error(` Warning: "${e}" doesn't look like a Kenobi key (expected pk_live_... or pk_test_...).`),(await y(" Continue anyway? (y/N): ")).toLowerCase()!=="y"&&(console.error(" Aborting."),process.exit(1))),console.error("");let o=L();if(o.length>0){console.error(""),console.error(" Found env files in this project:"),o.forEach((r,i)=>console.error(` ${i+1}. ${r}`)),console.error(` ${o.length+1}. Create a new file`),console.error(` ${o.length+2}. Skip`),console.error("");let n=await y(` Which file should ${w} be added to? [1]: `),s=n===""?0:parseInt(n,10)-1;if(s===o.length){let r=await y(" Filename (e.g. .env.local): ");if(r){let i=k(process.cwd(),r);$(i,`${w}="${e}"
7
+ `),console.error(` \u2713 Created ${r} with ${w}`)}}else s>=0&&s<o.length&&W(k(process.cwd(),o[s]),e)}else{console.error("");let n=await y(" No env files found. Create one? (filename or 'n' to skip) [.env.local]: "),s=`${w}="${e}"
8
+ `;if(n.toLowerCase()!=="n"&&n!==""){let r=k(process.cwd(),n);$(r,s),console.error(` \u2713 Created ${n} with ${w}`)}else if(n===""){let r=k(process.cwd(),".env.local");$(r,s),console.error(` \u2713 Created .env.local with ${w}`)}}console.error(""),console.error(" Done! Your agent can now use kenobi-pages commands."),console.error(" Run 'npx kenobi-pages --help' to see what's available."),console.error("")},"initCommand"),G=t(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages schema get <workflowId>"),process.exit(2));let n=await p(`/api/v1/pages/${o}/schema`);console.log(JSON.stringify(n,null,2))},"schemaGet"),x=t((e,o)=>{let n=" ".repeat(o);switch(e.type){case"string":case"url":return"string";case"number":return"number";case"boolean":return"boolean";case"array":return e.items?.type==="object"&&e.items.fields?`Array<{
9
+ ${Object.entries(e.items.fields).map(([i,c])=>`${n} ${i}: ${x(c,o+2)}`).join(`
12
10
  `)}
13
- ${n} }>`:`${e.items?E(e.items,o):"unknown"}[]`;case"object":return e.fields?`{
14
- ${Object.entries(e.fields).map(([r,i])=>`${n} ${r}: ${E(i,o+1)}`).join(`
11
+ ${n} }>`:`${e.items?x(e.items,o):"unknown"}[]`;case"object":return e.fields?`{
12
+ ${Object.entries(e.fields).map(([r,i])=>`${n} ${r}: ${x(i,o+1)}`).join(`
15
13
  `)}
16
- ${n}}`:"Record<string, unknown>";default:return"unknown"}},"schemaTypeToTs"),M=c(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages schema codegen <workflowId>"),console.error(" npx kenobi-pages schema codegen 42 > lib/kenobi-types.ts"),process.exit(2));let n=await g(`/api/v1/pages/${o}/schema`),r=(n.title??"KenobiPage").replace(/[^a-zA-Z0-9\s]/g,"").split(/\s+/).map(a=>a.charAt(0).toUpperCase()+a.slice(1).toLowerCase()).join("")+"Content",i=Object.entries(n.schema).map(([a,t])=>`${t.description?` /** ${t.description} */
17
- `:""} ${a}: ${E(t,1)}`).join(`
14
+ ${n}}`:"Record<string, unknown>";default:return"unknown"}},"schemaTypeToTs"),M=t(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages schema codegen <workflowId>"),console.error(" npx kenobi-pages schema codegen 42 > lib/kenobi-types.ts"),process.exit(2));let n=await p(`/api/v1/pages/${o}/schema`),r=(n.title??"KenobiPage").replace(/[^a-zA-Z0-9\s]/g,"").split(/\s+/).map(c=>c.charAt(0).toUpperCase()+c.slice(1).toLowerCase()).join("")+"Content",i=Object.entries(n.schema).map(([c,a])=>`${a.description?` /** ${a.description} */
15
+ `:""} ${c}: ${x(a,1)}`).join(`
18
16
  `);console.log(`export interface ${r} {
19
17
  ${i}
20
- }`),console.error(`Generated interface ${r} from workflow ${o}`)},"schemaCodegen"),Y=c(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages schema push <name> '<json>'"),console.error(" kenobi-pages schema push <name> --file schema.json"),console.error(" echo '<json>' | kenobi-pages schema push <name>"),process.exit(2));let n=e.slice(1),s=await P(n),r=s?null:n.find(w=>w.startsWith("{")),i=!s&&!r?await _():null,a=s??r??i;(!a||a.trim().length===0)&&(console.error("Error: No schema provided."),console.error("Pass inline JSON, --file <path>, or pipe to stdin."),process.exit(2));let t;try{t=JSON.parse(a)}catch{console.error("Error: Invalid JSON."),process.exit(2)}let l=await g("/api/v1/pages/schema",{method:"POST",body:{name:o,schema:t}});console.log(JSON.stringify(l,null,2)),console.error(`Schema "${l.name}" pushed successfully.`),console.error(`Source key: ${l.sourceKey}`),console.error("You can now select this schema as an output target in the Kenobi workflow builder.")},"schemaPush"),V=c(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages pages <workflowId>"),process.exit(2));let n=await g(`/api/v1/pages/${o}`);console.log(JSON.stringify(n,null,2))},"listPages"),Z=c(async e=>{let[o,n]=e;(!o||!n)&&(console.error("Usage: kenobi-pages page get <workflowId> <slug>"),process.exit(2));let s=await g(`/api/v1/pages/${o}/${n}`);console.log(JSON.stringify(s,null,2))},"pageGet"),q=new Set(["COMPLETED","FAILED","CANCELED","SYSTEM_FAILURE","CRASHED"]),z=c(e=>{if(typeof e=="string")return e;if(typeof e=="object"&&e!==null&&"message"in e){let o=e.message;if(typeof o=="string")return o}return"Unknown error"},"runStatusErrorMessage"),H=c(e=>new Promise(o=>setTimeout(o,e)),"sleep"),k=c((e,o)=>{let n=e.indexOf(o);return n!==-1&&e[n+1]?e[n+1]:void 0},"parseFlag"),X=c(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages run <workflowId> [--params '<json>'] [--context '<text>']"),process.exit(2));let n=e.slice(1),s={},r=k(n,"--params");if(r)try{s=JSON.parse(r)}catch{console.error("Error: Invalid JSON in --params"),process.exit(2)}let i=k(n,"--context"),a={params:s};i&&(a.context=i);let t=await g(`/api/v1/workflows/${o}/run`,{method:"POST",body:a});console.error(`Run triggered: ${t.runId}`),console.error("Polling for completion...");let l=2e3,w=15e3;for(;;){await H(l);let m=await g(`/api/v1/workflows/${o}/runs/${t.runId}`);if(console.error(` Status: ${m.status}`),q.has(m.status)){if(m.status!=="COMPLETED"){let U=z(m.error);console.error(`
21
- Run failed (${m.status}): ${U}`),console.log(JSON.stringify(m,null,2)),process.exit(1)}console.log(JSON.stringify(m,null,2));return}l=Math.min(l*1.5,w)}},"runWorkflow"),Q=c(async()=>{let e=await g("/api/v1/workflows");console.log(JSON.stringify(e,null,2))},"listWorkflows"),ee=c(async()=>{let e=await g("/api/v1/sources");console.log(JSON.stringify(e,null,2))},"listSources"),oe=c(async e=>{let o=await g(`/api/v1/sources/${encodeURIComponent(e)}/sample`);console.log(JSON.stringify(o,null,2))},"sampleSource"),R=c(async e=>{let o=await P(e),n=o?null:e.find(i=>i.startsWith("{")),s=!o&&!n?await _():null,r=o??n??s;(!r||r.trim().length===0)&&(console.error("Error: No JSON provided."),console.error("Pass inline JSON, --file <path>, or pipe to stdin."),process.exit(2));try{return JSON.parse(r)}catch{console.error("Error: Invalid JSON."),process.exit(2)}},"readJsonInput"),ne=c(async e=>{let o=k(e,"--name"),n=k(e,"--slug");(!o||!n)&&(console.error("Usage: kenobi-pages workflow create --name '<name>' --slug '<slug>' --config '<json>'"),console.error(" kenobi-pages workflow create --name '<name>' --slug '<slug>' --file config.json"),process.exit(2));let s=k(e,"--description"),r=e.indexOf("--config"),i=r!==-1&&e[r+1]?[e[r+1]]:e,a=await R(i),t={name:o,slug:n,config:a};s&&(t.description=s);let l=await g("/api/v1/workflows",{method:"POST",body:t});console.log(JSON.stringify(l,null,2)),console.error(`Workflow "${o}" created.`)},"workflowCreate"),se=c(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages workflow get <workflowId>"),process.exit(2));let n=await g(`/api/v1/workflows/${o}?full=true`);console.log(JSON.stringify(n,null,2))},"workflowGet"),re=c(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages workflow update <workflowId> --config '<json>'"),console.error(" kenobi-pages workflow update <workflowId> --file config.json"),process.exit(2));let n=e.slice(1),s=k(n,"--name"),r=k(n,"--description"),i=n.indexOf("--config"),a=i!==-1&&n[i+1]?[n[i+1]]:n,t={};s&&(t.name=s),r!==void 0&&(t.description=r),(n.includes("--config")||n.includes("--file"))&&(t.config=await R(a)),Object.keys(t).length===0&&(console.error("Error: Nothing to update. Pass --name, --description, --config, or --file."),process.exit(2));let w=await g(`/api/v1/workflows/${o}`,{method:"PUT",body:t});console.log(JSON.stringify(w,null,2)),console.error("Workflow updated.")},"workflowUpdate"),te=c(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages workflow delete <workflowId>"),process.exit(2)),await g(`/api/v1/workflows/${o}`,{method:"DELETE"}),console.error("Workflow deleted.")},"workflowDelete"),ie=`kenobi-pages \u2014 Kenobi Pages CLI
18
+ }`),console.error(`Generated interface ${r} from workflow ${o}`)},"schemaCodegen"),Y=t(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages schema push <name> '<json>'"),console.error(" kenobi-pages schema push <name> --file schema.json"),console.error(" echo '<json>' | kenobi-pages schema push <name>"),process.exit(2));let n=e.slice(1),s=await P(n),r=s?null:n.find(h=>h.startsWith("{")),i=!s&&!r?await A():null,c=s??r??i;(!c||c.trim().length===0)&&(console.error("Error: No schema provided."),console.error("Pass inline JSON, --file <path>, or pipe to stdin."),process.exit(2));let a;try{a=JSON.parse(c)}catch{console.error("Error: Invalid JSON."),process.exit(2)}let f=await p("/api/v1/pages/schema",{method:"POST",body:{name:o,schema:a}});console.log(JSON.stringify(f,null,2)),console.error(`Schema "${f.name}" pushed successfully.`),console.error(`Source key: ${f.sourceKey}`),console.error("You can now select this schema as an output target in the Kenobi workflow builder.")},"schemaPush"),V=t(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages pages <workflowId>"),process.exit(2));let n=await p(`/api/v1/pages/${o}`);console.log(JSON.stringify(n,null,2))},"listPages"),Z=t(async e=>{let[o,n]=e;(!o||!n)&&(console.error("Usage: kenobi-pages page get <workflowId> <slug>"),process.exit(2));let s=await p(`/api/v1/pages/${o}/${n}`);console.log(JSON.stringify(s,null,2))},"pageGet"),q=new Set(["COMPLETED","FAILED","CANCELED","SYSTEM_FAILURE","CRASHED"]),z=t(e=>{if(typeof e=="string")return e;if(typeof e=="object"&&e!==null&&"message"in e){let o=e.message;if(typeof o=="string")return o}return"Unknown error"},"runStatusErrorMessage"),H=t(e=>new Promise(o=>setTimeout(o,e)),"sleep"),m=t((e,o)=>{let n=e.indexOf(o);return n!==-1&&e[n+1]?e[n+1]:void 0},"parseFlag"),X=t(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages run <workflowId> [--params '<json>'] [--context '<text>']"),process.exit(2));let n=e.slice(1),s={},r=m(n,"--params");if(r)try{s=JSON.parse(r)}catch{console.error("Error: Invalid JSON in --params"),process.exit(2)}let i=m(n,"--context"),c={params:s};i&&(c.context=i);let a=await p(`/api/v1/workflows/${o}/run`,{method:"POST",body:c});console.error(`Run triggered: ${a.runId}`),console.error("Polling for completion...");let f=2e3,h=15e3;for(;;){await H(f);let u=await p(`/api/v1/workflows/${o}/runs/${a.runId}`);if(console.error(` Status: ${u.status}`),q.has(u.status)){if(u.status!=="COMPLETED"){let C=z(u.error);console.error(`
19
+ Run failed (${u.status}): ${C}`),console.log(JSON.stringify(u,null,2)),process.exit(1)}console.log(JSON.stringify(u,null,2));return}f=Math.min(f*1.5,h)}},"runWorkflow"),Q=t(async()=>{let e=await p("/api/v1/workflows");console.log(JSON.stringify(e,null,2))},"listWorkflows"),ee=t(async()=>{let e=await p("/api/v1/sources");console.log(JSON.stringify(e,null,2))},"listSources"),oe=t(async e=>{let o=await p(`/api/v1/sources/${encodeURIComponent(e)}/sample`);console.log(JSON.stringify(o,null,2))},"sampleSource"),N=t(async e=>{let o=await P(e),n=o?null:e.find(i=>i.startsWith("{")),s=!o&&!n?await A():null,r=o??n??s;(!r||r.trim().length===0)&&(console.error("Error: No JSON provided."),console.error("Pass inline JSON, --file <path>, or pipe to stdin."),process.exit(2));try{return JSON.parse(r)}catch{console.error("Error: Invalid JSON."),process.exit(2)}},"readJsonInput"),ne=t(async e=>{let o=m(e,"--name"),n=m(e,"--slug");(!o||!n)&&(console.error("Usage: kenobi-pages workflow create --name '<name>' --slug '<slug>' --config '<json>'"),console.error(" kenobi-pages workflow create --name '<name>' --slug '<slug>' --file config.json"),process.exit(2));let s=m(e,"--description"),r=e.indexOf("--config"),i=r!==-1&&e[r+1]?[e[r+1]]:e,c=await N(i),a={name:o,slug:n,config:c};s&&(a.description=s);let f=await p("/api/v1/workflows",{method:"POST",body:a});console.log(JSON.stringify(f,null,2)),console.error(`Workflow "${o}" created.`)},"workflowCreate"),se=t(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages workflow get <workflowId>"),process.exit(2));let n=await p(`/api/v1/workflows/${o}?full=true`);console.log(JSON.stringify(n,null,2))},"workflowGet"),re=t(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages workflow update <workflowId> --config '<json>'"),console.error(" kenobi-pages workflow update <workflowId> --file config.json"),process.exit(2));let n=e.slice(1),s=m(n,"--name"),r=m(n,"--description"),i=n.indexOf("--config"),c=i!==-1&&n[i+1]?[n[i+1]]:n,a={};s&&(a.name=s),r!==void 0&&(a.description=r),(n.includes("--config")||n.includes("--file"))&&(a.config=await N(c)),Object.keys(a).length===0&&(console.error("Error: Nothing to update. Pass --name, --description, --config, or --file."),process.exit(2));let h=await p(`/api/v1/workflows/${o}`,{method:"PUT",body:a});console.log(JSON.stringify(h,null,2)),console.error("Workflow updated.")},"workflowUpdate"),te=t(async e=>{let o=e[0];o||(console.error("Usage: kenobi-pages workflow delete <workflowId>"),process.exit(2)),await p(`/api/v1/workflows/${o}`,{method:"DELETE"}),console.error("Workflow deleted.")},"workflowDelete"),ie=`kenobi-pages \u2014 Kenobi Pages CLI
22
20
 
23
21
  Commands:
24
22
  init Set up your API key (interactive)
@@ -79,4 +77,4 @@ Environment:
79
77
  Key resolution order:
80
78
  1. Shell environment variables
81
79
  2. Env files in working directory (.env.local, .env, .env.development, etc.)
82
- `,[,,...b]=process.argv;(b.length===0||b[0]==="--help"||b[0]==="-h")&&(console.log(ie),process.exit(0));var[f,p,...d]=b;if(f==="init")await D();else if(f==="schema"&&p==="get")await G(d);else if(f==="schema"&&p==="codegen")await M(d);else if(f==="schema"&&p==="push")await Y(d);else if(f==="pages")await V([p,...d].filter(Boolean));else if(f==="page"&&p==="get")await Z(d);else if(f==="sources")if(p==="sample"){let e=d[0];e||(console.error("Usage: kenobi-pages sources sample <sourceKey>"),process.exit(2)),await oe(e)}else p===void 0||p==="list"?await ee():(console.error(`Unknown sources subcommand: ${p}`),console.error("Run 'kenobi-pages --help' for usage."),process.exit(2));else f==="workflows"?await Q():f==="workflow"&&p==="create"?await ne(d):f==="workflow"&&p==="get"?await se(d):f==="workflow"&&p==="update"?await re(d):f==="workflow"&&p==="delete"?await te(d):f==="run"?await X([p,...d].filter(Boolean)):(console.error(`Unknown command: ${b.join(" ")}`),console.error("Run 'kenobi-pages --help' for usage."),process.exit(1));
80
+ `,[,,...b]=process.argv;(b.length===0||b[0]==="--help"||b[0]==="-h")&&(console.log(ie),process.exit(0));var[g,l,...d]=b;if(g==="init")await D();else if(g==="schema"&&l==="get")await G(d);else if(g==="schema"&&l==="codegen")await M(d);else if(g==="schema"&&l==="push")await Y(d);else if(g==="pages")await V([l,...d].filter(Boolean));else if(g==="page"&&l==="get")await Z(d);else if(g==="sources")if(l==="sample"){let e=d[0];e||(console.error("Usage: kenobi-pages sources sample <sourceKey>"),process.exit(2)),await oe(e)}else l===void 0||l==="list"?await ee():(console.error(`Unknown sources subcommand: ${l}`),console.error("Run 'kenobi-pages --help' for usage."),process.exit(2));else g==="workflows"?await Q():g==="workflow"&&l==="create"?await ne(d):g==="workflow"&&l==="get"?await se(d):g==="workflow"&&l==="update"?await re(d):g==="workflow"&&l==="delete"?await te(d):g==="run"?await X([l,...d].filter(Boolean)):(console.error(`Unknown command: ${b.join(" ")}`),console.error("Run 'kenobi-pages --help' for usage."),process.exit(1));
package/dist/client.js CHANGED
@@ -1 +1 @@
1
- var b=Object.defineProperty;var s=(i,o)=>b(i,"name",{value:o,configurable:!0});import{KenobiPagesError as c,KenobiNotFoundError as a,KenobiUnauthorizedError as f}from"./errors";const K="https://kenobi.ai",l=s(async(i,o,e)=>{const r=(i.baseUrl??K).replace(/\/+$/,""),n={headers:{"x-kenobi-key":i.apiKey}};(e?.revalidate!==void 0||e?.tags)&&(n.next={},e.revalidate!==void 0&&(n.next.revalidate=e.revalidate),e.tags&&(n.next.tags=[...e.tags]));const t=await fetch(`${r}${o}`,n);if(t.ok)return t;if(t.status===401)throw new f;if(t.status===404)throw new a;const g=await t.text().catch(()=>"Unknown error");throw new c(`Kenobi API error (${t.status}): ${g}`,t.status,"API_ERROR")},"fetchPage"),h=s(i=>({getPage:s(async(o,e,r)=>{try{return await(await l(i,`/api/v1/pages/${o}/${e}`,r)).json()}catch(n){if(n instanceof a)return null;throw n}},"getPage")}),"createKenobiPagesClient");export{h as createKenobiPagesClient};
1
+ var b=Object.defineProperty;var o=(i,s)=>b(i,"name",{value:s,configurable:!0});import{KenobiPagesError as c,KenobiNotFoundError as a,KenobiUnauthorizedError as f}from"./errors";const K="https://kenobi.ai",l=o(async(i,s,e)=>{const r=(i.baseUrl??K).replace(/\/+$/,""),n={headers:{"x-kenobi-key":i.apiKey}};(e?.revalidate!==void 0||e?.tags)&&(n.next={},e.revalidate!==void 0&&(n.next.revalidate=e.revalidate),e.tags&&(n.next.tags=[...e.tags]));const t=await fetch(`${r}${s}`,n);if(t.ok)return t;if(t.status===401)throw new f;if(t.status===404)throw new a;const g=await t.text().catch(()=>"Unknown error");throw new c(`Kenobi API error (${t.status}): ${g}`,t.status,"API_ERROR")},"fetchPage"),h=o(i=>({getPage:o(async(s,e,r)=>{try{return await(await l(i,`/api/v1/pages/${s}/${e}`,r)).json()}catch(n){if(n instanceof a)return null;throw n}},"getPage")}),"createKenobiPagesClient");export{h as createKenobiPagesClient};
package/dist/types.d.ts CHANGED
@@ -16,5 +16,5 @@ export interface KenobiPageResponse {
16
16
  readonly updatedAt: string;
17
17
  }
18
18
  export interface KenobiPagesClient {
19
- readonly getPage: (workflowId: number, slug: string, opts?: KenobiFetchOptions) => Promise<KenobiPageResponse | null>;
19
+ readonly getPage: (workflowId: number | string, slug: string, opts?: KenobiFetchOptions) => Promise<KenobiPageResponse | null>;
20
20
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kenobi-pages",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "description": "Kenobi Pages SDK — fetch personalized page content from Kenobi workflows",
5
5
  "type": "module",
6
6
  "exports": {