@kizenapps/cli 1.4.0-fcc7387 → 1.5.0-f5c8da8
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 +17 -17
- package/dist/index.js.map +1 -1
- package/dist/viewer/assets/AppDetailPage-RmQ6eFrs.js +1 -0
- package/dist/viewer/assets/BootstrapContext-BLyrI7bs.js +1 -0
- package/dist/viewer/assets/{CodeStepsPage-BzLWCjg6.js → CodeStepsPage-4mGAx_d8.js} +1 -1
- package/dist/viewer/assets/ConfigurationPage-DCE50jxK.js +1 -0
- package/dist/viewer/assets/DevSidebar-BkO0bOpR.js +1 -0
- package/dist/viewer/assets/Dialog-BtHSr4rf.js +1 -0
- package/dist/viewer/assets/IconReferencePage-DrDFi3ph.js +1 -0
- package/dist/viewer/assets/SandboxPage-Lg8-iFmb.js +1 -0
- package/dist/viewer/assets/{SourceBrowserPage-Clg_fH0I.js → SourceBrowserPage-C7hAR6YZ.js} +1 -1
- package/dist/viewer/assets/{VersionsPage-BRfN-13x.js → VersionsPage-BOapKeT8.js} +1 -1
- package/dist/viewer/assets/{WhenBadge-DY21YMpA.js → WhenBadge-B-bN_K_6.js} +1 -1
- package/dist/viewer/assets/api--yBCib3R.js +11 -0
- package/dist/viewer/assets/calendarSource.worker-Ch3rgZR6.js +25 -0
- package/dist/viewer/assets/{configStorage-fNlYS08a.js → configStorage-CqY0w-Nt.js} +1 -1
- package/dist/viewer/assets/floatingFrame.worker-Bbq7GWth.js +24 -0
- package/dist/viewer/assets/generic.worker-Cbl5oax1.js +24 -0
- package/dist/viewer/assets/iconMap-BotklELY.js +1 -0
- package/dist/viewer/assets/index-B2_Kf66j.js +5 -0
- package/dist/viewer/assets/index-CyOoy-kN.css +2 -0
- package/dist/viewer/assets/recordDetail.worker-DNuhYdSl.js +24 -0
- package/dist/viewer/assets/useCriticalExceptionDialog-BWqpBmfm.js +40 -0
- package/dist/viewer/index.html +6 -5
- package/package.json +3 -3
- package/dist/viewer/assets/AppDetailPage-bXSN_SkL.js +0 -1
- package/dist/viewer/assets/BootstrapContext-BJMPPV2t.js +0 -1
- package/dist/viewer/assets/ConfigurationPage-DHbuiVlX.js +0 -1
- package/dist/viewer/assets/DevSidebar-C8F2KFXY.js +0 -1
- package/dist/viewer/assets/IconReferencePage-BDKMGmeG.js +0 -1
- package/dist/viewer/assets/SandboxPage-CMq8Xrjk.js +0 -1
- package/dist/viewer/assets/api-DJcHZP2k.js +0 -10
- package/dist/viewer/assets/calendarSource.worker-2UhvqVzo.js +0 -24
- package/dist/viewer/assets/floatingFrame.worker-BPvRqAU5.js +0 -23
- package/dist/viewer/assets/generic.worker-CaEdS_L8.js +0 -23
- package/dist/viewer/assets/index-BqEAhAQ_.css +0 -2
- package/dist/viewer/assets/index-ZdHVsbQr.js +0 -5
- package/dist/viewer/assets/recordDetail.worker-DIZ1eFYu.js +0 -23
- package/dist/viewer/assets/useCriticalExceptionDialog-4AtgdUhp.js +0 -40
- package/dist/viewer/assets/validIcons-LvIGHq2c.js +0 -1
- /package/dist/viewer/assets/{Card-DRaOqhzt.js → Card-D66xMN4f.js} +0 -0
- /package/dist/viewer/assets/{CodeViewer-sTHrPWAx.js → CodeViewer-BbZIh-MU.js} +0 -0
- /package/dist/viewer/assets/{Tooltip-9-UcK9bz.js → Tooltip-D9Le4Lgo.js} +0 -0
- /package/dist/viewer/assets/{fa-pro-icons-DtrKpGj8.js → fa-pro-icons-CmhlYbxQ.js} +0 -0
- /package/dist/viewer/assets/{formatBytes-C9lOTtsO.js → formatBytes-BCP0hIUu.js} +0 -0
- /package/dist/viewer/assets/{useLocalStorage-BTxXC7un.js → useLocalStorage-oRuCYBcL.js} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFileSync as
|
|
3
|
-
`).map(g=>g.trim());if(s.includes(o)||s.includes(".kizenapp"))return}let n
|
|
2
|
+
import{readFileSync as Mo}from"fs";import{dirname as Ho,join as qo}from"path";import{fileURLToPath as Uo}from"url";import{program as ge}from"commander";import{createElement as hn}from"react";import{render as yn}from"ink";import{useEffect as fn,useState as pt}from"react";import{Box as Pe,Text as ye,useApp as mn}from"ink";import{mkdir as Jr,writeFile as Wr}from"fs/promises";import{join as Gr}from"path";import{minifyFiles as Kr,packagePlugin as Xr,transformDeployablePlugin as Yr}from"@kizenapps/packager";import{readdir as Mr,readFile as dt}from"fs/promises";import{join as Bt,relative as Hr}from"path";var qr=new Set([".png",".svg"]),Ur=new Set([".kzn"]),Vr=new Set([".DS_Store"]),ze=new Set(["node_modules",".git",".kizenapp",".github"]);async function Nt(e,t){let o=await Mr(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()&&(Vr.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=Hr(e,o).split("\\").join("/"),r=n.lastIndexOf("."),s=r>=0?n.slice(r).toLowerCase():"";if(qr.has(s)){let d=await dt(o);return{path:n,content:"",base64Image:d.toString("base64")}}if(Ur.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 Zr=["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 Zr){let r=e[n];if(typeof r!="string"||r==="")throw new Error(`${o} is missing required field "${n}" (expected a non-empty string).`)}}function Qr(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 en=(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 Jr(t,{recursive:!0}),o?.("reading-files");let n=await Me(e);o?.("minifying");let r=await Kr(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=Qr(s.content),d=Xr(r,g),C=Object.values(d).map(Yr);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 en(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 Wr(Gr(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 on,Text as sn}from"ink";import{Box as tn,Text as rn}from"ink";import{jsx as Rt}from"react/jsx-runtime";var nn=[" :::::::: "," :::::: ::::::::::: "," :::::: :::::::::: "," :::::: :::::: ::::::: "," ::::: :::::: ::::::::::::::::: "," ::::: ::::: ::::::::::::::::::: "," ::::: ::::: :::::: ::::: ",":::: ::::: ::: ::::: :: ","::::: :::::: :::::::::: ","::::: :::::: ::::::::::: "," ::::: ::: ::::::: "," ::::::: ::: ::::: "," ::::::::::: :::::: :::::"," :::::::::: :::::: :::::"," :: ::::: ::: ::::: ::::"," ::::: :::::: ::::: ::::: ::: "," ::::::::::::::::::: ::::: ::::: "," ::::::::::::::::: ::::: ::::: "," ::::::::: :::::: :::::: "," :::::::::: :::::: "," ::::::::::: :::::: "," :::::::: "],Lt=()=>Rt(tn,{flexDirection:"column",children:nn.map((e,t)=>Rt(rn,{color:"cyan",children:e},t))});import{Fragment as an,jsx as ut,jsxs as ln}from"react/jsx-runtime";var V=({marginBottom:e=0})=>ln(an,{children:[ut(Lt,{}),ut(on,{flexDirection:"column",marginTop:1,marginBottom:e,children:ut(sn,{bold:!0,color:"cyan",children:"Kizen App Development Toolkit"})})]});import{useEffect as cn,useState as dn}from"react";import{Text as un}from"ink";import{jsx as pn}from"react/jsx-runtime";var Ft=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],qe=()=>{let[e,t]=dn(0);return cn(()=>{let o=setInterval(()=>{t(n=>(n+1)%Ft.length)},80);return()=>{clearInterval(o)}},[]),pn(un,{color:"cyan",children:Ft[e]??"\u280B"})};import{Fragment as gn,jsx as ce,jsxs as de}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=mn(),[n,r]=pt("creating-dir"),[s,g]=pt(null),[d,C]=pt(null);fn(()=>{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 de(Pe,{flexDirection:"column",paddingY:1,paddingX:2,children:[ce(V,{marginBottom:1}),de(Pe,{flexDirection:"column",gap:0,children:[jt.map((h,l)=>{let b=n===h,P=v||x>l;return ce(Pe,{gap:1,children:y&&l===x?de(ye,{color:"red",children:["\u2717 ",Ue[h]]}):P?de(ye,{color:"green",children:["\u2713 ",Ue[h]]}):b?de(gn,{children:[ce(qe,{}),ce(ye,{children:Ue[h]})]}):de(ye,{dimColor:!0,children:[" ",Ue[h]]})},h)}),v&&d!==null&&ce(Pe,{marginTop:1,gap:1,children:de(ye,{color:"green",children:["\u2713 bundle \u2014 ",Te(d)]})}),s!==null&&ce(Pe,{marginTop:1,borderStyle:"single",borderColor:"red",paddingX:1,children:ce(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
|
+
`).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
|
-
`;
|
|
8
|
-
`,"utf-8"),await mt(ue(e.targetDir,"src"),{recursive:!0}),await mt(ue(e.targetDir,"releaseNotes"),{recursive:!0}),xe(e.targetDir)}import{jsx as _,jsxs as L}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"},Vt=["name","apiName"];function wn(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")}var be=({text:e})=>_(I,{dimColor:!0,children:e});function Cn(e){return{name:"",apiName:"",externalLink:"",description:"",developerBusinessId:e}}var Jt=({parentDir:e,defaultBusinessId:t})=>{let o=bn(),[r,n]=ke({type:"target-select",cursor:0}),[s,g]=ke("in-place"),[u,C]=ke(()=>Cn(t)),[b,x]=ke(""),[h,y]=ke(e),c=Je((S,m)=>{g(S),x(m.name),n({type:"field-entry",field:0,values:m})},[]),v=Je(async S=>{let m=await Mt(S);if(m!=="ok"){n({type:"precheck-error",targetDir:S,reason:m});return}y(S),c("in-place",u)},[u,c]),E=Je(async S=>{try{let m=await Ht(e,S.apiName);y(m),n({type:"confirm",values:S})}catch(m){n({type:"error",message:m instanceof Error?m.message:String(m)})}},[e]),R=Je(async(S,m)=>{try{await Ut({targetDir:m,name:S.name,apiName:S.apiName,externalLink:S.externalLink,description:S.description,developerBusinessId:S.developerBusinessId}),n({type:"done",targetDir:m})}catch(p){n({type:"error",message:p instanceof Error?p.message:String(p)})}},[]);if(vn((S,m)=>{if(m.ctrl&&S==="c"){o.exit();return}if(r.type==="target-select"){m.upArrow?n({type:"target-select",cursor:0}):m.downArrow?n({type:"target-select",cursor:1}):m.return?r.cursor===0?v(e):c("sub-dir",u):m.escape&&o.exit();return}if(r.type==="precheck-error"){(m.return||m.escape)&&o.exit();return}if(r.type==="field-entry"){let{field:p,values:P}=r,a=pe[p];if(!a)return;if(m.escape){o.exit();return}if(m.backspace||m.delete){x(i=>i.slice(0,-1));return}if(m.upArrow&&p>0){let i={...P,[a]:b},l=p-1,d=pe[l];n({type:"field-entry",field:l,values:i}),C(i),x(d?i[d]:"");return}if(m.return||m.tab||m.downArrow){let i=b.trim();if(Vt.includes(a)&&!i){n({type:"field-entry",field:p,values:P,fieldError:`${qt[a]} is required`});return}let d=a==="description"?b:i,f={...P,[a]:d};C(f);let F=p+1;if(F>=pe.length)x(""),s==="sub-dir"?(n({type:"resolving-target"}),E(f)):n({type:"confirm",values:f});else{let k=pe[F],N=k?f[k]:"",A=k==="apiName"&&!N?wn(f.name):N;n({type:"field-entry",field:F,values:f}),x(A)}return}S&&!m.ctrl&&!m.meta&&x(i=>i+S);return}if(r.type==="confirm"){if(m.escape){let p=pe.length-1,P=pe[p];n({type:"field-entry",field:p,values:r.values}),x(P?r.values[P]:"");return}m.return&&(n({type:"writing"}),R(r.values,h));return}(r.type==="done"||r.type==="error")&&(m.return||m.escape)&&o.exit()}),r.type==="target-select"){let S=[{label:"Use current directory",desc:e},{label:"Create new sub-directory",desc:`${e}/<inferred from API name>`}];return L(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[_(V,{}),L(M,{flexDirection:"column",gap:0,children:[_(I,{bold:!0,children:"Where should the new plugin live?"}),S.map((m,p)=>{let P=r.cursor===p;return L(M,{gap:2,children:[_(I,{...P&&{color:"cyan"},children:P?"\u276F":" "}),_(I,{bold:P,...P&&{color:"cyan"},children:m.label}),_(I,{dimColor:!0,children:m.desc})]},m.label)})]}),_(be,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(r.type==="precheck-error"){let{targetDir:S,reason:m}=r;return L(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[_(V,{}),_(I,{color:"red",bold:!0,children:"Cannot create plugin"}),L(M,{flexDirection:"column",gap:0,children:[L(I,{children:[S," already contains ",_(I,{bold:!0,children:m==="has-manifest"?"kizen.json":".kizenapp/"}),"."]}),_(I,{dimColor:!0,children:"Remove the conflicting file/directory or choose a different target to avoid overwriting an existing plugin."})]}),_(be,{text:"Enter or Esc to exit"})]})}if(r.type==="field-entry"){let{field:S,fieldError:m}=r,p=s==="sub-dir"?`Target: sub-directory of ${e} (inferred from API name)`:`Target: ${h}`;return L(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[_(V,{}),L(M,{flexDirection:"column",gap:0,children:[_(I,{bold:!0,children:"Plugin details"}),_(I,{dimColor:!0,children:p})]}),m!==void 0&&L(I,{color:"red",children:["Error: ",m]}),_(M,{flexDirection:"column",gap:0,children:pe.map((P,a)=>{let i=S===a,l=i?b:u[P],d=Vt.includes(P),f=`${qt[P]}${d?"":" (optional)"}`;return L(M,{gap:2,children:[_(M,{width:24,children:_(I,{bold:i,...i&&{color:"cyan"},children:f})}),_(I,{...i&&{color:"cyan"},children:">"}),_(I,{children:l}),i&&_(I,{color:"cyan",children:"\u2588"})]},P)})}),_(be,{text:"Enter/Tab/\u2193 next \xB7 \u2191 previous \xB7 Backspace delete \xB7 Esc cancel"})]})}if(r.type==="confirm"){let S=gt({targetDir:h,name:r.values.name,apiName:r.values.apiName,externalLink:r.values.externalLink,description:r.values.description,developerBusinessId:r.values.developerBusinessId});return L(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[_(V,{}),L(M,{flexDirection:"column",gap:0,children:[_(I,{bold:!0,children:"Ready to create"}),L(I,{dimColor:!0,children:["Target: ",h]})]}),L(M,{flexDirection:"column",gap:0,children:[_(I,{bold:!0,children:"kizen.json preview"}),_(I,{children:JSON.stringify(S,null,2)})]}),L(M,{flexDirection:"column",gap:0,children:[_(I,{dimColor:!0,children:"Also creates:"}),L(I,{dimColor:!0,children:[" ",yt(h,"src/")]}),L(I,{dimColor:!0,children:[" ",yt(h,"releaseNotes/")]}),L(I,{dimColor:!0,children:[" ",yt(h,".gitignore")," (adds .kizenapp/)"]})]}),_(be,{text:"Enter to create \xB7 Esc to go back"})]})}return r.type==="resolving-target"?_(M,{paddingY:1,paddingX:2,children:_(I,{dimColor:!0,children:"Finding available sub-directory\u2026"})}):r.type==="writing"?_(M,{paddingY:1,paddingX:2,children:_(I,{dimColor:!0,children:"Creating plugin\u2026"})}):r.type==="done"?L(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[_(V,{}),L(I,{color:"green",bold:!0,children:["Plugin created at ",r.targetDir]}),L(M,{flexDirection:"column",gap:0,children:[_(I,{dimColor:!0,children:"Next steps:"}),L(I,{children:[" ","cd ",r.targetDir]}),L(I,{children:[" ","appbuilder dev"]})]}),_(be,{text:"Enter or Esc to exit"})]}):L(M,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[_(V,{}),_(I,{color:"red",bold:!0,children:"Failed to create plugin"}),_(I,{children:r.message}),_(be,{text:"Enter or Esc to exit"})]})};import{mkdir as Wt,readFile as Sn,readdir as Pn,writeFile as Gt}from"fs/promises";import{homedir as Tn}from"os";import{dirname as _n,join as We}from"path";var K=["go","fmo","staging","integration","test1"];var fe=We(Tn(),".kizenappbuilder"),ve=We(fe,"credentials.json"),ne="credentials";function En(e){return K.includes(e)}function kn(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 Sn(e,"utf-8");return kn(JSON.parse(t))}async function Y(){try{return await Ge(ve)}catch{return null}}async function In(e){await Wt(_n(ve),{recursive:!0,mode:448}),await Gt(ve,JSON.stringify(e,null,2),{encoding:"utf-8",mode:384})}function Kt(e){return We(fe,`${e}.json`)}async function Ie(){let e=[{name:ne,path:ve,isDefault:!0}];try{let t=await Pn(fe);for(let o of t){if(!o.endsWith(".json"))continue;let r=o.slice(0,-5);r!==ne&&e.push({name:r,path:We(fe,o),isDefault:!1})}}catch{}return e}async function Xt(e,t){if(e===ne){await In(t);return}await Wt(fe,{recursive:!0,mode:448}),await Gt(Kt(e),JSON.stringify(t,null,2),{encoding:"utf-8",mode:384})}async function we(e){try{return await Ge(Kt(e))}catch{return null}}function Yt(e){e.command("create").description("Scaffold a new Kizen plugin project").action(async()=>{let t=process.cwd(),r=(await Y())?.businessId??"",{waitUntilExit:n}=Dn(Bn(Jt,{parentDir:t,defaultBusinessId:r}),{exitOnCtrlC:!1});await n()})}import{createElement as vr}from"react";import{render as wr}from"ink";import{useCallback as Ce,useEffect as rt,useRef as Q,useState as J}from"react";import{Box as q,Text as D,useInput as Po}from"ink";import{watch as To}from"fs";import{createServer as _o}from"http";import{join as hr}from"path";import{WebSocketServer as Eo}from"ws";import{createReadStream as sr,realpathSync as Wn}from"fs";import{access as Gn,readdir as Kn,readFile as Xn,realpath as Yn,stat as ar}from"fs/promises";import{dirname as Zn,extname as lr,join as Ne,resolve as Qn,sep as Pt}from"path";import{fileURLToPath as eo}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,r]of Object.entries(e)){let n=o.toLowerCase();Rn.has(n)||n.startsWith("access-control-")||(t[o]=r)}return t}var xt=10*1024*1024,Nn=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 bt(e,t){let o=e.body;if(o===null)return Buffer.alloc(0);let r=[],n=0;for await(let s of o){if(n+=s.length,n>t)throw new Be(n,t);r.push(s)}return Buffer.concat(r)}function Zt(e={}){let t=new Map,{onChange:o}=e,r=()=>{o?.(t.size)},n=s=>{t.delete(s)&&r()};return{get(s,g){let u=t.get(s);if(u!==void 0){if(Date.now()-u.insertedAt<Nn)return u.promise.then(b=>({response:b,fromCache:!0}));n(s)}if(t.size>=jn){let b=t.keys().next().value;b!==void 0&&n(b)}let C=g().then(async b=>{let x=ht(Object.fromEntries(b.headers)),h=await bt(b,xt);return{status:b.status,headers:x,body:h}}).catch(b=>{throw n(s),b});return t.set(s,{insertedAt:Date.now(),promise:C}),r(),C.then(b=>((b.status<200||b.status>=300)&&n(s),{response:b,fromCache:!1}))},clear(){t.clear(),r()}}}var vt={".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 Fn,readFile as $n,writeFile as Ln}from"fs/promises";import{join as Qt}from"path";async function De(e){try{let t=await $n(Qt(e,"config.json"),"utf-8");return JSON.parse(t)}catch{return{}}}async function me(e,t){await Fn(e,{recursive:!0}),await Ln(Qt(e,"config.json"),JSON.stringify(t,null,2),"utf-8")}import{spawn as rr}from"child_process";import{writeFile as er,rm as nr,mkdtemp as An,access as On}from"fs/promises";import{join as Re}from"path";import{tmpdir as zn}from"os";var Mn=`
|
|
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(hn($t,{outputDir:o,pluginDir:t}));await n()})}import{createElement as Nn}from"react";import{render as Dn}from"ink";import{useCallback as Je,useState as Ee}from"react";import{Box as M,Text as I,useApp as vn,useInput as wn}from"ink";import{join as gt}from"path";import{access as xn,mkdir as ft,writeFile as bn}from"fs/promises";import{join as ue}from"path";async function Ve(e){try{return await xn(e),!0}catch{return!1}}async function zt(e){return await Ve(ue(e,"kizen.json"))?"has-manifest":await Ve(ue(e,".kizenapp"))?"has-kizenapp":"ok"}async function Mt(e,t){let o=ue(e,t);if(!await Ve(o))return o;for(let n=1;n<1e3;n++){let r=ue(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 bn(ue(e.targetDir,"kizen.json"),JSON.stringify(t,null,2)+`
|
|
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=`
|
|
9
9
|
import sys, json, os, traceback
|
|
10
10
|
|
|
11
11
|
# --- Inputs proxy (attribute access) ---
|
|
@@ -165,22 +165,22 @@ sys.stdout.write('\\n__KIZEN_RESULT_START__\\n')
|
|
|
165
165
|
sys.stdout.write(json.dumps(result, ensure_ascii=False))
|
|
166
166
|
sys.stdout.write('\\n__KIZEN_RESULT_END__\\n')
|
|
167
167
|
sys.stdout.flush()
|
|
168
|
-
`.trim(),
|
|
169
|
-
`);for(;
|
|
170
|
-
`)}}),C.on("end",()=>{if(
|
|
171
|
-
`).trim(),x=b.length>0?`: ${b}`:"";n(new Error(`${e} exited with code ${String(C)}${x}`))}})})}var Ct=new Set;function Xe(e){for(let t of Ct)t(e)}function Vn(e,t){return t&&Ct.add(t),Ke||(Ke=(async()=>{let o=Re(wt,"bin","python");try{await On(o)}catch{let r=qn(e);await tr(r,["-m","venv",wt])}Xe({kind:"start"});try{await tr(o,["-m","pip","install","--disable-pip-version-check",...Un],(r,n)=>{Xe({kind:"log",line:r,stream:n})}),Xe({kind:"complete"})}catch(r){let n=r instanceof Error?r.message:String(r);throw Xe({kind:"error",message:n}),Ke=null,await nr(wt,{recursive:!0,force:!0}).catch(()=>{}),r}finally{Ct.clear()}return o})()),Ke}function Jn(e){let t="__KIZEN_RESULT_START__",o="__KIZEN_RESULT_END__",r=e.indexOf(t),n=e.indexOf(o);if(r===-1||n===-1)return{userStdout:e,result:null};let s=e.slice(0,r).trimEnd(),g=e.slice(r+t.length,n).trim();try{let u=JSON.parse(g);return{userStdout:s,result:u}}catch{return{userStdout:e,result:null}}}async function or(e){let t=e.timeout??Hn,o=await Vn(e.scriptRuntime,e.onInstallProgress),r=Date.now(),n;try{n=await An(Re(zn(),"kizen-step-"));let s=Re(n,"wrapper.py"),g=Re(n,"script.py");await Promise.all([er(s,Mn,"utf-8"),er(g,e.script,"utf-8")]);let u={...process.env,__KIZEN_INPUTS__:JSON.stringify(e.inputs),__KIZEN_SECRETS__:JSON.stringify(e.secrets),__KIZEN_SCRIPT_PATH__:g},{exitCode:C,stdout:b,stderr:x}=await new Promise(E=>{let R=[],S=[],m=!1,p=rr(o,[s],{env:u,cwd:n,stdio:["ignore","pipe","pipe"]}),P=setTimeout(()=>{p.kill("SIGKILL")},t);p.stdout.on("data",i=>{R.push(i)}),p.stderr.on("data",i=>{S.push(i)});let a=i=>{m||(m=!0,clearTimeout(P),E({exitCode:i??1,stdout:Buffer.concat(R).toString("utf-8"),stderr:Buffer.concat(S).toString("utf-8")}))};p.on("close",a),p.on("error",i=>{m||(m=!0,clearTimeout(P),E({exitCode:1,stdout:"",stderr:i.message}))})}),h=Date.now()-r,{userStdout:y,result:c}=Jn(b);if(c){let E={success:c.success,outputValues:c.outputValues,logs:c.logs,stdout:y,stderr:x,exitCode:C,durationMs:h};return c.error!==null&&(E.error=c.error),c.httpRequests&&(E.httpRequests=c.httpRequests),E}let v={success:!1,outputValues:{},logs:[],stdout:y,stderr:x,exitCode:C,durationMs:h};return C!==0&&(v.error=`Process exited with code ${String(C)}`),v}finally{n&&nr(n,{recursive:!0,force:!0})}}var ir=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 St(e){if(e.kind==="info")return e.message;let t=e.fromCache?" [cache]":"";return`${e.method} ${e.url} \u2192 ${String(e.status)}${t}`}var to=2*1024*1024,ro=new Set([".DS_Store",".gitignore"]);function no(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 oo=["kizen.com","kizen.dev"];function io(e){let t;try{t=new URL(e)}catch{return!1}if(t.protocol!=="https:")return!1;let o=t.hostname.toLowerCase();return oo.some(r=>o===r||o.endsWith("."+r))}function so(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 cr(e,t){if(t.includes("\0"))return null;let o=t.replace(/^\/+/,""),r=Qn(e,o);if(r!==e&&!r.startsWith(e+Pt))return null;try{let n=await Yn(r);return n!==e&&!n.startsWith(e+Pt)?null:n}catch{return null}}function dr(e,t){let o=t===e?"":t.slice(e.length+1);return o===""?!1:o.split(Pt).some(n=>ze.has(n))}function ur(){let e=eo(import.meta.url);return Ne(Zn(e),"viewer")}async function Tt(e){try{return await Gn(e),!0}catch{return!1}}function pr(e,t,o,r,n,s,g,u,C,b){let x=Zt({onChange:u}),h=Wn(b);return(y,c)=>{(async()=>{let v=y.url??"/";try{if(!no(y.headers.host)){c.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Forbidden"}));return}if((y.method==="POST"||y.method==="PATCH"||y.method==="DELETE")&&!so(y.headers.origin)){c.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Forbidden"}));return}if(t(`Received request: ${v}`),v==="/api/credentials"){c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({credentials:r.current??null,activeProfile:n.current??null}));return}if(v==="/api/credential-profiles"&&y.method==="GET"){let a=await Ie();c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({profiles:a,active:n.current}));return}if(v==="/api/credentials/switch"&&y.method==="POST"){let a=[];for await(let f of y)a.push(f);let l=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}").profile,d=l===void 0||l===""?await Y():await we(l);if(d!==null){r.current=d,n.current=l??void 0;let f=n.current;await me(s,{credentialMode:"global",...f!==void 0&&{activeCredentialProfile:f}}),g({type:"credentials-updated",credentials:d,activeProfile:n.current??null})}c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({ok:d!==null}));return}if(v==="/api/bundle"){let a=Ne(process.cwd(),".kizenapp","bundle.json");try{let i=await Xn(a,"utf-8");c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end(i)}catch{c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end("{}")}return}if(v==="/api/last-path"&&y.method==="POST"){let a=[];for await(let l of y)a.push(l);let i=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}");if(typeof i.path=="string"){C.current=i.path;let l=await De(s);await me(s,{...l,lastPath:i.path})}c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end('{"ok":true}');return}if(v==="/api/execute-step"&&y.method==="POST"){let a=[];for await(let f of y)a.push(f);let i=JSON.parse(Buffer.concat(a).toString("utf-8")||"{}");if(typeof i.script!="string"){c.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Missing required field: script"}));return}let l={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&&(l.timeout=Math.min(i.timeout,300*1e3));let d=await or(l);c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify(d));return}if(v==="/api/proxy-cache/clear"){x.clear(),o({kind:"info",message:"Proxy cache cleared"}),c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end('{"ok":true}');return}if(v.startsWith("/api/proxy")){let a=y.headers["x-proxy-target"];if(typeof a!="string"){c.writeHead(400),c.end("Missing x-proxy-target header");return}if(!io(a)){c.writeHead(400),c.end("Invalid proxy target");return}let i=v.slice(10)||"/",l=`${a}${i}`,d=y.method??"GET",f=[];for await(let Pe of y)f.push(Pe);let{host:F,"x-proxy-target":k,...N}=y.headers;if(d==="GET"){let Pe=`GET::${l}`,{response:se,fromCache:ot}=await x.get(Pe,()=>fetch(l,{method:"GET",headers:N}));o({kind:"request",method:"GET",status:se.status,fromCache:ot,url:i}),c.writeHead(se.status,se.headers),c.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(l,{method:d,headers:N,...H!==void 0&&{body:H}}),ee=ht(Object.fromEntries(W.headers)),ge=await bt(W,xt);o({kind:"request",method:d,status:W.status,fromCache:!1,url:i}),c.writeHead(W.status,ee),c.end(ge);return}if(v.startsWith("/api/source/tree")&&y.method==="GET"){let i=new URL(v,"http://localhost").searchParams.get("path")??"",l=await cr(h,i);if(l===null){c.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Invalid path"}));return}if(dr(h,l)){c.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Path is excluded"}));return}try{let d=await Kn(l,{withFileTypes:!0}),f=await Promise.all(d.filter(k=>k.isDirectory()?!ze.has(k.name):k.isFile()?!ro.has(k.name):!1).map(async k=>{let N=k.isDirectory()?"dir":"file",A={name:k.name,kind:N};if(N==="file")try{let H=await ar(Ne(l,k.name));A.size=H.size}catch{}return A}));f.sort((k,N)=>k.kind!==N.kind?k.kind==="dir"?-1:1:k.name.localeCompare(N.name));let F=l===h?"":l.slice(h.length+1);c.writeHead(200,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({path:F,entries:f}))}catch(d){let f=d instanceof Error?d.message:String(d);t(`source/tree failed (${i}): ${f}`),c.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Not found"}))}return}if(v.startsWith("/api/source/file")&&y.method==="GET"){let i=new URL(v,"http://localhost").searchParams.get("path")??"";if(i===""){c.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Missing path"}));return}let l=await cr(h,i);if(l===null){c.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Invalid path"}));return}if(dr(h,l)){c.writeHead(403,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Path is excluded"}));return}try{let d=await ar(l);if(!d.isFile()){c.writeHead(400,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Not a file"}));return}if(d.size>to){c.writeHead(413,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"File too large",size:d.size}));return}let f=lr(l).toLowerCase(),F=vt[f],k=ir.has(f),N=F??(k?"text/plain; charset=utf-8":"application/octet-stream");c.writeHead(200,{"Content-Type":N,"Content-Length":String(d.size)}),sr(l).pipe(c)}catch(d){let f=d instanceof Error?d.message:String(d);t(`source/file failed (${i}): ${f}`),c.writeHead(404,{"Content-Type":"application/json; charset=utf-8"}),c.end(JSON.stringify({error:"Not found"}))}return}let S=Ne(e,v==="/"?"/index.html":v),m=await Tt(S)?S:Ne(e,"index.html"),p=lr(m),P=vt[p]??"application/octet-stream";c.writeHead(200,{"Content-Type":P}),sr(m).pipe(c)}catch(E){if(v.startsWith("/api/proxy")){let R=v.slice(10)||"/",S=y.method??"GET";E instanceof Be?o({kind:"info",message:`${S} ${R} \u2192 502 (response exceeded ${String(E.limit)} bytes)`}):o({kind:"request",method:S,status:502,fromCache:!1,url:R})}else o({kind:"info",message:`Error handling ${v}: ${E instanceof Error?E.message:String(E)}`});c.headersSent||(c.writeHead(502),c.end("Bad Gateway"))}})()}}import{launch as ao}from"chrome-launcher";import{createRequire as lo}from"module";import{mkdirSync as co}from"fs";import{readFile as uo}from"fs/promises";import{dirname as po,join as fo}from"path";import{fileURLToPath as mo}from"url";var fr=lo(import.meta.url)("chrome-remote-interface"),go=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}}function Ye(e){if(e.type==="number")return Number(e.value);if(e.type==="boolean")return e.value==="true";if(e.type!=="undefined"){if(e.type==="object"&&e.value==="null")return null;if(e.type==="object"&&e.valuePreview){let{valuePreview:t}=e;if(t.subtype==="array")return t.properties.filter(r=>/^\d+$/.test(r.name)).sort((r,n)=>parseInt(r.name)-parseInt(n.name)).map(Ye);let o={};for(let r of t.properties)o[r.name]=Ye(r);return o}return e.value??`[${e.type}]`}}function yo(e){if(e.value!==void 0)return e.value;if(e.preview){let{preview:t}=e;if(t.subtype==="array")return t.properties.filter(r=>/^\d+$/.test(r.name)).sort((r,n)=>parseInt(r.name)-parseInt(n.name)).map(Ye);let o={};for(let r of t.properties)o[r.name]=Ye(r);return o}return e.description??`[${e.type}]`}async function ho(e,t){if(t.type==="object"&&t.objectId)try{let r=(await e.Runtime.callFunctionOn({objectId:t.objectId,functionDeclaration:'function() { try { const seen = new WeakSet(); return JSON.stringify(this, function(k,v) { if (typeof v === "bigint") { return String(v) + "n"; } if (typeof v === "object" && v !== null) { if (seen.has(v)) return "[Circular]"; seen.add(v); } return v; }); } catch { return undefined; } }',returnByValue:!0})).result.value;if(typeof r=="string")return JSON.parse(r)}catch{}return yo(t)}async function xo(e){try{let t=fo(po(mo(import.meta.url)),"viewer","icon.png"),o=await uo(t);await e.Browser.setDockTile({image:o.toString("base64")})}catch{}}async function yr(e){co(e.userDataDir,{recursive:!0});let t=`http://localhost:${String(e.port)}`,o=await ao({startingUrl:t,chromeFlags:[`--app=${t}`,"--no-first-run","--no-default-browser-check","--disable-extensions"],userDataDir:e.userDataDir,handleSIGINT:!1,logLevel:"silent"}),r=o.port,n=null,s=null,g=null,u=null,C=0,b=!1,x=p=>{e.debugLog?.(p)},h=p=>{e.verbose&&e.debugLog?.(p)},y=()=>{s!==null&&(clearInterval(s),s=null)},c=p=>p==="chrome://new-tab-page/"||p==="chrome://newtab/",v=async p=>{y(),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:l,request:d,responseHeaders:f,responseStatusCode:F}=i,k=d.url;h(`Fetch ${String(F??"?")} ${k}`);let N=[],A=!1;for(let H of f??[])if(!go.has(H.name.toLowerCase()))if(H.name.toLowerCase()==="set-cookie"&&mr(k)){let W=H.value.split(`
|
|
168
|
+
`.trim(),qn=3e4,vt=De(process.cwd(),".kizenapp","venv"),Un=["awslambdaric","bcrypt","fpdf2","lxml","msgpack","numpy","paramiko","pyjwt","pypdf","pytz","requests","tzdata"],Ke=null;function Vn(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
|
+
`);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
|
+
`)}}),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
172
|
`).map(ee=>/SameSite=/i.test(ee)?ee.replace(/SameSite=\w+/i,"SameSite=None"):ee+"; SameSite=None; Secure").join(`
|
|
173
|
-
`);N.push({name:H.name,value:W}),A=!0}else N.push(H);A&&h(` rewrote Set-Cookie SameSite on ${k}`);try{let{body:H,base64Encoded:W}=await p.Fetch.getResponseBody({requestId:l});await p.Fetch.fulfillRequest({requestId:l,responseCode:F??200,responseHeaders:N,body:H,...W&&{base64Encoded:!0}})}catch(H){h(` fulfillRequest failed (${H.message}), falling through`);try{await p.Fetch.continueRequest({requestId:l})}catch(W){h(` continueRequest also failed (${W.message})`)}}})()}),s=setInterval(()=>{(async()=>{try{let{cookies:a}=await p.Network.getAllCookies(),i=0;for(let l of a){if(!mr(`https://${l.domain??""}`)||l.sameSite==="None")continue;let d=l.domain??"",f=d.startsWith(".")?d.slice(1):d;await p.Network.setCookie({url:`https://${f}`,name:l.name,value:l.value,domain:d,path:l.path??"/",secure:!0,...l.httpOnly!==void 0&&{httpOnly:l.httpOnly},...l.expirationDate!==void 0&&{expires:l.expirationDate},sameSite:"None"}),i++}i>0&&h(`cookie-patch cycle: updated ${String(i)} cookie(s) to SameSite=None`)}catch(a){h(`cookie-patch cycle failed: ${a.message}`)}})()},2e3),await p.send("Runtime.enable",{generatePreview:!0}),p.on("Target.attachedToTarget",a=>{let i=a,{sessionId:l,targetInfo:d}=i;h(`attached session ${l} (${d.type} ${d.url})`),p.send("Runtime.enable",{generatePreview:!0},l).catch(f=>{h(` Runtime.enable on session ${l} failed: ${f.message}`)})}),await p.Target.setAutoAttach({autoAttach:!0,waitForDebuggerOnStart:!1,flatten:!0}),await p.Target.setDiscoverTargets({discover:!0});let P=a=>{if(a.type==="page"){if(c(a.url)){x(`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,x(`captured main target ${a.targetId} (${a.url})`))}};p.on("Target.targetCreated",a=>{let{targetInfo:i}=a;h(`target +${i.type} ${i.targetId} ${i.url}`),P(i)}),p.on("Target.targetInfoChanged",a=>{let{targetInfo:i}=a;h(`target ~${i.type} ${i.targetId} ${i.url}`),P(i)}),p.on("Runtime.consoleAPICalled",a=>{(async()=>{let{type:i,args:l}=a;if(l[0]?.type==="string"&&String(l[0].value).includes("Chrome Security"))return;let d=i==="warning"?"warn":["log","warn","error","info"].includes(i)?i:"log";h(`console.${d} (${String(l.length)} arg(s))`);let f=await Promise.all(l.map(F=>ho(p,F)));e.broadcast({type:"console-message",level:d,args:f})})().catch(i=>{h(`console serialization failed: ${i.message}`)})}),p.on("disconnect",()=>{b||n!==p||(x("CDP disconnected"),n=null,y(),E())})},E=()=>{if(b||u!==null)return;let p=Math.min(1e3*2**C,1e4),P=C+1;C++,x(`CDP reconnect scheduled in ${String(p)}ms (attempt #${String(P)})`),u=setTimeout(()=>{u=null,(async()=>{let a;try{a=await fr({port:r})}catch{x(`CDP reconnect attempt #${String(P)} failed`),E();return}if(b){try{await a.close()}catch{}return}n=a;try{await v(a),x(`CDP reconnected after ${String(P)} attempt(s)`),C=0}catch{n===a&&(n=null);try{await a.close()}catch{}x(`CDP reconnect attempt #${String(P)} failed during setup`),E()}})()},p)},R=30,S=300;for(let p=0;p<R;p++){await new Promise(P=>setTimeout(P,S)),x(`CDP connect attempt ${String(p+1)}/${String(R)}`);try{let P=await fr({port:r});n=P,e.path&&P.send("Page.navigate",{url:`${t}${e.path}`});try{await v(P),x("CDP connected")}catch{n===P&&(n=null);try{await P.close()}catch{}x("CDP setup failed after connect")}break}catch{if(p===R-1){let P=`CDP unavailable after ${String(R)} attempts \u2014 viewer running without interception (CSP/cookie rewrites disabled)`;return x(P),e.onWarn?.(P),{kill:()=>{o.kill()}}}}}return n?{kill:()=>{if(x("CDP kill requested \u2014 tearing down"),b=!0,u!==null&&(clearTimeout(u),u=null),y(),n!==null){try{n.close()}catch{}n=null}o.kill()}}:{kill:()=>{o.kill()}}}import{useCallback as bo,useState as vo}from"react";function Ze(e){let[t,o]=vo([]),r=bo(n=>{o(s=>[...s,`${new Date().toLocaleTimeString()}: ${n}`].slice(-e))},[e]);return[t,r]}import{useCallback as Qe,useEffect as _t,useState as et}from"react";import{Box as z,Text as B,useInput as wo}from"ink";import{jsx as T,jsxs as U}from"react/jsx-runtime";var oe=["apiKey","userId","businessId"],Co={apiKey:"API Key",userId:"User ID",businessId:"Business ID"},je=({text:e})=>T(B,{dimColor:!0,children:e}),tt=({initialMode:e,showProfileManager:t,onComplete:o,onCancel:r})=>{let[n,s]=et(e==="global"&&!t?{type:"loading"}:e==="global"&&t?{type:"profile-loading"}:{type:"mode-select",cursor:0}),[g,u]=et(""),[C,b]=et(null),[x,h]=et(void 0),y=Qe(a=>{if(a==="local"){o({mode:"local",credentials:null});return}s({type:"profile-loading"})},[o]),c=Qe(async a=>{if(a===null){s({type:"profile-loading"});let d=await Ie();s({type:"name-entry",nameBuffer:"",existingProfiles:d});return}h(a.isDefault?void 0:a.name),s({type:"loading"});let i=a.isDefault?await Y():await we(a.name),l=i?Math.max(0,K.indexOf(i.environment)):0;s({type:"creds-entry",field:0,values:i??{},envCursor:l})},[]),v=Qe(async(a,i)=>{let l=K[i]??"go",d={apiKey:a.apiKey??"",userId:a.userId??"",businessId:a.businessId??"",environment:l};s({type:"saving"});try{await Xt(x??ne,d),o({mode:"global",credentials:d,...x!==void 0&&{profileName:x}})}catch(f){b(f instanceof Error?f.message:String(f)),s({type:"creds-entry",field:0,values:a,envCursor:i})}},[o,x]);wo((a,i)=>{if(i.ctrl&&a==="c"&&process.exit(0),i.escape){if((n.type==="creds-entry"||n.type==="name-entry")&&e==="global"&&t){s({type:"profile-loading"}),E();return}r?.();return}if(n.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 l=n.cursor===0?"global":"local";y(l)}return}if(n.type==="profile-select"){let{profiles:l,cursor:d}=n,f=l.length,F=l.length+1;if(i.upArrow)s({...n,cursor:(d-1+F)%F});else if(i.downArrow)s({...n,cursor:(d+1)%F});else if(i.return)if(d===f)s({type:"name-entry",nameBuffer:"",existingProfiles:l});else{let k=l[d]??l[0];k&&c(k)}return}if(n.type==="name-entry"){let{nameBuffer:l,existingProfiles:d}=n;if(i.backspace||i.delete)s({type:"name-entry",nameBuffer:l.slice(0,-1),existingProfiles:d});else if(i.return){let f=l.trim();if(!f){s({...n,nameError:"Name cannot be empty"});return}if(f===ne){s({...n,nameError:`"${ne}" is reserved`});return}if(d.some(F=>F.name===f)){s({...n,nameError:`Profile "${f}" already exists`});return}h(f),s({type:"creds-entry",field:0,values:{},envCursor:0}),u("")}else a&&!i.ctrl&&!i.meta&&s({type:"name-entry",nameBuffer:l+a,existingProfiles:d});return}if(n.type==="creds-entry"){let{field:l,values:d,envCursor:f}=n;if(l===oe.length){i.leftArrow?s({...n,envCursor:(f-1+K.length)%K.length}):i.rightArrow?s({...n,envCursor:(f+1)%K.length}):i.upArrow?(s({...n,field:l-1}),u(d[oe[l-1]]??"")):i.return&&v(d,f);return}let k=oe[l];if(!k)return;if(i.backspace||i.delete)u(N=>N.slice(0,-1));else if(i.upArrow&&l>0){let N={...d,[k]:g},A=l-1;s({...n,field:A,values:N}),u(N[oe[A]]??"")}else if(i.return||i.tab||i.downArrow){let N={...d,[k]:g},A=l+1;s({...n,field:A,values:N}),A<oe.length?u(N[oe[A]]??""):u("")}else a&&!i.ctrl&&!i.meta&&u(N=>N+a)}});let E=Qe(async()=>{let a=await Ie();s({type:"profile-select",profiles:a,cursor:0})},[]);if(_t(()=>{n.type==="profile-loading"&&E()},[n.type,E]),_t(()=>{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})})()},[]),_t(()=>{n.type==="creds-entry"&&n.field===0&&u(n.values.apiKey??"")},[n.type]),n.type==="loading"||n.type==="saving"||n.type==="profile-loading"){let a=n.type==="saving"?"Saving credentials\u2026":n.type==="profile-loading"?"Loading profiles\u2026":"Loading credentials\u2026";return T(z,{paddingY:1,paddingX:2,children:T(B,{dimColor:!0,children:a})})}if(n.type==="done")return null;if(n.type==="mode-select")return U(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),U(z,{flexDirection:"column",gap:0,children:[T(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,l)=>{let d=n.cursor===l;return U(z,{gap:2,children:[T(B,{...d&&{color:"cyan"},children:d?"\u276F":" "}),T(B,{bold:d,...d&&{color:"cyan"},children:i.label}),T(B,{dimColor:!0,children:i.desc})]},i.mode)})]}),T(je,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Ctrl+C to quit"})]});if(n.type==="profile-select"){let{profiles:a,cursor:i}=n,l=a.length;return U(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),U(z,{flexDirection:"column",gap:0,children:[T(B,{bold:!0,children:"Credential profiles"}),a.map((d,f)=>{let F=i===f;return U(z,{gap:2,children:[T(B,{...F&&{color:"cyan"},children:F?"\u276F":" "}),T(B,{bold:F,...F&&{color:"cyan"},children:d.isDefault?"Default":d.name}),T(B,{dimColor:!0,children:d.path})]},d.name)}),U(z,{gap:2,children:[T(B,{...i===l&&{color:"cyan"},children:i===l?"\u276F":" "}),T(B,{bold:i===l,...i===l&&{color:"cyan"},children:"+ Add new profile"})]})]}),T(je,{text:"\u2191\u2193 to move \xB7 Enter to select \xB7 Esc to cancel"})]})}if(n.type==="name-entry"){let{nameBuffer:a,nameError:i}=n;return U(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),T(z,{flexDirection:"column",gap:0,children:T(B,{bold:!0,children:"New credential profile"})}),i&&U(B,{color:"red",children:["Error: ",i]}),U(z,{gap:2,children:[T(z,{width:12,children:T(B,{bold:!0,color:"cyan",children:"Profile name"})}),T(B,{color:"cyan",children:">"}),T(B,{children:a}),T(B,{color:"cyan",children:"\u2588"})]}),T(je,{text:"Type a name \xB7 Enter to confirm \xB7 Esc to go back"})]})}let{field:R,values:S,envCursor:m}=n,p=R===oe.length,P=x??ne;return U(z,{flexDirection:"column",paddingY:1,paddingX:2,gap:1,children:[T(V,{}),U(z,{flexDirection:"column",gap:0,children:[T(B,{bold:!0,children:x!==void 0?`Profile: ${x}`:"Global credentials"}),U(B,{dimColor:!0,children:["Saved to:"," ",x!==void 0?`~/.kizenappbuilder/${x}.json`:ve]})]}),C&&U(B,{color:"red",children:["Error: ",C]}),U(z,{flexDirection:"column",gap:0,children:[oe.map((a,i)=>{let l=R===i,d=l?g:S[a]??"";return U(z,{gap:2,children:[T(z,{width:12,children:T(B,{bold:l,...l&&{color:"cyan"},children:Co[a]})}),T(B,{...l&&{color:"cyan"},children:">"}),T(B,{children:d}),l&&T(B,{color:"cyan",children:"\u2588"})]},a)}),U(z,{gap:2,children:[T(z,{width:12,children:T(B,{bold:p,...p&&{color:"cyan"},children:"Environment"})}),T(B,{...p&&{color:"cyan"},children:">"}),T(z,{gap:1,children:K.map((a,i)=>{let l=i===m;return p?T(B,{bold:l,...l&&{color:"cyan"},children:l?`[${a}]`:a},a):T(B,{dimColor:!l,bold:l,children:a},a)})})]})]}),p?T(je,{text:"\u2190\u2192 to select \xB7 \u2191\u2193 to move \xB7 Enter to save \xB7 Esc to cancel"}):T(je,{text:"\u2191\u2193 to move \xB7 Backspace to delete \xB7 Esc to cancel"}),U(B,{dimColor:!0,children:["Profile: ",P]})]})};import{jsx as j,jsxs as O}from"react/jsx-runtime";var ko=[".kizenapp",".git"],xr=({port:e,pluginDir:t,outputDir:o,credentials:r,credentialMode:n,activeCredentialProfile:s,lastPath:g,debug:u=!1,verbose:C=!1,autoViewer:b=!0})=>{let x=Q(r),h=Q(s),y=Q(g),[c,v]=J("main"),[E,R]=J(n),[S,m]=J("starting"),[p,P]=J(null),[a,i]=Ze(50),[l,d]=Ze(50),[f,F]=Ze(50),[k,N]=J([]),[A,H]=J("pending"),[W,ee]=J(null),[ge,Pe]=J(null),[se,ot]=J(null),[it,st]=J(0),[kt,Rr]=J(0),[Nr,jr]=J(0),[Fr,$r]=J(0),at=Q(!1),It=Q(!1),$e=Q(null),Te=Q(null),te=Q(new Set),Le=Q([]),G=Ce(w=>{let $=JSON.stringify(w);if(te.current.size===0){Le.current=[...Le.current,$].slice(-50);return}let re=!1;for(let X of te.current)if(X.readyState===1)try{X.send($)}catch{te.current.delete(X),re=!0}re&&st(te.current.size)},[]),Ae=i,lt=Ce(()=>{$e.current?.kill(),$e.current=null,yr({port:e,userDataDir:hr(o,".chrome"),broadcast:G,onWarn:w=>{i(`\u26A0 ${w}`)},...y.current!==void 0&&{path:y.current},...u&&{debugLog:F},...C&&{verbose:!0}}).then(w=>{$e.current=w})},[e,o,G,u,C,F,i]);rt(()=>{let w=()=>{$e.current?.kill()};return process.on("exit",w),()=>{process.off("exit",w)}},[]),Po((w,$)=>{(w==="q"||$.ctrl&&w==="c")&&process.exit(0),w==="c"&&v("editing"),w==="v"&<()},{isActive:c==="main"}),rt(()=>{S!=="running"||It.current||!b||(It.current=!0,lt())},[S,b,lt]);let Lr=Ce(w=>{x.current=w.credentials,h.current=w.profileName,v("main"),R(w.mode);let $=w.profileName;me(o,{credentialMode:w.mode,...$!==void 0&&{activeCredentialProfile:$}}),G({type:"credentials-updated",credentials:w.credentials})},[o,G]),Bt=Ce(w=>{N($=>[...$,`${new Date().toLocaleTimeString()}: ${St(w)}`].slice(-50)),w.kind==="request"&&(w.fromCache?jr($=>$+1):$r($=>$+1)),G({type:"proxy-log",entry:w})},[G]),ae=Ce(w=>{d(w),G({type:"log",message:w})},[d,G]),ct=Ce(()=>{at.current||(at.current=!0,H("building"),ee(null),ae("Build started"),He(t,o).then(({bundleSize:w})=>{ae(`Build finished \u2014 bundle: ${_e(w)}`),H("done"),Pe(new Date),ot(w),ae("Notifying viewers to reload"),G({type:"rebuild"})}).catch(w=>{let $=w instanceof Error?w.message:String(w);ee($),H("error")}).finally(()=>{at.current=!1}))},[t,o,ae,G]);if(rt(()=>{ct();let w=To(t,{recursive:!0},($,re)=>{if(!re)return;let X=re.replace(/\\/g,"/");ko.some(Oe=>X.startsWith(Oe))||(ae(`File change detected: ${re}`),Te.current!==null&&clearTimeout(Te.current),Te.current=setTimeout(ct,150))});return w.on("error",$=>{ae(`File watcher error \u2014 rebuilds have stopped: ${$.message}`)}),()=>{w.close(),Te.current!==null&&clearTimeout(Te.current)}},[t,ct,ae]),rt(()=>{let w=ur();Tt(hr(w,"index.html")).then($=>{if(!$){P("Viewer not built. Run 'pnpm build:viewer' first."),m("error");return}let re=pr(w,Ae,Bt,x,h,o,G,Rr,y,t),X=_o(re),Oe=new Eo({server:X});return Oe.on("connection",le=>{for(let Or of Le.current)le.readyState===1&&le.send(Or);Le.current=[],Ae("Viewer connected for live reload"),te.current.add(le),st(te.current.size),le.on("close",()=>{te.current.delete(le),st(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=>{P(le.message),m("error")}),()=>{Oe.close(),X.close()}})},[e,Ae,Bt,G,o,t]),c==="editing")return j(tt,{...E!==void 0&&{initialMode:E},showProfileManager:E==="global",onComplete:Lr,onCancel:()=>{v("main")}});let dt=ge!==null?Math.round((Date.now()-ge.getTime())/1e3):null,Ar=dt===null?"":dt<5?" (just now)":` (${String(dt)}s ago)`;return O(q,{flexDirection:"column",paddingY:1,paddingX:2,children:[j(V,{marginBottom:1}),O(q,{flexDirection:"column",children:[O(q,{gap:2,marginBottom:0,children:[j(D,{bold:!0,dimColor:!0,children:"App Build"}),A==="pending"&&j(D,{dimColor:!0,children:"waiting\u2026"}),A==="building"&&O(q,{gap:1,children:[j(Ue,{}),j(D,{children:"Building plugin package\u2026"})]}),A==="done"&&O(q,{gap:1,children:[j(D,{color:"green",children:"\u2713 Built"}),ge!==null&&O(D,{dimColor:!0,children:["at ",ge.toLocaleTimeString(),Ar]}),se!==null&&O(D,{dimColor:!0,children:["\xB7 bundle: ",_e(se)]})]}),A==="error"&&O(D,{color:"red",children:["\u2717 ",W??"unknown error"]})]}),j(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:l.slice(-8).map((w,$)=>j(D,{dimColor:!0,wrap:"truncate",children:w},$))})]}),O(q,{marginTop:1,flexDirection:"column",children:[O(q,{gap:2,children:[j(D,{bold:!0,dimColor:!0,children:"Web Server"}),S==="starting"&&j(D,{dimColor:!0,children:"starting\u2026"}),S==="running"&&O(q,{gap:2,children:[j(D,{color:"green",children:"\u2713 Running"}),O(D,{dimColor:!0,children:["\u25CF ",it," viewer",it!==1?"s":""]})]}),S==="error"&&O(D,{color:"red",children:["\u2717 ",p??"Server error"]})]}),j(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:a.slice(-8).map((w,$)=>j(D,{dimColor:!0,wrap:"truncate",children:w},$))})]}),O(q,{marginTop:1,flexDirection:"column",children:[O(q,{gap:2,children:[j(D,{bold:!0,dimColor:!0,children:"Network Proxy"}),j(D,{color:"green",children:"\u2713 Active"}),O(D,{dimColor:!0,children:["\u25CF ",kt," key",kt!==1?"s":""," in the network cache \xB7"," ",Nr," hit \xB7 ",Fr," miss"]})]}),j(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:k.length===0?j(D,{dimColor:!0,children:" No requests yet."}):k.slice(-8).map((w,$)=>j(D,{dimColor:!0,wrap:"truncate",children:w},$))})]}),u&&O(q,{marginTop:1,flexDirection:"column",children:[O(q,{gap:2,children:[j(D,{bold:!0,dimColor:!0,children:"CDP Debug"}),O(D,{dimColor:!0,children:["\u25CF ",f.length," event(s)"]})]}),j(q,{flexDirection:"column",height:10,borderStyle:"single",borderColor:"gray",overflow:"hidden",children:f.length===0?j(D,{dimColor:!0,children:" No CDP events yet."}):f.slice(-8).map((w,$)=>j(D,{dimColor:!0,wrap:"truncate",children:w},$))})]}),O(q,{marginTop:1,gap:1,children:[j(D,{dimColor:!0,children:"["}),j(D,{children:"q"}),j(D,{dimColor:!0,children:"] quit ["}),j(D,{children:"c"}),j(D,{dimColor:!0,children:"] credentials ["}),j(D,{children:"v"}),O(D,{dimColor:!0,children:["] ",it===0?"open viewer":"relaunch viewer"]})]})]})};async function br(e){return new Promise(t=>{let o=null,r=s=>{o?.(),t(s)},{unmount:n}=wr(vr(tt,{...e!==void 0&&{initialMode:e},onComplete:r}),{exitOnCtrlC:!1});o=n})}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),r=process.cwd(),n=`${r}/.kizenapp`;xe(r);let s=null,g,u,{lastPath:C}=await De(n);if(t.credentials)s=await Ge(t.credentials);else{let c=await De(n);if(c.credentialMode==="local")g="local";else if(c.credentialMode==="global"){if(g="global",u=c.activeCredentialProfile,u?(s=await we(u),s||(s=await Y(),u=void 0)):s=await Y(),!s){let v=await br("global");s=v.credentials,u=v.profileName}}else{let v=await br();s=v.credentials,g=v.mode,u=v.profileName;let E=v.profileName;await me(n,{credentialMode:v.mode,...E!==void 0&&{activeCredentialProfile:E}})}}let b=t.verbose===!0,x=b||t.debug===!0,h=t.viewer!==!1,{waitUntilExit:y}=wr(vr(xr,{port:o,pluginDir:r,outputDir:n,credentials:s,...g!==void 0&&{credentialMode:g},...u!==void 0&&{activeCredentialProfile:u},...C!==void 0&&{lastPath:C},debug:x,verbose:b,autoViewer:h}),{exitOnCtrlC:!1});await y()})}import{mkdir as Io,writeFile as Sr,readFile as Bo}from"fs/promises";import{join as nt}from"path";var Do=new Set(["developer_business_id"]);function Ro(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 r=Object.fromEntries(Object.keys(o.auth_credentials).map(n=>[n,"*****"]));return{...o,auth_credentials:r}}):e}var No={".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 r=o.path.split("/"),n=t;r.forEach((s,g)=>{n.children.has(s)||n.children.set(s,{name:s,children:new Map,isFile:g===r.length-1,filePath:r.slice(0,g+1).join("/")});let u=n.children.get(s);u&&(n=u)})}return t}function Et(e){return"file-"+e.replace(/[^a-zA-Z0-9]/g,"-")}function Z(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function _r(e){return`<ul>${[...e.children.values()].sort((r,n)=>r.isFile!==n.isFile?r.isFile?1:-1:r.name.localeCompare(n.name)).map(r=>r.isFile?`<li class="tf"><a href="#${Et(r.filePath)}" data-id="${Et(r.filePath)}">${Z(r.name)}</a></li>`:`<li class="td"><span class="dn">${Z(r.name)}/</span>${_r(r)}</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:${No[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="${Et(e.path)}"><h2 class="fp">${Z(e.path)}</h2><div class="fb">${t}</div></section>`}var Fo={".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 $o(e){return Fo[Er(e)]??""}function kr(e,t=""){let o=[...e.children.values()].sort((r,n)=>r.isFile!==n.isFile?r.isFile?1:-1:r.name.localeCompare(n.name));return o.map((r,n)=>{let s=n===o.length-1,g=s?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",u=s?" ":"\u2502 ";return r.isFile?`${t}${g}${r.name}`:`${t}${g}${r.name}/
|
|
174
|
-
${
|
|
175
|
-
`)}function
|
|
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
|
+
${Ir(n,t+d)}`}).join(`
|
|
175
|
+
`)}function Br(e){return e.filter(t=>t.path!=="kizen.json"&&t.path!=="plugin-report.html")}function Nr(e){return Object.fromEntries(Object.entries(e).filter(([t])=>!Ro.has(t)).map(([t,o])=>[t,t==="services"?Lo(o):o]))}function Oo(e,t){let o=Nr(e),n=typeof e.name=="string"?e.name:"Plugin",r=typeof e.version=="string"?e.version:"",s=typeof e.description=="string"?e.description:"",g=Br(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","","```",Ir(Tr(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(`\`\`\`${Ao(C.path)}`,C.content,"```");return d.join(`
|
|
176
176
|
`)+`
|
|
177
|
-
`}function
|
|
177
|
+
`}function zo(e,t){let o=Nr(e),n=typeof e.name=="string"?e.name:"Plugin",r=typeof e.version=="string"?e.version:"",s=typeof e.description=="string"?e.description:"",g=Br(t),d=Pr(Tr(g)),C=g.map(jo).join(`
|
|
178
178
|
`);return`<!DOCTYPE html>
|
|
179
179
|
<html lang="en">
|
|
180
180
|
<head>
|
|
181
181
|
<meta charset="UTF-8">
|
|
182
182
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
183
|
-
<title>${Z(
|
|
183
|
+
<title>${Z(n)} \u2014 Plugin Report</title>
|
|
184
184
|
<style>
|
|
185
185
|
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
|
186
186
|
:root{
|
|
@@ -217,13 +217,13 @@ img{border:1px solid var(--bd);border-radius:4px}
|
|
|
217
217
|
</head>
|
|
218
218
|
<body>
|
|
219
219
|
<header>
|
|
220
|
-
<h1>${Z(
|
|
220
|
+
<h1>${Z(n)}${r?` <span style="color:var(--mu);font-size:.8em">v${Z(r)}</span>`:""}</h1>
|
|
221
221
|
${s?`<p>${Z(s)}</p>`:""}
|
|
222
222
|
</header>
|
|
223
223
|
<div class="layout">
|
|
224
224
|
<nav>
|
|
225
225
|
<a href="#config" class="cfg" data-id="config">kizen.json (config)</a>
|
|
226
|
-
${
|
|
226
|
+
${d}
|
|
227
227
|
</nav>
|
|
228
228
|
<main>
|
|
229
229
|
<section id="config"><h2 class="fp">kizen.json \u2014 Plugin Configuration</h2><div class="fb"><pre><code>${Z(JSON.stringify(o,null,2))}</code></pre></div></section>
|
|
@@ -240,7 +240,7 @@ ${C}
|
|
|
240
240
|
})();
|
|
241
241
|
</script>
|
|
242
242
|
</body>
|
|
243
|
-
</html>`}var
|
|
243
|
+
</html>`}var kr=rt(fe,"examples");function Dr(e){e.command("report").description("Generate a self-contained HTML report of the plugin").option("-o, --output <path>",`output file path (default: ${kr}/<api_name>.html)`).action(async t=>{let o=process.cwd(),n;try{let C=await Do(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(kr,`${r}.html`),g=s.replace(/\.html$/,".md"),d=await Me(o);await No(rt(s,".."),{recursive:!0}),await Promise.all([_r(s,zo(n,d),"utf-8"),_r(g,Oo(n,d),"utf-8")]),console.log(`Plugin report written to:
|
|
244
244
|
${s}
|
|
245
|
-
${g}`)})}var
|
|
245
|
+
${g}`)})}var Vo=qo(Ho(Uo(import.meta.url)),"..","package.json"),Jo=JSON.parse(Mo(Vo,"utf-8"));ge.name("appbuilder").description("Kizen plugin app builder").version(Jo.version);Xt(ge);Ot(ge);wr(ge);Dr(ge);Sr(ge);ge.parse();
|
|
246
246
|
//# sourceMappingURL=index.js.map
|