modelence 0.26.0-nd.dev.1 → 0.26.0-nd.dev.10

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","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","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' | '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 }>(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 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\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"]}
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/source.ts","../../src/bin/appSpec.ts","../../src/bin/appRoot.ts","../../src/bin/deploySpec.ts","../../src/bin/deployTarget.ts","../../src/bin/studioApi.ts","../../src/bin/deploySession.ts","../../src/bin/deployStatus.ts","../../src/bin/deployUpload.ts","../../src/bin/deploy.ts","../../src/bin/dev.ts","../../src/bin/start.ts","../../src/bin/logout.ts","../../src/bin/init.ts","../../src/bin/modelence.ts"],"names":["authenticateCli","host","pick","purpose","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","listCachedTokens","entryHost","writeCachedToken","current","clearCachedToken","_removed","rest","execFileAsync","promisify","execFile","MAX_SOURCE_BYTES","ALWAYS_EXCLUDED_DIRS","ALWAYS_EXCLUDED_FILES","isLocalEnvFile","name","hasRegistryCredentials","line","credentialsInUrl","match","toPosix","sep","isExcludedPath","relativePath","segments","dir","fileName","pattern","isGitRepository","stdout","listGitFiles","entry","walk","entries","files","listSourceFiles","usedGit","candidates","excludedFiles","file","packSource","zipPath","output","createWriteStream","archive","archiver","done","reject","relative","size","APP_SPEC_FILE_NAME","SETUP_DOCS_URL","AGENT_SETUP_PROMPT","getAppSpecFilePath","readAppSpecFile","errors","parseJsonc","describeParseError","before","column","printParseErrorCode","writeAppSpecFile","spec","formatAppSpec","lines","formatCommand","mount","command","resolveAppRoot","root","isAbsolute","archiveRoot","candidate","isInside","appRoot","base","rel","KNOWN_TOP_LEVEL_KEYS","prepareSpec","missingSpecMessage","assertKnownKeys","unknown","section","resolveTargetFromOptions","project","StudioApiError","message","status","studioRequest","method","body","query","text","DEFAULT_HOST","isUnauthorized","resolveToken","rememberToken","rememberTarget","deploy","resolveHost","flag","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","PROVISION_TIMEOUT_MS","waitForEnvironmentReady","environmentId","deadline","announced","followDeploy","session","signInAgain","buildId","lastStatus","lastMessage","logOffset","signedInAgain","describeStatus","runDeploy","kind","archivePath","requestUpload","upload","openAsBlob","uploadResponse","describeUploadFailure","detail","createBundle","fileCount","sizeBytes","formatMb","started","bytes","bundlePath","archiveComplete","bundleFiles","bundleDirs","pathExists","stats","dev","serverPath","tsxPath","start","serverFilename","builtServerPath","logout","revokeToken","DEFAULT_SCHEMA_HOST","init","exists","template","__filename","fileURLToPath","__dirname","packageJson","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 `purpose: 'deploy'` asks for a deploy-lifetime token (30 days) without a\n picker — for a deploy whose target is already known from flags or\n .modelence/project.json. `pick: 'deploy'` implies it.\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 purpose,\n pickEnvironment = false,\n appId,\n }: {\n pick?: CliAuthPick;\n purpose?: 'deploy';\n pickEnvironment?: boolean;\n appId?: string;\n } = {}\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 (purpose) {\n url.searchParams.set('purpose', purpose);\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// Only the two keys this function touches are typed; the rest of the user's\n// settings are passed through untouched.\ntype ClaudeSettings = {\n extraKnownMarketplaces?: Record<string, unknown>;\n enabledPlugins?: Record<string, boolean>;\n [key: string]: unknown;\n};\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: ClaudeSettings = {};\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 changes 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\n// Every saved login, expired ones included, so logout can revoke them all\n// server-side; one host's entry when a host is given.\nexport async function listCachedTokens(host?: string): Promise<{ host: string; token: string }[]> {\n const { hosts = {} } = await readAuthFile();\n return Object.entries(hosts)\n .filter(([entryHost, cached]) => (!host || entryHost === host) && Boolean(cached?.token))\n .map(([entryHost, cached]) => ({ host: entryHost, token: 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 { 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 Local environment files and package-manager credentials are excluded even\n outside Git. Example environment files and placeholder-based registry\n configuration can be committed and uploaded.\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 isLocalEnvFile(name: string): boolean {\n return /^\\.env(?:\\.|$)/.test(name) && !/\\.(example|sample|template)$/.test(name);\n}\n\n// Preserve registry URLs and ${TOKEN} references, but never upload literal\n// authentication values from a developer's npm or Yarn configuration.\nexport function hasRegistryCredentials(content: string): boolean {\n return content.split(/\\r?\\n/).some((line) => {\n if (/^\\s*[#;]/.test(line)) return false;\n const credentialsInUrl = /https?:\\/\\/([^/\\s]+)@/.exec(line)?.[1];\n if (\n credentialsInUrl &&\n credentialsInUrl.replace(/\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}/g, '').replace(/:/g, '') !== ''\n ) {\n return true;\n }\n const match =\n /^\\s*[^=]*?(?:_authToken|_auth|_password|npmAuthToken|npmAuthIdent)[\"']?\\s*[=:]\\s*(.*?)\\s*$/i.exec(\n line\n );\n if (!match) return false;\n const value = match[1]\n .replace(/\\s+#.*$/, '')\n .replace(/^[\"']|[\"']$/g, '')\n .trim();\n return value !== '' && !/^\\$\\{[A-Za-z_][A-Za-z0-9_]*\\}$/.test(value);\n });\n}\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 (\n isLocalEnvFile(fileName) || ALWAYS_EXCLUDED_FILES.some((pattern) => pattern.test(fileName))\n );\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; excludedFiles: string[] }> {\n const usedGit = await isGitRepository(cwd);\n const candidates = usedGit ? await listGitFiles(cwd) : await walk(cwd);\n\n const files: string[] = [];\n const excludedFiles: string[] = [];\n for (const file of candidates) {\n if (isExcludedPath(file)) {\n excludedFiles.push(file);\n continue;\n }\n // git ls-files still lists tracked files deleted from the working tree.\n try {\n const stat = await fs.lstat(join(cwd, file));\n if (stat.isFile()) {\n if (\n ['.npmrc', '.yarnrc.yml', '.yarnrc'].includes(file.split('/').at(-1) ?? '') &&\n hasRegistryCredentials(await fs.readFile(join(cwd, file), 'utf8'))\n ) {\n excludedFiles.push(file);\n continue;\n }\n files.push(file);\n }\n } catch {\n // Gone from disk — nothing to upload.\n }\n }\n return { files: files.sort(), usedGit, excludedFiles: excludedFiles.sort() };\n}\n\nexport async function packSource(\n cwd: string,\n zipPath: string\n): Promise<{ fileCount: number; sizeBytes: number; usedGit: boolean; excludedFiles: string[] }> {\n const { files, usedGit, excludedFiles } = 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, excludedFiles };\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { parse as parseJsonc, printParseErrorCode, type ParseError } from 'jsonc-parser';\n\n/*\n modelence.json — how the project is built and run on Modelence Cloud. The\n CLI reads it as-is and sends it to Studio, which validates it against the\n schema published at /schema/modelence.json and fills in the defaults of\n the chosen runtime. The types here mirror that schema; the server is the\n authority.\n\n For build.command and web.start: a missing key inherits the runtime\n default, null means \"none\" (no build step / no process), and an empty\n string is invalid.\n*/\n\nexport const APP_SPEC_FILE_NAME = 'modelence.json';\n\n// The file is written by the user's coding agent from the hosted setup\n// guide; Mintlify serves the same page raw at the .md URL for agents.\nexport const SETUP_DOCS_URL = 'https://docs.modelence.com/deploy/setup';\nexport const AGENT_SETUP_PROMPT = `Use ${SETUP_DOCS_URL}.md to set up Modelence deployment for this project`;\n\nexport type AppRuntime = 'node' | 'modelence';\n\nexport interface StaticMount {\n path: string;\n dir: string;\n}\n\nexport interface AppSpec {\n $schema?: string;\n runtime?: AppRuntime;\n build?: {\n node?: string;\n root?: string;\n install?: string;\n command?: string | null;\n env?: Record<string, string>;\n };\n web?: {\n start?: string | null;\n static?: StaticMount[];\n };\n}\n\nexport function getAppSpecFilePath(cwd = process.cwd()): string {\n return join(cwd, APP_SPEC_FILE_NAME);\n}\n\n// The file's content, or null when there is none. Comments and trailing\n// commas are accepted (JSONC) since the file is hand-written and annotated;\n// anything else malformed is an error, because silently ignoring it would\n// deploy something else.\nexport async function readAppSpecFile(cwd = process.cwd()): Promise<AppSpec | null> {\n let content: string;\n try {\n content = await fs.readFile(getAppSpecFilePath(cwd), 'utf8');\n } catch {\n return null;\n }\n const errors: ParseError[] = [];\n const parsed: unknown = parseJsonc(content, errors, {\n allowTrailingComma: true,\n disallowComments: false,\n });\n if (errors.length > 0) {\n throw new Error(\n `${APP_SPEC_FILE_NAME} is not valid JSON: ${describeParseError(content, errors[0])}`\n );\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(`${APP_SPEC_FILE_NAME} must contain a JSON object`);\n }\n return parsed as AppSpec;\n}\n\nfunction describeParseError(content: string, error: ParseError): string {\n const before = content.slice(0, error.offset);\n const line = before.split('\\n').length;\n const column = error.offset - before.lastIndexOf('\\n');\n return `${printParseErrorCode(error.error)} at line ${line}, column ${column}`;\n}\n\nexport async function writeAppSpecFile(spec: AppSpec, cwd = process.cwd()): Promise<void> {\n await fs.writeFile(getAppSpecFilePath(cwd), JSON.stringify(spec, null, 2) + '\\n');\n}\n\nexport function formatAppSpec(spec: AppSpec): string[] {\n const lines: string[] = [];\n lines.push(` runtime: ${spec.runtime ?? 'node'}`);\n lines.push(` node: ${spec.build?.node ?? 'default (22)'}`);\n if (spec.build?.root && spec.build.root !== '.') {\n lines.push(` root: ${spec.build.root}`);\n }\n lines.push(` install: ${spec.build?.install ?? 'default'}`);\n lines.push(` build: ${formatCommand(spec.build?.command)}`);\n for (const [key, value] of Object.entries(spec.build?.env ?? {})) {\n lines.push(` env: ${key}=${value}`);\n }\n lines.push(` start: ${formatCommand(spec.web?.start)}`);\n for (const mount of spec.web?.static ?? []) {\n lines.push(` static: ${mount.path} -> ${mount.dir}/`);\n }\n return lines;\n}\n\n// A missing command is filled in by the runtime's default on the server;\n// null is the user saying there is none.\nfunction formatCommand(command: string | null | undefined): string {\n if (command === undefined) {\n return 'default';\n }\n if (command === null || command === '') {\n return '(none)';\n }\n return command;\n}\n","import { promises as fs } from 'fs';\nimport { isAbsolute, relative, resolve, sep } from 'path';\n\n// The archive remains rooted at cwd; build.root only picks the directory\n// Studio runs the commands in. It has to exist and stay inside the upload,\n// symlinks included, or the build would run against files that were never\n// sent.\nexport async function resolveAppRoot(cwd: string, root = '.'): Promise<string> {\n if (typeof root !== 'string' || isAbsolute(root)) {\n throw new Error('build.root must be a relative directory inside the project.');\n }\n const archiveRoot = await fs.realpath(cwd);\n const candidate = resolve(archiveRoot, root);\n if (!isInside(archiveRoot, candidate)) {\n throw new Error('build.root must stay inside the project.');\n }\n let appRoot: string;\n try {\n appRoot = await fs.realpath(candidate);\n } catch {\n throw new Error(`build.root \"${root}\" does not exist.`);\n }\n if (!isInside(archiveRoot, appRoot) || !(await fs.stat(appRoot)).isDirectory()) {\n throw new Error('build.root must be a directory inside the project.');\n }\n return appRoot;\n}\n\nfunction isInside(base: string, path: string): boolean {\n const rel = relative(base, path);\n return rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel);\n}\n","import {\n AGENT_SETUP_PROMPT,\n APP_SPEC_FILE_NAME,\n SETUP_DOCS_URL,\n formatAppSpec,\n readAppSpecFile,\n type AppSpec,\n type StaticMount,\n} from './appSpec';\nimport { resolveAppRoot } from './appRoot';\n\n/*\n modelence.json is the whole contract between a project and Modelence\n Cloud: the CLI reads it, checks what only the local file system can tell\n (the file exists, build.root is a real directory in the upload) and sends\n it on. Studio validates it against the schema and fills in the runtime's\n defaults; nothing is inferred here.\n*/\n\nconst KNOWN_TOP_LEVEL_KEYS = ['$schema', 'runtime', 'build', 'web'];\n\n// Reads and checks modelence.json, prints the plan and returns the file's\n// content for the deploy request. Throws when there is no file.\nexport async function prepareSpec(cwd: string): Promise<AppSpec> {\n const spec = await readAppSpecFile(cwd);\n if (!spec) {\n throw new Error(missingSpecMessage(cwd));\n }\n assertKnownKeys(spec);\n if (spec.build?.root !== undefined) {\n await resolveAppRoot(cwd, spec.build.root);\n }\n\n console.log(`Build plan (${APP_SPEC_FILE_NAME}):`);\n for (const line of formatAppSpec(spec)) {\n console.log(line);\n }\n return spec;\n}\n\nexport function missingSpecMessage(cwd: string): string {\n return [\n `${APP_SPEC_FILE_NAME} not found in ${cwd}.`,\n 'Modelence Cloud builds and runs your app exactly as this file describes (install, build and start commands, Node.js version, static directories).',\n 'Ask your coding agent to create it with this prompt:',\n '',\n ` ${AGENT_SETUP_PROMPT}`,\n '',\n `Reference: ${SETUP_DOCS_URL}`,\n ].join('\\n');\n}\n\n// A typo at the top level (say \"builds\") would otherwise be dropped by the\n// server's schema check with a less specific message, or worse, ignored.\nfunction assertKnownKeys(spec: AppSpec): void {\n const unknown = Object.keys(spec).filter((key) => !KNOWN_TOP_LEVEL_KEYS.includes(key));\n if (unknown.length > 0) {\n throw new Error(\n `${APP_SPEC_FILE_NAME} has unknown key \"${unknown[0]}\" (allowed: ${KNOWN_TOP_LEVEL_KEYS.join(', ')}).`\n );\n }\n for (const section of ['build', 'web'] as const) {\n const value = spec[section];\n if (value !== undefined && (!value || typeof value !== 'object' || Array.isArray(value))) {\n throw new Error(`${APP_SPEC_FILE_NAME}: \"${section}\" must be an object.`);\n }\n }\n}\n\n// A resolved spec as the server reports it: every key present, with '' for\n// no build step and null for no web process.\nexport interface ResolvedSpec {\n runtime: string;\n build: { node: string; root: string; install: string; command: string };\n web: { start: string | null; static: StaticMount[] };\n}\n","import type { DeployOptions } from './deploy';\nimport type { ProjectFile } from './project';\n\nexport type CliTarget =\n | { environmentId: string }\n | { appAlias: string; envAlias: string }\n | { appId: string; envAlias: string };\n\nexport function resolveTargetFromOptions(\n options: DeployOptions,\n project: ProjectFile\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","/*\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 { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { parse as parseDotenv } from 'dotenv';\nimport { readCachedToken, writeCachedToken } from './authCache';\nimport type { CliAuthTarget } from './auth';\nimport { updateProject, type DeployTarget } from './project';\nimport { StudioApiError } from './studioApi';\n\nconst DEFAULT_HOST = 'https://cloud.modelence.com';\n\n// The token in use, shared so a re-authorization mid-deploy reaches every\n// later request without threading a new value through each call.\nexport interface Session {\n host: string;\n token: string;\n}\n\nexport function isUnauthorized(error: unknown): boolean {\n return error instanceof StudioApiError && error.status === 401;\n}\n\nexport async 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\nexport async 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\nexport async 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.\nexport async 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","import { StudioApiError, studioRequest } from './studioApi';\nimport { isUnauthorized, type Session } from './deploySession';\n\nconst POLL_INTERVAL_MS = 3000;\nconst POLL_TIMEOUT_MS = 30 * 60 * 1000;\nconst PROVISION_TIMEOUT_MS = 10 * 60 * 1000;\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 // Last output of the containers a failed rollout tried to start.\n containerLogs?: string[];\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.\n// Returns whether it actually had to wait, so the caller can refresh an\n// upload URL that may have been signed before a long provision.\nexport async function waitForEnvironmentReady(\n host: string,\n token: string,\n environmentId: string\n): Promise<boolean> {\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 false;\n }\n throw error;\n }\n if (status === 'ready') {\n return announced;\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.\nexport async function followDeploy(\n session: Session,\n signInAgain: () => Promise<void>,\n environmentId: string,\n buildId: string\n) {\n const deadline = Date.now() + POLL_TIMEOUT_MS;\n let lastStatus = '';\n let lastMessage = '';\n let logOffset = 0;\n let signedInAgain = false;\n\n while (Date.now() < deadline) {\n let status: DeployStatus;\n try {\n status = await studioRequest<DeployStatus>(session.host, '/api/deploy/status', {\n token: session.token,\n query: { environmentId, buildId, logOffset },\n });\n } catch (error) {\n // A token can expire while a long rollout is being watched; the\n // build keeps going on the server, so only the watching resumes.\n if (!isUnauthorized(error) || signedInAgain) {\n throw error;\n }\n signedInAgain = true;\n await signInAgain();\n continue;\n }\n\n for (const line of status.logs) {\n process.stdout.write(` │ ${line.replace(/\\n$/, '')}\\n`);\n }\n // A poll that could not read CloudWatch reports zero lines; keeping the\n // offset avoids replaying the whole log on the next poll.\n logOffset = Math.max(logOffset, status.logCount);\n\n if (status.status !== lastStatus) {\n lastStatus = status.status;\n const message = describeStatus(status);\n // Two statuses can share a message (deploy-pending and deploying).\n if (message && message !== lastMessage) {\n lastMessage = 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 if (status.containerLogs && status.containerLogs.length > 0) {\n console.error('Container output:');\n for (const line of status.containerLogs) {\n console.error(` │ ${line.replace(/\\n$/, '')}`);\n }\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","import { openAsBlob } from 'fs';\nimport type { AppSpec } from './appSpec';\nimport type { ProjectFile } from './project';\nimport type { CliTarget } from './deployTarget';\nimport { rememberTarget, type Session } from './deploySession';\nimport type { ResolvedSpec } from './deploySpec';\nimport { waitForEnvironmentReady } from './deployStatus';\nimport { studioRequest } from './studioApi';\n\nexport type UploadKind = 'bundle' | 'source';\n\nexport interface StartedDeploy {\n environmentId: string;\n // Null from a Studio too old to have the status route.\n buildId: string | null;\n}\n\nexport async function runDeploy({\n session,\n target,\n kind,\n archivePath,\n spec,\n project,\n}: {\n session: Session;\n target: CliTarget;\n kind: UploadKind;\n archivePath: string;\n // The project's modelence.json; required by Studio for source uploads.\n spec?: AppSpec;\n project: ProjectFile;\n}): Promise<StartedDeploy> {\n const { host, token } = session;\n const requestUpload = () =>\n 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 // The first call also resolves an alias target to its environment, so it\n // has to happen before the wait.\n let upload = await requestUpload();\n\n // Provisioning can take minutes, which is long enough for the signed URL\n // to expire before the upload starts, so it is signed again afterwards.\n if (await waitForEnvironmentReady(host, token, upload.environmentId)) {\n upload = await requestUpload();\n }\n\n console.log(`Uploading to ${upload.appAlias}/${upload.envAlias}...`);\n const archive = await openAsBlob(archivePath, { type: 'application/zip' });\n const uploadResponse = await fetch(upload.uploadUrl, {\n method: 'PUT',\n body: archive,\n headers: { 'Content-Type': 'application/zip' },\n });\n if (!uploadResponse.ok) {\n throw new Error(`Failed to upload: ${await describeUploadFailure(uploadResponse)}`);\n }\n\n const result = await studioRequest<{\n deploymentUrl: string;\n appAlias: string;\n envAlias: string;\n environmentId: string;\n buildId: string | null;\n // The spec Studio resolved the file against its runtime defaults to.\n spec?: ResolvedSpec | null;\n }>(host, '/api/deploy', {\n method: 'POST',\n token,\n body: {\n environmentId: upload.environmentId,\n bundleName: upload.bundleName,\n kind,\n spec,\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 return { environmentId: result.environmentId, buildId: result.buildId };\n}\n\n// S3 reports an expired or malformed signature as a 403 with an XML body;\n// the status text alone reads like a permissions problem.\nasync function describeUploadFailure(response: Response): Promise<string> {\n const detail = await response.text().catch(() => '');\n const code = detail.match(/<Code>([^<]+)<\\/Code>/)?.[1];\n const message = detail.match(/<Message>([^<]+)<\\/Message>/)?.[1];\n const status = response.statusText || `HTTP ${response.status}`;\n if (!code) {\n return status;\n }\n return `${status} (${code}${message ? `: ${message}` : ''})`;\n}\n","import { createWriteStream, promises as fs } from 'fs';\nimport { join } from 'path';\nimport archiver from 'archiver';\nimport { authenticateCli } from './auth';\nimport { clearCachedToken } from './authCache';\nimport { loadEnv, getProjectPath } from './config';\nimport { readProject } from './project';\nimport { packSource } from './source';\nimport { build } from './build';\nimport { prepareSpec } from './deploySpec';\nimport type { AppSpec } from './appSpec';\nimport { resolveTargetFromOptions } from './deployTarget';\nimport {\n resolveHost,\n resolveToken,\n rememberToken,\n rememberTarget,\n isUnauthorized,\n type Session,\n} from './deploySession';\nimport { runDeploy, type StartedDeploy, type UploadKind } from './deployUpload';\nimport { followDeploy } from './deployStatus';\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 as the project's modelence.json describes. Studio resolves that\n file against the defaults of its runtime and nothing else; the CLI neither\n inspects nor amends anything. `--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\nexport interface DeployOptions {\n app?: string;\n env?: string;\n host?: string;\n prebuilt?: boolean;\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 project = await readProject(cwd);\n let target = resolveTargetFromOptions(options, project);\n\n // Local work first, so nothing is uploaded — and nobody is asked to sign\n // in — when it fails; a missing modelence.json stops right here.\n let spec: AppSpec | 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 spec = await prepareSpec(cwd);\n const { fileCount, sizeBytes, usedGit, excludedFiles } = 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 if (excludedFiles.length > 0) {\n console.log(\n `Excluded ${excludedFiles.length} local or generated files from the upload. Store secrets in the target environment.`\n );\n }\n }\n\n try {\n let token = await resolveToken(host);\n if (!token || !target) {\n // The browser flow hands back a token and, when the target is not known\n // yet, the environment picked there — one visit covers a fresh machine\n // and a fresh project. A target from flags or the project file is final,\n // so the page then only authorizes.\n const auth = await authenticateCli(host, {\n pick: target ? undefined : 'deploy',\n purpose: 'deploy',\n appId: project.appId,\n });\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 const session: Session = { host, token };\n // Cached token expired or was revoked: authorize once more. The deploy\n // itself is never repeated — an upload that failed authentication did not\n // start anything, and a build already running is simply followed again.\n const signInAgain = async () => {\n await clearCachedToken(host);\n console.log('Your saved login has expired; please sign in again.');\n const auth = await authenticateCli(host, {\n pick: target ? undefined : 'deploy',\n purpose: 'deploy',\n appId: project.appId,\n });\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 session.token = auth.token;\n };\n\n let started: StartedDeploy;\n try {\n started = await runDeploy({ session, target, kind, archivePath, spec, project });\n } catch (error) {\n if (!isUnauthorized(error)) {\n throw error;\n }\n await signInAgain();\n started = await runDeploy({ session, target, kind, archivePath, spec, project });\n }\n if (started.buildId) {\n await followDeploy(session, signInAgain, started.environmentId, started.buildId);\n }\n } finally {\n await fs.rm(archivePath, { force: true });\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, listCachedTokens } from './authCache';\nimport { studioRequest } from './studioApi';\n\n// Forgets the saved deploy login (all hosts, or one with --host). The token\n// is revoked on the server first so a copy of the cache file stops working\n// too; that part is best effort — offline or already-revoked, the local\n// entry still goes.\nexport async function logout(options: { host?: string }) {\n const cached = await listCachedTokens(options.host);\n await Promise.all(cached.map(({ host, token }) => revokeToken(host, token)));\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\nasync function revokeToken(host: string, token: string): Promise<void> {\n try {\n await studioRequest(host, '/api/cli/logout', { method: 'POST', token });\n } catch {\n // Unknown token (401) or no network: nothing left to revoke remotely.\n }\n}\n","import { promises as fs } from 'fs';\nimport {\n AGENT_SETUP_PROMPT,\n APP_SPEC_FILE_NAME,\n SETUP_DOCS_URL,\n getAppSpecFilePath,\n writeAppSpecFile,\n type AppSpec,\n} from './appSpec';\n\n/*\n `modelence init`: write a modelence.json template for the user's coding\n agent to fill in from the hosted setup guide. Nothing about the project is\n inspected — the file is the contract, and the agent reads the code.\n*/\n\nconst DEFAULT_SCHEMA_HOST = 'https://cloud.modelence.com';\n\nexport interface InitOptions {\n force?: boolean;\n host?: string;\n}\n\nexport async function init(options: InitOptions) {\n const cwd = process.cwd();\n const path = getAppSpecFilePath(cwd);\n if (!options.force && (await exists(path))) {\n throw new Error(`${APP_SPEC_FILE_NAME} already exists; pass --force to overwrite it.`);\n }\n\n const schemaHost = (options.host ?? DEFAULT_SCHEMA_HOST).replace(/\\/$/, '');\n const template: AppSpec = {\n $schema: `${schemaHost}/schema/modelence.json`,\n build: { node: '22', install: 'npm ci', command: null },\n web: { start: null, static: [] },\n };\n await writeAppSpecFile(template, cwd);\n\n console.log(`Wrote a ${APP_SPEC_FILE_NAME} template.`);\n console.log('Ask your coding agent to fill it in with this prompt:');\n console.log('');\n console.log(` ${AGENT_SETUP_PROMPT}`);\n console.log('');\n console.log(`Reference: ${SETUP_DOCS_URL}`);\n console.log(`Once ${APP_SPEC_FILE_NAME} describes your app, run \\`modelence deploy\\`.`);\n}\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","#!/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 { init } from './init';\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 project described by modelence.json to Modelence Cloud (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 .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('init')\n .description('Create a modelence.json template for this project')\n .option('--force', 'Overwrite an existing modelence.json')\n .option('-h, --host <host>', 'Modelence host used for the schema URL')\n .action(async (options) => {\n try {\n await init(options);\n } catch (error) {\n console.error(`Init 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"]}
@@ -0,0 +1,3 @@
1
+ var s="module",i="modelence",r="0.26.0-nd.dev.10",n="The Node.js Framework for Real-Time MongoDB Apps",c="dist/index.js",o="dist/global.d.ts",p={".":"./dist/index.js","./client":"./dist/client.js","./server":"./dist/server.js","./telemetry":"./dist/telemetry.js","./mongodb":"./dist/mongo.js","./types":{types:"./dist/types.d.ts",default:"./dist/types.js"}},d=["dist","dist/bin"],a={modelence:"./dist/bin/modelence.js"},l={node:">=22"},m={build:"tsup",dev:"tsup --watch",format:'prettier --write "src/**/*.{ts,tsx,js,jsx,json,css,md}"',"format:check":'prettier --check "src/**/*.{ts,tsx,js,jsx,json,css,md}"',lint:"eslint src --ext .ts,.tsx --fix","lint:check":"eslint src --ext .ts,.tsx",prepublishOnly:"npm run build",bench:"tsx src/bench/index.ts",test:"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage",postversion:"git push && git push --tags",prepare:"cd ../.. && git config core.hooksPath .husky"},g={type:"git",url:"git+https://github.com/modelence/modelence.git"},u="Modelence",y="SEE LICENSE IN LICENSE",h={url:"https://github.com/modelence/modelence/issues"},v="https://modelence.com",j={"@tanstack/react-query":"^5.100.7","@types/archiver":"^6.0.3","@types/bcrypt":"^6.0.0","@types/cookie-parser":"^1.4.9","@types/express":"^5.0.0","@types/node":"^22.5.1","@types/react":"^19.0.0","@types/react-dom":"^19.0.1","@types/socket.io":"^3.0.1","@typescript-eslint/eslint-plugin":"^8.17.0","@typescript-eslint/parser":"^8.17.0","@vitest/coverage-v8":"^2.1.8",eslint:"^9.37.0",husky:"^9.1.7","lint-staged":"^16.2.7",prettier:"^3.6.2",react:"^19.0.0","react-dom":"^19.0.0","ts-node":"^10.9.2","vite-tsconfig-paths":"^5.1.4",vitest:"^2.1.8"},x={"@socket.io/mongo-adapter":"^0.4.0","@vitejs/plugin-react":"^4.3.4",archiver:"^7.0.1",bcrypt:"^6.0.0",commander:"^12.0.0","cookie-parser":"^1.4.7",dotenv:"^16.4.5","elastic-apm-node":"^4.15.0",express:"^4.21.0",jiti:"^2.4.2","jsonc-parser":"^3.3.1",mongodb:"^6.8.1",open:"^10.1.0","socket.io":"^4.8.1","socket.io-client":"^4.8.1",tsup:"^8.3.6",tsx:"^4.19.3",typescript:"^5.7.2",vite:"^6.0.3","vite-plugin-eslint":"^1.8.1",zod:"^3.23.8",zustand:"^5.0.2"},b={"@tanstack/react-query":">=5.0.0",react:">=18.0.0","react-dom":">=18.0.0"},k={type:s,name:i,version:r,description:n,main:c,types:o,exports:p,files:d,bin:a,engines:l,scripts:m,"lint-staged":{"src/**/*.{ts,tsx,js,jsx,json,css,md}":"prettier --write"},repository:g,author:u,license:y,bugs:h,homepage:v,devDependencies:j,dependencies:x,peerDependencies:b};
2
+ export{s as a,i as b,r as c,n as d,c as e,o as f,p as g,d as h,a as i,l as j,m as k,g as l,u as m,y as n,h as o,v as p,j as q,x as r,b as s,k as t};//# sourceMappingURL=chunk-52W7FC72.js.map
3
+ //# sourceMappingURL=chunk-52W7FC72.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../package.json"],"names":["type","name","version","description","main","types","exports","files","bin","engines","scripts","repository","author","license","bugs","homepage","devDependencies","dependencies","peerDependencies","package_default"],"mappings":"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","file":"chunk-52W7FC72.js","sourcesContent":["{\n \"type\": \"module\",\n \"name\": \"modelence\",\n \"version\": \"0.26.0-nd.dev.10\",\n \"description\": \"The Node.js Framework for Real-Time MongoDB Apps\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/global.d.ts\",\n \"exports\": {\n \".\": \"./dist/index.js\",\n \"./client\": \"./dist/client.js\",\n \"./server\": \"./dist/server.js\",\n \"./telemetry\": \"./dist/telemetry.js\",\n \"./mongodb\": \"./dist/mongo.js\",\n \"./types\": {\n \"types\": \"./dist/types.d.ts\",\n \"default\": \"./dist/types.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"dist/bin\"\n ],\n \"bin\": {\n \"modelence\": \"./dist/bin/modelence.js\"\n },\n \"engines\": {\n \"node\": \">=22\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"format\": \"prettier --write \\\"src/**/*.{ts,tsx,js,jsx,json,css,md}\\\"\",\n \"format:check\": \"prettier --check \\\"src/**/*.{ts,tsx,js,jsx,json,css,md}\\\"\",\n \"lint\": \"eslint src --ext .ts,.tsx --fix\",\n \"lint:check\": \"eslint src --ext .ts,.tsx\",\n \"prepublishOnly\": \"npm run build\",\n \"bench\": \"tsx src/bench/index.ts\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"postversion\": \"git push && git push --tags\",\n \"prepare\": \"cd ../.. && git config core.hooksPath .husky\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js,jsx,json,css,md}\": \"prettier --write\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/modelence/modelence.git\"\n },\n \"author\": \"Modelence\",\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"bugs\": {\n \"url\": \"https://github.com/modelence/modelence/issues\"\n },\n \"homepage\": \"https://modelence.com\",\n \"devDependencies\": {\n \"@tanstack/react-query\": \"^5.100.7\",\n \"@types/archiver\": \"^6.0.3\",\n \"@types/bcrypt\": \"^6.0.0\",\n \"@types/cookie-parser\": \"^1.4.9\",\n \"@types/express\": \"^5.0.0\",\n \"@types/node\": \"^22.5.1\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.1\",\n \"@types/socket.io\": \"^3.0.1\",\n \"@typescript-eslint/eslint-plugin\": \"^8.17.0\",\n \"@typescript-eslint/parser\": \"^8.17.0\",\n \"@vitest/coverage-v8\": \"^2.1.8\",\n \"eslint\": \"^9.37.0\",\n \"husky\": \"^9.1.7\",\n \"lint-staged\": \"^16.2.7\",\n \"prettier\": \"^3.6.2\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"ts-node\": \"^10.9.2\",\n \"vite-tsconfig-paths\": \"^5.1.4\",\n \"vitest\": \"^2.1.8\"\n },\n \"dependencies\": {\n \"@socket.io/mongo-adapter\": \"^0.4.0\",\n \"@vitejs/plugin-react\": \"^4.3.4\",\n \"archiver\": \"^7.0.1\",\n \"bcrypt\": \"^6.0.0\",\n \"commander\": \"^12.0.0\",\n \"cookie-parser\": \"^1.4.7\",\n \"dotenv\": \"^16.4.5\",\n \"elastic-apm-node\": \"^4.15.0\",\n \"express\": \"^4.21.0\",\n \"jiti\": \"^2.4.2\",\n \"jsonc-parser\": \"^3.3.1\",\n \"mongodb\": \"^6.8.1\",\n \"open\": \"^10.1.0\",\n \"socket.io\": \"^4.8.1\",\n \"socket.io-client\": \"^4.8.1\",\n \"tsup\": \"^8.3.6\",\n \"tsx\": \"^4.19.3\",\n \"typescript\": \"^5.7.2\",\n \"vite\": \"^6.0.3\",\n \"vite-plugin-eslint\": \"^1.8.1\",\n \"zod\": \"^3.23.8\",\n \"zustand\": \"^5.0.2\"\n },\n \"peerDependencies\": {\n \"@tanstack/react-query\": \">=5.0.0\",\n \"react\": \">=18.0.0\",\n \"react-dom\": \">=18.0.0\"\n }\n}\n"]}