@kizenapps/cli 1.5.2 → 1.6.1-4ca2bd3
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 +12 -12
- package/dist/index.js.map +1 -1
- package/dist/viewer/assets/{CodeStepsPage-DGZVx8Wz.js → CodeStepsPage-BT2DWChv.js} +1 -1
- package/dist/viewer/assets/{ConfigurationPage-DCE50jxK.js → ConfigurationPage-BqOmyoQr.js} +1 -1
- package/dist/viewer/assets/{DevSidebar-BkO0bOpR.js → DevSidebar-CUs-cHq1.js} +1 -1
- package/dist/viewer/assets/{SandboxPage-Lg8-iFmb.js → SandboxPage-zjGzf2BO.js} +1 -1
- package/dist/viewer/assets/{WhenBadge-B-bN_K_6.js → WhenBadge-DWsoo8Rf.js} +1 -1
- package/dist/viewer/assets/api-MJ8ypvzo.js +11 -0
- package/dist/viewer/assets/{calendarSource.worker-Ch3rgZR6.js → calendarSource.worker-Cg0e7QEm.js} +11 -5
- package/dist/viewer/assets/{configStorage-CqY0w-Nt.js → configStorage-DcCxzQCu.js} +1 -1
- package/dist/viewer/assets/{floatingFrame.worker-Bbq7GWth.js → floatingFrame.worker-CAm1NVPN.js} +15 -8
- package/dist/viewer/assets/{generic.worker-Cbl5oax1.js → generic.worker-NxsWBKFc.js} +14 -7
- package/dist/viewer/assets/{index-DA-CwpNw.js → index-ByyMep3r.js} +3 -3
- package/dist/viewer/assets/{recordDetail.worker-DNuhYdSl.js → recordDetail.worker-Cz1r24RX.js} +15 -8
- package/dist/viewer/assets/useCriticalExceptionDialog-D82vwJ1-.js +40 -0
- package/dist/viewer/index.html +2 -2
- package/package.json +4 -3
- package/dist/viewer/assets/api--yBCib3R.js +0 -11
- package/dist/viewer/assets/useCriticalExceptionDialog-BWqpBmfm.js +0 -40
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFileSync as
|
|
2
|
+
import{readFileSync as Ho}from"fs";import{dirname as qo,join as Uo}from"path";import{fileURLToPath as Vo}from"url";import{program as he}from"commander";import{createElement as yn}from"react";import{render as xn}from"ink";import{useEffect as mn,useState as pt}from"react";import{Box as Pe,Text as ye,useApp as gn}from"ink";import{mkdir as Wr,writeFile as Gr}from"fs/promises";import{join as Kr}from"path";import{minifyFiles as Xr,packagePlugin as Yr,transformDeployablePlugin as Zr}from"@kizenapps/packager";import{readdir as Hr,readFile as dt}from"fs/promises";import{join as Bt,relative as qr}from"path";var Ur=new Set([".png",".svg"]),Vr=new Set([".kzn"]),Jr=new Set([".DS_Store"]),ze=new Set(["node_modules",".git",".kizenapp",".github"]);async function Nt(e,t){let o=await Hr(e,{withFileTypes:!0}),n=[];for(let r of o)if(r.isDirectory()){if(ze.has(r.name))continue;n.push(...await Nt(Bt(e,r.name),t))}else r.isFile()&&(Jr.has(r.name)||n.push(Bt(e,r.name)));return n}async function Me(e){let t=await Nt(e,e);return Promise.all(t.map(async o=>{let n=qr(e,o).split("\\").join("/"),r=n.lastIndexOf("."),s=r>=0?n.slice(r).toLowerCase():"";if(Ur.has(s)){let d=await dt(o);return{path:n,content:"",base64Image:d.toString("base64")}}if(Vr.has(s)){let d=await dt(o);return{path:n,content:"",binaryData:d}}let g=await dt(o,"utf-8");return{path:n,content:g}}))}var Qr=["name","api_name","version","entry"];function Dt(e,t){let o=t===void 0?"kizen.json":`kizen.json entry #${String(t+1)}`;for(let n of Qr){let r=e[n];if(typeof r!="string"||r==="")throw new Error(`${o} is missing required field "${n}" (expected a non-empty string).`)}}function en(e){let t;try{t=JSON.parse(e)}catch(o){let n=o instanceof Error?o.message:String(o);throw new Error(`kizen.json is not valid JSON: ${n}`)}if(Array.isArray(t))return t.forEach((o,n)=>{if(typeof o!="object"||o===null)throw new Error(`kizen.json entry #${String(n+1)} is not a JSON object.`);Dt(o,n)}),t;if(typeof t!="object"||t===null)throw new Error("kizen.json must be a JSON object (or array of objects).");return Dt(t),t}var tn=(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 He(e,t,o){await Wr(t,{recursive:!0}),o?.("reading-files");let n=await Me(e);o?.("minifying");let r=await Xr(n);o?.("packaging");let s=r.find(l=>l.path==="kizen.json");if(!s)throw new Error("kizen.json not found in plugin directory.");let g=en(s.content),d=Yr(r,g),C=Object.values(d).map(Zr);o?.("writing-bundle");let x=C.map(l=>{let b=l.release_notes_directory?.replace(/\/$/,""),P=b?n.filter(D=>D.path.startsWith(b+"/")&&D.path.endsWith(".md")&&D.content).map(D=>({version:D.path.slice(D.path.lastIndexOf("/")+1,-3),notes:D.content})).sort((D,S)=>S.version.localeCompare(D.version,void 0,{numeric:!0})):[];return tn(l,P)}),y=JSON.stringify(x,null,2),v=(l,b)=>l==="allReleaseNotes"?void 0:b,h=Buffer.byteLength(JSON.stringify(x,v,2),"utf-8");return await Gr(Kr(t,"bundle.json"),y,"utf-8"),{bundleSize:h}}function Te(e){return e<1024?`${String(e)} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(2)} MB`}import{Box as sn,Text as an}from"ink";import{Box as rn,Text as nn}from"ink";import{jsx as Rt}from"react/jsx-runtime";var on=[" :::::::: "," :::::: ::::::::::: "," :::::: :::::::::: "," :::::: :::::: ::::::: "," ::::: :::::: ::::::::::::::::: "," ::::: ::::: ::::::::::::::::::: "," ::::: ::::: :::::: ::::: ",":::: ::::: ::: ::::: :: ","::::: :::::: :::::::::: ","::::: :::::: ::::::::::: "," ::::: ::: ::::::: "," ::::::: ::: ::::: "," ::::::::::: :::::: :::::"," :::::::::: :::::: :::::"," :: ::::: ::: ::::: ::::"," ::::: :::::: ::::: ::::: ::: "," ::::::::::::::::::: ::::: ::::: "," ::::::::::::::::: ::::: ::::: "," ::::::::: :::::: :::::: "," :::::::::: :::::: "," ::::::::::: :::::: "," :::::::: "],Lt=()=>Rt(rn,{flexDirection:"column",children:on.map((e,t)=>Rt(nn,{color:"cyan",children:e},t))});import{Fragment as ln,jsx as ut,jsxs as cn}from"react/jsx-runtime";var V=({marginBottom:e=0})=>cn(ln,{children:[ut(Lt,{}),ut(sn,{flexDirection:"column",marginTop:1,marginBottom:e,children:ut(an,{bold:!0,color:"cyan",children:"Kizen App Development Toolkit"})})]});import{useEffect as dn,useState as un}from"react";import{Text as pn}from"ink";import{jsx as fn}from"react/jsx-runtime";var Ft=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],qe=()=>{let[e,t]=un(0);return dn(()=>{let o=setInterval(()=>{t(n=>(n+1)%Ft.length)},80);return()=>{clearInterval(o)}},[]),fn(pn,{color:"cyan",children:Ft[e]??"\u280B"})};import{Fragment as hn,jsx as de,jsxs as ue}from"react/jsx-runtime";var jt=["creating-dir","reading-files","minifying","packaging","writing-bundle"],Ue={"creating-dir":"Creating .kizenapp directory","reading-files":"Reading plugin files",minifying:"Minifying scripts",packaging:"Packaging plugin","writing-bundle":"Writing bundle.json"},$t=({outputDir:e,pluginDir:t})=>{let o=gn(),[n,r]=pt("creating-dir"),[s,g]=pt(null),[d,C]=pt(null);mn(()=>{He(t,e,r).then(({bundleSize:h})=>{C(h),r("done"),o.exit()}).catch(h=>{let l=h instanceof Error?h.message:String(h);g(l),r("error"),o.exit()})},[e,t,o]);let x=jt.indexOf(n),y=n==="error",v=n==="done";return ue(Pe,{flexDirection:"column",paddingY:1,paddingX:2,children:[de(V,{marginBottom:1}),ue(Pe,{flexDirection:"column",gap:0,children:[jt.map((h,l)=>{let b=n===h,P=v||x>l;return de(Pe,{gap:1,children:y&&l===x?ue(ye,{color:"red",children:["\u2717 ",Ue[h]]}):P?ue(ye,{color:"green",children:["\u2713 ",Ue[h]]}):b?ue(hn,{children:[de(qe,{}),de(ye,{children:Ue[h]})]}):ue(ye,{dimColor:!0,children:[" ",Ue[h]]})},h)}),v&&d!==null&&de(Pe,{marginTop:1,gap:1,children:ue(ye,{color:"green",children:["\u2713 bundle \u2014 ",Te(d)]})}),s!==null&&de(Pe,{marginTop:1,borderStyle:"single",borderColor:"red",paddingX:1,children:de(ye,{color:"red",children:s})})]})]})};import*as xe from"fs";import*as At from"path";function be(e){let t=At.join(e,".gitignore"),o=".kizenapp/",n="";if(xe.existsSync(t)){n=xe.readFileSync(t,"utf8");let s=n.split(`
|
|
3
3
|
`).map(g=>g.trim());if(s.includes(o)||s.includes(".kizenapp"))return}let r=n.endsWith(`
|
|
4
4
|
`)?o+`
|
|
5
5
|
`:`
|
|
6
6
|
`+o+`
|
|
7
|
-
`;xe.writeFileSync(t,n+r)}function Ot(e){e.command("build").description("Bundle the plugin app into .kizenapp directory").action(async()=>{let t=process.cwd(),o=`${t}/.kizenapp`;be(t);let{waitUntilExit:n}=yn(
|
|
8
|
-
`,"utf-8"),await ft(ue(e.targetDir,"src"),{recursive:!0}),await ft(ue(e.targetDir,"releaseNotes"),{recursive:!0}),be(e.targetDir)}import{jsx as T,jsxs as $}from"react/jsx-runtime";var pe=["name","apiName","externalLink","description","developerBusinessId"],qt={name:"Name",apiName:"API name",externalLink:"External link",description:"Description",developerBusinessId:"Business ID"},Ut=["name","apiName"];function Cn(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")}var ve=({text:e})=>T(I,{dimColor:!0,children:e});function Sn(e){return{name:"",apiName:"",externalLink:"",description:"",developerBusinessId:e}}var Vt=({parentDir:e,defaultBusinessId:t})=>{let o=vn(),[n,r]=Ee({type:"target-select",cursor:0}),[s,g]=Ee("in-place"),[d,C]=Ee(()=>Sn(t)),[x,y]=Ee(""),[v,h]=Ee(e),l=Je((S,m)=>{g(S),y(m.name),r({type:"field-entry",field:0,values:m})},[]),b=Je(async S=>{let m=await zt(S);if(m!=="ok"){r({type:"precheck-error",targetDir:S,reason:m});return}h(S),l("in-place",d)},[d,l]),P=Je(async S=>{try{let m=await Mt(e,S.apiName);h(m),r({type:"confirm",values:S})}catch(m){r({type:"error",message:m instanceof Error?m.message:String(m)})}},[e]),D=Je(async(S,m)=>{try{await Ht({targetDir:m,name:S.name,apiName:S.apiName,externalLink:S.externalLink,description:S.description,developerBusinessId:S.developerBusinessId}),r({type:"done",targetDir:m})}catch(p){r({type:"error",message:p instanceof Error?p.message:String(p)})}},[]);if(wn((S,m)=>{if(m.ctrl&&S==="c"){o.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?b(e):l("sub-dir",d):m.escape&&o.exit();return}if(n.type==="precheck-error"){(m.return||m.escape)&&o.exit();return}if(n.type==="field-entry"){let{field:p,values:_}=n,a=pe[p];if(!a)return;if(m.escape){o.exit();return}if(m.backspace||m.delete){y(i=>i.slice(0,-1));return}if(m.upArrow&&p>0){let i={..._,[a]:x},c=p-1,u=pe[c];r({type:"field-entry",field:c,values:i}),C(i),y(u?i[u]:"");return}if(m.return||m.tab||m.downArrow){let i=x.trim();if(Ut.includes(a)&&!i){r({type:"field-entry",field:p,values:_,fieldError:`${qt[a]} is required`});return}let u=a==="description"?x:i,f={..._,[a]:u};C(f);let j=p+1;if(j>=pe.length)y(""),s==="sub-dir"?(r({type:"resolving-target"}),P(f)):r({type:"confirm",values:f});else{let E=pe[j],R=E?f[E]:"",A=E==="apiName"&&!R?Cn(f.name):R;r({type:"field-entry",field:j,values:f}),y(A)}return}S&&!m.ctrl&&!m.meta&&y(i=>i+S);return}if(n.type==="confirm"){if(m.escape){let p=pe.length-1,_=pe[p];r({type:"field-entry",field:p,values:n.values}),y(_?n.values[_]:"");return}m.return&&(r({type:"writing"}),D(n.values,v));return}(n.type==="done"||n.type==="error")&&(m.return||m.escape)&&o.exit()}),n.type==="target-select"){let S=[{label:"Use current directory",desc:e},{label:"Create new sub-directory",desc:`${e}/<inferred from API name>`}];return $(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),$(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Where should the new plugin live?"}),S.map((m,p)=>{let _=n.cursor===p;return $(M,{gap:2,children:[T(I,{..._&&{color:"cyan"},children:_?"\u276F":" "}),T(I,{bold:_,..._&&{color:"cyan"},children:m.label}),T(I,{dimColor:!0,children:m.desc})]},m.label)})]}),T(ve,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(n.type==="precheck-error"){let{targetDir:S,reason:m}=n;return $(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),T(I,{color:"red",bold:!0,children:"Cannot create plugin"}),$(M,{flexDirection:"column",gap:0,children:[$(I,{children:[S," already contains ",T(I,{bold:!0,children:m==="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(ve,{text:"Enter or Esc to exit"})]})}if(n.type==="field-entry"){let{field:S,fieldError:m}=n,p=s==="sub-dir"?`Target: sub-directory of ${e} (inferred from API name)`:`Target: ${v}`;return $(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),$(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Plugin details"}),T(I,{dimColor:!0,children:p})]}),m!==void 0&&$(I,{color:"red",children:["Error: ",m]}),T(M,{flexDirection:"column",gap:0,children:pe.map((_,a)=>{let i=S===a,c=i?x:d[_],u=Ut.includes(_),f=`${qt[_]}${u?"":" (optional)"}`;return $(M,{gap:2,children:[T(M,{width:24,children:T(I,{bold:i,...i&&{color:"cyan"},children:f})}),T(I,{...i&&{color:"cyan"},children:">"}),T(I,{children:c}),i&&T(I,{color:"cyan",children:"\u2588"})]},_)})}),T(ve,{text:"Enter/Tab/\u2193 next \xB7 \u2191 previous \xB7 Backspace delete \xB7 Esc cancel"})]})}if(n.type==="confirm"){let S=mt({targetDir:v,name:n.values.name,apiName:n.values.apiName,externalLink:n.values.externalLink,description:n.values.description,developerBusinessId:n.values.developerBusinessId});return $(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),$(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Ready to create"}),$(I,{dimColor:!0,children:["Target: ",v]})]}),$(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"kizen.json preview"}),T(I,{children:JSON.stringify(S,null,2)})]}),$(M,{flexDirection:"column",gap:0,children:[T(I,{dimColor:!0,children:"Also creates:"}),$(I,{dimColor:!0,children:[" ",gt(v,"src/")]}),$(I,{dimColor:!0,children:[" ",gt(v,"releaseNotes/")]}),$(I,{dimColor:!0,children:[" ",gt(v,".gitignore")," (adds .kizenapp/)"]})]}),T(ve,{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"?$(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),$(I,{color:"green",bold:!0,children:["Plugin created at ",n.targetDir]}),$(M,{flexDirection:"column",gap:0,children:[T(I,{dimColor:!0,children:"Next steps:"}),$(I,{children:[" ","cd ",n.targetDir]}),$(I,{children:[" ","appbuilder dev"]})]}),T(ve,{text:"Enter or Esc to exit"})]}):$(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(ve,{text:"Enter or Esc to exit"})]})};import{mkdir as Jt,readFile as _n,readdir as kn,writeFile as Wt}from"fs/promises";import{homedir as Tn}from"os";import{dirname as Pn,join as We}from"path";var K=["go","fmo","staging","integration","test1"];var fe=We(Tn(),".kizenappbuilder"),we=We(fe,"credentials.json"),ne="credentials";function En(e){return K.includes(e)}function In(e){if(typeof e!="object"||e===null)throw new Error("Credentials must be a JSON object");let t=e,o=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:En(o)?o:"go"}}async function Ge(e){let t=await _n(e,"utf-8");return In(JSON.parse(t))}async function Y(){try{return await Ge(we)}catch{return null}}async function Bn(e){await Jt(Pn(we),{recursive:!0,mode:448}),await Wt(we,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384})}function Gt(e){return We(fe,`${e}.json`)}async function Ie(){let e=[{name:ne,path:we,isDefault:!0}];try{let t=await kn(fe);for(let o of t){if(!o.endsWith(".json"))continue;let n=o.slice(0,-5);n!==ne&&e.push({name:n,path:We(fe,o),isDefault:!1})}}catch{}return e}async function Kt(e,t){if(e===ne){await Bn(t);return}await Jt(fe,{recursive:!0,mode:448}),await Wt(Gt(e),JSON.stringify(t,null,2),{encoding:"utf-8",mode:384})}async function Ce(e){try{return await Ge(Gt(e))}catch{return null}}function Xt(e){e.command("create").description("Scaffold a new Kizen plugin project").action(async()=>{let t=process.cwd(),n=(await Y())?.businessId??"",{waitUntilExit:r}=Dn(Nn(Vt,{parentDir:t,defaultBusinessId:n}),{exitOnCtrlC:!1});await r()})}import{createElement as br}from"react";import{render as vr}from"ink";import{useCallback as Se,useEffect as tt,useRef as Q,useState as J}from"react";import{Box as U,Text as N,useInput as So}from"ink";import{watch as _o}from"fs";import{createServer as ko}from"http";import{join as hr}from"path";import{WebSocketServer as To}from"ws";import{createReadStream as ir,realpathSync as Gn}from"fs";import{access as Kn,readdir as Xn,readFile as Yn,realpath as Zn,stat as sr}from"fs/promises";import{dirname as Qn,extname as ar,join as Re,resolve as eo,sep as St}from"path";import{fileURLToPath as to}from"url";var Rn=new Set(["set-cookie","strict-transport-security","content-security-policy","content-security-policy-report-only","x-frame-options","content-encoding","content-length"]);function ht(e){let t={};for(let[o,n]of Object.entries(e)){let r=o.toLowerCase();Rn.has(r)||r.startsWith("access-control-")||(t[o]=n)}return t}var yt=10*1024*1024,Ln=6e4,Fn=200,Be=class extends Error{bytesRead;limit;constructor(t,o){super(`Upstream response exceeded ${String(o)} bytes (read ${String(t)}).`),this.name="ProxyResponseTooLargeError",this.bytesRead=t,this.limit=o}};async function xt(e,t){let o=e.body;if(o===null)return Buffer.alloc(0);let n=[],r=0;for await(let s of o){if(r+=s.length,r>t)throw new Be(r,t);n.push(s)}return Buffer.concat(n)}function Yt(e={}){let t=new Map,{onChange:o}=e,n=()=>{o?.(t.size)},r=s=>{t.delete(s)&&n()};return{get(s,g){let d=t.get(s);if(d!==void 0){if(Date.now()-d.insertedAt<Ln)return d.promise.then(x=>({response:x,fromCache:!0}));r(s)}if(t.size>=Fn){let x=t.keys().next().value;x!==void 0&&r(x)}let C=g().then(async x=>{let y=ht(Object.fromEntries(x.headers)),v=await xt(x,yt);return{status:x.status,headers:y,body:v}}).catch(x=>{throw r(s),x});return t.set(s,{insertedAt:Date.now(),promise:C}),n(),C.then(x=>((x.status<200||x.status>=300)&&r(s),{response:x,fromCache:!1}))},clear(){t.clear(),n()}}}var bt={".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 jn,readFile as $n,writeFile as An}from"fs/promises";import{join as Zt}from"path";async function Ne(e){try{let t=await $n(Zt(e,"config.json"),"utf-8");return JSON.parse(t)}catch{return{}}}async function me(e,t){await jn(e,{recursive:!0}),await An(Zt(e,"config.json"),JSON.stringify(t,null,2),"utf-8")}import{spawn as tr}from"child_process";import{writeFile as Qt,rm as rr,mkdtemp as On,access as zn}from"fs/promises";import{join as De}from"path";import{tmpdir as Mn}from"os";var Hn=`
|
|
7
|
+
`;xe.writeFileSync(t,n+r)}function Ot(e){e.command("build").description("Bundle the plugin app into .kizenapp directory").action(async()=>{let t=process.cwd(),o=`${t}/.kizenapp`;be(t);let{waitUntilExit:n}=xn(yn($t,{outputDir:o,pluginDir:t}));await n()})}import{createElement as Dn}from"react";import{render as Rn}from"ink";import{useCallback as Je,useState as Ee}from"react";import{Box as M,Text as I,useApp as wn,useInput as Cn}from"ink";import{join as gt}from"path";import{access as bn,mkdir as ft,writeFile as vn}from"fs/promises";import{join as pe}from"path";async function Ve(e){try{return await bn(e),!0}catch{return!1}}async function zt(e){return await Ve(pe(e,"kizen.json"))?"has-manifest":await Ve(pe(e,".kizenapp"))?"has-kizenapp":"ok"}async function Mt(e,t){let o=pe(e,t);if(!await Ve(o))return o;for(let n=1;n<1e3;n++){let r=pe(e,`${t}-${String(n)}`);if(!await Ve(r))return r}throw new Error(`Could not find an available directory name for "${t}"`)}function mt(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 Ht(e){await ft(e.targetDir,{recursive:!0});let t=mt(e);await vn(pe(e.targetDir,"kizen.json"),JSON.stringify(t,null,2)+`
|
|
8
|
+
`,"utf-8"),await ft(pe(e.targetDir,"src"),{recursive:!0}),await ft(pe(e.targetDir,"releaseNotes"),{recursive:!0}),be(e.targetDir)}import{jsx as T,jsxs as $}from"react/jsx-runtime";var fe=["name","apiName","externalLink","description","developerBusinessId"],qt={name:"Name",apiName:"API name",externalLink:"External link",description:"Description",developerBusinessId:"Business ID"},Ut=["name","apiName"];function Sn(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")}var ve=({text:e})=>T(I,{dimColor:!0,children:e});function _n(e){return{name:"",apiName:"",externalLink:"",description:"",developerBusinessId:e}}var Vt=({parentDir:e,defaultBusinessId:t})=>{let o=wn(),[n,r]=Ee({type:"target-select",cursor:0}),[s,g]=Ee("in-place"),[d,C]=Ee(()=>_n(t)),[x,y]=Ee(""),[v,h]=Ee(e),l=Je((S,m)=>{g(S),y(m.name),r({type:"field-entry",field:0,values:m})},[]),b=Je(async S=>{let m=await zt(S);if(m!=="ok"){r({type:"precheck-error",targetDir:S,reason:m});return}h(S),l("in-place",d)},[d,l]),P=Je(async S=>{try{let m=await Mt(e,S.apiName);h(m),r({type:"confirm",values:S})}catch(m){r({type:"error",message:m instanceof Error?m.message:String(m)})}},[e]),D=Je(async(S,m)=>{try{await Ht({targetDir:m,name:S.name,apiName:S.apiName,externalLink:S.externalLink,description:S.description,developerBusinessId:S.developerBusinessId}),r({type:"done",targetDir:m})}catch(p){r({type:"error",message:p instanceof Error?p.message:String(p)})}},[]);if(Cn((S,m)=>{if(m.ctrl&&S==="c"){o.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?b(e):l("sub-dir",d):m.escape&&o.exit();return}if(n.type==="precheck-error"){(m.return||m.escape)&&o.exit();return}if(n.type==="field-entry"){let{field:p,values:_}=n,a=fe[p];if(!a)return;if(m.escape){o.exit();return}if(m.backspace||m.delete){y(i=>i.slice(0,-1));return}if(m.upArrow&&p>0){let i={..._,[a]:x},c=p-1,u=fe[c];r({type:"field-entry",field:c,values:i}),C(i),y(u?i[u]:"");return}if(m.return||m.tab||m.downArrow){let i=x.trim();if(Ut.includes(a)&&!i){r({type:"field-entry",field:p,values:_,fieldError:`${qt[a]} is required`});return}let u=a==="description"?x:i,f={..._,[a]:u};C(f);let j=p+1;if(j>=fe.length)y(""),s==="sub-dir"?(r({type:"resolving-target"}),P(f)):r({type:"confirm",values:f});else{let E=fe[j],R=E?f[E]:"",A=E==="apiName"&&!R?Sn(f.name):R;r({type:"field-entry",field:j,values:f}),y(A)}return}S&&!m.ctrl&&!m.meta&&y(i=>i+S);return}if(n.type==="confirm"){if(m.escape){let p=fe.length-1,_=fe[p];r({type:"field-entry",field:p,values:n.values}),y(_?n.values[_]:"");return}m.return&&(r({type:"writing"}),D(n.values,v));return}(n.type==="done"||n.type==="error")&&(m.return||m.escape)&&o.exit()}),n.type==="target-select"){let S=[{label:"Use current directory",desc:e},{label:"Create new sub-directory",desc:`${e}/<inferred from API name>`}];return $(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),$(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Where should the new plugin live?"}),S.map((m,p)=>{let _=n.cursor===p;return $(M,{gap:2,children:[T(I,{..._&&{color:"cyan"},children:_?"\u276F":" "}),T(I,{bold:_,..._&&{color:"cyan"},children:m.label}),T(I,{dimColor:!0,children:m.desc})]},m.label)})]}),T(ve,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(n.type==="precheck-error"){let{targetDir:S,reason:m}=n;return $(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),T(I,{color:"red",bold:!0,children:"Cannot create plugin"}),$(M,{flexDirection:"column",gap:0,children:[$(I,{children:[S," already contains ",T(I,{bold:!0,children:m==="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(ve,{text:"Enter or Esc to exit"})]})}if(n.type==="field-entry"){let{field:S,fieldError:m}=n,p=s==="sub-dir"?`Target: sub-directory of ${e} (inferred from API name)`:`Target: ${v}`;return $(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),$(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Plugin details"}),T(I,{dimColor:!0,children:p})]}),m!==void 0&&$(I,{color:"red",children:["Error: ",m]}),T(M,{flexDirection:"column",gap:0,children:fe.map((_,a)=>{let i=S===a,c=i?x:d[_],u=Ut.includes(_),f=`${qt[_]}${u?"":" (optional)"}`;return $(M,{gap:2,children:[T(M,{width:24,children:T(I,{bold:i,...i&&{color:"cyan"},children:f})}),T(I,{...i&&{color:"cyan"},children:">"}),T(I,{children:c}),i&&T(I,{color:"cyan",children:"\u2588"})]},_)})}),T(ve,{text:"Enter/Tab/\u2193 next \xB7 \u2191 previous \xB7 Backspace delete \xB7 Esc cancel"})]})}if(n.type==="confirm"){let S=mt({targetDir:v,name:n.values.name,apiName:n.values.apiName,externalLink:n.values.externalLink,description:n.values.description,developerBusinessId:n.values.developerBusinessId});return $(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),$(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"Ready to create"}),$(I,{dimColor:!0,children:["Target: ",v]})]}),$(M,{flexDirection:"column",gap:0,children:[T(I,{bold:!0,children:"kizen.json preview"}),T(I,{children:JSON.stringify(S,null,2)})]}),$(M,{flexDirection:"column",gap:0,children:[T(I,{dimColor:!0,children:"Also creates:"}),$(I,{dimColor:!0,children:[" ",gt(v,"src/")]}),$(I,{dimColor:!0,children:[" ",gt(v,"releaseNotes/")]}),$(I,{dimColor:!0,children:[" ",gt(v,".gitignore")," (adds .kizenapp/)"]})]}),T(ve,{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"?$(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),$(I,{color:"green",bold:!0,children:["Plugin created at ",n.targetDir]}),$(M,{flexDirection:"column",gap:0,children:[T(I,{dimColor:!0,children:"Next steps:"}),$(I,{children:[" ","cd ",n.targetDir]}),$(I,{children:[" ","appbuilder dev"]})]}),T(ve,{text:"Enter or Esc to exit"})]}):$(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(ve,{text:"Enter or Esc to exit"})]})};import{mkdir as Jt,readFile as kn,readdir as Tn,writeFile as Wt}from"fs/promises";import{homedir as Pn}from"os";import{dirname as En,join as We}from"path";var K=["go","fmo","staging","integration","test1"];var me=We(Pn(),".kizenappbuilder"),we=We(me,"credentials.json"),oe="credentials";function In(e){return K.includes(e)}function Bn(e){if(typeof e!="object"||e===null)throw new Error("Credentials must be a JSON object");let t=e,o=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:In(o)?o:"go"}}async function Ge(e){let t=await kn(e,"utf-8");return Bn(JSON.parse(t))}async function Y(){try{return await Ge(we)}catch{return null}}async function Nn(e){await Jt(En(we),{recursive:!0,mode:448}),await Wt(we,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384})}function Gt(e){return We(me,`${e}.json`)}async function Ie(){let e=[{name:oe,path:we,isDefault:!0}];try{let t=await Tn(me);for(let o of t){if(!o.endsWith(".json"))continue;let n=o.slice(0,-5);n!==oe&&e.push({name:n,path:We(me,o),isDefault:!1})}}catch{}return e}async function Kt(e,t){if(e===oe){await Nn(t);return}await Jt(me,{recursive:!0,mode:448}),await Wt(Gt(e),JSON.stringify(t,null,2),{encoding:"utf-8",mode:384})}async function Ce(e){try{return await Ge(Gt(e))}catch{return null}}function Xt(e){e.command("create").description("Scaffold a new Kizen plugin project").action(async()=>{let t=process.cwd(),n=(await Y())?.businessId??"",{waitUntilExit:r}=Rn(Dn(Vt,{parentDir:t,defaultBusinessId:n}),{exitOnCtrlC:!1});await r()})}import{createElement as vr}from"react";import{render as wr}from"ink";import{useCallback as Se,useEffect as tt,useRef as te,useState as J}from"react";import{Box as U,Text as N,useInput as _o}from"ink";import{watch as ko}from"fs";import{createServer as To}from"http";import{join as yr}from"path";import{WebSocketServer as Po}from"ws";import{createReadStream as ir,realpathSync as Kn}from"fs";import{access as Xn,readdir as Yn,readFile as Zn,realpath as Qn,stat as sr}from"fs/promises";import{dirname as eo,extname as ar,join as Re,resolve as to,sep as St}from"path";import{fileURLToPath as ro}from"url";var Ln=new Set(["set-cookie","strict-transport-security","content-security-policy","content-security-policy-report-only","x-frame-options","content-encoding","content-length"]);function ht(e){let t={};for(let[o,n]of Object.entries(e)){let r=o.toLowerCase();Ln.has(r)||r.startsWith("access-control-")||(t[o]=n)}return t}var yt=10*1024*1024,Fn=6e4,jn=200,Be=class extends Error{bytesRead;limit;constructor(t,o){super(`Upstream response exceeded ${String(o)} bytes (read ${String(t)}).`),this.name="ProxyResponseTooLargeError",this.bytesRead=t,this.limit=o}};async function xt(e,t){let o=e.body;if(o===null)return Buffer.alloc(0);let n=[],r=0;for await(let s of o){if(r+=s.length,r>t)throw new Be(r,t);n.push(s)}return Buffer.concat(n)}function Yt(e={}){let t=new Map,{onChange:o}=e,n=()=>{o?.(t.size)},r=s=>{t.delete(s)&&n()};return{get(s,g){let d=t.get(s);if(d!==void 0){if(Date.now()-d.insertedAt<Fn)return d.promise.then(x=>({response:x,fromCache:!0}));r(s)}if(t.size>=jn){let x=t.keys().next().value;x!==void 0&&r(x)}let C=g().then(async x=>{let y=ht(Object.fromEntries(x.headers)),v=await xt(x,yt);return{status:x.status,headers:y,body:v}}).catch(x=>{throw r(s),x});return t.set(s,{insertedAt:Date.now(),promise:C}),n(),C.then(x=>((x.status<200||x.status>=300)&&r(s),{response:x,fromCache:!1}))},clear(){t.clear(),n()}}}var bt={".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 $n,readFile as An,writeFile as On}from"fs/promises";import{join as Zt}from"path";async function Ne(e){try{let t=await An(Zt(e,"config.json"),"utf-8");return JSON.parse(t)}catch{return{}}}async function ge(e,t){await $n(e,{recursive:!0}),await On(Zt(e,"config.json"),JSON.stringify(t,null,2),"utf-8")}import{spawn as tr}from"child_process";import{writeFile as Qt,rm as rr,mkdtemp as zn,access as Mn}from"fs/promises";import{join as De}from"path";import{tmpdir as Hn}from"os";var qn=`
|
|
9
9
|
import sys, json, os, traceback
|
|
10
10
|
|
|
11
11
|
# --- Inputs proxy (attribute access) ---
|
|
@@ -165,16 +165,16 @@ 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(),
|
|
168
|
+
`.trim(),Un=3e4,vt=De(process.cwd(),".kizenapp","venv"),Vn=["awslambdaric","bcrypt","fpdf2","lxml","msgpack","numpy","oracledb","paramiko","psycopg","pyjwt","pymysql","pypdf","pytz","requests","sqlalchemy","tzdata"],Ke=null;function Jn(e){let t=/^python-(\d+\.\d+)$/.exec(e);return t?.[1]?`python${t[1]}`:"python3"}function er(e,t,o){return new Promise((n,r)=>{let s=tr(e,t,{stdio:["ignore","pipe","pipe"]}),g=(C,x)=>{let y=[],v="";return C.on("data",h=>{v+=h.toString("utf-8");let l=v.indexOf(`
|
|
169
169
|
`);for(;l>=0;){let b=v.slice(0,l).replace(/\r$/,"");v=v.slice(l+1),y.push(b),o?.(b,x),l=v.indexOf(`
|
|
170
170
|
`)}}),C.on("end",()=>{if(v.length>0){let h=v.replace(/\r$/,"");y.push(h),o?.(h,x)}}),y},d=g(s.stderr,"stderr");g(s.stdout,"stdout"),s.on("error",r),s.on("close",C=>{if(C===0)n();else{let x=d.slice(-10).join(`
|
|
171
|
-
`).trim(),y=x.length>0?`: ${x}`:"";r(new Error(`${e} exited with code ${String(C)}${y}`))}})})}var wt=new Set;function Xe(e){for(let t of wt)t(e)}function Jn(e,t){return t&&wt.add(t),Ke||(Ke=(async()=>{let o=De(vt,"bin","python");try{await zn(o)}catch{let n=Vn(e);await er(n,["-m","venv",vt])}Xe({kind:"start"});try{await er(o,["-m","pip","install","--disable-pip-version-check",...Un],(n,r)=>{Xe({kind:"log",line:n,stream:r})}),Xe({kind:"complete"})}catch(n){let r=n instanceof Error?n.message:String(n);throw Xe({kind:"error",message:r}),Ke=null,await rr(vt,{recursive:!0,force:!0}).catch(()=>{}),n}finally{wt.clear()}return o})()),Ke}function Wn(e){let t="__KIZEN_RESULT_START__",o="__KIZEN_RESULT_END__",n=e.indexOf(t),r=e.indexOf(o);if(n===-1||r===-1)return{userStdout:e,result:null};let s=e.slice(0,n).trimEnd(),g=e.slice(n+t.length,r).trim();try{let d=JSON.parse(g);return{userStdout:s,result:d}}catch{return{userStdout:e,result:null}}}async function nr(e){let t=e.timeout??qn,o=await Jn(e.scriptRuntime,e.onInstallProgress),n=Date.now(),r;try{r=await On(De(Mn(),"kizen-step-"));let s=De(r,"wrapper.py"),g=De(r,"script.py");await Promise.all([Qt(s,Hn,"utf-8"),Qt(g,e.script,"utf-8")]);let d={...process.env,__KIZEN_INPUTS__:JSON.stringify(e.inputs),__KIZEN_SECRETS__:JSON.stringify(e.secrets),__KIZEN_SCRIPT_PATH__:g},{exitCode:C,stdout:x,stderr:y}=await new Promise(P=>{let D=[],S=[],m=!1,p=tr(o,[s],{env:d,cwd:r,stdio:["ignore","pipe","pipe"]}),_=setTimeout(()=>{p.kill("SIGKILL")},t);p.stdout.on("data",i=>{D.push(i)}),p.stderr.on("data",i=>{S.push(i)});let a=i=>{m||(m=!0,clearTimeout(_),P({exitCode:i??1,stdout:Buffer.concat(D).toString("utf-8"),stderr:Buffer.concat(S).toString("utf-8")}))};p.on("close",a),p.on("error",i=>{m||(m=!0,clearTimeout(_),P({exitCode:1,stdout:"",stderr:i.message}))})}),v=Date.now()-n,{userStdout:h,result:l}=Wn(x);if(l){let P={success:l.success,outputValues:l.outputValues,logs:l.logs,stdout:h,stderr:y,exitCode:C,durationMs:v};return l.error!==null&&(P.error=l.error),l.httpRequests&&(P.httpRequests=l.httpRequests),P}let b={success:!1,outputValues:{},logs:[],stdout:h,stderr:y,exitCode:C,durationMs:v};return C!==0&&(b.error=`Process exited with code ${String(C)}`),b}finally{r&&rr(r,{recursive:!0,force:!0})}}var or=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 Ct(e){if(e.kind==="info")return e.message;let t=e.fromCache?" [cache]":"";return`${e.method} ${e.url} \u2192 ${String(e.status)}${t}`}var ro=2*1024*1024,no=new Set([".DS_Store",".gitignore"]);function oo(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 io=["kizen.com","kizen.dev"];function so(e){let t;try{t=new URL(e)}catch{return!1}if(t.protocol!=="https:")return!1;let o=t.hostname.toLowerCase();return io.some(n=>o===n||o.endsWith("."+n))}function ao(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 lr(e,t){if(t.includes("\0"))return null;let o=t.replace(/^\/+/,""),n=eo(e,o);if(n!==e&&!n.startsWith(e+St))return null;try{let r=await Zn(n);return r!==e&&!r.startsWith(e+St)?null:r}catch{return null}}function cr(e,t){let o=t===e?"":t.slice(e.length+1);return o===""?!1:o.split(St).some(r=>ze.has(r))}function dr(){let e=to(import.meta.url);return Re(Qn(e),"viewer")}async function _t(e){try{return await Kn(e),!0}catch{return!1}}function ur(e,t,o,n,r,s,g,d,C,x){let y=Yt({onChange:d}),v=Gn(x);return(h,l)=>{(async()=>{let b=h.url??"/";try{if(!oo(h.headers.host)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Forbidden"}));return}if((h.method==="POST"||h.method==="PATCH"||h.method==="DELETE")&&!ao(h.headers.origin)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Forbidden"}));return}if(t(`Received request: ${b}`),b==="/api/credentials"){l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({credentials:n.current??null,activeProfile:r.current??null}));return}if(b==="/api/credential-profiles"&&h.method==="GET"){let a=await Ie();l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({profiles:a,active:r.current}));return}if(b==="/api/credentials/switch"&&h.method==="POST"){let a=[];for await(let f of h)a.push(f);let c=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}").profile,u=c===void 0||c===""?await Y():await Ce(c);if(u!==null){n.current=u,r.current=c??void 0;let f=r.current;await me(s,{credentialMode:"global",...f!==void 0&&{activeCredentialProfile:f}}),g({type:"credentials-updated",credentials:u,activeProfile:r.current??null})}l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({ok:u!==null}));return}if(b==="/api/bundle"){let a=Re(process.cwd(),".kizenapp","bundle.json");try{let i=await Yn(a,"utf-8");l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(i)}catch{l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end("{}")}return}if(b==="/api/last-path"&&h.method==="POST"){let a=[];for await(let c of h)a.push(c);let i=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}");if(typeof i.path=="string"){C.current=i.path;let c=await Ne(s);await me(s,{...c,lastPath:i.path})}l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end('{"ok":true}');return}if(b==="/api/execute-step"&&h.method==="POST"){let a=[];for await(let f of h)a.push(f);let i=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}");if(typeof i.script!="string"){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Missing required field: script"}));return}let c={script:i.script,scriptRuntime:i.scriptRuntime??"python-3.9",inputs:i.inputs??{},secrets:i.secrets??{},onInstallProgress:f=>{f.kind==="start"?g({type:"venv-install-start"}):f.kind==="log"?g({type:"venv-install-log",line:f.line,stream:f.stream}):f.kind==="complete"?g({type:"venv-install-complete"}):g({type:"venv-install-error",message:f.message})}};typeof i.timeout=="number"&&i.timeout>0&&(c.timeout=Math.min(i.timeout,300*1e3));let u=await nr(c);l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify(u));return}if(b==="/api/proxy-cache/clear"){y.clear(),o({kind:"info",message:"Proxy cache cleared"}),l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end('{"ok":true}');return}if(b.startsWith("/api/proxy")){let a=h.headers["x-proxy-target"];if(typeof a!="string"){l.writeHead(400),l.end("Missing x-proxy-target header");return}if(!so(a)){l.writeHead(400),l.end("Invalid proxy target");return}let i=b.slice(10)||"/",c=`${a}${i}`,u=h.method??"GET",f=[];for await(let _e of h)f.push(_e);let{host:j,"x-proxy-target":E,...R}=h.headers;if(u==="GET"){let _e=`GET::${c}`,{response:se,fromCache:nt}=await y.get(_e,()=>fetch(c,{method:"GET",headers:R}));o({kind:"request",method:"GET",status:se.status,fromCache:nt,url:i}),l.writeHead(se.status,se.headers),l.end(se.body);return}let A=f.length>0?Buffer.concat(f):void 0,H=A&&A.length>0?A:void 0,W=await fetch(c,{method:u,headers:R,...H!==void 0&&{body:H}}),ee=ht(Object.fromEntries(W.headers)),he=await xt(W,yt);o({kind:"request",method:u,status:W.status,fromCache:!1,url:i}),l.writeHead(W.status,ee),l.end(he);return}if(b.startsWith("/api/source/tree")&&h.method==="GET"){let i=new URL(b,"http://localhost").searchParams.get("path")??"",c=await lr(v,i);if(c===null){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Invalid path"}));return}if(cr(v,c)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Path is excluded"}));return}try{let u=await Xn(c,{withFileTypes:!0}),f=await Promise.all(u.filter(E=>E.isDirectory()?!ze.has(E.name):E.isFile()?!no.has(E.name):!1).map(async E=>{let R=E.isDirectory()?"dir":"file",A={name:E.name,kind:R};if(R==="file")try{let H=await sr(Re(c,E.name));A.size=H.size}catch{}return A}));f.sort((E,R)=>E.kind!==R.kind?E.kind==="dir"?-1:1:E.name.localeCompare(R.name));let j=c===v?"":c.slice(v.length+1);l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({path:j,entries:f}))}catch(u){let f=u instanceof Error?u.message:String(u);t(`source/tree failed (${i}): ${f}`),l.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not found"}))}return}if(b.startsWith("/api/source/file")&&h.method==="GET"){let i=new URL(b,"http://localhost").searchParams.get("path")??"";if(i===""){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Missing path"}));return}let c=await lr(v,i);if(c===null){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Invalid path"}));return}if(cr(v,c)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Path is excluded"}));return}try{let u=await sr(c);if(!u.isFile()){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not a file"}));return}if(u.size>ro){l.writeHead(413,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"File too large",size:u.size}));return}let f=ar(c).toLowerCase(),j=bt[f],E=or.has(f),R=j??(E?"text/plain; charset=utf-8":"application/octet-stream");l.writeHead(200,{"Content-Type":R,"Content-Length":String(u.size)}),ir(c).pipe(l)}catch(u){let f=u instanceof Error?u.message:String(u);t(`source/file failed (${i}): ${f}`),l.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not found"}))}return}let S=Re(e,b==="/"?"/index.html":b),m=await _t(S)?S:Re(e,"index.html"),p=ar(m),_=bt[p]??"application/octet-stream";l.writeHead(200,{"Content-Type":_}),ir(m).pipe(l)}catch(P){if(b.startsWith("/api/proxy")){let D=b.slice(10)||"/",S=h.method??"GET";P instanceof Be?o({kind:"info",message:`${S} ${D} \u2192 502 (response exceeded ${String(P.limit)} bytes)`}):o({kind:"request",method:S,status:502,fromCache:!1,url:D})}else o({kind:"info",message:`Error handling ${b}: ${P instanceof Error?P.message:String(P)}`});l.headersSent||(l.writeHead(502),l.end("Bad Gateway"))}})()}}import{launch as lo}from"chrome-launcher";import{createRequire as co}from"module";import{mkdirSync as uo}from"fs";import{readFile as po}from"fs/promises";import{dirname as fo,join as mo}from"path";import{fileURLToPath as go}from"url";var pr=co(import.meta.url)("chrome-remote-interface"),ho=new Set(["content-security-policy","content-security-policy-report-only","x-frame-options"]),mr=["kizen.dev","kizen.com"];function fr(e){try{let{hostname:t}=new URL(e);return mr.some(o=>t===o||t.endsWith("."+o))}catch{return!1}}async function yo(e){try{let t=mo(fo(go(import.meta.url)),"viewer","icon.png"),o=await po(t);await e.Browser.setDockTile({image:o.toString("base64")})}catch{}}async function gr(e){uo(e.userDataDir,{recursive:!0});let t=`http://localhost:${String(e.port)}`,o=await lo({startingUrl:t,chromeFlags:[`--app=${t}`,"--no-first-run","--no-default-browser-check","--disable-extensions","--disable-features=DeviceBoundSessions"],userDataDir:e.userDataDir,handleSIGINT:!1,logLevel:"silent"}),n=o.port,r=null,s=null,g=null,d=null,C=0,x=!1,y=p=>{e.debugLog?.(p)},v=p=>{e.verbose&&e.debugLog?.(p)},h=()=>{s!==null&&(clearInterval(s),s=null)},l=p=>p==="chrome://new-tab-page/"||p==="chrome://newtab/",b=async p=>{h(),g=null,await yo(p),await p.Fetch.enable({patterns:mr.flatMap(a=>[{urlPattern:`*://${a}/*`,requestStage:"Response"},{urlPattern:`*://*.${a}/*`,requestStage:"Response"}])}),p.on("Fetch.requestPaused",a=>{(async()=>{let i=a,{requestId:c,request:u,responseHeaders:f,responseStatusCode:j}=i,E=u.url;v(`Fetch ${String(j??"?")} ${E}`);let R=[],A=!1;for(let H of f??[])if(!ho.has(H.name.toLowerCase()))if(H.name.toLowerCase()==="set-cookie"&&fr(E)){let W=H.value.split(`
|
|
172
|
-
`).map(
|
|
173
|
-
`);R.push({name:H.name,value:W}),A=!0}else R.push(H);A&&v(` rewrote Set-Cookie SameSite on ${E}`);try{let{body:H,base64Encoded:W}=await p.Fetch.getResponseBody({requestId:c});await p.Fetch.fulfillRequest({requestId:c,responseCode:j??200,responseHeaders:R,body:H,...W&&{base64Encoded:!0}})}catch(H){v(` fulfillRequest failed (${H.message}), falling through`);try{await p.Fetch.continueRequest({requestId:c})}catch(W){v(` continueRequest also failed (${W.message})`)}}})()}),s=setInterval(()=>{(async()=>{try{let{cookies:a}=await p.Network.getAllCookies(),i=0;for(let c of a){if(!fr(`https://${c.domain??""}`)||c.sameSite==="None")continue;let u=c.domain??"",f=u.startsWith(".")?u.slice(1):u;await p.Network.setCookie({url:`https://${f}`,name:c.name,value:c.value,domain:u,path:c.path??"/",secure:!0,...c.httpOnly!==void 0&&{httpOnly:c.httpOnly},...c.expirationDate!==void 0&&{expires:c.expirationDate},sameSite:"None"}),i++}i>0&&v(`cookie-patch cycle: updated ${String(i)} cookie(s) to SameSite=None`)}catch(a){v(`cookie-patch cycle failed: ${a.message}`)}})()},2e3),await p.Target.setDiscoverTargets({discover:!0});let _=a=>{if(a.type==="page"){if(l(a.url)){y(`closed stray new-tab-page target ${a.targetId}`),g!==null&&p.Target.activateTarget({targetId:g}).catch(()=>{}),p.Target.closeTarget({targetId:a.targetId}).catch(()=>{});return}g===null&&(g=a.targetId,y(`captured main target ${a.targetId} (${a.url})`))}};p.on("Target.targetCreated",a=>{let{targetInfo:i}=a;v(`target +${i.type} ${i.targetId} ${i.url}`),_(i)}),p.on("Target.targetInfoChanged",a=>{let{targetInfo:i}=a;v(`target ~${i.type} ${i.targetId} ${i.url}`),_(i)}),p.on("disconnect",()=>{x||r!==p||(y("CDP disconnected"),r=null,h(),P())})},P=()=>{if(x||d!==null)return;let p=Math.min(1e3*2**C,1e4),_=C+1;C++,y(`CDP reconnect scheduled in ${String(p)}ms (attempt #${String(_)})`),d=setTimeout(()=>{d=null,(async()=>{let a;try{a=await pr({port:n})}catch{y(`CDP reconnect attempt #${String(_)} failed`),P();return}if(x){try{await a.close()}catch{}return}r=a;try{await b(a),y(`CDP reconnected after ${String(_)} attempt(s)`),C=0}catch{r===a&&(r=null);try{await a.close()}catch{}y(`CDP reconnect attempt #${String(_)} failed during setup`),P()}})()},p)},D=30,S=300;for(let p=0;p<D;p++){await new Promise(_=>setTimeout(_,S)),y(`CDP connect attempt ${String(p+1)}/${String(D)}`);try{let _=await pr({port:n});r=_,e.path&&_.send("Page.navigate",{url:`${t}${e.path}`});try{await b(_),y("CDP connected")}catch{r===_&&(r=null);try{await _.close()}catch{}y("CDP setup failed after connect")}break}catch{if(p===D-1){let _=`CDP unavailable after ${String(D)} attempts \u2014 viewer running without interception (CSP/cookie rewrites disabled)`;return y(_),e.onWarn?.(_),{kill:()=>{o.kill()}}}}}return r?{kill:()=>{if(y("CDP kill requested \u2014 tearing down"),x=!0,d!==null&&(clearTimeout(d),d=null),h(),r!==null){try{r.close()}catch{}r=null}o.kill()}}:{kill:()=>{o.kill()}}}import{useCallback as xo,useState as bo}from"react";function Ye(e){let[t,o]=bo([]),n=xo(r=>{o(s=>[...s,`${new Date().toLocaleTimeString()}: ${r}`].slice(-e))},[e]);return[t,n]}import{useCallback as Ze,useEffect as kt,useState as Qe}from"react";import{Box as z,Text as B,useInput as vo}from"ink";import{jsx as k,jsxs as q}from"react/jsx-runtime";var oe=["apiKey","userId","businessId"],wo={apiKey:"API Key",userId:"User ID",businessId:"Business ID"},Le=({text:e})=>k(B,{dimColor:!0,children:e}),et=({initialMode:e,showProfileManager:t,onComplete:o,onCancel:n})=>{let[r,s]=Qe(e==="global"&&!t?{type:"loading"}:e==="global"&&t?{type:"profile-loading"}:{type:"mode-select",cursor:0}),[g,d]=Qe(""),[C,x]=Qe(null),[y,v]=Qe(void 0),h=Ze(a=>{if(a==="local"){o({mode:"local",credentials:null});return}s({type:"profile-loading"})},[o]),l=Ze(async a=>{if(a===null){s({type:"profile-loading"});let u=await Ie();s({type:"name-entry",nameBuffer:"",existingProfiles:u});return}v(a.isDefault?void 0:a.name),s({type:"loading"});let i=a.isDefault?await Y():await Ce(a.name),c=i?Math.max(0,K.indexOf(i.environment)):0;s({type:"creds-entry",field:0,values:i??{},envCursor:c})},[]),b=Ze(async(a,i)=>{let c=K[i]??"go",u={apiKey:a.apiKey??"",userId:a.userId??"",businessId:a.businessId??"",environment:c};s({type:"saving"});try{await Kt(y??ne,u),o({mode:"global",credentials:u,...y!==void 0&&{profileName:y}})}catch(f){x(f instanceof Error?f.message:String(f)),s({type:"creds-entry",field:0,values:a,envCursor:i})}},[o,y]);vo((a,i)=>{if(i.ctrl&&a==="c"&&process.exit(0),i.escape){if((r.type==="creds-entry"||r.type==="name-entry")&&e==="global"&&t){s({type:"profile-loading"}),P();return}n?.();return}if(r.type==="mode-select"){if(i.upArrow)s({type:"mode-select",cursor:0});else if(i.downArrow)s({type:"mode-select",cursor:1});else if(i.return){let c=r.cursor===0?"global":"local";h(c)}return}if(r.type==="profile-select"){let{profiles:c,cursor:u}=r,f=c.length,j=c.length+1;if(i.upArrow)s({...r,cursor:(u-1+j)%j});else if(i.downArrow)s({...r,cursor:(u+1)%j});else if(i.return)if(u===f)s({type:"name-entry",nameBuffer:"",existingProfiles:c});else{let E=c[u]??c[0];E&&l(E)}return}if(r.type==="name-entry"){let{nameBuffer:c,existingProfiles:u}=r;if(i.backspace||i.delete)s({type:"name-entry",nameBuffer:c.slice(0,-1),existingProfiles:u});else if(i.return){let f=c.trim();if(!f){s({...r,nameError:"Name cannot be empty"});return}if(f===ne){s({...r,nameError:`"${ne}" is reserved`});return}if(u.some(j=>j.name===f)){s({...r,nameError:`Profile "${f}" already exists`});return}v(f),s({type:"creds-entry",field:0,values:{},envCursor:0}),d("")}else a&&!i.ctrl&&!i.meta&&s({type:"name-entry",nameBuffer:c+a,existingProfiles:u});return}if(r.type==="creds-entry"){let{field:c,values:u,envCursor:f}=r;if(c===oe.length){i.leftArrow?s({...r,envCursor:(f-1+K.length)%K.length}):i.rightArrow?s({...r,envCursor:(f+1)%K.length}):i.upArrow?(s({...r,field:c-1}),d(u[oe[c-1]]??"")):i.return&&b(u,f);return}let E=oe[c];if(!E)return;if(i.backspace||i.delete)d(R=>R.slice(0,-1));else if(i.upArrow&&c>0){let R={...u,[E]:g},A=c-1;s({...r,field:A,values:R}),d(R[oe[A]]??"")}else if(i.return||i.tab||i.downArrow){let R={...u,[E]:g},A=c+1;s({...r,field:A,values:R}),A<oe.length?d(R[oe[A]]??""):d("")}else a&&!i.ctrl&&!i.meta&&d(R=>R+a)}});let P=Ze(async()=>{let a=await Ie();s({type:"profile-select",profiles:a,cursor:0})},[]);if(kt(()=>{r.type==="profile-loading"&&P()},[r.type,P]),kt(()=>{e==="global"&&!t&&(async()=>{let a=await Y(),i=a?Math.max(0,K.indexOf(a.environment)):0;s({type:"creds-entry",field:0,values:a??{},envCursor:i})})()},[]),kt(()=>{r.type==="creds-entry"&&r.field===0&&d(r.values.apiKey??"")},[r.type]),r.type==="loading"||r.type==="saving"||r.type==="profile-loading"){let a=r.type==="saving"?"Saving credentials\u2026":r.type==="profile-loading"?"Loading profiles\u2026":"Loading credentials\u2026";return k(z,{paddingY:1,paddingX:2,children:k(B,{dimColor:!0,children:a})})}if(r.type==="done")return null;if(r.type==="mode-select")return q(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[k(V,{}),q(z,{flexDirection:"column",gap:0,children:[k(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((i,c)=>{let u=r.cursor===c;return q(z,{gap:2,children:[k(B,{...u&&{color:"cyan"},children:u?"\u276F":" "}),k(B,{bold:u,...u&&{color:"cyan"},children:i.label}),k(B,{dimColor:!0,children:i.desc})]},i.mode)})]}),k(Le,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Ctrl+C to quit"})]});if(r.type==="profile-select"){let{profiles:a,cursor:i}=r,c=a.length;return q(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[k(V,{}),q(z,{flexDirection:"column",gap:0,children:[k(B,{bold:!0,children:"Credential profiles"}),a.map((u,f)=>{let j=i===f;return q(z,{gap:2,children:[k(B,{...j&&{color:"cyan"},children:j?"\u276F":" "}),k(B,{bold:j,...j&&{color:"cyan"},children:u.isDefault?"Default":u.name}),k(B,{dimColor:!0,children:u.path})]},u.name)}),q(z,{gap:2,children:[k(B,{...i===c&&{color:"cyan"},children:i===c?"\u276F":" "}),k(B,{bold:i===c,...i===c&&{color:"cyan"},children:"+ Add new profile"})]})]}),k(Le,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(r.type==="name-entry"){let{nameBuffer:a,nameError:i}=r;return q(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[k(V,{}),k(z,{flexDirection:"column",gap:0,children:k(B,{bold:!0,children:"New credential profile"})}),i&&q(B,{color:"red",children:["Error: ",i]}),q(z,{gap:2,children:[k(z,{width:12,children:k(B,{bold:!0,color:"cyan",children:"Profile name"})}),k(B,{color:"cyan",children:">"}),k(B,{children:a}),k(B,{color:"cyan",children:"\u2588"})]}),k(Le,{text:"Type a name \xB7 Enter to confirm \xB7 Esc to go back"})]})}let{field:D,values:S,envCursor:m}=r,p=D===oe.length,_=y??ne;return q(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[k(V,{}),q(z,{flexDirection:"column",gap:0,children:[k(B,{bold:!0,children:y!==void 0?`Profile: ${y}`:"Global credentials"}),q(B,{dimColor:!0,children:["Saved to:"," ",y!==void 0?`~/.kizenappbuilder/${y}.json`:we]})]}),C&&q(B,{color:"red",children:["Error: ",C]}),q(z,{flexDirection:"column",gap:0,children:[oe.map((a,i)=>{let c=D===i,u=c?g:S[a]??"";return q(z,{gap:2,children:[k(z,{width:12,children:k(B,{bold:c,...c&&{color:"cyan"},children:wo[a]})}),k(B,{...c&&{color:"cyan"},children:">"}),k(B,{children:u}),c&&k(B,{color:"cyan",children:"\u2588"})]},a)}),q(z,{gap:2,children:[k(z,{width:12,children:k(B,{bold:p,...p&&{color:"cyan"},children:"Environment"})}),k(B,{...p&&{color:"cyan"},children:">"}),k(z,{gap:1,children:K.map((a,i)=>{let c=i===m;return p?k(B,{bold:c,...c&&{color:"cyan"},children:c?`[${a}]`:a},a):k(B,{dimColor:!c,bold:c,children:a},a)})})]})]}),p?k(Le,{text:"\u2190\u2192 to select \xB7 \u2191\u2193 to move \xB7 Enter to save \xB7 Esc to cancel"}):k(Le,{text:"\u2191\u2193 to move \xB7 Backspace to delete \xB7 Esc to cancel"}),q(B,{dimColor:!0,children:["Profile: ",_]})]})};import{jsx as L,jsxs as O}from"react/jsx-runtime";var Po=[".kizenapp",".git"],yr=({port:e,pluginDir:t,outputDir:o,credentials:n,credentialMode:r,activeCredentialProfile:s,lastPath:g,debug:d=!1,verbose:C=!1,autoViewer:x=!0})=>{let y=Q(n),v=Q(s),h=Q(g),[l,b]=J("main"),[P,D]=J(r),[S,m]=J("starting"),[p,_]=J(null),[a,i]=Ye(50),[c,u]=Ye(50),[f,j]=Ye(50),[E,R]=J([]),[A,H]=J("pending"),[W,ee]=J(null),[he,_e]=J(null),[se,nt]=J(null),[ot,it]=J(0),[Pt,Rr]=J(0),[Lr,Fr]=J(0),[jr,$r]=J(0),st=Q(!1),Et=Q(!1),je=Q(null),ke=Q(null),te=Q(new Set),$e=Q([]),G=Se(w=>{let F=JSON.stringify(w);if(te.current.size===0){$e.current=[...$e.current,F].slice(-50);return}let re=!1;for(let X of te.current)if(X.readyState===1)try{X.send(F)}catch{te.current.delete(X),re=!0}re&&it(te.current.size)},[]),Ae=i,at=Se(()=>{je.current?.kill(),je.current=null,gr({port:e,userDataDir:hr(o,".chrome"),broadcast:G,onWarn:w=>{i(`\u26A0 ${w}`)},...h.current!==void 0&&{path:h.current},...d&&{debugLog:j},...C&&{verbose:!0}}).then(w=>{je.current=w})},[e,o,G,d,C,j,i]);tt(()=>{let w=()=>{je.current?.kill()};return process.on("exit",w),()=>{process.off("exit",w)}},[]),So((w,F)=>{(w==="q"||F.ctrl&&w==="c")&&process.exit(0),w==="c"&&b("editing"),w==="v"&&at()},{isActive:l==="main"}),tt(()=>{S!=="running"||Et.current||!x||(Et.current=!0,at())},[S,x,at]);let Ar=Se(w=>{y.current=w.credentials,v.current=w.profileName,b("main"),D(w.mode);let F=w.profileName;me(o,{credentialMode:w.mode,...F!==void 0&&{activeCredentialProfile:F}}),G({type:"credentials-updated",credentials:w.credentials})},[o,G]),It=Se(w=>{R(F=>[...F,`${new Date().toLocaleTimeString()}: ${Ct(w)}`].slice(-50)),w.kind==="request"&&(w.fromCache?Fr(F=>F+1):$r(F=>F+1)),G({type:"proxy-log",entry:w})},[G]),ae=Se(w=>{u(w),G({type:"log",message:w})},[u,G]),lt=Se(()=>{st.current||(st.current=!0,H("building"),ee(null),ae("Build started"),He(t,o).then(({bundleSize:w})=>{ae(`Build finished \u2014 bundle: ${Te(w)}`),H("done"),_e(new Date),nt(w),ae("Notifying viewers to reload"),G({type:"rebuild"})}).catch(w=>{let F=w instanceof Error?w.message:String(w);ee(F),H("error")}).finally(()=>{st.current=!1}))},[t,o,ae,G]);if(tt(()=>{lt();let w=_o(t,{recursive:!0},(F,re)=>{if(!re)return;let X=re.replace(/\\/g,"/");Po.some(Oe=>X.startsWith(Oe))||(ae(`File change detected: ${re}`),ke.current!==null&&clearTimeout(ke.current),ke.current=setTimeout(lt,150))});return w.on("error",F=>{ae(`File watcher error \u2014 rebuilds have stopped: ${F.message}`)}),()=>{w.close(),ke.current!==null&&clearTimeout(ke.current)}},[t,lt,ae]),tt(()=>{let w=dr();_t(hr(w,"index.html")).then(F=>{if(!F){_("Viewer not built. Run 'pnpm build:viewer' first."),m("error");return}let re=ur(w,Ae,It,y,v,o,G,Rr,h,t),X=ko(re),Oe=new To({server:X});return Oe.on("connection",le=>{for(let zr of $e.current)le.readyState===1&&le.send(zr);$e.current=[],Ae("Viewer connected for live reload"),te.current.add(le),it(te.current.size),le.on("close",()=>{te.current.delete(le),it(te.current.size)})}),X.listen(e,"127.0.0.1",()=>{m("running"),Ae(`Server started on 127.0.0.1:${String(e)}`)}),X.on("error",le=>{_(le.message),m("error")}),()=>{Oe.close(),X.close()}})},[e,Ae,It,G,o,t]),l==="editing")return L(et,{...P!==void 0&&{initialMode:P},showProfileManager:P==="global",onComplete:Ar,onCancel:()=>{b("main")}});let ct=he!==null?Math.round((Date.now()-he.getTime())/1e3):null,Or=ct===null?"":ct<5?" (just now)":` (${String(ct)}s ago)`;return O(U,{flexDirection:"column",paddingY:1,paddingX:2,children:[L(V,{marginBottom:1}),O(U,{flexDirection:"column",children:[O(U,{gap:2,marginBottom:0,children:[L(N,{bold:!0,dimColor:!0,children:"App Build"}),A==="pending"&&L(N,{dimColor:!0,children:"waiting\u2026"}),A==="building"&&O(U,{gap:1,children:[L(qe,{}),L(N,{children:"Building plugin package\u2026"})]}),A==="done"&&O(U,{gap:1,children:[L(N,{color:"green",children:"\u2713 Built"}),he!==null&&O(N,{dimColor:!0,children:["at ",he.toLocaleTimeString(),Or]}),se!==null&&O(N,{dimColor:!0,children:["\xB7 bundle: ",Te(se)]})]}),A==="error"&&O(N,{color:"red",children:["\u2717 ",W??"unknown error"]})]}),L(U,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:c.slice(-8).map((w,F)=>L(N,{dimColor:!0,wrap:"truncate",children:w},F))})]}),O(U,{marginTop:1,flexDirection:"column",children:[O(U,{gap:2,children:[L(N,{bold:!0,dimColor:!0,children:"Web Server"}),S==="starting"&&L(N,{dimColor:!0,children:"starting\u2026"}),S==="running"&&O(U,{gap:2,children:[L(N,{color:"green",children:"\u2713 Running"}),O(N,{dimColor:!0,children:["\u25CF ",ot," viewer",ot!==1?"s":""]})]}),S==="error"&&O(N,{color:"red",children:["\u2717 ",p??"Server error"]})]}),L(U,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:a.slice(-8).map((w,F)=>L(N,{dimColor:!0,wrap:"truncate",children:w},F))})]}),O(U,{marginTop:1,flexDirection:"column",children:[O(U,{gap:2,children:[L(N,{bold:!0,dimColor:!0,children:"Network Proxy"}),L(N,{color:"green",children:"\u2713 Active"}),O(N,{dimColor:!0,children:["\u25CF ",Pt," key",Pt!==1?"s":""," in the network cache \xB7"," ",Lr," hit \xB7 ",jr," miss"]})]}),L(U,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:E.length===0?L(N,{dimColor:!0,children:" No requests yet."}):E.slice(-8).map((w,F)=>L(N,{dimColor:!0,wrap:"truncate",children:w},F))})]}),d&&O(U,{marginTop:1,flexDirection:"column",children:[O(U,{gap:2,children:[L(N,{bold:!0,dimColor:!0,children:"CDP Debug"}),O(N,{dimColor:!0,children:["\u25CF ",f.length," event(s)"]})]}),L(U,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:f.length===0?L(N,{dimColor:!0,children:" No CDP events yet."}):f.slice(-8).map((w,F)=>L(N,{dimColor:!0,wrap:"truncate",children:w},F))})]}),O(U,{marginTop:1,gap:1,children:[L(N,{dimColor:!0,children:"["}),L(N,{children:"q"}),L(N,{dimColor:!0,children:"] quit ["}),L(N,{children:"c"}),L(N,{dimColor:!0,children:"] credentials ["}),L(N,{children:"v"}),O(N,{dimColor:!0,children:["] ",ot===0?"open viewer":"relaunch viewer"]})]})]})};async function xr(e){return new Promise(t=>{let o=null,n=s=>{o?.(),t(s)},{unmount:r}=vr(br(et,{...e!==void 0&&{initialMode:e},onComplete:n}),{exitOnCtrlC:!1});o=r})}function wr(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 o=parseInt(t.port,10),n=process.cwd(),r=`${n}/.kizenapp`;be(n);let s=null,g,d,{lastPath:C}=await Ne(r);if(t.credentials)s=await Ge(t.credentials);else{let l=await Ne(r);if(l.credentialMode==="local")g="local";else if(l.credentialMode==="global"){if(g="global",d=l.activeCredentialProfile,d?(s=await Ce(d),s||(s=await Y(),d=void 0)):s=await Y(),!s){let b=await xr("global");s=b.credentials,d=b.profileName}}else{let b=await xr();s=b.credentials,g=b.mode,d=b.profileName;let P=b.profileName;await me(r,{credentialMode:b.mode,...P!==void 0&&{activeCredentialProfile:P}})}}let x=t.verbose===!0,y=x||t.debug===!0,v=t.viewer!==!1,{waitUntilExit:h}=vr(br(yr,{port:o,pluginDir:n,outputDir:r,credentials:s,...g!==void 0&&{credentialMode:g},...d!==void 0&&{activeCredentialProfile:d},...C!==void 0&&{lastPath:C},debug:y,verbose:x,autoViewer:v}),{exitOnCtrlC:!1});await h()})}var Eo=new Set(["phone","envelope","pen-nib","calendar-days","paperclip","file","clipboard","pen","tag","book","print","pen-to-square","folder","folder-open","thumbtack","globe","city","briefcase","compass","address-book","business-time","computer-classic","pen-fancy","badge-check","mug-saucer","landmark","chart-simple","envelopes","diagram-venn","calendar","pencil","phone-volume","copy","table","building","network-wired","address-card","tags","registered","signature","phone-office","projector","sitemap","marker","badge","wallet","copyright","bullseye","calculator","certificate","percent","eraser","file-spreadsheet","glasses","industry","vault","user-tie-hair-long","user-tie-hair","user-hair-mullet","trademark","timeline-arrow","timeline","table-tree","table-rows","table-pivot","table-layout","table-columns","stapler","square-poll-vertical","square-poll-horizontal","square-phone-flip","square-phone","square-pen","square-kanban","square-envelope","socks","slot-machine","signature-slash","signature-lock","shredder","scissors","scanner-image","scale-unbalanced-flip","scale-unbalanced","scale-balanced","router","rectangle-pro","print-slash","print-magnifying-glass","presentation-screen","podium","phone-slash","phone-intercom","phone-flip","person-chalkboard","pen-nib-slash","pen-clip","paste","paperclip-vertical","notebook","note-sticky","money-check-pen","money-check-dollar-pen","magnifying-glass-chart","magnifying-glass-arrow-right","list-tree","list-timeline","list-radio","list-dropdown","list-check","laptop-file","lamp-desk","keynote","industry-windows","inboxes","inbox-full","house-laptop","highlighter","folders","folder-xmark","folder-tree","folder-plus","folder-minus","folder-arrow-up","folder-arrow-down","floppy-disk-circle-xmark","floppy-disk-circle-arrow-right","floppy-disk","file-user","file-lines","file-circle-plus","file-circle-info","file-chart-pie","file-chart-column","fax","envelope-open","envelope-dot","envelope-circle-check","coffee-pot","cloud-word","clipboard-question","chart-user","chart-tree-map","chart-simple-horizontal","chart-pyramid","chart-pie-simple","chart-pie","chart-line-up","chart-line-down","chart-line","cake-candles","cabinet-filing","bullhorn","briefcase-blank","briefcase-arrow-right","brain-arrow-curved-right","boxes-packing","box-archive","book-section","bars-staggered","bars-progress","badge-percent","badge-dollar","arrows-to-eye","arrows-to-dot","arrows-spin","sparkles","megaphone","block-question","lightbulb-slash","comments-dollar","comments","bullseye-pointer","lightbulb","user-group-crown","user-crown","signal-stream-slash","signal-stream","rectangle-ad","ranking-star","person-rays","people-group","messages-dollar","message-dollar","magnifying-glass-location","magnifying-glass-dollar","lightbulb-on","lightbulb-exclamation","lightbulb-dollar","lightbulb-cfl-on","lightbulb-cfl","hundred-points","group-arrows-rotate","gift-card","filter-circle-dollar","envelopes-bulk","envelope-open-text","envelope-open-dollar","comment-dollar","chart-mixed","bullseye-arrow","star","heart","camera-retro","truck-fast","bell","cart-shopping","gift","barcode","bookmark","camera","thumbs-up","thumbs-down","key","truck","balloons","handshake","shop","shirt","bag-shopping","moped","cart-plus","credit-card","store","cash-register","booth-curtain","trophy","receipt","truck-container","truck-clock","truck-bolt","trophy-star","store-slash","store-lock","star-exclamation","shop-slash","shop-lock","rectangle-barcode","person-booth","nfc-trash","nfc-symbol","nfc-slash","nfc-signal","nfc-pen","nfc-magnifying-glass","nfc-lock","nfc","money-check-dollar","money-check","mobile-signal-out","mobile-signal","hexagon-vertical-nft-slanted","hexagon-vertical-nft","hexagon-image","hand-holding-box","gifts","gem","credit-card-front","credit-card-blank","cart-xmark","cart-shopping-fast","cart-minus","cart-circle-xmark","cart-circle-plus","cart-circle-exclamation","cart-circle-check","cart-circle-arrow-up","cart-circle-arrow-down","cart-arrow-up","cart-arrow-down","box-open-full","basket-shopping-simple","basket-shopping","barcode-scan","barcode-read","balloon","bags-shopping","bars","browser","chart-bar","cog","database","calendar-alt","play","kizen-k","add","book-alt","form-entity","arrows-to-circle","question-circle","chevron-down","chevron-up","window-restore","forward"]),Io=[...Eo].sort(),Bo=new Set(["kizen-k","form-entity"]),Cr=[...Io,...[...Bo].sort()];function Sr(e){e.command("icons").description("List all valid icon names accepted by toolbar items, pages, and adornments").action(()=>{for(let t of Cr)console.log(t)})}import{mkdir as No,writeFile as _r,readFile as Do}from"fs/promises";import{join as rt}from"path";var Ro=new Set(["developer_business_id"]);function Lo(e){return Array.isArray(e)?e.map(t=>{if(typeof t!="object"||t===null)return t;let o=t;if(typeof o.auth_credentials!="object"||o.auth_credentials===null)return o;let n=Object.fromEntries(Object.keys(o.auth_credentials).map(r=>[r,"*****"]));return{...o,auth_credentials:n}}):e}var Fo={".png":"image/png",".svg":"image/svg+xml",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp"};function Tr(e){let t={name:"",children:new Map,isFile:!1,filePath:""};for(let o of e){let n=o.path.split("/"),r=t;n.forEach((s,g)=>{r.children.has(s)||r.children.set(s,{name:s,children:new Map,isFile:g===n.length-1,filePath:n.slice(0,g+1).join("/")});let d=r.children.get(s);d&&(r=d)})}return t}function Tt(e){return"file-"+e.replace(/[^a-zA-Z0-9]/g,"-")}function Z(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Pr(e){return`<ul>${[...e.children.values()].sort((n,r)=>n.isFile!==r.isFile?n.isFile?1:-1:n.name.localeCompare(r.name)).map(n=>n.isFile?`<li class="tf"><a href="#${Tt(n.filePath)}" data-id="${Tt(n.filePath)}">${Z(n.name)}</a></li>`:`<li class="td"><span class="dn">${Z(n.name)}/</span>${Pr(n)}</li>`).join("")}</ul>`}function Er(e){let t=e.lastIndexOf(".");return t>=0?e.slice(t).toLowerCase():""}function jo(e){let t;return e.base64Image!==void 0?t=`<img src="data:${Fo[Er(e.path)]??"image/png"};base64,${e.base64Image}" alt="${Z(e.path)}" style="max-width:100%">`:e.binaryData!==void 0?t=`<p class="bin">[Binary file: ${String(e.binaryData.length)} bytes]</p>`:t=`<pre><code>${Z(e.content)}</code></pre>`,`<section id="${Tt(e.path)}"><h2 class="fp">${Z(e.path)}</h2><div class="fb">${t}</div></section>`}var $o={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".json":"json",".css":"css",".scss":"scss",".html":"html",".htm":"html",".md":"markdown",".mdx":"markdown",".py":"python",".sh":"bash",".yml":"yaml",".yaml":"yaml",".xml":"xml",".toml":"toml"};function Ao(e){return $o[Er(e)]??""}function Ir(e,t=""){let o=[...e.children.values()].sort((n,r)=>n.isFile!==r.isFile?n.isFile?1:-1:n.name.localeCompare(r.name));return o.map((n,r)=>{let s=r===o.length-1,g=s?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",d=s?" ":"\u2502 ";return n.isFile?`${t}${g}${n.name}`:`${t}${g}${n.name}/
|
|
174
|
-
${
|
|
175
|
-
`)}function
|
|
171
|
+
`).trim(),y=x.length>0?`: ${x}`:"";r(new Error(`${e} exited with code ${String(C)}${y}`))}})})}var wt=new Set;function Xe(e){for(let t of wt)t(e)}function Wn(e,t){return t&&wt.add(t),Ke||(Ke=(async()=>{let o=De(vt,"bin","python");try{await Mn(o)}catch{let n=Jn(e);await er(n,["-m","venv",vt])}Xe({kind:"start"});try{await er(o,["-m","pip","install","--disable-pip-version-check",...Vn],(n,r)=>{Xe({kind:"log",line:n,stream:r})}),Xe({kind:"complete"})}catch(n){let r=n instanceof Error?n.message:String(n);throw Xe({kind:"error",message:r}),Ke=null,await rr(vt,{recursive:!0,force:!0}).catch(()=>{}),n}finally{wt.clear()}return o})()),Ke}function Gn(e){let t="__KIZEN_RESULT_START__",o="__KIZEN_RESULT_END__",n=e.indexOf(t),r=e.indexOf(o);if(n===-1||r===-1)return{userStdout:e,result:null};let s=e.slice(0,n).trimEnd(),g=e.slice(n+t.length,r).trim();try{let d=JSON.parse(g);return{userStdout:s,result:d}}catch{return{userStdout:e,result:null}}}async function nr(e){let t=e.timeout??Un,o=await Wn(e.scriptRuntime,e.onInstallProgress),n=Date.now(),r;try{r=await zn(De(Hn(),"kizen-step-"));let s=De(r,"wrapper.py"),g=De(r,"script.py");await Promise.all([Qt(s,qn,"utf-8"),Qt(g,e.script,"utf-8")]);let d={...process.env,__KIZEN_INPUTS__:JSON.stringify(e.inputs),__KIZEN_SECRETS__:JSON.stringify(e.secrets),__KIZEN_SCRIPT_PATH__:g},{exitCode:C,stdout:x,stderr:y}=await new Promise(P=>{let D=[],S=[],m=!1,p=tr(o,[s],{env:d,cwd:r,stdio:["ignore","pipe","pipe"]}),_=setTimeout(()=>{p.kill("SIGKILL")},t);p.stdout.on("data",i=>{D.push(i)}),p.stderr.on("data",i=>{S.push(i)});let a=i=>{m||(m=!0,clearTimeout(_),P({exitCode:i??1,stdout:Buffer.concat(D).toString("utf-8"),stderr:Buffer.concat(S).toString("utf-8")}))};p.on("close",a),p.on("error",i=>{m||(m=!0,clearTimeout(_),P({exitCode:1,stdout:"",stderr:i.message}))})}),v=Date.now()-n,{userStdout:h,result:l}=Gn(x);if(l){let P={success:l.success,outputValues:l.outputValues,logs:l.logs,stdout:h,stderr:y,exitCode:C,durationMs:v};return l.error!==null&&(P.error=l.error),l.httpRequests&&(P.httpRequests=l.httpRequests),P}let b={success:!1,outputValues:{},logs:[],stdout:h,stderr:y,exitCode:C,durationMs:v};return C!==0&&(b.error=`Process exited with code ${String(C)}`),b}finally{r&&rr(r,{recursive:!0,force:!0})}}var or=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 Ct(e){if(e.kind==="info")return e.message;let t=e.fromCache?" [cache]":"",o=e.upstreamStatus!==void 0?` (upstream ${String(e.upstreamStatus)})`:"";return`${e.method} ${e.url} \u2192 ${String(e.status)}${o}${t}`}var no=2*1024*1024,oo=new Set([".DS_Store",".gitignore"]);function io(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 so=["kizen.com","kizen.dev"];function ao(e){let t;try{t=new URL(e)}catch{return!1}if(t.protocol!=="https:")return!1;let o=t.hostname.toLowerCase();return so.some(n=>o===n||o.endsWith("."+n))}function lo(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 lr(e,t){if(t.includes("\0"))return null;let o=t.replace(/^\/+/,""),n=to(e,o);if(n!==e&&!n.startsWith(e+St))return null;try{let r=await Qn(n);return r!==e&&!r.startsWith(e+St)?null:r}catch{return null}}function cr(e,t){let o=t===e?"":t.slice(e.length+1);return o===""?!1:o.split(St).some(r=>ze.has(r))}function ur(){let e=ro(import.meta.url);return Re(eo(e),"viewer")}function dr(e,t,o){if(e.includes("/external-integrations/proxy")&&t["content-type"]?.includes("application/json"))try{let n=JSON.parse(o.toString("utf8"));return typeof n.status_code=="number"?n.status_code:void 0}catch{return}}async function _t(e){try{return await Xn(e),!0}catch{return!1}}function pr(e,t,o,n,r,s,g,d,C,x){let y=Yt({onChange:d}),v=Kn(x);return(h,l)=>{(async()=>{let b=h.url??"/";try{if(!io(h.headers.host)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Forbidden"}));return}if((h.method==="POST"||h.method==="PATCH"||h.method==="DELETE")&&!lo(h.headers.origin)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Forbidden"}));return}if(t(`Received request: ${b}`),b==="/api/credentials"){l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({credentials:n.current??null,activeProfile:r.current??null}));return}if(b==="/api/credential-profiles"&&h.method==="GET"){let a=await Ie();l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({profiles:a,active:r.current}));return}if(b==="/api/credentials/switch"&&h.method==="POST"){let a=[];for await(let f of h)a.push(f);let c=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}").profile,u=c===void 0||c===""?await Y():await Ce(c);if(u!==null){n.current=u,r.current=c??void 0;let f=r.current;await ge(s,{credentialMode:"global",...f!==void 0&&{activeCredentialProfile:f}}),g({type:"credentials-updated",credentials:u,activeProfile:r.current??null})}l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({ok:u!==null}));return}if(b==="/api/bundle"){let a=Re(process.cwd(),".kizenapp","bundle.json");try{let i=await Zn(a,"utf-8");l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(i)}catch{l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end("{}")}return}if(b==="/api/last-path"&&h.method==="POST"){let a=[];for await(let c of h)a.push(c);let i=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}");if(typeof i.path=="string"){C.current=i.path;let c=await Ne(s);await ge(s,{...c,lastPath:i.path})}l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end('{"ok":true}');return}if(b==="/api/execute-step"&&h.method==="POST"){let a=[];for await(let f of h)a.push(f);let i=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}");if(typeof i.script!="string"){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Missing required field: script"}));return}let c={script:i.script,scriptRuntime:i.scriptRuntime??"python-3.9",inputs:i.inputs??{},secrets:i.secrets??{},onInstallProgress:f=>{f.kind==="start"?g({type:"venv-install-start"}):f.kind==="log"?g({type:"venv-install-log",line:f.line,stream:f.stream}):f.kind==="complete"?g({type:"venv-install-complete"}):g({type:"venv-install-error",message:f.message})}};typeof i.timeout=="number"&&i.timeout>0&&(c.timeout=Math.min(i.timeout,300*1e3));let u=await nr(c);l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify(u));return}if(b==="/api/proxy-cache/clear"){y.clear(),o({kind:"info",message:"Proxy cache cleared"}),l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end('{"ok":true}');return}if(b.startsWith("/api/proxy")){let a=h.headers["x-proxy-target"];if(typeof a!="string"){l.writeHead(400),l.end("Missing x-proxy-target header");return}if(!ao(a)){l.writeHead(400),l.end("Invalid proxy target");return}let i=b.slice(10)||"/",c=`${a}${i}`,u=h.method??"GET",f=[];for await(let _e of h)f.push(_e);let{host:j,"x-proxy-target":E,...R}=h.headers;if(u==="GET"){let _e=`GET::${c}`,{response:ee,fromCache:nt}=await y.get(_e,()=>fetch(c,{method:"GET",headers:R}));o({kind:"request",method:"GET",status:ee.status,upstreamStatus:dr(i,ee.headers,ee.body),fromCache:nt,url:i}),l.writeHead(ee.status,ee.headers),l.end(ee.body);return}let A=f.length>0?Buffer.concat(f):void 0,H=A&&A.length>0?A:void 0,W=await fetch(c,{method:u,headers:R,...H!==void 0&&{body:H}}),Q=ht(Object.fromEntries(W.headers)),ae=await xt(W,yt);o({kind:"request",method:u,status:W.status,upstreamStatus:dr(i,Q,ae),fromCache:!1,url:i}),l.writeHead(W.status,Q),l.end(ae);return}if(b.startsWith("/api/source/tree")&&h.method==="GET"){let i=new URL(b,"http://localhost").searchParams.get("path")??"",c=await lr(v,i);if(c===null){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Invalid path"}));return}if(cr(v,c)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Path is excluded"}));return}try{let u=await Yn(c,{withFileTypes:!0}),f=await Promise.all(u.filter(E=>E.isDirectory()?!ze.has(E.name):E.isFile()?!oo.has(E.name):!1).map(async E=>{let R=E.isDirectory()?"dir":"file",A={name:E.name,kind:R};if(R==="file")try{let H=await sr(Re(c,E.name));A.size=H.size}catch{}return A}));f.sort((E,R)=>E.kind!==R.kind?E.kind==="dir"?-1:1:E.name.localeCompare(R.name));let j=c===v?"":c.slice(v.length+1);l.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({path:j,entries:f}))}catch(u){let f=u instanceof Error?u.message:String(u);t(`source/tree failed (${i}): ${f}`),l.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not found"}))}return}if(b.startsWith("/api/source/file")&&h.method==="GET"){let i=new URL(b,"http://localhost").searchParams.get("path")??"";if(i===""){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Missing path"}));return}let c=await lr(v,i);if(c===null){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Invalid path"}));return}if(cr(v,c)){l.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Path is excluded"}));return}try{let u=await sr(c);if(!u.isFile()){l.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not a file"}));return}if(u.size>no){l.writeHead(413,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"File too large",size:u.size}));return}let f=ar(c).toLowerCase(),j=bt[f],E=or.has(f),R=j??(E?"text/plain; charset=utf-8":"application/octet-stream");l.writeHead(200,{"Content-Type":R,"Content-Length":String(u.size)}),ir(c).pipe(l)}catch(u){let f=u instanceof Error?u.message:String(u);t(`source/file failed (${i}): ${f}`),l.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),l.end(JSON.stringify({error:"Not found"}))}return}let S=Re(e,b==="/"?"/index.html":b),m=await _t(S)?S:Re(e,"index.html"),p=ar(m),_=bt[p]??"application/octet-stream";l.writeHead(200,{"Content-Type":_}),ir(m).pipe(l)}catch(P){if(b.startsWith("/api/proxy")){let D=b.slice(10)||"/",S=h.method??"GET";P instanceof Be?o({kind:"info",message:`${S} ${D} \u2192 502 (response exceeded ${String(P.limit)} bytes)`}):o({kind:"request",method:S,status:502,fromCache:!1,url:D})}else o({kind:"info",message:`Error handling ${b}: ${P instanceof Error?P.message:String(P)}`});l.headersSent||(l.writeHead(502),l.end("Bad Gateway"))}})()}}import{launch as co}from"chrome-launcher";import{createRequire as uo}from"module";import{mkdirSync as po}from"fs";import{readFile as fo}from"fs/promises";import{dirname as mo,join as go}from"path";import{fileURLToPath as ho}from"url";var fr=uo(import.meta.url)("chrome-remote-interface"),yo=new Set(["content-security-policy","content-security-policy-report-only","x-frame-options"]),gr=["kizen.dev","kizen.com"];function mr(e){try{let{hostname:t}=new URL(e);return gr.some(o=>t===o||t.endsWith("."+o))}catch{return!1}}async function xo(e){try{let t=go(mo(ho(import.meta.url)),"viewer","icon.png"),o=await fo(t);await e.Browser.setDockTile({image:o.toString("base64")})}catch{}}async function hr(e){po(e.userDataDir,{recursive:!0});let t=`http://localhost:${String(e.port)}`,o=await co({startingUrl:t,chromeFlags:[`--app=${t}`,"--no-first-run","--no-default-browser-check","--disable-extensions","--disable-features=DeviceBoundSessions"],userDataDir:e.userDataDir,handleSIGINT:!1,logLevel:"silent"}),n=o.port,r=null,s=null,g=null,d=null,C=0,x=!1,y=p=>{e.debugLog?.(p)},v=p=>{e.verbose&&e.debugLog?.(p)},h=()=>{s!==null&&(clearInterval(s),s=null)},l=p=>p==="chrome://new-tab-page/"||p==="chrome://newtab/",b=async p=>{h(),g=null,await xo(p),await p.Fetch.enable({patterns:gr.flatMap(a=>[{urlPattern:`*://${a}/*`,requestStage:"Response"},{urlPattern:`*://*.${a}/*`,requestStage:"Response"}])}),p.on("Fetch.requestPaused",a=>{(async()=>{let i=a,{requestId:c,request:u,responseHeaders:f,responseStatusCode:j}=i,E=u.url;v(`Fetch ${String(j??"?")} ${E}`);let R=[],A=!1;for(let H of f??[])if(!yo.has(H.name.toLowerCase()))if(H.name.toLowerCase()==="set-cookie"&&mr(E)){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
|
+
`);R.push({name:H.name,value:W}),A=!0}else R.push(H);A&&v(` rewrote Set-Cookie SameSite on ${E}`);try{let{body:H,base64Encoded:W}=await p.Fetch.getResponseBody({requestId:c});await p.Fetch.fulfillRequest({requestId:c,responseCode:j??200,responseHeaders:R,body:H,...W&&{base64Encoded:!0}})}catch(H){v(` fulfillRequest failed (${H.message}), falling through`);try{await p.Fetch.continueRequest({requestId:c})}catch(W){v(` continueRequest also failed (${W.message})`)}}})()}),s=setInterval(()=>{(async()=>{try{let{cookies:a}=await p.Network.getAllCookies(),i=0;for(let c of a){if(!mr(`https://${c.domain??""}`)||c.sameSite==="None")continue;let u=c.domain??"",f=u.startsWith(".")?u.slice(1):u;await p.Network.setCookie({url:`https://${f}`,name:c.name,value:c.value,domain:u,path:c.path??"/",secure:!0,...c.httpOnly!==void 0&&{httpOnly:c.httpOnly},...c.expirationDate!==void 0&&{expires:c.expirationDate},sameSite:"None"}),i++}i>0&&v(`cookie-patch cycle: updated ${String(i)} cookie(s) to SameSite=None`)}catch(a){v(`cookie-patch cycle failed: ${a.message}`)}})()},2e3),await p.Target.setDiscoverTargets({discover:!0});let _=a=>{if(a.type==="page"){if(l(a.url)){y(`closed stray new-tab-page target ${a.targetId}`),g!==null&&p.Target.activateTarget({targetId:g}).catch(()=>{}),p.Target.closeTarget({targetId:a.targetId}).catch(()=>{});return}g===null&&(g=a.targetId,y(`captured main target ${a.targetId} (${a.url})`))}};p.on("Target.targetCreated",a=>{let{targetInfo:i}=a;v(`target +${i.type} ${i.targetId} ${i.url}`),_(i)}),p.on("Target.targetInfoChanged",a=>{let{targetInfo:i}=a;v(`target ~${i.type} ${i.targetId} ${i.url}`),_(i)}),p.on("disconnect",()=>{x||r!==p||(y("CDP disconnected"),r=null,h(),P())})},P=()=>{if(x||d!==null)return;let p=Math.min(1e3*2**C,1e4),_=C+1;C++,y(`CDP reconnect scheduled in ${String(p)}ms (attempt #${String(_)})`),d=setTimeout(()=>{d=null,(async()=>{let a;try{a=await fr({port:n})}catch{y(`CDP reconnect attempt #${String(_)} failed`),P();return}if(x){try{await a.close()}catch{}return}r=a;try{await b(a),y(`CDP reconnected after ${String(_)} attempt(s)`),C=0}catch{r===a&&(r=null);try{await a.close()}catch{}y(`CDP reconnect attempt #${String(_)} failed during setup`),P()}})()},p)},D=30,S=300;for(let p=0;p<D;p++){await new Promise(_=>setTimeout(_,S)),y(`CDP connect attempt ${String(p+1)}/${String(D)}`);try{let _=await fr({port:n});r=_,e.path&&_.send("Page.navigate",{url:`${t}${e.path}`});try{await b(_),y("CDP connected")}catch{r===_&&(r=null);try{await _.close()}catch{}y("CDP setup failed after connect")}break}catch{if(p===D-1){let _=`CDP unavailable after ${String(D)} attempts \u2014 viewer running without interception (CSP/cookie rewrites disabled)`;return y(_),e.onWarn?.(_),{kill:()=>{o.kill()}}}}}return r?{kill:()=>{if(y("CDP kill requested \u2014 tearing down"),x=!0,d!==null&&(clearTimeout(d),d=null),h(),r!==null){try{r.close()}catch{}r=null}o.kill()}}:{kill:()=>{o.kill()}}}import{useCallback as bo,useState as vo}from"react";function Ye(e){let[t,o]=vo([]),n=bo(r=>{o(s=>[...s,`${new Date().toLocaleTimeString()}: ${r}`].slice(-e))},[e]);return[t,n]}import{useCallback as Ze,useEffect as kt,useState as Qe}from"react";import{Box as z,Text as B,useInput as wo}from"ink";import{jsx as k,jsxs as q}from"react/jsx-runtime";var ie=["apiKey","userId","businessId"],Co={apiKey:"API Key",userId:"User ID",businessId:"Business ID"},Le=({text:e})=>k(B,{dimColor:!0,children:e}),et=({initialMode:e,showProfileManager:t,onComplete:o,onCancel:n})=>{let[r,s]=Qe(e==="global"&&!t?{type:"loading"}:e==="global"&&t?{type:"profile-loading"}:{type:"mode-select",cursor:0}),[g,d]=Qe(""),[C,x]=Qe(null),[y,v]=Qe(void 0),h=Ze(a=>{if(a==="local"){o({mode:"local",credentials:null});return}s({type:"profile-loading"})},[o]),l=Ze(async a=>{if(a===null){s({type:"profile-loading"});let u=await Ie();s({type:"name-entry",nameBuffer:"",existingProfiles:u});return}v(a.isDefault?void 0:a.name),s({type:"loading"});let i=a.isDefault?await Y():await Ce(a.name),c=i?Math.max(0,K.indexOf(i.environment)):0;s({type:"creds-entry",field:0,values:i??{},envCursor:c})},[]),b=Ze(async(a,i)=>{let c=K[i]??"go",u={apiKey:a.apiKey??"",userId:a.userId??"",businessId:a.businessId??"",environment:c};s({type:"saving"});try{await Kt(y??oe,u),o({mode:"global",credentials:u,...y!==void 0&&{profileName:y}})}catch(f){x(f instanceof Error?f.message:String(f)),s({type:"creds-entry",field:0,values:a,envCursor:i})}},[o,y]);wo((a,i)=>{if(i.ctrl&&a==="c"&&process.exit(0),i.escape){if((r.type==="creds-entry"||r.type==="name-entry")&&e==="global"&&t){s({type:"profile-loading"}),P();return}n?.();return}if(r.type==="mode-select"){if(i.upArrow)s({type:"mode-select",cursor:0});else if(i.downArrow)s({type:"mode-select",cursor:1});else if(i.return){let c=r.cursor===0?"global":"local";h(c)}return}if(r.type==="profile-select"){let{profiles:c,cursor:u}=r,f=c.length,j=c.length+1;if(i.upArrow)s({...r,cursor:(u-1+j)%j});else if(i.downArrow)s({...r,cursor:(u+1)%j});else if(i.return)if(u===f)s({type:"name-entry",nameBuffer:"",existingProfiles:c});else{let E=c[u]??c[0];E&&l(E)}return}if(r.type==="name-entry"){let{nameBuffer:c,existingProfiles:u}=r;if(i.backspace||i.delete)s({type:"name-entry",nameBuffer:c.slice(0,-1),existingProfiles:u});else if(i.return){let f=c.trim();if(!f){s({...r,nameError:"Name cannot be empty"});return}if(f===oe){s({...r,nameError:`"${oe}" is reserved`});return}if(u.some(j=>j.name===f)){s({...r,nameError:`Profile "${f}" already exists`});return}v(f),s({type:"creds-entry",field:0,values:{},envCursor:0}),d("")}else a&&!i.ctrl&&!i.meta&&s({type:"name-entry",nameBuffer:c+a,existingProfiles:u});return}if(r.type==="creds-entry"){let{field:c,values:u,envCursor:f}=r;if(c===ie.length){i.leftArrow?s({...r,envCursor:(f-1+K.length)%K.length}):i.rightArrow?s({...r,envCursor:(f+1)%K.length}):i.upArrow?(s({...r,field:c-1}),d(u[ie[c-1]]??"")):i.return&&b(u,f);return}let E=ie[c];if(!E)return;if(i.backspace||i.delete)d(R=>R.slice(0,-1));else if(i.upArrow&&c>0){let R={...u,[E]:g},A=c-1;s({...r,field:A,values:R}),d(R[ie[A]]??"")}else if(i.return||i.tab||i.downArrow){let R={...u,[E]:g},A=c+1;s({...r,field:A,values:R}),A<ie.length?d(R[ie[A]]??""):d("")}else a&&!i.ctrl&&!i.meta&&d(R=>R+a)}});let P=Ze(async()=>{let a=await Ie();s({type:"profile-select",profiles:a,cursor:0})},[]);if(kt(()=>{r.type==="profile-loading"&&P()},[r.type,P]),kt(()=>{e==="global"&&!t&&(async()=>{let a=await Y(),i=a?Math.max(0,K.indexOf(a.environment)):0;s({type:"creds-entry",field:0,values:a??{},envCursor:i})})()},[]),kt(()=>{r.type==="creds-entry"&&r.field===0&&d(r.values.apiKey??"")},[r.type]),r.type==="loading"||r.type==="saving"||r.type==="profile-loading"){let a=r.type==="saving"?"Saving credentials\u2026":r.type==="profile-loading"?"Loading profiles\u2026":"Loading credentials\u2026";return k(z,{paddingY:1,paddingX:2,children:k(B,{dimColor:!0,children:a})})}if(r.type==="done")return null;if(r.type==="mode-select")return q(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[k(V,{}),q(z,{flexDirection:"column",gap:0,children:[k(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((i,c)=>{let u=r.cursor===c;return q(z,{gap:2,children:[k(B,{...u&&{color:"cyan"},children:u?"\u276F":" "}),k(B,{bold:u,...u&&{color:"cyan"},children:i.label}),k(B,{dimColor:!0,children:i.desc})]},i.mode)})]}),k(Le,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Ctrl+C to quit"})]});if(r.type==="profile-select"){let{profiles:a,cursor:i}=r,c=a.length;return q(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[k(V,{}),q(z,{flexDirection:"column",gap:0,children:[k(B,{bold:!0,children:"Credential profiles"}),a.map((u,f)=>{let j=i===f;return q(z,{gap:2,children:[k(B,{...j&&{color:"cyan"},children:j?"\u276F":" "}),k(B,{bold:j,...j&&{color:"cyan"},children:u.isDefault?"Default":u.name}),k(B,{dimColor:!0,children:u.path})]},u.name)}),q(z,{gap:2,children:[k(B,{...i===c&&{color:"cyan"},children:i===c?"\u276F":" "}),k(B,{bold:i===c,...i===c&&{color:"cyan"},children:"+ Add new profile"})]})]}),k(Le,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(r.type==="name-entry"){let{nameBuffer:a,nameError:i}=r;return q(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[k(V,{}),k(z,{flexDirection:"column",gap:0,children:k(B,{bold:!0,children:"New credential profile"})}),i&&q(B,{color:"red",children:["Error: ",i]}),q(z,{gap:2,children:[k(z,{width:12,children:k(B,{bold:!0,color:"cyan",children:"Profile name"})}),k(B,{color:"cyan",children:">"}),k(B,{children:a}),k(B,{color:"cyan",children:"\u2588"})]}),k(Le,{text:"Type a name \xB7 Enter to confirm \xB7 Esc to go back"})]})}let{field:D,values:S,envCursor:m}=r,p=D===ie.length,_=y??oe;return q(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[k(V,{}),q(z,{flexDirection:"column",gap:0,children:[k(B,{bold:!0,children:y!==void 0?`Profile: ${y}`:"Global credentials"}),q(B,{dimColor:!0,children:["Saved to:"," ",y!==void 0?`~/.kizenappbuilder/${y}.json`:we]})]}),C&&q(B,{color:"red",children:["Error: ",C]}),q(z,{flexDirection:"column",gap:0,children:[ie.map((a,i)=>{let c=D===i,u=c?g:S[a]??"";return q(z,{gap:2,children:[k(z,{width:12,children:k(B,{bold:c,...c&&{color:"cyan"},children:Co[a]})}),k(B,{...c&&{color:"cyan"},children:">"}),k(B,{children:u}),c&&k(B,{color:"cyan",children:"\u2588"})]},a)}),q(z,{gap:2,children:[k(z,{width:12,children:k(B,{bold:p,...p&&{color:"cyan"},children:"Environment"})}),k(B,{...p&&{color:"cyan"},children:">"}),k(z,{gap:1,children:K.map((a,i)=>{let c=i===m;return p?k(B,{bold:c,...c&&{color:"cyan"},children:c?`[${a}]`:a},a):k(B,{dimColor:!c,bold:c,children:a},a)})})]})]}),p?k(Le,{text:"\u2190\u2192 to select \xB7 \u2191\u2193 to move \xB7 Enter to save \xB7 Esc to cancel"}):k(Le,{text:"\u2191\u2193 to move \xB7 Backspace to delete \xB7 Esc to cancel"}),q(B,{dimColor:!0,children:["Profile: ",_]})]})};import{jsx as L,jsxs as O}from"react/jsx-runtime";var Eo=[".kizenapp",".git"],xr=({port:e,pluginDir:t,outputDir:o,credentials:n,credentialMode:r,activeCredentialProfile:s,lastPath:g,debug:d=!1,verbose:C=!1,autoViewer:x=!0})=>{let y=te(n),v=te(s),h=te(g),[l,b]=J("main"),[P,D]=J(r),[S,m]=J("starting"),[p,_]=J(null),[a,i]=Ye(50),[c,u]=Ye(50),[f,j]=Ye(50),[E,R]=J([]),[A,H]=J("pending"),[W,Q]=J(null),[ae,_e]=J(null),[ee,nt]=J(null),[ot,it]=J(0),[Pt,Lr]=J(0),[Fr,jr]=J(0),[$r,Ar]=J(0),st=te(!1),Et=te(!1),je=te(null),ke=te(null),re=te(new Set),$e=te([]),G=Se(w=>{let F=JSON.stringify(w);if(re.current.size===0){$e.current=[...$e.current,F].slice(-50);return}let ne=!1;for(let X of re.current)if(X.readyState===1)try{X.send(F)}catch{re.current.delete(X),ne=!0}ne&&it(re.current.size)},[]),Ae=i,at=Se(()=>{je.current?.kill(),je.current=null,hr({port:e,userDataDir:yr(o,".chrome"),broadcast:G,onWarn:w=>{i(`\u26A0 ${w}`)},...h.current!==void 0&&{path:h.current},...d&&{debugLog:j},...C&&{verbose:!0}}).then(w=>{je.current=w})},[e,o,G,d,C,j,i]);tt(()=>{let w=()=>{je.current?.kill()};return process.on("exit",w),()=>{process.off("exit",w)}},[]),_o((w,F)=>{(w==="q"||F.ctrl&&w==="c")&&process.exit(0),w==="c"&&b("editing"),w==="v"&&at()},{isActive:l==="main"}),tt(()=>{S!=="running"||Et.current||!x||(Et.current=!0,at())},[S,x,at]);let Or=Se(w=>{y.current=w.credentials,v.current=w.profileName,b("main"),D(w.mode);let F=w.profileName;ge(o,{credentialMode:w.mode,...F!==void 0&&{activeCredentialProfile:F}}),G({type:"credentials-updated",credentials:w.credentials})},[o,G]),It=Se(w=>{R(F=>[...F,`${new Date().toLocaleTimeString()}: ${Ct(w)}`].slice(-50)),w.kind==="request"&&(w.fromCache?jr(F=>F+1):Ar(F=>F+1)),G({type:"proxy-log",entry:w})},[G]),le=Se(w=>{u(w),G({type:"log",message:w})},[u,G]),lt=Se(()=>{st.current||(st.current=!0,H("building"),Q(null),le("Build started"),He(t,o).then(({bundleSize:w})=>{le(`Build finished \u2014 bundle: ${Te(w)}`),H("done"),_e(new Date),nt(w),le("Notifying viewers to reload"),G({type:"rebuild"})}).catch(w=>{let F=w instanceof Error?w.message:String(w);Q(F),H("error")}).finally(()=>{st.current=!1}))},[t,o,le,G]);if(tt(()=>{lt();let w=ko(t,{recursive:!0},(F,ne)=>{if(!ne)return;let X=ne.replace(/\\/g,"/");Eo.some(Oe=>X.startsWith(Oe))||(le(`File change detected: ${ne}`),ke.current!==null&&clearTimeout(ke.current),ke.current=setTimeout(lt,150))});return w.on("error",F=>{le(`File watcher error \u2014 rebuilds have stopped: ${F.message}`)}),()=>{w.close(),ke.current!==null&&clearTimeout(ke.current)}},[t,lt,le]),tt(()=>{let w=ur();_t(yr(w,"index.html")).then(F=>{if(!F){_("Viewer not built. Run 'pnpm build:viewer' first."),m("error");return}let ne=pr(w,Ae,It,y,v,o,G,Lr,h,t),X=To(ne),Oe=new Po({server:X});return Oe.on("connection",ce=>{for(let Mr of $e.current)ce.readyState===1&&ce.send(Mr);$e.current=[],Ae("Viewer connected for live reload"),re.current.add(ce),it(re.current.size),ce.on("close",()=>{re.current.delete(ce),it(re.current.size)})}),X.listen(e,"127.0.0.1",()=>{m("running"),Ae(`Server started on 127.0.0.1:${String(e)}`)}),X.on("error",ce=>{_(ce.message),m("error")}),()=>{Oe.close(),X.close()}})},[e,Ae,It,G,o,t]),l==="editing")return L(et,{...P!==void 0&&{initialMode:P},showProfileManager:P==="global",onComplete:Or,onCancel:()=>{b("main")}});let ct=ae!==null?Math.round((Date.now()-ae.getTime())/1e3):null,zr=ct===null?"":ct<5?" (just now)":` (${String(ct)}s ago)`;return O(U,{flexDirection:"column",paddingY:1,paddingX:2,children:[L(V,{marginBottom:1}),O(U,{flexDirection:"column",children:[O(U,{gap:2,marginBottom:0,children:[L(N,{bold:!0,dimColor:!0,children:"App Build"}),A==="pending"&&L(N,{dimColor:!0,children:"waiting\u2026"}),A==="building"&&O(U,{gap:1,children:[L(qe,{}),L(N,{children:"Building plugin package\u2026"})]}),A==="done"&&O(U,{gap:1,children:[L(N,{color:"green",children:"\u2713 Built"}),ae!==null&&O(N,{dimColor:!0,children:["at ",ae.toLocaleTimeString(),zr]}),ee!==null&&O(N,{dimColor:!0,children:["\xB7 bundle: ",Te(ee)]})]}),A==="error"&&O(N,{color:"red",children:["\u2717 ",W??"unknown error"]})]}),L(U,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:c.slice(-8).map((w,F)=>L(N,{dimColor:!0,wrap:"truncate",children:w},F))})]}),O(U,{marginTop:1,flexDirection:"column",children:[O(U,{gap:2,children:[L(N,{bold:!0,dimColor:!0,children:"Web Server"}),S==="starting"&&L(N,{dimColor:!0,children:"starting\u2026"}),S==="running"&&O(U,{gap:2,children:[L(N,{color:"green",children:"\u2713 Running"}),O(N,{dimColor:!0,children:["\u25CF ",ot," viewer",ot!==1?"s":""]})]}),S==="error"&&O(N,{color:"red",children:["\u2717 ",p??"Server error"]})]}),L(U,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:a.slice(-8).map((w,F)=>L(N,{dimColor:!0,wrap:"truncate",children:w},F))})]}),O(U,{marginTop:1,flexDirection:"column",children:[O(U,{gap:2,children:[L(N,{bold:!0,dimColor:!0,children:"Network Proxy"}),L(N,{color:"green",children:"\u2713 Active"}),O(N,{dimColor:!0,children:["\u25CF ",Pt," key",Pt!==1?"s":""," in the network cache \xB7"," ",Fr," hit \xB7 ",$r," miss"]})]}),L(U,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:E.length===0?L(N,{dimColor:!0,children:" No requests yet."}):E.slice(-8).map((w,F)=>L(N,{dimColor:!0,wrap:"truncate",children:w},F))})]}),d&&O(U,{marginTop:1,flexDirection:"column",children:[O(U,{gap:2,children:[L(N,{bold:!0,dimColor:!0,children:"CDP Debug"}),O(N,{dimColor:!0,children:["\u25CF ",f.length," event(s)"]})]}),L(U,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:f.length===0?L(N,{dimColor:!0,children:" No CDP events yet."}):f.slice(-8).map((w,F)=>L(N,{dimColor:!0,wrap:"truncate",children:w},F))})]}),O(U,{marginTop:1,gap:1,children:[L(N,{dimColor:!0,children:"["}),L(N,{children:"q"}),L(N,{dimColor:!0,children:"] quit ["}),L(N,{children:"c"}),L(N,{dimColor:!0,children:"] credentials ["}),L(N,{children:"v"}),O(N,{dimColor:!0,children:["] ",ot===0?"open viewer":"relaunch viewer"]})]})]})};async function br(e){return new Promise(t=>{let o=null,n=s=>{o?.(),t(s)},{unmount:r}=wr(vr(et,{...e!==void 0&&{initialMode:e},onComplete:n}),{exitOnCtrlC:!1});o=r})}function Cr(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 o=parseInt(t.port,10),n=process.cwd(),r=`${n}/.kizenapp`;be(n);let s=null,g,d,{lastPath:C}=await Ne(r);if(t.credentials)s=await Ge(t.credentials);else{let l=await Ne(r);if(l.credentialMode==="local")g="local";else if(l.credentialMode==="global"){if(g="global",d=l.activeCredentialProfile,d?(s=await Ce(d),s||(s=await Y(),d=void 0)):s=await Y(),!s){let b=await br("global");s=b.credentials,d=b.profileName}}else{let b=await br();s=b.credentials,g=b.mode,d=b.profileName;let P=b.profileName;await ge(r,{credentialMode:b.mode,...P!==void 0&&{activeCredentialProfile:P}})}}let x=t.verbose===!0,y=x||t.debug===!0,v=t.viewer!==!1,{waitUntilExit:h}=wr(vr(xr,{port:o,pluginDir:n,outputDir:r,credentials:s,...g!==void 0&&{credentialMode:g},...d!==void 0&&{activeCredentialProfile:d},...C!==void 0&&{lastPath:C},debug:y,verbose:x,autoViewer:v}),{exitOnCtrlC:!1});await h()})}var Io=new Set(["phone","envelope","pen-nib","calendar-days","paperclip","file","clipboard","pen","tag","book","print","pen-to-square","folder","folder-open","thumbtack","globe","city","briefcase","compass","address-book","business-time","computer-classic","pen-fancy","badge-check","mug-saucer","landmark","chart-simple","envelopes","diagram-venn","calendar","pencil","phone-volume","copy","table","building","network-wired","address-card","tags","registered","signature","phone-office","projector","sitemap","marker","badge","wallet","copyright","bullseye","calculator","certificate","percent","eraser","file-spreadsheet","glasses","industry","vault","user-tie-hair-long","user-tie-hair","user-hair-mullet","trademark","timeline-arrow","timeline","table-tree","table-rows","table-pivot","table-layout","table-columns","stapler","square-poll-vertical","square-poll-horizontal","square-phone-flip","square-phone","square-pen","square-kanban","square-envelope","socks","slot-machine","signature-slash","signature-lock","shredder","scissors","scanner-image","scale-unbalanced-flip","scale-unbalanced","scale-balanced","router","rectangle-pro","print-slash","print-magnifying-glass","presentation-screen","podium","phone-slash","phone-intercom","phone-flip","person-chalkboard","pen-nib-slash","pen-clip","paste","paperclip-vertical","notebook","note-sticky","money-check-pen","money-check-dollar-pen","magnifying-glass-chart","magnifying-glass-arrow-right","list-tree","list-timeline","list-radio","list-dropdown","list-check","laptop-file","lamp-desk","keynote","industry-windows","inboxes","inbox-full","house-laptop","highlighter","folders","folder-xmark","folder-tree","folder-plus","folder-minus","folder-arrow-up","folder-arrow-down","floppy-disk-circle-xmark","floppy-disk-circle-arrow-right","floppy-disk","file-user","file-lines","file-circle-plus","file-circle-info","file-chart-pie","file-chart-column","fax","envelope-open","envelope-dot","envelope-circle-check","coffee-pot","cloud-word","clipboard-question","chart-user","chart-tree-map","chart-simple-horizontal","chart-pyramid","chart-pie-simple","chart-pie","chart-line-up","chart-line-down","chart-line","cake-candles","cabinet-filing","bullhorn","briefcase-blank","briefcase-arrow-right","brain-arrow-curved-right","boxes-packing","box-archive","book-section","bars-staggered","bars-progress","badge-percent","badge-dollar","arrows-to-eye","arrows-to-dot","arrows-spin","sparkles","megaphone","block-question","lightbulb-slash","comments-dollar","comments","bullseye-pointer","lightbulb","user-group-crown","user-crown","signal-stream-slash","signal-stream","rectangle-ad","ranking-star","person-rays","people-group","messages-dollar","message-dollar","magnifying-glass-location","magnifying-glass-dollar","lightbulb-on","lightbulb-exclamation","lightbulb-dollar","lightbulb-cfl-on","lightbulb-cfl","hundred-points","group-arrows-rotate","gift-card","filter-circle-dollar","envelopes-bulk","envelope-open-text","envelope-open-dollar","comment-dollar","chart-mixed","bullseye-arrow","star","heart","camera-retro","truck-fast","bell","cart-shopping","gift","barcode","bookmark","camera","thumbs-up","thumbs-down","key","truck","balloons","handshake","shop","shirt","bag-shopping","moped","cart-plus","credit-card","store","cash-register","booth-curtain","trophy","receipt","truck-container","truck-clock","truck-bolt","trophy-star","store-slash","store-lock","star-exclamation","shop-slash","shop-lock","rectangle-barcode","person-booth","nfc-trash","nfc-symbol","nfc-slash","nfc-signal","nfc-pen","nfc-magnifying-glass","nfc-lock","nfc","money-check-dollar","money-check","mobile-signal-out","mobile-signal","hexagon-vertical-nft-slanted","hexagon-vertical-nft","hexagon-image","hand-holding-box","gifts","gem","credit-card-front","credit-card-blank","cart-xmark","cart-shopping-fast","cart-minus","cart-circle-xmark","cart-circle-plus","cart-circle-exclamation","cart-circle-check","cart-circle-arrow-up","cart-circle-arrow-down","cart-arrow-up","cart-arrow-down","box-open-full","basket-shopping-simple","basket-shopping","barcode-scan","barcode-read","balloon","bags-shopping","bars","browser","chart-bar","cog","database","calendar-alt","play","kizen-k","add","book-alt","form-entity","arrows-to-circle","question-circle","chevron-down","chevron-up","window-restore","forward"]),Bo=[...Io].sort(),No=new Set(["kizen-k","form-entity"]),Sr=[...Bo,...[...No].sort()];function _r(e){e.command("icons").description("List all valid icon names accepted by toolbar items, pages, and adornments").action(()=>{for(let t of Sr)console.log(t)})}import{mkdir as Do,writeFile as kr,readFile as Ro}from"fs/promises";import{join as rt}from"path";var Lo=new Set(["developer_business_id"]);function Fo(e){return Array.isArray(e)?e.map(t=>{if(typeof t!="object"||t===null)return t;let o=t;if(typeof o.auth_credentials!="object"||o.auth_credentials===null)return o;let n=Object.fromEntries(Object.keys(o.auth_credentials).map(r=>[r,"*****"]));return{...o,auth_credentials:n}}):e}var jo={".png":"image/png",".svg":"image/svg+xml",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp"};function Pr(e){let t={name:"",children:new Map,isFile:!1,filePath:""};for(let o of e){let n=o.path.split("/"),r=t;n.forEach((s,g)=>{r.children.has(s)||r.children.set(s,{name:s,children:new Map,isFile:g===n.length-1,filePath:n.slice(0,g+1).join("/")});let d=r.children.get(s);d&&(r=d)})}return t}function Tt(e){return"file-"+e.replace(/[^a-zA-Z0-9]/g,"-")}function Z(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Er(e){return`<ul>${[...e.children.values()].sort((n,r)=>n.isFile!==r.isFile?n.isFile?1:-1:n.name.localeCompare(r.name)).map(n=>n.isFile?`<li class="tf"><a href="#${Tt(n.filePath)}" data-id="${Tt(n.filePath)}">${Z(n.name)}</a></li>`:`<li class="td"><span class="dn">${Z(n.name)}/</span>${Er(n)}</li>`).join("")}</ul>`}function Ir(e){let t=e.lastIndexOf(".");return t>=0?e.slice(t).toLowerCase():""}function $o(e){let t;return e.base64Image!==void 0?t=`<img src="data:${jo[Ir(e.path)]??"image/png"};base64,${e.base64Image}" alt="${Z(e.path)}" style="max-width:100%">`:e.binaryData!==void 0?t=`<p class="bin">[Binary file: ${String(e.binaryData.length)} bytes]</p>`:t=`<pre><code>${Z(e.content)}</code></pre>`,`<section id="${Tt(e.path)}"><h2 class="fp">${Z(e.path)}</h2><div class="fb">${t}</div></section>`}var Ao={".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".json":"json",".css":"css",".scss":"scss",".html":"html",".htm":"html",".md":"markdown",".mdx":"markdown",".py":"python",".sh":"bash",".yml":"yaml",".yaml":"yaml",".xml":"xml",".toml":"toml"};function Oo(e){return Ao[Ir(e)]??""}function Br(e,t=""){let o=[...e.children.values()].sort((n,r)=>n.isFile!==r.isFile?n.isFile?1:-1:n.name.localeCompare(r.name));return o.map((n,r)=>{let s=r===o.length-1,g=s?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",d=s?" ":"\u2502 ";return n.isFile?`${t}${g}${n.name}`:`${t}${g}${n.name}/
|
|
174
|
+
${Br(n,t+d)}`}).join(`
|
|
175
|
+
`)}function Nr(e){return e.filter(t=>t.path!=="kizen.json"&&t.path!=="plugin-report.html")}function Dr(e){return Object.fromEntries(Object.entries(e).filter(([t])=>!Lo.has(t)).map(([t,o])=>[t,t==="services"?Fo(o):o]))}function zo(e,t){let o=Dr(e),n=typeof e.name=="string"?e.name:"Plugin",r=typeof e.version=="string"?e.version:"",s=typeof e.description=="string"?e.description:"",g=Nr(t),d=[];d.push(`# ${n}${r?` v${r}`:""}`),s&&d.push("",s),d.push("","## Configuration (`kizen.json`)","","```json",JSON.stringify(o,null,2),"```"),d.push("","## File Tree","","```",Br(Pr(g)),"```"),d.push("","## Files");for(let C of g)d.push("",`### \`${C.path}\``,""),C.base64Image!==void 0?d.push(`[Image file: ${C.path}]`):C.binaryData!==void 0?d.push(`[Binary file: ${String(C.binaryData.length)} bytes]`):d.push(`\`\`\`${Oo(C.path)}`,C.content,"```");return d.join(`
|
|
176
176
|
`)+`
|
|
177
|
-
`}function
|
|
177
|
+
`}function Mo(e,t){let o=Dr(e),n=typeof e.name=="string"?e.name:"Plugin",r=typeof e.version=="string"?e.version:"",s=typeof e.description=="string"?e.description:"",g=Nr(t),d=Er(Pr(g)),C=g.map($o).join(`
|
|
178
178
|
`);return`<!DOCTYPE html>
|
|
179
179
|
<html lang="en">
|
|
180
180
|
<head>
|
|
@@ -240,7 +240,7 @@ ${C}
|
|
|
240
240
|
})();
|
|
241
241
|
</script>
|
|
242
242
|
</body>
|
|
243
|
-
</html>`}var
|
|
243
|
+
</html>`}var Tr=rt(me,"examples");function Rr(e){e.command("report").description("Generate a self-contained HTML report of the plugin").option("-o, --output <path>",`output file path (default: ${Tr}/<api_name>.html)`).action(async t=>{let o=process.cwd(),n;try{let C=await Ro(rt(o,"kizen.json"),"utf-8"),x=JSON.parse(C);n=Array.isArray(x)?x[0]:x}catch{console.error("Error: kizen.json not found. Run this command from a plugin directory."),process.exit(1)}let r=typeof n.api_name=="string"?n.api_name:"plugin",s=t.output??rt(Tr,`${r}.html`),g=s.replace(/\.html$/,".md"),d=await Me(o);await Do(rt(s,".."),{recursive:!0}),await Promise.all([kr(s,Mo(n,d),"utf-8"),kr(g,zo(n,d),"utf-8")]),console.log(`Plugin report written to:
|
|
244
244
|
${s}
|
|
245
|
-
${g}`)})}var
|
|
245
|
+
${g}`)})}var Jo=Uo(qo(Vo(import.meta.url)),"..","package.json"),Wo=JSON.parse(Ho(Jo,"utf-8"));he.name("appbuilder").description("Kizen plugin app builder").version(Wo.version);Xt(he);Ot(he);Cr(he);Rr(he);_r(he);he.parse();
|
|
246
246
|
//# sourceMappingURL=index.js.map
|