@heygaia/cli 0.1.3 → 0.1.5

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.
Files changed (2) hide show
  1. package/dist/index.js +12 -12
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import{Command as Wr}from"commander";import{render as Ar}from"ink";import _r from"react";import{Box as xe,Text as Z}from"ink";import pr from"react";import{ProgressBar as ze,Select as Ze,Spinner as et}from"@inkjs/ui";import{Box as p,Text as s,useInput as z}from"ink";import le from"ink-text-input";import{useEffect as ge,useState as L}from"react";import{Box as ce,Text as Ke}from"ink";var h="#00bbff";import{Box as Ht,Text as we}from"ink";import{jsx as Xe,jsxs as Qe}from"react/jsx-runtime";var Ye=({status:e,step:t})=>t.toLowerCase()==="welcome"?null:Qe(Ht,{width:"100%",borderStyle:"single",borderColor:"gray",paddingX:1,justifyContent:"space-between",children:[Qe(we,{color:h,children:[Xe(we,{bold:!0,children:"Status:"})," ",t]}),Xe(we,{color:"white",dimColor:!0,children:e})]});import{Box as Vt}from"ink";import Ut from"ink-big-text";import Wt from"ink-gradient";import{jsx as Pe}from"react/jsx-runtime";var te=()=>Pe(Vt,{flexDirection:"column",marginTop:1,marginBottom:1,children:Pe(Wt,{colors:[h,"#b0eaff",h],children:Pe(Ut,{text:"GAIA",font:"3d"})})});import{jsx as re,jsxs as me}from"react/jsx-runtime";var Xt=["Welcome","Prerequisites","Repository Setup","Install Tools","Environment Setup","Project Setup","Finished"],Je=["Detect Repo","Prerequisites","Environment Setup","Project Setup","Finished"],Qt=({currentStep:e,steps:t})=>{let o=t.indexOf(e);return re(ce,{marginBottom:1,children:t.map((r,n)=>{let i=r===e,c=o>n;return me(ce,{marginRight:2,children:[me(Ke,{color:i?h:c?"green":"gray",children:[c?"\u2713 ":i?"\u25CF ":"\u25CB ",r]}),n<t.length-1&&re(Ke,{color:"gray",children:" \u203A "})]},r)})})},fe=({children:e,status:t,step:o,steps:r=Xt})=>me(ce,{flexDirection:"column",height:"100%",width:"100%",children:[me(ce,{flexGrow:1,flexDirection:"column",children:[re(te,{}),re(Qt,{currentStep:o,steps:r}),re(ce,{flexDirection:"column",flexGrow:1,children:e})]}),re(Ye,{status:t,step:o})]});import{Fragment as So,jsx as a,jsxs as u}from"react/jsx-runtime";var Re=({label:e,status:t})=>u(p,{children:[a(p,{marginRight:1,children:t==="pending"?a(et,{type:"dots"}):t==="success"?a(s,{color:h,children:"\u2714"}):t==="error"?a(s,{color:"red",children:"\u2716"}):a(s,{color:"yellow",children:"\u26A0"})}),a(s,{children:e})]}),Yt=({onConfirm:e})=>(z((t,o)=>{o.return&&e()}),u(p,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:h,children:[a(s,{bold:!0,children:"Welcome to the Interactive GAIA Setup"}),u(p,{flexDirection:"column",marginTop:1,marginBottom:1,children:[a(s,{children:"This wizard will guide you through the setup process:"}),a(s,{children:" 1. Check Prerequisites (Git, Docker, Mise)"}),a(s,{children:" 2. Clone Repository (from GitHub)"}),a(s,{children:" 3. Install Tools (node, python, uv via mise)"}),a(s,{children:" 4. Configure Env Vars (databases, API keys, etc.)"}),a(s,{children:" 5. Setup Project (install all dependencies)"})]}),a(s,{color:h,children:"Press Enter to start..."})]})),Kt=({portResults:e,onAccept:t,onAbort:o})=>{z((n,i)=>{i.return?t():i.escape&&o()});let r=e.filter(n=>!n.available);return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:"yellow",children:[a(p,{marginBottom:1,children:a(s,{bold:!0,color:"yellow",children:"Port Conflicts Detected"})}),e.map(n=>u(p,{children:[u(s,{color:n.available?"green":n.alternative?"yellow":"red",children:[n.available?"\u2714":n.alternative?"\u26A0":"\u2716"," "]}),u(s,{children:[n.service," (:",n.port,")"]}),!n.available&&u(s,{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)),u(p,{marginTop:1,flexDirection:"column",children:[r.some(n=>!n.alternative)&&a(p,{borderStyle:"single",borderColor:"red",paddingX:1,marginBottom:1,children:a(s,{color:"red",children:"Some ports have no available alternative. Free them and retry."})}),!r.some(n=>!n.alternative)&&r.some(n=>n.alternative)&&a(s,{color:"gray",children:"Alternative ports will be used for conflicting services."}),a(p,{marginTop:1,children:u(s,{children:[a(s,{color:"green",bold:!0,children:"Enter"})," to continue with alternatives ",a(s,{color:"yellow",bold:!0,children:"Escape"})," to abort"]})})]})]})},Jt=({defaultValue:e,onSubmit:t})=>{let[o,r]=L(e);return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:h,children:[a(s,{children:"Where should we clone the repository?"}),u(p,{children:[a(s,{color:h,children:"\u279C "}),a(le,{value:o,onChange:r,onSubmit:t})]}),u(s,{color:"gray",children:["(Press Enter for default: ",e,")"]})]})},zt=({setupMode:e,repoPath:t,portOverrides:o,onConfirm:r})=>{z((m,g)=>{g.return&&r()});let n=e||"developer",i=t||"./gaia",c=o?.[3e3]??3e3,d=o?.[8e3]??8e3;return u(p,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:h,padding:1,children:[a(s,{color:h,bold:!0,children:"You are all set!"}),u(p,{marginTop:1,flexDirection:"column",children:[a(s,{bold:!0,children:"To start GAIA, run:"}),u(p,{marginTop:1,padding:1,borderStyle:"single",borderColor:"gray",flexDirection:"column",children:[u(s,{color:"cyan",children:["$ cd ",i]}),a(s,{color:"cyan",children:"$ gaia start"})]}),a(p,{marginTop:1,children:a(s,{color:"gray",dimColor:!0,children:n==="selfhost"?"Runs: docker compose --profile all up -d (background)":"Runs: mise dev (interactive \u2014 keep terminal open)"})})]}),u(p,{marginTop:1,flexDirection:"column",children:[a(s,{bold:!0,children:"Access GAIA at:"}),u(p,{marginLeft:2,flexDirection:"column",children:[u(s,{children:["Web:"," ",u(s,{color:"cyan",bold:!0,children:["http://localhost:",c]})]}),u(s,{children:["API:"," ",u(s,{color:"cyan",bold:!0,children:["http://localhost:",d]})]})]})]}),a(De,{}),a(p,{marginTop:1,children:a(s,{dimColor:!0,children:"Press Enter to exit"})})]})},De=()=>u(p,{marginTop:1,flexDirection:"column",children:[a(s,{bold:!0,children:"Available commands:"}),u(p,{marginLeft:2,flexDirection:"column",children:[u(s,{children:[u(s,{color:h,bold:!0,children:["gaia start"," "]}),a(s,{color:"gray",children:" Start all services"})]}),u(s,{children:[u(s,{color:h,bold:!0,children:["gaia stop"," "]}),a(s,{color:"gray",children:" Stop all services"})]}),u(s,{children:[a(s,{color:h,bold:!0,children:"gaia status"}),a(s,{color:"gray",children:" Check service health"})]}),u(s,{children:[u(s,{color:h,bold:!0,children:["gaia setup"," "]}),a(s,{color:"gray",children:" Reconfigure environment"})]})]})]}),Zt=({phase:e,progress:t,isComplete:o,logs:r,title:n})=>u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:h,children:[a(p,{marginBottom:1,children:a(s,{bold:!0,color:h,children:n||"Installing Dependencies"})}),u(p,{flexDirection:"column",gap:1,children:[a(p,{children:o?u(s,{color:"green",children:["\u2713 ",e]}):a(et,{label:e||"Preparing..."})}),!o&&t>0&&a(p,{width:50,children:a(ze,{value:t})}),!o&&r&&r.length>0&&a(p,{flexDirection:"column",marginTop:1,borderStyle:"single",borderColor:"gray",paddingX:1,paddingY:0,minHeight:6,children:r.map((i,c)=>a(s,{color:"gray",wrap:"truncate",children:i},c))})]})]});var ke=({onSelect:e})=>u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:h,children:[a(s,{bold:!0,children:"Setup Mode"}),a(p,{marginTop:1,children:a(s,{color:"gray",children:"How do you want to run GAIA?"})}),a(p,{marginTop:1,children:a(Ze,{options:[{label:"Self-Host (Docker)",value:"selfhost"},{label:"Developer Mode (Local)",value:"developer"}],onChange:o=>e(o)})}),u(p,{marginTop:1,flexDirection:"column",children:[a(s,{color:"gray",dimColor:!0,children:"Self-Host: Run everything in Docker containers (recommended for deployment)"}),a(s,{color:"gray",dimColor:!0,children:"Developer: Run backend locally with Docker services (recommended for contributing)"})]})]}),Be=({onSelect:e})=>u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:h,children:[a(s,{bold:!0,children:"Environment Variables Setup"}),a(p,{marginTop:1,children:a(s,{color:"gray",children:"Choose how you want to configure environment variables:"})}),a(p,{marginTop:1,children:a(Ze,{options:[{label:"Manual Setup (Recommended)",value:"manual"},{label:"Infisical (Advanced)",value:"infisical"}],onChange:o=>e(o)})}),u(p,{marginTop:1,flexDirection:"column",children:[a(s,{color:"gray",dimColor:!0,children:"Manual Setup: Configure variables interactively (recommended for most users)"}),a(s,{color:"gray",dimColor:!0,children:"Infisical: All secrets managed in Infisical dashboard (requires pre-configuration)"})]})]}),Ae=({onSubmit:e})=>{let[t,o]=L({INFISICAL_TOKEN:"",INFISICAL_PROJECT_ID:"",INFISICAL_MACHINE_IDENTITY_CLIENT_ID:"",INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET:""}),[r,n]=L(0),[i,c]=L(null),d=[{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"}];z((g,v)=>{if(v.tab||v.downArrow)n(x=>x<d.length-1?x+1:x);else if(v.upArrow)n(x=>x>0?x-1:x);else if(v.return){if(r<d.length-1){n(l=>l+1);return}let x=d.filter(l=>!t[l.key].trim());if(x.length>0){c(`Required: ${x.map(S=>S.key).join(", ")}`);let l=d.findIndex(S=>!t[S.key].trim());l>=0&&n(l);return}e(t)}});let m=d[r];return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:h,children:[a(p,{marginBottom:1,children:a(s,{bold:!0,color:h,children:"Infisical Configuration"})}),a(p,{marginBottom:1,borderStyle:"single",borderColor:"cyan",paddingX:1,children:a(s,{color:"cyan",children:"All environment variables (API keys, auth secrets, etc.) must be configured in your Infisical project. Only Infisical credentials will be stored locally."})}),u(p,{marginBottom:1,flexDirection:"column",children:[a(s,{color:"gray",children:"Configure your Infisical credentials."}),u(s,{color:"gray",dimColor:!0,children:["Visit"," ",a(s,{color:"cyan",underline:!0,children:"app.infisical.com"})," ","to get these values."]})]}),d.map((g,v)=>{let x=g.key.includes("SECRET")||g.key.includes("TOKEN");return u(p,{flexDirection:"column",marginBottom:1,children:[a(p,{children:u(s,{color:v===r?h:"white",children:[v===r?"\u25B8 ":" ",g.key,":"]})}),a(p,{marginLeft:2,children:a(s,{color:"gray",dimColor:!0,children:g.description})}),v===r?a(p,{marginLeft:2,children:a(le,{value:t[g.key],onChange:l=>{o(S=>({...S,[g.key]:l})),c(null)},placeholder:"Enter value...",mask:x?"*":void 0})}):a(p,{marginLeft:2,children:a(s,{color:t[g.key]?"green":"gray",children:t[g.key]?x?`\u2713 ${"*".repeat(8)}`:`\u2713 ${t[g.key]}`:"(not set)"})})]},g.key)}),i&&a(p,{marginTop:1,children:a(s,{color:"red",children:i})}),a(p,{marginTop:1,children:a(s,{color:"gray",dimColor:!0,children:"\u2191\u2193/Tab to navigate \u2022 Enter to confirm"})})]})},_e=({category:e,currentIndex:t,totalGroups:o,onSubmit:r})=>{let[n,i]=L(()=>{let l={};for(let S of e.variables)l[S.name]=S.defaultValue||"";return l}),[c,d]=L(0),[m,g]=L(null);ge(()=>{let l={};for(let S of e.variables)l[S.name]=S.defaultValue||"";i(l),d(0),g(null)},[e.name]),z((l,S)=>{if(S.tab||S.downArrow)d(f=>f<e.variables.length-1?f+1:f);else if(S.upArrow)d(f=>f>0?f-1:f);else if(S.escape){let f=e.variables.filter(b=>b.required&&!n[b.name]?.trim());if(f.length>0){g(`Required fields cannot be skipped: ${f.map(b=>b.name).join(", ")}`);return}r(n)}});let v=()=>{if(c<e.variables.length-1)d(c+1);else{let l=e.variables.filter(S=>S.required&&!n[S.name]?.trim());if(l.length>0){g(`Required fields are missing: ${l.map(S=>S.name).join(", ")}`);return}g(null),r(n)}},x=e.variables.some(l=>l.required);return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:m?"red":h,children:[u(p,{justifyContent:"space-between",children:[u(s,{bold:!0,children:["Configure ",e.name]}),u(s,{color:"gray",children:["Group ",t+1," / ",o]})]}),u(p,{marginTop:1,flexDirection:"column",children:[u(p,{children:[u(s,{color:"cyan",bold:!0,children:["Purpose:"," "]}),a(s,{color:"white",children:e.description})]}),e.affectedFeatures&&u(p,{children:[u(s,{color:"cyan",bold:!0,children:["Affects:"," "]}),a(s,{color:"gray",children:e.affectedFeatures})]}),e.docsUrl&&u(p,{marginTop:1,children:[a(s,{color:"green",children:"\u{1F4D6} Docs: "}),a(s,{color:"blue",underline:!0,children:e.docsUrl})]})]}),a(p,{marginTop:1,flexDirection:"column",children:e.variables.map((l,S)=>{let f=S===c,b=!!l.defaultValue;return u(p,{flexDirection:"column",marginBottom:1,children:[u(p,{children:[u(s,{color:f?h:"gray",bold:f,children:[f?"\u279C ":" ",l.name]}),l.required&&u(s,{color:"red",bold:!0,children:[" ","*"]}),b&&!f&&u(s,{color:"gray",dimColor:!0,children:[" ","(default: ",l.defaultValue,")"]})]}),f&&a(p,{marginLeft:2,children:a(le,{value:n[l.name]||"",onChange:y=>{i(C=>({...C,[l.name]:y})),m&&g(null)},onSubmit:v,placeholder:b?`Default: ${l.defaultValue}`:l.required?"Enter a value (required)":"Press Enter to skip"})})]},l.name)})}),m&&a(p,{marginTop:1,children:u(s,{color:"red",bold:!0,children:["\u26A0 ",m]})}),a(p,{marginTop:1,flexDirection:"column",children:u(s,{color:"gray",dimColor:!0,children:["\u21B5 Enter to next field \u2022 Tab/\u2193 move down \u2022 \u2191 move up",!x&&" \u2022 ESC skip group"]})})]})},Me=({alternatives:e,onSubmit:t})=>{let[o,r]=L(new Set),[n,i]=L({}),[c,d]=L(0),[m,g]=L(null);ge(()=>{let y={};for(let C of e)for(let I of C.variables)y[I.name]=I.defaultValue||"";i(y)},[e]);let v=[];for(let y=0;y<e.length;y++)if(v.push({type:"provider",categoryIndex:y}),o.has(y)){let C=e[y];if(C)for(let I=0;I<C.variables.length;I++)v.push({type:"field",categoryIndex:y,fieldIndex:I})}v.push({type:"submit"});let x=v[c],l=x?.type==="field",S=x?.type==="submit";z((y,C)=>{let I=Math.min(c,v.length-1);if(I!==c){d(I);return}if(l)C.upArrow?d(E=>Math.max(0,E-1)):(C.downArrow||C.tab)&&d(E=>Math.min(v.length-1,E+1));else if(S)C.upArrow?d(E=>Math.max(0,E-1)):(C.return||y===" ")&&b();else if(C.upArrow)d(E=>Math.max(0,E-1));else if(C.downArrow||C.tab)d(E=>Math.min(v.length-1,E+1));else if((C.return||y===" ")&&x?.type==="provider"){let E=x.categoryIndex;r(Q=>{let D=new Set(Q);return D.has(E)?D.delete(E):D.add(E),D}),m&&g(null)}});let f=()=>{m&&g(null),d(y=>Math.min(v.length-1,y+1))},b=()=>{let y=[],C={};for(let I of o){let E=e[I];if(!E)continue;if(E.variables.some(D=>n[D.name]?.trim())){y.push(E.name);for(let D of E.variables){let de=n[D.name];de&&(C[D.name]=de)}}}if(y.length===0){o.size===0?g("Enable at least one provider (press Space or Enter)"):g("Enter a value for at least one field");return}t(y,C)};return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:m?"red":h,children:[u(p,{justifyContent:"space-between",children:[a(s,{bold:!0,children:"Configure AI Provider"}),a(s,{color:"yellow",children:"* At least one required"})]}),a(p,{marginTop:1,children:a(s,{color:"gray",children:"Enable and configure at least one AI provider below:"})}),a(p,{marginTop:1,flexDirection:"column",children:e.map((y,C)=>{let I=o.has(C),E=v.findIndex(D=>D.type==="provider"&&D.categoryIndex===C),Q=c===E;return u(p,{flexDirection:"column",marginBottom:1,children:[u(p,{children:[a(s,{color:Q?h:void 0,bold:Q,children:Q?"\u279C ":" "}),a(s,{color:I?"green":"gray",children:I?"[\u2714]":"[ ]"}),u(s,{color:I?h:"gray",bold:I,children:[" ",y.name]}),y.description&&u(s,{color:"gray",dimColor:!0,children:[" ","- ",y.description]})]}),Q&&y.docsUrl&&u(p,{marginLeft:6,children:[a(s,{color:"yellow",children:"\u{1F4D6} "}),a(s,{color:"blue",underline:!0,children:y.docsUrl})]}),I&&a(p,{marginLeft:4,flexDirection:"column",marginTop:1,children:y.variables.map((D,de)=>{let qt=v.findIndex(se=>se.type==="field"&&se.categoryIndex===C&&se.fieldIndex===de),ee=c===qt,We=!!D.defaultValue,Ee=n[D.name]||"";return u(p,{flexDirection:"column",marginBottom:1,children:[u(p,{children:[u(s,{color:ee?h:"gray",bold:ee,children:[ee?" \u279C ":" ",D.name]}),!ee&&Ee&&a(s,{color:"green",children:" \u2713"}),!ee&&!Ee&&We&&u(s,{color:"gray",dimColor:!0,children:[" ","(default: ",D.defaultValue,")"]})]}),ee&&a(p,{marginLeft:4,children:a(le,{value:Ee,onChange:se=>{i(jt=>({...jt,[D.name]:se})),m&&g(null)},onSubmit:f,placeholder:We?`Default: ${D.defaultValue}`:"Enter value..."})})]},D.name)})})]},y.name)})}),m&&a(p,{marginTop:1,children:u(s,{color:"red",bold:!0,children:["\u26A0 ",m]})}),u(p,{marginTop:1,children:[a(s,{color:S?h:void 0,bold:S,children:S?"\u279C ":" "}),a(p,{borderStyle:"round",borderColor:S?h:"gray",paddingX:2,children:a(s,{color:S?h:"gray",bold:S,children:"Continue \u2192"})})]}),a(p,{marginTop:1,children:a(s,{color:"gray",dimColor:!0,children:"\u2191/\u2193 navigate \u2022 Space/Enter toggle/select \u2022 Tab skip field"})})]})},Le=({currentVar:e,currentIndex:t,totalCount:o,onSubmit:r,onSkip:n})=>{let[i,c]=L(e.defaultValue||""),[d,m]=L(null);ge(()=>{c(e.defaultValue||""),m(null)},[e.name]),z((x,l)=>{if(l.escape){if(e.required&&!i.trim()){m("This field is required and cannot be skipped");return}n()}});let g=x=>{if(e.required&&!x.trim()){m("This field is required");return}m(null),r(x)},v=!!e.defaultValue;return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:d?"red":h,children:[u(p,{justifyContent:"space-between",children:[a(s,{bold:!0,children:"Configure Environment Variables"}),u(s,{color:"gray",children:[t+1," / ",o]})]}),u(p,{marginTop:1,flexDirection:"column",children:[u(p,{children:[a(s,{color:h,bold:!0,children:e.name}),e.required?u(s,{color:"red",bold:!0,children:[" ","* required"]}):u(s,{color:"gray",dimColor:!0,children:[" ","(optional)"]})]}),u(p,{marginTop:1,children:[u(s,{color:"cyan",bold:!0,children:["Category:"," "]}),a(s,{color:"white",children:e.category})]}),u(p,{children:[u(s,{color:"cyan",bold:!0,children:["Purpose:"," "]}),a(s,{color:"white",children:e.description})]}),e.affectedFeatures&&u(p,{children:[u(s,{color:"cyan",bold:!0,children:["Affects:"," "]}),a(s,{color:"gray",children:e.affectedFeatures})]}),e.docsUrl&&u(p,{marginTop:1,children:[a(s,{color:"green",children:"\u{1F4D6} Docs: "}),a(s,{color:"blue",underline:!0,children:e.docsUrl})]}),v&&u(p,{marginTop:1,children:[u(s,{color:"green",bold:!0,children:["Default:"," "]}),a(s,{color:"white",children:e.defaultValue})]})]}),u(p,{marginTop:1,children:[a(s,{color:h,children:"\u279C "}),a(le,{value:i,onChange:x=>{c(x),d&&m(null)},onSubmit:g,placeholder:v?"Press Enter to use default":e.required?"Enter a value (required)":"Press Enter to skip"})]}),d&&a(p,{marginTop:1,children:u(s,{color:"red",bold:!0,children:["\u26A0 ",d]})}),a(p,{marginTop:1,flexDirection:"column",children:e.required?a(s,{color:"yellow",dimColor:!0,children:"\u21B5 Enter to confirm (required field)"}):v?a(s,{color:"green",dimColor:!0,children:"\u21B5 Enter to use default \u2022 ESC to skip"}):a(s,{color:"gray",dimColor:!0,children:"\u21B5 Enter to confirm \u2022 ESC to skip"})})]})},tt=({store:e})=>{let[t,o]=L(e.currentState);return ge(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),u(fe,{status:t.status,step:t.step,children:[t.step==="Welcome"&&t.inputRequest?.id==="welcome"&&a(Yt,{onConfirm:()=>e.submitInput(!0)}),t.step==="Prerequisites"&&t.data.checks&&u(p,{flexDirection:"column",borderStyle:"round",paddingX:1,borderColor:h,children:[a(s,{bold:!0,children:"System Checks"}),u(p,{flexDirection:"column",marginTop:1,children:[a(Re,{label:"Git",status:t.data.checks.git}),a(Re,{label:"Docker",status:t.data.checks.docker}),a(Re,{label:"Mise",status:t.data.checks.mise})]})]}),t.inputRequest?.id==="port_conflicts"&&t.data.portConflicts&&a(Kt,{portResults:t.data.portConflicts,onAccept:()=>e.submitInput("accept"),onAbort:()=>e.submitInput("abort")}),t.inputRequest?.id==="repo_path"&&a(Jt,{defaultValue:t.inputRequest.meta.default,onSubmit:r=>e.submitInput(r)}),t.step==="Repository Setup"&&u(p,{flexDirection:"column",borderStyle:"round",padding:1,borderColor:h,children:[a(s,{bold:!0,children:"Cloning Repository"}),u(p,{marginTop:1,flexDirection:"column",children:[a(ze,{value:t.data.repoProgress||0}),t.data.repoPhase&&a(p,{marginTop:1,children:a(s,{color:"gray",children:t.data.repoPhase})})]})]}),t.inputRequest?.id==="setup_mode"&&a(ke,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_method"&&a(Be,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_infisical"&&a(Ae,{onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_var"&&t.data.currentEnvVar&&a(Le,{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&&a(_e,{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&&a(Me,{alternatives:t.data.alternativeGroups,onSubmit:(r,n)=>e.submitInput({selectedGroups:r,values:n})}),t.step==="Finished"&&a(zt,{setupMode:t.data.setupMode,repoPath:t.data.repoPath,portOverrides:t.data.portOverrides,onConfirm:()=>e.submitInput(!0)}),(t.step==="Install Tools"||t.step==="Project Setup")&&a(Zt,{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.error&&a(p,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:u(s,{color:"red",children:["Error: ",t.error.message]})})]})};import{Spinner as er}from"@inkjs/ui";import{Box as N,Text as M,useInput as tr}from"ink";import{useEffect as rr,useState as or}from"react";import{jsx as F,jsxs as B}from"react/jsx-runtime";var rt=({store:e,command:t})=>{let[o,r]=or(e.currentState);rr(()=>{let i=()=>r({...e.currentState});return e.on("change",i),()=>{e.off("change",i)}},[e]),tr((i,c)=>{(c.return||c.escape)&&(o.data.started||o.data.stopped||o.error)&&e.submitInput("exit")});let n=t==="start";return B(N,{flexDirection:"column",width:"100%",children:[F(te,{}),(o.step==="Starting"||o.step==="Stopping")&&B(N,{flexDirection:"column",marginTop:1,paddingX:2,borderStyle:"round",borderColor:h,children:[F(er,{label:o.status||"Working..."}),o.data.repoPath&&F(N,{marginTop:1,children:B(M,{color:"gray",children:["Repository: ",o.data.repoPath]})}),o.data.setupMode&&F(N,{children:B(M,{color:"gray",children:["Mode: ",o.data.setupMode]})})]}),o.step==="Running"&&o.data.started&&B(N,{flexDirection:"column",marginTop:1,paddingX:2,paddingY:1,borderStyle:"round",borderColor:"green",children:[B(M,{color:"green",bold:!0,children:["\u2713"," GAIA is running!"]}),o.data.setupMode!=="developer"&&B(N,{marginTop:1,flexDirection:"column",children:[B(M,{children:["Web:"," ",B(M,{color:"cyan",bold:!0,children:["http://localhost:",o.data.webPort||3e3]})]}),B(M,{children:["API:"," ",B(M,{color:"cyan",bold:!0,children:["http://localhost:",o.data.apiPort||8e3]})]})]}),o.data.setupMode==="developer"&&B(N,{marginTop:1,flexDirection:"column",children:[F(M,{color:"gray",children:"Dev servers started in background."}),B(M,{color:"gray",children:["Logs: ",F(M,{color:h,children:"dev-start.log"})," in your repo root."]}),B(M,{color:"gray",children:["Run ",F(M,{color:h,children:"gaia stop"})," to shut down."]})]}),F(N,{marginTop:1,children:F(M,{dimColor:!0,children:"Press Enter to exit"})})]}),o.step==="Stopped"&&o.data.stopped&&B(N,{flexDirection:"column",marginTop:1,paddingX:2,paddingY:1,borderStyle:"round",borderColor:h,children:[B(M,{color:h,bold:!0,children:["\u2713"," All GAIA services stopped."]}),F(N,{marginTop:1,children:F(M,{dimColor:!0,children:"Press Enter to exit"})})]}),o.error&&B(N,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:[B(M,{color:"red",children:["Error: ",o.error.message]}),F(N,{marginTop:1,children:F(M,{dimColor:!0,children:"Press Enter to exit"})})]})]})};import{ProgressBar as nr,Spinner as Fe}from"@inkjs/ui";import{Box as R,Text as w,useInput as ot}from"ink";import{useEffect as ir,useState as ar}from"react";import{jsx as T,jsxs as k}from"react/jsx-runtime";var nt=({store:e})=>{let[t,o]=ar(e.currentState);return ir(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),k(fe,{status:t.status,step:t.step,steps:Je,children:[t.step==="Detect Repo"&&k(R,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:h,children:[T(w,{bold:!0,children:"Detecting GAIA Repository"}),T(R,{marginTop:1,children:T(Fe,{label:"Searching for repository..."})}),t.data.repoPath&&T(R,{marginTop:1,children:k(w,{color:"green",children:["Found: ",t.data.repoPath]})})]}),t.step==="Prerequisites"&&t.data.checks&&k(R,{flexDirection:"column",borderStyle:"round",paddingX:1,borderColor:h,children:[T(w,{bold:!0,children:"System Checks"}),k(R,{flexDirection:"column",marginTop:1,children:[T(Oe,{label:"Git",status:t.data.checks.git}),T(Oe,{label:"Docker",status:t.data.checks.docker}),T(Oe,{label:"Mise",status:t.data.checks.mise})]})]}),t.inputRequest?.id==="port_conflicts"&&t.data.portConflicts&&T(sr,{portResults:t.data.portConflicts,onAccept:()=>e.submitInput("accept"),onAbort:()=>e.submitInput("abort")}),t.inputRequest?.id==="setup_mode"&&T(ke,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_method"&&T(Be,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_infisical"&&T(Ae,{onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_var"&&t.data.currentEnvVar&&T(Le,{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&&T(_e,{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&&T(Me,{alternatives:t.data.alternativeGroups,onSubmit:(r,n)=>e.submitInput({selectedGroups:r,values:n})}),t.step==="Project Setup"&&k(R,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:h,children:[T(R,{marginBottom:1,children:T(w,{bold:!0,color:h,children:"Project Setup"})}),k(R,{flexDirection:"column",gap:1,children:[T(R,{children:t.data.dependencyComplete?k(w,{color:"green",children:["\u2713"," ",t.data.dependencyPhase]}):T(Fe,{label:t.data.dependencyPhase||"Preparing..."})}),!t.data.dependencyComplete&&t.data.dependencyProgress>0&&T(R,{width:50,children:T(nr,{value:t.data.dependencyProgress})}),!t.data.dependencyComplete&&t.data.dependencyLogs?.length>0&&T(R,{flexDirection:"column",marginTop:1,borderStyle:"single",borderColor:"gray",paddingX:1,minHeight:6,children:t.data.dependencyLogs.map((r,n)=>T(w,{color:"gray",wrap:"truncate",children:r},n))})]})]}),t.step==="Finished"&&T(cr,{setupMode:t.data.setupMode,repoPath:t.data.repoPath,onConfirm:()=>e.submitInput(!0)}),t.error&&T(R,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:k(w,{color:"red",children:["Error: ",t.error.message]})})]})},Oe=({label:e,status:t})=>k(R,{children:[T(R,{marginRight:1,children:t==="pending"?T(Fe,{type:"dots"}):t==="success"?T(w,{color:h,children:"\u2714"}):t==="error"?T(w,{color:"red",children:"\u2716"}):T(w,{color:"yellow",children:"\u26A0"})}),T(w,{children:e})]}),sr=({portResults:e,onAccept:t,onAbort:o})=>(ot((r,n)=>{n.return?t():n.escape&&o()}),k(R,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:"yellow",children:[T(w,{bold:!0,color:"yellow",children:"Port Conflicts Detected"}),e.map(r=>k(R,{children:[k(w,{color:r.available?"green":"red",children:[r.available?"\u2714":"\u2716"," "]}),k(w,{children:[r.service," (:",r.port,")"]}),!r.available&&k(w,{color:"gray",children:[" ","- in use",r.usedBy?` by ${r.usedBy}`:"",r.alternative?` (alt: :${r.alternative})`:""]})]},r.port)),T(R,{marginTop:1,children:k(w,{children:[T(w,{color:"green",bold:!0,children:"Enter"})," continue ",T(w,{color:"yellow",bold:!0,children:"Escape"})," abort"]})})]})),cr=({setupMode:e,repoPath:t,onConfirm:o})=>(ot((i,c)=>{c.return&&o()}),k(R,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:h,padding:1,children:[T(w,{color:h,bold:!0,children:"Setup Complete!"}),k(R,{marginTop:1,flexDirection:"column",children:[T(w,{bold:!0,children:"To start GAIA, run:"}),k(R,{marginTop:1,padding:1,borderStyle:"single",borderColor:"gray",flexDirection:"column",children:[k(w,{color:"cyan",children:["$ cd ",t||"."]}),T(w,{color:"cyan",children:"$ gaia start"})]}),T(R,{marginTop:1,children:T(w,{color:"gray",dimColor:!0,children:(e||"developer")==="selfhost"?"Runs: docker compose --profile all up -d (background)":"Runs: mise dev (interactive \u2014 keep terminal open)"})})]}),T(De,{}),T(R,{marginTop:1,children:T(w,{dimColor:!0,children:"Press Enter to exit"})})]}));import{Spinner as lr}from"@inkjs/ui";import{Box as A,Text as _,useInput as ur}from"ink";import{useEffect as it,useState as at}from"react";import{jsx as P,jsxs as O}from"react/jsx-runtime";var st=({store:e})=>{let[t,o]=at(e.currentState),[r,n]=at(!1);return it(()=>{let i=()=>o({...e.currentState});return e.on("change",i),()=>{e.off("change",i)}},[e]),it(()=>{t.step==="Results"&&n(!1)},[t.step]),ur((i,c)=>{(c.return||c.escape)&&t.step==="Results"&&e.submitInput("exit"),i==="r"&&t.step==="Results"&&t.data.refreshable&&!r&&(n(!0),e.submitInput("refresh"))}),O(A,{flexDirection:"column",width:"100%",children:[P(te,{}),t.step==="Checking"&&P(A,{marginTop:1,children:P(lr,{label:t.data.services?"Refreshing service health...":"Checking service health..."})}),t.step==="Results"&&t.data.services&&O(A,{flexDirection:"column",children:[O(A,{flexDirection:"column",borderStyle:"round",borderColor:h,paddingX:2,paddingY:1,children:[P(_,{bold:!0,color:h,children:"GAIA Service Status"}),O(A,{marginTop:1,flexDirection:"column",children:[O(A,{children:[P(A,{width:22,children:P(_,{bold:!0,children:"Service"})}),P(A,{width:10,children:P(_,{bold:!0,children:"Status"})}),P(A,{width:10,children:P(_,{bold:!0,children:"Latency"})})]}),P(_,{color:"gray",children:"\u2500".repeat(42)}),t.data.services.map(i=>O(A,{children:[P(A,{width:22,children:O(_,{children:[i.name," (:",i.port,")"]})}),P(A,{width:10,children:P(_,{color:i.status==="up"?"green":"red",bold:!0,children:i.status==="up"?"\u2713 UP":"\u2717 DOWN"})}),P(A,{width:10,children:P(_,{color:"gray",children:i.latency?`${i.latency}ms`:"--"})})]},i.name))]})]}),t.data.docker&&O(A,{flexDirection:"column",borderStyle:"round",borderColor:"gray",paddingX:2,paddingY:1,marginTop:1,children:[P(_,{bold:!0,children:"Docker Containers"}),O(_,{color:"gray",children:["Docker:"," ",t.data.docker.running?P(_,{color:"green",children:"Running"}):P(_,{color:"red",children:"Not running"})]}),t.data.docker.containers?.length>0&&P(A,{marginTop:1,flexDirection:"column",children:t.data.docker.containers.map(i=>O(A,{children:[O(_,{color:i.status==="running"?"green":"red",children:[i.status==="running"?"\u2713":"\u2717"," "]}),P(_,{children:i.name}),i.health&&O(_,{color:"gray",children:[" (",i.health,")"]})]},i.name))})]}),P(A,{marginTop:1,children:O(_,{dimColor:!0,children:["Press Enter or Escape to exit \xB7 Press"," ",P(_,{color:h,children:"r"})," to refresh"]})})]}),t.error&&P(A,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:O(_,{color:"red",children:["Error: ",t.error.message]})})]})};import{jsx as G,jsxs as ue}from"react/jsx-runtime";var dr=["init","setup","status","start","stop"],Ne=class extends pr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}render(){return this.state.error?ue(xe,{flexDirection:"column",padding:1,children:[G(Z,{color:"red",bold:!0,children:"An unexpected error occurred:"}),G(Z,{color:"red",children:this.state.error.message}),this.state.error.stack&&G(xe,{marginTop:1,children:G(Z,{color:"gray",dimColor:!0,children:this.state.error.stack})})]}):this.props.children}},mr=({store:e,command:t})=>{switch(t){case"init":return G(tt,{store:e});case"setup":return G(nt,{store:e});case"status":return G(st,{store:e});case"start":case"stop":return G(rt,{store:e,command:t});default:return ue(xe,{flexDirection:"column",padding:1,children:[ue(Z,{color:"red",children:["Unknown command: ",t]}),ue(xe,{marginTop:1,flexDirection:"column",children:[G(Z,{bold:!0,children:"Available commands:"}),dr.map(o=>ue(Z,{children:[" ",G(Z,{color:"cyan",children:o})]},o))]})]})}},j=({store:e,command:t})=>G(Ne,{children:G(mr,{store:e,command:t})});import{EventEmitter as fr}from"events";var gr=150,Ge=class extends fr{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))},gr))}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())}},H=()=>new Ge;import*as ae from"fs";import*as Tt from"path";import*as ne from"node:fs";import*as oe from"node:path";import{execa as ct}from"execa";var lt={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/"}},ut={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 $e(e,t){return lt[t][e]??ut[t][e]}async function pt(e){let t=oe.join(e,"apps/api/scripts/dump_config_schema.py"),o=oe.join(e,"apps/api/app/config/settings_validator.py"),r=oe.join(e,"apps/api/app/config/settings.py");if(!ne.existsSync(t))throw new Error("dump_config_schema.py not found in apps/api/scripts");try{try{let{stdout:n}=await ct("python3",[t,o,r],{cwd:e});return JSON.parse(n)}catch{let{stdout:n}=await ct("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 dt(e){let t=oe.join(e,"apps","web",".env.local"),o=ne.existsSync(t)?t:oe.join(e,"apps","web",".env");if(!ne.existsSync(o))return[];let r=ne.readFileSync(o,"utf-8"),n=[],i="General";for(let c of r.split(`
3
- `)){let d=c.trim();if(d.startsWith("#")&&!d.startsWith("#=")){let x=d.replace(/^#+\s*/,"").trim();x&&!x.startsWith("These are")&&(i=x);continue}if(!d||d.startsWith("#"))continue;let m=d.indexOf("=");if(m===-1)continue;let g=d.substring(0,m).trim(),v=d.substring(m+1).trim();n.push({name:g,value:v,category:i})}return n}function mt(e,t){let o=t?.[8e3]??8e3,r=t?.[3e3]??3e3,n={NEXT_PUBLIC_API_BASE_URL:`http://localhost:${o}/api/v1/`,NEXT_PUBLIC_WS_URL:`ws://localhost:${o}/api/v1/`};return r!==3e3&&(n.NEXT_PUBLIC_APP_URL=`http://localhost:${r}`),n}function ft(e,t){for(let[o,r]of Object.entries(t)){let n=Number(o);for(let[i,c]of Object.entries(e)){let d=new RegExp(`:${n}(?=[/\\s]|$)`,"g");e[i]=c.replaceAll(d,`:${r}`)}}}function gt(e,t){return e.map(o=>({...o,variables:o.variables.map(r=>{let n=$e(r.name,t);return{...r,defaultValue:n||r.defaultValue}})}))}function qe(){return Object.keys(lt.selfhost)}function xt(e){return{...ut[e]}}import*as q from"fs";import*as pe from"path";function je(e){q.existsSync(e)&&q.copyFileSync(e,`${e}.bak`)}function St(e,t){let o=pe.join(e,".env");je(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 i(d){for(let g of n)if(d===g||d.startsWith(`${g}_`))return g;let m=d.split("_");return m.length===1?"Core":m[0]||"Core"}let c=new Map;for(let[d,m]of Object.entries(t)){let g=i(d);c.has(g)||c.set(g,[]);let x=/[\s#"'\\]/.test(m)||m===""?`"${m.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:m;c.get(g).push(`${d}=${x}`)}for(let[d,m]of c.entries())r.push(`# ${d} Configuration`),r.push(...m),r.push("");q.writeFileSync(o,r.join(`
4
- `),"utf-8")}function vt(e,t,o){let r=pe.join(e,"apps","web",".env.local");je(r);let n=dt(e),i=mt(t,o),c=["# GAIA Web App Environment Configuration","# Generated by GAIA CLI",`# Created: ${new Date().toISOString()}`,""],d=new Map;for(let m of n){d.has(m.category)||d.set(m.category,[]);let g=i[m.name]??m.value;d.get(m.category).push({name:m.name,value:g})}if(n.length===0){c.push("# Core URLs");for(let[m,g]of Object.entries(i))c.push(`${m}=${g}`);c.push("")}else for(let[m,g]of d.entries()){c.push(`# ${m}`);for(let{name:v,value:x}of g)c.push(`${v}=${x}`);c.push("")}q.writeFileSync(r,c.join(`
5
- `),"utf-8")}var hr={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){let o=pe.join(e,"infra","docker",".env");je(o);let r=["# Docker Compose port overrides","# Generated by GAIA CLI to resolve port conflicts",`# Created: ${new Date().toISOString()}`,""];for(let[n,i]of Object.entries(t)){let c=Number(n),d=hr[c];d&&r.push(`${d}=${i}`)}r.push(""),q.writeFileSync(o,r.join(`
6
- `),"utf-8")}var ht={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 ie(e){let t=pe.join(e,"infra","docker",".env"),o={};if(!q.existsSync(t))return o;let r=q.readFileSync(t,"utf-8");for(let n of r.split(`
7
- `)){let i=n.trim();if(i&&!i.startsWith("#")){let[c,...d]=i.split("=");if(c&&ht[c]){let m=Number(d.join("=").trim());!Number.isNaN(m)&&m>0&&(o[ht[c]]=m)}}}return o}var vr=e=>new Promise(t=>setTimeout(t,e));async function he(e,t,o){e.setStep("Environment Setup"),e.setStatus("Configuring environment...");let r=await e.waitForInput("setup_mode");e.updateData("setupMode",r),e.setStatus("Configuring environment variables...");let n=await e.waitForInput("env_method"),i={};i.ENV=r==="selfhost"?"production":"development";let c=qe();for(let m of c){let g=$e(m,r);g&&(i[m]=g)}let d=xt(r);for(let[m,g]of Object.entries(d))i[m]=g;if(n==="infisical")await yr(e,i),e.setStatus("Infisical credentials saved. Ensure your Infisical project contains all required variables.");else try{await Tr(e,t,i,r)}catch(m){e.setError(m);return}o&&ft(i,o);try{await br(e,t,i,r,o)}catch(m){e.setError(m);return}await vr(1e3)}async function yr(e,t){e.setStatus("Configuring Infisical...");let o=await e.waitForInput("env_infisical");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 Tr(e,t,o,r){e.setStatus("Parsing environment variables...");let n;try{n=await pt(t),n=gt(n,r)}catch(f){throw new Error(`Failed to parse settings: ${f.message}`)}let i=new Set,c=[],d=new Set;for(let f of n)if(f.alternativeGroup&&!d.has(f.name)){let b=n.find(y=>y.name===f.alternativeGroup);b&&(c.push([f,b]),i.add(f.name),i.add(b.name),d.add(f.name),d.add(b.name))}let m=n.filter(f=>f.variables.length===1&&!i.has(f.name)),g=n.filter(f=>f.variables.length>1&&!i.has(f.name));for(let f of c){e.updateData("alternativeGroups",f),e.setStatus("Choose an AI provider...");let b=await e.waitForInput("env_alternatives");for(let[y,C]of Object.entries(b.values))C&&(o[y]=C)}let v=qe(),l=[...m.flatMap(f=>f.variables).filter(f=>!v.includes(f.name))].sort((f,b)=>f.required&&!b.required?-1:!f.required&&b.required?1:0);e.updateData("envVarTotal",l.length);for(let f=0;f<l.length;f++){let b=l[f];if(!b)continue;e.updateData("currentEnvVar",b),e.updateData("envVarIndex",f),e.setStatus(`Configuring ${b.name}...`);let y=await e.waitForInput("env_var",{varName:b.name});(y||b.required||b.defaultValue)&&(o[b.name]=y||b.defaultValue||"")}let S=[...g].filter(f=>!f.variables.every(b=>v.includes(b.name))).sort((f,b)=>{let y=f.variables.some(I=>I.required),C=b.variables.some(I=>I.required);return y&&!C?-1:!y&&C?1:0});e.updateData("envGroupTotal",S.length);for(let f=0;f<S.length;f++){let b=S[f];if(!b)continue;e.updateData("currentEnvGroup",b),e.updateData("envGroupIndex",f),e.setStatus(`Configuring ${b.name}...`);let y=await e.waitForInput("env_group",{groupName:b.name});for(let[C,I]of Object.entries(y)){let E=b.variables.find(Q=>Q.name===C);(I||E?.required||E?.defaultValue)&&(o[C]=I||E?.defaultValue||"")}}}async function br(e,t,o,r,n){e.setStatus("Writing API environment file...");try{let i=Tt.join(t,"apps","api");St(i,o),e.setStatus("API environment variables configured!")}catch(i){throw new Error(`Failed to write API .env file: ${i.message}`)}e.setStatus("Writing web environment file...");try{vt(t,r,n),e.setStatus("Web environment variables configured!")}catch(i){throw new Error(`Failed to write web .env file: ${i.message}`)}if(n&&Object.keys(n).length>0){e.setStatus("Writing Docker Compose port overrides...");try{yt(t,n),e.setStatus("Docker Compose ports configured!")}catch(i){throw new Error(`Failed to write Docker Compose .env: ${i.message}`)}}}import{execa as Cr}from"execa";import Se from"fs";import Ir from"simple-git";async function bt(e,t,o){if(Se.existsSync(e)){let r=`${e}/.git`;if(!Se.existsSync(r))throw new Error(`Directory ${e} exists but is not a git repository`);await Ir().cwd(e).pull(),o(100,"Already exists, pulled latest")}else try{let r=Cr("git",["clone","--progress",t,e]);r.stderr?.on("data",n=>{let i=n.toString();i.includes("Counting objects")?o(5,"Counting objects"):i.includes("Compressing objects")&&o(10,"Compressing objects");let c=i.match(/Receiving objects:\s+(\d+)%\s+\((\d+)\/(\d+)\)/);if(c?.[1]){let m=Math.min(100,parseInt(c[1],10)),g=c[2],v=c[3];o(10+Math.floor(m*.5),`Receiving objects: ${g}/${v}`)}let d=i.match(/Resolving deltas:\s+(\d+)%\s+\((\d+)\/(\d+)\)/);if(d?.[1]){let m=Math.min(100,parseInt(d[1],10)),g=d[2],v=d[3];o(60+Math.floor(m*.4),`Resolving deltas: ${g}/${v}`)}}),await r,o(100,"Clone complete")}catch(r){throw Se.existsSync(e)&&Se.rmSync(e,{recursive:!0,force:!0}),r}}import{execa as Y}from"execa";var V={git:"https://git-scm.com/downloads",docker:"https://docs.docker.com/get-docker/",mise:"https://mise.jdx.dev/getting-started.html"},wr={8e3:"API Server",5432:"PostgreSQL",6379:"Redis",27017:"MongoDB",5672:"RabbitMQ",3e3:"Web Frontend",8080:"ChromaDB",8083:"Mongo Express"};async function ve(){try{return await Y("git",["--version"]),"success"}catch{return"error"}}async function ye(){let e=!1,t=!1,o;try{await Y("docker",["--version"]),e=!0}catch{return{name:"Docker",installUrl:V.docker,installed:!1,working:!1,errorMessage:"Docker is not installed"}}try{await Y("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:V.docker,installed:e,working:t,errorMessage:o}}async function Te(){try{return await Y("mise",["--version"]),"success"}catch{return"missing"}}async function be(){if((await import("node:os")).platform()==="win32")try{return await Y("powershell",["-Command","irm https://mise.jdx.dev/install.ps1 | iex"]),!0}catch{return!1}try{return await Y("sh",["-c","curl https://mise.jdx.dev/install.sh | sh"]),!0}catch{return!1}}async function Ce(e){let t=await import("node:net"),o=[],r=n=>new Promise(i=>{let c=t.createServer();c.once("error",()=>i(!1)),c.once("listening",()=>{c.close(()=>i(!0))}),c.listen(n)});for(let n of e){let i=wr[n]||`Port ${n}`;if(await r(n))o.push({port:n,service:i,available:!0});else{let d=await Pr(n),m=await Rr(n+1,n+100,r);o.push({port:n,service:i,available:!1,usedBy:d,alternative:m||void 0})}}return o}async function Pr(e){if((await import("node:os")).platform()==="win32"){try{let{stdout:r}=await Y("netstat",["-ano","-p","TCP"]),n=r.trim().split(`
2
+ import{Command as Xr}from"commander";import{render as _r}from"ink";import Or from"react";import{Box as he,Text as Z}from"ink";import mr from"react";import{ProgressBar as Ze,Select as et,Spinner as tt}from"@inkjs/ui";import{Box as p,Text as s,useInput as z}from"ink";import ue from"ink-text-input";import{useEffect as xe,useState as M}from"react";import{Box as le,Text as Je}from"ink";var S="#00bbff";import{Box as Ut,Text as Pe}from"ink";import{jsx as Qe,jsxs as Ye}from"react/jsx-runtime";var Ke=({status:e,step:t})=>t.toLowerCase()==="welcome"?null:Ye(Ut,{width:"100%",borderStyle:"single",borderColor:"gray",paddingX:1,justifyContent:"space-between",children:[Ye(Pe,{color:S,children:[Qe(Pe,{bold:!0,children:"Status:"})," ",t]}),Qe(Pe,{color:"white",dimColor:!0,children:e})]});import{Box as Wt}from"ink";import Xt from"ink-big-text";import Qt from"ink-gradient";import{jsx as Re}from"react/jsx-runtime";var te=()=>Re(Wt,{flexDirection:"column",marginTop:1,marginBottom:1,children:Re(Qt,{colors:[S,"#b0eaff",S],children:Re(Xt,{text:"GAIA",font:"3d"})})});import{jsx as re,jsxs as fe}from"react/jsx-runtime";var Yt=["Welcome","Prerequisites","Repository Setup","Install Tools","Environment Setup","Project Setup","Finished"],ze=["Detect Repo","Prerequisites","Environment Setup","Project Setup","Finished"],Kt=({currentStep:e,steps:t})=>{let o=t.indexOf(e);return re(le,{marginBottom:1,children:t.map((r,n)=>{let i=r===e,c=o>n;return fe(le,{marginRight:2,children:[fe(Je,{color:i?S:c?"green":"gray",children:[c?"\u2713 ":i?"\u25CF ":"\u25CB ",r]}),n<t.length-1&&re(Je,{color:"gray",children:" \u203A "})]},r)})})},ge=({children:e,status:t,step:o,steps:r=Yt})=>fe(le,{flexDirection:"column",height:"100%",width:"100%",children:[fe(le,{flexGrow:1,flexDirection:"column",children:[re(te,{}),re(Kt,{currentStep:o,steps:r}),re(le,{flexDirection:"column",flexGrow:1,children:e})]}),re(Ke,{status:t,step:o})]});import{Fragment as vo,jsx as a,jsxs as u}from"react/jsx-runtime";var De=({label:e,status:t})=>u(p,{children:[a(p,{marginRight:1,children:t==="pending"?a(tt,{type:"dots"}):t==="success"?a(s,{color:S,children:"\u2714"}):t==="error"?a(s,{color:"red",children:"\u2716"}):a(s,{color:"yellow",children:"\u26A0"})}),a(s,{children:e})]}),Jt=({onConfirm:e})=>(z((t,o)=>{o.return&&e()}),u(p,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:S,children:[a(s,{bold:!0,children:"Welcome to the Interactive GAIA Setup"}),u(p,{flexDirection:"column",marginTop:1,marginBottom:1,children:[a(s,{children:"This wizard will guide you through the setup process:"}),a(s,{children:" 1. Check Prerequisites (Git, Docker, Mise)"}),a(s,{children:" 2. Clone Repository (from GitHub)"}),a(s,{children:" 3. Install Tools (node, python, uv via mise)"}),a(s,{children:" 4. Configure Env Vars (databases, API keys, etc.)"}),a(s,{children:" 5. Setup Project (install all dependencies)"})]}),a(s,{color:S,children:"Press Enter to start..."})]})),zt=({portResults:e,onAccept:t,onAbort:o})=>{z((n,i)=>{i.return?t():i.escape&&o()});let r=e.filter(n=>!n.available);return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:"yellow",children:[a(p,{marginBottom:1,children:a(s,{bold:!0,color:"yellow",children:"Port Conflicts Detected"})}),e.map(n=>u(p,{children:[u(s,{color:n.available?"green":n.alternative?"yellow":"red",children:[n.available?"\u2714":n.alternative?"\u26A0":"\u2716"," "]}),u(s,{children:[n.service," (:",n.port,")"]}),!n.available&&u(s,{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)),u(p,{marginTop:1,flexDirection:"column",children:[r.some(n=>!n.alternative)&&a(p,{borderStyle:"single",borderColor:"red",paddingX:1,marginBottom:1,children:a(s,{color:"red",children:"Some ports have no available alternative. Free them and retry."})}),!r.some(n=>!n.alternative)&&r.some(n=>n.alternative)&&a(s,{color:"gray",children:"Alternative ports will be used for conflicting services."}),a(p,{marginTop:1,children:u(s,{children:[a(s,{color:"green",bold:!0,children:"Enter"})," to continue with alternatives ",a(s,{color:"yellow",bold:!0,children:"Escape"})," to abort"]})})]})]})},Zt=({defaultValue:e,onSubmit:t})=>{let[o,r]=M(e);return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:S,children:[a(s,{children:"Where should we clone the repository?"}),u(p,{children:[a(s,{color:S,children:"\u279C "}),a(ue,{value:o,onChange:r,onSubmit:t})]}),u(s,{color:"gray",children:["(Press Enter for default: ",e,")"]})]})},er=({setupMode:e,repoPath:t,portOverrides:o,onConfirm:r})=>{z((m,g)=>{g.return&&r()});let n=e||"developer",i=t||"./gaia",c=o?.[3e3]??3e3,d=o?.[8e3]??8e3;return u(p,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:S,padding:1,children:[a(s,{color:S,bold:!0,children:"You are all set!"}),u(p,{marginTop:1,flexDirection:"column",children:[a(s,{bold:!0,children:"To start GAIA, run:"}),u(p,{marginTop:1,padding:1,borderStyle:"single",borderColor:"gray",flexDirection:"column",children:[u(s,{color:"cyan",children:["$ cd ",i]}),a(s,{color:"cyan",children:"$ gaia start"})]}),a(p,{marginTop:1,children:a(s,{color:"gray",dimColor:!0,children:n==="selfhost"?"Runs: docker compose --profile all up -d (background)":"Runs: mise dev (interactive \u2014 keep terminal open)"})})]}),u(p,{marginTop:1,flexDirection:"column",children:[a(s,{bold:!0,children:"Access GAIA at:"}),u(p,{marginLeft:2,flexDirection:"column",children:[u(s,{children:["Web:"," ",u(s,{color:"cyan",bold:!0,children:["http://localhost:",c]})]}),u(s,{children:["API:"," ",u(s,{color:"cyan",bold:!0,children:["http://localhost:",d]})]})]})]}),a(ke,{}),a(p,{marginTop:1,children:a(s,{dimColor:!0,children:"Press Enter to exit"})})]})},ke=()=>u(p,{marginTop:1,flexDirection:"column",children:[a(s,{bold:!0,children:"Available commands:"}),u(p,{marginLeft:2,flexDirection:"column",children:[u(s,{children:[u(s,{color:S,bold:!0,children:["gaia start"," "]}),a(s,{color:"gray",children:" Start all services"})]}),u(s,{children:[u(s,{color:S,bold:!0,children:["gaia stop"," "]}),a(s,{color:"gray",children:" Stop all services"})]}),u(s,{children:[a(s,{color:S,bold:!0,children:"gaia status"}),a(s,{color:"gray",children:" Check service health"})]}),u(s,{children:[u(s,{color:S,bold:!0,children:["gaia setup"," "]}),a(s,{color:"gray",children:" Reconfigure environment"})]})]})]}),tr=({phase:e,progress:t,isComplete:o,logs:r,title:n})=>u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:S,children:[a(p,{marginBottom:1,children:a(s,{bold:!0,color:S,children:n||"Installing Dependencies"})}),u(p,{flexDirection:"column",gap:1,children:[a(p,{children:o?u(s,{color:"green",children:["\u2713 ",e]}):a(tt,{label:e||"Preparing..."})}),!o&&t>0&&a(p,{width:50,children:a(Ze,{value:t})}),!o&&r&&r.length>0&&a(p,{flexDirection:"column",marginTop:1,borderStyle:"single",borderColor:"gray",paddingX:1,paddingY:0,minHeight:6,children:r.map((i,c)=>a(s,{color:"gray",wrap:"truncate",children:i},c))})]})]});var Be=({onSelect:e})=>u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:S,children:[a(s,{bold:!0,children:"Setup Mode"}),a(p,{marginTop:1,children:a(s,{color:"gray",children:"How do you want to run GAIA?"})}),a(p,{marginTop:1,children:a(et,{options:[{label:"Self-Host (Docker)",value:"selfhost"},{label:"Developer Mode (Local)",value:"developer"}],onChange:o=>e(o)})}),u(p,{marginTop:1,flexDirection:"column",children:[a(s,{color:"gray",dimColor:!0,children:"Self-Host: Run everything in Docker containers (recommended for deployment)"}),a(s,{color:"gray",dimColor:!0,children:"Developer: Run backend locally with Docker services (recommended for contributing)"})]})]}),Ae=({onSelect:e})=>u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:S,children:[a(s,{bold:!0,children:"Environment Variables Setup"}),a(p,{marginTop:1,children:a(s,{color:"gray",children:"Choose how you want to configure environment variables:"})}),a(p,{marginTop:1,children:a(et,{options:[{label:"Manual Setup (Recommended)",value:"manual"},{label:"Infisical (Advanced)",value:"infisical"}],onChange:o=>e(o)})}),u(p,{marginTop:1,flexDirection:"column",children:[a(s,{color:"gray",dimColor:!0,children:"Manual Setup: Configure variables interactively (recommended for most users)"}),a(s,{color:"gray",dimColor:!0,children:"Infisical: All secrets managed in Infisical dashboard (requires pre-configuration)"})]})]}),_e=({onSubmit:e})=>{let[t,o]=M({INFISICAL_TOKEN:"",INFISICAL_PROJECT_ID:"",INFISICAL_MACHINE_IDENTITY_CLIENT_ID:"",INFISICAL_MACHINE_IDENTITY_CLIENT_SECRET:""}),[r,n]=M(0),[i,c]=M(null),d=[{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"}];z((g,v)=>{if(v.tab||v.downArrow)n(h=>h<d.length-1?h+1:h);else if(v.upArrow)n(h=>h>0?h-1:h);else if(v.return){if(r<d.length-1){n(l=>l+1);return}let h=d.filter(l=>!t[l.key].trim());if(h.length>0){c(`Required: ${h.map(x=>x.key).join(", ")}`);let l=d.findIndex(x=>!t[x.key].trim());l>=0&&n(l);return}e(t)}});let m=d[r];return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:S,children:[a(p,{marginBottom:1,children:a(s,{bold:!0,color:S,children:"Infisical Configuration"})}),a(p,{marginBottom:1,borderStyle:"single",borderColor:"cyan",paddingX:1,children:a(s,{color:"cyan",children:"All environment variables (API keys, auth secrets, etc.) must be configured in your Infisical project. Only Infisical credentials will be stored locally."})}),u(p,{marginBottom:1,flexDirection:"column",children:[a(s,{color:"gray",children:"Configure your Infisical credentials."}),u(s,{color:"gray",dimColor:!0,children:["Visit"," ",a(s,{color:"cyan",underline:!0,children:"app.infisical.com"})," ","to get these values."]})]}),d.map((g,v)=>{let h=g.key.includes("SECRET")||g.key.includes("TOKEN");return u(p,{flexDirection:"column",marginBottom:1,children:[a(p,{children:u(s,{color:v===r?S:"white",children:[v===r?"\u25B8 ":" ",g.key,":"]})}),a(p,{marginLeft:2,children:a(s,{color:"gray",dimColor:!0,children:g.description})}),v===r?a(p,{marginLeft:2,children:a(ue,{value:t[g.key],onChange:l=>{o(x=>({...x,[g.key]:l})),c(null)},placeholder:"Enter value...",mask:h?"*":void 0})}):a(p,{marginLeft:2,children:a(s,{color:t[g.key]?"green":"gray",children:t[g.key]?h?`\u2713 ${"*".repeat(8)}`:`\u2713 ${t[g.key]}`:"(not set)"})})]},g.key)}),i&&a(p,{marginTop:1,children:a(s,{color:"red",children:i})}),a(p,{marginTop:1,children:a(s,{color:"gray",dimColor:!0,children:"\u2191\u2193/Tab to navigate \u2022 Enter to confirm"})})]})},Oe=({category:e,currentIndex:t,totalGroups:o,onSubmit:r})=>{let[n,i]=M(()=>{let l={};for(let x of e.variables)l[x.name]=x.defaultValue||"";return l}),[c,d]=M(0),[m,g]=M(null);xe(()=>{let l={};for(let x of e.variables)l[x.name]=x.defaultValue||"";i(l),d(0),g(null)},[e.name]),z((l,x)=>{if(x.tab||x.downArrow)d(f=>f<e.variables.length-1?f+1:f);else if(x.upArrow)d(f=>f>0?f-1:f);else if(x.escape){let f=e.variables.filter(b=>b.required&&!n[b.name]?.trim());if(f.length>0){g(`Required fields cannot be skipped: ${f.map(b=>b.name).join(", ")}`);return}r(n)}});let v=()=>{if(c<e.variables.length-1)d(c+1);else{let l=e.variables.filter(x=>x.required&&!n[x.name]?.trim());if(l.length>0){g(`Required fields are missing: ${l.map(x=>x.name).join(", ")}`);return}g(null),r(n)}},h=e.variables.some(l=>l.required);return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:m?"red":S,children:[u(p,{justifyContent:"space-between",children:[u(s,{bold:!0,children:["Configure ",e.name]}),u(s,{color:"gray",children:["Group ",t+1," / ",o]})]}),u(p,{marginTop:1,flexDirection:"column",children:[u(p,{children:[u(s,{color:"cyan",bold:!0,children:["Purpose:"," "]}),a(s,{color:"white",children:e.description})]}),e.affectedFeatures&&u(p,{children:[u(s,{color:"cyan",bold:!0,children:["Affects:"," "]}),a(s,{color:"gray",children:e.affectedFeatures})]}),e.docsUrl&&u(p,{marginTop:1,children:[a(s,{color:"green",children:"\u{1F4D6} Docs: "}),a(s,{color:"blue",underline:!0,children:e.docsUrl})]})]}),a(p,{marginTop:1,flexDirection:"column",children:e.variables.map((l,x)=>{let f=x===c,b=!!l.defaultValue;return u(p,{flexDirection:"column",marginBottom:1,children:[u(p,{children:[u(s,{color:f?S:"gray",bold:f,children:[f?"\u279C ":" ",l.name]}),l.required&&u(s,{color:"red",bold:!0,children:[" ","*"]}),b&&!f&&u(s,{color:"gray",dimColor:!0,children:[" ","(default: ",l.defaultValue,")"]})]}),f&&a(p,{marginLeft:2,children:a(ue,{value:n[l.name]||"",onChange:y=>{i(C=>({...C,[l.name]:y})),m&&g(null)},onSubmit:v,placeholder:b?`Default: ${l.defaultValue}`:l.required?"Enter a value (required)":"Press Enter to skip"})})]},l.name)})}),m&&a(p,{marginTop:1,children:u(s,{color:"red",bold:!0,children:["\u26A0 ",m]})}),a(p,{marginTop:1,flexDirection:"column",children:u(s,{color:"gray",dimColor:!0,children:["\u21B5 Enter to next field \u2022 Tab/\u2193 move down \u2022 \u2191 move up",!h&&" \u2022 ESC skip group"]})})]})},Me=({alternatives:e,onSubmit:t})=>{let[o,r]=M(new Set),[n,i]=M({}),[c,d]=M(0),[m,g]=M(null);xe(()=>{let y={};for(let C of e)for(let I of C.variables)y[I.name]=I.defaultValue||"";i(y)},[e]);let v=[];for(let y=0;y<e.length;y++)if(v.push({type:"provider",categoryIndex:y}),o.has(y)){let C=e[y];if(C)for(let I=0;I<C.variables.length;I++)v.push({type:"field",categoryIndex:y,fieldIndex:I})}v.push({type:"submit"});let h=v[c],l=h?.type==="field",x=h?.type==="submit";z((y,C)=>{let I=Math.min(c,v.length-1);if(I!==c){d(I);return}if(l)C.upArrow?d(E=>Math.max(0,E-1)):(C.downArrow||C.tab)&&d(E=>Math.min(v.length-1,E+1));else if(x)C.upArrow?d(E=>Math.max(0,E-1)):(C.return||y===" ")&&b();else if(C.upArrow)d(E=>Math.max(0,E-1));else if(C.downArrow||C.tab)d(E=>Math.min(v.length-1,E+1));else if((C.return||y===" ")&&h?.type==="provider"){let E=h.categoryIndex;r(Q=>{let D=new Set(Q);return D.has(E)?D.delete(E):D.add(E),D}),m&&g(null)}});let f=()=>{m&&g(null),d(y=>Math.min(v.length-1,y+1))},b=()=>{let y=[],C={};for(let I of o){let E=e[I];if(!E)continue;if(E.variables.some(D=>n[D.name]?.trim())){y.push(E.name);for(let D of E.variables){let me=n[D.name];me&&(C[D.name]=me)}}}if(y.length===0){o.size===0?g("Enable at least one provider (press Space or Enter)"):g("Enter a value for at least one field");return}t(y,C)};return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:m?"red":S,children:[u(p,{justifyContent:"space-between",children:[a(s,{bold:!0,children:"Configure AI Provider"}),a(s,{color:"yellow",children:"* At least one required"})]}),a(p,{marginTop:1,children:a(s,{color:"gray",children:"Enable and configure at least one AI provider below:"})}),a(p,{marginTop:1,flexDirection:"column",children:e.map((y,C)=>{let I=o.has(C),E=v.findIndex(D=>D.type==="provider"&&D.categoryIndex===C),Q=c===E;return u(p,{flexDirection:"column",marginBottom:1,children:[u(p,{children:[a(s,{color:Q?S:void 0,bold:Q,children:Q?"\u279C ":" "}),a(s,{color:I?"green":"gray",children:I?"[\u2714]":"[ ]"}),u(s,{color:I?S:"gray",bold:I,children:[" ",y.name]}),y.description&&u(s,{color:"gray",dimColor:!0,children:[" ","- ",y.description]})]}),Q&&y.docsUrl&&u(p,{marginLeft:6,children:[a(s,{color:"yellow",children:"\u{1F4D6} "}),a(s,{color:"blue",underline:!0,children:y.docsUrl})]}),I&&a(p,{marginLeft:4,flexDirection:"column",marginTop:1,children:y.variables.map((D,me)=>{let Ht=v.findIndex(ce=>ce.type==="field"&&ce.categoryIndex===C&&ce.fieldIndex===me),ee=c===Ht,Xe=!!D.defaultValue,we=n[D.name]||"";return u(p,{flexDirection:"column",marginBottom:1,children:[u(p,{children:[u(s,{color:ee?S:"gray",bold:ee,children:[ee?" \u279C ":" ",D.name]}),!ee&&we&&a(s,{color:"green",children:" \u2713"}),!ee&&!we&&Xe&&u(s,{color:"gray",dimColor:!0,children:[" ","(default: ",D.defaultValue,")"]})]}),ee&&a(p,{marginLeft:4,children:a(ue,{value:we,onChange:ce=>{i(Vt=>({...Vt,[D.name]:ce})),m&&g(null)},onSubmit:f,placeholder:Xe?`Default: ${D.defaultValue}`:"Enter value..."})})]},D.name)})})]},y.name)})}),m&&a(p,{marginTop:1,children:u(s,{color:"red",bold:!0,children:["\u26A0 ",m]})}),u(p,{marginTop:1,children:[a(s,{color:x?S:void 0,bold:x,children:x?"\u279C ":" "}),a(p,{borderStyle:"round",borderColor:x?S:"gray",paddingX:2,children:a(s,{color:x?S:"gray",bold:x,children:"Continue \u2192"})})]}),a(p,{marginTop:1,children:a(s,{color:"gray",dimColor:!0,children:"\u2191/\u2193 navigate \u2022 Space/Enter toggle/select \u2022 Tab skip field"})})]})},Le=({currentVar:e,currentIndex:t,totalCount:o,onSubmit:r,onSkip:n})=>{let[i,c]=M(e.defaultValue||""),[d,m]=M(null);xe(()=>{c(e.defaultValue||""),m(null)},[e.name]),z((h,l)=>{if(l.escape){if(e.required&&!i.trim()){m("This field is required and cannot be skipped");return}n()}});let g=h=>{if(e.required&&!h.trim()){m("This field is required");return}m(null),r(h)},v=!!e.defaultValue;return u(p,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:d?"red":S,children:[u(p,{justifyContent:"space-between",children:[a(s,{bold:!0,children:"Configure Environment Variables"}),u(s,{color:"gray",children:[t+1," / ",o]})]}),u(p,{marginTop:1,flexDirection:"column",children:[u(p,{children:[a(s,{color:S,bold:!0,children:e.name}),e.required?u(s,{color:"red",bold:!0,children:[" ","* required"]}):u(s,{color:"gray",dimColor:!0,children:[" ","(optional)"]})]}),u(p,{marginTop:1,children:[u(s,{color:"cyan",bold:!0,children:["Category:"," "]}),a(s,{color:"white",children:e.category})]}),u(p,{children:[u(s,{color:"cyan",bold:!0,children:["Purpose:"," "]}),a(s,{color:"white",children:e.description})]}),e.affectedFeatures&&u(p,{children:[u(s,{color:"cyan",bold:!0,children:["Affects:"," "]}),a(s,{color:"gray",children:e.affectedFeatures})]}),e.docsUrl&&u(p,{marginTop:1,children:[a(s,{color:"green",children:"\u{1F4D6} Docs: "}),a(s,{color:"blue",underline:!0,children:e.docsUrl})]}),v&&u(p,{marginTop:1,children:[u(s,{color:"green",bold:!0,children:["Default:"," "]}),a(s,{color:"white",children:e.defaultValue})]})]}),u(p,{marginTop:1,children:[a(s,{color:S,children:"\u279C "}),a(ue,{value:i,onChange:h=>{c(h),d&&m(null)},onSubmit:g,placeholder:v?"Press Enter to use default":e.required?"Enter a value (required)":"Press Enter to skip"})]}),d&&a(p,{marginTop:1,children:u(s,{color:"red",bold:!0,children:["\u26A0 ",d]})}),a(p,{marginTop:1,flexDirection:"column",children:e.required?a(s,{color:"yellow",dimColor:!0,children:"\u21B5 Enter to confirm (required field)"}):v?a(s,{color:"green",dimColor:!0,children:"\u21B5 Enter to use default \u2022 ESC to skip"}):a(s,{color:"gray",dimColor:!0,children:"\u21B5 Enter to confirm \u2022 ESC to skip"})})]})},rt=({store:e})=>{let[t,o]=M(e.currentState);return xe(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),u(ge,{status:t.status,step:t.step,children:[t.step==="Welcome"&&t.inputRequest?.id==="welcome"&&a(Jt,{onConfirm:()=>e.submitInput(!0)}),t.step==="Prerequisites"&&t.data.checks&&u(p,{flexDirection:"column",borderStyle:"round",paddingX:1,borderColor:S,children:[a(s,{bold:!0,children:"System Checks"}),u(p,{flexDirection:"column",marginTop:1,children:[a(De,{label:"Git",status:t.data.checks.git}),a(De,{label:"Docker",status:t.data.checks.docker}),a(De,{label:"Mise",status:t.data.checks.mise})]})]}),t.inputRequest?.id==="port_conflicts"&&t.data.portConflicts&&a(zt,{portResults:t.data.portConflicts,onAccept:()=>e.submitInput("accept"),onAbort:()=>e.submitInput("abort")}),t.inputRequest?.id==="repo_path"&&a(Zt,{defaultValue:t.inputRequest.meta.default,onSubmit:r=>e.submitInput(r)}),t.step==="Repository Setup"&&u(p,{flexDirection:"column",borderStyle:"round",padding:1,borderColor:S,children:[a(s,{bold:!0,children:"Cloning Repository"}),u(p,{marginTop:1,flexDirection:"column",children:[a(Ze,{value:t.data.repoProgress||0}),t.data.repoPhase&&a(p,{marginTop:1,children:a(s,{color:"gray",children:t.data.repoPhase})})]})]}),t.inputRequest?.id==="setup_mode"&&a(Be,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_method"&&a(Ae,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_infisical"&&a(_e,{onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_var"&&t.data.currentEnvVar&&a(Le,{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&&a(Oe,{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&&a(Me,{alternatives:t.data.alternativeGroups,onSubmit:(r,n)=>e.submitInput({selectedGroups:r,values:n})}),t.step==="Finished"&&a(er,{setupMode:t.data.setupMode,repoPath:t.data.repoPath,portOverrides:t.data.portOverrides,onConfirm:()=>e.submitInput(!0)}),(t.step==="Install Tools"||t.step==="Project Setup")&&a(tr,{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.error&&a(p,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:u(s,{color:"red",children:["Error: ",t.error.message]})})]})};import{Spinner as rr}from"@inkjs/ui";import{Box as N,Text as O,useInput as or}from"ink";import{useEffect as nr,useState as ir}from"react";import{jsx as F,jsxs as B}from"react/jsx-runtime";var ot=({store:e,command:t})=>{let[o,r]=ir(e.currentState);nr(()=>{let i=()=>r({...e.currentState});return e.on("change",i),()=>{e.off("change",i)}},[e]),or((i,c)=>{(c.return||c.escape)&&(o.data.started||o.data.stopped||o.error)&&e.submitInput("exit")});let n=t==="start";return B(N,{flexDirection:"column",width:"100%",children:[F(te,{}),(o.step==="Starting"||o.step==="Stopping")&&B(N,{flexDirection:"column",marginTop:1,paddingX:2,borderStyle:"round",borderColor:S,children:[F(rr,{label:o.status||"Working..."}),o.data.repoPath&&F(N,{marginTop:1,children:B(O,{color:"gray",children:["Repository: ",o.data.repoPath]})}),o.data.setupMode&&F(N,{children:B(O,{color:"gray",children:["Mode: ",o.data.setupMode]})})]}),o.step==="Running"&&o.data.started&&B(N,{flexDirection:"column",marginTop:1,paddingX:2,paddingY:1,borderStyle:"round",borderColor:"green",children:[B(O,{color:"green",bold:!0,children:["\u2713"," GAIA is running!"]}),o.data.setupMode!=="developer"&&B(N,{marginTop:1,flexDirection:"column",children:[B(O,{children:["Web:"," ",B(O,{color:"cyan",bold:!0,children:["http://localhost:",o.data.webPort||3e3]})]}),B(O,{children:["API:"," ",B(O,{color:"cyan",bold:!0,children:["http://localhost:",o.data.apiPort||8e3]})]})]}),o.data.setupMode==="developer"&&B(N,{marginTop:1,flexDirection:"column",children:[F(O,{color:"gray",children:"Dev servers started in background."}),B(O,{color:"gray",children:["Logs: ",F(O,{color:S,children:"dev-start.log"})," in your repo root."]}),B(O,{color:"gray",children:["Run ",F(O,{color:S,children:"gaia stop"})," to shut down."]})]}),F(N,{marginTop:1,children:F(O,{dimColor:!0,children:"Press Enter to exit"})})]}),o.step==="Stopped"&&o.data.stopped&&B(N,{flexDirection:"column",marginTop:1,paddingX:2,paddingY:1,borderStyle:"round",borderColor:S,children:[B(O,{color:S,bold:!0,children:["\u2713"," All GAIA services stopped."]}),F(N,{marginTop:1,children:F(O,{dimColor:!0,children:"Press Enter to exit"})})]}),o.error&&B(N,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:[B(O,{color:"red",children:["Error: ",o.error.message]}),F(N,{marginTop:1,children:F(O,{dimColor:!0,children:"Press Enter to exit"})})]})]})};import{ProgressBar as ar,Spinner as Ne}from"@inkjs/ui";import{Box as R,Text as w,useInput as nt}from"ink";import{useEffect as sr,useState as cr}from"react";import{jsx as T,jsxs as k}from"react/jsx-runtime";var it=({store:e})=>{let[t,o]=cr(e.currentState);return sr(()=>{let r=()=>o({...e.currentState});return e.on("change",r),()=>{e.off("change",r)}},[e]),k(ge,{status:t.status,step:t.step,steps:ze,children:[t.step==="Detect Repo"&&k(R,{flexDirection:"column",paddingX:2,borderStyle:"round",borderColor:S,children:[T(w,{bold:!0,children:"Detecting GAIA Repository"}),T(R,{marginTop:1,children:T(Ne,{label:"Searching for repository..."})}),t.data.repoPath&&T(R,{marginTop:1,children:k(w,{color:"green",children:["Found: ",t.data.repoPath]})})]}),t.step==="Prerequisites"&&t.data.checks&&k(R,{flexDirection:"column",borderStyle:"round",paddingX:1,borderColor:S,children:[T(w,{bold:!0,children:"System Checks"}),k(R,{flexDirection:"column",marginTop:1,children:[T(Fe,{label:"Git",status:t.data.checks.git}),T(Fe,{label:"Docker",status:t.data.checks.docker}),T(Fe,{label:"Mise",status:t.data.checks.mise})]})]}),t.inputRequest?.id==="port_conflicts"&&t.data.portConflicts&&T(lr,{portResults:t.data.portConflicts,onAccept:()=>e.submitInput("accept"),onAbort:()=>e.submitInput("abort")}),t.inputRequest?.id==="setup_mode"&&T(Be,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_method"&&T(Ae,{onSelect:r=>e.submitInput(r)}),t.inputRequest?.id==="env_infisical"&&T(_e,{onSubmit:r=>e.submitInput(r)}),t.step==="Environment Setup"&&t.inputRequest?.id==="env_var"&&t.data.currentEnvVar&&T(Le,{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&&T(Oe,{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&&T(Me,{alternatives:t.data.alternativeGroups,onSubmit:(r,n)=>e.submitInput({selectedGroups:r,values:n})}),t.step==="Project Setup"&&k(R,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:S,children:[T(R,{marginBottom:1,children:T(w,{bold:!0,color:S,children:"Project Setup"})}),k(R,{flexDirection:"column",gap:1,children:[T(R,{children:t.data.dependencyComplete?k(w,{color:"green",children:["\u2713"," ",t.data.dependencyPhase]}):T(Ne,{label:t.data.dependencyPhase||"Preparing..."})}),!t.data.dependencyComplete&&t.data.dependencyProgress>0&&T(R,{width:50,children:T(ar,{value:t.data.dependencyProgress})}),!t.data.dependencyComplete&&t.data.dependencyLogs?.length>0&&T(R,{flexDirection:"column",marginTop:1,borderStyle:"single",borderColor:"gray",paddingX:1,minHeight:6,children:t.data.dependencyLogs.map((r,n)=>T(w,{color:"gray",wrap:"truncate",children:r},n))})]})]}),t.step==="Finished"&&T(ur,{setupMode:t.data.setupMode,repoPath:t.data.repoPath,onConfirm:()=>e.submitInput(!0)}),t.error&&T(R,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:k(w,{color:"red",children:["Error: ",t.error.message]})})]})},Fe=({label:e,status:t})=>k(R,{children:[T(R,{marginRight:1,children:t==="pending"?T(Ne,{type:"dots"}):t==="success"?T(w,{color:S,children:"\u2714"}):t==="error"?T(w,{color:"red",children:"\u2716"}):T(w,{color:"yellow",children:"\u26A0"})}),T(w,{children:e})]}),lr=({portResults:e,onAccept:t,onAbort:o})=>(nt((r,n)=>{n.return?t():n.escape&&o()}),k(R,{flexDirection:"column",marginTop:1,paddingX:1,borderStyle:"round",borderColor:"yellow",children:[T(w,{bold:!0,color:"yellow",children:"Port Conflicts Detected"}),e.map(r=>k(R,{children:[k(w,{color:r.available?"green":"red",children:[r.available?"\u2714":"\u2716"," "]}),k(w,{children:[r.service," (:",r.port,")"]}),!r.available&&k(w,{color:"gray",children:[" ","- in use",r.usedBy?` by ${r.usedBy}`:"",r.alternative?` (alt: :${r.alternative})`:""]})]},r.port)),T(R,{marginTop:1,children:k(w,{children:[T(w,{color:"green",bold:!0,children:"Enter"})," continue ",T(w,{color:"yellow",bold:!0,children:"Escape"})," abort"]})})]})),ur=({setupMode:e,repoPath:t,onConfirm:o})=>(nt((i,c)=>{c.return&&o()}),k(R,{flexDirection:"column",marginTop:2,borderStyle:"round",borderColor:S,padding:1,children:[T(w,{color:S,bold:!0,children:"Setup Complete!"}),k(R,{marginTop:1,flexDirection:"column",children:[T(w,{bold:!0,children:"To start GAIA, run:"}),k(R,{marginTop:1,padding:1,borderStyle:"single",borderColor:"gray",flexDirection:"column",children:[k(w,{color:"cyan",children:["$ cd ",t||"."]}),T(w,{color:"cyan",children:"$ gaia start"})]}),T(R,{marginTop:1,children:T(w,{color:"gray",dimColor:!0,children:(e||"developer")==="selfhost"?"Runs: docker compose --profile all up -d (background)":"Runs: mise dev (interactive \u2014 keep terminal open)"})})]}),T(ke,{}),T(R,{marginTop:1,children:T(w,{dimColor:!0,children:"Press Enter to exit"})})]}));import{Spinner as pr}from"@inkjs/ui";import{Box as A,Text as _,useInput as dr}from"ink";import{useEffect as at,useState as st}from"react";import{jsx as P,jsxs as L}from"react/jsx-runtime";var ct=({store:e})=>{let[t,o]=st(e.currentState),[r,n]=st(!1);return at(()=>{let i=()=>o({...e.currentState});return e.on("change",i),()=>{e.off("change",i)}},[e]),at(()=>{t.step==="Results"&&n(!1)},[t.step]),dr((i,c)=>{(c.return||c.escape)&&t.step==="Results"&&e.submitInput("exit"),i==="r"&&t.step==="Results"&&t.data.refreshable&&!r&&(n(!0),e.submitInput("refresh"))}),L(A,{flexDirection:"column",width:"100%",children:[P(te,{}),t.step==="Checking"&&P(A,{marginTop:1,children:P(pr,{label:t.data.services?"Refreshing service health...":"Checking service health..."})}),t.step==="Results"&&t.data.services&&L(A,{flexDirection:"column",children:[L(A,{flexDirection:"column",borderStyle:"round",borderColor:S,paddingX:2,paddingY:1,children:[P(_,{bold:!0,color:S,children:"GAIA Service Status"}),L(A,{marginTop:1,flexDirection:"column",children:[L(A,{children:[P(A,{width:22,children:P(_,{bold:!0,children:"Service"})}),P(A,{width:10,children:P(_,{bold:!0,children:"Status"})}),P(A,{width:10,children:P(_,{bold:!0,children:"Latency"})})]}),P(_,{color:"gray",children:"\u2500".repeat(42)}),t.data.services.map(i=>L(A,{children:[P(A,{width:22,children:L(_,{children:[i.name," (:",i.port,")"]})}),P(A,{width:10,children:P(_,{color:i.status==="up"?"green":"red",bold:!0,children:i.status==="up"?"\u2713 UP":"\u2717 DOWN"})}),P(A,{width:10,children:P(_,{color:"gray",children:i.latency?`${i.latency}ms`:"--"})})]},i.name))]})]}),t.data.docker&&L(A,{flexDirection:"column",borderStyle:"round",borderColor:"gray",paddingX:2,paddingY:1,marginTop:1,children:[P(_,{bold:!0,children:"Docker Containers"}),L(_,{color:"gray",children:["Docker:"," ",t.data.docker.running?P(_,{color:"green",children:"Running"}):P(_,{color:"red",children:"Not running"})]}),t.data.docker.containers?.length>0&&P(A,{marginTop:1,flexDirection:"column",children:t.data.docker.containers.map(i=>L(A,{children:[L(_,{color:i.status==="running"?"green":"red",children:[i.status==="running"?"\u2713":"\u2717"," "]}),P(_,{children:i.name}),i.health&&L(_,{color:"gray",children:[" (",i.health,")"]})]},i.name))})]}),P(A,{marginTop:1,children:L(_,{dimColor:!0,children:["Press Enter or Escape to exit \xB7 Press"," ",P(_,{color:S,children:"r"})," to refresh"]})})]}),t.error&&P(A,{borderStyle:"single",borderColor:"red",padding:1,marginTop:2,children:L(_,{color:"red",children:["Error: ",t.error.message]})})]})};import{jsx as G,jsxs as pe}from"react/jsx-runtime";var fr=["init","setup","status","start","stop"],Ge=class extends mr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}render(){return this.state.error?pe(he,{flexDirection:"column",padding:1,children:[G(Z,{color:"red",bold:!0,children:"An unexpected error occurred:"}),G(Z,{color:"red",children:this.state.error.message}),this.state.error.stack&&G(he,{marginTop:1,children:G(Z,{color:"gray",dimColor:!0,children:this.state.error.stack})})]}):this.props.children}},gr=({store:e,command:t})=>{switch(t){case"init":return G(rt,{store:e});case"setup":return G(it,{store:e});case"status":return G(ct,{store:e});case"start":case"stop":return G(ot,{store:e,command:t});default:return pe(he,{flexDirection:"column",padding:1,children:[pe(Z,{color:"red",children:["Unknown command: ",t]}),pe(he,{marginTop:1,flexDirection:"column",children:[G(Z,{bold:!0,children:"Available commands:"}),fr.map(o=>pe(Z,{children:[" ",G(Z,{color:"cyan",children:o})]},o))]})]})}},j=({store:e,command:t})=>G(Ge,{children:G(gr,{store:e,command:t})});import{EventEmitter as xr}from"events";var hr=150,$e=class extends xr{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))},hr))}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())}},H=()=>new $e;import*as se from"fs";import*as bt from"path";import*as ne from"node:fs";import*as oe from"node:path";import{execa as lt}from"execa";var qe={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/"}},ut={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 je(e,t){return qe[t][e]??ut[t][e]}async function pt(e){let t=oe.join(e,"apps/api/scripts/dump_config_schema.py"),o=oe.join(e,"apps/api/app/config/settings_validator.py"),r=oe.join(e,"apps/api/app/config/settings.py");if(!ne.existsSync(t))throw new Error("dump_config_schema.py not found in apps/api/scripts");try{try{let{stdout:n}=await lt("python3",[t,o,r],{cwd:e});return JSON.parse(n)}catch{let{stdout:n}=await lt("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 dt(e){let t=oe.join(e,"apps","web",".env.local"),o=ne.existsSync(t)?t:oe.join(e,"apps","web",".env");if(!ne.existsSync(o))return[];let r=ne.readFileSync(o,"utf-8"),n=[],i="General";for(let c of r.split(`
3
+ `)){let d=c.trim();if(d.startsWith("#")&&!d.startsWith("#=")){let h=d.replace(/^#+\s*/,"").trim();h&&!h.startsWith("These are")&&(i=h);continue}if(!d||d.startsWith("#"))continue;let m=d.indexOf("=");if(m===-1)continue;let g=d.substring(0,m).trim(),v=d.substring(m+1).trim();n.push({name:g,value:v,category:i})}return n}function mt(e,t){let o=t?.[8e3]??8e3,r=t?.[3e3]??3e3,n={NEXT_PUBLIC_API_BASE_URL:`http://localhost:${o}/api/v1/`,NEXT_PUBLIC_WS_URL:`ws://localhost:${o}/api/v1/`};return r!==3e3&&(n.NEXT_PUBLIC_APP_URL=`http://localhost:${r}`),n}function ft(e,t,o){let r=o==="selfhost"?new Set(Object.keys(qe.selfhost)):new Set;for(let[n,i]of Object.entries(t)){let c=Number(n),d=Number(i);for(let[m,g]of Object.entries(e)){if(r.has(m))continue;if(g===String(c)){e[m]=String(d);continue}let v=new RegExp(`:${c}(?=[/\\s]|$)`,"g");e[m]=g.replaceAll(v,`:${d}`)}}}function gt(e,t){return e.map(o=>({...o,variables:o.variables.map(r=>{let n=je(r.name,t);return{...r,defaultValue:n||r.defaultValue}})}))}function He(){return Object.keys(qe.selfhost)}function xt(e){return{...ut[e]}}import*as q from"fs";import*as de from"path";function Ve(e){q.existsSync(e)&&q.copyFileSync(e,`${e}.bak`)}function St(e,t){let o=de.join(e,".env");Ve(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 i(d){for(let g of n)if(d===g||d.startsWith(`${g}_`))return g;let m=d.split("_");return m.length===1?"Core":m[0]||"Core"}let c=new Map;for(let[d,m]of Object.entries(t)){let g=i(d);c.has(g)||c.set(g,[]);let h=/[\s#"'\\]/.test(m)||m===""?`"${m.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:m;c.get(g).push(`${d}=${h}`)}for(let[d,m]of c.entries())r.push(`# ${d} Configuration`),r.push(...m),r.push("");q.writeFileSync(o,r.join(`
4
+ `),"utf-8")}function vt(e,t,o){let r=de.join(e,"apps","web",".env.local");Ve(r);let n=dt(e),i=mt(t,o),c=["# GAIA Web App Environment Configuration","# Generated by GAIA CLI",`# Created: ${new Date().toISOString()}`,""],d=new Map;for(let m of n){d.has(m.category)||d.set(m.category,[]);let g=i[m.name]??m.value;d.get(m.category).push({name:m.name,value:g})}if(n.length===0){c.push("# Core URLs");for(let[m,g]of Object.entries(i))c.push(`${m}=${g}`);c.push("")}else for(let[m,g]of d.entries()){c.push(`# ${m}`);for(let{name:v,value:h}of g)c.push(`${v}=${h}`);c.push("")}q.writeFileSync(r,c.join(`
5
+ `),"utf-8")}var yt={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 Tt(e,t){let o=de.join(e,"infra","docker",".env");Ve(o);let r=["# Docker Compose port overrides","# Generated by GAIA CLI to resolve port conflicts",`# Created: ${new Date().toISOString()}`,""];for(let[n,i]of Object.entries(t)){let c=Number(n),d=yt[c];d&&r.push(`${d}=${i}`)}r.push(""),q.writeFileSync(o,r.join(`
6
+ `),"utf-8")}function ie(e){let t={};for(let[o,r]of Object.entries(e)){let n=Number(o),i=yt[n];i&&(t[i]=String(r))}return t}var ht={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 ae(e){let t=de.join(e,"infra","docker",".env"),o={};if(!q.existsSync(t))return o;let r=q.readFileSync(t,"utf-8");for(let n of r.split(`
7
+ `)){let i=n.trim();if(i&&!i.startsWith("#")){let[c,...d]=i.split("=");if(c&&ht[c]){let m=Number(d.join("=").trim());!Number.isNaN(m)&&m>0&&(o[ht[c]]=m)}}}return o}var yr=e=>new Promise(t=>setTimeout(t,e));async function Se(e,t,o){e.setStep("Environment Setup"),e.setStatus("Configuring environment...");let r=await e.waitForInput("setup_mode");e.updateData("setupMode",r),e.setStatus("Configuring environment variables...");let n=await e.waitForInput("env_method"),i={};i.ENV=r==="selfhost"?"production":"development";let c=He();for(let m of c){let g=je(m,r);g&&(i[m]=g)}let d=xt(r);for(let[m,g]of Object.entries(d))i[m]=g;if(n==="infisical")await Tr(e,i),e.setStatus("Infisical credentials saved. Ensure your Infisical project contains all required variables.");else try{await br(e,t,i,r)}catch(m){e.setError(m);return}o&&ft(i,o,r);try{await Cr(e,t,i,r,o)}catch(m){e.setError(m);return}await yr(1e3)}async function Tr(e,t){e.setStatus("Configuring Infisical...");let o=await e.waitForInput("env_infisical");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 br(e,t,o,r){e.setStatus("Parsing environment variables...");let n;try{n=await pt(t),n=gt(n,r)}catch(f){throw new Error(`Failed to parse settings: ${f.message}`)}let i=new Set,c=[],d=new Set;for(let f of n)if(f.alternativeGroup&&!d.has(f.name)){let b=n.find(y=>y.name===f.alternativeGroup);b&&(c.push([f,b]),i.add(f.name),i.add(b.name),d.add(f.name),d.add(b.name))}let m=n.filter(f=>f.variables.length===1&&!i.has(f.name)),g=n.filter(f=>f.variables.length>1&&!i.has(f.name));for(let f of c){e.updateData("alternativeGroups",f),e.setStatus("Choose an AI provider...");let b=await e.waitForInput("env_alternatives");for(let[y,C]of Object.entries(b.values))C&&(o[y]=C)}let v=He(),l=[...m.flatMap(f=>f.variables).filter(f=>!v.includes(f.name))].sort((f,b)=>f.required&&!b.required?-1:!f.required&&b.required?1:0);e.updateData("envVarTotal",l.length);for(let f=0;f<l.length;f++){let b=l[f];if(!b)continue;e.updateData("currentEnvVar",b),e.updateData("envVarIndex",f),e.setStatus(`Configuring ${b.name}...`);let y=await e.waitForInput("env_var",{varName:b.name});(y||b.required||b.defaultValue)&&(o[b.name]=y||b.defaultValue||"")}let x=[...g].filter(f=>!f.variables.every(b=>v.includes(b.name))).sort((f,b)=>{let y=f.variables.some(I=>I.required),C=b.variables.some(I=>I.required);return y&&!C?-1:!y&&C?1:0});e.updateData("envGroupTotal",x.length);for(let f=0;f<x.length;f++){let b=x[f];if(!b)continue;e.updateData("currentEnvGroup",b),e.updateData("envGroupIndex",f),e.setStatus(`Configuring ${b.name}...`);let y=await e.waitForInput("env_group",{groupName:b.name});for(let[C,I]of Object.entries(y)){let E=b.variables.find(Q=>Q.name===C);(I||E?.required||E?.defaultValue)&&(o[C]=I||E?.defaultValue||"")}}}async function Cr(e,t,o,r,n){e.setStatus("Writing API environment file...");try{let i=bt.join(t,"apps","api");St(i,o),e.setStatus("API environment variables configured!")}catch(i){throw new Error(`Failed to write API .env file: ${i.message}`)}e.setStatus("Writing web environment file...");try{vt(t,r,n),e.setStatus("Web environment variables configured!")}catch(i){throw new Error(`Failed to write web .env file: ${i.message}`)}if(n&&Object.keys(n).length>0){e.setStatus("Writing Docker Compose port overrides...");try{Tt(t,n),e.setStatus("Docker Compose ports configured!")}catch(i){throw new Error(`Failed to write Docker Compose .env: ${i.message}`)}}}import{execa as Ir}from"execa";import ve from"fs";import Er from"simple-git";async function Ct(e,t,o){if(ve.existsSync(e)){let r=`${e}/.git`;if(!ve.existsSync(r))throw new Error(`Directory ${e} exists but is not a git repository`);await Er().cwd(e).pull(),o(100,"Already exists, pulled latest")}else try{let r=Ir("git",["clone","--progress",t,e]);r.stderr?.on("data",n=>{let i=n.toString();i.includes("Counting objects")?o(5,"Counting objects"):i.includes("Compressing objects")&&o(10,"Compressing objects");let c=i.match(/Receiving objects:\s+(\d+)%\s+\((\d+)\/(\d+)\)/);if(c?.[1]){let m=Math.min(100,parseInt(c[1],10)),g=c[2],v=c[3];o(10+Math.floor(m*.5),`Receiving objects: ${g}/${v}`)}let d=i.match(/Resolving deltas:\s+(\d+)%\s+\((\d+)\/(\d+)\)/);if(d?.[1]){let m=Math.min(100,parseInt(d[1],10)),g=d[2],v=d[3];o(60+Math.floor(m*.4),`Resolving deltas: ${g}/${v}`)}}),await r,o(100,"Clone complete")}catch(r){throw ve.existsSync(e)&&ve.rmSync(e,{recursive:!0,force:!0}),r}}import{execa as Y}from"execa";var V={git:"https://git-scm.com/downloads",docker:"https://docs.docker.com/get-docker/",mise:"https://mise.jdx.dev/getting-started.html"},Pr={8e3:"API Server",5432:"PostgreSQL",6379:"Redis",27017:"MongoDB",5672:"RabbitMQ",3e3:"Web Frontend",8080:"ChromaDB",8083:"Mongo Express"};async function ye(){try{return await Y("git",["--version"]),"success"}catch{return"error"}}async function Te(){let e=!1,t=!1,o;try{await Y("docker",["--version"]),e=!0}catch{return{name:"Docker",installUrl:V.docker,installed:!1,working:!1,errorMessage:"Docker is not installed"}}try{await Y("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:V.docker,installed:e,working:t,errorMessage:o}}async function be(){try{return await Y("mise",["--version"]),"success"}catch{return"missing"}}async function Ce(){if((await import("node:os")).platform()==="win32")try{return await Y("powershell",["-Command","irm https://mise.jdx.dev/install.ps1 | iex"]),!0}catch{return!1}try{return await Y("sh",["-c","curl https://mise.jdx.dev/install.sh | sh"]),!0}catch{return!1}}async function Ie(e){let t=await import("node:net"),o=[],r=n=>new Promise(i=>{let c=t.createServer();c.once("error",()=>i(!1)),c.once("listening",()=>{c.close(()=>i(!0))}),c.listen(n)});for(let n of e){let i=Pr[n]||`Port ${n}`;if(await r(n))o.push({port:n,service:i,available:!0});else{let d=await Rr(n),m=await Dr(n+1,n+100,r);o.push({port:n,service:i,available:!1,usedBy:d,alternative:m||void 0})}}return o}async function Rr(e){if((await import("node:os")).platform()==="win32"){try{let{stdout:r}=await Y("netstat",["-ano","-p","TCP"]),n=r.trim().split(`
8
8
  `);for(let i of n)if(i.includes(`:${e}`)&&i.includes("LISTENING")){let c=i.trim().split(/\s+/),d=c[c.length-1];if(d)try{let{stdout:m}=await Y("tasklist",["/FI",`PID eq ${d}`,"/FO","CSV","/NH"]);return m.trim().split(",")[0]?.replace(/"/g,"")||`PID ${d}`}catch{return`PID ${d}`}}}catch{}return}try{let{stdout:r}=await Y("lsof",["-i",`:${e}`,"-sTCP:LISTEN","-P","-n"]),n=r.trim().split(`
9
- `);if(n.length>1)return n[1]?.split(/\s+/)?.[0]||void 0}catch{}}async function Rr(e,t,o){for(let r=e;r<=t;r++)if(await o(r))return r;return null}import*as W from"fs";import*as U from"path";var Dr=e=>new Promise(t=>setTimeout(t,e)),kr="dev-start.log";function It(e){let t=U.join(e,".env");return W.existsSync(t)?["--env-file",".env"]:[]}async function Et(e,t,o){if(t==="selfhost"){o?.("Starting all services in Docker (selfhost mode)...");let r=U.join(e,"infra/docker"),n=It(r);await $("docker",["compose",...n,"-f","docker-compose.prod.yml","--profile","backend","--profile","web","up","-d","--build","--remove-orphans"],r),o?.("All services started in Docker!")}else{o?.("Starting development servers...");let{spawn:r}=await import("child_process"),n=U.join(e,kr),i=W.openSync(n,"a"),c;try{c=r("mise",["dev"],{cwd:e,stdio:["ignore",i,i],detached:!0,shell:!0}),c.unref()}finally{W.closeSync(i)}if(await Dr(1500),c.pid!=null)try{process.kill(c.pid,0)}catch{throw new Error(`Development servers crashed on startup. Check logs at: ${n}`)}o?.(`Development servers started! Logs: ${n}`)}}async function wt(e,t,o){let r=U.join(e,"infra/docker"),n=await He(e);t?.("Stopping Docker services...");try{let i=It(r),c=n==="selfhost"?["compose",...i,"-f","docker-compose.prod.yml","down"]:["compose",...i,"down"];await $("docker",c,r)}catch{}t?.("Stopping local processes...");try{let i=o?.[8e3]??8e3,c=o?.[3e3]??3e3;if(process.platform==="win32")for(let d of[i,c])try{await $("powershell",["-Command",`Get-NetTCPConnection -LocalPort ${d} -ErrorAction SilentlyContinue | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force -ErrorAction SilentlyContinue }`],e)}catch{}else for(let d of[i,c])try{await $("sh",["-c",`lsof -ti :${d} -sTCP:LISTEN | xargs kill 2>/dev/null || true`],e)}catch{}}catch{}t?.("All services stopped.")}async function He(e){let t=U.join(e,"apps","api",".env");if(!W.existsSync(t))return null;let o=W.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 $(e,t,o,r,n){let{spawn:i}=await import("child_process");return new Promise((c,d)=>{let m=i(e,t,{cwd:o,stdio:["ignore","pipe","pipe"],shell:!0}),g="",v=0;m.stdout?.on("data",x=>{let l=x.toString();g+=l,n?.(l),v=Math.min(v+5,95),r?.(v)}),m.stderr?.on("data",x=>{let l=x.toString();g+=l,n?.(l),v=Math.min(v+5,95),r?.(v)}),m.on("close",x=>{x===0?(r?.(100),c()):d(new Error(`Command failed with code ${x}: ${g.slice(-500)}`))}),m.on("error",x=>{d(x)})})}function X(e){let t=e||process.cwd();for(;t!==U.dirname(t);){if(W.existsSync(U.join(t,"apps/api/app/config/settings_validator.py")))return t;t=U.dirname(t)}return null}var Br=process.env.GAIA_CLI_DEV==="true",K=e=>new Promise(t=>setTimeout(t,e));async function Pt(e){e.setStep("Welcome"),e.setStatus("Waiting for user input..."),await e.waitForInput("welcome");let t=l=>{let S=e.currentState.data.dependencyLogs||[],f=l.split(`
10
- `).filter(y=>y.trim()!==""),b=[...S,...f].slice(-20);e.updateData("dependencyLogs",b)};e.setStep("Prerequisites"),e.setStatus("Checking system requirements..."),e.updateData("checks",{git:"pending",docker:"pending",mise:"pending"}),await K(800),e.setStatus("Checking Git...");let o=await ve();e.updateData("checks",{...e.currentState.data.checks,git:o}),e.setStatus("Checking Docker...");let r=await ye(),n=r.working?"success":"error";e.updateData("checks",{...e.currentState.data.checks,docker:n}),r.working||e.updateData("dockerError",r.errorMessage),e.setStatus("Checking Mise...");let i=await Te();e.updateData("checks",{...e.currentState.data.checks,mise:i}),i==="missing"&&(e.setStatus("Installing Mise..."),i=await be()?"success":"error",e.updateData("checks",{...e.currentState.data.checks,mise:i}));let c=[];if(o==="error"&&c.push({name:"Git"}),n==="error"&&c.push({name:"Docker",message:r.errorMessage}),i==="error"&&c.push({name:"Mise"}),c.length>0){let l=[];l.push("Prerequisites failed:");for(let S of c)l.push(` \u2022 ${S.name}: ${S.message||"Not installed or not working"}`);l.push(`
9
+ `);if(n.length>1)return n[1]?.split(/\s+/)?.[0]||void 0}catch{}}async function Dr(e,t,o){for(let r=e;r<=t;r++)if(await o(r))return r;return null}import*as W from"fs";import*as U from"path";var kr=e=>new Promise(t=>setTimeout(t,e)),Br="dev-start.log";function Et(e){let t=U.join(e,".env");return W.existsSync(t)?["--env-file",".env"]:[]}async function wt(e,t,o,r){if(t==="selfhost"){o?.("Starting all services in Docker (selfhost mode)...");let n=U.join(e,"infra/docker"),i=Et(n),c=r&&Object.keys(r).length>0?ie(r):void 0;await $("docker",["compose",...i,"--profile","backend","--profile","worker","up","-d","--build","--remove-orphans"],n,void 0,void 0,c),o?.("All services started in Docker!")}else{o?.("Starting development servers...");let{spawn:n}=await import("child_process"),i=U.join(e,Br),c=W.openSync(i,"a"),d;try{d=n("mise",["dev"],{cwd:e,stdio:["ignore",c,c],detached:!0,shell:!0}),d.unref()}finally{W.closeSync(c)}if(await kr(1500),d.pid!=null)try{process.kill(d.pid,0)}catch{throw new Error(`Development servers crashed on startup. Check logs at: ${i}`)}o?.(`Development servers started! Logs: ${i}`)}}async function Pt(e,t,o){let r=U.join(e,"infra/docker");t?.("Stopping Docker services...");try{let i=["compose",...Et(r),"down"];await $("docker",i,r)}catch{}t?.("Stopping local processes...");try{let n=o?.[8e3]??8e3,i=o?.[3e3]??3e3;if(process.platform==="win32")for(let c of[n,i])try{await $("powershell",["-Command",`Get-NetTCPConnection -LocalPort ${c} -ErrorAction SilentlyContinue | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force -ErrorAction SilentlyContinue }`],e)}catch{}else for(let c of[n,i])try{await $("sh",["-c",`lsof -ti :${c} -sTCP:LISTEN | xargs kill 2>/dev/null || true`],e)}catch{}}catch{}t?.("All services stopped.")}async function Rt(e){let t=U.join(e,"apps","api",".env");if(!W.existsSync(t))return null;let o=W.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 $(e,t,o,r,n,i){let{spawn:c}=await import("child_process");return new Promise((d,m)=>{let g=c(e,t,{cwd:o,stdio:["ignore","pipe","pipe"],shell:!0,env:i?{...process.env,...i}:void 0}),v="",h=0;g.stdout?.on("data",l=>{let x=l.toString();v+=x,n?.(x),h=Math.min(h+5,95),r?.(h)}),g.stderr?.on("data",l=>{let x=l.toString();v+=x,n?.(x),h=Math.min(h+5,95),r?.(h)}),g.on("close",l=>{l===0?(r?.(100),d()):m(new Error(`Command failed with code ${l}: ${v.slice(-500)}`))}),g.on("error",l=>{m(l)})})}function X(e){let t=e||process.cwd();for(;t!==U.dirname(t);){if(W.existsSync(U.join(t,"apps/api/app/config/settings_validator.py")))return t;t=U.dirname(t)}return null}var Ar=process.env.GAIA_CLI_DEV==="true",K=e=>new Promise(t=>setTimeout(t,e));async function Dt(e){e.setStep("Welcome"),e.setStatus("Waiting for user input..."),await e.waitForInput("welcome");let t=l=>{let x=e.currentState.data.dependencyLogs||[],f=l.split(`
10
+ `).filter(y=>y.trim()!==""),b=[...x,...f].slice(-20);e.updateData("dependencyLogs",b)};e.setStep("Prerequisites"),e.setStatus("Checking system requirements..."),e.updateData("checks",{git:"pending",docker:"pending",mise:"pending"}),await K(800),e.setStatus("Checking Git...");let o=await ye();e.updateData("checks",{...e.currentState.data.checks,git:o}),e.setStatus("Checking Docker...");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),e.setStatus("Checking Mise...");let i=await be();e.updateData("checks",{...e.currentState.data.checks,mise:i}),i==="missing"&&(e.setStatus("Installing Mise..."),i=await Ce()?"success":"error",e.updateData("checks",{...e.currentState.data.checks,mise:i}));let c=[];if(o==="error"&&c.push({name:"Git"}),n==="error"&&c.push({name:"Docker",message:r.errorMessage}),i==="error"&&c.push({name:"Mise"}),c.length>0){let l=[];l.push("Prerequisites failed:");for(let x of c)l.push(` \u2022 ${x.name}: ${x.message||"Not installed or not working"}`);l.push(`
11
11
  Installation guides:`),o==="error"&&l.push(` \u2022 Git: ${V.git}`),n==="error"&&(r.installed?l.push(" \u2022 Docker: Start Docker Desktop or run 'sudo systemctl start docker'"):l.push(` \u2022 Docker: ${V.docker}`)),i==="error"&&l.push(` \u2022 Mise: ${V.mise}`),e.setError(new Error(l.join(`
12
- `)));return}e.setStatus("Checking Ports...");let m=await Ce([8e3,5432,6379,27017,5672,3e3,8080,8083]),g={},v=m.filter(l=>!l.available);if(v.length>0){let l=v.filter(f=>!f.alternative);if(l.length>0){e.setError(new Error(`Cannot find free alternative ports for: ${l.map(f=>`${f.port} (${f.service})`).join(", ")}. Free these ports and try again.`));return}if(e.updateData("portConflicts",m),await e.waitForInput("port_conflicts")==="abort"){e.setError(new Error("Port conflicts not resolved. Please free the ports and try again."));return}for(let f of m)!f.available&&f.alternative&&(g[f.port]=f.alternative)}e.updateData("portOverrides",g),e.setStatus("Prerequisites check complete!"),await K(1e3);let x="";if(Br){if(x=X()||"",!x){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 K(500),e.setStatus("Repository ready!")}else{for(e.setStep("Repository Setup");;){if(x=await e.waitForInput("repo_path",{default:"./gaia"}),ae.existsSync(x)){if(!ae.statSync(x).isDirectory()){e.setError(new Error(`Path ${x} exists and is not a directory.`)),await K(2e3),e.setError(null);continue}if(ae.readdirSync(x).length>0){e.setError(new Error(`Directory ${x} is not empty. Please choose another path.`)),await K(2e3),e.setError(null);continue}}break}e.setStep("Repository Setup"),e.setStatus("Preparing repository..."),e.updateData("repoProgress",0),e.updateData("repoPhase","");try{await bt(x,"https://github.com/theexperiencecompany/gaia.git",(l,S)=>{e.updateData("repoProgress",l),S?(e.updateData("repoPhase",S),e.setStatus(`${S}...`)):e.setStatus(`Cloning repository to ${x}... ${l}%`)}),e.setStatus("Repository ready!")}catch(l){e.setError(l);return}}await K(1e3),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 $("mise",["trust"],x,void 0,t),e.updateData("dependencyProgress",50),e.updateData("dependencyPhase","Installing tools (node, python, uv, nx)..."),await $("mise",["install"],x,l=>{e.updateData("dependencyProgress",50+l*.5)},t),e.updateData("dependencyProgress",100),e.updateData("toolComplete",!0)}catch(l){e.setError(new Error(`Failed to install tools: ${l.message}`));return}if(await K(1e3),await he(e,x,g),!e.currentState.error){e.setStep("Project Setup"),e.updateData("dependencyPhase","Setting up project..."),e.updateData("dependencyProgress",0),e.updateData("dependencyComplete",!1),e.updateData("repoPath",x),e.updateData("dependencyLogs",[]);try{e.updateData("dependencyProgress",0),e.updateData("dependencyPhase","Running mise setup (all dependencies)..."),await $("mise",["setup"],x,l=>{e.updateData("dependencyProgress",l)},t),e.updateData("dependencyProgress",100),e.updateData("dependencyPhase","Setup complete!"),e.updateData("dependencyComplete",!0)}catch(l){e.setError(new Error(`Failed to setup project: ${l.message}`));return}await K(1e3),e.setStep("Finished"),e.setStatus("Setup complete!")}}async function Rt(){let e=H(),{unmount:t}=Ar(_r.createElement(j,{store:e,command:"init"}));try{await Pt(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as Mr}from"ink";import Lr from"react";var Ie=e=>new Promise(t=>setTimeout(t,e));async function Dt(e){e.setStep("Detect Repo"),e.setStatus("Looking for GAIA repository...");let t=X();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 Ie(1e3),e.setStep("Prerequisites"),e.setStatus("Checking system requirements..."),e.updateData("checks",{git:"pending",docker:"pending",mise:"pending"}),await Ie(500);let o=await ve();e.updateData("checks",{...e.currentState.data.checks,git:o});let r=await ye(),n=r.working?"success":"error";e.updateData("checks",{...e.currentState.data.checks,docker:n}),r.working||e.updateData("dockerError",r.errorMessage);let i=await Te();e.updateData("checks",{...e.currentState.data.checks,mise:i}),i==="missing"&&(e.setStatus("Installing Mise..."),i=await be()?"success":"error",e.updateData("checks",{...e.currentState.data.checks,mise:i}));let c=[];if(o==="error"&&c.push({name:"Git"}),n==="error"&&c.push({name:"Docker",message:r.errorMessage}),i==="error"&&c.push({name:"Mise"}),c.length>0){let l=[];l.push("Prerequisites failed:");for(let S of c)l.push(` \u2022 ${S.name}: ${S.message||"Not installed or not working"}`);l.push(`
12
+ `)));return}e.setStatus("Checking Ports...");let m=await Ie([8e3,5432,6379,27017,5672,3e3,8080,8083]),g={},v=m.filter(l=>!l.available);if(v.length>0){let l=v.filter(f=>!f.alternative);if(l.length>0){e.setError(new Error(`Cannot find free alternative ports for: ${l.map(f=>`${f.port} (${f.service})`).join(", ")}. Free these ports and try again.`));return}if(e.updateData("portConflicts",m),await e.waitForInput("port_conflicts")==="abort"){e.setError(new Error("Port conflicts not resolved. Please free the ports and try again."));return}for(let f of m)!f.available&&f.alternative&&(g[f.port]=f.alternative)}e.updateData("portOverrides",g),e.setStatus("Prerequisites check complete!"),await K(1e3);let h="";if(Ar){if(h=X()||"",!h){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 K(500),e.setStatus("Repository ready!")}else{for(e.setStep("Repository Setup");;){if(h=await e.waitForInput("repo_path",{default:"./gaia"}),se.existsSync(h)){if(!se.statSync(h).isDirectory()){e.setError(new Error(`Path ${h} exists and is not a directory.`)),await K(2e3),e.setError(null);continue}if(se.readdirSync(h).length>0){e.setError(new Error(`Directory ${h} is not empty. Please choose another path.`)),await K(2e3),e.setError(null);continue}}break}e.setStep("Repository Setup"),e.setStatus("Preparing repository..."),e.updateData("repoProgress",0),e.updateData("repoPhase","");try{await Ct(h,"https://github.com/theexperiencecompany/gaia.git",(l,x)=>{e.updateData("repoProgress",l),x?(e.updateData("repoPhase",x),e.setStatus(`${x}...`)):e.setStatus(`Cloning repository to ${h}... ${l}%`)}),e.setStatus("Repository ready!")}catch(l){e.setError(l);return}}await K(1e3),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 $("mise",["trust"],h,void 0,t),e.updateData("dependencyProgress",50),e.updateData("dependencyPhase","Installing tools (node, python, uv, nx)..."),await $("mise",["install"],h,l=>{e.updateData("dependencyProgress",50+l*.5)},t),e.updateData("dependencyProgress",100),e.updateData("toolComplete",!0)}catch(l){e.setError(new Error(`Failed to install tools: ${l.message}`));return}if(await K(1e3),await Se(e,h,g),!e.currentState.error){e.setStep("Project Setup"),e.updateData("dependencyPhase","Setting up project..."),e.updateData("dependencyProgress",0),e.updateData("dependencyComplete",!1),e.updateData("repoPath",h),e.updateData("dependencyLogs",[]);try{e.updateData("dependencyProgress",0),e.updateData("dependencyPhase","Running mise setup (all dependencies)...");let l=Object.keys(g).length>0?ie(g):void 0;await $("mise",["setup"],h,x=>{e.updateData("dependencyProgress",x)},t,l),e.updateData("dependencyProgress",100),e.updateData("dependencyPhase","Setup complete!"),e.updateData("dependencyComplete",!0)}catch(l){e.setError(new Error(`Failed to setup project: ${l.message}`));return}await K(1e3),e.setStep("Finished"),e.setStatus("Setup complete!")}}async function kt(){let e=H(),{unmount:t}=_r(Or.createElement(j,{store:e,command:"init"}));try{await Dt(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as Mr}from"ink";import Lr from"react";var Ee=e=>new Promise(t=>setTimeout(t,e));async function Bt(e){e.setStep("Detect Repo"),e.setStatus("Looking for GAIA repository...");let t=X();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 Ee(1e3),e.setStep("Prerequisites"),e.setStatus("Checking system requirements..."),e.updateData("checks",{git:"pending",docker:"pending",mise:"pending"}),await Ee(500);let o=await ye();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 i=await be();e.updateData("checks",{...e.currentState.data.checks,mise:i}),i==="missing"&&(e.setStatus("Installing Mise..."),i=await Ce()?"success":"error",e.updateData("checks",{...e.currentState.data.checks,mise:i}));let c=[];if(o==="error"&&c.push({name:"Git"}),n==="error"&&c.push({name:"Docker",message:r.errorMessage}),i==="error"&&c.push({name:"Mise"}),c.length>0){let l=[];l.push("Prerequisites failed:");for(let x of c)l.push(` \u2022 ${x.name}: ${x.message||"Not installed or not working"}`);l.push(`
13
13
  Installation guides:`),o==="error"&&l.push(` \u2022 Git: ${V.git}`),n==="error"&&(r.installed?l.push(" \u2022 Docker: Start Docker Desktop or run 'sudo systemctl start docker'"):l.push(` \u2022 Docker: ${V.docker}`)),i==="error"&&l.push(` \u2022 Mise: ${V.mise}`),e.setError(new Error(l.join(`
14
- `)));return}e.setStatus("Checking Ports...");let m=await Ce([8e3,5432,6379,27017,5672,3e3,8080,8083]),g={},v=m.filter(l=>!l.available);if(v.length>0){let l=v.filter(f=>!f.alternative);if(l.length>0){e.setError(new Error(`Cannot find free alternative ports for: ${l.map(f=>`${f.port} (${f.service})`).join(", ")}. Free these ports and try again.`));return}if(e.updateData("portConflicts",m),await e.waitForInput("port_conflicts")==="abort"){e.setError(new Error("Port conflicts not resolved. Please free the ports and try again."));return}for(let f of m)!f.available&&f.alternative&&(g[f.port]=f.alternative)}if(e.updateData("portOverrides",g),e.setStatus("Prerequisites check complete!"),await Ie(1e3),await he(e,t,g),e.currentState.error)return;e.setStep("Project Setup"),e.updateData("dependencyPhase","Setting up project..."),e.updateData("dependencyProgress",0),e.updateData("dependencyComplete",!1),e.updateData("dependencyLogs",[]);let x=l=>{let S=e.currentState.data.dependencyLogs||[],f=l.split(`
15
- `).filter(y=>y.trim()!==""),b=[...S,...f].slice(-20);e.updateData("dependencyLogs",b)};try{e.updateData("dependencyPhase","Trusting mise configuration..."),await $("mise",["trust"],t,void 0,x),e.updateData("dependencyProgress",20),e.updateData("dependencyPhase","Installing tools..."),await $("mise",["install"],t,l=>{e.updateData("dependencyProgress",20+l*.3)},x),e.updateData("dependencyPhase","Running mise setup..."),await $("mise",["setup"],t,l=>{e.updateData("dependencyProgress",50+l*.5)},x),e.updateData("dependencyProgress",100),e.updateData("dependencyPhase","Setup complete!"),e.updateData("dependencyComplete",!0)}catch(l){e.setError(new Error(`Failed to setup project: ${l.message}`));return}await Ie(1e3),e.setStep("Finished"),e.setStatus("Setup complete!")}async function kt(){let e=H(),{unmount:t}=Mr(Lr.createElement(j,{store:e,command:"setup"}));try{await Dt(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as Or}from"ink";import Fr from"react";async function Bt(e){e.setStep("Starting"),e.setStatus("Locating GAIA repository...");let t=X();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=await He(t);if(!o){e.setError(new Error("No .env file found. Run 'gaia setup' first to configure the environment."));return}let r=ie(t),n=r[3e3]??3e3,i=r[8e3]??8e3;e.updateData("setupMode",o),e.updateData("webPort",n),e.updateData("apiPort",i),e.setStatus(`Starting GAIA in ${o} mode...`);try{await Et(t,o,c=>{e.setStatus(c)}),e.setStep("Running"),e.setStatus("GAIA is running!"),e.updateData("started",!0)}catch(c){e.setError(new Error(`Failed to start services: ${c.message}`));return}await e.waitForInput("exit")}async function At(){let e=H(),{unmount:t}=Or(Fr.createElement(j,{store:e,command:"start"}));await new Promise(o=>setTimeout(o,50));try{await Bt(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as jr}from"ink";import Hr from"react";import{execa as Ue}from"execa";var Ve=["gaia-backend","gaia-web","chromadb","postgres","redis","mongo","rabbitmq","arq_worker"];async function _t(){try{let{stdout:e}=await Ue("docker",["inspect","--format","{{.Name}}|{{.State.Status}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}",...Ve]),t=new Map;for(let o of e.trim().split(`
16
- `)){if(!o)continue;let[r,n,i]=o.split("|"),c=r?.replace(/^\//,"")??"";t.set(c,{name:c,status:n==="running"?"running":"stopped",health:i!=="none"?i:void 0})}return Ve.map(o=>t.get(o)??{name:o,status:"not_found"})}catch{let e=Ve.map(async t=>{try{let{stdout:o}=await Ue("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 Mt(){try{return await Ue("docker",["info"]),!0}catch{return!1}}var Nr=[{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 Lt(e){let o=Nr.map(r=>({...r,port:e?.[r.port]??r.port})).map(r=>r.type==="http"?Gr(r.name,r.port,r.path):$r(r.name,r.port));return Promise.all(o)}async function Gr(e,t,o){let r=Date.now();try{let n=await fetch(`http://localhost:${t}${o}`,{signal:AbortSignal.timeout(5e3)}),i=Date.now()-r;return{name:e,port:t,status:"up",latency:i,details:n.ok?`HTTP ${n.status}`:`HTTP ${n.status} (error)`}}catch{return{name:e,port:t,status:"down",details:"Connection failed"}}}async function $r(e,t){let o=await import("node:net"),r=Date.now();return new Promise(n=>{let i=new o.Socket;i.setTimeout(3e3),i.on("connect",()=>{let c=Date.now()-r;i.destroy(),n({name:e,port:t,status:"up",latency:c})}),i.on("timeout",()=>{i.destroy(),n({name:e,port:t,status:"down"})}),i.on("error",()=>{i.destroy(),n({name:e,port:t,status:"down"})}),i.connect(t,"localhost")})}async function Ot(){return await Mt()?{running:!0,containers:await _t()}:{running:!1,containers:[]}}async function qr(e){e.setStep("Checking"),e.setStatus("Checking service health..."),e.updateData("refreshable",!1);let t=X(),o=t?ie(t):void 0,[r,n]=await Promise.all([Lt(o),Ot()]);e.updateData("services",r),e.updateData("docker",n);let i=r.filter(d=>d.status==="up").length,c=r.length;e.setStep("Results"),e.setStatus(`${i}/${c} services running`),e.updateData("refreshable",!0)}async function Ft(e){for(;await qr(e),await e.waitForInput("exit_or_refresh")==="refresh";);}async function Nt(){let e=H(),{unmount:t}=jr(Hr.createElement(j,{store:e,command:"status"}));await new Promise(o=>setTimeout(o,50));try{await Ft(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as Vr}from"ink";import Ur from"react";async function Gt(e){e.setStep("Stopping"),e.setStatus("Locating GAIA repository...");let t=X();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=ie(t);try{await wt(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 $t(){let e=H(),{unmount:t}=Vr(Ur.createElement(j,{store:e,command:"stop"}));await new Promise(o=>setTimeout(o,50));try{await Gt(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}var J=new Wr;J.name("gaia").description("CLI tool for setting up and managing GAIA").version("0.1.0");J.command("init").description("Full setup from scratch (clone, configure, start)").action(async()=>{await Rt()});J.command("setup").description("Configure an existing GAIA repository").action(async()=>{await kt()});J.command("status").description("Check health of all GAIA services").action(async()=>{await Nt()});J.command("start").description("Start GAIA services").action(async()=>{await At()});J.command("stop").description("Stop all GAIA services").action(async()=>{await $t()});process.argv.slice(2).length||(J.outputHelp(),process.exit(0));J.parse();
14
+ `)));return}e.setStatus("Checking Ports...");let m=await Ie([8e3,5432,6379,27017,5672,3e3,8080,8083]),g={},v=m.filter(l=>!l.available);if(v.length>0){let l=v.filter(f=>!f.alternative);if(l.length>0){e.setError(new Error(`Cannot find free alternative ports for: ${l.map(f=>`${f.port} (${f.service})`).join(", ")}. Free these ports and try again.`));return}if(e.updateData("portConflicts",m),await e.waitForInput("port_conflicts")==="abort"){e.setError(new Error("Port conflicts not resolved. Please free the ports and try again."));return}for(let f of m)!f.available&&f.alternative&&(g[f.port]=f.alternative)}if(e.updateData("portOverrides",g),e.setStatus("Prerequisites check complete!"),await Ee(1e3),await Se(e,t,g),e.currentState.error)return;e.setStep("Project Setup"),e.updateData("dependencyPhase","Setting up project..."),e.updateData("dependencyProgress",0),e.updateData("dependencyComplete",!1),e.updateData("dependencyLogs",[]);let h=l=>{let x=e.currentState.data.dependencyLogs||[],f=l.split(`
15
+ `).filter(y=>y.trim()!==""),b=[...x,...f].slice(-20);e.updateData("dependencyLogs",b)};try{e.updateData("dependencyPhase","Trusting mise configuration..."),await $("mise",["trust"],t,void 0,h),e.updateData("dependencyProgress",20),e.updateData("dependencyPhase","Installing tools..."),await $("mise",["install"],t,x=>{e.updateData("dependencyProgress",20+x*.3)},h),e.updateData("dependencyPhase","Running mise setup...");let l=Object.keys(g).length>0?ie(g):void 0;await $("mise",["setup"],t,x=>{e.updateData("dependencyProgress",50+x*.5)},h,l),e.updateData("dependencyProgress",100),e.updateData("dependencyPhase","Setup complete!"),e.updateData("dependencyComplete",!0)}catch(l){e.setError(new Error(`Failed to setup project: ${l.message}`));return}await Ee(1e3),e.setStep("Finished"),e.setStatus("Setup complete!")}async function At(){let e=H(),{unmount:t}=Mr(Lr.createElement(j,{store:e,command:"setup"}));try{await Bt(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as Fr}from"ink";import Nr from"react";async function _t(e){e.setStep("Starting"),e.setStatus("Locating GAIA repository...");let t=X();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=await Rt(t);if(!o){e.setError(new Error("No .env file found. Run 'gaia setup' first to configure the environment."));return}let r=ae(t),n=r[3e3]??3e3,i=r[8e3]??8e3;e.updateData("setupMode",o),e.updateData("webPort",n),e.updateData("apiPort",i),e.setStatus(`Starting GAIA in ${o} mode...`);try{await wt(t,o,c=>{e.setStatus(c)},r),e.setStep("Running"),e.setStatus("GAIA is running!"),e.updateData("started",!0)}catch(c){e.setError(new Error(`Failed to start services: ${c.message}`));return}await e.waitForInput("exit")}async function Ot(){let e=H(),{unmount:t}=Fr(Nr.createElement(j,{store:e,command:"start"}));await new Promise(o=>setTimeout(o,50));try{await _t(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as Hr}from"ink";import Vr from"react";import{execa as We}from"execa";var Ue=["gaia-backend","gaia-web","chromadb","postgres","redis","mongo","rabbitmq","arq_worker"];async function Mt(){try{let{stdout:e}=await We("docker",["inspect","--format","{{.Name}}|{{.State.Status}}|{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}",...Ue]),t=new Map;for(let o of e.trim().split(`
16
+ `)){if(!o)continue;let[r,n,i]=o.split("|"),c=r?.replace(/^\//,"")??"";t.set(c,{name:c,status:n==="running"?"running":"stopped",health:i!=="none"?i:void 0})}return Ue.map(o=>t.get(o)??{name:o,status:"not_found"})}catch{let e=Ue.map(async t=>{try{let{stdout:o}=await We("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 Lt(){try{return await We("docker",["info"]),!0}catch{return!1}}var Gr=[{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 Ft(e){let o=Gr.map(r=>({...r,port:e?.[r.port]??r.port})).map(r=>r.type==="http"?$r(r.name,r.port,r.path):qr(r.name,r.port));return Promise.all(o)}async function $r(e,t,o){let r=Date.now();try{let n=await fetch(`http://localhost:${t}${o}`,{signal:AbortSignal.timeout(5e3)}),i=Date.now()-r;return{name:e,port:t,status:"up",latency:i,details:n.ok?`HTTP ${n.status}`:`HTTP ${n.status} (error)`}}catch{return{name:e,port:t,status:"down",details:"Connection failed"}}}async function qr(e,t){let o=await import("node:net"),r=Date.now();return new Promise(n=>{let i=new o.Socket;i.setTimeout(3e3),i.on("connect",()=>{let c=Date.now()-r;i.destroy(),n({name:e,port:t,status:"up",latency:c})}),i.on("timeout",()=>{i.destroy(),n({name:e,port:t,status:"down"})}),i.on("error",()=>{i.destroy(),n({name:e,port:t,status:"down"})}),i.connect(t,"localhost")})}async function Nt(){return await Lt()?{running:!0,containers:await Mt()}:{running:!1,containers:[]}}async function jr(e){e.setStep("Checking"),e.setStatus("Checking service health..."),e.updateData("refreshable",!1);let t=X(),o=t?ae(t):void 0,[r,n]=await Promise.all([Ft(o),Nt()]);e.updateData("services",r),e.updateData("docker",n);let i=r.filter(d=>d.status==="up").length,c=r.length;e.setStep("Results"),e.setStatus(`${i}/${c} services running`),e.updateData("refreshable",!0)}async function Gt(e){for(;await jr(e),await e.waitForInput("exit_or_refresh")==="refresh";);}async function $t(){let e=H(),{unmount:t}=Hr(Vr.createElement(j,{store:e,command:"status"}));await new Promise(o=>setTimeout(o,50));try{await Gt(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}import{render as Ur}from"ink";import Wr from"react";async function qt(e){e.setStep("Stopping"),e.setStatus("Locating GAIA repository...");let t=X();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=ae(t);try{await Pt(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 jt(){let e=H(),{unmount:t}=Ur(Wr.createElement(j,{store:e,command:"stop"}));await new Promise(o=>setTimeout(o,50));try{await qt(e)}catch(o){e.setError(o)}e.currentState.error&&await e.waitForInput("exit"),t(),process.exit(e.currentState.error?1:0)}var J=new Xr;J.name("gaia").description("CLI tool for setting up and managing GAIA").version("0.1.0");J.command("init").description("Full setup from scratch (clone, configure, start)").action(async()=>{await kt()});J.command("setup").description("Configure an existing GAIA repository").action(async()=>{await At()});J.command("status").description("Check health of all GAIA services").action(async()=>{await $t()});J.command("start").description("Start GAIA services").action(async()=>{await Ot()});J.command("stop").description("Stop all GAIA services").action(async()=>{await jt()});process.argv.slice(2).length||(J.outputHelp(),process.exit(0));J.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heygaia/cli",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "CLI tool for setting up and managing GAIA",
5
5
  "type": "module",
6
6
  "bin": {