devsurface 0.3.0 → 0.4.0
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/CHANGELOG.md +23 -0
- package/README.md +52 -10
- package/dist/cli/index.js +776 -189
- package/dist/cli/index.js.map +1 -1
- package/package.json +2 -2
- package/src/web/dist/assets/index-BO8glxtu.js +10 -0
- package/src/web/dist/assets/index-Bj8suDpq.css +1 -0
- package/src/web/dist/index.html +2 -2
- package/src/web/dist/assets/index-7njY8n4D.js +0 -10
- package/src/web/dist/assets/index-DvunFIw4.css +0 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/doctor.ts","../../src/core/doctor/index.ts","../../src/core/documentation.ts","../../src/core/scanner/index.ts","../../src/core/config/load.ts","../../src/core/security/url.ts","../../src/core/config/defaults.ts","../../src/core/docker/compose.ts","../../src/core/process/executable.ts","../../src/core/scanner/docker.ts","../../src/core/scanner/env.ts","../../src/core/scanner/framework.ts","../../src/core/scanner/git.ts","../../src/core/scanner/packageManager.ts","../../src/core/scanner/packageJson.ts","../../src/core/scanner/ports.ts","../../src/core/scanner/scripts.ts","../../src/core/security/text.ts","../../src/cli/commands/init.ts","../../src/cli/commands/run.ts","../../src/core/process/runner.ts","../../src/core/security/dangerousCommand.ts","../../src/cli/commands/scan.ts","../../src/cli/commands/start.ts","../../src/server/index.ts","../../node_modules/open/index.js","../../node_modules/wsl-utils/index.js","../../node_modules/is-wsl/index.js","../../node_modules/is-inside-container/index.js","../../node_modules/is-docker/index.js","../../node_modules/define-lazy-prop/index.js","../../node_modules/default-browser/index.js","../../node_modules/default-browser-id/index.js","../../node_modules/run-applescript/index.js","../../node_modules/bundle-name/index.js","../../node_modules/default-browser/windows.js","../../src/core/process/manager.ts","../../src/server/routes/api.ts","../../src/server/localAccess.ts","../../src/server/mutationToken.ts","../../src/server/terminal.ts","../../src/server/routes/ws.ts","../../src/version.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { doctorCommand } from './commands/doctor.js';\nimport { initCommand } from './commands/init.js';\nimport { runCommand } from './commands/run.js';\nimport { scanCommand } from './commands/scan.js';\nimport { startCommand } from './commands/start.js';\nimport { DEV_SURFACE_VERSION } from '../version.js';\n\nconst program = new Command();\n\nfunction toPort(value: string): number {\n const port = Number(value);\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error('Port must be an integer between 1 and 65535.');\n }\n\n return port;\n}\n\nfunction handle(command: Promise<void>): void {\n command.catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n}\n\nprogram\n .name('devsurface')\n .description('Turn any Node.js repository into a local developer control panel.')\n .version(DEV_SURFACE_VERSION)\n .option('-p, --port <port>', 'dashboard port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n startCommand({\n cwd: process.cwd(),\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nprogram\n .command('scan')\n .description('Print detected project info.')\n .action(() => {\n handle(scanCommand(process.cwd()));\n });\n\nprogram\n .command('doctor')\n .description('Print setup health warnings.')\n .action(() => {\n handle(doctorCommand(process.cwd()));\n });\n\nprogram\n .command('init')\n .description('Create a starter devsurface.config.json.')\n .action(() => {\n handle(initCommand(process.cwd()));\n });\n\nprogram\n .command('run')\n .argument('<script>', 'package.json script to run')\n .description('Run a package script and stream logs.')\n .action((script: string) => {\n handle(runCommand(script, process.cwd()));\n });\n\nawait program.parseAsync(process.argv);\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction colorSeverity(severity: 'error' | 'warning' | 'info'): string {\n if (severity === 'error') {\n return pc.red('error');\n }\n\n if (severity === 'warning') {\n return pc.yellow('warning');\n }\n\n return pc.cyan('info');\n}\n\nexport async function doctorCommand(cwd = process.cwd()): Promise<void> {\n const warnings = await runDoctor(cwd);\n\n if (warnings.length === 0) {\n console.log(pc.green('No health warnings found.'));\n return;\n }\n\n for (const item of warnings) {\n console.log(`${colorSeverity(item.severity)} ${pc.bold(safeTerminalText(item.title))}`);\n console.log(` ${safeTerminalText(item.message)}`);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { extractScriptReferences } from '../documentation.js';\nimport type { DoctorWarning, ScanResult } from '../types.js';\nimport { scanProject } from '../scanner/index.js';\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readIfPresent(filePath: string | null): Promise<string | null> {\n if (filePath === null) {\n return null;\n }\n\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction warning(\n id: string,\n severity: DoctorWarning['severity'],\n title: string,\n message: string,\n target?: string\n): DoctorWarning {\n return { id, severity, title, message, target };\n}\n\nexport async function runDoctor(root = process.cwd(), scan?: ScanResult): Promise<DoctorWarning[]> {\n const result = scan ?? (await scanProject(root));\n const warnings: DoctorWarning[] = [];\n\n for (const configWarning of result.config?.warnings ?? []) {\n warnings.push(\n warning('config-warning', 'warning', 'Config warning', configWarning, result.config?.path)\n );\n }\n\n if (result.packageJson === null) {\n warnings.push(\n warning(\n 'missing-package-json',\n 'error',\n 'No package.json',\n 'This directory is not a Node.js project.'\n )\n );\n return warnings;\n }\n\n if (!(await pathExists(path.join(root, 'node_modules', '.bin')))) {\n warnings.push(\n warning(\n 'missing-node-modules',\n 'warning',\n 'Dependencies are not installed',\n 'node_modules/.bin is missing. Run the project install command before starting scripts.'\n )\n );\n }\n\n if (result.env?.hasExample && !result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env',\n 'error',\n '.env is missing',\n '.env.example exists, but the local .env file is missing.',\n result.env.examplePath ?? undefined\n )\n );\n }\n\n if (result.env && result.env.missingKeys.length > 0 && result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env-keys',\n 'warning',\n 'Environment keys are missing',\n `Missing keys: ${result.env.missingKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n if (result.env && result.env.emptyKeys.length > 0) {\n warnings.push(\n warning(\n 'empty-env-keys',\n 'info',\n 'Environment keys are empty',\n `Empty keys: ${result.env.emptyKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n const missingReadme = !result.readme.exists;\n if (missingReadme) {\n warnings.push(\n warning('missing-readme', 'warning', 'No README', 'No README.md or README file was found.')\n );\n } else {\n const readme = await readIfPresent(result.readme.path);\n if (readme !== null) {\n const references = extractScriptReferences(readme);\n const missingScripts = references.filter((script) => result.scripts[script] === undefined);\n if (missingScripts.length > 0) {\n warnings.push(\n warning(\n 'readme-script-mismatch',\n 'warning',\n 'README references missing scripts',\n `README mentions scripts not present in package.json: ${missingScripts.join(', ')}.`\n )\n );\n }\n }\n }\n\n for (const port of result.ports.filter((probe) => probe.inUse)) {\n warnings.push(\n warning(\n `port-${port.port}-in-use`,\n 'error',\n `Port ${port.port} is already in use`,\n `Something is already bound to 127.0.0.1:${port.port}.`\n )\n );\n }\n\n if (result.docker && result.docker.dockerRunning === false) {\n warnings.push(\n warning(\n 'docker-not-running',\n 'warning',\n 'Docker Compose found but Docker is not running',\n result.docker.message ?? 'A compose file exists, but Docker is not available.'\n )\n );\n }\n\n if (result.scripts.test === undefined) {\n warnings.push(\n warning(\n 'missing-test-script',\n 'warning',\n 'No test script',\n 'package.json does not define a test script.'\n )\n );\n }\n\n if (result.scripts.build === undefined) {\n warnings.push(\n warning(\n 'missing-build-script',\n 'warning',\n 'No build script',\n 'package.json does not define a build script.'\n )\n );\n }\n\n return warnings;\n}\n","export function extractScriptReferences(content: string): string[] {\n const references = new Set<string>();\n const commandRegexes = [\n /\\bnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bpnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bbun\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\byarn\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bnpm\\s+(test|start|build)\\b/g,\n /\\bpnpm\\s+(test|start|build)\\b/g,\n /\\byarn\\s+(test|start|build)\\b/g,\n /\\bbun\\s+(test|start|build)\\b/g\n ];\n\n for (const regex of commandRegexes) {\n for (const match of content.matchAll(regex)) {\n references.add(match[1]);\n }\n }\n\n return Array.from(references);\n}\n\nexport function documentsEnvironmentSetup(content: string): boolean {\n return /(?:\\.env(?:\\.example)?|environment\\s+variables?)/i.test(content);\n}\n\nexport function undocumentedPorts(content: string, ports: number[]): number[] {\n return ports.filter((port) => !new RegExp(`\\\\b${port}\\\\b`).test(content));\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FilePresence, ScanResult } from '../types.js';\nimport { loadConfig } from '../config/load.js';\nimport { detectDocker } from './docker.js';\nimport { detectEnv } from './env.js';\nimport { detectFramework } from './framework.js';\nimport { detectGit } from './git.js';\nimport { detectPackageManager } from './packageManager.js';\nimport { readPackageJson } from './packageJson.js';\nimport { defaultPortsForFramework, detectPorts, inferPortsFromScripts } from './ports.js';\nimport { extractScripts } from './scripts.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function findFirstFile(root: string, candidates: string[]): Promise<FilePresence> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n\n for (const candidate of candidates) {\n const filePath = path.join(root, candidate);\n try {\n const [stat, realPath] = await Promise.all([fs.stat(filePath), fs.realpath(filePath)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realPath)) {\n return { path: realPath, exists: true };\n }\n } catch {\n // Keep looking through the candidate list.\n }\n }\n\n return { path: null, exists: false };\n}\n\nfunction configuredPorts(configPorts: number[] | undefined): number[] {\n return Array.isArray(configPorts) ? configPorts : [];\n}\n\nexport async function scanProject(root = process.cwd()): Promise<ScanResult> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const config = await loadConfig(resolvedRoot);\n const packageJson = await readPackageJson(resolvedRoot);\n const scripts = extractScripts(packageJson) ?? {};\n const framework = detectFramework(packageJson);\n const portsToProbe = [\n ...configuredPorts(config?.config.ports),\n ...inferPortsFromScripts(scripts),\n ...defaultPortsForFramework(framework)\n ];\n\n const [packageManager, env, docker, git, ports, readme, license] = await Promise.all([\n detectPackageManager(resolvedRoot),\n detectEnv(resolvedRoot, config?.config),\n detectDocker(resolvedRoot),\n detectGit(resolvedRoot),\n detectPorts(portsToProbe),\n findFirstFile(resolvedRoot, ['README.md', 'README']),\n findFirstFile(resolvedRoot, ['LICENSE', 'LICENSE.md', 'COPYING'])\n ]);\n\n return {\n root: resolvedRoot,\n projectName: config?.config.name ?? packageJson?.data.name ?? path.basename(resolvedRoot),\n packageJson,\n packageManager: packageManager ?? (packageJson ? 'npm' : null),\n scripts,\n env,\n docker,\n git,\n framework,\n ports: ports ?? [],\n readme,\n license,\n config\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { isSafeHttpUrl } from '../security/url.js';\nimport type { ConfigLoadResult, DevSurfaceConfig } from '../types.js';\nimport { CONFIG_FILE_NAME } from './defaults.js';\n\nexport const MAX_CONFIGURED_PORTS = 32;\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toStringRecord(\n value: unknown,\n warnings: string[],\n label: string\n): Record<string, string> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push(`${label} must be an object.`);\n return undefined;\n }\n\n const record: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'string') {\n record[key] = raw;\n } else {\n warnings.push(`${label}.${key} must be a string.`);\n }\n }\n\n return record;\n}\n\nfunction toGroups(value: unknown, warnings: string[]): Record<string, string[]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push('groups must be an object.');\n return undefined;\n }\n\n const groups: Record<string, string[]> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (Array.isArray(raw) && raw.every((entry) => typeof entry === 'string')) {\n groups[key] = raw;\n } else {\n warnings.push(`groups.${key} must be an array of command names.`);\n }\n }\n\n return groups;\n}\n\nfunction toPorts(value: unknown, warnings: string[]): number[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('ports must be an array of numbers.');\n return undefined;\n }\n\n const ports = value.filter(\n (port): port is number => Number.isInteger(port) && port > 0 && port < 65536\n );\n if (ports.length !== value.length) {\n warnings.push('ports may only contain integers between 1 and 65535.');\n }\n\n if (ports.length > MAX_CONFIGURED_PORTS) {\n warnings.push(`ports may contain at most ${MAX_CONFIGURED_PORTS} entries.`);\n }\n\n return ports.slice(0, MAX_CONFIGURED_PORTS);\n}\n\nexport function validateConfig(raw: unknown): { config: DevSurfaceConfig; warnings: string[] } {\n const warnings: string[] = [];\n if (!isRecord(raw)) {\n return { config: {}, warnings: ['devsurface.config.json must contain a JSON object.'] };\n }\n\n const env = isRecord(raw.env)\n ? {\n example: typeof raw.env.example === 'string' ? raw.env.example : undefined,\n local: typeof raw.env.local === 'string' ? raw.env.local : undefined\n }\n : undefined;\n\n if (raw.env !== undefined && !isRecord(raw.env)) {\n warnings.push('env must be an object.');\n }\n\n const services = isRecord(raw.services)\n ? {\n docker: typeof raw.services.docker === 'boolean' ? raw.services.docker : undefined\n }\n : undefined;\n\n if (raw.services !== undefined && !isRecord(raw.services)) {\n warnings.push('services must be an object.');\n }\n\n let docs: string | undefined;\n if (typeof raw.docs === 'string' && raw.docs.length > 0) {\n if (isSafeHttpUrl(raw.docs)) {\n docs = raw.docs;\n } else {\n warnings.push('docs must be an http or https URL.');\n }\n }\n\n return {\n config: {\n name: typeof raw.name === 'string' ? raw.name : undefined,\n description: typeof raw.description === 'string' ? raw.description : undefined,\n commands: toStringRecord(raw.commands, warnings, 'commands'),\n groups: toGroups(raw.groups, warnings),\n ports: toPorts(raw.ports, warnings),\n env,\n services,\n docs\n },\n warnings\n };\n}\n\nexport async function loadConfig(root: string): Promise<ConfigLoadResult | null> {\n const configPath = path.join(root, CONFIG_FILE_NAME);\n\n try {\n const [realRoot, realConfigPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(configPath)\n ]);\n if (!isWithinRoot(realRoot, realConfigPath)) {\n return null;\n }\n const content = await fs.readFile(realConfigPath, 'utf8');\n const parsed = JSON.parse(content) as unknown;\n const { config, warnings } = validateConfig(parsed);\n return { path: realConfigPath, config, warnings };\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'ENOENT') {\n return null;\n }\n\n if (error instanceof SyntaxError) {\n return {\n path: configPath,\n config: {},\n warnings: [`${CONFIG_FILE_NAME} contains invalid JSON.`]\n };\n }\n\n return null;\n }\n}\n","export function isSafeHttpUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n","import type { DevSurfaceConfig } from '../types.js';\n\nexport const CONFIG_FILE_NAME = 'devsurface.config.json';\n\nexport const defaultConfig: DevSurfaceConfig = {\n name: 'My App',\n description: 'Local developer control panel',\n commands: {\n install: 'npm install',\n dev: 'npm run dev',\n build: 'npm run build',\n test: 'npm test',\n lint: 'npm run lint'\n },\n groups: {\n Setup: ['install'],\n Development: ['dev'],\n Quality: ['test', 'lint'],\n Build: ['build']\n },\n ports: [3000],\n env: {\n example: '.env.example',\n local: '.env'\n },\n services: {\n docker: true\n },\n docs: ''\n};\n","import { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport { parse as parseYaml } from 'yaml';\nimport { resolveExecutableOutsideRoot } from '../process/executable.js';\nimport type {\n DockerDaemonStatus,\n DockerInfo,\n DockerServiceInfo,\n DockerServiceStatus\n} from '../types.js';\n\nconst COMPOSE_FILES = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];\nconst COMMAND_OUTPUT_LIMIT = 200_000;\nconst ESC = String.fromCharCode(27);\nconst ANSI_CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\n\nexport interface DockerCommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error: 'not-found' | 'timeout' | 'spawn' | null;\n}\n\nexport interface DockerCommandOptions {\n timeoutMs?: number;\n outputLimit?: number;\n}\n\nexport type DockerCommandRunner = (\n root: string,\n args: string[],\n options?: DockerCommandOptions\n) => Promise<DockerCommandResult>;\n\nexport interface DockerActionResult {\n service: string;\n action: 'start' | 'stop';\n output: string;\n}\n\nexport interface DockerLogsResult {\n service: string;\n logs: string;\n}\n\nexport interface DockerController {\n inspect(): Promise<DockerInfo | null>;\n start(service: string): Promise<DockerActionResult>;\n stop(service: string): Promise<DockerActionResult>;\n logs(service: string): Promise<DockerLogsResult>;\n}\n\nexport type DockerOperationErrorCode =\n | 'compose-not-found'\n | 'service-not-found'\n | 'docker-not-installed'\n | 'docker-not-running'\n | 'command-failed';\n\nexport class DockerOperationError extends Error {\n constructor(\n public readonly code: DockerOperationErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'DockerOperationError';\n }\n}\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction dockerCommandCwd(root: string): string {\n const candidates = [os.homedir(), os.tmpdir(), path.parse(path.resolve(root)).root];\n return candidates.find((candidate) => !isWithinRoot(root, candidate)) ?? os.homedir();\n}\n\nfunction appendBounded(current: string, chunk: string, limit: number): string {\n const combined = current + chunk;\n return combined.length <= limit ? combined : combined.slice(-limit);\n}\n\nexport const runDockerCommand: DockerCommandRunner = async (root, args, options = {}) => {\n const dockerExecutable = await resolveExecutableOutsideRoot(root, 'docker');\n if (dockerExecutable === null) {\n return { code: null, stdout: '', stderr: '', error: 'not-found' };\n }\n\n const timeoutMs = options.timeoutMs ?? 5000;\n const outputLimit = options.outputLimit ?? COMMAND_OUTPUT_LIMIT;\n\n return await new Promise((resolve) => {\n const child = spawn(dockerExecutable, args, {\n cwd: dockerCommandCwd(root),\n windowsHide: true\n });\n let settled = false;\n let stdout = '';\n let stderr = '';\n\n const finish = (result: DockerCommandResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve(result);\n };\n\n const timeout = setTimeout(() => {\n child.kill();\n finish({ code: null, stdout, stderr, error: 'timeout' });\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout = appendBounded(stdout, chunk.toString(), outputLimit);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr = appendBounded(stderr, chunk.toString(), outputLimit);\n });\n child.on('error', () => {\n finish({ code: null, stdout, stderr, error: 'spawn' });\n });\n child.on('close', (code) => {\n finish({ code, stdout, stderr, error: null });\n });\n });\n};\n\nasync function findComposeFiles(root: string): Promise<string[]> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const matches: string[] = [];\n\n for (const file of COMPOSE_FILES) {\n const candidate = path.join(root, file);\n try {\n const [stat, realCandidate] = await Promise.all([fs.stat(candidate), fs.realpath(candidate)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realCandidate)) {\n matches.push(realCandidate);\n }\n } catch {\n // Continue through the supported Compose filenames.\n }\n }\n\n return matches;\n}\n\nasync function serviceNamesFromFiles(composeFiles: string[]): Promise<string[]> {\n const names = new Set<string>();\n\n for (const composeFile of composeFiles) {\n try {\n const parsed = parseYaml(await fs.readFile(composeFile, 'utf8')) as unknown;\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('services' in parsed) ||\n typeof parsed.services !== 'object' ||\n parsed.services === null ||\n Array.isArray(parsed.services)\n ) {\n continue;\n }\n\n for (const name of Object.keys(parsed.services)) {\n if (name.length > 0) {\n names.add(name);\n }\n }\n } catch {\n // Malformed files remain visible as Compose files, but expose no actions.\n }\n }\n\n return Array.from(names);\n}\n\nfunction composeArgs(root: string, composeFiles: string[], args: string[]): string[] {\n return [\n 'compose',\n ...composeFiles.flatMap((composeFile) => ['-f', composeFile]),\n '--project-directory',\n root,\n ...args\n ];\n}\n\nfunction cleanMessage(value: string): string {\n return value.replace(ANSI_CSI_SEQUENCE, '').trim().slice(-1000);\n}\n\nfunction resultMessage(result: DockerCommandResult): string {\n return cleanMessage(result.stderr || result.stdout);\n}\n\nfunction daemonStatus(\n result: DockerCommandResult,\n platform: NodeJS.Platform\n): {\n status: DockerDaemonStatus;\n running: boolean;\n message: string | null;\n} {\n if (result.error === 'not-found') {\n return {\n status: 'not-installed',\n running: false,\n message: 'Docker CLI was not found. Install Docker and refresh this page.'\n };\n }\n\n if (result.code === 0) {\n return { status: 'running', running: true, message: null };\n }\n\n if (platform === 'win32' || platform === 'darwin') {\n return {\n status: 'stopped',\n running: false,\n message:\n 'Docker is installed, but its engine is not responding. Start Docker Desktop and refresh.'\n };\n }\n\n const detail = resultMessage(result);\n return {\n status: result.error === 'timeout' ? 'unknown' : 'stopped',\n running: false,\n message: detail\n ? `Docker is installed, but its daemon is not responding: ${detail}`\n : 'Docker is installed, but its daemon is not responding. Start Docker and refresh.'\n };\n}\n\nfunction exitCodeFromRow(record: Record<string, unknown>): number | null {\n if (typeof record.ExitCode === 'number') {\n return record.ExitCode;\n }\n if (typeof record.ExitCode === 'string' && /^\\d+$/.test(record.ExitCode)) {\n return Number(record.ExitCode);\n }\n if (typeof record.Status === 'string') {\n const match = /\\bExited\\s+\\((\\d+)\\)/i.exec(record.Status);\n if (match?.[1]) {\n return Number(match[1]);\n }\n }\n return null;\n}\n\nfunction serviceStatusFromRow(record: Record<string, unknown>): DockerServiceStatus {\n const state = typeof record.State === 'string' ? record.State.toLowerCase() : '';\n const exitCode = exitCodeFromRow(record);\n\n if (state === 'running') {\n return 'running';\n }\n if (exitCode !== null && exitCode > 0) {\n return 'error';\n }\n if (state === 'created' || state === 'exited' || state === 'stopped') {\n return 'stopped';\n }\n if (state === 'dead' || state === 'restarting' || state === 'paused') {\n return 'error';\n }\n return 'unknown';\n}\n\nfunction addComposeStatusRow(statuses: Map<string, DockerServiceInfo>, row: unknown): void {\n if (typeof row !== 'object' || row === null) {\n return;\n }\n\n const record = row as Record<string, unknown>;\n if (typeof record.Service !== 'string') {\n return;\n }\n\n const detail =\n typeof record.Status === 'string' && record.Status.trim()\n ? record.Status.trim()\n : typeof record.State === 'string' && record.State.trim()\n ? record.State.trim()\n : null;\n\n statuses.set(record.Service, {\n name: record.Service,\n status: serviceStatusFromRow(record),\n statusDetail: detail,\n containerId: typeof record.ID === 'string' && record.ID.length > 0 ? record.ID : null\n });\n}\n\nfunction parseComposePs(output: string): Map<string, DockerServiceInfo> {\n const statuses = new Map<string, DockerServiceInfo>();\n const compactOutput = output.trim();\n if (!compactOutput) {\n return statuses;\n }\n\n try {\n const parsed = JSON.parse(compactOutput) as unknown;\n for (const row of Array.isArray(parsed) ? parsed : [parsed]) {\n addComposeStatusRow(statuses, row);\n }\n return statuses;\n } catch {\n // Older Compose builds can emit one JSON object per line.\n }\n\n for (const line of compactOutput.split(/\\r?\\n/)) {\n try {\n addComposeStatusRow(statuses, JSON.parse(line) as unknown);\n } catch {\n return new Map();\n }\n }\n\n return statuses;\n}\n\nfunction unknownServices(serviceNames: string[]): DockerServiceInfo[] {\n return serviceNames.map((name) => ({\n name,\n status: 'unknown',\n statusDetail: null,\n containerId: null\n }));\n}\n\nfunction commandFailureMessage(action: string, result: DockerCommandResult): string {\n const detail = resultMessage(result);\n return detail ? `Docker Compose ${action} failed: ${detail}` : `Docker Compose ${action} failed.`;\n}\n\nexport class DockerComposeController implements DockerController {\n private readonly runner: DockerCommandRunner;\n private readonly platform: NodeJS.Platform;\n\n constructor(\n private readonly root: string,\n options: {\n runner?: DockerCommandRunner;\n platform?: NodeJS.Platform;\n } = {}\n ) {\n this.runner = options.runner ?? runDockerCommand;\n this.platform = options.platform ?? process.platform;\n }\n\n private async definition(): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n } | null> {\n const composeFiles = await findComposeFiles(this.root);\n if (composeFiles.length === 0) {\n return null;\n }\n return {\n composeFiles,\n serviceNames: await serviceNamesFromFiles(composeFiles)\n };\n }\n\n private async requireService(service: string): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n }> {\n const definition = await this.definition();\n if (definition === null) {\n throw new DockerOperationError('compose-not-found', 'No Docker Compose file was found.');\n }\n if (!definition.serviceNames.includes(service)) {\n throw new DockerOperationError(\n 'service-not-found',\n `Docker Compose service \"${service}\" was not found.`\n );\n }\n return definition;\n }\n\n private async requireDaemon(): Promise<void> {\n const result = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(result, this.platform);\n if (daemon.status === 'not-installed') {\n throw new DockerOperationError('docker-not-installed', daemon.message ?? 'Docker not found.');\n }\n if (!daemon.running) {\n throw new DockerOperationError(\n 'docker-not-running',\n daemon.message ?? 'Docker is not running.'\n );\n }\n }\n\n async inspect(): Promise<DockerInfo | null> {\n const definition = await this.definition();\n if (definition === null) {\n return null;\n }\n\n const infoResult = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(infoResult, this.platform);\n if (!daemon.running) {\n return {\n composeFiles: definition.composeFiles,\n services: unknownServices(definition.serviceNames),\n dockerRunning: false,\n daemonStatus: daemon.status,\n message: daemon.message\n };\n }\n\n const ps = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, ['ps', '--all', '--format', 'json']),\n { timeoutMs: 8000 }\n );\n if (ps.code !== 0 || ps.error !== null) {\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map((name) => ({\n name,\n status: 'error',\n statusDetail: null,\n containerId: null\n })),\n dockerRunning: true,\n daemonStatus: 'running',\n message: commandFailureMessage('status check', ps)\n };\n }\n\n const statuses = parseComposePs(ps.stdout);\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map(\n (name) =>\n statuses.get(name) ?? {\n name,\n status: 'stopped',\n statusDetail: null,\n containerId: null\n }\n ),\n dockerRunning: true,\n daemonStatus: 'running',\n message: null\n };\n }\n\n private async action(service: string, action: 'start' | 'stop'): Promise<DockerActionResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const composeCommand =\n action === 'start' ? ['up', '-d', '--', service] : ['stop', '--', service];\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, composeCommand),\n { timeoutMs: 60_000 }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage(action, result));\n }\n return {\n service,\n action,\n output: cleanMessage(result.stdout || result.stderr)\n };\n }\n\n async start(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'start');\n }\n\n async stop(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'stop');\n }\n\n async logs(service: string): Promise<DockerLogsResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, [\n 'logs',\n '--no-color',\n '--tail',\n '200',\n '--',\n service\n ]),\n { timeoutMs: 15_000, outputLimit: COMMAND_OUTPUT_LIMIT }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage('logs', result));\n }\n return {\n service,\n logs: appendBounded('', `${result.stdout}${result.stderr}`, COMMAND_OUTPUT_LIMIT)\n };\n }\n}\n","import { constants } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction pathEntries(pathValue: string): string[] {\n return pathValue\n .split(path.delimiter)\n .map((entry) => entry.trim().replace(/^\"|\"$/g, ''))\n .filter((entry) => entry.length > 0);\n}\n\nfunction hasPathSeparator(command: string): boolean {\n return command.includes('/') || command.includes('\\\\');\n}\n\nfunction executableNames(command: string): string[] {\n if (process.platform !== 'win32' || path.extname(command)) {\n return [command];\n }\n\n const extensions = (process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD')\n .split(';')\n .map((extension) => extension.trim().toLowerCase())\n .filter(Boolean);\n return extensions.map((extension) => `${command}${extension}`);\n}\n\nasync function executableOutsideRoot(root: string, candidate: string): Promise<string | null> {\n if (isWithinRoot(root, candidate)) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n if (isWithinRoot(realRoot, realCandidate)) {\n return null;\n }\n\n await fs.access(realCandidate, constants.X_OK);\n return realCandidate;\n } catch {\n return null;\n }\n}\n\nexport async function resolveExecutableOutsideRoot(\n root: string,\n command: string\n): Promise<string | null> {\n if (path.isAbsolute(command) || hasPathSeparator(command)) {\n return await executableOutsideRoot(root, path.resolve(command));\n }\n\n for (const entry of pathEntries(process.env.PATH ?? '')) {\n const directory = path.resolve(entry);\n if (isWithinRoot(root, directory)) {\n continue;\n }\n\n for (const executableName of executableNames(command)) {\n const executable = await executableOutsideRoot(root, path.join(directory, executableName));\n if (executable !== null) {\n return executable;\n }\n }\n }\n\n return null;\n}\n","import { DockerComposeController } from '../docker/compose.js';\nimport type { DockerInfo } from '../types.js';\n\nexport async function detectDocker(root: string): Promise<DockerInfo | null> {\n return await new DockerComposeController(root).inspect();\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { DevSurfaceConfig, EnvInfo } from '../types.js';\n\ninterface ParsedEnv {\n keys: string[];\n emptyKeys: string[];\n}\n\nasync function readIfPresent(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction resolveInsideRoot(root: string, configuredPath: string): string | null {\n const resolvedRoot = path.resolve(root);\n const resolvedPath = path.resolve(resolvedRoot, configuredPath);\n const relative = path.relative(resolvedRoot, resolvedPath);\n const insideRoot = relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? resolvedPath : null;\n}\n\nasync function resolveExistingInsideRoot(\n root: string,\n configuredPath: string\n): Promise<string | null> {\n const candidate = resolveInsideRoot(root, configuredPath);\n if (candidate === null) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n const relative = path.relative(realRoot, realCandidate);\n const insideRoot =\n relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? candidate : null;\n } catch {\n return null;\n }\n}\n\nexport function parseEnvKeys(content: string): ParsedEnv {\n const keys: string[] = [];\n const emptyKeys: string[] = [];\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n const normalized = line.startsWith('export ') ? line.slice('export '.length).trim() : line;\n const separator = normalized.indexOf('=');\n if (separator <= 0) {\n continue;\n }\n\n const key = normalized.slice(0, separator).trim();\n const value = normalized.slice(separator + 1).trim();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n keys.push(key);\n if (value.length === 0 || value === '\"\"' || value === \"''\") {\n emptyKeys.push(key);\n }\n }\n }\n\n return { keys: Array.from(new Set(keys)), emptyKeys: Array.from(new Set(emptyKeys)) };\n}\n\nexport async function detectEnv(\n root: string,\n config?: DevSurfaceConfig | null\n): Promise<EnvInfo | null> {\n const exampleName = config?.env?.example ?? '.env.example';\n const localName = config?.env?.local ?? '.env';\n const [examplePath, localPath] = await Promise.all([\n resolveExistingInsideRoot(root, exampleName),\n resolveExistingInsideRoot(root, localName)\n ]);\n const [exampleContent, localContent] = await Promise.all([\n examplePath === null ? null : readIfPresent(examplePath),\n localPath === null ? null : readIfPresent(localPath)\n ]);\n\n if (exampleContent === null && localContent === null) {\n return null;\n }\n\n const example =\n exampleContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(exampleContent);\n const local = localContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(localContent);\n const localKeySet = new Set(local.keys);\n const localEmptySet = new Set(local.emptyKeys);\n const missingKeys = example.keys.filter((key) => !localKeySet.has(key));\n const emptyKeys = local.keys.filter((key) => localEmptySet.has(key));\n\n return {\n examplePath: exampleContent === null ? null : examplePath,\n localPath: localContent === null ? null : localPath,\n hasExample: exampleContent !== null,\n hasLocal: localContent !== null,\n exampleKeys: example.keys,\n localKeys: local.keys,\n missingKeys,\n emptyKeys,\n keys: example.keys.map((key) => ({\n key,\n present: localKeySet.has(key),\n empty: localEmptySet.has(key)\n }))\n };\n}\n","import type { FrameworkInfo, PackageJsonInfo } from '../types.js';\n\nconst frameworkPackages: Array<{ packageName: string; label: string }> = [\n { packageName: 'next', label: 'Next.js' },\n { packageName: 'vite', label: 'Vite' },\n { packageName: 'express', label: 'Express' },\n { packageName: 'fastify', label: 'Fastify' },\n { packageName: '@nestjs/core', label: 'NestJS' },\n { packageName: '@remix-run/react', label: 'Remix' },\n { packageName: 'prisma', label: 'Prisma' }\n];\n\nexport function detectFramework(packageJson: PackageJsonInfo | null): FrameworkInfo | null {\n if (packageJson === null) {\n return null;\n }\n\n const dependencies = {\n ...packageJson.data.dependencies,\n ...packageJson.data.devDependencies,\n ...packageJson.data.optionalDependencies,\n ...packageJson.data.peerDependencies\n };\n\n const detected = frameworkPackages\n .filter((framework) => dependencies[framework.packageName] !== undefined)\n .map((framework) => framework.label);\n\n if (detected.length === 0) {\n return {\n type: 'Node.js',\n detected: ['Node.js']\n };\n }\n\n return {\n type: ['Node.js', ...detected].join(' / '),\n detected\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { GitInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function resolveGitDirectory(root: string): Promise<string | null> {\n const gitPath = path.join(root, '.git');\n\n try {\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n return gitPath;\n }\n\n if (stat.isFile()) {\n const content = await fs.readFile(gitPath, 'utf8');\n const match = content.match(/^gitdir:\\s*(.+)\\s*$/m);\n if (match) {\n const gitDir = match[1].trim();\n const resolvedGitDir = path.isAbsolute(gitDir)\n ? path.resolve(gitDir)\n : path.resolve(root, gitDir);\n if (!isWithinRoot(root, resolvedGitDir)) {\n return null;\n }\n\n const [realRoot, realGitDir] = await Promise.all([\n fs.realpath(root),\n fs.realpath(resolvedGitDir)\n ]);\n return isWithinRoot(realRoot, realGitDir) ? resolvedGitDir : null;\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nexport async function detectGit(root: string): Promise<GitInfo | null> {\n const gitRoot = await resolveGitDirectory(root);\n if (gitRoot === null) {\n return null;\n }\n\n try {\n const head = await fs.readFile(path.join(gitRoot, 'HEAD'), 'utf8');\n const refMatch = head.match(/^ref:\\s+refs\\/heads\\/(.+)\\s*$/);\n return {\n root: gitRoot,\n branch: refMatch ? refMatch[1] : head.trim().slice(0, 12)\n };\n } catch {\n return {\n root: gitRoot,\n branch: null\n };\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageManager } from '../types.js';\n\nconst lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'bun.lockb', manager: 'bun' },\n { file: 'bun.lock', manager: 'bun' },\n { file: 'package-lock.json', manager: 'npm' }\n];\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectPackageManager(root: string): Promise<PackageManager | null> {\n for (const lockFile of lockFiles) {\n if (await exists(path.join(root, lockFile.file))) {\n return lockFile.manager;\n }\n }\n\n return null;\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function readPackageJson(root: string): Promise<PackageJsonInfo | null> {\n const packageJsonPath = path.join(root, 'package.json');\n\n try {\n const [realRoot, realPackageJsonPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(packageJsonPath)\n ]);\n if (!isWithinRoot(realRoot, realPackageJsonPath)) {\n return null;\n }\n\n const content = await fs.readFile(realPackageJsonPath, 'utf8');\n const data = JSON.parse(content) as PackageJsonInfo['data'];\n return { path: realPackageJsonPath, data };\n } catch {\n return null;\n }\n}\n","import net from 'node:net';\nimport type { FrameworkInfo, PortProbe } from '../types.js';\n\nexport const DEFAULT_PORTS = [3000, 5173];\nexport const MAX_PORT_PROBES = 64;\nexport const PORT_PROBE_CONCURRENCY = 16;\n\nfunction uniquePorts(ports: number[]): number[] {\n return Array.from(\n new Set(ports.filter((port) => Number.isInteger(port) && port > 0 && port < 65536))\n );\n}\n\nexport function inferPortsFromScripts(scripts: Record<string, string>): number[] {\n const ports: number[] = [];\n\n for (const command of Object.values(scripts)) {\n const patterns = [\n /(?:--port|-p)\\s+(\\d{2,5})/g,\n /\\bPORT=(\\d{2,5})\\b/g,\n /localhost:(\\d{2,5})/g,\n /127\\.0\\.0\\.1:(\\d{2,5})/g\n ];\n\n for (const pattern of patterns) {\n for (const match of command.matchAll(pattern)) {\n ports.push(Number(match[1]));\n }\n }\n }\n\n return uniquePorts(ports);\n}\n\nexport function defaultPortsForFramework(framework: FrameworkInfo | null): number[] {\n if (framework === null) {\n return [];\n }\n\n const ports: number[] = [];\n if (framework.detected.includes('Next.js') || framework.detected.includes('Express')) {\n ports.push(3000);\n }\n\n if (framework.detected.includes('Vite')) {\n ports.push(5173);\n }\n\n if (framework.detected.includes('Prisma')) {\n ports.push(5555);\n }\n\n return uniquePorts(ports);\n}\n\nexport async function probePort(port: number): Promise<PortProbe> {\n return await new Promise((resolve) => {\n const server = net.createServer();\n\n server.once('error', () => {\n resolve({ port, inUse: true });\n });\n\n server.once('listening', () => {\n server.close(() => {\n resolve({ port, inUse: false });\n });\n });\n\n server.listen(port, '127.0.0.1');\n });\n}\n\nexport async function detectPorts(ports: number[]): Promise<PortProbe[] | null> {\n const normalized = uniquePorts(ports).slice(0, MAX_PORT_PROBES);\n if (normalized.length === 0) {\n return null;\n }\n\n const results: PortProbe[] = [];\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < normalized.length) {\n const port = normalized[nextIndex];\n nextIndex += 1;\n results.push(await probePort(port));\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(PORT_PROBE_CONCURRENCY, normalized.length) }, () => worker())\n );\n\n return results.sort(\n (left, right) => normalized.indexOf(left.port) - normalized.indexOf(right.port)\n );\n}\n","import type { PackageJsonInfo } from '../types.js';\n\nexport function extractScripts(packageJson: PackageJsonInfo | null): Record<string, string> | null {\n if (\n !packageJson?.data.scripts ||\n typeof packageJson.data.scripts !== 'object' ||\n Array.isArray(packageJson.data.scripts)\n ) {\n return null;\n }\n\n return Object.fromEntries(\n Object.entries(packageJson.data.scripts).filter((entry): entry is [string, string] => {\n const [, command] = entry;\n return typeof command === 'string';\n })\n );\n}\n","const ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n\nconst OSC_SEQUENCE = new RegExp(`${ESC}\\\\][\\\\s\\\\S]*?(?:${BEL}|${ESC}\\\\\\\\)`, 'g');\nconst CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\nconst ESCAPE_SEQUENCE = new RegExp(`${ESC}[@-Z\\\\\\\\-_]`, 'g');\n\nfunction stripControlCharacters(value: string): string {\n let result = '';\n for (const character of value) {\n const code = character.charCodeAt(0);\n if ((code > 31 && code < 127) || code > 159) {\n result += character;\n }\n }\n return result;\n}\n\nexport function safeDisplayText(value: unknown): string {\n return stripControlCharacters(\n String(value).replace(OSC_SEQUENCE, '').replace(CSI_SEQUENCE, '').replace(ESCAPE_SEQUENCE, '')\n );\n}\n\nexport function safeDisplayList(values: string[]): string {\n return values.length > 0 ? values.map((value) => safeDisplayText(value)).join(', ') : 'none';\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { CONFIG_FILE_NAME, defaultConfig } from '../../core/config/defaults.js';\n\nexport async function initCommand(cwd = process.cwd()): Promise<void> {\n const configPath = path.join(cwd, CONFIG_FILE_NAME);\n\n try {\n await fs.access(configPath);\n console.log(pc.yellow(`${CONFIG_FILE_NAME} already exists.`));\n return;\n } catch {\n await fs.writeFile(configPath, `${JSON.stringify(defaultConfig, null, 2)}\\n`, 'utf8');\n console.log(pc.green(`Created ${CONFIG_FILE_NAME}.`));\n }\n}\n","import pc from 'picocolors';\nimport { runPackageScriptToTerminal } from '../../core/process/runner.js';\nimport { scanProject } from '../../core/scanner/index.js';\n\nexport async function runCommand(script: string, cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n\n if (scan.packageJson === null) {\n console.error(pc.red('No package.json was found in this directory.'));\n process.exitCode = 1;\n return;\n }\n\n if (scan.scripts[script] === undefined) {\n console.error(pc.red(`Script \"${script}\" was not found in package.json.`));\n process.exitCode = 1;\n return;\n }\n\n const exitCode = await runPackageScriptToTerminal({\n cwd,\n packageManager: scan.packageManager,\n script\n });\n process.exitCode = exitCode;\n}\n","import spawn from 'cross-spawn';\nimport type { PackageManager } from '../types.js';\nimport { isDangerousCommand } from '../security/dangerousCommand.js';\nimport { resolveExecutableOutsideRoot } from './executable.js';\n\nexport { isDangerousCommand };\n\nexport interface PackageRunCommand {\n command: string;\n args: string[];\n displayCommand: string;\n}\n\nexport function getPackageRunCommand(\n packageManager: PackageManager | null,\n script: string\n): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n const args = ['run', script];\n return {\n command: manager,\n args,\n displayCommand: `${manager} ${args.join(' ')}`\n };\n}\n\nexport async function resolvePackageRunCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<PackageRunCommand | null> {\n const runCommand = getPackageRunCommand(options.packageManager, options.script);\n const executable = await resolveExecutableOutsideRoot(options.cwd, runCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...runCommand,\n command: executable\n };\n}\n\nexport function getPackageInstallCommand(packageManager: PackageManager | null): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n if (manager === 'npm') {\n return {\n command: manager,\n args: ['ci'],\n displayCommand: 'npm ci'\n };\n }\n\n if (manager === 'pnpm') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'pnpm install --frozen-lockfile'\n };\n }\n\n if (manager === 'yarn') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'yarn install --frozen-lockfile'\n };\n }\n\n return {\n command: manager,\n args: ['install'],\n displayCommand: 'bun install'\n };\n}\n\nexport async function resolvePackageInstallCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n}): Promise<PackageRunCommand | null> {\n const installCommand = getPackageInstallCommand(options.packageManager);\n const executable = await resolveExecutableOutsideRoot(options.cwd, installCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...installCommand,\n command: executable\n };\n}\n\nexport function splitCommandLine(command: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n } else if (character === '\\\\' && quote === '\"') {\n const next = command[index + 1];\n if (next === '\"' || next === '\\\\') {\n index += 1;\n current += next ?? '';\n } else {\n current += character;\n }\n } else {\n current += character;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (/\\s/.test(character)) {\n if (current.length > 0) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += character;\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function containsShellMetacharacters(command: string): boolean {\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '\\n' || character === '\\r') {\n return true;\n }\n\n if (';|&<>'.includes(character)) {\n return true;\n }\n\n if (character === '`') {\n return true;\n }\n\n if (character === '$' && (command[index + 1] === '(' || command[index + 1] === '{')) {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function resolveConfiguredCommand(\n cwd: string,\n command: string\n): Promise<PackageRunCommand | null> {\n const trimmed = command.trim();\n if (trimmed.length === 0 || containsShellMetacharacters(trimmed)) {\n return null;\n }\n\n const tokens = splitCommandLine(trimmed);\n if (tokens.length === 0) {\n return null;\n }\n\n const [executableName, ...args] = tokens;\n const executable = await resolveExecutableOutsideRoot(cwd, executableName);\n if (executable === null) {\n return null;\n }\n\n return {\n command: executable,\n args,\n displayCommand: trimmed\n };\n}\n\nexport async function runPackageScriptToTerminal(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<number> {\n const runCommand = await resolvePackageRunCommand(options);\n if (runCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(runCommand.command, runCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n","const DANGEROUS_COMMAND =\n /\\b(rm\\s+-rf|docker\\s+volume\\s+rm|drop\\s+database|prisma\\s+migrate\\s+reset|git\\s+clean\\s+-fdx?)\\b/i;\n\nexport function isDangerousCommand(command: string): boolean {\n return DANGEROUS_COMMAND.test(command);\n}\n","import pc from 'picocolors';\nimport type { ScanResult } from '../../core/types.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nfunction formatList(values: string[]): string {\n return safeTerminalList(values);\n}\n\nexport function printScanResult(scan: ScanResult): void {\n console.log(pc.bold(`Project: ${safeTerminalText(scan.projectName)}`));\n console.log(`Type: ${safeTerminalText(scan.framework?.type ?? 'Unknown')}`);\n console.log(`Manager: ${safeTerminalText(scan.packageManager ?? 'unknown')}`);\n console.log(`Scripts: ${formatList(Object.keys(scan.scripts))}`);\n console.log(`Git: ${safeTerminalText(scan.git?.branch ?? 'not detected')}`);\n console.log(`README: ${scan.readme.exists ? 'found' : 'missing'}`);\n console.log(`LICENSE: ${scan.license.exists ? 'found' : 'missing'}`);\n\n if (scan.env !== null) {\n console.log(`Env: ${scan.env.hasLocal ? '.env found' : '.env missing'}`);\n }\n\n if (scan.ports.length > 0) {\n const ports = scan.ports.map((port) => `${port.port}${port.inUse ? ' in use' : ' free'}`);\n console.log(`Ports: ${ports.join(', ')}`);\n }\n\n if (scan.docker !== null) {\n console.log(\n `Docker: compose found (${formatList(scan.docker.services.map((service) => service.name))})`\n );\n }\n}\n\nexport async function scanCommand(cwd = process.cwd()): Promise<void> {\n printScanResult(await scanProject(cwd));\n}\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { startDevSurfaceServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { printScanResult } from './scan.js';\n\nexport async function startCommand(options: {\n cwd?: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n console.log(pc.bold(`DevSurface v${DEV_SURFACE_VERSION}`));\n console.log('Scanning project...\\n');\n\n const scan = await scanProject(cwd);\n printScanResult(scan);\n\n const warnings = await runDoctor(cwd, scan);\n if (warnings.length > 0) {\n console.log('\\nWarnings:');\n for (const item of warnings) {\n const marker = item.severity === 'error' ? pc.red('!') : pc.yellow('!');\n console.log(` ${marker} ${item.title}`);\n }\n }\n\n const server = await startDevSurfaceServer({\n projectRoot: cwd,\n port: options.port,\n openBrowser: options.openBrowser\n });\n\n console.log(`\\nDashboard running at -> ${pc.cyan(server.url)}`);\n}\n","import { promises as fs } from 'node:fs';\nimport type { Server } from 'node:http';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createAdaptorServer } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { Hono } from 'hono';\nimport open from 'open';\nimport type { DockerController } from '../core/docker/compose.js';\nimport { ProcessManager } from '../core/process/manager.js';\nimport { registerApiRoutes } from './routes/api.js';\nimport { setupWebSocket } from './routes/ws.js';\nimport { createMutationToken } from './mutationToken.js';\n\nexport const HOST = '127.0.0.1';\nexport const DEFAULT_PORT = 4567;\n\nexport interface DevSurfaceServer {\n url: string;\n port: number;\n close: () => Promise<void>;\n processManager: ProcessManager;\n}\n\nfunction assertLocalHost(host: string): void {\n if (host !== HOST) {\n throw new Error('DevSurface must bind only to 127.0.0.1.');\n }\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function findWebDistDir(): Promise<string | null> {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(moduleDir, '..', 'web', 'dist'),\n path.join(moduleDir, '..', '..', 'src', 'web', 'dist'),\n path.join(moduleDir, 'web', 'dist')\n ];\n\n for (const candidate of candidates) {\n if (await fileExists(path.join(candidate, 'index.html'))) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction toListenError(error: unknown, port: number): Error {\n const code = error instanceof Error ? (error as NodeJS.ErrnoException).code : undefined;\n\n if (code === 'EADDRINUSE') {\n return new Error(\n `Port ${port} is already in use on ${HOST}. Stop the other process or run DevSurface with --port ${port + 1}.`,\n { cause: error }\n );\n }\n\n if (code === 'EACCES') {\n return new Error(`DevSurface does not have permission to bind to ${HOST}:${port}.`, {\n cause: error\n });\n }\n\n return error instanceof Error ? error : new Error(String(error));\n}\n\nasync function listenOnLocalHost(\n server: Server,\n wss: ReturnType<typeof setupWebSocket>,\n port: number\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n server.off('error', onError);\n server.off('listening', onListening);\n wss.off('error', onError);\n };\n\n const onError = (error: unknown) => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n reject(toListenError(error, port));\n };\n\n const onListening = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n cleanup();\n resolve();\n };\n\n wss.once('error', onError);\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(port, HOST);\n });\n}\n\nasync function closeWebSocketServer(wss: ReturnType<typeof setupWebSocket>): Promise<void> {\n await new Promise<void>((resolve) => {\n wss.close(() => resolve());\n });\n}\n\nasync function closeHttpServer(server: Server): Promise<void> {\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\nexport async function createApp(options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken?: string;\n}): Promise<Hono> {\n const app = new Hono();\n registerApiRoutes(app, {\n ...options,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n\n const webDistDir = await findWebDistDir();\n if (webDistDir !== null) {\n app.use('/assets/*', serveStatic({ root: webDistDir }));\n app.get('/favicon.svg', serveStatic({ root: webDistDir }));\n app.get('*', async (context) => {\n const html = await fs.readFile(path.join(webDistDir, 'index.html'), 'utf8');\n return context.html(html);\n });\n } else {\n app.get('*', (context) =>\n context.html(\n '<!doctype html><title>DevSurface</title><main><h1>DevSurface</h1><p>Run npm run build:web to build the dashboard.</p></main>',\n 503\n )\n );\n }\n\n return app;\n}\n\nexport async function startDevSurfaceServer(options: {\n projectRoot: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<DevSurfaceServer> {\n assertLocalHost(HOST);\n const port = options.port ?? DEFAULT_PORT;\n const processManager = new ProcessManager();\n processManager.attachCleanupHandlers();\n const app = await createApp({\n projectRoot: options.projectRoot,\n processManager\n });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: HOST\n }) as Server;\n const wss = setupWebSocket(server, processManager);\n await listenOnLocalHost(server, wss, port);\n processManager.attachCleanupHandlers();\n\n const url = `http://${HOST}:${port}`;\n\n if (options.openBrowser !== false) {\n await open(url);\n }\n\n return {\n url,\n port,\n processManager,\n close: async () => {\n processManager.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n","import process from 'node:process';\nimport {Buffer} from 'node:buffer';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport {isWsl, powerShellPath} from 'wsl-utils';\nimport defineLazyProperty from 'define-lazy-prop';\nimport defaultBrowser from 'default-browser';\nimport isInsideContainer from 'is-inside-container';\n\nconst execFile = promisify(childProcess.execFile);\n\n// Path to included `xdg-open`.\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst localXdgOpenPath = path.join(__dirname, 'xdg-open');\n\nconst {platform, arch} = process;\n\n/**\nGet the default browser name in Windows from WSL.\n\n@returns {Promise<string>} Browser name.\n*/\nasync function getWindowsDefaultBrowserFromWsl() {\n\tconst powershellPath = await powerShellPath();\n\tconst rawCommand = String.raw`(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice\").ProgId`;\n\tconst encodedCommand = Buffer.from(rawCommand, 'utf16le').toString('base64');\n\n\tconst {stdout} = await execFile(\n\t\tpowershellPath,\n\t\t[\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t\tencodedCommand,\n\t\t],\n\t\t{encoding: 'utf8'},\n\t);\n\n\tconst progId = stdout.trim();\n\n\t// Map ProgId to browser IDs\n\tconst browserMap = {\n\t\tChromeHTML: 'com.google.chrome',\n\t\tBraveHTML: 'com.brave.Browser',\n\t\tMSEdgeHTM: 'com.microsoft.edge',\n\t\tFirefoxURL: 'org.mozilla.firefox',\n\t};\n\n\treturn browserMap[progId] ? {id: browserMap[progId]} : {};\n}\n\nconst pTryEach = async (array, mapper) => {\n\tlet latestError;\n\n\tfor (const item of array) {\n\t\ttry {\n\t\t\treturn await mapper(item); // eslint-disable-line no-await-in-loop\n\t\t} catch (error) {\n\t\t\tlatestError = error;\n\t\t}\n\t}\n\n\tthrow latestError;\n};\n\n// eslint-disable-next-line complexity\nconst baseOpen = async options => {\n\toptions = {\n\t\twait: false,\n\t\tbackground: false,\n\t\tnewInstance: false,\n\t\tallowNonzeroExitCode: false,\n\t\t...options,\n\t};\n\n\tif (Array.isArray(options.app)) {\n\t\treturn pTryEach(options.app, singleApp => baseOpen({\n\t\t\t...options,\n\t\t\tapp: singleApp,\n\t\t}));\n\t}\n\n\tlet {name: app, arguments: appArguments = []} = options.app ?? {};\n\tappArguments = [...appArguments];\n\n\tif (Array.isArray(app)) {\n\t\treturn pTryEach(app, appName => baseOpen({\n\t\t\t...options,\n\t\t\tapp: {\n\t\t\t\tname: appName,\n\t\t\t\targuments: appArguments,\n\t\t\t},\n\t\t}));\n\t}\n\n\tif (app === 'browser' || app === 'browserPrivate') {\n\t\t// IDs from default-browser for macOS and windows are the same\n\t\tconst ids = {\n\t\t\t'com.google.chrome': 'chrome',\n\t\t\t'google-chrome.desktop': 'chrome',\n\t\t\t'com.brave.Browser': 'brave',\n\t\t\t'org.mozilla.firefox': 'firefox',\n\t\t\t'firefox.desktop': 'firefox',\n\t\t\t'com.microsoft.msedge': 'edge',\n\t\t\t'com.microsoft.edge': 'edge',\n\t\t\t'com.microsoft.edgemac': 'edge',\n\t\t\t'microsoft-edge.desktop': 'edge',\n\t\t};\n\n\t\t// Incognito flags for each browser in `apps`.\n\t\tconst flags = {\n\t\t\tchrome: '--incognito',\n\t\t\tbrave: '--incognito',\n\t\t\tfirefox: '--private-window',\n\t\t\tedge: '--inPrivate',\n\t\t};\n\n\t\tconst browser = isWsl ? await getWindowsDefaultBrowserFromWsl() : await defaultBrowser();\n\t\tif (browser.id in ids) {\n\t\t\tconst browserName = ids[browser.id];\n\n\t\t\tif (app === 'browserPrivate') {\n\t\t\t\tappArguments.push(flags[browserName]);\n\t\t\t}\n\n\t\t\treturn baseOpen({\n\t\t\t\t...options,\n\t\t\t\tapp: {\n\t\t\t\t\tname: apps[browserName],\n\t\t\t\t\targuments: appArguments,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tthrow new Error(`${browser.name} is not supported as a default browser`);\n\t}\n\n\tlet command;\n\tconst cliArguments = [];\n\tconst childProcessOptions = {};\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\n\t\tif (options.wait) {\n\t\t\tcliArguments.push('--wait-apps');\n\t\t}\n\n\t\tif (options.background) {\n\t\t\tcliArguments.push('--background');\n\t\t}\n\n\t\tif (options.newInstance) {\n\t\t\tcliArguments.push('--new');\n\t\t}\n\n\t\tif (app) {\n\t\t\tcliArguments.push('-a', app);\n\t\t}\n\t} else if (platform === 'win32' || (isWsl && !isInsideContainer() && !app)) {\n\t\tcommand = await powerShellPath();\n\n\t\tcliArguments.push(\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t);\n\n\t\tif (!isWsl) {\n\t\t\tchildProcessOptions.windowsVerbatimArguments = true;\n\t\t}\n\n\t\tconst encodedArguments = ['Start'];\n\n\t\tif (options.wait) {\n\t\t\tencodedArguments.push('-Wait');\n\t\t}\n\n\t\tif (app) {\n\t\t\t// Double quote with double quotes to ensure the inner quotes are passed through.\n\t\t\t// Inner quotes are delimited for PowerShell interpretation with backticks.\n\t\t\tencodedArguments.push(`\"\\`\"${app}\\`\"\"`);\n\t\t\tif (options.target) {\n\t\t\t\tappArguments.push(options.target);\n\t\t\t}\n\t\t} else if (options.target) {\n\t\t\tencodedArguments.push(`\"${options.target}\"`);\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tappArguments = appArguments.map(argument => `\"\\`\"${argument}\\`\"\"`);\n\t\t\tencodedArguments.push('-ArgumentList', appArguments.join(','));\n\t\t}\n\n\t\t// Using Base64-encoded command, accepted by PowerShell, to allow special characters.\n\t\toptions.target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64');\n\t} else {\n\t\tif (app) {\n\t\t\tcommand = app;\n\t\t} else {\n\t\t\t// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.\n\t\t\tconst isBundled = !__dirname || __dirname === '/';\n\n\t\t\t// Check if local `xdg-open` exists and is executable.\n\t\t\tlet exeLocalXdgOpen = false;\n\t\t\ttry {\n\t\t\t\tawait fs.access(localXdgOpenPath, fsConstants.X_OK);\n\t\t\t\texeLocalXdgOpen = true;\n\t\t\t} catch {}\n\n\t\t\tconst useSystemXdgOpen = process.versions.electron\n\t\t\t\t?? (platform === 'android' || isBundled || !exeLocalXdgOpen);\n\t\t\tcommand = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tcliArguments.push(...appArguments);\n\t\t}\n\n\t\tif (!options.wait) {\n\t\t\t// `xdg-open` will block the process unless stdio is ignored\n\t\t\t// and it's detached from the parent even if it's unref'd.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t\tchildProcessOptions.detached = true;\n\t\t}\n\t}\n\n\tif (platform === 'darwin' && appArguments.length > 0) {\n\t\tcliArguments.push('--args', ...appArguments);\n\t}\n\n\t// This has to come after `--args`.\n\tif (options.target) {\n\t\tcliArguments.push(options.target);\n\t}\n\n\tconst subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);\n\n\tif (options.wait) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\tif (!options.allowNonzeroExitCode && exitCode > 0) {\n\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(subprocess);\n\t\t\t});\n\t\t});\n\t}\n\n\tsubprocess.unref();\n\n\treturn subprocess;\n};\n\nconst open = (target, options) => {\n\tif (typeof target !== 'string') {\n\t\tthrow new TypeError('Expected a `target`');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\ttarget,\n\t});\n};\n\nexport const openApp = (name, options) => {\n\tif (typeof name !== 'string' && !Array.isArray(name)) {\n\t\tthrow new TypeError('Expected a valid `name`');\n\t}\n\n\tconst {arguments: appArguments = []} = options ?? {};\n\tif (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {\n\t\tthrow new TypeError('Expected `appArguments` as Array type');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\tapp: {\n\t\t\tname,\n\t\t\targuments: appArguments,\n\t\t},\n\t});\n};\n\nfunction detectArchBinary(binary) {\n\tif (typeof binary === 'string' || Array.isArray(binary)) {\n\t\treturn binary;\n\t}\n\n\tconst {[arch]: archBinary} = binary;\n\n\tif (!archBinary) {\n\t\tthrow new Error(`${arch} is not supported`);\n\t}\n\n\treturn archBinary;\n}\n\nfunction detectPlatformBinary({[platform]: platformBinary}, {wsl}) {\n\tif (wsl && isWsl) {\n\t\treturn detectArchBinary(wsl);\n\t}\n\n\tif (!platformBinary) {\n\t\tthrow new Error(`${platform} is not supported`);\n\t}\n\n\treturn detectArchBinary(platformBinary);\n}\n\nexport const apps = {};\n\ndefineLazyProperty(apps, 'chrome', () => detectPlatformBinary({\n\tdarwin: 'google chrome',\n\twin32: 'chrome',\n\tlinux: ['google-chrome', 'google-chrome-stable', 'chromium'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',\n\t\tx64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'brave', () => detectPlatformBinary({\n\tdarwin: 'brave browser',\n\twin32: 'brave',\n\tlinux: ['brave-browser', 'brave'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe',\n\t\tx64: ['/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe', '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'firefox', () => detectPlatformBinary({\n\tdarwin: 'firefox',\n\twin32: String.raw`C:\\Program Files\\Mozilla Firefox\\firefox.exe`,\n\tlinux: 'firefox',\n}, {\n\twsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe',\n}));\n\ndefineLazyProperty(apps, 'edge', () => detectPlatformBinary({\n\tdarwin: 'microsoft edge',\n\twin32: 'msedge',\n\tlinux: ['microsoft-edge', 'microsoft-edge-dev'],\n}, {\n\twsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',\n}));\n\ndefineLazyProperty(apps, 'browser', () => 'browser');\n\ndefineLazyProperty(apps, 'browserPrivate', () => 'browserPrivate');\n\nexport default open;\n","import process from 'node:process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport isWsl from 'is-wsl';\n\nexport const wslDrivesMountPoint = (() => {\n\t// Default value for \"root\" param\n\t// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config\n\tconst defaultMountPoint = '/mnt/';\n\n\tlet mountPoint;\n\n\treturn async function () {\n\t\tif (mountPoint) {\n\t\t\t// Return memoized mount point value\n\t\t\treturn mountPoint;\n\t\t}\n\n\t\tconst configFilePath = '/etc/wsl.conf';\n\n\t\tlet isConfigFileExists = false;\n\t\ttry {\n\t\t\tawait fs.access(configFilePath, fsConstants.F_OK);\n\t\t\tisConfigFileExists = true;\n\t\t} catch {}\n\n\t\tif (!isConfigFileExists) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tconst configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});\n\t\tconst configMountPoint = /(?<!#.*)root\\s*=\\s*(?<mountPoint>.*)/g.exec(configContent);\n\n\t\tif (!configMountPoint) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tmountPoint = configMountPoint.groups.mountPoint.trim();\n\t\tmountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;\n\n\t\treturn mountPoint;\n\t};\n})();\n\nexport const powerShellPathFromWsl = async () => {\n\tconst mountPoint = await wslDrivesMountPoint();\n\treturn `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;\n};\n\nexport const powerShellPath = async () => {\n\tif (isWsl) {\n\t\treturn powerShellPathFromWsl();\n\t}\n\n\treturn `${process.env.SYSTEMROOT || process.env.windir || String.raw`C:\\Windows`}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n};\n\nexport {default as isWsl} from 'is-wsl';\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport isInsideContainer from 'is-inside-container';\n\nconst isWsl = () => {\n\tif (process.platform !== 'linux') {\n\t\treturn false;\n\t}\n\n\tif (os.release().toLowerCase().includes('microsoft')) {\n\t\tif (isInsideContainer()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tif (fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')) {\n\t\t\treturn !isInsideContainer();\n\t\t}\n\t} catch {}\n\n\t// Fallback for custom kernels: check WSL-specific paths.\n\tif (\n\t\tfs.existsSync('/proc/sys/fs/binfmt_misc/WSLInterop')\n\t\t|| fs.existsSync('/run/WSL')\n\t) {\n\t\treturn !isInsideContainer();\n\t}\n\n\treturn false;\n};\n\nexport default process.env.__IS_WSL_TEST__ ? isWsl : isWsl();\n","import fs from 'node:fs';\nimport isDocker from 'is-docker';\n\nlet cachedResult;\n\n// Podman detection\nconst hasContainerEnv = () => {\n\ttry {\n\t\tfs.statSync('/run/.containerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default function isInsideContainer() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (cachedResult === undefined) {\n\t\tcachedResult = hasContainerEnv() || isDocker();\n\t}\n\n\treturn cachedResult;\n}\n","import fs from 'node:fs';\n\nlet isDockerCached;\n\nfunction hasDockerEnv() {\n\ttry {\n\t\tfs.statSync('/.dockerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasDockerCGroup() {\n\ttry {\n\t\treturn fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function isDocker() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (isDockerCached === undefined) {\n\t\tisDockerCached = hasDockerEnv() || hasDockerCGroup();\n\t}\n\n\treturn isDockerCached;\n}\n","export default function defineLazyProperty(object, propertyName, valueGetter) {\n\tconst define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});\n\n\tObject.defineProperty(object, propertyName, {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget() {\n\t\t\tconst result = valueGetter();\n\t\t\tdefine(result);\n\t\t\treturn result;\n\t\t},\n\t\tset(value) {\n\t\t\tdefine(value);\n\t\t}\n\t});\n\n\treturn object;\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\nimport defaultBrowserId from 'default-browser-id';\nimport bundleName from 'bundle-name';\nimport windows from './windows.js';\n\nexport {_windowsBrowserProgIdMap} from './windows.js';\n\nconst execFileAsync = promisify(execFile);\n\n// Inlined: https://github.com/sindresorhus/titleize/blob/main/index.js\nconst titleize = string => string.toLowerCase().replaceAll(/(?:^|\\s|-)\\S/g, x => x.toUpperCase());\n\nexport default async function defaultBrowser() {\n\tif (process.platform === 'darwin') {\n\t\tconst id = await defaultBrowserId();\n\t\tconst name = await bundleName(id);\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'linux') {\n\t\tconst {stdout} = await execFileAsync('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n\t\tconst id = stdout.trim();\n\t\tconst name = titleize(id.replace(/.desktop$/, '').replace('-', ' '));\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows();\n\t}\n\n\tthrow new Error('Only macOS, Linux, and Windows are supported');\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport default async function defaultBrowserId() {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst {stdout} = await execFileAsync('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure', 'LSHandlers']);\n\n\t// `(?!-)` is to prevent matching `LSHandlerRoleAll = \"-\";`.\n\tconst match = /LSHandlerRoleAll = \"(?!-)(?<id>[^\"]+?)\";\\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);\n\n\tconst browserId = match?.groups.id ?? 'com.apple.Safari';\n\n\t// Correct the case for Safari's bundle identifier\n\tif (browserId === 'com.apple.safari') {\n\t\treturn 'com.apple.Safari';\n\t}\n\n\treturn browserId;\n}\n","import process from 'node:process';\nimport {promisify} from 'node:util';\nimport {execFile, execFileSync} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runAppleScript(script, {humanReadableOutput = true, signal} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst execOptions = {};\n\tif (signal) {\n\t\texecOptions.signal = signal;\n\t}\n\n\tconst {stdout} = await execFileAsync('osascript', ['-e', script, outputArguments], execOptions);\n\treturn stdout.trim();\n}\n\nexport function runAppleScriptSync(script, {humanReadableOutput = true} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst stdout = execFileSync('osascript', ['-e', script, ...outputArguments], {\n\t\tencoding: 'utf8',\n\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\ttimeout: 500,\n\t});\n\n\treturn stdout.trim();\n}\n","import {runAppleScript} from 'run-applescript';\n\nexport default async function bundleName(bundleId) {\n\treturn runAppleScript(`tell application \"Finder\" to set app_path to application file id \"${bundleId}\" as string\\ntell application \"System Events\" to get value of property list item \"CFBundleName\" of property list file (app_path & \":Contents:Info.plist\")`);\n}\n","import {promisify} from 'node:util';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\n// TODO: Fix the casing of bundle identifiers in the next major version.\n\n// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake\n// ones that look real and match the macOS/Linux versions for cross-platform apps.\nconst windowsBrowserProgIds = {\n\tMSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct.\n\tMSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'},\n\tMSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'},\n\tAppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},\n\tChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},\n\tChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'},\n\tChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'},\n\tChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'},\n\tBraveHTML: {name: 'Brave', id: 'com.brave.Browser'},\n\tBraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},\n\tBraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'},\n\tBraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},\n\tFirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},\n\tOperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'},\n\tVivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'},\n\t'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},\n};\n\nexport const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));\n\nexport class UnknownBrowserError extends Error {}\n\nexport default async function defaultBrowser(_execFileAsync = execFileAsync) {\n\tconst {stdout} = await _execFileAsync('reg', [\n\t\t'QUERY',\n\t\t' HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n\t\t'/v',\n\t\t'ProgId',\n\t]);\n\n\tconst match = /ProgId\\s*REG_SZ\\s*(?<id>\\S+)/.exec(stdout);\n\tif (!match) {\n\t\tthrow new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);\n\t}\n\n\tconst {id} = match.groups;\n\n\t// Windows can append a hash suffix to ProgIds using a dot or hyphen\n\t// (e.g., `ChromeHTML.ABC123`, `FirefoxURL-6F193CCC56814779`).\n\t// Try exact match first, then try without the suffix.\n\tconst dotIndex = id.lastIndexOf('.');\n\tconst hyphenIndex = id.lastIndexOf('-');\n\tconst baseIdByDot = dotIndex === -1 ? undefined : id.slice(0, dotIndex);\n\tconst baseIdByHyphen = hyphenIndex === -1 ? undefined : id.slice(0, hyphenIndex);\n\n\treturn windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? {name: id, id};\n}\n","import { EventEmitter } from 'node:events';\nimport type { ChildProcess } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../types.js';\n\nexport const LOG_MESSAGE_LIMIT = 16_384;\nconst LOG_ENTRY_LIMIT = 1000;\n\ninterface ProcessRecord extends ManagedProcessSnapshot {\n child: ChildProcess;\n}\n\nfunction killChildProcessTree(child: ChildProcess): void {\n if (child.pid === undefined) {\n child.kill();\n return;\n }\n\n if (process.platform === 'win32') {\n const result = spawn.sync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true\n });\n if (result.error) {\n child.kill();\n }\n return;\n }\n\n child.kill();\n}\n\nexport class ProcessManager extends EventEmitter {\n private readonly processes = new Map<string, ProcessRecord>();\n private readonly logs: ProcessLogEvent[] = [];\n private cleanupInstalled = false;\n\n start(options: {\n cwd: string;\n script: string;\n command: string;\n args: string[];\n displayCommand: string;\n }): ManagedProcessSnapshot {\n const child = spawn(options.command, options.args, {\n cwd: options.cwd,\n shell: false,\n windowsHide: true\n });\n\n const pid = String(child.pid ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`);\n const record: ProcessRecord = {\n child,\n pid,\n script: options.script,\n command: options.displayCommand,\n status: 'running',\n startedAt: new Date().toISOString(),\n endedAt: null,\n exitCode: null\n };\n\n this.processes.set(pid, record);\n this.emitSystem(record, `Started ${options.displayCommand}`);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stdout', chunk.toString());\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stderr', chunk.toString());\n });\n\n child.on('error', (error) => {\n record.status = 'failed';\n record.endedAt = new Date().toISOString();\n this.emitLog(record, 'system', error.message);\n this.emit('process', this.snapshot(record));\n });\n\n child.on('close', (code) => {\n if (record.status === 'stopped') {\n record.exitCode = code;\n } else {\n record.status = code === 0 ? 'exited' : 'failed';\n record.exitCode = code;\n }\n record.endedAt = new Date().toISOString();\n this.emitSystem(record, `Exited with code ${code ?? 'unknown'}`);\n this.emit('process', this.snapshot(record));\n });\n\n this.emit('process', this.snapshot(record));\n return this.snapshot(record);\n }\n\n stop(pid: string): boolean {\n const record = this.processes.get(pid);\n if (!record || record.status !== 'running') {\n return false;\n }\n\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n this.emitSystem(record, 'Stopped by DevSurface');\n this.emit('process', this.snapshot(record));\n return true;\n }\n\n list(): ManagedProcessSnapshot[] {\n return Array.from(this.processes.values()).map((record) => this.snapshot(record));\n }\n\n listLogs(): ProcessLogEvent[] {\n return [...this.logs];\n }\n\n killAll(): void {\n for (const record of this.processes.values()) {\n if (record.status === 'running') {\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n }\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n\n this.cleanupInstalled = true;\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n\n private emitLog(record: ProcessRecord, stream: ProcessLogEvent['stream'], message: string): void {\n const boundedMessage =\n message.length <= LOG_MESSAGE_LIMIT ? message : message.slice(-LOG_MESSAGE_LIMIT);\n const event: ProcessLogEvent = {\n pid: record.pid,\n script: record.script,\n stream,\n message: boundedMessage,\n timestamp: new Date().toISOString()\n };\n\n this.logs.push(event);\n if (this.logs.length > LOG_ENTRY_LIMIT) {\n this.logs.splice(0, this.logs.length - LOG_ENTRY_LIMIT);\n }\n\n this.emit('log', event);\n }\n\n private emitSystem(record: ProcessRecord, message: string): void {\n this.emitLog(record, 'system', message);\n }\n\n private snapshot(record: ProcessRecord): ManagedProcessSnapshot {\n return {\n pid: record.pid,\n script: record.script,\n command: record.command,\n status: record.status,\n startedAt: record.startedAt,\n endedAt: record.endedAt,\n exitCode: record.exitCode\n };\n }\n}\n","import { constants, existsSync } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport type { Hono } from 'hono';\nimport open from 'open';\nimport {\n DockerComposeController,\n DockerOperationError,\n type DockerController\n} from '../../core/docker/compose.js';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport {\n isDangerousCommand,\n resolveConfiguredCommand,\n resolvePackageInstallCommand,\n resolvePackageRunCommand\n} from '../../core/process/runner.js';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { isAllowedLocalHostHeader, isAllowedLocalOrigin, isSameOrigin } from '../localAccess.js';\nimport { hasValidMutationToken } from '../mutationToken.js';\nimport { isAllowedTerminalCommand } from '../terminal.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isAllowedMutationOrigin(requestUrl: string, origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n\n return isAllowedLocalOrigin(origin) && isSameOrigin(requestUrl, origin);\n}\n\nfunction isCrossSiteFetch(secFetchSite: string | null): boolean {\n return secFetchSite === 'cross-site';\n}\n\nfunction hasMutationIntent(intent: string | null): boolean {\n return intent === 'dashboard';\n}\n\nasync function realPathWithinRoot(root: string, target: string): Promise<boolean> {\n if (!isWithinRoot(root, target)) {\n return false;\n }\n\n try {\n const [realRoot, realTarget] = await Promise.all([fs.realpath(root), fs.realpath(target)]);\n return isWithinRoot(realRoot, realTarget);\n } catch {\n return false;\n }\n}\n\nasync function writableDestinationWithinRoot(root: string, destination: string): Promise<boolean> {\n if (!isWithinRoot(root, destination)) {\n return false;\n }\n\n try {\n const [realRoot, realParent] = await Promise.all([\n fs.realpath(root),\n fs.realpath(path.dirname(destination))\n ]);\n return isWithinRoot(realRoot, realParent);\n } catch {\n return false;\n }\n}\n\nasync function copyFileExclusive(\n source: string,\n destination: string\n): Promise<'copied' | 'exists'> {\n const content = await fs.readFile(source);\n let handle: fs.FileHandle | null = null;\n try {\n handle = await fs.open(\n destination,\n constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY,\n 0o600\n );\n await handle.writeFile(content);\n return 'copied';\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'EEXIST') {\n return 'exists';\n }\n\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nfunction quotePowerShellString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction quotePosixString(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction resolveCommandPromptExecutable(): string {\n return process.env.ComSpec ?? 'cmd.exe';\n}\n\nfunction findExecutable(command: string): string | null {\n if (path.isAbsolute(command)) {\n return existsSync(command) ? command : null;\n }\n\n const pathValue = process.env.PATH ?? '';\n for (const directory of pathValue.split(path.delimiter)) {\n if (directory.length === 0) {\n continue;\n }\n\n const candidate = path.join(directory, command);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction launchDetached(command: string, args: string[], root: string): boolean {\n const child = spawn(command, args, {\n cwd: root,\n detached: true,\n stdio: 'ignore',\n windowsHide: process.platform === 'win32'\n });\n child.on('error', () => undefined);\n child.unref();\n return true;\n}\n\nfunction openTerminalAt(root: string): boolean {\n if (process.platform === 'win32') {\n return launchDetached(\n resolveCommandPromptExecutable(),\n [\n '/d',\n '/c',\n 'start',\n '\"\"',\n '/D',\n root,\n 'powershell.exe',\n '-NoExit',\n '-NoLogo',\n '-Command',\n `Set-Location -LiteralPath ${quotePowerShellString(root)}`\n ],\n root\n );\n }\n\n if (process.platform === 'darwin') {\n return launchDetached('open', ['-a', 'Terminal', root], root);\n }\n\n const configuredTerminal = process.env.TERMINAL?.trim();\n if (\n configuredTerminal !== undefined &&\n configuredTerminal.length > 0 &&\n isAllowedTerminalCommand(configuredTerminal) &&\n findExecutable(configuredTerminal) !== null\n ) {\n return launchDetached(configuredTerminal, [], root);\n }\n\n const linuxTerminals: Array<{ command: string; args: string[] }> = [\n { command: 'x-terminal-emulator', args: [] },\n { command: 'gnome-terminal', args: ['--working-directory', root] },\n { command: 'konsole', args: ['--workdir', root] },\n { command: 'xfce4-terminal', args: ['--working-directory', root] },\n {\n command: 'xterm',\n args: [\n '-e',\n 'sh',\n '-lc',\n `cd ${quotePosixString(root)} && exec ${quotePosixString(process.env.SHELL ?? 'sh')}`\n ]\n }\n ];\n\n const terminal = linuxTerminals.find((candidate) => findExecutable(candidate.command) !== null);\n if (terminal === undefined) {\n return false;\n }\n\n return launchDetached(terminal.command, terminal.args, root);\n}\n\nexport function registerApiRoutes(\n app: Hono,\n options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken: string;\n }\n): void {\n const dockerController =\n options.dockerController ?? new DockerComposeController(options.projectRoot);\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.use('/api/*', async (context, next) => {\n const host = context.req.header('host') ?? new URL(context.req.url).host;\n if (!isAllowedLocalHostHeader(host)) {\n return context.json({ error: 'Non-local host rejected.' }, 403);\n }\n\n if (context.req.method !== 'GET' && context.req.method !== 'HEAD') {\n const origin = context.req.header('origin') ?? null;\n const secFetchSite = context.req.header('sec-fetch-site') ?? null;\n const intent = context.req.header('x-devsurface-intent') ?? null;\n const token = context.req.header('x-devsurface-token') ?? null;\n if (\n !hasMutationIntent(intent) ||\n !hasValidMutationToken(token, options.mutationToken) ||\n isCrossSiteFetch(secFetchSite) ||\n !isAllowedMutationOrigin(context.req.url, origin)\n ) {\n return context.json({ error: 'Cross-origin mutation rejected.' }, 403);\n }\n }\n\n await next();\n });\n\n app.get('/api/project', async (context) => {\n return context.json(await scanProject(options.projectRoot));\n });\n\n app.get('/api/health', async (context) => {\n return context.json(await runDoctor(options.projectRoot));\n });\n\n app.get('/api/processes', (context) => {\n return context.json(options.processManager.list());\n });\n\n app.get('/api/logs', (context) => {\n return context.json(options.processManager.listLogs());\n });\n\n app.get('/api/docker/:service/logs', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.logs(service));\n } catch (error) {\n if (error instanceof DockerOperationError) {\n if (error.code === 'compose-not-found' || error.code === 'service-not-found') {\n return context.json({ error: error.message, code: error.code }, 404);\n }\n if (error.code === 'docker-not-installed' || error.code === 'docker-not-running') {\n return context.json({ error: error.message, code: error.code }, 503);\n }\n return context.json({ error: error.message, code: error.code }, 502);\n }\n throw error;\n }\n });\n\n app.post('/api/docker/:service/start', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.start(service));\n } catch (error) {\n if (error instanceof DockerOperationError) {\n if (error.code === 'compose-not-found' || error.code === 'service-not-found') {\n return context.json({ error: error.message, code: error.code }, 404);\n }\n if (error.code === 'docker-not-installed' || error.code === 'docker-not-running') {\n return context.json({ error: error.message, code: error.code }, 503);\n }\n return context.json({ error: error.message, code: error.code }, 502);\n }\n throw error;\n }\n });\n\n app.post('/api/docker/:service/stop', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.stop(service));\n } catch (error) {\n if (error instanceof DockerOperationError) {\n if (error.code === 'compose-not-found' || error.code === 'service-not-found') {\n return context.json({ error: error.message, code: error.code }, 404);\n }\n if (error.code === 'docker-not-installed' || error.code === 'docker-not-running') {\n return context.json({ error: error.message, code: error.code }, 503);\n }\n return context.json({ error: error.message, code: error.code }, 502);\n }\n throw error;\n }\n });\n\n app.post('/api/run/:script', async (context) => {\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(options.projectRoot);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n\n return context.json({\n ...processInfo,\n packageScript\n });\n });\n\n app.post('/api/install', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const command = await resolvePackageInstallCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n\n return context.json(processInfo);\n });\n\n app.post('/api/commands/:name', async (context) => {\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(options.projectRoot);\n const configuredCommand = scan.config?.config.commands?.[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(options.projectRoot, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n\n return context.json({\n ...processInfo,\n configuredCommand\n });\n });\n\n app.post('/api/open/folder', async (context) => {\n await open(options.projectRoot);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/open/package', async (context) => {\n const packagePath = path.join(options.projectRoot, 'package.json');\n if (!(await realPathWithinRoot(options.projectRoot, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/open/terminal', (context) => {\n const opened = openTerminalAt(options.projectRoot);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/env/copy', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination =\n localPath ?? path.join(options.projectRoot, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(options.projectRoot, examplePath)) ||\n !(await writableDestinationWithinRoot(options.projectRoot, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n\n return context.json({ copied: true });\n });\n\n app.delete('/api/run/:pid', (context) => {\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = options.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n","const LOCAL_HOSTNAMES = new Set(['127.0.0.1', 'localhost', '::1']);\n\nfunction hostnameFromHostHeader(host: string): string | null {\n const trimmed = host.trim().toLowerCase();\n if (trimmed.length === 0) {\n return null;\n }\n\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n return end > 0 ? trimmed.slice(1, end) : null;\n }\n\n return trimmed.split(':')[0] ?? null;\n}\n\nexport function isAllowedLocalHostHeader(host: string | null | undefined): boolean {\n if (typeof host !== 'string') {\n return false;\n }\n\n const hostname = hostnameFromHostHeader(host);\n return hostname !== null && LOCAL_HOSTNAMES.has(hostname);\n}\n\nexport function isAllowedLocalOrigin(origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n\n try {\n const url = new URL(origin);\n return (\n (url.protocol === 'http:' || url.protocol === 'https:') &&\n LOCAL_HOSTNAMES.has(url.hostname.toLowerCase())\n );\n } catch {\n return false;\n }\n}\n\nexport function isSameOrigin(requestUrl: string, origin: string): boolean {\n try {\n return new URL(requestUrl).origin === new URL(origin).origin;\n } catch {\n return false;\n }\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport function createMutationToken(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function hasValidMutationToken(\n provided: string | null | undefined,\n expected: string\n): boolean {\n if (typeof provided !== 'string' || provided.length === 0) {\n return false;\n }\n\n if (provided.length !== expected.length) {\n return false;\n }\n\n return timingSafeEqual(Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8'));\n}\n","export function isAllowedTerminalCommand(command: string): boolean {\n return /^[A-Za-z0-9._+-]+$/.test(command);\n}\n","import type { Server } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../../core/types.js';\nimport { isAllowedLocalHostHeader, isAllowedLocalOrigin } from '../localAccess.js';\n\nfunction isAllowedWebSocketRequest(request: IncomingMessage): boolean {\n const origin = request.headers.origin;\n const host = request.headers.host;\n const secFetchSite = request.headers['sec-fetch-site'];\n\n if (typeof host !== 'string' || !isAllowedLocalHostHeader(host)) {\n return false;\n }\n\n if (secFetchSite === 'cross-site') {\n return false;\n }\n\n if (typeof origin !== 'string') {\n return true;\n }\n\n if (!isAllowedLocalOrigin(origin)) {\n return false;\n }\n\n try {\n return new URL(origin).host.toLowerCase() === host.toLowerCase();\n } catch {\n return false;\n }\n}\n\nexport function setupWebSocket(server: Server, processManager: ProcessManager): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n function broadcast(payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(serialized);\n }\n }\n }\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcast({ type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcast({ type: 'process', process: processInfo });\n });\n\n wss.on('connection', (socket) => {\n socket.send(\n JSON.stringify({\n type: 'hello',\n processes: processManager.list(),\n logs: processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n","export const DEV_SURFACE_VERSION = '0.3.0';\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","fs","path","isWithinRoot","isWithinRoot","path","fs","platform","fs","path","fs","path","isWithinRoot","fs","path","fs","path","isWithinRoot","isWithinRoot","path","fs","fs","readIfPresent","path","ESC","fs","path","pc","path","fs","pc","pc","spawn","runCommand","spawn","pc","pc","pc","pc","fs","path","fileURLToPath","process","Buffer","path","promisify","fs","fsConstants","process","fs","process","os","fs","fs","fs","fs","process","os","fs","fs","process","promisify","process","execFile","process","process","promisify","execFile","execFileAsync","promisify","execFile","execFileAsync","execFileAsync","promisify","execFile","defaultBrowser","process","execFile","promisify","path","process","Buffer","defaultBrowser","fs","fsConstants","spawn","constants","fs","path","spawn","isWithinRoot","path","fs","handle","constants","spawn","fs","path","fileURLToPath","pc"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/doctor.ts","../../src/core/doctor/index.ts","../../src/core/documentation.ts","../../src/core/scanner/index.ts","../../src/core/config/load.ts","../../src/core/security/url.ts","../../src/core/config/defaults.ts","../../src/core/docker/compose.ts","../../src/core/process/executable.ts","../../src/core/scanner/docker.ts","../../src/core/scanner/env.ts","../../src/core/scanner/framework.ts","../../src/core/scanner/git.ts","../../src/core/scanner/packageManager.ts","../../src/core/scanner/packageJson.ts","../../src/core/scanner/ports.ts","../../src/core/scanner/scripts.ts","../../src/core/security/text.ts","../../src/cli/commands/init.ts","../../src/cli/commands/run.ts","../../src/core/process/runner.ts","../../src/core/security/dangerousCommand.ts","../../src/cli/commands/scan.ts","../../src/cli/commands/start.ts","../../node_modules/open/index.js","../../node_modules/wsl-utils/index.js","../../node_modules/is-wsl/index.js","../../node_modules/is-inside-container/index.js","../../node_modules/is-docker/index.js","../../node_modules/define-lazy-prop/index.js","../../node_modules/default-browser/index.js","../../node_modules/default-browser-id/index.js","../../node_modules/run-applescript/index.js","../../node_modules/bundle-name/index.js","../../node_modules/default-browser/windows.js","../../src/server/index.ts","../../src/core/process/manager.ts","../../src/core/hub/registry.ts","../../src/core/hub/workspaceRoots.ts","../../src/core/hub/runtime.ts","../../src/server/routes/api.ts","../../src/version.ts","../../src/server/localAccess.ts","../../src/server/listenConfig.ts","../../src/server/accessControl.ts","../../src/server/mutationToken.ts","../../src/server/terminal.ts","../../src/server/routes/ws.ts","../../src/cli/hub/client.ts","../../src/cli/commands/serve.ts","../../src/cli/commands/workspace.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { doctorCommand } from './commands/doctor.js';\nimport { initCommand } from './commands/init.js';\nimport { runCommand } from './commands/run.js';\nimport { scanCommand } from './commands/scan.js';\nimport { startCommand } from './commands/start.js';\nimport { serveCommand } from './commands/serve.js';\nimport {\n workspaceAddCommand,\n workspaceListCommand,\n workspaceRemoveCommand\n} from './commands/workspace.js';\nimport { DEV_SURFACE_VERSION } from '../version.js';\n\nconst program = new Command();\n\nfunction toPort(value: string): number {\n const port = Number(value);\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error('Port must be an integer between 1 and 65535.');\n }\n\n return port;\n}\n\nfunction handle(command: Promise<void>): void {\n command.catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n}\n\nprogram\n .name('devsurface')\n .description('Turn any Node.js repository into a local developer control panel.')\n .version(DEV_SURFACE_VERSION)\n .option('-p, --port <port>', 'dashboard port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n startCommand({\n cwd: process.cwd(),\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nprogram\n .command('serve')\n .description('Start the DevSurface hub server (multi-workspace mode).')\n .option('-p, --port <port>', 'hub port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n serveCommand({\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nconst workspace = program.command('workspace').description('Manage registered workspaces.');\n\nworkspace\n .command('add [path]')\n .description('Register a project directory with the hub.')\n .action((dirPath?: string) => {\n handle(workspaceAddCommand(dirPath));\n });\n\nworkspace\n .command('list')\n .description('List all registered workspaces.')\n .action(() => {\n handle(workspaceListCommand());\n });\n\nworkspace\n .command('remove <id>')\n .description('Remove a workspace from the hub registry.')\n .action((id: string) => {\n handle(workspaceRemoveCommand(id));\n });\n\nprogram\n .command('scan')\n .description('Print detected project info.')\n .action(() => {\n handle(scanCommand(process.cwd()));\n });\n\nprogram\n .command('doctor')\n .description('Print setup health warnings.')\n .action(() => {\n handle(doctorCommand(process.cwd()));\n });\n\nprogram\n .command('init')\n .description('Create a starter devsurface.config.json.')\n .action(() => {\n handle(initCommand(process.cwd()));\n });\n\nprogram\n .command('run')\n .argument('<script>', 'package.json script to run')\n .description('Run a package script and stream logs.')\n .action((script: string) => {\n handle(runCommand(script, process.cwd()));\n });\n\nawait program.parseAsync(process.argv);\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction colorSeverity(severity: 'error' | 'warning' | 'info'): string {\n if (severity === 'error') {\n return pc.red('error');\n }\n\n if (severity === 'warning') {\n return pc.yellow('warning');\n }\n\n return pc.cyan('info');\n}\n\nexport async function doctorCommand(cwd = process.cwd()): Promise<void> {\n const warnings = await runDoctor(cwd);\n\n if (warnings.length === 0) {\n console.log(pc.green('No health warnings found.'));\n return;\n }\n\n for (const item of warnings) {\n console.log(`${colorSeverity(item.severity)} ${pc.bold(safeTerminalText(item.title))}`);\n console.log(` ${safeTerminalText(item.message)}`);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { extractScriptReferences } from '../documentation.js';\nimport type { DoctorWarning, ScanResult } from '../types.js';\nimport { scanProject } from '../scanner/index.js';\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readIfPresent(filePath: string | null): Promise<string | null> {\n if (filePath === null) {\n return null;\n }\n\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction warning(\n id: string,\n severity: DoctorWarning['severity'],\n title: string,\n message: string,\n target?: string\n): DoctorWarning {\n return { id, severity, title, message, target };\n}\n\nexport async function runDoctor(root = process.cwd(), scan?: ScanResult): Promise<DoctorWarning[]> {\n const result = scan ?? (await scanProject(root));\n const warnings: DoctorWarning[] = [];\n\n for (const configWarning of result.config?.warnings ?? []) {\n warnings.push(\n warning('config-warning', 'warning', 'Config warning', configWarning, result.config?.path)\n );\n }\n\n if (result.packageJson === null) {\n warnings.push(\n warning(\n 'missing-package-json',\n 'error',\n 'No package.json',\n 'This directory is not a Node.js project.'\n )\n );\n return warnings;\n }\n\n if (!(await pathExists(path.join(root, 'node_modules', '.bin')))) {\n warnings.push(\n warning(\n 'missing-node-modules',\n 'warning',\n 'Dependencies are not installed',\n 'node_modules/.bin is missing. Run the project install command before starting scripts.'\n )\n );\n }\n\n if (result.env?.hasExample && !result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env',\n 'error',\n '.env is missing',\n '.env.example exists, but the local .env file is missing.',\n result.env.examplePath ?? undefined\n )\n );\n }\n\n if (result.env && result.env.missingKeys.length > 0 && result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env-keys',\n 'warning',\n 'Environment keys are missing',\n `Missing keys: ${result.env.missingKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n if (result.env && result.env.emptyKeys.length > 0) {\n warnings.push(\n warning(\n 'empty-env-keys',\n 'info',\n 'Environment keys are empty',\n `Empty keys: ${result.env.emptyKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n const missingReadme = !result.readme.exists;\n if (missingReadme) {\n warnings.push(\n warning('missing-readme', 'warning', 'No README', 'No README.md or README file was found.')\n );\n } else {\n const readme = await readIfPresent(result.readme.path);\n if (readme !== null) {\n const references = extractScriptReferences(readme);\n const missingScripts = references.filter((script) => result.scripts[script] === undefined);\n if (missingScripts.length > 0) {\n warnings.push(\n warning(\n 'readme-script-mismatch',\n 'warning',\n 'README references missing scripts',\n `README mentions scripts not present in package.json: ${missingScripts.join(', ')}.`\n )\n );\n }\n }\n }\n\n for (const port of result.ports.filter((probe) => probe.inUse)) {\n warnings.push(\n warning(\n `port-${port.port}-in-use`,\n 'error',\n `Port ${port.port} is already in use`,\n `Something is already bound to 127.0.0.1:${port.port}.`\n )\n );\n }\n\n if (result.docker && result.docker.dockerRunning === false) {\n warnings.push(\n warning(\n 'docker-not-running',\n 'warning',\n 'Docker Compose found but Docker is not running',\n result.docker.message ?? 'A compose file exists, but Docker is not available.'\n )\n );\n }\n\n if (result.scripts.test === undefined) {\n warnings.push(\n warning(\n 'missing-test-script',\n 'warning',\n 'No test script',\n 'package.json does not define a test script.'\n )\n );\n }\n\n if (result.scripts.build === undefined) {\n warnings.push(\n warning(\n 'missing-build-script',\n 'warning',\n 'No build script',\n 'package.json does not define a build script.'\n )\n );\n }\n\n return warnings;\n}\n","export function extractScriptReferences(content: string): string[] {\n const references = new Set<string>();\n const commandRegexes = [\n /\\bnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bpnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bbun\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\byarn\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bnpm\\s+(test|start|build)\\b/g,\n /\\bpnpm\\s+(test|start|build)\\b/g,\n /\\byarn\\s+(test|start|build)\\b/g,\n /\\bbun\\s+(test|start|build)\\b/g\n ];\n\n for (const regex of commandRegexes) {\n for (const match of content.matchAll(regex)) {\n references.add(match[1]);\n }\n }\n\n return Array.from(references);\n}\n\nexport function documentsEnvironmentSetup(content: string): boolean {\n return /(?:\\.env(?:\\.example)?|environment\\s+variables?)/i.test(content);\n}\n\nexport function undocumentedPorts(content: string, ports: number[]): number[] {\n return ports.filter((port) => !new RegExp(`\\\\b${port}\\\\b`).test(content));\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FilePresence, ScanResult } from '../types.js';\nimport { loadConfig } from '../config/load.js';\nimport { detectDocker } from './docker.js';\nimport { detectEnv } from './env.js';\nimport { detectFramework } from './framework.js';\nimport { detectGit } from './git.js';\nimport { detectPackageManager } from './packageManager.js';\nimport { readPackageJson } from './packageJson.js';\nimport { defaultPortsForFramework, detectPorts, inferPortsFromScripts } from './ports.js';\nimport { extractScripts } from './scripts.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function findFirstFile(root: string, candidates: string[]): Promise<FilePresence> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n\n for (const candidate of candidates) {\n const filePath = path.join(root, candidate);\n try {\n const [stat, realPath] = await Promise.all([fs.stat(filePath), fs.realpath(filePath)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realPath)) {\n return { path: realPath, exists: true };\n }\n } catch {\n // Keep looking through the candidate list.\n }\n }\n\n return { path: null, exists: false };\n}\n\nfunction configuredPorts(configPorts: number[] | undefined): number[] {\n return Array.isArray(configPorts) ? configPorts : [];\n}\n\nexport async function scanProject(root = process.cwd()): Promise<ScanResult> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const config = await loadConfig(resolvedRoot);\n const packageJson = await readPackageJson(resolvedRoot);\n const scripts = extractScripts(packageJson) ?? {};\n const framework = detectFramework(packageJson);\n const portsToProbe = [\n ...configuredPorts(config?.config.ports),\n ...inferPortsFromScripts(scripts),\n ...defaultPortsForFramework(framework)\n ];\n\n const [packageManager, env, docker, git, ports, readme, license] = await Promise.all([\n detectPackageManager(resolvedRoot),\n detectEnv(resolvedRoot, config?.config),\n detectDocker(resolvedRoot),\n detectGit(resolvedRoot),\n detectPorts(portsToProbe),\n findFirstFile(resolvedRoot, ['README.md', 'README']),\n findFirstFile(resolvedRoot, ['LICENSE', 'LICENSE.md', 'COPYING'])\n ]);\n\n return {\n root: resolvedRoot,\n projectName: config?.config.name ?? packageJson?.data.name ?? path.basename(resolvedRoot),\n packageJson,\n packageManager: packageManager ?? (packageJson ? 'npm' : null),\n scripts,\n env,\n docker,\n git,\n framework,\n ports: ports ?? [],\n readme,\n license,\n config\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { isSafeHttpUrl } from '../security/url.js';\nimport type { ConfigLoadResult, DevSurfaceConfig } from '../types.js';\nimport { CONFIG_FILE_NAME } from './defaults.js';\n\nexport const MAX_CONFIGURED_PORTS = 32;\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toStringRecord(\n value: unknown,\n warnings: string[],\n label: string\n): Record<string, string> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push(`${label} must be an object.`);\n return undefined;\n }\n\n const record: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'string') {\n record[key] = raw;\n } else {\n warnings.push(`${label}.${key} must be a string.`);\n }\n }\n\n return record;\n}\n\nfunction toGroups(value: unknown, warnings: string[]): Record<string, string[]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push('groups must be an object.');\n return undefined;\n }\n\n const groups: Record<string, string[]> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (Array.isArray(raw) && raw.every((entry) => typeof entry === 'string')) {\n groups[key] = raw;\n } else {\n warnings.push(`groups.${key} must be an array of command names.`);\n }\n }\n\n return groups;\n}\n\nfunction toPorts(value: unknown, warnings: string[]): number[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('ports must be an array of numbers.');\n return undefined;\n }\n\n const ports = value.filter(\n (port): port is number => Number.isInteger(port) && port > 0 && port < 65536\n );\n if (ports.length !== value.length) {\n warnings.push('ports may only contain integers between 1 and 65535.');\n }\n\n if (ports.length > MAX_CONFIGURED_PORTS) {\n warnings.push(`ports may contain at most ${MAX_CONFIGURED_PORTS} entries.`);\n }\n\n return ports.slice(0, MAX_CONFIGURED_PORTS);\n}\n\nexport function validateConfig(raw: unknown): { config: DevSurfaceConfig; warnings: string[] } {\n const warnings: string[] = [];\n if (!isRecord(raw)) {\n return { config: {}, warnings: ['devsurface.config.json must contain a JSON object.'] };\n }\n\n const env = isRecord(raw.env)\n ? {\n example: typeof raw.env.example === 'string' ? raw.env.example : undefined,\n local: typeof raw.env.local === 'string' ? raw.env.local : undefined\n }\n : undefined;\n\n if (raw.env !== undefined && !isRecord(raw.env)) {\n warnings.push('env must be an object.');\n }\n\n const services = isRecord(raw.services)\n ? {\n docker: typeof raw.services.docker === 'boolean' ? raw.services.docker : undefined\n }\n : undefined;\n\n if (raw.services !== undefined && !isRecord(raw.services)) {\n warnings.push('services must be an object.');\n }\n\n let docs: string | undefined;\n if (typeof raw.docs === 'string' && raw.docs.length > 0) {\n if (isSafeHttpUrl(raw.docs)) {\n docs = raw.docs;\n } else {\n warnings.push('docs must be an http or https URL.');\n }\n }\n\n return {\n config: {\n name: typeof raw.name === 'string' ? raw.name : undefined,\n description: typeof raw.description === 'string' ? raw.description : undefined,\n commands: toStringRecord(raw.commands, warnings, 'commands'),\n groups: toGroups(raw.groups, warnings),\n ports: toPorts(raw.ports, warnings),\n env,\n services,\n docs\n },\n warnings\n };\n}\n\nexport async function loadConfig(root: string): Promise<ConfigLoadResult | null> {\n const configPath = path.join(root, CONFIG_FILE_NAME);\n\n try {\n const [realRoot, realConfigPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(configPath)\n ]);\n if (!isWithinRoot(realRoot, realConfigPath)) {\n return null;\n }\n const content = await fs.readFile(realConfigPath, 'utf8');\n const parsed = JSON.parse(content) as unknown;\n const { config, warnings } = validateConfig(parsed);\n return { path: realConfigPath, config, warnings };\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'ENOENT') {\n return null;\n }\n\n if (error instanceof SyntaxError) {\n return {\n path: configPath,\n config: {},\n warnings: [`${CONFIG_FILE_NAME} contains invalid JSON.`]\n };\n }\n\n return null;\n }\n}\n","export function isSafeHttpUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n","import type { DevSurfaceConfig } from '../types.js';\n\nexport const CONFIG_FILE_NAME = 'devsurface.config.json';\n\nexport const defaultConfig: DevSurfaceConfig = {\n name: 'My App',\n description: 'Local developer control panel',\n commands: {\n install: 'npm install',\n dev: 'npm run dev',\n build: 'npm run build',\n test: 'npm test',\n lint: 'npm run lint'\n },\n groups: {\n Setup: ['install'],\n Development: ['dev'],\n Quality: ['test', 'lint'],\n Build: ['build']\n },\n ports: [3000],\n env: {\n example: '.env.example',\n local: '.env'\n },\n services: {\n docker: true\n },\n docs: ''\n};\n","import { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport { parse as parseYaml } from 'yaml';\nimport { resolveExecutableOutsideRoot } from '../process/executable.js';\nimport type {\n DockerDaemonStatus,\n DockerInfo,\n DockerServiceInfo,\n DockerServiceStatus\n} from '../types.js';\n\nconst COMPOSE_FILES = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];\nconst COMMAND_OUTPUT_LIMIT = 200_000;\nconst ESC = String.fromCharCode(27);\nconst ANSI_CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\n\nexport interface DockerCommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error: 'not-found' | 'timeout' | 'spawn' | null;\n}\n\nexport interface DockerCommandOptions {\n timeoutMs?: number;\n outputLimit?: number;\n}\n\nexport type DockerCommandRunner = (\n root: string,\n args: string[],\n options?: DockerCommandOptions\n) => Promise<DockerCommandResult>;\n\nexport interface DockerActionResult {\n service: string;\n action: 'start' | 'stop';\n output: string;\n}\n\nexport interface DockerLogsResult {\n service: string;\n logs: string;\n}\n\nexport interface DockerController {\n inspect(): Promise<DockerInfo | null>;\n start(service: string): Promise<DockerActionResult>;\n stop(service: string): Promise<DockerActionResult>;\n logs(service: string): Promise<DockerLogsResult>;\n}\n\nexport type DockerOperationErrorCode =\n | 'compose-not-found'\n | 'service-not-found'\n | 'docker-not-installed'\n | 'docker-not-running'\n | 'command-failed';\n\nexport class DockerOperationError extends Error {\n constructor(\n public readonly code: DockerOperationErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'DockerOperationError';\n }\n}\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction dockerCommandCwd(root: string): string {\n const candidates = [os.homedir(), os.tmpdir(), path.parse(path.resolve(root)).root];\n return candidates.find((candidate) => !isWithinRoot(root, candidate)) ?? os.homedir();\n}\n\nfunction appendBounded(current: string, chunk: string, limit: number): string {\n const combined = current + chunk;\n return combined.length <= limit ? combined : combined.slice(-limit);\n}\n\nexport const runDockerCommand: DockerCommandRunner = async (root, args, options = {}) => {\n const dockerExecutable = await resolveExecutableOutsideRoot(root, 'docker');\n if (dockerExecutable === null) {\n return { code: null, stdout: '', stderr: '', error: 'not-found' };\n }\n\n const timeoutMs = options.timeoutMs ?? 5000;\n const outputLimit = options.outputLimit ?? COMMAND_OUTPUT_LIMIT;\n\n return await new Promise((resolve) => {\n const child = spawn(dockerExecutable, args, {\n cwd: dockerCommandCwd(root),\n windowsHide: true\n });\n let settled = false;\n let stdout = '';\n let stderr = '';\n\n const finish = (result: DockerCommandResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve(result);\n };\n\n const timeout = setTimeout(() => {\n child.kill();\n finish({ code: null, stdout, stderr, error: 'timeout' });\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout = appendBounded(stdout, chunk.toString(), outputLimit);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr = appendBounded(stderr, chunk.toString(), outputLimit);\n });\n child.on('error', () => {\n finish({ code: null, stdout, stderr, error: 'spawn' });\n });\n child.on('close', (code) => {\n finish({ code, stdout, stderr, error: null });\n });\n });\n};\n\nasync function findComposeFiles(root: string): Promise<string[]> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const matches: string[] = [];\n\n for (const file of COMPOSE_FILES) {\n const candidate = path.join(root, file);\n try {\n const [stat, realCandidate] = await Promise.all([fs.stat(candidate), fs.realpath(candidate)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realCandidate)) {\n matches.push(realCandidate);\n }\n } catch {\n // Continue through the supported Compose filenames.\n }\n }\n\n return matches;\n}\n\nasync function serviceNamesFromFiles(composeFiles: string[]): Promise<string[]> {\n const names = new Set<string>();\n\n for (const composeFile of composeFiles) {\n try {\n const parsed = parseYaml(await fs.readFile(composeFile, 'utf8')) as unknown;\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('services' in parsed) ||\n typeof parsed.services !== 'object' ||\n parsed.services === null ||\n Array.isArray(parsed.services)\n ) {\n continue;\n }\n\n for (const name of Object.keys(parsed.services)) {\n if (name.length > 0) {\n names.add(name);\n }\n }\n } catch {\n // Malformed files remain visible as Compose files, but expose no actions.\n }\n }\n\n return Array.from(names);\n}\n\nfunction composeArgs(root: string, composeFiles: string[], args: string[]): string[] {\n return [\n 'compose',\n ...composeFiles.flatMap((composeFile) => ['-f', composeFile]),\n '--project-directory',\n root,\n ...args\n ];\n}\n\nfunction cleanMessage(value: string): string {\n return value.replace(ANSI_CSI_SEQUENCE, '').trim().slice(-1000);\n}\n\nfunction resultMessage(result: DockerCommandResult): string {\n return cleanMessage(result.stderr || result.stdout);\n}\n\nfunction daemonStatus(\n result: DockerCommandResult,\n platform: NodeJS.Platform\n): {\n status: DockerDaemonStatus;\n running: boolean;\n message: string | null;\n} {\n if (result.error === 'not-found') {\n return {\n status: 'not-installed',\n running: false,\n message: 'Docker CLI was not found. Install Docker and refresh this page.'\n };\n }\n\n if (result.code === 0) {\n return { status: 'running', running: true, message: null };\n }\n\n if (platform === 'win32' || platform === 'darwin') {\n return {\n status: 'stopped',\n running: false,\n message:\n 'Docker is installed, but its engine is not responding. Start Docker Desktop and refresh.'\n };\n }\n\n const detail = resultMessage(result);\n return {\n status: result.error === 'timeout' ? 'unknown' : 'stopped',\n running: false,\n message: detail\n ? `Docker is installed, but its daemon is not responding: ${detail}`\n : 'Docker is installed, but its daemon is not responding. Start Docker and refresh.'\n };\n}\n\nfunction exitCodeFromRow(record: Record<string, unknown>): number | null {\n if (typeof record.ExitCode === 'number') {\n return record.ExitCode;\n }\n if (typeof record.ExitCode === 'string' && /^\\d+$/.test(record.ExitCode)) {\n return Number(record.ExitCode);\n }\n if (typeof record.Status === 'string') {\n const match = /\\bExited\\s+\\((\\d+)\\)/i.exec(record.Status);\n if (match?.[1]) {\n return Number(match[1]);\n }\n }\n return null;\n}\n\nfunction serviceStatusFromRow(record: Record<string, unknown>): DockerServiceStatus {\n const state = typeof record.State === 'string' ? record.State.toLowerCase() : '';\n const exitCode = exitCodeFromRow(record);\n\n if (state === 'running') {\n return 'running';\n }\n if (exitCode !== null && exitCode > 0) {\n return 'error';\n }\n if (state === 'created' || state === 'exited' || state === 'stopped') {\n return 'stopped';\n }\n if (state === 'dead' || state === 'restarting' || state === 'paused') {\n return 'error';\n }\n return 'unknown';\n}\n\nfunction addComposeStatusRow(statuses: Map<string, DockerServiceInfo>, row: unknown): void {\n if (typeof row !== 'object' || row === null) {\n return;\n }\n\n const record = row as Record<string, unknown>;\n if (typeof record.Service !== 'string') {\n return;\n }\n\n const detail =\n typeof record.Status === 'string' && record.Status.trim()\n ? record.Status.trim()\n : typeof record.State === 'string' && record.State.trim()\n ? record.State.trim()\n : null;\n\n statuses.set(record.Service, {\n name: record.Service,\n status: serviceStatusFromRow(record),\n statusDetail: detail,\n containerId: typeof record.ID === 'string' && record.ID.length > 0 ? record.ID : null\n });\n}\n\nfunction parseComposePs(output: string): Map<string, DockerServiceInfo> {\n const statuses = new Map<string, DockerServiceInfo>();\n const compactOutput = output.trim();\n if (!compactOutput) {\n return statuses;\n }\n\n try {\n const parsed = JSON.parse(compactOutput) as unknown;\n for (const row of Array.isArray(parsed) ? parsed : [parsed]) {\n addComposeStatusRow(statuses, row);\n }\n return statuses;\n } catch {\n // Older Compose builds can emit one JSON object per line.\n }\n\n for (const line of compactOutput.split(/\\r?\\n/)) {\n try {\n addComposeStatusRow(statuses, JSON.parse(line) as unknown);\n } catch {\n return new Map();\n }\n }\n\n return statuses;\n}\n\nfunction unknownServices(serviceNames: string[]): DockerServiceInfo[] {\n return serviceNames.map((name) => ({\n name,\n status: 'unknown',\n statusDetail: null,\n containerId: null\n }));\n}\n\nfunction commandFailureMessage(action: string, result: DockerCommandResult): string {\n const detail = resultMessage(result);\n return detail ? `Docker Compose ${action} failed: ${detail}` : `Docker Compose ${action} failed.`;\n}\n\nexport class DockerComposeController implements DockerController {\n private readonly runner: DockerCommandRunner;\n private readonly platform: NodeJS.Platform;\n\n constructor(\n private readonly root: string,\n options: {\n runner?: DockerCommandRunner;\n platform?: NodeJS.Platform;\n } = {}\n ) {\n this.runner = options.runner ?? runDockerCommand;\n this.platform = options.platform ?? process.platform;\n }\n\n private async definition(): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n } | null> {\n const composeFiles = await findComposeFiles(this.root);\n if (composeFiles.length === 0) {\n return null;\n }\n return {\n composeFiles,\n serviceNames: await serviceNamesFromFiles(composeFiles)\n };\n }\n\n private async requireService(service: string): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n }> {\n const definition = await this.definition();\n if (definition === null) {\n throw new DockerOperationError('compose-not-found', 'No Docker Compose file was found.');\n }\n if (!definition.serviceNames.includes(service)) {\n throw new DockerOperationError(\n 'service-not-found',\n `Docker Compose service \"${service}\" was not found.`\n );\n }\n return definition;\n }\n\n private async requireDaemon(): Promise<void> {\n const result = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(result, this.platform);\n if (daemon.status === 'not-installed') {\n throw new DockerOperationError('docker-not-installed', daemon.message ?? 'Docker not found.');\n }\n if (!daemon.running) {\n throw new DockerOperationError(\n 'docker-not-running',\n daemon.message ?? 'Docker is not running.'\n );\n }\n }\n\n async inspect(): Promise<DockerInfo | null> {\n const definition = await this.definition();\n if (definition === null) {\n return null;\n }\n\n const infoResult = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(infoResult, this.platform);\n if (!daemon.running) {\n return {\n composeFiles: definition.composeFiles,\n services: unknownServices(definition.serviceNames),\n dockerRunning: false,\n daemonStatus: daemon.status,\n message: daemon.message\n };\n }\n\n const ps = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, ['ps', '--all', '--format', 'json']),\n { timeoutMs: 8000 }\n );\n if (ps.code !== 0 || ps.error !== null) {\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map((name) => ({\n name,\n status: 'error',\n statusDetail: null,\n containerId: null\n })),\n dockerRunning: true,\n daemonStatus: 'running',\n message: commandFailureMessage('status check', ps)\n };\n }\n\n const statuses = parseComposePs(ps.stdout);\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map(\n (name) =>\n statuses.get(name) ?? {\n name,\n status: 'stopped',\n statusDetail: null,\n containerId: null\n }\n ),\n dockerRunning: true,\n daemonStatus: 'running',\n message: null\n };\n }\n\n private async action(service: string, action: 'start' | 'stop'): Promise<DockerActionResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const composeCommand =\n action === 'start' ? ['up', '-d', '--', service] : ['stop', '--', service];\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, composeCommand),\n { timeoutMs: 60_000 }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage(action, result));\n }\n return {\n service,\n action,\n output: cleanMessage(result.stdout || result.stderr)\n };\n }\n\n async start(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'start');\n }\n\n async stop(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'stop');\n }\n\n async logs(service: string): Promise<DockerLogsResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, [\n 'logs',\n '--no-color',\n '--tail',\n '200',\n '--',\n service\n ]),\n { timeoutMs: 15_000, outputLimit: COMMAND_OUTPUT_LIMIT }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage('logs', result));\n }\n return {\n service,\n logs: appendBounded('', `${result.stdout}${result.stderr}`, COMMAND_OUTPUT_LIMIT)\n };\n }\n}\n","import { constants } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction pathEntries(pathValue: string): string[] {\n return pathValue\n .split(path.delimiter)\n .map((entry) => entry.trim().replace(/^\"|\"$/g, ''))\n .filter((entry) => entry.length > 0);\n}\n\nfunction hasPathSeparator(command: string): boolean {\n return command.includes('/') || command.includes('\\\\');\n}\n\nfunction executableNames(command: string): string[] {\n if (process.platform !== 'win32' || path.extname(command)) {\n return [command];\n }\n\n const extensions = (process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD')\n .split(';')\n .map((extension) => extension.trim().toLowerCase())\n .filter(Boolean);\n return extensions.map((extension) => `${command}${extension}`);\n}\n\nasync function executableOutsideRoot(root: string, candidate: string): Promise<string | null> {\n if (isWithinRoot(root, candidate)) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n if (isWithinRoot(realRoot, realCandidate)) {\n return null;\n }\n\n await fs.access(realCandidate, constants.X_OK);\n return realCandidate;\n } catch {\n return null;\n }\n}\n\nexport async function resolveExecutableOutsideRoot(\n root: string,\n command: string\n): Promise<string | null> {\n if (path.isAbsolute(command) || hasPathSeparator(command)) {\n return await executableOutsideRoot(root, path.resolve(command));\n }\n\n for (const entry of pathEntries(process.env.PATH ?? '')) {\n const directory = path.resolve(entry);\n if (isWithinRoot(root, directory)) {\n continue;\n }\n\n for (const executableName of executableNames(command)) {\n const executable = await executableOutsideRoot(root, path.join(directory, executableName));\n if (executable !== null) {\n return executable;\n }\n }\n }\n\n return null;\n}\n","import { DockerComposeController } from '../docker/compose.js';\nimport type { DockerInfo } from '../types.js';\n\nexport async function detectDocker(root: string): Promise<DockerInfo | null> {\n return await new DockerComposeController(root).inspect();\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { DevSurfaceConfig, EnvInfo } from '../types.js';\n\ninterface ParsedEnv {\n keys: string[];\n emptyKeys: string[];\n}\n\nasync function readIfPresent(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction resolveInsideRoot(root: string, configuredPath: string): string | null {\n const resolvedRoot = path.resolve(root);\n const resolvedPath = path.resolve(resolvedRoot, configuredPath);\n const relative = path.relative(resolvedRoot, resolvedPath);\n const insideRoot = relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? resolvedPath : null;\n}\n\nasync function resolveExistingInsideRoot(\n root: string,\n configuredPath: string\n): Promise<string | null> {\n const candidate = resolveInsideRoot(root, configuredPath);\n if (candidate === null) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n const relative = path.relative(realRoot, realCandidate);\n const insideRoot =\n relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? candidate : null;\n } catch {\n return null;\n }\n}\n\nexport function parseEnvKeys(content: string): ParsedEnv {\n const keys: string[] = [];\n const emptyKeys: string[] = [];\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n const normalized = line.startsWith('export ') ? line.slice('export '.length).trim() : line;\n const separator = normalized.indexOf('=');\n if (separator <= 0) {\n continue;\n }\n\n const key = normalized.slice(0, separator).trim();\n const value = normalized.slice(separator + 1).trim();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n keys.push(key);\n if (value.length === 0 || value === '\"\"' || value === \"''\") {\n emptyKeys.push(key);\n }\n }\n }\n\n return { keys: Array.from(new Set(keys)), emptyKeys: Array.from(new Set(emptyKeys)) };\n}\n\nexport async function detectEnv(\n root: string,\n config?: DevSurfaceConfig | null\n): Promise<EnvInfo | null> {\n const exampleName = config?.env?.example ?? '.env.example';\n const localName = config?.env?.local ?? '.env';\n const [examplePath, localPath] = await Promise.all([\n resolveExistingInsideRoot(root, exampleName),\n resolveExistingInsideRoot(root, localName)\n ]);\n const [exampleContent, localContent] = await Promise.all([\n examplePath === null ? null : readIfPresent(examplePath),\n localPath === null ? null : readIfPresent(localPath)\n ]);\n\n if (exampleContent === null && localContent === null) {\n return null;\n }\n\n const example =\n exampleContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(exampleContent);\n const local = localContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(localContent);\n const localKeySet = new Set(local.keys);\n const localEmptySet = new Set(local.emptyKeys);\n const missingKeys = example.keys.filter((key) => !localKeySet.has(key));\n const emptyKeys = local.keys.filter((key) => localEmptySet.has(key));\n\n return {\n examplePath: exampleContent === null ? null : examplePath,\n localPath: localContent === null ? null : localPath,\n hasExample: exampleContent !== null,\n hasLocal: localContent !== null,\n exampleKeys: example.keys,\n localKeys: local.keys,\n missingKeys,\n emptyKeys,\n keys: example.keys.map((key) => ({\n key,\n present: localKeySet.has(key),\n empty: localEmptySet.has(key)\n }))\n };\n}\n","import type { FrameworkInfo, PackageJsonInfo } from '../types.js';\n\nconst frameworkPackages: Array<{ packageName: string; label: string }> = [\n { packageName: 'next', label: 'Next.js' },\n { packageName: 'vite', label: 'Vite' },\n { packageName: 'express', label: 'Express' },\n { packageName: 'fastify', label: 'Fastify' },\n { packageName: '@nestjs/core', label: 'NestJS' },\n { packageName: '@remix-run/react', label: 'Remix' },\n { packageName: 'prisma', label: 'Prisma' }\n];\n\nexport function detectFramework(packageJson: PackageJsonInfo | null): FrameworkInfo | null {\n if (packageJson === null) {\n return null;\n }\n\n const dependencies = {\n ...packageJson.data.dependencies,\n ...packageJson.data.devDependencies,\n ...packageJson.data.optionalDependencies,\n ...packageJson.data.peerDependencies\n };\n\n const detected = frameworkPackages\n .filter((framework) => dependencies[framework.packageName] !== undefined)\n .map((framework) => framework.label);\n\n if (detected.length === 0) {\n return {\n type: 'Node.js',\n detected: ['Node.js']\n };\n }\n\n return {\n type: ['Node.js', ...detected].join(' / '),\n detected\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { GitInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function resolveGitDirectory(root: string): Promise<string | null> {\n const gitPath = path.join(root, '.git');\n\n try {\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n return gitPath;\n }\n\n if (stat.isFile()) {\n const content = await fs.readFile(gitPath, 'utf8');\n const match = content.match(/^gitdir:\\s*(.+)\\s*$/m);\n if (match) {\n const gitDir = match[1].trim();\n const resolvedGitDir = path.isAbsolute(gitDir)\n ? path.resolve(gitDir)\n : path.resolve(root, gitDir);\n if (!isWithinRoot(root, resolvedGitDir)) {\n return null;\n }\n\n const [realRoot, realGitDir] = await Promise.all([\n fs.realpath(root),\n fs.realpath(resolvedGitDir)\n ]);\n return isWithinRoot(realRoot, realGitDir) ? resolvedGitDir : null;\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nexport async function detectGit(root: string): Promise<GitInfo | null> {\n const gitRoot = await resolveGitDirectory(root);\n if (gitRoot === null) {\n return null;\n }\n\n try {\n const head = await fs.readFile(path.join(gitRoot, 'HEAD'), 'utf8');\n const refMatch = head.match(/^ref:\\s+refs\\/heads\\/(.+)\\s*$/);\n return {\n root: gitRoot,\n branch: refMatch ? refMatch[1] : head.trim().slice(0, 12)\n };\n } catch {\n return {\n root: gitRoot,\n branch: null\n };\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageManager } from '../types.js';\n\nconst lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'bun.lockb', manager: 'bun' },\n { file: 'bun.lock', manager: 'bun' },\n { file: 'package-lock.json', manager: 'npm' }\n];\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectPackageManager(root: string): Promise<PackageManager | null> {\n for (const lockFile of lockFiles) {\n if (await exists(path.join(root, lockFile.file))) {\n return lockFile.manager;\n }\n }\n\n return null;\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function readPackageJson(root: string): Promise<PackageJsonInfo | null> {\n const packageJsonPath = path.join(root, 'package.json');\n\n try {\n const [realRoot, realPackageJsonPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(packageJsonPath)\n ]);\n if (!isWithinRoot(realRoot, realPackageJsonPath)) {\n return null;\n }\n\n const content = await fs.readFile(realPackageJsonPath, 'utf8');\n const data = JSON.parse(content) as PackageJsonInfo['data'];\n return { path: realPackageJsonPath, data };\n } catch {\n return null;\n }\n}\n","import net from 'node:net';\nimport type { FrameworkInfo, PortProbe } from '../types.js';\n\nexport const DEFAULT_PORTS = [3000, 5173];\nexport const MAX_PORT_PROBES = 64;\nexport const PORT_PROBE_CONCURRENCY = 16;\n\nfunction uniquePorts(ports: number[]): number[] {\n return Array.from(\n new Set(ports.filter((port) => Number.isInteger(port) && port > 0 && port < 65536))\n );\n}\n\nexport function inferPortsFromScripts(scripts: Record<string, string>): number[] {\n const ports: number[] = [];\n\n for (const command of Object.values(scripts)) {\n const patterns = [\n /(?:--port|-p)\\s+(\\d{2,5})/g,\n /\\bPORT=(\\d{2,5})\\b/g,\n /localhost:(\\d{2,5})/g,\n /127\\.0\\.0\\.1:(\\d{2,5})/g\n ];\n\n for (const pattern of patterns) {\n for (const match of command.matchAll(pattern)) {\n ports.push(Number(match[1]));\n }\n }\n }\n\n return uniquePorts(ports);\n}\n\nexport function defaultPortsForFramework(framework: FrameworkInfo | null): number[] {\n if (framework === null) {\n return [];\n }\n\n const ports: number[] = [];\n if (framework.detected.includes('Next.js') || framework.detected.includes('Express')) {\n ports.push(3000);\n }\n\n if (framework.detected.includes('Vite')) {\n ports.push(5173);\n }\n\n if (framework.detected.includes('Prisma')) {\n ports.push(5555);\n }\n\n return uniquePorts(ports);\n}\n\nexport async function probePort(port: number): Promise<PortProbe> {\n return await new Promise((resolve) => {\n const server = net.createServer();\n\n server.once('error', () => {\n resolve({ port, inUse: true });\n });\n\n server.once('listening', () => {\n server.close(() => {\n resolve({ port, inUse: false });\n });\n });\n\n server.listen(port, '127.0.0.1');\n });\n}\n\nexport async function detectPorts(ports: number[]): Promise<PortProbe[] | null> {\n const normalized = uniquePorts(ports).slice(0, MAX_PORT_PROBES);\n if (normalized.length === 0) {\n return null;\n }\n\n const results: PortProbe[] = [];\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < normalized.length) {\n const port = normalized[nextIndex];\n nextIndex += 1;\n results.push(await probePort(port));\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(PORT_PROBE_CONCURRENCY, normalized.length) }, () => worker())\n );\n\n return results.sort(\n (left, right) => normalized.indexOf(left.port) - normalized.indexOf(right.port)\n );\n}\n","import type { PackageJsonInfo } from '../types.js';\n\nexport function extractScripts(packageJson: PackageJsonInfo | null): Record<string, string> | null {\n if (\n !packageJson?.data.scripts ||\n typeof packageJson.data.scripts !== 'object' ||\n Array.isArray(packageJson.data.scripts)\n ) {\n return null;\n }\n\n return Object.fromEntries(\n Object.entries(packageJson.data.scripts).filter((entry): entry is [string, string] => {\n const [, command] = entry;\n return typeof command === 'string';\n })\n );\n}\n","const ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n\nconst OSC_SEQUENCE = new RegExp(`${ESC}\\\\][\\\\s\\\\S]*?(?:${BEL}|${ESC}\\\\\\\\)`, 'g');\nconst CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\nconst ESCAPE_SEQUENCE = new RegExp(`${ESC}[@-Z\\\\\\\\-_]`, 'g');\n\nfunction stripControlCharacters(value: string): string {\n let result = '';\n for (const character of value) {\n const code = character.charCodeAt(0);\n if ((code > 31 && code < 127) || code > 159) {\n result += character;\n }\n }\n return result;\n}\n\nexport function safeDisplayText(value: unknown): string {\n return stripControlCharacters(\n String(value).replace(OSC_SEQUENCE, '').replace(CSI_SEQUENCE, '').replace(ESCAPE_SEQUENCE, '')\n );\n}\n\nexport function safeDisplayList(values: string[]): string {\n return values.length > 0 ? values.map((value) => safeDisplayText(value)).join(', ') : 'none';\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { CONFIG_FILE_NAME, defaultConfig } from '../../core/config/defaults.js';\n\nexport async function initCommand(cwd = process.cwd()): Promise<void> {\n const configPath = path.join(cwd, CONFIG_FILE_NAME);\n\n try {\n await fs.access(configPath);\n console.log(pc.yellow(`${CONFIG_FILE_NAME} already exists.`));\n return;\n } catch {\n await fs.writeFile(configPath, `${JSON.stringify(defaultConfig, null, 2)}\\n`, 'utf8');\n console.log(pc.green(`Created ${CONFIG_FILE_NAME}.`));\n }\n}\n","import pc from 'picocolors';\nimport { runPackageScriptToTerminal } from '../../core/process/runner.js';\nimport { scanProject } from '../../core/scanner/index.js';\n\nexport async function runCommand(script: string, cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n\n if (scan.packageJson === null) {\n console.error(pc.red('No package.json was found in this directory.'));\n process.exitCode = 1;\n return;\n }\n\n if (scan.scripts[script] === undefined) {\n console.error(pc.red(`Script \"${script}\" was not found in package.json.`));\n process.exitCode = 1;\n return;\n }\n\n const exitCode = await runPackageScriptToTerminal({\n cwd,\n packageManager: scan.packageManager,\n script\n });\n process.exitCode = exitCode;\n}\n","import spawn from 'cross-spawn';\nimport type { PackageManager } from '../types.js';\nimport { isDangerousCommand } from '../security/dangerousCommand.js';\nimport { resolveExecutableOutsideRoot } from './executable.js';\n\nexport { isDangerousCommand };\n\nexport interface PackageRunCommand {\n command: string;\n args: string[];\n displayCommand: string;\n}\n\nexport function getPackageRunCommand(\n packageManager: PackageManager | null,\n script: string\n): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n const args = ['run', script];\n return {\n command: manager,\n args,\n displayCommand: `${manager} ${args.join(' ')}`\n };\n}\n\nexport async function resolvePackageRunCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<PackageRunCommand | null> {\n const runCommand = getPackageRunCommand(options.packageManager, options.script);\n const executable = await resolveExecutableOutsideRoot(options.cwd, runCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...runCommand,\n command: executable\n };\n}\n\nexport function getPackageInstallCommand(packageManager: PackageManager | null): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n if (manager === 'npm') {\n return {\n command: manager,\n args: ['ci'],\n displayCommand: 'npm ci'\n };\n }\n\n if (manager === 'pnpm') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'pnpm install --frozen-lockfile'\n };\n }\n\n if (manager === 'yarn') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'yarn install --frozen-lockfile'\n };\n }\n\n return {\n command: manager,\n args: ['install'],\n displayCommand: 'bun install'\n };\n}\n\nexport async function resolvePackageInstallCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n}): Promise<PackageRunCommand | null> {\n const installCommand = getPackageInstallCommand(options.packageManager);\n const executable = await resolveExecutableOutsideRoot(options.cwd, installCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...installCommand,\n command: executable\n };\n}\n\nexport function splitCommandLine(command: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n } else if (character === '\\\\' && quote === '\"') {\n const next = command[index + 1];\n if (next === '\"' || next === '\\\\') {\n index += 1;\n current += next ?? '';\n } else {\n current += character;\n }\n } else {\n current += character;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (/\\s/.test(character)) {\n if (current.length > 0) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += character;\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function containsShellMetacharacters(command: string): boolean {\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '\\n' || character === '\\r') {\n return true;\n }\n\n if (';|&<>'.includes(character)) {\n return true;\n }\n\n if (character === '`') {\n return true;\n }\n\n if (character === '$' && (command[index + 1] === '(' || command[index + 1] === '{')) {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function resolveConfiguredCommand(\n cwd: string,\n command: string\n): Promise<PackageRunCommand | null> {\n const trimmed = command.trim();\n if (trimmed.length === 0 || containsShellMetacharacters(trimmed)) {\n return null;\n }\n\n const tokens = splitCommandLine(trimmed);\n if (tokens.length === 0) {\n return null;\n }\n\n const [executableName, ...args] = tokens;\n const executable = await resolveExecutableOutsideRoot(cwd, executableName);\n if (executable === null) {\n return null;\n }\n\n return {\n command: executable,\n args,\n displayCommand: trimmed\n };\n}\n\nexport async function runPackageScriptToTerminal(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<number> {\n const runCommand = await resolvePackageRunCommand(options);\n if (runCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(runCommand.command, runCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n","const DANGEROUS_COMMAND =\n /\\b(rm\\s+-rf|docker\\s+volume\\s+rm|drop\\s+database|prisma\\s+migrate\\s+reset|git\\s+clean\\s+-fdx?)\\b/i;\n\nexport function isDangerousCommand(command: string): boolean {\n return DANGEROUS_COMMAND.test(command);\n}\n","import pc from 'picocolors';\nimport type { ScanResult } from '../../core/types.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nfunction formatList(values: string[]): string {\n return safeTerminalList(values);\n}\n\nexport function printScanResult(scan: ScanResult): void {\n console.log(pc.bold(`Project: ${safeTerminalText(scan.projectName)}`));\n console.log(`Type: ${safeTerminalText(scan.framework?.type ?? 'Unknown')}`);\n console.log(`Manager: ${safeTerminalText(scan.packageManager ?? 'unknown')}`);\n console.log(`Scripts: ${formatList(Object.keys(scan.scripts))}`);\n console.log(`Git: ${safeTerminalText(scan.git?.branch ?? 'not detected')}`);\n console.log(`README: ${scan.readme.exists ? 'found' : 'missing'}`);\n console.log(`LICENSE: ${scan.license.exists ? 'found' : 'missing'}`);\n\n if (scan.env !== null) {\n console.log(`Env: ${scan.env.hasLocal ? '.env found' : '.env missing'}`);\n }\n\n if (scan.ports.length > 0) {\n const ports = scan.ports.map((port) => `${port.port}${port.inUse ? ' in use' : ' free'}`);\n console.log(`Ports: ${ports.join(', ')}`);\n }\n\n if (scan.docker !== null) {\n console.log(\n `Docker: compose found (${formatList(scan.docker.services.map((service) => service.name))})`\n );\n }\n}\n\nexport async function scanCommand(cwd = process.cwd()): Promise<void> {\n printScanResult(await scanProject(cwd));\n}\n","import pc from 'picocolors';\nimport open from 'open';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isHubRunning, registerWorkspaceRemotely, dashboardUrl } from '../hub/client.js';\nimport { printScanResult } from './scan.js';\n\nexport async function startCommand(options: {\n cwd?: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const port = options.port ?? 4567;\n\n console.log(pc.bold(`DevSurface v${DEV_SURFACE_VERSION}`));\n console.log('Scanning project...\\n');\n\n const scan = await scanProject(cwd);\n printScanResult(scan);\n\n const warnings = await runDoctor(cwd, scan);\n if (warnings.length > 0) {\n console.log('\\nWarnings:');\n for (const item of warnings) {\n const marker = item.severity === 'error' ? pc.red('!') : pc.yellow('!');\n console.log(` ${marker} ${item.title}`);\n }\n }\n\n if (await isHubRunning(port)) {\n console.log('\\nHub already running. Registering workspace...');\n const registered = await registerWorkspaceRemotely(cwd, port);\n if (registered) {\n const url = dashboardUrl(registered.id, port);\n console.log(`Workspace ${pc.cyan(registered.name)} attached.`);\n console.log(`Dashboard -> ${pc.cyan(url)}`);\n if (options.openBrowser !== false) {\n await open(url);\n }\n return;\n }\n console.log('Could not register with running hub. Starting a new instance...');\n }\n\n const server = await startHubServer({\n port,\n openBrowser: options.openBrowser,\n initialWorkspace: cwd\n });\n\n console.log(`\\nDashboard running at -> ${pc.cyan(server.url)}`);\n}\n","import process from 'node:process';\nimport {Buffer} from 'node:buffer';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport {isWsl, powerShellPath} from 'wsl-utils';\nimport defineLazyProperty from 'define-lazy-prop';\nimport defaultBrowser from 'default-browser';\nimport isInsideContainer from 'is-inside-container';\n\nconst execFile = promisify(childProcess.execFile);\n\n// Path to included `xdg-open`.\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst localXdgOpenPath = path.join(__dirname, 'xdg-open');\n\nconst {platform, arch} = process;\n\n/**\nGet the default browser name in Windows from WSL.\n\n@returns {Promise<string>} Browser name.\n*/\nasync function getWindowsDefaultBrowserFromWsl() {\n\tconst powershellPath = await powerShellPath();\n\tconst rawCommand = String.raw`(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice\").ProgId`;\n\tconst encodedCommand = Buffer.from(rawCommand, 'utf16le').toString('base64');\n\n\tconst {stdout} = await execFile(\n\t\tpowershellPath,\n\t\t[\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t\tencodedCommand,\n\t\t],\n\t\t{encoding: 'utf8'},\n\t);\n\n\tconst progId = stdout.trim();\n\n\t// Map ProgId to browser IDs\n\tconst browserMap = {\n\t\tChromeHTML: 'com.google.chrome',\n\t\tBraveHTML: 'com.brave.Browser',\n\t\tMSEdgeHTM: 'com.microsoft.edge',\n\t\tFirefoxURL: 'org.mozilla.firefox',\n\t};\n\n\treturn browserMap[progId] ? {id: browserMap[progId]} : {};\n}\n\nconst pTryEach = async (array, mapper) => {\n\tlet latestError;\n\n\tfor (const item of array) {\n\t\ttry {\n\t\t\treturn await mapper(item); // eslint-disable-line no-await-in-loop\n\t\t} catch (error) {\n\t\t\tlatestError = error;\n\t\t}\n\t}\n\n\tthrow latestError;\n};\n\n// eslint-disable-next-line complexity\nconst baseOpen = async options => {\n\toptions = {\n\t\twait: false,\n\t\tbackground: false,\n\t\tnewInstance: false,\n\t\tallowNonzeroExitCode: false,\n\t\t...options,\n\t};\n\n\tif (Array.isArray(options.app)) {\n\t\treturn pTryEach(options.app, singleApp => baseOpen({\n\t\t\t...options,\n\t\t\tapp: singleApp,\n\t\t}));\n\t}\n\n\tlet {name: app, arguments: appArguments = []} = options.app ?? {};\n\tappArguments = [...appArguments];\n\n\tif (Array.isArray(app)) {\n\t\treturn pTryEach(app, appName => baseOpen({\n\t\t\t...options,\n\t\t\tapp: {\n\t\t\t\tname: appName,\n\t\t\t\targuments: appArguments,\n\t\t\t},\n\t\t}));\n\t}\n\n\tif (app === 'browser' || app === 'browserPrivate') {\n\t\t// IDs from default-browser for macOS and windows are the same\n\t\tconst ids = {\n\t\t\t'com.google.chrome': 'chrome',\n\t\t\t'google-chrome.desktop': 'chrome',\n\t\t\t'com.brave.Browser': 'brave',\n\t\t\t'org.mozilla.firefox': 'firefox',\n\t\t\t'firefox.desktop': 'firefox',\n\t\t\t'com.microsoft.msedge': 'edge',\n\t\t\t'com.microsoft.edge': 'edge',\n\t\t\t'com.microsoft.edgemac': 'edge',\n\t\t\t'microsoft-edge.desktop': 'edge',\n\t\t};\n\n\t\t// Incognito flags for each browser in `apps`.\n\t\tconst flags = {\n\t\t\tchrome: '--incognito',\n\t\t\tbrave: '--incognito',\n\t\t\tfirefox: '--private-window',\n\t\t\tedge: '--inPrivate',\n\t\t};\n\n\t\tconst browser = isWsl ? await getWindowsDefaultBrowserFromWsl() : await defaultBrowser();\n\t\tif (browser.id in ids) {\n\t\t\tconst browserName = ids[browser.id];\n\n\t\t\tif (app === 'browserPrivate') {\n\t\t\t\tappArguments.push(flags[browserName]);\n\t\t\t}\n\n\t\t\treturn baseOpen({\n\t\t\t\t...options,\n\t\t\t\tapp: {\n\t\t\t\t\tname: apps[browserName],\n\t\t\t\t\targuments: appArguments,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tthrow new Error(`${browser.name} is not supported as a default browser`);\n\t}\n\n\tlet command;\n\tconst cliArguments = [];\n\tconst childProcessOptions = {};\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\n\t\tif (options.wait) {\n\t\t\tcliArguments.push('--wait-apps');\n\t\t}\n\n\t\tif (options.background) {\n\t\t\tcliArguments.push('--background');\n\t\t}\n\n\t\tif (options.newInstance) {\n\t\t\tcliArguments.push('--new');\n\t\t}\n\n\t\tif (app) {\n\t\t\tcliArguments.push('-a', app);\n\t\t}\n\t} else if (platform === 'win32' || (isWsl && !isInsideContainer() && !app)) {\n\t\tcommand = await powerShellPath();\n\n\t\tcliArguments.push(\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t);\n\n\t\tif (!isWsl) {\n\t\t\tchildProcessOptions.windowsVerbatimArguments = true;\n\t\t}\n\n\t\tconst encodedArguments = ['Start'];\n\n\t\tif (options.wait) {\n\t\t\tencodedArguments.push('-Wait');\n\t\t}\n\n\t\tif (app) {\n\t\t\t// Double quote with double quotes to ensure the inner quotes are passed through.\n\t\t\t// Inner quotes are delimited for PowerShell interpretation with backticks.\n\t\t\tencodedArguments.push(`\"\\`\"${app}\\`\"\"`);\n\t\t\tif (options.target) {\n\t\t\t\tappArguments.push(options.target);\n\t\t\t}\n\t\t} else if (options.target) {\n\t\t\tencodedArguments.push(`\"${options.target}\"`);\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tappArguments = appArguments.map(argument => `\"\\`\"${argument}\\`\"\"`);\n\t\t\tencodedArguments.push('-ArgumentList', appArguments.join(','));\n\t\t}\n\n\t\t// Using Base64-encoded command, accepted by PowerShell, to allow special characters.\n\t\toptions.target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64');\n\t} else {\n\t\tif (app) {\n\t\t\tcommand = app;\n\t\t} else {\n\t\t\t// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.\n\t\t\tconst isBundled = !__dirname || __dirname === '/';\n\n\t\t\t// Check if local `xdg-open` exists and is executable.\n\t\t\tlet exeLocalXdgOpen = false;\n\t\t\ttry {\n\t\t\t\tawait fs.access(localXdgOpenPath, fsConstants.X_OK);\n\t\t\t\texeLocalXdgOpen = true;\n\t\t\t} catch {}\n\n\t\t\tconst useSystemXdgOpen = process.versions.electron\n\t\t\t\t?? (platform === 'android' || isBundled || !exeLocalXdgOpen);\n\t\t\tcommand = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tcliArguments.push(...appArguments);\n\t\t}\n\n\t\tif (!options.wait) {\n\t\t\t// `xdg-open` will block the process unless stdio is ignored\n\t\t\t// and it's detached from the parent even if it's unref'd.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t\tchildProcessOptions.detached = true;\n\t\t}\n\t}\n\n\tif (platform === 'darwin' && appArguments.length > 0) {\n\t\tcliArguments.push('--args', ...appArguments);\n\t}\n\n\t// This has to come after `--args`.\n\tif (options.target) {\n\t\tcliArguments.push(options.target);\n\t}\n\n\tconst subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);\n\n\tif (options.wait) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\tif (!options.allowNonzeroExitCode && exitCode > 0) {\n\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(subprocess);\n\t\t\t});\n\t\t});\n\t}\n\n\tsubprocess.unref();\n\n\treturn subprocess;\n};\n\nconst open = (target, options) => {\n\tif (typeof target !== 'string') {\n\t\tthrow new TypeError('Expected a `target`');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\ttarget,\n\t});\n};\n\nexport const openApp = (name, options) => {\n\tif (typeof name !== 'string' && !Array.isArray(name)) {\n\t\tthrow new TypeError('Expected a valid `name`');\n\t}\n\n\tconst {arguments: appArguments = []} = options ?? {};\n\tif (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {\n\t\tthrow new TypeError('Expected `appArguments` as Array type');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\tapp: {\n\t\t\tname,\n\t\t\targuments: appArguments,\n\t\t},\n\t});\n};\n\nfunction detectArchBinary(binary) {\n\tif (typeof binary === 'string' || Array.isArray(binary)) {\n\t\treturn binary;\n\t}\n\n\tconst {[arch]: archBinary} = binary;\n\n\tif (!archBinary) {\n\t\tthrow new Error(`${arch} is not supported`);\n\t}\n\n\treturn archBinary;\n}\n\nfunction detectPlatformBinary({[platform]: platformBinary}, {wsl}) {\n\tif (wsl && isWsl) {\n\t\treturn detectArchBinary(wsl);\n\t}\n\n\tif (!platformBinary) {\n\t\tthrow new Error(`${platform} is not supported`);\n\t}\n\n\treturn detectArchBinary(platformBinary);\n}\n\nexport const apps = {};\n\ndefineLazyProperty(apps, 'chrome', () => detectPlatformBinary({\n\tdarwin: 'google chrome',\n\twin32: 'chrome',\n\tlinux: ['google-chrome', 'google-chrome-stable', 'chromium'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',\n\t\tx64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'brave', () => detectPlatformBinary({\n\tdarwin: 'brave browser',\n\twin32: 'brave',\n\tlinux: ['brave-browser', 'brave'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe',\n\t\tx64: ['/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe', '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'firefox', () => detectPlatformBinary({\n\tdarwin: 'firefox',\n\twin32: String.raw`C:\\Program Files\\Mozilla Firefox\\firefox.exe`,\n\tlinux: 'firefox',\n}, {\n\twsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe',\n}));\n\ndefineLazyProperty(apps, 'edge', () => detectPlatformBinary({\n\tdarwin: 'microsoft edge',\n\twin32: 'msedge',\n\tlinux: ['microsoft-edge', 'microsoft-edge-dev'],\n}, {\n\twsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',\n}));\n\ndefineLazyProperty(apps, 'browser', () => 'browser');\n\ndefineLazyProperty(apps, 'browserPrivate', () => 'browserPrivate');\n\nexport default open;\n","import process from 'node:process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport isWsl from 'is-wsl';\n\nexport const wslDrivesMountPoint = (() => {\n\t// Default value for \"root\" param\n\t// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config\n\tconst defaultMountPoint = '/mnt/';\n\n\tlet mountPoint;\n\n\treturn async function () {\n\t\tif (mountPoint) {\n\t\t\t// Return memoized mount point value\n\t\t\treturn mountPoint;\n\t\t}\n\n\t\tconst configFilePath = '/etc/wsl.conf';\n\n\t\tlet isConfigFileExists = false;\n\t\ttry {\n\t\t\tawait fs.access(configFilePath, fsConstants.F_OK);\n\t\t\tisConfigFileExists = true;\n\t\t} catch {}\n\n\t\tif (!isConfigFileExists) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tconst configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});\n\t\tconst configMountPoint = /(?<!#.*)root\\s*=\\s*(?<mountPoint>.*)/g.exec(configContent);\n\n\t\tif (!configMountPoint) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tmountPoint = configMountPoint.groups.mountPoint.trim();\n\t\tmountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;\n\n\t\treturn mountPoint;\n\t};\n})();\n\nexport const powerShellPathFromWsl = async () => {\n\tconst mountPoint = await wslDrivesMountPoint();\n\treturn `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;\n};\n\nexport const powerShellPath = async () => {\n\tif (isWsl) {\n\t\treturn powerShellPathFromWsl();\n\t}\n\n\treturn `${process.env.SYSTEMROOT || process.env.windir || String.raw`C:\\Windows`}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n};\n\nexport {default as isWsl} from 'is-wsl';\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport isInsideContainer from 'is-inside-container';\n\nconst isWsl = () => {\n\tif (process.platform !== 'linux') {\n\t\treturn false;\n\t}\n\n\tif (os.release().toLowerCase().includes('microsoft')) {\n\t\tif (isInsideContainer()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tif (fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')) {\n\t\t\treturn !isInsideContainer();\n\t\t}\n\t} catch {}\n\n\t// Fallback for custom kernels: check WSL-specific paths.\n\tif (\n\t\tfs.existsSync('/proc/sys/fs/binfmt_misc/WSLInterop')\n\t\t|| fs.existsSync('/run/WSL')\n\t) {\n\t\treturn !isInsideContainer();\n\t}\n\n\treturn false;\n};\n\nexport default process.env.__IS_WSL_TEST__ ? isWsl : isWsl();\n","import fs from 'node:fs';\nimport isDocker from 'is-docker';\n\nlet cachedResult;\n\n// Podman detection\nconst hasContainerEnv = () => {\n\ttry {\n\t\tfs.statSync('/run/.containerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default function isInsideContainer() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (cachedResult === undefined) {\n\t\tcachedResult = hasContainerEnv() || isDocker();\n\t}\n\n\treturn cachedResult;\n}\n","import fs from 'node:fs';\n\nlet isDockerCached;\n\nfunction hasDockerEnv() {\n\ttry {\n\t\tfs.statSync('/.dockerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasDockerCGroup() {\n\ttry {\n\t\treturn fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function isDocker() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (isDockerCached === undefined) {\n\t\tisDockerCached = hasDockerEnv() || hasDockerCGroup();\n\t}\n\n\treturn isDockerCached;\n}\n","export default function defineLazyProperty(object, propertyName, valueGetter) {\n\tconst define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});\n\n\tObject.defineProperty(object, propertyName, {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget() {\n\t\t\tconst result = valueGetter();\n\t\t\tdefine(result);\n\t\t\treturn result;\n\t\t},\n\t\tset(value) {\n\t\t\tdefine(value);\n\t\t}\n\t});\n\n\treturn object;\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\nimport defaultBrowserId from 'default-browser-id';\nimport bundleName from 'bundle-name';\nimport windows from './windows.js';\n\nexport {_windowsBrowserProgIdMap} from './windows.js';\n\nconst execFileAsync = promisify(execFile);\n\n// Inlined: https://github.com/sindresorhus/titleize/blob/main/index.js\nconst titleize = string => string.toLowerCase().replaceAll(/(?:^|\\s|-)\\S/g, x => x.toUpperCase());\n\nexport default async function defaultBrowser() {\n\tif (process.platform === 'darwin') {\n\t\tconst id = await defaultBrowserId();\n\t\tconst name = await bundleName(id);\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'linux') {\n\t\tconst {stdout} = await execFileAsync('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n\t\tconst id = stdout.trim();\n\t\tconst name = titleize(id.replace(/.desktop$/, '').replace('-', ' '));\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows();\n\t}\n\n\tthrow new Error('Only macOS, Linux, and Windows are supported');\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport default async function defaultBrowserId() {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst {stdout} = await execFileAsync('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure', 'LSHandlers']);\n\n\t// `(?!-)` is to prevent matching `LSHandlerRoleAll = \"-\";`.\n\tconst match = /LSHandlerRoleAll = \"(?!-)(?<id>[^\"]+?)\";\\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);\n\n\tconst browserId = match?.groups.id ?? 'com.apple.Safari';\n\n\t// Correct the case for Safari's bundle identifier\n\tif (browserId === 'com.apple.safari') {\n\t\treturn 'com.apple.Safari';\n\t}\n\n\treturn browserId;\n}\n","import process from 'node:process';\nimport {promisify} from 'node:util';\nimport {execFile, execFileSync} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runAppleScript(script, {humanReadableOutput = true, signal} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst execOptions = {};\n\tif (signal) {\n\t\texecOptions.signal = signal;\n\t}\n\n\tconst {stdout} = await execFileAsync('osascript', ['-e', script, outputArguments], execOptions);\n\treturn stdout.trim();\n}\n\nexport function runAppleScriptSync(script, {humanReadableOutput = true} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst stdout = execFileSync('osascript', ['-e', script, ...outputArguments], {\n\t\tencoding: 'utf8',\n\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\ttimeout: 500,\n\t});\n\n\treturn stdout.trim();\n}\n","import {runAppleScript} from 'run-applescript';\n\nexport default async function bundleName(bundleId) {\n\treturn runAppleScript(`tell application \"Finder\" to set app_path to application file id \"${bundleId}\" as string\\ntell application \"System Events\" to get value of property list item \"CFBundleName\" of property list file (app_path & \":Contents:Info.plist\")`);\n}\n","import {promisify} from 'node:util';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\n// TODO: Fix the casing of bundle identifiers in the next major version.\n\n// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake\n// ones that look real and match the macOS/Linux versions for cross-platform apps.\nconst windowsBrowserProgIds = {\n\tMSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct.\n\tMSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'},\n\tMSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'},\n\tAppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},\n\tChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},\n\tChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'},\n\tChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'},\n\tChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'},\n\tBraveHTML: {name: 'Brave', id: 'com.brave.Browser'},\n\tBraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},\n\tBraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'},\n\tBraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},\n\tFirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},\n\tOperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'},\n\tVivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'},\n\t'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},\n};\n\nexport const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));\n\nexport class UnknownBrowserError extends Error {}\n\nexport default async function defaultBrowser(_execFileAsync = execFileAsync) {\n\tconst {stdout} = await _execFileAsync('reg', [\n\t\t'QUERY',\n\t\t' HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n\t\t'/v',\n\t\t'ProgId',\n\t]);\n\n\tconst match = /ProgId\\s*REG_SZ\\s*(?<id>\\S+)/.exec(stdout);\n\tif (!match) {\n\t\tthrow new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);\n\t}\n\n\tconst {id} = match.groups;\n\n\t// Windows can append a hash suffix to ProgIds using a dot or hyphen\n\t// (e.g., `ChromeHTML.ABC123`, `FirefoxURL-6F193CCC56814779`).\n\t// Try exact match first, then try without the suffix.\n\tconst dotIndex = id.lastIndexOf('.');\n\tconst hyphenIndex = id.lastIndexOf('-');\n\tconst baseIdByDot = dotIndex === -1 ? undefined : id.slice(0, dotIndex);\n\tconst baseIdByHyphen = hyphenIndex === -1 ? undefined : id.slice(0, hyphenIndex);\n\n\treturn windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? {name: id, id};\n}\n","import { promises as fs } from 'node:fs';\nimport type { Server } from 'node:http';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createAdaptorServer } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { Hono } from 'hono';\nimport open from 'open';\nimport type { DockerController } from '../core/docker/compose.js';\nimport { ProcessManager } from '../core/process/manager.js';\nimport { Hub } from '../core/hub/runtime.js';\nimport { registerApiRoutes, registerHubApiRoutes } from './routes/api.js';\nimport { setupWebSocket, setupHubWebSocket } from './routes/ws.js';\nimport { createMutationToken } from './mutationToken.js';\nimport { initializeListenHost, DEFAULT_PORT } from './listenConfig.js';\n\nexport { DEFAULT_HOST, DEFAULT_PORT, resolveHost } from './listenConfig.js';\n\nexport interface DevSurfaceServer {\n url: string;\n port: number;\n host: string;\n hub: Hub;\n close: () => Promise<void>;\n processManager: ProcessManager;\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function findWebDistDir(): Promise<string | null> {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(moduleDir, '..', 'web', 'dist'),\n path.join(moduleDir, '..', '..', 'src', 'web', 'dist'),\n path.join(moduleDir, 'web', 'dist')\n ];\n\n for (const candidate of candidates) {\n if (await fileExists(path.join(candidate, 'index.html'))) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction toListenError(error: unknown, host: string, port: number): Error {\n const code = error instanceof Error ? (error as NodeJS.ErrnoException).code : undefined;\n\n if (code === 'EADDRINUSE') {\n return new Error(\n `Port ${port} is already in use on ${host}. Stop the other process or run DevSurface with --port ${port + 1}.`,\n { cause: error }\n );\n }\n\n if (code === 'EACCES') {\n return new Error(`DevSurface does not have permission to bind to ${host}:${port}.`, {\n cause: error\n });\n }\n\n return error instanceof Error ? error : new Error(String(error));\n}\n\nasync function listenOnHost(\n server: Server,\n wss: ReturnType<typeof setupWebSocket>,\n host: string,\n port: number\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n server.off('error', onError);\n server.off('listening', onListening);\n wss.off('error', onError);\n };\n\n const onError = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(toListenError(error, host, port));\n };\n\n const onListening = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve();\n };\n\n wss.once('error', onError);\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(port, host);\n });\n}\n\nasync function closeWebSocketServer(wss: ReturnType<typeof setupWebSocket>): Promise<void> {\n await new Promise<void>((resolve) => {\n wss.close(() => resolve());\n });\n}\n\nasync function closeHttpServer(server: Server): Promise<void> {\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\nasync function mountWebUi(app: Hono): Promise<void> {\n const webDistDir = await findWebDistDir();\n if (webDistDir !== null) {\n app.use('/assets/*', serveStatic({ root: webDistDir }));\n app.get('/favicon.svg', serveStatic({ root: webDistDir }));\n app.get('*', async (context) => {\n const html = await fs.readFile(path.join(webDistDir, 'index.html'), 'utf8');\n return context.html(html);\n });\n } else {\n app.get('*', (context) =>\n context.html(\n '<!doctype html><title>DevSurface</title><main><h1>DevSurface</h1><p>Run npm run build:web to build the dashboard.</p></main>',\n 503\n )\n );\n }\n}\n\n// Legacy single-project createApp (backward compat with existing tests)\nexport async function createApp(options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken?: string;\n}): Promise<Hono> {\n const app = new Hono();\n registerApiRoutes(app, {\n ...options,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\n// Hub-mode createApp\nexport async function createHubApp(options: { hub: Hub; mutationToken?: string }): Promise<Hono> {\n const app = new Hono();\n registerHubApiRoutes(app, {\n hub: options.hub,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\nexport async function startHubServer(options: {\n port?: number;\n openBrowser?: boolean;\n dataDir?: string;\n initialWorkspace?: string;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub({ dataDir: options.dataDir });\n hub.attachCleanupHandlers();\n\n if (options.initialWorkspace) {\n await hub.registry.add(options.initialWorkspace);\n }\n\n const mutationToken = createMutationToken();\n const app = await createHubApp({ hub, mutationToken });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupHubWebSocket(server, hub);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n const entries = await hub.registry.list();\n const deepLink = entries.length > 0 ? `${url}/?workspace=${entries[0].id}` : url;\n await open(deepLink);\n }\n\n const dummyProcessManager = new ProcessManager();\n\n return {\n url,\n port,\n host,\n hub,\n processManager: dummyProcessManager,\n close: async () => {\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n\n// Legacy single-project server (used by old tests)\nexport async function startDevSurfaceServer(options: {\n projectRoot: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub();\n hub.attachCleanupHandlers();\n\n await hub.registry.add(options.projectRoot);\n const processManager = new ProcessManager();\n processManager.attachCleanupHandlers();\n\n const app = await createApp({\n projectRoot: options.projectRoot,\n processManager\n });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupWebSocket(server, processManager);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n await open(url);\n }\n\n return {\n url,\n port,\n host,\n hub,\n processManager,\n close: async () => {\n processManager.killAll();\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n","import { EventEmitter } from 'node:events';\nimport type { ChildProcess } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../types.js';\n\nexport const LOG_MESSAGE_LIMIT = 16_384;\nconst LOG_ENTRY_LIMIT = 1000;\n\ninterface ProcessRecord extends ManagedProcessSnapshot {\n child: ChildProcess;\n}\n\nfunction killChildProcessTree(child: ChildProcess): void {\n if (child.pid === undefined) {\n child.kill();\n return;\n }\n\n if (process.platform === 'win32') {\n const result = spawn.sync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true\n });\n if (result.error) {\n child.kill();\n }\n return;\n }\n\n child.kill();\n}\n\nexport class ProcessManager extends EventEmitter {\n private readonly processes = new Map<string, ProcessRecord>();\n private readonly logs: ProcessLogEvent[] = [];\n private cleanupInstalled = false;\n\n start(options: {\n cwd: string;\n script: string;\n command: string;\n args: string[];\n displayCommand: string;\n }): ManagedProcessSnapshot {\n const child = spawn(options.command, options.args, {\n cwd: options.cwd,\n shell: false,\n windowsHide: true\n });\n\n const pid = String(child.pid ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`);\n const record: ProcessRecord = {\n child,\n pid,\n script: options.script,\n command: options.displayCommand,\n status: 'running',\n startedAt: new Date().toISOString(),\n endedAt: null,\n exitCode: null\n };\n\n this.processes.set(pid, record);\n this.emitSystem(record, `Started ${options.displayCommand}`);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stdout', chunk.toString());\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stderr', chunk.toString());\n });\n\n child.on('error', (error) => {\n record.status = 'failed';\n record.endedAt = new Date().toISOString();\n this.emitLog(record, 'system', error.message);\n this.emit('process', this.snapshot(record));\n });\n\n child.on('close', (code) => {\n if (record.status === 'stopped') {\n record.exitCode = code;\n } else {\n record.status = code === 0 ? 'exited' : 'failed';\n record.exitCode = code;\n }\n record.endedAt = new Date().toISOString();\n this.emitSystem(record, `Exited with code ${code ?? 'unknown'}`);\n this.emit('process', this.snapshot(record));\n });\n\n this.emit('process', this.snapshot(record));\n return this.snapshot(record);\n }\n\n stop(pid: string): boolean {\n const record = this.processes.get(pid);\n if (!record || record.status !== 'running') {\n return false;\n }\n\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n this.emitSystem(record, 'Stopped by DevSurface');\n this.emit('process', this.snapshot(record));\n return true;\n }\n\n list(): ManagedProcessSnapshot[] {\n return Array.from(this.processes.values()).map((record) => this.snapshot(record));\n }\n\n listLogs(): ProcessLogEvent[] {\n return [...this.logs];\n }\n\n killAll(): void {\n for (const record of this.processes.values()) {\n if (record.status === 'running') {\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n }\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n\n this.cleanupInstalled = true;\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n\n private emitLog(record: ProcessRecord, stream: ProcessLogEvent['stream'], message: string): void {\n const boundedMessage =\n message.length <= LOG_MESSAGE_LIMIT ? message : message.slice(-LOG_MESSAGE_LIMIT);\n const event: ProcessLogEvent = {\n pid: record.pid,\n script: record.script,\n stream,\n message: boundedMessage,\n timestamp: new Date().toISOString()\n };\n\n this.logs.push(event);\n if (this.logs.length > LOG_ENTRY_LIMIT) {\n this.logs.splice(0, this.logs.length - LOG_ENTRY_LIMIT);\n }\n\n this.emit('log', event);\n }\n\n private emitSystem(record: ProcessRecord, message: string): void {\n this.emitLog(record, 'system', message);\n }\n\n private snapshot(record: ProcessRecord): ManagedProcessSnapshot {\n return {\n pid: record.pid,\n script: record.script,\n command: record.command,\n status: record.status,\n startedAt: record.startedAt,\n endedAt: record.endedAt,\n exitCode: record.exitCode\n };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { assertWithinWorkspaceRoots } from './workspaceRoots.js';\n\nexport interface WorkspaceEntry {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n}\n\nfunction workspaceId(realPath: string): string {\n const base =\n path\n .basename(realPath)\n .replace(/[^a-zA-Z0-9_-]/g, '_')\n .slice(0, 32) || 'workspace';\n const hash = createHash('sha256').update(realPath).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\nfunction defaultDataDir(): string {\n return process.env.DEVSURFACE_DATA_DIR ?? path.join(os.homedir(), '.devsurface');\n}\n\nasync function readPackageName(dirPath: string): Promise<string | null> {\n try {\n const raw = JSON.parse(await fs.readFile(path.join(dirPath, 'package.json'), 'utf8'));\n return typeof raw?.name === 'string' && raw.name.length > 0 ? raw.name : null;\n } catch {\n return null;\n }\n}\n\nexport class WorkspaceRegistry {\n private readonly filePath: string;\n private seeded = false;\n\n constructor(dataDir?: string) {\n const dir = dataDir ?? defaultDataDir();\n this.filePath = path.join(dir, 'workspaces.json');\n }\n\n async list(): Promise<WorkspaceEntry[]> {\n await this.seedFromEnv();\n return await this.read();\n }\n\n async add(dirPath: string): Promise<WorkspaceEntry> {\n const realDir = await this.resolveDir(dirPath);\n await assertWithinWorkspaceRoots(realDir);\n const entries = await this.read();\n\n const existing = entries.find((entry) => entry.path === realDir);\n if (existing) {\n return existing;\n }\n\n const name = (await readPackageName(realDir)) ?? path.basename(realDir);\n const entry: WorkspaceEntry = {\n id: workspaceId(realDir),\n name,\n path: realDir,\n addedAt: new Date().toISOString()\n };\n entries.push(entry);\n await this.write(entries);\n return entry;\n }\n\n async remove(id: string): Promise<boolean> {\n const entries = await this.read();\n const filtered = entries.filter((entry) => entry.id !== id);\n if (filtered.length === entries.length) {\n return false;\n }\n await this.write(filtered);\n return true;\n }\n\n async findByPath(dirPath: string): Promise<WorkspaceEntry | null> {\n try {\n const realDir = await fs.realpath(path.resolve(dirPath));\n const entries = await this.read();\n return entries.find((entry) => entry.path === realDir) ?? null;\n } catch {\n return null;\n }\n }\n\n async resolve(id: string): Promise<WorkspaceEntry | null> {\n const entries = await this.read();\n const entry = entries.find((item) => item.id === id);\n if (!entry) {\n return null;\n }\n\n try {\n const realDir = await this.resolveDir(entry.path);\n await assertWithinWorkspaceRoots(realDir);\n if (realDir !== entry.path) {\n const updated: WorkspaceEntry = { ...entry, path: realDir };\n await this.write(entries.map((item) => (item.id === id ? updated : item)));\n return updated;\n }\n return entry;\n } catch {\n await this.remove(id);\n return null;\n }\n }\n\n private async resolveDir(dirPath: string): Promise<string> {\n const resolved = path.resolve(dirPath);\n const realDir = await fs.realpath(resolved);\n const stat = await fs.stat(realDir);\n if (!stat.isDirectory()) {\n throw new Error(`${dirPath} is not a directory.`);\n }\n return realDir;\n }\n\n private async read(): Promise<WorkspaceEntry[]> {\n try {\n const content = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async write(entries: WorkspaceEntry[]): Promise<void> {\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await fs.writeFile(this.filePath, JSON.stringify(entries, null, 2) + '\\n', 'utf8');\n }\n\n private async seedFromEnv(): Promise<void> {\n if (this.seeded) {\n return;\n }\n this.seeded = true;\n\n const seedValue = process.env.DEVSURFACE_WORKSPACES;\n if (!seedValue) {\n return;\n }\n\n const paths = seedValue\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n for (const p of paths) {\n try {\n await this.add(p);\n } catch {\n // Skip invalid seed paths.\n }\n }\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function configuredWorkspaceRoots(): Promise<string[]> {\n const raw = process.env.DEVSURFACE_WORKSPACE_ROOTS;\n if (!raw) {\n return [];\n }\n\n const roots: string[] = [];\n for (const entry of raw.split(',')) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n try {\n roots.push(await fs.realpath(path.resolve(trimmed)));\n } catch {\n // Skip invalid roots.\n }\n }\n\n return roots;\n}\n\nexport async function assertWithinWorkspaceRoots(targetPath: string): Promise<void> {\n const roots = await configuredWorkspaceRoots();\n if (roots.length === 0) {\n return;\n }\n\n for (const root of roots) {\n if (isWithinRoot(root, targetPath)) {\n return;\n }\n }\n\n throw new Error('Path must be inside a configured workspace root.');\n}\n","import { ProcessManager } from '../process/manager.js';\nimport { DockerComposeController, type DockerController } from '../docker/compose.js';\nimport { WorkspaceRegistry, type WorkspaceEntry } from './registry.js';\n\nexport interface WorkspaceRuntime {\n readonly id: string;\n readonly root: string;\n readonly processManager: ProcessManager;\n readonly dockerController: DockerController;\n}\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n runningProcesses: number;\n}\n\nexport class Hub {\n readonly registry: WorkspaceRegistry;\n private readonly runtimes = new Map<string, WorkspaceRuntime>();\n private cleanupInstalled = false;\n\n constructor(options?: { dataDir?: string }) {\n this.registry = new WorkspaceRegistry(options?.dataDir);\n }\n\n get(id: string): WorkspaceRuntime | null {\n return this.runtimes.get(id) ?? null;\n }\n\n ensure(entry: WorkspaceEntry): WorkspaceRuntime {\n const existing = this.runtimes.get(entry.id);\n if (existing) {\n return existing;\n }\n\n const runtime: WorkspaceRuntime = {\n id: entry.id,\n root: entry.path,\n processManager: new ProcessManager(),\n dockerController: new DockerComposeController(entry.path)\n };\n this.runtimes.set(entry.id, runtime);\n return runtime;\n }\n\n async listSummaries(): Promise<WorkspaceSummary[]> {\n const entries = await this.registry.list();\n return entries.map((entry) => {\n const runtime = this.runtimes.get(entry.id);\n const running = runtime\n ? runtime.processManager.list().filter((p) => p.status === 'running').length\n : 0;\n return {\n id: entry.id,\n name: entry.name,\n path: entry.path,\n addedAt: entry.addedAt,\n runningProcesses: running\n };\n });\n }\n\n killAll(): void {\n for (const runtime of this.runtimes.values()) {\n runtime.processManager.killAll();\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n this.cleanupInstalled = true;\n\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n}\n","import { constants, existsSync } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport type { Hono } from 'hono';\nimport open from 'open';\nimport {\n DockerComposeController,\n DockerOperationError,\n type DockerController\n} from '../../core/docker/compose.js';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport {\n isDangerousCommand,\n resolveConfiguredCommand,\n resolvePackageInstallCommand,\n resolvePackageRunCommand\n} from '../../core/process/runner.js';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isAllowedLocalOrigin, isSameOrigin } from '../localAccess.js';\nimport { createApiAccessMiddleware } from '../accessControl.js';\nimport { hasValidMutationToken } from '../mutationToken.js';\nimport { isAllowedTerminalCommand } from '../terminal.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isAllowedMutationOrigin(requestUrl: string, origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n return isAllowedLocalOrigin(origin) && isSameOrigin(requestUrl, origin);\n}\n\nfunction registerMutationGuard(app: Hono, mutationToken: string): void {\n app.use('/api/*', createApiAccessMiddleware());\n app.use('/api/*', async (context, next) => {\n if (context.req.method === 'GET' || context.req.method === 'HEAD') {\n await next();\n return;\n }\n\n const origin = context.req.header('origin') ?? null;\n const secFetchSite = context.req.header('sec-fetch-site') ?? null;\n const intent = context.req.header('x-devsurface-intent') ?? null;\n const token = context.req.header('x-devsurface-token') ?? null;\n if (\n !hasMutationIntent(intent) ||\n !hasValidMutationToken(token, mutationToken) ||\n isCrossSiteFetch(secFetchSite) ||\n !isAllowedMutationOrigin(context.req.url, origin)\n ) {\n return context.json({ error: 'Cross-origin mutation rejected.' }, 403);\n }\n\n await next();\n });\n}\n\nfunction isCrossSiteFetch(secFetchSite: string | null): boolean {\n return secFetchSite === 'cross-site';\n}\n\nfunction hasMutationIntent(intent: string | null): boolean {\n return intent === 'dashboard';\n}\n\nasync function realPathWithinRoot(root: string, target: string): Promise<boolean> {\n if (!isWithinRoot(root, target)) {\n return false;\n }\n try {\n const [realRoot, realTarget] = await Promise.all([fs.realpath(root), fs.realpath(target)]);\n return isWithinRoot(realRoot, realTarget);\n } catch {\n return false;\n }\n}\n\nasync function writableDestinationWithinRoot(root: string, destination: string): Promise<boolean> {\n if (!isWithinRoot(root, destination)) {\n return false;\n }\n try {\n const [realRoot, realParent] = await Promise.all([\n fs.realpath(root),\n fs.realpath(path.dirname(destination))\n ]);\n return isWithinRoot(realRoot, realParent);\n } catch {\n return false;\n }\n}\n\nasync function copyFileExclusive(\n source: string,\n destination: string\n): Promise<'copied' | 'exists'> {\n const content = await fs.readFile(source);\n let handle: fs.FileHandle | null = null;\n try {\n handle = await fs.open(\n destination,\n constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY,\n 0o600\n );\n await handle.writeFile(content);\n return 'copied';\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'EEXIST') {\n return 'exists';\n }\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nfunction quotePowerShellString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction quotePosixString(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction resolveCommandPromptExecutable(): string {\n return process.env.ComSpec ?? 'cmd.exe';\n}\n\nfunction findExecutable(command: string): string | null {\n if (path.isAbsolute(command)) {\n return existsSync(command) ? command : null;\n }\n const pathValue = process.env.PATH ?? '';\n for (const directory of pathValue.split(path.delimiter)) {\n if (directory.length === 0) {\n continue;\n }\n const candidate = path.join(directory, command);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction launchDetached(command: string, args: string[], root: string): boolean {\n const child = spawn(command, args, {\n cwd: root,\n detached: true,\n stdio: 'ignore',\n windowsHide: process.platform === 'win32'\n });\n child.on('error', () => undefined);\n child.unref();\n return true;\n}\n\nfunction openTerminalAt(root: string): boolean {\n if (process.platform === 'win32') {\n return launchDetached(\n resolveCommandPromptExecutable(),\n [\n '/d',\n '/c',\n 'start',\n '\"\"',\n '/D',\n root,\n 'powershell.exe',\n '-NoExit',\n '-NoLogo',\n '-Command',\n `Set-Location -LiteralPath ${quotePowerShellString(root)}`\n ],\n root\n );\n }\n\n if (process.platform === 'darwin') {\n return launchDetached('open', ['-a', 'Terminal', root], root);\n }\n\n const configuredTerminal = process.env.TERMINAL?.trim();\n if (\n configuredTerminal !== undefined &&\n configuredTerminal.length > 0 &&\n isAllowedTerminalCommand(configuredTerminal) &&\n findExecutable(configuredTerminal) !== null\n ) {\n return launchDetached(configuredTerminal, [], root);\n }\n\n const linuxTerminals: Array<{ command: string; args: string[] }> = [\n { command: 'x-terminal-emulator', args: [] },\n { command: 'gnome-terminal', args: ['--working-directory', root] },\n { command: 'konsole', args: ['--workdir', root] },\n { command: 'xfce4-terminal', args: ['--working-directory', root] },\n {\n command: 'xterm',\n args: [\n '-e',\n 'sh',\n '-lc',\n `cd ${quotePosixString(root)} && exec ${quotePosixString(process.env.SHELL ?? 'sh')}`\n ]\n }\n ];\n\n const terminal = linuxTerminals.find((candidate) => findExecutable(candidate.command) !== null);\n if (terminal === undefined) {\n return false;\n }\n\n return launchDetached(terminal.command, terminal.args, root);\n}\n\nfunction handleDockerError(\n error: unknown,\n context: { json: (data: unknown, status: number) => Response }\n): Response {\n if (error instanceof DockerOperationError) {\n if (error.code === 'compose-not-found' || error.code === 'service-not-found') {\n return context.json({ error: error.message, code: error.code }, 404);\n }\n if (error.code === 'docker-not-installed' || error.code === 'docker-not-running') {\n return context.json({ error: error.message, code: error.code }, 503);\n }\n return context.json({ error: error.message, code: error.code }, 502);\n }\n throw error;\n}\n\nfunction registerWorkspaceRoutes(\n app: Hono,\n resolveWorkspace: (id: string) => Promise<{\n root: string;\n processManager: ProcessManager;\n dockerController: DockerController;\n } | null>\n): void {\n app.get('/api/workspaces/:id/project', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await scanProject(ws.root));\n });\n\n app.get('/api/workspaces/:id/health', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await runDoctor(ws.root));\n });\n\n app.get('/api/workspaces/:id/processes', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.list());\n });\n\n app.get('/api/workspaces/:id/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.listLogs());\n });\n\n app.get('/api/workspaces/:id/docker/:service/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/start', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/stop', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/run/:script', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(ws.root);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: ws.root,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/workspaces/:id/install', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const command = await resolvePackageInstallCommand({\n cwd: ws.root,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/workspaces/:id/commands/:name', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(ws.root);\n const configuredCommand = scan.config?.config.commands?.[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(ws.root, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/workspaces/:id/open/folder', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n await open(ws.root);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/workspaces/:id/open/package', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const packagePath = path.join(ws.root, 'package.json');\n if (!(await realPathWithinRoot(ws.root, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/workspaces/:id/open/terminal', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const opened = openTerminalAt(ws.root);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/workspaces/:id/env/copy', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination = localPath ?? path.join(ws.root, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(ws.root, examplePath)) ||\n !(await writableDestinationWithinRoot(ws.root, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.delete('/api/workspaces/:id/run/:pid', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = ws.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n\nexport function registerHubApiRoutes(\n app: Hono,\n options: {\n hub: Hub;\n mutationToken: string;\n }\n): void {\n const { hub } = options;\n registerMutationGuard(app, options.mutationToken);\n\n async function resolveWorkspace(id: string) {\n const entry = await hub.registry.resolve(id);\n if (!entry) return null;\n const runtime = hub.ensure(entry);\n return {\n root: runtime.root,\n processManager: runtime.processManager,\n dockerController: runtime.dockerController\n };\n }\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/workspaces', async (context) => {\n return context.json(await hub.listSummaries());\n });\n\n app.post('/api/workspaces', async (context) => {\n const body = await context.req.json<{ path: string }>().catch(() => null);\n if (!body?.path) {\n return context.json({ error: 'path is required.' }, 400);\n }\n try {\n const entry = await hub.registry.add(body.path);\n return context.json(entry, 201);\n } catch (error) {\n return context.json({ error: error instanceof Error ? error.message : 'Invalid path.' }, 400);\n }\n });\n\n app.delete('/api/workspaces/:id', async (context) => {\n const id = context.req.param('id');\n const runtime = hub.get(id);\n if (runtime) {\n runtime.processManager.killAll();\n }\n const removed = await hub.registry.remove(id);\n return context.json({ removed }, removed ? 200 : 404);\n });\n\n registerWorkspaceRoutes(app, resolveWorkspace);\n\n // Backward-compatible single-project aliases: proxy to the first workspace\n app.get('/api/project', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await scanProject(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/health', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await runDoctor(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/processes', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.list());\n });\n\n app.get('/api/logs', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.listLogs());\n });\n}\n\n// Legacy single-project API for backward compatibility with tests\nexport function registerApiRoutes(\n app: Hono,\n options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken: string;\n }\n): void {\n const dockerController =\n options.dockerController ?? new DockerComposeController(options.projectRoot);\n registerMutationGuard(app, options.mutationToken);\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/project', async (context) => {\n return context.json(await scanProject(options.projectRoot));\n });\n\n app.get('/api/health', async (context) => {\n return context.json(await runDoctor(options.projectRoot));\n });\n\n app.get('/api/processes', (context) => {\n return context.json(options.processManager.list());\n });\n\n app.get('/api/logs', (context) => {\n return context.json(options.processManager.listLogs());\n });\n\n app.get('/api/docker/:service/logs', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/start', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/stop', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/run/:script', async (context) => {\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(options.projectRoot);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/install', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const command = await resolvePackageInstallCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/commands/:name', async (context) => {\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(options.projectRoot);\n const configuredCommand = scan.config?.config.commands?.[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(options.projectRoot, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/open/folder', async (context) => {\n await open(options.projectRoot);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/open/package', async (context) => {\n const packagePath = path.join(options.projectRoot, 'package.json');\n if (!(await realPathWithinRoot(options.projectRoot, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/open/terminal', (context) => {\n const opened = openTerminalAt(options.projectRoot);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/env/copy', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination =\n localPath ?? path.join(options.projectRoot, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(options.projectRoot, examplePath)) ||\n !(await writableDestinationWithinRoot(options.projectRoot, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.delete('/api/run/:pid', (context) => {\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = options.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n","export const DEV_SURFACE_VERSION = '0.4.0';\n","const LOCAL_HOSTNAMES = new Set(['127.0.0.1', 'localhost', '::1']);\n\nfunction hostnameFromHostHeader(host: string): string | null {\n const trimmed = host.trim().toLowerCase();\n if (trimmed.length === 0) {\n return null;\n }\n\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n return end > 0 ? trimmed.slice(1, end) : null;\n }\n\n return trimmed.split(':')[0] ?? null;\n}\n\nexport function isAllowedLocalHostHeader(host: string | null | undefined): boolean {\n if (typeof host !== 'string') {\n return false;\n }\n\n const hostname = hostnameFromHostHeader(host);\n return hostname !== null && LOCAL_HOSTNAMES.has(hostname);\n}\n\nexport function isAllowedLocalOrigin(origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n\n try {\n const url = new URL(origin);\n return (\n (url.protocol === 'http:' || url.protocol === 'https:') &&\n LOCAL_HOSTNAMES.has(url.hostname.toLowerCase())\n );\n } catch {\n return false;\n }\n}\n\nexport function isSameOrigin(requestUrl: string, origin: string): boolean {\n try {\n return new URL(requestUrl).origin === new URL(origin).origin;\n } catch {\n return false;\n }\n}\n","export const DEFAULT_HOST = '127.0.0.1';\nexport const DEFAULT_PORT = 4567;\n\nconst LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);\nconst CONTAINER_HOSTS = new Set(['0.0.0.0', '::']);\n\nexport function resolveHost(): string {\n const envHost = process.env.DEVSURFACE_HOST;\n if (!envHost) {\n return DEFAULT_HOST;\n }\n\n if (LOOPBACK_HOSTS.has(envHost)) {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost) && process.env.DEVSURFACE_CONTAINER === 'true') {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost)) {\n throw new Error(\n 'All-interface DevSurface binding is only allowed when DEVSURFACE_CONTAINER=true. DevSurface binds to 127.0.0.1 on bare metal.'\n );\n }\n\n throw new Error('DEVSURFACE_HOST must be a loopback host, or 0.0.0.0 inside a container.');\n}\n\nlet listenHost = DEFAULT_HOST;\n\nexport function setListenHost(host: string): void {\n listenHost = host;\n}\n\nexport function getListenHost(): string {\n return listenHost;\n}\n\nexport function resetListenHost(): void {\n listenHost = DEFAULT_HOST;\n}\n\nexport function normalizeRemoteAddress(raw: string | undefined): string | null {\n if (typeof raw !== 'string' || raw.length === 0) {\n return null;\n }\n\n if (raw.startsWith('::ffff:')) {\n return raw.slice('::ffff:'.length);\n }\n\n return raw;\n}\n\nexport function isLoopbackRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (address === '::1' || address === '127.0.0.1') {\n return true;\n }\n\n return address.startsWith('127.');\n}\n\nfunction parseIpv4(address: string): [number, number, number, number] | null {\n const parts = address.split('.');\n if (parts.length !== 4) {\n return null;\n }\n\n const octets = parts.map((part) => Number(part));\n if (octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255)) {\n return null;\n }\n\n return octets as [number, number, number, number];\n}\n\nexport function isPrivateRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (isLoopbackRemoteAddress(address)) {\n return true;\n }\n\n if (address.startsWith('fe80:')) {\n return true;\n }\n\n const ipv4 = parseIpv4(address);\n if (!ipv4) {\n return false;\n }\n\n const [a, b] = ipv4;\n if (a === 10) {\n return true;\n }\n if (a === 192 && b === 168) {\n return true;\n }\n if (a === 172 && b >= 16 && b <= 31) {\n return true;\n }\n\n return false;\n}\n\nexport function isAllowedRemoteAddress(raw: string | undefined, host: string): boolean {\n if (host === '0.0.0.0' || host === '::') {\n return isPrivateRemoteAddress(raw);\n }\n\n return isLoopbackRemoteAddress(raw);\n}\n\nexport function isAllowedClientConnection(\n raw: string | undefined,\n host: string = getListenHost()\n): boolean {\n if (raw === undefined) {\n return true;\n }\n\n return isAllowedRemoteAddress(raw, host);\n}\n\nexport function initializeListenHost(): string {\n const host = resolveHost();\n setListenHost(host);\n return host;\n}\n","import type { IncomingMessage } from 'node:http';\nimport type { Context, Next } from 'hono';\nimport { isAllowedLocalHostHeader } from './localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from './listenConfig.js';\n\nexport function remoteAddressFromRequest(request: IncomingMessage | undefined): string | undefined {\n return request?.socket?.remoteAddress;\n}\n\nexport function createRemoteAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n await next();\n };\n}\n\nexport function createApiAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const host = context.req.header('host') ?? new URL(context.req.url).host;\n if (!isAllowedLocalHostHeader(host)) {\n return context.json({ error: 'Non-local host rejected.' }, 403);\n }\n\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n\n await next();\n };\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport function createMutationToken(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function hasValidMutationToken(\n provided: string | null | undefined,\n expected: string\n): boolean {\n if (typeof provided !== 'string' || provided.length === 0) {\n return false;\n }\n\n if (provided.length !== expected.length) {\n return false;\n }\n\n return timingSafeEqual(Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8'));\n}\n","export function isAllowedTerminalCommand(command: string): boolean {\n return /^[A-Za-z0-9._+-]+$/.test(command);\n}\n","import type { Server } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../../core/types.js';\nimport { isAllowedLocalHostHeader, isAllowedLocalOrigin } from '../localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from '../listenConfig.js';\nimport { remoteAddressFromRequest } from '../accessControl.js';\n\nfunction isAllowedWebSocketRequest(request: IncomingMessage): boolean {\n const origin = request.headers.origin;\n const host = request.headers.host;\n const secFetchSite = request.headers['sec-fetch-site'];\n\n if (!isAllowedClientConnection(remoteAddressFromRequest(request), getListenHost())) {\n return false;\n }\n\n if (typeof host !== 'string' || !isAllowedLocalHostHeader(host)) {\n return false;\n }\n\n if (secFetchSite === 'cross-site') {\n return false;\n }\n\n if (typeof origin !== 'string') {\n return true;\n }\n\n if (!isAllowedLocalOrigin(origin)) {\n return false;\n }\n\n try {\n return new URL(origin).host.toLowerCase() === host.toLowerCase();\n } catch {\n return false;\n }\n}\n\nfunction workspaceIdFromUrl(url: string | undefined): string | null {\n if (!url) return null;\n try {\n const parsed = new URL(url, 'http://localhost');\n return parsed.searchParams.get('workspace');\n } catch {\n return null;\n }\n}\n\n// Legacy single-ProcessManager WebSocket (backward compat with tests)\nexport function setupWebSocket(server: Server, processManager: ProcessManager): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n function broadcast(payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(serialized);\n }\n }\n }\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcast({ type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcast({ type: 'process', process: processInfo });\n });\n\n wss.on('connection', (socket) => {\n socket.send(\n JSON.stringify({\n type: 'hello',\n processes: processManager.list(),\n logs: processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n\n// Hub-aware WebSocket: each connection is scoped to a workspace via ?workspace=<id>\nexport function setupHubWebSocket(server: Server, hub: Hub): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n const clientWorkspaces = new WeakMap<WebSocket, string>();\n const attachedManagers = new Set<string>();\n\n function attachManager(workspaceId: string, processManager: ProcessManager): void {\n if (attachedManagers.has(workspaceId)) {\n return;\n }\n attachedManagers.add(workspaceId);\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcastToWorkspace(workspaceId, { type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcastToWorkspace(workspaceId, { type: 'process', process: processInfo });\n });\n }\n\n function broadcastToWorkspace(workspaceId: string, payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN && clientWorkspaces.get(client) === workspaceId) {\n client.send(serialized);\n }\n }\n }\n\n wss.on('connection', async (socket, request) => {\n const workspaceId = workspaceIdFromUrl(request.url);\n if (!workspaceId) {\n socket.close(4000, 'Missing workspace query parameter.');\n return;\n }\n\n const entry = await hub.registry.resolve(workspaceId);\n if (!entry) {\n socket.close(4004, 'Workspace not found.');\n return;\n }\n\n const runtime = hub.ensure(entry);\n clientWorkspaces.set(socket, workspaceId);\n attachManager(workspaceId, runtime.processManager);\n\n socket.send(\n JSON.stringify({\n type: 'hello',\n workspace: workspaceId,\n processes: runtime.processManager.list(),\n logs: runtime.processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n","import { DEFAULT_HOST, DEFAULT_PORT } from '../../server/index.js';\n\nexport async function isHubRunning(port: number = DEFAULT_PORT): Promise<boolean> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/api/hub/status`, {\n signal: AbortSignal.timeout(2000)\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nexport async function registerWorkspaceRemotely(\n dirPath: string,\n port: number = DEFAULT_PORT\n): Promise<{ id: string; name: string } | null> {\n try {\n const sessionResponse = await fetch(`http://127.0.0.1:${port}/api/session`, {\n signal: AbortSignal.timeout(2000)\n });\n if (!sessionResponse.ok) return null;\n const session = (await sessionResponse.json()) as { token: string };\n\n const response = await fetch(`http://127.0.0.1:${port}/api/workspaces`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-DevSurface-Intent': 'dashboard',\n 'X-DevSurface-Token': session.token\n },\n body: JSON.stringify({ path: dirPath }),\n signal: AbortSignal.timeout(5000)\n });\n if (!response.ok) return null;\n return (await response.json()) as { id: string; name: string };\n } catch {\n return null;\n }\n}\n\nexport function dashboardUrl(\n workspaceId: string,\n port: number = DEFAULT_PORT,\n host: string = DEFAULT_HOST\n): string {\n const displayHost = host === '0.0.0.0' ? '127.0.0.1' : host;\n return `http://${displayHost}:${port}/?workspace=${workspaceId}`;\n}\n","import pc from 'picocolors';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\n\nexport async function serveCommand(options: {\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n console.log(pc.bold(`DevSurface Hub v${DEV_SURFACE_VERSION}`));\n console.log('Starting hub server...\\n');\n\n const server = await startHubServer({\n port: options.port,\n openBrowser: options.openBrowser\n });\n\n const summaries = await server.hub.listSummaries();\n if (summaries.length > 0) {\n console.log(`Registered workspaces: ${summaries.length}`);\n for (const ws of summaries) {\n console.log(` ${pc.cyan(ws.name)} -> ${ws.path}`);\n }\n } else {\n console.log(\n 'No workspaces registered yet. Use `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n }\n\n console.log(`\\nHub running at -> ${pc.cyan(server.url)}`);\n}\n","import path from 'node:path';\nimport pc from 'picocolors';\nimport { WorkspaceRegistry } from '../../core/hub/registry.js';\n\nexport async function workspaceAddCommand(dirPath?: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const target = path.resolve(dirPath ?? process.cwd());\n const entry = await registry.add(target);\n console.log(`Added workspace ${pc.cyan(entry.name)} (${entry.id}) -> ${entry.path}`);\n}\n\nexport async function workspaceListCommand(): Promise<void> {\n const registry = new WorkspaceRegistry();\n const entries = await registry.list();\n\n if (entries.length === 0) {\n console.log(\n 'No workspaces registered. Run `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n return;\n }\n\n console.log(`${entries.length} workspace${entries.length === 1 ? '' : 's'}:\\n`);\n for (const entry of entries) {\n console.log(` ${pc.cyan(entry.name)} (${entry.id})`);\n console.log(` ${entry.path}`);\n }\n}\n\nexport async function workspaceRemoveCommand(id: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const removed = await registry.remove(id);\n if (removed) {\n console.log(`Removed workspace ${pc.cyan(id)}.`);\n } else {\n console.error(`Workspace \"${id}\" not found.`);\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","fs","path","isWithinRoot","isWithinRoot","path","fs","platform","fs","path","fs","path","isWithinRoot","fs","path","fs","path","isWithinRoot","isWithinRoot","path","fs","fs","readIfPresent","path","ESC","fs","path","pc","path","fs","pc","pc","spawn","runCommand","spawn","pc","pc","pc","pc","process","Buffer","path","promisify","fs","fsConstants","process","fs","process","os","fs","fs","fs","fs","process","os","fs","fs","process","promisify","process","execFile","process","process","promisify","execFile","execFileAsync","promisify","execFile","execFileAsync","execFileAsync","promisify","execFile","defaultBrowser","process","execFile","promisify","path","process","Buffer","defaultBrowser","fs","fsConstants","fs","path","fileURLToPath","spawn","fs","os","path","fs","path","isWithinRoot","path","os","fs","entry","constants","fs","path","spawn","isWithinRoot","path","fs","handle","constants","spawn","workspaceId","fs","path","fileURLToPath","workspaceId","pc","pc","pc","path","pc","path","pc"]}
|