codexapp 0.1.53 → 0.1.56
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/README.md +51 -0
- package/dist/assets/index-BwkNEgMe.css +1 -0
- package/dist/assets/index-C0kJJe0e.js +1429 -0
- package/dist/index.html +2 -2
- package/dist-cli/index.js +1449 -199
- package/dist-cli/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/assets/index-B_hsCD9g.js +0 -1425
- package/dist/assets/index-Dpf9bMnE.css +0 -1
package/dist-cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/server/httpServer.ts","../src/server/codexAppServerBridge.ts","../src/server/skillsRoutes.ts","../src/server/authMiddleware.ts","../src/server/localBrowseUi.ts","../src/server/password.ts"],"sourcesContent":["import { createServer } from 'node:http'\nimport { chmodSync, createWriteStream, existsSync, mkdirSync } from 'node:fs'\nimport { readFile, stat, writeFile } from 'node:fs/promises'\nimport { homedir, networkInterfaces } from 'node:os'\nimport { isAbsolute, join, resolve } from 'node:path'\nimport { spawn, spawnSync } from 'node:child_process'\nimport { createInterface } from 'node:readline/promises'\nimport { fileURLToPath } from 'node:url'\nimport { dirname } from 'node:path'\nimport { get as httpsGet } from 'node:https'\nimport { Command } from 'commander'\nimport qrcode from 'qrcode-terminal'\nimport { createServer as createApp } from '../server/httpServer.js'\nimport { generatePassword } from '../server/password.js'\n\nconst program = new Command().name('codexui').description('Web interface for Codex app-server')\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nasync function readCliVersion(): Promise<string> {\n try {\n const packageJsonPath = join(__dirname, '..', 'package.json')\n const raw = await readFile(packageJsonPath, 'utf8')\n const parsed = JSON.parse(raw) as { version?: unknown }\n return typeof parsed.version === 'string' ? parsed.version : 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nfunction isTermuxRuntime(): boolean {\n return Boolean(process.env.TERMUX_VERSION || process.env.PREFIX?.includes('/com.termux/'))\n}\n\nfunction canRun(command: string, args: string[] = []): boolean {\n const result = spawnSync(command, args, { stdio: 'ignore' })\n return result.status === 0\n}\n\nfunction runOrFail(command: string, args: string[], label: string): void {\n const result = spawnSync(command, args, { stdio: 'inherit' })\n if (result.status !== 0) {\n throw new Error(`${label} failed with exit code ${String(result.status ?? -1)}`)\n }\n}\n\nfunction runWithStatus(command: string, args: string[]): number {\n const result = spawnSync(command, args, { stdio: 'inherit' })\n return result.status ?? -1\n}\n\nfunction getUserNpmPrefix(): string {\n return join(homedir(), '.npm-global')\n}\n\nfunction resolveCodexCommand(): string | null {\n if (canRun('codex', ['--version'])) {\n return 'codex'\n }\n\n const userCandidate = join(getUserNpmPrefix(), 'bin', 'codex')\n if (existsSync(userCandidate) && canRun(userCandidate, ['--version'])) {\n return userCandidate\n }\n\n const prefix = process.env.PREFIX?.trim()\n if (!prefix) {\n return null\n }\n const candidate = join(prefix, 'bin', 'codex')\n if (existsSync(candidate) && canRun(candidate, ['--version'])) {\n return candidate\n }\n return null\n}\n\nfunction resolveCloudflaredCommand(): string | null {\n if (canRun('cloudflared', ['--version'])) {\n return 'cloudflared'\n }\n const localCandidate = join(homedir(), '.local', 'bin', 'cloudflared')\n if (existsSync(localCandidate) && canRun(localCandidate, ['--version'])) {\n return localCandidate\n }\n return null\n}\n\nfunction mapCloudflaredLinuxArch(arch: NodeJS.Architecture): string | null {\n if (arch === 'x64') {\n return 'amd64'\n }\n if (arch === 'arm64') {\n return 'arm64'\n }\n return null\n}\n\nfunction downloadFile(url: string, destination: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = (currentUrl: string) => {\n httpsGet(currentUrl, (response) => {\n const code = response.statusCode ?? 0\n if (code >= 300 && code < 400 && response.headers.location) {\n response.resume()\n request(response.headers.location)\n return\n }\n if (code !== 200) {\n response.resume()\n reject(new Error(`Download failed with HTTP status ${String(code)}`))\n return\n }\n const file = createWriteStream(destination, { mode: 0o755 })\n response.pipe(file)\n file.on('finish', () => {\n file.close()\n resolve()\n })\n file.on('error', reject)\n }).on('error', reject)\n }\n\n request(url)\n })\n}\n\nasync function ensureCloudflaredInstalledLinux(): Promise<string | null> {\n const current = resolveCloudflaredCommand()\n if (current) {\n return current\n }\n if (process.platform !== 'linux') {\n return null\n }\n\n const mappedArch = mapCloudflaredLinuxArch(process.arch)\n if (!mappedArch) {\n throw new Error(`cloudflared auto-install is not supported for Linux architecture: ${process.arch}`)\n }\n\n const userBinDir = join(homedir(), '.local', 'bin')\n mkdirSync(userBinDir, { recursive: true })\n const destination = join(userBinDir, 'cloudflared')\n const downloadUrl = `https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${mappedArch}`\n\n console.log('\\ncloudflared not found. Installing to ~/.local/bin...\\n')\n await downloadFile(downloadUrl, destination)\n chmodSync(destination, 0o755)\n process.env.PATH = `${userBinDir}:${process.env.PATH ?? ''}`\n\n const installed = resolveCloudflaredCommand()\n if (!installed) {\n throw new Error('cloudflared download completed but executable is still not available')\n }\n console.log('\\ncloudflared installed.\\n')\n return installed\n}\n\nasync function shouldInstallCloudflaredInteractively(): Promise<boolean> {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.warn('\\n[cloudflared] cloudflared is missing and terminal is non-interactive, skipping install.')\n return false\n }\n\n const prompt = createInterface({ input: process.stdin, output: process.stdout })\n try {\n const answer = await prompt.question('cloudflared is not installed. Install it now to ~/.local/bin? [y/N] ')\n const normalized = answer.trim().toLowerCase()\n return normalized === 'y' || normalized === 'yes'\n } finally {\n prompt.close()\n }\n}\n\nasync function resolveCloudflaredForTunnel(): Promise<string | null> {\n const current = resolveCloudflaredCommand()\n if (current) {\n return current\n }\n\n const installApproved = await shouldInstallCloudflaredInteractively()\n if (!installApproved) {\n return null\n }\n\n return ensureCloudflaredInstalledLinux()\n}\n\nfunction hasCodexAuth(): boolean {\n const codexHome = process.env.CODEX_HOME?.trim() || join(homedir(), '.codex')\n return existsSync(join(codexHome, 'auth.json'))\n}\n\nfunction ensureCodexInstalled(): string | null {\n let codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n const installWithFallback = (pkg: string, label: string): void => {\n const status = runWithStatus('npm', ['install', '-g', pkg])\n if (status === 0) {\n return\n }\n if (isTermuxRuntime()) {\n throw new Error(`${label} failed with exit code ${String(status)}`)\n }\n const userPrefix = getUserNpmPrefix()\n console.log(`\\nGlobal npm install requires elevated permissions. Retrying with --prefix ${userPrefix}...\\n`)\n runOrFail('npm', ['install', '-g', '--prefix', userPrefix, pkg], `${label} (user prefix)`)\n process.env.PATH = `${join(userPrefix, 'bin')}:${process.env.PATH ?? ''}`\n }\n\n if (isTermuxRuntime()) {\n console.log('\\nCodex CLI not found. Installing Termux-compatible Codex CLI from npm...\\n')\n installWithFallback('@mmmbuto/codex-cli-termux', 'Codex CLI install')\n codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n console.log('\\nTermux npm package did not expose `codex`. Installing official CLI fallback...\\n')\n installWithFallback('@openai/codex', 'Codex CLI fallback install')\n }\n } else {\n console.log('\\nCodex CLI not found. Installing official Codex CLI from npm...\\n')\n installWithFallback('@openai/codex', 'Codex CLI install')\n }\n\n codexCommand = resolveCodexCommand()\n if (!codexCommand && !isTermuxRuntime()) {\n // Non-Termux path should resolve after official package install.\n throw new Error('Official Codex CLI install completed but binary is still not available in PATH')\n }\n if (!codexCommand && isTermuxRuntime()) {\n codexCommand = resolveCodexCommand()\n }\n if (!codexCommand) {\n throw new Error('Codex CLI install completed but binary is still not available in PATH')\n }\n console.log('\\nCodex CLI installed.\\n')\n }\n return codexCommand\n}\n\nfunction resolvePassword(input: string | boolean): string | undefined {\n if (input === false) {\n return undefined\n }\n if (typeof input === 'string') {\n return input\n }\n return generatePassword()\n}\n\nfunction printTermuxKeepAlive(lines: string[]): void {\n if (!isTermuxRuntime()) {\n return\n }\n lines.push('')\n lines.push(' Android/Termux keep-alive:')\n lines.push(' 1) Keep this Termux session open (do not swipe it away).')\n lines.push(' 2) Disable battery optimization for Termux in Android settings.')\n lines.push(' 3) Optional: run `termux-wake-lock` in another shell.')\n}\n\nfunction openBrowser(url: string): void {\n const command = process.platform === 'darwin'\n ? { cmd: 'open', args: [url] }\n : process.platform === 'win32'\n ? { cmd: 'cmd', args: ['/c', 'start', '', url] }\n : { cmd: 'xdg-open', args: [url] }\n\n const child = spawn(command.cmd, command.args, { detached: true, stdio: 'ignore' })\n child.on('error', () => {})\n child.unref()\n}\n\nfunction parseCloudflaredUrl(chunk: string): string | null {\n const urlMatch = chunk.match(/https:\\/\\/[a-zA-Z0-9-]+\\.trycloudflare\\.com/g)\n if (!urlMatch || urlMatch.length === 0) {\n return null\n }\n return urlMatch[urlMatch.length - 1] ?? null\n}\n\nfunction getAccessibleUrls(port: number): string[] {\n const urls = new Set<string>([`http://localhost:${String(port)}`])\n const interfaces = networkInterfaces()\n for (const entries of Object.values(interfaces)) {\n if (!entries) {\n continue\n }\n for (const entry of entries) {\n if (entry.internal) {\n continue\n }\n if (entry.family === 'IPv4') {\n urls.add(`http://${entry.address}:${String(port)}`)\n }\n }\n }\n return Array.from(urls)\n}\n\nasync function startCloudflaredTunnel(command: string, localPort: number): Promise<{\n process: ReturnType<typeof spawn>\n url: string\n}> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, ['tunnel', '--url', `http://localhost:${String(localPort)}`], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n const timeout = setTimeout(() => {\n child.kill('SIGTERM')\n reject(new Error('Timed out waiting for cloudflared tunnel URL'))\n }, 20000)\n\n const handleData = (value: Buffer | string) => {\n const text = String(value)\n const parsedUrl = parseCloudflaredUrl(text)\n if (!parsedUrl) {\n return\n }\n clearTimeout(timeout)\n child.stdout?.off('data', handleData)\n child.stderr?.off('data', handleData)\n resolve({ process: child, url: parsedUrl })\n }\n\n const onError = (error: Error) => {\n clearTimeout(timeout)\n reject(new Error(`Failed to start cloudflared: ${error.message}`))\n }\n\n child.once('error', onError)\n child.stdout?.on('data', handleData)\n child.stderr?.on('data', handleData)\n\n child.once('exit', (code) => {\n if (code === 0) {\n return\n }\n clearTimeout(timeout)\n reject(new Error(`cloudflared exited before providing a URL (code ${String(code)})`))\n })\n })\n}\n\nfunction listenWithFallback(server: ReturnType<typeof createServer>, startPort: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const attempt = (port: number) => {\n const onError = (error: NodeJS.ErrnoException) => {\n server.off('listening', onListening)\n if (error.code === 'EADDRINUSE' || error.code === 'EACCES') {\n attempt(port + 1)\n return\n }\n reject(error)\n }\n const onListening = () => {\n server.off('error', onError)\n resolve(port)\n }\n\n server.once('error', onError)\n server.once('listening', onListening)\n server.listen(port, '0.0.0.0')\n }\n\n attempt(startPort)\n })\n}\n\nfunction getCodexGlobalStatePath(): string {\n const codexHome = process.env.CODEX_HOME?.trim() || join(homedir(), '.codex')\n return join(codexHome, '.codex-global-state.json')\n}\n\nfunction normalizeUniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const next: string[] = []\n for (const item of value) {\n if (typeof item !== 'string') continue\n const trimmed = item.trim()\n if (!trimmed || next.includes(trimmed)) continue\n next.push(trimmed)\n }\n return next\n}\n\nasync function persistLaunchProject(projectPath: string): Promise<void> {\n const trimmed = projectPath.trim()\n if (!trimmed) return\n const normalizedPath = isAbsolute(trimmed) ? trimmed : resolve(trimmed)\n const directoryInfo = await stat(normalizedPath)\n if (!directoryInfo.isDirectory()) {\n throw new Error(`Not a directory: ${normalizedPath}`)\n }\n\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n payload = parsed as Record<string, unknown>\n }\n } catch {\n payload = {}\n }\n\n const roots = normalizeUniqueStrings(payload['electron-saved-workspace-roots'])\n const activeRoots = normalizeUniqueStrings(payload['active-workspace-roots'])\n payload['electron-saved-workspace-roots'] = [\n normalizedPath,\n ...roots.filter((value) => value !== normalizedPath),\n ]\n payload['active-workspace-roots'] = [\n normalizedPath,\n ...activeRoots.filter((value) => value !== normalizedPath),\n ]\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function addProjectOnly(projectPath: string): Promise<void> {\n const trimmed = projectPath.trim()\n if (!trimmed) {\n throw new Error('Missing project path')\n }\n await persistLaunchProject(trimmed)\n}\n\nasync function startServer(options: { port: string; password: string | boolean; tunnel: boolean; projectPath?: string }) {\n const version = await readCliVersion()\n const projectPath = options.projectPath?.trim() ?? ''\n if (projectPath.length > 0) {\n try {\n await persistLaunchProject(projectPath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(`\\n[project] Could not open launch project: ${message}\\n`)\n }\n }\n const codexCommand = ensureCodexInstalled() ?? resolveCodexCommand()\n if (!hasCodexAuth() && codexCommand) {\n console.log('\\nCodex is not logged in. Starting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n }\n const requestedPort = parseInt(options.port, 10)\n const password = resolvePassword(options.password)\n const { app, dispose, attachWebSocket } = createApp({ password })\n const server = createServer(app)\n attachWebSocket(server)\n const port = await listenWithFallback(server, requestedPort)\n let tunnelChild: ReturnType<typeof spawn> | null = null\n let tunnelUrl: string | null = null\n\n if (options.tunnel) {\n try {\n const cloudflaredCommand = await resolveCloudflaredForTunnel()\n if (!cloudflaredCommand) {\n throw new Error('cloudflared is not installed')\n }\n const tunnel = await startCloudflaredTunnel(cloudflaredCommand, port)\n tunnelChild = tunnel.process\n tunnelUrl = tunnel.url\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(`\\n[cloudflared] Tunnel not started: ${message}`)\n }\n }\n\n const lines = [\n '',\n 'Codex Web Local is running!',\n ` Version: ${version}`,\n ' GitHub: https://github.com/friuns2/codexui',\n '',\n ` Bind: http://0.0.0.0:${String(port)}`,\n ]\n const accessUrls = getAccessibleUrls(port)\n if (accessUrls.length > 0) {\n lines.push(` Local: ${accessUrls[0]}`)\n for (const accessUrl of accessUrls.slice(1)) {\n lines.push(` Network: ${accessUrl}`)\n }\n }\n\n if (port !== requestedPort) {\n lines.push(` Requested port ${String(requestedPort)} was unavailable; using ${String(port)}.`)\n }\n\n if (password) {\n lines.push(` Password: ${password}`)\n }\n if (tunnelUrl) {\n lines.push(` Tunnel: ${tunnelUrl}`)\n lines.push(' Tunnel QR code below')\n }\n\n printTermuxKeepAlive(lines)\n lines.push('')\n console.log(lines.join('\\n'))\n if (tunnelUrl) {\n qrcode.generate(tunnelUrl, { small: true })\n console.log('')\n }\n openBrowser(`http://localhost:${String(port)}`)\n\n function shutdown() {\n console.log('\\nShutting down...')\n if (tunnelChild && !tunnelChild.killed) {\n tunnelChild.kill('SIGTERM')\n }\n server.close(() => {\n dispose()\n process.exit(0)\n })\n // Force exit after timeout\n setTimeout(() => {\n dispose()\n process.exit(1)\n }, 5000).unref()\n }\n\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n}\n\nasync function runLogin() {\n const codexCommand = ensureCodexInstalled() ?? 'codex'\n console.log('\\nStarting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n}\n\nprogram\n .argument('[projectPath]', 'project directory to open on launch')\n .option('--open-project <path>', 'open project directory on launch (Codex desktop parity)')\n .option('-p, --port <port>', 'port to listen on', '5999')\n .option('--password <pass>', 'set a specific password')\n .option('--no-password', 'disable password protection')\n .option('--tunnel', 'start cloudflared tunnel', true)\n .option('--no-tunnel', 'disable cloudflared tunnel startup')\n .action(async (\n projectPath: string | undefined,\n opts: { port: string; password: string | boolean; tunnel: boolean; openProject?: string },\n ) => {\n const rawArgv = process.argv.slice(2)\n const openProjectFlagIndex = rawArgv.findIndex((arg) => arg === '--open-project' || arg.startsWith('--open-project='))\n let openProjectOnly = (opts.openProject ?? '').trim()\n if (!openProjectOnly && openProjectFlagIndex >= 0 && projectPath?.trim()) {\n // Commander may map \"--open-project .\" to the positional arg in this command layout.\n openProjectOnly = projectPath.trim()\n }\n if (openProjectOnly.length > 0) {\n await addProjectOnly(openProjectOnly)\n console.log(`Added project: ${openProjectOnly}`)\n return\n }\n\n const launchProject = (projectPath ?? '').trim()\n await startServer({ ...opts, projectPath: launchProject })\n })\n\nprogram.command('login').description('Install/check Codex CLI and run `codex login`').action(runLogin)\n\nprogram.command('help').description('Show codexui command help').action(() => {\n program.outputHelp()\n})\n\nprogram.parseAsync(process.argv).catch((error) => {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\\nFailed to run codexui: ${message}`)\n process.exit(1)\n})\n","import { fileURLToPath } from 'node:url'\nimport { dirname, extname, isAbsolute, join } from 'node:path'\nimport type { Server as HttpServer, IncomingMessage } from 'node:http'\nimport { existsSync } from 'node:fs'\nimport { writeFile, stat } from 'node:fs/promises'\nimport express, { type Express } from 'express'\nimport { createCodexBridgeMiddleware } from './codexAppServerBridge.js'\nimport { createAuthSession } from './authMiddleware.js'\nimport { createDirectoryListingHtml, createTextEditorHtml, decodeBrowsePath, isTextEditableFile, normalizeLocalPath } from './localBrowseUi.js'\nimport { WebSocketServer, type WebSocket } from 'ws'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst distDir = join(__dirname, '..', 'dist')\nconst spaEntryFile = join(distDir, 'index.html')\n\nexport type ServerOptions = {\n password?: string\n}\n\nexport type ServerInstance = {\n app: Express\n dispose: () => void\n attachWebSocket: (server: HttpServer) => void\n}\n\nconst IMAGE_CONTENT_TYPES: Record<string, string> = {\n '.avif': 'image/avif',\n '.bmp': 'image/bmp',\n '.gif': 'image/gif',\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n}\n\nfunction renderFrontendMissingHtml(message: string, details?: string[]): string {\n const lines = details && details.length > 0 ? `<pre>${details.join('\\n')}</pre>` : ''\n return [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head><meta charset=\"utf-8\"><title>Codex Web UI Error</title></head>',\n '<body>',\n `<h1>${message}</h1>`,\n lines,\n '<p><a href=\"/\">Back to chat</a></p>',\n '</body>',\n '</html>',\n ].join('')\n}\n\nfunction normalizeLocalImagePath(rawPath: string): string {\n const trimmed = rawPath.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('file://')) {\n try {\n return decodeURIComponent(trimmed.replace(/^file:\\/\\//u, ''))\n } catch {\n return trimmed.replace(/^file:\\/\\//u, '')\n }\n }\n return trimmed\n}\n\nfunction readWildcardPathParam(value: unknown): string {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) return value.join('/')\n return ''\n}\n\nexport function createServer(options: ServerOptions = {}): ServerInstance {\n const app = express()\n const bridge = createCodexBridgeMiddleware()\n const authSession = options.password ? createAuthSession(options.password) : null\n\n // 1. Auth middleware (if password is set)\n if (authSession) {\n app.use(authSession.middleware)\n }\n\n // 2. Bridge middleware for /codex-api/*\n app.use(bridge)\n\n // 3. Serve local images referenced in markdown (desktop parity for absolute image paths)\n app.get('/codex-local-image', (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const localPath = normalizeLocalImagePath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n const contentType = IMAGE_CONTENT_TYPES[extname(localPath).toLowerCase()]\n if (!contentType) {\n res.status(415).json({ error: 'Unsupported image type.' })\n return\n }\n\n res.type(contentType)\n res.setHeader('Cache-Control', 'private, max-age=300')\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'Image file not found.' })\n })\n })\n\n // 4. Serve local files inline for direct file open.\n app.get('/codex-local-file', (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const localPath = normalizeLocalPath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n res.setHeader('Cache-Control', 'private, no-store')\n res.setHeader('Content-Disposition', 'inline')\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'File not found.' })\n })\n })\n\n // 5. Serve local files by path to preserve relative asset loading for HTML.\n app.get('/codex-local-browse/*path', async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n try {\n const fileStat = await stat(localPath)\n res.setHeader('Cache-Control', 'private, no-store')\n if (fileStat.isDirectory()) {\n const html = await createDirectoryListingHtml(localPath)\n res.status(200).type('text/html; charset=utf-8').send(html)\n return\n }\n\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'File not found.' })\n })\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n // 6. Edit text-like local files.\n app.get('/codex-local-edit/*path', async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isFile()) {\n res.status(400).json({ error: 'Expected file path.' })\n return\n }\n const html = await createTextEditorHtml(localPath)\n res.status(200).type('text/html; charset=utf-8').send(html)\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n app.put('/codex-local-edit/*path', express.text({ type: '*/*', limit: '10mb' }), async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n if (!(await isTextEditableFile(localPath))) {\n res.status(415).json({ error: 'Only text-like files are editable.' })\n return\n }\n const body = typeof req.body === 'string' ? req.body : ''\n try {\n await writeFile(localPath, body, 'utf8')\n res.status(200).json({ ok: true })\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n const hasFrontendAssets = existsSync(spaEntryFile)\n\n // 7. Static files from Vue build\n if (hasFrontendAssets) {\n app.use(express.static(distDir))\n }\n\n // 8. SPA fallback\n app.use((_req, res) => {\n if (!hasFrontendAssets) {\n res\n .status(503)\n .type('text/html; charset=utf-8')\n .send(\n renderFrontendMissingHtml('Codex web UI assets are missing.', [\n `Expected: ${spaEntryFile}`,\n 'If running from source, build frontend assets with: npm run build:frontend',\n 'If running with npx, clear the npx cache and reinstall codexapp.',\n ]),\n )\n return\n }\n\n res.sendFile(spaEntryFile, (error) => {\n if (!error) return\n if (!res.headersSent) {\n res.status(404).type('text/html; charset=utf-8').send(renderFrontendMissingHtml('Frontend entry file not found.'))\n }\n })\n })\n\n return {\n app,\n dispose: () => bridge.dispose(),\n attachWebSocket: (server: HttpServer) => {\n const wss = new WebSocketServer({ noServer: true })\n\n server.on('upgrade', (req: IncomingMessage, socket, head) => {\n const url = new URL(req.url ?? '', 'http://localhost')\n if (url.pathname !== '/codex-api/ws') {\n return\n }\n\n if (authSession && !authSession.isRequestAuthorized(req)) {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\nConnection: close\\r\\n\\r\\n')\n socket.destroy()\n return\n }\n\n wss.handleUpgrade(req, socket, head, (ws: WebSocket) => {\n wss.emit('connection', ws, req)\n })\n })\n\n wss.on('connection', (ws: WebSocket) => {\n ws.send(JSON.stringify({ method: 'ready', params: { ok: true }, atIso: new Date().toISOString() }))\n const unsubscribe = bridge.subscribeNotifications((notification) => {\n if (ws.readyState !== 1) return\n ws.send(JSON.stringify(notification))\n })\n\n ws.on('close', unsubscribe)\n ws.on('error', unsubscribe)\n })\n },\n }\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport { mkdtemp, readFile, readdir, rm, mkdir, stat, cp, lstat, readlink, symlink } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { request as httpsRequest } from 'node:https'\nimport { homedir } from 'node:os'\nimport { tmpdir } from 'node:os'\nimport { basename, isAbsolute, join, resolve } from 'node:path'\nimport { writeFile } from 'node:fs/promises'\nimport { handleSkillsRoutes, initializeSkillsSyncOnStartup } from './skillsRoutes.js'\n\ntype JsonRpcCall = {\n jsonrpc: '2.0'\n id: number\n method: string\n params?: unknown\n}\n\ntype JsonRpcResponse = {\n id?: number\n result?: unknown\n error?: {\n code: number\n message: string\n }\n method?: string\n params?: unknown\n}\n\ntype RpcProxyRequest = {\n method: string\n params?: unknown\n}\n\ntype ServerRequestReply = {\n result?: unknown\n error?: {\n code: number\n message: string\n }\n}\n\ntype WorkspaceRootsState = {\n order: string[]\n labels: Record<string, string>\n active: string[]\n}\n\ntype PendingServerRequest = {\n id: number\n method: string\n params: unknown\n receivedAtIso: string\n}\n\ntype ThreadSearchDocument = {\n id: string\n title: string\n preview: string\n messageText: string\n searchableText: string\n}\n\ntype ThreadSearchIndex = {\n docsById: Map<string, ThreadSearchDocument>\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nfunction extractThreadMessageText(threadReadPayload: unknown): string {\n const payload = asRecord(threadReadPayload)\n const thread = asRecord(payload?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const parts: string[] = []\n\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : []\n for (const item of items) {\n const itemRecord = asRecord(item)\n const type = typeof itemRecord?.type === 'string' ? itemRecord.type : ''\n if (type === 'agentMessage' && typeof itemRecord?.text === 'string' && itemRecord.text.trim().length > 0) {\n parts.push(itemRecord.text.trim())\n continue\n }\n if (type === 'userMessage') {\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : []\n for (const block of content) {\n const blockRecord = asRecord(block)\n if (blockRecord?.type === 'text' && typeof blockRecord.text === 'string' && blockRecord.text.trim().length > 0) {\n parts.push(blockRecord.text.trim())\n }\n }\n continue\n }\n if (type === 'commandExecution') {\n const command = typeof itemRecord?.command === 'string' ? itemRecord.command.trim() : ''\n const output = typeof itemRecord?.aggregatedOutput === 'string' ? itemRecord.aggregatedOutput.trim() : ''\n if (command) parts.push(command)\n if (output) parts.push(output)\n }\n }\n }\n\n return parts.join('\\n').trim()\n}\n\nfunction isExactPhraseMatch(query: string, doc: ThreadSearchDocument): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return false\n return (\n doc.title.toLowerCase().includes(q) ||\n doc.preview.toLowerCase().includes(q) ||\n doc.messageText.toLowerCase().includes(q)\n )\n}\n\nfunction scoreFileCandidate(path: string, query: string): number {\n if (!query) return 0\n const lowerPath = path.toLowerCase()\n const lowerQuery = query.toLowerCase()\n const baseName = lowerPath.slice(lowerPath.lastIndexOf('/') + 1)\n if (baseName === lowerQuery) return 0\n if (baseName.startsWith(lowerQuery)) return 1\n if (baseName.includes(lowerQuery)) return 2\n if (lowerPath.includes(`/${lowerQuery}`)) return 3\n if (lowerPath.includes(lowerQuery)) return 4\n return 10\n}\n\nasync function listFilesWithRipgrep(cwd: string): Promise<string[]> {\n return await new Promise<string[]>((resolve, reject) => {\n const proc = spawn('rg', ['--files', '--hidden', '-g', '!.git', '-g', '!node_modules'], {\n cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n const rows = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n resolve(rows)\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n reject(new Error(details || 'rg --files failed'))\n })\n })\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string } = {}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction isMissingHeadError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return (\n message.includes(\"not a valid object name: 'head'\") ||\n message.includes('not a valid object name: head') ||\n message.includes('invalid reference: head')\n )\n}\n\nfunction isNotGitRepositoryError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return message.includes('not a git repository') || message.includes('fatal: not a git repository')\n}\n\nasync function ensureRepoHasInitialCommit(repoRoot: string): Promise<void> {\n const agentsPath = join(repoRoot, 'AGENTS.md')\n try {\n await stat(agentsPath)\n } catch {\n await writeFile(agentsPath, '', 'utf8')\n }\n\n await runCommand('git', ['add', 'AGENTS.md'], { cwd: repoRoot })\n await runCommand(\n 'git',\n ['-c', 'user.name=Codex', '-c', 'user.email=codex@local', 'commit', '-m', 'Initialize repository for worktree support'],\n { cwd: repoRoot },\n )\n}\n\nasync function runCommandCapture(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nasync function runCommandWithOutput(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const normalized: string[] = []\n for (const item of value) {\n if (typeof item === 'string' && item.length > 0 && !normalized.includes(item)) {\n normalized.push(item)\n }\n }\n return normalized\n}\n\nfunction normalizeStringRecord(value: unknown): Record<string, string> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n const next: Record<string, string> = {}\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n if (typeof key === 'string' && key.length > 0 && typeof item === 'string') {\n next[key] = item\n }\n }\n return next\n}\n\nfunction getCodexAuthPath(): string {\n return join(getCodexHomeDir(), 'auth.json')\n}\n\ntype CodexAuth = {\n tokens?: {\n access_token?: string\n account_id?: string\n }\n}\n\nasync function readCodexAuth(): Promise<{ accessToken: string; accountId?: string } | null> {\n try {\n const raw = await readFile(getCodexAuthPath(), 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n const token = auth.tokens?.access_token\n if (!token) return null\n return { accessToken: token, accountId: auth.tokens?.account_id ?? undefined }\n } catch {\n return null\n }\n}\n\nfunction getCodexGlobalStatePath(): string {\n return join(getCodexHomeDir(), '.codex-global-state.json')\n}\n\ntype ThreadTitleCache = { titles: Record<string, string>; order: string[] }\nconst MAX_THREAD_TITLES = 500\n\nfunction normalizeThreadTitleCache(value: unknown): ThreadTitleCache {\n const record = asRecord(value)\n if (!record) return { titles: {}, order: [] }\n const rawTitles = asRecord(record.titles)\n const titles: Record<string, string> = {}\n if (rawTitles) {\n for (const [k, v] of Object.entries(rawTitles)) {\n if (typeof v === 'string' && v.length > 0) titles[k] = v\n }\n }\n const order = normalizeStringArray(record.order)\n return { titles, order }\n}\n\nfunction updateThreadTitleCache(cache: ThreadTitleCache, id: string, title: string): ThreadTitleCache {\n const titles = { ...cache.titles, [id]: title }\n const order = [id, ...cache.order.filter((o) => o !== id)]\n while (order.length > MAX_THREAD_TITLES) {\n const removed = order.pop()\n if (removed) delete titles[removed]\n }\n return { titles, order }\n}\n\nfunction removeFromThreadTitleCache(cache: ThreadTitleCache, id: string): ThreadTitleCache {\n const { [id]: _, ...titles } = cache.titles\n return { titles, order: cache.order.filter((o) => o !== id) }\n}\n\nasync function readThreadTitleCache(): Promise<ThreadTitleCache> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeThreadTitleCache(payload['thread-titles'])\n } catch {\n return { titles: {}, order: [] }\n }\n}\n\nasync function writeThreadTitleCache(cache: ThreadTitleCache): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n payload['thread-titles'] = cache\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function readWorkspaceRootsState(): Promise<WorkspaceRootsState> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n\n try {\n const raw = await readFile(statePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n payload = asRecord(parsed) ?? {}\n } catch {\n payload = {}\n }\n\n return {\n order: normalizeStringArray(payload['electron-saved-workspace-roots']),\n labels: normalizeStringRecord(payload['electron-workspace-root-labels']),\n active: normalizeStringArray(payload['active-workspace-roots']),\n }\n}\n\nasync function writeWorkspaceRootsState(nextState: WorkspaceRootsState): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n\n payload['electron-saved-workspace-roots'] = normalizeStringArray(nextState.order)\n payload['electron-workspace-root-labels'] = normalizeStringRecord(nextState.labels)\n payload['active-workspace-roots'] = normalizeStringArray(nextState.active)\n\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const raw = await readRawBody(req)\n if (raw.length === 0) return null\n const text = raw.toString('utf8').trim()\n if (text.length === 0) return null\n return JSON.parse(text) as unknown\n}\n\nasync function readRawBody(req: IncomingMessage): Promise<Buffer> {\n const chunks: Uint8Array[] = []\n for await (const chunk of req) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks)\n}\n\nfunction bufferIndexOf(buf: Buffer, needle: Buffer, start = 0): number {\n for (let i = start; i <= buf.length - needle.length; i++) {\n let match = true\n for (let j = 0; j < needle.length; j++) {\n if (buf[i + j] !== needle[j]) { match = false; break }\n }\n if (match) return i\n }\n return -1\n}\n\nfunction handleFileUpload(req: IncomingMessage, res: ServerResponse): void {\n const chunks: Buffer[] = []\n req.on('data', (chunk: Buffer) => chunks.push(chunk))\n req.on('end', async () => {\n try {\n const body = Buffer.concat(chunks)\n const contentType = req.headers['content-type'] ?? ''\n const boundaryMatch = contentType.match(/boundary=(.+)/i)\n if (!boundaryMatch) { setJson(res, 400, { error: 'Missing multipart boundary' }); return }\n const boundary = boundaryMatch[1]\n const boundaryBuf = Buffer.from(`--${boundary}`)\n const parts: Buffer[] = []\n let searchStart = 0\n while (searchStart < body.length) {\n const idx = body.indexOf(boundaryBuf, searchStart)\n if (idx < 0) break\n if (searchStart > 0) parts.push(body.subarray(searchStart, idx))\n searchStart = idx + boundaryBuf.length\n if (body[searchStart] === 0x0d && body[searchStart + 1] === 0x0a) searchStart += 2\n }\n let fileName = 'uploaded-file'\n let fileData: Buffer | null = null\n const headerSep = Buffer.from('\\r\\n\\r\\n')\n for (const part of parts) {\n const headerEnd = bufferIndexOf(part, headerSep)\n if (headerEnd < 0) continue\n const headers = part.subarray(0, headerEnd).toString('utf8')\n const fnMatch = headers.match(/filename=\"([^\"]+)\"/i)\n if (!fnMatch) continue\n fileName = fnMatch[1].replace(/[/\\\\]/g, '_')\n let end = part.length\n if (end >= 2 && part[end - 2] === 0x0d && part[end - 1] === 0x0a) end -= 2\n fileData = part.subarray(headerEnd + 4, end)\n break\n }\n if (!fileData) { setJson(res, 400, { error: 'No file in request' }); return }\n const uploadDir = join(tmpdir(), 'codex-web-uploads')\n await mkdir(uploadDir, { recursive: true })\n const destDir = await mkdtemp(join(uploadDir, 'f-'))\n const destPath = join(destDir, fileName)\n await writeFile(destPath, fileData)\n setJson(res, 200, { path: destPath })\n } catch (err) {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload failed') })\n }\n })\n req.on('error', (err: Error) => {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload stream error') })\n })\n}\n\nasync function proxyTranscribe(\n body: Buffer,\n contentType: string,\n authToken: string,\n accountId?: string,\n): Promise<{ status: number; body: string }> {\n const headers: Record<string, string | number> = {\n 'Content-Type': contentType,\n 'Content-Length': body.length,\n Authorization: `Bearer ${authToken}`,\n originator: 'Codex Desktop',\n 'User-Agent': `Codex Desktop/0.1.0 (${process.platform}; ${process.arch})`,\n }\n\n if (accountId) {\n headers['ChatGPT-Account-Id'] = accountId\n }\n\n return new Promise((resolve, reject) => {\n const req = httpsRequest(\n 'https://chatgpt.com/backend-api/transcribe',\n { method: 'POST', headers },\n (res) => {\n const chunks: Buffer[] = []\n res.on('data', (c: Buffer) => chunks.push(c))\n res.on('end', () => resolve({ status: res.statusCode ?? 500, body: Buffer.concat(chunks).toString('utf8') }))\n res.on('error', reject)\n },\n )\n req.on('error', reject)\n req.write(body)\n req.end()\n })\n}\n\nclass AppServerProcess {\n private process: ChildProcessWithoutNullStreams | null = null\n private initialized = false\n private initializePromise: Promise<void> | null = null\n private readBuffer = ''\n private nextId = 1\n private stopping = false\n private readonly pending = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }>()\n private readonly notificationListeners = new Set<(value: { method: string; params: unknown }) => void>()\n private readonly pendingServerRequests = new Map<number, PendingServerRequest>()\n private readonly appServerArgs = [\n 'app-server',\n '-c',\n 'approval_policy=\"never\"',\n '-c',\n 'sandbox_mode=\"danger-full-access\"',\n ]\n\n private start(): void {\n if (this.process) return\n\n this.stopping = false\n const proc = spawn('codex', this.appServerArgs, { stdio: ['pipe', 'pipe', 'pipe'] })\n this.process = proc\n\n proc.stdout.setEncoding('utf8')\n proc.stdout.on('data', (chunk: string) => {\n this.readBuffer += chunk\n\n let lineEnd = this.readBuffer.indexOf('\\n')\n while (lineEnd !== -1) {\n const line = this.readBuffer.slice(0, lineEnd).trim()\n this.readBuffer = this.readBuffer.slice(lineEnd + 1)\n\n if (line.length > 0) {\n this.handleLine(line)\n }\n\n lineEnd = this.readBuffer.indexOf('\\n')\n }\n })\n\n proc.stderr.setEncoding('utf8')\n proc.stderr.on('data', () => {\n // Keep stderr silent in dev middleware; JSON-RPC errors are forwarded via responses.\n })\n\n proc.on('exit', () => {\n const failure = new Error(this.stopping ? 'codex app-server stopped' : 'codex app-server exited unexpectedly')\n for (const request of this.pending.values()) {\n request.reject(failure)\n }\n\n this.pending.clear()\n this.pendingServerRequests.clear()\n this.process = null\n this.initialized = false\n this.initializePromise = null\n this.readBuffer = ''\n })\n }\n\n private sendLine(payload: Record<string, unknown>): void {\n if (!this.process) {\n throw new Error('codex app-server is not running')\n }\n\n this.process.stdin.write(`${JSON.stringify(payload)}\\n`)\n }\n\n private handleLine(line: string): void {\n let message: JsonRpcResponse\n try {\n message = JSON.parse(line) as JsonRpcResponse\n } catch {\n return\n }\n\n if (typeof message.id === 'number' && this.pending.has(message.id)) {\n const pendingRequest = this.pending.get(message.id)\n this.pending.delete(message.id)\n\n if (!pendingRequest) return\n\n if (message.error) {\n pendingRequest.reject(new Error(message.error.message))\n } else {\n pendingRequest.resolve(message.result)\n }\n return\n }\n\n if (typeof message.method === 'string' && typeof message.id !== 'number') {\n this.emitNotification({\n method: message.method,\n params: message.params ?? null,\n })\n return\n }\n\n // Handle server-initiated JSON-RPC requests (approvals, dynamic tool calls, etc.).\n if (typeof message.id === 'number' && typeof message.method === 'string') {\n this.handleServerRequest(message.id, message.method, message.params ?? null)\n }\n }\n\n private emitNotification(notification: { method: string; params: unknown }): void {\n for (const listener of this.notificationListeners) {\n listener(notification)\n }\n }\n\n private sendServerRequestReply(requestId: number, reply: ServerRequestReply): void {\n if (reply.error) {\n this.sendLine({\n jsonrpc: '2.0',\n id: requestId,\n error: reply.error,\n })\n return\n }\n\n this.sendLine({\n jsonrpc: '2.0',\n id: requestId,\n result: reply.result ?? {},\n })\n }\n\n private resolvePendingServerRequest(requestId: number, reply: ServerRequestReply): void {\n const pendingRequest = this.pendingServerRequests.get(requestId)\n if (!pendingRequest) {\n throw new Error(`No pending server request found for id ${String(requestId)}`)\n }\n this.pendingServerRequests.delete(requestId)\n\n this.sendServerRequestReply(requestId, reply)\n const requestParams = asRecord(pendingRequest.params)\n const threadId =\n typeof requestParams?.threadId === 'string' && requestParams.threadId.length > 0\n ? requestParams.threadId\n : ''\n this.emitNotification({\n method: 'server/request/resolved',\n params: {\n id: requestId,\n method: pendingRequest.method,\n threadId,\n mode: 'manual',\n resolvedAtIso: new Date().toISOString(),\n },\n })\n }\n\n private handleServerRequest(requestId: number, method: string, params: unknown): void {\n const pendingRequest: PendingServerRequest = {\n id: requestId,\n method,\n params,\n receivedAtIso: new Date().toISOString(),\n }\n this.pendingServerRequests.set(requestId, pendingRequest)\n\n this.emitNotification({\n method: 'server/request',\n params: pendingRequest,\n })\n }\n\n private async call(method: string, params: unknown): Promise<unknown> {\n this.start()\n const id = this.nextId++\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject })\n\n this.sendLine({\n jsonrpc: '2.0',\n id,\n method,\n params,\n } satisfies JsonRpcCall)\n })\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return\n if (this.initializePromise) {\n await this.initializePromise\n return\n }\n\n this.initializePromise = this.call('initialize', {\n clientInfo: {\n name: 'codex-web-local',\n version: '0.1.0',\n },\n }).then(() => {\n this.initialized = true\n }).finally(() => {\n this.initializePromise = null\n })\n\n await this.initializePromise\n }\n\n async rpc(method: string, params: unknown): Promise<unknown> {\n await this.ensureInitialized()\n return this.call(method, params)\n }\n\n onNotification(listener: (value: { method: string; params: unknown }) => void): () => void {\n this.notificationListeners.add(listener)\n return () => {\n this.notificationListeners.delete(listener)\n }\n }\n\n async respondToServerRequest(payload: unknown): Promise<void> {\n await this.ensureInitialized()\n\n const body = asRecord(payload)\n if (!body) {\n throw new Error('Invalid response payload: expected object')\n }\n\n const id = body.id\n if (typeof id !== 'number' || !Number.isInteger(id)) {\n throw new Error('Invalid response payload: \"id\" must be an integer')\n }\n\n const rawError = asRecord(body.error)\n if (rawError) {\n const message = typeof rawError.message === 'string' && rawError.message.trim().length > 0\n ? rawError.message.trim()\n : 'Server request rejected by client'\n const code = typeof rawError.code === 'number' && Number.isFinite(rawError.code)\n ? Math.trunc(rawError.code)\n : -32000\n this.resolvePendingServerRequest(id, { error: { code, message } })\n return\n }\n\n if (!('result' in body)) {\n throw new Error('Invalid response payload: expected \"result\" or \"error\"')\n }\n\n this.resolvePendingServerRequest(id, { result: body.result })\n }\n\n listPendingServerRequests(): PendingServerRequest[] {\n return Array.from(this.pendingServerRequests.values())\n }\n\n dispose(): void {\n if (!this.process) return\n\n const proc = this.process\n this.stopping = true\n this.process = null\n this.initialized = false\n this.initializePromise = null\n this.readBuffer = ''\n\n const failure = new Error('codex app-server stopped')\n for (const request of this.pending.values()) {\n request.reject(failure)\n }\n this.pending.clear()\n this.pendingServerRequests.clear()\n\n try {\n proc.stdin.end()\n } catch {\n // ignore close errors on shutdown\n }\n\n try {\n proc.kill('SIGTERM')\n } catch {\n // ignore kill errors on shutdown\n }\n\n const forceKillTimer = setTimeout(() => {\n if (!proc.killed) {\n try {\n proc.kill('SIGKILL')\n } catch {\n // ignore kill errors on shutdown\n }\n }\n }, 1500)\n forceKillTimer.unref()\n }\n}\n\nclass MethodCatalog {\n private methodCache: string[] | null = null\n private notificationCache: string[] | null = null\n\n private async runGenerateSchemaCommand(outDir: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const process = spawn('codex', ['app-server', 'generate-json-schema', '--out', outDir], {\n stdio: ['ignore', 'ignore', 'pipe'],\n })\n\n let stderr = ''\n\n process.stderr.setEncoding('utf8')\n process.stderr.on('data', (chunk: string) => {\n stderr += chunk\n })\n\n process.on('error', reject)\n process.on('exit', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(stderr.trim() || `generate-json-schema exited with code ${String(code)}`))\n })\n })\n }\n\n private extractMethodsFromClientRequest(payload: unknown): string[] {\n const root = asRecord(payload)\n const oneOf = Array.isArray(root?.oneOf) ? root.oneOf : []\n const methods = new Set<string>()\n\n for (const entry of oneOf) {\n const row = asRecord(entry)\n const properties = asRecord(row?.properties)\n const methodDef = asRecord(properties?.method)\n const methodEnum = Array.isArray(methodDef?.enum) ? methodDef.enum : []\n\n for (const item of methodEnum) {\n if (typeof item === 'string' && item.length > 0) {\n methods.add(item)\n }\n }\n }\n\n return Array.from(methods).sort((a, b) => a.localeCompare(b))\n }\n\n private extractMethodsFromServerNotification(payload: unknown): string[] {\n const root = asRecord(payload)\n const oneOf = Array.isArray(root?.oneOf) ? root.oneOf : []\n const methods = new Set<string>()\n\n for (const entry of oneOf) {\n const row = asRecord(entry)\n const properties = asRecord(row?.properties)\n const methodDef = asRecord(properties?.method)\n const methodEnum = Array.isArray(methodDef?.enum) ? methodDef.enum : []\n\n for (const item of methodEnum) {\n if (typeof item === 'string' && item.length > 0) {\n methods.add(item)\n }\n }\n }\n\n return Array.from(methods).sort((a, b) => a.localeCompare(b))\n }\n\n async listMethods(): Promise<string[]> {\n if (this.methodCache) {\n return this.methodCache\n }\n\n const outDir = await mkdtemp(join(tmpdir(), 'codex-web-local-schema-'))\n await this.runGenerateSchemaCommand(outDir)\n\n const clientRequestPath = join(outDir, 'ClientRequest.json')\n const raw = await readFile(clientRequestPath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const methods = this.extractMethodsFromClientRequest(parsed)\n\n this.methodCache = methods\n return methods\n }\n\n async listNotificationMethods(): Promise<string[]> {\n if (this.notificationCache) {\n return this.notificationCache\n }\n\n const outDir = await mkdtemp(join(tmpdir(), 'codex-web-local-schema-'))\n await this.runGenerateSchemaCommand(outDir)\n\n const serverNotificationPath = join(outDir, 'ServerNotification.json')\n const raw = await readFile(serverNotificationPath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const methods = this.extractMethodsFromServerNotification(parsed)\n\n this.notificationCache = methods\n return methods\n }\n}\n\ntype CodexBridgeMiddleware = ((req: IncomingMessage, res: ServerResponse, next: () => void) => Promise<void>) & {\n dispose: () => void\n subscribeNotifications: (listener: (value: { method: string; params: unknown; atIso: string }) => void) => () => void\n}\n\ntype SharedBridgeState = {\n appServer: AppServerProcess\n methodCatalog: MethodCatalog\n}\n\nconst SHARED_BRIDGE_KEY = '__codexRemoteSharedBridge__'\n\nfunction getSharedBridgeState(): SharedBridgeState {\n const globalScope = globalThis as typeof globalThis & {\n [SHARED_BRIDGE_KEY]?: SharedBridgeState\n }\n\n const existing = globalScope[SHARED_BRIDGE_KEY]\n if (existing) return existing\n\n const created: SharedBridgeState = {\n appServer: new AppServerProcess(),\n methodCatalog: new MethodCatalog(),\n }\n globalScope[SHARED_BRIDGE_KEY] = created\n return created\n}\n\nasync function loadAllThreadsForSearch(appServer: AppServerProcess): Promise<ThreadSearchDocument[]> {\n const threads: Array<{ id: string; title: string; preview: string }> = []\n let cursor: string | null = null\n\n do {\n const response = asRecord(await appServer.rpc('thread/list', {\n archived: false,\n limit: 100,\n sortKey: 'updated_at',\n cursor,\n }))\n const data = Array.isArray(response?.data) ? response.data : []\n for (const row of data) {\n const record = asRecord(row)\n const id = typeof record?.id === 'string' ? record.id : ''\n if (!id) continue\n const title = typeof record?.name === 'string' && record.name.trim().length > 0\n ? record.name.trim()\n : (typeof record?.preview === 'string' && record.preview.trim().length > 0 ? record.preview.trim() : 'Untitled thread')\n const preview = typeof record?.preview === 'string' ? record.preview : ''\n threads.push({ id, title, preview })\n }\n cursor = typeof response?.nextCursor === 'string' && response.nextCursor.length > 0 ? response.nextCursor : null\n } while (cursor)\n\n const docs: ThreadSearchDocument[] = []\n const concurrency = 4\n for (let offset = 0; offset < threads.length; offset += concurrency) {\n const batch = threads.slice(offset, offset + concurrency)\n const loaded = await Promise.all(batch.map(async (thread) => {\n try {\n const readResponse = await appServer.rpc('thread/read', {\n threadId: thread.id,\n includeTurns: true,\n })\n const messageText = extractThreadMessageText(readResponse)\n const searchableText = [thread.title, thread.preview, messageText].filter(Boolean).join('\\n')\n return {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText,\n searchableText,\n } satisfies ThreadSearchDocument\n } catch {\n const searchableText = [thread.title, thread.preview].filter(Boolean).join('\\n')\n return {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText: '',\n searchableText,\n } satisfies ThreadSearchDocument\n }\n }))\n docs.push(...loaded)\n }\n\n return docs\n}\n\nasync function buildThreadSearchIndex(appServer: AppServerProcess): Promise<ThreadSearchIndex> {\n const docs = await loadAllThreadsForSearch(appServer)\n const docsById = new Map<string, ThreadSearchDocument>(docs.map((doc) => [doc.id, doc]))\n return { docsById }\n}\n\nexport function createCodexBridgeMiddleware(): CodexBridgeMiddleware {\n const { appServer, methodCatalog } = getSharedBridgeState()\n let threadSearchIndex: ThreadSearchIndex | null = null\n let threadSearchIndexPromise: Promise<ThreadSearchIndex> | null = null\n\n async function getThreadSearchIndex(): Promise<ThreadSearchIndex> {\n if (threadSearchIndex) return threadSearchIndex\n if (!threadSearchIndexPromise) {\n threadSearchIndexPromise = buildThreadSearchIndex(appServer)\n .then((index) => {\n threadSearchIndex = index\n return index\n })\n .finally(() => {\n threadSearchIndexPromise = null\n })\n }\n return threadSearchIndexPromise\n }\n void initializeSkillsSyncOnStartup(appServer)\n\n const middleware = async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n try {\n if (!req.url) {\n next()\n return\n }\n\n const url = new URL(req.url, 'http://localhost')\n\n if (await handleSkillsRoutes(req, res, url, { appServer, readJsonBody })) {\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/upload-file') {\n handleFileUpload(req, res)\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/rpc') {\n const payload = await readJsonBody(req)\n const body = asRecord(payload) as RpcProxyRequest | null\n\n if (!body || typeof body.method !== 'string' || body.method.length === 0) {\n setJson(res, 400, { error: 'Invalid body: expected { method, params? }' })\n return\n }\n\n const result = await appServer.rpc(body.method, body.params ?? null)\n setJson(res, 200, { result })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/transcribe') {\n const auth = await readCodexAuth()\n if (!auth) {\n setJson(res, 401, { error: 'No auth token available for transcription' })\n return\n }\n\n const rawBody = await readRawBody(req)\n const incomingCt = req.headers['content-type'] ?? 'application/octet-stream'\n const upstream = await proxyTranscribe(rawBody, incomingCt, auth.accessToken, auth.accountId)\n\n res.statusCode = upstream.status\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(upstream.body)\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/server-requests/respond') {\n const payload = await readJsonBody(req)\n await appServer.respondToServerRequest(payload)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/server-requests/pending') {\n setJson(res, 200, { data: appServer.listPendingServerRequests() })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/meta/methods') {\n const methods = await methodCatalog.listMethods()\n setJson(res, 200, { data: methods })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/meta/notifications') {\n const methods = await methodCatalog.listNotificationMethods()\n setJson(res, 200, { data: methods })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/workspace-roots-state') {\n const state = await readWorkspaceRootsState()\n setJson(res, 200, { data: state })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/home-directory') {\n setJson(res, 200, { data: { path: homedir() } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/worktree/create') {\n const payload = asRecord(await readJsonBody(req))\n const rawSourceCwd = typeof payload?.sourceCwd === 'string' ? payload.sourceCwd.trim() : ''\n if (!rawSourceCwd) {\n setJson(res, 400, { error: 'Missing sourceCwd' })\n return\n }\n\n const sourceCwd = isAbsolute(rawSourceCwd) ? rawSourceCwd : resolve(rawSourceCwd)\n try {\n const sourceInfo = await stat(sourceCwd)\n if (!sourceInfo.isDirectory()) {\n setJson(res, 400, { error: 'sourceCwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'sourceCwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n await runCommand('git', ['init'], { cwd: sourceCwd })\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n }\n const repoName = basename(gitRoot) || 'repo'\n const worktreesRoot = join(getCodexHomeDir(), 'worktrees')\n await mkdir(worktreesRoot, { recursive: true })\n\n // Match Codex desktop layout so project grouping resolves to repo name:\n // ~/.codex/worktrees/<id>/<repoName>\n let worktreeId = ''\n let worktreeParent = ''\n let worktreeCwd = ''\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = randomBytes(2).toString('hex')\n const parent = join(worktreesRoot, candidate)\n try {\n await stat(parent)\n continue\n } catch {\n worktreeId = candidate\n worktreeParent = parent\n worktreeCwd = join(parent, repoName)\n break\n }\n }\n if (!worktreeId || !worktreeParent || !worktreeCwd) {\n throw new Error('Failed to allocate a unique worktree id')\n }\n const branch = `codex/${worktreeId}`\n\n await mkdir(worktreeParent, { recursive: true })\n try {\n await runCommand('git', ['worktree', 'add', '-b', branch, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) throw error\n await ensureRepoHasInitialCommit(gitRoot)\n await runCommand('git', ['worktree', 'add', '-b', branch, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n }\n\n setJson(res, 200, {\n data: {\n cwd: worktreeCwd,\n branch,\n gitRoot,\n },\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to create worktree') })\n }\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/workspace-roots-state') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n const nextState: WorkspaceRootsState = {\n order: normalizeStringArray(record.order),\n labels: normalizeStringRecord(record.labels),\n active: normalizeStringArray(record.active),\n }\n await writeWorkspaceRootsState(nextState)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/project-root') {\n const payload = asRecord(await readJsonBody(req))\n const rawPath = typeof payload?.path === 'string' ? payload.path.trim() : ''\n const createIfMissing = payload?.createIfMissing === true\n const label = typeof payload?.label === 'string' ? payload.label : ''\n if (!rawPath) {\n setJson(res, 400, { error: 'Missing path' })\n return\n }\n\n const normalizedPath = isAbsolute(rawPath) ? rawPath : resolve(rawPath)\n let pathExists = true\n try {\n const info = await stat(normalizedPath)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'Path exists but is not a directory' })\n return\n }\n } catch {\n pathExists = false\n }\n\n if (!pathExists && createIfMissing) {\n await mkdir(normalizedPath, { recursive: true })\n } else if (!pathExists) {\n setJson(res, 404, { error: 'Directory does not exist' })\n return\n }\n\n const existingState = await readWorkspaceRootsState()\n const nextOrder = [normalizedPath, ...existingState.order.filter((item) => item !== normalizedPath)]\n const nextActive = [normalizedPath, ...existingState.active.filter((item) => item !== normalizedPath)]\n const nextLabels = { ...existingState.labels }\n if (label.trim().length > 0) {\n nextLabels[normalizedPath] = label.trim()\n }\n await writeWorkspaceRootsState({\n order: nextOrder,\n labels: nextLabels,\n active: nextActive,\n })\n setJson(res, 200, { data: { path: normalizedPath } })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/project-root-suggestion') {\n const basePath = url.searchParams.get('basePath')?.trim() ?? ''\n if (!basePath) {\n setJson(res, 400, { error: 'Missing basePath' })\n return\n }\n const normalizedBasePath = isAbsolute(basePath) ? basePath : resolve(basePath)\n try {\n const baseInfo = await stat(normalizedBasePath)\n if (!baseInfo.isDirectory()) {\n setJson(res, 400, { error: 'basePath is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'basePath does not exist' })\n return\n }\n\n let index = 1\n while (index < 100000) {\n const candidateName = `New Project (${String(index)})`\n const candidatePath = join(normalizedBasePath, candidateName)\n try {\n await stat(candidatePath)\n index += 1\n continue\n } catch {\n setJson(res, 200, { data: { name: candidateName, path: candidatePath } })\n return\n }\n }\n\n setJson(res, 500, { error: 'Failed to compute project name suggestion' })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composer-file-search') {\n const payload = asRecord(await readJsonBody(req))\n const rawCwd = typeof payload?.cwd === 'string' ? payload.cwd.trim() : ''\n const query = typeof payload?.query === 'string' ? payload.query.trim() : ''\n const limitRaw = typeof payload?.limit === 'number' ? payload.limit : 20\n const limit = Math.max(1, Math.min(100, Math.floor(limitRaw)))\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const info = await stat(cwd)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n const files = await listFilesWithRipgrep(cwd)\n const scored = files\n .map((path) => ({ path, score: scoreFileCandidate(path, query) }))\n .filter((row) => query.length === 0 || row.score < 10)\n .sort((a, b) => (a.score - b.score) || a.path.localeCompare(b.path))\n .slice(0, limit)\n .map((row) => ({ path: row.path }))\n setJson(res, 200, { data: scored })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to search files') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-titles') {\n const cache = await readThreadTitleCache()\n setJson(res, 200, { data: cache })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-search') {\n const payload = asRecord(await readJsonBody(req))\n const query = typeof payload?.query === 'string' ? payload.query.trim() : ''\n const limitRaw = typeof payload?.limit === 'number' ? payload.limit : 200\n const limit = Math.max(1, Math.min(1000, Math.floor(limitRaw)))\n if (!query) {\n setJson(res, 200, { data: { threadIds: [], indexedThreadCount: 0 } })\n return\n }\n\n const index = await getThreadSearchIndex()\n const matchedIds = Array.from(index.docsById.entries())\n .filter(([, doc]) => isExactPhraseMatch(query, doc))\n .slice(0, limit)\n .map(([id]) => id)\n\n setJson(res, 200, { data: { threadIds: matchedIds, indexedThreadCount: index.docsById.size } })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-titles') {\n const payload = asRecord(await readJsonBody(req))\n const id = typeof payload?.id === 'string' ? payload.id : ''\n const title = typeof payload?.title === 'string' ? payload.title : ''\n if (!id) {\n setJson(res, 400, { error: 'Missing id' })\n return\n }\n const cache = await readThreadTitleCache()\n const next = title ? updateThreadTitleCache(cache, id, title) : removeFromThreadTitleCache(cache, id)\n await writeThreadTitleCache(next)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/events') {\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/event-stream; charset=utf-8')\n res.setHeader('Cache-Control', 'no-cache, no-transform')\n res.setHeader('Connection', 'keep-alive')\n res.setHeader('X-Accel-Buffering', 'no')\n\n const unsubscribe = middleware.subscribeNotifications((notification: { method: string; params: unknown; atIso: string }) => {\n if (res.writableEnded || res.destroyed) return\n res.write(`data: ${JSON.stringify(notification)}\\n\\n`)\n })\n\n res.write(`event: ready\\ndata: ${JSON.stringify({ ok: true })}\\n\\n`)\n const keepAlive = setInterval(() => {\n res.write(': ping\\n\\n')\n }, 15000)\n\n const close = () => {\n clearInterval(keepAlive)\n unsubscribe()\n if (!res.writableEnded) {\n res.end()\n }\n }\n\n req.on('close', close)\n req.on('aborted', close)\n return\n }\n\n next()\n } catch (error) {\n const message = getErrorMessage(error, 'Unknown bridge error')\n setJson(res, 502, { error: message })\n }\n }\n\n middleware.dispose = () => {\n threadSearchIndex = null\n appServer.dispose()\n }\n middleware.subscribeNotifications = (\n listener: (value: { method: string; params: unknown; atIso: string }) => void,\n ) => {\n return appServer.onNotification((notification: { method: string; params: unknown }) => {\n listener({\n ...notification,\n atIso: new Date().toISOString(),\n })\n })\n }\n\n return middleware\n}\n","import { spawn } from 'node:child_process'\nimport { mkdtemp, readFile, readdir, rm, mkdir, stat, lstat, readlink, symlink } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { writeFile } from 'node:fs/promises'\n\ntype AppServerLike = {\n rpc(method: string, params: unknown): Promise<unknown>\n}\n\ntype ReadJsonBody = (req: IncomingMessage) => Promise<unknown>\n\ntype SkillRouteContext = {\n appServer: AppServerLike\n readJsonBody: ReadJsonBody\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n const record = asRecord(payload)\n if (!record) return fallback\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string } = {}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nasync function runCommandWithOutput(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nasync function detectUserSkillsDir(appServer: AppServerLike): Promise<string> {\n try {\n const result = (await appServer.rpc('skills/list', {})) as {\n data?: Array<{ skills?: Array<{ scope?: string; path?: string }> }>\n }\n for (const entry of result.data ?? []) {\n for (const skill of entry.skills ?? []) {\n if (skill.scope !== 'user' || !skill.path) continue\n const parts = skill.path.split('/').filter(Boolean)\n if (parts.length < 2) continue\n return `/${parts.slice(0, -2).join('/')}`\n }\n }\n } catch {}\n return getSkillsInstallDir()\n}\n\nasync function ensureInstalledSkillIsValid(appServer: AppServerLike, skillPath: string): Promise<void> {\n const result = (await appServer.rpc('skills/list', { forceReload: true })) as {\n data?: Array<{ errors?: Array<{ path?: string; message?: string }> }>\n }\n const normalized = skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`\n for (const entry of result.data ?? []) {\n for (const error of entry.errors ?? []) {\n if (error.path === normalized) {\n throw new Error(error.message || 'Installed skill is invalid')\n }\n }\n }\n}\n\ntype SkillHubEntry = {\n name: string\n owner: string\n description: string\n displayName: string\n publishedAt: number\n avatarUrl: string\n url: string\n installed: boolean\n path?: string\n enabled?: boolean\n}\n\ntype SkillsTreeEntry = {\n name: string\n owner: string\n url: string\n}\n\ntype SkillsTreeCache = {\n entries: SkillsTreeEntry[]\n fetchedAt: number\n}\n\ntype MetaJson = {\n displayName?: string\n owner?: string\n slug?: string\n latest?: { publishedAt?: number }\n}\n\nconst TREE_CACHE_TTL_MS = 5 * 60 * 1000\nlet skillsTreeCache: SkillsTreeCache | null = null\nconst metaCache = new Map<string, { description: string; displayName: string; publishedAt: number }>()\n\nasync function getGhToken(): Promise<string | null> {\n try {\n const proc = spawn('gh', ['auth', 'token'], { stdio: ['ignore', 'pipe', 'ignore'] })\n let out = ''\n proc.stdout.on('data', (d: Buffer) => { out += d.toString() })\n return new Promise((resolve) => {\n proc.on('close', (code) => resolve(code === 0 ? out.trim() : null))\n proc.on('error', () => resolve(null))\n })\n } catch {\n return null\n }\n}\n\nasync function ghFetch(url: string): Promise<Response> {\n const token = await getGhToken()\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'codex-web-local',\n }\n if (token) headers.Authorization = `Bearer ${token}`\n return fetch(url, { headers })\n}\n\nasync function fetchSkillsTree(): Promise<SkillsTreeEntry[]> {\n if (skillsTreeCache && Date.now() - skillsTreeCache.fetchedAt < TREE_CACHE_TTL_MS) {\n return skillsTreeCache.entries\n }\n\n const resp = await ghFetch(`https://api.github.com/repos/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/git/trees/main?recursive=1`)\n if (!resp.ok) throw new Error(`GitHub tree API returned ${resp.status}`)\n const data = (await resp.json()) as { tree?: Array<{ path: string; type: string }> }\n\n const metaPattern = /^skills\\/([^/]+)\\/([^/]+)\\/_meta\\.json$/\n const seen = new Set<string>()\n const entries: SkillsTreeEntry[] = []\n\n for (const node of data.tree ?? []) {\n const match = metaPattern.exec(node.path)\n if (!match) continue\n const [, owner, skillName] = match\n const key = `${owner}/${skillName}`\n if (seen.has(key)) continue\n seen.add(key)\n entries.push({\n name: skillName,\n owner,\n url: `https://github.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/tree/main/skills/${owner}/${skillName}`,\n })\n }\n\n skillsTreeCache = { entries, fetchedAt: Date.now() }\n return entries\n}\n\nasync function fetchMetaBatch(entries: SkillsTreeEntry[]): Promise<void> {\n const toFetch = entries.filter((e) => !metaCache.has(`${e.owner}/${e.name}`))\n if (toFetch.length === 0) return\n const batch = toFetch.slice(0, 50)\n await Promise.allSettled(\n batch.map(async (e) => {\n const rawUrl = `https://raw.githubusercontent.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/main/skills/${e.owner}/${e.name}/_meta.json`\n const resp = await fetch(rawUrl)\n if (!resp.ok) return\n const meta = (await resp.json()) as MetaJson\n metaCache.set(`${e.owner}/${e.name}`, {\n displayName: typeof meta.displayName === 'string' ? meta.displayName : '',\n description: typeof meta.displayName === 'string' ? meta.displayName : '',\n publishedAt: meta.latest?.publishedAt ?? 0,\n })\n }),\n )\n}\n\nfunction buildHubEntry(e: SkillsTreeEntry): SkillHubEntry {\n const cached = metaCache.get(`${e.owner}/${e.name}`)\n return {\n name: e.name,\n owner: e.owner,\n description: cached?.description ?? '',\n displayName: cached?.displayName ?? '',\n publishedAt: cached?.publishedAt ?? 0,\n avatarUrl: `https://github.com/${e.owner}.png?size=40`,\n url: e.url,\n installed: false,\n }\n}\n\ntype InstalledSkillInfo = { name: string; path: string; enabled: boolean }\ntype SyncedSkill = { owner?: string; name: string; enabled: boolean }\n\ntype SkillsSyncState = {\n githubToken?: string\n githubUsername?: string\n repoOwner?: string\n repoName?: string\n installedOwners?: Record<string, string>\n}\n\ntype GithubDeviceCodeResponse = {\n device_code: string\n user_code: string\n verification_uri: string\n expires_in: number\n interval: number\n}\n\ntype GithubTokenResponse = { access_token?: string; error?: string }\n\nconst GITHUB_DEVICE_CLIENT_ID = 'Iv1.b507a08c87ecfe98'\nconst DEFAULT_SKILLS_SYNC_REPO_NAME = 'codexskills'\nconst SKILLS_SYNC_MANIFEST_PATH = 'installed-skills.json'\nconst SYNC_UPSTREAM_SKILLS_OWNER = 'OpenClawAndroid'\nconst SYNC_UPSTREAM_SKILLS_REPO = 'skills'\nconst HUB_SKILLS_OWNER = 'openclaw'\nconst HUB_SKILLS_REPO = 'skills'\nlet startupSkillsSyncInitialized = false\n\ntype StartupSyncStatus = {\n inProgress: boolean\n mode: 'unauthenticated-bootstrap' | 'authenticated-fork-sync' | 'idle'\n branch: string\n lastAction: string\n lastRunAtIso: string\n lastSuccessAtIso: string\n lastError: string\n}\n\nconst startupSyncStatus: StartupSyncStatus = {\n inProgress: false,\n mode: 'idle',\n branch: getPreferredSyncBranch(),\n lastAction: 'not-started',\n lastRunAtIso: '',\n lastSuccessAtIso: '',\n lastError: '',\n}\n\nasync function scanInstalledSkillsFromDisk(): Promise<Map<string, InstalledSkillInfo>> {\n const map = new Map<string, InstalledSkillInfo>()\n const skillsDir = getSkillsInstallDir()\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true })\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) continue\n const skillMd = join(skillsDir, entry.name, 'SKILL.md')\n try {\n await stat(skillMd)\n map.set(entry.name, { name: entry.name, path: skillMd, enabled: true })\n } catch {}\n }\n } catch {}\n return map\n}\n\nfunction getSkillsSyncStatePath(): string {\n return join(getCodexHomeDir(), 'skills-sync.json')\n}\n\nasync function readSkillsSyncState(): Promise<SkillsSyncState> {\n try {\n const raw = await readFile(getSkillsSyncStatePath(), 'utf8')\n const parsed = JSON.parse(raw) as SkillsSyncState\n return parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n return {}\n }\n}\n\nasync function writeSkillsSyncState(state: SkillsSyncState): Promise<void> {\n await writeFile(getSkillsSyncStatePath(), JSON.stringify(state), 'utf8')\n}\n\nasync function getGithubJson<T>(url: string, token: string, method = 'GET', body?: unknown): Promise<T> {\n const resp = await fetch(url, {\n method,\n headers: {\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n if (!resp.ok) {\n const text = await resp.text()\n throw new Error(`GitHub API ${method} ${url} failed (${resp.status}): ${text}`)\n }\n return await resp.json() as T\n}\n\nasync function startGithubDeviceLogin(): Promise<GithubDeviceCodeResponse> {\n const resp = await fetch('https://github.com/login/device/code', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'codex-web-local',\n },\n body: new URLSearchParams({\n client_id: GITHUB_DEVICE_CLIENT_ID,\n scope: 'repo read:user',\n }),\n })\n if (!resp.ok) {\n throw new Error(`GitHub device flow init failed (${resp.status})`)\n }\n return await resp.json() as GithubDeviceCodeResponse\n}\n\nasync function completeGithubDeviceLogin(deviceCode: string): Promise<{ token: string | null; error: string | null }> {\n const resp = await fetch('https://github.com/login/oauth/access_token', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'codex-web-local',\n },\n body: new URLSearchParams({\n client_id: GITHUB_DEVICE_CLIENT_ID,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n })\n if (!resp.ok) {\n throw new Error(`GitHub token exchange failed (${resp.status})`)\n }\n const payload = await resp.json() as GithubTokenResponse\n if (!payload.access_token) return { token: null, error: payload.error || 'unknown_error' }\n return { token: payload.access_token, error: null }\n}\n\nfunction isAndroidLikeRuntime(): boolean {\n if (process.platform === 'android') return true\n if (existsSync('/data/data/com.termux')) return true\n if (process.env.TERMUX_VERSION) return true\n const prefix = process.env.PREFIX?.toLowerCase() ?? ''\n if (prefix.includes('/com.termux/')) return true\n const proot = process.env.PROOT_TMP_DIR?.toLowerCase() ?? ''\n return proot.length > 0\n}\n\nfunction getPreferredSyncBranch(): string {\n return isAndroidLikeRuntime() ? 'android' : 'main'\n}\n\nfunction isUpstreamSkillsRepo(repoOwner: string, repoName: string): boolean {\n return repoOwner.toLowerCase() === SYNC_UPSTREAM_SKILLS_OWNER.toLowerCase()\n && repoName.toLowerCase() === SYNC_UPSTREAM_SKILLS_REPO.toLowerCase()\n}\n\nasync function resolveGithubUsername(token: string): Promise<string> {\n const user = await getGithubJson<{ login: string }>('https://api.github.com/user', token)\n return user.login\n}\n\nasync function ensurePrivateForkFromUpstream(token: string, username: string, repoName: string): Promise<void> {\n const repoUrl = `https://api.github.com/repos/${username}/${repoName}`\n let created = false\n const existing = await fetch(repoUrl, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (existing.ok) {\n const details = await existing.json() as { private?: boolean }\n if (details.private === true) return\n await getGithubJson(repoUrl, token, 'PATCH', { private: true })\n return\n }\n if (existing.status !== 404) {\n throw new Error(`Failed to check personal repo existence (${existing.status})`)\n }\n\n await getGithubJson(\n 'https://api.github.com/user/repos',\n token,\n 'POST',\n { name: repoName, private: true, auto_init: false, description: 'Codex skills private mirror sync' },\n )\n created = true\n\n let ready = false\n for (let i = 0; i < 20; i++) {\n const check = await fetch(repoUrl, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (check.ok) {\n ready = true\n break\n }\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n if (!ready) throw new Error('Private mirror repo was created but is not available yet')\n if (!created) return\n\n const tmp = await mkdtemp(join(tmpdir(), 'codex-skills-seed-'))\n try {\n const upstreamUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n const branch = getPreferredSyncBranch()\n try {\n await runCommand('git', ['clone', '--depth', '1', '--single-branch', '--branch', branch, upstreamUrl, tmp])\n } catch {\n await runCommand('git', ['clone', '--depth', '1', upstreamUrl, tmp])\n }\n const privateRemote = toGitHubTokenRemote(username, repoName, token)\n await runCommand('git', ['remote', 'set-url', 'origin', privateRemote], { cwd: tmp })\n try { await runCommand('git', ['checkout', '-B', branch], { cwd: tmp }) } catch {}\n await runCommand('git', ['push', '-u', 'origin', `HEAD:${branch}`], { cwd: tmp })\n } finally {\n await rm(tmp, { recursive: true, force: true })\n }\n}\n\nasync function readRemoteSkillsManifest(token: string, repoOwner: string, repoName: string): Promise<SyncedSkill[]> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n const resp = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (resp.status === 404) return []\n if (!resp.ok) throw new Error(`Failed to read remote manifest (${resp.status})`)\n const payload = await resp.json() as { content?: string }\n const content = payload.content ? Buffer.from(payload.content.replace(/\\n/g, ''), 'base64').toString('utf8') : '[]'\n const parsed = JSON.parse(content) as unknown\n if (!Array.isArray(parsed)) return []\n const skills: SyncedSkill[] = []\n for (const row of parsed) {\n const item = asRecord(row)\n const owner = typeof item?.owner === 'string' ? item.owner : ''\n const name = typeof item?.name === 'string' ? item.name : ''\n if (!name) continue\n skills.push({ ...(owner ? { owner } : {}), name, enabled: item?.enabled !== false })\n }\n return skills\n}\n\nasync function writeRemoteSkillsManifest(token: string, repoOwner: string, repoName: string, skills: SyncedSkill[]): Promise<void> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n let sha = ''\n const existing = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (existing.ok) {\n const payload = await existing.json() as { sha?: string }\n sha = payload.sha ?? ''\n }\n const content = Buffer.from(JSON.stringify(skills, null, 2), 'utf8').toString('base64')\n await getGithubJson(url, token, 'PUT', {\n message: 'Update synced skills manifest',\n content,\n ...(sha ? { sha } : {}),\n })\n}\n\nfunction toGitHubTokenRemote(repoOwner: string, repoName: string, token: string): string {\n return `https://x-access-token:${encodeURIComponent(token)}@github.com/${repoOwner}/${repoName}.git`\n}\n\nasync function ensureSkillsWorkingTreeRepo(repoUrl: string, branch: string): Promise<string> {\n const localDir = getSkillsInstallDir()\n await mkdir(localDir, { recursive: true })\n const gitDir = join(localDir, '.git')\n let hasGitDir = false\n try { hasGitDir = (await stat(gitDir)).isDirectory() } catch { hasGitDir = false }\n\n if (!hasGitDir) {\n await runCommand('git', ['init'], { cwd: localDir })\n await runCommand('git', ['config', 'user.email', 'skills-sync@local'], { cwd: localDir })\n await runCommand('git', ['config', 'user.name', 'Skills Sync'], { cwd: localDir })\n await runCommand('git', ['add', '-A'], { cwd: localDir })\n try { await runCommand('git', ['commit', '-m', 'Local skills snapshot before sync'], { cwd: localDir }) } catch {}\n await runCommand('git', ['branch', '-M', branch], { cwd: localDir })\n try { await runCommand('git', ['remote', 'add', 'origin', repoUrl], { cwd: localDir }) } catch {\n await runCommand('git', ['remote', 'set-url', 'origin', repoUrl], { cwd: localDir })\n }\n await runCommand('git', ['fetch', 'origin'], { cwd: localDir })\n try {\n await runCommand('git', ['merge', '--allow-unrelated-histories', '--no-edit', `origin/${branch}`], { cwd: localDir })\n } catch {}\n return localDir\n }\n\n await runCommand('git', ['remote', 'set-url', 'origin', repoUrl], { cwd: localDir })\n await runCommand('git', ['fetch', 'origin'], { cwd: localDir })\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n try {\n await runCommand('git', ['checkout', branch], { cwd: localDir })\n } catch {\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n await runCommand('git', ['checkout', '-B', branch], { cwd: localDir })\n }\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n const localMtimesBeforePull = await snapshotFileMtimes(localDir)\n try { await runCommand('git', ['stash', 'push', '--include-untracked', '-m', 'codex-skills-autostash'], { cwd: localDir }) } catch {}\n let pulledMtimes = new Map<string, number>()\n try {\n await runCommand('git', ['pull', '--no-rebase', 'origin', branch], { cwd: localDir })\n pulledMtimes = await snapshotFileMtimes(localDir)\n } catch {\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n pulledMtimes = await snapshotFileMtimes(localDir)\n }\n try {\n await runCommand('git', ['stash', 'pop'], { cwd: localDir })\n } catch {\n await resolveStashPopConflictsByFileTime(localDir, localMtimesBeforePull, pulledMtimes)\n }\n return localDir\n}\n\nasync function resolveMergeConflictsByNewerCommit(repoDir: string, branch: string): Promise<void> {\n const unmerged = (await runCommandWithOutput('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: repoDir }))\n .split(/\\r?\\n/)\n .map((row) => row.trim())\n .filter(Boolean)\n if (unmerged.length === 0) return\n for (const path of unmerged) {\n const oursTime = await getCommitTime(repoDir, 'HEAD', path)\n const theirsTime = await getCommitTime(repoDir, `origin/${branch}`, path)\n if (theirsTime > oursTime) {\n await runCommand('git', ['checkout', '--theirs', '--', path], { cwd: repoDir })\n } else {\n await runCommand('git', ['checkout', '--ours', '--', path], { cwd: repoDir })\n }\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const mergeHead = (await runCommandWithOutput('git', ['rev-parse', '-q', '--verify', 'MERGE_HEAD'], { cwd: repoDir })).trim()\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve skills merge by newer file'], { cwd: repoDir })\n }\n}\n\nasync function getCommitTime(repoDir: string, ref: string, path: string): Promise<number> {\n try {\n const output = (await runCommandWithOutput('git', ['log', '-1', '--format=%ct', ref, '--', path], { cwd: repoDir })).trim()\n return output ? Number.parseInt(output, 10) : 0\n } catch {\n return 0\n }\n}\n\nasync function resolveStashPopConflictsByFileTime(\n repoDir: string,\n localMtimesBeforePull: Map<string, number>,\n pulledMtimes: Map<string, number>,\n): Promise<void> {\n const unmerged = (await runCommandWithOutput('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: repoDir }))\n .split(/\\r?\\n/)\n .map((row) => row.trim())\n .filter(Boolean)\n if (unmerged.length === 0) return\n for (const path of unmerged) {\n const localMtime = localMtimesBeforePull.get(path) ?? 0\n const pulledMtime = pulledMtimes.get(path) ?? 0\n const side = localMtime >= pulledMtime ? '--theirs' : '--ours'\n await runCommand('git', ['checkout', side, '--', path], { cwd: repoDir })\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const mergeHead = (await runCommandWithOutput('git', ['rev-parse', '-q', '--verify', 'MERGE_HEAD'], { cwd: repoDir })).trim()\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve stash-pop conflicts by file time'], { cwd: repoDir })\n }\n}\n\nasync function snapshotFileMtimes(dir: string): Promise<Map<string, number>> {\n const mtimes = new Map<string, number>()\n await walkFileMtimes(dir, dir, mtimes)\n return mtimes\n}\n\nasync function walkFileMtimes(rootDir: string, currentDir: string, out: Map<string, number>): Promise<void> {\n let entries: Array<{ name: string | Buffer; isDirectory: () => boolean; isFile: () => boolean }>\n try {\n entries = (await readdir(currentDir, { withFileTypes: true })) as Array<{ name: string | Buffer; isDirectory: () => boolean; isFile: () => boolean }>\n } catch {\n return\n }\n for (const entry of entries) {\n const entryName = String(entry.name)\n if (entryName === '.git') continue\n const absolutePath = join(currentDir, entryName)\n const relativePath = absolutePath.slice(rootDir.length + 1)\n if (entry.isDirectory()) {\n await walkFileMtimes(rootDir, absolutePath, out)\n continue\n }\n if (!entry.isFile()) continue\n try {\n const info = await stat(absolutePath)\n out.set(relativePath, info.mtimeMs)\n } catch {}\n }\n}\n\nasync function syncInstalledSkillsFolderToRepo(\n token: string,\n repoOwner: string,\n repoName: string,\n _installedMap: Map<string, InstalledSkillInfo>,\n): Promise<void> {\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const branch = getPreferredSyncBranch()\n const repoDir = await ensureSkillsWorkingTreeRepo(remoteUrl, branch)\n void _installedMap\n await runCommand('git', ['config', 'user.email', 'skills-sync@local'], { cwd: repoDir })\n await runCommand('git', ['config', 'user.name', 'Skills Sync'], { cwd: repoDir })\n await runCommand('git', ['add', '.'], { cwd: repoDir })\n const status = (await runCommandWithOutput('git', ['status', '--porcelain'], { cwd: repoDir })).trim()\n if (!status) return\n await runCommand('git', ['commit', '-m', 'Sync installed skills folder and manifest'], { cwd: repoDir })\n await runCommand('git', ['push', 'origin', `HEAD:${branch}`], { cwd: repoDir })\n}\n\nasync function pullInstalledSkillsFolderFromRepo(token: string, repoOwner: string, repoName: string): Promise<void> {\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const branch = getPreferredSyncBranch()\n await ensureSkillsWorkingTreeRepo(remoteUrl, branch)\n}\n\nasync function bootstrapSkillsFromUpstreamIntoLocal(): Promise<void> {\n const repoUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n const branch = getPreferredSyncBranch()\n await ensureSkillsWorkingTreeRepo(repoUrl, branch)\n}\n\nasync function collectLocalSyncedSkills(appServer: AppServerLike): Promise<SyncedSkill[]> {\n const state = await readSkillsSyncState()\n const owners = { ...(state.installedOwners ?? {}) }\n const tree = await fetchSkillsTree()\n const uniqueOwnerByName = new Map<string, string>()\n const ambiguousNames = new Set<string>()\n for (const entry of tree) {\n if (ambiguousNames.has(entry.name)) continue\n const existingOwner = uniqueOwnerByName.get(entry.name)\n if (!existingOwner) {\n uniqueOwnerByName.set(entry.name, entry.owner)\n continue\n }\n if (existingOwner !== entry.owner) {\n uniqueOwnerByName.delete(entry.name)\n ambiguousNames.add(entry.name)\n }\n }\n\n const skills = (await appServer.rpc('skills/list', {})) as { data?: Array<{ skills?: Array<{ name?: string; enabled?: boolean }> }> }\n const seen = new Set<string>()\n const synced: SyncedSkill[] = []\n let ownersChanged = false\n for (const entry of skills.data ?? []) {\n for (const skill of entry.skills ?? []) {\n const name = typeof skill.name === 'string' ? skill.name : ''\n if (!name || seen.has(name)) continue\n seen.add(name)\n let owner = owners[name]\n if (!owner) {\n owner = uniqueOwnerByName.get(name) ?? ''\n if (owner) {\n owners[name] = owner\n ownersChanged = true\n }\n }\n synced.push({ ...(owner ? { owner } : {}), name, enabled: skill.enabled !== false })\n }\n }\n if (ownersChanged) {\n await writeSkillsSyncState({ ...state, installedOwners: owners })\n }\n synced.sort((a, b) => `${a.owner ?? ''}/${a.name}`.localeCompare(`${b.owner ?? ''}/${b.name}`))\n return synced\n}\n\nasync function autoPushSyncedSkills(appServer: AppServerLike): Promise<void> {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) return\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n throw new Error('Refusing to push to upstream skills repository')\n }\n const local = await collectLocalSyncedSkills(appServer)\n const installedMap = await scanInstalledSkillsFromDisk()\n await writeRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName, local)\n await syncInstalledSkillsFolderToRepo(state.githubToken, state.repoOwner, state.repoName, installedMap)\n}\n\nasync function ensureCodexAgentsSymlinkToSkillsAgents(): Promise<void> {\n const codexHomeDir = getCodexHomeDir()\n const skillsAgentsPath = join(codexHomeDir, 'skills', 'AGENTS.md')\n const codexAgentsPath = join(codexHomeDir, 'AGENTS.md')\n await mkdir(join(codexHomeDir, 'skills'), { recursive: true })\n let copiedFromCodex = false\n try {\n const codexAgentsStat = await lstat(codexAgentsPath)\n if (codexAgentsStat.isFile() || codexAgentsStat.isSymbolicLink()) {\n const content = await readFile(codexAgentsPath, 'utf8')\n await writeFile(skillsAgentsPath, content, 'utf8')\n copiedFromCodex = true\n } else {\n await rm(codexAgentsPath, { force: true, recursive: true })\n }\n } catch {}\n if (!copiedFromCodex) {\n try {\n const skillsAgentsStat = await stat(skillsAgentsPath)\n if (!skillsAgentsStat.isFile()) {\n await rm(skillsAgentsPath, { force: true, recursive: true })\n await writeFile(skillsAgentsPath, '', 'utf8')\n }\n } catch {\n await writeFile(skillsAgentsPath, '', 'utf8')\n }\n }\n const relativeTarget = join('skills', 'AGENTS.md')\n try {\n const current = await lstat(codexAgentsPath)\n if (current.isSymbolicLink()) {\n const existingTarget = await readlink(codexAgentsPath)\n if (existingTarget === relativeTarget) return\n }\n await rm(codexAgentsPath, { force: true, recursive: true })\n } catch {}\n await symlink(relativeTarget, codexAgentsPath)\n}\n\nexport async function initializeSkillsSyncOnStartup(appServer: AppServerLike): Promise<void> {\n if (startupSkillsSyncInitialized) return\n startupSkillsSyncInitialized = true\n startupSyncStatus.inProgress = true\n startupSyncStatus.lastRunAtIso = new Date().toISOString()\n startupSyncStatus.lastError = ''\n startupSyncStatus.branch = getPreferredSyncBranch()\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken) {\n await ensureCodexAgentsSymlinkToSkillsAgents()\n if (!isAndroidLikeRuntime()) {\n startupSyncStatus.mode = 'idle'\n startupSyncStatus.lastAction = 'skip-upstream-non-android'\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n return\n }\n startupSyncStatus.mode = 'unauthenticated-bootstrap'\n startupSyncStatus.lastAction = 'pull-upstream'\n await bootstrapSkillsFromUpstreamIntoLocal()\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n startupSyncStatus.lastAction = 'pull-upstream-complete'\n return\n }\n startupSyncStatus.mode = 'authenticated-fork-sync'\n startupSyncStatus.lastAction = 'ensure-private-fork'\n const username = state.githubUsername || await resolveGithubUsername(state.githubToken)\n const repoName = DEFAULT_SKILLS_SYNC_REPO_NAME\n await ensurePrivateForkFromUpstream(state.githubToken, username, repoName)\n await writeSkillsSyncState({ ...state, githubUsername: username, repoOwner: username, repoName })\n startupSyncStatus.lastAction = 'pull-private-fork'\n await pullInstalledSkillsFolderFromRepo(state.githubToken, username, repoName)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n startupSyncStatus.lastAction = 'push-private-fork'\n await autoPushSyncedSkills(appServer)\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n startupSyncStatus.lastAction = 'startup-sync-complete'\n } catch (error) {\n startupSyncStatus.lastError = getErrorMessage(error, 'startup-sync-failed')\n startupSyncStatus.lastAction = 'startup-sync-failed'\n } finally {\n startupSyncStatus.inProgress = false\n }\n}\n\nasync function finalizeGithubLoginAndSync(token: string, username: string, appServer: AppServerLike): Promise<void> {\n const repoName = DEFAULT_SKILLS_SYNC_REPO_NAME\n await ensurePrivateForkFromUpstream(token, username, repoName)\n const current = await readSkillsSyncState()\n await writeSkillsSyncState({ ...current, githubToken: token, githubUsername: username, repoOwner: username, repoName })\n await pullInstalledSkillsFolderFromRepo(token, username, repoName)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n await autoPushSyncedSkills(appServer)\n}\n\nasync function searchSkillsHub(\n allEntries: SkillsTreeEntry[],\n query: string,\n limit: number,\n sort: string,\n installedMap: Map<string, InstalledSkillInfo>,\n): Promise<SkillHubEntry[]> {\n const q = query.toLowerCase().trim()\n const filtered = q\n ? allEntries.filter((s) => {\n if (s.name.toLowerCase().includes(q) || s.owner.toLowerCase().includes(q)) return true\n const cached = metaCache.get(`${s.owner}/${s.name}`)\n return Boolean(cached?.displayName?.toLowerCase().includes(q))\n })\n : allEntries\n const page = filtered.slice(0, Math.min(limit * 2, 200))\n await fetchMetaBatch(page)\n let results = page.map(buildHubEntry)\n if (sort === 'date') {\n results.sort((a, b) => b.publishedAt - a.publishedAt)\n } else if (q) {\n results.sort((a, b) => {\n const aExact = a.name.toLowerCase() === q ? 1 : 0\n const bExact = b.name.toLowerCase() === q ? 1 : 0\n if (aExact !== bExact) return bExact - aExact\n return b.publishedAt - a.publishedAt\n })\n }\n return results.slice(0, limit).map((s) => {\n const local = installedMap.get(s.name)\n return local ? { ...s, installed: true, path: local.path, enabled: local.enabled } : s\n })\n}\n\nexport async function handleSkillsRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n context: SkillRouteContext,\n): Promise<boolean> {\n const { appServer, readJsonBody } = context\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub') {\n try {\n const q = url.searchParams.get('q') || ''\n const limit = Math.min(Math.max(parseInt(url.searchParams.get('limit') || '50', 10) || 50, 1), 200)\n const sort = url.searchParams.get('sort') || 'date'\n const allEntries = await fetchSkillsTree()\n\n const installedMap = await scanInstalledSkillsFromDisk()\n try {\n const result = (await appServer.rpc('skills/list', {})) as { data?: Array<{ skills?: Array<{ name?: string; path?: string; enabled?: boolean }> }> }\n for (const entry of result.data ?? []) {\n for (const skill of entry.skills ?? []) {\n if (skill.name) {\n installedMap.set(skill.name, { name: skill.name, path: skill.path ?? '', enabled: skill.enabled !== false })\n }\n }\n }\n } catch {}\n\n const installedHubEntries = allEntries.filter((e) => installedMap.has(e.name))\n await fetchMetaBatch(installedHubEntries)\n\n const installed: SkillHubEntry[] = []\n for (const [, info] of installedMap) {\n const hubEntry = allEntries.find((e) => e.name === info.name)\n const base = hubEntry ? buildHubEntry(hubEntry) : {\n name: info.name, owner: 'local', description: '', displayName: '', publishedAt: 0, avatarUrl: '', url: '', installed: false,\n }\n installed.push({ ...base, installed: true, path: info.path, enabled: info.enabled })\n }\n\n const results = await searchSkillsHub(allEntries, q, limit, sort, installedMap)\n setJson(res, 200, { data: results, installed, total: allEntries.length })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch skills hub') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-sync/status') {\n const state = await readSkillsSyncState()\n setJson(res, 200, {\n data: {\n loggedIn: Boolean(state.githubToken),\n githubUsername: state.githubUsername ?? '',\n repoOwner: state.repoOwner ?? '',\n repoName: state.repoName ?? '',\n configured: Boolean(state.githubToken && state.repoOwner && state.repoName),\n startup: {\n inProgress: startupSyncStatus.inProgress,\n mode: startupSyncStatus.mode,\n branch: startupSyncStatus.branch,\n lastAction: startupSyncStatus.lastAction,\n lastRunAtIso: startupSyncStatus.lastRunAtIso,\n lastSuccessAtIso: startupSyncStatus.lastSuccessAtIso,\n lastError: startupSyncStatus.lastError,\n },\n },\n })\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/start-login') {\n try {\n const started = await startGithubDeviceLogin()\n setJson(res, 200, { data: started })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to start GitHub login') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/token-login') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const token = typeof payload?.token === 'string' ? payload.token.trim() : ''\n if (!token) {\n setJson(res, 400, { error: 'Missing GitHub token' })\n return true\n }\n const username = await resolveGithubUsername(token)\n await finalizeGithubLoginAndSync(token, username, appServer)\n setJson(res, 200, { ok: true, data: { githubUsername: username } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to login with GitHub token') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/logout') {\n try {\n const state = await readSkillsSyncState()\n await writeSkillsSyncState({\n ...state,\n githubToken: undefined,\n githubUsername: undefined,\n repoOwner: undefined,\n repoName: undefined,\n })\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to logout GitHub') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/complete-login') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const deviceCode = typeof payload?.deviceCode === 'string' ? payload.deviceCode : ''\n if (!deviceCode) {\n setJson(res, 400, { error: 'Missing deviceCode' })\n return true\n }\n const result = await completeGithubDeviceLogin(deviceCode)\n if (!result.token) {\n setJson(res, 200, { ok: false, pending: result.error === 'authorization_pending', error: result.error || 'login_failed' })\n return true\n }\n const token = result.token\n const username = await resolveGithubUsername(token)\n await finalizeGithubLoginAndSync(token, username, appServer)\n setJson(res, 200, { ok: true, data: { githubUsername: username } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to complete GitHub login') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/push') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n setJson(res, 400, { error: 'Skills sync is not configured yet' })\n return true\n }\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n setJson(res, 400, { error: 'Refusing to push to upstream repository' })\n return true\n }\n const local = await collectLocalSyncedSkills(appServer)\n const installedMap = await scanInstalledSkillsFromDisk()\n await writeRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName, local)\n await syncInstalledSkillsFolderToRepo(state.githubToken, state.repoOwner, state.repoName, installedMap)\n setJson(res, 200, { ok: true, data: { synced: local.length } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to push synced skills') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/pull') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n await bootstrapSkillsFromUpstreamIntoLocal()\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: 0, source: 'upstream' } })\n return true\n }\n const remote = await readRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName)\n const tree = await fetchSkillsTree()\n const uniqueOwnerByName = new Map<string, string>()\n const ambiguousNames = new Set<string>()\n for (const entry of tree) {\n if (ambiguousNames.has(entry.name)) continue\n const existingOwner = uniqueOwnerByName.get(entry.name)\n if (!existingOwner) {\n uniqueOwnerByName.set(entry.name, entry.owner)\n continue\n }\n if (existingOwner !== entry.owner) {\n uniqueOwnerByName.delete(entry.name)\n ambiguousNames.add(entry.name)\n }\n }\n const localDir = await detectUserSkillsDir(appServer)\n await pullInstalledSkillsFolderFromRepo(state.githubToken, state.repoOwner, state.repoName)\n const installerScript = '/Users/igor/.cursor/skills/.system/skill-installer/scripts/install-skill-from-github.py'\n const localSkills = await scanInstalledSkillsFromDisk()\n for (const skill of remote) {\n const owner = skill.owner || uniqueOwnerByName.get(skill.name) || ''\n if (!owner) continue\n if (!localSkills.has(skill.name)) {\n await runCommand('python3', [\n installerScript,\n '--repo', `${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}`,\n '--path', `skills/${owner}/${skill.name}`,\n '--dest', localDir,\n '--method', 'git',\n ])\n }\n const skillPath = join(localDir, skill.name)\n await appServer.rpc('skills/config/write', { path: skillPath, enabled: skill.enabled })\n }\n const remoteNames = new Set(remote.map((row) => row.name))\n for (const [name, localInfo] of localSkills.entries()) {\n if (!remoteNames.has(name)) {\n await rm(localInfo.path.replace(/\\/SKILL\\.md$/, ''), { recursive: true, force: true })\n }\n }\n const nextOwners: Record<string, string> = {}\n for (const item of remote) {\n const owner = item.owner || uniqueOwnerByName.get(item.name) || ''\n if (owner) nextOwners[item.name] = owner\n }\n await writeSkillsSyncState({ ...state, installedOwners: nextOwners })\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: remote.length } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to pull synced skills') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub/readme') {\n try {\n const owner = url.searchParams.get('owner') || ''\n const name = url.searchParams.get('name') || ''\n if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return true\n }\n const rawUrl = `https://raw.githubusercontent.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/main/skills/${owner}/${name}/SKILL.md`\n const resp = await fetch(rawUrl)\n if (!resp.ok) throw new Error(`Failed to fetch SKILL.md: ${resp.status}`)\n const content = await resp.text()\n setJson(res, 200, { content })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch SKILL.md') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-hub/install') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const owner = typeof payload?.owner === 'string' ? payload.owner : ''\n const name = typeof payload?.name === 'string' ? payload.name : ''\n if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return true\n }\n const installerScript = '/Users/igor/.cursor/skills/.system/skill-installer/scripts/install-skill-from-github.py'\n const installDest = await detectUserSkillsDir(appServer)\n await runCommand('python3', [\n installerScript,\n '--repo', `${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}`,\n '--path', `skills/${owner}/${name}`,\n '--dest', installDest,\n '--method', 'git',\n ])\n const skillDir = join(installDest, name)\n await ensureInstalledSkillIsValid(appServer, skillDir)\n const syncState = await readSkillsSyncState()\n const nextOwners = { ...(syncState.installedOwners ?? {}), [name]: owner }\n await writeSkillsSyncState({ ...syncState, installedOwners: nextOwners })\n await autoPushSyncedSkills(appServer)\n setJson(res, 200, { ok: true, path: skillDir })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to install skill') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-hub/uninstall') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const name = typeof payload?.name === 'string' ? payload.name : ''\n const path = typeof payload?.path === 'string' ? payload.path : ''\n const target = path || (name ? join(getSkillsInstallDir(), name) : '')\n if (!target) {\n setJson(res, 400, { error: 'Missing name or path' })\n return true\n }\n await rm(target, { recursive: true, force: true })\n if (name) {\n const syncState = await readSkillsSyncState()\n const nextOwners = { ...(syncState.installedOwners ?? {}) }\n delete nextOwners[name]\n await writeSkillsSyncState({ ...syncState, installedOwners: nextOwners })\n }\n await autoPushSyncedSkills(appServer)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, deletedPath: target })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to uninstall skill') })\n }\n return true\n }\n\n return false\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto'\nimport type { IncomingMessage } from 'node:http'\nimport type { RequestHandler, Request, Response, NextFunction } from 'express'\n\nconst TOKEN_COOKIE = 'codex_web_local_token'\n\nfunction isLocalhostRequest(req: Request): boolean {\n const remote = req.socket.remoteAddress ?? ''\n if (remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1') {\n return true\n }\n\n const host = (req.headers.host ?? '').toLowerCase()\n return host.startsWith('localhost:') || host === 'localhost' || host.startsWith('127.0.0.1:')\n}\n\nfunction constantTimeCompare(a: string, b: string): boolean {\n const bufA = Buffer.from(a)\n const bufB = Buffer.from(b)\n if (bufA.length !== bufB.length) return false\n return timingSafeEqual(bufA, bufB)\n}\n\nfunction parseCookies(header: string | undefined): Record<string, string> {\n const cookies: Record<string, string> = {}\n if (!header) return cookies\n for (const pair of header.split(';')) {\n const idx = pair.indexOf('=')\n if (idx === -1) continue\n const key = pair.slice(0, idx).trim()\n const value = pair.slice(idx + 1).trim()\n cookies[key] = value\n }\n return cookies\n}\n\nfunction isLocalhostRemote(remote: string): boolean {\n return remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1'\n}\n\nfunction isLocalhostHost(host: string): boolean {\n const normalized = host.toLowerCase()\n return normalized.startsWith('localhost:') || normalized === 'localhost' || normalized.startsWith('127.0.0.1:')\n}\n\nfunction isAuthorizedByRequestLike(\n remoteAddress: string | undefined,\n hostHeader: string | undefined,\n cookieHeader: string | undefined,\n validTokens: Set<string>,\n): boolean {\n const remote = remoteAddress ?? ''\n if (isLocalhostRemote(remote) || isLocalhostHost(hostHeader ?? '')) {\n return true\n }\n\n const cookies = parseCookies(cookieHeader)\n const token = cookies[TOKEN_COOKIE]\n return Boolean(token && validTokens.has(token))\n}\n\nconst LOGIN_PAGE_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Codex Web Local — Login</title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif;background:#0a0a0a;color:#e5e5e5;display:flex;align-items:center;justify-content:center;min-height:100vh;padding:1rem}\n.card{background:#171717;border:1px solid #262626;border-radius:12px;padding:2rem;width:100%;max-width:380px}\nh1{font-size:1.25rem;font-weight:600;margin-bottom:1.5rem;text-align:center;color:#fafafa}\nlabel{display:block;font-size:.875rem;color:#a3a3a3;margin-bottom:.5rem}\ninput{width:100%;padding:.625rem .75rem;background:#0a0a0a;border:1px solid #404040;border-radius:8px;color:#fafafa;font-size:1rem;outline:none;transition:border-color .15s}\ninput:focus{border-color:#3b82f6}\nbutton{width:100%;padding:.625rem;margin-top:1rem;background:#3b82f6;color:#fff;border:none;border-radius:8px;font-size:.9375rem;font-weight:500;cursor:pointer;transition:background .15s}\nbutton:hover{background:#2563eb}\n.error{color:#ef4444;font-size:.8125rem;margin-top:.75rem;text-align:center;display:none}\n</style>\n</head>\n<body>\n<div class=\"card\">\n<h1>Codex Web Local</h1>\n<form id=\"f\">\n<label for=\"pw\">Password</label>\n<input id=\"pw\" name=\"password\" type=\"password\" autocomplete=\"current-password\" autofocus required>\n<button type=\"submit\">Sign in</button>\n<p class=\"error\" id=\"err\">Incorrect password</p>\n</form>\n</div>\n<script>\nconst form=document.getElementById('f');\nconst errEl=document.getElementById('err');\nform.addEventListener('submit',async e=>{\n e.preventDefault();\n errEl.style.display='none';\n const res=await fetch('/auth/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({password:document.getElementById('pw').value})});\n if(res.ok){window.location.reload()}else{errEl.style.display='block';document.getElementById('pw').value='';document.getElementById('pw').focus()}\n});\n</script>\n</body>\n</html>`\n\nexport function createAuthMiddleware(password: string): RequestHandler {\n return createAuthSession(password).middleware\n}\n\nexport type AuthSession = {\n middleware: RequestHandler\n isRequestAuthorized: (req: IncomingMessage) => boolean\n}\n\nexport function createAuthSession(password: string): AuthSession {\n const validTokens = new Set<string>()\n\n const middleware: RequestHandler = (req: Request, res: Response, next: NextFunction): void => {\n if (isAuthorizedByRequestLike(req.socket.remoteAddress, req.headers.host, req.headers.cookie, validTokens)) {\n next()\n return\n }\n\n // Handle login POST\n if (req.method === 'POST' && req.path === '/auth/login') {\n let body = ''\n req.setEncoding('utf8')\n req.on('data', (chunk: string) => { body += chunk })\n req.on('end', () => {\n try {\n const parsed = JSON.parse(body) as { password?: string }\n const provided = typeof parsed.password === 'string' ? parsed.password : ''\n\n if (!constantTimeCompare(provided, password)) {\n res.status(401).json({ error: 'Invalid password' })\n return\n }\n\n const token = randomBytes(32).toString('hex')\n validTokens.add(token)\n\n res.setHeader('Set-Cookie', `${TOKEN_COOKIE}=${token}; Path=/; HttpOnly; SameSite=Strict`)\n res.json({ ok: true })\n } catch {\n res.status(400).json({ error: 'Invalid request body' })\n }\n })\n return\n }\n\n // No valid session — serve login page\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.status(200).send(LOGIN_PAGE_HTML)\n }\n\n return {\n middleware,\n isRequestAuthorized: (req: IncomingMessage) => (\n isAuthorizedByRequestLike(req.socket.remoteAddress, req.headers.host, req.headers.cookie, validTokens)\n ),\n }\n}\n","import { dirname, extname, join } from 'node:path'\nimport { open, readFile, readdir, stat } from 'node:fs/promises'\n\ntype DirectoryItem = {\n name: string\n path: string\n isDirectory: boolean\n editable: boolean\n mtimeMs: number\n}\n\nconst TEXT_EDITABLE_EXTENSIONS = new Set([\n '.txt', '.md', '.json', '.js', '.ts', '.tsx', '.jsx', '.css', '.scss',\n '.html', '.htm', '.xml', '.yml', '.yaml', '.log', '.csv', '.env', '.py',\n '.sh', '.toml', '.ini', '.conf', '.sql', '.bat', '.cmd', '.ps1',\n])\n\nfunction languageForPath(pathValue: string): string {\n const extension = extname(pathValue).toLowerCase()\n switch (extension) {\n case '.js': return 'javascript'\n case '.ts': return 'typescript'\n case '.jsx': return 'javascript'\n case '.tsx': return 'typescript'\n case '.py': return 'python'\n case '.sh': return 'sh'\n case '.css':\n case '.scss': return 'css'\n case '.html':\n case '.htm': return 'html'\n case '.json': return 'json'\n case '.md': return 'markdown'\n case '.yaml':\n case '.yml': return 'yaml'\n case '.xml': return 'xml'\n case '.sql': return 'sql'\n case '.toml': return 'ini'\n case '.ini':\n case '.conf': return 'ini'\n default: return 'plaintext'\n }\n}\n\nexport function normalizeLocalPath(rawPath: string): string {\n const trimmed = rawPath.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('file://')) {\n try {\n return decodeURIComponent(trimmed.replace(/^file:\\/\\//u, ''))\n } catch {\n return trimmed.replace(/^file:\\/\\//u, '')\n }\n }\n return trimmed\n}\n\nexport function decodeBrowsePath(rawPath: string): string {\n if (!rawPath) return ''\n try {\n return decodeURIComponent(rawPath)\n } catch {\n return rawPath\n }\n}\n\nexport function isTextEditablePath(pathValue: string): boolean {\n return TEXT_EDITABLE_EXTENSIONS.has(extname(pathValue).toLowerCase())\n}\n\nfunction looksLikeTextBuffer(buffer: Buffer): boolean {\n if (buffer.length === 0) return true\n for (const byte of buffer) {\n if (byte === 0) return false\n }\n const decoded = buffer.toString('utf8')\n const replacementCount = (decoded.match(/\\uFFFD/gu) ?? []).length\n return replacementCount / decoded.length < 0.05\n}\n\nasync function probeFileIsText(localPath: string): Promise<boolean> {\n const handle = await open(localPath, 'r')\n try {\n const sample = Buffer.allocUnsafe(4096)\n const { bytesRead } = await handle.read(sample, 0, sample.length, 0)\n return looksLikeTextBuffer(sample.subarray(0, bytesRead))\n } finally {\n await handle.close()\n }\n}\n\nexport async function isTextEditableFile(localPath: string): Promise<boolean> {\n if (isTextEditablePath(localPath)) return true\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isFile()) return false\n return await probeFileIsText(localPath)\n } catch {\n return false\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/gu, '&')\n .replace(/</gu, '<')\n .replace(/>/gu, '>')\n .replace(/\"/gu, '"')\n .replace(/'/gu, ''')\n}\n\nfunction toBrowseHref(pathValue: string): string {\n return `/codex-local-browse${encodeURI(pathValue)}`\n}\n\nfunction toEditHref(pathValue: string): string {\n return `/codex-local-edit${encodeURI(pathValue)}`\n}\n\nfunction escapeForInlineScriptString(value: string): string {\n // Prevent breaking out of inline <script> blocks when file content contains HTML/script tokens.\n return JSON.stringify(value)\n .replace(/<\\//gu, '<\\\\/')\n .replace(/<!--/gu, '<\\\\!--')\n .replace(/\\u2028/gu, '\\\\u2028')\n .replace(/\\u2029/gu, '\\\\u2029')\n}\n\nasync function getDirectoryItems(localPath: string): Promise<DirectoryItem[]> {\n const entries = await readdir(localPath, { withFileTypes: true })\n const withMeta = await Promise.all(entries.map(async (entry) => {\n const entryPath = join(localPath, entry.name)\n const entryStat = await stat(entryPath)\n const editable = !entry.isDirectory() && await isTextEditableFile(entryPath)\n return {\n name: entry.name,\n path: entryPath,\n isDirectory: entry.isDirectory(),\n editable,\n mtimeMs: entryStat.mtimeMs,\n }\n }))\n return withMeta.sort((a, b) => {\n if (b.mtimeMs !== a.mtimeMs) return b.mtimeMs - a.mtimeMs\n if (a.isDirectory && !b.isDirectory) return -1\n if (!a.isDirectory && b.isDirectory) return 1\n return a.name.localeCompare(b.name)\n })\n}\n\nexport async function createDirectoryListingHtml(localPath: string): Promise<string> {\n const items = await getDirectoryItems(localPath)\n const parentPath = dirname(localPath)\n const rows = items\n .map((item) => {\n const suffix = item.isDirectory ? '/' : ''\n const editAction = item.editable\n ? ` <a class=\"icon-btn\" aria-label=\"Edit ${escapeHtml(item.name)}\" href=\"${escapeHtml(toEditHref(item.path))}\" title=\"Edit\">✏️</a>`\n : ''\n return `<li class=\"file-row\"><a class=\"file-link\" href=\"${escapeHtml(toBrowseHref(item.path))}\">${escapeHtml(item.name)}${suffix}</a>${editAction}</li>`\n })\n .join('\\n')\n\n const parentLink = localPath !== parentPath\n ? `<p><a href=\"${escapeHtml(toBrowseHref(parentPath))}\">..</a></p>`\n : ''\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Index of ${escapeHtml(localPath)}</title>\n <style>\n body { font-family: ui-monospace, Menlo, Monaco, monospace; margin: 16px; background: #0b1020; color: #dbe6ff; }\n a { color: #8cc2ff; text-decoration: none; }\n a:hover { text-decoration: underline; }\n ul { list-style: none; padding: 0; margin: 12px 0 0; display: flex; flex-direction: column; gap: 8px; }\n .file-row { display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: center; gap: 10px; }\n .file-link { display: block; padding: 10px 12px; border: 1px solid #28405f; border-radius: 10px; background: #0f1b33; overflow-wrap: anywhere; }\n .icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border: 1px solid #36557a; border-radius: 10px; background: #162643; text-decoration: none; }\n .icon-btn:hover { filter: brightness(1.08); text-decoration: none; }\n h1 { font-size: 18px; margin: 0; word-break: break-all; }\n @media (max-width: 640px) {\n body { margin: 12px; }\n .file-row { gap: 8px; }\n .file-link { font-size: 15px; padding: 12px; }\n .icon-btn { width: 44px; height: 44px; }\n }\n </style>\n</head>\n<body>\n <h1>Index of ${escapeHtml(localPath)}</h1>\n ${parentLink}\n <ul>${rows}</ul>\n</body>\n</html>`\n}\n\nexport async function createTextEditorHtml(localPath: string): Promise<string> {\n const content = await readFile(localPath, 'utf8')\n const parentPath = dirname(localPath)\n const language = languageForPath(localPath)\n const safeContentLiteral = escapeForInlineScriptString(content)\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Edit ${escapeHtml(localPath)}</title>\n <style>\n html, body { width: 100%; height: 100%; margin: 0; }\n body { font-family: ui-monospace, Menlo, Monaco, monospace; background: #0b1020; color: #dbe6ff; display: flex; flex-direction: column; overflow: hidden; }\n .toolbar { position: sticky; top: 0; z-index: 10; display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; background: #0b1020; border-bottom: 1px solid #243a5a; }\n .row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }\n button, a { background: #1b2a4a; color: #dbe6ff; border: 1px solid #345; padding: 6px 10px; border-radius: 6px; text-decoration: none; cursor: pointer; }\n button:hover, a:hover { filter: brightness(1.08); }\n #editor { flex: 1 1 auto; min-height: 0; width: 100%; border: none; overflow: hidden; }\n #status { margin-left: 8px; color: #8cc2ff; }\n .ace_editor { background: #07101f !important; color: #dbe6ff !important; width: 100% !important; height: 100% !important; }\n .ace_gutter { background: #07101f !important; color: #6f8eb5 !important; }\n .ace_marker-layer .ace_active-line { background: #10213c !important; }\n .ace_marker-layer .ace_selection { background: rgba(140, 194, 255, 0.3) !important; }\n .meta { opacity: 0.9; font-size: 12px; overflow-wrap: anywhere; }\n </style>\n</head>\n<body>\n <div class=\"toolbar\">\n <div class=\"row\">\n <a href=\"${escapeHtml(toBrowseHref(parentPath))}\">Back</a>\n <button id=\"saveBtn\" type=\"button\">Save</button>\n <span id=\"status\"></span>\n </div>\n <div class=\"meta\">${escapeHtml(localPath)} · ${escapeHtml(language)}</div>\n </div>\n <div id=\"editor\"></div>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.2/ace.js\"></script>\n <script>\n const saveBtn = document.getElementById('saveBtn');\n const status = document.getElementById('status');\n const editor = ace.edit('editor');\n editor.setTheme('ace/theme/tomorrow_night');\n editor.session.setMode('ace/mode/${escapeHtml(language)}');\n editor.setValue(${safeContentLiteral}, -1);\n editor.setOptions({\n fontSize: '13px',\n wrap: true,\n showPrintMargin: false,\n useSoftTabs: true,\n tabSize: 2,\n behavioursEnabled: true,\n });\n editor.resize();\n\n saveBtn.addEventListener('click', async () => {\n status.textContent = 'Saving...';\n const response = await fetch(location.pathname, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n body: editor.getValue(),\n });\n status.textContent = response.ok ? 'Saved' : 'Save failed';\n });\n </script>\n</body>\n</html>`\n}\n","import { randomInt } from 'node:crypto'\n\nconst CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789'\n\nfunction randomGroup(length: number): string {\n let result = ''\n for (let i = 0; i < length; i++) {\n result += CHARS[randomInt(CHARS.length)]\n }\n return result\n}\n\nexport function generatePassword(): string {\n return `${randomGroup(3)}-${randomGroup(3)}-${randomGroup(3)}`\n}\n"],"mappings":";;;AAAA,SAAS,gBAAAA,qBAAoB;AAC7B,SAAS,WAAW,mBAAmB,cAAAC,aAAY,iBAAiB;AACpE,SAAS,YAAAC,WAAU,QAAAC,OAAM,aAAAC,kBAAiB;AAC1C,SAAS,WAAAC,UAAS,yBAAyB;AAC3C,SAAS,cAAAC,aAAY,QAAAC,OAAM,WAAAC,gBAAe;AAC1C,SAAS,SAAAC,QAAO,iBAAiB;AACjC,SAAS,uBAAuB;AAChC,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,WAAAC,gBAAe;AACxB,SAAS,OAAO,gBAAgB;AAChC,SAAS,eAAe;AACxB,OAAO,YAAY;;;ACXnB,SAAS,qBAAqB;AAC9B,SAAS,WAAAC,UAAS,WAAAC,UAAS,cAAAC,aAAY,QAAAC,aAAY;AAEnD,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,aAAAC,YAAW,QAAAC,aAAY;AAChC,OAAO,aAA+B;;;ACLtC,SAAS,SAAAC,cAAkD;AAC3D,SAAS,mBAAmB;AAC5B,SAAS,WAAAC,UAAS,YAAAC,WAAuB,SAAAC,QAAO,QAAAC,aAA0C;AAG1F,SAAS,WAAW,oBAAoB;AACxC,SAAS,WAAAC,gBAAe;AACxB,SAAS,UAAAC,eAAc;AACvB,SAAS,UAAU,YAAY,QAAAC,OAAM,eAAe;AACpD,SAAS,aAAAC,kBAAiB;;;ACT1B,SAAS,aAAa;AACtB,SAAS,SAAS,UAAU,SAAS,IAAI,OAAO,MAAM,OAAO,UAAU,eAAe;AACtF,SAAS,kBAAkB;AAE3B,SAAS,SAAS,cAAc;AAChC,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAa1B,SAAS,SAAS,OAAgD;AAChE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAEA,SAAS,gBAAgB,SAAkB,UAA0B;AACnE,MAAI,mBAAmB,SAAS,QAAQ,QAAQ,KAAK,EAAE,SAAS,GAAG;AACjE,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,SAAS,SAAS,OAAO;AAC/B,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,OAAO;AACrB,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAC1D,QAAM,cAAc,SAAS,KAAK;AAClC,MAAI,eAAe,OAAO,YAAY,YAAY,YAAY,YAAY,QAAQ,SAAS,GAAG;AAC5F,WAAO,YAAY;AAAA,EACrB;AACA,SAAO;AACT;AAEA,SAAS,QAAQ,KAAqB,YAAoB,SAAwB;AAChF,MAAI,aAAa;AACjB,MAAI,UAAU,gBAAgB,iCAAiC;AAC/D,MAAI,IAAI,KAAK,UAAU,OAAO,CAAC;AACjC;AAEA,SAAS,kBAA0B;AACjC,QAAM,YAAY,QAAQ,IAAI,YAAY,KAAK;AAC/C,SAAO,aAAa,UAAU,SAAS,IAAI,YAAY,KAAK,QAAQ,GAAG,QAAQ;AACjF;AAEA,SAAS,sBAA8B;AACrC,SAAO,KAAK,gBAAgB,GAAG,QAAQ;AACzC;AAEA,eAAe,WAAW,SAAiB,MAAgB,UAA4B,CAAC,GAAkB;AACxG,QAAM,IAAI,QAAc,CAACC,UAAS,WAAW;AAC3C,UAAM,OAAO,MAAM,SAAS,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,SAAS;AACb,QAAI,SAAS;AACb,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,GAAG,SAAS,MAAM;AACvB,SAAK,GAAG,SAAS,CAAC,SAAS;AACzB,UAAI,SAAS,GAAG;AACd,QAAAA,SAAQ;AACR;AAAA,MACF;AACA,YAAM,UAAU,CAAC,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACxE,YAAM,SAAS,QAAQ,SAAS,IAAI,KAAK,OAAO,KAAK;AACrD,aAAO,IAAI,MAAM,mBAAmB,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;AAAA,IAC5E,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,qBAAqB,SAAiB,MAAgB,UAA4B,CAAC,GAAoB;AACpH,SAAO,MAAM,IAAI,QAAgB,CAACA,UAAS,WAAW;AACpD,UAAM,OAAO,MAAM,SAAS,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,SAAS;AACb,QAAI,SAAS;AACb,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,GAAG,SAAS,MAAM;AACvB,SAAK,GAAG,SAAS,CAAC,SAAS;AACzB,UAAI,SAAS,GAAG;AACd,QAAAA,SAAQ,OAAO,KAAK,CAAC;AACrB;AAAA,MACF;AACA,YAAM,UAAU,CAAC,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACxE,YAAM,SAAS,QAAQ,SAAS,IAAI,KAAK,OAAO,KAAK;AACrD,aAAO,IAAI,MAAM,mBAAmB,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;AAAA,IAC5E,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,oBAAoB,WAA2C;AAC5E,MAAI;AACF,UAAM,SAAU,MAAM,UAAU,IAAI,eAAe,CAAC,CAAC;AAGrD,eAAW,SAAS,OAAO,QAAQ,CAAC,GAAG;AACrC,iBAAW,SAAS,MAAM,UAAU,CAAC,GAAG;AACtC,YAAI,MAAM,UAAU,UAAU,CAAC,MAAM,KAAM;AAC3C,cAAM,QAAQ,MAAM,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAClD,YAAI,MAAM,SAAS,EAAG;AACtB,eAAO,IAAI,MAAM,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO,oBAAoB;AAC7B;AAEA,eAAe,4BAA4B,WAA0B,WAAkC;AACrG,QAAM,SAAU,MAAM,UAAU,IAAI,eAAe,EAAE,aAAa,KAAK,CAAC;AAGxE,QAAM,aAAa,UAAU,SAAS,WAAW,IAAI,YAAY,GAAG,SAAS;AAC7E,aAAW,SAAS,OAAO,QAAQ,CAAC,GAAG;AACrC,eAAW,SAAS,MAAM,UAAU,CAAC,GAAG;AACtC,UAAI,MAAM,SAAS,YAAY;AAC7B,cAAM,IAAI,MAAM,MAAM,WAAW,4BAA4B;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AACF;AAiCA,IAAM,oBAAoB,IAAI,KAAK;AACnC,IAAI,kBAA0C;AAC9C,IAAM,YAAY,oBAAI,IAA+E;AAErG,eAAe,aAAqC;AAClD,MAAI;AACF,UAAM,OAAO,MAAM,MAAM,CAAC,QAAQ,OAAO,GAAG,EAAE,OAAO,CAAC,UAAU,QAAQ,QAAQ,EAAE,CAAC;AACnF,QAAI,MAAM;AACV,SAAK,OAAO,GAAG,QAAQ,CAAC,MAAc;AAAE,aAAO,EAAE,SAAS;AAAA,IAAE,CAAC;AAC7D,WAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,WAAK,GAAG,SAAS,CAAC,SAASA,SAAQ,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAClE,WAAK,GAAG,SAAS,MAAMA,SAAQ,IAAI,CAAC;AAAA,IACtC,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,QAAQ,KAAgC;AACrD,QAAM,QAAQ,MAAM,WAAW;AAC/B,QAAM,UAAkC;AAAA,IACtC,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AACA,MAAI,MAAO,SAAQ,gBAAgB,UAAU,KAAK;AAClD,SAAO,MAAM,KAAK,EAAE,QAAQ,CAAC;AAC/B;AAEA,eAAe,kBAA8C;AAC3D,MAAI,mBAAmB,KAAK,IAAI,IAAI,gBAAgB,YAAY,mBAAmB;AACjF,WAAO,gBAAgB;AAAA,EACzB;AAEA,QAAM,OAAO,MAAM,QAAQ,gCAAgC,gBAAgB,IAAI,eAAe,6BAA6B;AAC3H,MAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,4BAA4B,KAAK,MAAM,EAAE;AACvE,QAAM,OAAQ,MAAM,KAAK,KAAK;AAE9B,QAAM,cAAc;AACpB,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,UAA6B,CAAC;AAEpC,aAAW,QAAQ,KAAK,QAAQ,CAAC,GAAG;AAClC,UAAM,QAAQ,YAAY,KAAK,KAAK,IAAI;AACxC,QAAI,CAAC,MAAO;AACZ,UAAM,CAAC,EAAE,OAAO,SAAS,IAAI;AAC7B,UAAM,MAAM,GAAG,KAAK,IAAI,SAAS;AACjC,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,KAAK,sBAAsB,gBAAgB,IAAI,eAAe,qBAAqB,KAAK,IAAI,SAAS;AAAA,IACvG,CAAC;AAAA,EACH;AAEA,oBAAkB,EAAE,SAAS,WAAW,KAAK,IAAI,EAAE;AACnD,SAAO;AACT;AAEA,eAAe,eAAe,SAA2C;AACvE,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5E,MAAI,QAAQ,WAAW,EAAG;AAC1B,QAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE;AACjC,QAAM,QAAQ;AAAA,IACZ,MAAM,IAAI,OAAO,MAAM;AACrB,YAAM,SAAS,qCAAqC,gBAAgB,IAAI,eAAe,gBAAgB,EAAE,KAAK,IAAI,EAAE,IAAI;AACxH,YAAM,OAAO,MAAM,MAAM,MAAM;AAC/B,UAAI,CAAC,KAAK,GAAI;AACd,YAAM,OAAQ,MAAM,KAAK,KAAK;AAC9B,gBAAU,IAAI,GAAG,EAAE,KAAK,IAAI,EAAE,IAAI,IAAI;AAAA,QACpC,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,QACvE,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,QACvE,aAAa,KAAK,QAAQ,eAAe;AAAA,MAC3C,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,GAAmC;AACxD,QAAM,SAAS,UAAU,IAAI,GAAG,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE;AACnD,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,OAAO,EAAE;AAAA,IACT,aAAa,QAAQ,eAAe;AAAA,IACpC,aAAa,QAAQ,eAAe;AAAA,IACpC,aAAa,QAAQ,eAAe;AAAA,IACpC,WAAW,sBAAsB,EAAE,KAAK;AAAA,IACxC,KAAK,EAAE;AAAA,IACP,WAAW;AAAA,EACb;AACF;AAuBA,IAAM,0BAA0B;AAChC,IAAM,gCAAgC;AACtC,IAAM,4BAA4B;AAClC,IAAM,6BAA6B;AACnC,IAAM,4BAA4B;AAClC,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AACxB,IAAI,+BAA+B;AAYnC,IAAM,oBAAuC;AAAA,EAC3C,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ,uBAAuB;AAAA,EAC/B,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,WAAW;AACb;AAEA,eAAe,8BAAwE;AACrF,QAAM,MAAM,oBAAI,IAAgC;AAChD,QAAM,YAAY,oBAAoB;AACtC,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAChE,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,KAAK,MAAM,KAAK,WAAW,GAAG,EAAG;AACxD,YAAM,UAAU,KAAK,WAAW,MAAM,MAAM,UAAU;AACtD,UAAI;AACF,cAAM,KAAK,OAAO;AAClB,YAAI,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,MACxE,QAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,SAAS,yBAAiC;AACxC,SAAO,KAAK,gBAAgB,GAAG,kBAAkB;AACnD;AAEA,eAAe,sBAAgD;AAC7D,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,uBAAuB,GAAG,MAAM;AAC3D,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,UAAU,OAAO,WAAW,WAAW,SAAS,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,qBAAqB,OAAuC;AACzE,QAAM,UAAU,uBAAuB,GAAG,KAAK,UAAU,KAAK,GAAG,MAAM;AACzE;AAEA,eAAe,cAAiB,KAAa,OAAe,SAAS,OAAO,MAA4B;AACtG,QAAM,OAAO,MAAM,MAAM,KAAK;AAAA,IAC5B;AAAA,IACA,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK;AAAA,MAC9B,wBAAwB;AAAA,MACxB,cAAc;AAAA,IAChB;AAAA,IACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EACtC,CAAC;AACD,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,GAAG,YAAY,KAAK,MAAM,MAAM,IAAI,EAAE;AAAA,EAChF;AACA,SAAO,MAAM,KAAK,KAAK;AACzB;AAEA,eAAe,yBAA4D;AACzE,QAAM,OAAO,MAAM,MAAM,wCAAwC;AAAA,IAC/D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB;AAAA,IACA,MAAM,IAAI,gBAAgB;AAAA,MACxB,WAAW;AAAA,MACX,OAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM,mCAAmC,KAAK,MAAM,GAAG;AAAA,EACnE;AACA,SAAO,MAAM,KAAK,KAAK;AACzB;AAEA,eAAe,0BAA0B,YAA6E;AACpH,QAAM,OAAO,MAAM,MAAM,+CAA+C;AAAA,IACtE,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB;AAAA,IACA,MAAM,IAAI,gBAAgB;AAAA,MACxB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,YAAY;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM,iCAAiC,KAAK,MAAM,GAAG;AAAA,EACjE;AACA,QAAM,UAAU,MAAM,KAAK,KAAK;AAChC,MAAI,CAAC,QAAQ,aAAc,QAAO,EAAE,OAAO,MAAM,OAAO,QAAQ,SAAS,gBAAgB;AACzF,SAAO,EAAE,OAAO,QAAQ,cAAc,OAAO,KAAK;AACpD;AAEA,SAAS,uBAAgC;AACvC,MAAI,QAAQ,aAAa,UAAW,QAAO;AAC3C,MAAI,WAAW,uBAAuB,EAAG,QAAO;AAChD,MAAI,QAAQ,IAAI,eAAgB,QAAO;AACvC,QAAM,SAAS,QAAQ,IAAI,QAAQ,YAAY,KAAK;AACpD,MAAI,OAAO,SAAS,cAAc,EAAG,QAAO;AAC5C,QAAM,QAAQ,QAAQ,IAAI,eAAe,YAAY,KAAK;AAC1D,SAAO,MAAM,SAAS;AACxB;AAEA,SAAS,yBAAiC;AACxC,SAAO,qBAAqB,IAAI,YAAY;AAC9C;AAEA,SAAS,qBAAqB,WAAmB,UAA2B;AAC1E,SAAO,UAAU,YAAY,MAAM,2BAA2B,YAAY,KACrE,SAAS,YAAY,MAAM,0BAA0B,YAAY;AACxE;AAEA,eAAe,sBAAsB,OAAgC;AACnE,QAAM,OAAO,MAAM,cAAiC,+BAA+B,KAAK;AACxF,SAAO,KAAK;AACd;AAEA,eAAe,8BAA8B,OAAe,UAAkB,UAAiC;AAC7G,QAAM,UAAU,gCAAgC,QAAQ,IAAI,QAAQ;AACpE,MAAI,UAAU;AACd,QAAM,WAAW,MAAM,MAAM,SAAS;AAAA,IACpC,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,eAAe,UAAU,KAAK;AAAA,MAC9B,wBAAwB;AAAA,MACxB,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,SAAS,IAAI;AACf,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,QAAI,QAAQ,YAAY,KAAM;AAC9B,UAAM,cAAc,SAAS,OAAO,SAAS,EAAE,SAAS,KAAK,CAAC;AAC9D;AAAA,EACF;AACA,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,IAAI,MAAM,4CAA4C,SAAS,MAAM,GAAG;AAAA,EAChF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,EAAE,MAAM,UAAU,SAAS,MAAM,WAAW,OAAO,aAAa,mCAAmC;AAAA,EACrG;AACA,YAAU;AAEV,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,QAAQ,MAAM,MAAM,SAAS;AAAA,MACjC,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,eAAe,UAAU,KAAK;AAAA,QAC9B,wBAAwB;AAAA,QACxB,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AACD,QAAI,MAAM,IAAI;AACZ,cAAQ;AACR;AAAA,IACF;AACA,UAAM,IAAI,QAAQ,CAACA,aAAY,WAAWA,UAAS,GAAI,CAAC;AAAA,EAC1D;AACA,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,0DAA0D;AACtF,MAAI,CAAC,QAAS;AAEd,QAAM,MAAM,MAAM,QAAQ,KAAK,OAAO,GAAG,oBAAoB,CAAC;AAC9D,MAAI;AACF,UAAM,cAAc,sBAAsB,0BAA0B,IAAI,yBAAyB;AACjG,UAAM,SAAS,uBAAuB;AACtC,QAAI;AACF,YAAM,WAAW,OAAO,CAAC,SAAS,WAAW,KAAK,mBAAmB,YAAY,QAAQ,aAAa,GAAG,CAAC;AAAA,IAC5G,QAAQ;AACN,YAAM,WAAW,OAAO,CAAC,SAAS,WAAW,KAAK,aAAa,GAAG,CAAC;AAAA,IACrE;AACA,UAAM,gBAAgB,oBAAoB,UAAU,UAAU,KAAK;AACnE,UAAM,WAAW,OAAO,CAAC,UAAU,WAAW,UAAU,aAAa,GAAG,EAAE,KAAK,IAAI,CAAC;AACpF,QAAI;AAAE,YAAM,WAAW,OAAO,CAAC,YAAY,MAAM,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,IAAE,QAAQ;AAAA,IAAC;AACjF,UAAM,WAAW,OAAO,CAAC,QAAQ,MAAM,UAAU,QAAQ,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,EAClF,UAAE;AACA,UAAM,GAAG,KAAK,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAChD;AACF;AAEA,eAAe,yBAAyB,OAAe,WAAmB,UAA0C;AAClH,QAAM,MAAM,gCAAgC,SAAS,IAAI,QAAQ,aAAa,yBAAyB;AACvG,QAAM,OAAO,MAAM,MAAM,KAAK;AAAA,IAC5B,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,eAAe,UAAU,KAAK;AAAA,MAC9B,wBAAwB;AAAA,MACxB,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,KAAK,WAAW,IAAK,QAAO,CAAC;AACjC,MAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,mCAAmC,KAAK,MAAM,GAAG;AAC/E,QAAM,UAAU,MAAM,KAAK,KAAK;AAChC,QAAM,UAAU,QAAQ,UAAU,OAAO,KAAK,QAAQ,QAAQ,QAAQ,OAAO,EAAE,GAAG,QAAQ,EAAE,SAAS,MAAM,IAAI;AAC/G,QAAM,SAAS,KAAK,MAAM,OAAO;AACjC,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,QAAM,SAAwB,CAAC;AAC/B,aAAW,OAAO,QAAQ;AACxB,UAAM,OAAO,SAAS,GAAG;AACzB,UAAM,QAAQ,OAAO,MAAM,UAAU,WAAW,KAAK,QAAQ;AAC7D,UAAM,OAAO,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAC1D,QAAI,CAAC,KAAM;AACX,WAAO,KAAK,EAAE,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,MAAM,SAAS,MAAM,YAAY,MAAM,CAAC;AAAA,EACrF;AACA,SAAO;AACT;AAEA,eAAe,0BAA0B,OAAe,WAAmB,UAAkB,QAAsC;AACjI,QAAM,MAAM,gCAAgC,SAAS,IAAI,QAAQ,aAAa,yBAAyB;AACvG,MAAI,MAAM;AACV,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,eAAe,UAAU,KAAK;AAAA,MAC9B,wBAAwB;AAAA,MACxB,cAAc;AAAA,IAChB;AAAA,EACF,CAAC;AACD,MAAI,SAAS,IAAI;AACf,UAAM,UAAU,MAAM,SAAS,KAAK;AACpC,UAAM,QAAQ,OAAO;AAAA,EACvB;AACA,QAAM,UAAU,OAAO,KAAK,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,MAAM,EAAE,SAAS,QAAQ;AACtF,QAAM,cAAc,KAAK,OAAO,OAAO;AAAA,IACrC,SAAS;AAAA,IACT;AAAA,IACA,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,EACvB,CAAC;AACH;AAEA,SAAS,oBAAoB,WAAmB,UAAkB,OAAuB;AACvF,SAAO,0BAA0B,mBAAmB,KAAK,CAAC,eAAe,SAAS,IAAI,QAAQ;AAChG;AAEA,eAAe,4BAA4B,SAAiB,QAAiC;AAC3F,QAAM,WAAW,oBAAoB;AACrC,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,SAAS,KAAK,UAAU,MAAM;AACpC,MAAI,YAAY;AAChB,MAAI;AAAE,iBAAa,MAAM,KAAK,MAAM,GAAG,YAAY;AAAA,EAAE,QAAQ;AAAE,gBAAY;AAAA,EAAM;AAEjF,MAAI,CAAC,WAAW;AACd,UAAM,WAAW,OAAO,CAAC,MAAM,GAAG,EAAE,KAAK,SAAS,CAAC;AACnD,UAAM,WAAW,OAAO,CAAC,UAAU,cAAc,mBAAmB,GAAG,EAAE,KAAK,SAAS,CAAC;AACxF,UAAM,WAAW,OAAO,CAAC,UAAU,aAAa,aAAa,GAAG,EAAE,KAAK,SAAS,CAAC;AACjF,UAAM,WAAW,OAAO,CAAC,OAAO,IAAI,GAAG,EAAE,KAAK,SAAS,CAAC;AACxD,QAAI;AAAE,YAAM,WAAW,OAAO,CAAC,UAAU,MAAM,mCAAmC,GAAG,EAAE,KAAK,SAAS,CAAC;AAAA,IAAE,QAAQ;AAAA,IAAC;AACjH,UAAM,WAAW,OAAO,CAAC,UAAU,MAAM,MAAM,GAAG,EAAE,KAAK,SAAS,CAAC;AACnE,QAAI;AAAE,YAAM,WAAW,OAAO,CAAC,UAAU,OAAO,UAAU,OAAO,GAAG,EAAE,KAAK,SAAS,CAAC;AAAA,IAAE,QAAQ;AAC7F,YAAM,WAAW,OAAO,CAAC,UAAU,WAAW,UAAU,OAAO,GAAG,EAAE,KAAK,SAAS,CAAC;AAAA,IACrF;AACA,UAAM,WAAW,OAAO,CAAC,SAAS,QAAQ,GAAG,EAAE,KAAK,SAAS,CAAC;AAC9D,QAAI;AACF,YAAM,WAAW,OAAO,CAAC,SAAS,+BAA+B,aAAa,UAAU,MAAM,EAAE,GAAG,EAAE,KAAK,SAAS,CAAC;AAAA,IACtH,QAAQ;AAAA,IAAC;AACT,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,CAAC,UAAU,WAAW,UAAU,OAAO,GAAG,EAAE,KAAK,SAAS,CAAC;AACnF,QAAM,WAAW,OAAO,CAAC,SAAS,QAAQ,GAAG,EAAE,KAAK,SAAS,CAAC;AAC9D,QAAM,mCAAmC,UAAU,MAAM;AACzD,MAAI;AACF,UAAM,WAAW,OAAO,CAAC,YAAY,MAAM,GAAG,EAAE,KAAK,SAAS,CAAC;AAAA,EACjE,QAAQ;AACN,UAAM,mCAAmC,UAAU,MAAM;AACzD,UAAM,WAAW,OAAO,CAAC,YAAY,MAAM,MAAM,GAAG,EAAE,KAAK,SAAS,CAAC;AAAA,EACvE;AACA,QAAM,mCAAmC,UAAU,MAAM;AACzD,QAAM,wBAAwB,MAAM,mBAAmB,QAAQ;AAC/D,MAAI;AAAE,UAAM,WAAW,OAAO,CAAC,SAAS,QAAQ,uBAAuB,MAAM,wBAAwB,GAAG,EAAE,KAAK,SAAS,CAAC;AAAA,EAAE,QAAQ;AAAA,EAAC;AACpI,MAAI,eAAe,oBAAI,IAAoB;AAC3C,MAAI;AACF,UAAM,WAAW,OAAO,CAAC,QAAQ,eAAe,UAAU,MAAM,GAAG,EAAE,KAAK,SAAS,CAAC;AACpF,mBAAe,MAAM,mBAAmB,QAAQ;AAAA,EAClD,QAAQ;AACN,UAAM,mCAAmC,UAAU,MAAM;AACzD,mBAAe,MAAM,mBAAmB,QAAQ;AAAA,EAClD;AACA,MAAI;AACF,UAAM,WAAW,OAAO,CAAC,SAAS,KAAK,GAAG,EAAE,KAAK,SAAS,CAAC;AAAA,EAC7D,QAAQ;AACN,UAAM,mCAAmC,UAAU,uBAAuB,YAAY;AAAA,EACxF;AACA,SAAO;AACT;AAEA,eAAe,mCAAmC,SAAiB,QAA+B;AAChG,QAAM,YAAY,MAAM,qBAAqB,OAAO,CAAC,QAAQ,eAAe,iBAAiB,GAAG,EAAE,KAAK,QAAQ,CAAC,GAC7G,MAAM,OAAO,EACb,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO;AACjB,MAAI,SAAS,WAAW,EAAG;AAC3B,aAAW,QAAQ,UAAU;AAC3B,UAAM,WAAW,MAAM,cAAc,SAAS,QAAQ,IAAI;AAC1D,UAAM,aAAa,MAAM,cAAc,SAAS,UAAU,MAAM,IAAI,IAAI;AACxE,QAAI,aAAa,UAAU;AACzB,YAAM,WAAW,OAAO,CAAC,YAAY,YAAY,MAAM,IAAI,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,IAChF,OAAO;AACL,YAAM,WAAW,OAAO,CAAC,YAAY,UAAU,MAAM,IAAI,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,IAC9E;AACA,UAAM,WAAW,OAAO,CAAC,OAAO,MAAM,IAAI,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,EAC/D;AACA,QAAM,aAAa,MAAM,qBAAqB,OAAO,CAAC,aAAa,MAAM,YAAY,YAAY,GAAG,EAAE,KAAK,QAAQ,CAAC,GAAG,KAAK;AAC5H,MAAI,WAAW;AACb,UAAM,WAAW,OAAO,CAAC,UAAU,MAAM,yCAAyC,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,EACvG;AACF;AAEA,eAAe,cAAc,SAAiB,KAAa,MAA+B;AACxF,MAAI;AACF,UAAM,UAAU,MAAM,qBAAqB,OAAO,CAAC,OAAO,MAAM,gBAAgB,KAAK,MAAM,IAAI,GAAG,EAAE,KAAK,QAAQ,CAAC,GAAG,KAAK;AAC1H,WAAO,SAAS,OAAO,SAAS,QAAQ,EAAE,IAAI;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mCACb,SACA,uBACA,cACe;AACf,QAAM,YAAY,MAAM,qBAAqB,OAAO,CAAC,QAAQ,eAAe,iBAAiB,GAAG,EAAE,KAAK,QAAQ,CAAC,GAC7G,MAAM,OAAO,EACb,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO;AACjB,MAAI,SAAS,WAAW,EAAG;AAC3B,aAAW,QAAQ,UAAU;AAC3B,UAAM,aAAa,sBAAsB,IAAI,IAAI,KAAK;AACtD,UAAM,cAAc,aAAa,IAAI,IAAI,KAAK;AAC9C,UAAM,OAAO,cAAc,cAAc,aAAa;AACtD,UAAM,WAAW,OAAO,CAAC,YAAY,MAAM,MAAM,IAAI,GAAG,EAAE,KAAK,QAAQ,CAAC;AACxE,UAAM,WAAW,OAAO,CAAC,OAAO,MAAM,IAAI,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,EAC/D;AACA,QAAM,aAAa,MAAM,qBAAqB,OAAO,CAAC,aAAa,MAAM,YAAY,YAAY,GAAG,EAAE,KAAK,QAAQ,CAAC,GAAG,KAAK;AAC5H,MAAI,WAAW;AACb,UAAM,WAAW,OAAO,CAAC,UAAU,MAAM,+CAA+C,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,EAC7G;AACF;AAEA,eAAe,mBAAmB,KAA2C;AAC3E,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,eAAe,KAAK,KAAK,MAAM;AACrC,SAAO;AACT;AAEA,eAAe,eAAe,SAAiB,YAAoB,KAAyC;AAC1G,MAAI;AACJ,MAAI;AACF,cAAW,MAAM,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,EAC9D,QAAQ;AACN;AAAA,EACF;AACA,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAY,OAAO,MAAM,IAAI;AACnC,QAAI,cAAc,OAAQ;AAC1B,UAAM,eAAe,KAAK,YAAY,SAAS;AAC/C,UAAM,eAAe,aAAa,MAAM,QAAQ,SAAS,CAAC;AAC1D,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,eAAe,SAAS,cAAc,GAAG;AAC/C;AAAA,IACF;AACA,QAAI,CAAC,MAAM,OAAO,EAAG;AACrB,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,YAAY;AACpC,UAAI,IAAI,cAAc,KAAK,OAAO;AAAA,IACpC,QAAQ;AAAA,IAAC;AAAA,EACX;AACF;AAEA,eAAe,gCACb,OACA,WACA,UACA,eACe;AACf,QAAM,YAAY,oBAAoB,WAAW,UAAU,KAAK;AAChE,QAAM,SAAS,uBAAuB;AACtC,QAAM,UAAU,MAAM,4BAA4B,WAAW,MAAM;AACnE,OAAK;AACL,QAAM,WAAW,OAAO,CAAC,UAAU,cAAc,mBAAmB,GAAG,EAAE,KAAK,QAAQ,CAAC;AACvF,QAAM,WAAW,OAAO,CAAC,UAAU,aAAa,aAAa,GAAG,EAAE,KAAK,QAAQ,CAAC;AAChF,QAAM,WAAW,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,KAAK,QAAQ,CAAC;AACtD,QAAM,UAAU,MAAM,qBAAqB,OAAO,CAAC,UAAU,aAAa,GAAG,EAAE,KAAK,QAAQ,CAAC,GAAG,KAAK;AACrG,MAAI,CAAC,OAAQ;AACb,QAAM,WAAW,OAAO,CAAC,UAAU,MAAM,2CAA2C,GAAG,EAAE,KAAK,QAAQ,CAAC;AACvG,QAAM,WAAW,OAAO,CAAC,QAAQ,UAAU,QAAQ,MAAM,EAAE,GAAG,EAAE,KAAK,QAAQ,CAAC;AAChF;AAEA,eAAe,kCAAkC,OAAe,WAAmB,UAAiC;AAClH,QAAM,YAAY,oBAAoB,WAAW,UAAU,KAAK;AAChE,QAAM,SAAS,uBAAuB;AACtC,QAAM,4BAA4B,WAAW,MAAM;AACrD;AAEA,eAAe,uCAAsD;AACnE,QAAM,UAAU,sBAAsB,0BAA0B,IAAI,yBAAyB;AAC7F,QAAM,SAAS,uBAAuB;AACtC,QAAM,4BAA4B,SAAS,MAAM;AACnD;AAEA,eAAe,yBAAyB,WAAkD;AACxF,QAAM,QAAQ,MAAM,oBAAoB;AACxC,QAAM,SAAS,EAAE,GAAI,MAAM,mBAAmB,CAAC,EAAG;AAClD,QAAM,OAAO,MAAM,gBAAgB;AACnC,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,iBAAiB,oBAAI,IAAY;AACvC,aAAW,SAAS,MAAM;AACxB,QAAI,eAAe,IAAI,MAAM,IAAI,EAAG;AACpC,UAAM,gBAAgB,kBAAkB,IAAI,MAAM,IAAI;AACtD,QAAI,CAAC,eAAe;AAClB,wBAAkB,IAAI,MAAM,MAAM,MAAM,KAAK;AAC7C;AAAA,IACF;AACA,QAAI,kBAAkB,MAAM,OAAO;AACjC,wBAAkB,OAAO,MAAM,IAAI;AACnC,qBAAe,IAAI,MAAM,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,SAAU,MAAM,UAAU,IAAI,eAAe,CAAC,CAAC;AACrD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAwB,CAAC;AAC/B,MAAI,gBAAgB;AACpB,aAAW,SAAS,OAAO,QAAQ,CAAC,GAAG;AACrC,eAAW,SAAS,MAAM,UAAU,CAAC,GAAG;AACtC,YAAM,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC3D,UAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAG;AAC7B,WAAK,IAAI,IAAI;AACb,UAAI,QAAQ,OAAO,IAAI;AACvB,UAAI,CAAC,OAAO;AACV,gBAAQ,kBAAkB,IAAI,IAAI,KAAK;AACvC,YAAI,OAAO;AACT,iBAAO,IAAI,IAAI;AACf,0BAAgB;AAAA,QAClB;AAAA,MACF;AACA,aAAO,KAAK,EAAE,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,MAAM,SAAS,MAAM,YAAY,MAAM,CAAC;AAAA,IACrF;AAAA,EACF;AACA,MAAI,eAAe;AACjB,UAAM,qBAAqB,EAAE,GAAG,OAAO,iBAAiB,OAAO,CAAC;AAAA,EAClE;AACA,SAAO,KAAK,CAAC,GAAG,MAAM,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,cAAc,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9F,SAAO;AACT;AAEA,eAAe,qBAAqB,WAAyC;AAC3E,QAAM,QAAQ,MAAM,oBAAoB;AACxC,MAAI,CAAC,MAAM,eAAe,CAAC,MAAM,aAAa,CAAC,MAAM,SAAU;AAC/D,MAAI,qBAAqB,MAAM,WAAW,MAAM,QAAQ,GAAG;AACzD,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,QAAM,QAAQ,MAAM,yBAAyB,SAAS;AACtD,QAAM,eAAe,MAAM,4BAA4B;AACvD,QAAM,0BAA0B,MAAM,aAAa,MAAM,WAAW,MAAM,UAAU,KAAK;AACzF,QAAM,gCAAgC,MAAM,aAAa,MAAM,WAAW,MAAM,UAAU,YAAY;AACxG;AAEA,eAAe,yCAAwD;AACrE,QAAM,eAAe,gBAAgB;AACrC,QAAM,mBAAmB,KAAK,cAAc,UAAU,WAAW;AACjE,QAAM,kBAAkB,KAAK,cAAc,WAAW;AACtD,QAAM,MAAM,KAAK,cAAc,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,MAAI,kBAAkB;AACtB,MAAI;AACF,UAAM,kBAAkB,MAAM,MAAM,eAAe;AACnD,QAAI,gBAAgB,OAAO,KAAK,gBAAgB,eAAe,GAAG;AAChE,YAAM,UAAU,MAAM,SAAS,iBAAiB,MAAM;AACtD,YAAM,UAAU,kBAAkB,SAAS,MAAM;AACjD,wBAAkB;AAAA,IACpB,OAAO;AACL,YAAM,GAAG,iBAAiB,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,MAAI,CAAC,iBAAiB;AACpB,QAAI;AACF,YAAM,mBAAmB,MAAM,KAAK,gBAAgB;AACpD,UAAI,CAAC,iBAAiB,OAAO,GAAG;AAC9B,cAAM,GAAG,kBAAkB,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAC3D,cAAM,UAAU,kBAAkB,IAAI,MAAM;AAAA,MAC9C;AAAA,IACF,QAAQ;AACN,YAAM,UAAU,kBAAkB,IAAI,MAAM;AAAA,IAC9C;AAAA,EACF;AACA,QAAM,iBAAiB,KAAK,UAAU,WAAW;AACjD,MAAI;AACF,UAAM,UAAU,MAAM,MAAM,eAAe;AAC3C,QAAI,QAAQ,eAAe,GAAG;AAC5B,YAAM,iBAAiB,MAAM,SAAS,eAAe;AACrD,UAAI,mBAAmB,eAAgB;AAAA,IACzC;AACA,UAAM,GAAG,iBAAiB,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAAA,EAC5D,QAAQ;AAAA,EAAC;AACT,QAAM,QAAQ,gBAAgB,eAAe;AAC/C;AAEA,eAAsB,8BAA8B,WAAyC;AAC3F,MAAI,6BAA8B;AAClC,iCAA+B;AAC/B,oBAAkB,aAAa;AAC/B,oBAAkB,gBAAe,oBAAI,KAAK,GAAE,YAAY;AACxD,oBAAkB,YAAY;AAC9B,oBAAkB,SAAS,uBAAuB;AAClD,MAAI;AACF,UAAM,QAAQ,MAAM,oBAAoB;AACxC,QAAI,CAAC,MAAM,aAAa;AACtB,YAAM,uCAAuC;AAC7C,UAAI,CAAC,qBAAqB,GAAG;AAC3B,0BAAkB,OAAO;AACzB,0BAAkB,aAAa;AAC/B,0BAAkB,oBAAmB,oBAAI,KAAK,GAAE,YAAY;AAC5D;AAAA,MACF;AACA,wBAAkB,OAAO;AACzB,wBAAkB,aAAa;AAC/B,YAAM,qCAAqC;AAC3C,UAAI;AAAE,cAAM,UAAU,IAAI,eAAe,EAAE,aAAa,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AACzE,wBAAkB,oBAAmB,oBAAI,KAAK,GAAE,YAAY;AAC5D,wBAAkB,aAAa;AAC/B;AAAA,IACF;AACA,sBAAkB,OAAO;AACzB,sBAAkB,aAAa;AAC/B,UAAM,WAAW,MAAM,kBAAkB,MAAM,sBAAsB,MAAM,WAAW;AACtF,UAAM,WAAW;AACjB,UAAM,8BAA8B,MAAM,aAAa,UAAU,QAAQ;AACzE,UAAM,qBAAqB,EAAE,GAAG,OAAO,gBAAgB,UAAU,WAAW,UAAU,SAAS,CAAC;AAChG,sBAAkB,aAAa;AAC/B,UAAM,kCAAkC,MAAM,aAAa,UAAU,QAAQ;AAC7E,QAAI;AAAE,YAAM,UAAU,IAAI,eAAe,EAAE,aAAa,KAAK,CAAC;AAAA,IAAE,QAAQ;AAAA,IAAC;AACzE,sBAAkB,aAAa;AAC/B,UAAM,qBAAqB,SAAS;AACpC,sBAAkB,oBAAmB,oBAAI,KAAK,GAAE,YAAY;AAC5D,sBAAkB,aAAa;AAAA,EACjC,SAAS,OAAO;AACd,sBAAkB,YAAY,gBAAgB,OAAO,qBAAqB;AAC1E,sBAAkB,aAAa;AAAA,EACjC,UAAE;AACA,sBAAkB,aAAa;AAAA,EACjC;AACF;AAEA,eAAe,2BAA2B,OAAe,UAAkB,WAAyC;AAClH,QAAM,WAAW;AACjB,QAAM,8BAA8B,OAAO,UAAU,QAAQ;AAC7D,QAAM,UAAU,MAAM,oBAAoB;AAC1C,QAAM,qBAAqB,EAAE,GAAG,SAAS,aAAa,OAAO,gBAAgB,UAAU,WAAW,UAAU,SAAS,CAAC;AACtH,QAAM,kCAAkC,OAAO,UAAU,QAAQ;AACjE,MAAI;AAAE,UAAM,UAAU,IAAI,eAAe,EAAE,aAAa,KAAK,CAAC;AAAA,EAAE,QAAQ;AAAA,EAAC;AACzE,QAAM,qBAAqB,SAAS;AACtC;AAEA,eAAe,gBACb,YACA,OACA,OACA,MACA,cAC0B;AAC1B,QAAM,IAAI,MAAM,YAAY,EAAE,KAAK;AACnC,QAAM,WAAW,IACb,WAAW,OAAO,CAAC,MAAM;AACzB,QAAI,EAAE,KAAK,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,EAAG,QAAO;AAClF,UAAM,SAAS,UAAU,IAAI,GAAG,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE;AACnD,WAAO,QAAQ,QAAQ,aAAa,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EAC/D,CAAC,IACC;AACJ,QAAM,OAAO,SAAS,MAAM,GAAG,KAAK,IAAI,QAAQ,GAAG,GAAG,CAAC;AACvD,QAAM,eAAe,IAAI;AACzB,MAAI,UAAU,KAAK,IAAI,aAAa;AACpC,MAAI,SAAS,QAAQ;AACnB,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AAAA,EACtD,WAAW,GAAG;AACZ,YAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,YAAM,SAAS,EAAE,KAAK,YAAY,MAAM,IAAI,IAAI;AAChD,YAAM,SAAS,EAAE,KAAK,YAAY,MAAM,IAAI,IAAI;AAChD,UAAI,WAAW,OAAQ,QAAO,SAAS;AACvC,aAAO,EAAE,cAAc,EAAE;AAAA,IAC3B,CAAC;AAAA,EACH;AACA,SAAO,QAAQ,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,MAAM;AACxC,UAAM,QAAQ,aAAa,IAAI,EAAE,IAAI;AACrC,WAAO,QAAQ,EAAE,GAAG,GAAG,WAAW,MAAM,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,IAAI;AAAA,EACvF,CAAC;AACH;AAEA,eAAsB,mBACpB,KACA,KACA,KACA,SACkB;AAClB,QAAM,EAAE,WAAW,cAAAC,cAAa,IAAI;AACpC,MAAI,IAAI,WAAW,SAAS,IAAI,aAAa,yBAAyB;AACpE,QAAI;AACF,YAAM,IAAI,IAAI,aAAa,IAAI,GAAG,KAAK;AACvC,YAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,SAAS,IAAI,aAAa,IAAI,OAAO,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC,GAAG,GAAG;AAClG,YAAM,OAAO,IAAI,aAAa,IAAI,MAAM,KAAK;AAC7C,YAAM,aAAa,MAAM,gBAAgB;AAEzC,YAAM,eAAe,MAAM,4BAA4B;AACvD,UAAI;AACF,cAAM,SAAU,MAAM,UAAU,IAAI,eAAe,CAAC,CAAC;AACrD,mBAAW,SAAS,OAAO,QAAQ,CAAC,GAAG;AACrC,qBAAW,SAAS,MAAM,UAAU,CAAC,GAAG;AACtC,gBAAI,MAAM,MAAM;AACd,2BAAa,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,QAAQ,IAAI,SAAS,MAAM,YAAY,MAAM,CAAC;AAAA,YAC7G;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAC;AAET,YAAM,sBAAsB,WAAW,OAAO,CAAC,MAAM,aAAa,IAAI,EAAE,IAAI,CAAC;AAC7E,YAAM,eAAe,mBAAmB;AAExC,YAAM,YAA6B,CAAC;AACpC,iBAAW,CAAC,EAAE,IAAI,KAAK,cAAc;AACnC,cAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AAC5D,cAAM,OAAO,WAAW,cAAc,QAAQ,IAAI;AAAA,UAChD,MAAM,KAAK;AAAA,UAAM,OAAO;AAAA,UAAS,aAAa;AAAA,UAAI,aAAa;AAAA,UAAI,aAAa;AAAA,UAAG,WAAW;AAAA,UAAI,KAAK;AAAA,UAAI,WAAW;AAAA,QACxH;AACA,kBAAU,KAAK,EAAE,GAAG,MAAM,WAAW,MAAM,MAAM,KAAK,MAAM,SAAS,KAAK,QAAQ,CAAC;AAAA,MACrF;AAEA,YAAM,UAAU,MAAM,gBAAgB,YAAY,GAAG,OAAO,MAAM,YAAY;AAC9E,cAAQ,KAAK,KAAK,EAAE,MAAM,SAAS,WAAW,OAAO,WAAW,OAAO,CAAC;AAAA,IAC1E,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,4BAA4B,EAAE,CAAC;AAAA,IACnF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,SAAS,IAAI,aAAa,iCAAiC;AAC5E,UAAM,QAAQ,MAAM,oBAAoB;AACxC,YAAQ,KAAK,KAAK;AAAA,MAChB,MAAM;AAAA,QACJ,UAAU,QAAQ,MAAM,WAAW;AAAA,QACnC,gBAAgB,MAAM,kBAAkB;AAAA,QACxC,WAAW,MAAM,aAAa;AAAA,QAC9B,UAAU,MAAM,YAAY;AAAA,QAC5B,YAAY,QAAQ,MAAM,eAAe,MAAM,aAAa,MAAM,QAAQ;AAAA,QAC1E,SAAS;AAAA,UACP,YAAY,kBAAkB;AAAA,UAC9B,MAAM,kBAAkB;AAAA,UACxB,QAAQ,kBAAkB;AAAA,UAC1B,YAAY,kBAAkB;AAAA,UAC9B,cAAc,kBAAkB;AAAA,UAChC,kBAAkB,kBAAkB;AAAA,UACpC,WAAW,kBAAkB;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,UAAU,IAAI,aAAa,6CAA6C;AACzF,QAAI;AACF,YAAM,UAAU,MAAM,uBAAuB;AAC7C,cAAQ,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,IACrC,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,8BAA8B,EAAE,CAAC;AAAA,IACrF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,UAAU,IAAI,aAAa,6CAA6C;AACzF,QAAI;AACF,YAAM,UAAU,SAAS,MAAMA,cAAa,GAAG,CAAC;AAChD,YAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,MAAM,KAAK,IAAI;AAC1E,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACnD,eAAO;AAAA,MACT;AACA,YAAM,WAAW,MAAM,sBAAsB,KAAK;AAClD,YAAM,2BAA2B,OAAO,UAAU,SAAS;AAC3D,cAAQ,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,EAAE,gBAAgB,SAAS,EAAE,CAAC;AAAA,IACpE,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,mCAAmC,EAAE,CAAC;AAAA,IAC1F;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,UAAU,IAAI,aAAa,wCAAwC;AACpF,QAAI;AACF,YAAM,QAAQ,MAAM,oBAAoB;AACxC,YAAM,qBAAqB;AAAA,QACzB,GAAG;AAAA,QACH,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,UAAU;AAAA,MACZ,CAAC;AACD,cAAQ,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC;AAAA,IAChC,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,yBAAyB,EAAE,CAAC;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,UAAU,IAAI,aAAa,gDAAgD;AAC5F,QAAI;AACF,YAAM,UAAU,SAAS,MAAMA,cAAa,GAAG,CAAC;AAChD,YAAM,aAAa,OAAO,SAAS,eAAe,WAAW,QAAQ,aAAa;AAClF,UAAI,CAAC,YAAY;AACf,gBAAQ,KAAK,KAAK,EAAE,OAAO,qBAAqB,CAAC;AACjD,eAAO;AAAA,MACT;AACA,YAAM,SAAS,MAAM,0BAA0B,UAAU;AACzD,UAAI,CAAC,OAAO,OAAO;AACjB,gBAAQ,KAAK,KAAK,EAAE,IAAI,OAAO,SAAS,OAAO,UAAU,yBAAyB,OAAO,OAAO,SAAS,eAAe,CAAC;AACzH,eAAO;AAAA,MACT;AACA,YAAM,QAAQ,OAAO;AACrB,YAAM,WAAW,MAAM,sBAAsB,KAAK;AAClD,YAAM,2BAA2B,OAAO,UAAU,SAAS;AAC3D,cAAQ,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,EAAE,gBAAgB,SAAS,EAAE,CAAC;AAAA,IACpE,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,iCAAiC,EAAE,CAAC;AAAA,IACxF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,UAAU,IAAI,aAAa,+BAA+B;AAC3E,QAAI;AACF,YAAM,QAAQ,MAAM,oBAAoB;AACxC,UAAI,CAAC,MAAM,eAAe,CAAC,MAAM,aAAa,CAAC,MAAM,UAAU;AAC7D,gBAAQ,KAAK,KAAK,EAAE,OAAO,oCAAoC,CAAC;AAChE,eAAO;AAAA,MACT;AACA,UAAI,qBAAqB,MAAM,WAAW,MAAM,QAAQ,GAAG;AACzD,gBAAQ,KAAK,KAAK,EAAE,OAAO,0CAA0C,CAAC;AACtE,eAAO;AAAA,MACT;AACA,YAAM,QAAQ,MAAM,yBAAyB,SAAS;AACtD,YAAM,eAAe,MAAM,4BAA4B;AACvD,YAAM,0BAA0B,MAAM,aAAa,MAAM,WAAW,MAAM,UAAU,KAAK;AACzF,YAAM,gCAAgC,MAAM,aAAa,MAAM,WAAW,MAAM,UAAU,YAAY;AACtG,cAAQ,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,OAAO,EAAE,CAAC;AAAA,IAChE,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,8BAA8B,EAAE,CAAC;AAAA,IACrF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,UAAU,IAAI,aAAa,+BAA+B;AAC3E,QAAI;AACF,YAAM,QAAQ,MAAM,oBAAoB;AACxC,UAAI,CAAC,MAAM,eAAe,CAAC,MAAM,aAAa,CAAC,MAAM,UAAU;AAC7D,cAAM,qCAAqC;AAC3C,YAAI;AAAE,gBAAM,UAAU,IAAI,eAAe,EAAE,aAAa,KAAK,CAAC;AAAA,QAAE,QAAQ;AAAA,QAAC;AACzE,gBAAQ,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,EAAE,QAAQ,GAAG,QAAQ,WAAW,EAAE,CAAC;AACvE,eAAO;AAAA,MACT;AACA,YAAM,SAAS,MAAM,yBAAyB,MAAM,aAAa,MAAM,WAAW,MAAM,QAAQ;AAChG,YAAM,OAAO,MAAM,gBAAgB;AACnC,YAAM,oBAAoB,oBAAI,IAAoB;AAClD,YAAM,iBAAiB,oBAAI,IAAY;AACvC,iBAAW,SAAS,MAAM;AACxB,YAAI,eAAe,IAAI,MAAM,IAAI,EAAG;AACpC,cAAM,gBAAgB,kBAAkB,IAAI,MAAM,IAAI;AACtD,YAAI,CAAC,eAAe;AAClB,4BAAkB,IAAI,MAAM,MAAM,MAAM,KAAK;AAC7C;AAAA,QACF;AACA,YAAI,kBAAkB,MAAM,OAAO;AACjC,4BAAkB,OAAO,MAAM,IAAI;AACnC,yBAAe,IAAI,MAAM,IAAI;AAAA,QAC/B;AAAA,MACF;AACA,YAAM,WAAW,MAAM,oBAAoB,SAAS;AACpD,YAAM,kCAAkC,MAAM,aAAa,MAAM,WAAW,MAAM,QAAQ;AAC1F,YAAM,kBAAkB;AACxB,YAAM,cAAc,MAAM,4BAA4B;AACtD,iBAAW,SAAS,QAAQ;AAC1B,cAAM,QAAQ,MAAM,SAAS,kBAAkB,IAAI,MAAM,IAAI,KAAK;AAClE,YAAI,CAAC,MAAO;AACZ,YAAI,CAAC,YAAY,IAAI,MAAM,IAAI,GAAG;AAChC,gBAAM,WAAW,WAAW;AAAA,YAC1B;AAAA,YACA;AAAA,YAAU,GAAG,gBAAgB,IAAI,eAAe;AAAA,YAChD;AAAA,YAAU,UAAU,KAAK,IAAI,MAAM,IAAI;AAAA,YACvC;AAAA,YAAU;AAAA,YACV;AAAA,YAAY;AAAA,UACd,CAAC;AAAA,QACH;AACA,cAAM,YAAY,KAAK,UAAU,MAAM,IAAI;AAC3C,cAAM,UAAU,IAAI,uBAAuB,EAAE,MAAM,WAAW,SAAS,MAAM,QAAQ,CAAC;AAAA,MACxF;AACA,YAAM,cAAc,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AACzD,iBAAW,CAAC,MAAM,SAAS,KAAK,YAAY,QAAQ,GAAG;AACrD,YAAI,CAAC,YAAY,IAAI,IAAI,GAAG;AAC1B,gBAAM,GAAG,UAAU,KAAK,QAAQ,gBAAgB,EAAE,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,QACvF;AAAA,MACF;AACA,YAAM,aAAqC,CAAC;AAC5C,iBAAW,QAAQ,QAAQ;AACzB,cAAM,QAAQ,KAAK,SAAS,kBAAkB,IAAI,KAAK,IAAI,KAAK;AAChE,YAAI,MAAO,YAAW,KAAK,IAAI,IAAI;AAAA,MACrC;AACA,YAAM,qBAAqB,EAAE,GAAG,OAAO,iBAAiB,WAAW,CAAC;AACpE,UAAI;AAAE,cAAM,UAAU,IAAI,eAAe,EAAE,aAAa,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AACzE,cAAQ,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,EAAE,QAAQ,OAAO,OAAO,EAAE,CAAC;AAAA,IACjE,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,8BAA8B,EAAE,CAAC;AAAA,IACrF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,SAAS,IAAI,aAAa,gCAAgC;AAC3E,QAAI;AACF,YAAM,QAAQ,IAAI,aAAa,IAAI,OAAO,KAAK;AAC/C,YAAM,OAAO,IAAI,aAAa,IAAI,MAAM,KAAK;AAC7C,UAAI,CAAC,SAAS,CAAC,MAAM;AACnB,gBAAQ,KAAK,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACpD,eAAO;AAAA,MACT;AACA,YAAM,SAAS,qCAAqC,gBAAgB,IAAI,eAAe,gBAAgB,KAAK,IAAI,IAAI;AACpH,YAAM,OAAO,MAAM,MAAM,MAAM;AAC/B,UAAI,CAAC,KAAK,GAAI,OAAM,IAAI,MAAM,6BAA6B,KAAK,MAAM,EAAE;AACxE,YAAM,UAAU,MAAM,KAAK,KAAK;AAChC,cAAQ,KAAK,KAAK,EAAE,QAAQ,CAAC;AAAA,IAC/B,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,0BAA0B,EAAE,CAAC;AAAA,IACjF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,UAAU,IAAI,aAAa,iCAAiC;AAC7E,QAAI;AACF,YAAM,UAAU,SAAS,MAAMA,cAAa,GAAG,CAAC;AAChD,YAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AACnE,YAAM,OAAO,OAAO,SAAS,SAAS,WAAW,QAAQ,OAAO;AAChE,UAAI,CAAC,SAAS,CAAC,MAAM;AACnB,gBAAQ,KAAK,KAAK,EAAE,OAAO,wBAAwB,CAAC;AACpD,eAAO;AAAA,MACT;AACA,YAAM,kBAAkB;AACxB,YAAM,cAAc,MAAM,oBAAoB,SAAS;AACvD,YAAM,WAAW,WAAW;AAAA,QAC1B;AAAA,QACA;AAAA,QAAU,GAAG,gBAAgB,IAAI,eAAe;AAAA,QAChD;AAAA,QAAU,UAAU,KAAK,IAAI,IAAI;AAAA,QACjC;AAAA,QAAU;AAAA,QACV;AAAA,QAAY;AAAA,MACd,CAAC;AACD,YAAM,WAAW,KAAK,aAAa,IAAI;AACvC,YAAM,4BAA4B,WAAW,QAAQ;AACrD,YAAM,YAAY,MAAM,oBAAoB;AAC5C,YAAM,aAAa,EAAE,GAAI,UAAU,mBAAmB,CAAC,GAAI,CAAC,IAAI,GAAG,MAAM;AACzE,YAAM,qBAAqB,EAAE,GAAG,WAAW,iBAAiB,WAAW,CAAC;AACxE,YAAM,qBAAqB,SAAS;AACpC,cAAQ,KAAK,KAAK,EAAE,IAAI,MAAM,MAAM,SAAS,CAAC;AAAA,IAChD,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,yBAAyB,EAAE,CAAC;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,UAAU,IAAI,aAAa,mCAAmC;AAC/E,QAAI;AACF,YAAM,UAAU,SAAS,MAAMA,cAAa,GAAG,CAAC;AAChD,YAAM,OAAO,OAAO,SAAS,SAAS,WAAW,QAAQ,OAAO;AAChE,YAAM,OAAO,OAAO,SAAS,SAAS,WAAW,QAAQ,OAAO;AAChE,YAAM,SAAS,SAAS,OAAO,KAAK,oBAAoB,GAAG,IAAI,IAAI;AACnE,UAAI,CAAC,QAAQ;AACX,gBAAQ,KAAK,KAAK,EAAE,OAAO,uBAAuB,CAAC;AACnD,eAAO;AAAA,MACT;AACA,YAAM,GAAG,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACjD,UAAI,MAAM;AACR,cAAM,YAAY,MAAM,oBAAoB;AAC5C,cAAM,aAAa,EAAE,GAAI,UAAU,mBAAmB,CAAC,EAAG;AAC1D,eAAO,WAAW,IAAI;AACtB,cAAM,qBAAqB,EAAE,GAAG,WAAW,iBAAiB,WAAW,CAAC;AAAA,MAC1E;AACA,YAAM,qBAAqB,SAAS;AACpC,UAAI;AAAE,cAAM,UAAU,IAAI,eAAe,EAAE,aAAa,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AACzE,cAAQ,KAAK,KAAK,EAAE,IAAI,MAAM,aAAa,OAAO,CAAC;AAAA,IACrD,SAAS,OAAO;AACd,cAAQ,KAAK,KAAK,EAAE,OAAO,gBAAgB,OAAO,2BAA2B,EAAE,CAAC;AAAA,IAClF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AD3mCA,SAASC,UAAS,OAAgD;AAChE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAEA,SAASC,iBAAgB,SAAkB,UAA0B;AACnE,MAAI,mBAAmB,SAAS,QAAQ,QAAQ,KAAK,EAAE,SAAS,GAAG;AACjE,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,SAASD,UAAS,OAAO;AAC/B,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,QAAQ,OAAO;AACrB,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO;AAE1D,QAAM,cAAcA,UAAS,KAAK;AAClC,MAAI,eAAe,OAAO,YAAY,YAAY,YAAY,YAAY,QAAQ,SAAS,GAAG;AAC5F,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAASE,SAAQ,KAAqB,YAAoB,SAAwB;AAChF,MAAI,aAAa;AACjB,MAAI,UAAU,gBAAgB,iCAAiC;AAC/D,MAAI,IAAI,KAAK,UAAU,OAAO,CAAC;AACjC;AAEA,SAAS,yBAAyB,mBAAoC;AACpE,QAAM,UAAUF,UAAS,iBAAiB;AAC1C,QAAM,SAASA,UAAS,SAAS,MAAM;AACvC,QAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,IAAI,OAAO,QAAQ,CAAC;AAC7D,QAAM,QAAkB,CAAC;AAEzB,aAAW,QAAQ,OAAO;AACxB,UAAM,aAAaA,UAAS,IAAI;AAChC,UAAM,QAAQ,MAAM,QAAQ,YAAY,KAAK,IAAI,WAAW,QAAQ,CAAC;AACrE,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAaA,UAAS,IAAI;AAChC,YAAM,OAAO,OAAO,YAAY,SAAS,WAAW,WAAW,OAAO;AACtE,UAAI,SAAS,kBAAkB,OAAO,YAAY,SAAS,YAAY,WAAW,KAAK,KAAK,EAAE,SAAS,GAAG;AACxG,cAAM,KAAK,WAAW,KAAK,KAAK,CAAC;AACjC;AAAA,MACF;AACA,UAAI,SAAS,eAAe;AAC1B,cAAM,UAAU,MAAM,QAAQ,YAAY,OAAO,IAAI,WAAW,UAAU,CAAC;AAC3E,mBAAW,SAAS,SAAS;AAC3B,gBAAM,cAAcA,UAAS,KAAK;AAClC,cAAI,aAAa,SAAS,UAAU,OAAO,YAAY,SAAS,YAAY,YAAY,KAAK,KAAK,EAAE,SAAS,GAAG;AAC9G,kBAAM,KAAK,YAAY,KAAK,KAAK,CAAC;AAAA,UACpC;AAAA,QACF;AACA;AAAA,MACF;AACA,UAAI,SAAS,oBAAoB;AAC/B,cAAM,UAAU,OAAO,YAAY,YAAY,WAAW,WAAW,QAAQ,KAAK,IAAI;AACtF,cAAM,SAAS,OAAO,YAAY,qBAAqB,WAAW,WAAW,iBAAiB,KAAK,IAAI;AACvG,YAAI,QAAS,OAAM,KAAK,OAAO;AAC/B,YAAI,OAAQ,OAAM,KAAK,MAAM;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAC/B;AAEA,SAAS,mBAAmB,OAAe,KAAoC;AAC7E,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,MAAI,CAAC,EAAG,QAAO;AACf,SACE,IAAI,MAAM,YAAY,EAAE,SAAS,CAAC,KAClC,IAAI,QAAQ,YAAY,EAAE,SAAS,CAAC,KACpC,IAAI,YAAY,YAAY,EAAE,SAAS,CAAC;AAE5C;AAEA,SAAS,mBAAmB,MAAc,OAAuB;AAC/D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,YAAY,KAAK,YAAY;AACnC,QAAM,aAAa,MAAM,YAAY;AACrC,QAAM,WAAW,UAAU,MAAM,UAAU,YAAY,GAAG,IAAI,CAAC;AAC/D,MAAI,aAAa,WAAY,QAAO;AACpC,MAAI,SAAS,WAAW,UAAU,EAAG,QAAO;AAC5C,MAAI,SAAS,SAAS,UAAU,EAAG,QAAO;AAC1C,MAAI,UAAU,SAAS,IAAI,UAAU,EAAE,EAAG,QAAO;AACjD,MAAI,UAAU,SAAS,UAAU,EAAG,QAAO;AAC3C,SAAO;AACT;AAEA,eAAe,qBAAqB,KAAgC;AAClE,SAAO,MAAM,IAAI,QAAkB,CAACG,UAAS,WAAW;AACtD,UAAM,OAAOC,OAAM,MAAM,CAAC,WAAW,YAAY,MAAM,SAAS,MAAM,eAAe,GAAG;AAAA,MACtF;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,SAAS;AACb,QAAI,SAAS;AACb,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,GAAG,SAAS,MAAM;AACvB,SAAK,GAAG,SAAS,CAAC,SAAS;AACzB,UAAI,SAAS,GAAG;AACd,cAAM,OAAO,OACV,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACjB,QAAAD,SAAQ,IAAI;AACZ;AAAA,MACF;AACA,YAAM,UAAU,CAAC,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACxE,aAAO,IAAI,MAAM,WAAW,mBAAmB,CAAC;AAAA,IAClD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAASE,mBAA0B;AACjC,QAAM,YAAY,QAAQ,IAAI,YAAY,KAAK;AAC/C,SAAO,aAAa,UAAU,SAAS,IAAI,YAAYC,MAAKC,SAAQ,GAAG,QAAQ;AACjF;AAMA,eAAeC,YAAW,SAAiB,MAAgB,UAA4B,CAAC,GAAkB;AACxG,QAAM,IAAI,QAAc,CAACC,UAAS,WAAW;AAC3C,UAAM,OAAOC,OAAM,SAAS,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,SAAS;AACb,QAAI,SAAS;AACb,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,GAAG,SAAS,MAAM;AACvB,SAAK,GAAG,SAAS,CAAC,SAAS;AACzB,UAAI,SAAS,GAAG;AACd,QAAAD,SAAQ;AACR;AAAA,MACF;AACA,YAAM,UAAU,CAAC,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACxE,YAAM,SAAS,QAAQ,SAAS,IAAI,KAAK,OAAO,KAAK;AACrD,aAAO,IAAI,MAAM,mBAAmB,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;AAAA,IAC5E,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,mBAAmB,OAAyB;AACnD,QAAM,UAAUE,iBAAgB,OAAO,EAAE,EAAE,YAAY;AACvD,SACE,QAAQ,SAAS,iCAAiC,KAClD,QAAQ,SAAS,+BAA+B,KAChD,QAAQ,SAAS,yBAAyB;AAE9C;AAEA,SAAS,wBAAwB,OAAyB;AACxD,QAAM,UAAUA,iBAAgB,OAAO,EAAE,EAAE,YAAY;AACvD,SAAO,QAAQ,SAAS,sBAAsB,KAAK,QAAQ,SAAS,6BAA6B;AACnG;AAEA,eAAe,2BAA2B,UAAiC;AACzE,QAAM,aAAaC,MAAK,UAAU,WAAW;AAC7C,MAAI;AACF,UAAMC,MAAK,UAAU;AAAA,EACvB,QAAQ;AACN,UAAMC,WAAU,YAAY,IAAI,MAAM;AAAA,EACxC;AAEA,QAAMN,YAAW,OAAO,CAAC,OAAO,WAAW,GAAG,EAAE,KAAK,SAAS,CAAC;AAC/D,QAAMA;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,mBAAmB,MAAM,0BAA0B,UAAU,MAAM,4CAA4C;AAAA,IACtH,EAAE,KAAK,SAAS;AAAA,EAClB;AACF;AAEA,eAAe,kBAAkB,SAAiB,MAAgB,UAA4B,CAAC,GAAoB;AACjH,SAAO,MAAM,IAAI,QAAgB,CAACC,UAAS,WAAW;AACpD,UAAM,OAAOC,OAAM,SAAS,MAAM;AAAA,MAChC,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,QAAI,SAAS;AACb,QAAI,SAAS;AACb,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAU,MAAM,SAAS;AAAA,IAAE,CAAC;AACxE,SAAK,GAAG,SAAS,MAAM;AACvB,SAAK,GAAG,SAAS,CAAC,SAAS;AACzB,UAAI,SAAS,GAAG;AACd,QAAAD,SAAQ,OAAO,KAAK,CAAC;AACrB;AAAA,MACF;AACA,YAAM,UAAU,CAAC,OAAO,KAAK,GAAG,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACxE,YAAM,SAAS,QAAQ,SAAS,IAAI,KAAK,OAAO,KAAK;AACrD,aAAO,IAAI,MAAM,mBAAmB,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;AAAA,IAC5E,CAAC;AAAA,EACH,CAAC;AACH;AA2BA,SAAS,qBAAqB,OAA0B;AACtD,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,QAAM,aAAuB,CAAC;AAC9B,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,YAAY,KAAK,SAAS,KAAK,CAAC,WAAW,SAAS,IAAI,GAAG;AAC7E,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAwC;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACzE,QAAM,OAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAgC,GAAG;AAC1E,QAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,KAAK,OAAO,SAAS,UAAU;AACzE,WAAK,GAAG,IAAI;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,mBAA2B;AAClC,SAAOM,MAAKC,iBAAgB,GAAG,WAAW;AAC5C;AASA,eAAe,gBAA6E;AAC1F,MAAI;AACF,UAAM,MAAM,MAAMC,UAAS,iBAAiB,GAAG,MAAM;AACrD,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UAAM,QAAQ,KAAK,QAAQ;AAC3B,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,EAAE,aAAa,OAAO,WAAW,KAAK,QAAQ,cAAc,OAAU;AAAA,EAC/E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,0BAAkC;AACzC,SAAOF,MAAKC,iBAAgB,GAAG,0BAA0B;AAC3D;AAGA,IAAM,oBAAoB;AAE1B,SAAS,0BAA0B,OAAkC;AACnE,QAAM,SAASE,UAAS,KAAK;AAC7B,MAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAC5C,QAAM,YAAYA,UAAS,OAAO,MAAM;AACxC,QAAM,SAAiC,CAAC;AACxC,MAAI,WAAW;AACb,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC9C,UAAI,OAAO,MAAM,YAAY,EAAE,SAAS,EAAG,QAAO,CAAC,IAAI;AAAA,IACzD;AAAA,EACF;AACA,QAAM,QAAQ,qBAAqB,OAAO,KAAK;AAC/C,SAAO,EAAE,QAAQ,MAAM;AACzB;AAEA,SAAS,uBAAuB,OAAyB,IAAY,OAAiC;AACpG,QAAM,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,EAAE,GAAG,MAAM;AAC9C,QAAM,QAAQ,CAAC,IAAI,GAAG,MAAM,MAAM,OAAO,CAAC,MAAM,MAAM,EAAE,CAAC;AACzD,SAAO,MAAM,SAAS,mBAAmB;AACvC,UAAM,UAAU,MAAM,IAAI;AAC1B,QAAI,QAAS,QAAO,OAAO,OAAO;AAAA,EACpC;AACA,SAAO,EAAE,QAAQ,MAAM;AACzB;AAEA,SAAS,2BAA2B,OAAyB,IAA8B;AACzF,QAAM,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,OAAO,IAAI,MAAM;AACrC,SAAO,EAAE,QAAQ,OAAO,MAAM,MAAM,OAAO,CAAC,MAAM,MAAM,EAAE,EAAE;AAC9D;AAEA,eAAe,uBAAkD;AAC/D,QAAM,YAAY,wBAAwB;AAC1C,MAAI;AACF,UAAM,MAAM,MAAMD,UAAS,WAAW,MAAM;AAC5C,UAAM,UAAUC,UAAS,KAAK,MAAM,GAAG,CAAC,KAAK,CAAC;AAC9C,WAAO,0BAA0B,QAAQ,eAAe,CAAC;AAAA,EAC3D,QAAQ;AACN,WAAO,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACjC;AACF;AAEA,eAAe,sBAAsB,OAAwC;AAC3E,QAAM,YAAY,wBAAwB;AAC1C,MAAI,UAAmC,CAAC;AACxC,MAAI;AACF,UAAM,MAAM,MAAMD,UAAS,WAAW,MAAM;AAC5C,cAAUC,UAAS,KAAK,MAAM,GAAG,CAAC,KAAK,CAAC;AAAA,EAC1C,QAAQ;AACN,cAAU,CAAC;AAAA,EACb;AACA,UAAQ,eAAe,IAAI;AAC3B,QAAMC,WAAU,WAAW,KAAK,UAAU,OAAO,GAAG,MAAM;AAC5D;AAEA,eAAe,0BAAwD;AACrE,QAAM,YAAY,wBAAwB;AAC1C,MAAI,UAAmC,CAAC;AAExC,MAAI;AACF,UAAM,MAAM,MAAMF,UAAS,WAAW,MAAM;AAC5C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,cAAUC,UAAS,MAAM,KAAK,CAAC;AAAA,EACjC,QAAQ;AACN,cAAU,CAAC;AAAA,EACb;AAEA,SAAO;AAAA,IACL,OAAO,qBAAqB,QAAQ,gCAAgC,CAAC;AAAA,IACrE,QAAQ,sBAAsB,QAAQ,gCAAgC,CAAC;AAAA,IACvE,QAAQ,qBAAqB,QAAQ,wBAAwB,CAAC;AAAA,EAChE;AACF;AAEA,eAAe,yBAAyB,WAA+C;AACrF,QAAM,YAAY,wBAAwB;AAC1C,MAAI,UAAmC,CAAC;AACxC,MAAI;AACF,UAAM,MAAM,MAAMD,UAAS,WAAW,MAAM;AAC5C,cAAUC,UAAS,KAAK,MAAM,GAAG,CAAC,KAAK,CAAC;AAAA,EAC1C,QAAQ;AACN,cAAU,CAAC;AAAA,EACb;AAEA,UAAQ,gCAAgC,IAAI,qBAAqB,UAAU,KAAK;AAChF,UAAQ,gCAAgC,IAAI,sBAAsB,UAAU,MAAM;AAClF,UAAQ,wBAAwB,IAAI,qBAAqB,UAAU,MAAM;AAEzE,QAAMC,WAAU,WAAW,KAAK,UAAU,OAAO,GAAG,MAAM;AAC5D;AAEA,eAAe,aAAa,KAAwC;AAClE,QAAM,MAAM,MAAM,YAAY,GAAG;AACjC,MAAI,IAAI,WAAW,EAAG,QAAO;AAC7B,QAAM,OAAO,IAAI,SAAS,MAAM,EAAE,KAAK;AACvC,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,SAAO,KAAK,MAAM,IAAI;AACxB;AAEA,eAAe,YAAY,KAAuC;AAChE,QAAM,SAAuB,CAAC;AAC9B,mBAAiB,SAAS,KAAK;AAC7B,WAAO,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,EACpE;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEA,SAAS,cAAc,KAAa,QAAgB,QAAQ,GAAW;AACrE,WAAS,IAAI,OAAO,KAAK,IAAI,SAAS,OAAO,QAAQ,KAAK;AACxD,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,IAAI,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG;AAAE,gBAAQ;AAAO;AAAA,MAAM;AAAA,IACvD;AACA,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAsB,KAA2B;AACzE,QAAM,SAAmB,CAAC;AAC1B,MAAI,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AACpD,MAAI,GAAG,OAAO,YAAY;AACxB,QAAI;AACF,YAAM,OAAO,OAAO,OAAO,MAAM;AACjC,YAAM,cAAc,IAAI,QAAQ,cAAc,KAAK;AACnD,YAAM,gBAAgB,YAAY,MAAM,gBAAgB;AACxD,UAAI,CAAC,eAAe;AAAE,QAAAC,SAAQ,KAAK,KAAK,EAAE,OAAO,6BAA6B,CAAC;AAAG;AAAA,MAAO;AACzF,YAAM,WAAW,cAAc,CAAC;AAChC,YAAM,cAAc,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC/C,YAAM,QAAkB,CAAC;AACzB,UAAI,cAAc;AAClB,aAAO,cAAc,KAAK,QAAQ;AAChC,cAAM,MAAM,KAAK,QAAQ,aAAa,WAAW;AACjD,YAAI,MAAM,EAAG;AACb,YAAI,cAAc,EAAG,OAAM,KAAK,KAAK,SAAS,aAAa,GAAG,CAAC;AAC/D,sBAAc,MAAM,YAAY;AAChC,YAAI,KAAK,WAAW,MAAM,MAAQ,KAAK,cAAc,CAAC,MAAM,GAAM,gBAAe;AAAA,MACnF;AACA,UAAI,WAAW;AACf,UAAI,WAA0B;AAC9B,YAAM,YAAY,OAAO,KAAK,UAAU;AACxC,iBAAW,QAAQ,OAAO;AACxB,cAAM,YAAY,cAAc,MAAM,SAAS;AAC/C,YAAI,YAAY,EAAG;AACnB,cAAM,UAAU,KAAK,SAAS,GAAG,SAAS,EAAE,SAAS,MAAM;AAC3D,cAAM,UAAU,QAAQ,MAAM,qBAAqB;AACnD,YAAI,CAAC,QAAS;AACd,mBAAW,QAAQ,CAAC,EAAE,QAAQ,UAAU,GAAG;AAC3C,YAAI,MAAM,KAAK;AACf,YAAI,OAAO,KAAK,KAAK,MAAM,CAAC,MAAM,MAAQ,KAAK,MAAM,CAAC,MAAM,GAAM,QAAO;AACzE,mBAAW,KAAK,SAAS,YAAY,GAAG,GAAG;AAC3C;AAAA,MACF;AACA,UAAI,CAAC,UAAU;AAAE,QAAAA,SAAQ,KAAK,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAAG;AAAA,MAAO;AAC5E,YAAM,YAAYL,MAAKM,QAAO,GAAG,mBAAmB;AACpD,YAAMC,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,YAAM,UAAU,MAAMC,SAAQR,MAAK,WAAW,IAAI,CAAC;AACnD,YAAM,WAAWA,MAAK,SAAS,QAAQ;AACvC,YAAMI,WAAU,UAAU,QAAQ;AAClC,MAAAC,SAAQ,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,IACtC,SAAS,KAAK;AACZ,MAAAA,SAAQ,KAAK,KAAK,EAAE,OAAOI,iBAAgB,KAAK,eAAe,EAAE,CAAC;AAAA,IACpE;AAAA,EACF,CAAC;AACD,MAAI,GAAG,SAAS,CAAC,QAAe;AAC9B,IAAAJ,SAAQ,KAAK,KAAK,EAAE,OAAOI,iBAAgB,KAAK,qBAAqB,EAAE,CAAC;AAAA,EAC1E,CAAC;AACH;AAEA,eAAe,gBACb,MACA,aACA,WACA,WAC2C;AAC3C,QAAM,UAA2C;AAAA,IAC/C,gBAAgB;AAAA,IAChB,kBAAkB,KAAK;AAAA,IACvB,eAAe,UAAU,SAAS;AAAA,IAClC,YAAY;AAAA,IACZ,cAAc,wBAAwB,QAAQ,QAAQ,KAAK,QAAQ,IAAI;AAAA,EACzE;AAEA,MAAI,WAAW;AACb,YAAQ,oBAAoB,IAAI;AAAA,EAClC;AAEA,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,MAAM;AAAA,MACV;AAAA,MACA,EAAE,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC,QAAQ;AACP,cAAM,SAAmB,CAAC;AAC1B,YAAI,GAAG,QAAQ,CAAC,MAAc,OAAO,KAAK,CAAC,CAAC;AAC5C,YAAI,GAAG,OAAO,MAAMA,SAAQ,EAAE,QAAQ,IAAI,cAAc,KAAK,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;AAC5G,YAAI,GAAG,SAAS,MAAM;AAAA,MACxB;AAAA,IACF;AACA,QAAI,GAAG,SAAS,MAAM;AACtB,QAAI,MAAM,IAAI;AACd,QAAI,IAAI;AAAA,EACV,CAAC;AACH;AAEA,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AACE,SAAQ,UAAiD;AACzD,SAAQ,cAAc;AACtB,SAAQ,oBAA0C;AAClD,SAAQ,aAAa;AACrB,SAAQ,SAAS;AACjB,SAAQ,WAAW;AACnB,SAAiB,UAAU,oBAAI,IAAuF;AACtH,SAAiB,wBAAwB,oBAAI,IAA0D;AACvG,SAAiB,wBAAwB,oBAAI,IAAkC;AAC/E,SAAiB,gBAAgB;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,EAEQ,QAAc;AACpB,QAAI,KAAK,QAAS;AAElB,SAAK,WAAW;AAChB,UAAM,OAAOC,OAAM,SAAS,KAAK,eAAe,EAAE,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE,CAAC;AACnF,SAAK,UAAU;AAEf,SAAK,OAAO,YAAY,MAAM;AAC9B,SAAK,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACxC,WAAK,cAAc;AAEnB,UAAI,UAAU,KAAK,WAAW,QAAQ,IAAI;AAC1C,aAAO,YAAY,IAAI;AACrB,cAAM,OAAO,KAAK,WAAW,MAAM,GAAG,OAAO,EAAE,KAAK;AACpD,aAAK,aAAa,KAAK,WAAW,MAAM,UAAU,CAAC;AAEnD,YAAI,KAAK,SAAS,GAAG;AACnB,eAAK,WAAW,IAAI;AAAA,QACtB;AAEA,kBAAU,KAAK,WAAW,QAAQ,IAAI;AAAA,MACxC;AAAA,IACF,CAAC;AAED,SAAK,OAAO,YAAY,MAAM;AAC9B,SAAK,OAAO,GAAG,QAAQ,MAAM;AAAA,IAE7B,CAAC;AAED,SAAK,GAAG,QAAQ,MAAM;AACpB,YAAM,UAAU,IAAI,MAAM,KAAK,WAAW,6BAA6B,sCAAsC;AAC7G,iBAAW,WAAW,KAAK,QAAQ,OAAO,GAAG;AAC3C,gBAAQ,OAAO,OAAO;AAAA,MACxB;AAEA,WAAK,QAAQ,MAAM;AACnB,WAAK,sBAAsB,MAAM;AACjC,WAAK,UAAU;AACf,WAAK,cAAc;AACnB,WAAK,oBAAoB;AACzB,WAAK,aAAa;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEQ,SAAS,SAAwC;AACvD,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,IAAI,MAAM,iCAAiC;AAAA,IACnD;AAEA,SAAK,QAAQ,MAAM,MAAM,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,CAAI;AAAA,EACzD;AAAA,EAEQ,WAAW,MAAoB;AACrC,QAAI;AACJ,QAAI;AACF,gBAAU,KAAK,MAAM,IAAI;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,OAAO,YAAY,KAAK,QAAQ,IAAI,QAAQ,EAAE,GAAG;AAClE,YAAM,iBAAiB,KAAK,QAAQ,IAAI,QAAQ,EAAE;AAClD,WAAK,QAAQ,OAAO,QAAQ,EAAE;AAE9B,UAAI,CAAC,eAAgB;AAErB,UAAI,QAAQ,OAAO;AACjB,uBAAe,OAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,MACxD,OAAO;AACL,uBAAe,QAAQ,QAAQ,MAAM;AAAA,MACvC;AACA;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,WAAW,YAAY,OAAO,QAAQ,OAAO,UAAU;AACxE,WAAK,iBAAiB;AAAA,QACpB,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ,UAAU;AAAA,MAC5B,CAAC;AACD;AAAA,IACF;AAGA,QAAI,OAAO,QAAQ,OAAO,YAAY,OAAO,QAAQ,WAAW,UAAU;AACxE,WAAK,oBAAoB,QAAQ,IAAI,QAAQ,QAAQ,QAAQ,UAAU,IAAI;AAAA,IAC7E;AAAA,EACF;AAAA,EAEQ,iBAAiB,cAAyD;AAChF,eAAW,YAAY,KAAK,uBAAuB;AACjD,eAAS,YAAY;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,uBAAuB,WAAmB,OAAiC;AACjF,QAAI,MAAM,OAAO;AACf,WAAK,SAAS;AAAA,QACZ,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,OAAO,MAAM;AAAA,MACf,CAAC;AACD;AAAA,IACF;AAEA,SAAK,SAAS;AAAA,MACZ,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,QAAQ,MAAM,UAAU,CAAC;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEQ,4BAA4B,WAAmB,OAAiC;AACtF,UAAM,iBAAiB,KAAK,sBAAsB,IAAI,SAAS;AAC/D,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,0CAA0C,OAAO,SAAS,CAAC,EAAE;AAAA,IAC/E;AACA,SAAK,sBAAsB,OAAO,SAAS;AAE3C,SAAK,uBAAuB,WAAW,KAAK;AAC5C,UAAM,gBAAgBR,UAAS,eAAe,MAAM;AACpD,UAAM,WACJ,OAAO,eAAe,aAAa,YAAY,cAAc,SAAS,SAAS,IAC3E,cAAc,WACd;AACN,SAAK,iBAAiB;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ,eAAe;AAAA,QACvB;AAAA,QACA,MAAM;AAAA,QACN,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,MACxC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,oBAAoB,WAAmB,QAAgB,QAAuB;AACpF,UAAM,iBAAuC;AAAA,MAC3C,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IACxC;AACA,SAAK,sBAAsB,IAAI,WAAW,cAAc;AAExD,SAAK,iBAAiB;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,KAAK,QAAgB,QAAmC;AACpE,SAAK,MAAM;AACX,UAAM,KAAK,KAAK;AAEhB,WAAO,IAAI,QAAQ,CAACO,UAAS,WAAW;AACtC,WAAK,QAAQ,IAAI,IAAI,EAAE,SAAAA,UAAS,OAAO,CAAC;AAExC,WAAK,SAAS;AAAA,QACZ,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAuB;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,oBAAmC;AAC/C,QAAI,KAAK,YAAa;AACtB,QAAI,KAAK,mBAAmB;AAC1B,YAAM,KAAK;AACX;AAAA,IACF;AAEA,SAAK,oBAAoB,KAAK,KAAK,cAAc;AAAA,MAC/C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF,CAAC,EAAE,KAAK,MAAM;AACZ,WAAK,cAAc;AAAA,IACrB,CAAC,EAAE,QAAQ,MAAM;AACf,WAAK,oBAAoB;AAAA,IAC3B,CAAC;AAED,UAAM,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,IAAI,QAAgB,QAAmC;AAC3D,UAAM,KAAK,kBAAkB;AAC7B,WAAO,KAAK,KAAK,QAAQ,MAAM;AAAA,EACjC;AAAA,EAEA,eAAe,UAA4E;AACzF,SAAK,sBAAsB,IAAI,QAAQ;AACvC,WAAO,MAAM;AACX,WAAK,sBAAsB,OAAO,QAAQ;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,SAAiC;AAC5D,UAAM,KAAK,kBAAkB;AAE7B,UAAM,OAAOP,UAAS,OAAO;AAC7B,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAEA,UAAM,KAAK,KAAK;AAChB,QAAI,OAAO,OAAO,YAAY,CAAC,OAAO,UAAU,EAAE,GAAG;AACnD,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,UAAM,WAAWA,UAAS,KAAK,KAAK;AACpC,QAAI,UAAU;AACZ,YAAM,UAAU,OAAO,SAAS,YAAY,YAAY,SAAS,QAAQ,KAAK,EAAE,SAAS,IACrF,SAAS,QAAQ,KAAK,IACtB;AACJ,YAAM,OAAO,OAAO,SAAS,SAAS,YAAY,OAAO,SAAS,SAAS,IAAI,IAC3E,KAAK,MAAM,SAAS,IAAI,IACxB;AACJ,WAAK,4BAA4B,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,EAAE,CAAC;AACjE;AAAA,IACF;AAEA,QAAI,EAAE,YAAY,OAAO;AACvB,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAEA,SAAK,4BAA4B,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,EAC9D;AAAA,EAEA,4BAAoD;AAClD,WAAO,MAAM,KAAK,KAAK,sBAAsB,OAAO,CAAC;AAAA,EACvD;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,QAAS;AAEnB,UAAM,OAAO,KAAK;AAClB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,oBAAoB;AACzB,SAAK,aAAa;AAElB,UAAM,UAAU,IAAI,MAAM,0BAA0B;AACpD,eAAW,WAAW,KAAK,QAAQ,OAAO,GAAG;AAC3C,cAAQ,OAAO,OAAO;AAAA,IACxB;AACA,SAAK,QAAQ,MAAM;AACnB,SAAK,sBAAsB,MAAM;AAEjC,QAAI;AACF,WAAK,MAAM,IAAI;AAAA,IACjB,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,WAAK,KAAK,SAAS;AAAA,IACrB,QAAQ;AAAA,IAER;AAEA,UAAM,iBAAiB,WAAW,MAAM;AACtC,UAAI,CAAC,KAAK,QAAQ;AAChB,YAAI;AACF,eAAK,KAAK,SAAS;AAAA,QACrB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,GAAG,IAAI;AACP,mBAAe,MAAM;AAAA,EACvB;AACF;AAEA,IAAM,gBAAN,MAAoB;AAAA,EAApB;AACE,SAAQ,cAA+B;AACvC,SAAQ,oBAAqC;AAAA;AAAA,EAE7C,MAAc,yBAAyB,QAA+B;AACpE,UAAM,IAAI,QAAc,CAACO,UAAS,WAAW;AAC3C,YAAME,WAAUD,OAAM,SAAS,CAAC,cAAc,wBAAwB,SAAS,MAAM,GAAG;AAAA,QACtF,OAAO,CAAC,UAAU,UAAU,MAAM;AAAA,MACpC,CAAC;AAED,UAAI,SAAS;AAEb,MAAAC,SAAQ,OAAO,YAAY,MAAM;AACjC,MAAAA,SAAQ,OAAO,GAAG,QAAQ,CAAC,UAAkB;AAC3C,kBAAU;AAAA,MACZ,CAAC;AAED,MAAAA,SAAQ,GAAG,SAAS,MAAM;AAC1B,MAAAA,SAAQ,GAAG,QAAQ,CAAC,SAAS;AAC3B,YAAI,SAAS,GAAG;AACd,UAAAF,SAAQ;AACR;AAAA,QACF;AAEA,eAAO,IAAI,MAAM,OAAO,KAAK,KAAK,yCAAyC,OAAO,IAAI,CAAC,EAAE,CAAC;AAAA,MAC5F,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,gCAAgC,SAA4B;AAClE,UAAM,OAAOP,UAAS,OAAO;AAC7B,UAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,KAAK,QAAQ,CAAC;AACzD,UAAM,UAAU,oBAAI,IAAY;AAEhC,eAAW,SAAS,OAAO;AACzB,YAAM,MAAMA,UAAS,KAAK;AAC1B,YAAM,aAAaA,UAAS,KAAK,UAAU;AAC3C,YAAM,YAAYA,UAAS,YAAY,MAAM;AAC7C,YAAM,aAAa,MAAM,QAAQ,WAAW,IAAI,IAAI,UAAU,OAAO,CAAC;AAEtE,iBAAW,QAAQ,YAAY;AAC7B,YAAI,OAAO,SAAS,YAAY,KAAK,SAAS,GAAG;AAC/C,kBAAQ,IAAI,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,EAC9D;AAAA,EAEQ,qCAAqC,SAA4B;AACvE,UAAM,OAAOA,UAAS,OAAO;AAC7B,UAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,KAAK,QAAQ,CAAC;AACzD,UAAM,UAAU,oBAAI,IAAY;AAEhC,eAAW,SAAS,OAAO;AACzB,YAAM,MAAMA,UAAS,KAAK;AAC1B,YAAM,aAAaA,UAAS,KAAK,UAAU;AAC3C,YAAM,YAAYA,UAAS,YAAY,MAAM;AAC7C,YAAM,aAAa,MAAM,QAAQ,WAAW,IAAI,IAAI,UAAU,OAAO,CAAC;AAEtE,iBAAW,QAAQ,YAAY;AAC7B,YAAI,OAAO,SAAS,YAAY,KAAK,SAAS,GAAG;AAC/C,kBAAQ,IAAI,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAM,cAAiC;AACrC,QAAI,KAAK,aAAa;AACpB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,SAAS,MAAMK,SAAQR,MAAKM,QAAO,GAAG,yBAAyB,CAAC;AACtE,UAAM,KAAK,yBAAyB,MAAM;AAE1C,UAAM,oBAAoBN,MAAK,QAAQ,oBAAoB;AAC3D,UAAM,MAAM,MAAME,UAAS,mBAAmB,MAAM;AACpD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,UAAU,KAAK,gCAAgC,MAAM;AAE3D,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,0BAA6C;AACjD,QAAI,KAAK,mBAAmB;AAC1B,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,SAAS,MAAMM,SAAQR,MAAKM,QAAO,GAAG,yBAAyB,CAAC;AACtE,UAAM,KAAK,yBAAyB,MAAM;AAE1C,UAAM,yBAAyBN,MAAK,QAAQ,yBAAyB;AACrE,UAAM,MAAM,MAAME,UAAS,wBAAwB,MAAM;AACzD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,UAAU,KAAK,qCAAqC,MAAM;AAEhE,SAAK,oBAAoB;AACzB,WAAO;AAAA,EACT;AACF;AAYA,IAAM,oBAAoB;AAE1B,SAAS,uBAA0C;AACjD,QAAM,cAAc;AAIpB,QAAM,WAAW,YAAY,iBAAiB;AAC9C,MAAI,SAAU,QAAO;AAErB,QAAM,UAA6B;AAAA,IACjC,WAAW,IAAI,iBAAiB;AAAA,IAChC,eAAe,IAAI,cAAc;AAAA,EACnC;AACA,cAAY,iBAAiB,IAAI;AACjC,SAAO;AACT;AAEA,eAAe,wBAAwB,WAA8D;AACnG,QAAM,UAAiE,CAAC;AACxE,MAAI,SAAwB;AAE5B,KAAG;AACD,UAAM,WAAWC,UAAS,MAAM,UAAU,IAAI,eAAe;AAAA,MAC3D,UAAU;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,MACT;AAAA,IACF,CAAC,CAAC;AACF,UAAM,OAAO,MAAM,QAAQ,UAAU,IAAI,IAAI,SAAS,OAAO,CAAC;AAC9D,eAAW,OAAO,MAAM;AACtB,YAAM,SAASA,UAAS,GAAG;AAC3B,YAAM,KAAK,OAAO,QAAQ,OAAO,WAAW,OAAO,KAAK;AACxD,UAAI,CAAC,GAAI;AACT,YAAM,QAAQ,OAAO,QAAQ,SAAS,YAAY,OAAO,KAAK,KAAK,EAAE,SAAS,IAC1E,OAAO,KAAK,KAAK,IAChB,OAAO,QAAQ,YAAY,YAAY,OAAO,QAAQ,KAAK,EAAE,SAAS,IAAI,OAAO,QAAQ,KAAK,IAAI;AACvG,YAAM,UAAU,OAAO,QAAQ,YAAY,WAAW,OAAO,UAAU;AACvE,cAAQ,KAAK,EAAE,IAAI,OAAO,QAAQ,CAAC;AAAA,IACrC;AACA,aAAS,OAAO,UAAU,eAAe,YAAY,SAAS,WAAW,SAAS,IAAI,SAAS,aAAa;AAAA,EAC9G,SAAS;AAET,QAAM,OAA+B,CAAC;AACtC,QAAM,cAAc;AACpB,WAAS,SAAS,GAAG,SAAS,QAAQ,QAAQ,UAAU,aAAa;AACnE,UAAM,QAAQ,QAAQ,MAAM,QAAQ,SAAS,WAAW;AACxD,UAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,WAAW;AAC3D,UAAI;AACF,cAAM,eAAe,MAAM,UAAU,IAAI,eAAe;AAAA,UACtD,UAAU,OAAO;AAAA,UACjB,cAAc;AAAA,QAChB,CAAC;AACD,cAAM,cAAc,yBAAyB,YAAY;AACzD,cAAM,iBAAiB,CAAC,OAAO,OAAO,OAAO,SAAS,WAAW,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC5F,eAAO;AAAA,UACL,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd,SAAS,OAAO;AAAA,UAChB;AAAA,UACA;AAAA,QACF;AAAA,MACF,QAAQ;AACN,cAAM,iBAAiB,CAAC,OAAO,OAAO,OAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC/E,eAAO;AAAA,UACL,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd,SAAS,OAAO;AAAA,UAChB,aAAa;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,CAAC;AACF,SAAK,KAAK,GAAG,MAAM;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,eAAe,uBAAuB,WAAyD;AAC7F,QAAM,OAAO,MAAM,wBAAwB,SAAS;AACpD,QAAM,WAAW,IAAI,IAAkC,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AACvF,SAAO,EAAE,SAAS;AACpB;AAEO,SAAS,8BAAqD;AACnE,QAAM,EAAE,WAAW,cAAc,IAAI,qBAAqB;AAC1D,MAAI,oBAA8C;AAClD,MAAI,2BAA8D;AAElE,iBAAe,uBAAmD;AAChE,QAAI,kBAAmB,QAAO;AAC9B,QAAI,CAAC,0BAA0B;AAC7B,iCAA2B,uBAAuB,SAAS,EACxD,KAAK,CAAC,UAAU;AACf,4BAAoB;AACpB,eAAO;AAAA,MACT,CAAC,EACA,QAAQ,MAAM;AACb,mCAA2B;AAAA,MAC7B,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACT;AACA,OAAK,8BAA8B,SAAS;AAE5C,QAAM,aAAa,OAAO,KAAsB,KAAqB,SAAqB;AACxF,QAAI;AACF,UAAI,CAAC,IAAI,KAAK;AACZ,aAAK;AACL;AAAA,MACF;AAEA,YAAM,MAAM,IAAI,IAAI,IAAI,KAAK,kBAAkB;AAE/C,UAAI,MAAM,mBAAmB,KAAK,KAAK,KAAK,EAAE,WAAW,aAAa,CAAC,GAAG;AACxE;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,0BAA0B;AACtE,yBAAiB,KAAK,GAAG;AACzB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,kBAAkB;AAC9D,cAAM,UAAU,MAAM,aAAa,GAAG;AACtC,cAAM,OAAOA,UAAS,OAAO;AAE7B,YAAI,CAAC,QAAQ,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,WAAW,GAAG;AACxE,UAAAE,SAAQ,KAAK,KAAK,EAAE,OAAO,6CAA6C,CAAC;AACzE;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,UAAU,IAAI,KAAK,QAAQ,KAAK,UAAU,IAAI;AACnE,QAAAA,SAAQ,KAAK,KAAK,EAAE,OAAO,CAAC;AAC5B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,yBAAyB;AACrE,cAAM,OAAO,MAAM,cAAc;AACjC,YAAI,CAAC,MAAM;AACT,UAAAA,SAAQ,KAAK,KAAK,EAAE,OAAO,4CAA4C,CAAC;AACxE;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,YAAY,GAAG;AACrC,cAAM,aAAa,IAAI,QAAQ,cAAc,KAAK;AAClD,cAAM,WAAW,MAAM,gBAAgB,SAAS,YAAY,KAAK,aAAa,KAAK,SAAS;AAE5F,YAAI,aAAa,SAAS;AAC1B,YAAI,UAAU,gBAAgB,iCAAiC;AAC/D,YAAI,IAAI,SAAS,IAAI;AACrB;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,sCAAsC;AAClF,cAAM,UAAU,MAAM,aAAa,GAAG;AACtC,cAAM,UAAU,uBAAuB,OAAO;AAC9C,QAAAA,SAAQ,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC;AAC9B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,sCAAsC;AACjF,QAAAA,SAAQ,KAAK,KAAK,EAAE,MAAM,UAAU,0BAA0B,EAAE,CAAC;AACjE;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,2BAA2B;AACtE,cAAM,UAAU,MAAM,cAAc,YAAY;AAChD,QAAAA,SAAQ,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AACnC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,iCAAiC;AAC5E,cAAM,UAAU,MAAM,cAAc,wBAAwB;AAC5D,QAAAA,SAAQ,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AACnC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,oCAAoC;AAC/E,cAAM,QAAQ,MAAM,wBAAwB;AAC5C,QAAAA,SAAQ,KAAK,KAAK,EAAE,MAAM,MAAM,CAAC;AACjC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,6BAA6B;AACxE,QAAAA,SAAQ,KAAK,KAAK,EAAE,MAAM,EAAE,MAAMQ,SAAQ,EAAE,EAAE,CAAC;AAC/C;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,8BAA8B;AAC1E,cAAM,UAAUV,UAAS,MAAM,aAAa,GAAG,CAAC;AAChD,cAAM,eAAe,OAAO,SAAS,cAAc,WAAW,QAAQ,UAAU,KAAK,IAAI;AACzF,YAAI,CAAC,cAAc;AACjB,UAAAE,SAAQ,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAChD;AAAA,QACF;AAEA,cAAM,YAAY,WAAW,YAAY,IAAI,eAAe,QAAQ,YAAY;AAChF,YAAI;AACF,gBAAM,aAAa,MAAMS,MAAK,SAAS;AACvC,cAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,YAAAT,SAAQ,KAAK,KAAK,EAAE,OAAO,+BAA+B,CAAC;AAC3D;AAAA,UACF;AAAA,QACF,QAAQ;AACN,UAAAA,SAAQ,KAAK,KAAK,EAAE,OAAO,2BAA2B,CAAC;AACvD;AAAA,QACF;AAEA,YAAI;AACF,cAAI,UAAU;AACd,cAAI;AACF,sBAAU,MAAM,kBAAkB,OAAO,CAAC,aAAa,iBAAiB,GAAG,EAAE,KAAK,UAAU,CAAC;AAAA,UAC/F,SAAS,OAAO;AACd,gBAAI,CAAC,wBAAwB,KAAK,EAAG,OAAM;AAC3C,kBAAMU,YAAW,OAAO,CAAC,MAAM,GAAG,EAAE,KAAK,UAAU,CAAC;AACpD,sBAAU,MAAM,kBAAkB,OAAO,CAAC,aAAa,iBAAiB,GAAG,EAAE,KAAK,UAAU,CAAC;AAAA,UAC/F;AACA,gBAAM,WAAW,SAAS,OAAO,KAAK;AACtC,gBAAM,gBAAgBf,MAAKC,iBAAgB,GAAG,WAAW;AACzD,gBAAMM,OAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAI9C,cAAI,aAAa;AACjB,cAAI,iBAAiB;AACrB,cAAI,cAAc;AAClB,mBAAS,UAAU,GAAG,UAAU,IAAI,WAAW,GAAG;AAChD,kBAAM,YAAY,YAAY,CAAC,EAAE,SAAS,KAAK;AAC/C,kBAAM,SAASP,MAAK,eAAe,SAAS;AAC5C,gBAAI;AACF,oBAAMc,MAAK,MAAM;AACjB;AAAA,YACF,QAAQ;AACN,2BAAa;AACb,+BAAiB;AACjB,4BAAcd,MAAK,QAAQ,QAAQ;AACnC;AAAA,YACF;AAAA,UACF;AACA,cAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,aAAa;AAClD,kBAAM,IAAI,MAAM,yCAAyC;AAAA,UAC3D;AACA,gBAAM,SAAS,SAAS,UAAU;AAElC,gBAAMO,OAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAC/C,cAAI;AACF,kBAAMQ,YAAW,OAAO,CAAC,YAAY,OAAO,MAAM,QAAQ,aAAa,MAAM,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,UAClG,SAAS,OAAO;AACd,gBAAI,CAAC,mBAAmB,KAAK,EAAG,OAAM;AACtC,kBAAM,2BAA2B,OAAO;AACxC,kBAAMA,YAAW,OAAO,CAAC,YAAY,OAAO,MAAM,QAAQ,aAAa,MAAM,GAAG,EAAE,KAAK,QAAQ,CAAC;AAAA,UAClG;AAEA,UAAAV,SAAQ,KAAK,KAAK;AAAA,YAChB,MAAM;AAAA,cACJ,KAAK;AAAA,cACL;AAAA,cACA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,UAAAA,SAAQ,KAAK,KAAK,EAAE,OAAOI,iBAAgB,OAAO,2BAA2B,EAAE,CAAC;AAAA,QAClF;AACA;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,oCAAoC;AAC/E,cAAM,UAAU,MAAM,aAAa,GAAG;AACtC,cAAM,SAASN,UAAS,OAAO;AAC/B,YAAI,CAAC,QAAQ;AACX,UAAAE,SAAQ,KAAK,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAC5D;AAAA,QACF;AACA,cAAM,YAAiC;AAAA,UACrC,OAAO,qBAAqB,OAAO,KAAK;AAAA,UACxC,QAAQ,sBAAsB,OAAO,MAAM;AAAA,UAC3C,QAAQ,qBAAqB,OAAO,MAAM;AAAA,QAC5C;AACA,cAAM,yBAAyB,SAAS;AACxC,QAAAA,SAAQ,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC;AAC9B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,2BAA2B;AACvE,cAAM,UAAUF,UAAS,MAAM,aAAa,GAAG,CAAC;AAChD,cAAM,UAAU,OAAO,SAAS,SAAS,WAAW,QAAQ,KAAK,KAAK,IAAI;AAC1E,cAAM,kBAAkB,SAAS,oBAAoB;AACrD,cAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AACnE,YAAI,CAAC,SAAS;AACZ,UAAAE,SAAQ,KAAK,KAAK,EAAE,OAAO,eAAe,CAAC;AAC3C;AAAA,QACF;AAEA,cAAM,iBAAiB,WAAW,OAAO,IAAI,UAAU,QAAQ,OAAO;AACtE,YAAI,aAAa;AACjB,YAAI;AACF,gBAAM,OAAO,MAAMS,MAAK,cAAc;AACtC,cAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAAT,SAAQ,KAAK,KAAK,EAAE,OAAO,qCAAqC,CAAC;AACjE;AAAA,UACF;AAAA,QACF,QAAQ;AACN,uBAAa;AAAA,QACf;AAEA,YAAI,CAAC,cAAc,iBAAiB;AAClC,gBAAME,OAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,QACjD,WAAW,CAAC,YAAY;AACtB,UAAAF,SAAQ,KAAK,KAAK,EAAE,OAAO,2BAA2B,CAAC;AACvD;AAAA,QACF;AAEA,cAAM,gBAAgB,MAAM,wBAAwB;AACpD,cAAM,YAAY,CAAC,gBAAgB,GAAG,cAAc,MAAM,OAAO,CAAC,SAAS,SAAS,cAAc,CAAC;AACnG,cAAM,aAAa,CAAC,gBAAgB,GAAG,cAAc,OAAO,OAAO,CAAC,SAAS,SAAS,cAAc,CAAC;AACrG,cAAM,aAAa,EAAE,GAAG,cAAc,OAAO;AAC7C,YAAI,MAAM,KAAK,EAAE,SAAS,GAAG;AAC3B,qBAAW,cAAc,IAAI,MAAM,KAAK;AAAA,QAC1C;AACA,cAAM,yBAAyB;AAAA,UAC7B,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AACD,QAAAA,SAAQ,KAAK,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,EAAE,CAAC;AACpD;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,sCAAsC;AACjF,cAAM,WAAW,IAAI,aAAa,IAAI,UAAU,GAAG,KAAK,KAAK;AAC7D,YAAI,CAAC,UAAU;AACb,UAAAA,SAAQ,KAAK,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAC/C;AAAA,QACF;AACA,cAAM,qBAAqB,WAAW,QAAQ,IAAI,WAAW,QAAQ,QAAQ;AAC7E,YAAI;AACF,gBAAM,WAAW,MAAMS,MAAK,kBAAkB;AAC9C,cAAI,CAAC,SAAS,YAAY,GAAG;AAC3B,YAAAT,SAAQ,KAAK,KAAK,EAAE,OAAO,8BAA8B,CAAC;AAC1D;AAAA,UACF;AAAA,QACF,QAAQ;AACN,UAAAA,SAAQ,KAAK,KAAK,EAAE,OAAO,0BAA0B,CAAC;AACtD;AAAA,QACF;AAEA,YAAI,QAAQ;AACZ,eAAO,QAAQ,KAAQ;AACrB,gBAAM,gBAAgB,gBAAgB,OAAO,KAAK,CAAC;AACnD,gBAAM,gBAAgBL,MAAK,oBAAoB,aAAa;AAC5D,cAAI;AACF,kBAAMc,MAAK,aAAa;AACxB,qBAAS;AACT;AAAA,UACF,QAAQ;AACN,YAAAT,SAAQ,KAAK,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,MAAM,cAAc,EAAE,CAAC;AACxE;AAAA,UACF;AAAA,QACF;AAEA,QAAAA,SAAQ,KAAK,KAAK,EAAE,OAAO,4CAA4C,CAAC;AACxE;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,mCAAmC;AAC/E,cAAM,UAAUF,UAAS,MAAM,aAAa,GAAG,CAAC;AAChD,cAAM,SAAS,OAAO,SAAS,QAAQ,WAAW,QAAQ,IAAI,KAAK,IAAI;AACvE,cAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,MAAM,KAAK,IAAI;AAC1E,cAAM,WAAW,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AACtE,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC;AAC7D,YAAI,CAAC,QAAQ;AACX,UAAAE,SAAQ,KAAK,KAAK,EAAE,OAAO,cAAc,CAAC;AAC1C;AAAA,QACF;AACA,cAAM,MAAM,WAAW,MAAM,IAAI,SAAS,QAAQ,MAAM;AACxD,YAAI;AACF,gBAAM,OAAO,MAAMS,MAAK,GAAG;AAC3B,cAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAAT,SAAQ,KAAK,KAAK,EAAE,OAAO,yBAAyB,CAAC;AACrD;AAAA,UACF;AAAA,QACF,QAAQ;AACN,UAAAA,SAAQ,KAAK,KAAK,EAAE,OAAO,qBAAqB,CAAC;AACjD;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,QAAQ,MAAM,qBAAqB,GAAG;AAC5C,gBAAM,SAAS,MACZ,IAAI,CAAC,UAAU,EAAE,MAAM,OAAO,mBAAmB,MAAM,KAAK,EAAE,EAAE,EAChE,OAAO,CAAC,QAAQ,MAAM,WAAW,KAAK,IAAI,QAAQ,EAAE,EACpD,KAAK,CAAC,GAAG,MAAO,EAAE,QAAQ,EAAE,SAAU,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAClE,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,KAAK,EAAE;AACpC,UAAAA,SAAQ,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,QACpC,SAAS,OAAO;AACd,UAAAA,SAAQ,KAAK,KAAK,EAAE,OAAOI,iBAAgB,OAAO,wBAAwB,EAAE,CAAC;AAAA,QAC/E;AACA;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,4BAA4B;AACvE,cAAM,QAAQ,MAAM,qBAAqB;AACzC,QAAAJ,SAAQ,KAAK,KAAK,EAAE,MAAM,MAAM,CAAC;AACjC;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,UAAU,IAAI,aAAa,4BAA4B;AACxE,cAAM,UAAUF,UAAS,MAAM,aAAa,GAAG,CAAC;AAChD,cAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,MAAM,KAAK,IAAI;AAC1E,cAAM,WAAW,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AACtE,cAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAM,KAAK,MAAM,QAAQ,CAAC,CAAC;AAC9D,YAAI,CAAC,OAAO;AACV,UAAAE,SAAQ,KAAK,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,oBAAoB,EAAE,EAAE,CAAC;AACpE;AAAA,QACF;AAEA,cAAM,QAAQ,MAAM,qBAAqB;AACzC,cAAM,aAAa,MAAM,KAAK,MAAM,SAAS,QAAQ,CAAC,EACnD,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,mBAAmB,OAAO,GAAG,CAAC,EAClD,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE;AAEnB,QAAAA,SAAQ,KAAK,KAAK,EAAE,MAAM,EAAE,WAAW,YAAY,oBAAoB,MAAM,SAAS,KAAK,EAAE,CAAC;AAC9F;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,4BAA4B;AACvE,cAAM,UAAUF,UAAS,MAAM,aAAa,GAAG,CAAC;AAChD,cAAM,KAAK,OAAO,SAAS,OAAO,WAAW,QAAQ,KAAK;AAC1D,cAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AACnE,YAAI,CAAC,IAAI;AACP,UAAAE,SAAQ,KAAK,KAAK,EAAE,OAAO,aAAa,CAAC;AACzC;AAAA,QACF;AACA,cAAM,QAAQ,MAAM,qBAAqB;AACzC,cAAMW,QAAO,QAAQ,uBAAuB,OAAO,IAAI,KAAK,IAAI,2BAA2B,OAAO,EAAE;AACpG,cAAM,sBAAsBA,KAAI;AAChC,QAAAX,SAAQ,KAAK,KAAK,EAAE,IAAI,KAAK,CAAC;AAC9B;AAAA,MACF;AAEA,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,qBAAqB;AAChE,YAAI,aAAa;AACjB,YAAI,UAAU,gBAAgB,kCAAkC;AAChE,YAAI,UAAU,iBAAiB,wBAAwB;AACvD,YAAI,UAAU,cAAc,YAAY;AACxC,YAAI,UAAU,qBAAqB,IAAI;AAEvC,cAAM,cAAc,WAAW,uBAAuB,CAAC,iBAAqE;AAC1H,cAAI,IAAI,iBAAiB,IAAI,UAAW;AACxC,cAAI,MAAM,SAAS,KAAK,UAAU,YAAY,CAAC;AAAA;AAAA,CAAM;AAAA,QACvD,CAAC;AAED,YAAI,MAAM;AAAA,QAAuB,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC,CAAC;AAAA;AAAA,CAAM;AACnE,cAAM,YAAY,YAAY,MAAM;AAClC,cAAI,MAAM,YAAY;AAAA,QACxB,GAAG,IAAK;AAER,cAAM,QAAQ,MAAM;AAClB,wBAAc,SAAS;AACvB,sBAAY;AACZ,cAAI,CAAC,IAAI,eAAe;AACtB,gBAAI,IAAI;AAAA,UACV;AAAA,QACF;AAEA,YAAI,GAAG,SAAS,KAAK;AACrB,YAAI,GAAG,WAAW,KAAK;AACvB;AAAA,MACF;AAEA,WAAK;AAAA,IACP,SAAS,OAAO;AACd,YAAM,UAAUI,iBAAgB,OAAO,sBAAsB;AAC7D,MAAAJ,SAAQ,KAAK,KAAK,EAAE,OAAO,QAAQ,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,aAAW,UAAU,MAAM;AACzB,wBAAoB;AACpB,cAAU,QAAQ;AAAA,EACpB;AACA,aAAW,yBAAyB,CAClC,aACG;AACH,WAAO,UAAU,eAAe,CAAC,iBAAsD;AACrF,eAAS;AAAA,QACP,GAAG;AAAA,QACH,QAAO,oBAAI,KAAK,GAAE,YAAY;AAAA,MAChC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AEt7CA,SAAS,eAAAY,cAAa,uBAAuB;AAI7C,IAAM,eAAe;AAYrB,SAAS,oBAAoB,GAAW,GAAoB;AAC1D,QAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,QAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,MAAI,KAAK,WAAW,KAAK,OAAQ,QAAO;AACxC,SAAO,gBAAgB,MAAM,IAAI;AACnC;AAEA,SAAS,aAAa,QAAoD;AACxE,QAAM,UAAkC,CAAC;AACzC,MAAI,CAAC,OAAQ,QAAO;AACpB,aAAW,QAAQ,OAAO,MAAM,GAAG,GAAG;AACpC,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,QAAQ,GAAI;AAChB,UAAM,MAAM,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK;AACpC,UAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AACvC,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAyB;AAClD,SAAO,WAAW,eAAe,WAAW,SAAS,WAAW;AAClE;AAEA,SAAS,gBAAgB,MAAuB;AAC9C,QAAM,aAAa,KAAK,YAAY;AACpC,SAAO,WAAW,WAAW,YAAY,KAAK,eAAe,eAAe,WAAW,WAAW,YAAY;AAChH;AAEA,SAAS,0BACP,eACA,YACA,cACA,aACS;AACT,QAAM,SAAS,iBAAiB;AAChC,MAAI,kBAAkB,MAAM,KAAK,gBAAgB,cAAc,EAAE,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,aAAa,YAAY;AACzC,QAAM,QAAQ,QAAQ,YAAY;AAClC,SAAO,QAAQ,SAAS,YAAY,IAAI,KAAK,CAAC;AAChD;AAEA,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmDjB,SAAS,kBAAkB,UAA+B;AAC/D,QAAM,cAAc,oBAAI,IAAY;AAEpC,QAAM,aAA6B,CAAC,KAAc,KAAe,SAA6B;AAC5F,QAAI,0BAA0B,IAAI,OAAO,eAAe,IAAI,QAAQ,MAAM,IAAI,QAAQ,QAAQ,WAAW,GAAG;AAC1G,WAAK;AACL;AAAA,IACF;AAGA,QAAI,IAAI,WAAW,UAAU,IAAI,SAAS,eAAe;AACvD,UAAI,OAAO;AACX,UAAI,YAAY,MAAM;AACtB,UAAI,GAAG,QAAQ,CAAC,UAAkB;AAAE,gBAAQ;AAAA,MAAM,CAAC;AACnD,UAAI,GAAG,OAAO,MAAM;AAClB,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,gBAAM,WAAW,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAEzE,cAAI,CAAC,oBAAoB,UAAU,QAAQ,GAAG;AAC5C,gBAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,mBAAmB,CAAC;AAClD;AAAA,UACF;AAEA,gBAAM,QAAQC,aAAY,EAAE,EAAE,SAAS,KAAK;AAC5C,sBAAY,IAAI,KAAK;AAErB,cAAI,UAAU,cAAc,GAAG,YAAY,IAAI,KAAK,qCAAqC;AACzF,cAAI,KAAK,EAAE,IAAI,KAAK,CAAC;AAAA,QACvB,QAAQ;AACN,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,uBAAuB,CAAC;AAAA,QACxD;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAGA,QAAI,UAAU,gBAAgB,0BAA0B;AACxD,QAAI,OAAO,GAAG,EAAE,KAAK,eAAe;AAAA,EACtC;AAEA,SAAO;AAAA,IACL;AAAA,IACA,qBAAqB,CAAC,QACpB,0BAA0B,IAAI,OAAO,eAAe,IAAI,QAAQ,MAAM,IAAI,QAAQ,QAAQ,WAAW;AAAA,EAEzG;AACF;;;AC/JA,SAAS,SAAS,SAAS,QAAAC,aAAY;AACvC,SAAS,MAAM,YAAAC,WAAU,WAAAC,UAAS,QAAAC,aAAY;AAU9C,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAS;AAAA,EAAO;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAC9D;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAClE;AAAA,EAAO;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAC3D,CAAC;AAED,SAAS,gBAAgB,WAA2B;AAClD,QAAM,YAAY,QAAQ,SAAS,EAAE,YAAY;AACjD,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAO,aAAO;AAAA,IACnB,KAAK;AAAA,IACL,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAQ,aAAO;AAAA,IACpB,KAAK;AAAS,aAAO;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AAAS,aAAO;AAAA,IACrB;AAAS,aAAO;AAAA,EAClB;AACF;AAEO,SAAS,mBAAmB,SAAyB;AAC1D,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,QAAI;AACF,aAAO,mBAAmB,QAAQ,QAAQ,eAAe,EAAE,CAAC;AAAA,IAC9D,QAAQ;AACN,aAAO,QAAQ,QAAQ,eAAe,EAAE;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,SAAyB;AACxD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI;AACF,WAAO,mBAAmB,OAAO;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,WAA4B;AAC7D,SAAO,yBAAyB,IAAI,QAAQ,SAAS,EAAE,YAAY,CAAC;AACtE;AAEA,SAAS,oBAAoB,QAAyB;AACpD,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,aAAW,QAAQ,QAAQ;AACzB,QAAI,SAAS,EAAG,QAAO;AAAA,EACzB;AACA,QAAM,UAAU,OAAO,SAAS,MAAM;AACtC,QAAM,oBAAoB,QAAQ,MAAM,UAAU,KAAK,CAAC,GAAG;AAC3D,SAAO,mBAAmB,QAAQ,SAAS;AAC7C;AAEA,eAAe,gBAAgB,WAAqC;AAClE,QAAM,SAAS,MAAM,KAAK,WAAW,GAAG;AACxC,MAAI;AACF,UAAM,SAAS,OAAO,YAAY,IAAI;AACtC,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,KAAK,QAAQ,GAAG,OAAO,QAAQ,CAAC;AACnE,WAAO,oBAAoB,OAAO,SAAS,GAAG,SAAS,CAAC;AAAA,EAC1D,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;AAEA,eAAsB,mBAAmB,WAAqC;AAC5E,MAAI,mBAAmB,SAAS,EAAG,QAAO;AAC1C,MAAI;AACF,UAAM,WAAW,MAAMA,MAAK,SAAS;AACrC,QAAI,CAAC,SAAS,OAAO,EAAG,QAAO;AAC/B,WAAO,MAAM,gBAAgB,SAAS;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MACJ,QAAQ,OAAO,OAAO,EACtB,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,OAAO,OAAO;AAC3B;AAEA,SAAS,aAAa,WAA2B;AAC/C,SAAO,sBAAsB,UAAU,SAAS,CAAC;AACnD;AAEA,SAAS,WAAW,WAA2B;AAC7C,SAAO,oBAAoB,UAAU,SAAS,CAAC;AACjD;AAEA,SAAS,4BAA4B,OAAuB;AAE1D,SAAO,KAAK,UAAU,KAAK,EACxB,QAAQ,SAAS,MAAM,EACvB,QAAQ,UAAU,QAAQ,EAC1B,QAAQ,YAAY,SAAS,EAC7B,QAAQ,YAAY,SAAS;AAClC;AAEA,eAAe,kBAAkB,WAA6C;AAC5E,QAAM,UAAU,MAAMD,SAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAChE,QAAM,WAAW,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,UAAU;AAC9D,UAAM,YAAYF,MAAK,WAAW,MAAM,IAAI;AAC5C,UAAM,YAAY,MAAMG,MAAK,SAAS;AACtC,UAAM,WAAW,CAAC,MAAM,YAAY,KAAK,MAAM,mBAAmB,SAAS;AAC3E,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,MAAM;AAAA,MACN,aAAa,MAAM,YAAY;AAAA,MAC/B;AAAA,MACA,SAAS,UAAU;AAAA,IACrB;AAAA,EACF,CAAC,CAAC;AACF,SAAO,SAAS,KAAK,CAAC,GAAG,MAAM;AAC7B,QAAI,EAAE,YAAY,EAAE,QAAS,QAAO,EAAE,UAAU,EAAE;AAClD,QAAI,EAAE,eAAe,CAAC,EAAE,YAAa,QAAO;AAC5C,QAAI,CAAC,EAAE,eAAe,EAAE,YAAa,QAAO;AAC5C,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AACH;AAEA,eAAsB,2BAA2B,WAAoC;AACnF,QAAM,QAAQ,MAAM,kBAAkB,SAAS;AAC/C,QAAM,aAAa,QAAQ,SAAS;AACpC,QAAM,OAAO,MACV,IAAI,CAAC,SAAS;AACb,UAAM,SAAS,KAAK,cAAc,MAAM;AACxC,UAAM,aAAa,KAAK,WACpB,yCAAyC,WAAW,KAAK,IAAI,CAAC,WAAW,WAAW,WAAW,KAAK,IAAI,CAAC,CAAC,oCAC1G;AACJ,WAAO,mDAAmD,WAAW,aAAa,KAAK,IAAI,CAAC,CAAC,KAAK,WAAW,KAAK,IAAI,CAAC,GAAG,MAAM,OAAO,UAAU;AAAA,EACnJ,CAAC,EACA,KAAK,IAAI;AAEZ,QAAM,aAAa,cAAc,aAC7B,eAAe,WAAW,aAAa,UAAU,CAAC,CAAC,iBACnD;AAEJ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,oBAKW,WAAW,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAoBxB,WAAW,SAAS,CAAC;AAAA,IAClC,UAAU;AAAA,QACN,IAAI;AAAA;AAAA;AAGZ;AAEA,eAAsB,qBAAqB,WAAoC;AAC7E,QAAM,UAAU,MAAMF,UAAS,WAAW,MAAM;AAChD,QAAM,aAAa,QAAQ,SAAS;AACpC,QAAM,WAAW,gBAAgB,SAAS;AAC1C,QAAM,qBAAqB,4BAA4B,OAAO;AAC9D,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKO,WAAW,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAoBpB,WAAW,aAAa,UAAU,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,wBAI7B,WAAW,SAAS,CAAC,SAAM,WAAW,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAShC,WAAW,QAAQ,CAAC;AAAA,sBACrC,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBxC;;;AJhQA,SAAS,uBAAuC;AAEhD,IAAM,YAAYG,SAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,IAAM,UAAUC,MAAK,WAAW,MAAM,MAAM;AAC5C,IAAM,eAAeA,MAAK,SAAS,YAAY;AAY/C,IAAM,sBAA8C;AAAA,EAClD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,SAAS,0BAA0B,SAAiB,SAA4B;AAC9E,QAAM,QAAQ,WAAW,QAAQ,SAAS,IAAI,QAAQ,QAAQ,KAAK,IAAI,CAAC,WAAW;AACnF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,OAAO;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,EAAE;AACX;AAEA,SAAS,wBAAwB,SAAyB;AACxD,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,QAAI;AACF,aAAO,mBAAmB,QAAQ,QAAQ,eAAe,EAAE,CAAC;AAAA,IAC9D,QAAQ;AACN,aAAO,QAAQ,QAAQ,eAAe,EAAE;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAwB;AACrD,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,KAAK,GAAG;AAC/C,SAAO;AACT;AAEO,SAAS,aAAa,UAAyB,CAAC,GAAmB;AACxE,QAAM,MAAM,QAAQ;AACpB,QAAM,SAAS,4BAA4B;AAC3C,QAAM,cAAc,QAAQ,WAAW,kBAAkB,QAAQ,QAAQ,IAAI;AAG7E,MAAI,aAAa;AACf,QAAI,IAAI,YAAY,UAAU;AAAA,EAChC;AAGA,MAAI,IAAI,MAAM;AAGd,MAAI,IAAI,sBAAsB,CAAC,KAAK,QAAQ;AAC1C,UAAM,UAAU,OAAO,IAAI,MAAM,SAAS,WAAW,IAAI,MAAM,OAAO;AACtE,UAAM,YAAY,wBAAwB,OAAO;AACjD,QAAI,CAAC,aAAa,CAACC,YAAW,SAAS,GAAG;AACxC,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qCAAqC,CAAC;AACpE;AAAA,IACF;AAEA,UAAM,cAAc,oBAAoBC,SAAQ,SAAS,EAAE,YAAY,CAAC;AACxE,QAAI,CAAC,aAAa;AAChB,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,0BAA0B,CAAC;AACzD;AAAA,IACF;AAEA,QAAI,KAAK,WAAW;AACpB,QAAI,UAAU,iBAAiB,sBAAsB;AACrD,QAAI,SAAS,WAAW,EAAE,UAAU,QAAQ,GAAG,CAAC,UAAU;AACxD,UAAI,CAAC,MAAO;AACZ,UAAI,CAAC,IAAI,YAAa,KAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,wBAAwB,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH,CAAC;AAGD,MAAI,IAAI,qBAAqB,CAAC,KAAK,QAAQ;AACzC,UAAM,UAAU,OAAO,IAAI,MAAM,SAAS,WAAW,IAAI,MAAM,OAAO;AACtE,UAAM,YAAY,mBAAmB,OAAO;AAC5C,QAAI,CAAC,aAAa,CAACD,YAAW,SAAS,GAAG;AACxC,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qCAAqC,CAAC;AACpE;AAAA,IACF;AAEA,QAAI,UAAU,iBAAiB,mBAAmB;AAClD,QAAI,UAAU,uBAAuB,QAAQ;AAC7C,QAAI,SAAS,WAAW,EAAE,UAAU,QAAQ,GAAG,CAAC,UAAU;AACxD,UAAI,CAAC,MAAO;AACZ,UAAI,CAAC,IAAI,YAAa,KAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAA,IACzE,CAAC;AAAA,EACH,CAAC;AAGD,MAAI,IAAI,6BAA6B,OAAO,KAAK,QAAQ;AACvD,UAAM,UAAU,sBAAsB,IAAI,OAAO,IAAI;AACrD,UAAM,YAAY,iBAAiB,IAAI,OAAO,EAAE;AAChD,QAAI,CAAC,aAAa,CAACA,YAAW,SAAS,GAAG;AACxC,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qCAAqC,CAAC;AACpE;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAW,MAAME,MAAK,SAAS;AACrC,UAAI,UAAU,iBAAiB,mBAAmB;AAClD,UAAI,SAAS,YAAY,GAAG;AAC1B,cAAM,OAAO,MAAM,2BAA2B,SAAS;AACvD,YAAI,OAAO,GAAG,EAAE,KAAK,0BAA0B,EAAE,KAAK,IAAI;AAC1D;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,EAAE,UAAU,QAAQ,GAAG,CAAC,UAAU;AACxD,YAAI,CAAC,MAAO;AACZ,YAAI,CAAC,IAAI,YAAa,KAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAA,MACzE,CAAC;AAAA,IACH,QAAQ;AACN,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AAGD,MAAI,IAAI,2BAA2B,OAAO,KAAK,QAAQ;AACrD,UAAM,UAAU,sBAAsB,IAAI,OAAO,IAAI;AACrD,UAAM,YAAY,iBAAiB,IAAI,OAAO,EAAE;AAChD,QAAI,CAAC,aAAa,CAACF,YAAW,SAAS,GAAG;AACxC,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qCAAqC,CAAC;AACpE;AAAA,IACF;AACA,QAAI;AACF,YAAM,WAAW,MAAME,MAAK,SAAS;AACrC,UAAI,CAAC,SAAS,OAAO,GAAG;AACtB,YAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,sBAAsB,CAAC;AACrD;AAAA,MACF;AACA,YAAM,OAAO,MAAM,qBAAqB,SAAS;AACjD,UAAI,OAAO,GAAG,EAAE,KAAK,0BAA0B,EAAE,KAAK,IAAI;AAAA,IAC5D,QAAQ;AACN,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AAED,MAAI,IAAI,2BAA2B,QAAQ,KAAK,EAAE,MAAM,OAAO,OAAO,OAAO,CAAC,GAAG,OAAO,KAAK,QAAQ;AACnG,UAAM,UAAU,sBAAsB,IAAI,OAAO,IAAI;AACrD,UAAM,YAAY,iBAAiB,IAAI,OAAO,EAAE;AAChD,QAAI,CAAC,aAAa,CAACF,YAAW,SAAS,GAAG;AACxC,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qCAAqC,CAAC;AACpE;AAAA,IACF;AACA,QAAI,CAAE,MAAM,mBAAmB,SAAS,GAAI;AAC1C,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,qCAAqC,CAAC;AACpE;AAAA,IACF;AACA,UAAM,OAAO,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AACvD,QAAI;AACF,YAAMG,WAAU,WAAW,MAAM,MAAM;AACvC,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC;AAAA,IACnC,QAAQ;AACN,UAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AAED,QAAM,oBAAoBC,YAAW,YAAY;AAGjD,MAAI,mBAAmB;AACrB,QAAI,IAAI,QAAQ,OAAO,OAAO,CAAC;AAAA,EACjC;AAGA,MAAI,IAAI,CAAC,MAAM,QAAQ;AACrB,QAAI,CAAC,mBAAmB;AACtB,UACG,OAAO,GAAG,EACV,KAAK,0BAA0B,EAC/B;AAAA,QACC,0BAA0B,oCAAoC;AAAA,UAC5D,aAAa,YAAY;AAAA,UACzB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACF;AAAA,IACF;AAEA,QAAI,SAAS,cAAc,CAAC,UAAU;AACpC,UAAI,CAAC,MAAO;AACZ,UAAI,CAAC,IAAI,aAAa;AACpB,YAAI,OAAO,GAAG,EAAE,KAAK,0BAA0B,EAAE,KAAK,0BAA0B,gCAAgC,CAAC;AAAA,MACnH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,SAAS,MAAM,OAAO,QAAQ;AAAA,IAC9B,iBAAiB,CAAC,WAAuB;AACvC,YAAM,MAAM,IAAI,gBAAgB,EAAE,UAAU,KAAK,CAAC;AAElD,aAAO,GAAG,WAAW,CAAC,KAAsB,QAAQ,SAAS;AAC3D,cAAM,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,kBAAkB;AACrD,YAAI,IAAI,aAAa,iBAAiB;AACpC;AAAA,QACF;AAEA,YAAI,eAAe,CAAC,YAAY,oBAAoB,GAAG,GAAG;AACxD,iBAAO,MAAM,wDAAwD;AACrE,iBAAO,QAAQ;AACf;AAAA,QACF;AAEA,YAAI,cAAc,KAAK,QAAQ,MAAM,CAAC,OAAkB;AACtD,cAAI,KAAK,cAAc,IAAI,GAAG;AAAA,QAChC,CAAC;AAAA,MACH,CAAC;AAED,UAAI,GAAG,cAAc,CAAC,OAAkB;AACtC,WAAG,KAAK,KAAK,UAAU,EAAE,QAAQ,SAAS,QAAQ,EAAE,IAAI,KAAK,GAAG,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC,CAAC;AAClG,cAAM,cAAc,OAAO,uBAAuB,CAAC,iBAAiB;AAClE,cAAI,GAAG,eAAe,EAAG;AACzB,aAAG,KAAK,KAAK,UAAU,YAAY,CAAC;AAAA,QACtC,CAAC;AAED,WAAG,GAAG,SAAS,WAAW;AAC1B,WAAG,GAAG,SAAS,WAAW;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AKjQA,SAAS,iBAAiB;AAE1B,IAAM,QAAQ;AAEd,SAAS,YAAY,QAAwB;AAC3C,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,cAAU,MAAM,UAAU,MAAM,MAAM,CAAC;AAAA,EACzC;AACA,SAAO;AACT;AAEO,SAAS,mBAA2B;AACzC,SAAO,GAAG,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC;AAC9D;;;ANCA,IAAM,UAAU,IAAI,QAAQ,EAAE,KAAK,SAAS,EAAE,YAAY,oCAAoC;AAC9F,IAAMC,aAAYC,SAAQC,eAAc,YAAY,GAAG,CAAC;AAExD,eAAe,iBAAkC;AAC/C,MAAI;AACF,UAAM,kBAAkBC,MAAKH,YAAW,MAAM,cAAc;AAC5D,UAAM,MAAM,MAAMI,UAAS,iBAAiB,MAAM;AAClD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAA2B;AAClC,SAAO,QAAQ,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,QAAQ,SAAS,cAAc,CAAC;AAC3F;AAEA,SAAS,OAAO,SAAiB,OAAiB,CAAC,GAAY;AAC7D,QAAM,SAAS,UAAU,SAAS,MAAM,EAAE,OAAO,SAAS,CAAC;AAC3D,SAAO,OAAO,WAAW;AAC3B;AAEA,SAAS,UAAU,SAAiB,MAAgB,OAAqB;AACvE,QAAM,SAAS,UAAU,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;AAC5D,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI,MAAM,GAAG,KAAK,0BAA0B,OAAO,OAAO,UAAU,EAAE,CAAC,EAAE;AAAA,EACjF;AACF;AAEA,SAAS,cAAc,SAAiB,MAAwB;AAC9D,QAAM,SAAS,UAAU,SAAS,MAAM,EAAE,OAAO,UAAU,CAAC;AAC5D,SAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,mBAA2B;AAClC,SAAOD,MAAKE,SAAQ,GAAG,aAAa;AACtC;AAEA,SAAS,sBAAqC;AAC5C,MAAI,OAAO,SAAS,CAAC,WAAW,CAAC,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgBF,MAAK,iBAAiB,GAAG,OAAO,OAAO;AAC7D,MAAIG,YAAW,aAAa,KAAK,OAAO,eAAe,CAAC,WAAW,CAAC,GAAG;AACrE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,IAAI,QAAQ,KAAK;AACxC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,QAAM,YAAYH,MAAK,QAAQ,OAAO,OAAO;AAC7C,MAAIG,YAAW,SAAS,KAAK,OAAO,WAAW,CAAC,WAAW,CAAC,GAAG;AAC7D,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,4BAA2C;AAClD,MAAI,OAAO,eAAe,CAAC,WAAW,CAAC,GAAG;AACxC,WAAO;AAAA,EACT;AACA,QAAM,iBAAiBH,MAAKE,SAAQ,GAAG,UAAU,OAAO,aAAa;AACrE,MAAIC,YAAW,cAAc,KAAK,OAAO,gBAAgB,CAAC,WAAW,CAAC,GAAG;AACvE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,MAA0C;AACzE,MAAI,SAAS,OAAO;AAClB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,SAAS;AACpB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,aAAa,KAAa,aAAoC;AACrE,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,UAAU,CAAC,eAAuB;AACtC,eAAS,YAAY,CAAC,aAAa;AACjC,cAAM,OAAO,SAAS,cAAc;AACpC,YAAI,QAAQ,OAAO,OAAO,OAAO,SAAS,QAAQ,UAAU;AAC1D,mBAAS,OAAO;AAChB,kBAAQ,SAAS,QAAQ,QAAQ;AACjC;AAAA,QACF;AACA,YAAI,SAAS,KAAK;AAChB,mBAAS,OAAO;AAChB,iBAAO,IAAI,MAAM,oCAAoC,OAAO,IAAI,CAAC,EAAE,CAAC;AACpE;AAAA,QACF;AACA,cAAM,OAAO,kBAAkB,aAAa,EAAE,MAAM,IAAM,CAAC;AAC3D,iBAAS,KAAK,IAAI;AAClB,aAAK,GAAG,UAAU,MAAM;AACtB,eAAK,MAAM;AACX,UAAAA,SAAQ;AAAA,QACV,CAAC;AACD,aAAK,GAAG,SAAS,MAAM;AAAA,MACzB,CAAC,EAAE,GAAG,SAAS,MAAM;AAAA,IACvB;AAEA,YAAQ,GAAG;AAAA,EACb,CAAC;AACH;AAEA,eAAe,kCAA0D;AACvE,QAAM,UAAU,0BAA0B;AAC1C,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,wBAAwB,QAAQ,IAAI;AACvD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,qEAAqE,QAAQ,IAAI,EAAE;AAAA,EACrG;AAEA,QAAM,aAAaJ,MAAKE,SAAQ,GAAG,UAAU,KAAK;AAClD,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,cAAcF,MAAK,YAAY,aAAa;AAClD,QAAM,cAAc,wFAAwF,UAAU;AAEtH,UAAQ,IAAI,0DAA0D;AACtE,QAAM,aAAa,aAAa,WAAW;AAC3C,YAAU,aAAa,GAAK;AAC5B,UAAQ,IAAI,OAAO,GAAG,UAAU,IAAI,QAAQ,IAAI,QAAQ,EAAE;AAE1D,QAAM,YAAY,0BAA0B;AAC5C,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AACA,UAAQ,IAAI,4BAA4B;AACxC,SAAO;AACT;AAEA,eAAe,wCAA0D;AACvE,MAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,OAAO;AACjD,YAAQ,KAAK,2FAA2F;AACxG,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,gBAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC/E,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,SAAS,sEAAsE;AAC3G,UAAM,aAAa,OAAO,KAAK,EAAE,YAAY;AAC7C,WAAO,eAAe,OAAO,eAAe;AAAA,EAC9C,UAAE;AACA,WAAO,MAAM;AAAA,EACf;AACF;AAEA,eAAe,8BAAsD;AACnE,QAAM,UAAU,0BAA0B;AAC1C,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM,sCAAsC;AACpE,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,gCAAgC;AACzC;AAEA,SAAS,eAAwB;AAC/B,QAAM,YAAY,QAAQ,IAAI,YAAY,KAAK,KAAKA,MAAKE,SAAQ,GAAG,QAAQ;AAC5E,SAAOC,YAAWH,MAAK,WAAW,WAAW,CAAC;AAChD;AAEA,SAAS,uBAAsC;AAC7C,MAAI,eAAe,oBAAoB;AACvC,MAAI,CAAC,cAAc;AACjB,UAAM,sBAAsB,CAAC,KAAa,UAAwB;AAChE,YAAM,SAAS,cAAc,OAAO,CAAC,WAAW,MAAM,GAAG,CAAC;AAC1D,UAAI,WAAW,GAAG;AAChB;AAAA,MACF;AACA,UAAI,gBAAgB,GAAG;AACrB,cAAM,IAAI,MAAM,GAAG,KAAK,0BAA0B,OAAO,MAAM,CAAC,EAAE;AAAA,MACpE;AACA,YAAM,aAAa,iBAAiB;AACpC,cAAQ,IAAI;AAAA,2EAA8E,UAAU;AAAA,CAAO;AAC3G,gBAAU,OAAO,CAAC,WAAW,MAAM,YAAY,YAAY,GAAG,GAAG,GAAG,KAAK,gBAAgB;AACzF,cAAQ,IAAI,OAAO,GAAGA,MAAK,YAAY,KAAK,CAAC,IAAI,QAAQ,IAAI,QAAQ,EAAE;AAAA,IACzE;AAEA,QAAI,gBAAgB,GAAG;AACrB,cAAQ,IAAI,6EAA6E;AACzF,0BAAoB,6BAA6B,mBAAmB;AACpE,qBAAe,oBAAoB;AACnC,UAAI,CAAC,cAAc;AACjB,gBAAQ,IAAI,oFAAoF;AAChG,4BAAoB,iBAAiB,4BAA4B;AAAA,MACnE;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,oEAAoE;AAChF,0BAAoB,iBAAiB,mBAAmB;AAAA,IAC1D;AAEA,mBAAe,oBAAoB;AACnC,QAAI,CAAC,gBAAgB,CAAC,gBAAgB,GAAG;AAEvC,YAAM,IAAI,MAAM,gFAAgF;AAAA,IAClG;AACA,QAAI,CAAC,gBAAgB,gBAAgB,GAAG;AACtC,qBAAe,oBAAoB;AAAA,IACrC;AACA,QAAI,CAAC,cAAc;AACjB,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AACA,YAAQ,IAAI,0BAA0B;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA6C;AACpE,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB;AAC1B;AAEA,SAAS,qBAAqB,OAAuB;AACnD,MAAI,CAAC,gBAAgB,GAAG;AACtB;AAAA,EACF;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,8BAA8B;AACzC,QAAM,KAAK,4DAA4D;AACvE,QAAM,KAAK,mEAAmE;AAC9E,QAAM,KAAK,yDAAyD;AACtE;AAEA,SAAS,YAAY,KAAmB;AACtC,QAAM,UAAU,QAAQ,aAAa,WACjC,EAAE,KAAK,QAAQ,MAAM,CAAC,GAAG,EAAE,IAC3B,QAAQ,aAAa,UACnB,EAAE,KAAK,OAAO,MAAM,CAAC,MAAM,SAAS,IAAI,GAAG,EAAE,IAC7C,EAAE,KAAK,YAAY,MAAM,CAAC,GAAG,EAAE;AAErC,QAAM,QAAQK,OAAM,QAAQ,KAAK,QAAQ,MAAM,EAAE,UAAU,MAAM,OAAO,SAAS,CAAC;AAClF,QAAM,GAAG,SAAS,MAAM;AAAA,EAAC,CAAC;AAC1B,QAAM,MAAM;AACd;AAEA,SAAS,oBAAoB,OAA8B;AACzD,QAAM,WAAW,MAAM,MAAM,8CAA8C;AAC3E,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AACA,SAAO,SAAS,SAAS,SAAS,CAAC,KAAK;AAC1C;AAEA,SAAS,kBAAkB,MAAwB;AACjD,QAAM,OAAO,oBAAI,IAAY,CAAC,oBAAoB,OAAO,IAAI,CAAC,EAAE,CAAC;AACjE,QAAM,aAAa,kBAAkB;AACrC,aAAW,WAAW,OAAO,OAAO,UAAU,GAAG;AAC/C,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,UAAU;AAClB;AAAA,MACF;AACA,UAAI,MAAM,WAAW,QAAQ;AAC3B,aAAK,IAAI,UAAU,MAAM,OAAO,IAAI,OAAO,IAAI,CAAC,EAAE;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAe,uBAAuB,SAAiB,WAGpD;AACD,SAAO,IAAI,QAAQ,CAACD,UAAS,WAAW;AACtC,UAAM,QAAQC,OAAM,SAAS,CAAC,UAAU,SAAS,oBAAoB,OAAO,SAAS,CAAC,EAAE,GAAG;AAAA,MACzF,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AAED,UAAM,UAAU,WAAW,MAAM;AAC/B,YAAM,KAAK,SAAS;AACpB,aAAO,IAAI,MAAM,8CAA8C,CAAC;AAAA,IAClE,GAAG,GAAK;AAER,UAAM,aAAa,CAAC,UAA2B;AAC7C,YAAM,OAAO,OAAO,KAAK;AACzB,YAAM,YAAY,oBAAoB,IAAI;AAC1C,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AACA,mBAAa,OAAO;AACpB,YAAM,QAAQ,IAAI,QAAQ,UAAU;AACpC,YAAM,QAAQ,IAAI,QAAQ,UAAU;AACpC,MAAAD,SAAQ,EAAE,SAAS,OAAO,KAAK,UAAU,CAAC;AAAA,IAC5C;AAEA,UAAM,UAAU,CAAC,UAAiB;AAChC,mBAAa,OAAO;AACpB,aAAO,IAAI,MAAM,gCAAgC,MAAM,OAAO,EAAE,CAAC;AAAA,IACnE;AAEA,UAAM,KAAK,SAAS,OAAO;AAC3B,UAAM,QAAQ,GAAG,QAAQ,UAAU;AACnC,UAAM,QAAQ,GAAG,QAAQ,UAAU;AAEnC,UAAM,KAAK,QAAQ,CAAC,SAAS;AAC3B,UAAI,SAAS,GAAG;AACd;AAAA,MACF;AACA,mBAAa,OAAO;AACpB,aAAO,IAAI,MAAM,mDAAmD,OAAO,IAAI,CAAC,GAAG,CAAC;AAAA,IACtF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,mBAAmB,QAAyC,WAAoC;AACvG,SAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,UAAM,UAAU,CAAC,SAAiB;AAChC,YAAM,UAAU,CAAC,UAAiC;AAChD,eAAO,IAAI,aAAa,WAAW;AACnC,YAAI,MAAM,SAAS,gBAAgB,MAAM,SAAS,UAAU;AAC1D,kBAAQ,OAAO,CAAC;AAChB;AAAA,QACF;AACA,eAAO,KAAK;AAAA,MACd;AACA,YAAM,cAAc,MAAM;AACxB,eAAO,IAAI,SAAS,OAAO;AAC3B,QAAAA,SAAQ,IAAI;AAAA,MACd;AAEA,aAAO,KAAK,SAAS,OAAO;AAC5B,aAAO,KAAK,aAAa,WAAW;AACpC,aAAO,OAAO,MAAM,SAAS;AAAA,IAC/B;AAEA,YAAQ,SAAS;AAAA,EACnB,CAAC;AACH;AAEA,SAASE,2BAAkC;AACzC,QAAM,YAAY,QAAQ,IAAI,YAAY,KAAK,KAAKN,MAAKE,SAAQ,GAAG,QAAQ;AAC5E,SAAOF,MAAK,WAAW,0BAA0B;AACnD;AAEA,SAAS,uBAAuB,OAA0B;AACxD,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,QAAM,OAAiB,CAAC;AACxB,aAAW,QAAQ,OAAO;AACxB,QAAI,OAAO,SAAS,SAAU;AAC9B,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,KAAK,SAAS,OAAO,EAAG;AACxC,SAAK,KAAK,OAAO;AAAA,EACnB;AACA,SAAO;AACT;AAEA,eAAe,qBAAqB,aAAoC;AACtE,QAAM,UAAU,YAAY,KAAK;AACjC,MAAI,CAAC,QAAS;AACd,QAAM,iBAAiBO,YAAW,OAAO,IAAI,UAAUH,SAAQ,OAAO;AACtE,QAAM,gBAAgB,MAAMI,MAAK,cAAc;AAC/C,MAAI,CAAC,cAAc,YAAY,GAAG;AAChC,UAAM,IAAI,MAAM,oBAAoB,cAAc,EAAE;AAAA,EACtD;AAEA,QAAM,YAAYF,yBAAwB;AAC1C,MAAI,UAAmC,CAAC;AACxC,MAAI;AACF,UAAM,MAAM,MAAML,UAAS,WAAW,MAAM;AAC5C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,gBAAU;AAAA,IACZ;AAAA,EACF,QAAQ;AACN,cAAU,CAAC;AAAA,EACb;AAEA,QAAM,QAAQ,uBAAuB,QAAQ,gCAAgC,CAAC;AAC9E,QAAM,cAAc,uBAAuB,QAAQ,wBAAwB,CAAC;AAC5E,UAAQ,gCAAgC,IAAI;AAAA,IAC1C;AAAA,IACA,GAAG,MAAM,OAAO,CAAC,UAAU,UAAU,cAAc;AAAA,EACrD;AACA,UAAQ,wBAAwB,IAAI;AAAA,IAClC;AAAA,IACA,GAAG,YAAY,OAAO,CAAC,UAAU,UAAU,cAAc;AAAA,EAC3D;AACA,QAAMQ,WAAU,WAAW,KAAK,UAAU,OAAO,GAAG,MAAM;AAC5D;AAEA,eAAe,eAAe,aAAoC;AAChE,QAAM,UAAU,YAAY,KAAK;AACjC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AACA,QAAM,qBAAqB,OAAO;AACpC;AAEA,eAAe,YAAY,SAA8F;AACvH,QAAM,UAAU,MAAM,eAAe;AACrC,QAAM,cAAc,QAAQ,aAAa,KAAK,KAAK;AACnD,MAAI,YAAY,SAAS,GAAG;AAC1B,QAAI;AACF,YAAM,qBAAqB,WAAW;AAAA,IACxC,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK;AAAA,2CAA8C,OAAO;AAAA,CAAI;AAAA,IACxE;AAAA,EACF;AACA,QAAM,eAAe,qBAAqB,KAAK,oBAAoB;AACnE,MAAI,CAAC,aAAa,KAAK,cAAc;AACnC,YAAQ,IAAI,uDAAuD;AACnE,cAAU,cAAc,CAAC,OAAO,GAAG,aAAa;AAAA,EAClD;AACA,QAAM,gBAAgB,SAAS,QAAQ,MAAM,EAAE;AAC/C,QAAM,WAAW,gBAAgB,QAAQ,QAAQ;AACjD,QAAM,EAAE,KAAK,SAAS,gBAAgB,IAAI,aAAU,EAAE,SAAS,CAAC;AAChE,QAAM,SAASC,cAAa,GAAG;AAC/B,kBAAgB,MAAM;AACtB,QAAM,OAAO,MAAM,mBAAmB,QAAQ,aAAa;AAC3D,MAAI,cAA+C;AACnD,MAAI,YAA2B;AAE/B,MAAI,QAAQ,QAAQ;AAClB,QAAI;AACF,YAAM,qBAAqB,MAAM,4BAA4B;AAC7D,UAAI,CAAC,oBAAoB;AACvB,cAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AACA,YAAM,SAAS,MAAM,uBAAuB,oBAAoB,IAAI;AACpE,oBAAc,OAAO;AACrB,kBAAY,OAAO;AAAA,IACrB,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,KAAK;AAAA,oCAAuC,OAAO,EAAE;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,eAAe,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA,8BAA8B,OAAO,IAAI,CAAC;AAAA,EAC5C;AACA,QAAM,aAAa,kBAAkB,IAAI;AACzC,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK,eAAe,WAAW,CAAC,CAAC,EAAE;AACzC,eAAW,aAAa,WAAW,MAAM,CAAC,GAAG;AAC3C,YAAM,KAAK,eAAe,SAAS,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,SAAS,eAAe;AAC1B,UAAM,KAAK,oBAAoB,OAAO,aAAa,CAAC,2BAA2B,OAAO,IAAI,CAAC,GAAG;AAAA,EAChG;AAEA,MAAI,UAAU;AACZ,UAAM,KAAK,eAAe,QAAQ,EAAE;AAAA,EACtC;AACA,MAAI,WAAW;AACb,UAAM,KAAK,eAAe,SAAS,EAAE;AACrC,UAAM,KAAK,wBAAwB;AAAA,EACrC;AAEA,uBAAqB,KAAK;AAC1B,QAAM,KAAK,EAAE;AACb,UAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC5B,MAAI,WAAW;AACb,WAAO,SAAS,WAAW,EAAE,OAAO,KAAK,CAAC;AAC1C,YAAQ,IAAI,EAAE;AAAA,EAChB;AACA,cAAY,oBAAoB,OAAO,IAAI,CAAC,EAAE;AAE9C,WAAS,WAAW;AAClB,YAAQ,IAAI,oBAAoB;AAChC,QAAI,eAAe,CAAC,YAAY,QAAQ;AACtC,kBAAY,KAAK,SAAS;AAAA,IAC5B;AACA,WAAO,MAAM,MAAM;AACjB,cAAQ;AACR,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAED,eAAW,MAAM;AACf,cAAQ;AACR,cAAQ,KAAK,CAAC;AAAA,IAChB,GAAG,GAAI,EAAE,MAAM;AAAA,EACjB;AAEA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAChC;AAEA,eAAe,WAAW;AACxB,QAAM,eAAe,qBAAqB,KAAK;AAC/C,UAAQ,IAAI,+BAA+B;AAC3C,YAAU,cAAc,CAAC,OAAO,GAAG,aAAa;AAClD;AAEA,QACG,SAAS,iBAAiB,qCAAqC,EAC/D,OAAO,yBAAyB,yDAAyD,EACzF,OAAO,qBAAqB,qBAAqB,MAAM,EACvD,OAAO,qBAAqB,yBAAyB,EACrD,OAAO,iBAAiB,6BAA6B,EACrD,OAAO,YAAY,4BAA4B,IAAI,EACnD,OAAO,eAAe,oCAAoC,EAC1D,OAAO,OACN,aACA,SACG;AACH,QAAM,UAAU,QAAQ,KAAK,MAAM,CAAC;AACpC,QAAM,uBAAuB,QAAQ,UAAU,CAAC,QAAQ,QAAQ,oBAAoB,IAAI,WAAW,iBAAiB,CAAC;AACrH,MAAI,mBAAmB,KAAK,eAAe,IAAI,KAAK;AACpD,MAAI,CAAC,mBAAmB,wBAAwB,KAAK,aAAa,KAAK,GAAG;AAExE,sBAAkB,YAAY,KAAK;AAAA,EACrC;AACA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,eAAe,eAAe;AACpC,YAAQ,IAAI,kBAAkB,eAAe,EAAE;AAC/C;AAAA,EACF;AAEA,QAAM,iBAAiB,eAAe,IAAI,KAAK;AAC/C,QAAM,YAAY,EAAE,GAAG,MAAM,aAAa,cAAc,CAAC;AAC3D,CAAC;AAEH,QAAQ,QAAQ,OAAO,EAAE,YAAY,+CAA+C,EAAE,OAAO,QAAQ;AAErG,QAAQ,QAAQ,MAAM,EAAE,YAAY,2BAA2B,EAAE,OAAO,MAAM;AAC5E,UAAQ,WAAW;AACrB,CAAC;AAED,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,UAAU;AAChD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAQ,MAAM;AAAA,yBAA4B,OAAO,EAAE;AACnD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["createServer","existsSync","readFile","stat","writeFile","homedir","isAbsolute","join","resolve","spawn","fileURLToPath","dirname","dirname","extname","isAbsolute","join","existsSync","writeFile","stat","spawn","mkdtemp","readFile","mkdir","stat","homedir","tmpdir","join","writeFile","resolve","readJsonBody","asRecord","getErrorMessage","setJson","resolve","spawn","getCodexHomeDir","join","homedir","runCommand","resolve","spawn","getErrorMessage","join","stat","writeFile","join","getCodexHomeDir","readFile","asRecord","writeFile","setJson","tmpdir","mkdir","mkdtemp","getErrorMessage","resolve","spawn","process","homedir","stat","runCommand","next","randomBytes","randomBytes","join","readFile","readdir","stat","dirname","join","isAbsolute","extname","stat","writeFile","existsSync","__dirname","dirname","fileURLToPath","join","readFile","homedir","existsSync","resolve","spawn","getCodexGlobalStatePath","isAbsolute","stat","writeFile","createServer"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/commandResolution.ts","../src/server/httpServer.ts","../src/server/codexAppServerBridge.ts","../src/server/skillsRoutes.ts","../src/server/telegramThreadBridge.ts","../src/utils/commandInvocation.ts","../src/server/authMiddleware.ts","../src/server/localBrowseUi.ts","../src/server/password.ts"],"sourcesContent":["import { createServer } from 'node:http'\nimport { chmodSync, createWriteStream, existsSync, mkdirSync } from 'node:fs'\nimport { readFile, stat, writeFile } from 'node:fs/promises'\nimport { homedir, networkInterfaces } from 'node:os'\nimport { isAbsolute, join, resolve } from 'node:path'\nimport { spawn } from 'node:child_process'\nimport { createInterface } from 'node:readline/promises'\nimport { fileURLToPath } from 'node:url'\nimport { dirname } from 'node:path'\nimport { get as httpsGet } from 'node:https'\nimport { Command } from 'commander'\nimport qrcode from 'qrcode-terminal'\nimport {\n canRunCommand,\n getNpmGlobalBinDir,\n getUserNpmPrefix,\n prependPathEntry,\n resolveCodexCommand,\n} from '../commandResolution.js'\nimport { createServer as createApp } from '../server/httpServer.js'\nimport { generatePassword } from '../server/password.js'\nimport { spawnSyncCommand } from '../utils/commandInvocation.js'\n\nconst program = new Command().name('codexui').description('Web interface for Codex app-server')\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nlet hasPromptedCloudflaredInstall = false\n\nfunction getCodexHomePath(): string {\n return process.env.CODEX_HOME?.trim() || join(homedir(), '.codex')\n}\n\nfunction getCloudflaredPromptMarkerPath(): string {\n return join(getCodexHomePath(), '.cloudflared-install-prompted')\n}\n\nfunction hasPromptedCloudflaredInstallPersisted(): boolean {\n return existsSync(getCloudflaredPromptMarkerPath())\n}\n\nasync function persistCloudflaredInstallPrompted(): Promise<void> {\n const codexHome = getCodexHomePath()\n mkdirSync(codexHome, { recursive: true })\n await writeFile(getCloudflaredPromptMarkerPath(), `${Date.now()}\\n`, 'utf8')\n}\n\nasync function readCliVersion(): Promise<string> {\n try {\n const packageJsonPath = join(__dirname, '..', 'package.json')\n const raw = await readFile(packageJsonPath, 'utf8')\n const parsed = JSON.parse(raw) as { version?: unknown }\n return typeof parsed.version === 'string' ? parsed.version : 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nfunction isTermuxRuntime(): boolean {\n return Boolean(process.env.TERMUX_VERSION || process.env.PREFIX?.includes('/com.termux/'))\n}\n\nfunction runOrFail(command: string, args: string[], label: string): void {\n const result = spawnSyncCommand(command, args, { stdio: 'inherit' })\n if (result.status !== 0) {\n throw new Error(`${label} failed with exit code ${String(result.status ?? -1)}`)\n }\n}\n\nfunction runWithStatus(command: string, args: string[]): number {\n const result = spawnSyncCommand(command, args, { stdio: 'inherit' })\n return result.status ?? -1\n}\n\nfunction resolveCloudflaredCommand(): string | null {\n if (canRunCommand('cloudflared', ['--version'])) {\n return 'cloudflared'\n }\n const localCandidate = join(homedir(), '.local', 'bin', 'cloudflared')\n if (existsSync(localCandidate) && canRunCommand(localCandidate, ['--version'])) {\n return localCandidate\n }\n return null\n}\n\nfunction mapCloudflaredLinuxArch(arch: NodeJS.Architecture): string | null {\n if (arch === 'x64') {\n return 'amd64'\n }\n if (arch === 'arm64') {\n return 'arm64'\n }\n return null\n}\n\nfunction downloadFile(url: string, destination: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = (currentUrl: string) => {\n httpsGet(currentUrl, (response) => {\n const code = response.statusCode ?? 0\n if (code >= 300 && code < 400 && response.headers.location) {\n response.resume()\n request(response.headers.location)\n return\n }\n if (code !== 200) {\n response.resume()\n reject(new Error(`Download failed with HTTP status ${String(code)}`))\n return\n }\n const file = createWriteStream(destination, { mode: 0o755 })\n response.pipe(file)\n file.on('finish', () => {\n file.close()\n resolve()\n })\n file.on('error', reject)\n }).on('error', reject)\n }\n\n request(url)\n })\n}\n\nasync function ensureCloudflaredInstalledLinux(): Promise<string | null> {\n const current = resolveCloudflaredCommand()\n if (current) {\n return current\n }\n if (process.platform !== 'linux') {\n return null\n }\n\n const mappedArch = mapCloudflaredLinuxArch(process.arch)\n if (!mappedArch) {\n throw new Error(`cloudflared auto-install is not supported for Linux architecture: ${process.arch}`)\n }\n\n const userBinDir = join(homedir(), '.local', 'bin')\n mkdirSync(userBinDir, { recursive: true })\n const destination = join(userBinDir, 'cloudflared')\n const downloadUrl = `https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${mappedArch}`\n\n console.log('\\ncloudflared not found. Installing to ~/.local/bin...\\n')\n await downloadFile(downloadUrl, destination)\n chmodSync(destination, 0o755)\n process.env.PATH = prependPathEntry(process.env.PATH ?? '', userBinDir)\n\n const installed = resolveCloudflaredCommand()\n if (!installed) {\n throw new Error('cloudflared download completed but executable is still not available')\n }\n console.log('\\ncloudflared installed.\\n')\n return installed\n}\n\nasync function shouldInstallCloudflaredInteractively(): Promise<boolean> {\n if (hasPromptedCloudflaredInstall || hasPromptedCloudflaredInstallPersisted()) {\n return false\n }\n hasPromptedCloudflaredInstall = true\n await persistCloudflaredInstallPrompted()\n\n if (process.platform === 'win32') {\n return false\n }\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.warn('\\n[cloudflared] cloudflared is missing and terminal is non-interactive, skipping install.')\n return false\n }\n\n const prompt = createInterface({ input: process.stdin, output: process.stdout })\n try {\n const answer = await prompt.question('cloudflared is not installed. Install it now to ~/.local/bin? [y/N] ')\n const normalized = answer.trim().toLowerCase()\n return normalized === 'y' || normalized === 'yes'\n } finally {\n prompt.close()\n }\n}\n\nasync function resolveCloudflaredForTunnel(): Promise<string | null> {\n const current = resolveCloudflaredCommand()\n if (current) {\n return current\n }\n\n if (process.platform === 'win32') {\n return null\n }\n\n const installApproved = await shouldInstallCloudflaredInteractively()\n if (!installApproved) {\n return null\n }\n\n return ensureCloudflaredInstalledLinux()\n}\n\nfunction hasCodexAuth(): boolean {\n const codexHome = getCodexHomePath()\n return existsSync(join(codexHome, 'auth.json'))\n}\n\nfunction ensureCodexInstalled(): string | null {\n let codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n const installWithFallback = (pkg: string, label: string): void => {\n const status = runWithStatus('npm', ['install', '-g', pkg])\n if (status === 0) {\n return\n }\n if (isTermuxRuntime()) {\n throw new Error(`${label} failed with exit code ${String(status)}`)\n }\n const userPrefix = getUserNpmPrefix()\n console.log(`\\nGlobal npm install requires elevated permissions. Retrying with --prefix ${userPrefix}...\\n`)\n runOrFail('npm', ['install', '-g', '--prefix', userPrefix, pkg], `${label} (user prefix)`)\n process.env.PATH = prependPathEntry(process.env.PATH ?? '', getNpmGlobalBinDir(userPrefix))\n }\n\n if (isTermuxRuntime()) {\n console.log('\\nCodex CLI not found. Installing Termux-compatible Codex CLI from npm...\\n')\n installWithFallback('@mmmbuto/codex-cli-termux', 'Codex CLI install')\n codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n console.log('\\nTermux npm package did not expose `codex`. Installing official CLI fallback...\\n')\n installWithFallback('@openai/codex', 'Codex CLI fallback install')\n }\n } else {\n console.log('\\nCodex CLI not found. Installing official Codex CLI from npm...\\n')\n installWithFallback('@openai/codex', 'Codex CLI install')\n }\n\n codexCommand = resolveCodexCommand()\n if (!codexCommand && !isTermuxRuntime()) {\n // Non-Termux path should resolve after official package install.\n throw new Error('Official Codex CLI install completed but binary is still not available in PATH')\n }\n if (!codexCommand && isTermuxRuntime()) {\n codexCommand = resolveCodexCommand()\n }\n if (!codexCommand) {\n throw new Error('Codex CLI install completed but binary is still not available in PATH')\n }\n console.log('\\nCodex CLI installed.\\n')\n }\n return codexCommand\n}\n\nfunction resolvePassword(input: string | boolean): string | undefined {\n if (input === false) {\n return undefined\n }\n if (typeof input === 'string') {\n return input\n }\n return generatePassword()\n}\n\nfunction printTermuxKeepAlive(lines: string[]): void {\n if (!isTermuxRuntime()) {\n return\n }\n lines.push('')\n lines.push(' Android/Termux keep-alive:')\n lines.push(' 1) Keep this Termux session open (do not swipe it away).')\n lines.push(' 2) Disable battery optimization for Termux in Android settings.')\n lines.push(' 3) Optional: run `termux-wake-lock` in another shell.')\n}\n\nfunction openBrowser(url: string): void {\n const command = process.platform === 'darwin'\n ? { cmd: 'open', args: [url] }\n : process.platform === 'win32'\n ? { cmd: 'cmd', args: ['/c', 'start', '', url] }\n : { cmd: 'xdg-open', args: [url] }\n\n const child = spawn(command.cmd, command.args, { detached: true, stdio: 'ignore' })\n child.on('error', () => {})\n child.unref()\n}\n\nfunction parseCloudflaredUrl(chunk: string): string | null {\n const urlMatch = chunk.match(/https:\\/\\/[a-zA-Z0-9-]+\\.trycloudflare\\.com/g)\n if (!urlMatch || urlMatch.length === 0) {\n return null\n }\n return urlMatch[urlMatch.length - 1] ?? null\n}\n\nfunction getAccessibleUrls(port: number): string[] {\n const urls = new Set<string>([`http://localhost:${String(port)}`])\n try {\n const interfaces = networkInterfaces()\n for (const entries of Object.values(interfaces)) {\n if (!entries) {\n continue\n }\n for (const entry of entries) {\n if (entry.internal) {\n continue\n }\n if (entry.family === 'IPv4') {\n urls.add(`http://${entry.address}:${String(port)}`)\n }\n }\n }\n } catch {}\n return Array.from(urls)\n}\n\nasync function startCloudflaredTunnel(command: string, localPort: number): Promise<{\n process: ReturnType<typeof spawn>\n url: string\n}> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, ['tunnel', '--url', `http://localhost:${String(localPort)}`], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n const timeout = setTimeout(() => {\n child.kill('SIGTERM')\n reject(new Error('Timed out waiting for cloudflared tunnel URL'))\n }, 20000)\n\n const handleData = (value: Buffer | string) => {\n const text = String(value)\n const parsedUrl = parseCloudflaredUrl(text)\n if (!parsedUrl) {\n return\n }\n clearTimeout(timeout)\n child.stdout?.off('data', handleData)\n child.stderr?.off('data', handleData)\n resolve({ process: child, url: parsedUrl })\n }\n\n const onError = (error: Error) => {\n clearTimeout(timeout)\n reject(new Error(`Failed to start cloudflared: ${error.message}`))\n }\n\n child.once('error', onError)\n child.stdout?.on('data', handleData)\n child.stderr?.on('data', handleData)\n\n child.once('exit', (code) => {\n if (code === 0) {\n return\n }\n clearTimeout(timeout)\n reject(new Error(`cloudflared exited before providing a URL (code ${String(code)})`))\n })\n })\n}\n\nfunction listenWithFallback(server: ReturnType<typeof createServer>, startPort: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const attempt = (port: number) => {\n const onError = (error: NodeJS.ErrnoException) => {\n server.off('listening', onListening)\n if (error.code === 'EADDRINUSE' || error.code === 'EACCES') {\n attempt(port + 1)\n return\n }\n reject(error)\n }\n const onListening = () => {\n server.off('error', onError)\n resolve(port)\n }\n\n server.once('error', onError)\n server.once('listening', onListening)\n server.listen(port, '0.0.0.0')\n }\n\n attempt(startPort)\n })\n}\n\nfunction getCodexGlobalStatePath(): string {\n const codexHome = getCodexHomePath()\n return join(codexHome, '.codex-global-state.json')\n}\n\nfunction normalizeUniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const next: string[] = []\n for (const item of value) {\n if (typeof item !== 'string') continue\n const trimmed = item.trim()\n if (!trimmed || next.includes(trimmed)) continue\n next.push(trimmed)\n }\n return next\n}\n\nasync function persistLaunchProject(projectPath: string): Promise<void> {\n const trimmed = projectPath.trim()\n if (!trimmed) return\n const normalizedPath = isAbsolute(trimmed) ? trimmed : resolve(trimmed)\n const directoryInfo = await stat(normalizedPath)\n if (!directoryInfo.isDirectory()) {\n throw new Error(`Not a directory: ${normalizedPath}`)\n }\n\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n payload = parsed as Record<string, unknown>\n }\n } catch {\n payload = {}\n }\n\n const roots = normalizeUniqueStrings(payload['electron-saved-workspace-roots'])\n const activeRoots = normalizeUniqueStrings(payload['active-workspace-roots'])\n payload['electron-saved-workspace-roots'] = [\n normalizedPath,\n ...roots.filter((value) => value !== normalizedPath),\n ]\n payload['active-workspace-roots'] = [\n normalizedPath,\n ...activeRoots.filter((value) => value !== normalizedPath),\n ]\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function addProjectOnly(projectPath: string): Promise<void> {\n const trimmed = projectPath.trim()\n if (!trimmed) {\n throw new Error('Missing project path')\n }\n await persistLaunchProject(trimmed)\n}\n\nasync function startServer(options: { port: string; password: string | boolean; tunnel: boolean; open: boolean; projectPath?: string }) {\n const version = await readCliVersion()\n const projectPath = options.projectPath?.trim() ?? ''\n if (projectPath.length > 0) {\n try {\n await persistLaunchProject(projectPath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(`\\n[project] Could not open launch project: ${message}\\n`)\n }\n }\n const codexCommand = ensureCodexInstalled() ?? resolveCodexCommand()\n if (codexCommand) {\n process.env.CODEXUI_CODEX_COMMAND = codexCommand\n }\n if (!hasCodexAuth() && codexCommand) {\n console.log('\\nCodex is not logged in. Starting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n }\n const requestedPort = parseInt(options.port, 10)\n const password = resolvePassword(options.password)\n const { app, dispose, attachWebSocket } = createApp({ password })\n const server = createServer(app)\n attachWebSocket(server)\n const port = await listenWithFallback(server, requestedPort)\n let tunnelChild: ReturnType<typeof spawn> | null = null\n let tunnelUrl: string | null = null\n\n if (options.tunnel) {\n try {\n const cloudflaredCommand = await resolveCloudflaredForTunnel()\n if (!cloudflaredCommand) {\n throw new Error('cloudflared is not installed')\n }\n const tunnel = await startCloudflaredTunnel(cloudflaredCommand, port)\n tunnelChild = tunnel.process\n tunnelUrl = tunnel.url\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(`\\n[cloudflared] Tunnel not started: ${message}`)\n }\n }\n\n const lines = [\n '',\n 'Codex Web Local is running!',\n ` Version: ${version}`,\n ' GitHub: https://github.com/friuns2/codexui',\n '',\n ` Bind: http://0.0.0.0:${String(port)}`,\n ]\n const accessUrls = getAccessibleUrls(port)\n if (accessUrls.length > 0) {\n lines.push(` Local: ${accessUrls[0]}`)\n for (const accessUrl of accessUrls.slice(1)) {\n lines.push(` Network: ${accessUrl}`)\n }\n }\n\n if (port !== requestedPort) {\n lines.push(` Requested port ${String(requestedPort)} was unavailable; using ${String(port)}.`)\n }\n\n if (password) {\n lines.push(` Password: ${password}`)\n }\n if (tunnelUrl) {\n lines.push(` Tunnel: ${tunnelUrl}`)\n lines.push(' Tunnel QR code below')\n }\n\n printTermuxKeepAlive(lines)\n lines.push('')\n console.log(lines.join('\\n'))\n if (tunnelUrl) {\n qrcode.generate(tunnelUrl, { small: true })\n console.log('')\n }\n if (options.open) openBrowser(`http://localhost:${String(port)}`)\n\n function shutdown() {\n console.log('\\nShutting down...')\n if (tunnelChild && !tunnelChild.killed) {\n tunnelChild.kill('SIGTERM')\n }\n server.close(() => {\n dispose()\n process.exit(0)\n })\n // Force exit after timeout\n setTimeout(() => {\n dispose()\n process.exit(1)\n }, 5000).unref()\n }\n\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n}\n\nasync function runLogin() {\n const codexCommand = ensureCodexInstalled() ?? 'codex'\n process.env.CODEXUI_CODEX_COMMAND = codexCommand\n console.log('\\nStarting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n}\n\nprogram\n .argument('[projectPath]', 'project directory to open on launch')\n .option('--open-project <path>', 'open project directory on launch (Codex desktop parity)')\n .option('-p, --port <port>', 'port to listen on', '5999')\n .option('--password <pass>', 'set a specific password')\n .option('--no-password', 'disable password protection')\n .option('--tunnel', 'start cloudflared tunnel', true)\n .option('--no-tunnel', 'disable cloudflared tunnel startup')\n .option('--open', 'open browser on startup', true)\n .option('--no-open', 'do not open browser on startup')\n .action(async (\n projectPath: string | undefined,\n opts: { port: string; password: string | boolean; tunnel: boolean; open: boolean; openProject?: string },\n ) => {\n const rawArgv = process.argv.slice(2)\n const openProjectFlagIndex = rawArgv.findIndex((arg) => arg === '--open-project' || arg.startsWith('--open-project='))\n let openProjectOnly = (opts.openProject ?? '').trim()\n if (!openProjectOnly && openProjectFlagIndex >= 0 && projectPath?.trim()) {\n // Commander may map \"--open-project .\" to the positional arg in this command layout.\n openProjectOnly = projectPath.trim()\n }\n if (openProjectOnly.length > 0) {\n await addProjectOnly(openProjectOnly)\n console.log(`Added project: ${openProjectOnly}`)\n return\n }\n\n const launchProject = (projectPath ?? '').trim()\n await startServer({ ...opts, projectPath: launchProject })\n })\n\nprogram.command('login').description('Install/check Codex CLI and run `codex login`').action(runLogin)\n\nprogram.command('help').description('Show codexui command help').action(() => {\n program.outputHelp()\n})\n\nprogram.parseAsync(process.argv).catch((error) => {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\\nFailed to run codexui: ${message}`)\n process.exit(1)\n})\n","import { spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\n\nexport type CommandInvocation = {\n command: string\n args: string[]\n}\n\nfunction uniqueStrings(values: Array<string | null | undefined>): string[] {\n const unique: string[] = []\n for (const value of values) {\n const normalized = value?.trim()\n if (!normalized || unique.includes(normalized)) continue\n unique.push(normalized)\n }\n return unique\n}\n\nfunction isPathLike(command: string): boolean {\n return command.includes('/') || command.includes('\\\\') || /^[a-zA-Z]:/.test(command)\n}\n\nfunction isRunnableCommand(command: string, args: string[] = []): boolean {\n if (isPathLike(command) && !existsSync(command)) {\n return false\n }\n return canRunCommand(command, args)\n}\n\nfunction getWindowsAppDataNpmPrefix(): string | null {\n const appData = process.env.APPDATA?.trim()\n return appData ? join(appData, 'npm') : null\n}\n\nfunction getPotentialNpmPrefixes(): string[] {\n return uniqueStrings([\n process.env.npm_config_prefix,\n process.env.PREFIX,\n getUserNpmPrefix(),\n process.platform === 'win32' ? getWindowsAppDataNpmPrefix() : null,\n ])\n}\n\nfunction getPotentialCodexPackageDirs(prefix: string): string[] {\n const dirs = [join(prefix, 'node_modules', '@openai', 'codex')]\n if (process.platform !== 'win32') {\n dirs.push(join(prefix, 'lib', 'node_modules', '@openai', 'codex'))\n }\n return dirs\n}\n\nfunction getPotentialCodexExecutables(prefix: string): string[] {\n return getPotentialCodexPackageDirs(prefix).map((packageDir) => (\n process.platform === 'win32'\n ? join(\n packageDir,\n 'node_modules',\n '@openai',\n 'codex-win32-x64',\n 'vendor',\n 'x86_64-pc-windows-msvc',\n 'codex',\n 'codex.exe',\n )\n : join(packageDir, 'bin', 'codex')\n ))\n}\n\nfunction getPotentialRipgrepExecutables(prefix: string): string[] {\n return getPotentialCodexPackageDirs(prefix).map((packageDir) => (\n process.platform === 'win32'\n ? join(\n packageDir,\n 'node_modules',\n '@openai',\n 'codex-win32-x64',\n 'vendor',\n 'x86_64-pc-windows-msvc',\n 'path',\n 'rg.exe',\n )\n : join(packageDir, 'bin', 'rg')\n ))\n}\n\nexport function canRunCommand(command: string, args: string[] = []): boolean {\n const result = spawnSync(command, args, {\n stdio: 'ignore',\n windowsHide: true,\n })\n return !result.error && result.status === 0\n}\n\nexport function getUserNpmPrefix(): string {\n return join(homedir(), '.npm-global')\n}\n\nexport function getNpmGlobalBinDir(prefix: string): string {\n return process.platform === 'win32' ? prefix : join(prefix, 'bin')\n}\n\nexport function prependPathEntry(existingPath: string, entry: string): string {\n const normalizedEntry = entry.trim()\n if (!normalizedEntry) return existingPath\n\n const parts = existingPath\n .split(delimiter)\n .map((value) => value.trim())\n .filter(Boolean)\n\n if (parts.includes(normalizedEntry)) {\n return existingPath\n }\n\n return existingPath ? `${normalizedEntry}${delimiter}${existingPath}` : normalizedEntry\n}\n\nexport function resolveCodexCommand(): string | null {\n const explicit = process.env.CODEXUI_CODEX_COMMAND?.trim()\n const packageCandidates = getPotentialNpmPrefixes().flatMap(getPotentialCodexExecutables)\n const fallbackCandidates = process.platform === 'win32'\n ? [...packageCandidates, 'codex']\n : ['codex', ...packageCandidates]\n\n for (const candidate of uniqueStrings([explicit, ...fallbackCandidates])) {\n if (isRunnableCommand(candidate, ['--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolveRipgrepCommand(): string | null {\n const explicit = process.env.CODEXUI_RG_COMMAND?.trim()\n const packageCandidates = getPotentialNpmPrefixes().flatMap(getPotentialRipgrepExecutables)\n const fallbackCandidates = process.platform === 'win32'\n ? [...packageCandidates, 'rg']\n : ['rg', ...packageCandidates]\n\n for (const candidate of uniqueStrings([explicit, ...fallbackCandidates])) {\n if (isRunnableCommand(candidate, ['--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolvePythonCommand(): CommandInvocation | null {\n const candidates: CommandInvocation[] = process.platform === 'win32'\n ? [\n { command: 'python', args: [] },\n { command: 'py', args: ['-3'] },\n { command: 'python3', args: [] },\n ]\n : [\n { command: 'python3', args: [] },\n { command: 'python', args: [] },\n ]\n\n for (const candidate of candidates) {\n if (isRunnableCommand(candidate.command, [...candidate.args, '--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolveSkillInstallerScriptPath(codexHome?: string): string | null {\n const normalizedCodexHome = codexHome?.trim()\n const candidates = uniqueStrings([\n normalizedCodexHome\n ? join(normalizedCodexHome, 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py')\n : null,\n process.env.CODEX_HOME?.trim()\n ? join(process.env.CODEX_HOME.trim(), 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py')\n : null,\n join(homedir(), '.codex', 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py'),\n join(homedir(), '.cursor', 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py'),\n ])\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n\n return null\n}\n","import { fileURLToPath } from 'node:url'\nimport { dirname, extname, isAbsolute, join } from 'node:path'\nimport type { Server as HttpServer, IncomingMessage } from 'node:http'\nimport { existsSync } from 'node:fs'\nimport { writeFile, stat } from 'node:fs/promises'\nimport express, { type Express } from 'express'\nimport { createCodexBridgeMiddleware } from './codexAppServerBridge.js'\nimport { createAuthSession } from './authMiddleware.js'\nimport { createDirectoryListingHtml, createTextEditorHtml, decodeBrowsePath, isTextEditableFile, normalizeLocalPath } from './localBrowseUi.js'\nimport { WebSocketServer, type WebSocket } from 'ws'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst distDir = join(__dirname, '..', 'dist')\nconst spaEntryFile = join(distDir, 'index.html')\n\nexport type ServerOptions = {\n password?: string\n}\n\nexport type ServerInstance = {\n app: Express\n dispose: () => void\n attachWebSocket: (server: HttpServer) => void\n}\n\nconst IMAGE_CONTENT_TYPES: Record<string, string> = {\n '.avif': 'image/avif',\n '.bmp': 'image/bmp',\n '.gif': 'image/gif',\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n}\n\nfunction renderFrontendMissingHtml(message: string, details?: string[]): string {\n const lines = details && details.length > 0 ? `<pre>${details.join('\\n')}</pre>` : ''\n return [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head><meta charset=\"utf-8\"><title>Codex Web UI Error</title></head>',\n '<body>',\n `<h1>${message}</h1>`,\n lines,\n '<p><a href=\"/\">Back to chat</a></p>',\n '</body>',\n '</html>',\n ].join('')\n}\n\nfunction normalizeLocalImagePath(rawPath: string): string {\n const trimmed = rawPath.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('file://')) {\n try {\n return decodeURIComponent(trimmed.replace(/^file:\\/\\//u, ''))\n } catch {\n return trimmed.replace(/^file:\\/\\//u, '')\n }\n }\n return trimmed\n}\n\nfunction readWildcardPathParam(value: unknown): string {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) return value.join('/')\n return ''\n}\n\nexport function createServer(options: ServerOptions = {}): ServerInstance {\n const app = express()\n const bridge = createCodexBridgeMiddleware()\n const authSession = options.password ? createAuthSession(options.password) : null\n\n // 1. Auth middleware (if password is set)\n if (authSession) {\n app.use(authSession.middleware)\n }\n\n // 2. Bridge middleware for /codex-api/*\n app.use(bridge)\n\n // 3. Serve local images referenced in markdown (desktop parity for absolute image paths)\n app.get('/codex-local-image', (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const localPath = normalizeLocalImagePath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n const contentType = IMAGE_CONTENT_TYPES[extname(localPath).toLowerCase()]\n if (!contentType) {\n res.status(415).json({ error: 'Unsupported image type.' })\n return\n }\n\n res.type(contentType)\n res.setHeader('Cache-Control', 'private, max-age=300')\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'Image file not found.' })\n })\n })\n\n // 4. Serve local files inline for direct file open.\n app.get('/codex-local-file', (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const localPath = normalizeLocalPath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n res.setHeader('Cache-Control', 'private, no-store')\n res.setHeader('Content-Disposition', 'inline')\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'File not found.' })\n })\n })\n\n // 5. Serve local files by path to preserve relative asset loading for HTML.\n app.get('/codex-local-browse/*path', async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n try {\n const fileStat = await stat(localPath)\n res.setHeader('Cache-Control', 'private, no-store')\n if (fileStat.isDirectory()) {\n const html = await createDirectoryListingHtml(localPath)\n res.status(200).type('text/html; charset=utf-8').send(html)\n return\n }\n\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'File not found.' })\n })\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n // 6. Edit text-like local files.\n app.get('/codex-local-edit/*path', async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isFile()) {\n res.status(400).json({ error: 'Expected file path.' })\n return\n }\n const html = await createTextEditorHtml(localPath)\n res.status(200).type('text/html; charset=utf-8').send(html)\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n app.put('/codex-local-edit/*path', express.text({ type: '*/*', limit: '10mb' }), async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n if (!(await isTextEditableFile(localPath))) {\n res.status(415).json({ error: 'Only text-like files are editable.' })\n return\n }\n const body = typeof req.body === 'string' ? req.body : ''\n try {\n await writeFile(localPath, body, 'utf8')\n res.status(200).json({ ok: true })\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n const hasFrontendAssets = existsSync(spaEntryFile)\n\n // 7. Static files from Vue build\n if (hasFrontendAssets) {\n app.use(express.static(distDir))\n }\n\n // 8. SPA fallback\n app.use((_req, res) => {\n if (!hasFrontendAssets) {\n res\n .status(503)\n .type('text/html; charset=utf-8')\n .send(\n renderFrontendMissingHtml('Codex web UI assets are missing.', [\n `Expected: ${spaEntryFile}`,\n 'If running from source, build frontend assets with: npm run build:frontend',\n 'If running with npx, clear the npx cache and reinstall codexapp.',\n ]),\n )\n return\n }\n\n res.sendFile(spaEntryFile, (error) => {\n if (!error) return\n if (!res.headersSent) {\n res.status(404).type('text/html; charset=utf-8').send(renderFrontendMissingHtml('Frontend entry file not found.'))\n }\n })\n })\n\n return {\n app,\n dispose: () => bridge.dispose(),\n attachWebSocket: (server: HttpServer) => {\n const wss = new WebSocketServer({ noServer: true })\n\n server.on('upgrade', (req: IncomingMessage, socket, head) => {\n const url = new URL(req.url ?? '', 'http://localhost')\n if (url.pathname !== '/codex-api/ws') {\n return\n }\n\n if (authSession && !authSession.isRequestAuthorized(req)) {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\nConnection: close\\r\\n\\r\\n')\n socket.destroy()\n return\n }\n\n wss.handleUpgrade(req, socket, head, (ws: WebSocket) => {\n wss.emit('connection', ws, req)\n })\n })\n\n wss.on('connection', (ws: WebSocket) => {\n ws.send(JSON.stringify({ method: 'ready', params: { ok: true }, atIso: new Date().toISOString() }))\n const unsubscribe = bridge.subscribeNotifications((notification) => {\n if (ws.readyState !== 1) return\n ws.send(JSON.stringify(notification))\n })\n\n ws.on('close', unsubscribe)\n ws.on('error', unsubscribe)\n })\n },\n }\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport { mkdtemp, readFile, readdir, rm, mkdir, stat, cp, lstat, readlink, symlink } from 'node:fs/promises'\nimport { createReadStream, existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { request as httpRequest } from 'node:http'\nimport { request as httpsRequest } from 'node:https'\nimport { homedir } from 'node:os'\nimport { tmpdir } from 'node:os'\nimport { basename, dirname, isAbsolute, join, resolve } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { writeFile } from 'node:fs/promises'\nimport { handleSkillsRoutes, initializeSkillsSyncOnStartup } from './skillsRoutes.js'\nimport { TelegramThreadBridge } from './telegramThreadBridge.js'\nimport { getSpawnInvocation } from '../utils/commandInvocation.js'\nimport {\n resolveCodexCommand,\n resolveRipgrepCommand,\n} from '../commandResolution.js'\n\ntype JsonRpcCall = {\n jsonrpc: '2.0'\n id: number\n method: string\n params?: unknown\n}\n\ntype JsonRpcResponse = {\n id?: number\n result?: unknown\n error?: {\n code: number\n message: string\n }\n method?: string\n params?: unknown\n}\n\ntype RpcProxyRequest = {\n method: string\n params?: unknown\n}\n\ntype ServerRequestReply = {\n result?: unknown\n error?: {\n code: number\n message: string\n }\n}\n\ntype WorkspaceRootsState = {\n order: string[]\n labels: Record<string, string>\n active: string[]\n}\n\ntype PendingServerRequest = {\n id: number\n method: string\n params: unknown\n receivedAtIso: string\n}\n\ntype ThreadSearchDocument = {\n id: string\n title: string\n preview: string\n messageText: string\n searchableText: string\n}\n\ntype ThreadSearchIndex = {\n docsById: Map<string, ThreadSearchDocument>\n}\n\ntype GithubTrendingItem = {\n id: number\n fullName: string\n url: string\n description: string\n language: string\n stars: number\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nfunction extractThreadMessageText(threadReadPayload: unknown): string {\n const payload = asRecord(threadReadPayload)\n const thread = asRecord(payload?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const parts: string[] = []\n\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : []\n for (const item of items) {\n const itemRecord = asRecord(item)\n const type = typeof itemRecord?.type === 'string' ? itemRecord.type : ''\n if (type === 'agentMessage' && typeof itemRecord?.text === 'string' && itemRecord.text.trim().length > 0) {\n parts.push(itemRecord.text.trim())\n continue\n }\n if (type === 'userMessage') {\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : []\n for (const block of content) {\n const blockRecord = asRecord(block)\n if (blockRecord?.type === 'text' && typeof blockRecord.text === 'string' && blockRecord.text.trim().length > 0) {\n parts.push(blockRecord.text.trim())\n }\n }\n continue\n }\n if (type === 'commandExecution') {\n const command = typeof itemRecord?.command === 'string' ? itemRecord.command.trim() : ''\n const output = typeof itemRecord?.aggregatedOutput === 'string' ? itemRecord.aggregatedOutput.trim() : ''\n if (command) parts.push(command)\n if (output) parts.push(output)\n }\n }\n }\n\n return parts.join('\\n').trim()\n}\n\nfunction isExactPhraseMatch(query: string, doc: ThreadSearchDocument): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return false\n return (\n doc.title.toLowerCase().includes(q) ||\n doc.preview.toLowerCase().includes(q) ||\n doc.messageText.toLowerCase().includes(q)\n )\n}\n\nfunction scoreFileCandidate(path: string, query: string): number {\n if (!query) return 0\n const lowerPath = path.toLowerCase()\n const lowerQuery = query.toLowerCase()\n const baseName = lowerPath.slice(lowerPath.lastIndexOf('/') + 1)\n if (baseName === lowerQuery) return 0\n if (baseName.startsWith(lowerQuery)) return 1\n if (baseName.includes(lowerQuery)) return 2\n if (lowerPath.includes(`/${lowerQuery}`)) return 3\n if (lowerPath.includes(lowerQuery)) return 4\n return 10\n}\n\nfunction decodeHtmlEntities(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(///gi, '/')\n}\n\nfunction stripHtml(value: string): string {\n return decodeHtmlEntities(value.replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim())\n}\n\nfunction parseGithubTrendingHtml(html: string, limit: number): GithubTrendingItem[] {\n const rows = html.match(/<article[\\s\\S]*?<\\/article>/g) ?? []\n const items: GithubTrendingItem[] = []\n let seq = Date.now()\n for (const row of rows) {\n const repoBlockMatch = row.match(/<h2[\\s\\S]*?<\\/h2>/)\n const hrefMatch = repoBlockMatch?.[0]?.match(/href=\"\\/([A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+)\"/)\n if (!hrefMatch) continue\n const fullName = hrefMatch[1] ?? ''\n if (!fullName || items.some((item) => item.fullName === fullName)) continue\n const descriptionMatch =\n row.match(/<p[^>]*class=\"[^\"]*col-9[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/)\n ?? row.match(/<p[^>]*class=\"[^\"]*color-fg-muted[^\"]*\"[^>]*>([\\s\\S]*?)<\\/p>/)\n ?? row.match(/<p[^>]*>([\\s\\S]*?)<\\/p>/)\n const languageMatch = row.match(/programmingLanguage[^>]*>\\s*([\\s\\S]*?)\\s*<\\/span>/)\n const starsMatch = row.match(/href=\"\\/[A-Za-z0-9_.-]+\\/[A-Za-z0-9_.-]+\\/stargazers\"[\\s\\S]*?>([\\s\\S]*?)<\\/a>/)\n const starsText = stripHtml(starsMatch?.[1] ?? '').replace(/,/g, '')\n const stars = Number.parseInt(starsText, 10)\n items.push({\n id: seq,\n fullName,\n url: `https://github.com/${fullName}`,\n description: stripHtml(descriptionMatch?.[1] ?? ''),\n language: stripHtml(languageMatch?.[1] ?? ''),\n stars: Number.isFinite(stars) ? stars : 0,\n })\n seq += 1\n if (items.length >= limit) break\n }\n return items\n}\n\nasync function fetchGithubTrending(since: 'daily' | 'weekly' | 'monthly', limit: number): Promise<GithubTrendingItem[]> {\n const endpoint = `https://github.com/trending?since=${since}`\n const response = await fetch(endpoint, {\n headers: {\n 'User-Agent': 'codex-web-local',\n Accept: 'text/html',\n },\n })\n if (!response.ok) {\n throw new Error(`GitHub trending fetch failed (${response.status})`)\n }\n const html = await response.text()\n return parseGithubTrendingHtml(html, limit)\n}\n\nasync function listFilesWithRipgrep(cwd: string): Promise<string[]> {\n return await new Promise<string[]>((resolve, reject) => {\n const ripgrepCommand = resolveRipgrepCommand()\n if (!ripgrepCommand) {\n reject(new Error('ripgrep (rg) is not available'))\n return\n }\n\n const proc = spawn(ripgrepCommand, ['--files', '--hidden', '-g', '!.git', '-g', '!node_modules'], {\n cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n const rows = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n resolve(rows)\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n reject(new Error(details || 'rg --files failed'))\n })\n })\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string } = {}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction isMissingHeadError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return (\n message.includes(\"not a valid object name: 'head'\") ||\n message.includes('not a valid object name: head') ||\n message.includes('invalid reference: head')\n )\n}\n\nfunction isNotGitRepositoryError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return message.includes('not a git repository') || message.includes('fatal: not a git repository')\n}\n\nasync function ensureRepoHasInitialCommit(repoRoot: string): Promise<void> {\n const agentsPath = join(repoRoot, 'AGENTS.md')\n try {\n await stat(agentsPath)\n } catch {\n await writeFile(agentsPath, '', 'utf8')\n }\n\n await runCommand('git', ['add', 'AGENTS.md'], { cwd: repoRoot })\n await runCommand(\n 'git',\n ['-c', 'user.name=Codex', '-c', 'user.email=codex@local', 'commit', '-m', 'Initialize repository for worktree support'],\n { cwd: repoRoot },\n )\n}\n\nasync function runCommandCapture(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nasync function runCommandWithOutput(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const normalized: string[] = []\n for (const item of value) {\n if (typeof item === 'string' && item.length > 0 && !normalized.includes(item)) {\n normalized.push(item)\n }\n }\n return normalized\n}\n\nfunction normalizeStringRecord(value: unknown): Record<string, string> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n const next: Record<string, string> = {}\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n if (typeof key === 'string' && key.length > 0 && typeof item === 'string') {\n next[key] = item\n }\n }\n return next\n}\n\nfunction normalizeCommitMessage(value: unknown): string {\n if (typeof value !== 'string') return ''\n const normalized = value\n .replace(/\\r\\n?/gu, '\\n')\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join('\\n')\n .trim()\n return normalized.slice(0, 2000)\n}\n\nfunction getRollbackGitDirForCwd(cwd: string): string {\n return join(cwd, '.codex', 'rollbacks', '.git')\n}\n\nasync function ensureLocalCodexGitignoreHasRollbacks(cwd: string): Promise<void> {\n const localCodexDir = join(cwd, '.codex')\n const gitignorePath = join(localCodexDir, '.gitignore')\n await mkdir(localCodexDir, { recursive: true })\n let current = ''\n try {\n current = await readFile(gitignorePath, 'utf8')\n } catch {\n current = ''\n }\n const rows = current.split(/\\r?\\n/).map((line) => line.trim())\n if (rows.includes('rollbacks/')) return\n const prefix = current.length > 0 && !current.endsWith('\\n') ? `${current}\\n` : current\n await writeFile(gitignorePath, `${prefix}rollbacks/\\n`, 'utf8')\n}\n\nasync function ensureRollbackGitRepo(cwd: string): Promise<string> {\n const gitDir = getRollbackGitDirForCwd(cwd)\n try {\n const headInfo = await stat(join(gitDir, 'HEAD'))\n if (!headInfo.isFile()) {\n throw new Error('Invalid rollback git repository')\n }\n } catch {\n await mkdir(dirname(gitDir), { recursive: true })\n await runCommand('git', ['--git-dir', gitDir, '--work-tree', cwd, 'init'])\n }\n await runCommand('git', ['--git-dir', gitDir, 'config', 'user.email', 'codex@local'])\n await runCommand('git', ['--git-dir', gitDir, 'config', 'user.name', 'Codex Rollback'])\n try {\n await runCommandCapture('git', ['--git-dir', gitDir, '--work-tree', cwd, 'rev-parse', '--verify', 'HEAD'])\n } catch {\n await runCommand(\n 'git',\n ['--git-dir', gitDir, '--work-tree', cwd, 'commit', '--allow-empty', '-m', 'Initialize rollback history'],\n )\n }\n await ensureLocalCodexGitignoreHasRollbacks(cwd)\n return gitDir\n}\n\nasync function runRollbackGit(cwd: string, args: string[]): Promise<void> {\n const gitDir = await ensureRollbackGitRepo(cwd)\n await runCommand('git', ['--git-dir', gitDir, '--work-tree', cwd, ...args])\n}\n\nasync function runRollbackGitCapture(cwd: string, args: string[]): Promise<string> {\n const gitDir = await ensureRollbackGitRepo(cwd)\n return await runCommandCapture('git', ['--git-dir', gitDir, '--work-tree', cwd, ...args])\n}\n\nasync function runRollbackGitWithOutput(cwd: string, args: string[]): Promise<string> {\n const gitDir = await ensureRollbackGitRepo(cwd)\n return await runCommandWithOutput('git', ['--git-dir', gitDir, '--work-tree', cwd, ...args])\n}\n\nasync function hasRollbackGitWorkingTreeChanges(cwd: string): Promise<boolean> {\n const status = await runRollbackGitWithOutput(cwd, ['status', '--porcelain'])\n return status.trim().length > 0\n}\n\nasync function findRollbackCommitByExactMessage(cwd: string, message: string): Promise<string> {\n const normalizedTarget = normalizeCommitMessage(message)\n if (!normalizedTarget) return ''\n const raw = await runRollbackGitWithOutput(cwd, ['log', '--format=%H%x1f%B%x1e'])\n const entries = raw.split('\\x1e')\n for (const entry of entries) {\n if (!entry.trim()) continue\n const [shaRaw, bodyRaw] = entry.split('\\x1f')\n const sha = (shaRaw ?? '').trim()\n const body = normalizeCommitMessage(bodyRaw ?? '')\n if (!sha) continue\n if (body === normalizedTarget) return sha\n }\n return ''\n}\n\nfunction getCodexAuthPath(): string {\n return join(getCodexHomeDir(), 'auth.json')\n}\n\ntype CodexAuth = {\n tokens?: {\n access_token?: string\n account_id?: string\n }\n}\n\nasync function readCodexAuth(): Promise<{ accessToken: string; accountId?: string } | null> {\n try {\n const raw = await readFile(getCodexAuthPath(), 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n const token = auth.tokens?.access_token\n if (!token) return null\n return { accessToken: token, accountId: auth.tokens?.account_id ?? undefined }\n } catch {\n return null\n }\n}\n\nfunction getCodexGlobalStatePath(): string {\n return join(getCodexHomeDir(), '.codex-global-state.json')\n}\n\nfunction getCodexSessionIndexPath(): string {\n return join(getCodexHomeDir(), 'session_index.jsonl')\n}\n\ntype ThreadTitleCache = { titles: Record<string, string>; order: string[] }\nconst MAX_THREAD_TITLES = 500\nconst EMPTY_THREAD_TITLE_CACHE: ThreadTitleCache = { titles: {}, order: [] }\n\ntype SessionIndexThreadTitleCacheState = {\n fileSignature: string | null\n cache: ThreadTitleCache\n}\n\nlet sessionIndexThreadTitleCacheState: SessionIndexThreadTitleCacheState = {\n fileSignature: null,\n cache: EMPTY_THREAD_TITLE_CACHE,\n}\n\ntype TelegramBridgeConfigState = {\n botToken: string\n}\n\nfunction normalizeThreadTitleCache(value: unknown): ThreadTitleCache {\n const record = asRecord(value)\n if (!record) return EMPTY_THREAD_TITLE_CACHE\n const rawTitles = asRecord(record.titles)\n const titles: Record<string, string> = {}\n if (rawTitles) {\n for (const [k, v] of Object.entries(rawTitles)) {\n if (typeof v === 'string' && v.length > 0) titles[k] = v\n }\n }\n const order = normalizeStringArray(record.order)\n return { titles, order }\n}\n\nfunction updateThreadTitleCache(cache: ThreadTitleCache, id: string, title: string): ThreadTitleCache {\n const titles = { ...cache.titles, [id]: title }\n const order = [id, ...cache.order.filter((o) => o !== id)]\n while (order.length > MAX_THREAD_TITLES) {\n const removed = order.pop()\n if (removed) delete titles[removed]\n }\n return { titles, order }\n}\n\nfunction removeFromThreadTitleCache(cache: ThreadTitleCache, id: string): ThreadTitleCache {\n const { [id]: _, ...titles } = cache.titles\n return { titles, order: cache.order.filter((o) => o !== id) }\n}\n\ntype SessionIndexThreadTitle = {\n id: string\n title: string\n updatedAtMs: number\n}\n\nfunction normalizeSessionIndexThreadTitle(value: unknown): SessionIndexThreadTitle | null {\n const record = asRecord(value)\n if (!record) return null\n\n const id = typeof record.id === 'string' ? record.id.trim() : ''\n const title = typeof record.thread_name === 'string' ? record.thread_name.trim() : ''\n const updatedAtIso = typeof record.updated_at === 'string' ? record.updated_at.trim() : ''\n const updatedAtMs = updatedAtIso ? Date.parse(updatedAtIso) : Number.NaN\n\n if (!id || !title) return null\n return {\n id,\n title,\n updatedAtMs: Number.isFinite(updatedAtMs) ? updatedAtMs : 0,\n }\n}\n\nfunction trimThreadTitleCache(cache: ThreadTitleCache): ThreadTitleCache {\n const titles = { ...cache.titles }\n const order = cache.order.filter((id) => {\n if (!titles[id]) return false\n return true\n }).slice(0, MAX_THREAD_TITLES)\n\n for (const id of Object.keys(titles)) {\n if (!order.includes(id)) {\n delete titles[id]\n }\n }\n\n return { titles, order }\n}\n\nfunction mergeThreadTitleCaches(base: ThreadTitleCache, overlay: ThreadTitleCache): ThreadTitleCache {\n const titles = { ...base.titles, ...overlay.titles }\n const order: string[] = []\n\n for (const id of [...overlay.order, ...base.order]) {\n if (!titles[id] || order.includes(id)) continue\n order.push(id)\n }\n\n for (const id of Object.keys(titles)) {\n if (!order.includes(id)) {\n order.push(id)\n }\n }\n\n return trimThreadTitleCache({ titles, order })\n}\n\nasync function readThreadTitleCache(): Promise<ThreadTitleCache> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeThreadTitleCache(payload['thread-titles'])\n } catch {\n return EMPTY_THREAD_TITLE_CACHE\n }\n}\n\nasync function writeThreadTitleCache(cache: ThreadTitleCache): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n payload['thread-titles'] = cache\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nfunction getSessionIndexFileSignature(stats: { mtimeMs: number; size: number }): string {\n return `${String(stats.mtimeMs)}:${String(stats.size)}`\n}\n\nasync function parseThreadTitlesFromSessionIndex(sessionIndexPath: string): Promise<ThreadTitleCache> {\n const latestById = new Map<string, SessionIndexThreadTitle>()\n const input = createReadStream(sessionIndexPath, { encoding: 'utf8' })\n const lines = createInterface({\n input,\n crlfDelay: Infinity,\n })\n\n try {\n for await (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n\n try {\n const entry = normalizeSessionIndexThreadTitle(JSON.parse(trimmed) as unknown)\n if (!entry) continue\n\n const previous = latestById.get(entry.id)\n if (!previous || entry.updatedAtMs >= previous.updatedAtMs) {\n latestById.set(entry.id, entry)\n }\n } catch {\n // Skip malformed lines and keep scanning the rest of the index.\n }\n }\n } finally {\n lines.close()\n input.close()\n }\n\n const entries = Array.from(latestById.values()).sort((first, second) => second.updatedAtMs - first.updatedAtMs)\n const titles: Record<string, string> = {}\n const order: string[] = []\n for (const entry of entries) {\n titles[entry.id] = entry.title\n order.push(entry.id)\n }\n\n return trimThreadTitleCache({ titles, order })\n}\n\nasync function readThreadTitlesFromSessionIndex(): Promise<ThreadTitleCache> {\n const sessionIndexPath = getCodexSessionIndexPath()\n\n try {\n const stats = await stat(sessionIndexPath)\n const fileSignature = getSessionIndexFileSignature(stats)\n if (sessionIndexThreadTitleCacheState.fileSignature === fileSignature) {\n return sessionIndexThreadTitleCacheState.cache\n }\n\n const cache = await parseThreadTitlesFromSessionIndex(sessionIndexPath)\n sessionIndexThreadTitleCacheState = { fileSignature, cache }\n return cache\n } catch {\n sessionIndexThreadTitleCacheState = {\n fileSignature: 'missing',\n cache: EMPTY_THREAD_TITLE_CACHE,\n }\n return sessionIndexThreadTitleCacheState.cache\n }\n}\n\nasync function readMergedThreadTitleCache(): Promise<ThreadTitleCache> {\n const [sessionIndexCache, persistedCache] = await Promise.all([\n readThreadTitlesFromSessionIndex(),\n readThreadTitleCache(),\n ])\n return mergeThreadTitleCaches(persistedCache, sessionIndexCache)\n}\n\nasync function readWorkspaceRootsState(): Promise<WorkspaceRootsState> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n\n try {\n const raw = await readFile(statePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n payload = asRecord(parsed) ?? {}\n } catch {\n payload = {}\n }\n\n return {\n order: normalizeStringArray(payload['electron-saved-workspace-roots']),\n labels: normalizeStringRecord(payload['electron-workspace-root-labels']),\n active: normalizeStringArray(payload['active-workspace-roots']),\n }\n}\n\nasync function writeWorkspaceRootsState(nextState: WorkspaceRootsState): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n\n payload['electron-saved-workspace-roots'] = normalizeStringArray(nextState.order)\n payload['electron-workspace-root-labels'] = normalizeStringRecord(nextState.labels)\n payload['active-workspace-roots'] = normalizeStringArray(nextState.active)\n\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nfunction normalizeTelegramBridgeConfig(value: unknown): TelegramBridgeConfigState {\n const record = asRecord(value)\n if (!record) return { botToken: '' }\n const botToken = typeof record.botToken === 'string' ? record.botToken.trim() : ''\n return { botToken }\n}\n\nasync function readTelegramBridgeConfig(): Promise<TelegramBridgeConfigState> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeTelegramBridgeConfig(payload['telegram-bridge'])\n } catch {\n return { botToken: '' }\n }\n}\n\nasync function writeTelegramBridgeConfig(nextState: TelegramBridgeConfigState): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n\n payload['telegram-bridge'] = {\n botToken: nextState.botToken.trim(),\n }\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const raw = await readRawBody(req)\n if (raw.length === 0) return null\n const text = raw.toString('utf8').trim()\n if (text.length === 0) return null\n return JSON.parse(text) as unknown\n}\n\nasync function readRawBody(req: IncomingMessage): Promise<Buffer> {\n const chunks: Uint8Array[] = []\n for await (const chunk of req) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks)\n}\n\nfunction bufferIndexOf(buf: Buffer, needle: Buffer, start = 0): number {\n for (let i = start; i <= buf.length - needle.length; i++) {\n let match = true\n for (let j = 0; j < needle.length; j++) {\n if (buf[i + j] !== needle[j]) { match = false; break }\n }\n if (match) return i\n }\n return -1\n}\n\nfunction handleFileUpload(req: IncomingMessage, res: ServerResponse): void {\n const chunks: Buffer[] = []\n req.on('data', (chunk: Buffer) => chunks.push(chunk))\n req.on('end', async () => {\n try {\n const body = Buffer.concat(chunks)\n const contentType = req.headers['content-type'] ?? ''\n const boundaryMatch = contentType.match(/boundary=(.+)/i)\n if (!boundaryMatch) { setJson(res, 400, { error: 'Missing multipart boundary' }); return }\n const boundary = boundaryMatch[1]\n const boundaryBuf = Buffer.from(`--${boundary}`)\n const parts: Buffer[] = []\n let searchStart = 0\n while (searchStart < body.length) {\n const idx = body.indexOf(boundaryBuf, searchStart)\n if (idx < 0) break\n if (searchStart > 0) parts.push(body.subarray(searchStart, idx))\n searchStart = idx + boundaryBuf.length\n if (body[searchStart] === 0x0d && body[searchStart + 1] === 0x0a) searchStart += 2\n }\n let fileName = 'uploaded-file'\n let fileData: Buffer | null = null\n const headerSep = Buffer.from('\\r\\n\\r\\n')\n for (const part of parts) {\n const headerEnd = bufferIndexOf(part, headerSep)\n if (headerEnd < 0) continue\n const headers = part.subarray(0, headerEnd).toString('utf8')\n const fnMatch = headers.match(/filename=\"([^\"]+)\"/i)\n if (!fnMatch) continue\n fileName = fnMatch[1].replace(/[/\\\\]/g, '_')\n let end = part.length\n if (end >= 2 && part[end - 2] === 0x0d && part[end - 1] === 0x0a) end -= 2\n fileData = part.subarray(headerEnd + 4, end)\n break\n }\n if (!fileData) { setJson(res, 400, { error: 'No file in request' }); return }\n const uploadDir = join(tmpdir(), 'codex-web-uploads')\n await mkdir(uploadDir, { recursive: true })\n const destDir = await mkdtemp(join(uploadDir, 'f-'))\n const destPath = join(destDir, fileName)\n await writeFile(destPath, fileData)\n setJson(res, 200, { path: destPath })\n } catch (err) {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload failed') })\n }\n })\n req.on('error', (err: Error) => {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload stream error') })\n })\n}\n\nfunction httpPost(\n url: string,\n headers: Record<string, string | number>,\n body: Buffer,\n): Promise<{ status: number; body: string }> {\n const doRequest = url.startsWith('http://') ? httpRequest : httpsRequest\n return new Promise((resolve, reject) => {\n const req = doRequest(url, { method: 'POST', headers }, (res) => {\n const chunks: Buffer[] = []\n res.on('data', (c: Buffer) => chunks.push(c))\n res.on('end', () => resolve({ status: res.statusCode ?? 500, body: Buffer.concat(chunks).toString('utf8') }))\n res.on('error', reject)\n })\n req.on('error', reject)\n req.write(body)\n req.end()\n })\n}\n\nlet curlImpersonateAvailable: boolean | null = null\n\nfunction curlImpersonatePost(\n url: string,\n headers: Record<string, string | number>,\n body: Buffer,\n): Promise<{ status: number; body: string }> {\n return new Promise((resolve, reject) => {\n const args = ['-s', '-w', '\\n%{http_code}', '-X', 'POST', url]\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === 'content-length') continue\n args.push('-H', `${k}: ${String(v)}`)\n }\n args.push('--data-binary', '@-')\n const proc = spawn('curl-impersonate-chrome', args, {\n env: { ...process.env, CURL_IMPERSONATE: 'chrome116' },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n const chunks: Buffer[] = []\n proc.stdout.on('data', (c: Buffer) => chunks.push(c))\n proc.on('error', (e) => {\n curlImpersonateAvailable = false\n reject(e)\n })\n proc.on('close', (code) => {\n const raw = Buffer.concat(chunks).toString('utf8')\n const lastNewline = raw.lastIndexOf('\\n')\n const statusStr = lastNewline >= 0 ? raw.slice(lastNewline + 1).trim() : ''\n const responseBody = lastNewline >= 0 ? raw.slice(0, lastNewline) : raw\n const status = parseInt(statusStr, 10) || (code === 0 ? 200 : 500)\n curlImpersonateAvailable = true\n resolve({ status, body: responseBody })\n })\n proc.stdin.write(body)\n proc.stdin.end()\n })\n}\n\nasync function proxyTranscribe(\n body: Buffer,\n contentType: string,\n authToken: string,\n accountId?: string,\n): Promise<{ status: number; body: string }> {\n const chatgptHeaders: Record<string, string | number> = {\n 'Content-Type': contentType,\n 'Content-Length': body.length,\n Authorization: `Bearer ${authToken}`,\n originator: 'Codex Desktop',\n 'User-Agent': `Codex Desktop/0.1.0 (${process.platform}; ${process.arch})`,\n }\n if (accountId) chatgptHeaders['ChatGPT-Account-Id'] = accountId\n\n const postFn = curlImpersonateAvailable !== false ? curlImpersonatePost : httpPost\n let result: { status: number; body: string }\n try {\n result = await postFn('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n } catch {\n result = await httpPost('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n }\n\n if (result.status === 403 && result.body.includes('cf_chl')) {\n if (curlImpersonateAvailable !== false && postFn !== curlImpersonatePost) {\n try {\n const ciResult = await curlImpersonatePost('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n if (ciResult.status !== 403) return ciResult\n } catch {}\n }\n return { status: 503, body: JSON.stringify({ error: 'Transcription blocked by Cloudflare. Install curl-impersonate-chrome.' }) }\n }\n\n return result\n}\n\nclass AppServerProcess {\n private process: ChildProcessWithoutNullStreams | null = null\n private initialized = false\n private initializePromise: Promise<void> | null = null\n private readBuffer = ''\n private nextId = 1\n private stopping = false\n private readonly pending = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }>()\n private readonly notificationListeners = new Set<(value: { method: string; params: unknown }) => void>()\n private readonly pendingServerRequests = new Map<number, PendingServerRequest>()\n private readonly appServerArgs = [\n 'app-server',\n '-c',\n 'approval_policy=\"never\"',\n '-c',\n 'sandbox_mode=\"danger-full-access\"',\n ]\n\n private getCodexCommand(): string {\n const codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n throw new Error('Codex CLI is not available. Install @openai/codex or set CODEXUI_CODEX_COMMAND.')\n }\n return codexCommand\n }\n\n private start(): void {\n if (this.process) return\n\n this.stopping = false\n const invocation = getSpawnInvocation(this.getCodexCommand(), this.appServerArgs)\n const proc = spawn(invocation.command, invocation.args, { stdio: ['pipe', 'pipe', 'pipe'] })\n this.process = proc\n\n proc.stdout.setEncoding('utf8')\n proc.stdout.on('data', (chunk: string) => {\n this.readBuffer += chunk\n\n let lineEnd = this.readBuffer.indexOf('\\n')\n while (lineEnd !== -1) {\n const line = this.readBuffer.slice(0, lineEnd).trim()\n this.readBuffer = this.readBuffer.slice(lineEnd + 1)\n\n if (line.length > 0) {\n this.handleLine(line)\n }\n\n lineEnd = this.readBuffer.indexOf('\\n')\n }\n })\n\n proc.stderr.setEncoding('utf8')\n proc.stderr.on('data', () => {\n // Keep stderr silent in dev middleware; JSON-RPC errors are forwarded via responses.\n })\n\n proc.on('exit', () => {\n const failure = new Error(this.stopping ? 'codex app-server stopped' : 'codex app-server exited unexpectedly')\n for (const request of this.pending.values()) {\n request.reject(failure)\n }\n\n this.pending.clear()\n this.pendingServerRequests.clear()\n this.process = null\n this.initialized = false\n this.initializePromise = null\n this.readBuffer = ''\n })\n }\n\n private sendLine(payload: Record<string, unknown>): void {\n if (!this.process) {\n throw new Error('codex app-server is not running')\n }\n\n this.process.stdin.write(`${JSON.stringify(payload)}\\n`)\n }\n\n private handleLine(line: string): void {\n let message: JsonRpcResponse\n try {\n message = JSON.parse(line) as JsonRpcResponse\n } catch {\n return\n }\n\n if (typeof message.id === 'number' && this.pending.has(message.id)) {\n const pendingRequest = this.pending.get(message.id)\n this.pending.delete(message.id)\n\n if (!pendingRequest) return\n\n if (message.error) {\n pendingRequest.reject(new Error(message.error.message))\n } else {\n pendingRequest.resolve(message.result)\n }\n return\n }\n\n if (typeof message.method === 'string' && typeof message.id !== 'number') {\n this.emitNotification({\n method: message.method,\n params: message.params ?? null,\n })\n return\n }\n\n // Handle server-initiated JSON-RPC requests (approvals, dynamic tool calls, etc.).\n if (typeof message.id === 'number' && typeof message.method === 'string') {\n this.handleServerRequest(message.id, message.method, message.params ?? null)\n }\n }\n\n private emitNotification(notification: { method: string; params: unknown }): void {\n for (const listener of this.notificationListeners) {\n listener(notification)\n }\n }\n\n private sendServerRequestReply(requestId: number, reply: ServerRequestReply): void {\n if (reply.error) {\n this.sendLine({\n jsonrpc: '2.0',\n id: requestId,\n error: reply.error,\n })\n return\n }\n\n this.sendLine({\n jsonrpc: '2.0',\n id: requestId,\n result: reply.result ?? {},\n })\n }\n\n private resolvePendingServerRequest(requestId: number, reply: ServerRequestReply): void {\n const pendingRequest = this.pendingServerRequests.get(requestId)\n if (!pendingRequest) {\n throw new Error(`No pending server request found for id ${String(requestId)}`)\n }\n this.pendingServerRequests.delete(requestId)\n\n this.sendServerRequestReply(requestId, reply)\n const requestParams = asRecord(pendingRequest.params)\n const threadId =\n typeof requestParams?.threadId === 'string' && requestParams.threadId.length > 0\n ? requestParams.threadId\n : ''\n this.emitNotification({\n method: 'server/request/resolved',\n params: {\n id: requestId,\n method: pendingRequest.method,\n threadId,\n mode: 'manual',\n resolvedAtIso: new Date().toISOString(),\n },\n })\n }\n\n private handleServerRequest(requestId: number, method: string, params: unknown): void {\n const pendingRequest: PendingServerRequest = {\n id: requestId,\n method,\n params,\n receivedAtIso: new Date().toISOString(),\n }\n this.pendingServerRequests.set(requestId, pendingRequest)\n\n this.emitNotification({\n method: 'server/request',\n params: pendingRequest,\n })\n }\n\n private async call(method: string, params: unknown): Promise<unknown> {\n this.start()\n const id = this.nextId++\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject })\n\n this.sendLine({\n jsonrpc: '2.0',\n id,\n method,\n params,\n } satisfies JsonRpcCall)\n })\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return\n if (this.initializePromise) {\n await this.initializePromise\n return\n }\n\n this.initializePromise = this.call('initialize', {\n clientInfo: {\n name: 'codex-web-local',\n version: '0.1.0',\n },\n }).then(() => {\n this.initialized = true\n }).finally(() => {\n this.initializePromise = null\n })\n\n await this.initializePromise\n }\n\n async rpc(method: string, params: unknown): Promise<unknown> {\n await this.ensureInitialized()\n return this.call(method, params)\n }\n\n onNotification(listener: (value: { method: string; params: unknown }) => void): () => void {\n this.notificationListeners.add(listener)\n return () => {\n this.notificationListeners.delete(listener)\n }\n }\n\n async respondToServerRequest(payload: unknown): Promise<void> {\n await this.ensureInitialized()\n\n const body = asRecord(payload)\n if (!body) {\n throw new Error('Invalid response payload: expected object')\n }\n\n const id = body.id\n if (typeof id !== 'number' || !Number.isInteger(id)) {\n throw new Error('Invalid response payload: \"id\" must be an integer')\n }\n\n const rawError = asRecord(body.error)\n if (rawError) {\n const message = typeof rawError.message === 'string' && rawError.message.trim().length > 0\n ? rawError.message.trim()\n : 'Server request rejected by client'\n const code = typeof rawError.code === 'number' && Number.isFinite(rawError.code)\n ? Math.trunc(rawError.code)\n : -32000\n this.resolvePendingServerRequest(id, { error: { code, message } })\n return\n }\n\n if (!('result' in body)) {\n throw new Error('Invalid response payload: expected \"result\" or \"error\"')\n }\n\n this.resolvePendingServerRequest(id, { result: body.result })\n }\n\n listPendingServerRequests(): PendingServerRequest[] {\n return Array.from(this.pendingServerRequests.values())\n }\n\n dispose(): void {\n if (!this.process) return\n\n const proc = this.process\n this.stopping = true\n this.process = null\n this.initialized = false\n this.initializePromise = null\n this.readBuffer = ''\n\n const failure = new Error('codex app-server stopped')\n for (const request of this.pending.values()) {\n request.reject(failure)\n }\n this.pending.clear()\n this.pendingServerRequests.clear()\n\n try {\n proc.stdin.end()\n } catch {\n // ignore close errors on shutdown\n }\n\n try {\n proc.kill('SIGTERM')\n } catch {\n // ignore kill errors on shutdown\n }\n\n const forceKillTimer = setTimeout(() => {\n if (!proc.killed) {\n try {\n proc.kill('SIGKILL')\n } catch {\n // ignore kill errors on shutdown\n }\n }\n }, 1500)\n forceKillTimer.unref()\n }\n}\n\nclass MethodCatalog {\n private methodCache: string[] | null = null\n private notificationCache: string[] | null = null\n\n private async runGenerateSchemaCommand(outDir: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n reject(new Error('Codex CLI is not available. Install @openai/codex or set CODEXUI_CODEX_COMMAND.'))\n return\n }\n\n const invocation = getSpawnInvocation(codexCommand, ['app-server', 'generate-json-schema', '--out', outDir])\n const process = spawn(invocation.command, invocation.args, {\n stdio: ['ignore', 'ignore', 'pipe'],\n })\n\n let stderr = ''\n\n process.stderr.setEncoding('utf8')\n process.stderr.on('data', (chunk: string) => {\n stderr += chunk\n })\n\n process.on('error', reject)\n process.on('exit', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(stderr.trim() || `generate-json-schema exited with code ${String(code)}`))\n })\n })\n }\n\n private extractMethodsFromClientRequest(payload: unknown): string[] {\n const root = asRecord(payload)\n const oneOf = Array.isArray(root?.oneOf) ? root.oneOf : []\n const methods = new Set<string>()\n\n for (const entry of oneOf) {\n const row = asRecord(entry)\n const properties = asRecord(row?.properties)\n const methodDef = asRecord(properties?.method)\n const methodEnum = Array.isArray(methodDef?.enum) ? methodDef.enum : []\n\n for (const item of methodEnum) {\n if (typeof item === 'string' && item.length > 0) {\n methods.add(item)\n }\n }\n }\n\n return Array.from(methods).sort((a, b) => a.localeCompare(b))\n }\n\n private extractMethodsFromServerNotification(payload: unknown): string[] {\n const root = asRecord(payload)\n const oneOf = Array.isArray(root?.oneOf) ? root.oneOf : []\n const methods = new Set<string>()\n\n for (const entry of oneOf) {\n const row = asRecord(entry)\n const properties = asRecord(row?.properties)\n const methodDef = asRecord(properties?.method)\n const methodEnum = Array.isArray(methodDef?.enum) ? methodDef.enum : []\n\n for (const item of methodEnum) {\n if (typeof item === 'string' && item.length > 0) {\n methods.add(item)\n }\n }\n }\n\n return Array.from(methods).sort((a, b) => a.localeCompare(b))\n }\n\n async listMethods(): Promise<string[]> {\n if (this.methodCache) {\n return this.methodCache\n }\n\n const outDir = await mkdtemp(join(tmpdir(), 'codex-web-local-schema-'))\n await this.runGenerateSchemaCommand(outDir)\n\n const clientRequestPath = join(outDir, 'ClientRequest.json')\n const raw = await readFile(clientRequestPath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const methods = this.extractMethodsFromClientRequest(parsed)\n\n this.methodCache = methods\n return methods\n }\n\n async listNotificationMethods(): Promise<string[]> {\n if (this.notificationCache) {\n return this.notificationCache\n }\n\n const outDir = await mkdtemp(join(tmpdir(), 'codex-web-local-schema-'))\n await this.runGenerateSchemaCommand(outDir)\n\n const serverNotificationPath = join(outDir, 'ServerNotification.json')\n const raw = await readFile(serverNotificationPath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const methods = this.extractMethodsFromServerNotification(parsed)\n\n this.notificationCache = methods\n return methods\n }\n}\n\ntype CodexBridgeMiddleware = ((req: IncomingMessage, res: ServerResponse, next: () => void) => Promise<void>) & {\n dispose: () => void\n subscribeNotifications: (listener: (value: { method: string; params: unknown; atIso: string }) => void) => () => void\n}\n\ntype SharedBridgeState = {\n appServer: AppServerProcess\n methodCatalog: MethodCatalog\n telegramBridge: TelegramThreadBridge\n}\n\nconst SHARED_BRIDGE_KEY = '__codexRemoteSharedBridge__'\n\nfunction getSharedBridgeState(): SharedBridgeState {\n const globalScope = globalThis as typeof globalThis & {\n [SHARED_BRIDGE_KEY]?: SharedBridgeState\n }\n\n const existing = globalScope[SHARED_BRIDGE_KEY]\n if (existing) return existing\n\n const appServer = new AppServerProcess()\n const created: SharedBridgeState = {\n appServer,\n methodCatalog: new MethodCatalog(),\n telegramBridge: new TelegramThreadBridge(appServer),\n }\n globalScope[SHARED_BRIDGE_KEY] = created\n return created\n}\n\nasync function loadAllThreadsForSearch(appServer: AppServerProcess): Promise<ThreadSearchDocument[]> {\n const threads: Array<{ id: string; title: string; preview: string }> = []\n let cursor: string | null = null\n\n do {\n const response = asRecord(await appServer.rpc('thread/list', {\n archived: false,\n limit: 100,\n sortKey: 'updated_at',\n cursor,\n }))\n const data = Array.isArray(response?.data) ? response.data : []\n for (const row of data) {\n const record = asRecord(row)\n const id = typeof record?.id === 'string' ? record.id : ''\n if (!id) continue\n const title = typeof record?.name === 'string' && record.name.trim().length > 0\n ? record.name.trim()\n : (typeof record?.preview === 'string' && record.preview.trim().length > 0 ? record.preview.trim() : 'Untitled thread')\n const preview = typeof record?.preview === 'string' ? record.preview : ''\n threads.push({ id, title, preview })\n }\n cursor = typeof response?.nextCursor === 'string' && response.nextCursor.length > 0 ? response.nextCursor : null\n } while (cursor)\n\n const docs: ThreadSearchDocument[] = []\n const concurrency = 4\n for (let offset = 0; offset < threads.length; offset += concurrency) {\n const batch = threads.slice(offset, offset + concurrency)\n const loaded = await Promise.all(batch.map(async (thread) => {\n try {\n const readResponse = await appServer.rpc('thread/read', {\n threadId: thread.id,\n includeTurns: true,\n })\n const messageText = extractThreadMessageText(readResponse)\n const searchableText = [thread.title, thread.preview, messageText].filter(Boolean).join('\\n')\n return {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText,\n searchableText,\n } satisfies ThreadSearchDocument\n } catch {\n const searchableText = [thread.title, thread.preview].filter(Boolean).join('\\n')\n return {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText: '',\n searchableText,\n } satisfies ThreadSearchDocument\n }\n }))\n docs.push(...loaded)\n }\n\n return docs\n}\n\nasync function buildThreadSearchIndex(appServer: AppServerProcess): Promise<ThreadSearchIndex> {\n const docs = await loadAllThreadsForSearch(appServer)\n const docsById = new Map<string, ThreadSearchDocument>(docs.map((doc) => [doc.id, doc]))\n return { docsById }\n}\n\nexport function createCodexBridgeMiddleware(): CodexBridgeMiddleware {\n const { appServer, methodCatalog, telegramBridge } = getSharedBridgeState()\n let threadSearchIndex: ThreadSearchIndex | null = null\n let threadSearchIndexPromise: Promise<ThreadSearchIndex> | null = null\n\n async function getThreadSearchIndex(): Promise<ThreadSearchIndex> {\n if (threadSearchIndex) return threadSearchIndex\n if (!threadSearchIndexPromise) {\n threadSearchIndexPromise = buildThreadSearchIndex(appServer)\n .then((index) => {\n threadSearchIndex = index\n return index\n })\n .finally(() => {\n threadSearchIndexPromise = null\n })\n }\n return threadSearchIndexPromise\n }\n void initializeSkillsSyncOnStartup(appServer)\n void readTelegramBridgeConfig()\n .then((config) => {\n if (!config.botToken) return\n telegramBridge.configureToken(config.botToken)\n telegramBridge.start()\n })\n .catch(() => {})\n\n const middleware = async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n try {\n if (!req.url) {\n next()\n return\n }\n\n const url = new URL(req.url, 'http://localhost')\n\n if (await handleSkillsRoutes(req, res, url, { appServer, readJsonBody })) {\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/upload-file') {\n handleFileUpload(req, res)\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/rpc') {\n const payload = await readJsonBody(req)\n const body = asRecord(payload) as RpcProxyRequest | null\n\n if (!body || typeof body.method !== 'string' || body.method.length === 0) {\n setJson(res, 400, { error: 'Invalid body: expected { method, params? }' })\n return\n }\n\n const result = await appServer.rpc(body.method, body.params ?? null)\n setJson(res, 200, { result })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/transcribe') {\n const auth = await readCodexAuth()\n if (!auth) {\n setJson(res, 401, { error: 'No auth token available for transcription' })\n return\n }\n\n const rawBody = await readRawBody(req)\n const incomingCt = req.headers['content-type'] ?? 'application/octet-stream'\n const upstream = await proxyTranscribe(rawBody, incomingCt, auth.accessToken, auth.accountId)\n\n res.statusCode = upstream.status\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(upstream.body)\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/server-requests/respond') {\n const payload = await readJsonBody(req)\n await appServer.respondToServerRequest(payload)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/server-requests/pending') {\n setJson(res, 200, { data: appServer.listPendingServerRequests() })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/meta/methods') {\n const methods = await methodCatalog.listMethods()\n setJson(res, 200, { data: methods })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/meta/notifications') {\n const methods = await methodCatalog.listNotificationMethods()\n setJson(res, 200, { data: methods })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/workspace-roots-state') {\n const state = await readWorkspaceRootsState()\n setJson(res, 200, { data: state })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/home-directory') {\n setJson(res, 200, { data: { path: homedir() } })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/github-trending') {\n const sinceRaw = (url.searchParams.get('since') ?? '').trim().toLowerCase()\n const since: 'daily' | 'weekly' | 'monthly' =\n sinceRaw === 'weekly' ? 'weekly' : sinceRaw === 'monthly' ? 'monthly' : 'daily'\n const limitRaw = Number.parseInt((url.searchParams.get('limit') ?? '6').trim(), 10)\n const limit = Number.isFinite(limitRaw) ? Math.max(1, Math.min(10, limitRaw)) : 6\n try {\n const data = await fetchGithubTrending(since, limit)\n setJson(res, 200, { data })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch GitHub trending') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/worktree/create') {\n const payload = asRecord(await readJsonBody(req))\n const rawSourceCwd = typeof payload?.sourceCwd === 'string' ? payload.sourceCwd.trim() : ''\n if (!rawSourceCwd) {\n setJson(res, 400, { error: 'Missing sourceCwd' })\n return\n }\n\n const sourceCwd = isAbsolute(rawSourceCwd) ? rawSourceCwd : resolve(rawSourceCwd)\n try {\n const sourceInfo = await stat(sourceCwd)\n if (!sourceInfo.isDirectory()) {\n setJson(res, 400, { error: 'sourceCwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'sourceCwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n await runCommand('git', ['init'], { cwd: sourceCwd })\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n }\n const repoName = basename(gitRoot) || 'repo'\n const worktreesRoot = join(getCodexHomeDir(), 'worktrees')\n await mkdir(worktreesRoot, { recursive: true })\n\n // Match Codex desktop layout so project grouping resolves to repo name:\n // ~/.codex/worktrees/<id>/<repoName>\n let worktreeId = ''\n let worktreeParent = ''\n let worktreeCwd = ''\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = randomBytes(2).toString('hex')\n const parent = join(worktreesRoot, candidate)\n try {\n await stat(parent)\n continue\n } catch {\n worktreeId = candidate\n worktreeParent = parent\n worktreeCwd = join(parent, repoName)\n break\n }\n }\n if (!worktreeId || !worktreeParent || !worktreeCwd) {\n throw new Error('Failed to allocate a unique worktree id')\n }\n const branch = `codex/${worktreeId}`\n\n await mkdir(worktreeParent, { recursive: true })\n try {\n await runCommand('git', ['worktree', 'add', '-b', branch, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) throw error\n await ensureRepoHasInitialCommit(gitRoot)\n await runCommand('git', ['worktree', 'add', '-b', branch, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n }\n\n setJson(res, 200, {\n data: {\n cwd: worktreeCwd,\n branch,\n gitRoot,\n },\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to create worktree') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/worktree/auto-commit') {\n const payload = asRecord(await readJsonBody(req))\n const rawCwd = typeof payload?.cwd === 'string' ? payload.cwd.trim() : ''\n const commitMessage = normalizeCommitMessage(payload?.message)\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n if (!commitMessage) {\n setJson(res, 400, { error: 'Missing message' })\n return\n }\n\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const cwdInfo = await stat(cwd)\n if (!cwdInfo.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n await ensureRollbackGitRepo(cwd)\n const beforeStatus = await runRollbackGitWithOutput(cwd, ['status', '--porcelain'])\n if (!beforeStatus.trim()) {\n setJson(res, 200, { data: { committed: false } })\n return\n }\n\n await runRollbackGit(cwd, ['add', '-A'])\n const stagedStatus = await runRollbackGitWithOutput(cwd, ['diff', '--cached', '--name-only'])\n if (!stagedStatus.trim()) {\n setJson(res, 200, { data: { committed: false } })\n return\n }\n\n await runRollbackGit(cwd, ['commit', '-m', commitMessage])\n setJson(res, 200, { data: { committed: true } })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to auto-commit rollback changes') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/worktree/rollback-to-message') {\n const payload = asRecord(await readJsonBody(req))\n const rawCwd = typeof payload?.cwd === 'string' ? payload.cwd.trim() : ''\n const commitMessage = normalizeCommitMessage(payload?.message)\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n if (!commitMessage) {\n setJson(res, 400, { error: 'Missing message' })\n return\n }\n\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const cwdInfo = await stat(cwd)\n if (!cwdInfo.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n await ensureRollbackGitRepo(cwd)\n const commitSha = await findRollbackCommitByExactMessage(cwd, commitMessage)\n if (!commitSha) {\n setJson(res, 404, { error: 'No matching commit found for this user message' })\n return\n }\n let resetTargetSha = ''\n try {\n resetTargetSha = await runRollbackGitCapture(cwd, ['rev-parse', `${commitSha}^`])\n } catch {\n setJson(res, 409, { error: 'Cannot rollback: matched commit has no parent commit' })\n return\n }\n\n let stashed = false\n if (await hasRollbackGitWorkingTreeChanges(cwd)) {\n const stashMessage = `codex-auto-stash-before-rollback-${Date.now()}`\n await runRollbackGit(cwd, ['stash', 'push', '-u', '-m', stashMessage])\n stashed = true\n }\n\n await runRollbackGit(cwd, ['reset', '--hard', resetTargetSha])\n setJson(res, 200, { data: { reset: true, commitSha, resetTargetSha, stashed } })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to rollback project to user message commit') })\n }\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/workspace-roots-state') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n const nextState: WorkspaceRootsState = {\n order: normalizeStringArray(record.order),\n labels: normalizeStringRecord(record.labels),\n active: normalizeStringArray(record.active),\n }\n await writeWorkspaceRootsState(nextState)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/project-root') {\n const payload = asRecord(await readJsonBody(req))\n const rawPath = typeof payload?.path === 'string' ? payload.path.trim() : ''\n const createIfMissing = payload?.createIfMissing === true\n const label = typeof payload?.label === 'string' ? payload.label : ''\n if (!rawPath) {\n setJson(res, 400, { error: 'Missing path' })\n return\n }\n\n const normalizedPath = isAbsolute(rawPath) ? rawPath : resolve(rawPath)\n let pathExists = true\n try {\n const info = await stat(normalizedPath)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'Path exists but is not a directory' })\n return\n }\n } catch {\n pathExists = false\n }\n\n if (!pathExists && createIfMissing) {\n await mkdir(normalizedPath, { recursive: true })\n } else if (!pathExists) {\n setJson(res, 404, { error: 'Directory does not exist' })\n return\n }\n\n const existingState = await readWorkspaceRootsState()\n const nextOrder = [normalizedPath, ...existingState.order.filter((item) => item !== normalizedPath)]\n const nextActive = [normalizedPath, ...existingState.active.filter((item) => item !== normalizedPath)]\n const nextLabels = { ...existingState.labels }\n if (label.trim().length > 0) {\n nextLabels[normalizedPath] = label.trim()\n }\n await writeWorkspaceRootsState({\n order: nextOrder,\n labels: nextLabels,\n active: nextActive,\n })\n setJson(res, 200, { data: { path: normalizedPath } })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/project-root-suggestion') {\n const basePath = url.searchParams.get('basePath')?.trim() ?? ''\n if (!basePath) {\n setJson(res, 400, { error: 'Missing basePath' })\n return\n }\n const normalizedBasePath = isAbsolute(basePath) ? basePath : resolve(basePath)\n try {\n const baseInfo = await stat(normalizedBasePath)\n if (!baseInfo.isDirectory()) {\n setJson(res, 400, { error: 'basePath is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'basePath does not exist' })\n return\n }\n\n let index = 1\n while (index < 100000) {\n const candidateName = `New Project (${String(index)})`\n const candidatePath = join(normalizedBasePath, candidateName)\n try {\n await stat(candidatePath)\n index += 1\n continue\n } catch {\n setJson(res, 200, { data: { name: candidateName, path: candidatePath } })\n return\n }\n }\n\n setJson(res, 500, { error: 'Failed to compute project name suggestion' })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composer-file-search') {\n const payload = asRecord(await readJsonBody(req))\n const rawCwd = typeof payload?.cwd === 'string' ? payload.cwd.trim() : ''\n const query = typeof payload?.query === 'string' ? payload.query.trim() : ''\n const limitRaw = typeof payload?.limit === 'number' ? payload.limit : 20\n const limit = Math.max(1, Math.min(100, Math.floor(limitRaw)))\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const info = await stat(cwd)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n const files = await listFilesWithRipgrep(cwd)\n const scored = files\n .map((path) => ({ path, score: scoreFileCandidate(path, query) }))\n .filter((row) => query.length === 0 || row.score < 10)\n .sort((a, b) => (a.score - b.score) || a.path.localeCompare(b.path))\n .slice(0, limit)\n .map((row) => ({ path: row.path }))\n setJson(res, 200, { data: scored })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to search files') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-titles') {\n const cache = await readMergedThreadTitleCache()\n setJson(res, 200, { data: cache })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-search') {\n const payload = asRecord(await readJsonBody(req))\n const query = typeof payload?.query === 'string' ? payload.query.trim() : ''\n const limitRaw = typeof payload?.limit === 'number' ? payload.limit : 200\n const limit = Math.max(1, Math.min(1000, Math.floor(limitRaw)))\n if (!query) {\n setJson(res, 200, { data: { threadIds: [], indexedThreadCount: 0 } })\n return\n }\n\n const index = await getThreadSearchIndex()\n const matchedIds = Array.from(index.docsById.entries())\n .filter(([, doc]) => isExactPhraseMatch(query, doc))\n .slice(0, limit)\n .map(([id]) => id)\n\n setJson(res, 200, { data: { threadIds: matchedIds, indexedThreadCount: index.docsById.size } })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-titles') {\n const payload = asRecord(await readJsonBody(req))\n const id = typeof payload?.id === 'string' ? payload.id : ''\n const title = typeof payload?.title === 'string' ? payload.title : ''\n if (!id) {\n setJson(res, 400, { error: 'Missing id' })\n return\n }\n const cache = await readThreadTitleCache()\n const next = title ? updateThreadTitleCache(cache, id, title) : removeFromThreadTitleCache(cache, id)\n await writeThreadTitleCache(next)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/telegram/configure-bot') {\n const payload = asRecord(await readJsonBody(req))\n const botToken = typeof payload?.botToken === 'string' ? payload.botToken.trim() : ''\n if (!botToken) {\n setJson(res, 400, { error: 'Missing botToken' })\n return\n }\n\n telegramBridge.configureToken(botToken)\n telegramBridge.start()\n await writeTelegramBridgeConfig({ botToken })\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/telegram/status') {\n setJson(res, 200, { data: telegramBridge.getStatus() })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/events') {\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/event-stream; charset=utf-8')\n res.setHeader('Cache-Control', 'no-cache, no-transform')\n res.setHeader('Connection', 'keep-alive')\n res.setHeader('X-Accel-Buffering', 'no')\n\n const unsubscribe = middleware.subscribeNotifications((notification: { method: string; params: unknown; atIso: string }) => {\n if (res.writableEnded || res.destroyed) return\n res.write(`data: ${JSON.stringify(notification)}\\n\\n`)\n })\n\n res.write(`event: ready\\ndata: ${JSON.stringify({ ok: true })}\\n\\n`)\n const keepAlive = setInterval(() => {\n res.write(': ping\\n\\n')\n }, 15000)\n\n const close = () => {\n clearInterval(keepAlive)\n unsubscribe()\n if (!res.writableEnded) {\n res.end()\n }\n }\n\n req.on('close', close)\n req.on('aborted', close)\n return\n }\n\n next()\n } catch (error) {\n const message = getErrorMessage(error, 'Unknown bridge error')\n setJson(res, 502, { error: message })\n }\n }\n\n middleware.dispose = () => {\n threadSearchIndex = null\n telegramBridge.stop()\n appServer.dispose()\n }\n middleware.subscribeNotifications = (\n listener: (value: { method: string; params: unknown; atIso: string }) => void,\n ) => {\n return appServer.onNotification((notification: { method: string; params: unknown }) => {\n listener({\n ...notification,\n atIso: new Date().toISOString(),\n })\n })\n }\n\n return middleware\n}\n","import { spawn } from 'node:child_process'\nimport { mkdtemp, readFile, readdir, rm, mkdir, stat, lstat, readlink, symlink } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { writeFile } from 'node:fs/promises'\nimport { resolvePythonCommand, resolveSkillInstallerScriptPath } from '../commandResolution.js'\n\ntype AppServerLike = {\n rpc(method: string, params: unknown): Promise<unknown>\n}\n\ntype ReadJsonBody = (req: IncomingMessage) => Promise<unknown>\n\ntype SkillRouteContext = {\n appServer: AppServerLike\n readJsonBody: ReadJsonBody\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n const record = asRecord(payload)\n if (!record) return fallback\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nconst DEFAULT_COMMAND_TIMEOUT_MS = 120_000\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<void> {\n const timeout = options.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS\n await new Promise<void>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let settled = false\n let stdout = ''\n let stderr = ''\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n proc.kill('SIGKILL')\n reject(new Error(`Command timed out after ${timeout}ms (${command} ${args.join(' ')})`))\n }, timeout)\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', (err) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.on('close', (code) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (code === 0) {\n resolve()\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nasync function runCommandWithOutput(command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<string> {\n const timeout = options.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let settled = false\n let stdout = ''\n let stderr = ''\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n proc.kill('SIGKILL')\n reject(new Error(`Command timed out after ${timeout}ms (${command} ${args.join(' ')})`))\n }, timeout)\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', (err) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.on('close', (code) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms)\n promise.then(\n (val) => { clearTimeout(timer); resolve(val) },\n (err) => { clearTimeout(timer); reject(err) },\n )\n })\n}\n\nasync function detectUserSkillsDir(appServer: AppServerLike): Promise<string> {\n try {\n const result = (await appServer.rpc('skills/list', {})) as {\n data?: Array<{ skills?: Array<{ scope?: string; path?: string }> }>\n }\n for (const entry of result.data ?? []) {\n for (const skill of entry.skills ?? []) {\n if (skill.scope !== 'user' || !skill.path) continue\n const parts = skill.path.split('/').filter(Boolean)\n if (parts.length < 2) continue\n return `/${parts.slice(0, -2).join('/')}`\n }\n }\n } catch {}\n return getSkillsInstallDir()\n}\n\nasync function ensureInstalledSkillIsValid(appServer: AppServerLike, skillPath: string): Promise<void> {\n const result = (await appServer.rpc('skills/list', { forceReload: true })) as {\n data?: Array<{ errors?: Array<{ path?: string; message?: string }> }>\n }\n const normalized = skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`\n for (const entry of result.data ?? []) {\n for (const error of entry.errors ?? []) {\n if (error.path === normalized) {\n throw new Error(error.message || 'Installed skill is invalid')\n }\n }\n }\n}\n\ntype SkillHubEntry = {\n name: string\n owner: string\n description: string\n displayName: string\n publishedAt: number\n avatarUrl: string\n url: string\n installed: boolean\n path?: string\n enabled?: boolean\n}\n\ntype SkillsTreeEntry = {\n name: string\n owner: string\n url: string\n}\n\ntype SkillsTreeCache = {\n entries: SkillsTreeEntry[]\n fetchedAt: number\n}\n\ntype MetaJson = {\n displayName?: string\n owner?: string\n slug?: string\n latest?: { publishedAt?: number }\n}\n\nconst TREE_CACHE_TTL_MS = 5 * 60 * 1000\nlet skillsTreeCache: SkillsTreeCache | null = null\nconst metaCache = new Map<string, { description: string; displayName: string; publishedAt: number }>()\n\nasync function getGhToken(): Promise<string | null> {\n try {\n const proc = spawn('gh', ['auth', 'token'], { stdio: ['ignore', 'pipe', 'ignore'] })\n let out = ''\n proc.stdout.on('data', (d: Buffer) => { out += d.toString() })\n return new Promise((resolve) => {\n proc.on('close', (code) => resolve(code === 0 ? out.trim() : null))\n proc.on('error', () => resolve(null))\n })\n } catch {\n return null\n }\n}\n\nasync function ghFetch(url: string): Promise<Response> {\n const token = await getGhToken()\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'codex-web-local',\n }\n if (token) headers.Authorization = `Bearer ${token}`\n return fetch(url, { headers })\n}\n\nasync function fetchSkillsTree(): Promise<SkillsTreeEntry[]> {\n if (skillsTreeCache && Date.now() - skillsTreeCache.fetchedAt < TREE_CACHE_TTL_MS) {\n return skillsTreeCache.entries\n }\n\n const resp = await ghFetch(`https://api.github.com/repos/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/git/trees/main?recursive=1`)\n if (!resp.ok) throw new Error(`GitHub tree API returned ${resp.status}`)\n const data = (await resp.json()) as { tree?: Array<{ path: string; type: string }> }\n\n const metaPattern = /^skills\\/([^/]+)\\/([^/]+)\\/_meta\\.json$/\n const seen = new Set<string>()\n const entries: SkillsTreeEntry[] = []\n\n for (const node of data.tree ?? []) {\n const match = metaPattern.exec(node.path)\n if (!match) continue\n const [, owner, skillName] = match\n const key = `${owner}/${skillName}`\n if (seen.has(key)) continue\n seen.add(key)\n entries.push({\n name: skillName,\n owner,\n url: `https://github.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/tree/main/skills/${owner}/${skillName}`,\n })\n }\n\n skillsTreeCache = { entries, fetchedAt: Date.now() }\n return entries\n}\n\nasync function fetchMetaBatch(entries: SkillsTreeEntry[]): Promise<void> {\n const toFetch = entries.filter((e) => !metaCache.has(`${e.owner}/${e.name}`))\n if (toFetch.length === 0) return\n const batch = toFetch.slice(0, 50)\n await Promise.allSettled(\n batch.map(async (e) => {\n const rawUrl = `https://raw.githubusercontent.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/main/skills/${e.owner}/${e.name}/_meta.json`\n const resp = await fetch(rawUrl)\n if (!resp.ok) return\n const meta = (await resp.json()) as MetaJson\n metaCache.set(`${e.owner}/${e.name}`, {\n displayName: typeof meta.displayName === 'string' ? meta.displayName : '',\n description: typeof meta.displayName === 'string' ? meta.displayName : '',\n publishedAt: meta.latest?.publishedAt ?? 0,\n })\n }),\n )\n}\n\nfunction buildHubEntry(e: SkillsTreeEntry): SkillHubEntry {\n const cached = metaCache.get(`${e.owner}/${e.name}`)\n return {\n name: e.name,\n owner: e.owner,\n description: cached?.description ?? '',\n displayName: cached?.displayName ?? '',\n publishedAt: cached?.publishedAt ?? 0,\n avatarUrl: `https://github.com/${e.owner}.png?size=40`,\n url: e.url,\n installed: false,\n }\n}\n\ntype InstalledSkillInfo = { name: string; path: string; enabled: boolean }\ntype SyncedSkill = { owner?: string; name: string; enabled: boolean }\n\ntype SkillsSyncState = {\n githubToken?: string\n githubUsername?: string\n repoOwner?: string\n repoName?: string\n installedOwners?: Record<string, string>\n}\n\ntype GithubDeviceCodeResponse = {\n device_code: string\n user_code: string\n verification_uri: string\n expires_in: number\n interval: number\n}\n\ntype GithubTokenResponse = { access_token?: string; error?: string }\n\nconst GITHUB_DEVICE_CLIENT_ID = 'Iv1.b507a08c87ecfe98'\nconst DEFAULT_SKILLS_SYNC_REPO_NAME = 'codexskills'\nconst SKILLS_SYNC_MANIFEST_PATH = 'installed-skills.json'\nconst SYNC_UPSTREAM_SKILLS_OWNER = 'OpenClawAndroid'\nconst SYNC_UPSTREAM_SKILLS_REPO = 'skills'\nconst PRIVATE_SYNC_BRANCH = 'main'\nconst HUB_SKILLS_OWNER = 'openclaw'\nconst HUB_SKILLS_REPO = 'skills'\nlet startupSkillsSyncInitialized = false\n\ntype StartupSyncStatus = {\n inProgress: boolean\n mode: 'unauthenticated-bootstrap' | 'authenticated-fork-sync' | 'idle'\n branch: string\n lastAction: string\n lastRunAtIso: string\n lastSuccessAtIso: string\n lastError: string\n}\n\nconst startupSyncStatus: StartupSyncStatus = {\n inProgress: false,\n mode: 'idle',\n branch: PRIVATE_SYNC_BRANCH,\n lastAction: 'not-started',\n lastRunAtIso: '',\n lastSuccessAtIso: '',\n lastError: '',\n}\n\nasync function scanInstalledSkillsFromDisk(): Promise<Map<string, InstalledSkillInfo>> {\n const map = new Map<string, InstalledSkillInfo>()\n const skillsDir = getSkillsInstallDir()\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true })\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) continue\n const skillMd = join(skillsDir, entry.name, 'SKILL.md')\n try {\n await stat(skillMd)\n map.set(entry.name, { name: entry.name, path: skillMd, enabled: true })\n } catch {}\n }\n } catch {}\n return map\n}\n\nfunction extractSkillDescriptionFromMarkdown(markdown: string): string {\n const lines = markdown.split(/\\r?\\n/)\n let inCodeFence = false\n for (const rawLine of lines) {\n const line = rawLine.trim()\n if (line.startsWith('```')) {\n inCodeFence = !inCodeFence\n continue\n }\n if (inCodeFence || line.length === 0) continue\n if (line.startsWith('#')) continue\n if (line.startsWith('>')) continue\n if (line.startsWith('- ') || line.startsWith('* ')) continue\n return line\n }\n return ''\n}\n\nfunction getSkillsSyncStatePath(): string {\n return join(getCodexHomeDir(), 'skills-sync.json')\n}\n\nasync function readSkillsSyncState(): Promise<SkillsSyncState> {\n try {\n const raw = await readFile(getSkillsSyncStatePath(), 'utf8')\n const parsed = JSON.parse(raw) as SkillsSyncState\n return parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n return {}\n }\n}\n\nasync function writeSkillsSyncState(state: SkillsSyncState): Promise<void> {\n await writeFile(getSkillsSyncStatePath(), JSON.stringify(state), 'utf8')\n}\n\nasync function getGithubJson<T>(url: string, token: string, method = 'GET', body?: unknown): Promise<T> {\n const resp = await fetch(url, {\n method,\n headers: {\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n if (!resp.ok) {\n const text = await resp.text()\n throw new Error(`GitHub API ${method} ${url} failed (${resp.status}): ${text}`)\n }\n return await resp.json() as T\n}\n\nasync function startGithubDeviceLogin(): Promise<GithubDeviceCodeResponse> {\n const resp = await fetch('https://github.com/login/device/code', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'codex-web-local',\n },\n body: new URLSearchParams({\n client_id: GITHUB_DEVICE_CLIENT_ID,\n scope: 'repo read:user',\n }),\n })\n if (!resp.ok) {\n throw new Error(`GitHub device flow init failed (${resp.status})`)\n }\n return await resp.json() as GithubDeviceCodeResponse\n}\n\nasync function completeGithubDeviceLogin(deviceCode: string): Promise<{ token: string | null; error: string | null }> {\n const resp = await fetch('https://github.com/login/oauth/access_token', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'codex-web-local',\n },\n body: new URLSearchParams({\n client_id: GITHUB_DEVICE_CLIENT_ID,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n })\n if (!resp.ok) {\n throw new Error(`GitHub token exchange failed (${resp.status})`)\n }\n const payload = await resp.json() as GithubTokenResponse\n if (!payload.access_token) return { token: null, error: payload.error || 'unknown_error' }\n return { token: payload.access_token, error: null }\n}\n\nfunction isAndroidLikeRuntime(): boolean {\n if (process.platform === 'android') return true\n if (existsSync('/data/data/com.termux')) return true\n if (process.env.TERMUX_VERSION) return true\n const prefix = process.env.PREFIX?.toLowerCase() ?? ''\n if (prefix.includes('/com.termux/')) return true\n const proot = process.env.PROOT_TMP_DIR?.toLowerCase() ?? ''\n return proot.length > 0\n}\n\nfunction getPreferredPublicUpstreamBranch(): string {\n return isAndroidLikeRuntime() ? 'android' : 'main'\n}\n\nfunction isUpstreamSkillsRepo(repoOwner: string, repoName: string): boolean {\n return repoOwner.toLowerCase() === SYNC_UPSTREAM_SKILLS_OWNER.toLowerCase()\n && repoName.toLowerCase() === SYNC_UPSTREAM_SKILLS_REPO.toLowerCase()\n}\n\nasync function resolveGithubUsername(token: string): Promise<string> {\n const user = await getGithubJson<{ login: string }>('https://api.github.com/user', token)\n return user.login\n}\n\nasync function ensurePrivateForkFromUpstream(token: string, username: string, repoName: string): Promise<void> {\n const repoUrl = `https://api.github.com/repos/${username}/${repoName}`\n let created = false\n const existing = await fetch(repoUrl, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (existing.ok) {\n const details = await existing.json() as { private?: boolean }\n if (details.private === true) return\n await getGithubJson(repoUrl, token, 'PATCH', { private: true })\n return\n }\n if (existing.status !== 404) {\n throw new Error(`Failed to check personal repo existence (${existing.status})`)\n }\n\n await getGithubJson(\n 'https://api.github.com/user/repos',\n token,\n 'POST',\n { name: repoName, private: true, auto_init: false, description: 'Codex skills private mirror sync' },\n )\n created = true\n\n let ready = false\n for (let i = 0; i < 20; i++) {\n const check = await fetch(repoUrl, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (check.ok) {\n ready = true\n break\n }\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n if (!ready) throw new Error('Private mirror repo was created but is not available yet')\n if (!created) return\n\n const tmp = await mkdtemp(join(tmpdir(), 'codex-skills-seed-'))\n try {\n const upstreamUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n const branch = PRIVATE_SYNC_BRANCH\n try {\n await runCommand('git', ['clone', '--depth', '1', '--single-branch', '--branch', branch, upstreamUrl, tmp])\n } catch {\n await runCommand('git', ['clone', '--depth', '1', upstreamUrl, tmp])\n }\n const privateRemote = toGitHubTokenRemote(username, repoName, token)\n await runCommand('git', ['remote', 'set-url', 'origin', privateRemote], { cwd: tmp })\n try { await runCommand('git', ['checkout', '-B', branch], { cwd: tmp }) } catch {}\n await runCommand('git', ['push', '-u', 'origin', `HEAD:${branch}`], { cwd: tmp })\n } finally {\n await rm(tmp, { recursive: true, force: true })\n }\n}\n\nasync function readRemoteSkillsManifest(token: string, repoOwner: string, repoName: string): Promise<SyncedSkill[]> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n const resp = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (resp.status === 404) return []\n if (!resp.ok) throw new Error(`Failed to read remote manifest (${resp.status})`)\n const payload = await resp.json() as { content?: string }\n const content = payload.content ? Buffer.from(payload.content.replace(/\\n/g, ''), 'base64').toString('utf8') : '[]'\n const parsed = JSON.parse(content) as unknown\n if (!Array.isArray(parsed)) return []\n const skills: SyncedSkill[] = []\n for (const row of parsed) {\n const item = asRecord(row)\n const owner = typeof item?.owner === 'string' ? item.owner : ''\n const name = typeof item?.name === 'string' ? item.name : ''\n if (!name) continue\n skills.push({ ...(owner ? { owner } : {}), name, enabled: item?.enabled !== false })\n }\n return skills\n}\n\nasync function writeRemoteSkillsManifest(token: string, repoOwner: string, repoName: string, skills: SyncedSkill[]): Promise<void> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n let sha = ''\n const existing = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (existing.ok) {\n const payload = await existing.json() as { sha?: string }\n sha = payload.sha ?? ''\n }\n const content = Buffer.from(JSON.stringify(skills, null, 2), 'utf8').toString('base64')\n await getGithubJson(url, token, 'PUT', {\n message: 'Update synced skills manifest',\n content,\n ...(sha ? { sha } : {}),\n })\n}\n\nfunction toGitHubTokenRemote(repoOwner: string, repoName: string, token: string): string {\n return `https://x-access-token:${encodeURIComponent(token)}@github.com/${repoOwner}/${repoName}.git`\n}\n\nasync function ensureSkillsWorkingTreeRepo(repoUrl: string, branch: string): Promise<string> {\n const localDir = getSkillsInstallDir()\n await mkdir(localDir, { recursive: true })\n const gitDir = join(localDir, '.git')\n let hasGitDir = false\n try { hasGitDir = (await stat(gitDir)).isDirectory() } catch { hasGitDir = false }\n\n if (!hasGitDir) {\n await runCommand('git', ['init'], { cwd: localDir })\n await runCommand('git', ['config', 'user.email', 'skills-sync@local'], { cwd: localDir })\n await runCommand('git', ['config', 'user.name', 'Skills Sync'], { cwd: localDir })\n await runCommand('git', ['add', '-A'], { cwd: localDir })\n try { await runCommand('git', ['commit', '-m', 'Local skills snapshot before sync'], { cwd: localDir }) } catch {}\n await runCommand('git', ['branch', '-M', branch], { cwd: localDir })\n try { await runCommand('git', ['remote', 'add', 'origin', repoUrl], { cwd: localDir }) } catch {\n await runCommand('git', ['remote', 'set-url', 'origin', repoUrl], { cwd: localDir })\n }\n await runCommand('git', ['fetch', 'origin'], { cwd: localDir })\n try {\n await runCommand('git', ['merge', '--allow-unrelated-histories', '--no-edit', `origin/${branch}`], { cwd: localDir })\n } catch {}\n return localDir\n }\n\n await runCommand('git', ['remote', 'set-url', 'origin', repoUrl], { cwd: localDir })\n await runCommand('git', ['fetch', 'origin'], { cwd: localDir })\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n try {\n await runCommand('git', ['checkout', branch], { cwd: localDir })\n } catch {\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n await runCommand('git', ['checkout', '-B', branch], { cwd: localDir })\n }\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n const localMtimesBeforePull = await snapshotFileMtimes(localDir)\n try { await runCommand('git', ['stash', 'push', '--include-untracked', '-m', 'codex-skills-autostash'], { cwd: localDir }) } catch {}\n let pulledMtimes = new Map<string, number>()\n try {\n await runCommand('git', ['pull', '--no-rebase', '--no-ff', 'origin', branch], { cwd: localDir })\n pulledMtimes = await snapshotFileMtimes(localDir)\n } catch {\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n pulledMtimes = await snapshotFileMtimes(localDir)\n }\n try {\n await runCommand('git', ['stash', 'pop'], { cwd: localDir })\n } catch {\n await resolveStashPopConflictsByFileTime(localDir, localMtimesBeforePull, pulledMtimes)\n }\n return localDir\n}\n\nasync function resolveMergeConflictsByNewerCommit(repoDir: string, branch: string): Promise<void> {\n const unmerged = (await runCommandWithOutput('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: repoDir }))\n .split(/\\r?\\n/)\n .map((row) => row.trim())\n .filter(Boolean)\n if (unmerged.length === 0) return\n for (const path of unmerged) {\n const oursTime = await getCommitTime(repoDir, 'HEAD', path)\n const theirsTime = await getCommitTime(repoDir, `origin/${branch}`, path)\n if (theirsTime > oursTime) {\n await runCommand('git', ['checkout', '--theirs', '--', path], { cwd: repoDir })\n } else {\n await runCommand('git', ['checkout', '--ours', '--', path], { cwd: repoDir })\n }\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const mergeHead = (await runCommandWithOutput('git', ['rev-parse', '-q', '--verify', 'MERGE_HEAD'], { cwd: repoDir })).trim()\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve skills merge by newer file'], { cwd: repoDir })\n }\n}\n\nasync function getCommitTime(repoDir: string, ref: string, path: string): Promise<number> {\n try {\n const output = (await runCommandWithOutput('git', ['log', '-1', '--format=%ct', ref, '--', path], { cwd: repoDir })).trim()\n return output ? Number.parseInt(output, 10) : 0\n } catch {\n return 0\n }\n}\n\nasync function resolveStashPopConflictsByFileTime(\n repoDir: string,\n localMtimesBeforePull: Map<string, number>,\n pulledMtimes: Map<string, number>,\n): Promise<void> {\n const unmerged = (await runCommandWithOutput('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: repoDir }))\n .split(/\\r?\\n/)\n .map((row) => row.trim())\n .filter(Boolean)\n if (unmerged.length === 0) return\n for (const path of unmerged) {\n const localMtime = localMtimesBeforePull.get(path) ?? 0\n const pulledMtime = pulledMtimes.get(path) ?? 0\n const side = localMtime >= pulledMtime ? '--theirs' : '--ours'\n await runCommand('git', ['checkout', side, '--', path], { cwd: repoDir })\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const mergeHead = (await runCommandWithOutput('git', ['rev-parse', '-q', '--verify', 'MERGE_HEAD'], { cwd: repoDir })).trim()\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve stash-pop conflicts by file time'], { cwd: repoDir })\n }\n}\n\nasync function snapshotFileMtimes(dir: string): Promise<Map<string, number>> {\n const mtimes = new Map<string, number>()\n await walkFileMtimes(dir, dir, mtimes)\n return mtimes\n}\n\nasync function walkFileMtimes(rootDir: string, currentDir: string, out: Map<string, number>): Promise<void> {\n let entries: Array<{ name: string | Buffer; isDirectory: () => boolean; isFile: () => boolean }>\n try {\n entries = (await readdir(currentDir, { withFileTypes: true })) as Array<{ name: string | Buffer; isDirectory: () => boolean; isFile: () => boolean }>\n } catch {\n return\n }\n for (const entry of entries) {\n const entryName = String(entry.name)\n if (entryName === '.git') continue\n const absolutePath = join(currentDir, entryName)\n const relativePath = absolutePath.slice(rootDir.length + 1)\n if (entry.isDirectory()) {\n await walkFileMtimes(rootDir, absolutePath, out)\n continue\n }\n if (!entry.isFile()) continue\n try {\n const info = await stat(absolutePath)\n out.set(relativePath, info.mtimeMs)\n } catch {}\n }\n}\n\nasync function syncInstalledSkillsFolderToRepo(\n token: string,\n repoOwner: string,\n repoName: string,\n _installedMap: Map<string, InstalledSkillInfo>,\n): Promise<void> {\n function isNonFastForwardPushError(error: unknown): boolean {\n const text = getErrorMessage(error, '').toLowerCase()\n return text.includes('non-fast-forward')\n || text.includes('fetch first')\n || (text.includes('rejected') && text.includes('push'))\n }\n\n async function pushWithNonFastForwardRetry(repoDir: string, branch: string): Promise<void> {\n const maxAttempts = 3\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n await runCommand('git', ['push', 'origin', `HEAD:${branch}`], { cwd: repoDir })\n return\n } catch (error) {\n if (!isNonFastForwardPushError(error) || attempt >= maxAttempts) {\n throw error\n }\n }\n await runCommand('git', ['fetch', 'origin'], { cwd: repoDir })\n try {\n await runCommand('git', ['pull', '--no-rebase', '--no-ff', 'origin', branch], { cwd: repoDir })\n } catch {\n await resolveMergeConflictsByNewerCommit(repoDir, branch)\n }\n await runCommand('git', ['add', '.'], { cwd: repoDir })\n const statusAfterReconcile = (await runCommandWithOutput('git', ['status', '--porcelain'], { cwd: repoDir })).trim()\n if (statusAfterReconcile) {\n await runCommand('git', ['commit', '-m', 'Reconcile skills sync before push retry'], { cwd: repoDir })\n }\n }\n throw new Error('Failed to push after non-fast-forward retries')\n }\n\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const branch = PRIVATE_SYNC_BRANCH\n const repoDir = await ensureSkillsWorkingTreeRepo(remoteUrl, branch)\n void _installedMap\n await runCommand('git', ['config', 'user.email', 'skills-sync@local'], { cwd: repoDir })\n await runCommand('git', ['config', 'user.name', 'Skills Sync'], { cwd: repoDir })\n await runCommand('git', ['add', '.'], { cwd: repoDir })\n const status = (await runCommandWithOutput('git', ['status', '--porcelain'], { cwd: repoDir })).trim()\n if (!status) return\n await runCommand('git', ['commit', '-m', 'Sync installed skills folder and manifest'], { cwd: repoDir })\n await pushWithNonFastForwardRetry(repoDir, branch)\n}\n\nasync function pullInstalledSkillsFolderFromRepo(token: string, repoOwner: string, repoName: string): Promise<void> {\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const branch = PRIVATE_SYNC_BRANCH\n await ensureSkillsWorkingTreeRepo(remoteUrl, branch)\n}\n\nasync function bootstrapSkillsFromUpstreamIntoLocal(): Promise<void> {\n const repoUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n const branch = getPreferredPublicUpstreamBranch()\n await ensureSkillsWorkingTreeRepo(repoUrl, branch)\n}\n\nasync function collectLocalSyncedSkills(appServer: AppServerLike): Promise<SyncedSkill[]> {\n const state = await readSkillsSyncState()\n const owners = { ...(state.installedOwners ?? {}) }\n const tree = await fetchSkillsTree()\n const uniqueOwnerByName = new Map<string, string>()\n const ambiguousNames = new Set<string>()\n for (const entry of tree) {\n if (ambiguousNames.has(entry.name)) continue\n const existingOwner = uniqueOwnerByName.get(entry.name)\n if (!existingOwner) {\n uniqueOwnerByName.set(entry.name, entry.owner)\n continue\n }\n if (existingOwner !== entry.owner) {\n uniqueOwnerByName.delete(entry.name)\n ambiguousNames.add(entry.name)\n }\n }\n\n const skills = (await appServer.rpc('skills/list', {})) as { data?: Array<{ skills?: Array<{ name?: string; enabled?: boolean }> }> }\n const seen = new Set<string>()\n const synced: SyncedSkill[] = []\n let ownersChanged = false\n for (const entry of skills.data ?? []) {\n for (const skill of entry.skills ?? []) {\n const name = typeof skill.name === 'string' ? skill.name : ''\n if (!name || seen.has(name)) continue\n seen.add(name)\n let owner = owners[name]\n if (!owner) {\n owner = uniqueOwnerByName.get(name) ?? ''\n if (owner) {\n owners[name] = owner\n ownersChanged = true\n }\n }\n synced.push({ ...(owner ? { owner } : {}), name, enabled: skill.enabled !== false })\n }\n }\n if (ownersChanged) {\n await writeSkillsSyncState({ ...state, installedOwners: owners })\n }\n synced.sort((a, b) => `${a.owner ?? ''}/${a.name}`.localeCompare(`${b.owner ?? ''}/${b.name}`))\n return synced\n}\n\nasync function autoPushSyncedSkills(appServer: AppServerLike): Promise<void> {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) return\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n throw new Error('Refusing to push to upstream skills repository')\n }\n const local = await collectLocalSyncedSkills(appServer)\n const installedMap = await scanInstalledSkillsFromDisk()\n await writeRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName, local)\n await syncInstalledSkillsFolderToRepo(state.githubToken, state.repoOwner, state.repoName, installedMap)\n}\n\nasync function ensureCodexAgentsSymlinkToSkillsAgents(): Promise<void> {\n const codexHomeDir = getCodexHomeDir()\n const skillsAgentsPath = join(codexHomeDir, 'skills', 'AGENTS.md')\n const codexAgentsPath = join(codexHomeDir, 'AGENTS.md')\n await mkdir(join(codexHomeDir, 'skills'), { recursive: true })\n let copiedFromCodex = false\n try {\n const codexAgentsStat = await lstat(codexAgentsPath)\n if (codexAgentsStat.isFile() || codexAgentsStat.isSymbolicLink()) {\n const content = await readFile(codexAgentsPath, 'utf8')\n await writeFile(skillsAgentsPath, content, 'utf8')\n copiedFromCodex = true\n } else {\n await rm(codexAgentsPath, { force: true, recursive: true })\n }\n } catch {}\n if (!copiedFromCodex) {\n try {\n const skillsAgentsStat = await stat(skillsAgentsPath)\n if (!skillsAgentsStat.isFile()) {\n await rm(skillsAgentsPath, { force: true, recursive: true })\n await writeFile(skillsAgentsPath, '', 'utf8')\n }\n } catch {\n await writeFile(skillsAgentsPath, '', 'utf8')\n }\n }\n const relativeTarget = join('skills', 'AGENTS.md')\n try {\n const current = await lstat(codexAgentsPath)\n if (current.isSymbolicLink()) {\n const existingTarget = await readlink(codexAgentsPath)\n if (existingTarget === relativeTarget) return\n }\n await rm(codexAgentsPath, { force: true, recursive: true })\n } catch {}\n await symlink(relativeTarget, codexAgentsPath)\n}\n\nexport async function initializeSkillsSyncOnStartup(appServer: AppServerLike): Promise<void> {\n if (startupSkillsSyncInitialized) return\n startupSkillsSyncInitialized = true\n startupSyncStatus.inProgress = true\n startupSyncStatus.lastRunAtIso = new Date().toISOString()\n startupSyncStatus.lastError = ''\n startupSyncStatus.branch = PRIVATE_SYNC_BRANCH\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken) {\n await ensureCodexAgentsSymlinkToSkillsAgents()\n if (!isAndroidLikeRuntime()) {\n startupSyncStatus.mode = 'idle'\n startupSyncStatus.lastAction = 'skip-upstream-non-android'\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n return\n }\n startupSyncStatus.mode = 'unauthenticated-bootstrap'\n startupSyncStatus.branch = getPreferredPublicUpstreamBranch()\n startupSyncStatus.lastAction = 'pull-upstream'\n await bootstrapSkillsFromUpstreamIntoLocal()\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n startupSyncStatus.lastAction = 'pull-upstream-complete'\n return\n }\n startupSyncStatus.mode = 'authenticated-fork-sync'\n startupSyncStatus.branch = PRIVATE_SYNC_BRANCH\n startupSyncStatus.lastAction = 'ensure-private-fork'\n const username = state.githubUsername || await resolveGithubUsername(state.githubToken)\n const repoName = DEFAULT_SKILLS_SYNC_REPO_NAME\n await ensurePrivateForkFromUpstream(state.githubToken, username, repoName)\n await writeSkillsSyncState({ ...state, githubUsername: username, repoOwner: username, repoName })\n startupSyncStatus.lastAction = 'pull-private-fork'\n await pullInstalledSkillsFolderFromRepo(state.githubToken, username, repoName)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n startupSyncStatus.lastAction = 'push-private-fork'\n await autoPushSyncedSkills(appServer)\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n startupSyncStatus.lastAction = 'startup-sync-complete'\n } catch (error) {\n startupSyncStatus.lastError = getErrorMessage(error, 'startup-sync-failed')\n startupSyncStatus.lastAction = 'startup-sync-failed'\n } finally {\n startupSyncStatus.inProgress = false\n }\n}\n\nasync function finalizeGithubLoginAndSync(token: string, username: string, appServer: AppServerLike): Promise<void> {\n const repoName = DEFAULT_SKILLS_SYNC_REPO_NAME\n await ensurePrivateForkFromUpstream(token, username, repoName)\n const current = await readSkillsSyncState()\n await writeSkillsSyncState({ ...current, githubToken: token, githubUsername: username, repoOwner: username, repoName })\n await pullInstalledSkillsFolderFromRepo(token, username, repoName)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n await autoPushSyncedSkills(appServer)\n}\n\nasync function searchSkillsHub(\n allEntries: SkillsTreeEntry[],\n query: string,\n limit: number,\n sort: string,\n installedMap: Map<string, InstalledSkillInfo>,\n): Promise<SkillHubEntry[]> {\n const q = query.toLowerCase().trim()\n const filtered = q\n ? allEntries.filter((s) => {\n if (s.name.toLowerCase().includes(q) || s.owner.toLowerCase().includes(q)) return true\n const cached = metaCache.get(`${s.owner}/${s.name}`)\n return Boolean(cached?.displayName?.toLowerCase().includes(q))\n })\n : allEntries\n const page = filtered.slice(0, Math.min(limit * 2, 200))\n await fetchMetaBatch(page)\n let results = page.map(buildHubEntry)\n if (sort === 'date') {\n results.sort((a, b) => b.publishedAt - a.publishedAt)\n } else if (q) {\n results.sort((a, b) => {\n const aExact = a.name.toLowerCase() === q ? 1 : 0\n const bExact = b.name.toLowerCase() === q ? 1 : 0\n if (aExact !== bExact) return bExact - aExact\n return b.publishedAt - a.publishedAt\n })\n }\n return results.slice(0, limit).map((s) => {\n const local = installedMap.get(s.name)\n return local ? { ...s, installed: true, path: local.path, enabled: local.enabled } : s\n })\n}\n\nexport async function handleSkillsRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n context: SkillRouteContext,\n): Promise<boolean> {\n const { appServer, readJsonBody } = context\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub') {\n try {\n const q = url.searchParams.get('q') || ''\n const limit = Math.min(Math.max(parseInt(url.searchParams.get('limit') || '50', 10) || 50, 1), 200)\n const sort = url.searchParams.get('sort') || 'date'\n const allEntries = await fetchSkillsTree()\n\n const installedMap = await scanInstalledSkillsFromDisk()\n try {\n const result = (await appServer.rpc('skills/list', {})) as { data?: Array<{ skills?: Array<{ name?: string; path?: string; enabled?: boolean }> }> }\n for (const entry of result.data ?? []) {\n for (const skill of entry.skills ?? []) {\n if (skill.name) {\n installedMap.set(skill.name, { name: skill.name, path: skill.path ?? '', enabled: skill.enabled !== false })\n }\n }\n }\n } catch {}\n\n const installedHubEntries = allEntries.filter((e) => installedMap.has(e.name))\n await fetchMetaBatch(installedHubEntries)\n\n const installed: SkillHubEntry[] = []\n for (const [, info] of installedMap) {\n const hubEntry = allEntries.find((e) => e.name === info.name)\n const base = hubEntry ? buildHubEntry(hubEntry) : {\n name: info.name, owner: 'local', description: '', displayName: '', publishedAt: 0, avatarUrl: '', url: '', installed: false,\n }\n installed.push({ ...base, installed: true, path: info.path, enabled: info.enabled })\n }\n\n const results = await searchSkillsHub(allEntries, q, limit, sort, installedMap)\n setJson(res, 200, { data: results, installed, total: allEntries.length })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch skills hub') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-sync/status') {\n const state = await readSkillsSyncState()\n setJson(res, 200, {\n data: {\n loggedIn: Boolean(state.githubToken),\n githubUsername: state.githubUsername ?? '',\n repoOwner: state.repoOwner ?? '',\n repoName: state.repoName ?? '',\n configured: Boolean(state.githubToken && state.repoOwner && state.repoName),\n startup: {\n inProgress: startupSyncStatus.inProgress,\n mode: startupSyncStatus.mode,\n branch: startupSyncStatus.branch,\n lastAction: startupSyncStatus.lastAction,\n lastRunAtIso: startupSyncStatus.lastRunAtIso,\n lastSuccessAtIso: startupSyncStatus.lastSuccessAtIso,\n lastError: startupSyncStatus.lastError,\n },\n },\n })\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/start-login') {\n try {\n const started = await startGithubDeviceLogin()\n setJson(res, 200, { data: started })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to start GitHub login') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/token-login') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const token = typeof payload?.token === 'string' ? payload.token.trim() : ''\n if (!token) {\n setJson(res, 400, { error: 'Missing GitHub token' })\n return true\n }\n const username = await resolveGithubUsername(token)\n await finalizeGithubLoginAndSync(token, username, appServer)\n setJson(res, 200, { ok: true, data: { githubUsername: username } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to login with GitHub token') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/logout') {\n try {\n const state = await readSkillsSyncState()\n await writeSkillsSyncState({\n ...state,\n githubToken: undefined,\n githubUsername: undefined,\n repoOwner: undefined,\n repoName: undefined,\n })\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to logout GitHub') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/complete-login') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const deviceCode = typeof payload?.deviceCode === 'string' ? payload.deviceCode : ''\n if (!deviceCode) {\n setJson(res, 400, { error: 'Missing deviceCode' })\n return true\n }\n const result = await completeGithubDeviceLogin(deviceCode)\n if (!result.token) {\n setJson(res, 200, { ok: false, pending: result.error === 'authorization_pending', error: result.error || 'login_failed' })\n return true\n }\n const token = result.token\n const username = await resolveGithubUsername(token)\n await finalizeGithubLoginAndSync(token, username, appServer)\n setJson(res, 200, { ok: true, data: { githubUsername: username } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to complete GitHub login') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/push') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n setJson(res, 400, { error: 'Skills sync is not configured yet' })\n return true\n }\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n setJson(res, 400, { error: 'Refusing to push to upstream repository' })\n return true\n }\n const local = await collectLocalSyncedSkills(appServer)\n const installedMap = await scanInstalledSkillsFromDisk()\n await writeRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName, local)\n await syncInstalledSkillsFolderToRepo(state.githubToken, state.repoOwner, state.repoName, installedMap)\n setJson(res, 200, { ok: true, data: { synced: local.length } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to push synced skills') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/pull') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n await bootstrapSkillsFromUpstreamIntoLocal()\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: 0, source: 'upstream' } })\n return true\n }\n const remote = await readRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName)\n const tree = await fetchSkillsTree()\n const uniqueOwnerByName = new Map<string, string>()\n const ambiguousNames = new Set<string>()\n for (const entry of tree) {\n if (ambiguousNames.has(entry.name)) continue\n const existingOwner = uniqueOwnerByName.get(entry.name)\n if (!existingOwner) {\n uniqueOwnerByName.set(entry.name, entry.owner)\n continue\n }\n if (existingOwner !== entry.owner) {\n uniqueOwnerByName.delete(entry.name)\n ambiguousNames.add(entry.name)\n }\n }\n const localDir = await detectUserSkillsDir(appServer)\n await pullInstalledSkillsFolderFromRepo(state.githubToken, state.repoOwner, state.repoName)\n const installerScript = resolveSkillInstallerScriptPath(getCodexHomeDir())\n if (!installerScript) {\n throw new Error('Skill installer script not found')\n }\n const pythonCommand = resolvePythonCommand()\n if (!pythonCommand) {\n throw new Error('Python 3 is required to install skills')\n }\n const localSkills = await scanInstalledSkillsFromDisk()\n for (const skill of remote) {\n const owner = skill.owner || uniqueOwnerByName.get(skill.name) || ''\n if (!owner) continue\n if (!localSkills.has(skill.name)) {\n await runCommand(pythonCommand.command, [\n ...pythonCommand.args,\n installerScript,\n '--repo', `${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}`,\n '--path', `skills/${owner}/${skill.name}`,\n '--dest', localDir,\n '--method', 'git',\n ])\n }\n const skillPath = join(localDir, skill.name)\n await appServer.rpc('skills/config/write', { path: skillPath, enabled: skill.enabled })\n }\n const remoteNames = new Set(remote.map((row) => row.name))\n for (const [name, localInfo] of localSkills.entries()) {\n if (!remoteNames.has(name)) {\n await rm(localInfo.path.replace(/\\/SKILL\\.md$/, ''), { recursive: true, force: true })\n }\n }\n const nextOwners: Record<string, string> = {}\n for (const item of remote) {\n const owner = item.owner || uniqueOwnerByName.get(item.name) || ''\n if (owner) nextOwners[item.name] = owner\n }\n await writeSkillsSyncState({ ...state, installedOwners: nextOwners })\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: remote.length } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to pull synced skills') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub/readme') {\n try {\n const owner = url.searchParams.get('owner') || ''\n const name = url.searchParams.get('name') || ''\n const installed = url.searchParams.get('installed') === 'true'\n const skillPath = url.searchParams.get('path') || ''\n if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return true\n }\n if (installed) {\n const installedMap = await scanInstalledSkillsFromDisk()\n const installedInfo = installedMap.get(name)\n const localSkillPath = installedInfo?.path\n || (skillPath ? (skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`) : '')\n if (localSkillPath) {\n const content = await readFile(localSkillPath, 'utf8')\n const description = extractSkillDescriptionFromMarkdown(content)\n setJson(res, 200, { content, description, source: 'local' })\n return true\n }\n }\n const rawUrl = `https://raw.githubusercontent.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/main/skills/${owner}/${name}/SKILL.md`\n const resp = await fetch(rawUrl)\n if (!resp.ok) throw new Error(`Failed to fetch SKILL.md: ${resp.status}`)\n const content = await resp.text()\n const description = extractSkillDescriptionFromMarkdown(content)\n setJson(res, 200, { content, description, source: 'remote' })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch SKILL.md') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-hub/install') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const owner = typeof payload?.owner === 'string' ? payload.owner : ''\n const name = typeof payload?.name === 'string' ? payload.name : ''\n if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return true\n }\n const installerScript = resolveSkillInstallerScriptPath(getCodexHomeDir())\n if (!installerScript) {\n throw new Error('Skill installer script not found')\n }\n const pythonCommand = resolvePythonCommand()\n if (!pythonCommand) {\n throw new Error('Python 3 is required to install skills')\n }\n const installDest = await withTimeout(\n detectUserSkillsDir(appServer),\n 10_000,\n 'detectUserSkillsDir',\n ).catch(() => getSkillsInstallDir())\n const skillDir = join(installDest, name)\n if (existsSync(skillDir)) {\n await rm(skillDir, { recursive: true, force: true })\n }\n await runCommand(pythonCommand.command, [\n ...pythonCommand.args,\n installerScript,\n '--repo', `${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}`,\n '--path', `skills/${owner}/${name}`,\n '--dest', installDest,\n '--method', 'git',\n ], { timeoutMs: 90_000 })\n try { await withTimeout(ensureInstalledSkillIsValid(appServer, skillDir), 10_000, 'ensureInstalledSkillIsValid') } catch {}\n const syncState = await readSkillsSyncState()\n const nextOwners = { ...(syncState.installedOwners ?? {}), [name]: owner }\n await writeSkillsSyncState({ ...syncState, installedOwners: nextOwners })\n autoPushSyncedSkills(appServer).catch(() => {})\n setJson(res, 200, { ok: true, path: skillDir })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to install skill') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-hub/uninstall') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const name = typeof payload?.name === 'string' ? payload.name : ''\n const path = typeof payload?.path === 'string' ? payload.path : ''\n const target = path || (name ? join(getSkillsInstallDir(), name) : '')\n if (!target) {\n setJson(res, 400, { error: 'Missing name or path' })\n return true\n }\n await rm(target, { recursive: true, force: true })\n if (name) {\n const syncState = await readSkillsSyncState()\n const nextOwners = { ...(syncState.installedOwners ?? {}) }\n delete nextOwners[name]\n await writeSkillsSyncState({ ...syncState, installedOwners: nextOwners })\n }\n autoPushSyncedSkills(appServer).catch(() => {})\n try { await withTimeout(appServer.rpc('skills/list', { forceReload: true }), 10_000, 'skills/list reload') } catch {}\n setJson(res, 200, { ok: true, deletedPath: target })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to uninstall skill') })\n }\n return true\n }\n\n return false\n}\n","import { basename } from 'node:path'\n\ntype TelegramUpdate = {\n update_id?: number\n message?: {\n message_id?: number\n text?: string\n chat?: {\n id?: number\n }\n }\n callback_query?: {\n id?: string\n data?: string\n message?: {\n chat?: {\n id?: number\n }\n }\n }\n}\n\ntype AppServerLike = {\n rpc: (method: string, params: unknown) => Promise<unknown>\n onNotification: (listener: (value: { method: string; params: unknown }) => void) => () => void\n}\n\nexport type TelegramBridgeStatus = {\n configured: boolean\n active: boolean\n mappedChats: number\n mappedThreads: number\n lastError: string\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n\n return fallback\n}\n\nexport class TelegramThreadBridge {\n private token: string\n private readonly appServer: AppServerLike\n private readonly defaultCwd: string\n private readonly threadIdByChatId = new Map<number, string>()\n private readonly chatIdsByThreadId = new Map<string, Set<number>>()\n private readonly lastForwardedTurnByThreadId = new Map<string, string>()\n private active = false\n private pollingTask: Promise<void> | null = null\n private nextUpdateOffset = 0\n private lastError = ''\n\n constructor(appServer: AppServerLike) {\n this.appServer = appServer\n this.token = process.env.TELEGRAM_BOT_TOKEN?.trim() ?? ''\n this.defaultCwd = process.env.TELEGRAM_DEFAULT_CWD?.trim() ?? process.cwd()\n }\n\n start(): void {\n if (!this.token || this.active) return\n this.active = true\n void this.notifyOnlineForKnownChats().catch(() => {})\n this.pollingTask = this.pollLoop()\n this.appServer.onNotification((notification) => {\n void this.handleNotification(notification).catch(() => {})\n })\n }\n\n stop(): void {\n this.active = false\n }\n\n private async pollLoop(): Promise<void> {\n while (this.active) {\n try {\n const updates = await this.getUpdates()\n this.lastError = ''\n for (const update of updates) {\n const updateId = typeof update.update_id === 'number' ? update.update_id : -1\n if (updateId >= 0) {\n this.nextUpdateOffset = Math.max(this.nextUpdateOffset, updateId + 1)\n }\n await this.handleIncomingUpdate(update)\n }\n } catch (error) {\n this.lastError = getErrorMessage(error, 'Telegram polling failed')\n await new Promise((resolve) => setTimeout(resolve, 1500))\n }\n }\n }\n\n private async getUpdates(): Promise<TelegramUpdate[]> {\n if (!this.token) {\n throw new Error('Telegram bot token is not configured')\n }\n const response = await fetch(this.apiUrl('getUpdates'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n timeout: 45,\n offset: this.nextUpdateOffset,\n allowed_updates: ['message', 'callback_query'],\n }),\n })\n const payload = asRecord(await response.json())\n const result = Array.isArray(payload?.result) ? payload.result : []\n return result as TelegramUpdate[]\n }\n\n private apiUrl(method: string): string {\n return `https://api.telegram.org/bot${this.token}/${method}`\n }\n\n configureToken(token: string): void {\n const normalizedToken = token.trim()\n if (!normalizedToken) {\n throw new Error('Telegram bot token is required')\n }\n this.token = normalizedToken\n }\n\n getStatus(): TelegramBridgeStatus {\n return {\n configured: this.token.length > 0,\n active: this.active,\n mappedChats: this.threadIdByChatId.size,\n mappedThreads: this.chatIdsByThreadId.size,\n lastError: this.lastError,\n }\n }\n\n connectThread(threadId: string, chatId: number, token?: string): void {\n const normalizedThreadId = threadId.trim()\n if (!normalizedThreadId) {\n throw new Error('threadId is required')\n }\n if (!Number.isFinite(chatId)) {\n throw new Error('chatId must be a number')\n }\n if (typeof token === 'string' && token.trim().length > 0) {\n this.configureToken(token)\n }\n if (!this.token) {\n throw new Error('Telegram bot token is not configured')\n }\n this.bindChatToThread(chatId, normalizedThreadId)\n this.start()\n void this.sendOnlineMessage(chatId).catch(() => {})\n }\n\n private async sendTelegramMessage(\n chatId: number,\n text: string,\n options: { replyMarkup?: unknown } = {},\n ): Promise<void> {\n const message = text.trim()\n if (!message) return\n const payload: Record<string, unknown> = { chat_id: chatId, text: message }\n if (options.replyMarkup) {\n payload.reply_markup = options.replyMarkup\n }\n await fetch(this.apiUrl('sendMessage'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n }\n\n private async sendOnlineMessage(chatId: number): Promise<void> {\n await this.sendTelegramMessage(chatId, 'Codex thread bridge went online.')\n }\n\n private async notifyOnlineForKnownChats(): Promise<void> {\n const knownChatIds = Array.from(this.threadIdByChatId.keys())\n for (const chatId of knownChatIds) {\n await this.sendOnlineMessage(chatId)\n }\n }\n\n private async handleIncomingUpdate(update: TelegramUpdate): Promise<void> {\n if (update.callback_query) {\n await this.handleCallbackQuery(update.callback_query)\n return\n }\n\n const message = update.message\n const chatId = message?.chat?.id\n const text = message?.text?.trim()\n if (typeof chatId !== 'number' || !text) return\n\n if (text === '/start') {\n await this.sendThreadPicker(chatId)\n return\n }\n\n if (text === '/newthread') {\n const threadId = await this.createThreadForChat(chatId)\n await this.sendTelegramMessage(chatId, `Mapped to new thread: ${threadId}`)\n return\n }\n\n const threadCommand = text.match(/^\\/thread\\s+(\\S+)$/)\n if (threadCommand) {\n const threadId = threadCommand[1]\n this.bindChatToThread(chatId, threadId)\n await this.sendTelegramMessage(chatId, `Mapped to thread: ${threadId}`)\n return\n }\n\n const threadId = await this.ensureThreadForChat(chatId)\n try {\n await this.appServer.rpc('turn/start', {\n threadId,\n input: [{ type: 'text', text }],\n })\n } catch (error) {\n const message = getErrorMessage(error, 'Failed to forward message to thread')\n await this.sendTelegramMessage(chatId, `Forward failed: ${message}`)\n }\n }\n\n private async handleCallbackQuery(callbackQuery: NonNullable<TelegramUpdate['callback_query']>): Promise<void> {\n const callbackId = typeof callbackQuery.id === 'string' ? callbackQuery.id : ''\n const data = typeof callbackQuery.data === 'string' ? callbackQuery.data : ''\n const chatId = callbackQuery.message?.chat?.id\n if (!callbackId) return\n\n if (!data.startsWith('thread:') || typeof chatId !== 'number') {\n await this.answerCallbackQuery(callbackId, 'Invalid selection')\n return\n }\n\n const threadId = data.slice('thread:'.length).trim()\n if (!threadId) {\n await this.answerCallbackQuery(callbackId, 'Invalid thread id')\n return\n }\n\n this.bindChatToThread(chatId, threadId)\n await this.answerCallbackQuery(callbackId, 'Thread connected')\n await this.sendTelegramMessage(chatId, `Connected to thread: ${threadId}`)\n const history = await this.readThreadHistorySummary(threadId)\n if (history) {\n await this.sendTelegramMessage(chatId, history)\n }\n }\n\n private async answerCallbackQuery(callbackQueryId: string, text: string): Promise<void> {\n await fetch(this.apiUrl('answerCallbackQuery'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n callback_query_id: callbackQueryId,\n text,\n }),\n })\n }\n\n private async sendThreadPicker(chatId: number): Promise<void> {\n const threads = await this.listRecentThreads()\n if (threads.length === 0) {\n await this.sendTelegramMessage(chatId, 'No threads found. Send /newthread to create one.')\n return\n }\n\n const inlineKeyboard = threads.map((thread) => [\n {\n text: thread.title,\n callback_data: `thread:${thread.id}`,\n },\n ])\n\n await this.sendTelegramMessage(chatId, 'Select a thread to connect:', {\n replyMarkup: { inline_keyboard: inlineKeyboard },\n })\n }\n\n private async listRecentThreads(): Promise<Array<{ id: string; title: string }>> {\n const payload = asRecord(await this.appServer.rpc('thread/list', {\n archived: false,\n limit: 20,\n sortKey: 'updated_at',\n }))\n const rows = Array.isArray(payload?.data) ? payload.data : []\n const threads: Array<{ id: string; title: string }> = []\n for (const row of rows) {\n const record = asRecord(row)\n const id = typeof record?.id === 'string' ? record.id.trim() : ''\n if (!id) continue\n const name = typeof record?.name === 'string' ? record.name.trim() : ''\n const preview = typeof record?.preview === 'string' ? record.preview.trim() : ''\n const cwd = typeof record?.cwd === 'string' ? record.cwd.trim() : ''\n const projectName = cwd ? basename(cwd) : 'project'\n const threadTitle = (name || preview || id).replace(/\\s+/g, ' ').trim()\n const title = `${projectName}/${threadTitle}`.slice(0, 64)\n threads.push({ id, title })\n }\n return threads\n }\n\n private async createThreadForChat(chatId: number): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/start', { cwd: this.defaultCwd }))\n const thread = asRecord(response?.thread)\n const threadId = typeof thread?.id === 'string' ? thread.id : ''\n if (!threadId) {\n throw new Error('thread/start did not return thread id')\n }\n this.bindChatToThread(chatId, threadId)\n return threadId\n }\n\n private async ensureThreadForChat(chatId: number): Promise<string> {\n const existing = this.threadIdByChatId.get(chatId)\n if (existing) return existing\n return this.createThreadForChat(chatId)\n }\n\n private bindChatToThread(chatId: number, threadId: string): void {\n const previousThreadId = this.threadIdByChatId.get(chatId)\n if (previousThreadId && previousThreadId !== threadId) {\n const previousSet = this.chatIdsByThreadId.get(previousThreadId)\n previousSet?.delete(chatId)\n if (previousSet && previousSet.size === 0) {\n this.chatIdsByThreadId.delete(previousThreadId)\n }\n }\n this.threadIdByChatId.set(chatId, threadId)\n const chatIds = this.chatIdsByThreadId.get(threadId) ?? new Set<number>()\n chatIds.add(chatId)\n this.chatIdsByThreadId.set(threadId, chatIds)\n }\n\n private extractThreadId(notification: { method: string; params: unknown }): string {\n const params = asRecord(notification.params)\n if (!params) return ''\n const directThreadId = typeof params.threadId === 'string' ? params.threadId : ''\n if (directThreadId) return directThreadId\n const turn = asRecord(params.turn)\n const turnThreadId = typeof turn?.threadId === 'string' ? turn.threadId : ''\n return turnThreadId\n }\n\n private extractTurnId(notification: { method: string; params: unknown }): string {\n const params = asRecord(notification.params)\n if (!params) return ''\n const directTurnId = typeof params.turnId === 'string' ? params.turnId : ''\n if (directTurnId) return directTurnId\n const turn = asRecord(params.turn)\n const turnId = typeof turn?.id === 'string' ? turn.id : ''\n return turnId\n }\n\n private async handleNotification(notification: { method: string; params: unknown }): Promise<void> {\n if (notification.method !== 'turn/completed') return\n const threadId = this.extractThreadId(notification)\n if (!threadId) return\n const chatIds = this.chatIdsByThreadId.get(threadId)\n if (!chatIds || chatIds.size === 0) return\n\n const turnId = this.extractTurnId(notification)\n const lastForwardedTurnId = this.lastForwardedTurnByThreadId.get(threadId)\n if (turnId && lastForwardedTurnId === turnId) return\n\n const assistantReply = await this.readLatestAssistantMessage(threadId)\n if (!assistantReply) return\n for (const chatId of chatIds) {\n await this.sendTelegramMessage(chatId, assistantReply)\n }\n if (turnId) {\n this.lastForwardedTurnByThreadId.set(threadId, turnId)\n }\n }\n\n private async readLatestAssistantMessage(threadId: string): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/read', { threadId, includeTurns: true }))\n const thread = asRecord(response?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n\n for (let turnIndex = turns.length - 1; turnIndex >= 0; turnIndex -= 1) {\n const turn = asRecord(turns[turnIndex])\n const items = Array.isArray(turn?.items) ? turn.items : []\n for (let itemIndex = items.length - 1; itemIndex >= 0; itemIndex -= 1) {\n const item = asRecord(items[itemIndex])\n if (item?.type === 'agentMessage') {\n const text = typeof item.text === 'string' ? item.text.trim() : ''\n if (text) return text\n }\n }\n }\n return ''\n }\n\n private async readThreadHistorySummary(threadId: string): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/read', { threadId, includeTurns: true }))\n const thread = asRecord(response?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const historyRows: string[] = []\n\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : []\n for (const item of items) {\n const itemRecord = asRecord(item)\n const type = typeof itemRecord?.type === 'string' ? itemRecord.type : ''\n if (type === 'userMessage') {\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : []\n for (const block of content) {\n const blockRecord = asRecord(block)\n if (blockRecord?.type === 'text' && typeof blockRecord.text === 'string' && blockRecord.text.trim()) {\n historyRows.push(`User: ${blockRecord.text.trim()}`)\n }\n }\n }\n if (type === 'agentMessage' && typeof itemRecord?.text === 'string' && itemRecord.text.trim()) {\n historyRows.push(`Assistant: ${itemRecord.text.trim()}`)\n }\n }\n }\n\n if (historyRows.length === 0) {\n return 'Thread has no message history yet.'\n }\n\n const tail = historyRows.slice(-12).join('\\n\\n')\n const maxLen = 3800\n const summary = tail.length > maxLen ? tail.slice(tail.length - maxLen) : tail\n return `Recent history:\\n\\n${summary}`\n }\n}\n","import { spawnSync } from 'node:child_process'\nimport { basename, extname } from 'node:path'\n\nconst WINDOWS_CMD_NAMES = new Set(['codex', 'npm', 'npx'])\n\nfunction quoteCmdExeArg(value: string): string {\n const normalized = value.replace(/\"/g, '\"\"')\n if (!/[\\s\"]/u.test(normalized)) {\n return normalized\n }\n return `\"${normalized}\"`\n}\n\nfunction needsCmdExeWrapper(command: string): boolean {\n if (process.platform !== 'win32') {\n return false\n }\n\n const lowerCommand = command.toLowerCase()\n const baseName = basename(lowerCommand)\n if (/\\.(cmd|bat)$/i.test(baseName)) {\n return true\n }\n\n if (extname(baseName)) {\n return false\n }\n\n return WINDOWS_CMD_NAMES.has(baseName)\n}\n\nexport function getSpawnInvocation(command: string, args: string[] = []): { command: string; args: string[] } {\n if (needsCmdExeWrapper(command)) {\n return {\n command: 'cmd.exe',\n args: ['/d', '/s', '/c', [quoteCmdExeArg(command), ...args.map((arg) => quoteCmdExeArg(arg))].join(' ')],\n }\n }\n\n return { command, args }\n}\n\nexport function spawnSyncCommand(\n command: string,\n args: string[] = [],\n options: Parameters<typeof spawnSync>[2] = {},\n) {\n const invocation = getSpawnInvocation(command, args)\n return spawnSync(invocation.command, invocation.args, options)\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto'\nimport type { IncomingMessage } from 'node:http'\nimport type { RequestHandler, Request, Response, NextFunction } from 'express'\n\nconst TOKEN_COOKIE = 'codex_web_local_token'\n\nfunction isLocalhostRequest(req: Request): boolean {\n const remote = req.socket.remoteAddress ?? ''\n if (remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1') {\n return true\n }\n\n const host = (req.headers.host ?? '').toLowerCase()\n return host.startsWith('localhost:') || host === 'localhost' || host.startsWith('127.0.0.1:')\n}\n\nfunction constantTimeCompare(a: string, b: string): boolean {\n const bufA = Buffer.from(a)\n const bufB = Buffer.from(b)\n if (bufA.length !== bufB.length) return false\n return timingSafeEqual(bufA, bufB)\n}\n\nfunction parseCookies(header: string | undefined): Record<string, string> {\n const cookies: Record<string, string> = {}\n if (!header) return cookies\n for (const pair of header.split(';')) {\n const idx = pair.indexOf('=')\n if (idx === -1) continue\n const key = pair.slice(0, idx).trim()\n const value = pair.slice(idx + 1).trim()\n cookies[key] = value\n }\n return cookies\n}\n\nfunction isLocalhostRemote(remote: string): boolean {\n return remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1'\n}\n\nfunction isLocalhostHost(host: string): boolean {\n const normalized = host.toLowerCase()\n return normalized.startsWith('localhost:') || normalized === 'localhost' || normalized.startsWith('127.0.0.1:')\n}\n\nfunction isAuthorizedByRequestLike(\n remoteAddress: string | undefined,\n hostHeader: string | undefined,\n cookieHeader: string | undefined,\n validTokens: Set<string>,\n): boolean {\n const remote = remoteAddress ?? ''\n if (isLocalhostRemote(remote) || isLocalhostHost(hostHeader ?? '')) {\n return true\n }\n\n const cookies = parseCookies(cookieHeader)\n const token = cookies[TOKEN_COOKIE]\n return Boolean(token && validTokens.has(token))\n}\n\nconst LOGIN_PAGE_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Codex Web Local — Login</title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif;background:#0a0a0a;color:#e5e5e5;display:flex;align-items:center;justify-content:center;min-height:100vh;padding:1rem}\n.card{background:#171717;border:1px solid #262626;border-radius:12px;padding:2rem;width:100%;max-width:380px}\nh1{font-size:1.25rem;font-weight:600;margin-bottom:1.5rem;text-align:center;color:#fafafa}\nlabel{display:block;font-size:.875rem;color:#a3a3a3;margin-bottom:.5rem}\ninput{width:100%;padding:.625rem .75rem;background:#0a0a0a;border:1px solid #404040;border-radius:8px;color:#fafafa;font-size:1rem;outline:none;transition:border-color .15s}\ninput:focus{border-color:#3b82f6}\nbutton{width:100%;padding:.625rem;margin-top:1rem;background:#3b82f6;color:#fff;border:none;border-radius:8px;font-size:.9375rem;font-weight:500;cursor:pointer;transition:background .15s}\nbutton:hover{background:#2563eb}\n.error{color:#ef4444;font-size:.8125rem;margin-top:.75rem;text-align:center;display:none}\n</style>\n</head>\n<body>\n<div class=\"card\">\n<h1>Codex Web Local</h1>\n<form id=\"f\">\n<label for=\"pw\">Password</label>\n<input id=\"pw\" name=\"password\" type=\"password\" autocomplete=\"current-password\" autofocus required>\n<button type=\"submit\">Sign in</button>\n<p class=\"error\" id=\"err\">Incorrect password</p>\n</form>\n</div>\n<script>\nconst form=document.getElementById('f');\nconst errEl=document.getElementById('err');\nform.addEventListener('submit',async e=>{\n e.preventDefault();\n errEl.style.display='none';\n const res=await fetch('/auth/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({password:document.getElementById('pw').value})});\n if(res.ok){window.location.reload()}else{errEl.style.display='block';document.getElementById('pw').value='';document.getElementById('pw').focus()}\n});\n</script>\n</body>\n</html>`\n\nexport function createAuthMiddleware(password: string): RequestHandler {\n return createAuthSession(password).middleware\n}\n\nexport type AuthSession = {\n middleware: RequestHandler\n isRequestAuthorized: (req: IncomingMessage) => boolean\n}\n\nexport function createAuthSession(password: string): AuthSession {\n const validTokens = new Set<string>()\n\n const middleware: RequestHandler = (req: Request, res: Response, next: NextFunction): void => {\n if (isAuthorizedByRequestLike(req.socket.remoteAddress, req.headers.host, req.headers.cookie, validTokens)) {\n next()\n return\n }\n\n // Handle login POST\n if (req.method === 'POST' && req.path === '/auth/login') {\n let body = ''\n req.setEncoding('utf8')\n req.on('data', (chunk: string) => { body += chunk })\n req.on('end', () => {\n try {\n const parsed = JSON.parse(body) as { password?: string }\n const provided = typeof parsed.password === 'string' ? parsed.password : ''\n\n if (!constantTimeCompare(provided, password)) {\n res.status(401).json({ error: 'Invalid password' })\n return\n }\n\n const token = randomBytes(32).toString('hex')\n validTokens.add(token)\n\n res.setHeader('Set-Cookie', `${TOKEN_COOKIE}=${token}; Path=/; HttpOnly; SameSite=Strict`)\n res.json({ ok: true })\n } catch {\n res.status(400).json({ error: 'Invalid request body' })\n }\n })\n return\n }\n\n // No valid session — serve login page\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.status(200).send(LOGIN_PAGE_HTML)\n }\n\n return {\n middleware,\n isRequestAuthorized: (req: IncomingMessage) => (\n isAuthorizedByRequestLike(req.socket.remoteAddress, req.headers.host, req.headers.cookie, validTokens)\n ),\n }\n}\n","import { dirname, extname, join } from 'node:path'\nimport { open, readFile, readdir, stat } from 'node:fs/promises'\n\ntype DirectoryItem = {\n name: string\n path: string\n isDirectory: boolean\n editable: boolean\n mtimeMs: number\n}\n\nconst TEXT_EDITABLE_EXTENSIONS = new Set([\n '.txt', '.md', '.json', '.js', '.ts', '.tsx', '.jsx', '.css', '.scss',\n '.html', '.htm', '.xml', '.yml', '.yaml', '.log', '.csv', '.env', '.py',\n '.sh', '.toml', '.ini', '.conf', '.sql', '.bat', '.cmd', '.ps1',\n])\n\nfunction languageForPath(pathValue: string): string {\n const extension = extname(pathValue).toLowerCase()\n switch (extension) {\n case '.js': return 'javascript'\n case '.ts': return 'typescript'\n case '.jsx': return 'javascript'\n case '.tsx': return 'typescript'\n case '.py': return 'python'\n case '.sh': return 'sh'\n case '.css':\n case '.scss': return 'css'\n case '.html':\n case '.htm': return 'html'\n case '.json': return 'json'\n case '.md': return 'markdown'\n case '.yaml':\n case '.yml': return 'yaml'\n case '.xml': return 'xml'\n case '.sql': return 'sql'\n case '.toml': return 'ini'\n case '.ini':\n case '.conf': return 'ini'\n default: return 'plaintext'\n }\n}\n\nexport function normalizeLocalPath(rawPath: string): string {\n const trimmed = rawPath.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('file://')) {\n try {\n return decodeURIComponent(trimmed.replace(/^file:\\/\\//u, ''))\n } catch {\n return trimmed.replace(/^file:\\/\\//u, '')\n }\n }\n return trimmed\n}\n\nexport function decodeBrowsePath(rawPath: string): string {\n if (!rawPath) return ''\n try {\n return decodeURIComponent(rawPath)\n } catch {\n return rawPath\n }\n}\n\nexport function isTextEditablePath(pathValue: string): boolean {\n return TEXT_EDITABLE_EXTENSIONS.has(extname(pathValue).toLowerCase())\n}\n\nfunction looksLikeTextBuffer(buffer: Buffer): boolean {\n if (buffer.length === 0) return true\n for (const byte of buffer) {\n if (byte === 0) return false\n }\n const decoded = buffer.toString('utf8')\n const replacementCount = (decoded.match(/\\uFFFD/gu) ?? []).length\n return replacementCount / decoded.length < 0.05\n}\n\nasync function probeFileIsText(localPath: string): Promise<boolean> {\n const handle = await open(localPath, 'r')\n try {\n const sample = Buffer.allocUnsafe(4096)\n const { bytesRead } = await handle.read(sample, 0, sample.length, 0)\n return looksLikeTextBuffer(sample.subarray(0, bytesRead))\n } finally {\n await handle.close()\n }\n}\n\nexport async function isTextEditableFile(localPath: string): Promise<boolean> {\n if (isTextEditablePath(localPath)) return true\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isFile()) return false\n return await probeFileIsText(localPath)\n } catch {\n return false\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/gu, '&')\n .replace(/</gu, '<')\n .replace(/>/gu, '>')\n .replace(/\"/gu, '"')\n .replace(/'/gu, ''')\n}\n\nfunction toBrowseHref(pathValue: string): string {\n return `/codex-local-browse${encodeURI(pathValue)}`\n}\n\nfunction toEditHref(pathValue: string): string {\n return `/codex-local-edit${encodeURI(pathValue)}`\n}\n\nfunction escapeForInlineScriptString(value: string): string {\n // Prevent breaking out of inline <script> blocks when file content contains HTML/script tokens.\n return JSON.stringify(value)\n .replace(/<\\//gu, '<\\\\/')\n .replace(/<!--/gu, '<\\\\!--')\n .replace(/\\u2028/gu, '\\\\u2028')\n .replace(/\\u2029/gu, '\\\\u2029')\n}\n\nasync function getDirectoryItems(localPath: string): Promise<DirectoryItem[]> {\n const entries = await readdir(localPath, { withFileTypes: true })\n const withMeta = await Promise.all(entries.map(async (entry) => {\n const entryPath = join(localPath, entry.name)\n const entryStat = await stat(entryPath)\n const editable = !entry.isDirectory() && await isTextEditableFile(entryPath)\n return {\n name: entry.name,\n path: entryPath,\n isDirectory: entry.isDirectory(),\n editable,\n mtimeMs: entryStat.mtimeMs,\n }\n }))\n return withMeta.sort((a, b) => {\n if (b.mtimeMs !== a.mtimeMs) return b.mtimeMs - a.mtimeMs\n if (a.isDirectory && !b.isDirectory) return -1\n if (!a.isDirectory && b.isDirectory) return 1\n return a.name.localeCompare(b.name)\n })\n}\n\nexport async function createDirectoryListingHtml(localPath: string): Promise<string> {\n const items = await getDirectoryItems(localPath)\n const parentPath = dirname(localPath)\n const rows = items\n .map((item) => {\n const suffix = item.isDirectory ? '/' : ''\n const editAction = item.editable\n ? ` <a class=\"icon-btn\" aria-label=\"Edit ${escapeHtml(item.name)}\" href=\"${escapeHtml(toEditHref(item.path))}\" title=\"Edit\">✏️</a>`\n : ''\n return `<li class=\"file-row\"><a class=\"file-link\" href=\"${escapeHtml(toBrowseHref(item.path))}\">${escapeHtml(item.name)}${suffix}</a><span class=\"row-actions\">${editAction}</span></li>`\n })\n .join('\\n')\n\n const parentLink = localPath !== parentPath\n ? `<a href=\"${escapeHtml(toBrowseHref(parentPath))}\">..</a>`\n : ''\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Index of ${escapeHtml(localPath)}</title>\n <style>\n body { font-family: ui-monospace, Menlo, Monaco, monospace; margin: 16px; background: #0b1020; color: #dbe6ff; }\n a { color: #8cc2ff; text-decoration: none; }\n a:hover { text-decoration: underline; }\n ul { list-style: none; padding: 0; margin: 12px 0 0; display: flex; flex-direction: column; gap: 8px; }\n .file-row { display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: center; gap: 10px; }\n .file-link { display: block; padding: 10px 12px; border: 1px solid #28405f; border-radius: 10px; background: #0f1b33; overflow-wrap: anywhere; }\n .header-actions { display: flex; align-items: center; gap: 10px; margin-top: 10px; flex-wrap: wrap; }\n .header-parent-link { color: #9ec8ff; font-size: 14px; padding: 8px 10px; border: 1px solid #2a4569; border-radius: 10px; background: #101f3a; }\n .header-parent-link:hover { text-decoration: none; filter: brightness(1.08); }\n .header-open-btn {\n height: 42px;\n padding: 0 14px;\n border: 1px solid #4f8de0;\n border-radius: 10px;\n background: linear-gradient(135deg, #2e6ee6 0%, #3d8cff 100%);\n color: #eef6ff;\n font-weight: 700;\n letter-spacing: 0.01em;\n cursor: pointer;\n box-shadow: 0 6px 18px rgba(33, 90, 199, 0.35);\n }\n .header-open-btn:hover { filter: brightness(1.08); }\n .header-open-btn:disabled { opacity: 0.6; cursor: default; }\n .row-actions { display: inline-flex; align-items: center; gap: 8px; min-width: 42px; justify-content: flex-end; }\n .icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border: 1px solid #36557a; border-radius: 10px; background: #162643; color: #dbe6ff; text-decoration: none; cursor: pointer; }\n .icon-btn:hover { filter: brightness(1.08); text-decoration: none; }\n .status { margin: 10px 0 0; color: #8cc2ff; min-height: 1.25em; }\n h1 { font-size: 18px; margin: 0; word-break: break-all; }\n @media (max-width: 640px) {\n body { margin: 12px; }\n .file-row { gap: 8px; }\n .file-link { font-size: 15px; padding: 12px; }\n .icon-btn { width: 44px; height: 44px; }\n }\n </style>\n</head>\n<body>\n <h1>Index of ${escapeHtml(localPath)}</h1>\n <div class=\"header-actions\">\n ${parentLink ? `<a class=\"header-parent-link\" href=\"${escapeHtml(toBrowseHref(parentPath))}\">..</a>` : ''}\n <button class=\"header-open-btn open-folder-btn\" type=\"button\" aria-label=\"Open current folder in Codex\" title=\"Open folder in Codex\" data-path=\"${escapeHtml(localPath)}\">Open folder in Codex</button>\n </div>\n <p id=\"status\" class=\"status\"></p>\n <ul>${rows}</ul>\n <script>\n const status = document.getElementById('status');\n document.addEventListener('click', async (event) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const button = target.closest('.open-folder-btn');\n if (!(button instanceof HTMLButtonElement)) return;\n\n const path = button.getAttribute('data-path') || '';\n if (!path) return;\n button.disabled = true;\n status.textContent = 'Opening folder in Codex...';\n try {\n const response = await fetch('/codex-api/project-root', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n path,\n createIfMissing: false,\n label: '',\n }),\n });\n if (!response.ok) {\n status.textContent = 'Failed to open folder.';\n button.disabled = false;\n return;\n }\n window.location.assign('/#/');\n } catch {\n status.textContent = 'Failed to open folder.';\n button.disabled = false;\n }\n });\n </script>\n</body>\n</html>`\n}\n\nexport async function createTextEditorHtml(localPath: string): Promise<string> {\n const content = await readFile(localPath, 'utf8')\n const parentPath = dirname(localPath)\n const language = languageForPath(localPath)\n const safeContentLiteral = escapeForInlineScriptString(content)\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Edit ${escapeHtml(localPath)}</title>\n <style>\n html, body { width: 100%; height: 100%; margin: 0; }\n body { font-family: ui-monospace, Menlo, Monaco, monospace; background: #0b1020; color: #dbe6ff; display: flex; flex-direction: column; overflow: hidden; }\n .toolbar { position: sticky; top: 0; z-index: 10; display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; background: #0b1020; border-bottom: 1px solid #243a5a; }\n .row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }\n button, a { background: #1b2a4a; color: #dbe6ff; border: 1px solid #345; padding: 6px 10px; border-radius: 6px; text-decoration: none; cursor: pointer; }\n button:hover, a:hover { filter: brightness(1.08); }\n #editor { flex: 1 1 auto; min-height: 0; width: 100%; border: none; overflow: hidden; }\n #status { margin-left: 8px; color: #8cc2ff; }\n .ace_editor { background: #07101f !important; color: #dbe6ff !important; width: 100% !important; height: 100% !important; }\n .ace_gutter { background: #07101f !important; color: #6f8eb5 !important; }\n .ace_marker-layer .ace_active-line { background: #10213c !important; }\n .ace_marker-layer .ace_selection { background: rgba(140, 194, 255, 0.3) !important; }\n .meta { opacity: 0.9; font-size: 12px; overflow-wrap: anywhere; }\n </style>\n</head>\n<body>\n <div class=\"toolbar\">\n <div class=\"row\">\n <a href=\"${escapeHtml(toBrowseHref(parentPath))}\">Back</a>\n <button id=\"saveBtn\" type=\"button\">Save</button>\n <span id=\"status\"></span>\n </div>\n <div class=\"meta\">${escapeHtml(localPath)} · ${escapeHtml(language)}</div>\n </div>\n <div id=\"editor\"></div>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.2/ace.js\"></script>\n <script>\n const saveBtn = document.getElementById('saveBtn');\n const status = document.getElementById('status');\n const editor = ace.edit('editor');\n editor.setTheme('ace/theme/tomorrow_night');\n editor.session.setMode('ace/mode/${escapeHtml(language)}');\n editor.setValue(${safeContentLiteral}, -1);\n editor.setOptions({\n fontSize: '13px',\n wrap: true,\n showPrintMargin: false,\n useSoftTabs: true,\n tabSize: 2,\n behavioursEnabled: true,\n });\n editor.resize();\n\n saveBtn.addEventListener('click', async () => {\n status.textContent = 'Saving...';\n const response = await fetch(location.pathname, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n body: editor.getValue(),\n });\n status.textContent = response.ok ? 'Saved' : 'Save failed';\n });\n </script>\n</body>\n</html>`\n}\n","import { randomInt } from 'node:crypto'\n\nconst CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789'\n\nfunction randomGroup(length: number): string {\n let result = ''\n for (let i = 0; i < length; i++) {\n result += CHARS[randomInt(CHARS.length)]\n }\n return result\n}\n\nexport function generatePassword(): string {\n return `${randomGroup(3)}-${randomGroup(3)}-${randomGroup(3)}`\n}\n"],"mappings":"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","names":["createServer","existsSync","readFile","stat","writeFile","homedir","isAbsolute","join","resolve","spawn","createInterface","fileURLToPath","dirname","dirname","extname","isAbsolute","join","existsSync","writeFile","stat","spawn","mkdtemp","readFile","mkdir","stat","homedir","tmpdir","basename","join","writeFile","existsSync","homedir","join","join","homedir","resolve","existsSync","repoDir","branch","readJsonBody","content","description","asRecord","getErrorMessage","resolve","threadId","message","spawnSync","basename","asRecord","getErrorMessage","setJson","resolve","spawn","getCodexHomeDir","join","homedir","runCommand","resolve","spawn","getErrorMessage","join","stat","writeFile","runCommandWithOutput","mkdir","readFile","getCodexHomeDir","asRecord","setJson","tmpdir","mkdtemp","process","homedir","basename","next","randomBytes","randomBytes","dirname","extname","join","readFile","readdir","stat","dirname","join","isAbsolute","extname","stat","writeFile","existsSync","__dirname","dirname","fileURLToPath","join","homedir","existsSync","writeFile","readFile","resolve","createInterface","spawn","getCodexGlobalStatePath","isAbsolute","stat","createServer"]}
|