modelence 0.26.1 → 0.26.2-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/modelence.js +16 -14
- package/dist/bin/modelence.js.map +1 -1
- package/dist/chunk-6DMBCFVF.js +3 -0
- package/dist/chunk-6DMBCFVF.js.map +1 -0
- package/dist/{chunk-T6FG4ICL.js → chunk-OJYIW2TB.js} +5 -5
- package/dist/{chunk-T6FG4ICL.js.map → chunk-OJYIW2TB.js.map} +1 -1
- package/dist/{package-YVO44UGY.js → package-3REMFEWX.js} +2 -2
- package/dist/{package-YVO44UGY.js.map → package-3REMFEWX.js.map} +1 -1
- package/dist/server-VKPPS7T4.js +2 -0
- package/dist/{server-IBH2PXAM.js.map → server-VKPPS7T4.js.map} +1 -1
- package/dist/server.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-RNGNN2LC.js +0 -3
- package/dist/chunk-RNGNN2LC.js.map +0 -1
- package/dist/server-IBH2PXAM.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/auth.ts","../../src/bin/authCache.ts","../../src/bin/project.ts","../../src/bin/studioApi.ts","../../src/bin/deploySession.ts","../../src/bin/setup.ts","../../src/app/modelenceConfig.ts","../../src/bin/config.ts","../../src/bin/build.ts","../../src/bin/source.ts","../../src/bin/appSpec.ts","../../src/bin/appRoot.ts","../../src/bin/deploySpec.ts","../../src/bin/deployKind.ts","../../src/bin/deployTarget.ts","../../src/bin/terminal.ts","../../src/bin/missingEnv.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","DeadCodeError","pollExpireTs","reportedError","result","pollForToken","error","resolve","body","token","expiresAt","target","AUTH_FILE","EXPIRY_MARGIN_MS","getAuthCachePath","home","join","os","readAuthFile","parsed","fs","writeAuthFile","content","path","dirname","readCachedToken","hosts","cached","listCachedTokens","entryHost","writeCachedToken","current","clearCachedToken","_removed","rest","MODELENCE_DIR","PROJECT_FILE","DEFAULT_HOST","getProjectFilePath","cwd","readProject","updateProject","update","next","asHostProject","value","deploy","projectForHost","project","otherTargetHosts","key","withHostProject","patch","StudioApiError","message","status","studioRequest","method","query","headers","text","isUnauthorized","resolveToken","rememberToken","rememberTarget","environmentId","appAlias","envAlias","normalizeHost","trimmed","withScheme","resolveHost","flag","env","parseDotenv","assertEnvTokenHost","MODELENCE_ENV_FILE","fetchServiceConfig","auth","errorText","ask","question","rl","createInterface","answer","confirmOverwrite","escapeEnvValue","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","rawOptions","options","existingEnv","fileExisted","envContent","parseEnv","cliToken","config","newEnv","configSchema","z","loadModelenceConfig","configPath","configModule","createJiti","getConfig","getServerPath","serverDir","serverEntry","getPostBuildCommand","getBuildPath","subPath","buildDir","getModelencePath","getProjectPath","modelenceDir","loadEnv","buildClient","postBuildCommand","execSync","buildVite","buildViteSsr","userConfig","loadConfigFromFile","modelenceConfig","viteBuild","mergeConfig","buildServer","tsupBuild","build","execFileAsync","promisify","execFile","MAX_SOURCE_BYTES","ALWAYS_EXCLUDED_DIRS","ALWAYS_EXCLUDED_FILES","isLocalEnvFile","name","hasRegistryCredentials","line","credentialsInUrl","match","toPosix","sep","isExcludedPath","relativePath","isAlwaysExcludedPath","segments","dir","fileName","pattern","isGitRepository","stdout","gitLsFiles","entry","walk","entries","files","resolveSymlink","file","link","absolute","fromRoot","relative","isAbsolute","listSourceFiles","usedGit","tracked","candidates","listing","localEnv","stat","symlink","a","b","packSource","zipPath","symlinks","output","createWriteStream","archive","archiver","done","reject","size","APP_SPEC_FILE_NAME","APP_SPEC_VERSION","SETUP_DOCS_URL","AGENT_SETUP_PROMPT","getAppSpecSchemaUrl","getAppSpecFilePath","readAppSpecFile","errors","parseJsonc","describeParseError","before","column","printParseErrorCode","writeAppSpecFile","spec","formatAppSpec","lines","resource","formatCommands","mount","declaration","label","list","whenMissing","prefix","command","resolveAppRoot","root","archiveRoot","candidate","isInside","appRoot","base","rel","KNOWN_TOP_LEVEL_KEYS","prepareSpec","missingSpecMessage","assertKnownKeys","unknown","section","isPlainObject","assertCommandList","index","resolveDeployKind","dependsOnModelence","describeDeployKind","decision","manifest","field","resolveTargetFromOptions","otherHosts","describeOtherHosts","describeTarget","saved","differsFromSavedTarget","isInteractive","confirm","describeMissingEnvVars","keys","configUrl","deployAgain","one","where","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","PROVISION_TIMEOUT_MS","waitForEnvironmentReady","deadline","announced","followDeploy","session","signInAgain","buildId","lastStatus","lastMessage","logCursor","signedInAgain","describeStatus","containerLogs","missing","runDeploy","kind","archivePath","requestUpload","upload","openAsBlob","uploadResponse","describeUploadFailure","detail","kindNote","savedProject","nonInteractiveMessage","confirmTarget","createBundle","reportPackedSource","started","hasToken","hasTarget","needed","hostNote","yes","LISTED_PATHS_LIMIT","formatPaths","paths","shown","more","packed","formatMb","reason","bytes","bundlePath","archiveComplete","bundleFiles","bundleDirs","pathExists","stats","dev","serverPath","tsxPath","start","serverFilename","builtServerPath","logout","revokeToken","init","exists","schemaHost","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 (one hour) 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\n// The code can no longer be approved: it expired, was used, or never existed.\nclass DeadCodeError extends Error {}\n\nasync function waitForAuth(host: string, code: string): Promise<CliAuthResult> {\n // Short, since the browser moves on to the deployment page right away.\n const pollInterval = 2 * 1000;\n const pollTimeout = 10 * 60 * 1000; // 10 minutes\n const pollExpireTs = Date.now() + pollTimeout;\n let reportedError = false;\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 if (error instanceof DeadCodeError) {\n throw error;\n }\n // Network trouble or a server hiccup: keep polling, and say so once\n // rather than on every poll.\n if (!reportedError) {\n reportedError = true;\n console.error('Error polling for CLI token (retrying):', error);\n }\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 const body = await response.text().catch(() => '');\n // Studio answers a dead code with a 4xx, or — older versions — a 500\n // carrying this message; polling longer cannot revive it.\n const clientError = response.status >= 400 && response.status < 500 && response.status !== 429;\n if (clientError || body.includes('Invalid or expired code')) {\n throw new DeadCodeError(\n 'The sign-in code has expired or is no longer valid. Please run the command again.'\n );\n }\n throw new Error(`CLI token polling failed: ${response.status} ${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 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/*\n A token that could expire during a deploy is treated as expired, so a\n deploy doesn't fail halfway through its polling. That is the longest a\n deploy waits: provisioning plus build polling (PROVISION_TIMEOUT_MS +\n POLL_TIMEOUT_MS in deployStatus.ts). Deploy tokens last one hour, so a\n login is reused for the first 20 minutes.\n*/\nconst EXPIRY_MARGIN_MS = 40 * 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 { 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 const DEFAULT_HOST = 'https://cloud.modelence.com';\n\nexport interface DeployTarget {\n environmentId: string;\n appAlias: string;\n envAlias: string;\n}\n\n// What the file records for one Studio. Ids and aliases only exist on the\n// Studio they were picked on.\nexport interface HostProject {\n appId?: string;\n deploy?: DeployTarget;\n}\n\n/*\n Modelence Cloud keeps the top-level appId and deploy, the shape released\n CLIs read, so they keep deploying to Cloud. Every other Studio (staging, a\n personal one) gets its own entry under `hosts`, keyed by its normalized\n host, so deploying there never changes what a teammate or CI deploys to.\n*/\nexport interface ProjectFile extends HostProject {\n hosts?: Record<string, HostProject>;\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 update: (project: ProjectFile) => ProjectFile,\n cwd = process.cwd()\n): Promise<void> {\n const next = update(await readProject(cwd));\n await fs.mkdir(join(cwd, MODELENCE_DIR), { recursive: true });\n await fs.writeFile(getProjectFilePath(cwd), JSON.stringify(next, null, 2) + '\\n');\n}\n\nfunction asHostProject(value: unknown): HostProject {\n if (!value || typeof value !== 'object') {\n return {};\n }\n const { appId, deploy } = value as HostProject;\n return {\n ...(typeof appId === 'string' && appId ? { appId } : {}),\n ...(deploy && typeof deploy.environmentId === 'string' ? { deploy } : {}),\n };\n}\n\nexport function projectForHost(project: ProjectFile, host: string): HostProject {\n if (host === DEFAULT_HOST) {\n return asHostProject(project);\n }\n return asHostProject(project.hosts?.[host]);\n}\n\n// Other Studios this project has a deploy target for, to explain why none\n// applies to the host in use.\nexport function otherTargetHosts(project: ProjectFile, host: string): string[] {\n const hosts = Object.keys(project.hosts ?? {}).filter(\n (key) => asHostProject(project.hosts?.[key]).deploy\n );\n if (asHostProject(project).deploy) {\n hosts.unshift(DEFAULT_HOST);\n }\n return [...new Set(hosts)].filter((key) => key !== host);\n}\n\n// The file with `patch` recorded for `host`.\nexport function withHostProject(\n project: ProjectFile,\n host: string,\n patch: HostProject\n): ProjectFile {\n if (host === DEFAULT_HOST) {\n return { ...project, ...patch };\n }\n return {\n ...project,\n hosts: { ...project.hosts, [host]: { ...project.hosts?.[host], ...patch } },\n };\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 // Appended rather than resolved: new URL('/api/…', host) would drop the path\n // of a Studio served under a prefix (see normalizeHost).\n const url = new URL(`${host}${path}`);\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 { DEFAULT_HOST, updateProject, withHostProject } from './project';\nimport { StudioApiError } from './studioApi';\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, host: string) {\n const { appId, environmentId, appAlias, envAlias } = target;\n try {\n await updateProject((project) =>\n withHostProject(project, host, { appId, deploy: { environmentId, appAlias, envAlias } })\n );\n } catch (error) {\n console.warn('Could not record the deploy target in .modelence/project.json:', error);\n }\n}\n\n/*\n A host as typed (`--host hayk.modelence.dev`, or the same in\n MODELENCE_SERVICE_ENDPOINT) as the base URL requests go to: https:// when no\n scheme is given, since fetch refuses a URL without one, and no trailing\n slash. A path is kept, for a Studio served under a prefix.\n*/\nexport function normalizeHost(host: string): string {\n const trimmed = host.trim().replace(/\\/+$/, '');\n const withScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n const url = URL.canParse(withScheme) ? new URL(withScheme) : null;\n // A mistyped scheme (\"htps://\") parses, with an opaque \"null\" origin.\n if (!url || (url.protocol !== 'https:' && url.protocol !== 'http:')) {\n throw new Error(`Invalid Modelence host \"${host}\"; expected e.g. https://cloud.modelence.com`);\n }\n return `${url.origin}${url.pathname.replace(/\\/+$/, '')}`;\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 normalizeHost(flag);\n }\n if (process.env.MODELENCE_SERVICE_ENDPOINT) {\n return normalizeHost(process.env.MODELENCE_SERVICE_ENDPOINT);\n }\n let env: Record<string, string> = {};\n try {\n env = parseDotenv(await fs.readFile(join(cwd, '.modelence.env'), 'utf8'));\n } catch {\n // No .modelence.env — plain Node.js projects usually have none.\n }\n return env.MODELENCE_SERVICE_ENDPOINT\n ? normalizeHost(env.MODELENCE_SERVICE_ENDPOINT)\n : DEFAULT_HOST;\n}\n\n/*\n A MODELENCE_TOKEN from the environment (CI) is only sent to a Studio the\n environment chose too. .modelence.env is a file in the checkout, and a\n repository that commits one pointing elsewhere would otherwise receive the\n token on the first deploy. A cached token is per host, so it never leaks\n this way.\n*/\nexport function assertEnvTokenHost(flag: string | undefined, host: string) {\n if (\n !process.env.MODELENCE_TOKEN ||\n flag ||\n process.env.MODELENCE_SERVICE_ENDPOINT ||\n host === DEFAULT_HOST\n ) {\n return;\n }\n throw new Error(\n `Refusing to send MODELENCE_TOKEN to ${host}, which comes from .modelence.env. ` +\n `Pass --host ${host} or set MODELENCE_SERVICE_ENDPOINT if that is the Studio to deploy to.`\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 { normalizeHost } from './deploySession';\nimport {\n MODELENCE_DIR,\n PROJECT_FILE,\n projectForHost,\n readProject,\n updateProject,\n withHostProject,\n} 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(host: string): Promise<string | undefined> {\n return projectForHost(await readProject(), host).appId;\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, host: string): Promise<void> {\n await updateProject((project) => withHostProject(project, host, { 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(rawOptions: { token?: string; host: string }) {\n try {\n // Also written to .modelence.env, where the app reads it as a URL prefix.\n const options = { ...rawOptions, host: normalizeHost(rawOptions.host) };\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(options.host),\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, options.host);\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 { createWriteStream, promises as fs } from 'fs';\nimport { dirname, isAbsolute, join, relative, resolve, 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, in\n git or not; environment files committed to git are uploaded (and named).\n Example environment files and placeholder-based registry configuration\n are uploaded too. Symlinks that stay inside the project are kept as links;\n anything that cannot be uploaded as it is (a link leaving the project, a\n git submodule) is reported rather than silently dropped.\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 return (\n isAlwaysExcludedPath(relativePath) ||\n isLocalEnvFile(toPosix(relativePath).split('/').at(-1) ?? '')\n );\n}\n\n// Excluded even when committed: build output, dependencies, Modelence credentials.\nfunction isAlwaysExcludedPath(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 gitLsFiles(cwd: string, args: string[]): Promise<string[]> {\n const { stdout } = await execFileAsync('git', ['ls-files', ...args, '-z'], {\n cwd,\n 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() || entry.isSymbolicLink()) {\n files.push(path);\n }\n }\n return files;\n}\n\nexport interface SourceSymlink {\n path: string;\n // Relative to the link's own directory, as the archive stores it.\n target: string;\n}\n\nexport interface SourceListing {\n files: string[];\n symlinks: SourceSymlink[];\n usedGit: boolean;\n // Left out on purpose: build output, dependencies, credentials.\n excludedFiles: string[];\n // In the tree but impossible to upload faithfully, with the reason.\n skipped: { path: string; reason: string }[];\n // Environment files committed to git, uploaded as they are.\n committedEnvFiles: string[];\n}\n\n// A link is kept when it resolves inside the project, the root included;\n// one that leaves it would upload nothing useful and point at the\n// developer's machine.\nasync function resolveSymlink(cwd: string, file: string): Promise<SourceSymlink | null> {\n const link = join(cwd, file);\n const target = await fs.readlink(link);\n const absolute = resolve(dirname(link), target);\n const fromRoot = relative(cwd, absolute);\n if (fromRoot.startsWith('..') || isAbsolute(fromRoot)) {\n return null;\n }\n // A link to its own directory is '.', never the empty path archiver rejects.\n return { path: file, target: toPosix(relative(dirname(link), absolute)) || '.' };\n}\n\n/*\n Inside git, committed .env files are part of the source (typically the\n public VITE_* / NEXT_PUBLIC_* values a build inlines), so they are\n uploaded like any other tracked file. Untracked ones and, outside git, all\n of them are treated as local secrets.\n*/\nexport async function listSourceFiles(cwd = process.cwd()): Promise<SourceListing> {\n const usedGit = await isGitRepository(cwd);\n const tracked = new Set(usedGit ? await gitLsFiles(cwd, ['--cached']) : []);\n const candidates = usedGit\n ? [...tracked, ...(await gitLsFiles(cwd, ['--others', '--exclude-standard']))]\n : await walk(cwd);\n\n const listing: SourceListing = {\n files: [],\n symlinks: [],\n usedGit,\n excludedFiles: [],\n skipped: [],\n committedEnvFiles: [],\n };\n for (const file of candidates) {\n const name = file.split('/').at(-1) ?? '';\n const localEnv = isLocalEnvFile(name);\n if (isAlwaysExcludedPath(file) || (localEnv && !tracked.has(file))) {\n listing.excludedFiles.push(file);\n continue;\n }\n let stat;\n try {\n stat = await fs.lstat(join(cwd, file));\n } catch {\n // git ls-files still lists tracked files deleted from the working tree.\n continue;\n }\n if (stat.isSymbolicLink()) {\n // A link can stand in for a directory (a workspace's node_modules), so\n // its own name is checked against the excluded directories too.\n if (isAlwaysExcludedPath(`${file}/x`)) {\n listing.excludedFiles.push(file);\n continue;\n }\n const symlink = await resolveSymlink(cwd, file);\n if (symlink) {\n listing.symlinks.push(symlink);\n } else {\n listing.skipped.push({ path: file, reason: 'symlink to outside the project' });\n }\n } else if (stat.isDirectory()) {\n // git lists a submodule as a single entry; its files are in another repository.\n listing.skipped.push({ path: file, reason: 'git submodule' });\n } else if (stat.isFile()) {\n if (\n ['.npmrc', '.yarnrc.yml', '.yarnrc'].includes(name) &&\n hasRegistryCredentials(await fs.readFile(join(cwd, file), 'utf8'))\n ) {\n listing.excludedFiles.push(file);\n continue;\n }\n listing.files.push(file);\n if (localEnv) {\n listing.committedEnvFiles.push(file);\n }\n }\n }\n return {\n ...listing,\n files: listing.files.sort(),\n symlinks: listing.symlinks.sort((a, b) => a.path.localeCompare(b.path)),\n excludedFiles: listing.excludedFiles.sort(),\n committedEnvFiles: listing.committedEnvFiles.sort(),\n };\n}\n\nexport async function packSource(\n cwd: string,\n zipPath: string\n): Promise<Omit<SourceListing, 'files' | 'symlinks'> & { fileCount: number; sizeBytes: number }> {\n const { files, symlinks, ...listing } = 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 for (const link of symlinks) {\n // Without a mode the entry extracts as an unreadable link.\n archive.symlink(link.path, link.target, 0o777);\n }\n // Together, so an archive error rejects instead of leaving finalize() pending.\n await Promise.all([archive.finalize(), 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 { ...listing, fileCount: files.length + symlinks.length, sizeBytes: size };\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.config.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.config.json and fills in the defaults.\n The types here mirror that schema; the server is the authority.\n\n A missing `build` inherits the runtime default (npm install), and\n `\"commands\": []` means no build step. A missing `start` means no process.\n An empty command string is invalid.\n*/\n\nexport const APP_SPEC_FILE_NAME = 'modelence.config.json';\n// The format version the CLI writes into $schema; Studio publishes the schema.\nexport const APP_SPEC_VERSION = 1;\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 EnvDeclarationType = 'text' | 'secret';\nexport type EnvDeclarationScope = 'build' | 'runtime';\nexport type ResourceType = 'service';\n\nexport interface StaticMount {\n path: string;\n dir: string;\n}\n\n// Commands run one after another; one failing stops the rest.\nexport interface CommandList {\n commands: string[];\n}\n\n// A client-only site is a service without `start`, serving its `static` mounts.\nexport interface AppResource {\n type: ResourceType;\n // node-<version>-<variant>, e.g. \"node-22-slim\" or \"node-22.23.1-alpine\".\n image?: string;\n root?: string;\n build?: CommandList;\n start?: CommandList;\n static?: StaticMount[];\n}\n\nexport interface EnvDeclaration {\n type?: EnvDeclarationType;\n // The phases the value reaches; default [\"runtime\"].\n scopes?: EnvDeclarationScope[];\n value?: string;\n}\n\nexport interface AppSpec {\n $schema?: string;\n /*\n Everything the app is made of, by the name the project chose. Each entry\n takes type/image/root/build/start/static. One resource is supported today.\n */\n resources?: Record<string, AppResource>;\n // The variables the app expects; values live in the dashboard.\n env?: Record<string, EnvDeclaration>;\n}\n\nexport function getAppSpecSchemaUrl(host: string): string {\n return `${host.replace(/\\/$/, '')}/schema/${APP_SPEC_FILE_NAME}?version=${APP_SPEC_VERSION}`;\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 const entries = Object.entries(spec.resources ?? {});\n\n for (const [name, resource] of entries) {\n // Only label the resource when there is more than one to tell apart.\n if (entries.length > 1) {\n lines.push(` resource: ${name}`);\n }\n lines.push(` image: ${resource.image ?? 'default (node-22-slim)'}`);\n if (resource.root && resource.root !== '.') {\n lines.push(` root: ${resource.root}`);\n }\n lines.push(...formatCommands('build', resource.build, 'default (npm install)'));\n lines.push(...formatCommands('start', resource.start, '(none)'));\n for (const mount of resource.static ?? []) {\n lines.push(` static: ${mount.path} -> ${mount.dir}/`);\n }\n }\n\n /*\n Values are not printed: a declaration carries only a name and a type, and\n the literal on a build-scoped entry is not worth the width here.\n */\n for (const [key, declaration] of Object.entries(spec.env ?? {})) {\n lines.push(` env: ${key} (${declaration.type ?? 'text'})`);\n }\n\n return lines;\n}\n\n// One line per command, in the order they run. A missing list is filled in\n// by the server's default; an empty one is the user saying there is none.\nfunction formatCommands(\n label: string,\n list: CommandList | undefined,\n whenMissing: string\n): string[] {\n const prefix = ` ${`${label}:`.padEnd(8)} `;\n if (!list) {\n return [`${prefix}${whenMissing}`];\n }\n if (list.commands.length === 0) {\n return [`${prefix}(none)`];\n }\n return list.commands.map((command) => `${prefix}${command}`);\n}\n","import { promises as fs } from 'fs';\nimport { isAbsolute, relative, resolve, sep } from 'path';\n\n// The archive remains rooted at cwd; a resource's 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('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('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(`root \"${root}\" does not exist.`);\n }\n if (!isInside(archiveRoot, appRoot) || !(await fs.stat(appRoot)).isDirectory()) {\n throw new Error('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.config.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, 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', 'resources', 'env'];\n\n// Reads and checks modelence.config.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 for (const resource of Object.values(spec.resources ?? {})) {\n if (resource?.root !== undefined) {\n await resolveAppRoot(cwd, resource.root);\n }\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 ['resources', 'env'] 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 // Studio rejects these too, but only after the archive is packed and\n // uploaded, and the plan printed before that reads these shapes as typed.\n // An empty build list is \"no build step\"; an empty command never is.\n for (const [name, resource] of Object.entries(spec.resources ?? {})) {\n if (!isPlainObject(resource)) {\n throw new Error(`${APP_SPEC_FILE_NAME}: \"resources.${name}\" must be an object.`);\n }\n for (const section of ['build', 'start'] as const) {\n assertCommandList(resource[section], `resources.${name}.${section}`);\n }\n }\n}\n\nfunction assertCommandList(list: unknown, path: string): void {\n if (list === undefined) {\n return;\n }\n if (!isPlainObject(list) || !Array.isArray(list.commands)) {\n throw new Error(\n `${APP_SPEC_FILE_NAME}: \"${path}\" must be an object with a \"commands\" array, e.g. { \"commands\": [\"npm ci\"] }.`\n );\n }\n list.commands.forEach((command: unknown, index: number) => {\n if (typeof command !== 'string') {\n throw new Error(`${APP_SPEC_FILE_NAME}: \"${path}.commands.${index}\" must be a string.`);\n }\n if (command.trim() === '') {\n throw new Error(`${APP_SPEC_FILE_NAME}: \"${path}.commands.${index}\" must not be empty.`);\n }\n });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\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, by resource name.\nexport interface ResolvedSpec {\n runtime: string;\n resources: Record<\n string,\n {\n type: string;\n build: { image: string; root: string; commands: string[] };\n web: { start: string | null; static: StaticMount[] };\n }\n >;\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { APP_SPEC_FILE_NAME, readAppSpecFile } from './appSpec';\nimport type { UploadKind } from './deployUpload';\n\n/*\n Which upload `modelence deploy` makes. Two paths exist:\n\n - `source`: the tree is uploaded and built remotely as modelence.config.json\n describes — the path for any Node.js app.\n - `bundle`: the historical Modelence path — build locally, upload\n .modelence/build.\n\n `--prebuilt` forces `bundle`. Otherwise a modelence.config.json means `source`.\n Without either, a project that depends on the `modelence` package is a\n framework app that deployed with this command long before the file\n existed, so it keeps the bundle path unchanged; anything else is `source`,\n where the missing file is reported with the setup prompt. Detecting the\n framework by its dependency is a fact about the project, not a guess about\n how to build it.\n*/\n\nexport type DeployKindReason = 'prebuilt-flag' | 'spec-file' | 'modelence-dependency' | 'default';\n\nexport interface DeployKindDecision {\n kind: UploadKind;\n reason: DeployKindReason;\n}\n\nexport async function resolveDeployKind(\n cwd: string,\n options: { prebuilt?: boolean }\n): Promise<DeployKindDecision> {\n if (options.prebuilt) {\n return { kind: 'bundle', reason: 'prebuilt-flag' };\n }\n if ((await readAppSpecFile(cwd)) !== null) {\n return { kind: 'source', reason: 'spec-file' };\n }\n if (await dependsOnModelence(cwd)) {\n return { kind: 'bundle', reason: 'modelence-dependency' };\n }\n return { kind: 'source', reason: 'default' };\n}\n\nexport function describeDeployKind(decision: DeployKindDecision): string | null {\n if (decision.reason !== 'modelence-dependency') {\n return null;\n }\n return (\n `No ${APP_SPEC_FILE_NAME} found; this is a Modelence app, so it is built locally and uploaded as before. ` +\n `Add a ${APP_SPEC_FILE_NAME} to build it on Modelence Cloud instead.`\n );\n}\n\nasync function dependsOnModelence(cwd: string): Promise<boolean> {\n let content: string;\n try {\n content = await fs.readFile(join(cwd, 'package.json'), 'utf8');\n } catch {\n return false;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n // An unreadable package.json is the app's problem to report, not a\n // reason to pick a deploy path; the source path's checks will surface it.\n return false;\n }\n if (!parsed || typeof parsed !== 'object') {\n return false;\n }\n const manifest = parsed as Record<string, unknown>;\n return ['dependencies', 'devDependencies'].some((field) => {\n const section = manifest[field];\n return Boolean(section && typeof section === 'object' && 'modelence' in section);\n });\n}\n","import type { DeployOptions } from './deploy';\nimport type { HostProject } 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: HostProject,\n // Studios the project has a saved target for, when it has none for this one.\n otherHosts: string[] = []\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.env && !options.app && otherHosts.length > 0) {\n throw new Error(\n `--env needs --app here: ${describeOtherHosts(otherHosts)} Pass --app too, or --host to deploy there.`\n );\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\nexport function describeOtherHosts(otherHosts: string[]): string {\n return `the target saved in .modelence/project.json is for ${otherHosts.join(', ')}, not this Studio.`;\n}\n\n// How the target reads in the CLI output, with where it came from.\nexport function describeTarget(target: CliTarget, project: HostProject): string {\n if ('environmentId' in target) {\n const saved = project.deploy;\n const name =\n saved?.environmentId === target.environmentId\n ? `${saved.appAlias}/${saved.envAlias}`\n : target.environmentId;\n return `${name} (saved in .modelence/project.json)`;\n }\n if ('appAlias' in target) {\n return `${target.appAlias}/${target.envAlias}`;\n }\n return target.envAlias;\n}\n\n/*\n Flags naming another environment than the one this project normally\n deploys to. A plain `modelence deploy` goes to the saved target, so a\n flag that points elsewhere (production, say) is worth a second look.\n*/\nexport function differsFromSavedTarget(target: CliTarget, project: HostProject): boolean {\n const saved = project.deploy;\n if (!saved || 'environmentId' in target) {\n return false;\n }\n if ('appAlias' in target && target.appAlias !== saved.appAlias) {\n return true;\n }\n return target.envAlias !== saved.envAlias;\n}\n","import { createInterface } from 'readline';\n\n/*\n Whether someone is at the terminal to answer a question or approve a\n sign-in in the browser. CI runners, GitHub Actions and agent sandboxes set\n CI or run without a TTY; waiting on them would only hang until a timeout.\n*/\nexport function isInteractive(): boolean {\n return !process.env.CI && Boolean(process.stdin.isTTY);\n}\n\nexport async function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => rl.question(`${question} (y/N) `, resolve));\n rl.close();\n return answer.trim().toLowerCase() === 'y';\n}\n","import { APP_SPEC_FILE_NAME } from './appSpec';\n\n/*\n Variables modelence.config.json declares that have no value in the target\n environment, as Studio reports them. Named next to the config page because\n an app started without them usually dies with its own message (\"DATABASE_URL\n must be set...\") that says nothing about where values are set.\n*/\nexport function describeMissingEnvVars(\n keys: string[] | undefined,\n configUrl: string | undefined,\n { deployAgain = false }: { deployAgain?: boolean } = {}\n): string | null {\n if (!keys || keys.length === 0) {\n return null;\n }\n const one = keys.length === 1;\n const where = configUrl ? ` Set ${one ? 'it' : 'them'} at ${configUrl}` : '';\n return (\n `${keys.join(', ')} ${one ? 'is' : 'are'} declared in ${APP_SPEC_FILE_NAME} but ` +\n `${one ? 'has' : 'have'} no value in this environment.` +\n (where ? where + (deployAgain ? ', then deploy again.' : '') : '')\n );\n}\n","import { StudioApiError, studioRequest } from './studioApi';\nimport { isUnauthorized, type Session } from './deploySession';\nimport { describeMissingEnvVars } from './missingEnv';\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 // Where the next poll resumes the build log; null until the log exists.\n logCursor: string | null;\n siteUrl: string | null;\n // Last output of the containers a failed rollout tried to start.\n containerLogs?: string[];\n // On a failure: declared variables still without a value, and where to set them.\n missingEnvVars?: string[];\n configUrl?: 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 logCursor: string | null = null;\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, ...(logCursor ? { logCursor } : {}) },\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 hands back the cursor it got, or\n // none; keeping ours avoids replaying the whole log on the next poll.\n logCursor = status.logCursor ?? logCursor;\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 const containerLogs = status.containerLogs ?? [];\n // First, so the errors and container output below it stay what is left\n // on screen: a missing value is only the cause when nothing else failed,\n // so \"deploy again\" is only suggested then.\n const missing = describeMissingEnvVars(status.missingEnvVars, status.configUrl, {\n deployAgain: status.errors.length === 0 && containerLogs.length === 0,\n });\n if (missing) {\n console.error(missing);\n }\n for (const error of status.errors) {\n console.error(` ${error}`);\n }\n if (containerLogs.length > 0) {\n console.error('Container output:');\n for (const line of 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 { CliTarget } from './deployTarget';\nimport type { Session } from './deploySession';\nimport type { ResolvedSpec } from './deploySpec';\nimport { waitForEnvironmentReady } from './deployStatus';\nimport { studioRequest } from './studioApi';\nimport { describeMissingEnvVars } from './missingEnv';\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}: {\n session: Session;\n target: CliTarget;\n kind: UploadKind;\n archivePath: string;\n // The project's modelence.config.json; required by Studio for source uploads.\n spec?: AppSpec;\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 Studio versions before source deploys answer without the environment\n id, ignore `kind` and `spec`, and would build the upload as a prebuilt\n Modelence bundle. Stopping here beats deploying something else.\n */\n if (!upload.environmentId) {\n throw new Error(\n 'Modelence Cloud is too old for this CLI version (no environment id from /api/upload-bundle). ' +\n 'Try again later, or deploy with modelence@0.25.'\n );\n }\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 // Absent on Studio versions before it was reported.\n missingEnvVars?: string[];\n configUrl?: string;\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 console.log(`Deployment started: ${result.deploymentUrl}`);\n const missing = describeMissingEnvVars(result.missingEnvVars, result.configUrl);\n if (missing) {\n console.warn(`Warning: ${missing}`);\n }\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 { otherTargetHosts, projectForHost, readProject, type HostProject } from './project';\nimport { packSource } from './source';\nimport { build } from './build';\nimport { prepareSpec } from './deploySpec';\nimport { describeDeployKind, resolveDeployKind } from './deployKind';\nimport type { AppSpec } from './appSpec';\nimport {\n describeOtherHosts,\n describeTarget,\n differsFromSavedTarget,\n resolveTargetFromOptions,\n type CliTarget,\n} from './deployTarget';\nimport { confirm, isInteractive } from './terminal';\nimport {\n assertEnvTokenHost,\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.config.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 — and so does a\n Modelence framework app that has no modelence.config.json, so projects that\n deployed before the file existed keep deploying unchanged (deployKind.ts).\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. Only a target\n picked in the browser is recorded; flags deploy once and change nothing.\n\n Without someone at the terminal (CI, scripts, agent sandboxes) the browser\n is never opened: a missing token or target fails at once instead of\n waiting for an approval nobody will give.\n*/\n\nexport interface DeployOptions {\n app?: string;\n env?: string;\n host?: string;\n prebuilt?: boolean;\n yes?: boolean;\n}\n\nexport async function deploy(options: DeployOptions) {\n const cwd = process.cwd();\n const host = await resolveHost(options.host, cwd);\n assertEnvTokenHost(options.host, host);\n const decision = await resolveDeployKind(cwd, options);\n const kind: UploadKind = decision.kind;\n const kindNote = describeDeployKind(decision);\n if (kindNote) {\n console.log(kindNote);\n }\n const savedProject = await readProject(cwd);\n const project = projectForHost(savedProject, host);\n // Targets saved for another Studio don't apply here, but say so: a picker\n // or a \"pass --app and --env\" out of the blue would be a puzzle.\n const otherHosts = project.deploy ? [] : otherTargetHosts(savedProject, host);\n let target = resolveTargetFromOptions(options, project, otherHosts);\n let token = await resolveToken(host);\n if ((!token || !target) && !isInteractive()) {\n throw new Error(nonInteractiveMessage(Boolean(token), Boolean(target), otherHosts));\n }\n if (!target && otherHosts.length > 0) {\n console.log(\n `Note: ${describeOtherHosts(otherHosts)} Pick a target for ${host} in the browser, or pass --host to deploy there.`\n );\n }\n await confirmTarget(target, project, options.yes);\n\n // Local work first, so nothing is uploaded — and nobody is asked to sign\n // in — when it fails; a missing modelence.config.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 reportPackedSource(await packSource(cwd, archivePath));\n }\n\n try {\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, host);\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 if (!isInteractive()) {\n throw new Error(\n 'Modelence Cloud rejected the token (expired or revoked), and nobody is at the terminal to sign in again. ' +\n 'Set a fresh MODELENCE_TOKEN. A deployment that already started keeps running; check the dashboard.'\n );\n }\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, host);\n }\n session.token = auth.token;\n };\n\n let started: StartedDeploy;\n try {\n started = await runDeploy({ session, target, kind, archivePath, spec });\n } catch (error) {\n if (!isUnauthorized(error)) {\n throw error;\n }\n await signInAgain();\n started = await runDeploy({ session, target, kind, archivePath, spec });\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 nonInteractiveMessage(\n hasToken: boolean,\n hasTarget: boolean,\n otherHosts: string[]\n): string {\n const needed = [\n hasTarget ? null : 'pass --app and --env',\n hasToken ? null : 'set MODELENCE_TOKEN',\n ].filter(Boolean);\n const hostNote =\n !hasTarget && otherHosts.length > 0\n ? ` Note: ${describeOtherHosts(otherHosts)} Pass --host to deploy there.`\n : '';\n return (\n 'Nobody is at the terminal to sign in or pick a target in the browser (CI or a non-interactive shell). ' +\n `To deploy from here, ${needed.join(' and ')}.${hostNote}`\n );\n}\n\n// Says where the deploy goes before anything is built, and asks first when\n// flags point away from the environment this project normally deploys to.\nasync function confirmTarget(\n target: CliTarget | null,\n project: HostProject,\n yes: boolean | undefined\n): Promise<void> {\n if (!target) {\n return;\n }\n const label = describeTarget(target, project);\n console.log(`Deploying to ${label}`);\n if (yes || !differsFromSavedTarget(target, project) || !isInteractive()) {\n return;\n }\n const saved = `${project.deploy?.appAlias}/${project.deploy?.envAlias}`;\n if (!(await confirm(`This project normally deploys to ${saved}. Deploy to ${label} instead?`))) {\n throw new Error('Cancelled.');\n }\n}\n\nconst LISTED_PATHS_LIMIT = 10;\n\nfunction formatPaths(paths: string[]): string {\n const shown = paths.slice(0, LISTED_PATHS_LIMIT).join(', ');\n const more = paths.length - LISTED_PATHS_LIMIT;\n return more > 0 ? `${shown} and ${more} more` : shown;\n}\n\n// What went into the upload and, by name, everything that did not or that\n// might surprise: the cloud build sees only what is listed as packed.\nfunction reportPackedSource(packed: Awaited<ReturnType<typeof packSource>>): void {\n console.log(\n `Packed ${packed.fileCount} files (${formatMb(packed.sizeBytes)})` +\n (packed.usedGit ? ' from git' : '; not a git repository, so only default exclusions applied')\n );\n if (packed.excludedFiles.length > 0) {\n console.log(\n `Not uploaded (local, generated or credentials; store secrets in the target environment): ${formatPaths(packed.excludedFiles)}`\n );\n }\n if (packed.committedEnvFiles.length > 0) {\n console.log(\n `Uploaded environment files committed to git: ${formatPaths(packed.committedEnvFiles)}`\n );\n }\n for (const { path, reason } of packed.skipped) {\n console.warn(`Warning: ${path} is not uploaded (${reason}).`);\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 { normalizeHost } from './deploySession';\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 // Normalized like deploy's resolveHost, so the cache key matches.\n const host = options.host ? normalizeHost(options.host) : undefined;\n const cached = await listCachedTokens(host);\n await Promise.all(cached.map((entry) => revokeToken(entry.host, entry.token)));\n await clearCachedToken(host);\n console.log(\n host ? `Removed the saved login for ${host}.` : `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 getAppSpecSchemaUrl,\n writeAppSpecFile,\n type AppSpec,\n} from './appSpec';\nimport { resolveHost } from './deploySession';\n\n/*\n `modelence init`: write a modelence.config.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\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 // The host deploy will use, so the schema comes from the Studio that\n // validates the file.\n const schemaHost = await resolveHost(options.host, cwd);\n const template: AppSpec = {\n $schema: getAppSpecSchemaUrl(schemaHost),\n resources: {\n app: {\n type: 'service',\n image: 'node-22-slim',\n build: { commands: ['npm ci'] },\n static: [],\n },\n },\n env: {},\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(\n `Once ${APP_SPEC_FILE_NAME} describes your app, run \\`npx modelence@latest deploy\\`.`\n );\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.config.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 .option(\n '-y, --yes',\n 'Deploy to the given --app/--env without asking, even if it is not the saved target'\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.config.json template for this project')\n .option('--force', 'Overwrite an existing modelence.config.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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/bin/auth.ts","../../src/bin/authCache.ts","../../src/bin/project.ts","../../src/bin/studioApi.ts","../../src/bin/deploySession.ts","../../src/bin/setup.ts","../../src/app/modelenceConfig.ts","../../src/bin/config.ts","../../src/bin/build.ts","../../src/bin/source.ts","../../src/bin/appSpec.ts","../../src/bin/appRoot.ts","../../src/bin/deploySpec.ts","../../src/bin/deployKind.ts","../../src/bin/deployTarget.ts","../../src/bin/terminal.ts","../../src/bin/missingEnv.ts","../../src/bin/deployStatus.ts","../../src/bin/deployUpload.ts","../../src/bin/deployEnv.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","env","declaredEnv","response","code","verificationUrl","url","resolvedPick","open","waitForAuth","DeadCodeError","pollExpireTs","reportedError","result","pollForToken","error","resolve","body","token","expiresAt","target","AUTH_FILE","EXPIRY_MARGIN_MS","getAuthCachePath","home","join","os","readAuthFile","parsed","fs","writeAuthFile","content","path","dirname","readCachedToken","hosts","cached","listCachedTokens","entryHost","writeCachedToken","current","clearCachedToken","_removed","rest","MODELENCE_DIR","PROJECT_FILE","DEFAULT_HOST","getProjectFilePath","cwd","readProject","updateProject","update","next","asHostProject","value","deploy","projectForHost","project","otherTargetHosts","key","withHostProject","patch","StudioApiError","message","status","studioRequest","method","query","headers","text","isUnauthorized","resolveToken","rememberToken","rememberTarget","environmentId","appAlias","envAlias","normalizeHost","trimmed","withScheme","resolveHost","flag","parseDotenv","assertEnvTokenHost","MODELENCE_ENV_FILE","fetchServiceConfig","auth","errorText","ask","question","rl","createInterface","answer","confirmOverwrite","escapeEnvValue","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","rawOptions","options","existingEnv","fileExisted","envContent","parseEnv","cliToken","config","newEnv","configSchema","z","loadModelenceConfig","configPath","configModule","createJiti","getConfig","getServerPath","serverDir","serverEntry","getPostBuildCommand","getBuildPath","subPath","buildDir","getModelencePath","getProjectPath","modelenceDir","loadEnv","buildClient","postBuildCommand","execSync","buildVite","buildViteSsr","userConfig","loadConfigFromFile","modelenceConfig","viteBuild","mergeConfig","buildServer","tsupBuild","build","execFileAsync","promisify","execFile","MAX_SOURCE_BYTES","ALWAYS_EXCLUDED_DIRS","ALWAYS_EXCLUDED_FILES","isLocalEnvFile","name","hasRegistryCredentials","line","credentialsInUrl","match","toPosix","sep","isExcludedPath","relativePath","isAlwaysExcludedPath","segments","dir","fileName","pattern","isGitRepository","stdout","gitLsFiles","entry","walk","entries","files","resolveSymlink","file","link","absolute","fromRoot","relative","isAbsolute","listSourceFiles","usedGit","tracked","candidates","listing","localEnv","stat","symlink","a","b","packSource","zipPath","symlinks","output","createWriteStream","archive","archiver","done","reject","size","APP_SPEC_FILE_NAME","APP_SPEC_VERSION","SETUP_DOCS_URL","AGENT_SETUP_PROMPT","getAppSpecSchemaUrl","getAppSpecFilePath","readAppSpecFile","errors","parseJsonc","describeParseError","before","column","printParseErrorCode","writeAppSpecFile","spec","formatAppSpec","lines","resource","formatCommands","mount","declaration","label","list","whenMissing","prefix","command","resolveAppRoot","root","archiveRoot","candidate","isInside","appRoot","base","rel","KNOWN_TOP_LEVEL_KEYS","prepareSpec","missingSpecMessage","assertKnownKeys","unknown","section","isPlainObject","assertCommandList","index","resolveDeployKind","dependsOnModelence","describeDeployKind","decision","manifest","field","resolveTargetFromOptions","otherHosts","describeOtherHosts","describeTarget","saved","differsFromSavedTarget","isInteractive","confirm","secret","input","setRawMode","chars","wasRaw","finish","onData","chunk","char","describeMissingEnvVars","keys","configUrl","deployAgain","one","where","POLL_INTERVAL_MS","POLL_TIMEOUT_MS","PROVISION_TIMEOUT_MS","waitForEnvironmentReady","deadline","announced","followDeploy","session","signInAgain","buildId","lastStatus","lastMessage","logCursor","signedInAgain","describeStatus","containerLogs","missing","runDeploy","kind","archivePath","requestUpload","upload","openAsBlob","uploadResponse","describeUploadFailure","detail","fillMissingEnvVars","request","values","kindNote","savedProject","nonInteractiveMessage","confirmTarget","createBundle","reportPackedSource","pickedInBrowser","envTarget","fill","started","hasToken","hasTarget","needed","hostNote","yes","LISTED_PATHS_LIMIT","formatPaths","paths","shown","more","packed","formatMb","reason","bytes","bundlePath","archiveComplete","bundleFiles","bundleDirs","pathExists","stats","dev","serverPath","tsxPath","start","serverFilename","builtServerPath","logout","revokeToken","init","exists","schemaHost","template","__filename","fileURLToPath","__dirname","packageJson","readFileSync","program","Command"],"mappings":"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","file":"modelence.js","sourcesContent":["import open from 'open';\nimport type { EnvDeclaration } from './appSpec';\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 (one hour) 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 `env` is what modelence.config.json declares. With the deploy picker, the\n page asks for those variables' values as a separate step after the target,\n so a new environment has them before its first build. Studio versions\n without that step ignore the body.\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 env,\n }: {\n pick?: CliAuthPick;\n purpose?: 'deploy';\n pickEnvironment?: boolean;\n appId?: string;\n env?: Record<string, EnvDeclaration>;\n } = {}\n): Promise<CliAuthResult> {\n // Only the picker has a variables step; nothing is sent otherwise.\n const declaredEnv = pick === 'deploy' && env && Object.keys(env).length > 0 ? env : undefined;\n const response = await fetch(`${host}/api/cli/auth`, {\n method: 'POST',\n ...(declaredEnv\n ? {\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ env: declaredEnv }),\n }\n : {}),\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\n// The code can no longer be approved: it expired, was used, or never existed.\nclass DeadCodeError extends Error {}\n\nasync function waitForAuth(host: string, code: string): Promise<CliAuthResult> {\n // Short, since the browser moves on to the deployment page right away.\n const pollInterval = 2 * 1000;\n const pollTimeout = 10 * 60 * 1000; // 10 minutes\n const pollExpireTs = Date.now() + pollTimeout;\n let reportedError = false;\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 if (error instanceof DeadCodeError) {\n throw error;\n }\n // Network trouble or a server hiccup: keep polling, and say so once\n // rather than on every poll.\n if (!reportedError) {\n reportedError = true;\n console.error('Error polling for CLI token (retrying):', error);\n }\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 const body = await response.text().catch(() => '');\n // Studio answers a dead code with a 4xx, or — older versions — a 500\n // carrying this message; polling longer cannot revive it.\n const clientError = response.status >= 400 && response.status < 500 && response.status !== 429;\n if (clientError || body.includes('Invalid or expired code')) {\n throw new DeadCodeError(\n 'The sign-in code has expired or is no longer valid. Please run the command again.'\n );\n }\n throw new Error(`CLI token polling failed: ${response.status} ${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 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/*\n A token that could expire during a deploy is treated as expired, so a\n deploy doesn't fail halfway through its polling. That is the longest a\n deploy waits: provisioning plus build polling (PROVISION_TIMEOUT_MS +\n POLL_TIMEOUT_MS in deployStatus.ts). Deploy tokens last one hour, so a\n login is reused for the first 20 minutes.\n*/\nconst EXPIRY_MARGIN_MS = 40 * 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 { 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 const DEFAULT_HOST = 'https://cloud.modelence.com';\n\nexport interface DeployTarget {\n environmentId: string;\n appAlias: string;\n envAlias: string;\n}\n\n// What the file records for one Studio. Ids and aliases only exist on the\n// Studio they were picked on.\nexport interface HostProject {\n appId?: string;\n deploy?: DeployTarget;\n}\n\n/*\n Modelence Cloud keeps the top-level appId and deploy, the shape released\n CLIs read, so they keep deploying to Cloud. Every other Studio (staging, a\n personal one) gets its own entry under `hosts`, keyed by its normalized\n host, so deploying there never changes what a teammate or CI deploys to.\n*/\nexport interface ProjectFile extends HostProject {\n hosts?: Record<string, HostProject>;\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 update: (project: ProjectFile) => ProjectFile,\n cwd = process.cwd()\n): Promise<void> {\n const next = update(await readProject(cwd));\n await fs.mkdir(join(cwd, MODELENCE_DIR), { recursive: true });\n await fs.writeFile(getProjectFilePath(cwd), JSON.stringify(next, null, 2) + '\\n');\n}\n\nfunction asHostProject(value: unknown): HostProject {\n if (!value || typeof value !== 'object') {\n return {};\n }\n const { appId, deploy } = value as HostProject;\n return {\n ...(typeof appId === 'string' && appId ? { appId } : {}),\n ...(deploy && typeof deploy.environmentId === 'string' ? { deploy } : {}),\n };\n}\n\nexport function projectForHost(project: ProjectFile, host: string): HostProject {\n if (host === DEFAULT_HOST) {\n return asHostProject(project);\n }\n return asHostProject(project.hosts?.[host]);\n}\n\n// Other Studios this project has a deploy target for, to explain why none\n// applies to the host in use.\nexport function otherTargetHosts(project: ProjectFile, host: string): string[] {\n const hosts = Object.keys(project.hosts ?? {}).filter(\n (key) => asHostProject(project.hosts?.[key]).deploy\n );\n if (asHostProject(project).deploy) {\n hosts.unshift(DEFAULT_HOST);\n }\n return [...new Set(hosts)].filter((key) => key !== host);\n}\n\n// The file with `patch` recorded for `host`.\nexport function withHostProject(\n project: ProjectFile,\n host: string,\n patch: HostProject\n): ProjectFile {\n if (host === DEFAULT_HOST) {\n return { ...project, ...patch };\n }\n return {\n ...project,\n hosts: { ...project.hosts, [host]: { ...project.hosts?.[host], ...patch } },\n };\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 // Appended rather than resolved: new URL('/api/…', host) would drop the path\n // of a Studio served under a prefix (see normalizeHost).\n const url = new URL(`${host}${path}`);\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 { DEFAULT_HOST, updateProject, withHostProject } from './project';\nimport { StudioApiError } from './studioApi';\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, host: string) {\n const { appId, environmentId, appAlias, envAlias } = target;\n try {\n await updateProject((project) =>\n withHostProject(project, host, { appId, deploy: { environmentId, appAlias, envAlias } })\n );\n } catch (error) {\n console.warn('Could not record the deploy target in .modelence/project.json:', error);\n }\n}\n\n/*\n A host as typed (`--host hayk.modelence.dev`, or the same in\n MODELENCE_SERVICE_ENDPOINT) as the base URL requests go to: https:// when no\n scheme is given, since fetch refuses a URL without one, and no trailing\n slash. A path is kept, for a Studio served under a prefix.\n*/\nexport function normalizeHost(host: string): string {\n const trimmed = host.trim().replace(/\\/+$/, '');\n const withScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed) ? trimmed : `https://${trimmed}`;\n const url = URL.canParse(withScheme) ? new URL(withScheme) : null;\n // A mistyped scheme (\"htps://\") parses, with an opaque \"null\" origin.\n if (!url || (url.protocol !== 'https:' && url.protocol !== 'http:')) {\n throw new Error(`Invalid Modelence host \"${host}\"; expected e.g. https://cloud.modelence.com`);\n }\n return `${url.origin}${url.pathname.replace(/\\/+$/, '')}`;\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 normalizeHost(flag);\n }\n if (process.env.MODELENCE_SERVICE_ENDPOINT) {\n return normalizeHost(process.env.MODELENCE_SERVICE_ENDPOINT);\n }\n let env: Record<string, string> = {};\n try {\n env = parseDotenv(await fs.readFile(join(cwd, '.modelence.env'), 'utf8'));\n } catch {\n // No .modelence.env — plain Node.js projects usually have none.\n }\n return env.MODELENCE_SERVICE_ENDPOINT\n ? normalizeHost(env.MODELENCE_SERVICE_ENDPOINT)\n : DEFAULT_HOST;\n}\n\n/*\n A MODELENCE_TOKEN from the environment (CI) is only sent to a Studio the\n environment chose too. .modelence.env is a file in the checkout, and a\n repository that commits one pointing elsewhere would otherwise receive the\n token on the first deploy. A cached token is per host, so it never leaks\n this way.\n*/\nexport function assertEnvTokenHost(flag: string | undefined, host: string) {\n if (\n !process.env.MODELENCE_TOKEN ||\n flag ||\n process.env.MODELENCE_SERVICE_ENDPOINT ||\n host === DEFAULT_HOST\n ) {\n return;\n }\n throw new Error(\n `Refusing to send MODELENCE_TOKEN to ${host}, which comes from .modelence.env. ` +\n `Pass --host ${host} or set MODELENCE_SERVICE_ENDPOINT if that is the Studio to deploy to.`\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 { normalizeHost } from './deploySession';\nimport {\n MODELENCE_DIR,\n PROJECT_FILE,\n projectForHost,\n readProject,\n updateProject,\n withHostProject,\n} 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(host: string): Promise<string | undefined> {\n return projectForHost(await readProject(), host).appId;\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, host: string): Promise<void> {\n await updateProject((project) => withHostProject(project, host, { 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(rawOptions: { token?: string; host: string }) {\n try {\n // Also written to .modelence.env, where the app reads it as a URL prefix.\n const options = { ...rawOptions, host: normalizeHost(rawOptions.host) };\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(options.host),\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, options.host);\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 { createWriteStream, promises as fs } from 'fs';\nimport { dirname, isAbsolute, join, relative, resolve, 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, in\n git or not; environment files committed to git are uploaded (and named).\n Example environment files and placeholder-based registry configuration\n are uploaded too. Symlinks that stay inside the project are kept as links;\n anything that cannot be uploaded as it is (a link leaving the project, a\n git submodule) is reported rather than silently dropped.\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 return (\n isAlwaysExcludedPath(relativePath) ||\n isLocalEnvFile(toPosix(relativePath).split('/').at(-1) ?? '')\n );\n}\n\n// Excluded even when committed: build output, dependencies, Modelence credentials.\nfunction isAlwaysExcludedPath(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 gitLsFiles(cwd: string, args: string[]): Promise<string[]> {\n const { stdout } = await execFileAsync('git', ['ls-files', ...args, '-z'], {\n cwd,\n 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() || entry.isSymbolicLink()) {\n files.push(path);\n }\n }\n return files;\n}\n\nexport interface SourceSymlink {\n path: string;\n // Relative to the link's own directory, as the archive stores it.\n target: string;\n}\n\nexport interface SourceListing {\n files: string[];\n symlinks: SourceSymlink[];\n usedGit: boolean;\n // Left out on purpose: build output, dependencies, credentials.\n excludedFiles: string[];\n // In the tree but impossible to upload faithfully, with the reason.\n skipped: { path: string; reason: string }[];\n // Environment files committed to git, uploaded as they are.\n committedEnvFiles: string[];\n}\n\n// A link is kept when it resolves inside the project, the root included;\n// one that leaves it would upload nothing useful and point at the\n// developer's machine.\nasync function resolveSymlink(cwd: string, file: string): Promise<SourceSymlink | null> {\n const link = join(cwd, file);\n const target = await fs.readlink(link);\n const absolute = resolve(dirname(link), target);\n const fromRoot = relative(cwd, absolute);\n if (fromRoot.startsWith('..') || isAbsolute(fromRoot)) {\n return null;\n }\n // A link to its own directory is '.', never the empty path archiver rejects.\n return { path: file, target: toPosix(relative(dirname(link), absolute)) || '.' };\n}\n\n/*\n Inside git, committed .env files are part of the source (typically the\n public VITE_* / NEXT_PUBLIC_* values a build inlines), so they are\n uploaded like any other tracked file. Untracked ones and, outside git, all\n of them are treated as local secrets.\n*/\nexport async function listSourceFiles(cwd = process.cwd()): Promise<SourceListing> {\n const usedGit = await isGitRepository(cwd);\n const tracked = new Set(usedGit ? await gitLsFiles(cwd, ['--cached']) : []);\n const candidates = usedGit\n ? [...tracked, ...(await gitLsFiles(cwd, ['--others', '--exclude-standard']))]\n : await walk(cwd);\n\n const listing: SourceListing = {\n files: [],\n symlinks: [],\n usedGit,\n excludedFiles: [],\n skipped: [],\n committedEnvFiles: [],\n };\n for (const file of candidates) {\n const name = file.split('/').at(-1) ?? '';\n const localEnv = isLocalEnvFile(name);\n if (isAlwaysExcludedPath(file) || (localEnv && !tracked.has(file))) {\n listing.excludedFiles.push(file);\n continue;\n }\n let stat;\n try {\n stat = await fs.lstat(join(cwd, file));\n } catch {\n // git ls-files still lists tracked files deleted from the working tree.\n continue;\n }\n if (stat.isSymbolicLink()) {\n // A link can stand in for a directory (a workspace's node_modules), so\n // its own name is checked against the excluded directories too.\n if (isAlwaysExcludedPath(`${file}/x`)) {\n listing.excludedFiles.push(file);\n continue;\n }\n const symlink = await resolveSymlink(cwd, file);\n if (symlink) {\n listing.symlinks.push(symlink);\n } else {\n listing.skipped.push({ path: file, reason: 'symlink to outside the project' });\n }\n } else if (stat.isDirectory()) {\n // git lists a submodule as a single entry; its files are in another repository.\n listing.skipped.push({ path: file, reason: 'git submodule' });\n } else if (stat.isFile()) {\n if (\n ['.npmrc', '.yarnrc.yml', '.yarnrc'].includes(name) &&\n hasRegistryCredentials(await fs.readFile(join(cwd, file), 'utf8'))\n ) {\n listing.excludedFiles.push(file);\n continue;\n }\n listing.files.push(file);\n if (localEnv) {\n listing.committedEnvFiles.push(file);\n }\n }\n }\n return {\n ...listing,\n files: listing.files.sort(),\n symlinks: listing.symlinks.sort((a, b) => a.path.localeCompare(b.path)),\n excludedFiles: listing.excludedFiles.sort(),\n committedEnvFiles: listing.committedEnvFiles.sort(),\n };\n}\n\nexport async function packSource(\n cwd: string,\n zipPath: string\n): Promise<Omit<SourceListing, 'files' | 'symlinks'> & { fileCount: number; sizeBytes: number }> {\n const { files, symlinks, ...listing } = 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 for (const link of symlinks) {\n // Without a mode the entry extracts as an unreadable link.\n archive.symlink(link.path, link.target, 0o777);\n }\n // Together, so an archive error rejects instead of leaving finalize() pending.\n await Promise.all([archive.finalize(), 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 { ...listing, fileCount: files.length + symlinks.length, sizeBytes: size };\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.config.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.config.json and fills in the defaults.\n The types here mirror that schema; the server is the authority.\n\n A missing `build` inherits the runtime default (npm install), and\n `\"commands\": []` means no build step. A missing `start` means no process.\n An empty command string is invalid.\n*/\n\nexport const APP_SPEC_FILE_NAME = 'modelence.config.json';\n// The format version the CLI writes into $schema; Studio publishes the schema.\nexport const APP_SPEC_VERSION = 1;\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 EnvDeclarationType = 'text' | 'secret';\nexport type EnvDeclarationScope = 'build' | 'runtime';\nexport type ResourceType = 'service';\n\nexport interface StaticMount {\n path: string;\n dir: string;\n}\n\n// Commands run one after another; one failing stops the rest.\nexport interface CommandList {\n commands: string[];\n}\n\n// A client-only site is a service without `start`, serving its `static` mounts.\nexport interface AppResource {\n type: ResourceType;\n // node-<version>-<variant>, e.g. \"node-22-slim\" or \"node-22.23.1-alpine\".\n image?: string;\n root?: string;\n build?: CommandList;\n start?: CommandList;\n static?: StaticMount[];\n}\n\nexport interface EnvDeclaration {\n type?: EnvDeclarationType;\n // The phases the value reaches; default [\"runtime\"].\n scopes?: EnvDeclarationScope[];\n value?: string;\n}\n\nexport interface AppSpec {\n $schema?: string;\n /*\n Everything the app is made of, by the name the project chose. Each entry\n takes type/image/root/build/start/static. One resource is supported today.\n */\n resources?: Record<string, AppResource>;\n // The variables the app expects; values live in the dashboard.\n env?: Record<string, EnvDeclaration>;\n}\n\nexport function getAppSpecSchemaUrl(host: string): string {\n return `${host.replace(/\\/$/, '')}/schema/${APP_SPEC_FILE_NAME}?version=${APP_SPEC_VERSION}`;\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 const entries = Object.entries(spec.resources ?? {});\n\n for (const [name, resource] of entries) {\n // Only label the resource when there is more than one to tell apart.\n if (entries.length > 1) {\n lines.push(` resource: ${name}`);\n }\n lines.push(` image: ${resource.image ?? 'default (node-22-slim)'}`);\n if (resource.root && resource.root !== '.') {\n lines.push(` root: ${resource.root}`);\n }\n lines.push(...formatCommands('build', resource.build, 'default (npm install)'));\n lines.push(...formatCommands('start', resource.start, '(none)'));\n for (const mount of resource.static ?? []) {\n lines.push(` static: ${mount.path} -> ${mount.dir}/`);\n }\n }\n\n /*\n Values are not printed: a declaration carries only a name and a type, and\n the literal on a build-scoped entry is not worth the width here.\n */\n for (const [key, declaration] of Object.entries(spec.env ?? {})) {\n lines.push(` env: ${key} (${declaration.type ?? 'text'})`);\n }\n\n return lines;\n}\n\n// One line per command, in the order they run. A missing list is filled in\n// by the server's default; an empty one is the user saying there is none.\nfunction formatCommands(\n label: string,\n list: CommandList | undefined,\n whenMissing: string\n): string[] {\n const prefix = ` ${`${label}:`.padEnd(8)} `;\n if (!list) {\n return [`${prefix}${whenMissing}`];\n }\n if (list.commands.length === 0) {\n return [`${prefix}(none)`];\n }\n return list.commands.map((command) => `${prefix}${command}`);\n}\n","import { promises as fs } from 'fs';\nimport { isAbsolute, relative, resolve, sep } from 'path';\n\n// The archive remains rooted at cwd; a resource's 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('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('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(`root \"${root}\" does not exist.`);\n }\n if (!isInside(archiveRoot, appRoot) || !(await fs.stat(appRoot)).isDirectory()) {\n throw new Error('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.config.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, 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', 'resources', 'env'];\n\n// Reads and checks modelence.config.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 for (const resource of Object.values(spec.resources ?? {})) {\n if (resource?.root !== undefined) {\n await resolveAppRoot(cwd, resource.root);\n }\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 ['resources', 'env'] 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 // Studio rejects these too, but only after the archive is packed and\n // uploaded, and the plan printed before that reads these shapes as typed.\n // An empty build list is \"no build step\"; an empty command never is.\n for (const [name, resource] of Object.entries(spec.resources ?? {})) {\n if (!isPlainObject(resource)) {\n throw new Error(`${APP_SPEC_FILE_NAME}: \"resources.${name}\" must be an object.`);\n }\n for (const section of ['build', 'start'] as const) {\n assertCommandList(resource[section], `resources.${name}.${section}`);\n }\n }\n}\n\nfunction assertCommandList(list: unknown, path: string): void {\n if (list === undefined) {\n return;\n }\n if (!isPlainObject(list) || !Array.isArray(list.commands)) {\n throw new Error(\n `${APP_SPEC_FILE_NAME}: \"${path}\" must be an object with a \"commands\" array, e.g. { \"commands\": [\"npm ci\"] }.`\n );\n }\n list.commands.forEach((command: unknown, index: number) => {\n if (typeof command !== 'string') {\n throw new Error(`${APP_SPEC_FILE_NAME}: \"${path}.commands.${index}\" must be a string.`);\n }\n if (command.trim() === '') {\n throw new Error(`${APP_SPEC_FILE_NAME}: \"${path}.commands.${index}\" must not be empty.`);\n }\n });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\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, by resource name.\nexport interface ResolvedSpec {\n runtime: string;\n resources: Record<\n string,\n {\n type: string;\n build: { image: string; root: string; commands: string[] };\n web: { start: string | null; static: StaticMount[] };\n }\n >;\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { APP_SPEC_FILE_NAME, readAppSpecFile } from './appSpec';\nimport type { UploadKind } from './deployUpload';\n\n/*\n Which upload `modelence deploy` makes. Two paths exist:\n\n - `source`: the tree is uploaded and built remotely as modelence.config.json\n describes — the path for any Node.js app.\n - `bundle`: the historical Modelence path — build locally, upload\n .modelence/build.\n\n `--prebuilt` forces `bundle`. Otherwise a modelence.config.json means `source`.\n Without either, a project that depends on the `modelence` package is a\n framework app that deployed with this command long before the file\n existed, so it keeps the bundle path unchanged; anything else is `source`,\n where the missing file is reported with the setup prompt. Detecting the\n framework by its dependency is a fact about the project, not a guess about\n how to build it.\n*/\n\nexport type DeployKindReason = 'prebuilt-flag' | 'spec-file' | 'modelence-dependency' | 'default';\n\nexport interface DeployKindDecision {\n kind: UploadKind;\n reason: DeployKindReason;\n}\n\nexport async function resolveDeployKind(\n cwd: string,\n options: { prebuilt?: boolean }\n): Promise<DeployKindDecision> {\n if (options.prebuilt) {\n return { kind: 'bundle', reason: 'prebuilt-flag' };\n }\n if ((await readAppSpecFile(cwd)) !== null) {\n return { kind: 'source', reason: 'spec-file' };\n }\n if (await dependsOnModelence(cwd)) {\n return { kind: 'bundle', reason: 'modelence-dependency' };\n }\n return { kind: 'source', reason: 'default' };\n}\n\nexport function describeDeployKind(decision: DeployKindDecision): string | null {\n if (decision.reason !== 'modelence-dependency') {\n return null;\n }\n return (\n `No ${APP_SPEC_FILE_NAME} found; this is a Modelence app, so it is built locally and uploaded as before. ` +\n `Add a ${APP_SPEC_FILE_NAME} to build it on Modelence Cloud instead.`\n );\n}\n\nasync function dependsOnModelence(cwd: string): Promise<boolean> {\n let content: string;\n try {\n content = await fs.readFile(join(cwd, 'package.json'), 'utf8');\n } catch {\n return false;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n // An unreadable package.json is the app's problem to report, not a\n // reason to pick a deploy path; the source path's checks will surface it.\n return false;\n }\n if (!parsed || typeof parsed !== 'object') {\n return false;\n }\n const manifest = parsed as Record<string, unknown>;\n return ['dependencies', 'devDependencies'].some((field) => {\n const section = manifest[field];\n return Boolean(section && typeof section === 'object' && 'modelence' in section);\n });\n}\n","import type { DeployOptions } from './deploy';\nimport type { HostProject } 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: HostProject,\n // Studios the project has a saved target for, when it has none for this one.\n otherHosts: string[] = []\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.env && !options.app && otherHosts.length > 0) {\n throw new Error(\n `--env needs --app here: ${describeOtherHosts(otherHosts)} Pass --app too, or --host to deploy there.`\n );\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\nexport function describeOtherHosts(otherHosts: string[]): string {\n return `the target saved in .modelence/project.json is for ${otherHosts.join(', ')}, not this Studio.`;\n}\n\n// How the target reads in the CLI output, with where it came from.\nexport function describeTarget(target: CliTarget, project: HostProject): string {\n if ('environmentId' in target) {\n const saved = project.deploy;\n const name =\n saved?.environmentId === target.environmentId\n ? `${saved.appAlias}/${saved.envAlias}`\n : target.environmentId;\n return `${name} (saved in .modelence/project.json)`;\n }\n if ('appAlias' in target) {\n return `${target.appAlias}/${target.envAlias}`;\n }\n return target.envAlias;\n}\n\n/*\n Flags naming another environment than the one this project normally\n deploys to. A plain `modelence deploy` goes to the saved target, so a\n flag that points elsewhere (production, say) is worth a second look.\n*/\nexport function differsFromSavedTarget(target: CliTarget, project: HostProject): boolean {\n const saved = project.deploy;\n if (!saved || 'environmentId' in target) {\n return false;\n }\n if ('appAlias' in target && target.appAlias !== saved.appAlias) {\n return true;\n }\n return target.envAlias !== saved.envAlias;\n}\n","import { createInterface } from 'readline';\n\n/*\n Whether someone is at the terminal to answer a question or approve a\n sign-in in the browser. CI runners, GitHub Actions and agent sandboxes set\n CI or run without a TTY; waiting on them would only hang until a timeout.\n*/\nexport function isInteractive(): boolean {\n return !process.env.CI && Boolean(process.stdin.isTTY);\n}\n\nexport async function confirm(question: string): Promise<boolean> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => rl.question(`${question} (y/N) `, resolve));\n rl.close();\n return answer.trim().toLowerCase() === 'y';\n}\n\n// The parts of stdin a secret prompt uses; a test passes its own.\ninterface SecretInput {\n isRaw?: boolean;\n setRawMode?: (mode: boolean) => unknown;\n setEncoding: (encoding: BufferEncoding) => unknown;\n on: (event: 'data', listener: (chunk: string) => void) => unknown;\n removeListener: (event: 'data', listener: (chunk: string) => void) => unknown;\n resume: () => unknown;\n pause: () => unknown;\n}\n\n/*\n One line of input. A secret is read in raw mode and echoed only as\n asterisks — never through readline, whose redraws (after a backspace, on\n wrapping) would print the typed value back in clear.\n*/\nexport async function ask(\n question: string,\n {\n secret = false,\n input = process.stdin,\n output = process.stdout,\n }: { secret?: boolean; input?: SecretInput; output?: Pick<NodeJS.WriteStream, 'write'> } = {}\n): Promise<string> {\n if (!secret) {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => rl.question(question, resolve));\n rl.close();\n return answer;\n }\n if (!input.setRawMode) {\n throw new Error('A secret can only be entered in an interactive terminal');\n }\n const setRawMode = input.setRawMode.bind(input);\n output.write(question);\n return await new Promise<string>((resolve, reject) => {\n let chars: string[] = [];\n const wasRaw = Boolean(input.isRaw);\n const finish = () => {\n input.removeListener('data', onData);\n setRawMode(wasRaw);\n input.pause();\n output.write('\\n');\n };\n const onData = (chunk: string) => {\n // Arrow keys and other escape sequences arrive as one chunk; none of them is input.\n if (chunk.startsWith('\\u001b')) {\n return;\n }\n for (const char of chunk) {\n if (char === '\\r' || char === '\\n') {\n finish();\n resolve(chars.join(''));\n return;\n }\n if (char === '\\u0003' || char === '\\u0004') {\n finish();\n reject(new Error('Cancelled'));\n return;\n }\n if (char === '\\u007f' || char === '\\b') {\n if (chars.length > 0) {\n chars = chars.slice(0, -1);\n output.write('\\b \\b');\n }\n } else if (char >= ' ') {\n chars = [...chars, char];\n output.write('*');\n }\n }\n };\n setRawMode(true);\n input.setEncoding('utf8');\n input.resume();\n input.on('data', onData);\n });\n}\n","import { APP_SPEC_FILE_NAME } from './appSpec';\n\n/*\n Variables modelence.config.json declares that have no value in the target\n environment, as Studio reports them. Named next to the config page because\n an app started without them usually dies with its own message (\"DATABASE_URL\n must be set...\") that says nothing about where values are set.\n*/\nexport function describeMissingEnvVars(\n keys: string[] | undefined,\n configUrl: string | undefined,\n { deployAgain = false }: { deployAgain?: boolean } = {}\n): string | null {\n if (!keys || keys.length === 0) {\n return null;\n }\n const one = keys.length === 1;\n const where = configUrl ? ` Set ${one ? 'it' : 'them'} at ${configUrl}` : '';\n return (\n `${keys.join(', ')} ${one ? 'is' : 'are'} declared in ${APP_SPEC_FILE_NAME} but ` +\n `${one ? 'has' : 'have'} no value in this environment.` +\n (where ? where + (deployAgain ? ', then deploy again.' : '') : '')\n );\n}\n","import { StudioApiError, studioRequest } from './studioApi';\nimport { isUnauthorized, type Session } from './deploySession';\nimport { describeMissingEnvVars } from './missingEnv';\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 // Where the next poll resumes the build log; null until the log exists.\n logCursor: string | null;\n siteUrl: string | null;\n // Last output of the containers a failed rollout tried to start.\n containerLogs?: string[];\n // On a failure: declared variables still without a value, and where to set them.\n missingEnvVars?: string[];\n configUrl?: 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 logCursor: string | null = null;\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, ...(logCursor ? { logCursor } : {}) },\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 hands back the cursor it got, or\n // none; keeping ours avoids replaying the whole log on the next poll.\n logCursor = status.logCursor ?? logCursor;\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 const containerLogs = status.containerLogs ?? [];\n // First, so the errors and container output below it stay what is left\n // on screen: a missing value is only the cause when nothing else failed,\n // so \"deploy again\" is only suggested then.\n const missing = describeMissingEnvVars(status.missingEnvVars, status.configUrl, {\n deployAgain: status.errors.length === 0 && containerLogs.length === 0,\n });\n if (missing) {\n console.error(missing);\n }\n for (const error of status.errors) {\n console.error(` ${error}`);\n }\n if (containerLogs.length > 0) {\n console.error('Container output:');\n for (const line of 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 { CliTarget } from './deployTarget';\nimport type { Session } from './deploySession';\nimport type { ResolvedSpec } from './deploySpec';\nimport { waitForEnvironmentReady } from './deployStatus';\nimport { studioRequest } from './studioApi';\nimport { describeMissingEnvVars } from './missingEnv';\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}: {\n session: Session;\n target: CliTarget;\n kind: UploadKind;\n archivePath: string;\n // The project's modelence.config.json; required by Studio for source uploads.\n spec?: AppSpec;\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 Studio versions before source deploys answer without the environment\n id, ignore `kind` and `spec`, and would build the upload as a prebuilt\n Modelence bundle. Stopping here beats deploying something else.\n */\n if (!upload.environmentId) {\n throw new Error(\n 'Modelence Cloud is too old for this CLI version (no environment id from /api/upload-bundle). ' +\n 'Try again later, or deploy with modelence@0.25.'\n );\n }\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 // Absent on Studio versions before it was reported.\n missingEnvVars?: string[];\n configUrl?: string;\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 console.log(`Deployment started: ${result.deploymentUrl}`);\n const missing = describeMissingEnvVars(result.missingEnvVars, result.configUrl);\n if (missing) {\n console.warn(`Warning: ${missing}`);\n }\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 type { EnvDeclaration } from './appSpec';\nimport { APP_SPEC_FILE_NAME } from './appSpec';\nimport type { CliTarget } from './deployTarget';\nimport type { Session } from './deploySession';\nimport { StudioApiError, studioRequest } from './studioApi';\nimport { ask } from './terminal';\n\n/*\n Before a deploy uploads anything: the variables modelence.config.json\n declares that the target has no value for are asked for at the terminal\n and set on the environment, so adding a variable to the file doesn't ship\n an app that can't start. Each one can be skipped; the deploy then names it\n again, as it always has. Only for someone at the terminal; CI deploys keep\n just the warning.\n*/\nexport async function fillMissingEnvVars({\n session,\n target,\n env,\n}: {\n session: Session;\n target: CliTarget;\n env: Record<string, EnvDeclaration> | undefined;\n}): Promise<void> {\n if (!env || Object.keys(env).length === 0) {\n return;\n }\n const request = (values: { key: string; value: string }[]) =>\n studioRequest<{ missingEnvVars: string[] }>(session.host, '/api/deploy/env', {\n method: 'POST',\n token: session.token,\n body: { ...target, env, values },\n });\n\n let missing: string[];\n try {\n ({ missingEnvVars: missing } = await request([]));\n } catch (error) {\n // A Studio without the route: the deploy's own warning still applies.\n if (error instanceof StudioApiError && error.status === 404) {\n return;\n }\n throw error;\n }\n if (missing.length === 0) {\n return;\n }\n\n const one = missing.length === 1;\n console.log(\n `${missing.join(', ')} ${one ? 'is' : 'are'} declared in ${APP_SPEC_FILE_NAME} but ` +\n `${one ? 'has' : 'have'} no value in this environment. ` +\n `Enter ${one ? 'it' : 'them'} now, or leave empty to skip:`\n );\n const values: { key: string; value: string }[] = [];\n for (const key of missing) {\n const secret = env[key]?.type === 'secret';\n const value = await ask(` ${key}${secret ? ' (secret)' : ''}: `, { secret });\n if (value.length > 0) {\n values.push({ key, value });\n }\n }\n if (values.length > 0) {\n await request(values);\n console.log(`Saved ${values.length} variable${values.length === 1 ? '' : 's'}.`);\n }\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 { otherTargetHosts, projectForHost, readProject, type HostProject } from './project';\nimport { packSource } from './source';\nimport { build } from './build';\nimport { prepareSpec } from './deploySpec';\nimport { describeDeployKind, resolveDeployKind } from './deployKind';\nimport type { AppSpec } from './appSpec';\nimport {\n describeOtherHosts,\n describeTarget,\n differsFromSavedTarget,\n resolveTargetFromOptions,\n type CliTarget,\n} from './deployTarget';\nimport { confirm, isInteractive } from './terminal';\nimport {\n assertEnvTokenHost,\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 { fillMissingEnvVars } from './deployEnv';\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.config.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 — and so does a\n Modelence framework app that has no modelence.config.json, so projects that\n deployed before the file existed keep deploying unchanged (deployKind.ts).\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. Only a target\n picked in the browser is recorded; flags deploy once and change nothing.\n\n Without someone at the terminal (CI, scripts, agent sandboxes) the browser\n is never opened: a missing token or target fails at once instead of\n waiting for an approval nobody will give.\n*/\n\nexport interface DeployOptions {\n app?: string;\n env?: string;\n host?: string;\n prebuilt?: boolean;\n yes?: boolean;\n}\n\nexport async function deploy(options: DeployOptions) {\n const cwd = process.cwd();\n const host = await resolveHost(options.host, cwd);\n assertEnvTokenHost(options.host, host);\n const decision = await resolveDeployKind(cwd, options);\n const kind: UploadKind = decision.kind;\n const kindNote = describeDeployKind(decision);\n if (kindNote) {\n console.log(kindNote);\n }\n const savedProject = await readProject(cwd);\n const project = projectForHost(savedProject, host);\n // Targets saved for another Studio don't apply here, but say so: a picker\n // or a \"pass --app and --env\" out of the blue would be a puzzle.\n const otherHosts = project.deploy ? [] : otherTargetHosts(savedProject, host);\n let target = resolveTargetFromOptions(options, project, otherHosts);\n let token = await resolveToken(host);\n if ((!token || !target) && !isInteractive()) {\n throw new Error(nonInteractiveMessage(Boolean(token), Boolean(target), otherHosts));\n }\n if (!target && otherHosts.length > 0) {\n console.log(\n `Note: ${describeOtherHosts(otherHosts)} Pick a target for ${host} in the browser, or pass --host to deploy there.`\n );\n }\n await confirmTarget(target, project, options.yes);\n\n // Local work first, so nothing is uploaded — and nobody is asked to sign\n // in — when it fails; a missing modelence.config.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 reportPackedSource(await packSource(cwd, archivePath));\n }\n\n // Set when the browser picker ran this time: its variables step already\n // asked for the missing values, so the terminal doesn't ask again.\n let pickedInBrowser = false;\n try {\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 env: spec?.env,\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, host);\n pickedInBrowser = true;\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 if (!isInteractive()) {\n throw new Error(\n 'Modelence Cloud rejected the token (expired or revoked), and nobody is at the terminal to sign in again. ' +\n 'Set a fresh MODELENCE_TOKEN. A deployment that already started keeps running; check the dashboard.'\n );\n }\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 env: spec?.env,\n });\n await rememberToken(host, auth.token, auth.expiresAt);\n if (auth.target) {\n target = { environmentId: auth.target.environmentId };\n await rememberTarget(auth.target, host);\n }\n session.token = auth.token;\n };\n\n if (!pickedInBrowser && isInteractive()) {\n const envTarget = target;\n const fill = () => fillMissingEnvVars({ session, target: envTarget, env: spec?.env });\n try {\n await fill();\n } catch (error) {\n if (!isUnauthorized(error)) {\n throw error;\n }\n await signInAgain();\n await fill();\n }\n }\n\n let started: StartedDeploy;\n try {\n started = await runDeploy({ session, target, kind, archivePath, spec });\n } catch (error) {\n if (!isUnauthorized(error)) {\n throw error;\n }\n await signInAgain();\n started = await runDeploy({ session, target, kind, archivePath, spec });\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 nonInteractiveMessage(\n hasToken: boolean,\n hasTarget: boolean,\n otherHosts: string[]\n): string {\n const needed = [\n hasTarget ? null : 'pass --app and --env',\n hasToken ? null : 'set MODELENCE_TOKEN',\n ].filter(Boolean);\n const hostNote =\n !hasTarget && otherHosts.length > 0\n ? ` Note: ${describeOtherHosts(otherHosts)} Pass --host to deploy there.`\n : '';\n return (\n 'Nobody is at the terminal to sign in or pick a target in the browser (CI or a non-interactive shell). ' +\n `To deploy from here, ${needed.join(' and ')}.${hostNote}`\n );\n}\n\n// Says where the deploy goes before anything is built, and asks first when\n// flags point away from the environment this project normally deploys to.\nasync function confirmTarget(\n target: CliTarget | null,\n project: HostProject,\n yes: boolean | undefined\n): Promise<void> {\n if (!target) {\n return;\n }\n const label = describeTarget(target, project);\n console.log(`Deploying to ${label}`);\n if (yes || !differsFromSavedTarget(target, project) || !isInteractive()) {\n return;\n }\n const saved = `${project.deploy?.appAlias}/${project.deploy?.envAlias}`;\n if (!(await confirm(`This project normally deploys to ${saved}. Deploy to ${label} instead?`))) {\n throw new Error('Cancelled.');\n }\n}\n\nconst LISTED_PATHS_LIMIT = 10;\n\nfunction formatPaths(paths: string[]): string {\n const shown = paths.slice(0, LISTED_PATHS_LIMIT).join(', ');\n const more = paths.length - LISTED_PATHS_LIMIT;\n return more > 0 ? `${shown} and ${more} more` : shown;\n}\n\n// What went into the upload and, by name, everything that did not or that\n// might surprise: the cloud build sees only what is listed as packed.\nfunction reportPackedSource(packed: Awaited<ReturnType<typeof packSource>>): void {\n console.log(\n `Packed ${packed.fileCount} files (${formatMb(packed.sizeBytes)})` +\n (packed.usedGit ? ' from git' : '; not a git repository, so only default exclusions applied')\n );\n if (packed.excludedFiles.length > 0) {\n console.log(\n `Not uploaded (local, generated or credentials; store secrets in the target environment): ${formatPaths(packed.excludedFiles)}`\n );\n }\n if (packed.committedEnvFiles.length > 0) {\n console.log(\n `Uploaded environment files committed to git: ${formatPaths(packed.committedEnvFiles)}`\n );\n }\n for (const { path, reason } of packed.skipped) {\n console.warn(`Warning: ${path} is not uploaded (${reason}).`);\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 { normalizeHost } from './deploySession';\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 // Normalized like deploy's resolveHost, so the cache key matches.\n const host = options.host ? normalizeHost(options.host) : undefined;\n const cached = await listCachedTokens(host);\n await Promise.all(cached.map((entry) => revokeToken(entry.host, entry.token)));\n await clearCachedToken(host);\n console.log(\n host ? `Removed the saved login for ${host}.` : `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 getAppSpecSchemaUrl,\n writeAppSpecFile,\n type AppSpec,\n} from './appSpec';\nimport { resolveHost } from './deploySession';\n\n/*\n `modelence init`: write a modelence.config.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\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 // The host deploy will use, so the schema comes from the Studio that\n // validates the file.\n const schemaHost = await resolveHost(options.host, cwd);\n const template: AppSpec = {\n $schema: getAppSpecSchemaUrl(schemaHost),\n resources: {\n app: {\n type: 'service',\n image: 'node-22-slim',\n build: { commands: ['npm ci'] },\n static: [],\n },\n },\n env: {},\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(\n `Once ${APP_SPEC_FILE_NAME} describes your app, run \\`npx modelence@latest deploy\\`.`\n );\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.config.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 .option(\n '-y, --yes',\n 'Deploy to the given --app/--env without asking, even if it is not the saved target'\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.config.json template for this project')\n .option('--force', 'Overwrite an existing modelence.config.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"]}
|