@kizenapps/cli 0.14.0 → 0.16.0
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/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/dist/viewer/assets/AppDetailPage-BorvgFPN.js +1 -0
- package/dist/viewer/assets/{CodeStepsPage-BzaaN9Kb.js → CodeStepsPage-BZ2IGkjP.js} +1 -1
- package/dist/viewer/assets/{ConfigurationPage-DyGQQTe-.js → ConfigurationPage-Bz7OWrKi.js} +1 -1
- package/dist/viewer/assets/{DevSidebar-h9gYdctz.js → DevSidebar-DS8UU-G8.js} +1 -1
- package/dist/viewer/assets/{SandboxPage-IYn-KIbv.js → SandboxPage-DR-JuVpv.js} +1 -1
- package/dist/viewer/assets/SourceBrowserPage-BBZcr3MI.js +1 -0
- package/dist/viewer/assets/{WhenBadge-GxhTQKsq.js → WhenBadge-y4k1WgBK.js} +1 -1
- package/dist/viewer/assets/{api-C5Iu-4AS.js → api-CT-MKz2h.js} +1 -1
- package/dist/viewer/assets/{configStorage-BnMh081m.js → configStorage-CNoQ0cy5.js} +1 -1
- package/dist/viewer/assets/formatBytes-C9lOTtsO.js +1 -0
- package/dist/viewer/assets/{index-CjU7OUke.js → index-CdWhtYEM.js} +3 -3
- package/dist/viewer/assets/{index-dW-Omils.css → index-DtzraybB.css} +1 -1
- package/dist/viewer/assets/{storageKeys-ClzdCxlg.js → storageKeys-C6c8YF5Y.js} +1 -1
- package/dist/viewer/assets/{useCriticalExceptionDialog-DK8ufamu.js → useCriticalExceptionDialog-CutIcd8b.js} +2 -2
- package/dist/viewer/index.html +4 -6
- package/package.json +6 -4
- package/dist/viewer/assets/AppDetailPage-D4r3W5v5.js +0 -1
- package/dist/viewer/assets/SourceBrowserPage-BOlm36Dg.js +0 -1
- package/dist/viewer/manifest.json +0 -10
- /package/dist/viewer/assets/{CodeViewer-Ce2qKSWi.js → CodeViewer-C9aVhzG7.js} +0 -0
- /package/dist/viewer/assets/{IconReferencePage-BLciUKH9.js → IconReferencePage-bTBpdJEd.js} +0 -0
- /package/dist/viewer/assets/{VersionsPage-C02dpN3Y.js → VersionsPage-D6QScnTb.js} +0 -0
- /package/dist/viewer/assets/{useLocalStorage-B73GyZbK.js → useLocalStorage-CyZiO78q.js} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFileSync as
|
|
2
|
+
import{readFileSync as yo}from"fs";import{dirname as ho,join as xo}from"path";import{fileURLToPath as bo}from"url";import{program as Le}from"commander";import{createElement as tn}from"react";import{render as rn}from"ink";import{useEffect as Zr,useState as dt}from"react";import{Box as Pe,Text as me,useApp as Qr}from"ink";import{mkdir as Rr,writeFile as Nr}from"fs/promises";import{join as Lr}from"path";import{minifyFiles as jr,packagePlugin as Fr,transformDeployablePlugin as Ar}from"@kizenapps/packager";import{readdir as kr,readFile as lt}from"fs/promises";import{join as Et,relative as Ir}from"path";var Br=new Set([".png",".svg"]),Dr=new Set([".kzn"]),$e=new Set(["node_modules",".git",".kizenapp",".github"]);async function kt(e,t){let i=await kr(e,{withFileTypes:!0}),n=[];for(let r of i)if(r.isDirectory()){if($e.has(r.name))continue;n.push(...await kt(Et(e,r.name),t))}else r.isFile()&&n.push(Et(e,r.name));return n}async function It(e){let t=await kt(e,e);return Promise.all(t.map(async i=>{let n=Ir(e,i).split("\\").join("/"),r=n.lastIndexOf("."),c=r>=0?n.slice(r).toLowerCase():"";if(Br.has(c)){let g=await lt(i);return{path:n,content:"",base64Image:g.toString("base64")}}if(Dr.has(c)){let g=await lt(i);return{path:n,content:"",binaryData:g}}let S=await lt(i,"utf-8");return{path:n,content:S}}))}var Or=["name","api_name","version","entry"];function Bt(e,t){let i=t===void 0?"kizen.json":`kizen.json entry #${String(t+1)}`;for(let n of Or){let r=e[n];if(typeof r!="string"||r==="")throw new Error(`${i} is missing required field "${n}" (expected a non-empty string).`)}}function $r(e){let t;try{t=JSON.parse(e)}catch(i){let n=i instanceof Error?i.message:String(i);throw new Error(`kizen.json is not valid JSON: ${n}`)}if(Array.isArray(t))return t.forEach((i,n)=>{if(typeof i!="object"||i===null)throw new Error(`kizen.json entry #${String(n+1)} is not a JSON object.`);Bt(i,n)}),t;if(typeof t!="object"||t===null)throw new Error("kizen.json must be a JSON object (or array of objects).");return Bt(t),t}var zr=(e,t)=>({...e,thumbnail:e.thumbnail?Buffer.from(e.thumbnail).toString("base64"):null,kznFile:e.kznFile?Buffer.from(e.kznFile).toString("base64"):null,allReleaseNotes:t});async function ze(e,t,i){await Rr(t,{recursive:!0}),i?.("reading-files");let n=await It(e);i?.("minifying");let r=await jr(n);i?.("packaging");let c=r.find(l=>l.path==="kizen.json");if(!c)throw new Error("kizen.json not found in plugin directory.");let S=$r(c.content),g=Fr(r,S),_=Object.values(g).map(Ar);i?.("writing-bundle");let v=_.map(l=>{let x=l.release_notes_directory?.replace(/\/$/,""),E=x?n.filter(R=>R.path.startsWith(x+"/")&&R.path.endsWith(".md")&&R.content).map(R=>({version:R.path.slice(R.path.lastIndexOf("/")+1,-3),notes:R.content})).sort((R,C)=>C.version.localeCompare(R.version,void 0,{numeric:!0})):[];return zr(l,E)}),h=JSON.stringify(v,null,2),y=(l,x)=>l==="allReleaseNotes"?void 0:x,m=Buffer.byteLength(JSON.stringify(v,y,2),"utf-8");return await Nr(Lr(t,"bundle.json"),h,"utf-8"),{bundleSize:m}}function Se(e){return e<1024?`${String(e)} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(2)} MB`}import{Box as qr,Text as Vr}from"ink";import{Box as Mr,Text as Hr}from"ink";import{jsx as Dt}from"react/jsx-runtime";var Ur=[" :::::::: "," :::::: ::::::::::: "," :::::: :::::::::: "," :::::: :::::: ::::::: "," ::::: :::::: ::::::::::::::::: "," ::::: ::::: ::::::::::::::::::: "," ::::: ::::: :::::: ::::: ",":::: ::::: ::: ::::: :: ","::::: :::::: :::::::::: ","::::: :::::: ::::::::::: "," ::::: ::: ::::::: "," ::::::: ::: ::::: "," ::::::::::: :::::: :::::"," :::::::::: :::::: :::::"," :: ::::: ::: ::::: ::::"," ::::: :::::: ::::: ::::: ::: "," ::::::::::::::::::: ::::: ::::: "," ::::::::::::::::: ::::: ::::: "," ::::::::: :::::: :::::: "," :::::::::: :::::: "," ::::::::::: :::::: "," :::::::: "],Rt=()=>Dt(Mr,{flexDirection:"column",children:Ur.map((e,t)=>Dt(Hr,{color:"cyan",children:e},t))});import{Fragment as Jr,jsx as ct,jsxs as Wr}from"react/jsx-runtime";var V=({marginBottom:e=0})=>Wr(Jr,{children:[ct(Rt,{}),ct(qr,{flexDirection:"column",marginTop:1,marginBottom:e,children:ct(Vr,{bold:!0,color:"cyan",children:"Kizen App Development Toolkit"})})]});import{useEffect as Kr,useState as Gr}from"react";import{Text as Xr}from"ink";import{jsx as Yr}from"react/jsx-runtime";var Nt=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Me=()=>{let[e,t]=Gr(0);return Kr(()=>{let i=setInterval(()=>{t(n=>(n+1)%Nt.length)},80);return()=>{clearInterval(i)}},[]),Yr(Xr,{color:"cyan",children:Nt[e]??"\u280B"})};import{Fragment as en,jsx as le,jsxs as ce}from"react/jsx-runtime";var Lt=["creating-dir","reading-files","minifying","packaging","writing-bundle"],He={"creating-dir":"Creating .kizenapp directory","reading-files":"Reading plugin files",minifying:"Minifying scripts",packaging:"Packaging plugin","writing-bundle":"Writing bundle.json"},jt=({outputDir:e,pluginDir:t})=>{let i=Qr(),[n,r]=dt("creating-dir"),[c,S]=dt(null),[g,_]=dt(null);Zr(()=>{ze(t,e,r).then(({bundleSize:m})=>{_(m),r("done"),i.exit()}).catch(m=>{let l=m instanceof Error?m.message:String(m);S(l),r("error"),i.exit()})},[e,t,i]);let v=Lt.indexOf(n),h=n==="error",y=n==="done";return ce(Pe,{flexDirection:"column",paddingY:1,paddingX:2,children:[le(V,{marginBottom:1}),ce(Pe,{flexDirection:"column",gap:0,children:[Lt.map((m,l)=>{let x=n===m,E=y||v>l;return le(Pe,{gap:1,children:h&&l===v?ce(me,{color:"red",children:["\u2717 ",He[m]]}):E?ce(me,{color:"green",children:["\u2713 ",He[m]]}):x?ce(en,{children:[le(Me,{}),le(me,{children:He[m]})]}):ce(me,{dimColor:!0,children:[" ",He[m]]})},m)}),y&&g!==null&&le(Pe,{marginTop:1,gap:1,children:ce(me,{color:"green",children:["\u2713 bundle \u2014 ",Se(g)]})}),c!==null&&le(Pe,{marginTop:1,borderStyle:"single",borderColor:"red",paddingX:1,children:le(me,{color:"red",children:c})})]})]})};import*as ge from"fs";import*as Ft from"path";function ye(e){let t=Ft.join(e,".gitignore"),i=".kizenapp/",n="";if(ge.existsSync(t)){n=ge.readFileSync(t,"utf8");let c=n.split(`
|
|
3
3
|
`).map(S=>S.trim());if(c.includes(i)||c.includes(".kizenapp"))return}let r=n.endsWith(`
|
|
4
4
|
`)?i+`
|
|
5
5
|
`:`
|
|
6
6
|
`+i+`
|
|
7
|
-
`;ge.writeFileSync(t,n+r)}function
|
|
8
|
-
`,"utf-8"),await dt(ce(e.targetDir,"src"),{recursive:!0}),await dt(ce(e.targetDir,"releaseNotes"),{recursive:!0}),ye(e.targetDir)}import{jsx as T,jsxs as A}from"react/jsx-runtime";var de=["name","apiName","externalLink","description","developerBusinessId"],$t={name:"Name",apiName:"API name",externalLink:"External link",description:"Description",developerBusinessId:"Business ID"},zt=["name","apiName"];function sn(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")}var he=({text:e})=>T(B,{dimColor:!0,children:e});function an(e){return{name:"",apiName:"",externalLink:"",description:"",developerBusinessId:e}}var Mt=({parentDir:e,defaultBusinessId:t})=>{let i=nn(),[n,r]=Te({type:"target-select",cursor:0}),[c,S]=Te("in-place"),[y,_]=Te(()=>an(t)),[b,h]=Te(""),[g,f]=Te(e),a=Ue((C,m)=>{S(C),h(m.name),r({type:"field-entry",field:0,values:m})},[]),v=Ue(async C=>{let m=await jt(C);if(m!=="ok"){r({type:"precheck-error",targetDir:C,reason:m});return}f(C),a("in-place",y)},[y,a]),N=Ue(async C=>{try{let m=await At(e,C.apiName);f(m),r({type:"confirm",values:C})}catch(m){r({type:"error",message:m instanceof Error?m.message:String(m)})}},[e]),E=Ue(async(C,m)=>{try{await Ot({targetDir:m,name:C.name,apiName:C.apiName,externalLink:C.externalLink,description:C.description,developerBusinessId:C.developerBusinessId}),r({type:"done",targetDir:m})}catch(u){r({type:"error",message:u instanceof Error?u.message:String(u)})}},[]);if(on((C,m)=>{if(m.ctrl&&C==="c"){i.exit();return}if(n.type==="target-select"){m.upArrow?r({type:"target-select",cursor:0}):m.downArrow?r({type:"target-select",cursor:1}):m.return?n.cursor===0?v(e):a("sub-dir",y):m.escape&&i.exit();return}if(n.type==="precheck-error"){(m.return||m.escape)&&i.exit();return}if(n.type==="field-entry"){let{field:u,values:w}=n,s=de[u];if(!s)return;if(m.escape){i.exit();return}if(m.backspace||m.delete){h(o=>o.slice(0,-1));return}if(m.upArrow&&u>0){let o={...w,[s]:b},l=u-1,d=de[l];r({type:"field-entry",field:l,values:o}),_(o),h(d?o[d]:"");return}if(m.return||m.tab||m.downArrow){let o=b.trim();if(zt.includes(s)&&!o){r({type:"field-entry",field:u,values:w,fieldError:`${$t[s]} is required`});return}let d=s==="description"?b:o,p={...w,[s]:d};_(p);let F=u+1;if(F>=de.length)h(""),c==="sub-dir"?(r({type:"resolving-target"}),N(p)):r({type:"confirm",values:p});else{let k=de[F],I=k?p[k]:"",O=k==="apiName"&&!I?sn(p.name):I;r({type:"field-entry",field:F,values:p}),h(O)}return}C&&!m.ctrl&&!m.meta&&h(o=>o+C);return}if(n.type==="confirm"){if(m.escape){let u=de.length-1,w=de[u];r({type:"field-entry",field:u,values:n.values}),h(w?n.values[w]:"");return}m.return&&(r({type:"writing"}),E(n.values,g));return}(n.type==="done"||n.type==="error")&&(m.return||m.escape)&&i.exit()}),n.type==="target-select"){let C=[{label:"Use current directory",desc:e},{label:"Create new sub-directory",desc:`${e}/<inferred from API name>`}];return A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),A(M,{flexDirection:"column",gap:0,children:[T(B,{bold:!0,children:"Where should the new plugin live?"}),C.map((m,u)=>{let w=n.cursor===u;return A(M,{gap:2,children:[T(B,{...w&&{color:"cyan"},children:w?"\u276F":" "}),T(B,{bold:w,...w&&{color:"cyan"},children:m.label}),T(B,{dimColor:!0,children:m.desc})]},m.label)})]}),T(he,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(n.type==="precheck-error"){let{targetDir:C,reason:m}=n;return A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),T(B,{color:"red",bold:!0,children:"Cannot create plugin"}),A(M,{flexDirection:"column",gap:0,children:[A(B,{children:[C," already contains ",T(B,{bold:!0,children:m==="has-manifest"?"kizen.json":".kizenapp/"}),"."]}),T(B,{dimColor:!0,children:"Remove the conflicting file/directory or choose a different target to avoid overwriting an existing plugin."})]}),T(he,{text:"Enter or Esc to exit"})]})}if(n.type==="field-entry"){let{field:C,fieldError:m}=n,u=c==="sub-dir"?`Target: sub-directory of ${e} (inferred from API name)`:`Target: ${g}`;return A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),A(M,{flexDirection:"column",gap:0,children:[T(B,{bold:!0,children:"Plugin details"}),T(B,{dimColor:!0,children:u})]}),m!==void 0&&A(B,{color:"red",children:["Error: ",m]}),T(M,{flexDirection:"column",gap:0,children:de.map((w,s)=>{let o=C===s,l=o?b:y[w],d=zt.includes(w),p=`${$t[w]}${d?"":" (optional)"}`;return A(M,{gap:2,children:[T(M,{width:24,children:T(B,{bold:o,...o&&{color:"cyan"},children:p})}),T(B,{...o&&{color:"cyan"},children:">"}),T(B,{children:l}),o&&T(B,{color:"cyan",children:"\u2588"})]},w)})}),T(he,{text:"Enter/Tab/\u2193 next \xB7 \u2191 previous \xB7 Backspace delete \xB7 Esc cancel"})]})}if(n.type==="confirm"){let C=ut({targetDir:g,name:n.values.name,apiName:n.values.apiName,externalLink:n.values.externalLink,description:n.values.description,developerBusinessId:n.values.developerBusinessId});return A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),A(M,{flexDirection:"column",gap:0,children:[T(B,{bold:!0,children:"Ready to create"}),A(B,{dimColor:!0,children:["Target: ",g]})]}),A(M,{flexDirection:"column",gap:0,children:[T(B,{bold:!0,children:"kizen.json preview"}),T(B,{children:JSON.stringify(C,null,2)})]}),A(M,{flexDirection:"column",gap:0,children:[T(B,{dimColor:!0,children:"Also creates:"}),A(B,{dimColor:!0,children:[" ",pt(g,"src/")]}),A(B,{dimColor:!0,children:[" ",pt(g,"releaseNotes/")]}),A(B,{dimColor:!0,children:[" ",pt(g,".gitignore")," (adds .kizenapp/)"]})]}),T(he,{text:"Enter to create \xB7 Esc to go back"})]})}return n.type==="resolving-target"?T(M,{paddingY:1,paddingX:2,children:T(B,{dimColor:!0,children:"Finding available sub-directory\u2026"})}):n.type==="writing"?T(M,{paddingY:1,paddingX:2,children:T(B,{dimColor:!0,children:"Creating plugin\u2026"})}):n.type==="done"?A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),A(B,{color:"green",bold:!0,children:["Plugin created at ",n.targetDir]}),A(M,{flexDirection:"column",gap:0,children:[T(B,{dimColor:!0,children:"Next steps:"}),A(B,{children:[" ","cd ",n.targetDir]}),A(B,{children:[" ","appbuilder dev"]})]}),T(he,{text:"Enter or Esc to exit"})]}):A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),T(B,{color:"red",bold:!0,children:"Failed to create plugin"}),T(B,{children:n.message}),T(he,{text:"Enter or Esc to exit"})]})};import{mkdir as Ht,readFile as ln,readdir as cn,writeFile as qt}from"fs/promises";import{homedir as dn}from"os";import{dirname as un,join as Ve}from"path";var Z=["go","fmo","staging","integration","test1"],_e=Ve(dn(),".kizenappbuilder"),xe=Ve(_e,"credentials.json"),re="credentials";function pn(e){return Z.includes(e)}function fn(e){if(typeof e!="object"||e===null)throw new Error("Credentials must be a JSON object");let t=e,i=t.environment;return{apiKey:typeof t.apiKey=="string"?t.apiKey:"",userId:typeof t.userId=="string"?t.userId:"",businessId:typeof t.businessId=="string"?t.businessId:"",environment:pn(i)?i:"go"}}async function Je(e){let t=await ln(e,"utf-8");return fn(JSON.parse(t))}async function Y(){try{return await Je(xe)}catch{return null}}async function mn(e){await Ht(un(xe),{recursive:!0,mode:448}),await qt(xe,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384})}function Ut(e){return Ve(_e,`${e}.json`)}async function Ee(){let e=[{name:re,path:xe,isDefault:!0}];try{let t=await cn(_e);for(let i of t){if(!i.endsWith(".json"))continue;let n=i.slice(0,-5);n!==re&&e.push({name:n,path:Ve(_e,i),isDefault:!1})}}catch{}return e}async function Vt(e,t){if(e===re){await mn(t);return}await Ht(_e,{recursive:!0,mode:448}),await qt(Ut(e),JSON.stringify(t,null,2),{encoding:"utf-8",mode:384})}async function be(e){try{return await Je(Ut(e))}catch{return null}}function Jt(e){e.command("create").description("Scaffold a new Kizen plugin project").action(async()=>{let t=process.cwd(),n=(await Y())?.businessId??"",{waitUntilExit:r}=yn(gn(Mt,{parentDir:t,defaultBusinessId:n}),{exitOnCtrlC:!1});await r()})}import{createElement as gr}from"react";import{render as yr}from"ink";import{useCallback as ve,useEffect as et,useRef as Q,useState as W}from"react";import{Box as q,Text as R,useInput as co}from"ink";import{watch as uo}from"fs";import{createServer as po}from"http";import{join as pr}from"path";import{WebSocketServer as fo}from"ws";import{createReadStream as er,realpathSync as Rn}from"fs";import{access as Nn,readdir as Ln,readFile as Fn,realpath as jn,stat as tr}from"fs/promises";import{dirname as An,extname as rr,join as De,resolve as On,sep as bt}from"path";import{fileURLToPath as $n}from"url";var hn=new Set(["set-cookie","strict-transport-security","content-security-policy","content-security-policy-report-only","x-frame-options","content-encoding","content-length"]);function ft(e){let t={};for(let[i,n]of Object.entries(e)){let r=i.toLowerCase();hn.has(r)||r.startsWith("access-control-")||(t[i]=n)}return t}var mt=10*1024*1024,xn=6e4,bn=200,ke=class extends Error{bytesRead;limit;constructor(t,i){super(`Upstream response exceeded ${String(i)} bytes (read ${String(t)}).`),this.name="ProxyResponseTooLargeError",this.bytesRead=t,this.limit=i}};async function gt(e,t){let i=e.body;if(i===null)return Buffer.alloc(0);let n=[],r=0;for await(let c of i){if(r+=c.length,r>t)throw new ke(r,t);n.push(c)}return Buffer.concat(n)}function Wt(e={}){let t=new Map,{onChange:i}=e,n=()=>{i?.(t.size)},r=c=>{t.delete(c)&&n()};return{get(c,S){let y=t.get(c);if(y!==void 0){if(Date.now()-y.insertedAt<xn)return y.promise.then(b=>({response:b,fromCache:!0}));r(c)}if(t.size>=bn){let b=t.keys().next().value;b!==void 0&&r(b)}let _=S().then(async b=>{let h=ft(Object.fromEntries(b.headers)),g=await gt(b,mt);return{status:b.status,headers:h,body:g}}).catch(b=>{throw r(c),b});return t.set(c,{insertedAt:Date.now(),promise:_}),n(),_.then(b=>((b.status<200||b.status>=300)&&r(c),{response:b,fromCache:!1}))},clear(){t.clear(),n()}}}var yt={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".mjs":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".png":"image/png",".jpg":"image/jpeg",".svg":"image/svg+xml",".ico":"image/x-icon",".json":"application/json; charset=utf-8",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".map":"application/json"};import{mkdir as vn,readFile as Cn,writeFile as wn}from"fs/promises";import{join as Kt}from"path";async function Ie(e){try{let t=await Cn(Kt(e,"config.json"),"utf-8");return JSON.parse(t)}catch{return{}}}async function ue(e,t){await vn(e,{recursive:!0}),await wn(Kt(e,"config.json"),JSON.stringify(t,null,2),"utf-8")}import{spawn as Yt}from"child_process";import{writeFile as Gt,rm as Zt,mkdtemp as Sn,access as Pn}from"fs/promises";import{join as Be}from"path";import{tmpdir as Tn}from"os";var _n=`
|
|
7
|
+
`;ge.writeFileSync(t,n+r)}function At(e){e.command("build").description("Bundle the plugin app into .kizenapp directory").action(async()=>{let t=process.cwd(),i=`${t}/.kizenapp`;ye(t);let{waitUntilExit:n}=rn(tn(jt,{outputDir:i,pluginDir:t}));await n()})}import{createElement as hn}from"react";import{render as xn}from"ink";import{useCallback as qe,useState as Te}from"react";import{Box as M,Text as I,useApp as sn,useInput as an}from"ink";import{join as ft}from"path";import{access as nn,mkdir as ut,writeFile as on}from"fs/promises";import{join as de}from"path";async function Ue(e){try{return await nn(e),!0}catch{return!1}}async function Ot(e){return await Ue(de(e,"kizen.json"))?"has-manifest":await Ue(de(e,".kizenapp"))?"has-kizenapp":"ok"}async function $t(e,t){let i=de(e,t);if(!await Ue(i))return i;for(let n=1;n<1e3;n++){let r=de(e,`${t}-${String(n)}`);if(!await Ue(r))return r}throw new Error(`Could not find an available directory name for "${t}"`)}function pt(e){return{name:e.name,version:"1.0.0",published:!0,api_name:e.apiName,external_link:e.externalLink,description:e.description,entry:"src/",engine:"1.0.0",release_notes_directory:"releaseNotes/",release_environments:["prod"],config_template:{},base_config:{},developer_business_id:e.developerBusinessId}}async function zt(e){await ut(e.targetDir,{recursive:!0});let t=pt(e);await on(de(e.targetDir,"kizen.json"),JSON.stringify(t,null,2)+`
|
|
8
|
+
`,"utf-8"),await ut(de(e.targetDir,"src"),{recursive:!0}),await ut(de(e.targetDir,"releaseNotes"),{recursive:!0}),ye(e.targetDir)}import{jsx as T,jsxs as A}from"react/jsx-runtime";var ue=["name","apiName","externalLink","description","developerBusinessId"],Mt={name:"Name",apiName:"API name",externalLink:"External link",description:"Description",developerBusinessId:"Business ID"},Ht=["name","apiName"];function ln(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")}var he=({text:e})=>T(I,{dimColor:!0,children:e});function cn(e){return{name:"",apiName:"",externalLink:"",description:"",developerBusinessId:e}}var Ut=({parentDir:e,defaultBusinessId:t})=>{let i=sn(),[n,r]=Te({type:"target-select",cursor:0}),[c,S]=Te("in-place"),[g,_]=Te(()=>cn(t)),[v,h]=Te(""),[y,m]=Te(e),l=qe((C,f)=>{S(C),h(f.name),r({type:"field-entry",field:0,values:f})},[]),x=qe(async C=>{let f=await Ot(C);if(f!=="ok"){r({type:"precheck-error",targetDir:C,reason:f});return}m(C),l("in-place",g)},[g,l]),E=qe(async C=>{try{let f=await $t(e,C.apiName);m(f),r({type:"confirm",values:C})}catch(f){r({type:"error",message:f instanceof Error?f.message:String(f)})}},[e]),R=qe(async(C,f)=>{try{await zt({targetDir:f,name:C.name,apiName:C.apiName,externalLink:C.externalLink,description:C.description,developerBusinessId:C.developerBusinessId}),r({type:"done",targetDir:f})}catch(u){r({type:"error",message:u instanceof Error?u.message:String(u)})}},[]);if(an((C,f)=>{if(f.ctrl&&C==="c"){i.exit();return}if(n.type==="target-select"){f.upArrow?r({type:"target-select",cursor:0}):f.downArrow?r({type:"target-select",cursor:1}):f.return?n.cursor===0?x(e):l("sub-dir",g):f.escape&&i.exit();return}if(n.type==="precheck-error"){(f.return||f.escape)&&i.exit();return}if(n.type==="field-entry"){let{field:u,values:w}=n,s=ue[u];if(!s)return;if(f.escape){i.exit();return}if(f.backspace||f.delete){h(o=>o.slice(0,-1));return}if(f.upArrow&&u>0){let o={...w,[s]:v},a=u-1,d=ue[a];r({type:"field-entry",field:a,values:o}),_(o),h(d?o[d]:"");return}if(f.return||f.tab||f.downArrow){let o=v.trim();if(Ht.includes(s)&&!o){r({type:"field-entry",field:u,values:w,fieldError:`${Mt[s]} is required`});return}let d=s==="description"?v:o,p={...w,[s]:d};_(p);let j=u+1;if(j>=ue.length)h(""),c==="sub-dir"?(r({type:"resolving-target"}),E(p)):r({type:"confirm",values:p});else{let k=ue[j],N=k?p[k]:"",O=k==="apiName"&&!N?ln(p.name):N;r({type:"field-entry",field:j,values:p}),h(O)}return}C&&!f.ctrl&&!f.meta&&h(o=>o+C);return}if(n.type==="confirm"){if(f.escape){let u=ue.length-1,w=ue[u];r({type:"field-entry",field:u,values:n.values}),h(w?n.values[w]:"");return}f.return&&(r({type:"writing"}),R(n.values,y));return}(n.type==="done"||n.type==="error")&&(f.return||f.escape)&&i.exit()}),n.type==="target-select"){let C=[{label:"Use current directory",desc:e},{label:"Create new sub-directory",desc:`${e}/<inferred from API name>`}];return A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),A(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Where should the new plugin live?"}),C.map((f,u)=>{let w=n.cursor===u;return A(M,{gap:2,children:[T(I,{...w&&{color:"cyan"},children:w?"\u276F":" "}),T(I,{bold:w,...w&&{color:"cyan"},children:f.label}),T(I,{dimColor:!0,children:f.desc})]},f.label)})]}),T(he,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(n.type==="precheck-error"){let{targetDir:C,reason:f}=n;return A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),T(I,{color:"red",bold:!0,children:"Cannot create plugin"}),A(M,{flexDirection:"column",gap:0,children:[A(I,{children:[C," already contains ",T(I,{bold:!0,children:f==="has-manifest"?"kizen.json":".kizenapp/"}),"."]}),T(I,{dimColor:!0,children:"Remove the conflicting file/directory or choose a different target to avoid overwriting an existing plugin."})]}),T(he,{text:"Enter or Esc to exit"})]})}if(n.type==="field-entry"){let{field:C,fieldError:f}=n,u=c==="sub-dir"?`Target: sub-directory of ${e} (inferred from API name)`:`Target: ${y}`;return A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),A(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Plugin details"}),T(I,{dimColor:!0,children:u})]}),f!==void 0&&A(I,{color:"red",children:["Error: ",f]}),T(M,{flexDirection:"column",gap:0,children:ue.map((w,s)=>{let o=C===s,a=o?v:g[w],d=Ht.includes(w),p=`${Mt[w]}${d?"":" (optional)"}`;return A(M,{gap:2,children:[T(M,{width:24,children:T(I,{bold:o,...o&&{color:"cyan"},children:p})}),T(I,{...o&&{color:"cyan"},children:">"}),T(I,{children:a}),o&&T(I,{color:"cyan",children:"\u2588"})]},w)})}),T(he,{text:"Enter/Tab/\u2193 next \xB7 \u2191 previous \xB7 Backspace delete \xB7 Esc cancel"})]})}if(n.type==="confirm"){let C=pt({targetDir:y,name:n.values.name,apiName:n.values.apiName,externalLink:n.values.externalLink,description:n.values.description,developerBusinessId:n.values.developerBusinessId});return A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),A(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Ready to create"}),A(I,{dimColor:!0,children:["Target: ",y]})]}),A(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"kizen.json preview"}),T(I,{children:JSON.stringify(C,null,2)})]}),A(M,{flexDirection:"column",gap:0,children:[T(I,{dimColor:!0,children:"Also creates:"}),A(I,{dimColor:!0,children:[" ",ft(y,"src/")]}),A(I,{dimColor:!0,children:[" ",ft(y,"releaseNotes/")]}),A(I,{dimColor:!0,children:[" ",ft(y,".gitignore")," (adds .kizenapp/)"]})]}),T(he,{text:"Enter to create \xB7 Esc to go back"})]})}return n.type==="resolving-target"?T(M,{paddingY:1,paddingX:2,children:T(I,{dimColor:!0,children:"Finding available sub-directory\u2026"})}):n.type==="writing"?T(M,{paddingY:1,paddingX:2,children:T(I,{dimColor:!0,children:"Creating plugin\u2026"})}):n.type==="done"?A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),A(I,{color:"green",bold:!0,children:["Plugin created at ",n.targetDir]}),A(M,{flexDirection:"column",gap:0,children:[T(I,{dimColor:!0,children:"Next steps:"}),A(I,{children:[" ","cd ",n.targetDir]}),A(I,{children:[" ","appbuilder dev"]})]}),T(he,{text:"Enter or Esc to exit"})]}):A(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),T(I,{color:"red",bold:!0,children:"Failed to create plugin"}),T(I,{children:n.message}),T(he,{text:"Enter or Esc to exit"})]})};import{mkdir as qt,readFile as dn,readdir as un,writeFile as Vt}from"fs/promises";import{homedir as pn}from"os";import{dirname as fn,join as Ve}from"path";var G=["go","fmo","staging","integration","test1"];var _e=Ve(pn(),".kizenappbuilder"),xe=Ve(_e,"credentials.json"),re="credentials";function mn(e){return G.includes(e)}function gn(e){if(typeof e!="object"||e===null)throw new Error("Credentials must be a JSON object");let t=e,i=t.environment;return{apiKey:typeof t.apiKey=="string"?t.apiKey:"",userId:typeof t.userId=="string"?t.userId:"",businessId:typeof t.businessId=="string"?t.businessId:"",environment:mn(i)?i:"go"}}async function Je(e){let t=await dn(e,"utf-8");return gn(JSON.parse(t))}async function Y(){try{return await Je(xe)}catch{return null}}async function yn(e){await qt(fn(xe),{recursive:!0,mode:448}),await Vt(xe,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384})}function Jt(e){return Ve(_e,`${e}.json`)}async function Ee(){let e=[{name:re,path:xe,isDefault:!0}];try{let t=await un(_e);for(let i of t){if(!i.endsWith(".json"))continue;let n=i.slice(0,-5);n!==re&&e.push({name:n,path:Ve(_e,i),isDefault:!1})}}catch{}return e}async function Wt(e,t){if(e===re){await yn(t);return}await qt(_e,{recursive:!0,mode:448}),await Vt(Jt(e),JSON.stringify(t,null,2),{encoding:"utf-8",mode:384})}async function be(e){try{return await Je(Jt(e))}catch{return null}}function Kt(e){e.command("create").description("Scaffold a new Kizen plugin project").action(async()=>{let t=process.cwd(),n=(await Y())?.businessId??"",{waitUntilExit:r}=xn(hn(Ut,{parentDir:t,defaultBusinessId:n}),{exitOnCtrlC:!1});await r()})}import{createElement as hr}from"react";import{render as xr}from"ink";import{useCallback as ve,useEffect as et,useRef as Z,useState as J}from"react";import{Box as q,Text as D,useInput as uo}from"ink";import{watch as po}from"fs";import{createServer as fo}from"http";import{join as mr}from"path";import{WebSocketServer as mo}from"ws";import{createReadStream as nr,realpathSync as Ln}from"fs";import{access as jn,readdir as Fn,readFile as An,realpath as On,stat as or}from"fs/promises";import{dirname as $n,extname as ir,join as De,resolve as zn,sep as Ct}from"path";import{fileURLToPath as Mn}from"url";var bn=new Set(["set-cookie","strict-transport-security","content-security-policy","content-security-policy-report-only","x-frame-options","content-encoding","content-length"]);function mt(e){let t={};for(let[i,n]of Object.entries(e)){let r=i.toLowerCase();bn.has(r)||r.startsWith("access-control-")||(t[i]=n)}return t}var gt=10*1024*1024,vn=6e4,Cn=200,ke=class extends Error{bytesRead;limit;constructor(t,i){super(`Upstream response exceeded ${String(i)} bytes (read ${String(t)}).`),this.name="ProxyResponseTooLargeError",this.bytesRead=t,this.limit=i}};async function yt(e,t){let i=e.body;if(i===null)return Buffer.alloc(0);let n=[],r=0;for await(let c of i){if(r+=c.length,r>t)throw new ke(r,t);n.push(c)}return Buffer.concat(n)}function Gt(e={}){let t=new Map,{onChange:i}=e,n=()=>{i?.(t.size)},r=c=>{t.delete(c)&&n()};return{get(c,S){let g=t.get(c);if(g!==void 0){if(Date.now()-g.insertedAt<vn)return g.promise.then(v=>({response:v,fromCache:!0}));r(c)}if(t.size>=Cn){let v=t.keys().next().value;v!==void 0&&r(v)}let _=S().then(async v=>{let h=mt(Object.fromEntries(v.headers)),y=await yt(v,gt);return{status:v.status,headers:h,body:y}}).catch(v=>{throw r(c),v});return t.set(c,{insertedAt:Date.now(),promise:_}),n(),_.then(v=>((v.status<200||v.status>=300)&&r(c),{response:v,fromCache:!1}))},clear(){t.clear(),n()}}}var ht={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".mjs":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".png":"image/png",".jpg":"image/jpeg",".svg":"image/svg+xml",".ico":"image/x-icon",".json":"application/json; charset=utf-8",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".map":"application/json"};import{mkdir as wn,readFile as Sn,writeFile as Pn}from"fs/promises";import{join as Xt}from"path";async function Ie(e){try{let t=await Sn(Xt(e,"config.json"),"utf-8");return JSON.parse(t)}catch{return{}}}async function pe(e,t){await wn(e,{recursive:!0}),await Pn(Xt(e,"config.json"),JSON.stringify(t,null,2),"utf-8")}import{spawn as Qt}from"child_process";import{writeFile as Yt,rm as er,mkdtemp as Tn,access as _n}from"fs/promises";import{join as Be}from"path";import{tmpdir as En}from"os";var kn=`
|
|
9
9
|
import sys, json, os, traceback
|
|
10
10
|
|
|
11
11
|
# --- Inputs proxy (attribute access) ---
|
|
@@ -165,10 +165,10 @@ sys.stdout.write('\\n__KIZEN_RESULT_START__\\n')
|
|
|
165
165
|
sys.stdout.write(json.dumps(result, ensure_ascii=False))
|
|
166
166
|
sys.stdout.write('\\n__KIZEN_RESULT_END__\\n')
|
|
167
167
|
sys.stdout.flush()
|
|
168
|
-
`.trim(),
|
|
169
|
-
`);for(;
|
|
170
|
-
`)}}),_.on("end",()=>{if(
|
|
171
|
-
`).trim(),h=b.length>0?`: ${b}`:"";r(new Error(`${e} exited with code ${String(_)}${h}`))}})})}var xt=new Set;function Ke(e){for(let t of xt)t(e)}function Bn(e,t){return t&&xt.add(t),We||(We=(async()=>{let i=Be(ht,"bin","python");try{await Pn(i)}catch{let n=In(e);await Xt(n,["-m","venv",ht])}Ke({kind:"start"});try{await Xt(i,["-m","pip","install","--disable-pip-version-check",...kn],(n,r)=>{Ke({kind:"log",line:n,stream:r})}),Ke({kind:"complete"})}catch(n){let r=n instanceof Error?n.message:String(n);throw Ke({kind:"error",message:r}),We=null,await Zt(ht,{recursive:!0,force:!0}).catch(()=>{}),n}finally{xt.clear()}return i})()),We}function Dn(e){let t="__KIZEN_RESULT_START__",i="__KIZEN_RESULT_END__",n=e.indexOf(t),r=e.indexOf(i);if(n===-1||r===-1)return{userStdout:e,result:null};let c=e.slice(0,n).trimEnd(),S=e.slice(n+t.length,r).trim();try{let y=JSON.parse(S);return{userStdout:c,result:y}}catch{return{userStdout:e,result:null}}}async function Qt(e){let t=e.timeout??En,i=await Bn(e.scriptRuntime,e.onInstallProgress),n=Date.now(),r;try{r=await Sn(Be(Tn(),"kizen-step-"));let c=Be(r,"wrapper.py"),S=Be(r,"script.py");await Promise.all([Gt(c,_n,"utf-8"),Gt(S,e.script,"utf-8")]);let y={...process.env,__KIZEN_INPUTS__:JSON.stringify(e.inputs),__KIZEN_SECRETS__:JSON.stringify(e.secrets),__KIZEN_SCRIPT_PATH__:S},{exitCode:_,stdout:b,stderr:h}=await new Promise(N=>{let E=[],C=[],m=!1,u=Yt(i,[c],{env:y,cwd:r,stdio:["ignore","pipe","pipe"]}),w=setTimeout(()=>{u.kill("SIGKILL")},t);u.stdout.on("data",o=>{E.push(o)}),u.stderr.on("data",o=>{C.push(o)});let s=o=>{m||(m=!0,clearTimeout(w),N({exitCode:o??1,stdout:Buffer.concat(E).toString("utf-8"),stderr:Buffer.concat(C).toString("utf-8")}))};u.on("close",s),u.on("error",o=>{m||(m=!0,clearTimeout(w),N({exitCode:1,stdout:"",stderr:o.message}))})}),g=Date.now()-n,{userStdout:f,result:a}=Dn(b);if(a){let N={success:a.success,outputValues:a.outputValues,logs:a.logs,stdout:f,stderr:h,exitCode:_,durationMs:g};return a.error!==null&&(N.error=a.error),a.httpRequests&&(N.httpRequests=a.httpRequests),N}let v={success:!1,outputValues:{},logs:[],stdout:f,stderr:h,exitCode:_,durationMs:g};return _!==0&&(v.error=`Process exited with code ${String(_)}`),v}finally{r&&Zt(r,{recursive:!0,force:!0})}}var zn=2*1024*1024,Mn=new Set([".DS_Store",".gitignore"]),Hn=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".mdx",".yml",".yaml",".toml",".css",".scss",".html",".htm",".xml",".svg",".txt",".sh",".py",".env",".gitignore",".prettierrc",".eslintrc"]);function qn(e){if(e===void 0||e==="")return!1;let t=e.startsWith("[")?e.slice(0,e.indexOf("]")+1):e.split(":")[0]??"";return t==="localhost"||t==="127.0.0.1"||t==="[::1]"}var Un=["kizen.com","kizen.dev"];function Vn(e){let t;try{t=new URL(e)}catch{return!1}if(t.protocol!=="https:")return!1;let i=t.hostname.toLowerCase();return Un.some(n=>i===n||i.endsWith("."+n))}function Jn(e){if(e===void 0||e==="")return!1;try{let{hostname:t}=new URL(e);return t==="localhost"||t==="127.0.0.1"||t==="::1"}catch{return!1}}async function nr(e,t){if(t.includes("\0"))return null;let i=t.replace(/^\/+/,""),n=On(e,i);if(n!==e&&!n.startsWith(e+bt))return null;try{let r=await jn(n);return r!==e&&!r.startsWith(e+bt)?null:r}catch{return null}}function or(e,t){let i=t===e?"":t.slice(e.length+1);return i===""?!1:i.split(bt).some(r=>$e.has(r))}function ir(e){if(e.kind==="info")return e.message;let t=e.fromCache?" [cache]":"";return`${e.method} ${e.url} \u2192 ${String(e.status)}${t}`}function sr(){let e=$n(import.meta.url);return De(An(e),"viewer")}async function vt(e){try{return await Nn(e),!0}catch{return!1}}function ar(e,t,i,n,r,c,S,y,_,b){let h=Wt({onChange:y}),g=Rn(b);return(f,a)=>{(async()=>{let v=f.url??"/";try{if(!qn(f.headers.host)){a.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Forbidden"}));return}if((f.method==="POST"||f.method==="PATCH"||f.method==="DELETE")&&!Jn(f.headers.origin)){a.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Forbidden"}));return}if(t(`Received request: ${v}`),v==="/api/credentials"){a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end(n.current!==null?JSON.stringify(n.current):"{}");return}if(v==="/api/credential-profiles"&&f.method==="GET"){let s=await Ee();a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({profiles:s,active:r.current}));return}if(v==="/api/credentials/switch"&&f.method==="POST"){let s=[];for await(let p of f)s.push(p);let l=JSON.parse(Buffer.concat(s).toString("utf-8")||"{}").profile,d=l===void 0||l===""?await Y():await be(l);if(d!==null){n.current=d,r.current=l??void 0;let p=r.current;await ue(c,{credentialMode:"global",...p!==void 0&&{activeCredentialProfile:p}}),S({type:"credentials-updated",credentials:d})}a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({ok:d!==null}));return}if(v==="/api/bundle"){let s=De(process.cwd(),".kizenapp","bundle.json");try{let o=await Fn(s,"utf-8");a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end(o)}catch{a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end("{}")}return}if(v==="/api/last-path"&&f.method==="POST"){let s=[];for await(let l of f)s.push(l);let o=JSON.parse(Buffer.concat(s).toString("utf-8")||"{}");if(typeof o.path=="string"){_.current=o.path;let l=await Ie(c);await ue(c,{...l,lastPath:o.path})}a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end('{"ok":true}');return}if(v==="/api/execute-step"&&f.method==="POST"){let s=[];for await(let p of f)s.push(p);let o=JSON.parse(Buffer.concat(s).toString("utf-8")||"{}");if(typeof o.script!="string"){a.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Missing required field: script"}));return}let l={script:o.script,scriptRuntime:o.scriptRuntime??"python-3.9",inputs:o.inputs??{},secrets:o.secrets??{},onInstallProgress:p=>{p.kind==="start"?S({type:"venv-install-start"}):p.kind==="log"?S({type:"venv-install-log",line:p.line,stream:p.stream}):p.kind==="complete"?S({type:"venv-install-complete"}):S({type:"venv-install-error",message:p.message})}};typeof o.timeout=="number"&&o.timeout>0&&(l.timeout=Math.min(o.timeout,300*1e3));let d=await Qt(l);a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify(d));return}if(v==="/api/proxy-cache/clear"){h.clear(),i({kind:"info",message:"Proxy cache cleared"}),a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end('{"ok":true}');return}if(v.startsWith("/api/proxy")){let s=f.headers["x-proxy-target"];if(typeof s!="string"){a.writeHead(400),a.end("Missing x-proxy-target header");return}if(!Vn(s)){a.writeHead(400),a.end("Invalid proxy target");return}let o=v.slice(10)||"/",l=`${s}${o}`,d=f.method??"GET",p=[];for await(let pe of f)p.push(pe);let{host:F,"x-proxy-target":k,...I}=f.headers;if(d==="GET"){let pe=`GET::${l}`,{response:fe,fromCache:Ce}=await h.get(pe,()=>fetch(l,{method:"GET",headers:I}));i({kind:"request",method:"GET",status:fe.status,fromCache:Ce,url:o}),a.writeHead(fe.status,fe.headers),a.end(fe.body);return}let O=p.length>0?Buffer.concat(p):void 0,U=O&&O.length>0?O:void 0,J=await fetch(l,{method:d,headers:I,...U!==void 0&&{body:U}}),G=ft(Object.fromEntries(J.headers)),tt=await gt(J,mt);i({kind:"request",method:d,status:J.status,fromCache:!1,url:o}),a.writeHead(J.status,G),a.end(tt);return}if(v.startsWith("/api/source/tree")&&f.method==="GET"){let o=new URL(v,"http://localhost").searchParams.get("path")??"",l=await nr(g,o);if(l===null){a.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Invalid path"}));return}if(or(g,l)){a.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Path is excluded"}));return}try{let d=await Ln(l,{withFileTypes:!0}),p=await Promise.all(d.filter(k=>k.isDirectory()?!$e.has(k.name):k.isFile()?!Mn.has(k.name):!1).map(async k=>{let I=k.isDirectory()?"dir":"file",O={name:k.name,kind:I};if(I==="file")try{let U=await tr(De(l,k.name));O.size=U.size}catch{}return O}));p.sort((k,I)=>k.kind!==I.kind?k.kind==="dir"?-1:1:k.name.localeCompare(I.name));let F=l===g?"":l.slice(g.length+1);a.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({path:F,entries:p}))}catch(d){let p=d instanceof Error?d.message:String(d);t(`source/tree failed (${o}): ${p}`),a.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Not found"}))}return}if(v.startsWith("/api/source/file")&&f.method==="GET"){let o=new URL(v,"http://localhost").searchParams.get("path")??"";if(o===""){a.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Missing path"}));return}let l=await nr(g,o);if(l===null){a.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Invalid path"}));return}if(or(g,l)){a.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Path is excluded"}));return}try{let d=await tr(l);if(!d.isFile()){a.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Not a file"}));return}if(d.size>zn){a.writeHead(413,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"File too large",size:d.size}));return}let p=rr(l).toLowerCase(),F=yt[p],k=Hn.has(p),I=F??(k?"text/plain; charset=utf-8":"application/octet-stream");a.writeHead(200,{"Content-Type":I,"Content-Length":String(d.size)}),er(l).pipe(a)}catch(d){let p=d instanceof Error?d.message:String(d);t(`source/file failed (${o}): ${p}`),a.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),a.end(JSON.stringify({error:"Not found"}))}return}let C=De(e,v==="/"?"/index.html":v),m=await vt(C)?C:De(e,"index.html"),u=rr(m),w=yt[u]??"application/octet-stream";a.writeHead(200,{"Content-Type":w}),er(m).pipe(a)}catch(N){if(v.startsWith("/api/proxy")){let E=v.slice(10)||"/",C=f.method??"GET";N instanceof ke?i({kind:"info",message:`${C} ${E} \u2192 502 (response exceeded ${String(N.limit)} bytes)`}):i({kind:"request",method:C,status:502,fromCache:!1,url:E})}else i({kind:"info",message:`Error handling ${v}: ${N instanceof Error?N.message:String(N)}`});a.headersSent||(a.writeHead(502),a.end("Bad Gateway"))}})()}}import{launch as Wn}from"chrome-launcher";import{createRequire as Kn}from"module";import{mkdirSync as Gn}from"fs";import{readFile as Xn}from"fs/promises";import{dirname as Yn,join as Zn}from"path";import{fileURLToPath as Qn}from"url";var lr=Kn(import.meta.url)("chrome-remote-interface"),eo=new Set(["content-security-policy","content-security-policy-report-only","x-frame-options"]),dr=["kizen.dev","kizen.com"];function cr(e){try{let{hostname:t}=new URL(e);return dr.some(i=>t===i||t.endsWith("."+i))}catch{return!1}}function Ge(e){if(e.type==="number")return Number(e.value);if(e.type==="boolean")return e.value==="true";if(e.type!=="undefined"){if(e.type==="object"&&e.value==="null")return null;if(e.type==="object"&&e.valuePreview){let{valuePreview:t}=e;if(t.subtype==="array")return t.properties.filter(n=>/^\d+$/.test(n.name)).sort((n,r)=>parseInt(n.name)-parseInt(r.name)).map(Ge);let i={};for(let n of t.properties)i[n.name]=Ge(n);return i}return e.value??`[${e.type}]`}}function to(e){if(e.value!==void 0)return e.value;if(e.preview){let{preview:t}=e;if(t.subtype==="array")return t.properties.filter(n=>/^\d+$/.test(n.name)).sort((n,r)=>parseInt(n.name)-parseInt(r.name)).map(Ge);let i={};for(let n of t.properties)i[n.name]=Ge(n);return i}return e.description??`[${e.type}]`}async function ro(e,t){if(t.type==="object"&&t.objectId)try{let n=(await e.Runtime.callFunctionOn({objectId:t.objectId,functionDeclaration:'function() { const seen = new WeakSet(); return JSON.stringify(this, function(k,v) { if (typeof v === "object" && v !== null) { if (seen.has(v)) return "[Circular]"; seen.add(v); } return v; }); }',returnByValue:!0})).result.value;if(typeof n=="string")return JSON.parse(n)}catch{}return to(t)}async function no(e){try{let t=Zn(Yn(Qn(import.meta.url)),"viewer","icon.png"),i=await Xn(t);await e.Browser.setDockTile({image:i.toString("base64")})}catch{}}async function ur(e){Gn(e.userDataDir,{recursive:!0});let t=`http://localhost:${String(e.port)}`,i=await Wn({startingUrl:t,chromeFlags:[`--app=${t}`,"--no-first-run","--no-default-browser-check","--disable-extensions"],userDataDir:e.userDataDir,handleSIGINT:!1,logLevel:"silent"}),n=i.port,r=null,c=null,S=null,y=null,_=0,b=!1,h=u=>{e.debugLog?.(u)},g=u=>{e.verbose&&e.debugLog?.(u)},f=()=>{c!==null&&(clearInterval(c),c=null)},a=u=>u==="chrome://new-tab-page/"||u==="chrome://newtab/",v=async u=>{f(),S=null,await no(u),await u.Fetch.enable({patterns:dr.flatMap(s=>[{urlPattern:`*://${s}/*`,requestStage:"Response"},{urlPattern:`*://*.${s}/*`,requestStage:"Response"}])}),u.on("Fetch.requestPaused",s=>{(async()=>{let o=s,{requestId:l,request:d,responseHeaders:p,responseStatusCode:F}=o,k=d.url;g(`Fetch ${String(F??"?")} ${k}`);let I=[],O=!1;for(let U of p??[])if(!eo.has(U.name.toLowerCase()))if(U.name.toLowerCase()==="set-cookie"&&cr(k)){let J=U.value.split(`
|
|
172
|
-
`).map(
|
|
173
|
-
`);I.push({name:U.name,value:J}),O=!0}else I.push(U);O&&g(` rewrote Set-Cookie SameSite on ${k}`);try{let{body:U,base64Encoded:J}=await u.Fetch.getResponseBody({requestId:l});await u.Fetch.fulfillRequest({requestId:l,responseCode:F??200,responseHeaders:I,body:U,...J&&{base64Encoded:!0}})}catch(U){g(` fulfillRequest failed (${U.message}), falling through`);try{await u.Fetch.continueRequest({requestId:l})}catch(J){g(` continueRequest also failed (${J.message})`)}}})()}),c=setInterval(()=>{(async()=>{try{let{cookies:s}=await u.Network.getAllCookies(),o=0;for(let l of s){if(!cr(`https://${l.domain??""}`)||l.sameSite==="None")continue;let d=l.domain??"",p=d.startsWith(".")?d.slice(1):d;await u.Network.setCookie({url:`https://${p}`,name:l.name,value:l.value,domain:d,path:l.path??"/",secure:!0,...l.httpOnly!==void 0&&{httpOnly:l.httpOnly},...l.expirationDate!==void 0&&{expires:l.expirationDate},sameSite:"None"}),o++}o>0&&g(`cookie-patch cycle: updated ${String(o)} cookie(s) to SameSite=None`)}catch(s){g(`cookie-patch cycle failed: ${s.message}`)}})()},2e3),await u.send("Runtime.enable",{generatePreview:!0}),u.on("Target.attachedToTarget",s=>{let o=s,{sessionId:l,targetInfo:d}=o;g(`attached session ${l} (${d.type} ${d.url})`),u.send("Runtime.enable",{generatePreview:!0},l).catch(p=>{g(` Runtime.enable on session ${l} failed: ${p.message}`)})}),await u.Target.setAutoAttach({autoAttach:!0,waitForDebuggerOnStart:!1,flatten:!0}),await u.Target.setDiscoverTargets({discover:!0});let w=s=>{if(s.type==="page"){if(a(s.url)){h(`closed stray new-tab-page target ${s.targetId}`),S!==null&&u.Target.activateTarget({targetId:S}).catch(()=>{}),u.Target.closeTarget({targetId:s.targetId}).catch(()=>{});return}S===null&&(S=s.targetId,h(`captured main target ${s.targetId} (${s.url})`))}};u.on("Target.targetCreated",s=>{let{targetInfo:o}=s;g(`target +${o.type} ${o.targetId} ${o.url}`),w(o)}),u.on("Target.targetInfoChanged",s=>{let{targetInfo:o}=s;g(`target ~${o.type} ${o.targetId} ${o.url}`),w(o)}),u.on("Runtime.consoleAPICalled",s=>{(async()=>{let{type:o,args:l}=s;if(l[0]?.type==="string"&&String(l[0].value).includes("Chrome Security"))return;let d=o==="warning"?"warn":["log","warn","error","info"].includes(o)?o:"log";g(`console.${d} (${String(l.length)} arg(s))`);let p=await Promise.all(l.map(F=>ro(u,F)));e.broadcast({type:"console-message",level:d,args:p})})().catch(o=>{g(`console serialization failed: ${o.message}`)})}),u.on("disconnect",()=>{b||r!==u||(h("CDP disconnected"),r=null,f(),N())})},N=()=>{if(b||y!==null)return;let u=Math.min(1e3*2**_,1e4),w=_+1;_++,h(`CDP reconnect scheduled in ${String(u)}ms (attempt #${String(w)})`),y=setTimeout(()=>{y=null,(async()=>{let s;try{s=await lr({port:n})}catch{h(`CDP reconnect attempt #${String(w)} failed`),N();return}if(b){try{await s.close()}catch{}return}r=s;try{await v(s),h(`CDP reconnected after ${String(w)} attempt(s)`),_=0}catch{r===s&&(r=null);try{await s.close()}catch{}h(`CDP reconnect attempt #${String(w)} failed during setup`),N()}})()},u)},E=30,C=300;for(let u=0;u<E;u++){await new Promise(w=>setTimeout(w,C)),h(`CDP connect attempt ${String(u+1)}/${String(E)}`);try{let w=await lr({port:n});r=w,e.path&&w.send("Page.navigate",{url:`${t}${e.path}`});try{await v(w),h("CDP connected")}catch{r===w&&(r=null);try{await w.close()}catch{}h("CDP setup failed after connect")}break}catch{if(u===E-1){let w=`CDP unavailable after ${String(E)} attempts \u2014 viewer running without interception (CSP/cookie rewrites disabled)`;return h(w),e.onWarn?.(w),{kill:()=>{i.kill()}}}}}return r?{kill:()=>{if(h("CDP kill requested \u2014 tearing down"),b=!0,y!==null&&(clearTimeout(y),y=null),f(),r!==null){try{r.close()}catch{}r=null}i.kill()}}:{kill:()=>{i.kill()}}}import{useCallback as oo,useState as io}from"react";function Xe(e){let[t,i]=io([]),n=oo(r=>{i(c=>[...c,`${new Date().toLocaleTimeString()}: ${r}`].slice(-e))},[e]);return[t,n]}import{useCallback as Ye,useEffect as Ct,useState as Ze}from"react";import{Box as z,Text as D,useInput as so}from"ink";import{jsx as P,jsxs as H}from"react/jsx-runtime";var ne=["apiKey","userId","businessId"],ao={apiKey:"API Key",userId:"User ID",businessId:"Business ID"},Re=({text:e})=>P(D,{dimColor:!0,children:e}),Qe=({initialMode:e,showProfileManager:t,onComplete:i,onCancel:n})=>{let[r,c]=Ze(e==="global"&&!t?{type:"loading"}:e==="global"&&t?{type:"profile-loading"}:{type:"mode-select",cursor:0}),[S,y]=Ze(""),[_,b]=Ze(null),[h,g]=Ze(void 0),f=Ye(s=>{if(s==="local"){i({mode:"local",credentials:null});return}c({type:"profile-loading"})},[i]),a=Ye(async s=>{if(s===null){c({type:"profile-loading"});let d=await Ee();c({type:"name-entry",nameBuffer:"",existingProfiles:d});return}g(s.isDefault?void 0:s.name),c({type:"loading"});let o=s.isDefault?await Y():await be(s.name),l=o?Math.max(0,Z.indexOf(o.environment)):0;c({type:"creds-entry",field:0,values:o??{},envCursor:l})},[]),v=Ye(async(s,o)=>{let l=Z[o]??"go",d={apiKey:s.apiKey??"",userId:s.userId??"",businessId:s.businessId??"",environment:l};c({type:"saving"});try{await Vt(h??re,d),i({mode:"global",credentials:d,...h!==void 0&&{profileName:h}})}catch(p){b(p instanceof Error?p.message:String(p)),c({type:"creds-entry",field:0,values:s,envCursor:o})}},[i,h]);so((s,o)=>{if(o.ctrl&&s==="c"&&process.exit(0),o.escape){if((r.type==="creds-entry"||r.type==="name-entry")&&e==="global"&&t){c({type:"profile-loading"}),N();return}n?.();return}if(r.type==="mode-select"){if(o.upArrow)c({type:"mode-select",cursor:0});else if(o.downArrow)c({type:"mode-select",cursor:1});else if(o.return){let l=r.cursor===0?"global":"local";f(l)}return}if(r.type==="profile-select"){let{profiles:l,cursor:d}=r,p=l.length,F=l.length+1;if(o.upArrow)c({...r,cursor:(d-1+F)%F});else if(o.downArrow)c({...r,cursor:(d+1)%F});else if(o.return)if(d===p)c({type:"name-entry",nameBuffer:"",existingProfiles:l});else{let k=l[d]??l[0];k&&a(k)}return}if(r.type==="name-entry"){let{nameBuffer:l,existingProfiles:d}=r;if(o.backspace||o.delete)c({type:"name-entry",nameBuffer:l.slice(0,-1),existingProfiles:d});else if(o.return){let p=l.trim();if(!p){c({...r,nameError:"Name cannot be empty"});return}if(p===re){c({...r,nameError:`"${re}" is reserved`});return}if(d.some(F=>F.name===p)){c({...r,nameError:`Profile "${p}" already exists`});return}g(p),c({type:"creds-entry",field:0,values:{},envCursor:0}),y("")}else s&&!o.ctrl&&!o.meta&&c({type:"name-entry",nameBuffer:l+s,existingProfiles:d});return}if(r.type==="creds-entry"){let{field:l,values:d,envCursor:p}=r;if(l===ne.length){o.leftArrow?c({...r,envCursor:(p-1+Z.length)%Z.length}):o.rightArrow?c({...r,envCursor:(p+1)%Z.length}):o.upArrow?(c({...r,field:l-1}),y(d[ne[l-1]]??"")):o.return&&v(d,p);return}let k=ne[l];if(!k)return;if(o.backspace||o.delete)y(I=>I.slice(0,-1));else if(o.upArrow&&l>0){let I={...d,[k]:S},O=l-1;c({...r,field:O,values:I}),y(I[ne[O]]??"")}else if(o.return||o.tab||o.downArrow){let I={...d,[k]:S},O=l+1;c({...r,field:O,values:I}),O<ne.length?y(I[ne[O]]??""):y("")}else s&&!o.ctrl&&!o.meta&&y(I=>I+s)}});let N=Ye(async()=>{let s=await Ee();c({type:"profile-select",profiles:s,cursor:0})},[]);if(Ct(()=>{r.type==="profile-loading"&&N()},[r.type,N]),Ct(()=>{e==="global"&&!t&&(async()=>{let s=await Y(),o=s?Math.max(0,Z.indexOf(s.environment)):0;c({type:"creds-entry",field:0,values:s??{},envCursor:o})})()},[]),Ct(()=>{r.type==="creds-entry"&&r.field===0&&y(r.values.apiKey??"")},[r.type]),r.type==="loading"||r.type==="saving"||r.type==="profile-loading"){let s=r.type==="saving"?"Saving credentials\u2026":r.type==="profile-loading"?"Loading profiles\u2026":"Loading credentials\u2026";return P(z,{paddingY:1,paddingX:2,children:P(D,{dimColor:!0,children:s})})}if(r.type==="done")return null;if(r.type==="mode-select")return H(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[P(V,{}),H(z,{flexDirection:"column",gap:0,children:[P(D,{bold:!0,children:"Credential mode"}),[{label:"Global",desc:"~/.kizenappbuilder/credentials.json",mode:"global"},{label:"Local",desc:"Enter credentials in the browser dev tools",mode:"local"}].map((o,l)=>{let d=r.cursor===l;return H(z,{gap:2,children:[P(D,{...d&&{color:"cyan"},children:d?"\u276F":" "}),P(D,{bold:d,...d&&{color:"cyan"},children:o.label}),P(D,{dimColor:!0,children:o.desc})]},o.mode)})]}),P(Re,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Ctrl+C to quit"})]});if(r.type==="profile-select"){let{profiles:s,cursor:o}=r,l=s.length;return H(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[P(V,{}),H(z,{flexDirection:"column",gap:0,children:[P(D,{bold:!0,children:"Credential profiles"}),s.map((d,p)=>{let F=o===p;return H(z,{gap:2,children:[P(D,{...F&&{color:"cyan"},children:F?"\u276F":" "}),P(D,{bold:F,...F&&{color:"cyan"},children:d.isDefault?"Default":d.name}),P(D,{dimColor:!0,children:d.path})]},d.name)}),H(z,{gap:2,children:[P(D,{...o===l&&{color:"cyan"},children:o===l?"\u276F":" "}),P(D,{bold:o===l,...o===l&&{color:"cyan"},children:"+ Add new profile"})]})]}),P(Re,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(r.type==="name-entry"){let{nameBuffer:s,nameError:o}=r;return H(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[P(V,{}),P(z,{flexDirection:"column",gap:0,children:P(D,{bold:!0,children:"New credential profile"})}),o&&H(D,{color:"red",children:["Error: ",o]}),H(z,{gap:2,children:[P(z,{width:12,children:P(D,{bold:!0,color:"cyan",children:"Profile name"})}),P(D,{color:"cyan",children:">"}),P(D,{children:s}),P(D,{color:"cyan",children:"\u2588"})]}),P(Re,{text:"Type a name \xB7 Enter to confirm \xB7 Esc to go back"})]})}let{field:E,values:C,envCursor:m}=r,u=E===ne.length,w=h??re;return H(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[P(V,{}),H(z,{flexDirection:"column",gap:0,children:[P(D,{bold:!0,children:h!==void 0?`Profile: ${h}`:"Global credentials"}),H(D,{dimColor:!0,children:["Saved to:"," ",h!==void 0?`~/.kizenappbuilder/${h}.json`:xe]})]}),_&&H(D,{color:"red",children:["Error: ",_]}),H(z,{flexDirection:"column",gap:0,children:[ne.map((s,o)=>{let l=E===o,d=l?S:C[s]??"";return H(z,{gap:2,children:[P(z,{width:12,children:P(D,{bold:l,...l&&{color:"cyan"},children:ao[s]})}),P(D,{...l&&{color:"cyan"},children:">"}),P(D,{children:d}),l&&P(D,{color:"cyan",children:"\u2588"})]},s)}),H(z,{gap:2,children:[P(z,{width:12,children:P(D,{bold:u,...u&&{color:"cyan"},children:"Environment"})}),P(D,{...u&&{color:"cyan"},children:">"}),P(z,{gap:1,children:Z.map((s,o)=>{let l=o===m;return u?P(D,{bold:l,...l&&{color:"cyan"},children:l?`[${s}]`:s},s):P(D,{dimColor:!l,bold:l,children:s},s)})})]})]}),u?P(Re,{text:"\u2190\u2192 to select \xB7 \u2191\u2193 to move \xB7 Enter to save \xB7 Esc to cancel"}):P(Re,{text:"\u2191\u2193 to move \xB7 Backspace to delete \xB7 Esc to cancel"}),H(D,{dimColor:!0,children:["Profile: ",w]})]})};import{jsx as L,jsxs as $}from"react/jsx-runtime";var mo=[".kizenapp",".git"],fr=({port:e,pluginDir:t,outputDir:i,credentials:n,credentialMode:r,activeCredentialProfile:c,lastPath:S,debug:y=!1,verbose:_=!1})=>{let b=Q(n),h=Q(c),g=Q(S),[f,a]=W("main"),[v,N]=W(r),[E,C]=W("starting"),[m,u]=W(null),[w,s]=Xe(50),[o,l]=Xe(50),[d,p]=Xe(50),[F,k]=W([]),[I,O]=W("pending"),[U,J]=W(null),[G,tt]=W(null),[pe,fe]=W(null),[Ce,rt]=W(0),[wt,xr]=W(0),[br,vr]=W(0),[Cr,wr]=W(0),nt=Q(!1),St=Q(!1),Fe=Q(null),we=Q(null),ee=Q(new Set),je=Q([]),K=ve(x=>{let j=JSON.stringify(x);if(ee.current.size===0){je.current=[...je.current,j].slice(-50);return}let te=!1;for(let X of ee.current)if(X.readyState===1)try{X.send(j)}catch{ee.current.delete(X),te=!0}te&&rt(ee.current.size)},[]),Ae=s,ot=ve(()=>{Fe.current?.kill(),Fe.current=null,ur({port:e,userDataDir:pr(i,".chrome"),broadcast:K,onWarn:x=>{s(`\u26A0 ${x}`)},...g.current!==void 0&&{path:g.current},...y&&{debugLog:p},..._&&{verbose:!0}}).then(x=>{Fe.current=x})},[e,i,K,y,_,p,s]);et(()=>{let x=()=>{Fe.current?.kill()};return process.on("exit",x),()=>{process.off("exit",x)}},[]),co((x,j)=>{(x==="q"||j.ctrl&&x==="c")&&process.exit(0),x==="c"&&a("editing"),x==="v"&&ot()},{isActive:f==="main"}),et(()=>{E!=="running"||St.current||(St.current=!0,ot())},[E,ot]);let Sr=ve(x=>{b.current=x.credentials,h.current=x.profileName,a("main"),N(x.mode);let j=x.profileName;ue(i,{credentialMode:x.mode,...j!==void 0&&{activeCredentialProfile:j}}),K({type:"credentials-updated",credentials:x.credentials})},[i,K]),Pt=ve(x=>{k(j=>[...j,`${new Date().toLocaleTimeString()}: ${ir(x)}`].slice(-50)),x.kind==="request"&&(x.fromCache?vr(j=>j+1):wr(j=>j+1)),K({type:"proxy-log",entry:x})},[K]),ie=ve(x=>{l(x),K({type:"log",message:x})},[l,K]),it=ve(()=>{nt.current||(nt.current=!0,O("building"),J(null),ie("Build started"),ze(t,i).then(({bundleSize:x})=>{ie(`Build finished \u2014 bundle: ${Se(x)}`),O("done"),tt(new Date),fe(x),ie("Notifying viewers to reload"),K({type:"rebuild"})}).catch(x=>{let j=x instanceof Error?x.message:String(x);J(j),O("error")}).finally(()=>{nt.current=!1}))},[t,i,ie,K]);if(et(()=>{it();let x=uo(t,{recursive:!0},(j,te)=>{if(!te)return;let X=te.replace(/\\/g,"/");mo.some(Oe=>X.startsWith(Oe))||(ie(`File change detected: ${te}`),we.current!==null&&clearTimeout(we.current),we.current=setTimeout(it,150))});return x.on("error",j=>{ie(`File watcher error \u2014 rebuilds have stopped: ${j.message}`)}),()=>{x.close(),we.current!==null&&clearTimeout(we.current)}},[t,it,ie]),et(()=>{let x=sr();vt(pr(x,"index.html")).then(j=>{if(!j){u("Viewer not built. Run 'pnpm build:viewer' first."),C("error");return}let te=ar(x,Ae,Pt,b,h,i,K,xr,g,t),X=po(te),Oe=new fo({server:X});return Oe.on("connection",se=>{for(let Tr of je.current)se.readyState===1&&se.send(Tr);je.current=[],Ae("Viewer connected for live reload"),ee.current.add(se),rt(ee.current.size),se.on("close",()=>{ee.current.delete(se),rt(ee.current.size)})}),X.listen(e,"127.0.0.1",()=>{C("running"),Ae(`Server started on 127.0.0.1:${String(e)}`)}),X.on("error",se=>{u(se.message),C("error")}),()=>{Oe.close(),X.close()}})},[e,Ae,Pt,K,i,t]),f==="editing")return L(Qe,{...v!==void 0&&{initialMode:v},showProfileManager:v==="global",onComplete:Sr,onCancel:()=>{a("main")}});let st=G!==null?Math.round((Date.now()-G.getTime())/1e3):null,Pr=st===null?"":st<5?" (just now)":` (${String(st)}s ago)`;return $(q,{flexDirection:"column",paddingY:1,paddingX:2,children:[L(V,{marginBottom:1}),$(q,{flexDirection:"column",children:[$(q,{gap:2,marginBottom:0,children:[L(R,{bold:!0,dimColor:!0,children:"App Build"}),I==="pending"&&L(R,{dimColor:!0,children:"waiting\u2026"}),I==="building"&&$(q,{gap:1,children:[L(Me,{}),L(R,{children:"Building plugin package\u2026"})]}),I==="done"&&$(q,{gap:1,children:[L(R,{color:"green",children:"\u2713 Built"}),G!==null&&$(R,{dimColor:!0,children:["at ",G.toLocaleTimeString(),Pr]}),pe!==null&&$(R,{dimColor:!0,children:["\xB7 bundle: ",Se(pe)]})]}),I==="error"&&$(R,{color:"red",children:["\u2717 ",U??"unknown error"]})]}),L(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:o.slice(-8).map((x,j)=>L(R,{dimColor:!0,wrap:"truncate",children:x},j))})]}),$(q,{marginTop:1,flexDirection:"column",children:[$(q,{gap:2,children:[L(R,{bold:!0,dimColor:!0,children:"Web Server"}),E==="starting"&&L(R,{dimColor:!0,children:"starting\u2026"}),E==="running"&&$(q,{gap:2,children:[L(R,{color:"green",children:"\u2713 Running"}),$(R,{dimColor:!0,children:["\u25CF ",Ce," viewer",Ce!==1?"s":""]})]}),E==="error"&&$(R,{color:"red",children:["\u2717 ",m??"Server error"]})]}),L(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:w.slice(-8).map((x,j)=>L(R,{dimColor:!0,wrap:"truncate",children:x},j))})]}),$(q,{marginTop:1,flexDirection:"column",children:[$(q,{gap:2,children:[L(R,{bold:!0,dimColor:!0,children:"Network Proxy"}),L(R,{color:"green",children:"\u2713 Active"}),$(R,{dimColor:!0,children:["\u25CF ",wt," key",wt!==1?"s":""," in the network cache \xB7"," ",br," hit \xB7 ",Cr," miss"]})]}),L(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:F.length===0?L(R,{dimColor:!0,children:" No requests yet."}):F.slice(-8).map((x,j)=>L(R,{dimColor:!0,wrap:"truncate",children:x},j))})]}),y&&$(q,{marginTop:1,flexDirection:"column",children:[$(q,{gap:2,children:[L(R,{bold:!0,dimColor:!0,children:"CDP Debug"}),$(R,{dimColor:!0,children:["\u25CF ",d.length," event(s)"]})]}),L(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:d.length===0?L(R,{dimColor:!0,children:" No CDP events yet."}):d.slice(-8).map((x,j)=>L(R,{dimColor:!0,wrap:"truncate",children:x},j))})]}),$(q,{marginTop:1,gap:1,children:[L(R,{dimColor:!0,children:"["}),L(R,{children:"q"}),L(R,{dimColor:!0,children:"] quit ["}),L(R,{children:"c"}),L(R,{dimColor:!0,children:"] credentials ["}),L(R,{children:"v"}),$(R,{dimColor:!0,children:["] ",Ce===0?"open viewer":"relaunch viewer"]})]})]})};async function mr(e){return new Promise(t=>{let i=null,n=c=>{i?.(),t(c)},{unmount:r}=yr(gr(Qe,{...e!==void 0&&{initialMode:e},onComplete:n}),{exitOnCtrlC:!1});i=r})}function hr(e){e.command("dev").description("Start the plugin viewer dev server").option("-p, --port <port>","port to listen on","3121").option("-c, --credentials <path>","path to a credentials JSON file").option("-d, --debug","Enable CDP lifecycle logs in the TUI").option("-v, --verbose","Log every CDP event and handled error (implies --debug)").action(async t=>{let i=parseInt(t.port,10),n=process.cwd(),r=`${n}/.kizenapp`;ye(n);let c=null,S,y,{lastPath:_}=await Ie(r);if(t.credentials)c=await Je(t.credentials);else{let f=await Ie(r);if(f.credentialMode==="local")S="local";else if(f.credentialMode==="global"){if(S="global",y=f.activeCredentialProfile,y?(c=await be(y),c||(c=await Y(),y=void 0)):c=await Y(),!c){let a=await mr("global");c=a.credentials,y=a.profileName}}else{let a=await mr();c=a.credentials,S=a.mode,y=a.profileName;let v=a.profileName;await ue(r,{credentialMode:a.mode,...v!==void 0&&{activeCredentialProfile:v}})}}let b=t.verbose===!0,h=b||t.debug===!0,{waitUntilExit:g}=yr(gr(fr,{port:i,pluginDir:n,outputDir:r,credentials:c,...S!==void 0&&{credentialMode:S},...y!==void 0&&{activeCredentialProfile:y},..._!==void 0&&{lastPath:_},debug:h,verbose:b}),{exitOnCtrlC:!1});await g()})}var bo=ho(yo(xo(import.meta.url)),"..","package.json"),vo=JSON.parse(go(bo,"utf-8"));Le.name("appbuilder").description("Kizen plugin app builder").version(vo.version);Jt(Le);Ft(Le);hr(Le);Le.parse();
|
|
168
|
+
`.trim(),In=3e4,xt=Be(process.cwd(),".kizenapp","venv"),Bn=["awslambdaric","bcrypt","fpdf2","lxml","msgpack","numpy","paramiko","pyjwt","pypdf","pytz","requests","tzdata"],We=null;function Dn(e){let t=/^python-(\d+\.\d+)$/.exec(e);return t?.[1]?`python${t[1]}`:"python3"}function Zt(e,t,i){return new Promise((n,r)=>{let c=Qt(e,t,{stdio:["ignore","pipe","pipe"]}),S=(_,v)=>{let h=[],y="";return _.on("data",m=>{y+=m.toString("utf-8");let l=y.indexOf(`
|
|
169
|
+
`);for(;l>=0;){let x=y.slice(0,l).replace(/\r$/,"");y=y.slice(l+1),h.push(x),i?.(x,v),l=y.indexOf(`
|
|
170
|
+
`)}}),_.on("end",()=>{if(y.length>0){let m=y.replace(/\r$/,"");h.push(m),i?.(m,v)}}),h},g=S(c.stderr,"stderr");S(c.stdout,"stdout"),c.on("error",r),c.on("close",_=>{if(_===0)n();else{let v=g.slice(-10).join(`
|
|
171
|
+
`).trim(),h=v.length>0?`: ${v}`:"";r(new Error(`${e} exited with code ${String(_)}${h}`))}})})}var bt=new Set;function Ke(e){for(let t of bt)t(e)}function Rn(e,t){return t&&bt.add(t),We||(We=(async()=>{let i=Be(xt,"bin","python");try{await _n(i)}catch{let n=Dn(e);await Zt(n,["-m","venv",xt])}Ke({kind:"start"});try{await Zt(i,["-m","pip","install","--disable-pip-version-check",...Bn],(n,r)=>{Ke({kind:"log",line:n,stream:r})}),Ke({kind:"complete"})}catch(n){let r=n instanceof Error?n.message:String(n);throw Ke({kind:"error",message:r}),We=null,await er(xt,{recursive:!0,force:!0}).catch(()=>{}),n}finally{bt.clear()}return i})()),We}function Nn(e){let t="__KIZEN_RESULT_START__",i="__KIZEN_RESULT_END__",n=e.indexOf(t),r=e.indexOf(i);if(n===-1||r===-1)return{userStdout:e,result:null};let c=e.slice(0,n).trimEnd(),S=e.slice(n+t.length,r).trim();try{let g=JSON.parse(S);return{userStdout:c,result:g}}catch{return{userStdout:e,result:null}}}async function tr(e){let t=e.timeout??In,i=await Rn(e.scriptRuntime,e.onInstallProgress),n=Date.now(),r;try{r=await Tn(Be(En(),"kizen-step-"));let c=Be(r,"wrapper.py"),S=Be(r,"script.py");await Promise.all([Yt(c,kn,"utf-8"),Yt(S,e.script,"utf-8")]);let g={...process.env,__KIZEN_INPUTS__:JSON.stringify(e.inputs),__KIZEN_SECRETS__:JSON.stringify(e.secrets),__KIZEN_SCRIPT_PATH__:S},{exitCode:_,stdout:v,stderr:h}=await new Promise(E=>{let R=[],C=[],f=!1,u=Qt(i,[c],{env:g,cwd:r,stdio:["ignore","pipe","pipe"]}),w=setTimeout(()=>{u.kill("SIGKILL")},t);u.stdout.on("data",o=>{R.push(o)}),u.stderr.on("data",o=>{C.push(o)});let s=o=>{f||(f=!0,clearTimeout(w),E({exitCode:o??1,stdout:Buffer.concat(R).toString("utf-8"),stderr:Buffer.concat(C).toString("utf-8")}))};u.on("close",s),u.on("error",o=>{f||(f=!0,clearTimeout(w),E({exitCode:1,stdout:"",stderr:o.message}))})}),y=Date.now()-n,{userStdout:m,result:l}=Nn(v);if(l){let E={success:l.success,outputValues:l.outputValues,logs:l.logs,stdout:m,stderr:h,exitCode:_,durationMs:y};return l.error!==null&&(E.error=l.error),l.httpRequests&&(E.httpRequests=l.httpRequests),E}let x={success:!1,outputValues:{},logs:[],stdout:m,stderr:h,exitCode:_,durationMs:y};return _!==0&&(x.error=`Process exited with code ${String(_)}`),x}finally{r&&er(r,{recursive:!0,force:!0})}}var rr=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".json",".md",".mdx",".yml",".yaml",".toml",".css",".scss",".html",".htm",".xml",".svg",".txt",".sh",".py",".env",".gitignore",".prettierrc",".eslintrc"]);function vt(e){if(e.kind==="info")return e.message;let t=e.fromCache?" [cache]":"";return`${e.method} ${e.url} \u2192 ${String(e.status)}${t}`}var Hn=2*1024*1024,Un=new Set([".DS_Store",".gitignore"]);function qn(e){if(e===void 0||e==="")return!1;let t=e.startsWith("[")?e.slice(0,e.indexOf("]")+1):e.split(":")[0]??"";return t==="localhost"||t==="127.0.0.1"||t==="[::1]"}var Vn=["kizen.com","kizen.dev"];function Jn(e){let t;try{t=new URL(e)}catch{return!1}if(t.protocol!=="https:")return!1;let i=t.hostname.toLowerCase();return Vn.some(n=>i===n||i.endsWith("."+n))}function Wn(e){if(e===void 0||e==="")return!1;try{let{hostname:t}=new URL(e);return t==="localhost"||t==="127.0.0.1"||t==="::1"}catch{return!1}}async function sr(e,t){if(t.includes("\0"))return null;let i=t.replace(/^\/+/,""),n=zn(e,i);if(n!==e&&!n.startsWith(e+Ct))return null;try{let r=await On(n);return r!==e&&!r.startsWith(e+Ct)?null:r}catch{return null}}function ar(e,t){let i=t===e?"":t.slice(e.length+1);return i===""?!1:i.split(Ct).some(r=>$e.has(r))}function lr(){let e=Mn(import.meta.url);return De($n(e),"viewer")}async function wt(e){try{return await jn(e),!0}catch{return!1}}function cr(e,t,i,n,r,c,S,g,_,v){let h=Gt({onChange:g}),y=Ln(v);return(m,l)=>{(async()=>{let x=m.url??"/";try{if(!qn(m.headers.host)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Forbidden"}));return}if((m.method==="POST"||m.method==="PATCH"||m.method==="DELETE")&&!Wn(m.headers.origin)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Forbidden"}));return}if(t(`Received request: ${x}`),x==="/api/credentials"){l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(n.current!==null?JSON.stringify(n.current):"{}");return}if(x==="/api/credential-profiles"&&m.method==="GET"){let s=await Ee();l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({profiles:s,active:r.current}));return}if(x==="/api/credentials/switch"&&m.method==="POST"){let s=[];for await(let p of m)s.push(p);let a=JSON.parse(Buffer.concat(s).toString("utf-8")||"{}").profile,d=a===void 0||a===""?await Y():await be(a);if(d!==null){n.current=d,r.current=a??void 0;let p=r.current;await pe(c,{credentialMode:"global",...p!==void 0&&{activeCredentialProfile:p}}),S({type:"credentials-updated",credentials:d})}l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({ok:d!==null}));return}if(x==="/api/bundle"){let s=De(process.cwd(),".kizenapp","bundle.json");try{let o=await An(s,"utf-8");l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(o)}catch{l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end("{}")}return}if(x==="/api/last-path"&&m.method==="POST"){let s=[];for await(let a of m)s.push(a);let o=JSON.parse(Buffer.concat(s).toString("utf-8")||"{}");if(typeof o.path=="string"){_.current=o.path;let a=await Ie(c);await pe(c,{...a,lastPath:o.path})}l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end('{"ok":true}');return}if(x==="/api/execute-step"&&m.method==="POST"){let s=[];for await(let p of m)s.push(p);let o=JSON.parse(Buffer.concat(s).toString("utf-8")||"{}");if(typeof o.script!="string"){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Missing required field: script"}));return}let a={script:o.script,scriptRuntime:o.scriptRuntime??"python-3.9",inputs:o.inputs??{},secrets:o.secrets??{},onInstallProgress:p=>{p.kind==="start"?S({type:"venv-install-start"}):p.kind==="log"?S({type:"venv-install-log",line:p.line,stream:p.stream}):p.kind==="complete"?S({type:"venv-install-complete"}):S({type:"venv-install-error",message:p.message})}};typeof o.timeout=="number"&&o.timeout>0&&(a.timeout=Math.min(o.timeout,300*1e3));let d=await tr(a);l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify(d));return}if(x==="/api/proxy-cache/clear"){h.clear(),i({kind:"info",message:"Proxy cache cleared"}),l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end('{"ok":true}');return}if(x.startsWith("/api/proxy")){let s=m.headers["x-proxy-target"];if(typeof s!="string"){l.writeHead(400),l.end("Missing x-proxy-target header");return}if(!Jn(s)){l.writeHead(400),l.end("Invalid proxy target");return}let o=x.slice(10)||"/",a=`${s}${o}`,d=m.method??"GET",p=[];for await(let Ce of m)p.push(Ce);let{host:j,"x-proxy-target":k,...N}=m.headers;if(d==="GET"){let Ce=`GET::${a}`,{response:ie,fromCache:tt}=await h.get(Ce,()=>fetch(a,{method:"GET",headers:N}));i({kind:"request",method:"GET",status:ie.status,fromCache:tt,url:o}),l.writeHead(ie.status,ie.headers),l.end(ie.body);return}let O=p.length>0?Buffer.concat(p):void 0,H=O&&O.length>0?O:void 0,W=await fetch(a,{method:d,headers:N,...H!==void 0&&{body:H}}),Q=mt(Object.fromEntries(W.headers)),fe=await yt(W,gt);i({kind:"request",method:d,status:W.status,fromCache:!1,url:o}),l.writeHead(W.status,Q),l.end(fe);return}if(x.startsWith("/api/source/tree")&&m.method==="GET"){let o=new URL(x,"http://localhost").searchParams.get("path")??"",a=await sr(y,o);if(a===null){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Invalid path"}));return}if(ar(y,a)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Path is excluded"}));return}try{let d=await Fn(a,{withFileTypes:!0}),p=await Promise.all(d.filter(k=>k.isDirectory()?!$e.has(k.name):k.isFile()?!Un.has(k.name):!1).map(async k=>{let N=k.isDirectory()?"dir":"file",O={name:k.name,kind:N};if(N==="file")try{let H=await or(De(a,k.name));O.size=H.size}catch{}return O}));p.sort((k,N)=>k.kind!==N.kind?k.kind==="dir"?-1:1:k.name.localeCompare(N.name));let j=a===y?"":a.slice(y.length+1);l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({path:j,entries:p}))}catch(d){let p=d instanceof Error?d.message:String(d);t(`source/tree failed (${o}): ${p}`),l.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not found"}))}return}if(x.startsWith("/api/source/file")&&m.method==="GET"){let o=new URL(x,"http://localhost").searchParams.get("path")??"";if(o===""){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Missing path"}));return}let a=await sr(y,o);if(a===null){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Invalid path"}));return}if(ar(y,a)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Path is excluded"}));return}try{let d=await or(a);if(!d.isFile()){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not a file"}));return}if(d.size>Hn){l.writeHead(413,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"File too large",size:d.size}));return}let p=ir(a).toLowerCase(),j=ht[p],k=rr.has(p),N=j??(k?"text/plain; charset=utf-8":"application/octet-stream");l.writeHead(200,{"Content-Type":N,"Content-Length":String(d.size)}),nr(a).pipe(l)}catch(d){let p=d instanceof Error?d.message:String(d);t(`source/file failed (${o}): ${p}`),l.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not found"}))}return}let C=De(e,x==="/"?"/index.html":x),f=await wt(C)?C:De(e,"index.html"),u=ir(f),w=ht[u]??"application/octet-stream";l.writeHead(200,{"Content-Type":w}),nr(f).pipe(l)}catch(E){if(x.startsWith("/api/proxy")){let R=x.slice(10)||"/",C=m.method??"GET";E instanceof ke?i({kind:"info",message:`${C} ${R} \u2192 502 (response exceeded ${String(E.limit)} bytes)`}):i({kind:"request",method:C,status:502,fromCache:!1,url:R})}else i({kind:"info",message:`Error handling ${x}: ${E instanceof Error?E.message:String(E)}`});l.headersSent||(l.writeHead(502),l.end("Bad Gateway"))}})()}}import{launch as Kn}from"chrome-launcher";import{createRequire as Gn}from"module";import{mkdirSync as Xn}from"fs";import{readFile as Yn}from"fs/promises";import{dirname as Zn,join as Qn}from"path";import{fileURLToPath as eo}from"url";var dr=Gn(import.meta.url)("chrome-remote-interface"),to=new Set(["content-security-policy","content-security-policy-report-only","x-frame-options"]),pr=["kizen.dev","kizen.com"];function ur(e){try{let{hostname:t}=new URL(e);return pr.some(i=>t===i||t.endsWith("."+i))}catch{return!1}}function Ge(e){if(e.type==="number")return Number(e.value);if(e.type==="boolean")return e.value==="true";if(e.type!=="undefined"){if(e.type==="object"&&e.value==="null")return null;if(e.type==="object"&&e.valuePreview){let{valuePreview:t}=e;if(t.subtype==="array")return t.properties.filter(n=>/^\d+$/.test(n.name)).sort((n,r)=>parseInt(n.name)-parseInt(r.name)).map(Ge);let i={};for(let n of t.properties)i[n.name]=Ge(n);return i}return e.value??`[${e.type}]`}}function ro(e){if(e.value!==void 0)return e.value;if(e.preview){let{preview:t}=e;if(t.subtype==="array")return t.properties.filter(n=>/^\d+$/.test(n.name)).sort((n,r)=>parseInt(n.name)-parseInt(r.name)).map(Ge);let i={};for(let n of t.properties)i[n.name]=Ge(n);return i}return e.description??`[${e.type}]`}async function no(e,t){if(t.type==="object"&&t.objectId)try{let n=(await e.Runtime.callFunctionOn({objectId:t.objectId,functionDeclaration:'function() { const seen = new WeakSet(); return JSON.stringify(this, function(k,v) { if (typeof v === "object" && v !== null) { if (seen.has(v)) return "[Circular]"; seen.add(v); } return v; }); }',returnByValue:!0})).result.value;if(typeof n=="string")return JSON.parse(n)}catch{}return ro(t)}async function oo(e){try{let t=Qn(Zn(eo(import.meta.url)),"viewer","icon.png"),i=await Yn(t);await e.Browser.setDockTile({image:i.toString("base64")})}catch{}}async function fr(e){Xn(e.userDataDir,{recursive:!0});let t=`http://localhost:${String(e.port)}`,i=await Kn({startingUrl:t,chromeFlags:[`--app=${t}`,"--no-first-run","--no-default-browser-check","--disable-extensions"],userDataDir:e.userDataDir,handleSIGINT:!1,logLevel:"silent"}),n=i.port,r=null,c=null,S=null,g=null,_=0,v=!1,h=u=>{e.debugLog?.(u)},y=u=>{e.verbose&&e.debugLog?.(u)},m=()=>{c!==null&&(clearInterval(c),c=null)},l=u=>u==="chrome://new-tab-page/"||u==="chrome://newtab/",x=async u=>{m(),S=null,await oo(u),await u.Fetch.enable({patterns:pr.flatMap(s=>[{urlPattern:`*://${s}/*`,requestStage:"Response"},{urlPattern:`*://*.${s}/*`,requestStage:"Response"}])}),u.on("Fetch.requestPaused",s=>{(async()=>{let o=s,{requestId:a,request:d,responseHeaders:p,responseStatusCode:j}=o,k=d.url;y(`Fetch ${String(j??"?")} ${k}`);let N=[],O=!1;for(let H of p??[])if(!to.has(H.name.toLowerCase()))if(H.name.toLowerCase()==="set-cookie"&&ur(k)){let W=H.value.split(`
|
|
172
|
+
`).map(Q=>/SameSite=/i.test(Q)?Q.replace(/SameSite=\w+/i,"SameSite=None"):Q+"; SameSite=None; Secure").join(`
|
|
173
|
+
`);N.push({name:H.name,value:W}),O=!0}else N.push(H);O&&y(` rewrote Set-Cookie SameSite on ${k}`);try{let{body:H,base64Encoded:W}=await u.Fetch.getResponseBody({requestId:a});await u.Fetch.fulfillRequest({requestId:a,responseCode:j??200,responseHeaders:N,body:H,...W&&{base64Encoded:!0}})}catch(H){y(` fulfillRequest failed (${H.message}), falling through`);try{await u.Fetch.continueRequest({requestId:a})}catch(W){y(` continueRequest also failed (${W.message})`)}}})()}),c=setInterval(()=>{(async()=>{try{let{cookies:s}=await u.Network.getAllCookies(),o=0;for(let a of s){if(!ur(`https://${a.domain??""}`)||a.sameSite==="None")continue;let d=a.domain??"",p=d.startsWith(".")?d.slice(1):d;await u.Network.setCookie({url:`https://${p}`,name:a.name,value:a.value,domain:d,path:a.path??"/",secure:!0,...a.httpOnly!==void 0&&{httpOnly:a.httpOnly},...a.expirationDate!==void 0&&{expires:a.expirationDate},sameSite:"None"}),o++}o>0&&y(`cookie-patch cycle: updated ${String(o)} cookie(s) to SameSite=None`)}catch(s){y(`cookie-patch cycle failed: ${s.message}`)}})()},2e3),await u.send("Runtime.enable",{generatePreview:!0}),u.on("Target.attachedToTarget",s=>{let o=s,{sessionId:a,targetInfo:d}=o;y(`attached session ${a} (${d.type} ${d.url})`),u.send("Runtime.enable",{generatePreview:!0},a).catch(p=>{y(` Runtime.enable on session ${a} failed: ${p.message}`)})}),await u.Target.setAutoAttach({autoAttach:!0,waitForDebuggerOnStart:!1,flatten:!0}),await u.Target.setDiscoverTargets({discover:!0});let w=s=>{if(s.type==="page"){if(l(s.url)){h(`closed stray new-tab-page target ${s.targetId}`),S!==null&&u.Target.activateTarget({targetId:S}).catch(()=>{}),u.Target.closeTarget({targetId:s.targetId}).catch(()=>{});return}S===null&&(S=s.targetId,h(`captured main target ${s.targetId} (${s.url})`))}};u.on("Target.targetCreated",s=>{let{targetInfo:o}=s;y(`target +${o.type} ${o.targetId} ${o.url}`),w(o)}),u.on("Target.targetInfoChanged",s=>{let{targetInfo:o}=s;y(`target ~${o.type} ${o.targetId} ${o.url}`),w(o)}),u.on("Runtime.consoleAPICalled",s=>{(async()=>{let{type:o,args:a}=s;if(a[0]?.type==="string"&&String(a[0].value).includes("Chrome Security"))return;let d=o==="warning"?"warn":["log","warn","error","info"].includes(o)?o:"log";y(`console.${d} (${String(a.length)} arg(s))`);let p=await Promise.all(a.map(j=>no(u,j)));e.broadcast({type:"console-message",level:d,args:p})})().catch(o=>{y(`console serialization failed: ${o.message}`)})}),u.on("disconnect",()=>{v||r!==u||(h("CDP disconnected"),r=null,m(),E())})},E=()=>{if(v||g!==null)return;let u=Math.min(1e3*2**_,1e4),w=_+1;_++,h(`CDP reconnect scheduled in ${String(u)}ms (attempt #${String(w)})`),g=setTimeout(()=>{g=null,(async()=>{let s;try{s=await dr({port:n})}catch{h(`CDP reconnect attempt #${String(w)} failed`),E();return}if(v){try{await s.close()}catch{}return}r=s;try{await x(s),h(`CDP reconnected after ${String(w)} attempt(s)`),_=0}catch{r===s&&(r=null);try{await s.close()}catch{}h(`CDP reconnect attempt #${String(w)} failed during setup`),E()}})()},u)},R=30,C=300;for(let u=0;u<R;u++){await new Promise(w=>setTimeout(w,C)),h(`CDP connect attempt ${String(u+1)}/${String(R)}`);try{let w=await dr({port:n});r=w,e.path&&w.send("Page.navigate",{url:`${t}${e.path}`});try{await x(w),h("CDP connected")}catch{r===w&&(r=null);try{await w.close()}catch{}h("CDP setup failed after connect")}break}catch{if(u===R-1){let w=`CDP unavailable after ${String(R)} attempts \u2014 viewer running without interception (CSP/cookie rewrites disabled)`;return h(w),e.onWarn?.(w),{kill:()=>{i.kill()}}}}}return r?{kill:()=>{if(h("CDP kill requested \u2014 tearing down"),v=!0,g!==null&&(clearTimeout(g),g=null),m(),r!==null){try{r.close()}catch{}r=null}i.kill()}}:{kill:()=>{i.kill()}}}import{useCallback as io,useState as so}from"react";function Xe(e){let[t,i]=so([]),n=io(r=>{i(c=>[...c,`${new Date().toLocaleTimeString()}: ${r}`].slice(-e))},[e]);return[t,n]}import{useCallback as Ye,useEffect as St,useState as Ze}from"react";import{Box as z,Text as B,useInput as ao}from"ink";import{jsx as P,jsxs as U}from"react/jsx-runtime";var ne=["apiKey","userId","businessId"],lo={apiKey:"API Key",userId:"User ID",businessId:"Business ID"},Re=({text:e})=>P(B,{dimColor:!0,children:e}),Qe=({initialMode:e,showProfileManager:t,onComplete:i,onCancel:n})=>{let[r,c]=Ze(e==="global"&&!t?{type:"loading"}:e==="global"&&t?{type:"profile-loading"}:{type:"mode-select",cursor:0}),[S,g]=Ze(""),[_,v]=Ze(null),[h,y]=Ze(void 0),m=Ye(s=>{if(s==="local"){i({mode:"local",credentials:null});return}c({type:"profile-loading"})},[i]),l=Ye(async s=>{if(s===null){c({type:"profile-loading"});let d=await Ee();c({type:"name-entry",nameBuffer:"",existingProfiles:d});return}y(s.isDefault?void 0:s.name),c({type:"loading"});let o=s.isDefault?await Y():await be(s.name),a=o?Math.max(0,G.indexOf(o.environment)):0;c({type:"creds-entry",field:0,values:o??{},envCursor:a})},[]),x=Ye(async(s,o)=>{let a=G[o]??"go",d={apiKey:s.apiKey??"",userId:s.userId??"",businessId:s.businessId??"",environment:a};c({type:"saving"});try{await Wt(h??re,d),i({mode:"global",credentials:d,...h!==void 0&&{profileName:h}})}catch(p){v(p instanceof Error?p.message:String(p)),c({type:"creds-entry",field:0,values:s,envCursor:o})}},[i,h]);ao((s,o)=>{if(o.ctrl&&s==="c"&&process.exit(0),o.escape){if((r.type==="creds-entry"||r.type==="name-entry")&&e==="global"&&t){c({type:"profile-loading"}),E();return}n?.();return}if(r.type==="mode-select"){if(o.upArrow)c({type:"mode-select",cursor:0});else if(o.downArrow)c({type:"mode-select",cursor:1});else if(o.return){let a=r.cursor===0?"global":"local";m(a)}return}if(r.type==="profile-select"){let{profiles:a,cursor:d}=r,p=a.length,j=a.length+1;if(o.upArrow)c({...r,cursor:(d-1+j)%j});else if(o.downArrow)c({...r,cursor:(d+1)%j});else if(o.return)if(d===p)c({type:"name-entry",nameBuffer:"",existingProfiles:a});else{let k=a[d]??a[0];k&&l(k)}return}if(r.type==="name-entry"){let{nameBuffer:a,existingProfiles:d}=r;if(o.backspace||o.delete)c({type:"name-entry",nameBuffer:a.slice(0,-1),existingProfiles:d});else if(o.return){let p=a.trim();if(!p){c({...r,nameError:"Name cannot be empty"});return}if(p===re){c({...r,nameError:`"${re}" is reserved`});return}if(d.some(j=>j.name===p)){c({...r,nameError:`Profile "${p}" already exists`});return}y(p),c({type:"creds-entry",field:0,values:{},envCursor:0}),g("")}else s&&!o.ctrl&&!o.meta&&c({type:"name-entry",nameBuffer:a+s,existingProfiles:d});return}if(r.type==="creds-entry"){let{field:a,values:d,envCursor:p}=r;if(a===ne.length){o.leftArrow?c({...r,envCursor:(p-1+G.length)%G.length}):o.rightArrow?c({...r,envCursor:(p+1)%G.length}):o.upArrow?(c({...r,field:a-1}),g(d[ne[a-1]]??"")):o.return&&x(d,p);return}let k=ne[a];if(!k)return;if(o.backspace||o.delete)g(N=>N.slice(0,-1));else if(o.upArrow&&a>0){let N={...d,[k]:S},O=a-1;c({...r,field:O,values:N}),g(N[ne[O]]??"")}else if(o.return||o.tab||o.downArrow){let N={...d,[k]:S},O=a+1;c({...r,field:O,values:N}),O<ne.length?g(N[ne[O]]??""):g("")}else s&&!o.ctrl&&!o.meta&&g(N=>N+s)}});let E=Ye(async()=>{let s=await Ee();c({type:"profile-select",profiles:s,cursor:0})},[]);if(St(()=>{r.type==="profile-loading"&&E()},[r.type,E]),St(()=>{e==="global"&&!t&&(async()=>{let s=await Y(),o=s?Math.max(0,G.indexOf(s.environment)):0;c({type:"creds-entry",field:0,values:s??{},envCursor:o})})()},[]),St(()=>{r.type==="creds-entry"&&r.field===0&&g(r.values.apiKey??"")},[r.type]),r.type==="loading"||r.type==="saving"||r.type==="profile-loading"){let s=r.type==="saving"?"Saving credentials\u2026":r.type==="profile-loading"?"Loading profiles\u2026":"Loading credentials\u2026";return P(z,{paddingY:1,paddingX:2,children:P(B,{dimColor:!0,children:s})})}if(r.type==="done")return null;if(r.type==="mode-select")return U(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[P(V,{}),U(z,{flexDirection:"column",gap:0,children:[P(B,{bold:!0,children:"Credential mode"}),[{label:"Global",desc:"~/.kizenappbuilder/credentials.json",mode:"global"},{label:"Local",desc:"Enter credentials in the browser dev tools",mode:"local"}].map((o,a)=>{let d=r.cursor===a;return U(z,{gap:2,children:[P(B,{...d&&{color:"cyan"},children:d?"\u276F":" "}),P(B,{bold:d,...d&&{color:"cyan"},children:o.label}),P(B,{dimColor:!0,children:o.desc})]},o.mode)})]}),P(Re,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Ctrl+C to quit"})]});if(r.type==="profile-select"){let{profiles:s,cursor:o}=r,a=s.length;return U(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[P(V,{}),U(z,{flexDirection:"column",gap:0,children:[P(B,{bold:!0,children:"Credential profiles"}),s.map((d,p)=>{let j=o===p;return U(z,{gap:2,children:[P(B,{...j&&{color:"cyan"},children:j?"\u276F":" "}),P(B,{bold:j,...j&&{color:"cyan"},children:d.isDefault?"Default":d.name}),P(B,{dimColor:!0,children:d.path})]},d.name)}),U(z,{gap:2,children:[P(B,{...o===a&&{color:"cyan"},children:o===a?"\u276F":" "}),P(B,{bold:o===a,...o===a&&{color:"cyan"},children:"+ Add new profile"})]})]}),P(Re,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(r.type==="name-entry"){let{nameBuffer:s,nameError:o}=r;return U(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[P(V,{}),P(z,{flexDirection:"column",gap:0,children:P(B,{bold:!0,children:"New credential profile"})}),o&&U(B,{color:"red",children:["Error: ",o]}),U(z,{gap:2,children:[P(z,{width:12,children:P(B,{bold:!0,color:"cyan",children:"Profile name"})}),P(B,{color:"cyan",children:">"}),P(B,{children:s}),P(B,{color:"cyan",children:"\u2588"})]}),P(Re,{text:"Type a name \xB7 Enter to confirm \xB7 Esc to go back"})]})}let{field:R,values:C,envCursor:f}=r,u=R===ne.length,w=h??re;return U(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[P(V,{}),U(z,{flexDirection:"column",gap:0,children:[P(B,{bold:!0,children:h!==void 0?`Profile: ${h}`:"Global credentials"}),U(B,{dimColor:!0,children:["Saved to:"," ",h!==void 0?`~/.kizenappbuilder/${h}.json`:xe]})]}),_&&U(B,{color:"red",children:["Error: ",_]}),U(z,{flexDirection:"column",gap:0,children:[ne.map((s,o)=>{let a=R===o,d=a?S:C[s]??"";return U(z,{gap:2,children:[P(z,{width:12,children:P(B,{bold:a,...a&&{color:"cyan"},children:lo[s]})}),P(B,{...a&&{color:"cyan"},children:">"}),P(B,{children:d}),a&&P(B,{color:"cyan",children:"\u2588"})]},s)}),U(z,{gap:2,children:[P(z,{width:12,children:P(B,{bold:u,...u&&{color:"cyan"},children:"Environment"})}),P(B,{...u&&{color:"cyan"},children:">"}),P(z,{gap:1,children:G.map((s,o)=>{let a=o===f;return u?P(B,{bold:a,...a&&{color:"cyan"},children:a?`[${s}]`:s},s):P(B,{dimColor:!a,bold:a,children:s},s)})})]})]}),u?P(Re,{text:"\u2190\u2192 to select \xB7 \u2191\u2193 to move \xB7 Enter to save \xB7 Esc to cancel"}):P(Re,{text:"\u2191\u2193 to move \xB7 Backspace to delete \xB7 Esc to cancel"}),U(B,{dimColor:!0,children:["Profile: ",w]})]})};import{jsx as L,jsxs as $}from"react/jsx-runtime";var go=[".kizenapp",".git"],gr=({port:e,pluginDir:t,outputDir:i,credentials:n,credentialMode:r,activeCredentialProfile:c,lastPath:S,debug:g=!1,verbose:_=!1,autoViewer:v=!0})=>{let h=Z(n),y=Z(c),m=Z(S),[l,x]=J("main"),[E,R]=J(r),[C,f]=J("starting"),[u,w]=J(null),[s,o]=Xe(50),[a,d]=Xe(50),[p,j]=Xe(50),[k,N]=J([]),[O,H]=J("pending"),[W,Q]=J(null),[fe,Ce]=J(null),[ie,tt]=J(null),[rt,nt]=J(0),[Pt,vr]=J(0),[Cr,wr]=J(0),[Sr,Pr]=J(0),ot=Z(!1),Tt=Z(!1),je=Z(null),we=Z(null),ee=Z(new Set),Fe=Z([]),K=ve(b=>{let F=JSON.stringify(b);if(ee.current.size===0){Fe.current=[...Fe.current,F].slice(-50);return}let te=!1;for(let X of ee.current)if(X.readyState===1)try{X.send(F)}catch{ee.current.delete(X),te=!0}te&&nt(ee.current.size)},[]),Ae=o,it=ve(()=>{je.current?.kill(),je.current=null,fr({port:e,userDataDir:mr(i,".chrome"),broadcast:K,onWarn:b=>{o(`\u26A0 ${b}`)},...m.current!==void 0&&{path:m.current},...g&&{debugLog:j},..._&&{verbose:!0}}).then(b=>{je.current=b})},[e,i,K,g,_,j,o]);et(()=>{let b=()=>{je.current?.kill()};return process.on("exit",b),()=>{process.off("exit",b)}},[]),uo((b,F)=>{(b==="q"||F.ctrl&&b==="c")&&process.exit(0),b==="c"&&x("editing"),b==="v"&&it()},{isActive:l==="main"}),et(()=>{C!=="running"||Tt.current||!v||(Tt.current=!0,it())},[C,v,it]);let Tr=ve(b=>{h.current=b.credentials,y.current=b.profileName,x("main"),R(b.mode);let F=b.profileName;pe(i,{credentialMode:b.mode,...F!==void 0&&{activeCredentialProfile:F}}),K({type:"credentials-updated",credentials:b.credentials})},[i,K]),_t=ve(b=>{N(F=>[...F,`${new Date().toLocaleTimeString()}: ${vt(b)}`].slice(-50)),b.kind==="request"&&(b.fromCache?wr(F=>F+1):Pr(F=>F+1)),K({type:"proxy-log",entry:b})},[K]),se=ve(b=>{d(b),K({type:"log",message:b})},[d,K]),st=ve(()=>{ot.current||(ot.current=!0,H("building"),Q(null),se("Build started"),ze(t,i).then(({bundleSize:b})=>{se(`Build finished \u2014 bundle: ${Se(b)}`),H("done"),Ce(new Date),tt(b),se("Notifying viewers to reload"),K({type:"rebuild"})}).catch(b=>{let F=b instanceof Error?b.message:String(b);Q(F),H("error")}).finally(()=>{ot.current=!1}))},[t,i,se,K]);if(et(()=>{st();let b=po(t,{recursive:!0},(F,te)=>{if(!te)return;let X=te.replace(/\\/g,"/");go.some(Oe=>X.startsWith(Oe))||(se(`File change detected: ${te}`),we.current!==null&&clearTimeout(we.current),we.current=setTimeout(st,150))});return b.on("error",F=>{se(`File watcher error \u2014 rebuilds have stopped: ${F.message}`)}),()=>{b.close(),we.current!==null&&clearTimeout(we.current)}},[t,st,se]),et(()=>{let b=lr();wt(mr(b,"index.html")).then(F=>{if(!F){w("Viewer not built. Run 'pnpm build:viewer' first."),f("error");return}let te=cr(b,Ae,_t,h,y,i,K,vr,m,t),X=fo(te),Oe=new mo({server:X});return Oe.on("connection",ae=>{for(let Er of Fe.current)ae.readyState===1&&ae.send(Er);Fe.current=[],Ae("Viewer connected for live reload"),ee.current.add(ae),nt(ee.current.size),ae.on("close",()=>{ee.current.delete(ae),nt(ee.current.size)})}),X.listen(e,"127.0.0.1",()=>{f("running"),Ae(`Server started on 127.0.0.1:${String(e)}`)}),X.on("error",ae=>{w(ae.message),f("error")}),()=>{Oe.close(),X.close()}})},[e,Ae,_t,K,i,t]),l==="editing")return L(Qe,{...E!==void 0&&{initialMode:E},showProfileManager:E==="global",onComplete:Tr,onCancel:()=>{x("main")}});let at=fe!==null?Math.round((Date.now()-fe.getTime())/1e3):null,_r=at===null?"":at<5?" (just now)":` (${String(at)}s ago)`;return $(q,{flexDirection:"column",paddingY:1,paddingX:2,children:[L(V,{marginBottom:1}),$(q,{flexDirection:"column",children:[$(q,{gap:2,marginBottom:0,children:[L(D,{bold:!0,dimColor:!0,children:"App Build"}),O==="pending"&&L(D,{dimColor:!0,children:"waiting\u2026"}),O==="building"&&$(q,{gap:1,children:[L(Me,{}),L(D,{children:"Building plugin package\u2026"})]}),O==="done"&&$(q,{gap:1,children:[L(D,{color:"green",children:"\u2713 Built"}),fe!==null&&$(D,{dimColor:!0,children:["at ",fe.toLocaleTimeString(),_r]}),ie!==null&&$(D,{dimColor:!0,children:["\xB7 bundle: ",Se(ie)]})]}),O==="error"&&$(D,{color:"red",children:["\u2717 ",W??"unknown error"]})]}),L(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:a.slice(-8).map((b,F)=>L(D,{dimColor:!0,wrap:"truncate",children:b},F))})]}),$(q,{marginTop:1,flexDirection:"column",children:[$(q,{gap:2,children:[L(D,{bold:!0,dimColor:!0,children:"Web Server"}),C==="starting"&&L(D,{dimColor:!0,children:"starting\u2026"}),C==="running"&&$(q,{gap:2,children:[L(D,{color:"green",children:"\u2713 Running"}),$(D,{dimColor:!0,children:["\u25CF ",rt," viewer",rt!==1?"s":""]})]}),C==="error"&&$(D,{color:"red",children:["\u2717 ",u??"Server error"]})]}),L(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:s.slice(-8).map((b,F)=>L(D,{dimColor:!0,wrap:"truncate",children:b},F))})]}),$(q,{marginTop:1,flexDirection:"column",children:[$(q,{gap:2,children:[L(D,{bold:!0,dimColor:!0,children:"Network Proxy"}),L(D,{color:"green",children:"\u2713 Active"}),$(D,{dimColor:!0,children:["\u25CF ",Pt," key",Pt!==1?"s":""," in the network cache \xB7"," ",Cr," hit \xB7 ",Sr," miss"]})]}),L(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:k.length===0?L(D,{dimColor:!0,children:" No requests yet."}):k.slice(-8).map((b,F)=>L(D,{dimColor:!0,wrap:"truncate",children:b},F))})]}),g&&$(q,{marginTop:1,flexDirection:"column",children:[$(q,{gap:2,children:[L(D,{bold:!0,dimColor:!0,children:"CDP Debug"}),$(D,{dimColor:!0,children:["\u25CF ",p.length," event(s)"]})]}),L(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:p.length===0?L(D,{dimColor:!0,children:" No CDP events yet."}):p.slice(-8).map((b,F)=>L(D,{dimColor:!0,wrap:"truncate",children:b},F))})]}),$(q,{marginTop:1,gap:1,children:[L(D,{dimColor:!0,children:"["}),L(D,{children:"q"}),L(D,{dimColor:!0,children:"] quit ["}),L(D,{children:"c"}),L(D,{dimColor:!0,children:"] credentials ["}),L(D,{children:"v"}),$(D,{dimColor:!0,children:["] ",rt===0?"open viewer":"relaunch viewer"]})]})]})};async function yr(e){return new Promise(t=>{let i=null,n=c=>{i?.(),t(c)},{unmount:r}=xr(hr(Qe,{...e!==void 0&&{initialMode:e},onComplete:n}),{exitOnCtrlC:!1});i=r})}function br(e){e.command("dev").description("Start the plugin viewer dev server").option("-p, --port <port>","port to listen on","3121").option("-c, --credentials <path>","path to a credentials JSON file").option("-d, --debug","Enable CDP lifecycle logs in the TUI").option("-v, --verbose","Log every CDP event and handled error (implies --debug)").option("--no-viewer","Don't auto-launch the viewer on startup (press [v] to launch manually)").action(async t=>{let i=parseInt(t.port,10),n=process.cwd(),r=`${n}/.kizenapp`;ye(n);let c=null,S,g,{lastPath:_}=await Ie(r);if(t.credentials)c=await Je(t.credentials);else{let l=await Ie(r);if(l.credentialMode==="local")S="local";else if(l.credentialMode==="global"){if(S="global",g=l.activeCredentialProfile,g?(c=await be(g),c||(c=await Y(),g=void 0)):c=await Y(),!c){let x=await yr("global");c=x.credentials,g=x.profileName}}else{let x=await yr();c=x.credentials,S=x.mode,g=x.profileName;let E=x.profileName;await pe(r,{credentialMode:x.mode,...E!==void 0&&{activeCredentialProfile:E}})}}let v=t.verbose===!0,h=v||t.debug===!0,y=t.viewer!==!1,{waitUntilExit:m}=xr(hr(gr,{port:i,pluginDir:n,outputDir:r,credentials:c,...S!==void 0&&{credentialMode:S},...g!==void 0&&{activeCredentialProfile:g},..._!==void 0&&{lastPath:_},debug:h,verbose:v,autoViewer:y}),{exitOnCtrlC:!1});await m()})}var vo=xo(ho(bo(import.meta.url)),"..","package.json"),Co=JSON.parse(yo(vo,"utf-8"));Le.name("appbuilder").description("Kizen plugin app builder").version(Co.version);Kt(Le);At(Le);br(Le);Le.parse();
|
|
174
174
|
//# sourceMappingURL=index.js.map
|