modelence 0.26.0-nd.dev.0 → 0.26.0-nd.dev.2

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 +1 @@
1
- {"version":3,"sources":["../../src/bin/auth.ts","../../src/bin/project.ts","../../src/bin/setup.ts","../../src/app/modelenceConfig.ts","../../src/bin/config.ts","../../src/bin/build.ts","../../src/bin/authCache.ts","../../src/bin/detect.ts","../../src/bin/source.ts","../../src/bin/studioApi.ts","../../src/bin/deploy.ts","../../src/bin/dev.ts","../../src/bin/start.ts","../../src/bin/logout.ts","../../src/bin/modelence.ts"],"names":["authenticateCli","host","pick","pickEnvironment","appId","response","code","verificationUrl","url","resolvedPick","open","waitForAuth","pollExpireTs","result","pollForToken","error","resolve","token","expiresAt","target","MODELENCE_DIR","PROJECT_FILE","getProjectFilePath","cwd","join","readProject","content","fs","parsed","updateProject","patch","existing","MODELENCE_ENV_FILE","fetchServiceConfig","auth","headers","errorText","ask","question","rl","createInterface","answer","confirmOverwrite","escapeEnvValue","value","readProjectAppId","recordProjectAppId","CLAUDE_DIR","CLAUDE_SETTINGS_FILE","CLAUDE_PLUGIN_ID","CLAUDE_MARKETPLACE_REPO","CLAUDE_MARKETPLACES","CLAUDE_PLUGIN_DOCS_URL","CLAUDE_PLUGIN_INSTALL_HINT","ensureClaudePluginEnabled","settingsPath","settings","runClaude","args","spawnSync","offerClaudePluginInstall","probe","marketplace","install","failed","backupEnvFile","envPath","backupPath","setup","options","existingEnv","fileExisted","envContent","parseEnv","cliToken","config","newEnv","key","configSchema","z","loadModelenceConfig","configPath","configModule","createJiti","env","getConfig","getServerPath","serverDir","serverEntry","getPostBuildCommand","getBuildPath","subPath","buildDir","getModelencePath","getProjectPath","modelenceDir","loadEnv","parseDotenv","buildClient","postBuildCommand","execSync","buildVite","buildViteSsr","userConfig","loadConfigFromFile","modelenceConfig","path","viteBuild","mergeConfig","buildServer","tsupBuild","build","AUTH_FILE","EXPIRY_MARGIN_MS","getAuthCachePath","home","os","readAuthFile","writeAuthFile","dirname","readCachedToken","hosts","cached","writeCachedToken","current","clearCachedToken","_removed","rest","MINIMUM_NODE_MAJOR","exists","readJson","parseNodeMajor","range","match","major","parseProcfileWebCommand","line","commandsFor","packageManager","hasLockfile","script","detectBuildPlan","notes","packageJson","scripts","engines","isModelence","hasNpmLockfile","commands","buildCommand","startCommand","nodeVersion","execFileAsync","promisify","execFile","MAX_SOURCE_BYTES","ALWAYS_EXCLUDED_DIRS","ALWAYS_EXCLUDED_FILES","toPosix","sep","isExcludedPath","relativePath","segments","dir","fileName","pattern","isGitRepository","stdout","listGitFiles","entry","walk","entries","files","listSourceFiles","usedGit","candidates","file","packSource","zipPath","output","createWriteStream","archive","archiver","done","reject","relative","size","StudioApiError","message","status","studioRequest","method","body","query","text","DEFAULT_HOST","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","PROVISION_TIMEOUT_MS","deploy","resolveHost","kind","overrides","planOverrides","project","detected","archivePath","createBundle","plan","printDetectedPlan","definedOnly","fileCount","sizeBytes","formatMb","resolveTargetFromOptions","resolveToken","rememberToken","rememberTarget","runDeploy","upload","waitForEnvironmentReady","fileBuffer","uploadResponse","followDeploy","environmentId","deadline","announced","buildId","lastStatus","logOffset","describeStatus","flag","note","bytes","bundlePath","archiveComplete","bundleFiles","bundleDirs","pathExists","stats","dev","serverPath","tsxPath","start","serverFilename","builtServerPath","logout","__filename","fileURLToPath","__dirname","readFileSync","program","Command"],"mappings":"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","file":"modelence.js","sourcesContent":["import open from 'open';\n\n/*\n Browser device authorization: the CLI mints a code, the user approves it in\n the browser, and the CLI polls until approval binds a token to the code.\n\n Two approval modes, chosen by `pick`:\n 'environment' — `modelence setup`: the page also asks which environment to\n connect the local project to. The choice is stamped on the\n token; /api/setup derives its target from there.\n 'deploy' — `modelence deploy`: the page asks where to deploy (an\n existing or newly created app / cloud environment) and the\n token route reports the pick back so the CLI can record it\n in .modelence/project.json.\n Without `pick` the page only authorizes the device.\n\n `appId` is the hint from .modelence/project.json used to preselect the app.\n*/\n\nexport type CliAuthPick = 'environment' | 'deploy';\n\nexport interface CliAuthTarget {\n appId: string;\n appAlias: string;\n environmentId: string;\n envAlias: string;\n}\n\nexport interface CliAuthResult {\n token: string;\n // Absent on older Studio versions (tokens then last one hour).\n expiresAt?: string;\n target?: CliAuthTarget;\n}\n\nexport async function authenticateCli(\n host: string,\n {\n pick,\n pickEnvironment = false,\n appId,\n }: { pick?: CliAuthPick; pickEnvironment?: boolean; appId?: string } = {}\n): Promise<CliAuthResult> {\n const response = await fetch(`${host}/api/cli/auth`, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new Error('Failed to create CLI authentication code');\n }\n\n const { code, verificationUrl } = await response.json();\n const url = new URL(verificationUrl);\n const resolvedPick = pick ?? (pickEnvironment ? 'environment' : undefined);\n if (resolvedPick) {\n url.searchParams.set('pick', resolvedPick);\n }\n if (appId) {\n url.searchParams.set('appId', appId);\n }\n\n console.log(`Please visit ${url} to authenticate`);\n console.log(`Code: ${code}`);\n\n try {\n await open(url.toString());\n } catch {\n // Headless/SSH/container — no browser to open. The URL and code above\n // are already printed, so authentication can proceed manually.\n console.log('Could not open a browser automatically. Please open the URL above manually.');\n }\n\n return await waitForAuth(host, code);\n}\n\nasync function waitForAuth(host: string, code: string): Promise<CliAuthResult> {\n const pollInterval = 5 * 1000; // 5 seconds\n const pollTimeout = 10 * 60 * 1000; // 10 minutes\n const pollExpireTs = Date.now() + pollTimeout;\n while (Date.now() < pollExpireTs) {\n try {\n const result = await pollForToken(host, code);\n if (result) {\n return result;\n }\n } catch (error) {\n console.error('Error polling for CLI token:', error);\n }\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error('Unable to authenticate CLI - timed out. Please try again.');\n}\n\nasync function pollForToken(host: string, code: string): Promise<CliAuthResult | null> {\n const response = await fetch(`${host}/api/cli/token?code=${code}`, {\n method: 'GET',\n });\n\n if (!response.ok) {\n throw new Error(`CLI token polling failed: ${response.statusText}`);\n }\n\n const { token, expiresAt, target } = await response.json();\n if (!token) {\n return null;\n }\n return { token, expiresAt, target };\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\n\nexport const MODELENCE_DIR = '.modelence';\nexport const PROJECT_FILE = 'project.json';\n\n/*\n .modelence/project.json — CLI-managed project state that is meant to be\n committed (unlike .modelence.env, which holds per-developer credentials).\n It records which app the project belongs to and, once a deploy target has\n been picked in the browser, which environment `modelence deploy` ships to.\n Everything in it is a hint, never a credential: access is re-checked on\n every request with the user's token.\n*/\n\nexport interface DeployTarget {\n environmentId: string;\n appAlias: string;\n envAlias: string;\n}\n\nexport interface ProjectFile {\n appId?: string;\n deploy?: DeployTarget;\n [key: string]: unknown;\n}\n\nexport function getProjectFilePath(cwd = process.cwd()): string {\n return join(cwd, MODELENCE_DIR, PROJECT_FILE);\n}\n\n// Missing or malformed reads as an empty project rather than failing the\n// command: the file only ever pre-fills choices.\nexport async function readProject(cwd = process.cwd()): Promise<ProjectFile> {\n try {\n const content = await fs.readFile(getProjectFilePath(cwd), 'utf8');\n const parsed = JSON.parse(content);\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nexport async function updateProject(\n patch: Partial<ProjectFile>,\n cwd = process.cwd()\n): Promise<void> {\n const existing = await readProject(cwd);\n await fs.mkdir(join(cwd, MODELENCE_DIR), { recursive: true });\n await fs.writeFile(\n getProjectFilePath(cwd),\n JSON.stringify({ ...existing, ...patch }, null, 2) + '\\n'\n );\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { parse as parseEnv } from 'dotenv';\nimport { createInterface } from 'readline';\nimport { spawnSync } from 'child_process';\nimport { authenticateCli } from './auth';\nimport { MODELENCE_DIR, PROJECT_FILE, readProject, updateProject } from './project';\n\nconst MODELENCE_ENV_FILE = '.modelence.env';\n\ninterface SetupResponse {\n environmentId: string;\n serviceEndpoint: string;\n serviceToken: string;\n containerId: string;\n // Absent on older Modelence Cloud versions.\n appId?: string;\n}\n\n/*\n Two ways to authenticate against /api/setup, matching the two ways setup is\n run: a setup token pasted from the dashboard, or a CLI token from the\n browser device flow. Either way the credential itself carries the\n environment choice — the server derives the target from it, so nothing\n else needs to be sent.\n*/\ntype SetupAuth = { setupToken: string } | { cliToken: string };\n\nasync function fetchServiceConfig(host: string, auth: SetupAuth): Promise<SetupResponse> {\n const headers: Record<string, string> =\n 'setupToken' in auth\n ? { 'X-Modelence-Setup-Token': auth.setupToken }\n : { Authorization: `Bearer ${auth.cliToken}` };\n\n const response = await fetch(`${host}/api/setup`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(errorText || `Request failed with status ${response.status}`);\n }\n\n return response.json();\n}\n\nasync function ask(question: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function confirmOverwrite(): Promise<boolean> {\n const answer = await ask(\n `Warning: ${MODELENCE_ENV_FILE} already exists. Do you want to overwrite it? (y/N) `\n );\n return answer.toLowerCase() === 'y';\n}\n\nfunction escapeEnvValue(value: string | number): string {\n // Convert to string and escape quotes\n return String(value).replace(/\"/g, '\\\\\"');\n}\n\n/*\n The app this project was last connected to, if a previous setup (by anyone\n on the team — the file is committed) recorded it. Used only to preselect\n the app on the approval page; anything unreadable means \"no hint\".\n*/\nasync function readProjectAppId(): Promise<string | undefined> {\n const { appId } = await readProject();\n return typeof appId === 'string' && appId ? appId : undefined;\n}\n\n/*\n Records which app this project belongs to in .modelence/project.json. Unlike\n .modelence.env this file is meant to be committed (the .modelence/ root holds\n CLI-managed project state; only designated subdirs like build/, cache/ and\n tmp/ are temporary), so the whole team gets it. It's a hint in the git-remote\n sense — connect flows use it to preselect the app, never to block a different\n choice — which is why failing to write it doesn't fail the setup.\n\n Only the app goes here: which ENVIRONMENT a working copy connects to is\n per-developer state, already recorded by .modelence.env, and committing it\n would make teammates connected to different environments fight over the\n value. (The deploy target recorded by `modelence deploy` is different: it is\n shared on purpose, like a git remote.)\n*/\nasync function recordProjectAppId(appId: string): Promise<void> {\n await updateProject({ appId });\n}\n\nconst CLAUDE_DIR = '.claude';\nconst CLAUDE_SETTINGS_FILE = join(CLAUDE_DIR, 'settings.json');\nconst CLAUDE_PLUGIN_ID = 'modelence@modelence';\n// Without the marketplace declared alongside enabledPlugins, Claude Code\n// can't resolve the plugin unless the user already ran\n// `claude plugin marketplace add` themselves.\nconst CLAUDE_MARKETPLACE_REPO = 'modelence/modelence';\nconst CLAUDE_MARKETPLACES = {\n modelence: { source: { source: 'github', repo: CLAUDE_MARKETPLACE_REPO } },\n};\nconst CLAUDE_PLUGIN_DOCS_URL = 'https://docs.modelence.com/ai-coding-agents';\nconst CLAUDE_PLUGIN_INSTALL_HINT =\n 'Install the Modelence plugin for Claude Code by hand:\\n' +\n ` claude plugin marketplace add ${CLAUDE_MARKETPLACE_REPO}\\n` +\n ` claude plugin install ${CLAUDE_PLUGIN_ID} --scope project\\n` +\n `Guide: ${CLAUDE_PLUGIN_DOCS_URL}`;\n\n/*\n Declares the Modelence Claude Code plugin in the project's settings.json,\n merging into an existing file rather than replacing it. An explicit\n `false` is a deliberate opt-out and is never flipped back on. The file is\n inert for people who don't use Claude Code, and failing to write it doesn't\n fail the setup.\n*/\nasync function ensureClaudePluginEnabled(): Promise<void> {\n const settingsPath = join(process.cwd(), CLAUDE_SETTINGS_FILE);\n\n let content: string | undefined;\n try {\n content = await fs.readFile(settingsPath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`Could not read ${CLAUDE_SETTINGS_FILE}; leaving it unchanged.`);\n return;\n }\n }\n\n let settings: Record<string, any> = {};\n if (content !== undefined) {\n try {\n settings = JSON.parse(content);\n } catch {\n console.warn(`Could not parse ${CLAUDE_SETTINGS_FILE}; leaving it unchanged.`);\n return;\n }\n }\n\n // The marketplace is only a pointer, so it's always (re)declared — a file\n // with just enabledPlugins, as `claude plugin install --scope project`\n // leaves behind, can't be resolved by teammates without it. An explicit\n // `false` in enabledPlugins is the user's opt-out and is left alone.\n settings.extraKnownMarketplaces = { ...settings.extraKnownMarketplaces, ...CLAUDE_MARKETPLACES };\n if (settings.enabledPlugins?.[CLAUDE_PLUGIN_ID] === undefined) {\n settings.enabledPlugins = { ...settings.enabledPlugins, [CLAUDE_PLUGIN_ID]: true };\n }\n\n try {\n await fs.mkdir(join(process.cwd(), CLAUDE_DIR), { recursive: true });\n await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\\n');\n console.log(`Declared the Modelence Claude Code plugin in ${CLAUDE_SETTINGS_FILE}`);\n } catch (error) {\n console.warn(`Failed to write ${CLAUDE_SETTINGS_FILE}:`, error);\n }\n}\n\nfunction runClaude(args: string[]) {\n return spawnSync('claude', args, { encoding: 'utf8', shell: process.platform === 'win32' });\n}\n\n/*\n Installs the plugin through the Claude Code CLI — the one install path that\n behaves the same for the terminal, the IDE extensions and the desktop app,\n which all read the same plugin state. Touches the user's machine-wide Claude\n config, so it asks first, and it never fails the setup: without the CLI on\n PATH it prints the commands to run by hand.\n*/\nasync function offerClaudePluginInstall(): Promise<void> {\n const probe = runClaude(['--version']);\n if (probe.error || probe.status !== 0) {\n console.log(CLAUDE_PLUGIN_INSTALL_HINT);\n return;\n }\n\n const answer = (await ask('Install the Modelence plugin for Claude Code? (Y/n) ')).toLowerCase();\n if (answer && answer !== 'y' && answer !== 'yes') {\n return;\n }\n\n // Makes the install work before Claude Code has picked up the marketplace\n // declared in .claude/settings.json. Its result only matters if the install\n // then fails: a network or auth error here is the real cause, and the\n // install's own message wouldn't point at it.\n const marketplace = runClaude(['plugin', 'marketplace', 'add', CLAUDE_MARKETPLACE_REPO]);\n const install = runClaude(['plugin', 'install', CLAUDE_PLUGIN_ID, '--scope', 'project']);\n if (install.status === 0) {\n console.log(\n 'Installed the Modelence plugin for Claude Code. Sign in once from Claude Code: ' +\n 'run /mcp, choose modelence, then Authenticate.'\n );\n } else {\n const failed = marketplace.status !== 0 ? marketplace : install;\n console.warn(\n `Could not install the Modelence plugin: ${(failed.stderr || failed.stdout || '').trim()}`\n );\n console.warn(CLAUDE_PLUGIN_INSTALL_HINT);\n }\n}\n\nasync function backupEnvFile(envPath: string): Promise<void> {\n try {\n const backupPath = envPath.replace('.env', '.backup.env');\n await fs.copyFile(envPath, backupPath);\n console.log(`Backup created at ${backupPath}`);\n } catch (error) {\n console.warn('Failed to create backup file:', error);\n }\n}\n\nexport async function setup(options: { token?: string; host: string }) {\n try {\n const envPath = join(process.cwd(), MODELENCE_ENV_FILE);\n let existingEnv = {};\n let fileExisted = false;\n\n try {\n // Check if .modelence.env exists\n const envContent = await fs.readFile(envPath, 'utf8');\n existingEnv = parseEnv(envContent);\n fileExisted = true;\n\n // Create backup before overwriting\n await backupEnvFile(envPath);\n\n // Ask for confirmation before overwriting\n const shouldContinue = await confirmOverwrite();\n if (!shouldContinue) {\n console.log('Setup canceled');\n process.exit(0);\n }\n } catch {\n // File doesn't exist, we'll create it\n }\n\n let auth: SetupAuth;\n if (options.token) {\n auth = { setupToken: options.token };\n } else {\n // No token given: authorize in the browser, where the approval page\n // also asks which environment to connect to.\n const { token: cliToken } = await authenticateCli(options.host, {\n pickEnvironment: true,\n appId: await readProjectAppId(),\n });\n auth = { cliToken };\n }\n\n // Fetch service configuration\n console.log('Fetching service configuration...');\n const config = await fetchServiceConfig(options.host, auth);\n\n // Update environment variables\n const newEnv = {\n ...existingEnv,\n MODELENCE_TELEMETRY_ENABLED: 'false', // TODO: Remove after all usages are gone\n MODELENCE_ENVIRONMENT_ID: config.environmentId,\n MODELENCE_SERVICE_ENDPOINT: options.host, // TODO: Replace with config.serviceEndpoint in the future\n MODELENCE_SERVICE_TOKEN: config.serviceToken,\n MODELENCE_CONTAINER_ID: config.containerId,\n // Where this working copy runs; Studio sandboxes pre-set \"sandbox\".\n MODELENCE_RUNTIME: process.env.MODELENCE_RUNTIME || 'local',\n };\n\n // Convert to .env format with escaped values\n const envContent = Object.entries(newEnv)\n .map(([key, value]) => `${key}=\"${escapeEnvValue(value)}\"`)\n .join('\\n');\n\n // Write the file\n await fs.writeFile(envPath, envContent.trim() + '\\n');\n console.log(`Successfully configured ${MODELENCE_ENV_FILE} file`);\n\n if (config.appId) {\n try {\n await recordProjectAppId(config.appId);\n console.log(`Recorded the app ID in ${MODELENCE_DIR}/${PROJECT_FILE}`);\n } catch (error) {\n console.warn(`Failed to record the app ID in ${MODELENCE_DIR}/${PROJECT_FILE}:`, error);\n }\n }\n\n await ensureClaudePluginEnabled();\n // Interactive runs only: with --token (CI) or without a terminal there is\n // nobody to ask, and no Claude Code to set up.\n if (!options.token && process.stdin.isTTY) {\n await offerClaudePluginInstall();\n }\n\n if (fileExisted) {\n // The dev server reads the file at boot, and an open agent session may\n // still hold the old environment id in its context.\n console.log(\n 'The project now points to a different environment. Restart your dev server, and if you use ' +\n 'an AI coding agent, start a new session.'\n );\n }\n\n // Only for a first-time setup: re-running it on an existing file already\n // told them to restart the dev server they're running.\n if (!fileExisted && newEnv.MODELENCE_RUNTIME === 'local') {\n console.log('\\nNext step — run the app on this machine:\\n');\n console.log(\" npm install (if you haven't already)\");\n console.log(' npm run dev (starts the app)\\n');\n }\n } catch (error: unknown) {\n console.error(`Setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n process.exit(1);\n }\n}\n","import { join } from 'path';\nimport { createJiti } from 'jiti';\nimport { z } from 'zod';\nimport type { ModelenceConfig } from '../types';\n\nconst configSchema = z.object({\n serverDir: z.string(),\n serverEntry: z.string(),\n postBuildCommand: z.string().optional(),\n});\n\nexport async function loadModelenceConfig(): Promise<ModelenceConfig> {\n const configPath = join(process.cwd(), 'modelence.config.ts');\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n requireCache: false,\n });\n\n const configModule = await jiti.import(configPath);\n if (typeof configModule !== 'object') {\n throw new Error('modelence.config.ts should export an object');\n }\n\n return configSchema.parse(configModule);\n}\n","import { parse as parseDotenv } from 'dotenv';\nimport { join } from 'path';\nimport fs from 'fs/promises';\nimport type { ModelenceConfig } from '../types';\nimport { loadModelenceConfig } from '../app/modelenceConfig';\n\nlet env: Record<string, string> | null = null;\nlet config: ModelenceConfig | null = null;\n\nexport function getEnv() {\n if (!env) {\n throw new Error('Environment variables not loaded');\n }\n\n return env;\n}\n\nexport function getConfig() {\n if (!config) {\n throw new Error('Configuration not loaded');\n }\n\n return config;\n}\n\nexport function getStudioUrl(path: string) {\n const studioBaseUrl = getEnv().MODELENCE_SERVICE_ENDPOINT || 'https://cloud.modelence.com';\n return `${studioBaseUrl}${path}`;\n}\n\nexport function getServerPath() {\n const { serverDir, serverEntry } = getConfig();\n const path = join(serverDir, serverEntry);\n // Normalize path to use forward slashes for cross-platform compatibility\n return path.replace(/\\\\/g, '/');\n}\n\nexport function getPostBuildCommand() {\n return getConfig().postBuildCommand;\n}\n\nexport function getBuildPath(subPath?: string) {\n const buildDir = getModelencePath('build');\n if (subPath) {\n const path = join(buildDir, subPath);\n return path.replace(/\\\\/g, '/');\n }\n return buildDir.replace(/\\\\/g, '/');\n}\n\nexport function getProjectPath(subPath: string) {\n const path = join(process.cwd(), subPath);\n return path.replace(/\\\\/g, '/');\n}\n\nexport function getModelencePath(subPath?: string) {\n const modelenceDir = getProjectPath('.modelence');\n if (subPath) {\n const path = join(modelenceDir, subPath);\n return path.replace(/\\\\/g, '/');\n }\n return modelenceDir.replace(/\\\\/g, '/');\n}\n\nexport async function loadEnv() {\n try {\n config = await loadModelenceConfig();\n } catch (error) {\n console.error(error);\n throw new Error('Unable to load modelence.config.ts');\n }\n\n try {\n const envContent = await fs.readFile(join(process.cwd(), '.modelence.env'), 'utf-8');\n env = parseDotenv(envContent);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // .modelence.env is optional, may not exist in case of an offline setup\n // Initialize with empty object to prevent \"Environment variables not loaded\" error\n env = {};\n } else {\n throw error;\n }\n }\n}\n","import fs from 'fs/promises';\nimport { getBuildPath, getModelencePath, getPostBuildCommand, getServerPath } from './config';\nimport { build as tsupBuild } from 'tsup';\nimport { build as viteBuild, mergeConfig, loadConfigFromFile } from 'vite';\nimport path from 'path';\nimport { execSync } from 'child_process';\n\nasync function buildClient() {\n const postBuildCommand = getPostBuildCommand();\n if (postBuildCommand) {\n console.log('Running post-build command...');\n execSync(postBuildCommand);\n return;\n }\n\n // Always emit SSR artifacts; `startApp({ ssr: true })` decides if they're used.\n await buildVite();\n await buildViteSsr();\n}\n\nasync function buildVite() {\n console.log('Building client with Vite...');\n\n const userConfig = await loadConfigFromFile({\n command: 'build',\n mode: process.env.NODE_ENV || 'production',\n });\n\n const modelenceConfig = {\n build: {\n outDir: path.resolve(process.cwd(), '.modelence/build/client').replace(/\\\\/g, '/'),\n emptyOutDir: true,\n // Emit `.vite/ssr-manifest.json` for ssr/collectCss.ts.\n ssrManifest: true,\n },\n };\n\n await viteBuild(mergeConfig(userConfig?.config || {}, modelenceConfig, true));\n}\n\nasync function buildViteSsr() {\n console.log('Building SSR bundle with Vite...');\n\n const userConfig = await loadConfigFromFile({\n command: 'build',\n mode: process.env.NODE_ENV || 'production',\n });\n\n const ssrEntry = path.resolve(process.cwd(), 'src/client/index.tsx').replace(/\\\\/g, '/');\n const modelenceConfig = {\n build: {\n ssr: ssrEntry,\n outDir: path.resolve(process.cwd(), '.modelence/build/ssr').replace(/\\\\/g, '/'),\n emptyOutDir: true,\n rollupOptions: {\n output: {\n format: 'esm' as const,\n entryFileNames: 'index.mjs',\n },\n },\n },\n };\n\n await viteBuild(mergeConfig(userConfig?.config || {}, modelenceConfig, true));\n}\n\nasync function buildServer() {\n console.log('Building server with tsup...');\n return new Promise((resolve) => {\n void tsupBuild({\n entry: [getServerPath()],\n format: 'esm',\n sourcemap: true,\n minify: process.env.NODE_ENV === 'production',\n outDir: '.modelence/build',\n clean: true,\n watch: false,\n bundle: true,\n skipNodeModulesBundle: true,\n treeshake: true,\n platform: 'node',\n outExtension: () => ({\n js: '.mjs',\n }),\n onSuccess: async () => {\n resolve(undefined);\n },\n });\n });\n}\n\nexport async function build() {\n console.log('Building Modelence project...');\n\n try {\n const buildDir = getBuildPath();\n await fs.rm(buildDir, { recursive: true, force: true });\n\n await buildServer();\n await buildClient();\n\n console.log('Build completed successfully!');\n } catch (error) {\n console.error(error);\n throw new Error('Build failed');\n }\n\n try {\n await fs.access(getModelencePath());\n } catch {\n throw new Error(\n 'Could not find the .modelence directory. Looks like something went wrong during the build.'\n );\n }\n}\n","import { promises as fs } from 'fs';\nimport os from 'os';\nimport { dirname, join } from 'path';\n\n/*\n Cached deploy authorization, per Studio host, in the user's home directory\n (never in the project). Written only after a browser approval, dropped by\n `modelence logout` or when Studio rejects it. MODELENCE_HOME overrides the\n location (tests, sandboxes).\n*/\n\nconst AUTH_FILE = 'auth.json';\n// A token about to expire is treated as expired so a deploy doesn't fail\n// halfway through its polling.\nconst EXPIRY_MARGIN_MS = 60 * 1000;\n\ninterface CachedToken {\n token: string;\n expiresAt: string;\n}\n\ninterface AuthFile {\n hosts?: Record<string, CachedToken>;\n}\n\nexport function getAuthCachePath(): string {\n const home = process.env.MODELENCE_HOME || join(os.homedir(), '.modelence');\n return join(home, AUTH_FILE);\n}\n\nasync function readAuthFile(): Promise<AuthFile> {\n try {\n const parsed = JSON.parse(await fs.readFile(getAuthCachePath(), 'utf8'));\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nasync function writeAuthFile(content: AuthFile): Promise<void> {\n const path = getAuthCachePath();\n await fs.mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await fs.writeFile(path, JSON.stringify(content, null, 2) + '\\n', { mode: 0o600 });\n}\n\nexport async function readCachedToken(host: string): Promise<string | null> {\n const { hosts = {} } = await readAuthFile();\n const cached = hosts[host];\n if (!cached?.token || !cached.expiresAt) {\n return null;\n }\n if (new Date(cached.expiresAt).getTime() - EXPIRY_MARGIN_MS <= Date.now()) {\n return null;\n }\n return cached.token;\n}\n\nexport async function writeCachedToken(\n host: string,\n token: string,\n expiresAt: string\n): Promise<void> {\n const current = await readAuthFile();\n await writeAuthFile({\n ...current,\n hosts: { ...current.hosts, [host]: { token, expiresAt } },\n });\n}\n\nexport async function clearCachedToken(host?: string): Promise<void> {\n if (!host) {\n await writeAuthFile({});\n return;\n }\n const current = await readAuthFile();\n const { [host]: _removed, ...rest } = current.hosts ?? {};\n await writeAuthFile({ ...current, hosts: rest });\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\n\n/*\n Infers the build contract from the project the way Heroku's Node buildpack\n does: the lockfile picks the package manager, package.json scripts pick the\n build and start commands, a Procfile `web:` line wins for start, and\n engines.node pins the Node.js major. Studio uses these as defaults for\n whatever the environment's settings leave blank.\n*/\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn';\n\nexport interface DetectedBuildPlan {\n preset: 'modelence' | 'node';\n packageManager: PackageManager;\n nodeVersion?: string;\n installCommand: string;\n // Undefined when nothing was found, so the server's defaults apply.\n buildCommand?: string;\n startCommand?: string;\n // Human-readable notes about what was (not) found.\n notes: string[];\n}\n\nconst MINIMUM_NODE_MAJOR = 18;\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJson(path: string): Promise<Record<string, unknown> | null> {\n try {\n const parsed = JSON.parse(await fs.readFile(path, 'utf8'));\n return parsed && typeof parsed === 'object' ? parsed : null;\n } catch {\n return null;\n }\n}\n\n// The first version number in a semver range, e.g. \">=20.10 <23\" → \"20\",\n// \"22.x\" → \"22\". Anything below the supported floor is ignored.\nexport function parseNodeMajor(range: unknown): string | undefined {\n if (typeof range !== 'string') {\n return undefined;\n }\n const match = range.match(/(\\d+)(?:\\.\\d+)?(?:\\.\\d+)?/);\n if (!match) {\n return undefined;\n }\n const major = Number(match[1]);\n return major >= MINIMUM_NODE_MAJOR ? String(major) : undefined;\n}\n\nexport function parseProcfileWebCommand(content: string): string | undefined {\n for (const line of content.split(/\\r?\\n/)) {\n const match = line.match(/^\\s*web\\s*:\\s*(.+?)\\s*$/);\n if (match) {\n return match[1];\n }\n }\n return undefined;\n}\n\nfunction commandsFor(packageManager: PackageManager, hasLockfile: boolean) {\n switch (packageManager) {\n case 'pnpm':\n return {\n install: 'npm install -g pnpm && pnpm install --frozen-lockfile',\n run: (script: string) => `pnpm run ${script}`,\n start: 'pnpm start',\n };\n case 'yarn':\n return {\n install: 'yarn install --frozen-lockfile',\n run: (script: string) => `yarn ${script}`,\n start: 'yarn start',\n };\n default:\n return {\n install: hasLockfile ? 'npm ci' : 'npm install',\n run: (script: string) => `npm run ${script}`,\n start: 'npm start',\n };\n }\n}\n\nexport async function detectBuildPlan(cwd = process.cwd()): Promise<DetectedBuildPlan> {\n const notes: string[] = [];\n\n const packageJson = await readJson(join(cwd, 'package.json'));\n if (!packageJson) {\n throw new Error('No package.json found in the current directory');\n }\n const scripts = (packageJson.scripts ?? {}) as Record<string, string>;\n const engines = (packageJson.engines ?? {}) as Record<string, unknown>;\n\n const isModelence =\n (await exists(join(cwd, 'modelence.config.ts'))) ||\n (await exists(join(cwd, 'modelence.config.js')));\n\n let packageManager: PackageManager = 'npm';\n if (await exists(join(cwd, 'pnpm-lock.yaml'))) {\n packageManager = 'pnpm';\n } else if (await exists(join(cwd, 'yarn.lock'))) {\n packageManager = 'yarn';\n }\n const hasNpmLockfile = await exists(join(cwd, 'package-lock.json'));\n if (packageManager === 'npm' && !hasNpmLockfile) {\n notes.push('No package-lock.json found; dependencies are installed with `npm install`.');\n }\n\n const commands = commandsFor(packageManager, hasNpmLockfile);\n\n let buildCommand: string | undefined;\n if (scripts.build) {\n buildCommand = commands.run('build');\n } else if (!isModelence) {\n notes.push('No `build` script found; the deploy skips the build step.');\n }\n\n let startCommand: string | undefined;\n try {\n startCommand = parseProcfileWebCommand(await fs.readFile(join(cwd, 'Procfile'), 'utf8'));\n } catch {\n // No Procfile — fall through to package.json.\n }\n if (!startCommand && scripts.start) {\n startCommand = commands.start;\n }\n if (!startCommand) {\n notes.push(\n 'No `start` script or Procfile found; the container runs `npm start`. Pass --start-command to override.'\n );\n }\n\n const nodeVersion = parseNodeMajor(engines.node);\n\n return {\n preset: isModelence ? 'modelence' : 'node',\n packageManager,\n nodeVersion,\n installCommand: commands.install,\n buildCommand,\n startCommand,\n notes,\n };\n}\n","import { createWriteStream, promises as fs } from 'fs';\nimport { join, relative, sep } from 'path';\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport archiver from 'archiver';\n\nconst execFileAsync = promisify(execFile);\n\n/*\n Packs the project's source tree for a remote build. Inside a git repository\n the file list is git's own (tracked + untracked, minus ignored), so the\n upload matches what a push would carry. Outside git a plain walk is used\n with a fixed exclusion list.\n\n Credentials and build output are never uploaded regardless.\n*/\n\nexport const MAX_SOURCE_BYTES = 200 * 1024 * 1024;\n\nconst ALWAYS_EXCLUDED_DIRS = [\n '.git',\n 'node_modules',\n '.modelence/build',\n '.modelence/tmp',\n '.modelence/cache',\n];\nconst ALWAYS_EXCLUDED_FILES = [/^\\.modelence(\\.[^/]+)?\\.env$/];\n\nfunction toPosix(path: string): string {\n return path.split(sep).join('/');\n}\n\nexport function isExcludedPath(relativePath: string): boolean {\n const path = toPosix(relativePath);\n const segments = path.split('/');\n for (const dir of ALWAYS_EXCLUDED_DIRS) {\n const dirSegments = dir.split('/');\n // Excluded at any depth for single names (node_modules), at the root for\n // nested ones (.modelence/build).\n if (dirSegments.length === 1) {\n if (segments.slice(0, -1).includes(dir)) {\n return true;\n }\n } else if (path === dir || path.startsWith(`${dir}/`)) {\n return true;\n }\n }\n const fileName = segments[segments.length - 1];\n return ALWAYS_EXCLUDED_FILES.some((pattern) => pattern.test(fileName));\n}\n\nasync function isGitRepository(cwd: string): Promise<boolean> {\n try {\n const { stdout } = await execFileAsync('git', ['rev-parse', '--is-inside-work-tree'], { cwd });\n return stdout.trim() === 'true';\n } catch {\n return false;\n }\n}\n\nasync function listGitFiles(cwd: string): Promise<string[]> {\n const { stdout } = await execFileAsync(\n 'git',\n ['ls-files', '--cached', '--others', '--exclude-standard', '-z'],\n { cwd, maxBuffer: 64 * 1024 * 1024 }\n );\n return stdout.split('\\0').filter((entry) => entry.length > 0);\n}\n\nasync function walk(cwd: string, dir = ''): Promise<string[]> {\n const entries = await fs.readdir(join(cwd, dir), { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const path = dir ? `${dir}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n if (!isExcludedPath(`${path}/x`)) {\n files.push(...(await walk(cwd, path)));\n }\n } else if (entry.isFile()) {\n files.push(path);\n }\n }\n return files;\n}\n\nexport async function listSourceFiles(\n cwd = process.cwd()\n): Promise<{ files: string[]; usedGit: boolean }> {\n const usedGit = await isGitRepository(cwd);\n const candidates = usedGit ? await listGitFiles(cwd) : await walk(cwd);\n\n const files: string[] = [];\n for (const file of candidates) {\n if (isExcludedPath(file)) {\n continue;\n }\n // git ls-files still lists tracked files deleted from the working tree.\n try {\n const stat = await fs.stat(join(cwd, file));\n if (stat.isFile()) {\n files.push(file);\n }\n } catch {\n // Gone from disk — nothing to upload.\n }\n }\n return { files: files.sort(), usedGit };\n}\n\nexport async function packSource(\n cwd: string,\n zipPath: string\n): Promise<{ fileCount: number; sizeBytes: number; usedGit: boolean }> {\n const { files, usedGit } = await listSourceFiles(cwd);\n if (files.length === 0) {\n throw new Error('No files to upload');\n }\n\n await fs.mkdir(join(zipPath, '..'), { recursive: true });\n await fs.rm(zipPath, { force: true });\n\n const output = createWriteStream(zipPath);\n const archive = archiver('zip', { zlib: { level: 6 } });\n const done = new Promise<void>((resolve, reject) => {\n output.on('close', resolve);\n output.on('error', reject);\n archive.on('error', reject);\n });\n archive.pipe(output);\n for (const file of files) {\n archive.file(join(cwd, file), { name: toPosix(relative('', file)) });\n }\n await archive.finalize();\n await done;\n\n const { size } = await fs.stat(zipPath);\n if (size > MAX_SOURCE_BYTES) {\n await fs.rm(zipPath, { force: true });\n throw new Error(\n `Source is ${(size / 1024 / 1024).toFixed(0)} MB compressed; the limit is ${MAX_SOURCE_BYTES / 1024 / 1024} MB. ` +\n 'Add build output and large assets to .gitignore.'\n );\n }\n\n return { fileCount: files.length, sizeBytes: size, usedGit };\n}\n","/*\n Thin JSON client for Studio's CLI routes. Errors carry the HTTP status so\n callers can tell an expired token (401) from everything else.\n*/\n\nexport class StudioApiError extends Error {\n constructor(\n message: string,\n public readonly status: number\n ) {\n super(message);\n this.name = 'StudioApiError';\n }\n}\n\nexport async function studioRequest<T>(\n host: string,\n path: string,\n {\n method = 'GET',\n token,\n body,\n query,\n }: {\n method?: 'GET' | 'POST';\n token?: string;\n body?: unknown;\n query?: Record<string, string | number>;\n } = {}\n): Promise<T> {\n const url = new URL(path, host);\n for (const [key, value] of Object.entries(query ?? {})) {\n url.searchParams.set(key, String(value));\n }\n\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let message = text || response.statusText;\n try {\n const parsed = JSON.parse(text);\n message = parsed.error || parsed.message || message;\n } catch {\n // Plain-text error body.\n }\n throw new StudioApiError(message, response.status);\n }\n\n return (await response.json()) as T;\n}\n","import { createWriteStream, promises as fs } from 'fs';\nimport { join } from 'path';\nimport { parse as parseDotenv } from 'dotenv';\nimport archiver from 'archiver';\nimport { authenticateCli, type CliAuthTarget } from './auth';\nimport { clearCachedToken, readCachedToken, writeCachedToken } from './authCache';\nimport { detectBuildPlan } from './detect';\nimport { loadEnv, getProjectPath } from './config';\nimport { readProject, updateProject, type DeployTarget } from './project';\nimport { packSource } from './source';\nimport { StudioApiError, studioRequest } from './studioApi';\nimport { build } from './build';\n\n/*\n `modelence deploy`: ship the current directory to a Modelence Cloud\n environment.\n\n Default path — any Node.js app: the source tree is uploaded and built\n remotely (install → build → start commands detected here, overridable with\n flags, stored on the environment). `--prebuilt` keeps the historical\n Modelence path: build locally, upload .modelence/build.\n\n Target: -a/-e flags → --env with the app recorded in project.json → the\n deploy target recorded in project.json → the browser picker. Auth: the\n MODELENCE_TOKEN variable → the cached token → the browser.\n*/\n\nconst DEFAULT_HOST = 'https://cloud.modelence.com';\nconst POLL_INTERVAL_MS = 3000;\nconst POLL_TIMEOUT_MS = 30 * 60 * 1000;\nconst PROVISION_TIMEOUT_MS = 10 * 60 * 1000;\n\nexport interface DeployOptions {\n app?: string;\n env?: string;\n host?: string;\n prebuilt?: boolean;\n preset?: string;\n nodeVersion?: string;\n rootDir?: string;\n installCommand?: string;\n buildCommand?: string;\n startCommand?: string;\n}\n\ntype CliTarget =\n | { environmentId: string }\n | { appAlias: string; envAlias: string }\n | { appId: string; envAlias: string };\n\ntype UploadKind = 'bundle' | 'source';\n\ninterface BuildPlanInput {\n preset?: string;\n nodeVersion?: string;\n rootDirectory?: string;\n installCommand?: string;\n buildCommand?: string;\n startCommand?: string;\n}\n\ninterface DeployStatus {\n status: string;\n errors: string[];\n rolloutProgress: { updatedCount: number; totalCount: number } | null;\n logs: string[];\n logCount: number;\n siteUrl: string | null;\n}\n\nexport async function deploy(options: DeployOptions) {\n const cwd = process.cwd();\n const host = await resolveHost(options.host, cwd);\n const kind: UploadKind = options.prebuilt ? 'bundle' : 'source';\n const overrides = planOverrides(options);\n const project = await readProject(cwd);\n\n // Local work first, so nothing is uploaded when it fails.\n let detected: BuildPlanInput | undefined;\n const archivePath = join(cwd, '.modelence', 'tmp', `${kind}.zip`);\n if (kind === 'bundle') {\n await loadEnv();\n await build();\n await createBundle(archivePath);\n } else {\n const plan = await detectBuildPlan(cwd);\n detected = {\n preset: plan.preset,\n nodeVersion: plan.nodeVersion,\n installCommand: plan.installCommand,\n buildCommand: plan.buildCommand,\n startCommand: plan.startCommand,\n };\n printDetectedPlan({ ...detected, ...definedOnly(overrides) }, plan.notes);\n const { fileCount, sizeBytes, usedGit } = await packSource(cwd, archivePath);\n console.log(\n `Packed ${fileCount} files (${formatMb(sizeBytes)})` +\n (usedGit ? ' from git' : '; not a git repository, so only default exclusions applied')\n );\n }\n\n let target = resolveTargetFromOptions(options, project);\n let token = await resolveToken(host);\n if (!token || !target) {\n // The browser flow hands back both a token and, when picked there, the\n // target — one visit covers a fresh machine and a fresh project.\n const auth = await authenticateCli(host, { pick: 'deploy', appId: project.appId });\n token = auth.token;\n await rememberToken(host, auth.token, auth.expiresAt);\n if (auth.target) {\n target = { environmentId: auth.target.environmentId };\n await rememberTarget(auth.target);\n }\n }\n if (!target) {\n throw new Error(\n 'No deploy target selected. Run again and pick an environment in the browser, or pass --app and --env.'\n );\n }\n\n try {\n await runDeploy({ host, token, target, kind, archivePath, overrides, detected, project });\n } catch (error) {\n if (!(error instanceof StudioApiError) || error.status !== 401) {\n throw error;\n }\n // Cached token expired or was revoked: authorize once more and retry.\n await clearCachedToken(host);\n console.log('Your saved login has expired; please sign in again.');\n const auth = await authenticateCli(host, { pick: 'deploy', appId: project.appId });\n await rememberToken(host, auth.token, auth.expiresAt);\n if (auth.target) {\n target = { environmentId: auth.target.environmentId };\n await rememberTarget(auth.target);\n }\n await runDeploy({\n host,\n token: auth.token,\n target,\n kind,\n archivePath,\n overrides,\n detected,\n project,\n });\n } finally {\n await fs.rm(archivePath, { force: true });\n }\n}\n\nasync function runDeploy({\n host,\n token,\n target,\n kind,\n archivePath,\n overrides,\n detected,\n project,\n}: {\n host: string;\n token: string;\n target: CliTarget;\n kind: UploadKind;\n archivePath: string;\n overrides: BuildPlanInput;\n detected?: BuildPlanInput;\n project: Awaited<ReturnType<typeof readProject>>;\n}) {\n const upload = await studioRequest<{\n uploadUrl: string;\n bundleName: string;\n appAlias: string;\n envAlias: string;\n environmentId: string;\n }>(host, '/api/upload-bundle', { method: 'POST', token, body: { ...target, kind } });\n\n await waitForEnvironmentReady(host, token, upload.environmentId);\n\n console.log(`Uploading to ${upload.appAlias}/${upload.envAlias}...`);\n const fileBuffer = await fs.readFile(archivePath);\n const uploadResponse = await fetch(upload.uploadUrl, {\n method: 'PUT',\n body: new Uint8Array(fileBuffer),\n headers: { 'Content-Type': 'application/zip' },\n });\n if (!uploadResponse.ok) {\n throw new Error(`Failed to upload: ${uploadResponse.statusText}`);\n }\n\n const result = await studioRequest<{\n deploymentUrl: string;\n appAlias: string;\n envAlias: string;\n environmentId: string;\n buildId: string | null;\n }>(host, '/api/deploy', {\n method: 'POST',\n token,\n body: {\n environmentId: upload.environmentId,\n bundleName: upload.bundleName,\n kind,\n plan: definedOnly(overrides),\n detected: detected ? definedOnly(detected) : undefined,\n },\n });\n\n // Whatever the target was resolved from, the next run can skip the picker.\n if (!project.deploy || project.deploy.environmentId !== result.environmentId) {\n await rememberTarget({\n environmentId: result.environmentId,\n appAlias: result.appAlias,\n envAlias: result.envAlias,\n });\n }\n\n console.log(`Deployment started: ${result.deploymentUrl}`);\n if (!result.buildId) {\n // Older Studio: no status route to follow.\n return;\n }\n await followDeploy(host, token, result.environmentId, result.buildId);\n}\n\n// An environment created moments ago in the browser is still provisioning\n// its database and telemetry; deploys are refused until it is ready.\nasync function waitForEnvironmentReady(host: string, token: string, environmentId: string) {\n const deadline = Date.now() + PROVISION_TIMEOUT_MS;\n let announced = false;\n while (Date.now() < deadline) {\n let status: string;\n try {\n ({ status } = await studioRequest<{ status: string }>(host, '/api/environment/status', {\n token,\n query: { environmentId },\n }));\n } catch (error) {\n if (error instanceof StudioApiError && error.status === 404) {\n // Older Studio without the route: let /api/deploy decide.\n return;\n }\n throw error;\n }\n if (status === 'ready') {\n return;\n }\n if (status === 'failed') {\n throw new Error('The environment failed to provision; check it in the dashboard.');\n }\n if (!announced) {\n console.log('Waiting for the environment to finish provisioning...');\n announced = true;\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n throw new Error('Timed out waiting for the environment to be ready.');\n}\n\n// Prints phase transitions and streams build log lines until the deploy\n// settles. Exit code reflects the outcome so CI and agents can act on it.\nasync function followDeploy(host: string, token: string, environmentId: string, buildId: string) {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n let lastStatus = '';\n let logOffset = 0;\n\n while (Date.now() < deadline) {\n const status = await studioRequest<DeployStatus>(host, '/api/deploy/status', {\n token,\n query: { environmentId, buildId, logOffset },\n });\n\n for (const line of status.logs) {\n process.stdout.write(` │ ${line.replace(/\\n$/, '')}\\n`);\n }\n logOffset = status.logCount;\n\n if (status.status !== lastStatus) {\n lastStatus = status.status;\n const message = describeStatus(status);\n if (message) {\n console.log(message);\n }\n }\n\n if (status.status === 'deploy-completed') {\n if (status.siteUrl) {\n console.log(`Live at ${status.siteUrl}`);\n }\n return;\n }\n if (status.status === 'build-failed' || status.status === 'deploy-failed') {\n for (const error of status.errors) {\n console.error(` ${error}`);\n }\n process.exitCode = 1;\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n console.error('Timed out waiting for the deployment; check the dashboard for its status.');\n process.exitCode = 1;\n}\n\nfunction describeStatus(status: DeployStatus): string | null {\n switch (status.status) {\n case 'build-pending':\n return 'Building image...';\n case 'deploy-pending':\n case 'deploying':\n return 'Image built. Deploying containers...';\n case 'rolling-out':\n return 'Rolling out new containers...';\n case 'deploy-completed':\n return 'Deployed successfully.';\n case 'build-failed':\n return 'Build failed.';\n case 'deploy-failed':\n return 'Deployment failed.';\n default:\n return null;\n }\n}\n\nfunction resolveTargetFromOptions(\n options: DeployOptions,\n project: Awaited<ReturnType<typeof readProject>>\n): CliTarget | null {\n if (options.app && options.env) {\n return { appAlias: options.app, envAlias: options.env };\n }\n if (options.env && project.deploy?.appAlias) {\n return { appAlias: project.deploy.appAlias, envAlias: options.env };\n }\n if (options.env && project.appId) {\n return { appId: project.appId, envAlias: options.env };\n }\n if (options.app || options.env) {\n throw new Error('Pass both --app and --env, or neither to pick the target in the browser.');\n }\n if (project.deploy?.environmentId) {\n return { environmentId: project.deploy.environmentId };\n }\n return null;\n}\n\nasync function resolveToken(host: string): Promise<string | null> {\n if (process.env.MODELENCE_TOKEN) {\n return process.env.MODELENCE_TOKEN;\n }\n return await readCachedToken(host);\n}\n\nasync function rememberToken(host: string, token: string, expiresAt?: string) {\n if (!expiresAt) {\n // Older Studio: the token lasts an hour, not worth caching.\n return;\n }\n try {\n await writeCachedToken(host, token, expiresAt);\n } catch (error) {\n console.warn('Could not save the login for next time:', error);\n }\n}\n\nasync function rememberTarget(target: CliAuthTarget | DeployTarget) {\n const deploy: DeployTarget = {\n environmentId: target.environmentId,\n appAlias: target.appAlias,\n envAlias: target.envAlias,\n };\n try {\n await updateProject({ deploy, ...('appId' in target ? { appId: target.appId } : {}) });\n } catch (error) {\n console.warn('Could not record the deploy target in .modelence/project.json:', error);\n }\n}\n\n// The Studio host: flag → environment → the project's .modelence.env → default.\n// Read directly rather than through loadEnv(), which requires a\n// modelence.config.ts that plain Node.js projects don't have.\nasync function resolveHost(flag: string | undefined, cwd: string): Promise<string> {\n if (flag) {\n return flag.replace(/\\/$/, '');\n }\n if (process.env.MODELENCE_SERVICE_ENDPOINT) {\n return process.env.MODELENCE_SERVICE_ENDPOINT.replace(/\\/$/, '');\n }\n try {\n const env = parseDotenv(await fs.readFile(join(cwd, '.modelence.env'), 'utf8'));\n if (env.MODELENCE_SERVICE_ENDPOINT) {\n return env.MODELENCE_SERVICE_ENDPOINT.replace(/\\/$/, '');\n }\n } catch {\n // No .modelence.env — plain Node.js projects usually have none.\n }\n return DEFAULT_HOST;\n}\n\nfunction planOverrides(options: DeployOptions): BuildPlanInput {\n return {\n preset: options.preset,\n nodeVersion: options.nodeVersion,\n rootDirectory: options.rootDir,\n installCommand: options.installCommand,\n buildCommand: options.buildCommand,\n startCommand: options.startCommand,\n };\n}\n\nfunction definedOnly<T extends object>(value: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined)\n ) as Partial<T>;\n}\n\nfunction printDetectedPlan(plan: BuildPlanInput, notes: string[]) {\n console.log('Build plan:');\n console.log(` preset: ${plan.preset ?? 'node'}`);\n console.log(` node: ${plan.nodeVersion ?? 'default (22)'}`);\n if (plan.rootDirectory) {\n console.log(` root: ${plan.rootDirectory}`);\n }\n console.log(` install: ${plan.installCommand ?? 'default'}`);\n console.log(` build: ${plan.buildCommand || '(none)'}`);\n console.log(` start: ${plan.startCommand ?? 'npm start'}`);\n for (const note of notes) {\n console.log(` note: ${note}`);\n }\n}\n\nfunction formatMb(bytes: number): string {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\n// The historical --prebuilt bundle: build output plus the manifests the\n// container needs to install production dependencies.\nasync function createBundle(bundlePath: string) {\n await fs.rm(bundlePath, { force: true });\n console.log('Creating deployment bundle...');\n await fs.mkdir(join(bundlePath, '..'), { recursive: true });\n\n const output = createWriteStream(bundlePath);\n const archive = archiver('zip', { zlib: { level: 9 } });\n const archiveComplete = new Promise<void>((resolve, reject) => {\n output.on('close', resolve);\n output.on('error', reject);\n archive.on('error', reject);\n });\n archive.pipe(output);\n\n const bundleFiles = [\n 'package.json',\n 'package-lock.json',\n 'next.config.js',\n 'next.config.ts',\n 'modelence.config.ts',\n ];\n const bundleDirs = ['public', 'server', 'scripts', join('.modelence', 'build'), '.next'];\n\n for (const file of bundleFiles) {\n if (await pathExists(getProjectPath(file))) {\n archive.file(getProjectPath(file), { name: file });\n }\n }\n for (const dir of bundleDirs) {\n if (await pathExists(getProjectPath(dir))) {\n archive.directory(getProjectPath(dir), dir);\n }\n }\n\n await archive.finalize();\n await archiveComplete;\n\n const stats = await fs.stat(bundlePath);\n console.log(`Deployment bundle created (${formatMb(stats.size)})`);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { getServerPath } from './config';\nimport { execSync } from 'child_process';\nimport path from 'path';\n\nexport function dev(options: { takeover?: boolean } = {}) {\n console.log('Starting Modelence dev server...');\n\n const serverPath = getServerPath();\n const tsxPath = path.resolve('./node_modules/.bin/tsx');\n\n execSync(`\"${tsxPath}\" watch --ignore \"vite.config.ts.timestamp-*\" \"${serverPath}\"`, {\n stdio: 'inherit',\n cwd: process.cwd(),\n env: {\n ...process.env,\n NODE_ENV: 'development',\n ...(options.takeover ? { MODELENCE_TAKEOVER: '1' } : {}),\n },\n });\n}\n","import { getBuildPath, getServerPath } from './config';\nimport { execSync } from 'child_process';\nimport path from 'path';\n\nexport function start() {\n console.log('Starting Modelence production server...');\n\n const serverPath = getServerPath();\n const serverFilename = path.basename(serverPath, path.extname(serverPath));\n const builtServerPath = getBuildPath(`${serverFilename}.mjs`);\n\n execSync(`node \"${builtServerPath}\"`, {\n stdio: 'inherit',\n cwd: process.cwd(),\n env: { ...process.env, NODE_ENV: 'production' },\n });\n}\n","import { clearCachedToken, getAuthCachePath } from './authCache';\n\n// Forgets the saved deploy login (all hosts, or one with --host).\nexport async function logout(options: { host?: string }) {\n await clearCachedToken(options.host);\n console.log(\n options.host\n ? `Removed the saved login for ${options.host}.`\n : `Removed saved logins (${getAuthCachePath()}).`\n );\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { setup } from './setup';\nimport { build } from './build';\nimport { deploy } from './deploy';\nimport { dev } from './dev';\nimport { start } from './start';\nimport { logout } from './logout';\nimport { loadEnv } from './config';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));\n\nconst program = new Command()\n .name('modelence')\n .description('Modelence CLI tool')\n .version(packageJson.version);\n\nprogram\n .command('setup')\n .description('Setup Modelence environment variables')\n .option('-t, --token <token>', 'Modelence setup token (omit to authorize in the browser)')\n .option('-h, --host <host>', 'Modelence host', 'https://cloud.modelence.com')\n .action(async (options) => {\n await setup(options);\n });\n\nprogram\n .command('build')\n .description('Build the application')\n .action(async () => {\n await loadEnv();\n await build();\n });\n\nprogram\n .command('deploy')\n .description(\n 'Deploy the current directory to Modelence Cloud (any Node.js app; picks the target in the browser on first run)'\n )\n .option('-a, --app <app>', 'Application alias')\n .option('-e, --env <env>', 'Environment alias')\n .option('-h, --host <host>', 'Modelence host')\n .option(\n '--prebuilt',\n 'Build locally and upload the .modelence/build bundle (Modelence apps only)'\n )\n .option('--preset <preset>', 'Build preset: node or modelence (default: detected)')\n .option('--node-version <version>', 'Node.js version for the container, e.g. 22')\n .option('--root-dir <path>', 'Subdirectory containing the app (monorepos)')\n .option('--install-command <command>', 'Override the detected install command')\n .option('--build-command <command>', 'Override the detected build command (\"\" to skip)')\n .option('--start-command <command>', 'Override the detected start command')\n .action(async (options) => {\n try {\n await deploy(options);\n } catch (error) {\n console.error(`Deploy failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('logout')\n .description('Forget the saved Modelence Cloud login')\n .option('-h, --host <host>', 'Only forget the login for this host')\n .action(async (options) => {\n await logout(options);\n });\n\nprogram\n .command('dev')\n .description('Start development server')\n .option(\n '--takeover',\n 'Disconnect any instance currently holding the environment and connect this one'\n )\n .action(async (options) => {\n await loadEnv();\n dev(options);\n });\n\nprogram\n .command('start')\n .description('Start production server')\n .action(async () => {\n await loadEnv();\n start();\n });\n\nprogram.parse(process.argv);\n"]}
1
+ {"version":3,"sources":["../../src/bin/auth.ts","../../src/bin/project.ts","../../src/bin/setup.ts","../../src/app/modelenceConfig.ts","../../src/bin/config.ts","../../src/bin/build.ts","../../src/bin/authCache.ts","../../src/bin/detect.ts","../../src/bin/source.ts","../../src/bin/studioApi.ts","../../src/bin/deploy.ts","../../src/bin/dev.ts","../../src/bin/start.ts","../../src/bin/logout.ts","../../src/bin/modelence.ts"],"names":["authenticateCli","host","pick","pickEnvironment","appId","response","code","verificationUrl","url","resolvedPick","open","waitForAuth","pollExpireTs","result","pollForToken","error","resolve","token","expiresAt","target","MODELENCE_DIR","PROJECT_FILE","getProjectFilePath","cwd","join","readProject","content","fs","parsed","updateProject","patch","existing","MODELENCE_ENV_FILE","fetchServiceConfig","auth","headers","errorText","ask","question","rl","createInterface","answer","confirmOverwrite","escapeEnvValue","value","readProjectAppId","recordProjectAppId","CLAUDE_DIR","CLAUDE_SETTINGS_FILE","CLAUDE_PLUGIN_ID","CLAUDE_MARKETPLACE_REPO","CLAUDE_MARKETPLACES","CLAUDE_PLUGIN_DOCS_URL","CLAUDE_PLUGIN_INSTALL_HINT","ensureClaudePluginEnabled","settingsPath","settings","runClaude","args","spawnSync","offerClaudePluginInstall","probe","marketplace","install","failed","backupEnvFile","envPath","backupPath","setup","options","existingEnv","fileExisted","envContent","parseEnv","cliToken","config","newEnv","key","configSchema","z","loadModelenceConfig","configPath","configModule","createJiti","env","getConfig","getServerPath","serverDir","serverEntry","getPostBuildCommand","getBuildPath","subPath","buildDir","getModelencePath","getProjectPath","modelenceDir","loadEnv","parseDotenv","buildClient","postBuildCommand","execSync","buildVite","buildViteSsr","userConfig","loadConfigFromFile","modelenceConfig","path","viteBuild","mergeConfig","buildServer","tsupBuild","build","AUTH_FILE","EXPIRY_MARGIN_MS","getAuthCachePath","home","os","readAuthFile","writeAuthFile","dirname","readCachedToken","hosts","cached","writeCachedToken","current","clearCachedToken","_removed","rest","MINIMUM_NODE_MAJOR","exists","readJson","parseNodeMajor","range","match","major","parseProcfileWebCommand","line","commandsFor","packageManager","hasLockfile","script","detectBuildPlan","notes","packageJson","scripts","engines","isModelence","hasNpmLockfile","commands","buildCommand","startCommand","nodeVersion","staticOutput","detectStaticOutput","deps","hasViteConfig","execFileAsync","promisify","execFile","MAX_SOURCE_BYTES","ALWAYS_EXCLUDED_DIRS","ALWAYS_EXCLUDED_FILES","toPosix","sep","isExcludedPath","relativePath","segments","dir","fileName","pattern","isGitRepository","stdout","listGitFiles","entry","walk","entries","files","listSourceFiles","usedGit","candidates","file","packSource","zipPath","output","createWriteStream","archive","archiver","done","reject","relative","size","StudioApiError","message","status","studioRequest","method","body","query","text","DEFAULT_HOST","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","PROVISION_TIMEOUT_MS","deploy","resolveHost","kind","overrides","planOverrides","project","detected","archivePath","createBundle","plan","printDetectedPlan","definedOnly","fileCount","sizeBytes","formatMb","resolveTargetFromOptions","resolveToken","rememberToken","rememberTarget","runDeploy","upload","waitForEnvironmentReady","fileBuffer","uploadResponse","reportResolvedPlan","followDeploy","environmentId","deadline","announced","buildId","lastStatus","logOffset","describeStatus","flag","note","used","differences","field","detectedValue","bytes","bundlePath","archiveComplete","bundleFiles","bundleDirs","pathExists","stats","dev","serverPath","tsxPath","start","serverFilename","builtServerPath","logout","__filename","fileURLToPath","__dirname","readFileSync","program","Command"],"mappings":"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","file":"modelence.js","sourcesContent":["import open from 'open';\n\n/*\n Browser device authorization: the CLI mints a code, the user approves it in\n the browser, and the CLI polls until approval binds a token to the code.\n\n Two approval modes, chosen by `pick`:\n 'environment' — `modelence setup`: the page also asks which environment to\n connect the local project to. The choice is stamped on the\n token; /api/setup derives its target from there.\n 'deploy' — `modelence deploy`: the page asks where to deploy (an\n existing or newly created app / cloud environment) and the\n token route reports the pick back so the CLI can record it\n in .modelence/project.json.\n Without `pick` the page only authorizes the device.\n\n `appId` is the hint from .modelence/project.json used to preselect the app.\n*/\n\nexport type CliAuthPick = 'environment' | 'deploy';\n\nexport interface CliAuthTarget {\n appId: string;\n appAlias: string;\n environmentId: string;\n envAlias: string;\n}\n\nexport interface CliAuthResult {\n token: string;\n // Absent on older Studio versions (tokens then last one hour).\n expiresAt?: string;\n target?: CliAuthTarget;\n}\n\nexport async function authenticateCli(\n host: string,\n {\n pick,\n pickEnvironment = false,\n appId,\n }: { pick?: CliAuthPick; pickEnvironment?: boolean; appId?: string } = {}\n): Promise<CliAuthResult> {\n const response = await fetch(`${host}/api/cli/auth`, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new Error('Failed to create CLI authentication code');\n }\n\n const { code, verificationUrl } = await response.json();\n const url = new URL(verificationUrl);\n const resolvedPick = pick ?? (pickEnvironment ? 'environment' : undefined);\n if (resolvedPick) {\n url.searchParams.set('pick', resolvedPick);\n }\n if (appId) {\n url.searchParams.set('appId', appId);\n }\n\n console.log(`Please visit ${url} to authenticate`);\n console.log(`Code: ${code}`);\n\n try {\n await open(url.toString());\n } catch {\n // Headless/SSH/container — no browser to open. The URL and code above\n // are already printed, so authentication can proceed manually.\n console.log('Could not open a browser automatically. Please open the URL above manually.');\n }\n\n return await waitForAuth(host, code);\n}\n\nasync function waitForAuth(host: string, code: string): Promise<CliAuthResult> {\n const pollInterval = 5 * 1000; // 5 seconds\n const pollTimeout = 10 * 60 * 1000; // 10 minutes\n const pollExpireTs = Date.now() + pollTimeout;\n while (Date.now() < pollExpireTs) {\n try {\n const result = await pollForToken(host, code);\n if (result) {\n return result;\n }\n } catch (error) {\n console.error('Error polling for CLI token:', error);\n }\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n }\n\n throw new Error('Unable to authenticate CLI - timed out. Please try again.');\n}\n\nasync function pollForToken(host: string, code: string): Promise<CliAuthResult | null> {\n const response = await fetch(`${host}/api/cli/token?code=${code}`, {\n method: 'GET',\n });\n\n if (!response.ok) {\n throw new Error(`CLI token polling failed: ${response.statusText}`);\n }\n\n const { token, expiresAt, target } = await response.json();\n if (!token) {\n return null;\n }\n return { token, expiresAt, target };\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\n\nexport const MODELENCE_DIR = '.modelence';\nexport const PROJECT_FILE = 'project.json';\n\n/*\n .modelence/project.json — CLI-managed project state that is meant to be\n committed (unlike .modelence.env, which holds per-developer credentials).\n It records which app the project belongs to and, once a deploy target has\n been picked in the browser, which environment `modelence deploy` ships to.\n Everything in it is a hint, never a credential: access is re-checked on\n every request with the user's token.\n*/\n\nexport interface DeployTarget {\n environmentId: string;\n appAlias: string;\n envAlias: string;\n}\n\nexport interface ProjectFile {\n appId?: string;\n deploy?: DeployTarget;\n [key: string]: unknown;\n}\n\nexport function getProjectFilePath(cwd = process.cwd()): string {\n return join(cwd, MODELENCE_DIR, PROJECT_FILE);\n}\n\n// Missing or malformed reads as an empty project rather than failing the\n// command: the file only ever pre-fills choices.\nexport async function readProject(cwd = process.cwd()): Promise<ProjectFile> {\n try {\n const content = await fs.readFile(getProjectFilePath(cwd), 'utf8');\n const parsed = JSON.parse(content);\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nexport async function updateProject(\n patch: Partial<ProjectFile>,\n cwd = process.cwd()\n): Promise<void> {\n const existing = await readProject(cwd);\n await fs.mkdir(join(cwd, MODELENCE_DIR), { recursive: true });\n await fs.writeFile(\n getProjectFilePath(cwd),\n JSON.stringify({ ...existing, ...patch }, null, 2) + '\\n'\n );\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { parse as parseEnv } from 'dotenv';\nimport { createInterface } from 'readline';\nimport { spawnSync } from 'child_process';\nimport { authenticateCli } from './auth';\nimport { MODELENCE_DIR, PROJECT_FILE, readProject, updateProject } from './project';\n\nconst MODELENCE_ENV_FILE = '.modelence.env';\n\ninterface SetupResponse {\n environmentId: string;\n serviceEndpoint: string;\n serviceToken: string;\n containerId: string;\n // Absent on older Modelence Cloud versions.\n appId?: string;\n}\n\n/*\n Two ways to authenticate against /api/setup, matching the two ways setup is\n run: a setup token pasted from the dashboard, or a CLI token from the\n browser device flow. Either way the credential itself carries the\n environment choice — the server derives the target from it, so nothing\n else needs to be sent.\n*/\ntype SetupAuth = { setupToken: string } | { cliToken: string };\n\nasync function fetchServiceConfig(host: string, auth: SetupAuth): Promise<SetupResponse> {\n const headers: Record<string, string> =\n 'setupToken' in auth\n ? { 'X-Modelence-Setup-Token': auth.setupToken }\n : { Authorization: `Bearer ${auth.cliToken}` };\n\n const response = await fetch(`${host}/api/setup`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(errorText || `Request failed with status ${response.status}`);\n }\n\n return response.json();\n}\n\nasync function ask(question: string): Promise<string> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nasync function confirmOverwrite(): Promise<boolean> {\n const answer = await ask(\n `Warning: ${MODELENCE_ENV_FILE} already exists. Do you want to overwrite it? (y/N) `\n );\n return answer.toLowerCase() === 'y';\n}\n\nfunction escapeEnvValue(value: string | number): string {\n // Convert to string and escape quotes\n return String(value).replace(/\"/g, '\\\\\"');\n}\n\n/*\n The app this project was last connected to, if a previous setup (by anyone\n on the team — the file is committed) recorded it. Used only to preselect\n the app on the approval page; anything unreadable means \"no hint\".\n*/\nasync function readProjectAppId(): Promise<string | undefined> {\n const { appId } = await readProject();\n return typeof appId === 'string' && appId ? appId : undefined;\n}\n\n/*\n Records which app this project belongs to in .modelence/project.json. Unlike\n .modelence.env this file is meant to be committed (the .modelence/ root holds\n CLI-managed project state; only designated subdirs like build/, cache/ and\n tmp/ are temporary), so the whole team gets it. It's a hint in the git-remote\n sense — connect flows use it to preselect the app, never to block a different\n choice — which is why failing to write it doesn't fail the setup.\n\n Only the app goes here: which ENVIRONMENT a working copy connects to is\n per-developer state, already recorded by .modelence.env, and committing it\n would make teammates connected to different environments fight over the\n value. (The deploy target recorded by `modelence deploy` is different: it is\n shared on purpose, like a git remote.)\n*/\nasync function recordProjectAppId(appId: string): Promise<void> {\n await updateProject({ appId });\n}\n\nconst CLAUDE_DIR = '.claude';\nconst CLAUDE_SETTINGS_FILE = join(CLAUDE_DIR, 'settings.json');\nconst CLAUDE_PLUGIN_ID = 'modelence@modelence';\n// Without the marketplace declared alongside enabledPlugins, Claude Code\n// can't resolve the plugin unless the user already ran\n// `claude plugin marketplace add` themselves.\nconst CLAUDE_MARKETPLACE_REPO = 'modelence/modelence';\nconst CLAUDE_MARKETPLACES = {\n modelence: { source: { source: 'github', repo: CLAUDE_MARKETPLACE_REPO } },\n};\nconst CLAUDE_PLUGIN_DOCS_URL = 'https://docs.modelence.com/ai-coding-agents';\nconst CLAUDE_PLUGIN_INSTALL_HINT =\n 'Install the Modelence plugin for Claude Code by hand:\\n' +\n ` claude plugin marketplace add ${CLAUDE_MARKETPLACE_REPO}\\n` +\n ` claude plugin install ${CLAUDE_PLUGIN_ID} --scope project\\n` +\n `Guide: ${CLAUDE_PLUGIN_DOCS_URL}`;\n\n/*\n Declares the Modelence Claude Code plugin in the project's settings.json,\n merging into an existing file rather than replacing it. An explicit\n `false` is a deliberate opt-out and is never flipped back on. The file is\n inert for people who don't use Claude Code, and failing to write it doesn't\n fail the setup.\n*/\nasync function ensureClaudePluginEnabled(): Promise<void> {\n const settingsPath = join(process.cwd(), CLAUDE_SETTINGS_FILE);\n\n let content: string | undefined;\n try {\n content = await fs.readFile(settingsPath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`Could not read ${CLAUDE_SETTINGS_FILE}; leaving it unchanged.`);\n return;\n }\n }\n\n let settings: Record<string, any> = {};\n if (content !== undefined) {\n try {\n settings = JSON.parse(content);\n } catch {\n console.warn(`Could not parse ${CLAUDE_SETTINGS_FILE}; leaving it unchanged.`);\n return;\n }\n }\n\n // The marketplace is only a pointer, so it's always (re)declared — a file\n // with just enabledPlugins, as `claude plugin install --scope project`\n // leaves behind, can't be resolved by teammates without it. An explicit\n // `false` in enabledPlugins is the user's opt-out and is left alone.\n settings.extraKnownMarketplaces = { ...settings.extraKnownMarketplaces, ...CLAUDE_MARKETPLACES };\n if (settings.enabledPlugins?.[CLAUDE_PLUGIN_ID] === undefined) {\n settings.enabledPlugins = { ...settings.enabledPlugins, [CLAUDE_PLUGIN_ID]: true };\n }\n\n try {\n await fs.mkdir(join(process.cwd(), CLAUDE_DIR), { recursive: true });\n await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2) + '\\n');\n console.log(`Declared the Modelence Claude Code plugin in ${CLAUDE_SETTINGS_FILE}`);\n } catch (error) {\n console.warn(`Failed to write ${CLAUDE_SETTINGS_FILE}:`, error);\n }\n}\n\nfunction runClaude(args: string[]) {\n return spawnSync('claude', args, { encoding: 'utf8', shell: process.platform === 'win32' });\n}\n\n/*\n Installs the plugin through the Claude Code CLI — the one install path that\n behaves the same for the terminal, the IDE extensions and the desktop app,\n which all read the same plugin state. Touches the user's machine-wide Claude\n config, so it asks first, and it never fails the setup: without the CLI on\n PATH it prints the commands to run by hand.\n*/\nasync function offerClaudePluginInstall(): Promise<void> {\n const probe = runClaude(['--version']);\n if (probe.error || probe.status !== 0) {\n console.log(CLAUDE_PLUGIN_INSTALL_HINT);\n return;\n }\n\n const answer = (await ask('Install the Modelence plugin for Claude Code? (Y/n) ')).toLowerCase();\n if (answer && answer !== 'y' && answer !== 'yes') {\n return;\n }\n\n // Makes the install work before Claude Code has picked up the marketplace\n // declared in .claude/settings.json. Its result only matters if the install\n // then fails: a network or auth error here is the real cause, and the\n // install's own message wouldn't point at it.\n const marketplace = runClaude(['plugin', 'marketplace', 'add', CLAUDE_MARKETPLACE_REPO]);\n const install = runClaude(['plugin', 'install', CLAUDE_PLUGIN_ID, '--scope', 'project']);\n if (install.status === 0) {\n console.log(\n 'Installed the Modelence plugin for Claude Code. Sign in once from Claude Code: ' +\n 'run /mcp, choose modelence, then Authenticate.'\n );\n } else {\n const failed = marketplace.status !== 0 ? marketplace : install;\n console.warn(\n `Could not install the Modelence plugin: ${(failed.stderr || failed.stdout || '').trim()}`\n );\n console.warn(CLAUDE_PLUGIN_INSTALL_HINT);\n }\n}\n\nasync function backupEnvFile(envPath: string): Promise<void> {\n try {\n const backupPath = envPath.replace('.env', '.backup.env');\n await fs.copyFile(envPath, backupPath);\n console.log(`Backup created at ${backupPath}`);\n } catch (error) {\n console.warn('Failed to create backup file:', error);\n }\n}\n\nexport async function setup(options: { token?: string; host: string }) {\n try {\n const envPath = join(process.cwd(), MODELENCE_ENV_FILE);\n let existingEnv = {};\n let fileExisted = false;\n\n try {\n // Check if .modelence.env exists\n const envContent = await fs.readFile(envPath, 'utf8');\n existingEnv = parseEnv(envContent);\n fileExisted = true;\n\n // Create backup before overwriting\n await backupEnvFile(envPath);\n\n // Ask for confirmation before overwriting\n const shouldContinue = await confirmOverwrite();\n if (!shouldContinue) {\n console.log('Setup canceled');\n process.exit(0);\n }\n } catch {\n // File doesn't exist, we'll create it\n }\n\n let auth: SetupAuth;\n if (options.token) {\n auth = { setupToken: options.token };\n } else {\n // No token given: authorize in the browser, where the approval page\n // also asks which environment to connect to.\n const { token: cliToken } = await authenticateCli(options.host, {\n pickEnvironment: true,\n appId: await readProjectAppId(),\n });\n auth = { cliToken };\n }\n\n // Fetch service configuration\n console.log('Fetching service configuration...');\n const config = await fetchServiceConfig(options.host, auth);\n\n // Update environment variables\n const newEnv = {\n ...existingEnv,\n MODELENCE_TELEMETRY_ENABLED: 'false', // TODO: Remove after all usages are gone\n MODELENCE_ENVIRONMENT_ID: config.environmentId,\n MODELENCE_SERVICE_ENDPOINT: options.host, // TODO: Replace with config.serviceEndpoint in the future\n MODELENCE_SERVICE_TOKEN: config.serviceToken,\n MODELENCE_CONTAINER_ID: config.containerId,\n // Where this working copy runs; Studio sandboxes pre-set \"sandbox\".\n MODELENCE_RUNTIME: process.env.MODELENCE_RUNTIME || 'local',\n };\n\n // Convert to .env format with escaped values\n const envContent = Object.entries(newEnv)\n .map(([key, value]) => `${key}=\"${escapeEnvValue(value)}\"`)\n .join('\\n');\n\n // Write the file\n await fs.writeFile(envPath, envContent.trim() + '\\n');\n console.log(`Successfully configured ${MODELENCE_ENV_FILE} file`);\n\n if (config.appId) {\n try {\n await recordProjectAppId(config.appId);\n console.log(`Recorded the app ID in ${MODELENCE_DIR}/${PROJECT_FILE}`);\n } catch (error) {\n console.warn(`Failed to record the app ID in ${MODELENCE_DIR}/${PROJECT_FILE}:`, error);\n }\n }\n\n await ensureClaudePluginEnabled();\n // Interactive runs only: with --token (CI) or without a terminal there is\n // nobody to ask, and no Claude Code to set up.\n if (!options.token && process.stdin.isTTY) {\n await offerClaudePluginInstall();\n }\n\n if (fileExisted) {\n // The dev server reads the file at boot, and an open agent session may\n // still hold the old environment id in its context.\n console.log(\n 'The project now points to a different environment. Restart your dev server, and if you use ' +\n 'an AI coding agent, start a new session.'\n );\n }\n\n // Only for a first-time setup: re-running it on an existing file already\n // told them to restart the dev server they're running.\n if (!fileExisted && newEnv.MODELENCE_RUNTIME === 'local') {\n console.log('\\nNext step — run the app on this machine:\\n');\n console.log(\" npm install (if you haven't already)\");\n console.log(' npm run dev (starts the app)\\n');\n }\n } catch (error: unknown) {\n console.error(`Setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n process.exit(1);\n }\n}\n","import { join } from 'path';\nimport { createJiti } from 'jiti';\nimport { z } from 'zod';\nimport type { ModelenceConfig } from '../types';\n\nconst configSchema = z.object({\n serverDir: z.string(),\n serverEntry: z.string(),\n postBuildCommand: z.string().optional(),\n});\n\nexport async function loadModelenceConfig(): Promise<ModelenceConfig> {\n const configPath = join(process.cwd(), 'modelence.config.ts');\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n requireCache: false,\n });\n\n const configModule = await jiti.import(configPath);\n if (typeof configModule !== 'object') {\n throw new Error('modelence.config.ts should export an object');\n }\n\n return configSchema.parse(configModule);\n}\n","import { parse as parseDotenv } from 'dotenv';\nimport { join } from 'path';\nimport fs from 'fs/promises';\nimport type { ModelenceConfig } from '../types';\nimport { loadModelenceConfig } from '../app/modelenceConfig';\n\nlet env: Record<string, string> | null = null;\nlet config: ModelenceConfig | null = null;\n\nexport function getEnv() {\n if (!env) {\n throw new Error('Environment variables not loaded');\n }\n\n return env;\n}\n\nexport function getConfig() {\n if (!config) {\n throw new Error('Configuration not loaded');\n }\n\n return config;\n}\n\nexport function getStudioUrl(path: string) {\n const studioBaseUrl = getEnv().MODELENCE_SERVICE_ENDPOINT || 'https://cloud.modelence.com';\n return `${studioBaseUrl}${path}`;\n}\n\nexport function getServerPath() {\n const { serverDir, serverEntry } = getConfig();\n const path = join(serverDir, serverEntry);\n // Normalize path to use forward slashes for cross-platform compatibility\n return path.replace(/\\\\/g, '/');\n}\n\nexport function getPostBuildCommand() {\n return getConfig().postBuildCommand;\n}\n\nexport function getBuildPath(subPath?: string) {\n const buildDir = getModelencePath('build');\n if (subPath) {\n const path = join(buildDir, subPath);\n return path.replace(/\\\\/g, '/');\n }\n return buildDir.replace(/\\\\/g, '/');\n}\n\nexport function getProjectPath(subPath: string) {\n const path = join(process.cwd(), subPath);\n return path.replace(/\\\\/g, '/');\n}\n\nexport function getModelencePath(subPath?: string) {\n const modelenceDir = getProjectPath('.modelence');\n if (subPath) {\n const path = join(modelenceDir, subPath);\n return path.replace(/\\\\/g, '/');\n }\n return modelenceDir.replace(/\\\\/g, '/');\n}\n\nexport async function loadEnv() {\n try {\n config = await loadModelenceConfig();\n } catch (error) {\n console.error(error);\n throw new Error('Unable to load modelence.config.ts');\n }\n\n try {\n const envContent = await fs.readFile(join(process.cwd(), '.modelence.env'), 'utf-8');\n env = parseDotenv(envContent);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n // .modelence.env is optional, may not exist in case of an offline setup\n // Initialize with empty object to prevent \"Environment variables not loaded\" error\n env = {};\n } else {\n throw error;\n }\n }\n}\n","import fs from 'fs/promises';\nimport { getBuildPath, getModelencePath, getPostBuildCommand, getServerPath } from './config';\nimport { build as tsupBuild } from 'tsup';\nimport { build as viteBuild, mergeConfig, loadConfigFromFile } from 'vite';\nimport path from 'path';\nimport { execSync } from 'child_process';\n\nasync function buildClient() {\n const postBuildCommand = getPostBuildCommand();\n if (postBuildCommand) {\n console.log('Running post-build command...');\n execSync(postBuildCommand);\n return;\n }\n\n // Always emit SSR artifacts; `startApp({ ssr: true })` decides if they're used.\n await buildVite();\n await buildViteSsr();\n}\n\nasync function buildVite() {\n console.log('Building client with Vite...');\n\n const userConfig = await loadConfigFromFile({\n command: 'build',\n mode: process.env.NODE_ENV || 'production',\n });\n\n const modelenceConfig = {\n build: {\n outDir: path.resolve(process.cwd(), '.modelence/build/client').replace(/\\\\/g, '/'),\n emptyOutDir: true,\n // Emit `.vite/ssr-manifest.json` for ssr/collectCss.ts.\n ssrManifest: true,\n },\n };\n\n await viteBuild(mergeConfig(userConfig?.config || {}, modelenceConfig, true));\n}\n\nasync function buildViteSsr() {\n console.log('Building SSR bundle with Vite...');\n\n const userConfig = await loadConfigFromFile({\n command: 'build',\n mode: process.env.NODE_ENV || 'production',\n });\n\n const ssrEntry = path.resolve(process.cwd(), 'src/client/index.tsx').replace(/\\\\/g, '/');\n const modelenceConfig = {\n build: {\n ssr: ssrEntry,\n outDir: path.resolve(process.cwd(), '.modelence/build/ssr').replace(/\\\\/g, '/'),\n emptyOutDir: true,\n rollupOptions: {\n output: {\n format: 'esm' as const,\n entryFileNames: 'index.mjs',\n },\n },\n },\n };\n\n await viteBuild(mergeConfig(userConfig?.config || {}, modelenceConfig, true));\n}\n\nasync function buildServer() {\n console.log('Building server with tsup...');\n return new Promise((resolve) => {\n void tsupBuild({\n entry: [getServerPath()],\n format: 'esm',\n sourcemap: true,\n minify: process.env.NODE_ENV === 'production',\n outDir: '.modelence/build',\n clean: true,\n watch: false,\n bundle: true,\n skipNodeModulesBundle: true,\n treeshake: true,\n platform: 'node',\n outExtension: () => ({\n js: '.mjs',\n }),\n onSuccess: async () => {\n resolve(undefined);\n },\n });\n });\n}\n\nexport async function build() {\n console.log('Building Modelence project...');\n\n try {\n const buildDir = getBuildPath();\n await fs.rm(buildDir, { recursive: true, force: true });\n\n await buildServer();\n await buildClient();\n\n console.log('Build completed successfully!');\n } catch (error) {\n console.error(error);\n throw new Error('Build failed');\n }\n\n try {\n await fs.access(getModelencePath());\n } catch {\n throw new Error(\n 'Could not find the .modelence directory. Looks like something went wrong during the build.'\n );\n }\n}\n","import { promises as fs } from 'fs';\nimport os from 'os';\nimport { dirname, join } from 'path';\n\n/*\n Cached deploy authorization, per Studio host, in the user's home directory\n (never in the project). Written only after a browser approval, dropped by\n `modelence logout` or when Studio rejects it. MODELENCE_HOME overrides the\n location (tests, sandboxes).\n*/\n\nconst AUTH_FILE = 'auth.json';\n// A token about to expire is treated as expired so a deploy doesn't fail\n// halfway through its polling.\nconst EXPIRY_MARGIN_MS = 60 * 1000;\n\ninterface CachedToken {\n token: string;\n expiresAt: string;\n}\n\ninterface AuthFile {\n hosts?: Record<string, CachedToken>;\n}\n\nexport function getAuthCachePath(): string {\n const home = process.env.MODELENCE_HOME || join(os.homedir(), '.modelence');\n return join(home, AUTH_FILE);\n}\n\nasync function readAuthFile(): Promise<AuthFile> {\n try {\n const parsed = JSON.parse(await fs.readFile(getAuthCachePath(), 'utf8'));\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nasync function writeAuthFile(content: AuthFile): Promise<void> {\n const path = getAuthCachePath();\n await fs.mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await fs.writeFile(path, JSON.stringify(content, null, 2) + '\\n', { mode: 0o600 });\n}\n\nexport async function readCachedToken(host: string): Promise<string | null> {\n const { hosts = {} } = await readAuthFile();\n const cached = hosts[host];\n if (!cached?.token || !cached.expiresAt) {\n return null;\n }\n if (new Date(cached.expiresAt).getTime() - EXPIRY_MARGIN_MS <= Date.now()) {\n return null;\n }\n return cached.token;\n}\n\nexport async function writeCachedToken(\n host: string,\n token: string,\n expiresAt: string\n): Promise<void> {\n const current = await readAuthFile();\n await writeAuthFile({\n ...current,\n hosts: { ...current.hosts, [host]: { token, expiresAt } },\n });\n}\n\nexport async function clearCachedToken(host?: string): Promise<void> {\n if (!host) {\n await writeAuthFile({});\n return;\n }\n const current = await readAuthFile();\n const { [host]: _removed, ...rest } = current.hosts ?? {};\n await writeAuthFile({ ...current, hosts: rest });\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\n\n/*\n Infers the build contract from the project the way Heroku's Node buildpack\n does: the lockfile picks the package manager, package.json scripts pick the\n build and start commands, a Procfile `web:` line wins for start, and\n engines.node pins the Node.js major. Studio uses these as defaults for\n whatever the environment's settings leave blank.\n*/\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn';\n\nexport interface DetectedBuildPlan {\n preset: 'modelence' | 'node' | 'static';\n packageManager: PackageManager;\n nodeVersion?: string;\n installCommand: string;\n // Undefined when nothing was found, so the server's defaults apply.\n buildCommand?: string;\n startCommand?: string;\n // 'static' preset: where the build writes the site.\n outputDirectory?: string;\n // Human-readable notes about what was (not) found.\n notes: string[];\n}\n\nconst MINIMUM_NODE_MAJOR = 18;\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJson(path: string): Promise<Record<string, unknown> | null> {\n try {\n const parsed = JSON.parse(await fs.readFile(path, 'utf8'));\n return parsed && typeof parsed === 'object' ? parsed : null;\n } catch {\n return null;\n }\n}\n\n// The first version number in a semver range, e.g. \">=20.10 <23\" → \"20\",\n// \"22.x\" → \"22\". Anything below the supported floor is ignored.\nexport function parseNodeMajor(range: unknown): string | undefined {\n if (typeof range !== 'string') {\n return undefined;\n }\n const match = range.match(/(\\d+)(?:\\.\\d+)?(?:\\.\\d+)?/);\n if (!match) {\n return undefined;\n }\n const major = Number(match[1]);\n return major >= MINIMUM_NODE_MAJOR ? String(major) : undefined;\n}\n\nexport function parseProcfileWebCommand(content: string): string | undefined {\n for (const line of content.split(/\\r?\\n/)) {\n const match = line.match(/^\\s*web\\s*:\\s*(.+?)\\s*$/);\n if (match) {\n return match[1];\n }\n }\n return undefined;\n}\n\nfunction commandsFor(packageManager: PackageManager, hasLockfile: boolean) {\n switch (packageManager) {\n case 'pnpm':\n return {\n install: 'npm install -g pnpm && pnpm install --frozen-lockfile',\n run: (script: string) => `pnpm run ${script}`,\n start: 'pnpm start',\n };\n case 'yarn':\n return {\n install: 'yarn install --frozen-lockfile',\n run: (script: string) => `yarn ${script}`,\n start: 'yarn start',\n };\n default:\n return {\n install: hasLockfile ? 'npm ci' : 'npm install',\n run: (script: string) => `npm run ${script}`,\n start: 'npm start',\n };\n }\n}\n\nexport async function detectBuildPlan(cwd = process.cwd()): Promise<DetectedBuildPlan> {\n const notes: string[] = [];\n\n const packageJson = await readJson(join(cwd, 'package.json'));\n if (!packageJson) {\n throw new Error('No package.json found in the current directory');\n }\n const scripts = (packageJson.scripts ?? {}) as Record<string, string>;\n const engines = (packageJson.engines ?? {}) as Record<string, unknown>;\n\n const isModelence =\n (await exists(join(cwd, 'modelence.config.ts'))) ||\n (await exists(join(cwd, 'modelence.config.js')));\n\n let packageManager: PackageManager = 'npm';\n if (await exists(join(cwd, 'pnpm-lock.yaml'))) {\n packageManager = 'pnpm';\n } else if (await exists(join(cwd, 'yarn.lock'))) {\n packageManager = 'yarn';\n }\n const hasNpmLockfile = await exists(join(cwd, 'package-lock.json'));\n if (packageManager === 'npm' && !hasNpmLockfile) {\n notes.push('No package-lock.json found; dependencies are installed with `npm install`.');\n }\n\n const commands = commandsFor(packageManager, hasNpmLockfile);\n\n let buildCommand: string | undefined;\n if (scripts.build) {\n buildCommand = commands.run('build');\n } else if (!isModelence) {\n notes.push('No `build` script found; the deploy skips the build step.');\n }\n\n let startCommand: string | undefined;\n try {\n startCommand = parseProcfileWebCommand(await fs.readFile(join(cwd, 'Procfile'), 'utf8'));\n } catch {\n // No Procfile — fall through to package.json.\n }\n if (!startCommand && scripts.start) {\n startCommand = commands.start;\n }\n const nodeVersion = parseNodeMajor(engines.node);\n\n // A client-only site (Vite, Lovable, CRA…): something to build, nothing to\n // start. The runtime serves the build output itself.\n const staticOutput =\n !isModelence && !startCommand && buildCommand\n ? await detectStaticOutput(cwd, packageJson)\n : undefined;\n if (staticOutput) {\n notes.push(\n `No start script found; the site is served from ${staticOutput}/ with single-page app fallback.`\n );\n return {\n preset: 'static',\n packageManager,\n nodeVersion,\n installCommand: commands.install,\n buildCommand,\n outputDirectory: staticOutput,\n notes,\n };\n }\n\n if (!startCommand) {\n notes.push(\n 'No `start` script or Procfile found; the container runs `npm start`. Pass --start-command to override.'\n );\n }\n\n return {\n preset: isModelence ? 'modelence' : 'node',\n packageManager,\n nodeVersion,\n installCommand: commands.install,\n buildCommand,\n startCommand,\n notes,\n };\n}\n\n// Output directory of the common static-site toolchains, or undefined when\n// the project doesn't look like one.\nasync function detectStaticOutput(\n cwd: string,\n packageJson: Record<string, unknown>\n): Promise<string | undefined> {\n const deps = {\n ...((packageJson.dependencies ?? {}) as Record<string, string>),\n ...((packageJson.devDependencies ?? {}) as Record<string, string>),\n };\n const hasViteConfig =\n (await exists(join(cwd, 'vite.config.ts'))) ||\n (await exists(join(cwd, 'vite.config.js'))) ||\n (await exists(join(cwd, 'vite.config.mts')));\n if (deps.vite || hasViteConfig) {\n return 'dist';\n }\n if (deps['react-scripts']) {\n return 'build';\n }\n if (deps['@angular/cli']) {\n return 'dist';\n }\n if (deps.astro) {\n return 'dist';\n }\n // A root index.html with a build script is the Vite/Parcel convention.\n if (await exists(join(cwd, 'index.html'))) {\n return 'dist';\n }\n return undefined;\n}\n","import { createWriteStream, promises as fs } from 'fs';\nimport { join, relative, sep } from 'path';\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport archiver from 'archiver';\n\nconst execFileAsync = promisify(execFile);\n\n/*\n Packs the project's source tree for a remote build. Inside a git repository\n the file list is git's own (tracked + untracked, minus ignored), so the\n upload matches what a push would carry. Outside git a plain walk is used\n with a fixed exclusion list.\n\n Credentials and build output are never uploaded regardless.\n*/\n\nexport const MAX_SOURCE_BYTES = 200 * 1024 * 1024;\n\nconst ALWAYS_EXCLUDED_DIRS = [\n '.git',\n 'node_modules',\n '.modelence/build',\n '.modelence/tmp',\n '.modelence/cache',\n];\nconst ALWAYS_EXCLUDED_FILES = [/^\\.modelence(\\.[^/]+)?\\.env$/];\n\nfunction toPosix(path: string): string {\n return path.split(sep).join('/');\n}\n\nexport function isExcludedPath(relativePath: string): boolean {\n const path = toPosix(relativePath);\n const segments = path.split('/');\n for (const dir of ALWAYS_EXCLUDED_DIRS) {\n const dirSegments = dir.split('/');\n // Excluded at any depth for single names (node_modules), at the root for\n // nested ones (.modelence/build).\n if (dirSegments.length === 1) {\n if (segments.slice(0, -1).includes(dir)) {\n return true;\n }\n } else if (path === dir || path.startsWith(`${dir}/`)) {\n return true;\n }\n }\n const fileName = segments[segments.length - 1];\n return ALWAYS_EXCLUDED_FILES.some((pattern) => pattern.test(fileName));\n}\n\nasync function isGitRepository(cwd: string): Promise<boolean> {\n try {\n const { stdout } = await execFileAsync('git', ['rev-parse', '--is-inside-work-tree'], { cwd });\n return stdout.trim() === 'true';\n } catch {\n return false;\n }\n}\n\nasync function listGitFiles(cwd: string): Promise<string[]> {\n const { stdout } = await execFileAsync(\n 'git',\n ['ls-files', '--cached', '--others', '--exclude-standard', '-z'],\n { cwd, maxBuffer: 64 * 1024 * 1024 }\n );\n return stdout.split('\\0').filter((entry) => entry.length > 0);\n}\n\nasync function walk(cwd: string, dir = ''): Promise<string[]> {\n const entries = await fs.readdir(join(cwd, dir), { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const path = dir ? `${dir}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n if (!isExcludedPath(`${path}/x`)) {\n files.push(...(await walk(cwd, path)));\n }\n } else if (entry.isFile()) {\n files.push(path);\n }\n }\n return files;\n}\n\nexport async function listSourceFiles(\n cwd = process.cwd()\n): Promise<{ files: string[]; usedGit: boolean }> {\n const usedGit = await isGitRepository(cwd);\n const candidates = usedGit ? await listGitFiles(cwd) : await walk(cwd);\n\n const files: string[] = [];\n for (const file of candidates) {\n if (isExcludedPath(file)) {\n continue;\n }\n // git ls-files still lists tracked files deleted from the working tree.\n try {\n const stat = await fs.stat(join(cwd, file));\n if (stat.isFile()) {\n files.push(file);\n }\n } catch {\n // Gone from disk — nothing to upload.\n }\n }\n return { files: files.sort(), usedGit };\n}\n\nexport async function packSource(\n cwd: string,\n zipPath: string\n): Promise<{ fileCount: number; sizeBytes: number; usedGit: boolean }> {\n const { files, usedGit } = await listSourceFiles(cwd);\n if (files.length === 0) {\n throw new Error('No files to upload');\n }\n\n await fs.mkdir(join(zipPath, '..'), { recursive: true });\n await fs.rm(zipPath, { force: true });\n\n const output = createWriteStream(zipPath);\n const archive = archiver('zip', { zlib: { level: 6 } });\n const done = new Promise<void>((resolve, reject) => {\n output.on('close', resolve);\n output.on('error', reject);\n archive.on('error', reject);\n });\n archive.pipe(output);\n for (const file of files) {\n archive.file(join(cwd, file), { name: toPosix(relative('', file)) });\n }\n await archive.finalize();\n await done;\n\n const { size } = await fs.stat(zipPath);\n if (size > MAX_SOURCE_BYTES) {\n await fs.rm(zipPath, { force: true });\n throw new Error(\n `Source is ${(size / 1024 / 1024).toFixed(0)} MB compressed; the limit is ${MAX_SOURCE_BYTES / 1024 / 1024} MB. ` +\n 'Add build output and large assets to .gitignore.'\n );\n }\n\n return { fileCount: files.length, sizeBytes: size, usedGit };\n}\n","/*\n Thin JSON client for Studio's CLI routes. Errors carry the HTTP status so\n callers can tell an expired token (401) from everything else.\n*/\n\nexport class StudioApiError extends Error {\n constructor(\n message: string,\n public readonly status: number\n ) {\n super(message);\n this.name = 'StudioApiError';\n }\n}\n\nexport async function studioRequest<T>(\n host: string,\n path: string,\n {\n method = 'GET',\n token,\n body,\n query,\n }: {\n method?: 'GET' | 'POST';\n token?: string;\n body?: unknown;\n query?: Record<string, string | number>;\n } = {}\n): Promise<T> {\n const url = new URL(path, host);\n for (const [key, value] of Object.entries(query ?? {})) {\n url.searchParams.set(key, String(value));\n }\n\n const headers: Record<string, string> = {};\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json';\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let message = text || response.statusText;\n try {\n const parsed = JSON.parse(text);\n message = parsed.error || parsed.message || message;\n } catch {\n // Plain-text error body.\n }\n throw new StudioApiError(message, response.status);\n }\n\n return (await response.json()) as T;\n}\n","import { createWriteStream, promises as fs } from 'fs';\nimport { join } from 'path';\nimport { parse as parseDotenv } from 'dotenv';\nimport archiver from 'archiver';\nimport { authenticateCli, type CliAuthTarget } from './auth';\nimport { clearCachedToken, readCachedToken, writeCachedToken } from './authCache';\nimport { detectBuildPlan } from './detect';\nimport { loadEnv, getProjectPath } from './config';\nimport { readProject, updateProject, type DeployTarget } from './project';\nimport { packSource } from './source';\nimport { StudioApiError, studioRequest } from './studioApi';\nimport { build } from './build';\n\n/*\n `modelence deploy`: ship the current directory to a Modelence Cloud\n environment.\n\n Default path — any Node.js app: the source tree is uploaded and built\n remotely (install → build → start commands detected here, overridable with\n flags, stored on the environment). `--prebuilt` keeps the historical\n Modelence path: build locally, upload .modelence/build.\n\n Target: -a/-e flags → --env with the app recorded in project.json → the\n deploy target recorded in project.json → the browser picker. Auth: the\n MODELENCE_TOKEN variable → the cached token → the browser.\n*/\n\nconst DEFAULT_HOST = 'https://cloud.modelence.com';\nconst POLL_INTERVAL_MS = 3000;\nconst POLL_TIMEOUT_MS = 30 * 60 * 1000;\nconst PROVISION_TIMEOUT_MS = 10 * 60 * 1000;\n\nexport interface DeployOptions {\n app?: string;\n env?: string;\n host?: string;\n prebuilt?: boolean;\n preset?: string;\n nodeVersion?: string;\n rootDir?: string;\n installCommand?: string;\n buildCommand?: string;\n startCommand?: string;\n outputDir?: string;\n}\n\ntype CliTarget =\n | { environmentId: string }\n | { appAlias: string; envAlias: string }\n | { appId: string; envAlias: string };\n\ntype UploadKind = 'bundle' | 'source';\n\ninterface BuildPlanInput {\n preset?: string;\n nodeVersion?: string;\n rootDirectory?: string;\n installCommand?: string;\n buildCommand?: string;\n startCommand?: string;\n outputDirectory?: string;\n}\n\ninterface DeployStatus {\n status: string;\n errors: string[];\n rolloutProgress: { updatedCount: number; totalCount: number } | null;\n logs: string[];\n logCount: number;\n siteUrl: string | null;\n}\n\nexport async function deploy(options: DeployOptions) {\n const cwd = process.cwd();\n const host = await resolveHost(options.host, cwd);\n const kind: UploadKind = options.prebuilt ? 'bundle' : 'source';\n const overrides = planOverrides(options);\n const project = await readProject(cwd);\n\n // Local work first, so nothing is uploaded when it fails.\n let detected: BuildPlanInput | undefined;\n const archivePath = join(cwd, '.modelence', 'tmp', `${kind}.zip`);\n if (kind === 'bundle') {\n await loadEnv();\n await build();\n await createBundle(archivePath);\n } else {\n const plan = await detectBuildPlan(cwd);\n detected = {\n preset: plan.preset,\n nodeVersion: plan.nodeVersion,\n installCommand: plan.installCommand,\n buildCommand: plan.buildCommand,\n startCommand: plan.startCommand,\n outputDirectory: plan.outputDirectory,\n };\n printDetectedPlan({ ...detected, ...definedOnly(overrides) }, plan.notes);\n const { fileCount, sizeBytes, usedGit } = await packSource(cwd, archivePath);\n console.log(\n `Packed ${fileCount} files (${formatMb(sizeBytes)})` +\n (usedGit ? ' from git' : '; not a git repository, so only default exclusions applied')\n );\n }\n\n let target = resolveTargetFromOptions(options, project);\n let token = await resolveToken(host);\n if (!token || !target) {\n // The browser flow hands back both a token and, when picked there, the\n // target — one visit covers a fresh machine and a fresh project.\n const auth = await authenticateCli(host, { pick: 'deploy', appId: project.appId });\n token = auth.token;\n await rememberToken(host, auth.token, auth.expiresAt);\n if (auth.target) {\n target = { environmentId: auth.target.environmentId };\n await rememberTarget(auth.target);\n }\n }\n if (!target) {\n throw new Error(\n 'No deploy target selected. Run again and pick an environment in the browser, or pass --app and --env.'\n );\n }\n\n try {\n await runDeploy({ host, token, target, kind, archivePath, overrides, detected, project });\n } catch (error) {\n if (!(error instanceof StudioApiError) || error.status !== 401) {\n throw error;\n }\n // Cached token expired or was revoked: authorize once more and retry.\n await clearCachedToken(host);\n console.log('Your saved login has expired; please sign in again.');\n const auth = await authenticateCli(host, { pick: 'deploy', appId: project.appId });\n await rememberToken(host, auth.token, auth.expiresAt);\n if (auth.target) {\n target = { environmentId: auth.target.environmentId };\n await rememberTarget(auth.target);\n }\n await runDeploy({\n host,\n token: auth.token,\n target,\n kind,\n archivePath,\n overrides,\n detected,\n project,\n });\n } finally {\n await fs.rm(archivePath, { force: true });\n }\n}\n\nasync function runDeploy({\n host,\n token,\n target,\n kind,\n archivePath,\n overrides,\n detected,\n project,\n}: {\n host: string;\n token: string;\n target: CliTarget;\n kind: UploadKind;\n archivePath: string;\n overrides: BuildPlanInput;\n detected?: BuildPlanInput;\n project: Awaited<ReturnType<typeof readProject>>;\n}) {\n const upload = await studioRequest<{\n uploadUrl: string;\n bundleName: string;\n appAlias: string;\n envAlias: string;\n environmentId: string;\n }>(host, '/api/upload-bundle', { method: 'POST', token, body: { ...target, kind } });\n\n await waitForEnvironmentReady(host, token, upload.environmentId);\n\n console.log(`Uploading to ${upload.appAlias}/${upload.envAlias}...`);\n const fileBuffer = await fs.readFile(archivePath);\n const uploadResponse = await fetch(upload.uploadUrl, {\n method: 'PUT',\n body: new Uint8Array(fileBuffer),\n headers: { 'Content-Type': 'application/zip' },\n });\n if (!uploadResponse.ok) {\n throw new Error(`Failed to upload: ${uploadResponse.statusText}`);\n }\n\n const result = await studioRequest<{\n deploymentUrl: string;\n appAlias: string;\n envAlias: string;\n environmentId: string;\n buildId: string | null;\n plan?: BuildPlanInput | null;\n }>(host, '/api/deploy', {\n method: 'POST',\n token,\n body: {\n environmentId: upload.environmentId,\n bundleName: upload.bundleName,\n kind,\n plan: definedOnly(overrides),\n detected: detected ? definedOnly(detected) : undefined,\n },\n });\n\n // Whatever the target was resolved from, the next run can skip the picker.\n if (!project.deploy || project.deploy.environmentId !== result.environmentId) {\n await rememberTarget({\n environmentId: result.environmentId,\n appAlias: result.appAlias,\n envAlias: result.envAlias,\n });\n }\n\n if (result.plan) {\n reportResolvedPlan(result.plan, detected);\n }\n\n console.log(`Deployment started: ${result.deploymentUrl}`);\n if (!result.buildId) {\n // Older Studio: no status route to follow.\n return;\n }\n await followDeploy(host, token, result.environmentId, result.buildId);\n}\n\n// An environment created moments ago in the browser is still provisioning\n// its database and telemetry; deploys are refused until it is ready.\nasync function waitForEnvironmentReady(host: string, token: string, environmentId: string) {\n const deadline = Date.now() + PROVISION_TIMEOUT_MS;\n let announced = false;\n while (Date.now() < deadline) {\n let status: string;\n try {\n ({ status } = await studioRequest<{ status: string }>(host, '/api/environment/status', {\n token,\n query: { environmentId },\n }));\n } catch (error) {\n if (error instanceof StudioApiError && error.status === 404) {\n // Older Studio without the route: let /api/deploy decide.\n return;\n }\n throw error;\n }\n if (status === 'ready') {\n return;\n }\n if (status === 'failed') {\n throw new Error('The environment failed to provision; check it in the dashboard.');\n }\n if (!announced) {\n console.log('Waiting for the environment to finish provisioning...');\n announced = true;\n }\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n throw new Error('Timed out waiting for the environment to be ready.');\n}\n\n// Prints phase transitions and streams build log lines until the deploy\n// settles. Exit code reflects the outcome so CI and agents can act on it.\nasync function followDeploy(host: string, token: string, environmentId: string, buildId: string) {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n let lastStatus = '';\n let logOffset = 0;\n\n while (Date.now() < deadline) {\n const status = await studioRequest<DeployStatus>(host, '/api/deploy/status', {\n token,\n query: { environmentId, buildId, logOffset },\n });\n\n for (const line of status.logs) {\n process.stdout.write(` │ ${line.replace(/\\n$/, '')}\\n`);\n }\n logOffset = status.logCount;\n\n if (status.status !== lastStatus) {\n lastStatus = status.status;\n const message = describeStatus(status);\n if (message) {\n console.log(message);\n }\n }\n\n if (status.status === 'deploy-completed') {\n if (status.siteUrl) {\n console.log(`Live at ${status.siteUrl}`);\n }\n return;\n }\n if (status.status === 'build-failed' || status.status === 'deploy-failed') {\n for (const error of status.errors) {\n console.error(` ${error}`);\n }\n process.exitCode = 1;\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n console.error('Timed out waiting for the deployment; check the dashboard for its status.');\n process.exitCode = 1;\n}\n\nfunction describeStatus(status: DeployStatus): string | null {\n switch (status.status) {\n case 'build-pending':\n return 'Building image...';\n case 'deploy-pending':\n case 'deploying':\n return 'Image built. Deploying containers...';\n case 'rolling-out':\n return 'Rolling out new containers...';\n case 'deploy-completed':\n return 'Deployed successfully.';\n case 'build-failed':\n return 'Build failed.';\n case 'deploy-failed':\n return 'Deployment failed.';\n default:\n return null;\n }\n}\n\nfunction resolveTargetFromOptions(\n options: DeployOptions,\n project: Awaited<ReturnType<typeof readProject>>\n): CliTarget | null {\n if (options.app && options.env) {\n return { appAlias: options.app, envAlias: options.env };\n }\n if (options.env && project.deploy?.appAlias) {\n return { appAlias: project.deploy.appAlias, envAlias: options.env };\n }\n if (options.env && project.appId) {\n return { appId: project.appId, envAlias: options.env };\n }\n if (options.app || options.env) {\n throw new Error('Pass both --app and --env, or neither to pick the target in the browser.');\n }\n if (project.deploy?.environmentId) {\n return { environmentId: project.deploy.environmentId };\n }\n return null;\n}\n\nasync function resolveToken(host: string): Promise<string | null> {\n if (process.env.MODELENCE_TOKEN) {\n return process.env.MODELENCE_TOKEN;\n }\n return await readCachedToken(host);\n}\n\nasync function rememberToken(host: string, token: string, expiresAt?: string) {\n if (!expiresAt) {\n // Older Studio: the token lasts an hour, not worth caching.\n return;\n }\n try {\n await writeCachedToken(host, token, expiresAt);\n } catch (error) {\n console.warn('Could not save the login for next time:', error);\n }\n}\n\nasync function rememberTarget(target: CliAuthTarget | DeployTarget) {\n const deploy: DeployTarget = {\n environmentId: target.environmentId,\n appAlias: target.appAlias,\n envAlias: target.envAlias,\n };\n try {\n await updateProject({ deploy, ...('appId' in target ? { appId: target.appId } : {}) });\n } catch (error) {\n console.warn('Could not record the deploy target in .modelence/project.json:', error);\n }\n}\n\n// The Studio host: flag → environment → the project's .modelence.env → default.\n// Read directly rather than through loadEnv(), which requires a\n// modelence.config.ts that plain Node.js projects don't have.\nasync function resolveHost(flag: string | undefined, cwd: string): Promise<string> {\n if (flag) {\n return flag.replace(/\\/$/, '');\n }\n if (process.env.MODELENCE_SERVICE_ENDPOINT) {\n return process.env.MODELENCE_SERVICE_ENDPOINT.replace(/\\/$/, '');\n }\n try {\n const env = parseDotenv(await fs.readFile(join(cwd, '.modelence.env'), 'utf8'));\n if (env.MODELENCE_SERVICE_ENDPOINT) {\n return env.MODELENCE_SERVICE_ENDPOINT.replace(/\\/$/, '');\n }\n } catch {\n // No .modelence.env — plain Node.js projects usually have none.\n }\n return DEFAULT_HOST;\n}\n\nfunction planOverrides(options: DeployOptions): BuildPlanInput {\n return {\n preset: options.preset,\n nodeVersion: options.nodeVersion,\n rootDirectory: options.rootDir,\n installCommand: options.installCommand,\n buildCommand: options.buildCommand,\n startCommand: options.startCommand,\n outputDirectory: options.outputDir,\n };\n}\n\nfunction definedOnly<T extends object>(value: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined)\n ) as Partial<T>;\n}\n\nfunction printDetectedPlan(plan: BuildPlanInput, notes: string[]) {\n console.log('Build plan:');\n console.log(` preset: ${plan.preset ?? 'node'}`);\n console.log(` node: ${plan.nodeVersion ?? 'default (22)'}`);\n if (plan.rootDirectory) {\n console.log(` root: ${plan.rootDirectory}`);\n }\n console.log(` install: ${plan.installCommand ?? 'default'}`);\n console.log(` build: ${plan.buildCommand || '(none)'}`);\n if (plan.preset === 'static') {\n console.log(` serve: ${plan.outputDirectory ?? 'dist'}/ (static site)`);\n } else {\n console.log(` start: ${plan.startCommand ?? 'npm start'}`);\n }\n for (const note of notes) {\n console.log(` note: ${note}`);\n }\n}\n\n// Stored environment settings can override what was detected here; say so,\n// since the difference is otherwise only visible in the dashboard.\nfunction reportResolvedPlan(used: BuildPlanInput, detected?: BuildPlanInput) {\n if (!detected) {\n return;\n }\n const differences: string[] = [];\n if (used.preset && detected.preset && used.preset !== detected.preset) {\n differences.push(`preset ${used.preset} (detected ${detected.preset})`);\n }\n for (const field of ['installCommand', 'buildCommand', 'startCommand'] as const) {\n const detectedValue = detected[field];\n if (detectedValue !== undefined && used[field] !== undefined && used[field] !== detectedValue) {\n differences.push(\n `${field.replace('Command', '')} \"${used[field]}\" (detected \"${detectedValue}\")`\n );\n }\n }\n if (differences.length > 0) {\n console.log(\"Using the environment's Build & Deploy settings: \" + differences.join(', '));\n console.log('Edit them in the dashboard, or pass --preset/--*-command to change them.');\n }\n}\n\nfunction formatMb(bytes: number): string {\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\n// The historical --prebuilt bundle: build output plus the manifests the\n// container needs to install production dependencies.\nasync function createBundle(bundlePath: string) {\n await fs.rm(bundlePath, { force: true });\n console.log('Creating deployment bundle...');\n await fs.mkdir(join(bundlePath, '..'), { recursive: true });\n\n const output = createWriteStream(bundlePath);\n const archive = archiver('zip', { zlib: { level: 9 } });\n const archiveComplete = new Promise<void>((resolve, reject) => {\n output.on('close', resolve);\n output.on('error', reject);\n archive.on('error', reject);\n });\n archive.pipe(output);\n\n const bundleFiles = [\n 'package.json',\n 'package-lock.json',\n 'next.config.js',\n 'next.config.ts',\n 'modelence.config.ts',\n ];\n const bundleDirs = ['public', 'server', 'scripts', join('.modelence', 'build'), '.next'];\n\n for (const file of bundleFiles) {\n if (await pathExists(getProjectPath(file))) {\n archive.file(getProjectPath(file), { name: file });\n }\n }\n for (const dir of bundleDirs) {\n if (await pathExists(getProjectPath(dir))) {\n archive.directory(getProjectPath(dir), dir);\n }\n }\n\n await archive.finalize();\n await archiveComplete;\n\n const stats = await fs.stat(bundlePath);\n console.log(`Deployment bundle created (${formatMb(stats.size)})`);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n","import { getServerPath } from './config';\nimport { execSync } from 'child_process';\nimport path from 'path';\n\nexport function dev(options: { takeover?: boolean } = {}) {\n console.log('Starting Modelence dev server...');\n\n const serverPath = getServerPath();\n const tsxPath = path.resolve('./node_modules/.bin/tsx');\n\n execSync(`\"${tsxPath}\" watch --ignore \"vite.config.ts.timestamp-*\" \"${serverPath}\"`, {\n stdio: 'inherit',\n cwd: process.cwd(),\n env: {\n ...process.env,\n NODE_ENV: 'development',\n ...(options.takeover ? { MODELENCE_TAKEOVER: '1' } : {}),\n },\n });\n}\n","import { getBuildPath, getServerPath } from './config';\nimport { execSync } from 'child_process';\nimport path from 'path';\n\nexport function start() {\n console.log('Starting Modelence production server...');\n\n const serverPath = getServerPath();\n const serverFilename = path.basename(serverPath, path.extname(serverPath));\n const builtServerPath = getBuildPath(`${serverFilename}.mjs`);\n\n execSync(`node \"${builtServerPath}\"`, {\n stdio: 'inherit',\n cwd: process.cwd(),\n env: { ...process.env, NODE_ENV: 'production' },\n });\n}\n","import { clearCachedToken, getAuthCachePath } from './authCache';\n\n// Forgets the saved deploy login (all hosts, or one with --host).\nexport async function logout(options: { host?: string }) {\n await clearCachedToken(options.host);\n console.log(\n options.host\n ? `Removed the saved login for ${options.host}.`\n : `Removed saved logins (${getAuthCachePath()}).`\n );\n}\n","#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { setup } from './setup';\nimport { build } from './build';\nimport { deploy } from './deploy';\nimport { dev } from './dev';\nimport { start } from './start';\nimport { logout } from './logout';\nimport { loadEnv } from './config';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));\n\nconst program = new Command()\n .name('modelence')\n .description('Modelence CLI tool')\n .version(packageJson.version);\n\nprogram\n .command('setup')\n .description('Setup Modelence environment variables')\n .option('-t, --token <token>', 'Modelence setup token (omit to authorize in the browser)')\n .option('-h, --host <host>', 'Modelence host', 'https://cloud.modelence.com')\n .action(async (options) => {\n await setup(options);\n });\n\nprogram\n .command('build')\n .description('Build the application')\n .action(async () => {\n await loadEnv();\n await build();\n });\n\nprogram\n .command('deploy')\n .description(\n 'Deploy the current directory to Modelence Cloud (any Node.js app; picks the target in the browser on first run)'\n )\n .option('-a, --app <app>', 'Application alias')\n .option('-e, --env <env>', 'Environment alias')\n .option('-h, --host <host>', 'Modelence host')\n .option(\n '--prebuilt',\n 'Build locally and upload the .modelence/build bundle (Modelence apps only)'\n )\n .option('--preset <preset>', 'Build preset: node, static or modelence (default: detected)')\n .option('--node-version <version>', 'Node.js version for the container, e.g. 22')\n .option('--root-dir <path>', 'Subdirectory containing the app (monorepos)')\n .option('--install-command <command>', 'Override the detected install command')\n .option('--build-command <command>', 'Override the detected build command (\"\" to skip)')\n .option('--start-command <command>', 'Override the detected start command')\n .option('--output-dir <path>', 'Static sites: directory the build writes, e.g. dist')\n .action(async (options) => {\n try {\n await deploy(options);\n } catch (error) {\n console.error(`Deploy failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n });\n\nprogram\n .command('logout')\n .description('Forget the saved Modelence Cloud login')\n .option('-h, --host <host>', 'Only forget the login for this host')\n .action(async (options) => {\n await logout(options);\n });\n\nprogram\n .command('dev')\n .description('Start development server')\n .option(\n '--takeover',\n 'Disconnect any instance currently holding the environment and connect this one'\n )\n .action(async (options) => {\n await loadEnv();\n dev(options);\n });\n\nprogram\n .command('start')\n .description('Start production server')\n .action(async () => {\n await loadEnv();\n start();\n });\n\nprogram.parse(process.argv);\n"]}