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