@heygaia/cli 0.1.13 → 0.1.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +26 -24
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,35 +1,37 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as Lo}from"commander";import{render as To}from"ink";import bo from"react";import{Box as Le,Text as ue}from"ink";import Qr from"react";import{ProgressBar as Ct,Select as Qe,Spinner as Xe}from"@inkjs/ui";import{Box as f,Text as u,useInput as ie}from"ink";import Ee from"ink-text-input";import{useEffect as Pe,useRef as Br,useState as H}from"react";import{Box as Ie,Text as Be}from"ink";var b="#00bbff";import{Box as br,Text as Ir}from"ink";import{jsx as Tt}from"react/jsx-runtime";var bt=({status:e,step:t})=>t.toLowerCase()==="welcome"?null:Tt(br,{width:"100%",paddingX:1,marginTop:1,children:Tt(Ir,{color:"gray",dimColor:!0,children:e})});import{Box as Cr}from"ink";import Er from"ink-big-text";import Pr from"ink-gradient";import{jsx as Ue}from"react/jsx-runtime";var me=()=>Ue(Cr,{flexDirection:"column",marginTop:1,marginBottom:1,children:Ue(Pr,{colors:[b,"#b0eaff",b],children:Ue(Er,{text:"GAIA",font:"3d"})})});import{jsx as ce,jsxs as Ce}from"react/jsx-runtime";var wr=["Welcome","Prerequisites","Setup Mode","Repository Setup","Environment Setup","Install Tools","Project Setup","Installing CLI","Finished"],It=["Detect Repo","Prerequisites","Environment Setup","Project Setup","Finished"],Rr={Welcome:"Welcome",Prerequisites:"Prereqs","Setup Mode":"Mode","Repository Setup":"Repo","Environment Setup":"Env","Install Tools":"Tools","Project Setup":"Setup","Installing CLI":"CLI","Detect Repo":"Detect",Finished:"Done"},Dr=({currentStep:e,steps:t})=>{let o=t.indexOf(e);return ce(Ie,{marginBottom:1,flexWrap:"nowrap",children:t.map((r,n)=>{let s=n<o,l=n===o,a=Rr[r]??r;return Ce(Ie,{flexShrink:0,children:[n>0&&Ce(Be,{color:"gray",dimColor:!0,children:[" ","\xB7"," "]}),s&&Ce(Be,{color:"green",children:["\u2713 ",a]}),l&&ce(Be,{color:b,bold:!0,children:a}),!s&&!l&&ce(Be,{color:"gray",dimColor:!0,children:a})]},r)})})},_e=({children:e,status:t,step:o,steps:r=wr})=>Ce(Ie,{flexDirection:"column",height:"100%",width:"100%",children:[Ce(Ie,{flexGrow:1,flexDirection:"column",children:[ce(me,{}),ce(Dr,{currentStep:o,steps:r}),ce(Ie,{flexDirection:"column",flexGrow:1,children:e})]}),ce(bt,{status:t,step:o})]});import{Spinner as kr}from"@inkjs/ui";import{Box as oe,Text as U,useInput as Ar}from"ink";import{jsx as j,jsxs as le}from"react/jsx-runtime";var ne=({label:e,status:t})=>le(oe,{children:[j(oe,{marginRight:1,children:t==="pending"?j(kr,{type:"dots"}):t==="success"?j(U,{color:"green",children:"\u2714"}):t==="error"?j(U,{color:"red",children:"\u2716"}):j(U,{color:"yellow",children:"\u26A0"})}),j(U,{children:e})]}),Oe=({portResults:e,onAccept:t,onAbort:o})=>{Ar((n,s)=>{s.return?t():s.escape&&o()});let r=e.filter(n=>!n.available);return le(oe,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:"yellow",children:[j(oe,{marginBottom:1,children:j(U,{bold:!0,color:"yellow",children:"Port Conflicts Detected"})}),e.map(n=>le(oe,{children:[le(U,{color:n.available?"green":n.alternative?"yellow":"red",children:[n.available?"\u2714":n.alternative?"\u26A0":"\u2716"," "]}),le(U,{children:[n.service," (:",n.port,")"]}),!n.available&&le(U,{color:n.alternative?"gray":"red",children:[" ","- in use",n.usedBy?` by ${n.usedBy}`:"",n.alternative?` \u2192 will use :${n.alternative}`:" \u2014 NO ALTERNATIVE FOUND"]})]},n.port)),r.some(n=>!n.alternative)&&j(oe,{marginTop:1,children:j(U,{color:"red",children:"Some ports have no available alternative. Free them and retry."})}),!r.some(n=>!n.alternative)&&r.some(n=>n.alternative)&&j(oe,{marginTop:1,children:j(U,{color:"gray",children:"Alternative ports will be used for conflicting services."})}),j(oe,{marginTop:1,children:le(U,{dimColor:!0,children:[j(U,{bold:!0,children:"Enter"})," continue \xB7 ",j(U,{bold:!0,children:"ESC"})," abort"]})})]})};import{Fragment as pn,jsx as i,jsxs as g}from"react/jsx-runtime";var _r=({onConfirm:e})=>(ie((t,o)=>{o.return&&e()}),g(f,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:b,children:[i(u,{bold:!0,children:"Welcome to GAIA Setup"}),g(f,{flexDirection:"column",marginTop:1,marginBottom:1,children:[i(u,{children:"This wizard will guide you through the setup process:"}),i(u,{children:" 1. Check prerequisites and choose setup mode"}),i(u,{children:" 2. Clone repository"}),i(u,{children:" 3. Configure environment variables"}),i(u,{children:" 4. Install tools and dependencies"})]}),i(u,{dimColor:!0,children:"~5-15 min depending on network speed"}),i(f,{marginTop:1,children:g(u,{color:b,children:[i(u,{bold:!0,children:"Enter"})," to start"]})})]})),Or=({defaultValue:e,onSubmit:t})=>{let[o,r]=H(e);return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(u,{children:"Clone repository to:"}),i(u,{color:"gray",dimColor:!0,children:"Press Enter for default, or type a custom path"}),g(f,{marginTop:1,children:[i(u,{color:b,children:"\u2192 "}),i(Ee,{value:o,onChange:r,onSubmit:t})]})]})},Lr=({repoPath:e,onAction:t})=>g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:"yellow",children:[i(f,{marginBottom:1,children:i(u,{bold:!0,color:"yellow",children:"Existing Installation Found"})}),g(u,{children:["Found a GAIA installation at"," ",i(u,{color:"cyan",bold:!0,children:e})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"What would you like to do?"})}),i(f,{marginTop:1,children:i(Qe,{options:[{label:"Use existing installation",value:"use_existing"},{label:"Delete and re-clone",value:"delete_reclone"},{label:"Choose a different path",value:"different_path"},{label:"Exit setup",value:"exit"}],onChange:r=>t(r)})})]}),Mr=({setupMode:e,portOverrides:t,onConfirm:o})=>{ie((s,l)=>{l.return&&o()});let r=t?.[3e3]??3e3,n=t?.[8e3]??8e3;return e==="selfhost"?g(f,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:"green",padding:1,children:[i(u,{bold:!0,color:"green",children:"GAIA is Running!"}),i(f,{marginTop:1,children:i(u,{color:"green",children:"\u2713 All services started"})}),g(f,{marginTop:1,flexDirection:"column",children:[g(u,{children:["Web:"," ",g(u,{color:"cyan",bold:!0,children:["http://localhost:",r]})]}),g(u,{children:["API:"," ",g(u,{color:"cyan",bold:!0,children:["http://localhost:",n]})]})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"gaia stop \xB7 gaia status \xB7 gaia setup"})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," to exit"]})})]}):g(f,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:b,padding:1,children:[i(u,{color:b,bold:!0,children:"You're all set!"}),g(f,{marginTop:1,children:[i(u,{bold:!0,children:"Run: "}),i(u,{color:"cyan",children:"$ gaia start"})]}),g(f,{marginTop:1,flexDirection:"column",children:[g(u,{children:["Web:"," ",g(u,{color:"cyan",bold:!0,children:["http://localhost:",r]})]}),g(u,{children:["API:"," ",g(u,{color:"cyan",bold:!0,children:["http://localhost:",n]})]})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"gaia stop \xB7 gaia status \xB7 gaia setup"})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," to exit"]})})]})},Fr=8,Et=({logs:e,height:t=Fr})=>{let[o,r]=H(0),n=Br(e.length);Pe(()=>{e.length!==n.current&&(n.current=e.length,r(0))},[e.length]),ie((v,y)=>{y.upArrow?r(x=>Math.min(x+1,Math.max(0,e.length-t))):y.downArrow&&r(x=>Math.max(0,x-1))});let s=e.length,l=Math.max(0,s-t-o),a=Math.max(0,s-o),c=e.slice(l,a),p=l,S=o;return g(f,{flexDirection:"column",marginTop:1,marginLeft:1,children:[p>0&&g(u,{color:"gray",dimColor:!0,children:["\u2191 ",p," more line",p!==1?"s":""]}),i(f,{flexDirection:"column",height:t,overflow:"hidden",children:c.map((v,y)=>i(u,{color:"gray",wrap:"truncate",children:v},l+y))}),S>0?g(u,{color:"gray",dimColor:!0,children:["\u2193 ",S," more line",S!==1?"s":""]}):i(u,{color:"gray",dimColor:!0,children:"\u2191\u2193 scroll"})]})},Nr=({phase:e,progress:t,isComplete:o,logs:r,title:n})=>g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(f,{marginBottom:1,children:i(u,{bold:!0,color:b,children:n||"Installing Dependencies"})}),g(f,{flexDirection:"column",gap:1,children:[i(f,{children:o?g(u,{color:"green",children:["\u2713 ",e]}):i(Xe,{label:e||"Preparing..."})}),!o&&t>0&&i(f,{width:50,children:i(Ct,{value:t})}),!o&&r&&r.length>0&&i(Et,{logs:r}),!o&&i(f,{marginTop:1,children:i(u,{color:"gray",dimColor:!0,children:"This may take a few minutes..."})})]})]});var Ye=({onSelect:e})=>g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(u,{bold:!0,children:"Setup Mode"}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"How do you want to run GAIA?"})}),i(f,{marginTop:1,children:i(Qe,{options:[{label:"Self-Host \u2014 run everything in Docker",value:"selfhost"},{label:"Developer \u2014 local dev with hot reload",value:"developer"}],onChange:o=>e(o)})})]}),Ke=({onSelect:e})=>g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(u,{bold:!0,children:"Environment Variables Setup"}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"Choose how you want to configure environment variables:"})}),i(f,{marginTop:1,children:i(Qe,{options:[{label:"Manual Setup (Recommended)",value:"manual"},{label:"Infisical (Advanced)",value:"infisical"}],onChange:o=>e(o)})}),g(f,{marginTop:1,flexDirection:"column",children:[i(u,{color:"gray",dimColor:!0,children:"Manual Setup: Configure variables interactively (recommended for most users)"}),i(u,{color:"gray",dimColor:!0,children:"Infisical: All secrets managed in Infisical dashboard (requires pre-configuration)"})]})]}),Je=({onSubmit:e})=>{let[t,o]=H({INFISICAL_TOKEN:"",INFISICAL_PROJECT_ID:"",INFISICAL_MACHINE_IDENTITY_CLIENT_ID:"",INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET:""}),[r,n]=H(0),[s,l]=H(null),a=[{key:"INFISICAL_TOKEN",description:"Service token from project settings (st.xxx...)"},{key:"INFISICAL_PROJECT_ID",description:"Found in your Infisical project settings"},{key:"INFISICAL_MACHINE_IDENTITY_CLIENT_ID",description:"From Access Control \u2192 Machine Identities"},{key:"INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET",description:"Generated when creating the machine identity"}];ie((p,S)=>{if(S.tab||S.downArrow)n(v=>v<a.length-1?v+1:v);else if(S.upArrow)n(v=>v>0?v-1:v);else if(S.return){if(r<a.length-1){n(y=>y+1);return}let v=a.filter(y=>!t[y.key].trim());if(v.length>0){l(`Required: ${v.map(x=>x.key).join(", ")}`);let y=a.findIndex(x=>!t[x.key].trim());y>=0&&n(y);return}e(t)}});let c=a[r];return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(f,{marginBottom:1,children:i(u,{bold:!0,color:b,children:"Infisical Configuration"})}),i(f,{marginBottom:1,children:i(u,{color:"gray",children:"All secrets managed in your Infisical project. Only credentials stored locally."})}),g(f,{marginBottom:1,flexDirection:"column",children:[i(u,{color:"gray",children:"Configure your Infisical credentials."}),g(u,{color:"gray",dimColor:!0,children:["Visit"," ",i(u,{color:"cyan",underline:!0,children:"app.infisical.com"})," ","to get these values."]})]}),a.map((p,S)=>{let v=p.key.includes("SECRET")||p.key.includes("TOKEN");return g(f,{flexDirection:"column",marginBottom:1,children:[i(f,{children:g(u,{color:S===r?b:"white",children:[S===r?"\u25B8 ":" ",p.key,":"]})}),i(f,{marginLeft:2,children:i(u,{color:"gray",dimColor:!0,children:p.description})}),S===r?i(f,{marginLeft:2,children:i(Ee,{value:t[p.key],onChange:y=>{o(x=>({...x,[p.key]:y})),l(null)},placeholder:"Enter value...",mask:v?"*":void 0})}):i(f,{marginLeft:2,children:i(u,{color:t[p.key]?"green":"gray",children:t[p.key]?v?`\u2713 ${"*".repeat(8)}`:`\u2713 ${t[p.key]}`:"(not set)"})})]},p.key)}),s&&i(f,{marginTop:1,children:i(u,{color:"red",children:s})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," confirm \xB7 ",i(u,{bold:!0,children:"\u2191\u2193"})," navigate"]})})]})},ze=({category:e,currentIndex:t,totalGroups:o,onSubmit:r})=>{let[n,s]=H(()=>{let y={};for(let x of e.variables)y[x.name]=x.defaultValue||"";return y}),[l,a]=H(0),[c,p]=H(null);Pe(()=>{let y={};for(let x of e.variables)y[x.name]=x.defaultValue||"";s(y),a(0),p(null)},[e.name]),ie((y,x)=>{if(x.tab||x.downArrow)a(m=>m<e.variables.length-1?m+1:m);else if(x.upArrow)a(m=>m>0?m-1:m);else if(x.escape){let m=e.variables.filter(d=>d.required&&!n[d.name]?.trim());if(m.length>0){p(`Required fields cannot be skipped: ${m.map(d=>d.name).join(", ")}`);return}r(n)}});let S=()=>{if(l<e.variables.length-1)a(l+1);else{let y=e.variables.filter(x=>x.required&&!n[x.name]?.trim());if(y.length>0){p(`Required fields are missing: ${y.map(x=>x.name).join(", ")}`);return}p(null),r(n)}},v=e.variables.some(y=>y.required);return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:c?"red":b,children:[g(f,{justifyContent:"space-between",children:[g(u,{bold:!0,children:["Configure ",e.name]}),g(u,{color:"gray",children:["Group ",t+1," / ",o]})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:e.description})}),i(f,{marginTop:1,flexDirection:"column",children:e.variables.map((y,x)=>{let m=x===l,d=!!y.defaultValue;return g(f,{flexDirection:"column",marginBottom:1,children:[g(f,{children:[g(u,{color:m?b:"gray",bold:m,children:[m?"\u279C ":" ",y.name]}),y.required&&g(u,{color:"red",bold:!0,children:[" ","*"]}),d&&!m&&g(u,{color:"gray",dimColor:!0,children:[" ","(default: ",y.defaultValue,")"]})]}),m&&i(f,{marginLeft:2,children:i(Ee,{value:n[y.name]||"",onChange:h=>{s(T=>({...T,[y.name]:h})),c&&p(null)},onSubmit:S,placeholder:d?`Default: ${y.defaultValue}`:y.required?"Enter a value (required)":"Press Enter to skip"})})]},y.name)})}),c&&i(f,{marginTop:1,children:g(u,{color:"red",bold:!0,children:["\u26A0 ",c]})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," next \xB7 ",i(u,{bold:!0,children:"\u2191\u2193"})," navigate",!v&&g(u,{children:[" ","\xB7 ",i(u,{bold:!0,children:"ESC"})," skip"]})]})})]})},Ze=({alternatives:e,onSubmit:t})=>{let[o,r]=H(new Set),[n,s]=H({}),[l,a]=H(0),[c,p]=H(null);Pe(()=>{let h={};for(let T of e)for(let I of T.variables)h[I.name]=I.defaultValue||"";s(h)},[e]);let S=[];for(let h=0;h<e.length;h++)if(S.push({type:"provider",categoryIndex:h}),o.has(h)){let T=e[h];if(T)for(let I=0;I<T.variables.length;I++)S.push({type:"field",categoryIndex:h,fieldIndex:I})}S.push({type:"submit"});let v=S[l],y=v?.type==="field",x=v?.type==="submit";ie((h,T)=>{let I=Math.min(l,S.length-1);if(I!==l){a(I);return}if(y)T.upArrow?a(C=>Math.max(0,C-1)):(T.downArrow||T.tab)&&a(C=>Math.min(S.length-1,C+1));else if(x)T.upArrow?a(C=>Math.max(0,C-1)):(T.return||h===" ")&&d();else if(T.upArrow)a(C=>Math.max(0,C-1));else if(T.downArrow||T.tab)a(C=>Math.min(S.length-1,C+1));else if((T.return||h===" ")&&v?.type==="provider"){let C=v.categoryIndex;r(k=>{let R=new Set(k);return R.has(C)?R.delete(C):R.add(C),R}),c&&p(null)}});let m=()=>{c&&p(null),a(h=>Math.min(S.length-1,h+1))},d=()=>{let h=[],T={};for(let I of o){let C=e[I];if(!C)continue;if(C.variables.some(R=>n[R.name]?.trim())){h.push(C.name);for(let R of C.variables){let pe=n[R.name];pe&&(T[R.name]=pe)}}}if(h.length===0){o.size===0?p("Enable at least one provider (press Space or Enter)"):p("Enter a value for at least one field");return}t(h,T)};return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:c?"red":b,children:[g(f,{justifyContent:"space-between",children:[i(u,{bold:!0,children:"Configure AI Provider"}),i(u,{color:"yellow",children:"* At least one required"})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"Enable and configure at least one AI provider below:"})}),i(f,{marginTop:1,flexDirection:"column",children:e.map((h,T)=>{let I=o.has(T),C=S.findIndex(R=>R.type==="provider"&&R.categoryIndex===T),k=l===C;return g(f,{flexDirection:"column",marginBottom:1,children:[g(f,{children:[i(u,{color:k?b:void 0,bold:k,children:k?"\u279C ":" "}),i(u,{color:I?"green":"gray",children:I?"[\u2714]":"[ ]"}),g(u,{color:I?b:"gray",bold:I,children:[" ",h.name]}),h.description&&g(u,{color:"gray",dimColor:!0,children:[" ","- ",h.description]})]}),k&&h.docsUrl&&g(f,{marginLeft:6,children:[i(u,{color:"yellow",children:"\u{1F4D6} "}),i(u,{color:"blue",underline:!0,children:h.docsUrl})]}),I&&i(f,{marginLeft:4,flexDirection:"column",marginTop:1,children:h.variables.map((R,pe)=>{let Te=S.findIndex(be=>be.type==="field"&&be.categoryIndex===T&&be.fieldIndex===pe),de=l===Te,vt=!!R.defaultValue,Ve=n[R.name]||"";return g(f,{flexDirection:"column",marginBottom:1,children:[g(f,{children:[g(u,{color:de?b:"gray",bold:de,children:[de?" \u279C ":" ",R.name]}),!de&&Ve&&i(u,{color:"green",children:" \u2713"}),!de&&!Ve&&vt&&g(u,{color:"gray",dimColor:!0,children:[" ","(default: ",R.defaultValue,")"]})]}),de&&i(f,{marginLeft:4,children:i(Ee,{value:Ve,onChange:be=>{s(Tr=>({...Tr,[R.name]:be})),c&&p(null)},onSubmit:m,placeholder:vt?`Default: ${R.defaultValue}`:"Enter value..."})})]},R.name)})})]},h.name)})}),c&&i(f,{marginTop:1,children:g(u,{color:"red",bold:!0,children:["\u26A0 ",c]})}),g(f,{marginTop:1,children:[i(u,{color:x?b:void 0,bold:x,children:x?"\u279C ":" "}),i(f,{borderStyle:"round",borderColor:x?b:"gray",paddingX:2,children:i(u,{color:x?b:"gray",bold:x,children:"Continue \u2192"})})]}),i(f,{marginTop:1,children:i(u,{color:"gray",dimColor:!0,children:"\u2191/\u2193 navigate \u2022 Space/Enter toggle/select \u2022 Tab skip field"})})]})},et=({currentVar:e,currentIndex:t,totalCount:o,onSubmit:r,onSkip:n})=>{let[s,l]=H(e.defaultValue||""),[a,c]=H(null);Pe(()=>{l(e.defaultValue||""),c(null)},[e.name]),ie((v,y)=>{if(y.escape){if(e.required&&!s.trim()){c("This field is required and cannot be skipped");return}n()}});let p=v=>{if(e.required&&!v.trim()){c("This field is required");return}c(null),r(v)},S=!!e.defaultValue;return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:a?"red":b,children:[g(f,{justifyContent:"space-between",children:[g(f,{children:[i(u,{color:b,bold:!0,children:e.name}),e.required?i(u,{color:"red",children:" *"}):g(u,{color:"gray",dimColor:!0,children:[" ","optional"]})]}),g(u,{color:"gray",children:[t+1,"/",o]})]}),i(f,{marginLeft:1,children:i(u,{color:"gray",children:e.description})}),g(f,{marginTop:1,children:[i(u,{color:b,children:"\u2192 "}),i(Ee,{value:s,onChange:v=>{l(v),a&&c(null)},onSubmit:p,placeholder:S?`Default: ${e.defaultValue}`:e.required?"required":"skip with Enter"})]}),a&&i(f,{marginTop:1,children:i(u,{color:"red",children:a})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," confirm",!e.required&&g(u,{children:[" ","\xB7 ",i(u,{bold:!0,children:"ESC"})," skip"]})]})})]})},Pt=({store:e})=>{let[t,o]=H(e.currentState);return Pe(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),ie((r,n)=>{(n.return||n.escape)&&t.error&&e.submitInput("exit")}),g(_e,{status:t.status,step:t.step,children:[t.step==="Welcome"&&t.inputRequest?.id==="welcome"&&i(_r,{onConfirm:()=>e.submitInput(!0)}),t.step==="Prerequisites"&&t.data.checks&&g(f,{flexDirection:"column",borderStyle:"round",paddingX:1,borderColor:b,children:[i(u,{bold:!0,children:"System Checks"}),g(f,{flexDirection:"column",marginTop:1,children:[i(ne,{label:"Git",status:t.data.checks.git}),i(ne,{label:"Docker",status:t.data.checks.docker}),i(ne,{label:"Mise",status:t.data.checks.mise})]})]}),t.inputRequest?.id==="port_conflicts"&&t.data.portConflicts&&i(Oe,{portResults:t.data.portConflicts,onAccept:()=>e.submitInput("accept"),onAbort:()=>e.submitInput("abort")}),t.inputRequest?.id==="repo_path"&&i(Or,{defaultValue:t.inputRequest.meta.default,onSubmit:r=>e.submitInput(r)}),t.inputRequest?.id==="existing_repo"&&t.data.existingRepoPath&&i(Lr,{repoPath:t.data.existingRepoPath,onAction:r=>e.submitInput(r)}),t.step==="Repository Setup"&&!t.inputRequest&&g(f,{flexDirection:"column",borderStyle:"round",padding:1,borderColor:b,children:[i(u,{bold:!0,children:"Cloning Repository"}),g(f,{marginTop:1,flexDirection:"column",children:[i(Ct,{value:t.data.repoProgress||0}),t.data.repoPhase&&i(f,{marginTop:1,children:i(u,{color:"gray",children:t.data.repoPhase})})]})]}),t.inputRequest?.id==="setup_mode"&&i(Ye,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_method"&&i(Ke,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_infisical"&&i(Je,{onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_var"&&t.data.currentEnvVar&&i(et,{categories:t.data.envCategories||[],currentVar:t.data.currentEnvVar,currentIndex:t.data.envVarIndex||0,totalCount:t.data.envVarTotal||0,onSubmit:r=>e.submitInput(r),onSkip:()=>e.submitInput("")}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_group"&&t.data.currentEnvGroup&&i(ze,{category:t.data.currentEnvGroup,currentIndex:t.data.envGroupIndex||0,totalGroups:t.data.envGroupTotal||0,onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_alternatives"&&t.data.alternativeGroups&&i(Ze,{alternatives:t.data.alternativeGroups,onSubmit:(r,n)=>e.submitInput({selectedGroups:r,values:n})}),t.step==="Environment Setup"&&!t.inputRequest&&g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(u,{bold:!0,children:"Environment Setup"}),i(f,{marginTop:1,children:i(Xe,{label:t.status||"Configuring environment..."})})]}),t.step==="Finished"&&i(Mr,{setupMode:t.data.setupMode,portOverrides:t.data.portOverrides,onConfirm:()=>e.submitInput("exit")}),(t.step==="Install Tools"||t.step==="Project Setup")&&i(Nr,{title:t.step==="Install Tools"?"Installing Tools":"Project Setup",phase:t.data.dependencyPhase||"",progress:t.data.dependencyProgress||0,isComplete:t.step==="Install Tools"?t.data.toolComplete||!1:t.data.dependencyComplete||!1,logs:t.data.dependencyLogs||[]}),t.step==="Installing CLI"&&g(f,{flexDirection:"column",borderStyle:"round",padding:1,borderColor:b,children:[i(u,{bold:!0,color:b,children:"Installing CLI"}),i(f,{marginTop:1,children:i(Xe,{label:t.status||"Installing gaia CLI globally..."})}),t.data.cliInstallLogs&&t.data.cliInstallLogs.length>0&&i(Et,{logs:t.data.cliInstallLogs})]}),t.error&&g(f,{flexDirection:"column",borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:[g(u,{color:"red",children:["Error: ",t.error.message]}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," to exit"]})})]})]})};import{Spinner as Gr}from"@inkjs/ui";import{Box as G,Text as w,useInput as wt}from"ink";import{useEffect as Rt,useRef as $r,useState as Dt}from"react";import{jsx as F,jsxs as P}from"react/jsx-runtime";var tt=8,qr=({logs:e})=>{let[t,o]=Dt(0),r=$r(e.length);Rt(()=>{e.length!==r.current&&(r.current=e.length,o(0))},[e.length]),wt((S,v)=>{v.upArrow?o(y=>Math.min(y+1,Math.max(0,e.length-tt))):v.downArrow&&o(y=>Math.max(0,y-1))});let n=e.length,s=Math.max(0,n-tt-t),l=Math.max(0,n-t),a=e.slice(s,l),c=s,p=t;return P(G,{flexDirection:"column",marginTop:1,marginLeft:1,children:[c>0&&P(w,{color:"gray",dimColor:!0,children:["\u2191 ",c," more line",c!==1?"s":""]}),F(G,{flexDirection:"column",height:tt,overflow:"hidden",children:a.map((S,v)=>F(w,{color:"gray",wrap:"truncate",children:S},s+v))}),p>0?P(w,{color:"gray",dimColor:!0,children:["\u2193 ",p," more line",p!==1?"s":""]}):F(w,{color:"gray",dimColor:!0,children:"\u2191\u2193 scroll"})]})},kt=({store:e})=>{let[t,o]=Dt(e.currentState);return Rt(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),wt((r,n)=>{(n.return||n.escape)&&(t.data.started||t.data.stopped||t.error)&&e.submitInput("exit")}),P(G,{flexDirection:"column",width:"100%",children:[F(me,{}),(t.step==="Starting"||t.step==="Stopping")&&P(G,{flexDirection:"column",marginTop:1,paddingX:2,borderStyle:"round",borderColor:b,children:[F(Gr,{label:t.status||"Working..."}),t.data.repoPath&&F(G,{marginTop:1,children:P(w,{color:"gray",children:["Repository: ",t.data.repoPath]})}),t.data.setupMode&&F(G,{children:P(w,{color:"gray",children:["Mode: ",t.data.setupMode]})}),t.data.dockerLogs&&t.data.dockerLogs.length>0&&F(qr,{logs:t.data.dockerLogs})]}),t.step==="Running"&&t.data.started&&P(G,{flexDirection:"column",marginTop:1,paddingX:2,paddingY:1,borderStyle:"round",borderColor:"green",children:[P(w,{color:"green",bold:!0,children:["\u2713"," GAIA is running!"]}),t.data.setupMode!=="developer"&&P(G,{marginTop:1,flexDirection:"column",children:[P(w,{children:["Web:"," ",P(w,{color:"cyan",bold:!0,children:["http://localhost:",t.data.webPort||3e3]})]}),P(w,{children:["API:"," ",P(w,{color:"cyan",bold:!0,children:["http://localhost:",t.data.apiPort||8e3]})]})]}),t.data.setupMode==="developer"&&P(G,{marginTop:1,flexDirection:"column",children:[P(G,{flexDirection:"column",children:[P(w,{children:["Web:"," ",P(w,{color:"cyan",bold:!0,children:["http://localhost:",t.data.webPort||3e3]})]}),P(w,{children:["API:"," ",P(w,{color:"cyan",bold:!0,children:["http://localhost:",t.data.apiPort||8e3]})]})]}),P(G,{marginTop:1,flexDirection:"column",children:[F(w,{color:"gray",children:"Dev servers started in background."}),P(w,{color:"gray",children:["Logs: ",F(w,{color:b,children:"dev-start.log"})," in your repo root."]}),P(w,{color:"gray",children:["Run ",F(w,{color:b,children:"gaia stop"})," to shut down."]})]})]}),F(G,{marginTop:1,children:P(w,{dimColor:!0,children:[F(w,{bold:!0,children:"Enter"})," to exit"]})})]}),t.step==="Stopped"&&t.data.stopped&&P(G,{flexDirection:"column",marginTop:1,paddingX:2,paddingY:1,borderStyle:"round",borderColor:b,children:[P(w,{color:b,bold:!0,children:["\u2713"," All GAIA services stopped."]}),F(G,{marginTop:1,children:P(w,{dimColor:!0,children:[F(w,{bold:!0,children:"Enter"})," to exit"]})})]}),t.error&&P(G,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:[P(w,{color:"red",children:["Error: ",t.error.message]}),F(G,{marginTop:1,children:P(w,{dimColor:!0,children:[F(w,{bold:!0,children:"Enter"})," to exit"]})})]})]})};import{ProgressBar as jr,Spinner as rt}from"@inkjs/ui";import{Box as B,Text as O,useInput as At}from"ink";import{useEffect as Hr,useState as Wr}from"react";import{jsx as E,jsxs as _}from"react/jsx-runtime";var Bt=({store:e})=>{let[t,o]=Wr(e.currentState);return Hr(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),At((r,n)=>{(n.return||n.escape)&&t.error&&e.submitInput("exit")}),_(_e,{status:t.status,step:t.step,steps:It,children:[t.step==="Detect Repo"&&_(B,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:b,children:[E(O,{bold:!0,children:"Detecting GAIA Repository"}),E(B,{marginTop:1,children:E(rt,{label:"Searching for repository..."})}),t.data.repoPath&&E(B,{marginTop:1,children:_(O,{color:"green",children:["Found: ",t.data.repoPath]})})]}),t.step==="Prerequisites"&&t.data.checks&&_(B,{flexDirection:"column",borderStyle:"round",paddingX:1,borderColor:b,children:[E(O,{bold:!0,children:"System Checks"}),_(B,{flexDirection:"column",marginTop:1,children:[E(ne,{label:"Git",status:t.data.checks.git}),E(ne,{label:"Docker",status:t.data.checks.docker}),E(ne,{label:"Mise",status:t.data.checks.mise})]})]}),t.inputRequest?.id==="port_conflicts"&&t.data.portConflicts&&E(Oe,{portResults:t.data.portConflicts,onAccept:()=>e.submitInput("accept"),onAbort:()=>e.submitInput("abort")}),t.inputRequest?.id==="setup_mode"&&E(Ye,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_method"&&E(Ke,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_infisical"&&E(Je,{onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_var"&&t.data.currentEnvVar&&E(et,{categories:t.data.envCategories||[],currentVar:t.data.currentEnvVar,currentIndex:t.data.envVarIndex||0,totalCount:t.data.envVarTotal||0,onSubmit:r=>e.submitInput(r),onSkip:()=>e.submitInput("")}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_group"&&t.data.currentEnvGroup&&E(ze,{category:t.data.currentEnvGroup,currentIndex:t.data.envGroupIndex||0,totalGroups:t.data.envGroupTotal||0,onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_alternatives"&&t.data.alternativeGroups&&E(Ze,{alternatives:t.data.alternativeGroups,onSubmit:(r,n)=>e.submitInput({selectedGroups:r,values:n})}),t.step==="Environment Setup"&&!t.inputRequest&&_(B,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[E(O,{bold:!0,children:"Environment Setup"}),E(B,{marginTop:1,children:E(rt,{label:t.status||"Configuring environment..."})})]}),t.step==="Project Setup"&&_(B,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[E(B,{marginBottom:1,children:E(O,{bold:!0,color:b,children:"Project Setup"})}),_(B,{flexDirection:"column",gap:1,children:[E(B,{children:t.data.dependencyComplete?_(O,{color:"green",children:["\u2713"," ",t.data.dependencyPhase]}):E(rt,{label:t.data.dependencyPhase||"Preparing..."})}),!t.data.dependencyComplete&&t.data.dependencyProgress>0&&E(B,{width:50,children:E(jr,{value:t.data.dependencyProgress})}),!t.data.dependencyComplete&&t.data.dependencyLogs?.length>0&&E(B,{flexDirection:"column",marginTop:1,marginLeft:1,children:t.data.dependencyLogs.map((r,n)=>E(O,{color:"gray",wrap:"truncate",children:r},n))})]})]}),t.step==="Finished"&&E(Vr,{setupMode:t.data.setupMode,portOverrides:t.data.portOverrides,onConfirm:()=>e.submitInput("exit")}),t.error&&_(B,{flexDirection:"column",borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:[_(O,{color:"red",children:["Error: ",t.error.message]}),E(B,{marginTop:1,children:_(O,{dimColor:!0,children:[E(O,{bold:!0,children:"Enter"})," to exit"]})})]})]})},Vr=({portOverrides:e,onConfirm:t})=>{At((n,s)=>{s.return&&t()});let o=e?.[3e3]??3e3,r=e?.[8e3]??8e3;return _(B,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:b,padding:1,children:[E(O,{color:b,bold:!0,children:"Setup Complete!"}),_(B,{marginTop:1,children:[E(O,{bold:!0,children:"Run: "}),E(O,{color:"cyan",children:"$ gaia start"})]}),_(B,{marginTop:1,flexDirection:"column",children:[_(O,{children:["Web:"," ",_(O,{color:"cyan",bold:!0,children:["http://localhost:",o]})]}),_(O,{children:["API:"," ",_(O,{color:"cyan",bold:!0,children:["http://localhost:",r]})]})]}),E(B,{marginTop:1,children:E(O,{color:"gray",children:"gaia stop \xB7 gaia status \xB7 gaia setup"})}),E(B,{marginTop:1,children:_(O,{dimColor:!0,children:[E(O,{bold:!0,children:"Enter"})," to exit"]})})]})};import{Spinner as Ur}from"@inkjs/ui";import{Box as L,Text as A,useInput as Xr}from"ink";import{useEffect as _t,useState as ot}from"react";import{jsx as D,jsxs as $}from"react/jsx-runtime";var Ot=({store:e})=>{let[t,o]=ot(e.currentState),[r,n]=ot(!1),[s,l]=ot(null);return _t(()=>{let a=()=>o({...e.currentState});return e.on("change",a),()=>{e.off("change",a)}},[e]),_t(()=>{t.step==="Results"&&(n(!1),l(new Date().toLocaleTimeString()))},[t.step]),Xr((a,c)=>{(c.return||c.escape)&&t.step==="Results"&&e.submitInput("exit"),a==="r"&&t.step==="Results"&&t.data.refreshable&&!r&&(n(!0),e.submitInput("refresh"))}),$(L,{flexDirection:"column",width:"100%",children:[D(me,{}),t.step==="Checking"&&D(L,{marginTop:1,children:D(Ur,{label:t.data.services?"Refreshing service health...":"Checking service health..."})}),t.step==="Results"&&t.data.services&&$(L,{flexDirection:"column",children:[$(L,{flexDirection:"column",borderStyle:"round",borderColor:b,paddingX:2,paddingY:1,children:[$(L,{justifyContent:"space-between",children:[D(A,{bold:!0,color:b,children:"GAIA Service Status"}),s&&$(A,{color:"gray",dimColor:!0,children:["checked ",s," \xB7 ",D(A,{bold:!0,children:"r"})," refresh"]})]}),$(L,{marginTop:1,flexDirection:"column",children:[$(L,{children:[D(L,{width:22,children:D(A,{bold:!0,children:"Service"})}),D(L,{width:10,children:D(A,{bold:!0,children:"Status"})}),D(L,{width:10,children:D(A,{bold:!0,children:"Latency"})})]}),D(A,{color:"gray",children:"\u2500".repeat(42)}),[...t.data.services].sort((a,c)=>a.status==="down"&&c.status!=="down"?-1:a.status!=="down"&&c.status==="down"?1:a.name.localeCompare(c.name)).map(a=>$(L,{children:[D(L,{width:22,children:$(A,{children:[a.name," (:",a.port,")"]})}),D(L,{width:10,children:D(A,{color:a.status==="up"?"green":"red",bold:!0,children:a.status==="up"?"\u2713 UP":"\u2717 DOWN"})}),D(L,{width:10,children:D(A,{color:"gray",children:a.latency?`${a.latency}ms`:"--"})})]},a.name))]})]}),t.data.docker&&$(L,{flexDirection:"column",borderStyle:"round",borderColor:"gray",paddingX:2,paddingY:1,marginTop:1,children:[D(A,{bold:!0,children:"Docker Containers"}),$(A,{color:"gray",children:["Docker:"," ",t.data.docker.running?D(A,{color:"green",children:"Running"}):D(A,{color:"red",children:"Not running"})]}),t.data.docker.containers?.length>0&&D(L,{marginTop:1,flexDirection:"column",children:t.data.docker.containers.map(a=>$(L,{children:[$(A,{color:a.status==="running"?"green":"red",children:[a.status==="running"?"\u2713":"\u2717"," "]}),D(A,{children:a.name}),a.health&&$(A,{color:"gray",children:[" (",a.health,")"]})]},a.name))})]}),D(L,{marginTop:1,children:$(A,{dimColor:!0,children:[D(A,{bold:!0,children:"Enter"})," exit \xB7 ",D(A,{bold:!0,children:"r"})," refresh"]})})]}),t.error&&D(L,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:$(A,{color:"red",children:["Error: ",t.error.message]})})]})};import{jsx as Y,jsxs as we}from"react/jsx-runtime";var Yr=["init","setup","status","start","stop"],nt=class extends Qr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}render(){return this.state.error?we(Le,{flexDirection:"column",padding:1,children:[Y(ue,{color:"red",bold:!0,children:"An unexpected error occurred:"}),Y(ue,{color:"red",children:this.state.error.message}),this.state.error.stack&&Y(Le,{marginTop:1,children:Y(ue,{color:"gray",dimColor:!0,children:this.state.error.stack})})]}):this.props.children}},Kr=({store:e,command:t})=>{switch(t){case"init":return Y(Pt,{store:e});case"setup":return Y(Bt,{store:e});case"status":return Y(Ot,{store:e});case"start":case"stop":return Y(kt,{store:e,command:t});default:return we(Le,{flexDirection:"column",padding:1,children:[we(ue,{color:"red",children:["Unknown command: ",t]}),we(Le,{marginTop:1,flexDirection:"column",children:[Y(ue,{bold:!0,children:"Available commands:"}),Yr.map(o=>we(ue,{children:[" ",Y(ue,{color:"cyan",children:o})]},o))]})]})}},K=({store:e,command:t})=>Y(nt,{children:Y(Kr,{store:e,command:t})});import{EventEmitter as Jr}from"events";var zr=150,it=class extends Jr{state={step:"init",status:"",error:null,data:{},inputRequest:null};inputResolver=null;emitTimer=null;emitPending=!1;get currentState(){return this.state}scheduleEmit(){this.emitPending=!0,this.emitTimer||(this.emitTimer=setTimeout(()=>{this.emitTimer=null,this.emitPending&&(this.emitPending=!1,this.emit("change",this.state))},zr))}emitNow(){this.emitTimer&&(clearTimeout(this.emitTimer),this.emitTimer=null),this.emitPending=!1,this.emit("change",this.state)}setStep(t){this.state.step=t,this.emitNow()}setStatus(t){this.state.status=t,this.scheduleEmit()}setError(t){this.state.error=t,t!==null&&this.inputResolver&&(this.inputResolver(null),this.inputResolver=null,this.state.inputRequest=null),this.emitNow()}updateData(t,o){this.state.data={...this.state.data,[t]:o},this.scheduleEmit()}waitForInput(t,o){return this.state.inputRequest={id:t,meta:o},this.emitNow(),new Promise(r=>{this.inputResolver=r})}submitInput(t){this.inputResolver&&(this.inputResolver(t),this.inputResolver=null,this.state.inputRequest=null,this.emitNow())}},J=()=>new it;import*as re from"fs";import*as ar from"os";import*as ae from"path";import*as ee from"fs";import*as Lt from"os";import*as ct from"path";var at=ct.join(Lt.homedir(),".gaia"),st=ct.join(at,"config.json"),lt="0.1.10";function Zr(){ee.existsSync(at)||ee.mkdirSync(at,{recursive:!0})}function ut(){try{if(!ee.existsSync(st))return null;let e=ee.readFileSync(st,"utf-8");return JSON.parse(e)}catch{return null}}function Me(e){Zr(),ee.writeFileSync(st,`${JSON.stringify(e,null,2)}
|
|
3
|
-
`)}function
|
|
4
|
-
`)){let a=
|
|
5
|
-
`),"utf-8")}function
|
|
6
|
-
`),"utf-8")}var
|
|
7
|
-
`),"utf-8")}function xe(e){let t={};for(let[o,r]of Object.entries(e)){let n=Number(o),s=
|
|
8
|
-
`)){let s=n.trim();if(s&&!s.startsWith("#")){let[
|
|
2
|
+
import{Command as Mo}from"commander";import{render as bo}from"ink";import Io from"react";import{Box as Me,Text as pe}from"ink";import Yr from"react";import{ProgressBar as Et,Select as Ke,Spinner as Ye}from"@inkjs/ui";import{Box as f,Text as u,useInput as ie}from"ink";import we from"ink-text-input";import{useEffect as Pe,useRef as _r,useState as H}from"react";import{Box as Ce,Text as _e}from"ink";var b="#00bbff";import{Box as Ir,Text as Cr}from"ink";import{jsx as bt}from"react/jsx-runtime";var It=({status:e,step:t})=>t.toLowerCase()==="welcome"?null:bt(Ir,{width:"100%",paddingX:1,marginTop:1,children:bt(Cr,{color:"gray",dimColor:!0,children:e})});import{Box as Er}from"ink";import wr from"ink-big-text";import Pr from"ink-gradient";import{jsx as Qe}from"react/jsx-runtime";var fe=()=>Qe(Er,{flexDirection:"column",marginTop:1,marginBottom:1,children:Qe(Pr,{colors:[b,"#b0eaff",b],children:Qe(wr,{text:"GAIA",font:"3d"})})});import{jsx as le,jsxs as Ee}from"react/jsx-runtime";var Rr=["Welcome","Prerequisites","Setup Mode","Repository Setup","Environment Setup","Install Tools","Project Setup","Installing CLI","Finished"],Ct=["Detect Repo","Prerequisites","Environment Setup","Project Setup","Finished"],Dr={Welcome:"Welcome",Prerequisites:"Prereqs","Setup Mode":"Mode","Repository Setup":"Repo","Environment Setup":"Env","Install Tools":"Tools","Project Setup":"Setup","Installing CLI":"CLI","Detect Repo":"Detect",Finished:"Done"},kr=({currentStep:e,steps:t})=>{let o=t.indexOf(e);return le(Ce,{marginBottom:1,flexWrap:"nowrap",children:t.map((r,n)=>{let s=n<o,c=n===o,a=Dr[r]??r;return Ee(Ce,{flexShrink:0,children:[n>0&&Ee(_e,{color:"gray",dimColor:!0,children:[" ","\xB7"," "]}),s&&Ee(_e,{color:"green",children:["\u2713 ",a]}),c&&le(_e,{color:b,bold:!0,children:a}),!s&&!c&&le(_e,{color:"gray",dimColor:!0,children:a})]},r)})})},Le=({children:e,status:t,step:o,steps:r=Rr})=>Ee(Ce,{flexDirection:"column",height:"100%",width:"100%",children:[Ee(Ce,{flexGrow:1,flexDirection:"column",children:[le(fe,{}),le(kr,{currentStep:o,steps:r}),le(Ce,{flexDirection:"column",flexGrow:1,children:e})]}),le(It,{status:t,step:o})]});import{Spinner as Ar}from"@inkjs/ui";import{Box as oe,Text as U,useInput as Br}from"ink";import{jsx as j,jsxs as ue}from"react/jsx-runtime";var ne=({label:e,status:t})=>ue(oe,{children:[j(oe,{marginRight:1,children:t==="pending"?j(Ar,{type:"dots"}):t==="success"?j(U,{color:"green",children:"\u2714"}):t==="error"?j(U,{color:"red",children:"\u2716"}):j(U,{color:"yellow",children:"\u26A0"})}),j(U,{children:e})]}),Oe=({portResults:e,onAccept:t,onAbort:o})=>{Br((n,s)=>{s.return?t():s.escape&&o()});let r=e.filter(n=>!n.available);return ue(oe,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:"yellow",children:[j(oe,{marginBottom:1,children:j(U,{bold:!0,color:"yellow",children:"Port Conflicts Detected"})}),e.map(n=>ue(oe,{children:[ue(U,{color:n.available?"green":n.alternative?"yellow":"red",children:[n.available?"\u2714":n.alternative?"\u26A0":"\u2716"," "]}),ue(U,{children:[n.service," (:",n.port,")"]}),!n.available&&ue(U,{color:n.alternative?"gray":"red",children:[" ","- in use",n.usedBy?` by ${n.usedBy}`:"",n.alternative?` \u2192 will use :${n.alternative}`:" \u2014 NO ALTERNATIVE FOUND"]})]},n.port)),r.some(n=>!n.alternative)&&j(oe,{marginTop:1,children:j(U,{color:"red",children:"Some ports have no available alternative. Free them and retry."})}),!r.some(n=>!n.alternative)&&r.some(n=>n.alternative)&&j(oe,{marginTop:1,children:j(U,{color:"gray",children:"Alternative ports will be used for conflicting services."})}),j(oe,{marginTop:1,children:ue(U,{dimColor:!0,children:[j(U,{bold:!0,children:"Enter"})," continue \xB7 ",j(U,{bold:!0,children:"ESC"})," abort"]})})]})};import{Fragment as dn,jsx as i,jsxs as g}from"react/jsx-runtime";var Lr=({onConfirm:e})=>(ie((t,o)=>{o.return&&e()}),g(f,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:b,children:[i(u,{bold:!0,children:"Welcome to GAIA Setup"}),g(f,{flexDirection:"column",marginTop:1,marginBottom:1,children:[i(u,{children:"This wizard will guide you through the setup process:"}),i(u,{children:" 1. Check prerequisites and choose setup mode"}),i(u,{children:" 2. Clone repository"}),i(u,{children:" 3. Configure environment variables"}),i(u,{children:" 4. Install tools and dependencies"})]}),i(u,{dimColor:!0,children:"~5-15 min depending on network speed"}),i(f,{marginTop:1,children:g(u,{color:b,children:[i(u,{bold:!0,children:"Enter"})," to start"]})})]})),Or=({defaultValue:e,onSubmit:t})=>{let[o,r]=H(e);return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(u,{children:"Clone repository to:"}),i(u,{color:"gray",dimColor:!0,children:"Press Enter for default, or type a custom path"}),g(f,{marginTop:1,children:[i(u,{color:b,children:"\u2192 "}),i(we,{value:o,onChange:r,onSubmit:t})]})]})},Mr=({repoPath:e,onAction:t})=>g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:"yellow",children:[i(f,{marginBottom:1,children:i(u,{bold:!0,color:"yellow",children:"Existing Installation Found"})}),g(u,{children:["Found a GAIA installation at"," ",i(u,{color:"cyan",bold:!0,children:e})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"What would you like to do?"})}),i(f,{marginTop:1,children:i(Ke,{options:[{label:"Use existing installation",value:"use_existing"},{label:"Delete and re-clone",value:"delete_reclone"},{label:"Choose a different path",value:"different_path"},{label:"Exit setup",value:"exit"}],onChange:r=>t(r)})})]}),Fr=({setupMode:e,portOverrides:t,onConfirm:o})=>{ie((s,c)=>{c.return&&o()});let r=t?.[3e3]??3e3,n=t?.[8e3]??8e3;return e==="selfhost"?g(f,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:"green",padding:1,children:[i(u,{bold:!0,color:"green",children:"GAIA is Running!"}),i(f,{marginTop:1,children:i(u,{color:"green",children:"\u2713 All services started"})}),g(f,{marginTop:1,flexDirection:"column",children:[g(u,{children:["Web:"," ",g(u,{color:"cyan",bold:!0,children:["http://localhost:",r]})]}),g(u,{children:["API:"," ",g(u,{color:"cyan",bold:!0,children:["http://localhost:",n]})]})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"gaia stop \xB7 gaia status \xB7 gaia setup"})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," to exit"]})})]}):g(f,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:b,padding:1,children:[i(u,{color:b,bold:!0,children:"You're all set!"}),g(f,{marginTop:1,children:[i(u,{bold:!0,children:"Run: "}),i(u,{color:"cyan",children:"$ gaia start"})]}),g(f,{marginTop:1,flexDirection:"column",children:[g(u,{children:["Web:"," ",g(u,{color:"cyan",bold:!0,children:["http://localhost:",r]})]}),g(u,{children:["API:"," ",g(u,{color:"cyan",bold:!0,children:["http://localhost:",n]})]})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"gaia stop \xB7 gaia status \xB7 gaia setup"})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," to exit"]})})]})},Nr=8,wt=({logs:e,height:t=Nr})=>{let[o,r]=H(0),n=_r(e.length);Pe(()=>{e.length!==n.current&&(n.current=e.length,r(0))},[e.length]),ie((T,y)=>{y.upArrow?r(S=>Math.min(S+1,Math.max(0,e.length-t))):y.downArrow&&r(S=>Math.max(0,S-1))});let s=e.length,c=Math.max(0,s-t-o),a=Math.max(0,s-o),l=e.slice(c,a),p=c,x=o;return g(f,{flexDirection:"column",marginTop:1,marginLeft:1,children:[p>0&&g(u,{color:"gray",dimColor:!0,children:["\u2191 ",p," more line",p!==1?"s":""]}),i(f,{flexDirection:"column",height:t,overflow:"hidden",children:l.map((T,y)=>i(u,{color:"gray",wrap:"truncate",children:T},`${c}-${y}`))}),x>0?g(u,{color:"gray",dimColor:!0,children:["\u2193 ",x," more line",x!==1?"s":""]}):i(u,{color:"gray",dimColor:!0,children:"\u2191\u2193 scroll"})]})},Gr=({phase:e,progress:t,isComplete:o,logs:r,title:n})=>g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(f,{marginBottom:1,children:i(u,{bold:!0,color:b,children:n||"Installing Dependencies"})}),g(f,{flexDirection:"column",gap:1,children:[i(f,{children:o?g(u,{color:"green",children:["\u2713 ",e]}):i(Ye,{label:e||"Preparing..."})}),!o&&t>0&&i(f,{width:50,children:i(Et,{value:t})}),!o&&r&&r.length>0&&i(wt,{logs:r}),!o&&i(f,{marginTop:1,children:i(u,{color:"gray",dimColor:!0,children:"This may take a few minutes..."})})]})]});var Je=({onSelect:e})=>g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(u,{bold:!0,children:"Setup Mode"}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"How do you want to run GAIA?"})}),i(f,{marginTop:1,children:i(Ke,{options:[{label:"Self-Host \u2014 run everything in Docker",value:"selfhost"},{label:"Developer \u2014 local dev with hot reload",value:"developer"}],onChange:o=>e(o)})})]}),ze=({onSelect:e})=>g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(u,{bold:!0,children:"Environment Variables Setup"}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"Choose how you want to configure environment variables:"})}),i(f,{marginTop:1,children:i(Ke,{options:[{label:"Manual Setup (Recommended)",value:"manual"},{label:"Infisical (Advanced)",value:"infisical"}],onChange:o=>e(o)})}),g(f,{marginTop:1,flexDirection:"column",children:[i(u,{color:"gray",dimColor:!0,children:"Manual Setup: Configure variables interactively (recommended for most users)"}),i(u,{color:"gray",dimColor:!0,children:"Infisical: All secrets managed in Infisical dashboard (requires pre-configuration)"})]})]}),Ze=({onSubmit:e})=>{let[t,o]=H({INFISICAL_TOKEN:"",INFISICAL_PROJECT_ID:"",INFISICAL_MACHINE_IDENTITY_CLIENT_ID:"",INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET:""}),[r,n]=H(0),[s,c]=H(null),a=[{key:"INFISICAL_TOKEN",description:"Service token from project settings (st.xxx...)"},{key:"INFISICAL_PROJECT_ID",description:"Found in your Infisical project settings"},{key:"INFISICAL_MACHINE_IDENTITY_CLIENT_ID",description:"From Access Control \u2192 Machine Identities"},{key:"INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET",description:"Generated when creating the machine identity"}];ie((p,x)=>{if(x.tab||x.downArrow)n(T=>T<a.length-1?T+1:T);else if(x.upArrow)n(T=>T>0?T-1:T);else if(x.return){if(r<a.length-1){n(y=>y+1);return}let T=a.filter(y=>!t[y.key].trim());if(T.length>0){c(`Required: ${T.map(S=>S.key).join(", ")}`);let y=a.findIndex(S=>!t[S.key].trim());y>=0&&n(y);return}e(t)}});let l=a[r];return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(f,{marginBottom:1,children:i(u,{bold:!0,color:b,children:"Infisical Configuration"})}),i(f,{marginBottom:1,children:i(u,{color:"gray",children:"All secrets managed in your Infisical project. Only credentials stored locally."})}),g(f,{marginBottom:1,flexDirection:"column",children:[i(u,{color:"gray",children:"Configure your Infisical credentials."}),g(u,{color:"gray",dimColor:!0,children:["Visit"," ",i(u,{color:"cyan",underline:!0,children:"app.infisical.com"})," ","to get these values."]})]}),a.map((p,x)=>{let T=p.key.includes("SECRET")||p.key.includes("TOKEN");return g(f,{flexDirection:"column",marginBottom:1,children:[i(f,{children:g(u,{color:x===r?b:"white",children:[x===r?"\u25B8 ":" ",p.key,":"]})}),i(f,{marginLeft:2,children:i(u,{color:"gray",dimColor:!0,children:p.description})}),x===r?i(f,{marginLeft:2,children:i(we,{value:t[p.key],onChange:y=>{o(S=>({...S,[p.key]:y})),c(null)},placeholder:"Enter value...",mask:T?"*":void 0})}):i(f,{marginLeft:2,children:i(u,{color:t[p.key]?"green":"gray",children:t[p.key]?T?`\u2713 ${"*".repeat(8)}`:`\u2713 ${t[p.key]}`:"(not set)"})})]},p.key)}),s&&i(f,{marginTop:1,children:i(u,{color:"red",children:s})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," confirm \xB7 ",i(u,{bold:!0,children:"\u2191\u2193"})," navigate"]})})]})},et=({category:e,currentIndex:t,totalGroups:o,onSubmit:r})=>{let[n,s]=H(()=>{let y={};for(let S of e.variables)y[S.name]=S.defaultValue||"";return y}),[c,a]=H(0),[l,p]=H(null);Pe(()=>{let y={};for(let S of e.variables)y[S.name]=S.defaultValue||"";s(y),a(0),p(null)},[e.name]),ie((y,S)=>{if(S.tab||S.downArrow)a(m=>m<e.variables.length-1?m+1:m);else if(S.upArrow)a(m=>m>0?m-1:m);else if(S.escape){let m=e.variables.filter(d=>d.required&&!n[d.name]?.trim());if(m.length>0){p(`Required fields cannot be skipped: ${m.map(d=>d.name).join(", ")}`);return}r(n)}});let x=()=>{if(c<e.variables.length-1)a(c+1);else{let y=e.variables.filter(S=>S.required&&!n[S.name]?.trim());if(y.length>0){p(`Required fields are missing: ${y.map(S=>S.name).join(", ")}`);return}p(null),r(n)}},T=e.variables.some(y=>y.required);return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:l?"red":b,children:[g(f,{justifyContent:"space-between",children:[g(u,{bold:!0,children:["Configure ",e.name]}),g(u,{color:"gray",children:["Group ",t+1," / ",o]})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:e.description})}),i(f,{marginTop:1,flexDirection:"column",children:e.variables.map((y,S)=>{let m=S===c,d=!!y.defaultValue;return g(f,{flexDirection:"column",marginBottom:1,children:[g(f,{children:[g(u,{color:m?b:"gray",bold:m,children:[m?"\u279C ":" ",y.name]}),y.required&&g(u,{color:"red",bold:!0,children:[" ","*"]}),d&&!m&&g(u,{color:"gray",dimColor:!0,children:[" ","(default: ",y.defaultValue,")"]})]}),m&&i(f,{marginLeft:2,children:i(we,{value:n[y.name]||"",onChange:h=>{s(v=>({...v,[y.name]:h})),l&&p(null)},onSubmit:x,placeholder:d?`Default: ${y.defaultValue}`:y.required?"Enter a value (required)":"Press Enter to skip"})})]},y.name)})}),l&&i(f,{marginTop:1,children:g(u,{color:"red",bold:!0,children:["\u26A0 ",l]})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," next \xB7 ",i(u,{bold:!0,children:"\u2191\u2193"})," navigate",!T&&g(u,{children:[" ","\xB7 ",i(u,{bold:!0,children:"ESC"})," skip"]})]})})]})},tt=({alternatives:e,onSubmit:t})=>{let[o,r]=H(new Set),[n,s]=H({}),[c,a]=H(0),[l,p]=H(null);Pe(()=>{let h={};for(let v of e)for(let I of v.variables)h[I.name]=I.defaultValue||"";s(h)},[e]);let x=[];for(let h=0;h<e.length;h++)if(x.push({type:"provider",categoryIndex:h}),o.has(h)){let v=e[h];if(v)for(let I=0;I<v.variables.length;I++)x.push({type:"field",categoryIndex:h,fieldIndex:I})}x.push({type:"submit"});let T=x[c],y=T?.type==="field",S=T?.type==="submit";ie((h,v)=>{let I=Math.min(c,x.length-1);if(I!==c){a(I);return}if(y)v.upArrow?a(C=>Math.max(0,C-1)):(v.downArrow||v.tab)&&a(C=>Math.min(x.length-1,C+1));else if(S)v.upArrow?a(C=>Math.max(0,C-1)):(v.return||h===" ")&&d();else if(v.upArrow)a(C=>Math.max(0,C-1));else if(v.downArrow||v.tab)a(C=>Math.min(x.length-1,C+1));else if((v.return||h===" ")&&T?.type==="provider"){let C=T.categoryIndex;r(k=>{let P=new Set(k);return P.has(C)?P.delete(C):P.add(C),P}),l&&p(null)}});let m=()=>{l&&p(null),a(h=>Math.min(x.length-1,h+1))},d=()=>{let h=[],v={};for(let I of o){let C=e[I];if(!C)continue;if(C.variables.some(P=>n[P.name]?.trim())){h.push(C.name);for(let P of C.variables){let de=n[P.name];de&&(v[P.name]=de)}}}if(h.length===0){o.size===0?p("Enable at least one provider (press Space or Enter)"):p("Enter a value for at least one field");return}t(h,v)};return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:l?"red":b,children:[g(f,{justifyContent:"space-between",children:[i(u,{bold:!0,children:"Configure AI Provider"}),i(u,{color:"yellow",children:"* At least one required"})]}),i(f,{marginTop:1,children:i(u,{color:"gray",children:"Enable and configure at least one AI provider below:"})}),i(f,{marginTop:1,flexDirection:"column",children:e.map((h,v)=>{let I=o.has(v),C=x.findIndex(P=>P.type==="provider"&&P.categoryIndex===v),k=c===C;return g(f,{flexDirection:"column",marginBottom:1,children:[g(f,{children:[i(u,{color:k?b:void 0,bold:k,children:k?"\u279C ":" "}),i(u,{color:I?"green":"gray",children:I?"[\u2714]":"[ ]"}),g(u,{color:I?b:"gray",bold:I,children:[" ",h.name]}),h.description&&g(u,{color:"gray",dimColor:!0,children:[" ","- ",h.description]})]}),k&&h.docsUrl&&g(f,{marginLeft:6,children:[i(u,{color:"yellow",children:"\u{1F4D6} "}),i(u,{color:"blue",underline:!0,children:h.docsUrl})]}),I&&i(f,{marginLeft:4,flexDirection:"column",marginTop:1,children:h.variables.map((P,de)=>{let be=x.findIndex(Ie=>Ie.type==="field"&&Ie.categoryIndex===v&&Ie.fieldIndex===de),me=c===be,vt=!!P.defaultValue,Xe=n[P.name]||"";return g(f,{flexDirection:"column",marginBottom:1,children:[g(f,{children:[g(u,{color:me?b:"gray",bold:me,children:[me?" \u279C ":" ",P.name]}),!me&&Xe&&i(u,{color:"green",children:" \u2713"}),!me&&!Xe&&vt&&g(u,{color:"gray",dimColor:!0,children:[" ","(default: ",P.defaultValue,")"]})]}),me&&i(f,{marginLeft:4,children:i(we,{value:Xe,onChange:Ie=>{s(br=>({...br,[P.name]:Ie})),l&&p(null)},onSubmit:m,placeholder:vt?`Default: ${P.defaultValue}`:"Enter value..."})})]},P.name)})})]},h.name)})}),l&&i(f,{marginTop:1,children:g(u,{color:"red",bold:!0,children:["\u26A0 ",l]})}),g(f,{marginTop:1,children:[i(u,{color:S?b:void 0,bold:S,children:S?"\u279C ":" "}),i(f,{borderStyle:"round",borderColor:S?b:"gray",paddingX:2,children:i(u,{color:S?b:"gray",bold:S,children:"Continue \u2192"})})]}),i(f,{marginTop:1,children:i(u,{color:"gray",dimColor:!0,children:"\u2191/\u2193 navigate \u2022 Space/Enter toggle/select \u2022 Tab skip field"})})]})},rt=({currentVar:e,currentIndex:t,totalCount:o,onSubmit:r,onSkip:n})=>{let[s,c]=H(e.defaultValue||""),[a,l]=H(null);Pe(()=>{c(e.defaultValue||""),l(null)},[e.name]),ie((T,y)=>{if(y.escape){if(e.required&&!s.trim()){l("This field is required and cannot be skipped");return}n()}});let p=T=>{if(e.required&&!T.trim()){l("This field is required");return}l(null),r(T)},x=!!e.defaultValue;return g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:a?"red":b,children:[g(f,{justifyContent:"space-between",children:[g(f,{children:[i(u,{color:b,bold:!0,children:e.name}),e.required?i(u,{color:"red",children:" *"}):g(u,{color:"gray",dimColor:!0,children:[" ","optional"]})]}),g(u,{color:"gray",children:[t+1,"/",o]})]}),i(f,{marginLeft:1,children:i(u,{color:"gray",children:e.description})}),g(f,{marginTop:1,children:[i(u,{color:b,children:"\u2192 "}),i(we,{value:s,onChange:T=>{c(T),a&&l(null)},onSubmit:p,placeholder:x?`Default: ${e.defaultValue}`:e.required?"required":"skip with Enter"})]}),a&&i(f,{marginTop:1,children:i(u,{color:"red",children:a})}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," confirm",!e.required&&g(u,{children:[" ","\xB7 ",i(u,{bold:!0,children:"ESC"})," skip"]})]})})]})},Pt=({store:e})=>{let[t,o]=H(e.currentState);return Pe(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),ie((r,n)=>{(n.return||n.escape)&&t.error&&e.submitInput("exit")}),g(Le,{status:t.status,step:t.step,children:[t.step==="Welcome"&&t.inputRequest?.id==="welcome"&&i(Lr,{onConfirm:()=>e.submitInput(!0)}),t.step==="Prerequisites"&&t.data.checks&&g(f,{flexDirection:"column",borderStyle:"round",paddingX:1,borderColor:b,children:[i(u,{bold:!0,children:"System Checks"}),g(f,{flexDirection:"column",marginTop:1,children:[i(ne,{label:"Git",status:t.data.checks.git}),i(ne,{label:"Docker",status:t.data.checks.docker}),i(ne,{label:"Mise",status:t.data.checks.mise})]})]}),t.inputRequest?.id==="port_conflicts"&&t.data.portConflicts&&i(Oe,{portResults:t.data.portConflicts,onAccept:()=>e.submitInput("accept"),onAbort:()=>e.submitInput("abort")}),t.inputRequest?.id==="repo_path"&&i(Or,{defaultValue:t.inputRequest.meta.default,onSubmit:r=>e.submitInput(r)}),t.inputRequest?.id==="existing_repo"&&t.data.existingRepoPath&&i(Mr,{repoPath:t.data.existingRepoPath,onAction:r=>e.submitInput(r)}),t.step==="Repository Setup"&&!t.inputRequest&&g(f,{flexDirection:"column",borderStyle:"round",padding:1,borderColor:b,children:[i(u,{bold:!0,children:"Cloning Repository"}),g(f,{marginTop:1,flexDirection:"column",children:[i(Et,{value:t.data.repoProgress||0}),t.data.repoPhase&&i(f,{marginTop:1,children:i(u,{color:"gray",children:t.data.repoPhase})})]})]}),t.inputRequest?.id==="setup_mode"&&i(Je,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_method"&&i(ze,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_infisical"&&i(Ze,{onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_var"&&t.data.currentEnvVar&&i(rt,{categories:t.data.envCategories||[],currentVar:t.data.currentEnvVar,currentIndex:t.data.envVarIndex||0,totalCount:t.data.envVarTotal||0,onSubmit:r=>e.submitInput(r),onSkip:()=>e.submitInput("")}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_group"&&t.data.currentEnvGroup&&i(et,{category:t.data.currentEnvGroup,currentIndex:t.data.envGroupIndex||0,totalGroups:t.data.envGroupTotal||0,onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_alternatives"&&t.data.alternativeGroups&&i(tt,{alternatives:t.data.alternativeGroups,onSubmit:(r,n)=>e.submitInput({selectedGroups:r,values:n})}),t.step==="Environment Setup"&&!t.inputRequest&&g(f,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[i(u,{bold:!0,children:"Environment Setup"}),i(f,{marginTop:1,children:i(Ye,{label:t.status||"Configuring environment..."})})]}),t.step==="Finished"&&i(Fr,{setupMode:t.data.setupMode,portOverrides:t.data.portOverrides,onConfirm:()=>e.submitInput("exit")}),(t.step==="Install Tools"||t.step==="Project Setup")&&i(Gr,{title:t.step==="Install Tools"?"Installing Tools":"Project Setup",phase:t.data.dependencyPhase||"",progress:t.data.dependencyProgress||0,isComplete:t.step==="Install Tools"?t.data.toolComplete||!1:t.data.dependencyComplete||!1,logs:t.data.dependencyLogs||[]}),t.step==="Installing CLI"&&g(f,{flexDirection:"column",borderStyle:"round",padding:1,borderColor:b,children:[i(u,{bold:!0,color:b,children:"Installing CLI"}),i(f,{marginTop:1,children:i(Ye,{label:t.status||"Installing gaia CLI globally..."})}),t.data.cliInstallLogs&&t.data.cliInstallLogs.length>0&&i(wt,{logs:t.data.cliInstallLogs})]}),t.error&&g(f,{flexDirection:"column",borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:[g(u,{color:"red",children:["Error: ",t.error.message]}),i(f,{marginTop:1,children:g(u,{dimColor:!0,children:[i(u,{bold:!0,children:"Enter"})," to exit"]})})]})]})};import{Spinner as $r}from"@inkjs/ui";import{Box as G,Text as R,useInput as Rt}from"ink";import{useEffect as Dt,useRef as qr,useState as kt}from"react";import{jsx as F,jsxs as w}from"react/jsx-runtime";var ot=8,jr=({logs:e})=>{let[t,o]=kt(0),r=qr(e.length);Dt(()=>{e.length!==r.current&&(r.current=e.length,o(0))},[e.length]),Rt((x,T)=>{T.upArrow?o(y=>Math.min(y+1,Math.max(0,e.length-ot))):T.downArrow&&o(y=>Math.max(0,y-1))});let n=e.length,s=Math.max(0,n-ot-t),c=Math.max(0,n-t),a=e.slice(s,c),l=s,p=t;return w(G,{flexDirection:"column",marginTop:1,marginLeft:1,children:[l>0&&w(R,{color:"gray",dimColor:!0,children:["\u2191 ",l," more line",l!==1?"s":""]}),F(G,{flexDirection:"column",height:ot,overflow:"hidden",children:a.map((x,T)=>F(R,{color:"gray",wrap:"truncate",children:x},s+T))}),p>0?w(R,{color:"gray",dimColor:!0,children:["\u2193 ",p," more line",p!==1?"s":""]}):F(R,{color:"gray",dimColor:!0,children:"\u2191\u2193 scroll"})]})},At=({store:e})=>{let[t,o]=kt(e.currentState);return Dt(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),Rt((r,n)=>{(n.return||n.escape)&&(t.data.started||t.data.stopped||t.error)&&e.submitInput("exit")}),w(G,{flexDirection:"column",width:"100%",children:[F(fe,{}),(t.step==="Starting"||t.step==="Stopping")&&w(G,{flexDirection:"column",marginTop:1,paddingX:2,borderStyle:"round",borderColor:b,children:[F($r,{label:t.status||"Working..."}),t.data.repoPath&&F(G,{marginTop:1,children:w(R,{color:"gray",children:["Repository: ",t.data.repoPath]})}),t.data.setupMode&&F(G,{children:w(R,{color:"gray",children:["Mode: ",t.data.setupMode]})}),t.data.dockerLogs&&t.data.dockerLogs.length>0&&F(jr,{logs:t.data.dockerLogs})]}),t.step==="Running"&&t.data.started&&w(G,{flexDirection:"column",marginTop:1,paddingX:2,paddingY:1,borderStyle:"round",borderColor:"green",children:[w(R,{color:"green",bold:!0,children:["\u2713"," GAIA is running!"]}),t.data.setupMode!=="developer"&&w(G,{marginTop:1,flexDirection:"column",children:[w(R,{children:["Web:"," ",w(R,{color:"cyan",bold:!0,children:["http://localhost:",t.data.webPort||3e3]})]}),w(R,{children:["API:"," ",w(R,{color:"cyan",bold:!0,children:["http://localhost:",t.data.apiPort||8e3]})]})]}),t.data.setupMode==="developer"&&w(G,{marginTop:1,flexDirection:"column",children:[w(G,{flexDirection:"column",children:[w(R,{children:["Web:"," ",w(R,{color:"cyan",bold:!0,children:["http://localhost:",t.data.webPort||3e3]})]}),w(R,{children:["API:"," ",w(R,{color:"cyan",bold:!0,children:["http://localhost:",t.data.apiPort||8e3]})]})]}),w(G,{marginTop:1,flexDirection:"column",children:[F(R,{color:"gray",children:"Dev servers started in background."}),w(R,{color:"gray",children:["Logs: ",F(R,{color:b,children:"dev-start.log"})," in your repo root."]}),w(R,{color:"gray",children:["Run ",F(R,{color:b,children:"gaia stop"})," to shut down."]})]})]}),F(G,{marginTop:1,children:w(R,{dimColor:!0,children:[F(R,{bold:!0,children:"Enter"})," to exit"]})})]}),t.step==="Stopped"&&t.data.stopped&&w(G,{flexDirection:"column",marginTop:1,paddingX:2,paddingY:1,borderStyle:"round",borderColor:b,children:[w(R,{color:b,bold:!0,children:["\u2713"," All GAIA services stopped."]}),F(G,{marginTop:1,children:w(R,{dimColor:!0,children:[F(R,{bold:!0,children:"Enter"})," to exit"]})})]}),t.error&&w(G,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:[w(R,{color:"red",children:["Error: ",t.error.message]}),F(G,{marginTop:1,children:w(R,{dimColor:!0,children:[F(R,{bold:!0,children:"Enter"})," to exit"]})})]})]})};import{ProgressBar as Hr,Spinner as nt}from"@inkjs/ui";import{Box as B,Text as L,useInput as Bt}from"ink";import{useEffect as Wr,useState as Vr}from"react";import{jsx as E,jsxs as _}from"react/jsx-runtime";var _t=({store:e})=>{let[t,o]=Vr(e.currentState);return Wr(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),Bt((r,n)=>{(n.return||n.escape)&&t.error&&e.submitInput("exit")}),_(Le,{status:t.status,step:t.step,steps:Ct,children:[t.step==="Detect Repo"&&_(B,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:b,children:[E(L,{bold:!0,children:"Detecting GAIA Repository"}),E(B,{marginTop:1,children:E(nt,{label:"Searching for repository..."})}),t.data.repoPath&&E(B,{marginTop:1,children:_(L,{color:"green",children:["Found: ",t.data.repoPath]})})]}),t.step==="Prerequisites"&&t.data.checks&&_(B,{flexDirection:"column",borderStyle:"round",paddingX:1,borderColor:b,children:[E(L,{bold:!0,children:"System Checks"}),_(B,{flexDirection:"column",marginTop:1,children:[E(ne,{label:"Git",status:t.data.checks.git}),E(ne,{label:"Docker",status:t.data.checks.docker}),E(ne,{label:"Mise",status:t.data.checks.mise})]})]}),t.inputRequest?.id==="port_conflicts"&&t.data.portConflicts&&E(Oe,{portResults:t.data.portConflicts,onAccept:()=>e.submitInput("accept"),onAbort:()=>e.submitInput("abort")}),t.inputRequest?.id==="setup_mode"&&E(Je,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_method"&&E(ze,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_infisical"&&E(Ze,{onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_var"&&t.data.currentEnvVar&&E(rt,{categories:t.data.envCategories||[],currentVar:t.data.currentEnvVar,currentIndex:t.data.envVarIndex||0,totalCount:t.data.envVarTotal||0,onSubmit:r=>e.submitInput(r),onSkip:()=>e.submitInput("")}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_group"&&t.data.currentEnvGroup&&E(et,{category:t.data.currentEnvGroup,currentIndex:t.data.envGroupIndex||0,totalGroups:t.data.envGroupTotal||0,onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_alternatives"&&t.data.alternativeGroups&&E(tt,{alternatives:t.data.alternativeGroups,onSubmit:(r,n)=>e.submitInput({selectedGroups:r,values:n})}),t.step==="Environment Setup"&&!t.inputRequest&&_(B,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[E(L,{bold:!0,children:"Environment Setup"}),E(B,{marginTop:1,children:E(nt,{label:t.status||"Configuring environment..."})})]}),t.step==="Project Setup"&&_(B,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:b,children:[E(B,{marginBottom:1,children:E(L,{bold:!0,color:b,children:"Project Setup"})}),_(B,{flexDirection:"column",gap:1,children:[E(B,{children:t.data.dependencyComplete?_(L,{color:"green",children:["\u2713"," ",t.data.dependencyPhase]}):E(nt,{label:t.data.dependencyPhase||"Preparing..."})}),!t.data.dependencyComplete&&t.data.dependencyProgress>0&&E(B,{width:50,children:E(Hr,{value:t.data.dependencyProgress})}),!t.data.dependencyComplete&&t.data.dependencyLogs?.length>0&&E(B,{flexDirection:"column",marginTop:1,marginLeft:1,children:t.data.dependencyLogs.map((r,n)=>E(L,{color:"gray",wrap:"truncate",children:r},n))})]})]}),t.step==="Finished"&&E(Ur,{setupMode:t.data.setupMode,portOverrides:t.data.portOverrides,onConfirm:()=>e.submitInput("exit")}),t.error&&_(B,{flexDirection:"column",borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:[_(L,{color:"red",children:["Error: ",t.error.message]}),E(B,{marginTop:1,children:_(L,{dimColor:!0,children:[E(L,{bold:!0,children:"Enter"})," to exit"]})})]})]})},Ur=({portOverrides:e,onConfirm:t})=>{Bt((n,s)=>{s.return&&t()});let o=e?.[3e3]??3e3,r=e?.[8e3]??8e3;return _(B,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:b,padding:1,children:[E(L,{color:b,bold:!0,children:"Setup Complete!"}),_(B,{marginTop:1,children:[E(L,{bold:!0,children:"Run: "}),E(L,{color:"cyan",children:"$ gaia start"})]}),_(B,{marginTop:1,flexDirection:"column",children:[_(L,{children:["Web:"," ",_(L,{color:"cyan",bold:!0,children:["http://localhost:",o]})]}),_(L,{children:["API:"," ",_(L,{color:"cyan",bold:!0,children:["http://localhost:",r]})]})]}),E(B,{marginTop:1,children:E(L,{color:"gray",children:"gaia stop \xB7 gaia status \xB7 gaia setup"})}),E(B,{marginTop:1,children:_(L,{dimColor:!0,children:[E(L,{bold:!0,children:"Enter"})," to exit"]})})]})};import{Spinner as Xr}from"@inkjs/ui";import{Box as O,Text as A,useInput as Qr}from"ink";import{useEffect as Lt,useState as it}from"react";import{jsx as D,jsxs as $}from"react/jsx-runtime";var Ot=({store:e})=>{let[t,o]=it(e.currentState),[r,n]=it(!1),[s,c]=it(null);return Lt(()=>{let a=()=>o({...e.currentState});return e.on("change",a),()=>{e.off("change",a)}},[e]),Lt(()=>{n(!1),c(new Date().toLocaleTimeString())},[t.data.services]),Qr((a,l)=>{(l.return||l.escape)&&t.step==="Results"&&e.submitInput("exit"),a==="r"&&t.step==="Results"&&t.data.refreshable&&!r&&(n(!0),e.submitInput("refresh"))}),$(O,{flexDirection:"column",width:"100%",children:[D(fe,{}),t.step==="Checking"&&D(O,{marginTop:1,children:D(Xr,{label:t.data.services?"Refreshing service health...":"Checking service health..."})}),t.step==="Results"&&t.data.services&&$(O,{flexDirection:"column",children:[$(O,{flexDirection:"column",borderStyle:"round",borderColor:b,paddingX:2,paddingY:1,children:[$(O,{justifyContent:"space-between",children:[D(A,{bold:!0,color:b,children:"GAIA Service Status"}),s&&$(A,{color:"gray",dimColor:!0,children:["checked ",s," \xB7 ",D(A,{bold:!0,children:"r"})," refresh"]})]}),$(O,{marginTop:1,flexDirection:"column",children:[$(O,{children:[D(O,{width:22,children:D(A,{bold:!0,children:"Service"})}),D(O,{width:10,children:D(A,{bold:!0,children:"Status"})}),D(O,{width:10,children:D(A,{bold:!0,children:"Latency"})})]}),D(A,{color:"gray",children:"\u2500".repeat(42)}),[...t.data.services].sort((a,l)=>a.status==="down"&&l.status!=="down"?-1:a.status!=="down"&&l.status==="down"?1:a.name.localeCompare(l.name)).map(a=>$(O,{children:[D(O,{width:22,children:$(A,{children:[a.name," (:",a.port,")"]})}),D(O,{width:10,children:D(A,{color:a.status==="up"?"green":"red",bold:!0,children:a.status==="up"?"\u2713 UP":"\u2717 DOWN"})}),D(O,{width:10,children:D(A,{color:"gray",children:a.latency?`${a.latency}ms`:"--"})})]},a.name))]})]}),t.data.docker&&$(O,{flexDirection:"column",borderStyle:"round",borderColor:"gray",paddingX:2,paddingY:1,marginTop:1,children:[D(A,{bold:!0,children:"Docker Containers"}),$(A,{color:"gray",children:["Docker:"," ",t.data.docker.running?D(A,{color:"green",children:"Running"}):D(A,{color:"red",children:"Not running"})]}),t.data.docker.containers?.length>0&&D(O,{marginTop:1,flexDirection:"column",children:t.data.docker.containers.map(a=>$(O,{children:[$(A,{color:a.status==="running"?"green":"red",children:[a.status==="running"?"\u2713":"\u2717"," "]}),D(A,{children:a.name}),a.health&&$(A,{color:"gray",children:[" (",a.health,")"]})]},a.name))})]}),D(O,{marginTop:1,children:$(A,{dimColor:!0,children:[D(A,{bold:!0,children:"Enter"})," exit \xB7 ",D(A,{bold:!0,children:"r"})," refresh"]})})]}),t.error&&D(O,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:$(A,{color:"red",children:["Error: ",t.error.message]})})]})};import{jsx as Y,jsxs as Re}from"react/jsx-runtime";var Kr=["init","setup","status","start","stop"],at=class extends Yr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}render(){return this.state.error?Re(Me,{flexDirection:"column",padding:1,children:[Y(pe,{color:"red",bold:!0,children:"An unexpected error occurred:"}),Y(pe,{color:"red",children:this.state.error.message}),this.state.error.stack&&Y(Me,{marginTop:1,children:Y(pe,{color:"gray",dimColor:!0,children:this.state.error.stack})})]}):this.props.children}},Jr=({store:e,command:t})=>{switch(t){case"init":return Y(Pt,{store:e});case"setup":return Y(_t,{store:e});case"status":return Y(Ot,{store:e});case"start":case"stop":return Y(At,{store:e,command:t});default:return Re(Me,{flexDirection:"column",padding:1,children:[Re(pe,{color:"red",children:["Unknown command: ",t]}),Re(Me,{marginTop:1,flexDirection:"column",children:[Y(pe,{bold:!0,children:"Available commands:"}),Kr.map(o=>Re(pe,{children:[" ",Y(pe,{color:"cyan",children:o})]},o))]})]})}},K=({store:e,command:t})=>Y(at,{children:Y(Jr,{store:e,command:t})});import{EventEmitter as zr}from"events";var Zr=150,st=class extends zr{state={step:"init",status:"",error:null,data:{},inputRequest:null};inputResolver=null;emitTimer=null;emitPending=!1;get currentState(){return this.state}scheduleEmit(){this.emitPending=!0,this.emitTimer||(this.emitTimer=setTimeout(()=>{this.emitTimer=null,this.emitPending&&(this.emitPending=!1,this.emit("change",this.state))},Zr))}emitNow(){this.emitTimer&&(clearTimeout(this.emitTimer),this.emitTimer=null),this.emitPending=!1,this.emit("change",this.state)}setStep(t){this.state.step=t,this.emitNow()}setStatus(t){this.state.status=t,this.scheduleEmit()}setError(t){this.state.error=t,t!==null&&this.inputResolver&&(this.inputResolver(null),this.inputResolver=null,this.state.inputRequest=null),this.emitNow()}updateData(t,o){this.state.data={...this.state.data,[t]:o},this.scheduleEmit()}waitForInput(t,o,r){return this.state.inputRequest={id:t,meta:o},this.emitNow(),new Promise(n=>{if(this.inputResolver=n,r!=null){let s=setTimeout(()=>{this.inputResolver&&(this.inputResolver=null,this.state.inputRequest=null,this.emitNow(),n(null))},r),c=this.inputResolver;this.inputResolver=a=>{clearTimeout(s),c(a)}}})}submitInput(t){this.inputResolver&&(this.inputResolver(t),this.inputResolver=null,this.state.inputRequest=null,this.emitNow())}},J=()=>new st;import*as re from"fs";import*as sr from"os";import*as se from"path";import*as ee from"fs";import*as Mt from"os";import*as ut from"path";var ct=ut.join(Mt.homedir(),".gaia"),lt=ut.join(ct,"config.json"),Fe="0.1.10";function eo(){ee.existsSync(ct)||ee.mkdirSync(ct,{recursive:!0})}function pt(){try{if(!ee.existsSync(lt))return null;let e=ee.readFileSync(lt,"utf-8");return JSON.parse(e)}catch{return null}}function Ne(e){eo(),ee.writeFileSync(lt,`${JSON.stringify(e,null,2)}
|
|
3
|
+
`)}function De(e){let o={...pt()??{version:Fe,setupComplete:!1,setupMethod:"manual",repoPath:"",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()},...e,updatedAt:new Date().toISOString()};Ne(o)}import*as Jt from"path";import*as he from"node:fs";import*as ge from"node:path";import{execa as Ft}from"execa";var dt={selfhost:{MONGO_DB:"mongodb://mongo:27017/gaia",REDIS_URL:"redis://redis:6379",POSTGRES_URL:"postgresql://postgres:postgres@postgres:5432/langgraph",CHROMADB_HOST:"chromadb",CHROMADB_PORT:"8000",RABBITMQ_URL:"amqp://guest:guest@rabbitmq:5672/"},developer:{MONGO_DB:"mongodb://localhost:27017/gaia",REDIS_URL:"redis://localhost:6379",POSTGRES_URL:"postgresql://postgres:postgres@localhost:5432/postgres",CHROMADB_HOST:"localhost",CHROMADB_PORT:"8080",RABBITMQ_URL:"amqp://guest:guest@localhost:5672/"}},Nt={selfhost:{HOST:"http://localhost:8000",FRONTEND_URL:"http://localhost:3000",GAIA_BACKEND_URL:"http://gaia-backend:80",SETUP_MODE:"selfhost"},developer:{HOST:"http://localhost:8000",FRONTEND_URL:"http://localhost:3000",GAIA_BACKEND_URL:"http://host.docker.internal:8000",SETUP_MODE:"developer"}};function mt(e,t){return dt[t][e]??Nt[t][e]}async function Gt(e){let t=ge.join(e,"apps/api/scripts/dump_config_schema.py"),o=ge.join(e,"apps/api/app/config/settings_validator.py"),r=ge.join(e,"apps/api/app/config/settings.py");if(!he.existsSync(t))throw new Error("dump_config_schema.py not found in apps/api/scripts");try{try{let{stdout:n}=await Ft("python3",[t,o,r],{cwd:e});return JSON.parse(n)}catch{let{stdout:n}=await Ft("python",[t,o,r],{cwd:e});return JSON.parse(n)}}catch(n){throw new Error(`Failed to parse settings schema: ${n.message}. Ensure python is installed.`)}}function $t(e){let t=ge.join(e,"apps","web",".env.local"),o=he.existsSync(t)?t:ge.join(e,"apps","web",".env");if(!he.existsSync(o))return[];let r=he.readFileSync(o,"utf-8"),n=[],s="General";for(let c of r.split(`
|
|
4
|
+
`)){let a=c.trim();if(a.startsWith("#")&&!a.startsWith("#=")){let T=a.replace(/^#+\s*/,"").trim();T&&!T.startsWith("These are")&&(s=T);continue}if(!a||a.startsWith("#"))continue;let l=a.indexOf("=");if(l===-1)continue;let p=a.substring(0,l).trim(),x=a.substring(l+1).trim();n.push({name:p,value:x,category:s})}return n}function qt(e,t){return{NEXT_PUBLIC_API_BASE_URL:`http://localhost:${t?.[8e3]??8e3}/api/v1/`}}function jt(e,t,o){let r=o==="selfhost"?new Set(Object.keys(dt.selfhost)):new Set;for(let[n,s]of Object.entries(t)){let c=Number(n),a=Number(s);for(let[l,p]of Object.entries(e)){if(r.has(l))continue;if(p===String(c)){e[l]=String(a);continue}let x=new RegExp(`:${c}(?=[/\\s]|$)`,"g");e[l]=p.replaceAll(x,`:${a}`)}}}function Ht(e,t){return e.map(o=>({...o,variables:o.variables.map(r=>{let n=mt(r.name,t);return{...r,defaultValue:n||r.defaultValue}})}))}function ft(){return Object.keys(dt.selfhost)}function Wt(e){return{...Nt[e]}}import*as W from"fs";import*as Se from"path";function gt(e){W.existsSync(e)&&W.copyFileSync(e,`${e}.bak`)}function Ut(e,t){let o=Se.join(e,".env");gt(o);let r=["# GAIA Environment Configuration","# Generated by GAIA CLI",`# Created: ${new Date().toISOString()}`,""],n=["MONGO","REDIS","POSTGRES","CHROMADB","RABBITMQ","WORKOS","GOOGLE","OPENAI","INFISICAL","LANGSMITH","DISCORD","SLACK","TELEGRAM","CLOUDINARY","COMPOSIO","FIRECRAWL","LIVEKIT","DEEPGRAM","ELEVENLABS","RESEND","SENTRY","POSTHOG","MEM0","E2B","DODO","NEXT_PUBLIC","GAIA"];function s(a){for(let p of n)if(a===p||a.startsWith(`${p}_`))return p;let l=a.split("_");return l.length===1?"Core":l[0]||"Core"}let c=new Map;for(let[a,l]of Object.entries(t)){let p=s(a);c.has(p)||c.set(p,[]);let T=/[\s#"'\\]/.test(l)||l===""?`"${l.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:l;c.get(p).push(`${a}=${T}`)}for(let[a,l]of c.entries())r.push(`# ${a} Configuration`),r.push(...l),r.push("");W.writeFileSync(o,r.join(`
|
|
5
|
+
`),"utf-8")}function Xt(e,t,o){let r=Se.join(e,"apps","web",".env.local");gt(r);let n=$t(e),s=qt(t,o),c=["# GAIA Web App Environment Configuration","# Generated by GAIA CLI",`# Created: ${new Date().toISOString()}`,""],a=new Map;for(let l of n){a.has(l.category)||a.set(l.category,[]);let p=s[l.name]??l.value;a.get(l.category).push({name:l.name,value:p})}if(n.length===0){c.push("# Core URLs");for(let[l,p]of Object.entries(s))c.push(`${l}=${p}`);c.push("")}else for(let[l,p]of a.entries()){c.push(`# ${l}`);for(let{name:x,value:T}of p)c.push(`${x}=${T}`);c.push("")}W.writeFileSync(r,c.join(`
|
|
6
|
+
`),"utf-8")}var Qt={8e3:"API_HOST_PORT",5432:"POSTGRES_HOST_PORT",6379:"REDIS_HOST_PORT",27017:"MONGO_HOST_PORT",5672:"RABBITMQ_HOST_PORT",8080:"CHROMADB_HOST_PORT",8083:"MONGO_EXPRESS_HOST_PORT",3e3:"WEB_HOST_PORT"};function Yt(e,t,o){let r=Se.join(e,"infra","docker",".env");gt(r);let n=["# Docker Compose environment overrides","# Generated by GAIA CLI",`# Created: ${new Date().toISOString()}`,""];for(let[s,c]of Object.entries(t)){let a=Number(s),l=Qt[a];l&&n.push(`${l}=${c}`)}if(o==="selfhost"){let s=t[8e3]??8e3;n.push(""),n.push("# Web build args"),n.push(`NEXT_PUBLIC_API_BASE_URL=http://localhost:${s}/api/v1/`)}n.push(""),W.writeFileSync(r,n.join(`
|
|
7
|
+
`),"utf-8")}function xe(e){let t={};for(let[o,r]of Object.entries(e)){let n=Number(o),s=Qt[n];s&&(t[s]=String(r))}return t}function Kt(e){let t=Se.join(e,"infra","docker","docker-compose.yml");if(!W.existsSync(t))return;let o=W.readFileSync(t,"utf-8"),r=[{varName:"API_HOST_PORT",hostPort:8e3,containerPort:80},{varName:"CHROMADB_HOST_PORT",hostPort:8080,containerPort:8e3},{varName:"POSTGRES_HOST_PORT",hostPort:5432,containerPort:5432},{varName:"REDIS_HOST_PORT",hostPort:6379,containerPort:6379},{varName:"MONGO_HOST_PORT",hostPort:27017,containerPort:27017},{varName:"RABBITMQ_HOST_PORT",hostPort:5672,containerPort:5672},{varName:"MONGO_EXPRESS_HOST_PORT",hostPort:8083,containerPort:8081},{varName:"WEB_HOST_PORT",hostPort:3e3,containerPort:3e3}],n=!1;for(let{varName:s,hostPort:c,containerPort:a}of r){let l=`"${c}:${a}"`,p=`"\${${s}:-${c}}:${a}"`;o.includes(l)&&(o=o.replaceAll(l,p),n=!0)}n&&W.writeFileSync(t,o,"utf-8")}var Vt={API_HOST_PORT:8e3,POSTGRES_HOST_PORT:5432,REDIS_HOST_PORT:6379,MONGO_HOST_PORT:27017,RABBITMQ_HOST_PORT:5672,CHROMADB_HOST_PORT:8080,MONGO_EXPRESS_HOST_PORT:8083,WEB_HOST_PORT:3e3};function ye(e){let t=Se.join(e,"infra","docker",".env"),o={};if(!W.existsSync(t))return o;let r=W.readFileSync(t,"utf-8");for(let n of r.split(`
|
|
8
|
+
`)){let s=n.trim();if(s&&!s.startsWith("#")){let[c,...a]=s.split("=");if(c&&Vt[c]){let l=a.join("=").trim().replace(/^["']|["']$/g,""),p=Number(l);!Number.isNaN(p)&&p>0&&p<=65535&&(o[Vt[c]]=p)}}}return o}var oo=e=>new Promise(t=>setTimeout(t,e));async function Ge(e){e.setStep("Setup Mode"),e.setStatus("Choose how to run GAIA...");let t=await e.waitForInput("setup_mode");return e.updateData("setupMode",t),t}async function $e(e,t,o,r){e.setStep("Environment Setup"),e.setStatus("Configuring environment..."),e.updateData("setupMode",o),e.setStatus("Configuring environment variables...");let n=await e.waitForInput("env_method");e.updateData("envMethod",n);let s={};s.ENV="development";let c=ft();for(let l of c){let p=mt(l,o);p&&(s[l]=p)}let a=Wt(o);for(let[l,p]of Object.entries(a))s[l]=p;if(n==="infisical")await no(e,s),e.setStatus("Infisical credentials saved. Ensure your Infisical project contains all required variables.");else try{await io(e,t,s,o)}catch(l){e.setError(l);return}r&&jt(s,r,o);try{await ao(e,t,s,o,r)}catch(l){e.setError(l);return}await oo(1e3)}async function no(e,t){e.setStatus("Configuring Infisical...");let o=await e.waitForInput("env_infisical");t.INFISICAL_TOKEN=o.INFISICAL_TOKEN,t.INFISICAL_PROJECT_ID=o.INFISICAL_PROJECT_ID,t.INFISICAL_MACHINE_IDENTITY_CLIENT_ID=o.INFISICAL_MACHINE_IDENTITY_CLIENT_ID,t.INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET=o.INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET}async function io(e,t,o,r){e.setStatus("Parsing environment variables...");let n;try{n=await Gt(t),n=Ht(n,r)}catch(m){throw r==="selfhost"?new Error(`Manual environment setup requires Python to parse config schema.
|
|
9
9
|
For self-host mode, we recommend using Infisical for secret management.
|
|
10
10
|
Alternatively, install Python 3.11+ and try again.
|
|
11
11
|
|
|
12
|
-
Original error: ${m.message}`):new Error(`Failed to parse settings: ${m.message}`)}let s=new Set,
|
|
12
|
+
Original error: ${m.message}`):new Error(`Failed to parse settings: ${m.message}`)}let s=new Set,c=[],a=new Set;for(let m of n)if(m.alternativeGroup&&!a.has(m.name)){let d=n.find(h=>h.name===m.alternativeGroup);d&&(c.push([m,d]),s.add(m.name),s.add(d.name),a.add(m.name),a.add(d.name))}let l=n.filter(m=>m.variables.length===1&&!s.has(m.name)),p=n.filter(m=>m.variables.length>1&&!s.has(m.name));for(let m of c){e.updateData("alternativeGroups",m),e.setStatus("Choose an AI provider...");let d=await e.waitForInput("env_alternatives");for(let[h,v]of Object.entries(d.values))v&&(o[h]=v)}let x=ft(),y=[...l.flatMap(m=>m.variables).filter(m=>!x.includes(m.name))].sort((m,d)=>m.required&&!d.required?-1:!m.required&&d.required?1:0);e.updateData("envVarTotal",y.length);for(let m=0;m<y.length;m++){let d=y[m];if(!d)continue;e.updateData("currentEnvVar",d),e.updateData("envVarIndex",m),e.setStatus(`Configuring ${d.name}...`);let h=await e.waitForInput("env_var",{varName:d.name});(h||d.required||d.defaultValue)&&(o[d.name]=h||d.defaultValue||"")}let S=[...p].filter(m=>!m.variables.every(d=>x.includes(d.name))).sort((m,d)=>{let h=m.variables.some(I=>I.required),v=d.variables.some(I=>I.required);return h&&!v?-1:!h&&v?1:0});e.updateData("envGroupTotal",S.length);for(let m=0;m<S.length;m++){let d=S[m];if(!d)continue;e.updateData("currentEnvGroup",d),e.updateData("envGroupIndex",m),e.setStatus(`Configuring ${d.name}...`);let h=await e.waitForInput("env_group",{groupName:d.name});for(let[v,I]of Object.entries(h)){let C=d.variables.find(k=>k.name===v);(I||C?.required||C?.defaultValue)&&(o[v]=I||C?.defaultValue||"")}}}async function ao(e,t,o,r,n){e.setStatus("Writing API environment file...");try{let c=Jt.join(t,"apps","api");Ut(c,o),e.setStatus("API environment variables configured!")}catch(c){throw new Error(`Failed to write API .env file: ${c.message}`)}e.setStatus("Writing web environment file...");try{Xt(t,r,n),e.setStatus("Web environment variables configured!")}catch(c){throw new Error(`Failed to write web .env file: ${c.message}`)}let s=n&&Object.keys(n).length>0;if(s||r==="selfhost"){e.setStatus("Writing Docker Compose environment...");try{s&&Kt(t),Yt(t,n??{},r),e.setStatus("Docker Compose environment configured!")}catch(c){throw new Error(`Failed to write Docker Compose .env: ${c.message}`)}}}import{execa as so}from"execa";import qe from"fs";import co from"simple-git";async function zt(e,t,o,r){if(qe.existsSync(e)){let n=`${e}/.git`;if(!qe.existsSync(n))throw new Error(`Directory ${e} exists but is not a git repository`);await co().cwd(e).pull(),o(100,"Already exists, pulled latest")}else try{let n=["clone","--progress"];r&&n.push("--branch",r),n.push(t,e);let s=so("git",n);s.stderr?.on("data",c=>{let a=c.toString();a.includes("Counting objects")?o(5,"Counting objects"):a.includes("Compressing objects")&&o(10,"Compressing objects");let l=a.match(/Receiving objects:\s+(\d+)%\s+\((\d+)\/(\d+)\)/);if(l?.[1]){let x=Math.min(100,parseInt(l[1],10)),T=l[2],y=l[3];o(10+Math.floor(x*.5),`Receiving objects: ${T}/${y}`)}let p=a.match(/Resolving deltas:\s+(\d+)%\s+\((\d+)\/(\d+)\)/);if(p?.[1]){let x=Math.min(100,parseInt(p[1],10)),T=p[2],y=p[3];o(60+Math.floor(x*.4),`Resolving deltas: ${T}/${y}`)}}),await s,o(100,"Clone complete")}catch(n){throw qe.existsSync(e)&&qe.rmSync(e,{recursive:!0,force:!0}),n}}import{execSync as ht}from"child_process";import*as M from"fs";import*as je from"os";import*as q from"path";var ke=process.platform==="win32";function Ae(e){try{return ht(e,{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return null}}function Zt(){let e=Ae("npm config get prefix");return e?ke?e:q.join(e,"bin"):null}function er(){let e=Ae("pnpm bin -g");if(e&&M.existsSync(e))return e;let t=Ae("pnpm root -g");if(t){let o=q.join(q.dirname(t),"bin");if(M.existsSync(o))return o}return null}function tr(){let e=q.join(je.homedir(),".bun","bin");return M.existsSync(e)?e:null}function rr(){let e=Ae("yarn global bin");return e&&M.existsSync(e)?e:null}function uo(){let e=ke?"gaia.cmd":"gaia";for(let t of[Zt,er,tr,rr]){let o=t();if(o&&M.existsSync(q.join(o,e)))return o}if(ke)for(let t of[Zt,er,tr,rr]){let o=t();if(o&&M.existsSync(q.join(o,"gaia")))return o}return null}function po(){try{return ht(ke?"where gaia":"command -v gaia",{stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function mo(){let e=process.env.SHELL||"",t=je.homedir();if(e.includes("zsh"))return q.join(t,".zshrc");if(e.includes("bash")){let o=q.join(t,".bashrc"),r=q.join(t,".bash_profile");return M.existsSync(o)?o:r}return e.includes("fish")?q.join(t,".config","fish","config.fish"):null}function fo(e,t){try{if((M.existsSync(t)?M.readFileSync(t,"utf-8"):"").includes(e))return!0;let n=t.includes("fish")?`
|
|
13
13
|
set -gx PATH "${e}" $PATH # Added by GAIA CLI
|
|
14
14
|
`:`
|
|
15
15
|
export PATH="${e}:$PATH" # Added by GAIA CLI
|
|
16
|
-
`;return M.appendFileSync(t,n),!0}catch{return!1}}function
|
|
16
|
+
`;return M.appendFileSync(t,n),!0}catch{return!1}}function go(e){try{let t=Ae(`powershell -Command "[Environment]::GetEnvironmentVariable('Path', 'User')"`);if(t&&t.includes(e))return!0;ht(`setx PATH "${e};${t||""}"`,{stdio:["pipe","pipe","pipe"]});let o=q.join(je.homedir(),"Documents","PowerShell","Microsoft.PowerShell_profile.ps1"),r=q.dirname(o);return M.existsSync(r)||M.mkdirSync(r,{recursive:!0}),(M.existsSync(o)?M.readFileSync(o,"utf-8"):"").includes(e)||M.appendFileSync(o,`
|
|
17
17
|
$env:Path = "${e};" + $env:Path # Added by GAIA CLI
|
|
18
|
-
`),!0}catch{return!1}}async function
|
|
19
|
-
`);for(let s of n)if(s.includes(`:${e}`)&&s.includes("LISTENING")){let
|
|
20
|
-
`);if(n.length>1)return n[1]?.split(/\s+/)?.[0]||void 0}catch{}}async function xo(e,t,o){for(let r=e;r<=t;r++)if(await o(r))return r;return null}import*as N from"fs";import*as Q from"path";var
|
|
21
|
-
`).filter(C=>C.trim()!==""),I=[...h,...
|
|
18
|
+
`),!0}catch{return!1}}async function St(){if(po())return{success:!0,message:"gaia command is ready.",inPath:!0,pathAdded:!1};let e=uo();if(!e)return{success:!1,message:"Could not find gaia binary. Run manually: npm install -g @heygaia/cli",inPath:!1,pathAdded:!1};if(ke)return go(e)?{success:!0,message:"Added to PATH. Restart your terminal for the 'gaia' command to be available.",inPath:!1,pathAdded:!0}:{success:!1,message:`Add to your PATH manually: setx PATH "${e};%PATH%"`,inPath:!1,pathAdded:!1};let t=mo();if(!t)return{success:!1,message:`Add to your PATH: export PATH="${e}:$PATH"`,inPath:!1,pathAdded:!1};if(fo(e,t)){let r=q.basename(t);return{success:!0,message:`Added to PATH via ~/${r}. Restart terminal or run: source ~/${r}`,inPath:!1,pathAdded:!0}}return{success:!1,message:`Could not write to ${t}. Add manually: export PATH="${e}:$PATH"`,inPath:!1,pathAdded:!1}}import{execa as te}from"execa";var X={git:"https://git-scm.com/downloads",docker:"https://docs.docker.com/get-docker/",mise:"https://mise.jdx.dev/getting-started.html"},ho={8e3:"API Server",5432:"PostgreSQL",6379:"Redis",27017:"MongoDB",5672:"RabbitMQ",3e3:"Web Frontend",8080:"ChromaDB",8083:"Mongo Express"};async function He(){try{return await te("git",["--version"]),"success"}catch{return"error"}}async function Te(){let e=!1,t=!1,o;try{await te("docker",["--version"]),e=!0}catch{return{name:"Docker",installUrl:X.docker,installed:!1,working:!1,errorMessage:"Docker is not installed"}}try{await te("docker",["info"],{timeout:5e3}),t=!0}catch{o="Docker is installed but the daemon is not running. Please start Docker Desktop or the Docker daemon."}return{name:"Docker",installUrl:X.docker,installed:e,working:t,errorMessage:o}}async function ve(){try{return await te("mise",["--version"]),"success"}catch{return"missing"}}async function We(){if((await import("node:os")).platform()==="win32")try{return await te("powershell",["-Command","irm https://mise.jdx.dev/install.ps1 | iex"]),!0}catch{return!1}try{return await te("sh",["-c","curl https://mise.jdx.dev/install.sh | sh"]),!0}catch{return!1}}async function Ve(e){let t=await import("node:net"),o=[],r=n=>new Promise(s=>{let c=t.createServer();c.once("error",()=>s(!1)),c.once("listening",()=>{c.close(()=>s(!0))}),c.listen(n)});for(let n of e){let s=ho[n]||`Port ${n}`;if(await r(n))o.push({port:n,service:s,available:!0});else{let a=await So(n),l=await xo(n+1,n+100,r);o.push({port:n,service:s,available:!1,usedBy:a,alternative:l||void 0})}}return o}async function So(e){if((await import("node:os")).platform()==="win32"){try{let{stdout:r}=await te("netstat",["-ano","-p","TCP"]),n=r.trim().split(`
|
|
19
|
+
`);for(let s of n)if(s.includes(`:${e}`)&&s.includes("LISTENING")){let c=s.trim().split(/\s+/),a=c[c.length-1];if(a)try{let{stdout:l}=await te("tasklist",["/FI",`PID eq ${a}`,"/FO","CSV","/NH"]);return l.trim().split(",")[0]?.replace(/"/g,"")||`PID ${a}`}catch{return`PID ${a}`}}}catch{}return}try{let{stdout:r}=await te("lsof",["-i",`:${e}`,"-sTCP:LISTEN","-P","-n"]),n=r.trim().split(`
|
|
20
|
+
`);if(n.length>1)return n[1]?.split(/\s+/)?.[0]||void 0}catch{}}async function xo(e,t,o){for(let r=e;r<=t;r++)if(await o(r))return r;return null}import*as N from"fs";import*as Q from"path";var yo=e=>new Promise(t=>setTimeout(t,e)),To="dev-start.log";var nr=".gaia-dev.pid";function ir(e){let t=Q.join(e,".env");return N.existsSync(t)?["--env-file",".env"]:[]}async function Be(e,t,o,r,n,s){if(t==="selfhost"){let c=s?.build??!1,a=s?.pull??!1;o?.(c?"Building and starting all services in Docker...":"Starting all services in Docker (selfhost mode)...");let l=Q.join(e,"infra/docker"),p=ir(l),x=r&&Object.keys(r).length>0?xe(r):void 0,T=["compose","-f","docker-compose.selfhost.yml",...p,"up","-d","--remove-orphans"];c&&T.push("--build"),a&&T.push("--pull","always");let y=c?900*1e3:300*1e3;await V("docker",T,l,void 0,n,x,y),o?.("All services started in Docker!")}else{o?.("Starting development servers...");let{spawn:c}=await import("child_process"),a=Q.join(e,To),l=Q.join(e,nr),p=N.openSync(a,"w"),x;try{x=c("mise",["dev"],{cwd:e,stdio:["ignore",p,p],detached:!0,shell:!0}),x.unref()}finally{N.closeSync(p)}if(x.pid!=null&&N.writeFileSync(l,String(x.pid),"utf-8"),await yo(1500),x.pid!=null)try{process.kill(x.pid,0)}catch{throw new Error(`Development servers crashed on startup. Check logs at: ${a}`)}o?.(`Development servers started! Logs: ${a}`)}}async function ar(e,t,o){let r=Q.join(e,"infra/docker"),n=await xt(e);t?.("Stopping Docker services...");try{let s=ir(r),c=n==="selfhost"?["compose","-f","docker-compose.selfhost.yml",...s,"down"]:["compose",...s,"down"];await V("docker",c,r)}catch{}if(n!=="selfhost"){t?.("Stopping local processes...");let s=Q.join(e,nr),c=!1;if(N.existsSync(s)){try{let a=Number.parseInt(N.readFileSync(s,"utf-8").trim(),10);if(!Number.isNaN(a)&&a>0)try{process.kill(-a,"SIGTERM"),c=!0}catch{}}catch{}try{N.unlinkSync(s)}catch{}}if(!c)try{let a=o?.[8e3]??8e3,l=o?.[3e3]??3e3;if(process.platform==="win32")for(let p of[a,l])try{await V("powershell",["-Command",`Get-NetTCPConnection -LocalPort ${p} -ErrorAction SilentlyContinue | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force -ErrorAction SilentlyContinue }`],e)}catch{}else for(let p of[a,l])try{await V("sh",["-c",`lsof -ti :${p} -sTCP:LISTEN | xargs kill 2>/dev/null || true`],e)}catch{}}catch{}}t?.("All services stopped.")}async function xt(e){let t=Q.join(e,"apps","api",".env");if(!N.existsSync(t))return null;let o=N.readFileSync(t,"utf-8"),r=o.match(/^SETUP_MODE=(.+)$/m);if(r?.[1]){let n=r[1].trim().replace(/^["']|["']$/g,"");if(n==="selfhost"||n==="developer")return n}return o.includes("mongodb://mongo:")?"selfhost":(o.includes("mongodb://localhost:"),"developer")}async function V(e,t,o,r,n,s,c){let{spawn:a}=await import("child_process");return new Promise((l,p)=>{let x=a(e,t,{cwd:o,stdio:["ignore","pipe","pipe"],shell:!0,env:s?{...process.env,...s}:void 0}),T="",y=0,S=!1,m;c&&(m=setTimeout(()=>{S=!0,x.kill("SIGTERM"),p(new Error(`Command timed out after ${Math.round(c/6e4)}m. Check \`docker compose logs\` to debug.`))},c)),x.stdout?.on("data",d=>{let h=d.toString();T+=h,n?.(h),y=Math.min(y+5,95),r?.(y)}),x.stderr?.on("data",d=>{let h=d.toString();T+=h,n?.(h),y=Math.min(y+5,95),r?.(y)}),x.on("close",d=>{m&&clearTimeout(m),!S&&(d===0?(r?.(100),l()):p(new Error(`Command failed with code ${d}: ${T.slice(-500)}`)))}),x.on("error",d=>{m&&clearTimeout(m),!S&&p(d)})})}function z(e){let t=e||process.cwd();for(;t!==Q.dirname(t);){if(N.existsSync(Q.join(t,"apps/api/app/config/settings_validator.py")))return t;t=Q.dirname(t)}let o=pt();if(o?.repoPath){if(N.existsSync(Q.join(o.repoPath,"apps/api/app/config/settings_validator.py")))return o.repoPath;console.warn(`Warning: Saved repo path "${o.repoPath}" is no longer a valid GAIA installation. Resetting config.`),De({repoPath:"",setupComplete:!1})}return null}var vo=process.env.GAIA_CLI_DEV==="true",Z=e=>new Promise(t=>setTimeout(t,e));async function cr(e,t){e.setStep("Welcome"),e.setStatus("Waiting for user input..."),await e.waitForInput("welcome");let o=d=>{let h=e.currentState.data.dependencyLogs||[],v=d.split(`
|
|
21
|
+
`).filter(C=>C.trim()!==""),I=[...h,...v].slice(-30);e.updateData("dependencyLogs",I)};e.setStep("Prerequisites"),e.setStatus("Checking system requirements..."),e.updateData("checks",{git:"pending",docker:"pending",mise:"pending"}),await Z(800),e.setStatus("Checking Git...");let r=await He();e.updateData("checks",{...e.currentState.data.checks,git:r}),e.setStatus("Checking Docker...");let n=await Te(),s=n.working?"success":"error";e.updateData("checks",{...e.currentState.data.checks,docker:s}),n.working||e.updateData("dockerError",n.errorMessage),e.setStatus("Checking Mise...");let c=await ve();e.updateData("checks",{...e.currentState.data.checks,mise:c}),c==="missing"&&(e.setStatus("Installing Mise..."),c=await We()?"success":"error",e.updateData("checks",{...e.currentState.data.checks,mise:c}));let a=[];if(r==="error"&&a.push({name:"Git"}),s==="error"&&a.push({name:"Docker",message:n.errorMessage}),a.length>0){let d=[];d.push("Prerequisites failed:");for(let h of a)d.push(` \u2022 ${h.name}: ${h.message||"Not installed or not working"}`);d.push(`
|
|
22
22
|
Installation guides:`),r==="error"&&d.push(` \u2022 Git: ${X.git}`),s==="error"&&(n.installed?d.push(" \u2022 Docker: Start Docker Desktop or run 'sudo systemctl start docker'"):d.push(` \u2022 Docker: ${X.docker}`)),e.setError(new Error(d.join(`
|
|
23
|
-
`)));return}e.setStatus("Checking Ports...");let p=await
|
|
24
|
-
`)
|
|
25
|
-
`).map(
|
|
26
|
-
|
|
27
|
-
`)
|
|
23
|
+
`)));return}e.setStatus("Checking Ports...");let p=await Ve([8e3,5432,6379,27017,5672,3e3,8080,8083]),x={},T=p.filter(d=>!d.available);if(T.length>0){let d=T.filter(v=>!v.alternative);if(d.length>0){e.setError(new Error(`Cannot find free alternative ports for: ${d.map(v=>`${v.port} (${v.service})`).join(", ")}. Free these ports and try again.`));return}if(e.updateData("portConflicts",p),await e.waitForInput("port_conflicts")==="abort"){e.setError(new Error("Port conflicts not resolved. Please free the ports and try again."));return}for(let v of p)!v.available&&v.alternative&&(x[v.port]=v.alternative)}e.updateData("portOverrides",x),e.setStatus("Prerequisites check complete!"),await Z(1e3);let y=await Ge(e),S="";if(vo){if(S=z()||"",!S){e.setError(new Error("DEV_MODE: Could not find workspace root. Run from within the gaia repo."));return}e.setStep("Repository Setup"),e.setStatus("[DEV MODE] Using current workspace..."),await Z(500),e.setStatus("Repository ready!")}else{e.setStep("Repository Setup");let d=y==="selfhost"?se.join(sr.homedir(),"gaia"):se.resolve("gaia"),h=!0;for(S=d;;){if(S=await e.waitForInput("repo_path",{default:d}),se.isAbsolute(S)||(S=se.resolve(S)),re.existsSync(S)){if(!re.statSync(S).isDirectory()){e.setError(new Error(`Path ${S} exists and is not a directory.`)),await Z(2e3),e.setError(null);continue}if(re.existsSync(se.join(S,"apps/api/app/config/settings_validator.py"))){e.updateData("existingRepoPath",S);let k=await e.waitForInput("existing_repo");if(k==="use_existing"){h=!1;break}else if(k==="delete_reclone"){e.setStatus("Removing existing installation...");try{re.rmSync(S,{recursive:!0,force:!0})}catch(P){e.setError(new Error(`Failed to remove directory: ${P.message}
|
|
24
|
+
Try removing it manually: rm -rf "${S}"`));return}break}else{if(k==="different_path")continue;e.setError(new Error("Setup cancelled by user."));return}}if(re.readdirSync(S).length>0){e.setError(new Error(`Directory ${S} is not empty and is not a GAIA installation. Please choose another path.`)),await Z(2e3),e.setError(null);continue}}break}if(h){e.setStep("Repository Setup"),e.setStatus("Preparing repository..."),e.updateData("repoProgress",0),e.updateData("repoPhase","");try{await zt(S,"https://github.com/theexperiencecompany/gaia.git",(v,I)=>{e.updateData("repoProgress",v),I?(e.updateData("repoPhase",I),e.setStatus(`${I}...`)):e.setStatus(`Cloning repository to ${S}... ${v}%`)},t),e.setStatus("Repository ready!")}catch(v){e.setError(v);return}}else e.setStatus("Using existing repository!")}if(await Z(1e3),await $e(e,S,y,x),e.currentState.error)return;if(y==="selfhost"){e.setStep("Installing CLI"),e.setStatus("Installing gaia CLI globally...");try{await V("npm",["install","-g","@heygaia/cli"],S,void 0,k=>{let P=k.split(`
|
|
25
|
+
`).map(be=>be.replace(/\x1b\[[0-9;]*m/g,"").trim()).filter(be=>be.length>0);if(P.length===0)return;let de=e.currentState.data.cliInstallLogs||[];e.updateData("cliInstallLogs",[...de,...P].slice(-30))}),e.setStatus("Verifying PATH...");let C=await St();C.inPath?e.setStatus("CLI installed! gaia command is ready."):(C.pathAdded,e.setStatus(C.message))}catch{e.setStatus("CLI install failed. Install manually: npm install -g @heygaia/cli")}await Z(500),e.setStep("Project Setup"),e.setStatus("Building and starting all services in Docker..."),e.updateData("dependencyPhase","Building and starting Docker services..."),e.updateData("dependencyProgress",0),e.updateData("dependencyLogs",[]),e.updateData("dependencyComplete",!1);let d=I=>{let C=I.split(`
|
|
26
|
+
`).map(P=>P.replace(/\x1b\[[0-9;]*m/g,"").trim()).filter(P=>P.length>0);if(C.length===0)return;let k=e.currentState.data.dependencyLogs||[];e.updateData("dependencyLogs",[...k,...C].slice(-30))},h=!1;try{e.setStatus("Pulling pre-built images from registry..."),await Be(S,"selfhost",I=>e.setStatus(I),x,d,{pull:!0}),h=!0}catch(I){let C=I.message?.split(`
|
|
27
|
+
`)[0]??"unknown error";e.setStatus(`Registry pull failed (${C}) \u2014 building images locally (this takes a few minutes)...`)}if(!h)try{await Be(S,"selfhost",I=>e.setStatus(I),x,d,{build:!0})}catch(I){e.setError(new Error(`Failed to start services: ${I.message}`));return}e.updateData("dependencyProgress",100),e.updateData("dependencyComplete",!0);let v=e.currentState.data.envMethod||"manual";Ne({version:Fe,setupComplete:!0,setupMethod:v,repoPath:S,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}),e.updateData("setupMode",y),e.setStep("Finished"),e.setStatus("Setup complete! GAIA is running."),await e.waitForInput("exit");return}if(c==="error"){e.setError(new Error(`Developer mode requires Mise but it failed to install.
|
|
28
|
+
\u2022 Mise: ${X.mise}`));return}e.setStep("Install Tools"),e.setStatus("Installing toolchain..."),e.updateData("dependencyPhase","Initializing mise..."),e.updateData("dependencyProgress",0),e.updateData("dependencyLogs",[]);try{e.updateData("dependencyPhase","Trusting mise configuration..."),await V("mise",["trust"],S,void 0,o),e.updateData("dependencyProgress",50),e.updateData("dependencyPhase","Installing tools (node, python, uv, nx)..."),await V("mise",["install"],S,d=>{e.updateData("dependencyProgress",50+d*.5)},o),e.updateData("dependencyProgress",100),e.updateData("toolComplete",!0)}catch(d){e.setError(new Error(`Failed to install tools: ${d.message}`));return}await Z(1e3),e.setStep("Project Setup"),e.updateData("dependencyPhase","Setting up project..."),e.updateData("dependencyProgress",0),e.updateData("dependencyComplete",!1),e.updateData("repoPath",S),e.updateData("dependencyLogs",[]);try{e.updateData("dependencyProgress",0),e.updateData("dependencyPhase","Running mise setup (all dependencies)...");let d=Object.keys(x).length>0?xe(x):void 0;await V("mise",["setup"],S,h=>{e.updateData("dependencyProgress",h)},o,d),e.updateData("dependencyProgress",100),e.updateData("dependencyPhase","Setup complete!"),e.updateData("dependencyComplete",!0)}catch(d){e.setError(new Error(`Failed to setup project: ${d.message}`));return}await Z(1e3);let m=e.currentState.data.envMethod||"manual";Ne({version:Fe,setupComplete:!0,setupMethod:m,repoPath:S,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}),e.setStep("Installing CLI"),e.setStatus("Installing gaia CLI globally...");try{await V("npm",["install","-g","@heygaia/cli"],S,void 0,v=>{let I=v.split(`
|
|
29
|
+
`).map(k=>k.replace(/\x1b\[[0-9;]*m/g,"").trim()).filter(k=>k.length>0);if(I.length===0)return;let C=e.currentState.data.cliInstallLogs||[];e.updateData("cliInstallLogs",[...C,...I].slice(-30))}),e.setStatus("Verifying PATH...");let h=await St();h.inPath?e.setStatus("CLI installed! gaia command is ready."):(h.pathAdded,e.setStatus(h.message))}catch{e.setStatus("CLI install failed. Install manually: npm install -g @heygaia/cli")}await Z(500),e.setStep("Finished"),e.setStatus("Setup complete!"),await e.waitForInput("exit")}async function lr(e={}){let t=J(),{unmount:o}=bo(Io.createElement(K,{store:t,command:"init"})),r=()=>{o(),process.exit(130)};process.once("SIGINT",r),process.once("SIGTERM",r);try{await cr(t,e.branch)}catch(n){t.setError(n)}finally{process.off("SIGINT",r),process.off("SIGTERM",r)}t.currentState.error&&await t.waitForInput("exit"),o(),process.exit(t.currentState.error?1:0)}import{render as Co}from"ink";import Eo from"react";var Ue=e=>new Promise(t=>setTimeout(t,e));async function ur(e){e.setStep("Detect Repo"),e.setStatus("Looking for GAIA repository...");let t=z();if(!t){e.setError(new Error("Could not find GAIA repository. Run this command from within a cloned gaia repo, or use 'gaia init' to set up from scratch."));return}e.updateData("repoPath",t),e.setStatus(`Found repository at ${t}`),await Ue(1e3),e.setStep("Prerequisites"),e.setStatus("Checking system requirements..."),e.updateData("checks",{git:"pending",docker:"pending",mise:"pending"}),await Ue(500);let o=await He();e.updateData("checks",{...e.currentState.data.checks,git:o});let r=await Te(),n=r.working?"success":"error";e.updateData("checks",{...e.currentState.data.checks,docker:n}),r.working||e.updateData("dockerError",r.errorMessage);let s=await ve();e.updateData("checks",{...e.currentState.data.checks,mise:s}),s==="missing"&&(e.setStatus("Installing Mise..."),s=await We()?"success":"error",e.updateData("checks",{...e.currentState.data.checks,mise:s}));let c=[];if(o==="error"&&c.push({name:"Git"}),n==="error"&&c.push({name:"Docker",message:r.errorMessage}),c.length>0){let m=[];m.push("Prerequisites failed:");for(let d of c)m.push(` \u2022 ${d.name}: ${d.message||"Not installed or not working"}`);m.push(`
|
|
28
30
|
Installation guides:`),o==="error"&&m.push(` \u2022 Git: ${X.git}`),n==="error"&&(r.installed?m.push(" \u2022 Docker: Start Docker Desktop or run 'sudo systemctl start docker'"):m.push(` \u2022 Docker: ${X.docker}`)),e.setError(new Error(m.join(`
|
|
29
|
-
`)));return}e.setStatus("Checking Ports...");let
|
|
31
|
+
`)));return}e.setStatus("Checking Ports...");let l=await Ve([8e3,5432,6379,27017,5672,3e3,8080,8083]),p={},x=l.filter(m=>!m.available);if(x.length>0){let m=x.filter(h=>!h.alternative);if(m.length>0){e.setError(new Error(`Cannot find free alternative ports for: ${m.map(h=>`${h.port} (${h.service})`).join(", ")}. Free these ports and try again.`));return}if(e.updateData("portConflicts",l),await e.waitForInput("port_conflicts")==="abort"){e.setError(new Error("Port conflicts not resolved. Please free the ports and try again."));return}for(let h of l)!h.available&&h.alternative&&(p[h.port]=h.alternative)}e.updateData("portOverrides",p),e.setStatus("Prerequisites check complete!"),await Ue(1e3);let T=await Ge(e);if(await $e(e,t,T,p),e.currentState.error)return;if(T==="selfhost"){let m=e.currentState.data.envMethod||"manual";De({setupComplete:!0,setupMethod:m,repoPath:t}),e.setStep("Finished"),e.setStatus("Setup complete! Run 'gaia start' to build and start all services in Docker."),await e.waitForInput("exit");return}if(s==="error"){e.setError(new Error(`Developer mode requires Mise but it failed to install.
|
|
30
32
|
\u2022 Mise: ${X.mise}`));return}e.setStep("Project Setup"),e.updateData("dependencyPhase","Setting up project..."),e.updateData("dependencyProgress",0),e.updateData("dependencyComplete",!1),e.updateData("dependencyLogs",[]);let y=m=>{let d=e.currentState.data.dependencyLogs||[],h=m.split(`
|
|
31
|
-
`).filter(I=>I.trim()!==""),
|
|
32
|
-
${X.docker}`));return}}else{e.setStatus("Checking Mise...");let
|
|
33
|
-
Install: ${X.mise}`));return}}let n=
|
|
34
|
-
`).map(
|
|
35
|
-
`)){if(!o)continue;let[r,n,s]=o.split("|"),
|
|
33
|
+
`).filter(I=>I.trim()!==""),v=[...d,...h].slice(-30);e.updateData("dependencyLogs",v)};try{e.updateData("dependencyPhase","Trusting mise configuration..."),await V("mise",["trust"],t,void 0,y),e.updateData("dependencyProgress",20),e.updateData("dependencyPhase","Installing tools..."),await V("mise",["install"],t,d=>{e.updateData("dependencyProgress",20+d*.3)},y),e.updateData("dependencyPhase","Running mise setup...");let m=Object.keys(p).length>0?xe(p):void 0;await V("mise",["setup"],t,d=>{e.updateData("dependencyProgress",50+d*.5)},y,m),e.updateData("dependencyProgress",100),e.updateData("dependencyPhase","Setup complete!"),e.updateData("dependencyComplete",!0)}catch(m){e.setError(new Error(`Failed to setup project: ${m.message}`));return}await Ue(1e3);let S=e.currentState.data.envMethod||"manual";De({setupComplete:!0,setupMethod:S,repoPath:t}),e.setStep("Finished"),e.setStatus("Setup complete!"),await e.waitForInput("exit")}async function pr(){let e=J(),{unmount:t}=Co(Eo.createElement(K,{store:e,command:"setup"})),o=()=>{t(),process.exit(130)};process.once("SIGINT",o),process.once("SIGTERM",o);try{await ur(e)}catch(r){e.setError(r)}finally{process.off("SIGINT",o),process.off("SIGTERM",o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as wo}from"ink";import Po from"react";async function dr(e,t){e.setStep("Starting"),e.setStatus("Locating GAIA repository...");let o=z();if(!o){e.setError(new Error("Could not find GAIA repository. Run from within a cloned gaia repo."));return}e.updateData("repoPath",o);let r=await xt(o);if(!r){e.setError(new Error("No .env file found. Run 'gaia init' for fresh setup, or 'gaia setup' to configure an existing repo."));return}if(r==="selfhost"){e.setStatus("Checking Docker...");let l=await Te();if(!l.working){e.setError(new Error(l.errorMessage||`Docker is not running. Please start Docker and try again.
|
|
34
|
+
${X.docker}`));return}}else{e.setStatus("Checking Mise...");let l=await ve();if(l==="missing"||l==="error"){e.setError(new Error(`Developer mode requires Mise but it is not installed.
|
|
35
|
+
Install: ${X.mise}`));return}}let n=ye(o),s=n[3e3]??3e3,c=n[8e3]??8e3;e.updateData("setupMode",r),e.updateData("webPort",s),e.updateData("apiPort",c),e.updateData("dockerLogs",[]),e.setStatus(`Starting GAIA in ${r} mode...`);let a=l=>{let p=l.split(`
|
|
36
|
+
`).map(T=>T.replace(/\x1b\[[0-9;]*m/g,"").trim()).filter(T=>T.length>0);if(p.length===0)return;let x=e.currentState.data.dockerLogs||[];e.updateData("dockerLogs",[...x,...p].slice(-30))};try{await Be(o,r,l=>{e.setStatus(l)},n,a,t),e.setStep("Running"),e.setStatus("GAIA is running!"),e.updateData("started",!0)}catch(l){e.setError(new Error(`Failed to start services: ${l.message}`));return}await e.waitForInput("exit")}async function mr(e){let t=J(),{unmount:o}=wo(Po.createElement(K,{store:t,command:"start"})),r=()=>{o(),process.exit(130)};process.once("SIGINT",r),process.once("SIGTERM",r),await new Promise(n=>setTimeout(n,50));try{await dr(t,e)}catch(n){t.setError(n)}finally{process.off("SIGINT",r),process.off("SIGTERM",r)}t.currentState.error&&await t.waitForInput("exit"),o(),process.exit(t.currentState.error?1:0)}import{render as Bo}from"ink";import _o from"react";import{execa as Tt}from"execa";var yt=["gaia-backend","gaia-web","chromadb","postgres","redis","mongo","rabbitmq","arq_worker"];async function fr(){try{let{stdout:e}=await Tt("docker",["inspect","--format","{{.Name}}|{{.State.Status}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}",...yt]),t=new Map;for(let o of e.trim().split(`
|
|
37
|
+
`)){if(!o)continue;let[r,n,s]=o.split("|"),c=r?.replace(/^\//,"")??"";t.set(c,{name:c,status:n==="running"?"running":"stopped",health:s!=="none"?s:void 0})}return yt.map(o=>t.get(o)??{name:o,status:"not_found"})}catch{let e=yt.map(async t=>{try{let{stdout:o}=await Tt("docker",["inspect","--format","{{.State.Status}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}",t]),[r,n]=o.trim().split("|");return{name:t,status:r==="running"?"running":"stopped",health:n!=="none"?n:void 0}}catch{return{name:t,status:"not_found"}}});return Promise.all(e)}}async function gr(){try{return await Tt("docker",["info"]),!0}catch{return!1}}var Ro=[{name:"API",port:8e3,type:"http",path:"/health"},{name:"Web",port:3e3,type:"http",path:"/"},{name:"PostgreSQL",port:5432,type:"tcp"},{name:"Redis",port:6379,type:"tcp"},{name:"MongoDB",port:27017,type:"tcp"},{name:"RabbitMQ",port:5672,type:"tcp"},{name:"ChromaDB",port:8080,type:"tcp"}];async function hr(e){let o=Ro.map(r=>({...r,port:e?.[r.port]??r.port})).map(r=>r.type==="http"?Do(r.name,r.port,r.path):ko(r.name,r.port));return Promise.all(o)}async function Do(e,t,o){let r=Date.now();try{let n=await fetch(`http://localhost:${t}${o}`,{signal:AbortSignal.timeout(5e3)}),s=Date.now()-r;return{name:e,port:t,status:n.ok?"up":"down",latency:s,details:n.ok?`HTTP ${n.status}`:`HTTP ${n.status} (error)`}}catch{return{name:e,port:t,status:"down",details:"Connection failed"}}}async function ko(e,t){let o=await import("node:net"),r=Date.now();return new Promise(n=>{let s=new o.Socket;s.setTimeout(3e3),s.on("connect",()=>{let c=Date.now()-r;s.destroy(),n({name:e,port:t,status:"up",latency:c})}),s.on("timeout",()=>{s.destroy(),n({name:e,port:t,status:"down"})}),s.on("error",()=>{s.destroy(),n({name:e,port:t,status:"down"})}),s.connect(t,"localhost")})}async function Sr(){return await gr()?{running:!0,containers:await fr()}:{running:!1,containers:[]}}async function Ao(e){e.setStep("Checking"),e.setStatus("Checking service health..."),e.updateData("refreshable",!1);let t=z(),o=t?ye(t):void 0,[r,n]=await Promise.all([hr(o),Sr()]);e.updateData("services",r),e.updateData("docker",n);let s=r.filter(a=>a.status==="up").length,c=r.length;e.setStep("Results"),e.setStatus(`${s}/${c} services running`),e.updateData("refreshable",!0)}async function xr(e){for(;await Ao(e),await e.waitForInput("exit_or_refresh")==="refresh";);}async function yr(){let e=J(),{unmount:t}=Bo(_o.createElement(K,{store:e,command:"status"}));await new Promise(o=>setTimeout(o,50));try{await xr(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as Lo}from"ink";import Oo from"react";async function Tr(e){e.setStep("Stopping"),e.setStatus("Locating GAIA repository...");let t=z();if(!t){e.setError(new Error("Could not find GAIA repository. Run from within a cloned gaia repo."));return}e.updateData("repoPath",t);let o=ye(t);try{await ar(t,r=>{e.setStatus(r)},o),e.setStep("Stopped"),e.setStatus("All services stopped."),e.updateData("stopped",!0)}catch(r){e.setError(new Error(`Failed to stop services: ${r.message}`));return}await e.waitForInput("exit")}async function vr(){let e=J(),{unmount:t}=Lo(Oo.createElement(K,{store:e,command:"stop"})),o=()=>{t(),process.exit(130)};process.once("SIGINT",o),process.once("SIGTERM",o),await new Promise(r=>setTimeout(r,50));try{await Tr(e)}catch(r){e.setError(r)}finally{process.off("SIGINT",o),process.off("SIGTERM",o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}var ce=new Mo;ce.name("gaia").description("CLI tool for setting up and managing GAIA").version("0.1.0");ce.command("init").description("Full setup from scratch (clone, configure, start)").option("--branch <branch>","Git branch to clone").action(async e=>{await lr({branch:e.branch})});ce.command("setup").description("Configure an existing GAIA repository").action(async()=>{await pr()});ce.command("status").description("Check health of all GAIA services").action(async()=>{await yr()});ce.command("start").description("Start GAIA services").option("-b, --build","Rebuild Docker images before starting").option("--pull","Pull latest base images before starting").action(async e=>{await mr({build:e.build,pull:e.pull})});ce.command("stop").description("Stop all GAIA services").action(async()=>{await vr()});process.argv.slice(2).length||(ce.outputHelp(),process.exit(0));ce.parse();
|