modelence 0.26.0-nd.dev.8 → 0.26.0-nd.dev.9

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.
@@ -1,16 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import {Command}from'commander';import {readFileSync,promises,createWriteStream}from'fs';import {fileURLToPath}from'url';import q,{join,dirname,relative,sep}from'path';import {parse}from'dotenv';import {createInterface}from'readline';import {execFile,execSync,spawnSync}from'child_process';import We from'open';import me from'fs/promises';import {createJiti}from'jiti';import {z as z$1}from'zod';import {build}from'tsup';import {loadConfigFromFile,build as build$1,mergeConfig}from'vite';import Vt from'archiver';import ht from'os';import {promisify}from'util';async function D(e,{pick:t,purpose:n,pickEnvironment:o=false,appId:r}={}){let i=await fetch(`${e}/api/cli/auth`,{method:"POST"});if(!i.ok)throw new Error("Failed to create CLI authentication code");let{code:s,verificationUrl:c}=await i.json(),a=new URL(c),l=t??(o?"environment":void 0);l&&a.searchParams.set("pick",l),n&&a.searchParams.set("purpose",n),r&&a.searchParams.set("appId",r),console.log(`Please visit ${a} to authenticate`),console.log(`Code: ${s}`);try{await We(a.toString());}catch{console.log("Could not open a browser automatically. Please open the URL above manually.");}return await ze(e,s)}async function ze(e,t){let r=Date.now()+6e5;for(;Date.now()<r;){try{let i=await Je(e,t);if(i)return i}catch(i){console.error("Error polling for CLI token:",i);}await new Promise(i=>setTimeout(i,5e3));}throw new Error("Unable to authenticate CLI - timed out. Please try again.")}async function Je(e,t){let n=await fetch(`${e}/api/cli/token?code=${t}`,{method:"GET"});if(!n.ok)throw new Error(`CLI token polling failed: ${n.statusText}`);let{token:o,expiresAt:r,target:i}=await n.json();return o?{token:o,expiresAt:r,target:i}:null}var I=".modelence",A="project.json";function re(e=process.cwd()){return join(e,I,A)}async function x(e=process.cwd()){try{let t=await promises.readFile(re(e),"utf8"),n=JSON.parse(t);return n&&typeof n=="object"?n:{}}catch{return {}}}async function $(e,t=process.cwd()){let n=await x(t);await promises.mkdir(join(t,I),{recursive:true}),await promises.writeFile(re(t),JSON.stringify({...n,...e},null,2)+`
3
- `);}var J=".modelence.env";async function qe(e,t){let n="setupToken"in t?{"X-Modelence-Setup-Token":t.setupToken}:{Authorization:`Bearer ${t.cliToken}`},o=await fetch(`${e}/api/setup`,{method:"GET",headers:n});if(!o.ok){let r=await o.text();throw new Error(r||`Request failed with status ${o.status}`)}return o.json()}async function se(e){let t=createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,o=>{t.close(),n(o.trim());});})}async function He(){return (await se(`Warning: ${J} already exists. Do you want to overwrite it? (y/N) `)).toLowerCase()==="y"}function Xe(e){return String(e).replace(/"/g,'\\"')}async function Ze(){let{appId:e}=await x();return typeof e=="string"&&e?e:void 0}async function Qe(e){await $({appId:e});}var ae=".claude",S=join(ae,"settings.json"),M="modelence@modelence",G="modelence/modelence",et={modelence:{source:{source:"github",repo:G}}},tt="https://docs.modelence.com/ai-coding-agents",ie=`Install the Modelence plugin for Claude Code by hand:
4
- claude plugin marketplace add ${G}
5
- claude plugin install ${M} --scope project
6
- Guide: ${tt}`;async function nt(){let e=join(process.cwd(),S),t;try{t=await promises.readFile(e,"utf8");}catch(o){if(o.code!=="ENOENT"){console.warn(`Could not read ${S}; leaving it unchanged.`);return}}let n={};if(t!==void 0)try{n=JSON.parse(t);}catch{console.warn(`Could not parse ${S}; leaving it unchanged.`);return}n.extraKnownMarketplaces={...n.extraKnownMarketplaces,...et},n.enabledPlugins?.[M]===void 0&&(n.enabledPlugins={...n.enabledPlugins,[M]:true});try{await promises.mkdir(join(process.cwd(),ae),{recursive:!0}),await promises.writeFile(e,JSON.stringify(n,null,2)+`
7
- `),console.log(`Declared the Modelence Claude Code plugin in ${S}`);}catch(o){console.warn(`Failed to write ${S}:`,o);}}function z(e){return spawnSync("claude",e,{encoding:"utf8",shell:process.platform==="win32"})}async function ot(){let e=z(["--version"]);if(e.error||e.status!==0){console.log(ie);return}let t=(await se("Install the Modelence plugin for Claude Code? (Y/n) ")).toLowerCase();if(t&&t!=="y"&&t!=="yes")return;let n=z(["plugin","marketplace","add",G]),o=z(["plugin","install",M,"--scope","project"]);if(o.status===0)console.log("Installed the Modelence plugin for Claude Code. Sign in once from Claude Code: run /mcp, choose modelence, then Authenticate.");else {let r=n.status!==0?n:o;console.warn(`Could not install the Modelence plugin: ${(r.stderr||r.stdout||"").trim()}`),console.warn(ie);}}async function rt(e){try{let t=e.replace(".env",".backup.env");await promises.copyFile(e,t),console.log(`Backup created at ${t}`);}catch(t){console.warn("Failed to create backup file:",t);}}async function ce(e){try{let t=join(process.cwd(),J),n={},o=!1;try{let a=await promises.readFile(t,"utf8");n=parse(a),o=!0,await rt(t),await He()||(console.log("Setup canceled"),process.exit(0));}catch{}let r;if(e.token)r={setupToken:e.token};else {let{token:a}=await D(e.host,{pickEnvironment:!0,appId:await Ze()});r={cliToken:a};}console.log("Fetching service configuration...");let i=await qe(e.host,r),s={...n,MODELENCE_TELEMETRY_ENABLED:"false",MODELENCE_ENVIRONMENT_ID:i.environmentId,MODELENCE_SERVICE_ENDPOINT:e.host,MODELENCE_SERVICE_TOKEN:i.serviceToken,MODELENCE_CONTAINER_ID:i.containerId,MODELENCE_RUNTIME:process.env.MODELENCE_RUNTIME||"local"},c=Object.entries(s).map(([a,l])=>`${a}="${Xe(l)}"`).join(`
8
- `);if(await promises.writeFile(t,c.trim()+`
9
- `),console.log(`Successfully configured ${J} file`),i.appId)try{await Qe(i.appId),console.log(`Recorded the app ID in ${I}/${A}`);}catch(a){console.warn(`Failed to record the app ID in ${I}/${A}:`,a);}await nt(),!e.token&&process.stdin.isTTY&&await ot(),o&&console.log("The project now points to a different environment. Restart your dev server, and if you use an AI coding agent, start a new session."),!o&&s.MODELENCE_RUNTIME==="local"&&(console.log(`
2
+ import {Command}from'commander';import {readFileSync,promises,createWriteStream}from'fs';import {fileURLToPath}from'url';import ne,{join,dirname,relative,sep,basename}from'path';import {parse}from'dotenv';import {createInterface}from'readline';import {execFile,execSync,spawnSync}from'child_process';import gt from'open';import Pe from'fs/promises';import {createJiti}from'jiti';import {z as z$1}from'zod';import {build}from'tsup';import {loadConfigFromFile,build as build$1,mergeConfig}from'vite';import xn from'archiver';import Jt from'os';import {promisify}from'util';async function C(e,{pick:t,purpose:n,pickEnvironment:r=false,appId:o}={}){let i=await fetch(`${e}/api/cli/auth`,{method:"POST"});if(!i.ok)throw new Error("Failed to create CLI authentication code");let{code:a,verificationUrl:s}=await i.json(),c=new URL(s),l=t??(r?"environment":void 0);l&&c.searchParams.set("pick",l),n&&c.searchParams.set("purpose",n),o&&c.searchParams.set("appId",o),console.log(`Please visit ${c} to authenticate`),console.log(`Code: ${a}`);try{await gt(c.toString());}catch{console.log("Could not open a browser automatically. Please open the URL above manually.");}return await ht(e,a)}async function ht(e,t){let o=Date.now()+6e5;for(;Date.now()<o;){try{let i=await wt(e,t);if(i)return i}catch(i){console.error("Error polling for CLI token:",i);}await new Promise(i=>setTimeout(i,5e3));}throw new Error("Unable to authenticate CLI - timed out. Please try again.")}async function wt(e,t){let n=await fetch(`${e}/api/cli/token?code=${t}`,{method:"GET"});if(!n.ok)throw new Error(`CLI token polling failed: ${n.statusText}`);let{token:r,expiresAt:o,target:i}=await n.json();return r?{token:r,expiresAt:o,target:i}:null}var A=".modelence",T="project.json";function fe(e=process.cwd()){return join(e,A,T)}async function I(e=process.cwd()){try{let t=await promises.readFile(fe(e),"utf8"),n=JSON.parse(t);return n&&typeof n=="object"?n:{}}catch{return {}}}async function R(e,t=process.cwd()){let n=await I(t);await promises.mkdir(join(t,A),{recursive:true}),await promises.writeFile(fe(t),JSON.stringify({...n,...e},null,2)+`
3
+ `);}var Z=".modelence.env";async function kt(e,t){let n="setupToken"in t?{"X-Modelence-Setup-Token":t.setupToken}:{Authorization:`Bearer ${t.cliToken}`},r=await fetch(`${e}/api/setup`,{method:"GET",headers:n});if(!r.ok){let o=await r.text();throw new Error(o||`Request failed with status ${r.status}`)}return r.json()}async function he(e){let t=createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>{t.question(e,r=>{t.close(),n(r.trim());});})}async function Et(){return (await he(`Warning: ${Z} already exists. Do you want to overwrite it? (y/N) `)).toLowerCase()==="y"}function Pt(e){return String(e).replace(/"/g,'\\"')}async function St(){let{appId:e}=await I();return typeof e=="string"&&e?e:void 0}async function Dt(e){await R({appId:e});}var we=".claude",M=join(we,"settings.json"),F="modelence@modelence",Q="modelence/modelence",xt={modelence:{source:{source:"github",repo:Q}}},Ct="https://docs.modelence.com/ai-coding-agents",ge=`Install the Modelence plugin for Claude Code by hand:
4
+ claude plugin marketplace add ${Q}
5
+ claude plugin install ${F} --scope project
6
+ Guide: ${Ct}`;async function At(){let e=join(process.cwd(),M),t;try{t=await promises.readFile(e,"utf8");}catch(r){if(r.code!=="ENOENT"){console.warn(`Could not read ${M}; leaving it unchanged.`);return}}let n={};if(t!==void 0)try{n=JSON.parse(t);}catch{console.warn(`Could not parse ${M}; leaving it unchanged.`);return}n.extraKnownMarketplaces={...n.extraKnownMarketplaces,...xt},n.enabledPlugins?.[F]===void 0&&(n.enabledPlugins={...n.enabledPlugins,[F]:true});try{await promises.mkdir(join(process.cwd(),we),{recursive:!0}),await promises.writeFile(e,JSON.stringify(n,null,2)+`
7
+ `),console.log(`Declared the Modelence Claude Code plugin in ${M}`);}catch(r){console.warn(`Failed to write ${M}:`,r);}}function X(e){return spawnSync("claude",e,{encoding:"utf8",shell:process.platform==="win32"})}async function It(){let e=X(["--version"]);if(e.error||e.status!==0){console.log(ge);return}let t=(await he("Install the Modelence plugin for Claude Code? (Y/n) ")).toLowerCase();if(t&&t!=="y"&&t!=="yes")return;let n=X(["plugin","marketplace","add",Q]),r=X(["plugin","install",F,"--scope","project"]);if(r.status===0)console.log("Installed the Modelence plugin for Claude Code. Sign in once from Claude Code: run /mcp, choose modelence, then Authenticate.");else {let o=n.status!==0?n:r;console.warn(`Could not install the Modelence plugin: ${(o.stderr||o.stdout||"").trim()}`),console.warn(ge);}}async function Mt(e){try{let t=e.replace(".env",".backup.env");await promises.copyFile(e,t),console.log(`Backup created at ${t}`);}catch(t){console.warn("Failed to create backup file:",t);}}async function ye(e){try{let t=join(process.cwd(),Z),n={},r=!1;try{let c=await promises.readFile(t,"utf8");n=parse(c),r=!0,await Mt(t),await Et()||(console.log("Setup canceled"),process.exit(0));}catch{}let o;if(e.token)o={setupToken:e.token};else {let{token:c}=await C(e.host,{pickEnvironment:!0,appId:await St()});o={cliToken:c};}console.log("Fetching service configuration...");let i=await kt(e.host,o),a={...n,MODELENCE_TELEMETRY_ENABLED:"false",MODELENCE_ENVIRONMENT_ID:i.environmentId,MODELENCE_SERVICE_ENDPOINT:e.host,MODELENCE_SERVICE_TOKEN:i.serviceToken,MODELENCE_CONTAINER_ID:i.containerId,MODELENCE_RUNTIME:process.env.MODELENCE_RUNTIME||"local"},s=Object.entries(a).map(([c,l])=>`${c}="${Pt(l)}"`).join(`
8
+ `);if(await promises.writeFile(t,s.trim()+`
9
+ `),console.log(`Successfully configured ${Z} file`),i.appId)try{await Dt(i.appId),console.log(`Recorded the app ID in ${A}/${T}`);}catch(c){console.warn(`Failed to record the app ID in ${A}/${T}:`,c);}await At(),!e.token&&process.stdin.isTTY&&await It(),r&&console.log("The project now points to a different environment. Restart your dev server, and if you use an AI coding agent, start a new session."),!r&&a.MODELENCE_RUNTIME==="local"&&(console.log(`
10
10
  Next step \u2014 run the app on this machine:
11
11
  `),console.log(" npm install (if you haven't already)"),console.log(` npm run dev (starts the app)
12
- `));}catch(t){console.error(`Setup failed: ${t instanceof Error?t.message:"Unknown error"}`),process.exit(1);}}var at=z$1.object({serverDir:z$1.string(),serverEntry:z$1.string(),postBuildCommand:z$1.string().optional()});async function le(){let e=join(process.cwd(),"modelence.config.ts"),n=await createJiti(import.meta.url,{interopDefault:true,requireCache:false}).import(e);if(typeof n!="object")throw new Error("modelence.config.ts should export an object");return at.parse(n)}var de=null,K=null;function ue(){if(!K)throw new Error("Configuration not loaded");return K}function E(){let{serverDir:e,serverEntry:t}=ue();return join(e,t).replace(/\\/g,"/")}function pe(){return ue().postBuildCommand}function j(e){let t=Y("build");return e?join(t,e).replace(/\\/g,"/"):t.replace(/\\/g,"/")}function k(e){return join(process.cwd(),e).replace(/\\/g,"/")}function Y(e){let t=k(".modelence");return e?join(t,e).replace(/\\/g,"/"):t.replace(/\\/g,"/")}async function C(){try{K=await le();}catch(e){throw console.error(e),new Error("Unable to load modelence.config.ts")}try{let e=await me.readFile(join(process.cwd(),".modelence.env"),"utf-8");de=parse(e);}catch(e){if(e.code==="ENOENT")de={};else throw e}}async function pt(){let e=pe();if(e){console.log("Running post-build command..."),execSync(e);return}await mt(),await ft();}async function mt(){console.log("Building client with Vite...");let e=await loadConfigFromFile({command:"build",mode:process.env.NODE_ENV||"production"}),t={build:{outDir:q.resolve(process.cwd(),".modelence/build/client").replace(/\\/g,"/"),emptyOutDir:true,ssrManifest:true}};await build$1(mergeConfig(e?.config||{},t,true));}async function ft(){console.log("Building SSR bundle with Vite...");let e=await loadConfigFromFile({command:"build",mode:process.env.NODE_ENV||"production"}),n={build:{ssr:q.resolve(process.cwd(),"src/client/index.tsx").replace(/\\/g,"/"),outDir:q.resolve(process.cwd(),".modelence/build/ssr").replace(/\\/g,"/"),emptyOutDir:true,rollupOptions:{output:{format:"esm",entryFileNames:"index.mjs"}}}};await build$1(mergeConfig(e?.config||{},n,true));}async function gt(){return console.log("Building server with tsup..."),new Promise(e=>{build({entry:[E()],format:"esm",sourcemap:true,minify:process.env.NODE_ENV==="production",outDir:".modelence/build",clean:true,watch:false,bundle:true,skipNodeModulesBundle:true,treeshake:true,platform:"node",outExtension:()=>({js:".mjs"}),onSuccess:async()=>{e(void 0);}});})}async function _(){console.log("Building Modelence project...");try{let e=j();await me.rm(e,{recursive:!0,force:!0}),await gt(),await pt(),console.log("Build completed successfully!");}catch(e){throw console.error(e),new Error("Build failed")}try{await me.access(Y());}catch{throw new Error("Could not find the .modelence directory. Looks like something went wrong during the build.")}}var yt="auth.json",vt=60*1e3;function L(){let e=process.env.MODELENCE_HOME||join(ht.homedir(),".modelence");return join(e,yt)}async function Z(){try{let e=JSON.parse(await promises.readFile(L(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return {}}}async function X(e){let t=L();await promises.mkdir(dirname(t),{recursive:true,mode:448}),await promises.writeFile(t,JSON.stringify(e,null,2)+`
13
- `,{mode:384});}async function ye(e){let{hosts:t={}}=await Z(),n=t[e];return !n?.token||!n.expiresAt||new Date(n.expiresAt).getTime()-vt<=Date.now()?null:n.token}async function ve(e,t,n){let o=await Z();await X({...o,hosts:{...o.hosts,[e]:{token:t,expiresAt:n}}});}async function F(e){if(!e){await X({});return}let t=await Z(),{[e]:n,...o}=t.hosts??{};await X({...t,hosts:o});}var Ct={5:7,6:8,9:10};function ke(e){let t=/^lockfileVersion:\s*['"]?(\d+)(?:\.\d+)?['"]?\s*$/m.exec(e);if(t)return Ct[t[1]]}function bt(e){let t=[],n=false;for(let o of e.split(`
14
- `)){if(/^packages:\s*$/.test(o)){n=true;continue}if(!n)continue;let r=/^\s+-\s*['"]?([^'"#]+?)['"]?\s*(?:#.*)?$/.exec(o);r?t.push(r[1].trim()):o.trim()!==""&&!o.startsWith(" ")&&!o.startsWith(" ")&&(n=false);}return t}function Pt(e){let t=e.workspaces;if(Array.isArray(t))return t.filter(n=>typeof n=="string");if(t&&typeof t=="object"){let n=t.packages;return Array.isArray(n)?n.filter(o=>typeof o=="string"):[]}return []}function Ee(e){let n=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/").map(o=>o==="**"?".*":o.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")).join("/");return new RegExp(`^${n}$`)}async function Dt(e,t){let n=[];async function o(r,i){if(i>t)return;let s;try{s=await promises.readdir(r,{withFileTypes:!0});}catch{return}for(let c of s){if(!c.isDirectory()||c.name==="node_modules"||c.name.startsWith("."))continue;let a=join(r,c.name);n.push(a),await o(a,i+1);}}return await o(e,1),n}var It=4;async function xt(e,t){if(t.length===0)return [];let n=t.filter(s=>!s.startsWith("!")).map(Ee),o=t.filter(s=>s.startsWith("!")).map(s=>Ee(s.slice(1))),r=await Dt(e,It),i=[];for(let s of r){let c=relative(e,s).split(sep).join("/");if(!n.some(l=>l.test(c))||o.some(l=>l.test(c)))continue;let a;try{a=JSON.parse(await promises.readFile(join(s,"package.json"),"utf8"));}catch{continue}typeof a.name=="string"&&i.push({name:a.name,dir:c,scripts:a.scripts??{}});}return i.sort((s,c)=>s.dir.localeCompare(c.dir))}function St(e,t){switch(e){case "pnpm":return `pnpm --filter ${t} start`;case "yarn":return `yarn workspace ${t} start`;default:return `npm start --workspace ${t}`}}function Tt(e,t){switch(e){case "pnpm":return `pnpm --filter ${t.name}... --if-present run build`;case "yarn":return t.scripts.build?`yarn workspace ${t.name} run build`:void 0;default:return t.scripts.build?`npm run build --if-present --workspace ${t.name}`:void 0}}async function Ce(e,t,n){let o=Pt(n);if(t==="pnpm")try{o=bt(await promises.readFile(join(e,"pnpm-workspace.yaml"),"utf8"));}catch{}let i=(await xt(e,o)).filter(s=>s.scripts.start);if(i.length===1){let[s]=i;return {startCommand:St(t,s.name),buildCommand:Tt(t,s),note:`No root start script; the container starts the ${s.name} workspace package (${s.dir}/), and the build is scoped to it and its workspace dependencies. Pass --build-command to build differently.`}}return i.length>1?{note:`Several workspace packages have a start script (${i.map(c=>c.name).join(", ")}); pass --start-command to choose one.`}:{}}var Nt=18;async function g(e){try{return await promises.access(e),!0}catch{return false}}async function be(e){try{let t=JSON.parse(await promises.readFile(e,"utf8"));return t&&typeof t=="object"?t:null}catch{return null}}function At(e){if(typeof e!="string")return;let t=e.match(/(\d+)(?:\.\d+)?(?:\.\d+)?/);if(!t)return;let n=Number(t[1]);return n>=Nt?String(n):void 0}function $t(e){for(let t of e.split(/\r?\n/)){let n=t.match(/^\s*web\s*:\s*(.+?)\s*$/);if(n)return n[1]}}function Ot(e,t){let o=t.packages?.[""];if(!o)return true;for(let r of ["dependencies","devDependencies","optionalDependencies"]){let i=e[r]??{},s=o[r]??{},c=new Set([...Object.keys(i),...Object.keys(s)]);for(let a of c)if(i[a]!==s[a])return false}return true}function Mt(e,t){if(typeof e!="string")return;let n=/^([a-z]+)@(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)(?:\+.*)?$/.exec(e.trim());if(!(!n||n[1]!==t))return n[2]}function Rt(e,t,n){switch(e){case "pnpm":return {install:`npm install -g ${n?`pnpm@${n}`:"pnpm"} && pnpm install --frozen-lockfile`,run:r=>`pnpm run ${r}`,start:"pnpm start"};case "yarn":return {install:"yarn install --frozen-lockfile",run:o=>`yarn ${o}`,start:"yarn start"};default:return {install:t?"npm ci":"npm install",run:o=>`npm run ${o}`,start:"npm start"}}}async function Pe(e=process.cwd()){let t=[],n=await be(join(e,"package.json"));if(!n)throw new Error("No package.json found in the current directory");let o=n.scripts??{},r=n.engines??{},i=await g(join(e,"modelence.config.ts"))||await g(join(e,"modelence.config.js")),s="npm";await g(join(e,"pnpm-lock.yaml"))?s="pnpm":await g(join(e,"yarn.lock"))&&(s="yarn");let c=await g(join(e,"package-lock.json"));if(s==="npm"&&!c&&t.push("No package-lock.json found; dependencies are installed with `npm install`."),s==="npm"&&c){let m=await be(join(e,"package-lock.json"));m&&!Ot(n,m)&&(c=false,t.push("package-lock.json is out of date with package.json, so dependencies are installed with `npm install`. Run `npm install` locally and commit the lockfile to get reproducible `npm ci` installs."));}let a=Mt(n.packageManager,s);if(s==="pnpm"&&!a){let m=ke(await promises.readFile(join(e,"pnpm-lock.yaml"),"utf8"));m?a=String(m):t.push('Could not tell which pnpm version wrote pnpm-lock.yaml; the build installs the latest. Add e.g. "packageManager": "pnpm@10.4.1" to package.json to pin it.');}let l=Rt(s,c,a),u;o.build?u=l.run("build"):i||t.push("No `build` script found; the deploy skips the build step.");let p;try{p=$t(await promises.readFile(join(e,"Procfile"),"utf8"));}catch{}if(!p&&o.start&&(p=l.start),!p&&!i){let m=await Ce(e,s,n);p=m.startCommand,m.startCommand&&(u=m.buildCommand),m.note&&t.push(m.note);}let d=At(r.node),h=!i&&!p&&u?await jt(e,n):void 0;return h?(t.push(`No start script found; the site is served from ${h}/ with single-page app fallback.`),{preset:"static",packageManager:s,nodeVersion:d,installCommand:l.install,buildCommand:u,outputDirectory:h,notes:t}):(p||t.push("No `start` script or Procfile found; the container runs `npm start`. Pass --start-command to override."),{preset:i?"modelence":"node",packageManager:s,nodeVersion:d,installCommand:l.install,buildCommand:u,startCommand:p,notes:t})}async function jt(e,t){let n={...t.dependencies??{},...t.devDependencies??{}},o=await g(join(e,"vite.config.ts"))||await g(join(e,"vite.config.js"))||await g(join(e,"vite.config.mts"));if(n.vite||o)return "dist";if(n["react-scripts"])return "build";if(n["@angular/cli"]||n.astro||await g(join(e,"index.html")))return "dist"}var Ie=promisify(execFile),De=200*1024*1024,Wt=[".git","node_modules",".modelence/build",".modelence/tmp",".modelence/cache"],zt=[/^\.modelence(\.[^/]+)?\.env$/];function xe(e){return e.split(sep).join("/")}function Se(e){let t=xe(e),n=t.split("/");for(let r of Wt)if(r.split("/").length===1){if(n.slice(0,-1).includes(r))return true}else if(t===r||t.startsWith(`${r}/`))return true;let o=n[n.length-1];return zt.some(r=>r.test(o))}async function Jt(e){try{let{stdout:t}=await Ie("git",["rev-parse","--is-inside-work-tree"],{cwd:e});return t.trim()==="true"}catch{return false}}async function Gt(e){let{stdout:t}=await Ie("git",["ls-files","--cached","--others","--exclude-standard","-z"],{cwd:e,maxBuffer:67108864});return t.split("\0").filter(n=>n.length>0)}async function Te(e,t=""){let n=await promises.readdir(join(e,t),{withFileTypes:true}),o=[];for(let r of n){let i=t?`${t}/${r.name}`:r.name;r.isDirectory()?Se(`${i}/x`)||o.push(...await Te(e,i)):r.isFile()&&o.push(i);}return o}async function Kt(e=process.cwd()){let t=await Jt(e),n=t?await Gt(e):await Te(e),o=[];for(let r of n)if(!Se(r))try{(await promises.stat(join(e,r))).isFile()&&o.push(r);}catch{}return {files:o.sort(),usedGit:t}}async function Ne(e,t){let{files:n,usedGit:o}=await Kt(e);if(n.length===0)throw new Error("No files to upload");await promises.mkdir(join(t,".."),{recursive:true}),await promises.rm(t,{force:true});let r=createWriteStream(t),i=Vt("zip",{zlib:{level:6}}),s=new Promise((a,l)=>{r.on("close",a),r.on("error",l),i.on("error",l);});i.pipe(r);for(let a of n)i.file(join(e,a),{name:xe(relative("",a))});await i.finalize(),await s;let{size:c}=await promises.stat(t);if(c>De)throw await promises.rm(t,{force:true}),new Error(`Source is ${(c/1024/1024).toFixed(0)} MB compressed; the limit is ${De/1024/1024} MB. Add build output and large assets to .gitignore.`);return {fileCount:n.length,sizeBytes:c,usedGit:o}}var P=class extends Error{constructor(n,o){super(n);this.status=o;this.name="StudioApiError";}};async function N(e,t,{method:n="GET",token:o,body:r,query:i}={}){let s=new URL(t,e);for(let[l,u]of Object.entries(i??{}))s.searchParams.set(l,String(u));let c={};o&&(c.Authorization=`Bearer ${o}`),r!==void 0&&(c["Content-Type"]="application/json");let a=await fetch(s,{method:n,headers:c,body:r===void 0?void 0:JSON.stringify(r)});if(!a.ok){let l=await a.text(),u=l||a.statusText;try{let p=JSON.parse(l);u=p.error||p.message||u;}catch{}throw new P(u,a.status)}return await a.json()}var Xt="https://cloud.modelence.com",Me=3e3,Zt=30*60*1e3,Qt=10*60*1e3;async function Re(e){let t=process.cwd(),n=await sn(e.host,t),o=e.prebuilt?"bundle":"source",r=an(e),i=await x(t),s,c=join(t,".modelence","tmp",`${o}.zip`);if(o==="bundle")await C(),await _(),await dn(c);else {let d=await Pe(t);s={preset:d.preset,nodeVersion:d.nodeVersion,installCommand:d.installCommand,buildCommand:d.buildCommand,startCommand:d.startCommand,outputDirectory:d.outputDirectory},cn({...s,...ne(r)},d.notes);let{fileCount:h,sizeBytes:m,usedGit:Ve}=await Ne(t,c);console.log(`Packed ${h} files (${_e(m)})`+(Ve?" from git":"; not a git repository, so only default exclusions applied"));}let a=on(e,i),l=await rn(n);if(!l||!a){let d=await D(n,{pick:a?void 0:"deploy",purpose:"deploy",appId:i.appId});l=d.token,await $e(n,d.token,d.expiresAt),d.target&&(a={environmentId:d.target.environmentId},await te(d.target));}if(!a)throw new Error("No deploy target selected. Run again and pick an environment in the browser, or pass --app and --env.");let u={host:n,token:l},p=async()=>{await F(n),console.log("Your saved login has expired; please sign in again.");let d=await D(n,{pick:a?void 0:"deploy",purpose:"deploy",appId:i.appId});await $e(n,d.token,d.expiresAt),d.target&&(a={environmentId:d.target.environmentId},await te(d.target)),u.token=d.token;};try{let d;try{d=await Ae({session:u,target:a,kind:o,archivePath:c,overrides:r,detected:s,project:i});}catch(h){if(!je(h))throw h;await p(),d=await Ae({session:u,target:a,kind:o,archivePath:c,overrides:r,detected:s,project:i});}d.buildId&&await tn(u,p,d.environmentId,d.buildId);}finally{await promises.rm(c,{force:true});}}function je(e){return e instanceof P&&e.status===401}async function Ae({session:e,target:t,kind:n,archivePath:o,overrides:r,detected:i,project:s}){let{host:c,token:a}=e,l=await N(c,"/api/upload-bundle",{method:"POST",token:a,body:{...t,kind:n}});await en(c,a,l.environmentId),console.log(`Uploading to ${l.appAlias}/${l.envAlias}...`);let u=await promises.readFile(o),p=await fetch(l.uploadUrl,{method:"PUT",body:new Uint8Array(u),headers:{"Content-Type":"application/zip"}});if(!p.ok)throw new Error(`Failed to upload: ${p.statusText}`);let d=await N(c,"/api/deploy",{method:"POST",token:a,body:{environmentId:l.environmentId,bundleName:l.bundleName,kind:n,plan:ne(r),detected:i?ne(i):void 0}});return (!s.deploy||s.deploy.environmentId!==d.environmentId)&&await te({environmentId:d.environmentId,appAlias:d.appAlias,envAlias:d.envAlias}),d.plan&&ln(d.plan,i),console.log(`Deployment started: ${d.deploymentUrl}`),{environmentId:d.environmentId,buildId:d.buildId}}async function en(e,t,n){let o=Date.now()+Qt,r=false;for(;Date.now()<o;){let i;try{({status:i}=await N(e,"/api/environment/status",{token:t,query:{environmentId:n}}));}catch(s){if(s instanceof P&&s.status===404)return;throw s}if(i==="ready")return;if(i==="failed")throw new Error("The environment failed to provision; check it in the dashboard.");r||(console.log("Waiting for the environment to finish provisioning..."),r=true),await new Promise(s=>setTimeout(s,Me));}throw new Error("Timed out waiting for the environment to be ready.")}async function tn(e,t,n,o){let r=Date.now()+Zt,i="",s="",c=0,a=false;for(;Date.now()<r;){let l;try{l=await N(e.host,"/api/deploy/status",{token:e.token,query:{environmentId:n,buildId:o,logOffset:c}});}catch(u){if(!je(u)||a)throw u;a=true,await t();continue}for(let u of l.logs)process.stdout.write(` \u2502 ${u.replace(/\n$/,"")}
15
- `);if(c=Math.max(c,l.logCount),l.status!==i){i=l.status;let u=nn(l);u&&u!==s&&(s=u,console.log(u));}if(l.status==="deploy-completed"){l.siteUrl&&console.log(`Live at ${l.siteUrl}`);return}if(l.status==="build-failed"||l.status==="deploy-failed"){for(let u of l.errors)console.error(` ${u}`);if(l.containerLogs&&l.containerLogs.length>0){console.error("Container output:");for(let u of l.containerLogs)console.error(` \u2502 ${u.replace(/\n$/,"")}`);}process.exitCode=1;return}await new Promise(u=>setTimeout(u,Me));}console.error("Timed out waiting for the deployment; check the dashboard for its status."),process.exitCode=1;}function nn(e){switch(e.status){case "build-pending":return "Building image...";case "deploy-pending":case "deploying":return "Image built. Deploying containers...";case "rolling-out":return "Rolling out new containers...";case "deploy-completed":return "Deployed successfully.";case "build-failed":return "Build failed.";case "deploy-failed":return "Deployment failed.";default:return null}}function on(e,t){if(e.app&&e.env)return {appAlias:e.app,envAlias:e.env};if(e.env&&t.deploy?.appAlias)return {appAlias:t.deploy.appAlias,envAlias:e.env};if(e.env&&t.appId)return {appId:t.appId,envAlias:e.env};if(e.app||e.env)throw new Error("Pass both --app and --env, or neither to pick the target in the browser.");return t.deploy?.environmentId?{environmentId:t.deploy.environmentId}:null}async function rn(e){return process.env.MODELENCE_TOKEN?process.env.MODELENCE_TOKEN:await ye(e)}async function $e(e,t,n){if(n)try{await ve(e,t,n);}catch(o){console.warn("Could not save the login for next time:",o);}}async function te(e){let t={environmentId:e.environmentId,appAlias:e.appAlias,envAlias:e.envAlias};try{await $({deploy:t,..."appId"in e?{appId:e.appId}:{}});}catch(n){console.warn("Could not record the deploy target in .modelence/project.json:",n);}}async function sn(e,t){if(e)return e.replace(/\/$/,"");if(process.env.MODELENCE_SERVICE_ENDPOINT)return process.env.MODELENCE_SERVICE_ENDPOINT.replace(/\/$/,"");try{let n=parse(await promises.readFile(join(t,".modelence.env"),"utf8"));if(n.MODELENCE_SERVICE_ENDPOINT)return n.MODELENCE_SERVICE_ENDPOINT.replace(/\/$/,"")}catch{}return Xt}function an(e){return {preset:e.preset,nodeVersion:e.nodeVersion,rootDirectory:e.rootDir,installCommand:e.installCommand,buildCommand:e.buildCommand,startCommand:e.startCommand,outputDirectory:e.outputDir}}function ne(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function cn(e,t){console.log("Build plan:"),console.log(` preset: ${e.preset??"node"}`),console.log(` node: ${e.nodeVersion??"default (22)"}`),e.rootDirectory&&console.log(` root: ${e.rootDirectory}`),console.log(` install: ${e.installCommand??"default"}`),console.log(` build: ${e.buildCommand||"(none)"}`),e.preset==="static"?console.log(` serve: ${e.outputDirectory??"dist"}/ (static site)`):console.log(` start: ${e.startCommand??"npm start"}`);for(let n of t)console.log(` note: ${n}`);}function ln(e,t){if(!t)return;let n=[];e.preset&&t.preset&&e.preset!==t.preset&&n.push(`preset ${e.preset} (detected ${t.preset})`);for(let o of ["installCommand","buildCommand","startCommand"]){let r=t[o];r!==void 0&&e[o]!==void 0&&e[o]!==r&&n.push(`${o.replace("Command","")} "${e[o]}" (detected "${r}")`);}n.length>0&&(console.log("Using the environment's Build & Deploy settings: "+n.join(", ")),console.log("Edit them in the dashboard, or pass --preset/--*-command to change them."));}function _e(e){return `${(e/1024/1024).toFixed(2)} MB`}async function dn(e){await promises.rm(e,{force:true}),console.log("Creating deployment bundle..."),await promises.mkdir(join(e,".."),{recursive:true});let t=createWriteStream(e),n=Vt("zip",{zlib:{level:9}}),o=new Promise((c,a)=>{t.on("close",c),t.on("error",a),n.on("error",a);});n.pipe(t);let r=["package.json","package-lock.json","next.config.js","next.config.ts","modelence.config.ts"],i=["public","server","scripts",join(".modelence","build"),".next"];for(let c of r)await Oe(k(c))&&n.file(k(c),{name:c});for(let c of i)await Oe(k(c))&&n.directory(k(c),c);await n.finalize(),await o;let s=await promises.stat(e);console.log(`Deployment bundle created (${_e(s.size)})`);}async function Oe(e){try{return await promises.access(e),!0}catch{return false}}function Le(e={}){console.log("Starting Modelence dev server...");let t=E(),n=q.resolve("./node_modules/.bin/tsx");execSync(`"${n}" watch --ignore "vite.config.ts.timestamp-*" "${t}"`,{stdio:"inherit",cwd:process.cwd(),env:{...process.env,NODE_ENV:"development",...e.takeover?{MODELENCE_TAKEOVER:"1"}:{}}});}function Be(){console.log("Starting Modelence production server...");let e=E(),t=q.basename(e,q.extname(e)),n=j(`${t}.mjs`);execSync(`node "${n}"`,{stdio:"inherit",cwd:process.cwd(),env:{...process.env,NODE_ENV:"production"}});}async function Ue(e){await F(e.host),console.log(e.host?`Removed the saved login for ${e.host}.`:`Removed saved logins (${L()}).`);}var vn=fileURLToPath(import.meta.url),En=dirname(vn),kn=JSON.parse(readFileSync(join(En,"../../package.json"),"utf-8")),y=new Command().name("modelence").description("Modelence CLI tool").version(kn.version);y.command("setup").description("Setup Modelence environment variables").option("-t, --token <token>","Modelence setup token (omit to authorize in the browser)").option("-h, --host <host>","Modelence host","https://cloud.modelence.com").action(async e=>{await ce(e);});y.command("build").description("Build the application").action(async()=>{await C(),await _();});y.command("deploy").description("Deploy the current directory to Modelence Cloud (any Node.js app; picks the target in the browser on first run)").option("-a, --app <app>","Application alias").option("-e, --env <env>","Environment alias").option("-h, --host <host>","Modelence host").option("--prebuilt","Build locally and upload the .modelence/build bundle (Modelence apps only)").option("--preset <preset>","Build preset: node, static or modelence (default: detected)").option("--node-version <version>","Node.js version for the container, e.g. 22").option("--root-dir <path>","Subdirectory containing the app (monorepos)").option("--install-command <command>","Override the detected install command").option("--build-command <command>",'Override the detected build command ("" to skip)').option("--start-command <command>","Override the detected start command").option("--output-dir <path>","Static sites: directory the build writes, e.g. dist").action(async e=>{try{await Re(e);}catch(t){console.error(`Deploy failed: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}});y.command("logout").description("Forget the saved Modelence Cloud login").option("-h, --host <host>","Only forget the login for this host").action(async e=>{await Ue(e);});y.command("dev").description("Start development server").option("--takeover","Disconnect any instance currently holding the environment and connect this one").action(async e=>{await C(),Le(e);});y.command("start").description("Start production server").action(async()=>{await C(),Be();});y.parse(process.argv);//# sourceMappingURL=modelence.js.map
12
+ `));}catch(t){console.error(`Setup failed: ${t instanceof Error?t.message:"Unknown error"}`),process.exit(1);}}var Ot=z$1.object({serverDir:z$1.string(),serverEntry:z$1.string(),postBuildCommand:z$1.string().optional()});async function be(){let e=join(process.cwd(),"modelence.config.ts"),n=await createJiti(import.meta.url,{interopDefault:true,requireCache:false}).import(e);if(typeof n!="object")throw new Error("modelence.config.ts should export an object");return Ot.parse(n)}var ve=null,ee=null;function ke(){if(!ee)throw new Error("Configuration not loaded");return ee}function k(){let{serverDir:e,serverEntry:t}=ke();return join(e,t).replace(/\\/g,"/")}function Ee(){return ke().postBuildCommand}function U(e){let t=te("build");return e?join(t,e).replace(/\\/g,"/"):t.replace(/\\/g,"/")}function E(e){return join(process.cwd(),e).replace(/\\/g,"/")}function te(e){let t=E(".modelence");return e?join(t,e).replace(/\\/g,"/"):t.replace(/\\/g,"/")}async function P(){try{ee=await be();}catch(e){throw console.error(e),new Error("Unable to load modelence.config.ts")}try{let e=await Pe.readFile(join(process.cwd(),".modelence.env"),"utf-8");ve=parse(e);}catch(e){if(e.code==="ENOENT")ve={};else throw e}}async function Ft(){let e=Ee();if(e){console.log("Running post-build command..."),execSync(e);return}await Lt(),await Ut();}async function Lt(){console.log("Building client with Vite...");let e=await loadConfigFromFile({command:"build",mode:process.env.NODE_ENV||"production"}),t={build:{outDir:ne.resolve(process.cwd(),".modelence/build/client").replace(/\\/g,"/"),emptyOutDir:true,ssrManifest:true}};await build$1(mergeConfig(e?.config||{},t,true));}async function Ut(){console.log("Building SSR bundle with Vite...");let e=await loadConfigFromFile({command:"build",mode:process.env.NODE_ENV||"production"}),n={build:{ssr:ne.resolve(process.cwd(),"src/client/index.tsx").replace(/\\/g,"/"),outDir:ne.resolve(process.cwd(),".modelence/build/ssr").replace(/\\/g,"/"),emptyOutDir:true,rollupOptions:{output:{format:"esm",entryFileNames:"index.mjs"}}}};await build$1(mergeConfig(e?.config||{},n,true));}async function Bt(){return console.log("Building server with tsup..."),new Promise(e=>{build({entry:[k()],format:"esm",sourcemap:true,minify:process.env.NODE_ENV==="production",outDir:".modelence/build",clean:true,watch:false,bundle:true,skipNodeModulesBundle:true,treeshake:true,platform:"node",outExtension:()=>({js:".mjs"}),onSuccess:async()=>{e(void 0);}});})}async function B(){console.log("Building Modelence project...");try{let e=U();await Pe.rm(e,{recursive:!0,force:!0}),await Bt(),await Ft(),console.log("Build completed successfully!");}catch(e){throw console.error(e),new Error("Build failed")}try{await Pe.access(te());}catch{throw new Error("Could not find the .modelence directory. Looks like something went wrong during the build.")}}var f="modelence.json";function V(e=process.cwd()){return join(e,f)}async function Ae(e=process.cwd()){let t;try{t=await promises.readFile(V(e),"utf8");}catch{return null}let n;try{n=JSON.parse(t);}catch(r){throw new Error(`${f} is not valid JSON: ${r instanceof Error?r.message:String(r)}`)}if(!n||typeof n!="object"||Array.isArray(n))throw new Error(`${f} must contain a JSON object`);return n}async function Ie(e,t=process.cwd()){await promises.writeFile(V(t),JSON.stringify(e,null,2)+`
13
+ `);}function re(...e){return e.reduce((t,n)=>{if(!n)return t;let r={...t.build,...n.build};(t.build?.env||n.build?.env)&&(r.env={...t.build?.env,...n.build?.env});let o={...t.web,...n.web};return Wt({...t,...n.runtime?{runtime:n.runtime}:{},build:r,web:o})},{})}function Wt(e){let t={...e};return t.build&&Object.keys(t.build).length===0&&delete t.build,t.web&&Object.keys(t.web).length===0&&delete t.web,t}function oe(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function W(e){let t=[];t.push(` runtime: ${e.runtime??"node"}`),t.push(` node: ${e.build?.node??"default (22)"}`),e.build?.root&&e.build.root!=="."&&t.push(` root: ${e.build.root}`),t.push(` install: ${e.build?.install??"default"}`),t.push(` build: ${e.build?.command||"(none)"}`);for(let[n,r]of Object.entries(e.build?.env??{}))t.push(` env: ${n}=${r}`);e.web?.start?t.push(` start: ${e.web.start}`):e.web?.static?.length||t.push(" start: (none)");for(let n of e.web?.static??[])t.push(` static: ${n.path} -> ${n.dir}/`);return t}var zt="auth.json",Kt=60*1e3;function J(){let e=process.env.MODELENCE_HOME||join(Jt.homedir(),".modelence");return join(e,zt)}async function ae(){try{let e=JSON.parse(await promises.readFile(J(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return {}}}async function se(e){let t=J();await promises.mkdir(dirname(t),{recursive:true,mode:448}),await promises.writeFile(t,JSON.stringify(e,null,2)+`
14
+ `,{mode:384});}async function je(e){let{hosts:t={}}=await ae(),n=t[e];return !n?.token||!n.expiresAt||new Date(n.expiresAt).getTime()-Kt<=Date.now()?null:n.token}async function Ne(e,t,n){let r=await ae();await se({...r,hosts:{...r.hosts,[e]:{token:t,expiresAt:n}}});}async function G(e){if(!e){await se({});return}let t=await ae(),{[e]:n,...r}=t.hosts??{};await se({...t,hosts:r});}function h({packageManager:e,version:t,useLockfile:n}){switch(e){case "pnpm":return {install:`npm install -g ${t?`pnpm@${t}`:"pnpm"} && pnpm install --frozen-lockfile`,run:o=>`pnpm run ${o}`,start:"pnpm start",runIn:(o,i)=>`pnpm --filter ${o} run ${i}`,buildWithDependencies:o=>`pnpm --filter ${o}... --if-present run build`,startIn:o=>`pnpm --filter ${o} start`};case "yarn":return {install:"yarn install --frozen-lockfile",run:r=>`yarn ${r}`,start:"yarn start",runIn:(r,o)=>`yarn workspace ${r} run ${o}`,buildWithDependencies:r=>`yarn workspace ${r} run build`,startIn:r=>`yarn workspace ${r} start`};default:return {install:n?"npm ci":"npm install",run:r=>`npm run ${r}`,start:"npm start",runIn:(r,o)=>`npm run ${o} --workspace ${r}`,buildWithDependencies:r=>`npm run build --if-present --workspace ${r}`,startIn:r=>`npm start --workspace ${r}`}}}function w(e,t){return {...e,spec:{...e.spec,build:{...e.spec.build,...t}}}}function y(e,t){return {...e,spec:{...e.spec,web:{...e.spec.web,...t}}}}function d(e,t){return {...e,notes:[...e.notes,t]}}var Ht=(e,t)=>e.hasModelenceConfig?{...t,spec:{...t.spec,runtime:"modelence"}}:t,Yt=(e,t)=>e.nodeMajor?w(t,{node:e.nodeMajor}):t,qt=(e,t)=>{let n=h({packageManager:e.packageManager,version:e.packageManagerVersion,useLockfile:e.lockfile.present&&e.lockfile.inSync}),r=w(t,{install:n.install});return e.packageManager==="npm"&&!e.lockfile.present&&(r=d(r,"No package-lock.json found; dependencies are installed with `npm install`.")),e.packageManager==="npm"&&e.lockfile.present&&!e.lockfile.inSync&&(r=d(r,"package-lock.json is out of date with package.json, so dependencies are installed with `npm install`. Run `npm install` locally and commit the lockfile to get reproducible `npm ci` installs.")),e.packageManager==="pnpm"&&!e.packageManagerVersion&&(r=d(r,'Could not tell which pnpm version wrote pnpm-lock.yaml; the build installs the latest. Add e.g. "packageManager": "pnpm@10.4.1" to package.json to pin it.')),r},Xt=(e,t)=>e.scripts.build?w(t,{command:h(N(e)).run("build")}):t,Zt=(e,t)=>e.procfileWeb?y(t,{start:e.procfileWeb}):e.scripts.start?y(t,{start:h(N(e)).start}):t,Qt=(e,t)=>{if(t.spec.web?.start||t.spec.runtime==="modelence")return t;let n=e.workspace.members.filter(s=>s.scripts.start);if(n.length===0)return t;if(n.length>1){let s=n.map(c=>c.name).join(", ");return d(t,`Several workspace packages have a start script (${s}); set web.start in modelence.json or pass --start-command to choose one.`)}let[r]=n,o=h(N(e)),i=w(t,{command:o.buildWithDependencies(r.name)}),a=y(i,{start:o.startIn(r.name)});return d(a,`No root start script; the container starts the ${r.name} workspace package (${r.dir}/), and the build is scoped to it and its workspace dependencies.`)},en=(e,t)=>{if(t.spec.web?.start||t.spec.runtime==="modelence"||!t.spec.build?.command)return t;let n=nn(e);if(!n)return t;let r=y(t,{static:[{path:"/",dir:n}]});return d(r,`No start script found; the site is served from ${n}/ with single-page app fallback.`)},tn=(e,t)=>t.spec.web?.start||t.spec.web?.static?.length||t.spec.runtime==="modelence"?t:d(t,"No `start` script or Procfile found; set web.start in modelence.json or pass --start-command."),Oe=[Ht,Yt,qt,Xt,Zt,Qt,en,tn];function $e(e,t,n){return t.reduce((r,o)=>o(e,r),n)}function N(e){return {packageManager:e.packageManager,version:e.packageManagerVersion,useLockfile:e.lockfile.present&&e.lockfile.inSync}}function nn(e){if(e.dependencies.vite||e.hasViteConfig)return e.viteOutDir??"dist";if(e.dependencies["react-scripts"])return "build";if(e.dependencies["@angular/cli"]||e.dependencies.astro||e.hasIndexHtml)return "dist"}function Te(e){return e.workspace.members.filter(t=>t.hasViteConfig&&!t.scripts.start&&t.scripts.build)}function Re(e){if(typeof e!="string")return;let t=e.match(/(\d+)(?:\.\d+)?(?:\.\d+)?/);if(!t)return;let n=Number(t[1]);return n>=18?String(n):void 0}function _e(e){for(let t of e.split(/\r?\n/)){let n=t.match(/^\s*web\s*:\s*(.+?)\s*$/);if(n)return n[1]}}function Fe(e,t){let r=t.packages?.[""];if(!r)return true;for(let o of ["dependencies","devDependencies","optionalDependencies"]){let i=e[o]??{},a=r[o]??{},s=new Set([...Object.keys(i),...Object.keys(a)]);for(let c of s)if(i[c]!==a[c])return false}return true}function ce(e,t){if(typeof e!="string")return;let n=/^([a-z]+)@(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)(?:\+.*)?$/.exec(e.trim());if(!(!n||n[1]!==t))return n[2]}var rn={5:7,6:8,9:10};function Le(e){let t=/^lockfileVersion:\s*['"]?(\d+)(?:\.\d+)?['"]?\s*$/m.exec(e);if(t)return rn[t[1]]}function Ue(e){let t=[],n=false;for(let r of e.split(`
15
+ `)){if(/^packages:\s*$/.test(r)){n=true;continue}if(!n)continue;let o=/^\s+-\s*['"]?([^'"#]+?)['"]?\s*(?:#.*)?$/.exec(r);o?t.push(o[1].trim()):r.trim()!==""&&!r.startsWith(" ")&&!r.startsWith(" ")&&(n=false);}return t}function Be(e){let t=e.workspaces;if(Array.isArray(t))return t.filter(n=>typeof n=="string");if(t&&typeof t=="object"){let n=t.packages;return Array.isArray(n)?n.filter(r=>typeof r=="string"):[]}return []}function Ve(e){let t=/outDir:\s*(?:path\.resolve\([^)]*?,\s*)?["'`]([^"'`]+)["'`]/.exec(e)??/outDir:\s*["'`]([^"'`]+)["'`]/.exec(e);return t?t[1].replace(/^\.\//,"").replace(/\/+$/,""):void 0}function We(e){let t=/^modules\s*=\s*\[([^\]]*)\]/m.exec(e);return t?[...t[1].matchAll(/["']([^"']+)["']/g)].map(n=>n[1]):[]}function le(e){let n=e.replace(/\\/g,"/").replace(/\/+$/,"").split("/").map(r=>r==="**"?".*":r.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,"[^/]*")).join("/");return new RegExp(`^${n}$`)}function Je(e){return {...e.dependencies??{},...e.devDependencies??{}}}function Ge(e){return Object.assign({},e.dependencies,...e.workspace.members.map(t=>t.dependencies))}async function z(e){try{return await promises.access(e),!0}catch{return false}}async function S(e){try{return await promises.readFile(e,"utf8")}catch{return null}}async function ue(e){let t=await S(e);if(t===null)return null;try{let n=JSON.parse(t);return n&&typeof n=="object"?n:null}catch{return null}}var an=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.mjs"];async function ze(e){for(let t of an){let n=await S(join(e,t));if(n!==null)return {present:true,outDir:Ve(n)}}return {present:false}}async function cn(e,t){let n=await S(join(e,"pnpm-lock.yaml"));if(n!==null){let o=ce(t.packageManager,"pnpm"),i=Le(n);return {packageManager:"pnpm",packageManagerVersion:o??(i?String(i):void 0),lockfile:{present:true,inSync:true}}}if(await z(join(e,"yarn.lock")))return {packageManager:"yarn",packageManagerVersion:ce(t.packageManager,"yarn"),lockfile:{present:true,inSync:true}};let r=await ue(join(e,"package-lock.json"));return {packageManager:"npm",packageManagerVersion:void 0,lockfile:{present:r!==null,inSync:r!==null&&Fe(t,r)}}}var ln=4;async function pn(e,t){let n=[];async function r(o,i){if(i>t)return;let a;try{a=await promises.readdir(o,{withFileTypes:!0});}catch{return}for(let s of a){if(!s.isDirectory()||s.name==="node_modules"||s.name.startsWith("."))continue;let c=join(o,s.name);n.push(c),await r(c,i+1);}}return await r(e,1),n}async function un(e,t){if(t.length===0)return [];let n=t.filter(a=>!a.startsWith("!")).map(le),r=t.filter(a=>a.startsWith("!")).map(a=>le(a.slice(1))),o=await pn(e,ln),i=[];for(let a of o){let s=relative(e,a).split(sep).join("/");if(!n.some(u=>u.test(s))||r.some(u=>u.test(s)))continue;let c=await ue(join(a,"package.json"));if(!c||typeof c.name!="string")continue;let l=await ze(a);i.push({name:c.name,dir:s,scripts:c.scripts??{},dependencies:Je(c),hasViteConfig:l.present,...l.outDir?{viteOutDir:l.outDir}:{}});}return i.sort((a,s)=>a.dir.localeCompare(s.dir))}async function dn(e,t,n){if(n==="pnpm"){let r=await S(join(e,"pnpm-workspace.yaml"));if(r!==null)return Ue(r)}return Be(t)}async function Ke(e=process.cwd()){let t=await ue(join(e,"package.json"));if(!t)throw new Error("No package.json found in the current directory");let n=t.engines??{},r=await cn(e,t),o=await S(join(e,"Procfile")),i=await ze(e),a=await S(join(e,".replit")),s=await dn(e,t,r.packageManager);return {cwd:e,packageJson:t,scripts:t.scripts??{},dependencies:Je(t),nodeMajor:Re(n.node),...r,procfileWeb:o===null?void 0:_e(o),hasModelenceConfig:await z(join(e,"modelence.config.ts"))||await z(join(e,"modelence.config.js")),hasIndexHtml:await z(join(e,"index.html")),hasViteConfig:i.present,viteOutDir:i.outDir,...a===null?{}:{replit:{modules:We(a)}},workspace:{globs:s,members:await un(e,s)}}}var He={name:"lovable",matches:e=>"lovable-tagger"in e.dependencies,apply:(e,t)=>"@supabase/supabase-js"in e.dependencies?d(t,"Lovable project using Supabase: set VITE_SUPABASE_URL and VITE_SUPABASE_PUBLISHABLE_KEY in the environment variables (they are inlined at build time)."):t};var fn=["@workspace/mockup-sandbox"],gn="dist/public";function hn(e,t){return t?"/":`/${basename(e.dir)}`}function wn(e,t){if(!t.spec.web?.start||t.spec.web.static?.length)return t;let n=Te(e).filter(c=>!fn.includes(c.name));if(n.length===0)return t;let r=h(N(e)),o=n.map(c=>({path:hn(c,n.length===1),dir:`${c.dir}/${c.viteOutDir??gn}`})),i=n.map((c,l)=>`BASE_PATH=${o[l].path} ${r.runIn(c.name,"build")}`),a=[t.spec.build?.command,...i].filter(Boolean).join(" && "),s=y(w(t,{command:a}),{static:o});return s=d(s,`Replit artifacts: ${n.map(c=>c.name).join(", ")} `+(n.length===1?"is served at / in front of the API.":"are served at their folder names in front of the API; edit web.static in modelence.json to change the paths.")),s}function yn(e,t){let n=t;return e.replit?.modules.some(r=>r.startsWith("postgresql"))&&(n=d(n,"Replit provisioned a Postgres database; set DATABASE_URL in the environment variables to one this app can reach.")),Object.keys(Ge(e)).some(r=>r.startsWith("@clerk/"))&&(n=d(n,"Replit managed Clerk auth; set CLERK_PUBLISHABLE_KEY and CLERK_SECRET_KEY in the environment variables.")),n}var Ye={name:"replit",matches:e=>e.replit!==void 0,apply:(e,t)=>yn(e,wn(e,t))};var bn=[Ye,He];function vn(e){let n=$e(e,Oe,{spec:{},notes:[]}),r=bn.find(i=>i.matches(e))??null;return {...r?r.apply(e,n):n,profile:r?.name??null}}async function K(e=process.cwd()){return vn(await Ke(e))}var Xe=promisify(execFile),qe=200*1024*1024,Cn=[".git","node_modules",".modelence/build",".modelence/tmp",".modelence/cache"],An=[/^\.modelence(\.[^/]+)?\.env$/];function Ze(e){return e.split(sep).join("/")}function Qe(e){let t=Ze(e),n=t.split("/");for(let o of Cn)if(o.split("/").length===1){if(n.slice(0,-1).includes(o))return true}else if(t===o||t.startsWith(`${o}/`))return true;let r=n[n.length-1];return An.some(o=>o.test(r))}async function In(e){try{let{stdout:t}=await Xe("git",["rev-parse","--is-inside-work-tree"],{cwd:e});return t.trim()==="true"}catch{return false}}async function Mn(e){let{stdout:t}=await Xe("git",["ls-files","--cached","--others","--exclude-standard","-z"],{cwd:e,maxBuffer:67108864});return t.split("\0").filter(n=>n.length>0)}async function et(e,t=""){let n=await promises.readdir(join(e,t),{withFileTypes:true}),r=[];for(let o of n){let i=t?`${t}/${o.name}`:o.name;o.isDirectory()?Qe(`${i}/x`)||r.push(...await et(e,i)):o.isFile()&&r.push(i);}return r}async function jn(e=process.cwd()){let t=await In(e),n=t?await Mn(e):await et(e),r=[];for(let o of n)if(!Qe(o))try{(await promises.stat(join(e,o))).isFile()&&r.push(o);}catch{}return {files:r.sort(),usedGit:t}}async function tt(e,t){let{files:n,usedGit:r}=await jn(e);if(n.length===0)throw new Error("No files to upload");await promises.mkdir(join(t,".."),{recursive:true}),await promises.rm(t,{force:true});let o=createWriteStream(t),i=xn("zip",{zlib:{level:6}}),a=new Promise((c,l)=>{o.on("close",c),o.on("error",l),i.on("error",l);});i.pipe(o);for(let c of n)i.file(join(e,c),{name:Ze(relative("",c))});await i.finalize(),await a;let{size:s}=await promises.stat(t);if(s>qe)throw await promises.rm(t,{force:true}),new Error(`Source is ${(s/1024/1024).toFixed(0)} MB compressed; the limit is ${qe/1024/1024} MB. Add build output and large assets to .gitignore.`);return {fileCount:n.length,sizeBytes:s,usedGit:r}}var x=class extends Error{constructor(n,r){super(n);this.status=r;this.name="StudioApiError";}};async function O(e,t,{method:n="GET",token:r,body:o,query:i}={}){let a=new URL(t,e);for(let[l,u]of Object.entries(i??{}))a.searchParams.set(l,String(u));let s={};r&&(s.Authorization=`Bearer ${r}`),o!==void 0&&(s["Content-Type"]="application/json");let c=await fetch(a,{method:n,headers:s,body:o===void 0?void 0:JSON.stringify(o)});if(!c.ok){let l=await c.text(),u=l||c.statusText;try{let p=JSON.parse(l);u=p.error||p.message||u;}catch{}throw new x(u,c.status)}return await c.json()}var Tn="https://cloud.modelence.com",it=3e3,Rn=30*60*1e3,_n=10*60*1e3;async function st(e){let t=process.cwd(),n=await Jn(e.host,t),r=e.prebuilt?"bundle":"source",o=await I(t),i,a=join(t,".modelence","tmp",`${r}.zip`);if(r==="bundle")await P(),await B(),await Hn(a);else {i=await Fn(t,e);let{fileCount:p,sizeBytes:$,usedGit:ft}=await tt(t,a);console.log(`Packed ${p} files (${ct($)})`+(ft?" from git":"; not a git repository, so only default exclusions applied"));}let s=Vn(e,o),c=await Wn(n);if(!c||!s){let p=await C(n,{pick:s?void 0:"deploy",purpose:"deploy",appId:o.appId});c=p.token,await rt(n,p.token,p.expiresAt),p.target&&(s={environmentId:p.target.environmentId},await de(p.target));}if(!s)throw new Error("No deploy target selected. Run again and pick an environment in the browser, or pass --app and --env.");let l={host:n,token:c},u=async()=>{await G(n),console.log("Your saved login has expired; please sign in again.");let p=await C(n,{pick:s?void 0:"deploy",purpose:"deploy",appId:o.appId});await rt(n,p.token,p.expiresAt),p.target&&(s={environmentId:p.target.environmentId},await de(p.target)),l.token=p.token;};try{let p;try{p=await nt({session:l,target:s,kind:r,archivePath:a,layers:i,project:o});}catch($){if(!at($))throw $;await u(),p=await nt({session:l,target:s,kind:r,archivePath:a,layers:i,project:o});}p.buildId&&await Un(l,u,p.environmentId,p.buildId);}finally{await promises.rm(a,{force:true});}}async function Fn(e,t){let n=await Ae(e),r=await K(e),o=Gn(t),i=re(r.spec,n,o),a=[r.profile?`${r.profile} project`:null,n?f:null,Object.keys(o).length>0?"flags":null].filter(Boolean);console.log(`Build plan${a.length>0?` (${a.join(", ")})`:""}:`);for(let s of W(i))console.log(s);for(let s of r.notes)console.log(` note: ${s}`);return n||console.log(` tip: run \`modelence init\` to write this plan to ${f}.`),{file:n,overrides:o,detected:r.spec}}function at(e){return e instanceof x&&e.status===401}async function nt({session:e,target:t,kind:n,archivePath:r,layers:o,project:i}){let{host:a,token:s}=e,c=await O(a,"/api/upload-bundle",{method:"POST",token:s,body:{...t,kind:n}});await Ln(a,s,c.environmentId),console.log(`Uploading to ${c.appAlias}/${c.envAlias}...`);let l=await promises.readFile(r),u=await fetch(c.uploadUrl,{method:"PUT",body:new Uint8Array(l),headers:{"Content-Type":"application/zip"}});if(!u.ok)throw new Error(`Failed to upload: ${u.statusText}`);let p=await O(a,"/api/deploy",{method:"POST",token:s,body:{environmentId:c.environmentId,bundleName:c.bundleName,kind:n,spec:o?.file??void 0,overrides:o?.overrides,detected:o?.detected}});return (!i.deploy||i.deploy.environmentId!==p.environmentId)&&await de({environmentId:p.environmentId,appAlias:p.appAlias,envAlias:p.envAlias}),p.spec&&o&&Kn(p.spec,re(o.detected,o.file,o.overrides)),console.log(`Deployment started: ${p.deploymentUrl}`),{environmentId:p.environmentId,buildId:p.buildId}}async function Ln(e,t,n){let r=Date.now()+_n,o=false;for(;Date.now()<r;){let i;try{({status:i}=await O(e,"/api/environment/status",{token:t,query:{environmentId:n}}));}catch(a){if(a instanceof x&&a.status===404)return;throw a}if(i==="ready")return;if(i==="failed")throw new Error("The environment failed to provision; check it in the dashboard.");o||(console.log("Waiting for the environment to finish provisioning..."),o=true),await new Promise(a=>setTimeout(a,it));}throw new Error("Timed out waiting for the environment to be ready.")}async function Un(e,t,n,r){let o=Date.now()+Rn,i="",a="",s=0,c=false;for(;Date.now()<o;){let l;try{l=await O(e.host,"/api/deploy/status",{token:e.token,query:{environmentId:n,buildId:r,logOffset:s}});}catch(u){if(!at(u)||c)throw u;c=true,await t();continue}for(let u of l.logs)process.stdout.write(` \u2502 ${u.replace(/\n$/,"")}
16
+ `);if(s=Math.max(s,l.logCount),l.status!==i){i=l.status;let u=Bn(l);u&&u!==a&&(a=u,console.log(u));}if(l.status==="deploy-completed"){l.siteUrl&&console.log(`Live at ${l.siteUrl}`);return}if(l.status==="build-failed"||l.status==="deploy-failed"){for(let u of l.errors)console.error(` ${u}`);if(l.containerLogs&&l.containerLogs.length>0){console.error("Container output:");for(let u of l.containerLogs)console.error(` \u2502 ${u.replace(/\n$/,"")}`);}process.exitCode=1;return}await new Promise(u=>setTimeout(u,it));}console.error("Timed out waiting for the deployment; check the dashboard for its status."),process.exitCode=1;}function Bn(e){switch(e.status){case "build-pending":return "Building image...";case "deploy-pending":case "deploying":return "Image built. Deploying containers...";case "rolling-out":return "Rolling out new containers...";case "deploy-completed":return "Deployed successfully.";case "build-failed":return "Build failed.";case "deploy-failed":return "Deployment failed.";default:return null}}function Vn(e,t){if(e.app&&e.env)return {appAlias:e.app,envAlias:e.env};if(e.env&&t.deploy?.appAlias)return {appAlias:t.deploy.appAlias,envAlias:e.env};if(e.env&&t.appId)return {appId:t.appId,envAlias:e.env};if(e.app||e.env)throw new Error("Pass both --app and --env, or neither to pick the target in the browser.");return t.deploy?.environmentId?{environmentId:t.deploy.environmentId}:null}async function Wn(e){return process.env.MODELENCE_TOKEN?process.env.MODELENCE_TOKEN:await je(e)}async function rt(e,t,n){if(n)try{await Ne(e,t,n);}catch(r){console.warn("Could not save the login for next time:",r);}}async function de(e){let t={environmentId:e.environmentId,appAlias:e.appAlias,envAlias:e.envAlias};try{await R({deploy:t,..."appId"in e?{appId:e.appId}:{}});}catch(n){console.warn("Could not record the deploy target in .modelence/project.json:",n);}}async function Jn(e,t){if(e)return e.replace(/\/$/,"");if(process.env.MODELENCE_SERVICE_ENDPOINT)return process.env.MODELENCE_SERVICE_ENDPOINT.replace(/\/$/,"");try{let n=parse(await promises.readFile(join(t,".modelence.env"),"utf8"));if(n.MODELENCE_SERVICE_ENDPOINT)return n.MODELENCE_SERVICE_ENDPOINT.replace(/\/$/,"")}catch{}return Tn}function Gn(e){let t=oe({node:e.nodeVersion,root:e.rootDir,install:e.installCommand,command:e.buildCommand}),n=oe({start:e.startCommand,static:e.static===void 0?void 0:e.static.map(zn)});return {...e.runtime?{runtime:e.runtime}:{},...Object.keys(t).length>0?{build:t}:{},...Object.keys(n).length>0?{web:n}:{}}}function zn(e){let t=e.indexOf("=");return t===-1?{path:"/",dir:e}:{path:e.slice(0,t)||"/",dir:e.slice(t+1)}}function Kn(e,t){let n=[],r=(i,a,s)=>{s!==void 0&&(a??"")!==s&&n.push(`${i} "${a??""}" (here "${s}")`);};r("install",e.build.install,t.build?.install),r("build",e.build.command,t.build?.command),r("start",e.web.start,t.web?.start),t.runtime&&e.runtime!==t.runtime&&n.push(`runtime ${e.runtime} (here ${t.runtime})`);let o=JSON.stringify(e.web.static);t.web?.static&&o!==JSON.stringify(t.web.static)&&n.push("static directories"),n.length>0&&(console.log("Using the environment's Build & Deploy settings: "+n.join(", ")),console.log("Edit them in the dashboard to change this."));}function ct(e){return `${(e/1024/1024).toFixed(2)} MB`}async function Hn(e){await promises.rm(e,{force:true}),console.log("Creating deployment bundle..."),await promises.mkdir(join(e,".."),{recursive:true});let t=createWriteStream(e),n=xn("zip",{zlib:{level:9}}),r=new Promise((s,c)=>{t.on("close",s),t.on("error",c),n.on("error",c);});n.pipe(t);let o=["package.json","package-lock.json","next.config.js","next.config.ts","modelence.config.ts"],i=["public","server","scripts",join(".modelence","build"),".next"];for(let s of o)await ot(E(s))&&n.file(E(s),{name:s});for(let s of i)await ot(E(s))&&n.directory(E(s),s);await n.finalize(),await r;let a=await promises.stat(e);console.log(`Deployment bundle created (${ct(a.size)})`);}async function ot(e){try{return await promises.access(e),!0}catch{return false}}function lt(e={}){console.log("Starting Modelence dev server...");let t=k(),n=ne.resolve("./node_modules/.bin/tsx");execSync(`"${n}" watch --ignore "vite.config.ts.timestamp-*" "${t}"`,{stdio:"inherit",cwd:process.cwd(),env:{...process.env,NODE_ENV:"development",...e.takeover?{MODELENCE_TAKEOVER:"1"}:{}}});}function ut(){console.log("Starting Modelence production server...");let e=k(),t=ne.basename(e,ne.extname(e)),n=U(`${t}.mjs`);execSync(`node "${n}"`,{stdio:"inherit",cwd:process.cwd(),env:{...process.env,NODE_ENV:"production"}});}async function dt(e){await G(e.host),console.log(e.host?`Removed the saved login for ${e.host}.`:`Removed saved logins (${J()}).`);}var Qn="https://cloud.modelence.com";async function mt(e){let t=process.cwd(),n=V(t);if(!e.force&&await er(n))throw new Error(`${f} already exists; pass --force to overwrite it.`);let r=await K(t),i={$schema:`${(e.host??Qn).replace(/\/$/,"")}/schema/modelence.json`,...r.spec};await Ie(i,t),console.log(`Wrote ${f}`+(r.profile?` (${r.profile} project)`:""));for(let a of W(i))console.log(a);for(let a of r.notes)console.log(` note: ${a}`);console.log("Edit the file to change any of this, then run `modelence deploy`.");}async function er(e){try{return await promises.access(e),!0}catch{return false}}var sr=fileURLToPath(import.meta.url),ar=dirname(sr),cr=JSON.parse(readFileSync(join(ar,"../../package.json"),"utf-8")),g=new Command().name("modelence").description("Modelence CLI tool").version(cr.version);g.command("setup").description("Setup Modelence environment variables").option("-t, --token <token>","Modelence setup token (omit to authorize in the browser)").option("-h, --host <host>","Modelence host","https://cloud.modelence.com").action(async e=>{await ye(e);});g.command("build").description("Build the application").action(async()=>{await P(),await B();});g.command("deploy").description("Deploy the current directory to Modelence Cloud (any Node.js app; picks the target in the browser on first run)").option("-a, --app <app>","Application alias").option("-e, --env <env>","Environment alias").option("-h, --host <host>","Modelence host").option("--prebuilt","Build locally and upload the .modelence/build bundle (Modelence apps only)").option("--runtime <runtime>","node or modelence (default: from modelence.json or detected)").option("--node-version <version>","Node.js version for the container, e.g. 22").option("--root-dir <path>","Subdirectory containing the app (monorepos)").option("--install-command <command>","Install command for this deploy").option("--build-command <command>",'Build command for this deploy ("" to skip)').option("--start-command <command>","Start command for this deploy").option("--static <path=dir>","Serve a built directory at a URL path, e.g. /=client/dist (repeatable)",(e,t=[])=>[...t,e]).action(async e=>{try{await st(e);}catch(t){console.error(`Deploy failed: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}});g.command("init").description("Detect how this project builds and runs, and write it to modelence.json").option("--force","Overwrite an existing modelence.json").option("-h, --host <host>","Modelence host used for the schema URL").action(async e=>{try{await mt(e);}catch(t){console.error(`Init failed: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}});g.command("logout").description("Forget the saved Modelence Cloud login").option("-h, --host <host>","Only forget the login for this host").action(async e=>{await dt(e);});g.command("dev").description("Start development server").option("--takeover","Disconnect any instance currently holding the environment and connect this one").action(async e=>{await P(),lt(e);});g.command("start").description("Start production server").action(async()=>{await P(),ut();});g.parse(process.argv);//# sourceMappingURL=modelence.js.map
16
17
  //# sourceMappingURL=modelence.js.map