@hua-labs/tap 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/config/resolve.ts","../src/config/index.ts","../src/state.ts","../src/adapters/common.ts","../src/runtime/resolve-node.ts","../src/runtime/index.ts","../src/engine/bridge.ts","../src/engine/dashboard.ts","../src/adapters/claude.ts","../src/artifact-backups.ts","../src/toml.ts","../src/adapters/codex.ts","../src/adapters/gemini.ts","../src/adapters/index.ts","../src/commands/bridge.ts","../src/commands/up.ts","../src/commands/down.ts","../src/index.ts","../src/version.ts","../src/api/state.ts","../src/api/http.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n AdapterContext,\n CommandCode,\n InstanceId,\n Platform,\n RuntimeName,\n TapState,\n} from \"./types.js\";\nimport { resolveConfig } from \"./config/index.js\";\n\nconst VALID_RUNTIMES: RuntimeName[] = [\"claude\", \"codex\", \"gemini\"];\n\nexport function isValidRuntime(name: string): name is RuntimeName {\n return VALID_RUNTIMES.includes(name as RuntimeName);\n}\n\nexport function detectPlatform(): Platform {\n return process.platform as Platform;\n}\n\n/** Shared flag: suppress duplicate no-git warnings across modules. */\nexport let _noGitWarned = false;\n\nexport function _setNoGitWarned() {\n _noGitWarned = true;\n}\n\nexport function findRepoRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n while (true) {\n if (fs.existsSync(path.join(dir, \".git\"))) return dir;\n if (fs.existsSync(path.join(dir, \"package.json\"))) {\n if (!_noGitWarned) {\n _setNoGitWarned();\n logWarn(\n \"No .git directory found. Resolved repo root via package.json — \" +\n \"comms directory may be created in an unexpected location. \" +\n \"Use --comms-dir to specify explicitly.\",\n );\n }\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n if (!_noGitWarned) {\n _setNoGitWarned();\n logWarn(\n \"No git repository or package.json found. Using current directory as root. \" +\n \"Run 'git init' first, or use --comms-dir to specify the comms path.\",\n );\n }\n return process.cwd();\n}\n\nexport function resolveCommsDir(args: string[], repoRoot: string): string {\n // Check --comms-dir flag\n const idx = args.indexOf(\"--comms-dir\");\n if (idx !== -1 && args[idx + 1]) {\n return path.resolve(args[idx + 1]);\n }\n\n // Delegate to config resolution (env > local > shared > auto)\n const { config } = resolveConfig({}, repoRoot);\n return config.commsDir;\n}\n\nexport function createAdapterContext(\n commsDir: string,\n repoRoot: string,\n): AdapterContext {\n // Use config-resolved stateDir if available\n const { config } = resolveConfig({}, repoRoot);\n return {\n commsDir: path.resolve(commsDir),\n repoRoot: path.resolve(repoRoot),\n stateDir: config.stateDir,\n platform: detectPlatform(),\n };\n}\n\nexport function parseArgs(args: string[]): {\n positional: string[];\n flags: Record<string, string | boolean>;\n} {\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n const key = arg.slice(2);\n const next = args[i + 1];\n if (next && !next.startsWith(\"--\")) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n } else if (arg.startsWith(\"-\")) {\n flags[arg.slice(1)] = true;\n } else {\n positional.push(arg);\n }\n }\n\n return { positional, flags };\n}\n\n// ─── JSON mode suppression ──────────────────────────────────────\n\nlet _jsonMode = false;\n\nexport function setJsonMode(enabled: boolean): void {\n _jsonMode = enabled;\n}\n\nexport function log(message: string): void {\n if (!_jsonMode) console.log(` ${message}`);\n}\n\nexport function logSuccess(message: string): void {\n if (!_jsonMode) console.log(` + ${message}`);\n}\n\nexport function logWarn(message: string): void {\n if (!_jsonMode) console.log(` ! ${message}`);\n}\n\nexport function logError(message: string): void {\n if (!_jsonMode) console.error(` x ${message}`);\n}\n\nexport function logHeader(message: string): void {\n if (!_jsonMode) console.log(`\\n ${message}\\n`);\n}\n\n// ─── Instance ID utilities ─────────────────────────────────────\n\nexport type ResolveResult =\n | { ok: true; instanceId: InstanceId }\n | { ok: false; code: CommandCode; message: string };\n\n/**\n * Resolve a user-provided identifier to an instance ID.\n * Accepts either an exact instance ID or a runtime name (if unambiguous).\n */\nexport function resolveInstanceId(\n identifier: string,\n state: TapState,\n): ResolveResult {\n // Exact match\n if (state.instances[identifier]) {\n return { ok: true, instanceId: identifier };\n }\n\n // Runtime name → find matching instances\n if (isValidRuntime(identifier)) {\n const matches = Object.values(state.instances).filter(\n (inst) => inst.runtime === identifier,\n );\n\n if (matches.length === 1) {\n return { ok: true, instanceId: matches[0].instanceId };\n }\n\n if (matches.length > 1) {\n const ids = matches.map((m) => m.instanceId).join(\", \");\n return {\n ok: false,\n code: \"TAP_INSTANCE_AMBIGUOUS\",\n message: `Multiple ${identifier} instances found: ${ids}. Specify one explicitly.`,\n };\n }\n }\n\n return {\n ok: false,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `Instance not found: ${identifier}`,\n };\n}\n\n/** Build an instance ID from runtime + optional name. */\nexport function buildInstanceId(\n runtime: RuntimeName,\n name?: string,\n): InstanceId {\n return name ? `${runtime}-${name}` : runtime;\n}\n\n/** Extract the runtime name from an instance ID. */\nexport function extractRuntimeFromInstanceId(id: InstanceId): RuntimeName {\n for (const r of VALID_RUNTIMES) {\n if (id === r || id.startsWith(`${r}-`)) return r;\n }\n throw new Error(`Cannot extract runtime from instance ID: ${id}`);\n}\n\n/** Check if a port is already claimed by another instance. */\nexport function findPortConflict(\n state: TapState,\n port: number,\n excludeInstanceId?: InstanceId,\n): InstanceId | null {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (id !== excludeInstanceId && inst.port === port) return id;\n }\n return null;\n}\n\n/** Find the next available port starting from basePort (default 4501). */\nexport function findNextAvailablePort(\n state: TapState,\n basePort: number = 4501,\n excludeInstanceId?: InstanceId,\n): number {\n let port = basePort;\n while (findPortConflict(state, port, excludeInstanceId) !== null) {\n port++;\n }\n return port;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n TapSharedConfig,\n TapLocalConfig,\n TapResolvedConfig,\n ConfigSource,\n ConfigResolution,\n} from \"./types.js\";\n\n// ─── File names ────────────────────────────────────────────────\n\nexport const SHARED_CONFIG_FILE = \"tap-config.json\";\nexport const LOCAL_CONFIG_FILE = \"tap-config.local.json\";\nexport const LEGACY_CONFIG_FILE = \".tap-config\";\n\n// ─── Defaults ──────────────────────────────────────────────────\n\nconst DEFAULT_RUNTIME_COMMAND = \"node\";\nconst DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\n\n// ─── Repo root discovery ───────────────────────────────────────\n\nimport { _noGitWarned, _setNoGitWarned } from \"../utils.js\";\n\nexport function findRepoRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n while (true) {\n if (fs.existsSync(path.join(dir, \".git\"))) return dir;\n if (fs.existsSync(path.join(dir, \"package.json\"))) {\n if (!_noGitWarned) {\n _setNoGitWarned();\n console.error(\n \"[tap] warning: No .git directory found. Resolved via package.json. Use --comms-dir to specify explicitly.\",\n );\n }\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n if (!_noGitWarned) {\n _setNoGitWarned();\n console.error(\n \"[tap] warning: No git repository found. Using cwd as root. Run 'git init' or use --comms-dir.\",\n );\n }\n return process.cwd();\n}\n\n// ─── JSON file loading ─────────────────────────────────────────\n\nfunction loadJsonFile<T>(filePath: string): T | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nexport function loadSharedConfig(repoRoot: string): TapSharedConfig | null {\n return loadJsonFile<TapSharedConfig>(path.join(repoRoot, SHARED_CONFIG_FILE));\n}\n\nexport function loadLocalConfig(repoRoot: string): TapLocalConfig | null {\n return loadJsonFile<TapLocalConfig>(path.join(repoRoot, LOCAL_CONFIG_FILE));\n}\n\nfunction readLegacyShellValue(configText: string, key: string): string | null {\n const match = configText.match(new RegExp(`^${key}=\"?(.+?)\"?$`, \"m\"));\n return match?.[1]?.trim() || null;\n}\n\nfunction loadLegacyShellConfig(repoRoot: string): TapSharedConfig | null {\n const filePath = path.join(repoRoot, LEGACY_CONFIG_FILE);\n if (!fs.existsSync(filePath)) return null;\n\n try {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n const commsDir = readLegacyShellValue(raw, \"TAP_COMMS_DIR\");\n if (!commsDir) return null;\n return { commsDir };\n } catch {\n return null;\n }\n}\n\n// ─── CLI overrides ─────────────────────────────────────────────\n\nexport interface ConfigOverrides {\n commsDir?: string;\n stateDir?: string;\n runtimeCommand?: string;\n appServerUrl?: string;\n}\n\n// ─── Resolution ────────────────────────────────────────────────\n\n/**\n * Resolve config with priority: CLI flag > env > local config > shared config > auto.\n */\nexport function resolveConfig(\n overrides: ConfigOverrides = {},\n startDir?: string,\n): ConfigResolution {\n const repoRoot = findRepoRoot(startDir);\n const shared = loadSharedConfig(repoRoot) ?? {};\n const local = loadLocalConfig(repoRoot) ?? {};\n const legacy = loadLegacyShellConfig(repoRoot) ?? {};\n\n const sources: Record<keyof TapResolvedConfig, ConfigSource> = {\n repoRoot: \"auto\",\n commsDir: \"auto\",\n stateDir: \"auto\",\n runtimeCommand: \"auto\",\n appServerUrl: \"auto\",\n };\n\n // ─── commsDir ──────────────────────────────────────────────\n let commsDir: string;\n if (overrides.commsDir) {\n commsDir = resolvePath(repoRoot, overrides.commsDir);\n sources.commsDir = \"cli-flag\";\n } else if (process.env.TAP_COMMS_DIR) {\n commsDir = resolvePath(repoRoot, process.env.TAP_COMMS_DIR);\n sources.commsDir = \"env\";\n } else if (local.commsDir) {\n commsDir = resolvePath(repoRoot, local.commsDir);\n sources.commsDir = \"local-config\";\n } else if (shared.commsDir) {\n commsDir = resolvePath(repoRoot, shared.commsDir);\n sources.commsDir = \"shared-config\";\n } else if (legacy.commsDir) {\n commsDir = resolvePath(repoRoot, legacy.commsDir);\n sources.commsDir = \"legacy-shell-config\";\n } else {\n commsDir = path.join(repoRoot, \"tap-comms\");\n }\n\n // ─── stateDir ──────────────────────────────────────────────\n let stateDir: string;\n if (overrides.stateDir) {\n stateDir = resolvePath(repoRoot, overrides.stateDir);\n sources.stateDir = \"cli-flag\";\n } else if (process.env.TAP_STATE_DIR) {\n stateDir = resolvePath(repoRoot, process.env.TAP_STATE_DIR);\n sources.stateDir = \"env\";\n } else if (local.stateDir) {\n stateDir = resolvePath(repoRoot, local.stateDir);\n sources.stateDir = \"local-config\";\n } else if (shared.stateDir) {\n stateDir = resolvePath(repoRoot, shared.stateDir);\n sources.stateDir = \"shared-config\";\n } else {\n stateDir = path.join(repoRoot, \".tap-comms\");\n }\n\n // ─── runtimeCommand ────────────────────────────────────────\n let runtimeCommand: string;\n if (overrides.runtimeCommand) {\n runtimeCommand = overrides.runtimeCommand;\n sources.runtimeCommand = \"cli-flag\";\n } else if (process.env.TAP_RUNTIME_COMMAND) {\n runtimeCommand = process.env.TAP_RUNTIME_COMMAND;\n sources.runtimeCommand = \"env\";\n } else if (local.runtimeCommand) {\n runtimeCommand = local.runtimeCommand;\n sources.runtimeCommand = \"local-config\";\n } else if (shared.runtimeCommand) {\n runtimeCommand = shared.runtimeCommand;\n sources.runtimeCommand = \"shared-config\";\n } else {\n runtimeCommand = DEFAULT_RUNTIME_COMMAND;\n }\n\n // ─── appServerUrl ──────────────────────────────────────────\n let appServerUrl: string;\n if (overrides.appServerUrl) {\n appServerUrl = overrides.appServerUrl;\n sources.appServerUrl = \"cli-flag\";\n } else if (process.env.TAP_APP_SERVER_URL) {\n appServerUrl = process.env.TAP_APP_SERVER_URL;\n sources.appServerUrl = \"env\";\n } else if (local.appServerUrl) {\n appServerUrl = local.appServerUrl;\n sources.appServerUrl = \"local-config\";\n } else if (shared.appServerUrl) {\n appServerUrl = shared.appServerUrl;\n sources.appServerUrl = \"shared-config\";\n } else {\n appServerUrl = DEFAULT_APP_SERVER_URL;\n }\n\n return {\n config: { repoRoot, commsDir, stateDir, runtimeCommand, appServerUrl },\n sources,\n };\n}\n\n// ─── Save helpers ──────────────────────────────────────────────\n\nexport function saveSharedConfig(\n repoRoot: string,\n config: TapSharedConfig,\n): void {\n const filePath = path.join(repoRoot, SHARED_CONFIG_FILE);\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\nexport function saveLocalConfig(\n repoRoot: string,\n config: TapLocalConfig,\n): void {\n const filePath = path.join(repoRoot, LOCAL_CONFIG_FILE);\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\n// ─── Helpers ───────────────────────────────────────────────────\n\n/** Resolve a path relative to repoRoot, or keep absolute as-is. */\nfunction resolvePath(repoRoot: string, p: string): string {\n const normalized = normalizeTapPath(p);\n return path.isAbsolute(normalized)\n ? normalized\n : path.resolve(repoRoot, normalized);\n}\n\nfunction normalizeTapPath(input: string): string {\n const trimmed = input.trim().replace(/^[\"'`]+|[\"'`]+$/g, \"\");\n if (/^[A-Za-z]:[\\\\/]/.test(trimmed)) {\n return trimmed;\n }\n\n // MSYS/Git Bash `/c/...` → `C:\\...` conversion — Windows only.\n // On POSIX, `/d/...` is a legitimate absolute path and must not be rewritten.\n if (process.platform === \"win32\") {\n const match = trimmed.match(/^\\/([A-Za-z])\\/(.*)$/);\n if (match) {\n return `${match[1].toUpperCase()}:\\\\${match[2].replace(/\\//g, \"\\\\\")}`;\n }\n }\n\n return trimmed;\n}\n","export type {\n TapSharedConfig,\n TapLocalConfig,\n TapResolvedConfig,\n ConfigSource,\n ConfigResolution,\n} from \"./types.js\";\n\nexport {\n LEGACY_CONFIG_FILE,\n SHARED_CONFIG_FILE,\n LOCAL_CONFIG_FILE,\n findRepoRoot,\n loadSharedConfig,\n loadLocalConfig,\n resolveConfig,\n saveSharedConfig,\n saveLocalConfig,\n} from \"./resolve.js\";\n\nexport type { ConfigOverrides } from \"./resolve.js\";\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as crypto from \"node:crypto\";\nimport type {\n TapState,\n TapStateV1,\n InstanceState,\n InstanceId,\n RuntimeName,\n OwnedArtifact,\n} from \"./types.js\";\nimport { resolveConfig } from \"./config/index.js\";\n\nconst STATE_FILE = \"state.json\";\nconst SCHEMA_VERSION = 2;\n\nexport function getStateDir(repoRoot: string): string {\n const { config } = resolveConfig({}, repoRoot);\n return config.stateDir;\n}\n\nexport function getStatePath(repoRoot: string): string {\n return path.join(getStateDir(repoRoot), STATE_FILE);\n}\n\nexport function stateExists(repoRoot: string): boolean {\n return fs.existsSync(getStatePath(repoRoot));\n}\n\n// ─── v1 → v2 Migration ────────────────────────────────────────\n\nexport function migrateStateV1toV2(v1: TapStateV1): TapState {\n const instances: Record<InstanceId, InstanceState> = {};\n\n for (const [runtime, rs] of Object.entries(v1.runtimes)) {\n if (!rs) continue;\n const instanceId = runtime as InstanceId; // default instance = runtime name\n instances[instanceId] = {\n instanceId,\n runtime: runtime as RuntimeName,\n agentName: null,\n port: null,\n headless: null,\n ...rs,\n };\n }\n\n return {\n schemaVersion: SCHEMA_VERSION,\n createdAt: v1.createdAt,\n updatedAt: v1.updatedAt,\n commsDir: v1.commsDir,\n repoRoot: v1.repoRoot,\n packageVersion: v1.packageVersion,\n instances,\n };\n}\n\n// ─── Load / Save ───────────────────────────────────────────────\n\nexport function loadState(repoRoot: string): TapState | null {\n const statePath = getStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return null;\n\n const raw = fs.readFileSync(statePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n\n // Auto-migrate v1 → v2\n if (parsed.schemaVersion === 1 || parsed.runtimes) {\n const migrated = migrateStateV1toV2(parsed as TapStateV1);\n saveState(repoRoot, migrated);\n return migrated;\n }\n\n return parsed as TapState;\n}\n\nexport function saveState(repoRoot: string, state: TapState): void {\n const stateDir = getStateDir(repoRoot);\n fs.mkdirSync(stateDir, { recursive: true });\n const statePath = getStatePath(repoRoot);\n const tmp = `${statePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(state, null, 2), \"utf-8\");\n fs.renameSync(tmp, statePath);\n}\n\nexport function createInitialState(\n commsDir: string,\n repoRoot: string,\n packageVersion: string,\n): TapState {\n const now = new Date().toISOString();\n return {\n schemaVersion: SCHEMA_VERSION,\n createdAt: now,\n updatedAt: now,\n commsDir: path.resolve(commsDir),\n repoRoot: path.resolve(repoRoot),\n packageVersion,\n instances: {},\n };\n}\n\n// ─── Instance CRUD ─────────────────────────────────────────────\n\nexport function updateInstanceState(\n state: TapState,\n instanceId: InstanceId,\n instanceState: InstanceState,\n): TapState {\n return {\n ...state,\n updatedAt: new Date().toISOString(),\n instances: {\n ...state.instances,\n [instanceId]: instanceState,\n },\n };\n}\n\nexport function removeInstanceState(\n state: TapState,\n instanceId: InstanceId,\n): TapState {\n const { [instanceId]: _removed, ...remaining } = state.instances;\n return {\n ...state,\n updatedAt: new Date().toISOString(),\n instances: remaining,\n };\n}\n\nexport function getInstalledInstances(state: TapState): InstanceId[] {\n return (Object.keys(state.instances) as InstanceId[]).filter(\n (id) => state.instances[id]?.installed,\n );\n}\n\nexport function getInstanceArtifacts(\n state: TapState,\n instanceId: InstanceId,\n): OwnedArtifact[] {\n return state.instances[instanceId]?.ownedArtifacts ?? [];\n}\n\n// ─── Backup ────────────────────────────────────────────────────\n\nexport function ensureBackupDir(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n const backupDir = path.join(stateDir, \"backups\", instanceId);\n fs.mkdirSync(backupDir, { recursive: true });\n return backupDir;\n}\n\nexport function backupFile(filePath: string, backupDir: string): string {\n const basename = path.basename(filePath);\n const hash = fileHash(filePath);\n const backupPath = path.join(backupDir, `${basename}.${hash}.bak`);\n fs.copyFileSync(filePath, backupPath);\n return backupPath;\n}\n\nexport function fileHash(filePath: string): string {\n if (!fs.existsSync(filePath)) return \"\";\n const content = fs.readFileSync(filePath);\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AdapterContext } from \"../types.js\";\n\nexport interface CommandProbe {\n command: string | null;\n version: string | null;\n}\n\nexport interface ManagedMcpServerSpec {\n command: string | null;\n args: string[];\n env: Record<string, string>;\n sourcePath: string | null;\n warnings: string[];\n issues: string[];\n}\n\nexport function probeCommand(candidates: string[]): CommandProbe {\n for (const candidate of candidates) {\n const result = spawnSync(candidate, [\"--version\"], {\n encoding: \"utf-8\",\n shell: process.platform === \"win32\",\n });\n\n if (result.status === 0) {\n const version =\n `${result.stdout ?? \"\"}${result.stderr ?? \"\"}`.trim() || null;\n return { command: candidate, version };\n }\n }\n\n return { command: null, version: null };\n}\n\nexport function getHomeDir(): string {\n return os.homedir();\n}\n\nexport function toForwardSlashPath(filePath: string): string {\n return path.resolve(filePath).replace(/\\\\/g, \"/\");\n}\n\nexport function canWriteOrCreate(filePath: string): boolean {\n try {\n if (fs.existsSync(filePath)) {\n fs.accessSync(filePath, fs.constants.W_OK);\n return true;\n }\n\n const parent = path.dirname(filePath);\n fs.mkdirSync(parent, { recursive: true });\n fs.accessSync(parent, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function findLocalTapCommsSource(ctx: AdapterContext): string | null {\n const candidates = [\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-plugin\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n path.join(\n ctx.repoRoot,\n \"node_modules\",\n \"@hua-labs\",\n \"tap-plugin\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function findBundledTapCommsSource(\n metaUrl: string = import.meta.url,\n): string | null {\n const moduleDir = path.dirname(fileURLToPath(metaUrl));\n const candidates = [\n path.join(moduleDir, \"mcp-server.mjs\"),\n path.join(moduleDir, \"..\", \"mcp-server.mjs\"),\n path.join(moduleDir, \"..\", \"mcp-server.ts\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function findTapCommsServerEntry(\n ctx: AdapterContext,\n metaUrl: string = import.meta.url,\n): string | null {\n return findBundledTapCommsSource(metaUrl) ?? findLocalTapCommsSource(ctx);\n}\n\nexport function findPreferredBunCommand(): string | null {\n const home = getHomeDir();\n const candidates =\n process.platform === \"win32\"\n ? [path.join(home, \".bun\", \"bin\", \"bun.exe\"), \"bun\", \"bun.cmd\"]\n : [path.join(home, \".bun\", \"bin\", \"bun\"), \"bun\"];\n\n for (const candidate of candidates) {\n if (path.isAbsolute(candidate) && !fs.existsSync(candidate)) continue;\n\n const result = spawnSync(candidate, [\"--version\"], {\n encoding: \"utf-8\",\n shell: process.platform === \"win32\",\n });\n if (result.status === 0) {\n return path.isAbsolute(candidate)\n ? toForwardSlashPath(candidate)\n : candidate;\n }\n }\n\n return null;\n}\n\nexport function buildManagedMcpServerSpec(\n ctx: AdapterContext,\n instanceId?: string,\n): ManagedMcpServerSpec {\n const sourcePath = findTapCommsServerEntry(ctx);\n const bunCommand = findPreferredBunCommand();\n const warnings: string[] = [];\n const issues: string[] = [];\n\n const env: Record<string, string> = {\n TAP_AGENT_NAME: \"<set-per-session>\",\n TAP_COMMS_DIR: toForwardSlashPath(ctx.commsDir),\n };\n if (instanceId) {\n env.TAP_AGENT_ID = instanceId;\n }\n\n if (!sourcePath) {\n issues.push(\n \"tap-comms MCP server entry not found. Reinstall @hua-labs/tap or run from a repo with packages/tap-plugin/channels/ available.\",\n );\n return { command: null, args: [], env, sourcePath, warnings, issues };\n }\n\n // Prefer bun for .ts source files; for compiled .mjs, node works too\n const isBundled = sourcePath.endsWith(\".mjs\");\n let command: string | null = bunCommand;\n\n if (!command && isBundled) {\n command = process.execPath; // node — .mjs is compiled JS\n warnings.push(\n \"bun not found; using node to run the compiled MCP server. Install bun for better performance.\",\n );\n }\n\n if (!command) {\n issues.push(\n \"bun is required to run the repo-local tap-comms MCP server (.ts source). Install bun: https://bun.sh\",\n );\n return { command: null, args: [], env, sourcePath, warnings, issues };\n }\n\n return {\n command: isBundled && command === process.execPath\n ? toForwardSlashPath(command)\n : command,\n args: [toForwardSlashPath(sourcePath)],\n env,\n sourcePath,\n warnings,\n issues,\n };\n}\n","/**\n * Common Node.js runtime resolver for all tap-comms child processes.\n *\n * Resolution chain:\n * .node-version + fnm probe → configured command → tsx fallback\n *\n * Extracted from codex-bridge-runner.ts (M69) to share across:\n * - bridge engine spawn\n * - bridge runner spawn\n * - future CLI commands\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport type RuntimeSource = \"fnm\" | \"config\" | \"path\" | \"tsx-fallback\" | \"bun\";\n\nexport interface ResolvedRuntime {\n /** Absolute path or command name for the resolved runtime. */\n command: string;\n /** Whether --experimental-strip-types is supported and should be used. */\n supportsStripTypes: boolean;\n /** Where the runtime was resolved from (for diagnostics). */\n source: RuntimeSource;\n /** Detected major version, if available. */\n majorVersion: number | null;\n}\n\n// ─── .node-version ─────────────────────────────────────────────\n\nexport function readNodeVersion(repoRoot: string): string | null {\n const nvFile = path.join(repoRoot, \".node-version\");\n if (!fs.existsSync(nvFile)) return null;\n try {\n const raw = fs.readFileSync(nvFile, \"utf-8\").trim();\n return raw.length > 0 ? raw.replace(/^v/, \"\") : null;\n } catch {\n return null;\n }\n}\n\n// ─── fnm probe ─────────────────────────────────────────────────\n\nfunction fnmCandidateDirs(): string[] {\n if (process.platform === \"win32\") {\n return [\n process.env.FNM_DIR,\n process.env.APPDATA ? path.join(process.env.APPDATA, \"fnm\") : null,\n process.env.LOCALAPPDATA\n ? path.join(process.env.LOCALAPPDATA, \"fnm\")\n : null,\n process.env.USERPROFILE\n ? path.join(process.env.USERPROFILE, \"scoop\", \"persist\", \"fnm\")\n : null,\n ].filter(Boolean) as string[];\n }\n // macOS / Linux\n return [\n process.env.FNM_DIR,\n process.env.HOME\n ? path.join(process.env.HOME, \".local\", \"share\", \"fnm\")\n : null,\n process.env.HOME ? path.join(process.env.HOME, \".fnm\") : null,\n process.env.XDG_DATA_HOME\n ? path.join(process.env.XDG_DATA_HOME, \"fnm\")\n : null,\n ].filter(Boolean) as string[];\n}\n\nfunction nodeExecutableName(): string {\n return process.platform === \"win32\" ? \"node.exe\" : \"node\";\n}\n\nexport function probeFnmNode(desiredVersion: string): string | null {\n const dirs = fnmCandidateDirs();\n const exe = nodeExecutableName();\n\n for (const baseDir of dirs) {\n const candidate = path.join(\n baseDir,\n \"node-versions\",\n `v${desiredVersion}`,\n \"installation\",\n exe,\n );\n if (!fs.existsSync(candidate)) continue;\n\n try {\n const v = execSync(`\"${candidate}\" --version`, {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n if (v.startsWith(`v${desiredVersion.split(\".\")[0]}.`)) {\n return candidate;\n }\n } catch {\n // candidate exists but doesn't work — skip\n }\n }\n\n return null;\n}\n\n// ─── Version detection ─────────────────────────────────────────\n\nexport function detectNodeMajorVersion(command: string): number | null {\n try {\n const version = execSync(`\"${command}\" --version`, {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n const match = version.match(/^v?(\\d+)\\./);\n return match ? parseInt(match[1], 10) : null;\n } catch {\n return null;\n }\n}\n\nexport function checkStripTypesSupport(command: string): boolean {\n const major = detectNodeMajorVersion(command);\n if (major !== null && major >= 22) return true;\n try {\n execSync(`\"${command}\" --experimental-strip-types -e \"\"`, {\n timeout: 5000,\n stdio: \"pipe\",\n });\n return true;\n } catch {\n return false;\n }\n}\n\n// ─── tsx fallback ──────────────────────────────────────────────\n\nexport function findTsxFallback(repoRoot: string): string | null {\n const candidates = [\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx.exe\"),\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx.CMD\"),\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx\"),\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n return null;\n}\n\n// ─── fnm bin directory (for PATH prepending) ───────────────────\n\n/**\n * Returns the directory containing the fnm-managed node binary,\n * suitable for prepending to PATH in child processes.\n */\nexport function getFnmBinDir(repoRoot: string): string | null {\n const desiredVersion = readNodeVersion(repoRoot);\n if (!desiredVersion) return null;\n\n const nodePath = probeFnmNode(desiredVersion);\n if (!nodePath) return null;\n\n return path.dirname(nodePath);\n}\n\n// ─── Main resolver ─────────────────────────────────────────────\n\n/**\n * Resolve the Node.js runtime to use for spawning child processes.\n *\n * Priority: bun passthrough → .node-version + fnm → configured command → tsx fallback\n */\nexport function resolveNodeRuntime(\n configCommand: string,\n repoRoot: string,\n): ResolvedRuntime {\n // Bun: native TS support, no strip-types needed\n if (configCommand === \"bun\" || configCommand.endsWith(\"bun.exe\")) {\n return {\n command: configCommand,\n supportsStripTypes: false,\n source: \"bun\",\n majorVersion: null,\n };\n }\n\n // .node-version + fnm discovery\n const desiredVersion = readNodeVersion(repoRoot);\n if (desiredVersion) {\n const fnmNode = probeFnmNode(desiredVersion);\n if (fnmNode) {\n const major = detectNodeMajorVersion(fnmNode);\n return {\n command: fnmNode,\n supportsStripTypes: checkStripTypesSupport(fnmNode),\n source: \"fnm\",\n majorVersion: major,\n };\n }\n }\n\n // Configured command (from config or PATH)\n const major = detectNodeMajorVersion(configCommand);\n if (major !== null) {\n return {\n command: configCommand,\n supportsStripTypes: checkStripTypesSupport(configCommand),\n source: major === detectNodeMajorVersion(\"node\") ? \"path\" : \"config\",\n majorVersion: major,\n };\n }\n\n // tsx fallback\n const tsx = findTsxFallback(repoRoot);\n if (tsx) {\n return {\n command: tsx,\n supportsStripTypes: false,\n source: \"tsx-fallback\",\n majorVersion: null,\n };\n }\n\n // Last resort\n return {\n command: configCommand,\n supportsStripTypes: false,\n source: \"path\",\n majorVersion: null,\n };\n}\n\n// ─── Env builder for child processes ───────────────────────────\n\n/**\n * Build an env object with fnm Node prepended to PATH.\n * Use this when spawning child processes that need the correct Node.\n */\nexport function buildRuntimeEnv(\n repoRoot: string,\n baseEnv: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const fnmBin = getFnmBinDir(repoRoot);\n if (!fnmBin) return { ...baseEnv };\n\n const pathKey = process.platform === \"win32\" ? \"Path\" : \"PATH\";\n const currentPath = baseEnv[pathKey] ?? baseEnv.PATH ?? \"\";\n\n return {\n ...baseEnv,\n [pathKey]: `${fnmBin}${path.delimiter}${currentPath}`,\n };\n}\n","export type { ResolvedRuntime, RuntimeSource } from \"./resolve-node.js\";\n\nexport {\n resolveNodeRuntime,\n buildRuntimeEnv,\n readNodeVersion,\n probeFnmNode,\n detectNodeMajorVersion,\n checkStripTypesSupport,\n findTsxFallback,\n getFnmBinDir,\n} from \"./resolve-node.js\";\n","import * as fs from \"node:fs\";\nimport * as net from \"node:net\";\nimport * as path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { spawn, spawnSync, execSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n RuntimeName,\n InstanceId,\n BridgeState,\n AppServerState,\n AppServerAuthState,\n HeadlessConfig,\n Platform,\n TapState,\n} from \"../types.js\";\nimport { probeCommand } from \"../adapters/common.js\";\nimport { resolveNodeRuntime, buildRuntimeEnv } from \"../runtime/index.js\";\n\nexport interface BridgeStartOptions {\n instanceId: InstanceId;\n runtime: RuntimeName;\n stateDir: string;\n commsDir: string;\n bridgeScript: string;\n platform: Platform;\n agentName?: string;\n runtimeCommand?: string;\n appServerUrl?: string;\n repoRoot?: string;\n port?: number;\n /** Headless configuration. Passed as env vars to the bridge process. */\n headless?: HeadlessConfig | null;\n /** Bridge script operational flags (forwarded to codex-app-server-bridge.ts) */\n busyMode?: \"steer\" | \"wait\";\n pollSeconds?: number;\n reconnectSeconds?: number;\n messageLookbackMinutes?: number;\n threadId?: string;\n ephemeral?: boolean;\n processExistingMessages?: boolean;\n manageAppServer?: boolean;\n /** Skip auth gateway — app-server listens directly on the public port (localhost only). */\n noAuth?: boolean;\n}\n\nexport interface BridgeStopOptions {\n instanceId: InstanceId;\n stateDir: string;\n platform: Platform;\n}\n\ninterface EnsureCodexAppServerOptions {\n instanceId: InstanceId;\n stateDir: string;\n repoRoot: string;\n platform: Platform;\n appServerUrl: string;\n existingAppServer?: AppServerState | null;\n noAuth?: boolean;\n}\n\ninterface ManagedAppServerGatewayOptions {\n instanceId: InstanceId;\n stateDir: string;\n repoRoot: string;\n platform: Platform;\n publicUrl: string;\n}\n\ninterface WebSocketLike {\n addEventListener(\n type: \"open\" | \"error\" | \"close\",\n listener: () => void,\n options?: { once?: boolean },\n ): void;\n close(code?: number, reason?: string): void;\n}\n\ntype WebSocketCtor = new (url: string) => WebSocketLike;\n\nconst DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\nconst APP_SERVER_HEALTH_TIMEOUT_MS = 1_500;\nconst APP_SERVER_START_TIMEOUT_MS = 20_000;\nconst APP_SERVER_GATEWAY_START_TIMEOUT_MS = 5_000;\nconst APP_SERVER_HEALTH_RETRY_MS = 250;\nconst APP_SERVER_AUTH_QUERY_PARAM = \"tap_token\";\nconst APP_SERVER_AUTH_FILE_MODE = 0o600;\n\nfunction appServerLogFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return path.join(stateDir, \"logs\", `app-server-${instanceId}.log`);\n}\n\nfunction appServerGatewayLogFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return path.join(stateDir, \"logs\", `app-server-gateway-${instanceId}.log`);\n}\n\nfunction appServerGatewayTokenFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return path.join(\n stateDir,\n \"secrets\",\n `app-server-gateway-${instanceId}.token`,\n );\n}\n\nfunction stderrLogFilePath(logPath: string): string {\n return `${logPath}.stderr`;\n}\n\nfunction writeProtectedTextFile(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, content, {\n encoding: \"utf-8\",\n mode: APP_SERVER_AUTH_FILE_MODE,\n });\n fs.chmodSync(tmp, APP_SERVER_AUTH_FILE_MODE);\n fs.renameSync(tmp, filePath);\n fs.chmodSync(filePath, APP_SERVER_AUTH_FILE_MODE);\n}\n\nfunction removeFileIfExists(filePath: string | null | undefined): void {\n if (!filePath || !fs.existsSync(filePath)) {\n return;\n }\n\n try {\n fs.unlinkSync(filePath);\n } catch {\n // Best-effort cleanup only.\n }\n}\n\nfunction getWebSocketCtor(): WebSocketCtor | null {\n const candidate = (globalThis as { WebSocket?: unknown }).WebSocket;\n return typeof candidate === \"function\" ? (candidate as WebSocketCtor) : null;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return hostname === \"127.0.0.1\" || hostname === \"localhost\";\n}\n\nfunction resolveCodexCommand(platform: Platform): string | null {\n const candidates =\n platform === \"win32\"\n ? [\"codex.cmd\", \"codex.exe\", \"codex\", \"codex.ps1\"]\n : [\"codex\"];\n return probeCommand(candidates).command;\n}\n\nfunction formatCodexAppServerCommand(command: string, url: string): string {\n return `${command} app-server --listen ${url}`;\n}\n\nfunction resolvePowerShellCommand(): string {\n return (\n probeCommand([\"pwsh\", \"powershell\", \"powershell.exe\"]).command ??\n \"powershell\"\n );\n}\n\nfunction resolveAuthGatewayScript(repoRoot: string): string | null {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(moduleDir, \"..\", \"bridges\", \"codex-app-server-auth-gateway.mjs\"),\n path.join(moduleDir, \"..\", \"bridges\", \"codex-app-server-auth-gateway.ts\"),\n path.join(\n repoRoot,\n \"packages\",\n \"tap-comms\",\n \"dist\",\n \"bridges\",\n \"codex-app-server-auth-gateway.mjs\",\n ),\n path.join(\n repoRoot,\n \"packages\",\n \"tap-comms\",\n \"src\",\n \"bridges\",\n \"codex-app-server-auth-gateway.ts\",\n ),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nexport function getBridgeRuntimeStateDir(\n repoRoot: string,\n instanceId: InstanceId,\n): string {\n return path.join(repoRoot, \".tmp\", `codex-app-server-bridge-${instanceId}`);\n}\n\nasync function allocateLoopbackPort(hostname: string): Promise<number> {\n const bindHost = hostname === \"localhost\" ? \"127.0.0.1\" : hostname;\n return await new Promise<number>((resolve, reject) => {\n const server = net.createServer();\n server.unref();\n server.once(\"error\", reject);\n server.listen(0, bindHost, () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close(() => {\n reject(new Error(\"Failed to allocate a loopback port\"));\n });\n return;\n }\n\n const port = address.port;\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(port);\n });\n });\n });\n}\n\nfunction buildProtectedAppServerUrl(publicUrl: string, token: string): string {\n const url = new URL(publicUrl);\n url.searchParams.set(APP_SERVER_AUTH_QUERY_PARAM, token);\n return url.toString().replace(/\\/(?=\\?|$)/, \"\");\n}\n\nfunction readGatewayTokenFromPath(tokenPath: string): string {\n return fs.readFileSync(tokenPath, \"utf8\").trim();\n}\n\nfunction readGatewayToken(\n auth: AppServerAuthState | null | undefined,\n): string | null {\n if (!auth) {\n return null;\n }\n\n const legacyToken = (auth as AppServerAuthState & { token?: string }).token;\n if (legacyToken?.trim()) {\n return legacyToken.trim();\n }\n\n if (!auth.tokenPath || !fs.existsSync(auth.tokenPath)) {\n return null;\n }\n\n const fileToken = readGatewayTokenFromPath(auth.tokenPath);\n return fileToken || null;\n}\n\nfunction materializeGatewayTokenFile(\n stateDir: string,\n instanceId: InstanceId,\n publicUrl: string,\n auth: AppServerAuthState,\n): AppServerAuthState {\n if (auth.tokenPath && fs.existsSync(auth.tokenPath)) {\n return auth;\n }\n\n const token = readGatewayToken(auth);\n if (!token) {\n throw new Error(`Missing auth gateway token for ${instanceId}`);\n }\n\n const tokenPath = appServerGatewayTokenFilePath(stateDir, instanceId);\n writeProtectedTextFile(tokenPath, `${token}\\n`);\n return {\n ...auth,\n protectedUrl: buildProtectedAppServerUrl(publicUrl, \"***\"),\n tokenPath,\n };\n}\n\nasync function createManagedAppServerAuth(\n options: ManagedAppServerGatewayOptions,\n): Promise<AppServerAuthState> {\n const publicUrl = new URL(options.publicUrl);\n const upstreamUrl = new URL(options.publicUrl);\n upstreamUrl.port = String(await allocateLoopbackPort(publicUrl.hostname));\n upstreamUrl.search = \"\";\n upstreamUrl.hash = \"\";\n\n const gatewayScript = resolveAuthGatewayScript(options.repoRoot);\n if (!gatewayScript) {\n throw new Error(\"Auth gateway script not found\");\n }\n\n const token = randomBytes(24).toString(\"base64url\");\n const tokenPath = appServerGatewayTokenFilePath(\n options.stateDir,\n options.instanceId,\n );\n writeProtectedTextFile(tokenPath, `${token}\\n`);\n const protectedUrl = buildProtectedAppServerUrl(options.publicUrl, \"***\");\n\n const gatewayLogPath = appServerGatewayLogFilePath(\n options.stateDir,\n options.instanceId,\n );\n fs.mkdirSync(path.dirname(gatewayLogPath), { recursive: true });\n rotateLog(gatewayLogPath);\n\n const runtime = resolveNodeRuntime(process.execPath, options.repoRoot);\n const gatewayArgs: string[] = [];\n if (gatewayScript.endsWith(\".ts\")) {\n if (!runtime.supportsStripTypes) {\n throw new Error(\n \"Current Node runtime cannot start the auth gateway from TypeScript source. Rebuild @hua-labs/tap or use Node 22.6+.\",\n );\n }\n gatewayArgs.push(\"--experimental-strip-types\");\n }\n gatewayArgs.push(gatewayScript);\n\n const gatewayEnv = {\n ...buildRuntimeEnv(options.repoRoot),\n TAP_GATEWAY_LISTEN_URL: options.publicUrl,\n TAP_GATEWAY_UPSTREAM_URL: upstreamUrl.toString().replace(/\\/$/, \"\"),\n TAP_GATEWAY_TOKEN_FILE: tokenPath,\n };\n\n let gatewayPid: number | null;\n {\n let logFd: number | null = null;\n try {\n if (options.platform === \"win32\") {\n gatewayPid = startWindowsDetachedProcess(\n runtime.command,\n gatewayArgs,\n options.repoRoot,\n gatewayLogPath,\n gatewayEnv,\n );\n } else {\n logFd = fs.openSync(gatewayLogPath, \"a\");\n const child = spawn(runtime.command, gatewayArgs, {\n cwd: options.repoRoot,\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: gatewayEnv,\n windowsHide: true,\n });\n child.unref();\n gatewayPid = child.pid ?? null;\n }\n } catch (error) {\n removeFileIfExists(tokenPath);\n throw error;\n } finally {\n if (logFd != null) {\n fs.closeSync(logFd);\n }\n }\n }\n\n if (gatewayPid == null) {\n removeFileIfExists(tokenPath);\n throw new Error(\"Failed to spawn app-server auth gateway\");\n }\n\n return {\n mode: \"query-token\",\n protectedUrl,\n upstreamUrl: upstreamUrl.toString().replace(/\\/$/, \"\"),\n tokenPath,\n gatewayPid,\n gatewayLogPath,\n };\n}\n\nfunction canReuseManagedAppServer(\n appServer: AppServerState | null | undefined,\n): boolean {\n if (!appServer?.managed) {\n return false;\n }\n\n // App-server process must be alive\n if (appServer.pid != null && !isProcessAlive(appServer.pid)) {\n return false;\n }\n\n const auth = appServer.auth;\n if (auth) {\n // Auth mode: verify gateway token and process are intact\n if (!auth.protectedUrl) {\n return false;\n }\n if (!readGatewayToken(auth)) {\n return false;\n }\n if (auth.gatewayPid != null && !isProcessAlive(auth.gatewayPid)) {\n return false;\n }\n }\n // No-auth mode (auth is null): only the app-server process check above is needed\n\n return true;\n}\n\nfunction markAppServerHealthy(appServer: AppServerState): AppServerState {\n const checkedAt = new Date().toISOString();\n return {\n ...appServer,\n healthy: true,\n lastCheckedAt: checkedAt,\n lastHealthyAt: checkedAt,\n };\n}\n\nfunction findReusableManagedAppServer(\n stateDir: string,\n publicUrl: string,\n): AppServerState | null {\n const pidDir = path.join(stateDir, \"pids\");\n if (!fs.existsSync(pidDir)) {\n return null;\n }\n\n for (const name of fs.readdirSync(pidDir)) {\n if (!name.startsWith(\"bridge-\") || !name.endsWith(\".json\")) {\n continue;\n }\n\n try {\n const raw = fs.readFileSync(path.join(pidDir, name), \"utf-8\");\n const parsed = JSON.parse(raw) as BridgeState;\n if (parsed.appServer?.url !== publicUrl) {\n continue;\n }\n if (canReuseManagedAppServer(parsed.appServer)) {\n return markAppServerHealthy(parsed.appServer!);\n }\n } catch {\n // Ignore stale or corrupted bridge state.\n }\n }\n\n return null;\n}\n\nfunction startWindowsDetachedProcess(\n command: string,\n args: string[],\n repoRoot: string,\n logPath: string,\n env: NodeJS.ProcessEnv = process.env,\n): number | null {\n const ext = path.extname(command).toLowerCase();\n const stderrLogPath = stderrLogFilePath(logPath);\n const stdoutFd = fs.openSync(logPath, \"a\");\n const stderrFd = fs.openSync(stderrLogPath, \"a\");\n\n try {\n const child =\n ext === \".ps1\"\n ? spawn(\n resolvePowerShellCommand(),\n [\"-NoLogo\", \"-NoProfile\", \"-File\", command, ...args],\n {\n cwd: repoRoot,\n detached: true,\n stdio: [\"ignore\", stdoutFd, stderrFd],\n env,\n windowsHide: true,\n },\n )\n : spawn(command, args, {\n cwd: repoRoot,\n detached: true,\n stdio: [\"ignore\", stdoutFd, stderrFd],\n env,\n windowsHide: true,\n shell: ext === \".cmd\" || ext === \".bat\",\n });\n\n child.unref();\n return child.pid ?? null;\n } finally {\n fs.closeSync(stdoutFd);\n fs.closeSync(stderrFd);\n }\n}\n\nfunction startWindowsCodexAppServer(\n command: string,\n url: string,\n repoRoot: string,\n logPath: string,\n): number | null {\n return startWindowsDetachedProcess(\n command,\n [\"app-server\", \"--listen\", url],\n repoRoot,\n logPath,\n );\n}\n\nfunction findListeningProcessId(\n url: string,\n platform: Platform,\n): number | null {\n if (platform !== \"win32\") {\n return null;\n }\n\n let port: number | null;\n try {\n const parsed = new URL(url);\n port = parsed.port ? Number.parseInt(parsed.port, 10) : null;\n } catch {\n return null;\n }\n\n if (port == null || !Number.isFinite(port)) {\n return null;\n }\n\n const result = spawnSync(\n resolvePowerShellCommand(),\n [\n \"-NoLogo\",\n \"-NoProfile\",\n \"-Command\",\n [\n `$port = ${port}`,\n \"$processId = Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty OwningProcess\",\n \"if ($processId) { $processId }\",\n ].join(\"; \"),\n ],\n {\n encoding: \"utf-8\",\n windowsHide: true,\n },\n );\n\n if (result.status !== 0) {\n return null;\n }\n\n const parsedPid = Number.parseInt((result.stdout ?? \"\").trim(), 10);\n return Number.isFinite(parsedPid) ? parsedPid : null;\n}\n\nexport function resolveAppServerUrl(\n baseUrl: string | undefined,\n port?: number,\n): string {\n const resolvedBase = (baseUrl ?? DEFAULT_APP_SERVER_URL).replace(/\\/$/, \"\");\n if (port == null) {\n return resolvedBase;\n }\n\n try {\n const parsed = new URL(resolvedBase);\n parsed.port = String(port);\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return resolvedBase;\n }\n}\n\nexport async function isTcpPortAvailable(\n hostname: string,\n port: number,\n): Promise<boolean> {\n const bindHost = hostname === \"localhost\" ? \"127.0.0.1\" : hostname;\n return await new Promise<boolean>((resolve) => {\n const server = net.createServer();\n server.unref();\n server.once(\"error\", () => resolve(false));\n server.listen(port, bindHost, () => {\n server.close((error) => resolve(!error));\n });\n });\n}\n\nexport async function findNextAvailableAppServerPort(\n state: TapState,\n baseUrl: string | undefined,\n basePort: number = 4501,\n excludeInstanceId?: InstanceId,\n): Promise<number> {\n let hostname = \"127.0.0.1\";\n try {\n hostname = new URL(baseUrl ?? DEFAULT_APP_SERVER_URL).hostname;\n } catch {\n // Fall back to the default loopback host.\n }\n\n const maxAttempts = 1000;\n let port = basePort;\n for (let attempt = 0; attempt < maxAttempts; attempt += 1, port += 1) {\n const claimedInState = Object.entries(state.instances).some(\n ([id, inst]) => id !== excludeInstanceId && inst.port === port,\n );\n if (claimedInState) {\n continue;\n }\n\n if (!isLoopbackHost(hostname)) {\n return port;\n }\n\n if (await isTcpPortAvailable(hostname, port)) {\n return port;\n }\n }\n\n throw new Error(\n `Failed to find a free app-server port starting at ${basePort}`,\n );\n}\n\nexport async function checkAppServerHealth(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n): Promise<boolean> {\n const WebSocket = getWebSocketCtor();\n if (!WebSocket) {\n return false;\n }\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n let socket: WebSocketLike | null = null;\n\n const finish = (healthy: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n try {\n socket?.close();\n } catch {\n // Best-effort cleanup only.\n }\n resolve(healthy);\n };\n\n const timer = setTimeout(() => finish(false), timeoutMs);\n\n try {\n socket = new WebSocket(url);\n socket.addEventListener(\"open\", () => finish(true), { once: true });\n socket.addEventListener(\"error\", () => finish(false), { once: true });\n socket.addEventListener(\"close\", () => finish(false), { once: true });\n } catch {\n finish(false);\n }\n });\n}\n\nasync function waitForAppServerHealth(\n url: string,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n if (await checkAppServerHealth(url)) {\n return true;\n }\n await delay(APP_SERVER_HEALTH_RETRY_MS);\n }\n\n return false;\n}\n\nasync function terminateProcess(\n pid: number,\n platform: Platform,\n): Promise<boolean> {\n if (!isProcessAlive(pid)) {\n return false;\n }\n\n try {\n if (platform === \"win32\") {\n execSync(`taskkill /PID ${pid} /F /T`, { stdio: \"pipe\" });\n } else {\n process.kill(pid, \"SIGTERM\");\n await delay(2_000);\n if (isProcessAlive(pid)) {\n process.kill(pid, \"SIGKILL\");\n }\n }\n } catch {\n // Best effort. The caller only needs a boolean outcome.\n }\n\n return !isProcessAlive(pid);\n}\n\nexport async function stopManagedAppServer(\n appServer: AppServerState,\n platform: Platform,\n): Promise<boolean> {\n if (!appServer.managed) {\n return false;\n }\n\n let stopped = false;\n if (appServer.auth?.gatewayPid != null) {\n stopped =\n (await terminateProcess(appServer.auth.gatewayPid, platform)) || stopped;\n }\n if (appServer.pid != null) {\n stopped = (await terminateProcess(appServer.pid, platform)) || stopped;\n }\n removeFileIfExists(appServer.auth?.tokenPath);\n return stopped;\n}\n\nexport async function ensureCodexAppServer(\n options: EnsureCodexAppServerOptions,\n): Promise<AppServerState> {\n const effectiveUrl = resolveAppServerUrl(options.appServerUrl);\n const fallbackManualCommand = formatCodexAppServerCommand(\n \"codex\",\n effectiveUrl,\n );\n if (\n options.existingAppServer?.url === effectiveUrl &&\n canReuseManagedAppServer(options.existingAppServer)\n ) {\n return markAppServerHealthy(options.existingAppServer);\n }\n\n const sharedManaged = findReusableManagedAppServer(\n options.stateDir,\n effectiveUrl,\n );\n if (sharedManaged) {\n return sharedManaged;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(effectiveUrl);\n } catch {\n throw new Error(\n `Invalid app-server URL: ${effectiveUrl}\\nStart it manually:\\n ${fallbackManualCommand}`,\n );\n }\n\n if (!isLoopbackHost(parsedUrl.hostname)) {\n throw new Error(\n `Auto-start only supports loopback app-server URLs. Current URL: ${effectiveUrl}\\nStart it manually:\\n ${fallbackManualCommand}`,\n );\n }\n\n if (await checkAppServerHealth(effectiveUrl)) {\n const hint = options.noAuth\n ? \"Stop it first or use --no-server for an unmanaged external app-server.\"\n : \"A listener is already running, so tap cannot insert the auth gateway there.\\nStop it first or use --no-server for an unmanaged external app-server.\";\n throw new Error(`${effectiveUrl}: ${hint}`);\n }\n\n const resolvedCommand = resolveCodexCommand(options.platform);\n if (!resolvedCommand) {\n throw new Error(\n `Codex CLI not found in PATH.\\nStart the app-server manually:\\n ${fallbackManualCommand}`,\n );\n }\n\n const logPath = appServerLogFilePath(options.stateDir, options.instanceId);\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n rotateLog(logPath);\n\n // --no-auth: start app-server directly on the public URL (no gateway).\n // TUI and bridge both connect to the same port without token auth.\n if (options.noAuth) {\n const manualCommand = formatCodexAppServerCommand(\"codex\", effectiveUrl);\n let pid: number | null;\n\n if (options.platform === \"win32\") {\n try {\n pid = startWindowsCodexAppServer(\n resolvedCommand,\n effectiveUrl,\n options.repoRoot,\n logPath,\n );\n } catch (err) {\n throw new Error(\n `Failed to spawn Codex app-server: ${err instanceof Error ? err.message : String(err)}\\nStart it manually:\\n ${manualCommand}`,\n { cause: err },\n );\n }\n } else {\n const logFd = fs.openSync(logPath, \"a\");\n try {\n const child = spawn(\n resolvedCommand,\n [\"app-server\", \"--listen\", effectiveUrl],\n {\n cwd: options.repoRoot,\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: process.env,\n windowsHide: true,\n },\n );\n child.unref();\n pid = child.pid ?? null;\n } catch (err) {\n throw new Error(\n `Failed to spawn Codex app-server: ${err instanceof Error ? err.message : String(err)}\\nStart it manually:\\n ${manualCommand}`,\n { cause: err },\n );\n } finally {\n fs.closeSync(logFd);\n }\n }\n\n if (pid == null) {\n throw new Error(\n `Failed to spawn Codex app-server.\\nStart it manually:\\n ${manualCommand}`,\n );\n }\n\n const healthy = await waitForAppServerHealth(\n effectiveUrl,\n APP_SERVER_START_TIMEOUT_MS,\n );\n if (!healthy) {\n await terminateProcess(pid, options.platform);\n throw new Error(\n `Codex app-server did not become healthy at ${effectiveUrl}.\\nCheck ${logPath}\\nOr start it manually:\\n ${manualCommand}`,\n );\n }\n\n pid = findListeningProcessId(effectiveUrl, options.platform) ?? pid;\n const healthyAt = new Date().toISOString();\n return {\n url: effectiveUrl,\n pid,\n managed: true,\n healthy: true,\n lastCheckedAt: healthyAt,\n lastHealthyAt: healthyAt,\n logPath,\n manualCommand,\n auth: null,\n };\n }\n\n // Default: auth gateway mode — gateway on publicUrl, app-server on random upstream port\n const auth = await createManagedAppServerAuth({\n instanceId: options.instanceId,\n stateDir: options.stateDir,\n repoRoot: options.repoRoot,\n platform: options.platform,\n publicUrl: effectiveUrl,\n });\n const manualCommand = formatCodexAppServerCommand(\"codex\", auth.upstreamUrl);\n\n let pid: number | null;\n\n if (options.platform === \"win32\") {\n try {\n pid = startWindowsCodexAppServer(\n resolvedCommand,\n auth.upstreamUrl,\n options.repoRoot,\n logPath,\n );\n } catch (err) {\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Failed to spawn Codex app-server: ${err instanceof Error ? err.message : String(err)}\\nStart it manually:\\n ${manualCommand}`,\n { cause: err },\n );\n }\n } else {\n const logFd = fs.openSync(logPath, \"a\");\n\n try {\n const child = spawn(\n resolvedCommand,\n [\"app-server\", \"--listen\", auth.upstreamUrl],\n {\n cwd: options.repoRoot,\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: process.env,\n windowsHide: true,\n },\n );\n\n child.unref();\n pid = child.pid ?? null;\n } catch (err) {\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Failed to spawn Codex app-server: ${err instanceof Error ? err.message : String(err)}\\nStart it manually:\\n ${manualCommand}`,\n { cause: err },\n );\n } finally {\n fs.closeSync(logFd);\n }\n }\n\n if (pid == null) {\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Failed to spawn Codex app-server.\\nStart it manually:\\n ${manualCommand}`,\n );\n }\n\n const healthy = await waitForAppServerHealth(\n auth.upstreamUrl,\n APP_SERVER_START_TIMEOUT_MS,\n );\n\n if (!healthy) {\n await terminateProcess(pid, options.platform);\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Codex app-server did not become healthy at ${auth.upstreamUrl}.\\nCheck ${logPath}\\nOr start it manually:\\n ${manualCommand}`,\n );\n }\n\n const gatewayToken = readGatewayToken(auth);\n if (!gatewayToken) {\n await terminateProcess(pid, options.platform);\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\"Tap auth gateway token is missing after startup.\");\n }\n\n const gatewayHealthy = await waitForAppServerHealth(\n buildProtectedAppServerUrl(effectiveUrl, gatewayToken),\n APP_SERVER_GATEWAY_START_TIMEOUT_MS,\n );\n if (!gatewayHealthy) {\n await terminateProcess(pid, options.platform);\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Tap auth gateway did not become healthy at ${effectiveUrl}.\\nCheck ${auth.gatewayLogPath ?? \"the gateway log\"} and ${logPath}.`,\n );\n }\n\n const healthyAt = new Date().toISOString();\n pid = findListeningProcessId(auth.upstreamUrl, options.platform) ?? pid;\n return {\n url: effectiveUrl,\n pid,\n managed: true,\n healthy: true,\n lastCheckedAt: healthyAt,\n lastHealthyAt: healthyAt,\n logPath,\n manualCommand,\n auth,\n };\n}\n\nfunction pidFilePath(stateDir: string, instanceId: InstanceId): string {\n return path.join(stateDir, \"pids\", `bridge-${instanceId}.json`);\n}\n\nfunction logFilePath(stateDir: string, instanceId: InstanceId): string {\n return path.join(stateDir, \"logs\", `bridge-${instanceId}.log`);\n}\n\nfunction runtimeHeartbeatFilePath(runtimeStateDir: string): string {\n return path.join(runtimeStateDir, \"heartbeat.json\");\n}\n\nfunction loadRuntimeHeartbeatTimestamp(\n runtimeStateDir: string | null | undefined,\n): string | null {\n if (!runtimeStateDir) {\n return null;\n }\n\n const heartbeatPath = runtimeHeartbeatFilePath(runtimeStateDir);\n if (!fs.existsSync(heartbeatPath)) {\n return null;\n }\n\n try {\n const raw = fs.readFileSync(heartbeatPath, \"utf-8\");\n const parsed = JSON.parse(raw) as { updatedAt?: string };\n return typeof parsed.updatedAt === \"string\" ? parsed.updatedAt : null;\n } catch {\n return null;\n }\n}\n\nfunction resolveHeartbeatTimestamp(\n state: BridgeState | null | undefined,\n): string | null {\n return (\n loadRuntimeHeartbeatTimestamp(state?.runtimeStateDir) ??\n state?.lastHeartbeat ??\n null\n );\n}\n\nexport function loadBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n): BridgeState | null {\n const pidPath = pidFilePath(stateDir, instanceId);\n if (!fs.existsSync(pidPath)) return null;\n\n try {\n const raw = fs.readFileSync(pidPath, \"utf-8\");\n return JSON.parse(raw) as BridgeState;\n } catch {\n return null;\n }\n}\n\nexport function saveBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n state: BridgeState,\n): void {\n const pidPath = pidFilePath(stateDir, instanceId);\n const serializable = JSON.parse(JSON.stringify(state)) as BridgeState & {\n appServer?: { auth?: { token?: string } | null } | null;\n };\n if (serializable.appServer?.auth) {\n delete serializable.appServer.auth.token;\n }\n writeProtectedTextFile(pidPath, JSON.stringify(serializable, null, 2));\n}\n\nexport function clearBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n): void {\n const pidPath = pidFilePath(stateDir, instanceId);\n if (fs.existsSync(pidPath)) {\n fs.unlinkSync(pidPath);\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isBridgeRunning(\n stateDir: string,\n instanceId: InstanceId,\n): boolean {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return false;\n return isProcessAlive(state.pid);\n}\n\nexport async function startBridge(\n options: BridgeStartOptions,\n): Promise<BridgeState> {\n const {\n instanceId,\n runtime,\n stateDir,\n commsDir,\n bridgeScript,\n agentName,\n port,\n } = options;\n\n // Resolve agent name: explicit > env > error\n const resolvedAgent =\n agentName || process.env.TAP_AGENT_NAME || process.env.CODEX_TAP_AGENT_NAME;\n\n if (!resolvedAgent) {\n throw new Error(\n `No agent name for ${instanceId} bridge. ` +\n `Set TAP_AGENT_NAME env var or pass --agent-name flag.`,\n );\n }\n\n // Check if already running\n if (isBridgeRunning(stateDir, instanceId)) {\n const existing = loadBridgeState(stateDir, instanceId)!;\n throw new Error(\n `Bridge for ${instanceId} is already running (PID: ${existing.pid})`,\n );\n }\n\n const previousBridgeState = loadBridgeState(stateDir, instanceId);\n const previousAppServer = previousBridgeState?.appServer ?? null;\n\n // Clear stale PID\n clearBridgeState(stateDir, instanceId);\n\n const logPath = logFilePath(stateDir, instanceId);\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n\n // Log rotation: rename existing log to .prev\n rotateLog(logPath);\n\n let logFd: number | null = null;\n\n // Use explicit repoRoot (not derived from stateDir — stateDir may be external)\n const repoRoot = options.repoRoot ?? path.resolve(stateDir, \"..\");\n const runtimeStateDir = getBridgeRuntimeStateDir(repoRoot, instanceId);\n const resolved = resolveNodeRuntime(\n options.runtimeCommand ?? \"node\",\n repoRoot,\n );\n const command = resolved.command;\n\n // Build env with fnm Node prepended to PATH so the bridge runner's\n // 2nd-stage spawn also finds the correct Node (결 finding: 2-stage spawn)\n const runtimeEnv = buildRuntimeEnv(repoRoot);\n const effectiveAppServerUrl = resolveAppServerUrl(options.appServerUrl, port);\n let appServer: AppServerState | null = null;\n let bridgeAppServerUrl = effectiveAppServerUrl;\n\n if (runtime === \"codex\" && options.manageAppServer) {\n appServer = await ensureCodexAppServer({\n instanceId,\n stateDir,\n repoRoot,\n platform: options.platform,\n appServerUrl: effectiveAppServerUrl,\n existingAppServer: previousAppServer,\n noAuth: options.noAuth,\n });\n if (appServer.auth) {\n appServer = {\n ...appServer,\n auth: materializeGatewayTokenFile(\n stateDir,\n instanceId,\n effectiveAppServerUrl,\n appServer.auth,\n ),\n };\n }\n bridgeAppServerUrl = effectiveAppServerUrl;\n }\n\n // Spawn detached process — pass both command and strip-types metadata\n // so the runner doesn't re-guess (avoids bun + --experimental-strip-types)\n try {\n const bridgeEnv = {\n ...runtimeEnv,\n TAP_COMMS_DIR: commsDir,\n TAP_STATE_DIR: runtimeStateDir,\n TAP_BRIDGE_RUNTIME: runtime,\n TAP_BRIDGE_INSTANCE_ID: instanceId,\n TAP_AGENT_ID: instanceId,\n TAP_AGENT_NAME: resolvedAgent,\n CODEX_TAP_AGENT_NAME: resolvedAgent,\n TAP_RESOLVED_NODE: resolved.command,\n TAP_STRIP_TYPES: resolved.supportsStripTypes ? \"1\" : \"0\",\n ...(bridgeAppServerUrl\n ? { CODEX_APP_SERVER_URL: bridgeAppServerUrl }\n : {}),\n ...(appServer?.auth?.tokenPath\n ? { TAP_GATEWAY_TOKEN_FILE: appServer.auth.tokenPath }\n : {}),\n ...(port != null ? { TAP_BRIDGE_PORT: String(port) } : {}),\n ...(options.headless?.enabled\n ? {\n TAP_HEADLESS: \"true\",\n TAP_AGENT_ROLE: options.headless.role,\n TAP_MAX_REVIEW_ROUNDS: String(options.headless.maxRounds),\n TAP_QUALITY_FLOOR: options.headless.qualitySeverityFloor,\n }\n : {}),\n ...(options.busyMode ? { TAP_BUSY_MODE: options.busyMode } : {}),\n ...(options.pollSeconds != null\n ? { TAP_POLL_SECONDS: String(options.pollSeconds) }\n : {}),\n ...(options.reconnectSeconds != null\n ? { TAP_RECONNECT_SECONDS: String(options.reconnectSeconds) }\n : {}),\n ...(options.messageLookbackMinutes != null\n ? {\n TAP_MESSAGE_LOOKBACK_MINUTES: String(\n options.messageLookbackMinutes,\n ),\n }\n : {}),\n ...(options.threadId ? { TAP_THREAD_ID: options.threadId } : {}),\n ...(options.ephemeral ? { TAP_EPHEMERAL: \"true\" } : {}),\n ...(options.processExistingMessages\n ? { TAP_PROCESS_EXISTING: \"true\" }\n : {}),\n };\n\n let bridgePid: number | null = null;\n\n if (options.platform === \"win32\") {\n bridgePid = startWindowsDetachedProcess(\n command,\n [bridgeScript],\n repoRoot,\n logPath,\n bridgeEnv,\n );\n } else {\n logFd = fs.openSync(logPath, \"a\");\n const child = spawn(command, [bridgeScript], {\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: bridgeEnv,\n windowsHide: true,\n });\n\n child.unref();\n bridgePid = child.pid ?? null;\n }\n\n if (logFd != null) {\n fs.closeSync(logFd);\n logFd = null;\n }\n\n if (!bridgePid) {\n throw new Error(`Failed to spawn bridge process for ${instanceId}`);\n }\n\n const state: BridgeState = {\n pid: bridgePid,\n statePath: pidFilePath(stateDir, instanceId),\n lastHeartbeat: new Date().toISOString(),\n appServer,\n runtimeStateDir,\n };\n\n saveBridgeState(stateDir, instanceId, state);\n\n // NOTE: Heartbeat updates are the bridge process's responsibility.\n // The bridge script should periodically write to the PID file's lastHeartbeat field.\n // CLI only records the initial heartbeat at spawn time.\n\n return state;\n } catch (err) {\n if (logFd != null) {\n try {\n fs.closeSync(logFd);\n } catch {\n // Best-effort cleanup only.\n }\n }\n if (appServer?.managed) {\n await stopManagedAppServer(appServer, options.platform);\n }\n throw err;\n }\n}\n\nexport async function stopBridge(options: BridgeStopOptions): Promise<boolean> {\n const { instanceId, stateDir, platform } = options;\n const state = loadBridgeState(stateDir, instanceId);\n\n if (!state) {\n return false; // No PID file\n }\n\n if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return false; // Already dead\n }\n\n try {\n await terminateProcess(state.pid, platform);\n } catch {\n // Process may have already exited\n }\n\n clearBridgeState(stateDir, instanceId);\n return true;\n}\n\n// ─── Log rotation ──────────────────────────────────────────────\n\nexport function rotateLog(logPath: string): void {\n if (!fs.existsSync(logPath)) return;\n try {\n const stats = fs.statSync(logPath);\n if (stats.size === 0) return;\n const prevPath = `${logPath}.prev`;\n fs.renameSync(logPath, prevPath);\n } catch {\n // Best-effort: don't fail bridge start if rotation fails\n }\n}\n\n// ─── Heartbeat ─────────────────────────────────────────────────\n\n/**\n * Update the heartbeat timestamp for a running bridge.\n * Bridge processes should call this periodically.\n *\n * Only the owning process (matching PID) can update the heartbeat.\n * This prevents state dir collision when multiple writers exist.\n * See: 묵 finding — bridge-heartbeat-state-dir-collision\n */\nexport function updateBridgeHeartbeat(\n stateDir: string,\n instanceId: InstanceId,\n): void {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return;\n\n // Guard: only the owning process may update heartbeat\n if (state.pid !== process.pid) return;\n\n state.lastHeartbeat = new Date().toISOString();\n saveBridgeState(stateDir, instanceId, state);\n}\n\n/**\n * Get heartbeat age in seconds. Returns null if no state or no heartbeat.\n */\nexport function getHeartbeatAge(\n stateDir: string,\n instanceId: InstanceId,\n): number | null {\n const state = loadBridgeState(stateDir, instanceId);\n const heartbeat = resolveHeartbeatTimestamp(state);\n if (!heartbeat) return null;\n const heartbeatTime = new Date(heartbeat).getTime();\n if (isNaN(heartbeatTime)) return null;\n return Math.floor((Date.now() - heartbeatTime) / 1000);\n}\n\nexport function getBridgeHeartbeatTimestamp(\n stateDir: string,\n instanceId: InstanceId,\n): string | null {\n return resolveHeartbeatTimestamp(loadBridgeState(stateDir, instanceId));\n}\n\nexport function getBridgeStatus(\n stateDir: string,\n instanceId: InstanceId,\n): \"running\" | \"stopped\" | \"stale\" {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return \"stopped\";\n\n // Primary check: is the process actually alive?\n if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return \"stale\";\n }\n\n // Process is alive → running.\n // Heartbeat staleness is informational only — the bridge process\n // is responsible for updating lastHeartbeat. If it doesn't,\n // PID alive is still the authoritative signal.\n return \"running\";\n}\n","/**\n * Dashboard data collection engine.\n * Aggregates: agents (comms presence), bridges (state + PID), PRs (gh CLI).\n *\n * Ref: tap public repo tap-ops-dashboard.ps1 (single-agent view)\n * M74 extends to control-tower view (all agents, all bridges, all PRs).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { resolveConfig } from \"../config/index.js\";\nimport {\n loadBridgeState,\n getBridgeStatus,\n getHeartbeatAge,\n isProcessAlive,\n} from \"./bridge.js\";\nimport type { InstanceId } from \"../types.js\";\nimport { loadState } from \"../state.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport interface AgentInfo {\n name: string;\n status: string | null;\n lastActivity: string | null;\n joinedAt: string | null;\n}\n\nexport interface BridgeInfo {\n instanceId: string;\n runtime: string;\n status: \"running\" | \"stopped\" | \"stale\";\n pid: number | null;\n port: number | null;\n heartbeatAge: number | null;\n headless: boolean;\n}\n\nexport interface PRInfo {\n number: number;\n title: string;\n author: string;\n state: string;\n url: string;\n}\n\nexport interface DashboardWarning {\n level: \"warn\" | \"error\";\n message: string;\n}\n\nexport interface DashboardSnapshot {\n generatedAt: string;\n repoRoot: string;\n commsDir: string;\n agents: AgentInfo[];\n bridges: BridgeInfo[];\n prs: PRInfo[];\n warnings: DashboardWarning[];\n}\n\n// ─── Agent collection ──────────────────────────────────────────\n\nfunction collectAgents(commsDir: string): AgentInfo[] {\n // Read heartbeats.json (written by tap-comms MCP server)\n const heartbeatsPath = path.join(commsDir, \"heartbeats.json\");\n if (!fs.existsSync(heartbeatsPath)) return [];\n\n try {\n const raw = fs.readFileSync(heartbeatsPath, \"utf-8\");\n const data = JSON.parse(raw) as Record<\n string,\n {\n agent?: string;\n timestamp?: string;\n lastActivity?: string;\n status?: string;\n joinedAt?: string;\n }\n >;\n\n return Object.entries(data).map(([name, info]) => ({\n name: info.agent ?? name,\n status: info.status ?? null,\n lastActivity: info.lastActivity ?? info.timestamp ?? null,\n joinedAt: info.joinedAt ?? null,\n }));\n } catch {\n return [];\n }\n}\n\n// ─── Bridge collection ─────────────────────────────────────────\n\nfunction collectBridges(repoRoot: string): BridgeInfo[] {\n const state = loadState(repoRoot);\n const { config } = resolveConfig({}, repoRoot);\n const stateDir = config.stateDir;\n const bridges: BridgeInfo[] = [];\n\n // Collect from state.json instances (if initialized)\n if (state) {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (!inst?.installed) continue;\n if (inst.bridgeMode !== \"app-server\") continue;\n\n const instanceId = id as InstanceId;\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n\n bridges.push({\n instanceId: id,\n runtime: inst.runtime,\n status,\n pid: bridgeState?.pid ?? null,\n port: inst.port ?? null,\n heartbeatAge: age,\n headless: inst.headless?.enabled ?? false,\n });\n }\n }\n\n // Also scan .tmp/ for daemon state dirs (catches externally-launched bridges)\n const tmpDir = path.join(repoRoot, \".tmp\");\n if (fs.existsSync(tmpDir)) {\n try {\n const dirs = fs\n .readdirSync(tmpDir)\n .filter((d) => d.startsWith(\"codex-app-server-bridge\"));\n\n for (const dir of dirs) {\n const daemonPath = path.join(tmpDir, dir, \"bridge-daemon.json\");\n if (!fs.existsSync(daemonPath)) continue;\n\n try {\n const raw = fs.readFileSync(daemonPath, \"utf-8\");\n const daemon = JSON.parse(raw) as {\n pid?: number;\n startedAt?: string;\n appServerUrl?: string;\n };\n\n // Skip if already covered by state.json instances\n const alreadyCovered = bridges.some(\n (b) => b.pid === daemon.pid && b.pid !== null,\n );\n if (alreadyCovered) continue;\n\n const agentFile = path.join(tmpDir, dir, \"agent-name.txt\");\n const agentName = fs.existsSync(agentFile)\n ? fs.readFileSync(agentFile, \"utf-8\").trim()\n : dir;\n\n const running = daemon.pid ? isProcessAlive(daemon.pid) : false;\n const portMatch = daemon.appServerUrl?.match(/:(\\d+)/);\n const port = portMatch ? parseInt(portMatch[1], 10) : null;\n\n bridges.push({\n instanceId: agentName,\n runtime: \"codex\",\n status: running ? \"running\" : \"stale\",\n pid: daemon.pid ?? null,\n port,\n heartbeatAge: null,\n headless: false,\n });\n } catch {\n // Skip corrupted daemon files\n }\n }\n } catch {\n // .tmp/ read failed\n }\n }\n\n return bridges;\n}\n\n// ─── PR collection ─────────────────────────────────────────────\n\nfunction collectPRs(): PRInfo[] {\n try {\n const output = execSync(\n \"gh pr list --state all --limit 10 --json number,title,author,state,url\",\n { encoding: \"utf-8\", timeout: 10000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n );\n\n const prs = JSON.parse(output) as Array<{\n number: number;\n title: string;\n author: { login: string };\n state: string;\n url: string;\n }>;\n\n return prs.map((pr) => ({\n number: pr.number,\n title: pr.title,\n author: pr.author.login,\n state: pr.state,\n url: pr.url,\n }));\n } catch {\n return [];\n }\n}\n\n// ─── Warnings ──────────────────────────────────────────────────\n\nfunction collectWarnings(\n bridges: BridgeInfo[],\n agents: AgentInfo[],\n): DashboardWarning[] {\n const warnings: DashboardWarning[] = [];\n\n for (const bridge of bridges) {\n if (bridge.status === \"stale\") {\n warnings.push({\n level: \"warn\",\n message: `Bridge ${bridge.instanceId} is stale (PID ${bridge.pid} dead)`,\n });\n }\n if (\n bridge.status === \"running\" &&\n bridge.heartbeatAge !== null &&\n bridge.heartbeatAge > 60\n ) {\n warnings.push({\n level: \"warn\",\n message: `Bridge ${bridge.instanceId} heartbeat stale (${bridge.heartbeatAge}s ago)`,\n });\n }\n }\n\n if (bridges.length === 0) {\n warnings.push({\n level: \"warn\",\n message: \"No bridges configured\",\n });\n }\n\n if (agents.length === 0) {\n warnings.push({\n level: \"warn\",\n message: \"No agent heartbeats found\",\n });\n }\n\n return warnings;\n}\n\n// ─── Snapshot ──────────────────────────────────────────────────\n\nexport function collectDashboardSnapshot(\n repoRoot?: string,\n commsDirOverride?: string,\n): DashboardSnapshot {\n const { config } = resolveConfig(\n commsDirOverride ? { commsDir: commsDirOverride } : {},\n repoRoot,\n );\n const resolved = config;\n\n const agents = collectAgents(resolved.commsDir);\n const bridges = collectBridges(resolved.repoRoot);\n const prs = collectPRs();\n const warnings = collectWarnings(bridges, agents);\n\n return {\n generatedAt: new Date().toISOString(),\n repoRoot: resolved.repoRoot,\n commsDir: resolved.commsDir,\n agents,\n bridges,\n prs,\n warnings,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { fileHash, backupFile, ensureBackupDir } from \"../state.js\";\nimport { buildManagedMcpServerSpec } from \"./common.js\";\nimport type {\n RuntimeAdapter,\n AdapterContext,\n ProbeResult,\n PatchPlan,\n ApplyResult,\n VerifyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n VerifyCheck,\n} from \"../types.js\";\n\nconst MCP_SERVER_KEY = \"tap-comms\";\n\nfunction findMcpJsonPath(ctx: AdapterContext): string {\n return path.join(ctx.repoRoot, \".mcp.json\");\n}\n\nfunction findClaudeCommand(): string | null {\n try {\n execSync(\"claude --version\", { stdio: \"pipe\" });\n return \"claude\";\n } catch {\n return null;\n }\n}\n\nfunction buildMcpServerEntry(\n ctx: AdapterContext,\n): Record<string, unknown> | null {\n const managed = buildManagedMcpServerSpec(ctx, ctx.instanceId);\n if (!managed.command) return null;\n\n return {\n type: \"stdio\",\n command: managed.command,\n args: managed.args,\n env: managed.env,\n };\n}\n\nexport const claudeAdapter: RuntimeAdapter = {\n runtime: \"claude\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n\n const configPath = findMcpJsonPath(ctx);\n const configExists = fs.existsSync(configPath);\n const runtimeCommand = findClaudeCommand();\n const canWrite = configExists\n ? (() => {\n try {\n fs.accessSync(configPath, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n })()\n : true; // Can create new file\n\n if (!runtimeCommand) {\n warnings.push(\n \"Claude CLI not found in PATH. Config will be created but may need manual setup.\",\n );\n }\n\n const managed = buildManagedMcpServerSpec(ctx);\n warnings.push(...managed.warnings);\n issues.push(...managed.issues);\n\n // Check if comms dir exists\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(\n `Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`,\n );\n }\n\n return {\n installed: true, // Claude adapter always \"installed\" — .mcp.json is per-project\n configPath,\n configExists,\n runtimeCommand,\n version: null,\n canWrite,\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? findMcpJsonPath(ctx);\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts: OwnedArtifact[] = [];\n\n // Check for existing tap-comms entry\n if (probe.configExists) {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n try {\n const config = JSON.parse(raw);\n if (config.mcpServers?.[MCP_SERVER_KEY]) {\n conflicts.push(\n `Existing \"${MCP_SERVER_KEY}\" entry in .mcp.json will be overwritten.`,\n );\n }\n } catch {\n warnings.push(\n \".mcp.json exists but is not valid JSON. Will be overwritten.\",\n );\n }\n }\n\n const serverEntry = buildMcpServerEntry(ctx);\n\n if (!serverEntry) {\n warnings.push(\n \"tap-comms MCP server entry not found. Skipping .mcp.json patch. \" +\n \"Reinstall @hua-labs/tap or run from a repo with packages/tap-plugin/channels/ available.\",\n );\n return {\n runtime: \"claude\",\n operations: [],\n ownedArtifacts: [],\n backupDir: ensureBackupDir(ctx.stateDir, \"claude\"),\n restartRequired: false,\n conflicts,\n warnings,\n };\n }\n\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: `mcpServers.${MCP_SERVER_KEY}`,\n value: serverEntry,\n });\n\n ownedArtifacts.push({\n kind: \"json-path\",\n path: configPath,\n selector: `mcpServers.${MCP_SERVER_KEY}`,\n });\n\n const backupDir = ensureBackupDir(ctx.stateDir, \"claude\");\n\n return {\n runtime: \"claude\",\n operations,\n ownedArtifacts,\n backupDir,\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(_ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const changedFiles: string[] = [];\n const warnings: string[] = [];\n let appliedOps = 0;\n\n for (const op of plan.operations) {\n try {\n if (op.type === \"set\" || op.type === \"merge\") {\n // Read or create .mcp.json\n let config: Record<string, unknown> = {};\n if (fs.existsSync(op.path)) {\n // Backup first\n backupFile(op.path, plan.backupDir);\n const raw = fs.readFileSync(op.path, \"utf-8\");\n try {\n config = JSON.parse(raw);\n } catch {\n // Invalid JSON, start fresh but backup the original\n warnings.push(\n `${op.path} was invalid JSON. Created backup and starting fresh.`,\n );\n }\n }\n\n // Set nested key\n if (op.key) {\n setNestedKey(config, op.key, op.value);\n }\n\n // Write atomically\n const tmp = `${op.path}.tmp.${process.pid}`;\n fs.writeFileSync(\n tmp,\n JSON.stringify(config, null, 2) + \"\\n\",\n \"utf-8\",\n );\n fs.renameSync(tmp, op.path);\n changedFiles.push(op.path);\n appliedOps++;\n }\n } catch (err) {\n warnings.push(\n `Failed to apply op on ${op.path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const lastAppliedHash =\n changedFiles.length > 0 ? fileHash(changedFiles[0]) : \"\";\n\n return {\n success: appliedOps > 0,\n appliedOps,\n backupCreated: true,\n lastAppliedHash,\n ownedArtifacts: plan.ownedArtifacts,\n changedFiles,\n restartRequired: plan.restartRequired,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const checks: VerifyCheck[] = [];\n const warnings: string[] = [];\n\n // 1. Config file exists\n const configPath = plan.operations[0]?.path;\n if (configPath) {\n checks.push({\n name: \"Config file exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath)\n ? undefined\n : `${configPath} not found`,\n });\n\n // 2. Config is valid JSON\n if (fs.existsSync(configPath)) {\n try {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(raw);\n checks.push({ name: \"Config is valid JSON\", passed: true });\n\n // 3. Managed entry present\n const entry = config.mcpServers?.[MCP_SERVER_KEY];\n checks.push({\n name: \"tap-comms entry present\",\n passed: !!entry,\n message: entry\n ? undefined\n : `mcpServers.${MCP_SERVER_KEY} not found`,\n });\n\n // 4. Entry has correct env\n if (entry) {\n const hasCommsDir =\n normalizeTapCommsDir(entry.env?.TAP_COMMS_DIR) ===\n normalizeTapCommsDir(ctx.commsDir);\n checks.push({\n name: \"TAP_COMMS_DIR configured\",\n passed: hasCommsDir,\n message: hasCommsDir ? undefined : `Expected ${ctx.commsDir}`,\n });\n }\n } catch {\n checks.push({\n name: \"Config is valid JSON\",\n passed: false,\n message: \"Parse error\",\n });\n }\n }\n }\n\n // 5. Comms dir exists\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir)\n ? undefined\n : `${ctx.commsDir} not found`,\n });\n\n // 6. Runtime command found\n const cmd = findClaudeCommand();\n checks.push({\n name: \"Claude CLI found\",\n passed: !!cmd,\n message: cmd ? undefined : \"claude not in PATH (non-blocking)\",\n });\n if (!cmd) {\n warnings.push(\n \"Claude CLI not in PATH. Config is ready but cannot verify runtime reads it.\",\n );\n }\n\n const ok = checks\n .filter((c) => c.name !== \"Claude CLI found\")\n .every((c) => c.passed);\n\n return { ok, checks, restartRequired: true, warnings };\n },\n\n bridgeMode(): BridgeMode {\n return \"native-push\";\n },\n};\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nfunction setNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown,\n): void {\n const keys = keyPath.split(\".\");\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n\nfunction normalizeTapCommsDir(value: unknown): string {\n return typeof value === \"string\"\n ? path.resolve(value).replace(/\\\\/g, \"/\")\n : \"\";\n}\n","import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ArtifactKind } from \"./types.js\";\n\ntype BackupPayload =\n | {\n kind: \"json-path\";\n selector: string;\n existed: boolean;\n value?: unknown;\n }\n | {\n kind: \"toml-table\";\n selector: string;\n existed: boolean;\n content?: string;\n }\n | {\n kind: \"file\";\n selector: string;\n existed: boolean;\n };\n\nfunction selectorHash(selector: string): string {\n return crypto.createHash(\"sha256\").update(selector).digest(\"hex\").slice(0, 12);\n}\n\nexport function artifactBackupPath(\n backupDir: string,\n kind: ArtifactKind,\n selector: string,\n): string {\n const safeKind = kind.replace(/[^a-z-]/gi, \"-\");\n return path.join(backupDir, `${safeKind}-${selectorHash(selector)}.json`);\n}\n\nexport function writeArtifactBackup(\n backupPath: string,\n payload: BackupPayload,\n): void {\n fs.mkdirSync(path.dirname(backupPath), { recursive: true });\n const tmp = `${backupPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(payload, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, backupPath);\n}\n\nexport function readArtifactBackup(backupPath: string): BackupPayload | null {\n if (!fs.existsSync(backupPath)) return null;\n\n try {\n const raw = fs.readFileSync(backupPath, \"utf-8\");\n return JSON.parse(raw) as BackupPayload;\n } catch {\n return null;\n }\n}\n","function splitLines(content: string): string[] {\n return content.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n}\n\nfunction tableHeader(selector: string): string {\n return `[${selector}]`;\n}\n\nfunction findTableRange(\n lines: string[],\n selector: string,\n): { start: number; end: number } | null {\n const header = tableHeader(selector);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].trim() !== header) continue;\n\n let end = lines.length;\n for (let j = i + 1; j < lines.length; j++) {\n const trimmed = lines[j].trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n end = j;\n break;\n }\n }\n return { start: i, end };\n }\n return null;\n}\n\nfunction escapeBasicString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction renderValue(value: string | string[]): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => `\"${escapeBasicString(item)}\"`).join(\", \")}]`;\n }\n return `\"${escapeBasicString(value)}\"`;\n}\n\nexport function extractTomlTable(\n content: string,\n selector: string,\n): string | null {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n if (!range) return null;\n return `${lines.slice(range.start, range.end).join(\"\\n\")}\\n`;\n}\n\nexport function removeTomlTable(content: string, selector: string): string {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n if (!range) return content;\n\n const next = [...lines.slice(0, range.start), ...lines.slice(range.end)];\n return `${trimTomlDocument(next.join(\"\\n\"))}\\n`;\n}\n\nexport function replaceTomlTable(\n content: string,\n selector: string,\n replacement: string,\n): string {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n const replacementLines = replacement.replace(/\\r\\n/g, \"\\n\").trimEnd().split(\"\\n\");\n\n if (!range) {\n const doc = trimTomlDocument(content);\n if (!doc) return `${replacement.trimEnd()}\\n`;\n return `${doc}\\n\\n${replacement.trimEnd()}\\n`;\n }\n\n const next = [\n ...lines.slice(0, range.start),\n ...replacementLines,\n ...lines.slice(range.end),\n ];\n return `${trimTomlDocument(next.join(\"\\n\"))}\\n`;\n}\n\nexport function renderTomlTable(\n selector: string,\n entries: Record<string, string | string[]>,\n existingContent?: string | null,\n): string {\n const preserved = parseTomlAssignments(existingContent ?? \"\");\n const merged: Record<string, string | string[]> = { ...preserved, ...entries };\n\n const lines = [tableHeader(selector)];\n for (const [key, value] of Object.entries(merged)) {\n lines.push(`${key} = ${renderValue(value)}`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function parseTomlAssignments(\n tableContent: string,\n): Record<string, string | string[]> {\n const lines = splitLines(tableContent);\n const values: Record<string, string | string[]> = {};\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\") || (line.startsWith(\"[\") && line.endsWith(\"]\"))) {\n continue;\n }\n\n const match = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*(.+)$/);\n if (!match) continue;\n\n const [, key, rawValue] = match;\n const value = rawValue.trim();\n\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const items = value\n .slice(1, -1)\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean)\n .map(unquoteTomlString);\n values[key] = items;\n continue;\n }\n\n values[key] = unquoteTomlString(value);\n }\n\n return values;\n}\n\nexport function trimTomlDocument(content: string): string {\n return content.replace(/\\s+$/g, \"\").replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\nfunction unquoteTomlString(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n const inner = value.slice(1, -1);\n return value.startsWith('\"')\n ? inner.replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\")\n : inner;\n }\n return value;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { backupFile, ensureBackupDir, fileHash } from \"../state.js\";\nimport {\n artifactBackupPath,\n writeArtifactBackup,\n} from \"../artifact-backups.js\";\nimport {\n extractTomlTable,\n renderTomlTable,\n replaceTomlTable,\n} from \"../toml.js\";\nimport type {\n AdapterContext,\n ApplyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n PatchPlan,\n ProbeResult,\n RuntimeAdapter,\n VerifyCheck,\n VerifyResult,\n} from \"../types.js\";\nimport {\n buildManagedMcpServerSpec,\n canWriteOrCreate,\n getHomeDir,\n probeCommand,\n} from \"./common.js\";\n\nconst MCP_SELECTOR = \"mcp_servers.tap-comms\";\nconst ENV_SELECTOR = \"mcp_servers.tap-comms.env\";\n\nfunction findCodexConfigPath(): string {\n return path.join(getHomeDir(), \".codex\", \"config.toml\");\n}\n\nfunction canonicalizeTrustPath(targetPath: string): string {\n let resolved = path.resolve(targetPath).replace(/\\//g, \"\\\\\");\n const driveRoot = /^[A-Za-z]:\\\\$/;\n if (!driveRoot.test(resolved)) {\n resolved = resolved.replace(/\\\\+$/g, \"\");\n }\n return resolved.startsWith(\"\\\\\\\\?\\\\\") ? resolved : `\\\\\\\\?\\\\${resolved}`;\n}\n\nfunction trustSelector(targetPath: string): string {\n return `projects.'${canonicalizeTrustPath(targetPath)}'`;\n}\n\nfunction getTrustTargets(ctx: AdapterContext): string[] {\n const targets = [ctx.repoRoot, process.cwd()];\n return [...new Set(targets.map((value) => path.resolve(value)))];\n}\n\nfunction buildManagedArtifacts(\n configPath: string,\n ctx: AdapterContext,\n): OwnedArtifact[] {\n const artifacts: OwnedArtifact[] = [\n { kind: \"toml-table\", path: configPath, selector: MCP_SELECTOR },\n { kind: \"toml-table\", path: configPath, selector: ENV_SELECTOR },\n ];\n\n for (const target of getTrustTargets(ctx)) {\n artifacts.push({\n kind: \"toml-table\",\n path: configPath,\n selector: trustSelector(target),\n });\n }\n\n return artifacts;\n}\n\nfunction readConfigOrEmpty(configPath: string): string {\n if (!fs.existsSync(configPath)) return \"\";\n return fs.readFileSync(configPath, \"utf-8\");\n}\n\nfunction writeTomlFile(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, content, \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\nfunction verifyManagedToml(\n content: string,\n ctx: AdapterContext,\n configPath: string,\n): VerifyCheck[] {\n const checks: VerifyCheck[] = [];\n const managed = buildManagedMcpServerSpec(ctx);\n const mainTable = extractTomlTable(content, MCP_SELECTOR);\n const envTable = extractTomlTable(content, ENV_SELECTOR);\n\n checks.push({\n name: \"Codex config exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath) ? undefined : `${configPath} not found`,\n });\n checks.push({\n name: \"tap-comms MCP table present\",\n passed: !!mainTable,\n message: mainTable ? undefined : `${MCP_SELECTOR} not found`,\n });\n checks.push({\n name: \"tap-comms env table present\",\n passed: !!envTable,\n message: envTable ? undefined : `${ENV_SELECTOR} not found`,\n });\n\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n const trustTable = extractTomlTable(content, selector);\n checks.push({\n name: `Trust table present: ${canonicalizeTrustPath(target)}`,\n passed: !!trustTable && trustTable.includes('trust_level = \"trusted\"'),\n message:\n trustTable && trustTable.includes('trust_level = \"trusted\"')\n ? undefined\n : `${selector} missing trust_level = \"trusted\"`,\n });\n }\n\n if (mainTable && managed.command) {\n checks.push({\n name: \"Managed command configured\",\n passed:\n mainTable.includes(\n `command = \"${managed.command.replace(/\\\\/g, \"\\\\\\\\\")}\"`,\n ) &&\n mainTable.includes(\n `args = [\"${managed.args[0]?.replace(/\\\\/g, \"\\\\\\\\\") ?? \"\"}\"]`,\n ),\n message: \"Managed tap-comms command/args do not match expected values\",\n });\n }\n\n return checks;\n}\n\nexport const codexAdapter: RuntimeAdapter = {\n runtime: \"codex\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n const configPath = findCodexConfigPath();\n const configExists = fs.existsSync(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"codex\", \"codex.cmd\"] : [\"codex\"],\n );\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Codex CLI not found in PATH. Config can still be written, but runtime verification will be limited.\",\n );\n }\n\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(\n `Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`,\n );\n }\n\n const managed = buildManagedMcpServerSpec(ctx);\n warnings.push(...managed.warnings);\n issues.push(...managed.issues);\n\n return {\n installed: true,\n configPath,\n configExists,\n runtimeCommand: runtimeProbe.command,\n version: runtimeProbe.version,\n canWrite: canWriteOrCreate(configPath),\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? findCodexConfigPath();\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts = buildManagedArtifacts(configPath, ctx);\n\n if (probe.configExists) {\n const content = readConfigOrEmpty(configPath);\n if (extractTomlTable(content, MCP_SELECTOR)) {\n conflicts.push(`Existing ${MCP_SELECTOR} table will be updated.`);\n }\n if (extractTomlTable(content, ENV_SELECTOR)) {\n conflicts.push(`Existing ${ENV_SELECTOR} table will be updated.`);\n }\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n if (extractTomlTable(content, selector)) {\n conflicts.push(`Existing ${selector} table will be updated.`);\n }\n }\n }\n\n for (const artifact of ownedArtifacts) {\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: artifact.selector,\n });\n }\n\n return {\n runtime: \"codex\",\n operations,\n ownedArtifacts,\n backupDir: ensureBackupDir(ctx.stateDir, \"codex\"),\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const configPath = plan.operations[0]?.path ?? findCodexConfigPath();\n const warnings: string[] = [];\n const changedFiles: string[] = [];\n const managed = buildManagedMcpServerSpec(ctx, ctx.instanceId);\n\n warnings.push(...managed.warnings);\n if (managed.issues.length > 0 || !managed.command) {\n return {\n success: false,\n appliedOps: 0,\n backupCreated: false,\n lastAppliedHash: \"\",\n ownedArtifacts: [],\n changedFiles,\n restartRequired: false,\n warnings: [...managed.warnings, ...managed.issues],\n };\n }\n\n const existingContent = readConfigOrEmpty(configPath);\n if (fs.existsSync(configPath) && existingContent) {\n backupFile(configPath, plan.backupDir);\n }\n\n const artifactsWithBackups = plan.ownedArtifacts.map((artifact) => {\n const previousContent =\n artifact.kind === \"toml-table\"\n ? extractTomlTable(existingContent, artifact.selector)\n : null;\n const backupPath = artifactBackupPath(\n plan.backupDir,\n artifact.kind,\n artifact.selector,\n );\n\n writeArtifactBackup(backupPath, {\n kind: \"toml-table\",\n selector: artifact.selector,\n existed: previousContent !== null,\n content: previousContent ?? undefined,\n });\n\n return { ...artifact, backupPath };\n });\n\n let nextContent = existingContent;\n nextContent = replaceTomlTable(\n nextContent,\n MCP_SELECTOR,\n renderTomlTable(\n MCP_SELECTOR,\n {\n command: managed.command,\n args: managed.args,\n },\n extractTomlTable(existingContent, MCP_SELECTOR),\n ),\n );\n nextContent = replaceTomlTable(\n nextContent,\n ENV_SELECTOR,\n renderTomlTable(\n ENV_SELECTOR,\n managed.env,\n extractTomlTable(existingContent, ENV_SELECTOR),\n ),\n );\n\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n nextContent = replaceTomlTable(\n nextContent,\n selector,\n renderTomlTable(\n selector,\n { trust_level: \"trusted\" },\n extractTomlTable(existingContent, selector),\n ),\n );\n }\n\n writeTomlFile(configPath, nextContent);\n changedFiles.push(configPath);\n\n return {\n success: true,\n appliedOps: plan.operations.length,\n backupCreated: true,\n lastAppliedHash: fileHash(configPath),\n ownedArtifacts: artifactsWithBackups,\n changedFiles,\n restartRequired: true,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const warnings: string[] = [];\n const configPath = plan.operations[0]?.path ?? findCodexConfigPath();\n const content = readConfigOrEmpty(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"codex\", \"codex.cmd\"] : [\"codex\"],\n );\n\n const checks = verifyManagedToml(content, ctx, configPath);\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir)\n ? undefined\n : `${ctx.commsDir} not found`,\n });\n checks.push({\n name: \"Codex CLI found\",\n passed: !!runtimeProbe.command,\n message: runtimeProbe.command\n ? undefined\n : \"codex not in PATH (non-blocking)\",\n });\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Codex CLI not in PATH. Config is written, but runtime verification is partial.\",\n );\n }\n\n return {\n ok: checks\n .filter((check) => check.name !== \"Codex CLI found\")\n .every((check) => check.passed),\n checks,\n restartRequired: true,\n warnings,\n };\n },\n\n bridgeMode(): BridgeMode {\n return \"app-server\";\n },\n\n resolveBridgeScript(ctx: AdapterContext): string | null {\n const distDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n // 1. Relative to bundled CLI (npm install / npx)\n path.join(distDir, \"bridges\", \"codex-bridge-runner.mjs\"),\n // 2. Monorepo development — dist inside repo\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-comms\",\n \"dist\",\n \"bridges\",\n \"codex-bridge-runner.mjs\",\n ),\n // 3. Source file — dev mode with strip-types\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-comms\",\n \"src\",\n \"bridges\",\n \"codex-bridge-runner.ts\",\n ),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n },\n};\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { backupFile, ensureBackupDir, fileHash } from \"../state.js\";\nimport {\n artifactBackupPath,\n writeArtifactBackup,\n} from \"../artifact-backups.js\";\nimport type {\n AdapterContext,\n ApplyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n PatchPlan,\n ProbeResult,\n RuntimeAdapter,\n VerifyCheck,\n VerifyResult,\n} from \"../types.js\";\nimport {\n buildManagedMcpServerSpec,\n canWriteOrCreate,\n getHomeDir,\n probeCommand,\n} from \"./common.js\";\n\nconst GEMINI_SELECTOR = \"mcpServers.tap-comms\";\n\nfunction candidateConfigPaths(ctx: AdapterContext): string[] {\n const home = getHomeDir();\n return [\n path.join(ctx.repoRoot, \".gemini\", \"settings.json\"),\n path.join(home, \".gemini\", \"settings.json\"),\n path.join(home, \".gemini\", \"antigravity\", \"mcp_config.json\"),\n ];\n}\n\nfunction chooseGeminiConfigPath(ctx: AdapterContext): string {\n const [workspaceConfig, homeConfig, antigravityConfig] =\n candidateConfigPaths(ctx);\n\n if (fs.existsSync(workspaceConfig)) return workspaceConfig;\n if (fs.existsSync(homeConfig)) return homeConfig;\n\n if (fs.existsSync(antigravityConfig)) {\n const raw = fs.readFileSync(antigravityConfig, \"utf-8\").trim();\n if (raw) {\n try {\n JSON.parse(raw);\n return antigravityConfig;\n } catch {\n // Fall through to workspace-managed config.\n }\n }\n }\n\n return workspaceConfig;\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, \"utf-8\").trim();\n if (!raw) return {};\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\nfunction setNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown,\n): void {\n const keys = keyPath.split(\".\");\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n\nfunction readNestedKey(obj: Record<string, unknown>, keyPath: string): unknown {\n let current: unknown = obj;\n for (const key of keyPath.split(\".\")) {\n if (typeof current !== \"object\" || current === null || !(key in current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\nfunction verifyGeminiConfig(\n config: Record<string, unknown>,\n configPath: string,\n ctx: AdapterContext,\n): VerifyCheck[] {\n const checks: VerifyCheck[] = [];\n const entry = readNestedKey(config, GEMINI_SELECTOR) as\n | Record<string, unknown>\n | undefined;\n\n checks.push({\n name: \"Gemini config exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath) ? undefined : `${configPath} not found`,\n });\n checks.push({\n name: \"tap-comms entry present\",\n passed: !!entry,\n message: entry ? undefined : `${GEMINI_SELECTOR} not found`,\n });\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir)\n ? undefined\n : `${ctx.commsDir} not found`,\n });\n\n if (entry?.env && typeof entry.env === \"object\") {\n checks.push({\n name: \"TAP_COMMS_DIR configured\",\n passed:\n (entry.env as Record<string, unknown>).TAP_COMMS_DIR ===\n ctx.commsDir.replace(/\\\\/g, \"/\"),\n message: `Expected ${ctx.commsDir.replace(/\\\\/g, \"/\")}`,\n });\n }\n\n return checks;\n}\n\nexport const geminiAdapter: RuntimeAdapter = {\n runtime: \"gemini\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n const configPath = chooseGeminiConfigPath(ctx);\n const configExists = fs.existsSync(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"gemini\", \"gemini.cmd\"] : [\"gemini\"],\n );\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Gemini CLI not found in PATH. Config can still be written, but runtime verification will be limited.\",\n );\n }\n\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(\n `Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`,\n );\n }\n\n const managed = buildManagedMcpServerSpec(ctx, ctx.instanceId);\n warnings.push(...managed.warnings);\n issues.push(...managed.issues);\n\n return {\n installed: true,\n configPath,\n configExists,\n runtimeCommand: runtimeProbe.command,\n version: runtimeProbe.version,\n canWrite: canWriteOrCreate(configPath),\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? chooseGeminiConfigPath(ctx);\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts: OwnedArtifact[] = [\n { kind: \"json-path\", path: configPath, selector: GEMINI_SELECTOR },\n ];\n\n if (probe.configExists) {\n try {\n const config = readJsonFile(configPath);\n if (readNestedKey(config, GEMINI_SELECTOR) !== undefined) {\n conflicts.push(`Existing ${GEMINI_SELECTOR} entry will be updated.`);\n }\n } catch {\n warnings.push(\n `${configPath} exists but is not valid JSON. It will be replaced.`,\n );\n }\n }\n\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: GEMINI_SELECTOR,\n });\n\n return {\n runtime: \"gemini\",\n operations,\n ownedArtifacts,\n backupDir: ensureBackupDir(ctx.stateDir, \"gemini\"),\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const configPath = plan.operations[0]?.path ?? chooseGeminiConfigPath(ctx);\n const warnings: string[] = [];\n const changedFiles: string[] = [];\n const managed = buildManagedMcpServerSpec(ctx, ctx.instanceId);\n\n warnings.push(...managed.warnings);\n if (managed.issues.length > 0 || !managed.command) {\n return {\n success: false,\n appliedOps: 0,\n backupCreated: false,\n lastAppliedHash: \"\",\n ownedArtifacts: [],\n changedFiles,\n restartRequired: false,\n warnings: [...managed.warnings, ...managed.issues],\n };\n }\n\n let config: Record<string, unknown> = {};\n let previousValue: unknown = undefined;\n\n if (fs.existsSync(configPath)) {\n if (fs.readFileSync(configPath, \"utf-8\").trim()) {\n backupFile(configPath, plan.backupDir);\n }\n try {\n config = readJsonFile(configPath);\n } catch {\n warnings.push(\n `${configPath} was invalid JSON. Created backup and starting fresh.`,\n );\n config = {};\n }\n previousValue = readNestedKey(config, GEMINI_SELECTOR);\n }\n\n const artifact = plan.ownedArtifacts[0];\n const backupPath = artifactBackupPath(\n plan.backupDir,\n artifact.kind,\n artifact.selector,\n );\n writeArtifactBackup(backupPath, {\n kind: \"json-path\",\n selector: artifact.selector,\n existed: previousValue !== undefined,\n value: previousValue,\n });\n\n setNestedKey(config, GEMINI_SELECTOR, {\n command: managed.command,\n args: managed.args,\n env: managed.env,\n });\n\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n const tmp = `${configPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, configPath);\n changedFiles.push(configPath);\n\n return {\n success: true,\n appliedOps: plan.operations.length,\n backupCreated: true,\n lastAppliedHash: fileHash(configPath),\n ownedArtifacts: [{ ...artifact, backupPath }],\n changedFiles,\n restartRequired: true,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const warnings: string[] = [];\n const configPath = plan.operations[0]?.path ?? chooseGeminiConfigPath(ctx);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"gemini\", \"gemini.cmd\"] : [\"gemini\"],\n );\n\n let checks: VerifyCheck[];\n try {\n const config = readJsonFile(configPath);\n checks = verifyGeminiConfig(config, configPath, ctx);\n } catch {\n checks = [\n {\n name: \"Gemini config is valid JSON\",\n passed: false,\n message: \"Parse error\",\n },\n ];\n }\n\n checks.push({\n name: \"Gemini CLI found\",\n passed: !!runtimeProbe.command,\n message: runtimeProbe.command\n ? undefined\n : \"gemini not in PATH (non-blocking)\",\n });\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Gemini CLI not in PATH. Config is written, but runtime verification is partial.\",\n );\n }\n\n return {\n ok: checks\n .filter((check) => check.name !== \"Gemini CLI found\")\n .every((check) => check.passed),\n checks,\n restartRequired: true,\n warnings,\n };\n },\n\n bridgeMode(): BridgeMode {\n return \"polling\";\n },\n};\n","import type { RuntimeAdapter, RuntimeName } from \"../types.js\";\nimport { claudeAdapter } from \"./claude.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { geminiAdapter } from \"./gemini.js\";\n\nconst adapters: Partial<Record<RuntimeName, RuntimeAdapter>> = {\n claude: claudeAdapter,\n codex: codexAdapter,\n gemini: geminiAdapter,\n};\n\nexport function getAdapter(runtime: RuntimeName): RuntimeAdapter {\n const adapter = adapters[runtime];\n if (!adapter) {\n throw new Error(\n `Adapter for \"${runtime}\" is not yet available. ` +\n `Supported: ${Object.keys(adapters).join(\", \")}`,\n );\n }\n return adapter;\n}\n\nexport function listAdapters(): RuntimeName[] {\n return Object.keys(adapters) as RuntimeName[];\n}\n","import * as path from \"node:path\";\nimport { loadState, saveState, updateInstanceState } from \"../state.js\";\nimport {\n startBridge,\n stopBridge,\n getBridgeStatus,\n loadBridgeState,\n getHeartbeatAge,\n getBridgeHeartbeatTimestamp,\n saveBridgeState,\n stopManagedAppServer,\n resolveAppServerUrl,\n checkAppServerHealth,\n findNextAvailableAppServerPort,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n findRepoRoot,\n createAdapterContext,\n resolveInstanceId,\n parseArgs,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type {\n InstanceId,\n HeadlessConfig,\n AgentRole,\n CommandResult,\n AppServerState,\n BridgeState,\n TapState,\n} from \"../types.js\";\n\nfunction formatAge(seconds: number): string {\n if (seconds < 60) return `${seconds}s ago`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m ago`;\n}\n\nconst BRIDGE_HELP = `\nUsage:\n tap-comms bridge <subcommand> [instance] [options]\n\nSubcommands:\n start <instance> Start bridge for an instance (e.g. codex, codex-reviewer)\n start --all Start all registered app-server instances\n stop <instance> Stop bridge for an instance\n stop Stop all running bridges\n status Show bridge status for all instances\n status <instance> Show bridge status for a specific instance\n\nOptions:\n --agent-name <name> Agent identity for bridge (or set TAP_AGENT_NAME env)\n Saved to state — only needed on first start\n --all Start all registered app-server instances\n --busy-mode <steer|wait> How to handle active turns (default: steer)\n --poll-seconds <n> Inbox poll interval (default: 5)\n --reconnect-seconds <n> Reconnect delay after disconnect (default: 5)\n --message-lookback-minutes <n> Process messages from last N minutes (default: 10)\n --thread-id <id> Resume specific thread\n --ephemeral Use ephemeral thread (no persistence)\n --process-existing-messages Process all existing inbox messages\n --no-server Skip app-server auto-start and connect only\n --no-auth Skip auth gateway (app-server listens directly, localhost only)\n\nPort Assignment:\n Ports are auto-assigned from 4501 on first bridge start if not set via --port\n during 'tap add'. Auto-assigned ports are saved to state for future starts.\n\nExamples:\n npx @hua-labs/tap bridge start codex --agent-name myAgent\n npx @hua-labs/tap bridge start --all\n npx @hua-labs/tap bridge start codex --agent-name myAgent --no-server\n npx @hua-labs/tap bridge start codex-reviewer --agent-name reviewer --busy-mode steer\n npx @hua-labs/tap bridge stop codex\n npx @hua-labs/tap bridge stop\n npx @hua-labs/tap bridge status\n`.trim();\n\nfunction formatAppServerState(appServer: AppServerState): string {\n const ownership = appServer.managed ? \"managed\" : \"external\";\n const pid = appServer.pid != null ? ` pid:${appServer.pid}` : \"\";\n const health = appServer.healthy ? \"healthy\" : \"unhealthy\";\n const auth =\n appServer.auth != null\n ? `, auth gateway:${appServer.auth.gatewayPid ?? \"-\"} -> ${appServer.auth.upstreamUrl}`\n : \"\";\n return `${health}, ${ownership}${pid}, ${appServer.url}${auth}`;\n}\n\nfunction redactProtectedUrl(url: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.searchParams.has(\"tap_token\")) {\n parsed.searchParams.set(\"tap_token\", \"***\");\n }\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return url.replace(/tap_token=[^&]+/g, \"tap_token=***\");\n }\n}\n\nfunction loadCurrentBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n fallback: BridgeState | null | undefined,\n): BridgeState | null {\n return loadBridgeState(stateDir, instanceId) ?? fallback ?? null;\n}\n\nfunction getSharedAppServerUsers(\n state: TapState,\n stateDir: string,\n currentInstanceId: InstanceId,\n appServerUrl: string,\n): InstanceId[] {\n const shared: InstanceId[] = [];\n\n for (const [id, inst] of Object.entries(state.instances)) {\n if (id === currentInstanceId || !inst?.installed) {\n continue;\n }\n\n const instanceId = id as InstanceId;\n if (getBridgeStatus(stateDir, instanceId) !== \"running\") {\n continue;\n }\n\n const bridgeState = loadCurrentBridgeState(\n stateDir,\n instanceId,\n inst.bridge,\n );\n if (bridgeState?.appServer?.url === appServerUrl) {\n shared.push(instanceId);\n }\n }\n\n return shared;\n}\n\nfunction transferManagedAppServerOwnership(\n state: TapState,\n stateDir: string,\n recipientId: InstanceId,\n appServer: AppServerState,\n): boolean {\n const recipient = state.instances[recipientId];\n if (!recipient) {\n return false;\n }\n\n const bridgeState = loadCurrentBridgeState(\n stateDir,\n recipientId,\n recipient.bridge,\n );\n if (!bridgeState) {\n return false;\n }\n\n const transferredAppServer: AppServerState = {\n ...appServer,\n managed: true,\n healthy: true,\n lastCheckedAt: new Date().toISOString(),\n lastHealthyAt: appServer.lastHealthyAt ?? new Date().toISOString(),\n };\n\n const updatedBridge: BridgeState = {\n ...bridgeState,\n appServer: transferredAppServer,\n };\n\n saveBridgeState(stateDir, recipientId, updatedBridge);\n state.instances[recipientId] = {\n ...recipient,\n bridge: updatedBridge,\n };\n return true;\n}\n\n// ─── Subcommand: start ─────────────────────────────────────────\n\nasync function bridgeStart(\n identifier: string,\n agentName?: string,\n flags: Record<string, string | boolean | undefined> = {},\n): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n let state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n let instance = state.instances[instanceId];\n\n if (!instance?.installed) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance?.runtime,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `${instanceId} is not installed. Run: npx @hua-labs/tap add ${instance?.runtime ?? identifier}`,\n warnings: [],\n data: {},\n };\n }\n\n const adapter = getAdapter(instance.runtime);\n const mode = adapter.bridgeMode();\n\n if (mode !== \"app-server\") {\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_NO_OP\",\n message: `${instanceId} uses ${mode} mode — no bridge needed.`,\n warnings: [],\n data: { bridgeMode: mode },\n };\n }\n\n // Resolve agent name: explicit flag > stored in state > env\n const resolvedAgentName = agentName ?? instance.agentName ?? undefined;\n\n // Persist agent-name to state if explicitly provided\n if (agentName && agentName !== instance.agentName) {\n instance = { ...instance, agentName };\n const updatedState = updateInstanceState(state, instanceId, instance);\n saveState(repoRoot, updatedState);\n state = updatedState;\n }\n\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const bridgeScript = adapter.resolveBridgeScript?.(ctx);\n\n if (!bridgeScript) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_SCRIPT_MISSING\",\n message: `Bridge script not found for ${instanceId}. Ensure the runtime is properly configured.`,\n warnings: [],\n data: {},\n };\n }\n\n // Resolve runtime command + appServerUrl from config\n const { config: resolvedConfig } = resolveConfig({}, repoRoot);\n const runtimeCommand = resolvedConfig.runtimeCommand;\n const manageAppServer =\n instance.runtime === \"codex\" && flags[\"no-server\"] !== true;\n\n // Auto-assign port only for managed app-server mode (local instances).\n // External servers (--no-server) keep the configured appServerUrl as-is.\n let effectivePort = instance.port;\n if (effectivePort == null && manageAppServer) {\n effectivePort = await findNextAvailableAppServerPort(\n state,\n resolvedConfig.appServerUrl,\n 4501,\n instanceId,\n );\n instance = { ...instance, port: effectivePort };\n const updatedState = updateInstanceState(state, instanceId, instance);\n saveState(repoRoot, updatedState);\n state = updatedState;\n }\n\n const appServerUrl = resolveAppServerUrl(\n resolvedConfig.appServerUrl,\n effectivePort ?? undefined,\n );\n\n logHeader(`@hua-labs/tap bridge start ${instanceId}`);\n log(`Bridge script: ${bridgeScript}`);\n log(`Bridge mode: ${mode}`);\n log(`Runtime cmd: ${runtimeCommand}`);\n log(`App server: ${appServerUrl}`);\n if (effectivePort != null) log(`Port: ${effectivePort}`);\n if (resolvedAgentName) log(`Agent name: ${resolvedAgentName}`);\n const noAuth = flags[\"no-auth\"] === true;\n if (!manageAppServer && instance.runtime === \"codex\") {\n log(\"Auto server: disabled (--no-server)\");\n }\n if (noAuth && manageAppServer) {\n log(\"Auth gateway: disabled (--no-auth)\");\n }\n // Show headless status from instance config or --headless flag (resolved below)\n const willBeHeadless =\n flags[\"headless\"] === true || instance.headless?.enabled;\n if (willBeHeadless) {\n const role =\n (typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : null) ??\n instance.headless?.role ??\n \"reviewer\";\n log(`Headless: ${role}`);\n }\n\n try {\n // Startup validation: health check before bridge start\n if (!manageAppServer && instance.runtime === \"codex\") {\n log(\"Checking app-server health...\");\n const healthy = await checkAppServerHealth(appServerUrl);\n if (healthy) {\n logSuccess(\"App server reachable\");\n } else {\n logError(`App server not reachable at ${appServerUrl}`);\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_START_FAILED\",\n message: `App server not reachable at ${appServerUrl}. Start it first: codex app-server --listen ${appServerUrl}`,\n warnings: [],\n data: {},\n };\n }\n }\n\n // Parse bridge operational flags from CLI\n\n // --busy-mode validation (PS1 parity: ValidateSet(\"wait\", \"steer\"))\n const busyModeRaw = flags[\"busy-mode\"];\n if (\n busyModeRaw !== undefined &&\n busyModeRaw !== \"steer\" &&\n busyModeRaw !== \"wait\"\n ) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid --busy-mode: ${String(busyModeRaw)}. Must be \"steer\" or \"wait\".`,\n warnings: [],\n data: {},\n };\n }\n const busyMode = busyModeRaw as \"steer\" | \"wait\" | undefined;\n const pollSeconds =\n typeof flags[\"poll-seconds\"] === \"string\"\n ? parseInt(flags[\"poll-seconds\"], 10)\n : undefined;\n const reconnectSeconds =\n typeof flags[\"reconnect-seconds\"] === \"string\"\n ? parseInt(flags[\"reconnect-seconds\"], 10)\n : undefined;\n const messageLookbackMinutes =\n typeof flags[\"message-lookback-minutes\"] === \"string\"\n ? parseInt(flags[\"message-lookback-minutes\"], 10)\n : undefined;\n const threadId =\n typeof flags[\"thread-id\"] === \"string\" ? flags[\"thread-id\"] : undefined;\n const ephemeral = flags[\"ephemeral\"] === true;\n const processExistingMessages = flags[\"process-existing-messages\"] === true;\n\n // --headless flag on bridge start: create ad-hoc headless config\n // even if instance wasn't created with `tap add --headless`\n const headlessFlag = flags[\"headless\"] === true;\n const roleArg =\n typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : undefined;\n const validRoles: AgentRole[] = [\"reviewer\", \"validator\", \"long-running\"];\n if (roleArg && !validRoles.includes(roleArg as AgentRole)) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid --role: ${roleArg}. Must be: ${validRoles.join(\", \")}`,\n warnings: [],\n data: {},\n };\n }\n\n const headless: HeadlessConfig | null = headlessFlag\n ? {\n enabled: true,\n role: (roleArg as AgentRole) ?? \"reviewer\",\n maxRounds: 5,\n qualitySeverityFloor: \"high\",\n }\n : instance.headless;\n\n const bridge = await startBridge({\n instanceId,\n runtime: instance.runtime,\n stateDir: ctx.stateDir,\n commsDir: ctx.commsDir,\n bridgeScript,\n platform: ctx.platform,\n agentName: resolvedAgentName,\n runtimeCommand,\n appServerUrl,\n repoRoot,\n port: effectivePort ?? undefined,\n manageAppServer,\n noAuth,\n headless,\n busyMode,\n pollSeconds,\n reconnectSeconds,\n messageLookbackMinutes,\n threadId,\n ephemeral,\n processExistingMessages,\n });\n\n logSuccess(`Bridge started (PID: ${bridge.pid})`);\n log(`Log: ${path.join(ctx.stateDir, \"logs\", `bridge-${instanceId}.log`)}`);\n if (bridge.appServer) {\n log(`App server: ${formatAppServerState(bridge.appServer)}`);\n if (bridge.appServer.logPath) {\n log(`Server log: ${bridge.appServer.logPath}`);\n }\n if (bridge.appServer.auth) {\n log(\n `Protected: ${redactProtectedUrl(bridge.appServer.auth.protectedUrl)}`,\n );\n if (bridge.appServer.auth.gatewayLogPath) {\n log(`Gateway log: ${bridge.appServer.auth.gatewayLogPath}`);\n }\n // TUI must connect to upstream (no token needed) — gateway blocks unauthenticated clients\n log(`TUI connect: ${bridge.appServer.auth.upstreamUrl}`);\n }\n if (bridge.appServer.managed && !bridge.appServer.auth) {\n // --no-auth mode: TUI connects to the same URL as the bridge\n log(`TUI connect: ${bridge.appServer.url}`);\n }\n }\n\n // Update state with bridge info\n const updated = { ...instance, bridge };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_START_OK\",\n message: `Bridge for ${instanceId} started (PID: ${bridge.pid})`,\n warnings: [],\n data: { pid: bridge.pid, appServer: bridge.appServer ?? null },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(msg);\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_START_FAILED\",\n message: msg,\n warnings: [],\n data: {},\n };\n }\n}\n\n// ─── Subcommand: start --all ───────────────────────────────────\n\nasync function bridgeStartAll(\n flags: Record<string, string | boolean | undefined> = {},\n): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n const appServerInstances = instanceIds.filter((id) => {\n const inst = state.instances[id];\n if (!inst?.installed) return false;\n const adapter = getAdapter(inst.runtime);\n return adapter.bridgeMode() === \"app-server\";\n });\n\n if (appServerInstances.length === 0) {\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_NO_OP\",\n message: \"No app-server instances found to start.\",\n warnings: [],\n data: {},\n };\n }\n\n logHeader(\"@hua-labs/tap bridge start --all\");\n log(\n `Found ${appServerInstances.length} app-server instance(s): ${appServerInstances.join(\", \")}`,\n );\n log(\"\");\n\n const started: string[] = [];\n const failed: string[] = [];\n const warnings: string[] = [];\n\n for (const instanceId of appServerInstances) {\n const inst = state.instances[instanceId];\n const storedName = inst?.agentName ?? undefined;\n\n if (!storedName) {\n const msg = `${instanceId}: skipped — no stored agent-name. Set it first: tap bridge start ${instanceId} --agent-name <name>`;\n log(msg);\n warnings.push(msg);\n continue;\n }\n\n log(`Starting ${instanceId} (agent: ${storedName})...`);\n const result = await bridgeStart(instanceId, storedName, flags);\n\n if (result.ok) {\n started.push(instanceId);\n logSuccess(`${instanceId} started`);\n } else {\n failed.push(instanceId);\n logError(`${instanceId}: ${result.message}`);\n }\n log(\"\");\n }\n\n const message =\n started.length > 0\n ? `Started ${started.length}/${appServerInstances.length} bridge(s): ${started.join(\", \")}` +\n (failed.length > 0 ? `. Failed: ${failed.join(\", \")}` : \"\")\n : `No bridges started. Failed: ${failed.join(\", \")}`;\n\n return {\n ok: failed.length === 0 && started.length > 0,\n command: \"bridge\",\n code:\n started.length > 0 ? \"TAP_BRIDGE_START_OK\" : \"TAP_BRIDGE_START_FAILED\",\n message,\n warnings,\n data: { started, failed },\n };\n}\n\n// ─── Subcommand: stop ──────────────────────────────────────────\n\nasync function bridgeStopOne(identifier: string): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const instance = state.instances[instanceId];\n const bridgeState = loadCurrentBridgeState(\n ctx.stateDir,\n instanceId,\n instance?.bridge,\n );\n const appServer = bridgeState?.appServer ?? null;\n\n logHeader(`@hua-labs/tap bridge stop ${instanceId}`);\n\n const stopped = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n\n let appServerStopped = false;\n let appServerTransferredTo: InstanceId | null = null;\n\n if (stopped) {\n logSuccess(`Bridge for ${instanceId} stopped`);\n } else {\n log(`No running bridge for ${instanceId}`);\n }\n\n if (appServer?.managed) {\n const sharedUsers = getSharedAppServerUsers(\n state,\n ctx.stateDir,\n instanceId,\n appServer.url,\n );\n\n if (sharedUsers.length > 0) {\n const recipient = sharedUsers[0];\n if (\n transferManagedAppServerOwnership(\n state,\n ctx.stateDir,\n recipient,\n appServer,\n )\n ) {\n appServerTransferredTo = recipient;\n log(`Managed app-server ownership moved to ${recipient}`);\n } else {\n log(\n `Managed app-server left running at ${appServer.url} because ownership transfer failed`,\n );\n }\n } else {\n appServerStopped = await stopManagedAppServer(appServer, ctx.platform);\n if (appServerStopped) {\n const gatewayNote =\n appServer.auth?.gatewayPid != null\n ? `, gateway PID: ${appServer.auth.gatewayPid}`\n : \"\";\n logSuccess(\n `Managed app-server stopped (PID: ${appServer.pid ?? \"-\"}${gatewayNote})`,\n );\n }\n }\n }\n\n // Clear bridge from state\n if (instance) {\n const updated = { ...instance, bridge: null };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n }\n\n if (stopped) {\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_STOP_OK\",\n message: `Bridge for ${instanceId} stopped`,\n warnings: [],\n data: {\n appServerStopped,\n appServerTransferredTo,\n },\n };\n }\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_NOT_RUNNING\",\n message: `No running bridge for ${instanceId}`,\n warnings: [],\n data: {\n appServerStopped,\n appServerTransferredTo,\n },\n };\n}\n\nasync function bridgeStopAll(): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n const stopped: string[] = [];\n const managedAppServers = new Map<string, AppServerState>();\n\n logHeader(\"@hua-labs/tap bridge stop (all)\");\n\n let stateChanged = false;\n\n for (const instanceId of instanceIds) {\n const bridgeState = loadCurrentBridgeState(\n ctx.stateDir,\n instanceId,\n state.instances[instanceId]?.bridge,\n );\n const appServer = bridgeState?.appServer;\n if (appServer?.managed && appServer.pid != null) {\n managedAppServers.set(\n `${appServer.url}:${appServer.pid}:${appServer.auth?.gatewayPid ?? \"-\"}`,\n appServer,\n );\n }\n\n const didStop = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n\n if (didStop) {\n logSuccess(`Stopped bridge for ${instanceId}`);\n stopped.push(instanceId);\n }\n\n // Clear stale bridge metadata regardless of whether process was alive\n const instance = state.instances[instanceId];\n if (instance?.bridge) {\n state.instances[instanceId] = { ...instance, bridge: null };\n stateChanged = true;\n }\n }\n\n const stoppedAppServers: number[] = [];\n for (const appServer of managedAppServers.values()) {\n if (await stopManagedAppServer(appServer, ctx.platform)) {\n stoppedAppServers.push(appServer.pid!);\n const gatewayNote =\n appServer.auth?.gatewayPid != null\n ? `, gateway PID ${appServer.auth.gatewayPid}`\n : \"\";\n logSuccess(\n `Stopped app-server PID ${appServer.pid} (${appServer.url}${gatewayNote})`,\n );\n }\n }\n\n if (stateChanged) {\n state.updatedAt = new Date().toISOString();\n saveState(repoRoot, state);\n }\n\n const message =\n stopped.length > 0\n ? `Stopped ${stopped.length} bridge(s): ${stopped.join(\", \")}`\n : \"No running bridges found\";\n\n log(message);\n\n return {\n ok: true,\n command: \"bridge\",\n code: stopped.length > 0 ? \"TAP_BRIDGE_STOP_OK\" : \"TAP_BRIDGE_NOT_RUNNING\",\n message,\n warnings: [],\n data: { stopped, stoppedAppServers },\n };\n}\n\n// ─── Subcommand: status ────────────────────────────────────────\n\nfunction bridgeStatusAll(): CommandResult {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg.stateDir;\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n const bridges: Record<\n string,\n {\n status: string;\n runtime: string;\n pid: number | null;\n port: number | null;\n lastHeartbeat: string | null;\n appServer: AppServerState | null;\n }\n > = {};\n\n logHeader(\"@hua-labs/tap bridge status\");\n log(\n `${\"Instance\".padEnd(20)} ${\"Runtime\".padEnd(8)} ${\"Status\".padEnd(10)} ${\"PID\".padEnd(8)} ${\"Port\".padEnd(6)} ${\"Last Heartbeat\"}`,\n );\n log(\n `${\"─\".repeat(20)} ${\"─\".repeat(8)} ${\"─\".repeat(10)} ${\"─\".repeat(8)} ${\"─\".repeat(6)} ${\"─\".repeat(20)}`,\n );\n\n for (const instanceId of instanceIds) {\n const inst = state.instances[instanceId];\n if (!inst?.installed) continue;\n\n if (inst.bridgeMode !== \"app-server\") {\n log(\n `${instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${\"n/a\".padEnd(10)} ${\"-\".padEnd(8)} ${\"-\".padEnd(6)} ${inst.bridgeMode} mode`,\n );\n bridges[instanceId] = {\n status: \"n/a\",\n runtime: inst.runtime,\n pid: null,\n port: inst.port,\n lastHeartbeat: null,\n appServer: null,\n };\n continue;\n }\n\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n\n const pid = bridgeState?.pid ?? null;\n const heartbeat = getBridgeHeartbeatTimestamp(stateDir, instanceId);\n const pidStr = pid ? String(pid) : \"-\";\n const portStr = inst.port ? String(inst.port) : \"-\";\n const ageStr = age !== null ? formatAge(age) : \"-\";\n\n const statusColor =\n status === \"running\"\n ? \"running\"\n : status === \"stale\"\n ? \"stale!\"\n : \"stopped\";\n\n log(\n `${instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${statusColor.padEnd(10)} ${pidStr.padEnd(8)} ${portStr.padEnd(6)} ${ageStr}`,\n );\n if (bridgeState?.appServer) {\n log(` App server: ${formatAppServerState(bridgeState.appServer)}`);\n if (bridgeState.appServer.logPath) {\n log(` Server log: ${bridgeState.appServer.logPath}`);\n }\n if (bridgeState.appServer.auth) {\n log(\n ` Protected: ${redactProtectedUrl(bridgeState.appServer.auth.protectedUrl)}`,\n );\n }\n }\n\n bridges[instanceId] = {\n status,\n runtime: inst.runtime,\n pid,\n port: inst.port,\n lastHeartbeat: heartbeat,\n appServer: bridgeState?.appServer ?? null,\n };\n }\n\n if (instanceIds.length === 0) {\n log(\"No instances installed.\");\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceIds.length} instance(s) checked`,\n warnings: [],\n data: { bridges },\n };\n}\n\nfunction bridgeStatusOne(identifier: string): CommandResult {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const inst = state.instances[instanceId];\n\n if (!inst?.installed) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `${instanceId} is not installed.`,\n warnings: [],\n data: {},\n };\n }\n\n logHeader(`@hua-labs/tap bridge status ${instanceId}`);\n log(`Instance: ${instanceId}`);\n log(`Runtime: ${inst.runtime}`);\n log(`Bridge mode: ${inst.bridgeMode}`);\n if (inst.port) log(`Port: ${inst.port}`);\n\n // Non-app-server instances don't use bridges\n if (inst.bridgeMode !== \"app-server\") {\n log(`Status: n/a (${inst.bridgeMode} mode)`);\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceId} bridge: n/a (${inst.bridgeMode} mode)`,\n warnings: [],\n data: {\n status: \"n/a\",\n bridgeMode: inst.bridgeMode,\n pid: null,\n port: inst.port,\n lastHeartbeat: null,\n appServer: null,\n },\n };\n }\n\n const { config: resolvedCfg2 } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg2.stateDir;\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n const heartbeat = getBridgeHeartbeatTimestamp(stateDir, instanceId);\n\n log(`Status: ${status}`);\n\n if (bridgeState) {\n log(`PID: ${bridgeState.pid}`);\n log(\n `Heartbeat: ${heartbeat ?? \"-\"}${age !== null ? ` (${formatAge(age)})` : \"\"}`,\n );\n log(\n `Log: ${path.join(stateDir, \"logs\", `bridge-${instanceId}.log`)}`,\n );\n if (bridgeState.appServer) {\n log(`App server: ${bridgeState.appServer.url}`);\n log(`Server PID: ${bridgeState.appServer.pid ?? \"-\"}`);\n log(\n `Server mode: ${bridgeState.appServer.managed ? \"managed\" : \"external\"}`,\n );\n log(\n `Health: ${bridgeState.appServer.healthy ? \"healthy\" : \"unhealthy\"}`,\n );\n log(`Checked: ${bridgeState.appServer.lastCheckedAt}`);\n if (bridgeState.appServer.logPath) {\n log(`Server log: ${bridgeState.appServer.logPath}`);\n }\n if (bridgeState.appServer.auth) {\n log(`Auth: ${bridgeState.appServer.auth.mode}`);\n log(\n `Protected: ${redactProtectedUrl(bridgeState.appServer.auth.protectedUrl)}`,\n );\n log(`Upstream: ${bridgeState.appServer.auth.upstreamUrl}`);\n log(`TUI connect: ${bridgeState.appServer.auth.upstreamUrl}`);\n log(`Gateway PID: ${bridgeState.appServer.auth.gatewayPid ?? \"-\"}`);\n if (bridgeState.appServer.auth.gatewayLogPath) {\n log(`Gateway log: ${bridgeState.appServer.auth.gatewayLogPath}`);\n }\n } else if (bridgeState.appServer.managed) {\n log(`Auth: none (--no-auth)`);\n log(`TUI connect: ${bridgeState.appServer.url}`);\n }\n }\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceId} bridge: ${status}`,\n warnings: [],\n data: {\n status,\n bridgeMode: inst.bridgeMode,\n pid: bridgeState?.pid ?? null,\n port: inst.port,\n lastHeartbeat: heartbeat,\n appServer: bridgeState?.appServer ?? null,\n },\n };\n}\n\n// ─── Command Router ────────────────────────────────────────────\n\nexport async function bridgeCommand(args: string[]): Promise<CommandResult> {\n const { positional, flags } = parseArgs(args);\n const subcommand = positional[0];\n const identifierArg = positional[1];\n const agentName =\n typeof flags[\"agent-name\"] === \"string\" ? flags[\"agent-name\"] : undefined;\n\n if (!subcommand || subcommand === \"--help\" || subcommand === \"-h\") {\n log(BRIDGE_HELP);\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_NO_OP\",\n message: BRIDGE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n switch (subcommand) {\n case \"start\": {\n const wantsAll = flags[\"all\"] === true || identifierArg === \"--all\";\n const hasInstance = identifierArg && identifierArg !== \"--all\";\n\n if (wantsAll && hasInstance) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Cannot combine <instance> with --all. Use either:\\n tap bridge start ${identifierArg}\\n tap bridge start --all`,\n warnings: [],\n data: {},\n };\n }\n if (wantsAll) {\n return bridgeStartAll(flags);\n }\n if (!identifierArg) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing instance. Usage: npx @hua-labs/tap bridge start <instance> or --all\",\n warnings: [],\n data: {},\n };\n }\n return bridgeStart(identifierArg, agentName, flags);\n }\n\n case \"stop\": {\n if (!identifierArg) {\n return bridgeStopAll();\n }\n return bridgeStopOne(identifierArg);\n }\n\n case \"status\": {\n if (identifierArg) {\n return bridgeStatusOne(identifierArg);\n }\n return bridgeStatusAll();\n }\n\n default:\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Unknown bridge subcommand: ${subcommand}. Use: start, stop, status`,\n warnings: [],\n data: {},\n };\n }\n}\n","import { bridgeCommand } from \"./bridge.js\";\nimport {\n collectDashboardSnapshot,\n type DashboardSnapshot,\n} from \"../engine/dashboard.js\";\nimport { findRepoRoot, log } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst UP_HELP = `\nUsage:\n tap-comms up [bridge-start options]\n\nDescription:\n Start all registered app-server bridge daemons with one command.\n This is the orchestration entrypoint for headless/background TAP operation.\n\nExamples:\n npx @hua-labs/tap up\n npx @hua-labs/tap up --no-auth\n npx @hua-labs/tap up --busy-mode wait\n`.trim();\n\ntype UpResultData = Record<string, unknown> & {\n snapshot: DashboardSnapshot;\n};\n\nexport async function upCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(UP_HELP);\n return {\n ok: true,\n command: \"up\",\n code: \"TAP_NO_OP\",\n message: UP_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const result = await bridgeCommand([\"start\", \"--all\", ...args]);\n const snapshot = collectDashboardSnapshot(repoRoot);\n const activeBridges = snapshot.bridges.filter(\n (bridge) => bridge.status === \"running\",\n ).length;\n\n if (!result.ok) {\n return {\n ...result,\n command: \"up\",\n data: {\n ...(result.data as Record<string, unknown>),\n snapshot,\n } satisfies UpResultData,\n };\n }\n\n return {\n ok: true,\n command: \"up\",\n code: \"TAP_UP_OK\",\n message: `tap up: ${activeBridges} bridge(s) running`,\n warnings: result.warnings,\n data: {\n ...(result.data as Record<string, unknown>),\n snapshot,\n } satisfies UpResultData,\n };\n}\n","import { bridgeCommand } from \"./bridge.js\";\nimport {\n collectDashboardSnapshot,\n type DashboardSnapshot,\n} from \"../engine/dashboard.js\";\nimport { findRepoRoot, log } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst DOWN_HELP = `\nUsage:\n tap-comms down\n\nDescription:\n Stop all running bridge daemons and managed app-servers.\n\nExamples:\n npx @hua-labs/tap down\n`.trim();\n\ntype DownResultData = Record<string, unknown> & {\n snapshot: DashboardSnapshot;\n};\n\nexport async function downCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(DOWN_HELP);\n return {\n ok: true,\n command: \"down\",\n code: \"TAP_NO_OP\",\n message: DOWN_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const result = await bridgeCommand([\"stop\"]);\n const snapshot = collectDashboardSnapshot(repoRoot);\n\n if (!result.ok) {\n return {\n ...result,\n command: \"down\",\n data: {\n ...(result.data as Record<string, unknown>),\n snapshot,\n } satisfies DownResultData,\n };\n }\n\n return {\n ok: true,\n command: \"down\",\n code: \"TAP_DOWN_OK\",\n message: `tap down: ${snapshot.bridges.filter((bridge) => bridge.status === \"running\").length} bridge(s) still running`,\n warnings: result.warnings,\n data: {\n ...(result.data as Record<string, unknown>),\n snapshot,\n } satisfies DownResultData,\n };\n}\n","export type {\n RuntimeName,\n BridgeMode,\n Platform,\n InstanceId,\n AdapterContext,\n ProbeResult,\n PatchPlan,\n PatchOp,\n PatchOpType,\n OwnedArtifact,\n ArtifactKind,\n ApplyResult,\n VerifyResult,\n VerifyCheck,\n RuntimeAdapter,\n TapState,\n TapStateV1,\n InstanceState,\n /** @deprecated Use InstanceState. Will be removed in 0.2.0. */\n RuntimeState,\n BridgeState,\n AppServerState,\n AppServerAuthState,\n CommandName,\n CommandCode,\n CommandResult,\n} from \"./types.js\";\n\nexport {\n loadState,\n saveState,\n createInitialState,\n stateExists,\n} from \"./state.js\";\nexport { version } from \"./version.js\";\n\n// Config\nexport type {\n TapSharedConfig,\n TapLocalConfig,\n TapResolvedConfig,\n ConfigSource,\n ConfigResolution,\n ConfigOverrides,\n} from \"./config/index.js\";\nexport {\n resolveConfig,\n loadSharedConfig,\n loadLocalConfig,\n saveSharedConfig,\n saveLocalConfig,\n SHARED_CONFIG_FILE,\n LOCAL_CONFIG_FILE,\n} from \"./config/index.js\";\n\n// Bridge engine\nexport {\n /** @deprecated Internal use only. Will be removed in 0.2.0. */\n updateBridgeHeartbeat,\n getHeartbeatAge,\n rotateLog,\n} from \"./engine/bridge.js\";\n\n// Dashboard / State API\nexport type {\n AgentInfo,\n BridgeInfo,\n PRInfo,\n DashboardWarning,\n DashboardSnapshot,\n} from \"./engine/dashboard.js\";\nexport { collectDashboardSnapshot } from \"./engine/dashboard.js\";\n\n// State/Control API (M105)\nexport type {\n StateApiOptions,\n EventStreamOptions,\n AgentControlOptions,\n AgentControlResult,\n} from \"./api/state.js\";\nexport {\n getDashboardSnapshot,\n streamEvents,\n getConfig,\n startAgents,\n stopAgents,\n} from \"./api/state.js\";\nexport type { HttpServerOptions } from \"./api/http.js\";\nexport { startHttpServer } from \"./api/http.js\";\n\n// Runtime resolver\nexport type { ResolvedRuntime, RuntimeSource } from \"./runtime/index.js\";\nexport {\n resolveNodeRuntime,\n buildRuntimeEnv,\n readNodeVersion,\n probeFnmNode,\n getFnmBinDir,\n} from \"./runtime/index.js\";\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst FALLBACK_VERSION = \"0.0.0\";\n\nexport function resolvePackageVersion(\n metaUrl: string = import.meta.url,\n): string {\n const moduleDir = path.dirname(fileURLToPath(metaUrl));\n const packageJsonPath = path.join(moduleDir, \"..\", \"package.json\");\n\n try {\n const parsed = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\")) as {\n version?: unknown;\n };\n if (typeof parsed.version === \"string\" && parsed.version.trim()) {\n return parsed.version;\n }\n } catch {\n // Fall through to the fixed fallback below.\n }\n\n return FALLBACK_VERSION;\n}\n\nexport const version = resolvePackageVersion();\n","/**\n * State/Control API — programmatic access to tap state.\n * GUI and autopilot consume these functions instead of shelling out to CLI.\n *\n * M105 P1: getDashboardSnapshot, streamEvents (read-only)\n * M105 P2: startAgents, stopAgents (write — wraps tap up/down)\n */\n\nimport { collectDashboardSnapshot } from \"../engine/dashboard.js\";\nimport type { DashboardSnapshot } from \"../engine/dashboard.js\";\nimport { findRepoRoot } from \"../utils.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport type { CommandResult } from \"../types.js\";\n\nexport interface StateApiOptions {\n repoRoot?: string;\n commsDir?: string;\n}\n\n/**\n * Get a point-in-time snapshot of all tap state:\n * agents, bridges, PRs, and warnings.\n *\n * This is the read-only entry point for GUI dashboards and autopilot.\n */\nexport function getDashboardSnapshot(\n options?: StateApiOptions,\n): DashboardSnapshot {\n const repoRoot = options?.repoRoot ?? findRepoRoot();\n return collectDashboardSnapshot(repoRoot, options?.commsDir);\n}\n\nexport interface EventStreamOptions extends StateApiOptions {\n /** Poll interval in milliseconds (default: 2000) */\n intervalMs?: number;\n /** AbortSignal to stop the stream */\n signal?: AbortSignal;\n}\n\n/**\n * Async generator that yields dashboard snapshots at regular intervals.\n * Useful for SSE or WebSocket push to GUI clients.\n *\n * Stops when the AbortSignal fires or the consumer breaks out.\n */\nexport async function* streamEvents(\n options?: EventStreamOptions,\n): AsyncGenerator<DashboardSnapshot> {\n const intervalMs = options?.intervalMs ?? 2000;\n const repoRoot = options?.repoRoot ?? findRepoRoot();\n\n while (!options?.signal?.aborted) {\n yield collectDashboardSnapshot(repoRoot, options?.commsDir);\n await new Promise<void>((resolve) => {\n const onAbort = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n options?.signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, intervalMs);\n options?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n}\n\n// ── Write API ───────────────────────────────────────────────────\n\nexport interface AgentControlOptions {\n /** Extra CLI args forwarded to `tap up` (e.g. `[\"--no-auth\"]`) */\n args?: string[];\n}\n\nexport interface AgentControlResult {\n ok: boolean;\n message: string;\n snapshot: DashboardSnapshot;\n commandResult: CommandResult;\n}\n\n/**\n * Start all registered bridge daemons.\n * Equivalent to `tap up [...args]`.\n *\n * Always operates on the cwd-based repo (same as CLI commands).\n * Use read-only APIs (getDashboardSnapshot) for cross-repo queries.\n */\nexport async function startAgents(\n options?: AgentControlOptions,\n): Promise<AgentControlResult> {\n const { upCommand } = await import(\"../commands/up.js\");\n const result = await upCommand(options?.args ?? []);\n const repoRoot = findRepoRoot();\n const snapshot = collectDashboardSnapshot(repoRoot);\n return {\n ok: result.ok,\n message: result.message,\n snapshot,\n commandResult: result,\n };\n}\n\n/**\n * Stop all running bridge daemons.\n * Equivalent to `tap down`.\n *\n * Always operates on the cwd-based repo (same as CLI commands).\n */\nexport async function stopAgents(): Promise<AgentControlResult> {\n const { downCommand } = await import(\"../commands/down.js\");\n const result = await downCommand([]);\n const repoRoot = findRepoRoot();\n const snapshot = collectDashboardSnapshot(repoRoot);\n return {\n ok: result.ok,\n message: result.message,\n snapshot,\n commandResult: result,\n };\n}\n\n// ── Config ──────────────────────────────────────────────────────\n\n/**\n * Resolve tap configuration for API consumers.\n * Returns paths and settings without requiring CLI args.\n */\nexport function getConfig(options?: StateApiOptions) {\n const repoRoot = options?.repoRoot ?? findRepoRoot();\n const { config } = resolveConfig({}, repoRoot);\n return {\n repoRoot,\n commsDir: options?.commsDir ?? config.commsDir,\n stateDir: config.stateDir,\n appServerUrl: config.appServerUrl,\n };\n}\n","/**\n * Minimal HTTP transport for tap State API.\n * localhost-only, no external dependencies (uses node:http).\n *\n * Endpoints:\n * GET /api/snapshot — DashboardSnapshot JSON\n * GET /api/events — SSE stream of snapshots\n * GET /api/config — Resolved tap configuration\n * GET /health — Health check\n */\n\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport {\n getDashboardSnapshot,\n streamEvents,\n getConfig,\n startAgents,\n stopAgents,\n} from \"./state.js\";\nimport type { StateApiOptions } from \"./state.js\";\n\nexport interface HttpServerOptions extends StateApiOptions {\n /** Port to listen on (default: 4580) */\n port?: number;\n}\n\nconst CORS_HEADERS = {\n \"Access-Control-Allow-Origin\": \"http://localhost:3000\",\n \"Access-Control-Allow-Methods\": \"GET, POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n};\n\nfunction jsonResponse(res: ServerResponse, data: unknown, status = 200): void {\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n ...CORS_HEADERS,\n });\n res.end(JSON.stringify(data));\n}\n\nfunction handleSnapshot(\n res: ServerResponse,\n apiOptions: StateApiOptions,\n): void {\n const snapshot = getDashboardSnapshot(apiOptions);\n jsonResponse(res, snapshot);\n}\n\nfunction handleConfig(res: ServerResponse, apiOptions: StateApiOptions): void {\n const config = getConfig(apiOptions);\n jsonResponse(res, config);\n}\n\nasync function handleEvents(\n req: IncomingMessage,\n res: ServerResponse,\n apiOptions: StateApiOptions,\n): Promise<void> {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...CORS_HEADERS,\n });\n\n const controller = new AbortController();\n req.on(\"close\", () => controller.abort());\n\n for await (const snapshot of streamEvents({\n ...apiOptions,\n signal: controller.signal,\n })) {\n if (controller.signal.aborted) break;\n res.write(`data: ${JSON.stringify(snapshot)}\\n\\n`);\n }\n\n res.end();\n}\n\nfunction handleHealth(res: ServerResponse): void {\n jsonResponse(res, { ok: true, timestamp: new Date().toISOString() });\n}\n\n/**\n * Start a localhost-only HTTP server for the tap State API.\n * Resolves after the server is listening. Rejects on bind failure (e.g. EADDRINUSE).\n */\nexport async function startHttpServer(options?: HttpServerOptions): Promise<{\n port: number;\n close: () => Promise<void>;\n}> {\n const port = options?.port ?? 4580;\n // Security: always bind to loopback — no auth layer, must not expose to network\n const host = \"127.0.0.1\";\n const apiOptions: StateApiOptions = {\n repoRoot: options?.repoRoot,\n commsDir: options?.commsDir,\n };\n\n const server = createServer(\n async (req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url ?? \"/\", `http://${host}:${port}`);\n const pathname = url.pathname;\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204, CORS_HEADERS);\n res.end();\n return;\n }\n\n try {\n // GET endpoints\n if (req.method === \"GET\") {\n switch (pathname) {\n case \"/api/snapshot\":\n handleSnapshot(res, apiOptions);\n return;\n case \"/api/events\":\n await handleEvents(req, res, apiOptions);\n return;\n case \"/api/config\":\n handleConfig(res, apiOptions);\n return;\n case \"/health\":\n handleHealth(res);\n return;\n }\n }\n\n // POST endpoints (write API)\n // Require application/json Content-Type to prevent CSRF via browser forms\n // (HTML forms cannot send application/json, forcing preflight on cross-origin)\n if (req.method === \"POST\") {\n const contentType = req.headers[\"content-type\"] ?? \"\";\n if (!contentType.includes(\"application/json\")) {\n jsonResponse(\n res,\n { error: \"Content-Type must be application/json\" },\n 415,\n );\n return;\n }\n\n switch (pathname) {\n case \"/api/start\":\n jsonResponse(res, await startAgents());\n return;\n case \"/api/stop\":\n jsonResponse(res, await stopAgents());\n return;\n }\n }\n\n jsonResponse(res, { error: \"Not found\" }, 404);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n jsonResponse(res, { error: message }, 500);\n }\n },\n );\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n server.removeListener(\"error\", reject);\n resolve();\n });\n });\n\n return {\n port,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n }),\n };\n}\n"],"mappings":"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","names":["fs","path","findRepoRoot","fs","path","basename","fs","path","fileURLToPath","version","fs","path","version","major","fs","path","spawnSync","execSync","fileURLToPath","resolve","DEFAULT_APP_SERVER_URL","manualCommand","pid","healthy","healthyAt","fs","path","execSync","fs","path","execSync","crypto","fs","path","fs","path","fileURLToPath","fs","path","setNestedKey","path","init_bridge","init_bridge","init_bridge","fs","path","resolve","upCommand","downCommand","createServer","createServer","resolve"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/config/resolve.ts","../src/config/index.ts","../src/state.ts","../src/adapters/common.ts","../src/runtime/resolve-node.ts","../src/runtime/index.ts","../src/engine/bridge.ts","../src/engine/dashboard.ts","../src/adapters/claude.ts","../src/artifact-backups.ts","../src/toml.ts","../src/adapters/codex.ts","../src/adapters/gemini.ts","../src/adapters/index.ts","../src/commands/bridge.ts","../src/commands/up.ts","../src/commands/down.ts","../src/index.ts","../src/version.ts","../src/api/state.ts","../src/api/http.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n AdapterContext,\n CommandCode,\n InstanceId,\n Platform,\n RuntimeName,\n TapState,\n} from \"./types.js\";\nimport { resolveConfig } from \"./config/index.js\";\n\nconst VALID_RUNTIMES: RuntimeName[] = [\"claude\", \"codex\", \"gemini\"];\n\nexport function isValidRuntime(name: string): name is RuntimeName {\n return VALID_RUNTIMES.includes(name as RuntimeName);\n}\n\nexport function detectPlatform(): Platform {\n return process.platform as Platform;\n}\n\n/** Shared flag: suppress duplicate no-git warnings across modules. */\nexport let _noGitWarned = false;\n\nexport function _setNoGitWarned() {\n _noGitWarned = true;\n}\n\nexport function findRepoRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n while (true) {\n if (fs.existsSync(path.join(dir, \".git\"))) return dir;\n if (fs.existsSync(path.join(dir, \"package.json\"))) {\n if (!_noGitWarned) {\n _setNoGitWarned();\n logWarn(\n \"No .git directory found. Resolved repo root via package.json — \" +\n \"comms directory may be created in an unexpected location. \" +\n \"Use --comms-dir to specify explicitly.\",\n );\n }\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n if (!_noGitWarned) {\n _setNoGitWarned();\n logWarn(\n \"No git repository or package.json found. Using current directory as root. \" +\n \"Run 'git init' first, or use --comms-dir to specify the comms path.\",\n );\n }\n return process.cwd();\n}\n\nexport function resolveCommsDir(args: string[], repoRoot: string): string {\n // Check --comms-dir flag\n const idx = args.indexOf(\"--comms-dir\");\n if (idx !== -1 && args[idx + 1]) {\n return path.resolve(args[idx + 1]);\n }\n\n // Delegate to config resolution (env > local > shared > auto)\n const { config } = resolveConfig({}, repoRoot);\n return config.commsDir;\n}\n\nexport function createAdapterContext(\n commsDir: string,\n repoRoot: string,\n): AdapterContext {\n // Use config-resolved stateDir if available\n const { config } = resolveConfig({}, repoRoot);\n return {\n commsDir: path.resolve(commsDir),\n repoRoot: path.resolve(repoRoot),\n stateDir: config.stateDir,\n platform: detectPlatform(),\n };\n}\n\nexport function parseArgs(args: string[]): {\n positional: string[];\n flags: Record<string, string | boolean>;\n} {\n const positional: string[] = [];\n const flags: Record<string, string | boolean> = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith(\"--\")) {\n const key = arg.slice(2);\n const next = args[i + 1];\n if (next && !next.startsWith(\"--\")) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n } else if (arg.startsWith(\"-\")) {\n flags[arg.slice(1)] = true;\n } else {\n positional.push(arg);\n }\n }\n\n return { positional, flags };\n}\n\n// ─── JSON mode suppression ──────────────────────────────────────\n\nlet _jsonMode = false;\n\nexport function setJsonMode(enabled: boolean): void {\n _jsonMode = enabled;\n}\n\nexport function log(message: string): void {\n if (!_jsonMode) console.log(` ${message}`);\n}\n\nexport function logSuccess(message: string): void {\n if (!_jsonMode) console.log(` + ${message}`);\n}\n\nexport function logWarn(message: string): void {\n if (!_jsonMode) console.log(` ! ${message}`);\n}\n\nexport function logError(message: string): void {\n if (!_jsonMode) console.error(` x ${message}`);\n}\n\nexport function logHeader(message: string): void {\n if (!_jsonMode) console.log(`\\n ${message}\\n`);\n}\n\n// ─── Instance ID utilities ─────────────────────────────────────\n\nexport type ResolveResult =\n | { ok: true; instanceId: InstanceId }\n | { ok: false; code: CommandCode; message: string };\n\n/**\n * Resolve a user-provided identifier to an instance ID.\n * Accepts either an exact instance ID or a runtime name (if unambiguous).\n */\nexport function resolveInstanceId(\n identifier: string,\n state: TapState,\n): ResolveResult {\n // Exact match\n if (state.instances[identifier]) {\n return { ok: true, instanceId: identifier };\n }\n\n // Runtime name → find matching instances\n if (isValidRuntime(identifier)) {\n const matches = Object.values(state.instances).filter(\n (inst) => inst.runtime === identifier,\n );\n\n if (matches.length === 1) {\n return { ok: true, instanceId: matches[0].instanceId };\n }\n\n if (matches.length > 1) {\n const ids = matches.map((m) => m.instanceId).join(\", \");\n return {\n ok: false,\n code: \"TAP_INSTANCE_AMBIGUOUS\",\n message: `Multiple ${identifier} instances found: ${ids}. Specify one explicitly.`,\n };\n }\n }\n\n return {\n ok: false,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `Instance not found: ${identifier}`,\n };\n}\n\n/** Build an instance ID from runtime + optional name. */\nexport function buildInstanceId(\n runtime: RuntimeName,\n name?: string,\n): InstanceId {\n return name ? `${runtime}-${name}` : runtime;\n}\n\n/** Extract the runtime name from an instance ID. */\nexport function extractRuntimeFromInstanceId(id: InstanceId): RuntimeName {\n for (const r of VALID_RUNTIMES) {\n if (id === r || id.startsWith(`${r}-`)) return r;\n }\n throw new Error(`Cannot extract runtime from instance ID: ${id}`);\n}\n\n/** Check if a port is already claimed by another instance. */\nexport function findPortConflict(\n state: TapState,\n port: number,\n excludeInstanceId?: InstanceId,\n): InstanceId | null {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (id !== excludeInstanceId && inst.port === port) return id;\n }\n return null;\n}\n\n/** Find the next available port starting from basePort (default 4501). */\nexport function findNextAvailablePort(\n state: TapState,\n basePort: number = 4501,\n excludeInstanceId?: InstanceId,\n): number {\n let port = basePort;\n while (findPortConflict(state, port, excludeInstanceId) !== null) {\n port++;\n }\n return port;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n TapSharedConfig,\n TapLocalConfig,\n TapResolvedConfig,\n ConfigSource,\n ConfigResolution,\n} from \"./types.js\";\n\n// ─── File names ────────────────────────────────────────────────\n\nexport const SHARED_CONFIG_FILE = \"tap-config.json\";\nexport const LOCAL_CONFIG_FILE = \"tap-config.local.json\";\nexport const LEGACY_CONFIG_FILE = \".tap-config\";\n\n// ─── Defaults ──────────────────────────────────────────────────\n\nconst DEFAULT_RUNTIME_COMMAND = \"node\";\nconst DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\n\n// ─── Repo root discovery ───────────────────────────────────────\n\nimport { _noGitWarned, _setNoGitWarned } from \"../utils.js\";\n\nexport function findRepoRoot(startDir: string = process.cwd()): string {\n let dir = path.resolve(startDir);\n while (true) {\n if (fs.existsSync(path.join(dir, \".git\"))) return dir;\n if (fs.existsSync(path.join(dir, \"package.json\"))) {\n if (!_noGitWarned) {\n _setNoGitWarned();\n console.error(\n \"[tap] warning: No .git directory found. Resolved via package.json. Use --comms-dir to specify explicitly.\",\n );\n }\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n if (!_noGitWarned) {\n _setNoGitWarned();\n console.error(\n \"[tap] warning: No git repository found. Using cwd as root. Run 'git init' or use --comms-dir.\",\n );\n }\n return process.cwd();\n}\n\n// ─── JSON file loading ─────────────────────────────────────────\n\nfunction loadJsonFile<T>(filePath: string): T | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nexport function loadSharedConfig(repoRoot: string): TapSharedConfig | null {\n return loadJsonFile<TapSharedConfig>(path.join(repoRoot, SHARED_CONFIG_FILE));\n}\n\nexport function loadLocalConfig(repoRoot: string): TapLocalConfig | null {\n return loadJsonFile<TapLocalConfig>(path.join(repoRoot, LOCAL_CONFIG_FILE));\n}\n\nfunction readLegacyShellValue(configText: string, key: string): string | null {\n const match = configText.match(new RegExp(`^${key}=\"?(.+?)\"?$`, \"m\"));\n return match?.[1]?.trim() || null;\n}\n\nfunction loadLegacyShellConfig(repoRoot: string): TapSharedConfig | null {\n const filePath = path.join(repoRoot, LEGACY_CONFIG_FILE);\n if (!fs.existsSync(filePath)) return null;\n\n try {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n const commsDir = readLegacyShellValue(raw, \"TAP_COMMS_DIR\");\n if (!commsDir) return null;\n return { commsDir };\n } catch {\n return null;\n }\n}\n\n// ─── CLI overrides ─────────────────────────────────────────────\n\nexport interface ConfigOverrides {\n commsDir?: string;\n stateDir?: string;\n runtimeCommand?: string;\n appServerUrl?: string;\n}\n\n// ─── Resolution ────────────────────────────────────────────────\n\n/**\n * Resolve config with priority: CLI flag > env > local config > shared config > auto.\n */\nexport function resolveConfig(\n overrides: ConfigOverrides = {},\n startDir?: string,\n): ConfigResolution {\n const repoRoot = findRepoRoot(startDir);\n const shared = loadSharedConfig(repoRoot) ?? {};\n const local = loadLocalConfig(repoRoot) ?? {};\n const legacy = loadLegacyShellConfig(repoRoot) ?? {};\n\n const sources: Record<keyof TapResolvedConfig, ConfigSource> = {\n repoRoot: \"auto\",\n commsDir: \"auto\",\n stateDir: \"auto\",\n runtimeCommand: \"auto\",\n appServerUrl: \"auto\",\n towerName: \"auto\",\n };\n\n // ─── commsDir ──────────────────────────────────────────────\n let commsDir: string;\n if (overrides.commsDir) {\n commsDir = resolvePath(repoRoot, overrides.commsDir);\n sources.commsDir = \"cli-flag\";\n } else if (process.env.TAP_COMMS_DIR) {\n commsDir = resolvePath(repoRoot, process.env.TAP_COMMS_DIR);\n sources.commsDir = \"env\";\n } else if (local.commsDir) {\n commsDir = resolvePath(repoRoot, local.commsDir);\n sources.commsDir = \"local-config\";\n } else if (shared.commsDir) {\n commsDir = resolvePath(repoRoot, shared.commsDir);\n sources.commsDir = \"shared-config\";\n } else if (legacy.commsDir) {\n commsDir = resolvePath(repoRoot, legacy.commsDir);\n sources.commsDir = \"legacy-shell-config\";\n } else {\n commsDir = path.join(repoRoot, \"tap-comms\");\n }\n\n // ─── stateDir ──────────────────────────────────────────────\n let stateDir: string;\n if (overrides.stateDir) {\n stateDir = resolvePath(repoRoot, overrides.stateDir);\n sources.stateDir = \"cli-flag\";\n } else if (process.env.TAP_STATE_DIR) {\n stateDir = resolvePath(repoRoot, process.env.TAP_STATE_DIR);\n sources.stateDir = \"env\";\n } else if (local.stateDir) {\n stateDir = resolvePath(repoRoot, local.stateDir);\n sources.stateDir = \"local-config\";\n } else if (shared.stateDir) {\n stateDir = resolvePath(repoRoot, shared.stateDir);\n sources.stateDir = \"shared-config\";\n } else {\n stateDir = path.join(repoRoot, \".tap-comms\");\n }\n\n // ─── runtimeCommand ────────────────────────────────────────\n let runtimeCommand: string;\n if (overrides.runtimeCommand) {\n runtimeCommand = overrides.runtimeCommand;\n sources.runtimeCommand = \"cli-flag\";\n } else if (process.env.TAP_RUNTIME_COMMAND) {\n runtimeCommand = process.env.TAP_RUNTIME_COMMAND;\n sources.runtimeCommand = \"env\";\n } else if (local.runtimeCommand) {\n runtimeCommand = local.runtimeCommand;\n sources.runtimeCommand = \"local-config\";\n } else if (shared.runtimeCommand) {\n runtimeCommand = shared.runtimeCommand;\n sources.runtimeCommand = \"shared-config\";\n } else {\n runtimeCommand = DEFAULT_RUNTIME_COMMAND;\n }\n\n // ─── appServerUrl ──────────────────────────────────────────\n let appServerUrl: string;\n if (overrides.appServerUrl) {\n appServerUrl = overrides.appServerUrl;\n sources.appServerUrl = \"cli-flag\";\n } else if (process.env.TAP_APP_SERVER_URL) {\n appServerUrl = process.env.TAP_APP_SERVER_URL;\n sources.appServerUrl = \"env\";\n } else if (local.appServerUrl) {\n appServerUrl = local.appServerUrl;\n sources.appServerUrl = \"local-config\";\n } else if (shared.appServerUrl) {\n appServerUrl = shared.appServerUrl;\n sources.appServerUrl = \"shared-config\";\n } else {\n appServerUrl = DEFAULT_APP_SERVER_URL;\n }\n\n // ─── towerName ──────────────────────────────────────────────\n const towerName = local.towerName ?? shared.towerName ?? null;\n\n return {\n config: {\n repoRoot,\n commsDir,\n stateDir,\n runtimeCommand,\n appServerUrl,\n towerName,\n },\n sources,\n };\n}\n\n// ─── Save helpers ──────────────────────────────────────────────\n\nexport function saveSharedConfig(\n repoRoot: string,\n config: TapSharedConfig,\n): void {\n const filePath = path.join(repoRoot, SHARED_CONFIG_FILE);\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\nexport function saveLocalConfig(\n repoRoot: string,\n config: TapLocalConfig,\n): void {\n const filePath = path.join(repoRoot, LOCAL_CONFIG_FILE);\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\n// ─── Helpers ───────────────────────────────────────────────────\n\n/** Resolve a path relative to repoRoot, or keep absolute as-is. */\nfunction resolvePath(repoRoot: string, p: string): string {\n const normalized = normalizeTapPath(p);\n return path.isAbsolute(normalized)\n ? normalized\n : path.resolve(repoRoot, normalized);\n}\n\nfunction normalizeTapPath(input: string): string {\n const trimmed = input.trim().replace(/^[\"'`]+|[\"'`]+$/g, \"\");\n if (/^[A-Za-z]:[\\\\/]/.test(trimmed)) {\n return trimmed;\n }\n\n // MSYS/Git Bash `/c/...` → `C:\\...` conversion — Windows only.\n // On POSIX, `/d/...` is a legitimate absolute path and must not be rewritten.\n if (process.platform === \"win32\") {\n const match = trimmed.match(/^\\/([A-Za-z])\\/(.*)$/);\n if (match) {\n return `${match[1].toUpperCase()}:\\\\${match[2].replace(/\\//g, \"\\\\\")}`;\n }\n }\n\n return trimmed;\n}\n","export type {\n TapSharedConfig,\n TapLocalConfig,\n TapResolvedConfig,\n ConfigSource,\n ConfigResolution,\n} from \"./types.js\";\n\nexport {\n LEGACY_CONFIG_FILE,\n SHARED_CONFIG_FILE,\n LOCAL_CONFIG_FILE,\n findRepoRoot,\n loadSharedConfig,\n loadLocalConfig,\n resolveConfig,\n saveSharedConfig,\n saveLocalConfig,\n} from \"./resolve.js\";\n\nexport type { ConfigOverrides } from \"./resolve.js\";\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as crypto from \"node:crypto\";\nimport type {\n TapState,\n TapStateV1,\n InstanceState,\n InstanceId,\n RuntimeName,\n OwnedArtifact,\n} from \"./types.js\";\nimport { resolveConfig } from \"./config/index.js\";\n\nconst STATE_FILE = \"state.json\";\nconst SCHEMA_VERSION = 2;\n\nexport function getStateDir(repoRoot: string): string {\n const { config } = resolveConfig({}, repoRoot);\n return config.stateDir;\n}\n\nexport function getStatePath(repoRoot: string): string {\n return path.join(getStateDir(repoRoot), STATE_FILE);\n}\n\nexport function stateExists(repoRoot: string): boolean {\n return fs.existsSync(getStatePath(repoRoot));\n}\n\n// ─── v1 → v2 Migration ────────────────────────────────────────\n\nexport function migrateStateV1toV2(v1: TapStateV1): TapState {\n const instances: Record<InstanceId, InstanceState> = {};\n\n for (const [runtime, rs] of Object.entries(v1.runtimes)) {\n if (!rs) continue;\n const instanceId = runtime as InstanceId; // default instance = runtime name\n instances[instanceId] = {\n instanceId,\n runtime: runtime as RuntimeName,\n agentName: null,\n port: null,\n headless: null,\n ...rs,\n };\n }\n\n return {\n schemaVersion: SCHEMA_VERSION,\n createdAt: v1.createdAt,\n updatedAt: v1.updatedAt,\n commsDir: v1.commsDir,\n repoRoot: v1.repoRoot,\n packageVersion: v1.packageVersion,\n instances,\n };\n}\n\n// ─── Load / Save ───────────────────────────────────────────────\n\nexport function loadState(repoRoot: string): TapState | null {\n const statePath = getStatePath(repoRoot);\n if (!fs.existsSync(statePath)) return null;\n\n const raw = fs.readFileSync(statePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n\n // Auto-migrate v1 → v2\n if (parsed.schemaVersion === 1 || parsed.runtimes) {\n const migrated = migrateStateV1toV2(parsed as TapStateV1);\n saveState(repoRoot, migrated);\n return migrated;\n }\n\n return parsed as TapState;\n}\n\nexport function saveState(repoRoot: string, state: TapState): void {\n const stateDir = getStateDir(repoRoot);\n fs.mkdirSync(stateDir, { recursive: true });\n const statePath = getStatePath(repoRoot);\n const tmp = `${statePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(state, null, 2), \"utf-8\");\n fs.renameSync(tmp, statePath);\n}\n\nexport function createInitialState(\n commsDir: string,\n repoRoot: string,\n packageVersion: string,\n): TapState {\n const now = new Date().toISOString();\n return {\n schemaVersion: SCHEMA_VERSION,\n createdAt: now,\n updatedAt: now,\n commsDir: path.resolve(commsDir),\n repoRoot: path.resolve(repoRoot),\n packageVersion,\n instances: {},\n };\n}\n\n// ─── Instance CRUD ─────────────────────────────────────────────\n\nexport function updateInstanceState(\n state: TapState,\n instanceId: InstanceId,\n instanceState: InstanceState,\n): TapState {\n return {\n ...state,\n updatedAt: new Date().toISOString(),\n instances: {\n ...state.instances,\n [instanceId]: instanceState,\n },\n };\n}\n\nexport function removeInstanceState(\n state: TapState,\n instanceId: InstanceId,\n): TapState {\n const { [instanceId]: _removed, ...remaining } = state.instances;\n return {\n ...state,\n updatedAt: new Date().toISOString(),\n instances: remaining,\n };\n}\n\nexport function getInstalledInstances(state: TapState): InstanceId[] {\n return (Object.keys(state.instances) as InstanceId[]).filter(\n (id) => state.instances[id]?.installed,\n );\n}\n\nexport function getInstanceArtifacts(\n state: TapState,\n instanceId: InstanceId,\n): OwnedArtifact[] {\n return state.instances[instanceId]?.ownedArtifacts ?? [];\n}\n\n// ─── Backup ────────────────────────────────────────────────────\n\nexport function ensureBackupDir(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n const backupDir = path.join(stateDir, \"backups\", instanceId);\n fs.mkdirSync(backupDir, { recursive: true });\n return backupDir;\n}\n\nexport function backupFile(filePath: string, backupDir: string): string {\n const basename = path.basename(filePath);\n const hash = fileHash(filePath);\n const backupPath = path.join(backupDir, `${basename}.${hash}.bak`);\n fs.copyFileSync(filePath, backupPath);\n return backupPath;\n}\n\nexport function fileHash(filePath: string): string {\n if (!fs.existsSync(filePath)) return \"\";\n const content = fs.readFileSync(filePath);\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n","import * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type { AdapterContext } from \"../types.js\";\n\nexport interface CommandProbe {\n command: string | null;\n version: string | null;\n}\n\nexport interface ManagedMcpServerSpec {\n command: string | null;\n args: string[];\n env: Record<string, string>;\n sourcePath: string | null;\n warnings: string[];\n issues: string[];\n}\n\nexport function probeCommand(candidates: string[]): CommandProbe {\n for (const candidate of candidates) {\n const result = spawnSync(candidate, [\"--version\"], {\n encoding: \"utf-8\",\n shell: process.platform === \"win32\",\n });\n\n if (result.status === 0) {\n const version =\n `${result.stdout ?? \"\"}${result.stderr ?? \"\"}`.trim() || null;\n return { command: candidate, version };\n }\n }\n\n return { command: null, version: null };\n}\n\nexport function getHomeDir(): string {\n return os.homedir();\n}\n\nexport function toForwardSlashPath(filePath: string): string {\n return path.resolve(filePath).replace(/\\\\/g, \"/\");\n}\n\nexport function canWriteOrCreate(filePath: string): boolean {\n try {\n if (fs.existsSync(filePath)) {\n fs.accessSync(filePath, fs.constants.W_OK);\n return true;\n }\n\n const parent = path.dirname(filePath);\n fs.mkdirSync(parent, { recursive: true });\n fs.accessSync(parent, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Detect paths that are ephemeral (npm _npx cache, fnm multishell, temp dirs). */\nfunction isEphemeralPath(p: string): boolean {\n const normalized = p.replace(/\\\\/g, \"/\").toLowerCase();\n return (\n normalized.includes(\"/_npx/\") ||\n normalized.includes(\"\\\\_npx\\\\\") ||\n normalized.includes(\"/fnm_multishells/\") ||\n normalized.includes(\"\\\\fnm_multishells\\\\\") ||\n normalized.includes(\"/tmp/\") ||\n normalized.includes(\"\\\\temp\\\\\")\n );\n}\n\nexport function findLocalTapCommsSource(ctx: AdapterContext): string | null {\n const candidates = [\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-plugin\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n path.join(\n ctx.repoRoot,\n \"node_modules\",\n \"@hua-labs\",\n \"tap-plugin\",\n \"channels\",\n \"tap-comms.ts\",\n ),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function findBundledTapCommsSource(\n metaUrl: string = import.meta.url,\n): string | null {\n const moduleDir = path.dirname(fileURLToPath(metaUrl));\n const candidates = [\n path.join(moduleDir, \"mcp-server.mjs\"),\n path.join(moduleDir, \"..\", \"mcp-server.mjs\"),\n path.join(moduleDir, \"..\", \"mcp-server.ts\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\nexport function findTapCommsServerEntry(\n ctx: AdapterContext,\n metaUrl: string = import.meta.url,\n): string | null {\n return findBundledTapCommsSource(metaUrl) ?? findLocalTapCommsSource(ctx);\n}\n\nexport function findPreferredBunCommand(): string | null {\n const home = getHomeDir();\n const candidates =\n process.platform === \"win32\"\n ? [path.join(home, \".bun\", \"bin\", \"bun.exe\"), \"bun\", \"bun.cmd\"]\n : [path.join(home, \".bun\", \"bin\", \"bun\"), \"bun\"];\n\n for (const candidate of candidates) {\n if (path.isAbsolute(candidate) && !fs.existsSync(candidate)) continue;\n\n const result = spawnSync(candidate, [\"--version\"], {\n encoding: \"utf-8\",\n shell: process.platform === \"win32\",\n });\n if (result.status === 0) {\n return path.isAbsolute(candidate)\n ? toForwardSlashPath(candidate)\n : candidate;\n }\n }\n\n return null;\n}\n\nexport function buildManagedMcpServerSpec(\n ctx: AdapterContext,\n instanceId?: string,\n): ManagedMcpServerSpec {\n const sourcePath = findTapCommsServerEntry(ctx);\n const bunCommand = findPreferredBunCommand();\n const warnings: string[] = [];\n const issues: string[] = [];\n\n const env: Record<string, string> = {\n TAP_AGENT_NAME: ctx.agentName ?? \"<set-per-session>\",\n TAP_COMMS_DIR: toForwardSlashPath(ctx.commsDir),\n TAP_STATE_DIR: toForwardSlashPath(ctx.stateDir),\n TAP_REPO_ROOT: toForwardSlashPath(ctx.repoRoot),\n };\n if (instanceId) {\n env.TAP_AGENT_ID = instanceId;\n }\n\n if (!sourcePath) {\n issues.push(\n \"tap-comms MCP server entry not found. Reinstall @hua-labs/tap or run from a repo with packages/tap-plugin/channels/ available.\",\n );\n return { command: null, args: [], env, sourcePath, warnings, issues };\n }\n\n // Prefer bun for .ts source files; for compiled .mjs, node works too\n const isBundled = sourcePath.endsWith(\".mjs\");\n let command: string | null = bunCommand;\n let args: string[] = [toForwardSlashPath(sourcePath)];\n\n if (!command && isBundled) {\n // Detect ephemeral paths (npx cache, fnm multishell) — use stable alternatives\n const isEphemeralSource = isEphemeralPath(sourcePath);\n const isEphemeralNode = isEphemeralPath(process.execPath);\n\n if (isEphemeralSource) {\n // npx cache path → use `npx @hua-labs/tap serve` as stable launcher\n command = \"npx\";\n args = [\"@hua-labs/tap\", \"serve\"];\n warnings.push(\n \"Detected npx cache path. Using `npx @hua-labs/tap serve` as stable MCP launcher.\",\n );\n } else if (isEphemeralNode) {\n // fnm multishell node → use bare `node` (resolved from PATH at runtime)\n command = \"node\";\n warnings.push(\n \"Detected ephemeral node path. Using `node` from PATH for MCP config stability.\",\n );\n } else {\n command = toForwardSlashPath(process.execPath);\n }\n\n if (!isEphemeralSource) {\n warnings.push(\n \"bun not found; using node to run the compiled MCP server. Install bun for better performance.\",\n );\n }\n }\n\n if (!command) {\n issues.push(\n \"bun is required to run the repo-local tap-comms MCP server (.ts source). Install bun: https://bun.sh\",\n );\n return { command: null, args: [], env, sourcePath, warnings, issues };\n }\n\n return {\n command,\n args,\n env,\n sourcePath,\n warnings,\n issues,\n };\n}\n","/**\n * Common Node.js runtime resolver for all tap-comms child processes.\n *\n * Resolution chain:\n * .node-version + fnm probe → configured command → tsx fallback\n *\n * Extracted from codex-bridge-runner.ts (M69) to share across:\n * - bridge engine spawn\n * - bridge runner spawn\n * - future CLI commands\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport type RuntimeSource = \"fnm\" | \"config\" | \"path\" | \"tsx-fallback\" | \"bun\";\n\nexport interface ResolvedRuntime {\n /** Absolute path or command name for the resolved runtime. */\n command: string;\n /** Whether --experimental-strip-types is supported and should be used. */\n supportsStripTypes: boolean;\n /** Where the runtime was resolved from (for diagnostics). */\n source: RuntimeSource;\n /** Detected major version, if available. */\n majorVersion: number | null;\n}\n\n// ─── .node-version ─────────────────────────────────────────────\n\nexport function readNodeVersion(repoRoot: string): string | null {\n const nvFile = path.join(repoRoot, \".node-version\");\n if (!fs.existsSync(nvFile)) return null;\n try {\n const raw = fs.readFileSync(nvFile, \"utf-8\").trim();\n return raw.length > 0 ? raw.replace(/^v/, \"\") : null;\n } catch {\n return null;\n }\n}\n\n// ─── fnm probe ─────────────────────────────────────────────────\n\nfunction fnmCandidateDirs(): string[] {\n if (process.platform === \"win32\") {\n return [\n process.env.FNM_DIR,\n process.env.APPDATA ? path.join(process.env.APPDATA, \"fnm\") : null,\n process.env.LOCALAPPDATA\n ? path.join(process.env.LOCALAPPDATA, \"fnm\")\n : null,\n process.env.USERPROFILE\n ? path.join(process.env.USERPROFILE, \"scoop\", \"persist\", \"fnm\")\n : null,\n ].filter(Boolean) as string[];\n }\n // macOS / Linux\n return [\n process.env.FNM_DIR,\n process.env.HOME\n ? path.join(process.env.HOME, \".local\", \"share\", \"fnm\")\n : null,\n process.env.HOME ? path.join(process.env.HOME, \".fnm\") : null,\n process.env.XDG_DATA_HOME\n ? path.join(process.env.XDG_DATA_HOME, \"fnm\")\n : null,\n ].filter(Boolean) as string[];\n}\n\nfunction nodeExecutableName(): string {\n return process.platform === \"win32\" ? \"node.exe\" : \"node\";\n}\n\nexport function probeFnmNode(desiredVersion: string): string | null {\n const dirs = fnmCandidateDirs();\n const exe = nodeExecutableName();\n\n for (const baseDir of dirs) {\n const candidate = path.join(\n baseDir,\n \"node-versions\",\n `v${desiredVersion}`,\n \"installation\",\n exe,\n );\n if (!fs.existsSync(candidate)) continue;\n\n try {\n const v = execSync(`\"${candidate}\" --version`, {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n if (v.startsWith(`v${desiredVersion.split(\".\")[0]}.`)) {\n return candidate;\n }\n } catch {\n // candidate exists but doesn't work — skip\n }\n }\n\n return null;\n}\n\n// ─── Version detection ─────────────────────────────────────────\n\nexport function detectNodeMajorVersion(command: string): number | null {\n try {\n const version = execSync(`\"${command}\" --version`, {\n encoding: \"utf-8\",\n timeout: 5000,\n }).trim();\n const match = version.match(/^v?(\\d+)\\./);\n return match ? parseInt(match[1], 10) : null;\n } catch {\n return null;\n }\n}\n\nexport function checkStripTypesSupport(command: string): boolean {\n const major = detectNodeMajorVersion(command);\n if (major !== null && major >= 22) return true;\n try {\n execSync(`\"${command}\" --experimental-strip-types -e \"\"`, {\n timeout: 5000,\n stdio: \"pipe\",\n });\n return true;\n } catch {\n return false;\n }\n}\n\n// ─── tsx fallback ──────────────────────────────────────────────\n\nexport function findTsxFallback(repoRoot: string): string | null {\n const candidates = [\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx.exe\"),\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx.CMD\"),\n path.join(repoRoot, \"node_modules\", \".bin\", \"tsx\"),\n ];\n for (const c of candidates) {\n if (fs.existsSync(c)) return c;\n }\n return null;\n}\n\n// ─── fnm bin directory (for PATH prepending) ───────────────────\n\n/**\n * Returns the directory containing the fnm-managed node binary,\n * suitable for prepending to PATH in child processes.\n */\nexport function getFnmBinDir(repoRoot: string): string | null {\n const desiredVersion = readNodeVersion(repoRoot);\n if (!desiredVersion) return null;\n\n const nodePath = probeFnmNode(desiredVersion);\n if (!nodePath) return null;\n\n return path.dirname(nodePath);\n}\n\n// ─── Main resolver ─────────────────────────────────────────────\n\n/**\n * Resolve the Node.js runtime to use for spawning child processes.\n *\n * Priority: bun passthrough → .node-version + fnm → configured command → tsx fallback\n */\nexport function resolveNodeRuntime(\n configCommand: string,\n repoRoot: string,\n): ResolvedRuntime {\n // Bun: native TS support, no strip-types needed\n if (configCommand === \"bun\" || configCommand.endsWith(\"bun.exe\")) {\n return {\n command: configCommand,\n supportsStripTypes: false,\n source: \"bun\",\n majorVersion: null,\n };\n }\n\n // .node-version + fnm discovery\n const desiredVersion = readNodeVersion(repoRoot);\n if (desiredVersion) {\n const fnmNode = probeFnmNode(desiredVersion);\n if (fnmNode) {\n const major = detectNodeMajorVersion(fnmNode);\n return {\n command: fnmNode,\n supportsStripTypes: checkStripTypesSupport(fnmNode),\n source: \"fnm\",\n majorVersion: major,\n };\n }\n }\n\n // Configured command (from config or PATH)\n const major = detectNodeMajorVersion(configCommand);\n if (major !== null) {\n return {\n command: configCommand,\n supportsStripTypes: checkStripTypesSupport(configCommand),\n source: major === detectNodeMajorVersion(\"node\") ? \"path\" : \"config\",\n majorVersion: major,\n };\n }\n\n // tsx fallback\n const tsx = findTsxFallback(repoRoot);\n if (tsx) {\n return {\n command: tsx,\n supportsStripTypes: false,\n source: \"tsx-fallback\",\n majorVersion: null,\n };\n }\n\n // Last resort\n return {\n command: configCommand,\n supportsStripTypes: false,\n source: \"path\",\n majorVersion: null,\n };\n}\n\n// ─── Env builder for child processes ───────────────────────────\n\n/**\n * Build an env object with fnm Node prepended to PATH.\n * Use this when spawning child processes that need the correct Node.\n */\nexport function buildRuntimeEnv(\n repoRoot: string,\n baseEnv: NodeJS.ProcessEnv = process.env,\n): NodeJS.ProcessEnv {\n const fnmBin = getFnmBinDir(repoRoot);\n if (!fnmBin) return { ...baseEnv };\n\n const pathKey = process.platform === \"win32\" ? \"Path\" : \"PATH\";\n const currentPath = baseEnv[pathKey] ?? baseEnv.PATH ?? \"\";\n\n return {\n ...baseEnv,\n [pathKey]: `${fnmBin}${path.delimiter}${currentPath}`,\n };\n}\n","export type { ResolvedRuntime, RuntimeSource } from \"./resolve-node.js\";\n\nexport {\n resolveNodeRuntime,\n buildRuntimeEnv,\n readNodeVersion,\n probeFnmNode,\n detectNodeMajorVersion,\n checkStripTypesSupport,\n findTsxFallback,\n getFnmBinDir,\n} from \"./resolve-node.js\";\n","import * as fs from \"node:fs\";\nimport * as net from \"node:net\";\nimport * as path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { spawn, spawnSync, execSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n RuntimeName,\n InstanceId,\n BridgeState,\n AppServerState,\n AppServerAuthState,\n HeadlessConfig,\n Platform,\n TapState,\n} from \"../types.js\";\nimport { probeCommand } from \"../adapters/common.js\";\nimport { resolveNodeRuntime, buildRuntimeEnv } from \"../runtime/index.js\";\nimport { loadState } from \"../state.js\";\n\nexport interface BridgeStartOptions {\n instanceId: InstanceId;\n runtime: RuntimeName;\n stateDir: string;\n commsDir: string;\n bridgeScript: string;\n platform: Platform;\n agentName?: string;\n runtimeCommand?: string;\n appServerUrl?: string;\n repoRoot?: string;\n port?: number;\n /** Headless configuration. Passed as env vars to the bridge process. */\n headless?: HeadlessConfig | null;\n /** Bridge script operational flags (forwarded to codex-app-server-bridge.ts) */\n busyMode?: \"steer\" | \"wait\";\n pollSeconds?: number;\n reconnectSeconds?: number;\n messageLookbackMinutes?: number;\n threadId?: string;\n ephemeral?: boolean;\n processExistingMessages?: boolean;\n manageAppServer?: boolean;\n /** Skip auth gateway — app-server listens directly on the public port (localhost only). */\n noAuth?: boolean;\n}\n\nexport interface BridgeStopOptions {\n instanceId: InstanceId;\n stateDir: string;\n platform: Platform;\n}\n\ninterface EnsureCodexAppServerOptions {\n instanceId: InstanceId;\n stateDir: string;\n repoRoot: string;\n platform: Platform;\n appServerUrl: string;\n existingAppServer?: AppServerState | null;\n noAuth?: boolean;\n}\n\ninterface ManagedAppServerGatewayOptions {\n instanceId: InstanceId;\n stateDir: string;\n repoRoot: string;\n platform: Platform;\n publicUrl: string;\n}\n\ninterface WebSocketLike {\n addEventListener(\n type: \"open\" | \"error\" | \"close\",\n listener: () => void,\n options?: { once?: boolean },\n ): void;\n close(code?: number, reason?: string): void;\n}\n\ntype WebSocketCtor = new (url: string) => WebSocketLike;\n\nconst DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\nconst APP_SERVER_HEALTH_TIMEOUT_MS = 1_500;\nconst APP_SERVER_START_TIMEOUT_MS = 20_000;\nconst APP_SERVER_GATEWAY_START_TIMEOUT_MS = 5_000;\nconst APP_SERVER_HEALTH_RETRY_MS = 250;\nconst APP_SERVER_AUTH_QUERY_PARAM = \"tap_token\";\nconst APP_SERVER_AUTH_FILE_MODE = 0o600;\n\nfunction appServerLogFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return path.join(stateDir, \"logs\", `app-server-${instanceId}.log`);\n}\n\nfunction appServerGatewayLogFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return path.join(stateDir, \"logs\", `app-server-gateway-${instanceId}.log`);\n}\n\nfunction appServerGatewayTokenFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return path.join(\n stateDir,\n \"secrets\",\n `app-server-gateway-${instanceId}.token`,\n );\n}\n\nfunction stderrLogFilePath(logPath: string): string {\n return `${logPath}.stderr`;\n}\n\nfunction writeProtectedTextFile(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, content, {\n encoding: \"utf-8\",\n mode: APP_SERVER_AUTH_FILE_MODE,\n });\n fs.chmodSync(tmp, APP_SERVER_AUTH_FILE_MODE);\n fs.renameSync(tmp, filePath);\n fs.chmodSync(filePath, APP_SERVER_AUTH_FILE_MODE);\n}\n\nfunction removeFileIfExists(filePath: string | null | undefined): void {\n if (!filePath || !fs.existsSync(filePath)) {\n return;\n }\n\n try {\n fs.unlinkSync(filePath);\n } catch {\n // Best-effort cleanup only.\n }\n}\n\nfunction getWebSocketCtor(): WebSocketCtor | null {\n const candidate = (globalThis as { WebSocket?: unknown }).WebSocket;\n return typeof candidate === \"function\" ? (candidate as WebSocketCtor) : null;\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isLoopbackHost(hostname: string): boolean {\n return hostname === \"127.0.0.1\" || hostname === \"localhost\";\n}\n\nfunction resolveCodexCommand(platform: Platform): string | null {\n const candidates =\n platform === \"win32\"\n ? [\"codex.cmd\", \"codex.exe\", \"codex\", \"codex.ps1\"]\n : [\"codex\"];\n return probeCommand(candidates).command;\n}\n\nfunction formatCodexAppServerCommand(command: string, url: string): string {\n return `${command} app-server --listen ${url}`;\n}\n\nfunction resolvePowerShellCommand(): string {\n return (\n probeCommand([\"pwsh\", \"powershell\", \"powershell.exe\"]).command ??\n \"powershell\"\n );\n}\n\nfunction resolveAuthGatewayScript(repoRoot: string): string | null {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(moduleDir, \"..\", \"bridges\", \"codex-app-server-auth-gateway.mjs\"),\n path.join(moduleDir, \"..\", \"bridges\", \"codex-app-server-auth-gateway.ts\"),\n path.join(\n repoRoot,\n \"packages\",\n \"tap-comms\",\n \"dist\",\n \"bridges\",\n \"codex-app-server-auth-gateway.mjs\",\n ),\n path.join(\n repoRoot,\n \"packages\",\n \"tap-comms\",\n \"src\",\n \"bridges\",\n \"codex-app-server-auth-gateway.ts\",\n ),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nexport function getBridgeRuntimeStateDir(\n repoRoot: string,\n instanceId: InstanceId,\n): string {\n return path.join(repoRoot, \".tmp\", `codex-app-server-bridge-${instanceId}`);\n}\n\nasync function allocateLoopbackPort(hostname: string): Promise<number> {\n const bindHost = hostname === \"localhost\" ? \"127.0.0.1\" : hostname;\n return await new Promise<number>((resolve, reject) => {\n const server = net.createServer();\n server.unref();\n server.once(\"error\", reject);\n server.listen(0, bindHost, () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close(() => {\n reject(new Error(\"Failed to allocate a loopback port\"));\n });\n return;\n }\n\n const port = address.port;\n server.close((error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve(port);\n });\n });\n });\n}\n\nfunction buildProtectedAppServerUrl(publicUrl: string, token: string): string {\n const url = new URL(publicUrl);\n url.searchParams.set(APP_SERVER_AUTH_QUERY_PARAM, token);\n return url.toString().replace(/\\/(?=\\?|$)/, \"\");\n}\n\nfunction readGatewayTokenFromPath(tokenPath: string): string {\n return fs.readFileSync(tokenPath, \"utf8\").trim();\n}\n\nfunction readGatewayToken(\n auth: AppServerAuthState | null | undefined,\n): string | null {\n if (!auth) {\n return null;\n }\n\n const legacyToken = (auth as AppServerAuthState & { token?: string }).token;\n if (legacyToken?.trim()) {\n return legacyToken.trim();\n }\n\n if (!auth.tokenPath || !fs.existsSync(auth.tokenPath)) {\n return null;\n }\n\n const fileToken = readGatewayTokenFromPath(auth.tokenPath);\n return fileToken || null;\n}\n\nfunction materializeGatewayTokenFile(\n stateDir: string,\n instanceId: InstanceId,\n publicUrl: string,\n auth: AppServerAuthState,\n): AppServerAuthState {\n if (auth.tokenPath && fs.existsSync(auth.tokenPath)) {\n return auth;\n }\n\n const token = readGatewayToken(auth);\n if (!token) {\n throw new Error(`Missing auth gateway token for ${instanceId}`);\n }\n\n const tokenPath = appServerGatewayTokenFilePath(stateDir, instanceId);\n writeProtectedTextFile(tokenPath, `${token}\\n`);\n return {\n ...auth,\n protectedUrl: buildProtectedAppServerUrl(publicUrl, \"***\"),\n tokenPath,\n };\n}\n\nasync function createManagedAppServerAuth(\n options: ManagedAppServerGatewayOptions,\n): Promise<AppServerAuthState> {\n const publicUrl = new URL(options.publicUrl);\n const upstreamUrl = new URL(options.publicUrl);\n upstreamUrl.port = String(await allocateLoopbackPort(publicUrl.hostname));\n upstreamUrl.search = \"\";\n upstreamUrl.hash = \"\";\n\n const gatewayScript = resolveAuthGatewayScript(options.repoRoot);\n if (!gatewayScript) {\n throw new Error(\"Auth gateway script not found\");\n }\n\n const token = randomBytes(24).toString(\"base64url\");\n const tokenPath = appServerGatewayTokenFilePath(\n options.stateDir,\n options.instanceId,\n );\n writeProtectedTextFile(tokenPath, `${token}\\n`);\n const protectedUrl = buildProtectedAppServerUrl(options.publicUrl, \"***\");\n\n const gatewayLogPath = appServerGatewayLogFilePath(\n options.stateDir,\n options.instanceId,\n );\n fs.mkdirSync(path.dirname(gatewayLogPath), { recursive: true });\n rotateLog(gatewayLogPath);\n\n const runtime = resolveNodeRuntime(process.execPath, options.repoRoot);\n const gatewayArgs: string[] = [];\n if (gatewayScript.endsWith(\".ts\")) {\n if (!runtime.supportsStripTypes) {\n throw new Error(\n \"Current Node runtime cannot start the auth gateway from TypeScript source. Rebuild @hua-labs/tap or use Node 22.6+.\",\n );\n }\n gatewayArgs.push(\"--experimental-strip-types\");\n }\n gatewayArgs.push(gatewayScript);\n\n const gatewayEnv = {\n ...buildRuntimeEnv(options.repoRoot),\n TAP_GATEWAY_LISTEN_URL: options.publicUrl,\n TAP_GATEWAY_UPSTREAM_URL: upstreamUrl.toString().replace(/\\/$/, \"\"),\n TAP_GATEWAY_TOKEN_FILE: tokenPath,\n };\n\n let gatewayPid: number | null;\n {\n let logFd: number | null = null;\n try {\n if (options.platform === \"win32\") {\n gatewayPid = startWindowsDetachedProcess(\n runtime.command,\n gatewayArgs,\n options.repoRoot,\n gatewayLogPath,\n gatewayEnv,\n );\n } else {\n logFd = fs.openSync(gatewayLogPath, \"a\");\n const child = spawn(runtime.command, gatewayArgs, {\n cwd: options.repoRoot,\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: gatewayEnv,\n windowsHide: true,\n });\n child.unref();\n gatewayPid = child.pid ?? null;\n }\n } catch (error) {\n removeFileIfExists(tokenPath);\n throw error;\n } finally {\n if (logFd != null) {\n fs.closeSync(logFd);\n }\n }\n }\n\n if (gatewayPid == null) {\n removeFileIfExists(tokenPath);\n throw new Error(\"Failed to spawn app-server auth gateway\");\n }\n\n return {\n mode: \"query-token\",\n protectedUrl,\n upstreamUrl: upstreamUrl.toString().replace(/\\/$/, \"\"),\n tokenPath,\n gatewayPid,\n gatewayLogPath,\n };\n}\n\nfunction canReuseManagedAppServer(\n appServer: AppServerState | null | undefined,\n): boolean {\n if (!appServer?.managed) {\n return false;\n }\n\n // App-server process must be alive\n if (appServer.pid != null && !isProcessAlive(appServer.pid)) {\n return false;\n }\n\n const auth = appServer.auth;\n if (auth) {\n // Auth mode: verify gateway token and process are intact\n if (!auth.protectedUrl) {\n return false;\n }\n if (!readGatewayToken(auth)) {\n return false;\n }\n if (auth.gatewayPid != null && !isProcessAlive(auth.gatewayPid)) {\n return false;\n }\n }\n // No-auth mode (auth is null): only the app-server process check above is needed\n\n return true;\n}\n\nfunction markAppServerHealthy(appServer: AppServerState): AppServerState {\n const checkedAt = new Date().toISOString();\n return {\n ...appServer,\n healthy: true,\n lastCheckedAt: checkedAt,\n lastHealthyAt: checkedAt,\n };\n}\n\nfunction findReusableManagedAppServer(\n stateDir: string,\n publicUrl: string,\n): AppServerState | null {\n const pidDir = path.join(stateDir, \"pids\");\n if (!fs.existsSync(pidDir)) {\n return null;\n }\n\n for (const name of fs.readdirSync(pidDir)) {\n if (!name.startsWith(\"bridge-\") || !name.endsWith(\".json\")) {\n continue;\n }\n\n try {\n const raw = fs.readFileSync(path.join(pidDir, name), \"utf-8\");\n const parsed = JSON.parse(raw) as BridgeState;\n if (parsed.appServer?.url !== publicUrl) {\n continue;\n }\n if (canReuseManagedAppServer(parsed.appServer)) {\n return markAppServerHealthy(parsed.appServer!);\n }\n } catch {\n // Ignore stale or corrupted bridge state.\n }\n }\n\n return null;\n}\n\nfunction startWindowsDetachedProcess(\n command: string,\n args: string[],\n repoRoot: string,\n logPath: string,\n env: NodeJS.ProcessEnv = process.env,\n): number | null {\n const ext = path.extname(command).toLowerCase();\n const stderrLogPath = stderrLogFilePath(logPath);\n const stdoutFd = fs.openSync(logPath, \"a\");\n const stderrFd = fs.openSync(stderrLogPath, \"a\");\n\n try {\n const child =\n ext === \".ps1\"\n ? spawn(\n resolvePowerShellCommand(),\n [\"-NoLogo\", \"-NoProfile\", \"-File\", command, ...args],\n {\n cwd: repoRoot,\n detached: true,\n stdio: [\"ignore\", stdoutFd, stderrFd],\n env,\n windowsHide: true,\n },\n )\n : spawn(command, args, {\n cwd: repoRoot,\n detached: true,\n stdio: [\"ignore\", stdoutFd, stderrFd],\n env,\n windowsHide: true,\n shell: ext === \".cmd\" || ext === \".bat\",\n });\n\n child.unref();\n return child.pid ?? null;\n } finally {\n fs.closeSync(stdoutFd);\n fs.closeSync(stderrFd);\n }\n}\n\nfunction startWindowsCodexAppServer(\n command: string,\n url: string,\n repoRoot: string,\n logPath: string,\n): number | null {\n return startWindowsDetachedProcess(\n command,\n [\"app-server\", \"--listen\", url],\n repoRoot,\n logPath,\n );\n}\n\nfunction findListeningProcessId(\n url: string,\n platform: Platform,\n): number | null {\n if (platform !== \"win32\") {\n return null;\n }\n\n let port: number | null;\n try {\n const parsed = new URL(url);\n port = parsed.port ? Number.parseInt(parsed.port, 10) : null;\n } catch {\n return null;\n }\n\n if (port == null || !Number.isFinite(port)) {\n return null;\n }\n\n const result = spawnSync(\n resolvePowerShellCommand(),\n [\n \"-NoLogo\",\n \"-NoProfile\",\n \"-Command\",\n [\n `$port = ${port}`,\n \"$processId = Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1 -ExpandProperty OwningProcess\",\n \"if ($processId) { $processId }\",\n ].join(\"; \"),\n ],\n {\n encoding: \"utf-8\",\n windowsHide: true,\n },\n );\n\n if (result.status !== 0) {\n return null;\n }\n\n const parsedPid = Number.parseInt((result.stdout ?? \"\").trim(), 10);\n return Number.isFinite(parsedPid) ? parsedPid : null;\n}\n\nexport function resolveAppServerUrl(\n baseUrl: string | undefined,\n port?: number,\n): string {\n const resolvedBase = (baseUrl ?? DEFAULT_APP_SERVER_URL).replace(/\\/$/, \"\");\n if (port == null) {\n return resolvedBase;\n }\n\n try {\n const parsed = new URL(resolvedBase);\n parsed.port = String(port);\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return resolvedBase;\n }\n}\n\nexport async function isTcpPortAvailable(\n hostname: string,\n port: number,\n): Promise<boolean> {\n const bindHost = hostname === \"localhost\" ? \"127.0.0.1\" : hostname;\n return await new Promise<boolean>((resolve) => {\n const server = net.createServer();\n server.unref();\n server.once(\"error\", () => resolve(false));\n server.listen(port, bindHost, () => {\n server.close((error) => resolve(!error));\n });\n });\n}\n\nexport async function findNextAvailableAppServerPort(\n state: TapState,\n baseUrl: string | undefined,\n basePort: number = 4501,\n excludeInstanceId?: InstanceId,\n): Promise<number> {\n let hostname = \"127.0.0.1\";\n try {\n hostname = new URL(baseUrl ?? DEFAULT_APP_SERVER_URL).hostname;\n } catch {\n // Fall back to the default loopback host.\n }\n\n const maxAttempts = 1000;\n let port = basePort;\n for (let attempt = 0; attempt < maxAttempts; attempt += 1, port += 1) {\n const claimedInState = Object.entries(state.instances).some(\n ([id, inst]) => id !== excludeInstanceId && inst.port === port,\n );\n if (claimedInState) {\n continue;\n }\n\n if (!isLoopbackHost(hostname)) {\n return port;\n }\n\n if (await isTcpPortAvailable(hostname, port)) {\n return port;\n }\n }\n\n throw new Error(\n `Failed to find a free app-server port starting at ${basePort}`,\n );\n}\n\nexport async function checkAppServerHealth(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n): Promise<boolean> {\n const WebSocket = getWebSocketCtor();\n if (!WebSocket) {\n return false;\n }\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n let socket: WebSocketLike | null = null;\n\n const finish = (healthy: boolean) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n try {\n socket?.close();\n } catch {\n // Best-effort cleanup only.\n }\n resolve(healthy);\n };\n\n const timer = setTimeout(() => finish(false), timeoutMs);\n\n try {\n socket = new WebSocket(url);\n socket.addEventListener(\"open\", () => finish(true), { once: true });\n socket.addEventListener(\"error\", () => finish(false), { once: true });\n socket.addEventListener(\"close\", () => finish(false), { once: true });\n } catch {\n finish(false);\n }\n });\n}\n\nasync function waitForAppServerHealth(\n url: string,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n if (await checkAppServerHealth(url)) {\n return true;\n }\n await delay(APP_SERVER_HEALTH_RETRY_MS);\n }\n\n return false;\n}\n\nasync function terminateProcess(\n pid: number,\n platform: Platform,\n): Promise<boolean> {\n if (!isProcessAlive(pid)) {\n return false;\n }\n\n try {\n if (platform === \"win32\") {\n execSync(`taskkill /PID ${pid} /F /T`, { stdio: \"pipe\" });\n } else {\n process.kill(pid, \"SIGTERM\");\n await delay(2_000);\n if (isProcessAlive(pid)) {\n process.kill(pid, \"SIGKILL\");\n }\n }\n } catch {\n // Best effort. The caller only needs a boolean outcome.\n }\n\n return !isProcessAlive(pid);\n}\n\nexport async function stopManagedAppServer(\n appServer: AppServerState,\n platform: Platform,\n): Promise<boolean> {\n if (!appServer.managed) {\n return false;\n }\n\n let stopped = false;\n if (appServer.auth?.gatewayPid != null) {\n stopped =\n (await terminateProcess(appServer.auth.gatewayPid, platform)) || stopped;\n }\n if (appServer.pid != null) {\n stopped = (await terminateProcess(appServer.pid, platform)) || stopped;\n }\n removeFileIfExists(appServer.auth?.tokenPath);\n return stopped;\n}\n\nexport async function ensureCodexAppServer(\n options: EnsureCodexAppServerOptions,\n): Promise<AppServerState> {\n const effectiveUrl = resolveAppServerUrl(options.appServerUrl);\n const fallbackManualCommand = formatCodexAppServerCommand(\n \"codex\",\n effectiveUrl,\n );\n if (\n options.existingAppServer?.url === effectiveUrl &&\n canReuseManagedAppServer(options.existingAppServer)\n ) {\n return markAppServerHealthy(options.existingAppServer);\n }\n\n const sharedManaged = findReusableManagedAppServer(\n options.stateDir,\n effectiveUrl,\n );\n if (sharedManaged) {\n return sharedManaged;\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(effectiveUrl);\n } catch {\n throw new Error(\n `Invalid app-server URL: ${effectiveUrl}\\nStart it manually:\\n ${fallbackManualCommand}`,\n );\n }\n\n if (!isLoopbackHost(parsedUrl.hostname)) {\n throw new Error(\n `Auto-start only supports loopback app-server URLs. Current URL: ${effectiveUrl}\\nStart it manually:\\n ${fallbackManualCommand}`,\n );\n }\n\n if (await checkAppServerHealth(effectiveUrl)) {\n const hint = options.noAuth\n ? \"Stop it first or use --no-server for an unmanaged external app-server.\"\n : \"A listener is already running, so tap cannot insert the auth gateway there.\\nStop it first or use --no-server for an unmanaged external app-server.\";\n throw new Error(`${effectiveUrl}: ${hint}`);\n }\n\n const resolvedCommand = resolveCodexCommand(options.platform);\n if (!resolvedCommand) {\n throw new Error(\n `Codex CLI not found in PATH.\\nStart the app-server manually:\\n ${fallbackManualCommand}`,\n );\n }\n\n const logPath = appServerLogFilePath(options.stateDir, options.instanceId);\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n rotateLog(logPath);\n\n // --no-auth: start app-server directly on the public URL (no gateway).\n // TUI and bridge both connect to the same port without token auth.\n if (options.noAuth) {\n const manualCommand = formatCodexAppServerCommand(\"codex\", effectiveUrl);\n let pid: number | null;\n\n if (options.platform === \"win32\") {\n try {\n pid = startWindowsCodexAppServer(\n resolvedCommand,\n effectiveUrl,\n options.repoRoot,\n logPath,\n );\n } catch (err) {\n throw new Error(\n `Failed to spawn Codex app-server: ${err instanceof Error ? err.message : String(err)}\\nStart it manually:\\n ${manualCommand}`,\n { cause: err },\n );\n }\n } else {\n const logFd = fs.openSync(logPath, \"a\");\n try {\n const child = spawn(\n resolvedCommand,\n [\"app-server\", \"--listen\", effectiveUrl],\n {\n cwd: options.repoRoot,\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: process.env,\n windowsHide: true,\n },\n );\n child.unref();\n pid = child.pid ?? null;\n } catch (err) {\n throw new Error(\n `Failed to spawn Codex app-server: ${err instanceof Error ? err.message : String(err)}\\nStart it manually:\\n ${manualCommand}`,\n { cause: err },\n );\n } finally {\n fs.closeSync(logFd);\n }\n }\n\n if (pid == null) {\n throw new Error(\n `Failed to spawn Codex app-server.\\nStart it manually:\\n ${manualCommand}`,\n );\n }\n\n const healthy = await waitForAppServerHealth(\n effectiveUrl,\n APP_SERVER_START_TIMEOUT_MS,\n );\n if (!healthy) {\n await terminateProcess(pid, options.platform);\n throw new Error(\n `Codex app-server did not become healthy at ${effectiveUrl}.\\nCheck ${logPath}\\nOr start it manually:\\n ${manualCommand}`,\n );\n }\n\n pid = findListeningProcessId(effectiveUrl, options.platform) ?? pid;\n const healthyAt = new Date().toISOString();\n return {\n url: effectiveUrl,\n pid,\n managed: true,\n healthy: true,\n lastCheckedAt: healthyAt,\n lastHealthyAt: healthyAt,\n logPath,\n manualCommand,\n auth: null,\n };\n }\n\n // Default: auth gateway mode — gateway on publicUrl, app-server on random upstream port\n const auth = await createManagedAppServerAuth({\n instanceId: options.instanceId,\n stateDir: options.stateDir,\n repoRoot: options.repoRoot,\n platform: options.platform,\n publicUrl: effectiveUrl,\n });\n const manualCommand = formatCodexAppServerCommand(\"codex\", auth.upstreamUrl);\n\n let pid: number | null;\n\n if (options.platform === \"win32\") {\n try {\n pid = startWindowsCodexAppServer(\n resolvedCommand,\n auth.upstreamUrl,\n options.repoRoot,\n logPath,\n );\n } catch (err) {\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Failed to spawn Codex app-server: ${err instanceof Error ? err.message : String(err)}\\nStart it manually:\\n ${manualCommand}`,\n { cause: err },\n );\n }\n } else {\n const logFd = fs.openSync(logPath, \"a\");\n\n try {\n const child = spawn(\n resolvedCommand,\n [\"app-server\", \"--listen\", auth.upstreamUrl],\n {\n cwd: options.repoRoot,\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: process.env,\n windowsHide: true,\n },\n );\n\n child.unref();\n pid = child.pid ?? null;\n } catch (err) {\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Failed to spawn Codex app-server: ${err instanceof Error ? err.message : String(err)}\\nStart it manually:\\n ${manualCommand}`,\n { cause: err },\n );\n } finally {\n fs.closeSync(logFd);\n }\n }\n\n if (pid == null) {\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Failed to spawn Codex app-server.\\nStart it manually:\\n ${manualCommand}`,\n );\n }\n\n const healthy = await waitForAppServerHealth(\n auth.upstreamUrl,\n APP_SERVER_START_TIMEOUT_MS,\n );\n\n if (!healthy) {\n await terminateProcess(pid, options.platform);\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Codex app-server did not become healthy at ${auth.upstreamUrl}.\\nCheck ${logPath}\\nOr start it manually:\\n ${manualCommand}`,\n );\n }\n\n const gatewayToken = readGatewayToken(auth);\n if (!gatewayToken) {\n await terminateProcess(pid, options.platform);\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\"Tap auth gateway token is missing after startup.\");\n }\n\n const gatewayHealthy = await waitForAppServerHealth(\n buildProtectedAppServerUrl(effectiveUrl, gatewayToken),\n APP_SERVER_GATEWAY_START_TIMEOUT_MS,\n );\n if (!gatewayHealthy) {\n await terminateProcess(pid, options.platform);\n if (auth.gatewayPid != null) {\n await terminateProcess(auth.gatewayPid, options.platform);\n }\n removeFileIfExists(auth.tokenPath);\n throw new Error(\n `Tap auth gateway did not become healthy at ${effectiveUrl}.\\nCheck ${auth.gatewayLogPath ?? \"the gateway log\"} and ${logPath}.`,\n );\n }\n\n const healthyAt = new Date().toISOString();\n pid = findListeningProcessId(auth.upstreamUrl, options.platform) ?? pid;\n return {\n url: effectiveUrl,\n pid,\n managed: true,\n healthy: true,\n lastCheckedAt: healthyAt,\n lastHealthyAt: healthyAt,\n logPath,\n manualCommand,\n auth,\n };\n}\n\nfunction pidFilePath(stateDir: string, instanceId: InstanceId): string {\n return path.join(stateDir, \"pids\", `bridge-${instanceId}.json`);\n}\n\nfunction logFilePath(stateDir: string, instanceId: InstanceId): string {\n return path.join(stateDir, \"logs\", `bridge-${instanceId}.log`);\n}\n\nfunction runtimeHeartbeatFilePath(runtimeStateDir: string): string {\n return path.join(runtimeStateDir, \"heartbeat.json\");\n}\n\nfunction loadRuntimeHeartbeatTimestamp(\n runtimeStateDir: string | null | undefined,\n): string | null {\n if (!runtimeStateDir) {\n return null;\n }\n\n const heartbeatPath = runtimeHeartbeatFilePath(runtimeStateDir);\n if (!fs.existsSync(heartbeatPath)) {\n return null;\n }\n\n try {\n const raw = fs.readFileSync(heartbeatPath, \"utf-8\");\n const parsed = JSON.parse(raw) as { updatedAt?: string };\n return typeof parsed.updatedAt === \"string\" ? parsed.updatedAt : null;\n } catch {\n return null;\n }\n}\n\nfunction resolveHeartbeatTimestamp(\n state: BridgeState | null | undefined,\n): string | null {\n return (\n loadRuntimeHeartbeatTimestamp(state?.runtimeStateDir) ??\n state?.lastHeartbeat ??\n null\n );\n}\n\nexport function loadBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n): BridgeState | null {\n const pidPath = pidFilePath(stateDir, instanceId);\n if (!fs.existsSync(pidPath)) return null;\n\n try {\n const raw = fs.readFileSync(pidPath, \"utf-8\");\n return JSON.parse(raw) as BridgeState;\n } catch {\n return null;\n }\n}\n\nexport function saveBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n state: BridgeState,\n): void {\n const pidPath = pidFilePath(stateDir, instanceId);\n const serializable = JSON.parse(JSON.stringify(state)) as BridgeState & {\n appServer?: { auth?: { token?: string } | null } | null;\n };\n if (serializable.appServer?.auth) {\n delete serializable.appServer.auth.token;\n }\n writeProtectedTextFile(pidPath, JSON.stringify(serializable, null, 2));\n}\n\nexport function clearBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n): void {\n const pidPath = pidFilePath(stateDir, instanceId);\n if (fs.existsSync(pidPath)) {\n fs.unlinkSync(pidPath);\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function isBridgeRunning(\n stateDir: string,\n instanceId: InstanceId,\n): boolean {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return false;\n return isProcessAlive(state.pid);\n}\n\n// ─── Testable helpers (extracted for unit testing) ─────────────\n\n/**\n * Resolve agent name: explicit > state.json > env.\n * Exported for direct testing without spawning a process.\n */\nexport function resolveAgentName(\n instanceId: InstanceId,\n explicit?: string,\n context?: { repoRoot?: string; stateDir?: string },\n): string | null {\n if (explicit) return explicit;\n\n // state.json SSOT (#784 backwrite)\n try {\n const repoRoot =\n context?.repoRoot ??\n context?.stateDir?.replace(/[\\\\/].tap-comms$/, \"\") ??\n process.cwd();\n const state = loadState(repoRoot);\n const stateAgent = state?.instances[instanceId]?.agentName;\n if (stateAgent) return stateAgent;\n } catch {\n // state read failed — fall through\n }\n\n return process.env.TAP_AGENT_NAME || process.env.CODEX_TAP_AGENT_NAME || null;\n}\n\n/**\n * Infer restart mode from current bridge/instance state.\n * Priority: explicit flags > saved instance mode > bridge state inference > defaults.\n */\nexport function inferRestartMode(\n bridgeState: BridgeState | null,\n flags?: { noServer?: boolean; noAuth?: boolean },\n savedMode?: { manageAppServer?: boolean; noAuth?: boolean },\n): { manageAppServer: boolean; noAuth: boolean } {\n const wasManaged = bridgeState?.appServer != null;\n const hadAuth = bridgeState?.appServer?.auth != null;\n\n const manageAppServer =\n flags?.noServer === true\n ? false\n : flags?.noServer === undefined\n ? (savedMode?.manageAppServer ?? wasManaged)\n : true;\n const noAuth =\n flags?.noAuth === true\n ? true\n : flags?.noAuth === undefined\n ? (savedMode?.noAuth ?? !hadAuth)\n : false;\n\n return { manageAppServer, noAuth };\n}\n\n/**\n * Clean up headless dispatch files from inbox.\n * Matches YYYYMMDD-headless-{agent}-review-PR{n}.md pattern.\n */\nexport function cleanupHeadlessDispatch(\n inboxDir: string,\n agentName: string,\n): string[] {\n const removed: string[] = [];\n if (!fs.existsSync(inboxDir)) return removed;\n\n const normalizedAgent = agentName.replace(/-/g, \"_\");\n const marker = `-headless-${normalizedAgent}-review-`;\n\n try {\n for (const file of fs.readdirSync(inboxDir)) {\n if (file.includes(marker)) {\n fs.unlinkSync(path.join(inboxDir, file));\n removed.push(file);\n }\n }\n } catch {\n // best-effort\n }\n\n return removed;\n}\n\nexport async function startBridge(\n options: BridgeStartOptions,\n): Promise<BridgeState> {\n const {\n instanceId,\n runtime,\n stateDir,\n commsDir,\n bridgeScript,\n agentName,\n port,\n } = options;\n\n const resolvedAgent = resolveAgentName(instanceId, agentName, {\n repoRoot: options.repoRoot,\n stateDir,\n });\n\n if (!resolvedAgent) {\n throw new Error(\n `No agent name for ${instanceId} bridge. ` +\n `Set TAP_AGENT_NAME env var or pass --agent-name flag.`,\n );\n }\n\n // Check if already running\n if (isBridgeRunning(stateDir, instanceId)) {\n const existing = loadBridgeState(stateDir, instanceId)!;\n throw new Error(\n `Bridge for ${instanceId} is already running (PID: ${existing.pid})`,\n );\n }\n\n const previousBridgeState = loadBridgeState(stateDir, instanceId);\n const previousAppServer = previousBridgeState?.appServer ?? null;\n\n // Clear stale PID\n clearBridgeState(stateDir, instanceId);\n\n const logPath = logFilePath(stateDir, instanceId);\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n\n // Log rotation: rename existing log to .prev\n rotateLog(logPath);\n\n let logFd: number | null = null;\n\n // Use explicit repoRoot (not derived from stateDir — stateDir may be external)\n const repoRoot = options.repoRoot ?? path.resolve(stateDir, \"..\");\n const runtimeStateDir = getBridgeRuntimeStateDir(repoRoot, instanceId);\n const resolved = resolveNodeRuntime(\n options.runtimeCommand ?? \"node\",\n repoRoot,\n );\n const command = resolved.command;\n\n // Build env with fnm Node prepended to PATH so the bridge runner's\n // 2nd-stage spawn also finds the correct Node (결 finding: 2-stage spawn)\n const runtimeEnv = buildRuntimeEnv(repoRoot);\n const effectiveAppServerUrl = resolveAppServerUrl(options.appServerUrl, port);\n let appServer: AppServerState | null = null;\n let bridgeAppServerUrl = effectiveAppServerUrl;\n\n if (runtime === \"codex\" && options.manageAppServer) {\n appServer = await ensureCodexAppServer({\n instanceId,\n stateDir,\n repoRoot,\n platform: options.platform,\n appServerUrl: effectiveAppServerUrl,\n existingAppServer: previousAppServer,\n noAuth: options.noAuth,\n });\n if (appServer.auth) {\n appServer = {\n ...appServer,\n auth: materializeGatewayTokenFile(\n stateDir,\n instanceId,\n effectiveAppServerUrl,\n appServer.auth,\n ),\n };\n }\n bridgeAppServerUrl = effectiveAppServerUrl;\n }\n\n // Spawn detached process — pass both command and strip-types metadata\n // so the runner doesn't re-guess (avoids bun + --experimental-strip-types)\n try {\n const bridgeEnv = {\n ...runtimeEnv,\n TAP_COMMS_DIR: commsDir,\n TAP_STATE_DIR: runtimeStateDir,\n TAP_BRIDGE_RUNTIME: runtime,\n TAP_BRIDGE_INSTANCE_ID: instanceId,\n TAP_AGENT_ID: instanceId,\n TAP_AGENT_NAME: resolvedAgent,\n CODEX_TAP_AGENT_NAME: resolvedAgent,\n TAP_RESOLVED_NODE: resolved.command,\n TAP_STRIP_TYPES: resolved.supportsStripTypes ? \"1\" : \"0\",\n ...(bridgeAppServerUrl\n ? { CODEX_APP_SERVER_URL: bridgeAppServerUrl }\n : {}),\n ...(appServer?.auth?.tokenPath\n ? { TAP_GATEWAY_TOKEN_FILE: appServer.auth.tokenPath }\n : {}),\n ...(port != null ? { TAP_BRIDGE_PORT: String(port) } : {}),\n ...(options.headless?.enabled\n ? {\n TAP_HEADLESS: \"true\",\n TAP_AGENT_ROLE: options.headless.role,\n TAP_MAX_REVIEW_ROUNDS: String(options.headless.maxRounds),\n TAP_QUALITY_FLOOR: options.headless.qualitySeverityFloor,\n }\n : {}),\n ...(options.busyMode ? { TAP_BUSY_MODE: options.busyMode } : {}),\n ...(options.pollSeconds != null\n ? { TAP_POLL_SECONDS: String(options.pollSeconds) }\n : {}),\n ...(options.reconnectSeconds != null\n ? { TAP_RECONNECT_SECONDS: String(options.reconnectSeconds) }\n : {}),\n ...(options.messageLookbackMinutes != null\n ? {\n TAP_MESSAGE_LOOKBACK_MINUTES: String(\n options.messageLookbackMinutes,\n ),\n }\n : {}),\n ...(options.threadId ? { TAP_THREAD_ID: options.threadId } : {}),\n ...(options.ephemeral ? { TAP_EPHEMERAL: \"true\" } : {}),\n ...(options.processExistingMessages\n ? { TAP_PROCESS_EXISTING: \"true\" }\n : {}),\n };\n\n let bridgePid: number | null = null;\n\n if (options.platform === \"win32\") {\n bridgePid = startWindowsDetachedProcess(\n command,\n [bridgeScript],\n repoRoot,\n logPath,\n bridgeEnv,\n );\n } else {\n logFd = fs.openSync(logPath, \"a\");\n const child = spawn(command, [bridgeScript], {\n detached: true,\n stdio: [\"ignore\", logFd, logFd],\n env: bridgeEnv,\n windowsHide: true,\n });\n\n child.unref();\n bridgePid = child.pid ?? null;\n }\n\n if (logFd != null) {\n fs.closeSync(logFd);\n logFd = null;\n }\n\n if (!bridgePid) {\n throw new Error(`Failed to spawn bridge process for ${instanceId}`);\n }\n\n const state: BridgeState = {\n pid: bridgePid,\n statePath: pidFilePath(stateDir, instanceId),\n lastHeartbeat: new Date().toISOString(),\n appServer,\n runtimeStateDir,\n };\n\n saveBridgeState(stateDir, instanceId, state);\n\n // NOTE: Heartbeat updates are the bridge process's responsibility.\n // The bridge script should periodically write to the PID file's lastHeartbeat field.\n // CLI only records the initial heartbeat at spawn time.\n\n return state;\n } catch (err) {\n if (logFd != null) {\n try {\n fs.closeSync(logFd);\n } catch {\n // Best-effort cleanup only.\n }\n }\n if (appServer?.managed) {\n await stopManagedAppServer(appServer, options.platform);\n }\n throw err;\n }\n}\n\nexport async function stopBridge(options: BridgeStopOptions): Promise<boolean> {\n const { instanceId, stateDir, platform } = options;\n const state = loadBridgeState(stateDir, instanceId);\n\n if (!state) {\n return false; // No PID file\n }\n\n if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return false; // Already dead\n }\n\n try {\n await terminateProcess(state.pid, platform);\n } catch {\n // Process may have already exited\n }\n\n clearBridgeState(stateDir, instanceId);\n return true;\n}\n\n// ─── Graceful restart ──────────────────────────────────────────\n\nexport interface RestartBridgeOptions extends BridgeStartOptions {\n /** Max seconds to wait for active turn to complete before killing. Default: 30 */\n drainTimeoutSeconds?: number;\n}\n\n/**\n * Graceful bridge restart: wait for active turn → cleanup → stop → start.\n * Prevents message loss during restart by draining active work first\n * and replaying unprocessed messages on the new instance.\n *\n * For headless instances: drain phase cleans up headless dispatch files\n * to prevent the new bridge from re-injecting completed review requests.\n * (별 finding: eager marking + replay collision)\n */\nexport async function restartBridge(\n options: RestartBridgeOptions,\n): Promise<BridgeState> {\n const { instanceId, stateDir, platform } = options;\n const drainTimeout = (options.drainTimeoutSeconds ?? 30) * 1000;\n const repoRoot = options.repoRoot ?? stateDir.replace(/[\\\\/].tap-comms$/, \"\");\n\n // Phase 1: Drain — wait for active turn to complete\n const runtimeStateDir = getBridgeRuntimeStateDir(repoRoot, instanceId);\n const heartbeatPath = path.join(runtimeStateDir, \"heartbeat.json\");\n\n if (fs.existsSync(heartbeatPath)) {\n const startWait = Date.now();\n while (Date.now() - startWait < drainTimeout) {\n try {\n const hb = JSON.parse(fs.readFileSync(heartbeatPath, \"utf-8\"));\n if (!hb.activeTurnId) break; // No active turn — safe to stop\n } catch {\n break; // Can't read heartbeat — proceed with stop\n }\n await new Promise((r) => setTimeout(r, 1000));\n }\n }\n\n // Phase 1.5: Clean up headless dispatch files (uses extracted helper)\n if (options.headless?.enabled && options.commsDir) {\n const agentName = options.agentName ?? instanceId;\n cleanupHeadlessDispatch(path.join(options.commsDir, \"inbox\"), agentName);\n }\n\n // Phase 2: Stop existing bridge\n await stopBridge({ instanceId, stateDir, platform });\n\n // Phase 3: Start new bridge with --process-existing-messages\n // This replays any messages that arrived during drain/restart\n const restartOptions: BridgeStartOptions = {\n ...options,\n processExistingMessages: true,\n };\n\n return startBridge(restartOptions);\n}\n\n// ─── Log rotation ──────────────────────────────────────────────\n\nexport function rotateLog(logPath: string): void {\n if (!fs.existsSync(logPath)) return;\n try {\n const stats = fs.statSync(logPath);\n if (stats.size === 0) return;\n const prevPath = `${logPath}.prev`;\n fs.renameSync(logPath, prevPath);\n } catch {\n // Best-effort: don't fail bridge start if rotation fails\n }\n}\n\n// ─── Heartbeat ─────────────────────────────────────────────────\n\n/**\n * Update the heartbeat timestamp for a running bridge.\n * Bridge processes should call this periodically.\n *\n * Only the owning process (matching PID) can update the heartbeat.\n * This prevents state dir collision when multiple writers exist.\n * See: 묵 finding — bridge-heartbeat-state-dir-collision\n */\nexport function updateBridgeHeartbeat(\n stateDir: string,\n instanceId: InstanceId,\n): void {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return;\n\n // Guard: only the owning process may update heartbeat\n if (state.pid !== process.pid) return;\n\n state.lastHeartbeat = new Date().toISOString();\n saveBridgeState(stateDir, instanceId, state);\n}\n\n/**\n * Get heartbeat age in seconds. Returns null if no state or no heartbeat.\n */\nexport function getHeartbeatAge(\n stateDir: string,\n instanceId: InstanceId,\n): number | null {\n const state = loadBridgeState(stateDir, instanceId);\n const heartbeat = resolveHeartbeatTimestamp(state);\n if (!heartbeat) return null;\n const heartbeatTime = new Date(heartbeat).getTime();\n if (isNaN(heartbeatTime)) return null;\n return Math.floor((Date.now() - heartbeatTime) / 1000);\n}\n\nexport function getBridgeHeartbeatTimestamp(\n stateDir: string,\n instanceId: InstanceId,\n): string | null {\n return resolveHeartbeatTimestamp(loadBridgeState(stateDir, instanceId));\n}\n\nexport function getBridgeStatus(\n stateDir: string,\n instanceId: InstanceId,\n): \"running\" | \"stopped\" | \"stale\" {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return \"stopped\";\n\n // Primary check: is the process actually alive?\n if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return \"stale\";\n }\n\n // Process is alive → running.\n // Heartbeat staleness is informational only — the bridge process\n // is responsible for updating lastHeartbeat. If it doesn't,\n // PID alive is still the authoritative signal.\n return \"running\";\n}\n","/**\n * Dashboard data collection engine.\n * Aggregates: agents (comms presence), bridges (state + PID), PRs (gh CLI).\n *\n * Ref: tap public repo tap-ops-dashboard.ps1 (single-agent view)\n * M74 extends to control-tower view (all agents, all bridges, all PRs).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { resolveConfig } from \"../config/index.js\";\nimport {\n loadBridgeState,\n getBridgeStatus,\n getHeartbeatAge,\n isProcessAlive,\n} from \"./bridge.js\";\nimport type { InstanceId } from \"../types.js\";\nimport { loadState } from \"../state.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport interface AgentInfo {\n name: string;\n status: string | null;\n lastActivity: string | null;\n joinedAt: string | null;\n}\n\nexport interface BridgeInfo {\n instanceId: string;\n runtime: string;\n status: \"running\" | \"stopped\" | \"stale\";\n pid: number | null;\n port: number | null;\n heartbeatAge: number | null;\n headless: boolean;\n}\n\nexport interface PRInfo {\n number: number;\n title: string;\n author: string;\n state: string;\n url: string;\n}\n\nexport interface DashboardWarning {\n level: \"warn\" | \"error\";\n message: string;\n}\n\nexport interface DashboardSnapshot {\n generatedAt: string;\n repoRoot: string;\n commsDir: string;\n agents: AgentInfo[];\n bridges: BridgeInfo[];\n prs: PRInfo[];\n warnings: DashboardWarning[];\n}\n\n// ─── Agent collection ──────────────────────────────────────────\n\nfunction collectAgents(commsDir: string): AgentInfo[] {\n // Read heartbeats.json (written by tap-comms MCP server)\n const heartbeatsPath = path.join(commsDir, \"heartbeats.json\");\n if (!fs.existsSync(heartbeatsPath)) return [];\n\n try {\n const raw = fs.readFileSync(heartbeatsPath, \"utf-8\");\n const data = JSON.parse(raw) as Record<\n string,\n {\n agent?: string;\n timestamp?: string;\n lastActivity?: string;\n status?: string;\n joinedAt?: string;\n }\n >;\n\n return Object.entries(data).map(([name, info]) => ({\n name: info.agent ?? name,\n status: info.status ?? null,\n lastActivity: info.lastActivity ?? info.timestamp ?? null,\n joinedAt: info.joinedAt ?? null,\n }));\n } catch {\n return [];\n }\n}\n\n// ─── Bridge collection ─────────────────────────────────────────\n\nfunction collectBridges(repoRoot: string): BridgeInfo[] {\n const state = loadState(repoRoot);\n const { config } = resolveConfig({}, repoRoot);\n const stateDir = config.stateDir;\n const bridges: BridgeInfo[] = [];\n\n // Collect from state.json instances (if initialized)\n if (state) {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (!inst?.installed) continue;\n if (inst.bridgeMode !== \"app-server\") continue;\n\n const instanceId = id as InstanceId;\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n\n bridges.push({\n instanceId: id,\n runtime: inst.runtime,\n status,\n pid: bridgeState?.pid ?? null,\n port: inst.port ?? null,\n heartbeatAge: age,\n headless: inst.headless?.enabled ?? false,\n });\n }\n }\n\n // Also scan .tmp/ for daemon state dirs (catches externally-launched bridges)\n const tmpDir = path.join(repoRoot, \".tmp\");\n if (fs.existsSync(tmpDir)) {\n try {\n const dirs = fs\n .readdirSync(tmpDir)\n .filter((d) => d.startsWith(\"codex-app-server-bridge\"));\n\n for (const dir of dirs) {\n const daemonPath = path.join(tmpDir, dir, \"bridge-daemon.json\");\n if (!fs.existsSync(daemonPath)) continue;\n\n try {\n const raw = fs.readFileSync(daemonPath, \"utf-8\");\n const daemon = JSON.parse(raw) as {\n pid?: number;\n startedAt?: string;\n appServerUrl?: string;\n };\n\n // Skip if already covered by state.json instances\n const alreadyCovered = bridges.some(\n (b) => b.pid === daemon.pid && b.pid !== null,\n );\n if (alreadyCovered) continue;\n\n const agentFile = path.join(tmpDir, dir, \"agent-name.txt\");\n const agentName = fs.existsSync(agentFile)\n ? fs.readFileSync(agentFile, \"utf-8\").trim()\n : dir;\n\n const running = daemon.pid ? isProcessAlive(daemon.pid) : false;\n const portMatch = daemon.appServerUrl?.match(/:(\\d+)/);\n const port = portMatch ? parseInt(portMatch[1], 10) : null;\n\n bridges.push({\n instanceId: agentName,\n runtime: \"codex\",\n status: running ? \"running\" : \"stale\",\n pid: daemon.pid ?? null,\n port,\n heartbeatAge: null,\n headless: false,\n });\n } catch {\n // Skip corrupted daemon files\n }\n }\n } catch {\n // .tmp/ read failed\n }\n }\n\n return bridges;\n}\n\n// ─── PR collection ─────────────────────────────────────────────\n\nfunction collectPRs(): PRInfo[] {\n try {\n const output = execSync(\n \"gh pr list --state all --limit 10 --json number,title,author,state,url\",\n { encoding: \"utf-8\", timeout: 10000, stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n );\n\n const prs = JSON.parse(output) as Array<{\n number: number;\n title: string;\n author: { login: string };\n state: string;\n url: string;\n }>;\n\n return prs.map((pr) => ({\n number: pr.number,\n title: pr.title,\n author: pr.author.login,\n state: pr.state,\n url: pr.url,\n }));\n } catch {\n return [];\n }\n}\n\n// ─── Warnings ──────────────────────────────────────────────────\n\nfunction collectWarnings(\n bridges: BridgeInfo[],\n agents: AgentInfo[],\n): DashboardWarning[] {\n const warnings: DashboardWarning[] = [];\n\n for (const bridge of bridges) {\n if (bridge.status === \"stale\") {\n warnings.push({\n level: \"warn\",\n message: `Bridge ${bridge.instanceId} is stale (PID ${bridge.pid} dead)`,\n });\n }\n if (\n bridge.status === \"running\" &&\n bridge.heartbeatAge !== null &&\n bridge.heartbeatAge > 60\n ) {\n warnings.push({\n level: \"warn\",\n message: `Bridge ${bridge.instanceId} heartbeat stale (${bridge.heartbeatAge}s ago)`,\n });\n }\n }\n\n if (bridges.length === 0) {\n warnings.push({\n level: \"warn\",\n message: \"No bridges configured\",\n });\n }\n\n if (agents.length === 0) {\n warnings.push({\n level: \"warn\",\n message: \"No agent heartbeats found\",\n });\n }\n\n return warnings;\n}\n\n// ─── Snapshot ──────────────────────────────────────────────────\n\nexport function collectDashboardSnapshot(\n repoRoot?: string,\n commsDirOverride?: string,\n): DashboardSnapshot {\n const { config } = resolveConfig(\n commsDirOverride ? { commsDir: commsDirOverride } : {},\n repoRoot,\n );\n const resolved = config;\n\n const agents = collectAgents(resolved.commsDir);\n const bridges = collectBridges(resolved.repoRoot);\n const prs = collectPRs();\n const warnings = collectWarnings(bridges, agents);\n\n return {\n generatedAt: new Date().toISOString(),\n repoRoot: resolved.repoRoot,\n commsDir: resolved.commsDir,\n agents,\n bridges,\n prs,\n warnings,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { fileHash, backupFile, ensureBackupDir } from \"../state.js\";\nimport { buildManagedMcpServerSpec } from \"./common.js\";\nimport type {\n RuntimeAdapter,\n AdapterContext,\n ProbeResult,\n PatchPlan,\n ApplyResult,\n VerifyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n VerifyCheck,\n} from \"../types.js\";\n\nconst MCP_SERVER_KEY = \"tap-comms\";\n\nfunction findMcpJsonPath(ctx: AdapterContext): string {\n return path.join(ctx.repoRoot, \".mcp.json\");\n}\n\nfunction findClaudeCommand(): string | null {\n try {\n execSync(\"claude --version\", { stdio: \"pipe\" });\n return \"claude\";\n } catch {\n return null;\n }\n}\n\nfunction buildMcpServerEntry(\n ctx: AdapterContext,\n): Record<string, unknown> | null {\n const managed = buildManagedMcpServerSpec(ctx, ctx.instanceId);\n if (!managed.command) return null;\n\n return {\n type: \"stdio\",\n command: managed.command,\n args: managed.args,\n env: managed.env,\n };\n}\n\nexport const claudeAdapter: RuntimeAdapter = {\n runtime: \"claude\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n\n const configPath = findMcpJsonPath(ctx);\n const configExists = fs.existsSync(configPath);\n const runtimeCommand = findClaudeCommand();\n const canWrite = configExists\n ? (() => {\n try {\n fs.accessSync(configPath, fs.constants.W_OK);\n return true;\n } catch {\n return false;\n }\n })()\n : true; // Can create new file\n\n if (!runtimeCommand) {\n warnings.push(\n \"Claude CLI not found in PATH. Config will be created but may need manual setup.\",\n );\n }\n\n const managed = buildManagedMcpServerSpec(ctx);\n warnings.push(...managed.warnings);\n issues.push(...managed.issues);\n\n // Check if comms dir exists\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(\n `Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`,\n );\n }\n\n return {\n installed: true, // Claude adapter always \"installed\" — .mcp.json is per-project\n configPath,\n configExists,\n runtimeCommand,\n version: null,\n canWrite,\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? findMcpJsonPath(ctx);\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts: OwnedArtifact[] = [];\n\n // Check for existing tap-comms entry\n if (probe.configExists) {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n try {\n const config = JSON.parse(raw);\n if (config.mcpServers?.[MCP_SERVER_KEY]) {\n conflicts.push(\n `Existing \"${MCP_SERVER_KEY}\" entry in .mcp.json will be overwritten.`,\n );\n }\n } catch {\n warnings.push(\n \".mcp.json exists but is not valid JSON. Will be overwritten.\",\n );\n }\n }\n\n const serverEntry = buildMcpServerEntry(ctx);\n\n if (!serverEntry) {\n warnings.push(\n \"tap-comms MCP server entry not found. Skipping .mcp.json patch. \" +\n \"Reinstall @hua-labs/tap or run from a repo with packages/tap-plugin/channels/ available.\",\n );\n return {\n runtime: \"claude\",\n operations: [],\n ownedArtifacts: [],\n backupDir: ensureBackupDir(ctx.stateDir, \"claude\"),\n restartRequired: false,\n conflicts,\n warnings,\n };\n }\n\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: `mcpServers.${MCP_SERVER_KEY}`,\n value: serverEntry,\n });\n\n ownedArtifacts.push({\n kind: \"json-path\",\n path: configPath,\n selector: `mcpServers.${MCP_SERVER_KEY}`,\n });\n\n const backupDir = ensureBackupDir(ctx.stateDir, \"claude\");\n\n return {\n runtime: \"claude\",\n operations,\n ownedArtifacts,\n backupDir,\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(_ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const changedFiles: string[] = [];\n const warnings: string[] = [];\n let appliedOps = 0;\n\n for (const op of plan.operations) {\n try {\n if (op.type === \"set\" || op.type === \"merge\") {\n // Read or create .mcp.json\n let config: Record<string, unknown> = {};\n if (fs.existsSync(op.path)) {\n // Backup first\n backupFile(op.path, plan.backupDir);\n const raw = fs.readFileSync(op.path, \"utf-8\");\n try {\n config = JSON.parse(raw);\n } catch {\n // Invalid JSON, start fresh but backup the original\n warnings.push(\n `${op.path} was invalid JSON. Created backup and starting fresh.`,\n );\n }\n }\n\n // Set nested key\n if (op.key) {\n setNestedKey(config, op.key, op.value);\n }\n\n // Write atomically\n const tmp = `${op.path}.tmp.${process.pid}`;\n fs.writeFileSync(\n tmp,\n JSON.stringify(config, null, 2) + \"\\n\",\n \"utf-8\",\n );\n fs.renameSync(tmp, op.path);\n changedFiles.push(op.path);\n appliedOps++;\n }\n } catch (err) {\n warnings.push(\n `Failed to apply op on ${op.path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n const lastAppliedHash =\n changedFiles.length > 0 ? fileHash(changedFiles[0]) : \"\";\n\n return {\n success: appliedOps > 0,\n appliedOps,\n backupCreated: true,\n lastAppliedHash,\n ownedArtifacts: plan.ownedArtifacts,\n changedFiles,\n restartRequired: plan.restartRequired,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const checks: VerifyCheck[] = [];\n const warnings: string[] = [];\n\n // 1. Config file exists\n const configPath = plan.operations[0]?.path;\n if (configPath) {\n checks.push({\n name: \"Config file exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath)\n ? undefined\n : `${configPath} not found`,\n });\n\n // 2. Config is valid JSON\n if (fs.existsSync(configPath)) {\n try {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(raw);\n checks.push({ name: \"Config is valid JSON\", passed: true });\n\n // 3. Managed entry present\n const entry = config.mcpServers?.[MCP_SERVER_KEY];\n checks.push({\n name: \"tap-comms entry present\",\n passed: !!entry,\n message: entry\n ? undefined\n : `mcpServers.${MCP_SERVER_KEY} not found`,\n });\n\n // 4. Entry has correct env\n if (entry) {\n const hasCommsDir =\n normalizeTapCommsDir(entry.env?.TAP_COMMS_DIR) ===\n normalizeTapCommsDir(ctx.commsDir);\n checks.push({\n name: \"TAP_COMMS_DIR configured\",\n passed: hasCommsDir,\n message: hasCommsDir ? undefined : `Expected ${ctx.commsDir}`,\n });\n }\n } catch {\n checks.push({\n name: \"Config is valid JSON\",\n passed: false,\n message: \"Parse error\",\n });\n }\n }\n }\n\n // 5. Comms dir exists\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir)\n ? undefined\n : `${ctx.commsDir} not found`,\n });\n\n // 6. Runtime command found\n const cmd = findClaudeCommand();\n checks.push({\n name: \"Claude CLI found\",\n passed: !!cmd,\n message: cmd ? undefined : \"claude not in PATH (non-blocking)\",\n });\n if (!cmd) {\n warnings.push(\n \"Claude CLI not in PATH. Config is ready but cannot verify runtime reads it.\",\n );\n }\n\n const ok = checks\n .filter((c) => c.name !== \"Claude CLI found\")\n .every((c) => c.passed);\n\n return { ok, checks, restartRequired: true, warnings };\n },\n\n bridgeMode(): BridgeMode {\n return \"native-push\";\n },\n};\n\n// ─── Helpers ────────────────────────────────────────────────────\n\nfunction setNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown,\n): void {\n const keys = keyPath.split(\".\");\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n\nfunction normalizeTapCommsDir(value: unknown): string {\n return typeof value === \"string\"\n ? path.resolve(value).replace(/\\\\/g, \"/\")\n : \"\";\n}\n","import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ArtifactKind } from \"./types.js\";\n\ntype BackupPayload =\n | {\n kind: \"json-path\";\n selector: string;\n existed: boolean;\n value?: unknown;\n }\n | {\n kind: \"toml-table\";\n selector: string;\n existed: boolean;\n content?: string;\n }\n | {\n kind: \"file\";\n selector: string;\n existed: boolean;\n };\n\nfunction selectorHash(selector: string): string {\n return crypto.createHash(\"sha256\").update(selector).digest(\"hex\").slice(0, 12);\n}\n\nexport function artifactBackupPath(\n backupDir: string,\n kind: ArtifactKind,\n selector: string,\n): string {\n const safeKind = kind.replace(/[^a-z-]/gi, \"-\");\n return path.join(backupDir, `${safeKind}-${selectorHash(selector)}.json`);\n}\n\nexport function writeArtifactBackup(\n backupPath: string,\n payload: BackupPayload,\n): void {\n fs.mkdirSync(path.dirname(backupPath), { recursive: true });\n const tmp = `${backupPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(payload, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, backupPath);\n}\n\nexport function readArtifactBackup(backupPath: string): BackupPayload | null {\n if (!fs.existsSync(backupPath)) return null;\n\n try {\n const raw = fs.readFileSync(backupPath, \"utf-8\");\n return JSON.parse(raw) as BackupPayload;\n } catch {\n return null;\n }\n}\n","function splitLines(content: string): string[] {\n return content.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n}\n\nfunction tableHeader(selector: string): string {\n return `[${selector}]`;\n}\n\nfunction findTableRange(\n lines: string[],\n selector: string,\n): { start: number; end: number } | null {\n const header = tableHeader(selector);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].trim() !== header) continue;\n\n let end = lines.length;\n for (let j = i + 1; j < lines.length; j++) {\n const trimmed = lines[j].trim();\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n end = j;\n break;\n }\n }\n return { start: i, end };\n }\n return null;\n}\n\nfunction escapeBasicString(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction renderValue(value: string | string[]): string {\n if (Array.isArray(value)) {\n return `[${value.map((item) => `\"${escapeBasicString(item)}\"`).join(\", \")}]`;\n }\n return `\"${escapeBasicString(value)}\"`;\n}\n\nexport function extractTomlTable(\n content: string,\n selector: string,\n): string | null {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n if (!range) return null;\n return `${lines.slice(range.start, range.end).join(\"\\n\")}\\n`;\n}\n\nexport function removeTomlTable(content: string, selector: string): string {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n if (!range) return content;\n\n const next = [...lines.slice(0, range.start), ...lines.slice(range.end)];\n return `${trimTomlDocument(next.join(\"\\n\"))}\\n`;\n}\n\nexport function replaceTomlTable(\n content: string,\n selector: string,\n replacement: string,\n): string {\n const lines = splitLines(content);\n const range = findTableRange(lines, selector);\n const replacementLines = replacement.replace(/\\r\\n/g, \"\\n\").trimEnd().split(\"\\n\");\n\n if (!range) {\n const doc = trimTomlDocument(content);\n if (!doc) return `${replacement.trimEnd()}\\n`;\n return `${doc}\\n\\n${replacement.trimEnd()}\\n`;\n }\n\n const next = [\n ...lines.slice(0, range.start),\n ...replacementLines,\n ...lines.slice(range.end),\n ];\n return `${trimTomlDocument(next.join(\"\\n\"))}\\n`;\n}\n\nexport function renderTomlTable(\n selector: string,\n entries: Record<string, string | string[]>,\n existingContent?: string | null,\n): string {\n const preserved = parseTomlAssignments(existingContent ?? \"\");\n const merged: Record<string, string | string[]> = { ...preserved, ...entries };\n\n const lines = [tableHeader(selector)];\n for (const [key, value] of Object.entries(merged)) {\n lines.push(`${key} = ${renderValue(value)}`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nexport function parseTomlAssignments(\n tableContent: string,\n): Record<string, string | string[]> {\n const lines = splitLines(tableContent);\n const values: Record<string, string | string[]> = {};\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\") || (line.startsWith(\"[\") && line.endsWith(\"]\"))) {\n continue;\n }\n\n const match = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*(.+)$/);\n if (!match) continue;\n\n const [, key, rawValue] = match;\n const value = rawValue.trim();\n\n if (value.startsWith(\"[\") && value.endsWith(\"]\")) {\n const items = value\n .slice(1, -1)\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean)\n .map(unquoteTomlString);\n values[key] = items;\n continue;\n }\n\n values[key] = unquoteTomlString(value);\n }\n\n return values;\n}\n\nexport function trimTomlDocument(content: string): string {\n return content.replace(/\\s+$/g, \"\").replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\nfunction unquoteTomlString(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n const inner = value.slice(1, -1);\n return value.startsWith('\"')\n ? inner.replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\")\n : inner;\n }\n return value;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { backupFile, ensureBackupDir, fileHash } from \"../state.js\";\nimport {\n artifactBackupPath,\n writeArtifactBackup,\n} from \"../artifact-backups.js\";\nimport {\n extractTomlTable,\n renderTomlTable,\n replaceTomlTable,\n} from \"../toml.js\";\nimport type {\n AdapterContext,\n ApplyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n PatchPlan,\n ProbeResult,\n RuntimeAdapter,\n VerifyCheck,\n VerifyResult,\n} from \"../types.js\";\nimport {\n buildManagedMcpServerSpec,\n canWriteOrCreate,\n getHomeDir,\n probeCommand,\n} from \"./common.js\";\n\nconst MCP_SELECTOR = \"mcp_servers.tap-comms\";\nconst ENV_SELECTOR = \"mcp_servers.tap-comms.env\";\n\nfunction findCodexConfigPath(): string {\n return path.join(getHomeDir(), \".codex\", \"config.toml\");\n}\n\nfunction canonicalizeTrustPath(targetPath: string): string {\n let resolved = path.resolve(targetPath).replace(/\\//g, \"\\\\\");\n const driveRoot = /^[A-Za-z]:\\\\$/;\n if (!driveRoot.test(resolved)) {\n resolved = resolved.replace(/\\\\+$/g, \"\");\n }\n return resolved.startsWith(\"\\\\\\\\?\\\\\") ? resolved : `\\\\\\\\?\\\\${resolved}`;\n}\n\nfunction trustSelector(targetPath: string): string {\n return `projects.'${canonicalizeTrustPath(targetPath)}'`;\n}\n\nfunction getTrustTargets(ctx: AdapterContext): string[] {\n const targets = [ctx.repoRoot, process.cwd()];\n return [...new Set(targets.map((value) => path.resolve(value)))];\n}\n\nfunction buildManagedArtifacts(\n configPath: string,\n ctx: AdapterContext,\n): OwnedArtifact[] {\n const artifacts: OwnedArtifact[] = [\n { kind: \"toml-table\", path: configPath, selector: MCP_SELECTOR },\n { kind: \"toml-table\", path: configPath, selector: ENV_SELECTOR },\n ];\n\n for (const target of getTrustTargets(ctx)) {\n artifacts.push({\n kind: \"toml-table\",\n path: configPath,\n selector: trustSelector(target),\n });\n }\n\n return artifacts;\n}\n\nfunction readConfigOrEmpty(configPath: string): string {\n if (!fs.existsSync(configPath)) return \"\";\n return fs.readFileSync(configPath, \"utf-8\");\n}\n\nfunction writeTomlFile(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmp = `${filePath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, content, \"utf-8\");\n fs.renameSync(tmp, filePath);\n}\n\nfunction verifyManagedToml(\n content: string,\n ctx: AdapterContext,\n configPath: string,\n): VerifyCheck[] {\n const checks: VerifyCheck[] = [];\n const managed = buildManagedMcpServerSpec(ctx);\n const mainTable = extractTomlTable(content, MCP_SELECTOR);\n const envTable = extractTomlTable(content, ENV_SELECTOR);\n\n checks.push({\n name: \"Codex config exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath) ? undefined : `${configPath} not found`,\n });\n checks.push({\n name: \"tap-comms MCP table present\",\n passed: !!mainTable,\n message: mainTable ? undefined : `${MCP_SELECTOR} not found`,\n });\n checks.push({\n name: \"tap-comms env table present\",\n passed: !!envTable,\n message: envTable ? undefined : `${ENV_SELECTOR} not found`,\n });\n\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n const trustTable = extractTomlTable(content, selector);\n checks.push({\n name: `Trust table present: ${canonicalizeTrustPath(target)}`,\n passed: !!trustTable && trustTable.includes('trust_level = \"trusted\"'),\n message:\n trustTable && trustTable.includes('trust_level = \"trusted\"')\n ? undefined\n : `${selector} missing trust_level = \"trusted\"`,\n });\n }\n\n if (mainTable && managed.command) {\n checks.push({\n name: \"Managed command configured\",\n passed:\n mainTable.includes(\n `command = \"${managed.command.replace(/\\\\/g, \"\\\\\\\\\")}\"`,\n ) &&\n mainTable.includes(\n `args = [\"${managed.args[0]?.replace(/\\\\/g, \"\\\\\\\\\") ?? \"\"}\"]`,\n ),\n message: \"Managed tap-comms command/args do not match expected values\",\n });\n }\n\n return checks;\n}\n\nexport const codexAdapter: RuntimeAdapter = {\n runtime: \"codex\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n const configPath = findCodexConfigPath();\n const configExists = fs.existsSync(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"codex\", \"codex.cmd\"] : [\"codex\"],\n );\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Codex CLI not found in PATH. Config can still be written, but runtime verification will be limited.\",\n );\n }\n\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(\n `Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`,\n );\n }\n\n const managed = buildManagedMcpServerSpec(ctx);\n warnings.push(...managed.warnings);\n issues.push(...managed.issues);\n\n return {\n installed: true,\n configPath,\n configExists,\n runtimeCommand: runtimeProbe.command,\n version: runtimeProbe.version,\n canWrite: canWriteOrCreate(configPath),\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? findCodexConfigPath();\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts = buildManagedArtifacts(configPath, ctx);\n\n if (probe.configExists) {\n const content = readConfigOrEmpty(configPath);\n if (extractTomlTable(content, MCP_SELECTOR)) {\n conflicts.push(`Existing ${MCP_SELECTOR} table will be updated.`);\n }\n if (extractTomlTable(content, ENV_SELECTOR)) {\n conflicts.push(`Existing ${ENV_SELECTOR} table will be updated.`);\n }\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n if (extractTomlTable(content, selector)) {\n conflicts.push(`Existing ${selector} table will be updated.`);\n }\n }\n }\n\n for (const artifact of ownedArtifacts) {\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: artifact.selector,\n });\n }\n\n return {\n runtime: \"codex\",\n operations,\n ownedArtifacts,\n backupDir: ensureBackupDir(ctx.stateDir, \"codex\"),\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const configPath = plan.operations[0]?.path ?? findCodexConfigPath();\n const warnings: string[] = [];\n const changedFiles: string[] = [];\n const managed = buildManagedMcpServerSpec(ctx, ctx.instanceId);\n\n warnings.push(...managed.warnings);\n if (managed.issues.length > 0 || !managed.command) {\n return {\n success: false,\n appliedOps: 0,\n backupCreated: false,\n lastAppliedHash: \"\",\n ownedArtifacts: [],\n changedFiles,\n restartRequired: false,\n warnings: [...managed.warnings, ...managed.issues],\n };\n }\n\n const existingContent = readConfigOrEmpty(configPath);\n if (fs.existsSync(configPath) && existingContent) {\n backupFile(configPath, plan.backupDir);\n }\n\n const artifactsWithBackups = plan.ownedArtifacts.map((artifact) => {\n const previousContent =\n artifact.kind === \"toml-table\"\n ? extractTomlTable(existingContent, artifact.selector)\n : null;\n const backupPath = artifactBackupPath(\n plan.backupDir,\n artifact.kind,\n artifact.selector,\n );\n\n writeArtifactBackup(backupPath, {\n kind: \"toml-table\",\n selector: artifact.selector,\n existed: previousContent !== null,\n content: previousContent ?? undefined,\n });\n\n return { ...artifact, backupPath };\n });\n\n let nextContent = existingContent;\n nextContent = replaceTomlTable(\n nextContent,\n MCP_SELECTOR,\n renderTomlTable(\n MCP_SELECTOR,\n {\n command: managed.command,\n args: managed.args,\n },\n extractTomlTable(existingContent, MCP_SELECTOR),\n ),\n );\n nextContent = replaceTomlTable(\n nextContent,\n ENV_SELECTOR,\n renderTomlTable(\n ENV_SELECTOR,\n managed.env,\n extractTomlTable(existingContent, ENV_SELECTOR),\n ),\n );\n\n for (const target of getTrustTargets(ctx)) {\n const selector = trustSelector(target);\n nextContent = replaceTomlTable(\n nextContent,\n selector,\n renderTomlTable(\n selector,\n { trust_level: \"trusted\" },\n extractTomlTable(existingContent, selector),\n ),\n );\n }\n\n writeTomlFile(configPath, nextContent);\n changedFiles.push(configPath);\n\n return {\n success: true,\n appliedOps: plan.operations.length,\n backupCreated: true,\n lastAppliedHash: fileHash(configPath),\n ownedArtifacts: artifactsWithBackups,\n changedFiles,\n restartRequired: true,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const warnings: string[] = [];\n const configPath = plan.operations[0]?.path ?? findCodexConfigPath();\n const content = readConfigOrEmpty(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"codex\", \"codex.cmd\"] : [\"codex\"],\n );\n\n const checks = verifyManagedToml(content, ctx, configPath);\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir)\n ? undefined\n : `${ctx.commsDir} not found`,\n });\n checks.push({\n name: \"Codex CLI found\",\n passed: !!runtimeProbe.command,\n message: runtimeProbe.command\n ? undefined\n : \"codex not in PATH (non-blocking)\",\n });\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Codex CLI not in PATH. Config is written, but runtime verification is partial.\",\n );\n }\n\n return {\n ok: checks\n .filter((check) => check.name !== \"Codex CLI found\")\n .every((check) => check.passed),\n checks,\n restartRequired: true,\n warnings,\n };\n },\n\n bridgeMode(): BridgeMode {\n return \"app-server\";\n },\n\n resolveBridgeScript(ctx: AdapterContext): string | null {\n const distDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n // 1. Relative to bundled CLI (npm install / npx)\n path.join(distDir, \"bridges\", \"codex-bridge-runner.mjs\"),\n // 2. Monorepo development — dist inside repo\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-comms\",\n \"dist\",\n \"bridges\",\n \"codex-bridge-runner.mjs\",\n ),\n // 3. Source file — dev mode with strip-types\n path.join(\n ctx.repoRoot,\n \"packages\",\n \"tap-comms\",\n \"src\",\n \"bridges\",\n \"codex-bridge-runner.ts\",\n ),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n },\n};\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { backupFile, ensureBackupDir, fileHash } from \"../state.js\";\nimport {\n artifactBackupPath,\n writeArtifactBackup,\n} from \"../artifact-backups.js\";\nimport type {\n AdapterContext,\n ApplyResult,\n BridgeMode,\n OwnedArtifact,\n PatchOp,\n PatchPlan,\n ProbeResult,\n RuntimeAdapter,\n VerifyCheck,\n VerifyResult,\n} from \"../types.js\";\nimport {\n buildManagedMcpServerSpec,\n canWriteOrCreate,\n getHomeDir,\n probeCommand,\n} from \"./common.js\";\n\nconst GEMINI_SELECTOR = \"mcpServers.tap-comms\";\n\nfunction candidateConfigPaths(ctx: AdapterContext): string[] {\n const home = getHomeDir();\n return [\n path.join(ctx.repoRoot, \".gemini\", \"settings.json\"),\n path.join(home, \".gemini\", \"settings.json\"),\n path.join(home, \".gemini\", \"antigravity\", \"mcp_config.json\"),\n ];\n}\n\nfunction chooseGeminiConfigPath(ctx: AdapterContext): string {\n const [workspaceConfig, homeConfig, antigravityConfig] =\n candidateConfigPaths(ctx);\n\n if (fs.existsSync(workspaceConfig)) return workspaceConfig;\n if (fs.existsSync(homeConfig)) return homeConfig;\n\n if (fs.existsSync(antigravityConfig)) {\n const raw = fs.readFileSync(antigravityConfig, \"utf-8\").trim();\n if (raw) {\n try {\n JSON.parse(raw);\n return antigravityConfig;\n } catch {\n // Fall through to workspace-managed config.\n }\n }\n }\n\n return workspaceConfig;\n}\n\nfunction readJsonFile(filePath: string): Record<string, unknown> {\n if (!fs.existsSync(filePath)) return {};\n const raw = fs.readFileSync(filePath, \"utf-8\").trim();\n if (!raw) return {};\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\nfunction setNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n value: unknown,\n): void {\n const keys = keyPath.split(\".\");\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (typeof current[key] !== \"object\" || current[key] === null) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[keys[keys.length - 1]] = value;\n}\n\nfunction readNestedKey(obj: Record<string, unknown>, keyPath: string): unknown {\n let current: unknown = obj;\n for (const key of keyPath.split(\".\")) {\n if (typeof current !== \"object\" || current === null || !(key in current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\nfunction verifyGeminiConfig(\n config: Record<string, unknown>,\n configPath: string,\n ctx: AdapterContext,\n): VerifyCheck[] {\n const checks: VerifyCheck[] = [];\n const entry = readNestedKey(config, GEMINI_SELECTOR) as\n | Record<string, unknown>\n | undefined;\n\n checks.push({\n name: \"Gemini config exists\",\n passed: fs.existsSync(configPath),\n message: fs.existsSync(configPath) ? undefined : `${configPath} not found`,\n });\n checks.push({\n name: \"tap-comms entry present\",\n passed: !!entry,\n message: entry ? undefined : `${GEMINI_SELECTOR} not found`,\n });\n checks.push({\n name: \"Comms directory exists\",\n passed: fs.existsSync(ctx.commsDir),\n message: fs.existsSync(ctx.commsDir)\n ? undefined\n : `${ctx.commsDir} not found`,\n });\n\n if (entry?.env && typeof entry.env === \"object\") {\n checks.push({\n name: \"TAP_COMMS_DIR configured\",\n passed:\n (entry.env as Record<string, unknown>).TAP_COMMS_DIR ===\n ctx.commsDir.replace(/\\\\/g, \"/\"),\n message: `Expected ${ctx.commsDir.replace(/\\\\/g, \"/\")}`,\n });\n }\n\n return checks;\n}\n\nexport const geminiAdapter: RuntimeAdapter = {\n runtime: \"gemini\",\n\n async probe(ctx: AdapterContext): Promise<ProbeResult> {\n const warnings: string[] = [];\n const issues: string[] = [];\n const configPath = chooseGeminiConfigPath(ctx);\n const configExists = fs.existsSync(configPath);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"gemini\", \"gemini.cmd\"] : [\"gemini\"],\n );\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Gemini CLI not found in PATH. Config can still be written, but runtime verification will be limited.\",\n );\n }\n\n if (!fs.existsSync(ctx.commsDir)) {\n issues.push(\n `Comms directory not found: ${ctx.commsDir}. Run \"init\" first.`,\n );\n }\n\n const managed = buildManagedMcpServerSpec(ctx, ctx.instanceId);\n warnings.push(...managed.warnings);\n issues.push(...managed.issues);\n\n return {\n installed: true,\n configPath,\n configExists,\n runtimeCommand: runtimeProbe.command,\n version: runtimeProbe.version,\n canWrite: canWriteOrCreate(configPath),\n warnings,\n issues,\n };\n },\n\n async plan(ctx: AdapterContext, probe: ProbeResult): Promise<PatchPlan> {\n const configPath = probe.configPath ?? chooseGeminiConfigPath(ctx);\n const conflicts: string[] = [];\n const warnings: string[] = [];\n const operations: PatchOp[] = [];\n const ownedArtifacts: OwnedArtifact[] = [\n { kind: \"json-path\", path: configPath, selector: GEMINI_SELECTOR },\n ];\n\n if (probe.configExists) {\n try {\n const config = readJsonFile(configPath);\n if (readNestedKey(config, GEMINI_SELECTOR) !== undefined) {\n conflicts.push(`Existing ${GEMINI_SELECTOR} entry will be updated.`);\n }\n } catch {\n warnings.push(\n `${configPath} exists but is not valid JSON. It will be replaced.`,\n );\n }\n }\n\n operations.push({\n type: probe.configExists ? \"merge\" : \"set\",\n path: configPath,\n key: GEMINI_SELECTOR,\n });\n\n return {\n runtime: \"gemini\",\n operations,\n ownedArtifacts,\n backupDir: ensureBackupDir(ctx.stateDir, \"gemini\"),\n restartRequired: true,\n conflicts,\n warnings,\n };\n },\n\n async apply(ctx: AdapterContext, plan: PatchPlan): Promise<ApplyResult> {\n const configPath = plan.operations[0]?.path ?? chooseGeminiConfigPath(ctx);\n const warnings: string[] = [];\n const changedFiles: string[] = [];\n const managed = buildManagedMcpServerSpec(ctx, ctx.instanceId);\n\n warnings.push(...managed.warnings);\n if (managed.issues.length > 0 || !managed.command) {\n return {\n success: false,\n appliedOps: 0,\n backupCreated: false,\n lastAppliedHash: \"\",\n ownedArtifacts: [],\n changedFiles,\n restartRequired: false,\n warnings: [...managed.warnings, ...managed.issues],\n };\n }\n\n let config: Record<string, unknown> = {};\n let previousValue: unknown = undefined;\n\n if (fs.existsSync(configPath)) {\n if (fs.readFileSync(configPath, \"utf-8\").trim()) {\n backupFile(configPath, plan.backupDir);\n }\n try {\n config = readJsonFile(configPath);\n } catch {\n warnings.push(\n `${configPath} was invalid JSON. Created backup and starting fresh.`,\n );\n config = {};\n }\n previousValue = readNestedKey(config, GEMINI_SELECTOR);\n }\n\n const artifact = plan.ownedArtifacts[0];\n const backupPath = artifactBackupPath(\n plan.backupDir,\n artifact.kind,\n artifact.selector,\n );\n writeArtifactBackup(backupPath, {\n kind: \"json-path\",\n selector: artifact.selector,\n existed: previousValue !== undefined,\n value: previousValue,\n });\n\n setNestedKey(config, GEMINI_SELECTOR, {\n command: managed.command,\n args: managed.args,\n env: managed.env,\n });\n\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n const tmp = `${configPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, configPath);\n changedFiles.push(configPath);\n\n return {\n success: true,\n appliedOps: plan.operations.length,\n backupCreated: true,\n lastAppliedHash: fileHash(configPath),\n ownedArtifacts: [{ ...artifact, backupPath }],\n changedFiles,\n restartRequired: true,\n warnings,\n };\n },\n\n async verify(ctx: AdapterContext, plan: PatchPlan): Promise<VerifyResult> {\n const warnings: string[] = [];\n const configPath = plan.operations[0]?.path ?? chooseGeminiConfigPath(ctx);\n const runtimeProbe = probeCommand(\n ctx.platform === \"win32\" ? [\"gemini\", \"gemini.cmd\"] : [\"gemini\"],\n );\n\n let checks: VerifyCheck[];\n try {\n const config = readJsonFile(configPath);\n checks = verifyGeminiConfig(config, configPath, ctx);\n } catch {\n checks = [\n {\n name: \"Gemini config is valid JSON\",\n passed: false,\n message: \"Parse error\",\n },\n ];\n }\n\n checks.push({\n name: \"Gemini CLI found\",\n passed: !!runtimeProbe.command,\n message: runtimeProbe.command\n ? undefined\n : \"gemini not in PATH (non-blocking)\",\n });\n\n if (!runtimeProbe.command) {\n warnings.push(\n \"Gemini CLI not in PATH. Config is written, but runtime verification is partial.\",\n );\n }\n\n return {\n ok: checks\n .filter((check) => check.name !== \"Gemini CLI found\")\n .every((check) => check.passed),\n checks,\n restartRequired: true,\n warnings,\n };\n },\n\n bridgeMode(): BridgeMode {\n return \"polling\";\n },\n};\n","import type { RuntimeAdapter, RuntimeName } from \"../types.js\";\nimport { claudeAdapter } from \"./claude.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { geminiAdapter } from \"./gemini.js\";\n\nconst adapters: Partial<Record<RuntimeName, RuntimeAdapter>> = {\n claude: claudeAdapter,\n codex: codexAdapter,\n gemini: geminiAdapter,\n};\n\nexport function getAdapter(runtime: RuntimeName): RuntimeAdapter {\n const adapter = adapters[runtime];\n if (!adapter) {\n throw new Error(\n `Adapter for \"${runtime}\" is not yet available. ` +\n `Supported: ${Object.keys(adapters).join(\", \")}`,\n );\n }\n return adapter;\n}\n\nexport function listAdapters(): RuntimeName[] {\n return Object.keys(adapters) as RuntimeName[];\n}\n","import * as path from \"node:path\";\nimport { loadState, saveState, updateInstanceState } from \"../state.js\";\nimport {\n startBridge,\n stopBridge,\n restartBridge,\n inferRestartMode,\n getBridgeStatus,\n loadBridgeState,\n getHeartbeatAge,\n getBridgeHeartbeatTimestamp,\n saveBridgeState,\n stopManagedAppServer,\n resolveAppServerUrl,\n checkAppServerHealth,\n findNextAvailableAppServerPort,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n findRepoRoot,\n createAdapterContext,\n resolveInstanceId,\n parseArgs,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type {\n InstanceId,\n HeadlessConfig,\n AgentRole,\n CommandResult,\n AppServerState,\n BridgeState,\n TapState,\n} from \"../types.js\";\n\nfunction formatAge(seconds: number): string {\n if (seconds < 60) return `${seconds}s ago`;\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;\n return `${Math.floor(seconds / 3600)}h ${Math.floor((seconds % 3600) / 60)}m ago`;\n}\n\nconst BRIDGE_HELP = `\nUsage:\n tap-comms bridge <subcommand> [instance] [options]\n\nSubcommands:\n start <instance> Start bridge for an instance (e.g. codex, codex-reviewer)\n start --all Start all registered app-server instances\n stop <instance> Stop bridge for an instance\n stop Stop all running bridges\n status Show bridge status for all instances\n status <instance> Show bridge status for a specific instance\n\nOptions:\n --agent-name <name> Agent identity for bridge (or set TAP_AGENT_NAME env)\n Saved to state — only needed on first start\n --all Start all registered app-server instances\n --busy-mode <steer|wait> How to handle active turns (default: steer)\n --poll-seconds <n> Inbox poll interval (default: 5)\n --reconnect-seconds <n> Reconnect delay after disconnect (default: 5)\n --message-lookback-minutes <n> Process messages from last N minutes (default: 10)\n --thread-id <id> Resume specific thread\n --ephemeral Use ephemeral thread (no persistence)\n --process-existing-messages Process all existing inbox messages\n --no-server Skip app-server auto-start and connect only\n --no-auth Skip auth gateway (app-server listens directly, localhost only)\n\nPort Assignment:\n Ports are auto-assigned from 4501 on first bridge start if not set via --port\n during 'tap add'. Auto-assigned ports are saved to state for future starts.\n\nExamples:\n npx @hua-labs/tap bridge start codex --agent-name myAgent\n npx @hua-labs/tap bridge start --all\n npx @hua-labs/tap bridge start codex --agent-name myAgent --no-server\n npx @hua-labs/tap bridge start codex-reviewer --agent-name reviewer --busy-mode steer\n npx @hua-labs/tap bridge stop codex\n npx @hua-labs/tap bridge stop\n npx @hua-labs/tap bridge status\n`.trim();\n\nfunction formatAppServerState(appServer: AppServerState): string {\n const ownership = appServer.managed ? \"managed\" : \"external\";\n const pid = appServer.pid != null ? ` pid:${appServer.pid}` : \"\";\n const health = appServer.healthy ? \"healthy\" : \"unhealthy\";\n const auth =\n appServer.auth != null\n ? `, auth gateway:${appServer.auth.gatewayPid ?? \"-\"} -> ${appServer.auth.upstreamUrl}`\n : \"\";\n return `${health}, ${ownership}${pid}, ${appServer.url}${auth}`;\n}\n\nfunction redactProtectedUrl(url: string): string {\n try {\n const parsed = new URL(url);\n if (parsed.searchParams.has(\"tap_token\")) {\n parsed.searchParams.set(\"tap_token\", \"***\");\n }\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return url.replace(/tap_token=[^&]+/g, \"tap_token=***\");\n }\n}\n\nfunction loadCurrentBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n fallback: BridgeState | null | undefined,\n): BridgeState | null {\n return loadBridgeState(stateDir, instanceId) ?? fallback ?? null;\n}\n\nfunction getSharedAppServerUsers(\n state: TapState,\n stateDir: string,\n currentInstanceId: InstanceId,\n appServerUrl: string,\n): InstanceId[] {\n const shared: InstanceId[] = [];\n\n for (const [id, inst] of Object.entries(state.instances)) {\n if (id === currentInstanceId || !inst?.installed) {\n continue;\n }\n\n const instanceId = id as InstanceId;\n if (getBridgeStatus(stateDir, instanceId) !== \"running\") {\n continue;\n }\n\n const bridgeState = loadCurrentBridgeState(\n stateDir,\n instanceId,\n inst.bridge,\n );\n if (bridgeState?.appServer?.url === appServerUrl) {\n shared.push(instanceId);\n }\n }\n\n return shared;\n}\n\nfunction transferManagedAppServerOwnership(\n state: TapState,\n stateDir: string,\n recipientId: InstanceId,\n appServer: AppServerState,\n): boolean {\n const recipient = state.instances[recipientId];\n if (!recipient) {\n return false;\n }\n\n const bridgeState = loadCurrentBridgeState(\n stateDir,\n recipientId,\n recipient.bridge,\n );\n if (!bridgeState) {\n return false;\n }\n\n const transferredAppServer: AppServerState = {\n ...appServer,\n managed: true,\n healthy: true,\n lastCheckedAt: new Date().toISOString(),\n lastHealthyAt: appServer.lastHealthyAt ?? new Date().toISOString(),\n };\n\n const updatedBridge: BridgeState = {\n ...bridgeState,\n appServer: transferredAppServer,\n };\n\n saveBridgeState(stateDir, recipientId, updatedBridge);\n state.instances[recipientId] = {\n ...recipient,\n bridge: updatedBridge,\n };\n return true;\n}\n\n// ─── Subcommand: start ─────────────────────────────────────────\n\nasync function bridgeStart(\n identifier: string,\n agentName?: string,\n flags: Record<string, string | boolean | undefined> = {},\n): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n let state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n let instance = state.instances[instanceId];\n\n if (!instance?.installed) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance?.runtime,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `${instanceId} is not installed. Run: npx @hua-labs/tap add ${instance?.runtime ?? identifier}`,\n warnings: [],\n data: {},\n };\n }\n\n const adapter = getAdapter(instance.runtime);\n const mode = adapter.bridgeMode();\n\n if (mode !== \"app-server\") {\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_NO_OP\",\n message: `${instanceId} uses ${mode} mode — no bridge needed.`,\n warnings: [],\n data: { bridgeMode: mode },\n };\n }\n\n // Resolve agent name: explicit flag > stored in state > env\n const resolvedAgentName = agentName ?? instance.agentName ?? undefined;\n\n // Persist agent-name to state if explicitly provided\n if (agentName && agentName !== instance.agentName) {\n instance = { ...instance, agentName };\n const updatedState = updateInstanceState(state, instanceId, instance);\n saveState(repoRoot, updatedState);\n state = updatedState;\n }\n\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const bridgeScript = adapter.resolveBridgeScript?.(ctx);\n\n if (!bridgeScript) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_SCRIPT_MISSING\",\n message: `Bridge script not found for ${instanceId}. Ensure the runtime is properly configured.`,\n warnings: [],\n data: {},\n };\n }\n\n // Resolve runtime command + appServerUrl from config\n const { config: resolvedConfig } = resolveConfig({}, repoRoot);\n const runtimeCommand = resolvedConfig.runtimeCommand;\n const manageAppServer =\n instance.runtime === \"codex\" && flags[\"no-server\"] !== true;\n\n // Auto-assign port only for managed app-server mode (local instances).\n // External servers (--no-server) keep the configured appServerUrl as-is.\n let effectivePort = instance.port;\n if (effectivePort == null && manageAppServer) {\n effectivePort = await findNextAvailableAppServerPort(\n state,\n resolvedConfig.appServerUrl,\n 4501,\n instanceId,\n );\n instance = { ...instance, port: effectivePort };\n const updatedState = updateInstanceState(state, instanceId, instance);\n saveState(repoRoot, updatedState);\n state = updatedState;\n }\n\n const appServerUrl = resolveAppServerUrl(\n resolvedConfig.appServerUrl,\n effectivePort ?? undefined,\n );\n\n logHeader(`@hua-labs/tap bridge start ${instanceId}`);\n log(`Bridge script: ${bridgeScript}`);\n log(`Bridge mode: ${mode}`);\n log(`Runtime cmd: ${runtimeCommand}`);\n log(`App server: ${appServerUrl}`);\n if (effectivePort != null) log(`Port: ${effectivePort}`);\n if (resolvedAgentName) log(`Agent name: ${resolvedAgentName}`);\n const noAuth = flags[\"no-auth\"] === true;\n if (!manageAppServer && instance.runtime === \"codex\") {\n log(\"Auto server: disabled (--no-server)\");\n }\n if (noAuth && manageAppServer) {\n log(\"Auth gateway: disabled (--no-auth)\");\n }\n // Show headless status from instance config or --headless flag (resolved below)\n const willBeHeadless =\n flags[\"headless\"] === true || instance.headless?.enabled;\n if (willBeHeadless) {\n const role =\n (typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : null) ??\n instance.headless?.role ??\n \"reviewer\";\n log(`Headless: ${role}`);\n }\n\n try {\n // Startup validation: health check before bridge start\n if (!manageAppServer && instance.runtime === \"codex\") {\n log(\"Checking app-server health...\");\n const healthy = await checkAppServerHealth(appServerUrl);\n if (healthy) {\n logSuccess(\"App server reachable\");\n } else {\n logError(`App server not reachable at ${appServerUrl}`);\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_START_FAILED\",\n message: `App server not reachable at ${appServerUrl}. Start it first: codex app-server --listen ${appServerUrl}`,\n warnings: [],\n data: {},\n };\n }\n }\n\n // Parse bridge operational flags from CLI\n\n // --busy-mode validation (PS1 parity: ValidateSet(\"wait\", \"steer\"))\n const busyModeRaw = flags[\"busy-mode\"];\n if (\n busyModeRaw !== undefined &&\n busyModeRaw !== \"steer\" &&\n busyModeRaw !== \"wait\"\n ) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid --busy-mode: ${String(busyModeRaw)}. Must be \"steer\" or \"wait\".`,\n warnings: [],\n data: {},\n };\n }\n const busyMode = busyModeRaw as \"steer\" | \"wait\" | undefined;\n const pollSeconds =\n typeof flags[\"poll-seconds\"] === \"string\"\n ? parseInt(flags[\"poll-seconds\"], 10)\n : undefined;\n const reconnectSeconds =\n typeof flags[\"reconnect-seconds\"] === \"string\"\n ? parseInt(flags[\"reconnect-seconds\"], 10)\n : undefined;\n const messageLookbackMinutes =\n typeof flags[\"message-lookback-minutes\"] === \"string\"\n ? parseInt(flags[\"message-lookback-minutes\"], 10)\n : undefined;\n const threadId =\n typeof flags[\"thread-id\"] === \"string\" ? flags[\"thread-id\"] : undefined;\n const ephemeral = flags[\"ephemeral\"] === true;\n const processExistingMessages = flags[\"process-existing-messages\"] === true;\n\n // --headless flag on bridge start: create ad-hoc headless config\n // even if instance wasn't created with `tap add --headless`\n const headlessFlag = flags[\"headless\"] === true;\n const roleArg =\n typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : undefined;\n const validRoles: AgentRole[] = [\"reviewer\", \"validator\", \"long-running\"];\n if (roleArg && !validRoles.includes(roleArg as AgentRole)) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid --role: ${roleArg}. Must be: ${validRoles.join(\", \")}`,\n warnings: [],\n data: {},\n };\n }\n\n const headless: HeadlessConfig | null = headlessFlag\n ? {\n enabled: true,\n role: (roleArg as AgentRole) ?? \"reviewer\",\n maxRounds: 5,\n qualitySeverityFloor: \"high\",\n }\n : instance.headless;\n\n const bridge = await startBridge({\n instanceId,\n runtime: instance.runtime,\n stateDir: ctx.stateDir,\n commsDir: ctx.commsDir,\n bridgeScript,\n platform: ctx.platform,\n agentName: resolvedAgentName,\n runtimeCommand,\n appServerUrl,\n repoRoot,\n port: effectivePort ?? undefined,\n manageAppServer,\n noAuth,\n headless,\n busyMode,\n pollSeconds,\n reconnectSeconds,\n messageLookbackMinutes,\n threadId,\n ephemeral,\n processExistingMessages,\n });\n\n logSuccess(`Bridge started (PID: ${bridge.pid})`);\n log(`Log: ${path.join(ctx.stateDir, \"logs\", `bridge-${instanceId}.log`)}`);\n if (bridge.appServer) {\n log(`App server: ${formatAppServerState(bridge.appServer)}`);\n if (bridge.appServer.logPath) {\n log(`Server log: ${bridge.appServer.logPath}`);\n }\n if (bridge.appServer.auth) {\n log(\n `Protected: ${redactProtectedUrl(bridge.appServer.auth.protectedUrl)}`,\n );\n if (bridge.appServer.auth.gatewayLogPath) {\n log(`Gateway log: ${bridge.appServer.auth.gatewayLogPath}`);\n }\n // TUI must connect to upstream (no token needed) — gateway blocks unauthenticated clients\n log(`TUI connect: ${bridge.appServer.auth.upstreamUrl}`);\n }\n if (bridge.appServer.managed && !bridge.appServer.auth) {\n // --no-auth mode: TUI connects to the same URL as the bridge\n log(`TUI connect: ${bridge.appServer.url}`);\n }\n }\n\n // Update state with bridge info + mode for restart preservation\n const updated = { ...instance, bridge, manageAppServer, noAuth };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_START_OK\",\n message: `Bridge for ${instanceId} started (PID: ${bridge.pid})`,\n warnings: [],\n data: { pid: bridge.pid, appServer: bridge.appServer ?? null },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(msg);\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_BRIDGE_START_FAILED\",\n message: msg,\n warnings: [],\n data: {},\n };\n }\n}\n\n// ─── Subcommand: start --all ───────────────────────────────────\n\nasync function bridgeStartAll(\n flags: Record<string, string | boolean | undefined> = {},\n): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n const appServerInstances = instanceIds.filter((id) => {\n const inst = state.instances[id];\n if (!inst?.installed) return false;\n const adapter = getAdapter(inst.runtime);\n return adapter.bridgeMode() === \"app-server\";\n });\n\n if (appServerInstances.length === 0) {\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_NO_OP\",\n message: \"No app-server instances found to start.\",\n warnings: [],\n data: {},\n };\n }\n\n logHeader(\"@hua-labs/tap bridge start --all\");\n log(\n `Found ${appServerInstances.length} app-server instance(s): ${appServerInstances.join(\", \")}`,\n );\n log(\"\");\n\n const started: string[] = [];\n const failed: string[] = [];\n const warnings: string[] = [];\n\n for (const instanceId of appServerInstances) {\n const inst = state.instances[instanceId];\n const storedName = inst?.agentName ?? undefined;\n\n if (!storedName) {\n const msg = `${instanceId}: skipped — no stored agent-name. Set it first: tap bridge start ${instanceId} --agent-name <name>`;\n log(msg);\n warnings.push(msg);\n continue;\n }\n\n log(`Starting ${instanceId} (agent: ${storedName})...`);\n const result = await bridgeStart(instanceId, storedName, flags);\n\n if (result.ok) {\n started.push(instanceId);\n logSuccess(`${instanceId} started`);\n } else {\n failed.push(instanceId);\n logError(`${instanceId}: ${result.message}`);\n }\n log(\"\");\n }\n\n const message =\n started.length > 0\n ? `Started ${started.length}/${appServerInstances.length} bridge(s): ${started.join(\", \")}` +\n (failed.length > 0 ? `. Failed: ${failed.join(\", \")}` : \"\")\n : `No bridges started. Failed: ${failed.join(\", \")}`;\n\n return {\n ok: failed.length === 0 && started.length > 0,\n command: \"bridge\",\n code:\n started.length > 0 ? \"TAP_BRIDGE_START_OK\" : \"TAP_BRIDGE_START_FAILED\",\n message,\n warnings,\n data: { started, failed },\n };\n}\n\n// ─── Subcommand: stop ──────────────────────────────────────────\n\nasync function bridgeStopOne(identifier: string): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const instance = state.instances[instanceId];\n const bridgeState = loadCurrentBridgeState(\n ctx.stateDir,\n instanceId,\n instance?.bridge,\n );\n const appServer = bridgeState?.appServer ?? null;\n\n logHeader(`@hua-labs/tap bridge stop ${instanceId}`);\n\n const stopped = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n\n let appServerStopped = false;\n let appServerTransferredTo: InstanceId | null = null;\n\n if (stopped) {\n logSuccess(`Bridge for ${instanceId} stopped`);\n } else {\n log(`No running bridge for ${instanceId}`);\n }\n\n if (appServer?.managed) {\n const sharedUsers = getSharedAppServerUsers(\n state,\n ctx.stateDir,\n instanceId,\n appServer.url,\n );\n\n if (sharedUsers.length > 0) {\n const recipient = sharedUsers[0];\n if (\n transferManagedAppServerOwnership(\n state,\n ctx.stateDir,\n recipient,\n appServer,\n )\n ) {\n appServerTransferredTo = recipient;\n log(`Managed app-server ownership moved to ${recipient}`);\n } else {\n log(\n `Managed app-server left running at ${appServer.url} because ownership transfer failed`,\n );\n }\n } else {\n appServerStopped = await stopManagedAppServer(appServer, ctx.platform);\n if (appServerStopped) {\n const gatewayNote =\n appServer.auth?.gatewayPid != null\n ? `, gateway PID: ${appServer.auth.gatewayPid}`\n : \"\";\n logSuccess(\n `Managed app-server stopped (PID: ${appServer.pid ?? \"-\"}${gatewayNote})`,\n );\n }\n }\n }\n\n // Clear bridge from state\n if (instance) {\n const updated = { ...instance, bridge: null };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n }\n\n if (stopped) {\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_STOP_OK\",\n message: `Bridge for ${instanceId} stopped`,\n warnings: [],\n data: {\n appServerStopped,\n appServerTransferredTo,\n },\n };\n }\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_NOT_RUNNING\",\n message: `No running bridge for ${instanceId}`,\n warnings: [],\n data: {\n appServerStopped,\n appServerTransferredTo,\n },\n };\n}\n\nasync function bridgeStopAll(): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n const stopped: string[] = [];\n const managedAppServers = new Map<string, AppServerState>();\n\n logHeader(\"@hua-labs/tap bridge stop (all)\");\n\n let stateChanged = false;\n\n for (const instanceId of instanceIds) {\n const bridgeState = loadCurrentBridgeState(\n ctx.stateDir,\n instanceId,\n state.instances[instanceId]?.bridge,\n );\n const appServer = bridgeState?.appServer;\n if (appServer?.managed && appServer.pid != null) {\n managedAppServers.set(\n `${appServer.url}:${appServer.pid}:${appServer.auth?.gatewayPid ?? \"-\"}`,\n appServer,\n );\n }\n\n const didStop = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n\n if (didStop) {\n logSuccess(`Stopped bridge for ${instanceId}`);\n stopped.push(instanceId);\n }\n\n // Clear stale bridge metadata regardless of whether process was alive\n const instance = state.instances[instanceId];\n if (instance?.bridge) {\n state.instances[instanceId] = { ...instance, bridge: null };\n stateChanged = true;\n }\n }\n\n const stoppedAppServers: number[] = [];\n for (const appServer of managedAppServers.values()) {\n if (await stopManagedAppServer(appServer, ctx.platform)) {\n stoppedAppServers.push(appServer.pid!);\n const gatewayNote =\n appServer.auth?.gatewayPid != null\n ? `, gateway PID ${appServer.auth.gatewayPid}`\n : \"\";\n logSuccess(\n `Stopped app-server PID ${appServer.pid} (${appServer.url}${gatewayNote})`,\n );\n }\n }\n\n if (stateChanged) {\n state.updatedAt = new Date().toISOString();\n saveState(repoRoot, state);\n }\n\n const message =\n stopped.length > 0\n ? `Stopped ${stopped.length} bridge(s): ${stopped.join(\", \")}`\n : \"No running bridges found\";\n\n log(message);\n\n return {\n ok: true,\n command: \"bridge\",\n code: stopped.length > 0 ? \"TAP_BRIDGE_STOP_OK\" : \"TAP_BRIDGE_NOT_RUNNING\",\n message,\n warnings: [],\n data: { stopped, stoppedAppServers },\n };\n}\n\n// ─── Subcommand: status ────────────────────────────────────────\n\nfunction bridgeStatusAll(): CommandResult {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg.stateDir;\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n const bridges: Record<\n string,\n {\n status: string;\n runtime: string;\n pid: number | null;\n port: number | null;\n lastHeartbeat: string | null;\n appServer: AppServerState | null;\n }\n > = {};\n\n logHeader(\"@hua-labs/tap bridge status\");\n log(\n `${\"Instance\".padEnd(20)} ${\"Runtime\".padEnd(8)} ${\"Status\".padEnd(10)} ${\"PID\".padEnd(8)} ${\"Port\".padEnd(6)} ${\"Last Heartbeat\"}`,\n );\n log(\n `${\"─\".repeat(20)} ${\"─\".repeat(8)} ${\"─\".repeat(10)} ${\"─\".repeat(8)} ${\"─\".repeat(6)} ${\"─\".repeat(20)}`,\n );\n\n for (const instanceId of instanceIds) {\n const inst = state.instances[instanceId];\n if (!inst?.installed) continue;\n\n if (inst.bridgeMode !== \"app-server\") {\n log(\n `${instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${\"n/a\".padEnd(10)} ${\"-\".padEnd(8)} ${\"-\".padEnd(6)} ${inst.bridgeMode} mode`,\n );\n bridges[instanceId] = {\n status: \"n/a\",\n runtime: inst.runtime,\n pid: null,\n port: inst.port,\n lastHeartbeat: null,\n appServer: null,\n };\n continue;\n }\n\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n\n const pid = bridgeState?.pid ?? null;\n const heartbeat = getBridgeHeartbeatTimestamp(stateDir, instanceId);\n const pidStr = pid ? String(pid) : \"-\";\n const portStr = inst.port ? String(inst.port) : \"-\";\n const ageStr = age !== null ? formatAge(age) : \"-\";\n\n const statusColor =\n status === \"running\"\n ? \"running\"\n : status === \"stale\"\n ? \"stale!\"\n : \"stopped\";\n\n log(\n `${instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${statusColor.padEnd(10)} ${pidStr.padEnd(8)} ${portStr.padEnd(6)} ${ageStr}`,\n );\n if (bridgeState?.appServer) {\n log(` App server: ${formatAppServerState(bridgeState.appServer)}`);\n if (bridgeState.appServer.logPath) {\n log(` Server log: ${bridgeState.appServer.logPath}`);\n }\n if (bridgeState.appServer.auth) {\n log(\n ` Protected: ${redactProtectedUrl(bridgeState.appServer.auth.protectedUrl)}`,\n );\n }\n }\n\n bridges[instanceId] = {\n status,\n runtime: inst.runtime,\n pid,\n port: inst.port,\n lastHeartbeat: heartbeat,\n appServer: bridgeState?.appServer ?? null,\n };\n }\n\n if (instanceIds.length === 0) {\n log(\"No instances installed.\");\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceIds.length} instance(s) checked`,\n warnings: [],\n data: { bridges },\n };\n}\n\nfunction bridgeStatusOne(identifier: string): CommandResult {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const inst = state.instances[instanceId];\n\n if (!inst?.installed) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `${instanceId} is not installed.`,\n warnings: [],\n data: {},\n };\n }\n\n logHeader(`@hua-labs/tap bridge status ${instanceId}`);\n log(`Instance: ${instanceId}`);\n log(`Runtime: ${inst.runtime}`);\n log(`Bridge mode: ${inst.bridgeMode}`);\n if (inst.port) log(`Port: ${inst.port}`);\n\n // Non-app-server instances don't use bridges\n if (inst.bridgeMode !== \"app-server\") {\n log(`Status: n/a (${inst.bridgeMode} mode)`);\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceId} bridge: n/a (${inst.bridgeMode} mode)`,\n warnings: [],\n data: {\n status: \"n/a\",\n bridgeMode: inst.bridgeMode,\n pid: null,\n port: inst.port,\n lastHeartbeat: null,\n appServer: null,\n },\n };\n }\n\n const { config: resolvedCfg2 } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg2.stateDir;\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const age = getHeartbeatAge(stateDir, instanceId);\n const heartbeat = getBridgeHeartbeatTimestamp(stateDir, instanceId);\n\n log(`Status: ${status}`);\n\n if (bridgeState) {\n log(`PID: ${bridgeState.pid}`);\n log(\n `Heartbeat: ${heartbeat ?? \"-\"}${age !== null ? ` (${formatAge(age)})` : \"\"}`,\n );\n log(\n `Log: ${path.join(stateDir, \"logs\", `bridge-${instanceId}.log`)}`,\n );\n if (bridgeState.appServer) {\n log(`App server: ${bridgeState.appServer.url}`);\n log(`Server PID: ${bridgeState.appServer.pid ?? \"-\"}`);\n log(\n `Server mode: ${bridgeState.appServer.managed ? \"managed\" : \"external\"}`,\n );\n log(\n `Health: ${bridgeState.appServer.healthy ? \"healthy\" : \"unhealthy\"}`,\n );\n log(`Checked: ${bridgeState.appServer.lastCheckedAt}`);\n if (bridgeState.appServer.logPath) {\n log(`Server log: ${bridgeState.appServer.logPath}`);\n }\n if (bridgeState.appServer.auth) {\n log(`Auth: ${bridgeState.appServer.auth.mode}`);\n log(\n `Protected: ${redactProtectedUrl(bridgeState.appServer.auth.protectedUrl)}`,\n );\n log(`Upstream: ${bridgeState.appServer.auth.upstreamUrl}`);\n log(`TUI connect: ${bridgeState.appServer.auth.upstreamUrl}`);\n log(`Gateway PID: ${bridgeState.appServer.auth.gatewayPid ?? \"-\"}`);\n if (bridgeState.appServer.auth.gatewayLogPath) {\n log(`Gateway log: ${bridgeState.appServer.auth.gatewayLogPath}`);\n }\n } else if (bridgeState.appServer.managed) {\n log(`Auth: none (--no-auth)`);\n log(`TUI connect: ${bridgeState.appServer.url}`);\n }\n }\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_STATUS_OK\",\n message: `${instanceId} bridge: ${status}`,\n warnings: [],\n data: {\n status,\n bridgeMode: inst.bridgeMode,\n pid: bridgeState?.pid ?? null,\n port: inst.port,\n lastHeartbeat: heartbeat,\n appServer: bridgeState?.appServer ?? null,\n },\n };\n}\n\n// ─── Command Router ────────────────────────────────────────────\n\nasync function bridgeRestart(\n identifier: string,\n flags: Record<string, string | boolean>,\n): Promise<CommandResult> {\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n if (!state) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const resolved = resolveInstanceId(identifier, state);\n if (!resolved.ok) {\n return {\n ok: false,\n command: \"bridge\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const inst = state.instances[instanceId];\n if (!inst) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INSTANCE_NOT_FOUND\",\n message: `Instance not found: ${instanceId}`,\n warnings: [],\n data: {},\n };\n }\n\n const adapter = getAdapter(inst.runtime);\n const ctx = {\n ...createAdapterContext(state.commsDir, repoRoot),\n instanceId,\n };\n const bridgeScript = adapter.resolveBridgeScript?.(ctx);\n\n if (!bridgeScript) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_SCRIPT_MISSING\",\n message: `Bridge script not found for ${instanceId}`,\n warnings: [],\n data: {},\n };\n }\n\n const { config: resolvedConfig } = resolveConfig({}, repoRoot);\n const drainStr =\n typeof flags[\"drain-timeout\"] === \"string\" ? flags[\"drain-timeout\"] : \"30\";\n const drainTimeout = parseInt(drainStr, 10) || 30;\n\n logHeader(`@hua-labs/tap bridge restart ${instanceId}`);\n log(`Drain timeout: ${drainTimeout}s`);\n\n try {\n // Use production helper for mode inference (tested in identity-restart.test.ts)\n // Priority: flags > saved instance mode > bridge state inference\n const currentBridgeState = loadBridgeState(ctx.stateDir, instanceId);\n const { manageAppServer, noAuth } = inferRestartMode(\n currentBridgeState,\n {\n noServer: flags[\"no-server\"] === true ? true : undefined,\n noAuth: flags[\"no-auth\"] === true ? true : undefined,\n },\n {\n manageAppServer: inst.manageAppServer,\n noAuth: inst.noAuth,\n },\n );\n\n const bridge = await restartBridge({\n instanceId,\n runtime: inst.runtime,\n stateDir: ctx.stateDir,\n commsDir: ctx.commsDir,\n bridgeScript,\n platform: ctx.platform,\n agentName: inst.agentName ?? undefined,\n runtimeCommand: resolvedConfig.runtimeCommand,\n appServerUrl: resolvedConfig.appServerUrl,\n repoRoot,\n port: inst.port ?? undefined,\n headless: inst.headless,\n drainTimeoutSeconds: drainTimeout,\n manageAppServer,\n noAuth,\n });\n\n logSuccess(`Bridge restarted (PID: ${bridge.pid})`);\n\n // Save bridge mode for next restart (#799 follow-up)\n const updated = { ...inst, bridge, manageAppServer, noAuth };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n\n return {\n ok: true,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_START_OK\",\n message: `Bridge for ${instanceId} restarted (PID: ${bridge.pid})`,\n warnings: [],\n data: { pid: bridge.pid },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(msg);\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n code: \"TAP_BRIDGE_START_FAILED\",\n message: msg,\n warnings: [],\n data: {},\n };\n }\n}\n\nexport async function bridgeCommand(args: string[]): Promise<CommandResult> {\n const { positional, flags } = parseArgs(args);\n const subcommand = positional[0];\n const identifierArg = positional[1];\n const agentName =\n typeof flags[\"agent-name\"] === \"string\" ? flags[\"agent-name\"] : undefined;\n\n if (!subcommand || subcommand === \"--help\" || subcommand === \"-h\") {\n log(BRIDGE_HELP);\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_NO_OP\",\n message: BRIDGE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n switch (subcommand) {\n case \"start\": {\n const wantsAll = flags[\"all\"] === true || identifierArg === \"--all\";\n const hasInstance = identifierArg && identifierArg !== \"--all\";\n\n if (wantsAll && hasInstance) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Cannot combine <instance> with --all. Use either:\\n tap bridge start ${identifierArg}\\n tap bridge start --all`,\n warnings: [],\n data: {},\n };\n }\n if (wantsAll) {\n return bridgeStartAll(flags);\n }\n if (!identifierArg) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing instance. Usage: npx @hua-labs/tap bridge start <instance> or --all\",\n warnings: [],\n data: {},\n };\n }\n return bridgeStart(identifierArg, agentName, flags);\n }\n\n case \"stop\": {\n if (!identifierArg) {\n return bridgeStopAll();\n }\n return bridgeStopOne(identifierArg);\n }\n\n case \"status\": {\n if (identifierArg) {\n return bridgeStatusOne(identifierArg);\n }\n return bridgeStatusAll();\n }\n\n case \"restart\": {\n if (!identifierArg) {\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing instance. Usage: npx @hua-labs/tap bridge restart <instance>\",\n warnings: [],\n data: {},\n };\n }\n return bridgeRestart(identifierArg, flags);\n }\n\n default:\n return {\n ok: false,\n command: \"bridge\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Unknown bridge subcommand: ${subcommand}. Use: start, stop, restart, status`,\n warnings: [],\n data: {},\n };\n }\n}\n","import { bridgeCommand } from \"./bridge.js\";\nimport {\n collectDashboardSnapshot,\n type DashboardSnapshot,\n} from \"../engine/dashboard.js\";\nimport { findRepoRoot, log } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst UP_HELP = `\nUsage:\n tap-comms up [bridge-start options]\n\nDescription:\n Start all registered app-server bridge daemons with one command.\n This is the orchestration entrypoint for headless/background TAP operation.\n\nExamples:\n npx @hua-labs/tap up\n npx @hua-labs/tap up --no-auth\n npx @hua-labs/tap up --busy-mode wait\n`.trim();\n\ntype UpResultData = Record<string, unknown> & {\n snapshot: DashboardSnapshot;\n};\n\nexport async function upCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(UP_HELP);\n return {\n ok: true,\n command: \"up\",\n code: \"TAP_NO_OP\",\n message: UP_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const result = await bridgeCommand([\"start\", \"--all\", ...args]);\n const snapshot = collectDashboardSnapshot(repoRoot);\n const activeBridges = snapshot.bridges.filter(\n (bridge) => bridge.status === \"running\",\n ).length;\n\n if (!result.ok) {\n return {\n ...result,\n command: \"up\",\n data: {\n ...(result.data as Record<string, unknown>),\n snapshot,\n } satisfies UpResultData,\n };\n }\n\n return {\n ok: true,\n command: \"up\",\n code: \"TAP_UP_OK\",\n message: `tap up: ${activeBridges} bridge(s) running`,\n warnings: result.warnings,\n data: {\n ...(result.data as Record<string, unknown>),\n snapshot,\n } satisfies UpResultData,\n };\n}\n","import { bridgeCommand } from \"./bridge.js\";\nimport {\n collectDashboardSnapshot,\n type DashboardSnapshot,\n} from \"../engine/dashboard.js\";\nimport { findRepoRoot, log } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst DOWN_HELP = `\nUsage:\n tap-comms down\n\nDescription:\n Stop all running bridge daemons and managed app-servers.\n\nExamples:\n npx @hua-labs/tap down\n`.trim();\n\ntype DownResultData = Record<string, unknown> & {\n snapshot: DashboardSnapshot;\n};\n\nexport async function downCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(DOWN_HELP);\n return {\n ok: true,\n command: \"down\",\n code: \"TAP_NO_OP\",\n message: DOWN_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const result = await bridgeCommand([\"stop\"]);\n const snapshot = collectDashboardSnapshot(repoRoot);\n\n if (!result.ok) {\n return {\n ...result,\n command: \"down\",\n data: {\n ...(result.data as Record<string, unknown>),\n snapshot,\n } satisfies DownResultData,\n };\n }\n\n return {\n ok: true,\n command: \"down\",\n code: \"TAP_DOWN_OK\",\n message: `tap down: ${snapshot.bridges.filter((bridge) => bridge.status === \"running\").length} bridge(s) still running`,\n warnings: result.warnings,\n data: {\n ...(result.data as Record<string, unknown>),\n snapshot,\n } satisfies DownResultData,\n };\n}\n","export type {\n RuntimeName,\n BridgeMode,\n Platform,\n InstanceId,\n AdapterContext,\n ProbeResult,\n PatchPlan,\n PatchOp,\n PatchOpType,\n OwnedArtifact,\n ArtifactKind,\n ApplyResult,\n VerifyResult,\n VerifyCheck,\n RuntimeAdapter,\n TapState,\n TapStateV1,\n InstanceState,\n /** @deprecated Use InstanceState. Will be removed in 0.2.0. */\n RuntimeState,\n BridgeState,\n AppServerState,\n AppServerAuthState,\n CommandName,\n CommandCode,\n CommandResult,\n} from \"./types.js\";\n\nexport {\n loadState,\n saveState,\n createInitialState,\n stateExists,\n} from \"./state.js\";\nexport { version } from \"./version.js\";\n\n// Config\nexport type {\n TapSharedConfig,\n TapLocalConfig,\n TapResolvedConfig,\n ConfigSource,\n ConfigResolution,\n ConfigOverrides,\n} from \"./config/index.js\";\nexport {\n resolveConfig,\n loadSharedConfig,\n loadLocalConfig,\n saveSharedConfig,\n saveLocalConfig,\n SHARED_CONFIG_FILE,\n LOCAL_CONFIG_FILE,\n} from \"./config/index.js\";\n\n// Bridge engine\nexport {\n /** @deprecated Internal use only. Will be removed in 0.2.0. */\n updateBridgeHeartbeat,\n getHeartbeatAge,\n rotateLog,\n restartBridge,\n} from \"./engine/bridge.js\";\n\n// Dashboard / State API\nexport type {\n AgentInfo,\n BridgeInfo,\n PRInfo,\n DashboardWarning,\n DashboardSnapshot,\n} from \"./engine/dashboard.js\";\nexport { collectDashboardSnapshot } from \"./engine/dashboard.js\";\n\n// State/Control API (M105)\nexport type {\n StateApiOptions,\n EventStreamOptions,\n AgentControlOptions,\n AgentControlResult,\n HealthReport,\n} from \"./api/state.js\";\nexport {\n getDashboardSnapshot,\n streamEvents,\n getConfig,\n getHealthReport,\n startAgents,\n stopAgents,\n} from \"./api/state.js\";\nexport type { HttpServerOptions } from \"./api/http.js\";\nexport { startHttpServer } from \"./api/http.js\";\n\n// Runtime resolver\nexport type { ResolvedRuntime, RuntimeSource } from \"./runtime/index.js\";\nexport {\n resolveNodeRuntime,\n buildRuntimeEnv,\n readNodeVersion,\n probeFnmNode,\n getFnmBinDir,\n} from \"./runtime/index.js\";\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst FALLBACK_VERSION = \"0.0.0\";\n\nexport function resolvePackageVersion(\n metaUrl: string = import.meta.url,\n): string {\n const moduleDir = path.dirname(fileURLToPath(metaUrl));\n const packageJsonPath = path.join(moduleDir, \"..\", \"package.json\");\n\n try {\n const parsed = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\")) as {\n version?: unknown;\n };\n if (typeof parsed.version === \"string\" && parsed.version.trim()) {\n return parsed.version;\n }\n } catch {\n // Fall through to the fixed fallback below.\n }\n\n return FALLBACK_VERSION;\n}\n\nexport const version = resolvePackageVersion();\n","/**\n * State/Control API — programmatic access to tap state.\n * GUI and autopilot consume these functions instead of shelling out to CLI.\n *\n * M105 P1: getDashboardSnapshot, streamEvents (read-only)\n * M105 P2: startAgents, stopAgents (write — wraps tap up/down)\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { collectDashboardSnapshot } from \"../engine/dashboard.js\";\nimport type { DashboardSnapshot } from \"../engine/dashboard.js\";\nimport { findRepoRoot } from \"../utils.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { loadState } from \"../state.js\";\nimport type { CommandResult } from \"../types.js\";\n\nexport interface StateApiOptions {\n repoRoot?: string;\n commsDir?: string;\n}\n\n/**\n * Get a point-in-time snapshot of all tap state:\n * agents, bridges, PRs, and warnings.\n *\n * This is the read-only entry point for GUI dashboards and autopilot.\n */\nexport function getDashboardSnapshot(\n options?: StateApiOptions,\n): DashboardSnapshot {\n const repoRoot = options?.repoRoot ?? findRepoRoot();\n return collectDashboardSnapshot(repoRoot, options?.commsDir);\n}\n\nexport interface EventStreamOptions extends StateApiOptions {\n /** Poll interval in milliseconds (default: 2000) */\n intervalMs?: number;\n /** AbortSignal to stop the stream */\n signal?: AbortSignal;\n}\n\n/**\n * Async generator that yields dashboard snapshots at regular intervals.\n * Useful for SSE or WebSocket push to GUI clients.\n *\n * Stops when the AbortSignal fires or the consumer breaks out.\n */\nexport async function* streamEvents(\n options?: EventStreamOptions,\n): AsyncGenerator<DashboardSnapshot> {\n const intervalMs = options?.intervalMs ?? 2000;\n const repoRoot = options?.repoRoot ?? findRepoRoot();\n\n while (!options?.signal?.aborted) {\n yield collectDashboardSnapshot(repoRoot, options?.commsDir);\n await new Promise<void>((resolve) => {\n const onAbort = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n options?.signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, intervalMs);\n options?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n}\n\n// ── Write API ───────────────────────────────────────────────────\n\nexport interface AgentControlOptions {\n /** Extra CLI args forwarded to `tap up` (e.g. `[\"--no-auth\"]`) */\n args?: string[];\n}\n\nexport interface AgentControlResult {\n ok: boolean;\n message: string;\n snapshot: DashboardSnapshot;\n commandResult: CommandResult;\n}\n\n/**\n * Start all registered bridge daemons.\n * Equivalent to `tap up [...args]`.\n *\n * Always operates on the cwd-based repo (same as CLI commands).\n * Use read-only APIs (getDashboardSnapshot) for cross-repo queries.\n */\nexport async function startAgents(\n options?: AgentControlOptions,\n): Promise<AgentControlResult> {\n const { upCommand } = await import(\"../commands/up.js\");\n const result = await upCommand(options?.args ?? []);\n const repoRoot = findRepoRoot();\n const snapshot = collectDashboardSnapshot(repoRoot);\n return {\n ok: result.ok,\n message: result.message,\n snapshot,\n commandResult: result,\n };\n}\n\n/**\n * Stop all running bridge daemons.\n * Equivalent to `tap down`.\n *\n * Always operates on the cwd-based repo (same as CLI commands).\n */\nexport async function stopAgents(): Promise<AgentControlResult> {\n const { downCommand } = await import(\"../commands/down.js\");\n const result = await downCommand([]);\n const repoRoot = findRepoRoot();\n const snapshot = collectDashboardSnapshot(repoRoot);\n return {\n ok: result.ok,\n message: result.message,\n snapshot,\n commandResult: result,\n };\n}\n\n// ── Health ──────────────────────────────────────────────────────\n\nexport interface HealthReport {\n ok: boolean;\n timestamp: string;\n bridges: DashboardSnapshot[\"bridges\"];\n agents: DashboardSnapshot[\"agents\"];\n warnings: DashboardSnapshot[\"warnings\"];\n headless: Record<string, unknown>[];\n}\n\n/**\n * Health check that combines dashboard snapshot with headless state.\n * Consumed by monitoring tools (Uptime Kuma, cron, autopilot).\n */\nexport function getHealthReport(options?: StateApiOptions): HealthReport {\n const repoRoot = options?.repoRoot ?? findRepoRoot();\n const snapshot = collectDashboardSnapshot(repoRoot, options?.commsDir);\n\n // Collect headless state from .tmp/ dirs — active instances only\n // (same filter as doctor checkBridgeTurnHealth to avoid stale session debris)\n const headlessStates: Record<string, unknown>[] = [];\n try {\n const state = loadState(repoRoot);\n const activeMatchers = new Set<string>();\n if (state) {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (inst?.installed && inst.bridgeMode === \"app-server\") {\n activeMatchers.add(id);\n if (inst.agentName) activeMatchers.add(inst.agentName);\n }\n }\n }\n\n const tmpDir = path.join(repoRoot, \".tmp\");\n if (fs.existsSync(tmpDir)) {\n for (const dir of fs.readdirSync(tmpDir)) {\n if (!dir.startsWith(\"codex-app-server-bridge\")) continue;\n const suffix = dir.replace(\"codex-app-server-bridge-\", \"\");\n // Filter to active instances (skip past session debris)\n if (activeMatchers.size > 0) {\n let matched = false;\n for (const matcher of activeMatchers) {\n if (suffix === matcher || suffix.startsWith(matcher)) {\n matched = true;\n break;\n }\n }\n if (!matched) continue;\n }\n const hsPath = path.join(tmpDir, dir, \"headless-state.json\");\n if (!fs.existsSync(hsPath)) continue;\n try {\n const hs = JSON.parse(fs.readFileSync(hsPath, \"utf-8\"));\n headlessStates.push({ instanceDir: dir, ...hs });\n } catch {\n // skip corrupted\n }\n }\n }\n } catch {\n // .tmp doesn't exist or state load failed\n }\n\n const hasFailures = snapshot.warnings.some((w) => w.level === \"error\");\n const hasBridgeDown = snapshot.bridges.some(\n (b) => b.status === \"stale\" || b.status === \"stopped\",\n );\n\n return {\n ok: !hasFailures && !hasBridgeDown,\n timestamp: snapshot.generatedAt,\n bridges: snapshot.bridges,\n agents: snapshot.agents,\n warnings: snapshot.warnings,\n headless: headlessStates,\n };\n}\n\n// ── Config ──────────────────────────────────────────────────────\n\n/**\n * Resolve tap configuration for API consumers.\n * Returns paths and settings without requiring CLI args.\n */\nexport function getConfig(options?: StateApiOptions) {\n const repoRoot = options?.repoRoot ?? findRepoRoot();\n const { config } = resolveConfig({}, repoRoot);\n return {\n repoRoot,\n commsDir: options?.commsDir ?? config.commsDir,\n stateDir: config.stateDir,\n appServerUrl: config.appServerUrl,\n };\n}\n","/**\n * Minimal HTTP transport for tap State API.\n * localhost-only, no external dependencies (uses node:http).\n *\n * Endpoints:\n * GET /api/snapshot — DashboardSnapshot JSON\n * GET /api/events — SSE stream of snapshots\n * GET /api/config — Resolved tap configuration\n * GET /health — Health check\n */\n\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport {\n getDashboardSnapshot,\n streamEvents,\n getConfig,\n getHealthReport,\n startAgents,\n stopAgents,\n} from \"./state.js\";\nimport type { StateApiOptions } from \"./state.js\";\n\nexport interface HttpServerOptions extends StateApiOptions {\n /** Port to listen on (default: 4580) */\n port?: number;\n}\n\nconst CORS_HEADERS = {\n \"Access-Control-Allow-Origin\": \"http://localhost:3000\",\n \"Access-Control-Allow-Methods\": \"GET, POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n};\n\nfunction jsonResponse(res: ServerResponse, data: unknown, status = 200): void {\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n ...CORS_HEADERS,\n });\n res.end(JSON.stringify(data));\n}\n\nfunction handleSnapshot(\n res: ServerResponse,\n apiOptions: StateApiOptions,\n): void {\n const snapshot = getDashboardSnapshot(apiOptions);\n jsonResponse(res, snapshot);\n}\n\nfunction handleConfig(res: ServerResponse, apiOptions: StateApiOptions): void {\n const config = getConfig(apiOptions);\n jsonResponse(res, config);\n}\n\nasync function handleEvents(\n req: IncomingMessage,\n res: ServerResponse,\n apiOptions: StateApiOptions,\n): Promise<void> {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...CORS_HEADERS,\n });\n\n const controller = new AbortController();\n req.on(\"close\", () => controller.abort());\n\n for await (const snapshot of streamEvents({\n ...apiOptions,\n signal: controller.signal,\n })) {\n if (controller.signal.aborted) break;\n res.write(`data: ${JSON.stringify(snapshot)}\\n\\n`);\n }\n\n res.end();\n}\n\nfunction handleHealth(res: ServerResponse, apiOptions: StateApiOptions): void {\n const report = getHealthReport(apiOptions);\n jsonResponse(res, report);\n}\n\n/**\n * Start a localhost-only HTTP server for the tap State API.\n * Resolves after the server is listening. Rejects on bind failure (e.g. EADDRINUSE).\n */\nexport async function startHttpServer(options?: HttpServerOptions): Promise<{\n port: number;\n close: () => Promise<void>;\n}> {\n const port = options?.port ?? 4580;\n // Security: always bind to loopback — no auth layer, must not expose to network\n const host = \"127.0.0.1\";\n const apiOptions: StateApiOptions = {\n repoRoot: options?.repoRoot,\n commsDir: options?.commsDir,\n };\n\n const server = createServer(\n async (req: IncomingMessage, res: ServerResponse) => {\n const url = new URL(req.url ?? \"/\", `http://${host}:${port}`);\n const pathname = url.pathname;\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204, CORS_HEADERS);\n res.end();\n return;\n }\n\n try {\n // GET endpoints\n if (req.method === \"GET\") {\n switch (pathname) {\n case \"/api/snapshot\":\n handleSnapshot(res, apiOptions);\n return;\n case \"/api/events\":\n await handleEvents(req, res, apiOptions);\n return;\n case \"/api/config\":\n handleConfig(res, apiOptions);\n return;\n case \"/health\":\n handleHealth(res, apiOptions);\n return;\n }\n }\n\n // POST endpoints (write API)\n // Require application/json Content-Type to prevent CSRF via browser forms\n // (HTML forms cannot send application/json, forcing preflight on cross-origin)\n if (req.method === \"POST\") {\n const contentType = req.headers[\"content-type\"] ?? \"\";\n if (!contentType.includes(\"application/json\")) {\n jsonResponse(\n res,\n { error: \"Content-Type must be application/json\" },\n 415,\n );\n return;\n }\n\n switch (pathname) {\n case \"/api/start\":\n jsonResponse(res, await startAgents());\n return;\n case \"/api/stop\":\n jsonResponse(res, await stopAgents());\n return;\n }\n }\n\n jsonResponse(res, { error: \"Not found\" }, 404);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n jsonResponse(res, { error: message }, 500);\n }\n },\n );\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, host, () => {\n server.removeListener(\"error\", reject);\n resolve();\n });\n });\n\n return {\n port,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n }),\n };\n}\n"],"mappings":"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","names":["fs","path","findRepoRoot","fs","path","basename","fs","path","fileURLToPath","version","fs","path","version","major","fs","path","spawnSync","execSync","fileURLToPath","resolve","DEFAULT_APP_SERVER_URL","manualCommand","pid","healthy","healthyAt","fs","path","execSync","fs","path","execSync","crypto","fs","path","fs","path","fileURLToPath","fs","path","setNestedKey","path","init_bridge","init_bridge","init_bridge","fs","path","fs","path","resolve","upCommand","downCommand","createServer","createServer","resolve"]}