@hua-labs/tap 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/init.ts","../src/state.ts","../src/config/resolve.ts","../src/utils.ts","../src/version.ts","../src/permissions.ts","../src/toml.ts","../src/adapters/claude.ts","../src/adapters/common.ts","../src/adapters/codex.ts","../src/artifact-backups.ts","../src/adapters/gemini.ts","../src/adapters/index.ts","../src/engine/bridge-paths.ts","../src/engine/bridge-file-io.ts","../src/engine/bridge-port-network.ts","../src/engine/bridge-codex-command.ts","../src/engine/bridge-windows-spawn.ts","../src/engine/bridge-unix-spawn.ts","../src/engine/bridge-process-control.ts","../src/engine/bridge-config.ts","../src/engine/bridge-state.ts","../src/engine/bridge-observability.ts","../src/engine/bridge-app-server-health.ts","../src/engine/bridge-app-server-auth.ts","../src/runtime/resolve-node.ts","../src/engine/bridge-app-server-lifecycle.ts","../src/engine/bridge-startup.ts","../src/engine/bridge-orchestrator.ts","../src/commands/add.ts","../src/commands/status.ts","../src/engine/rollback.ts","../src/commands/remove.ts","../src/commands/bridge.ts","../src/engine/dashboard.ts","../src/commands/up.ts","../src/commands/down.ts","../src/commands/serve.ts","../src/commands/init-worktree.ts","../src/commands/dashboard.ts","../src/commands/doctor.ts","../src/commands/comms.ts","../src/commands/watch.ts","../src/commands/gui.ts","../src/engine/missions.ts","../src/engine/pull-requests.ts","../src/output.ts","../src/cli-suggest.ts","../src/cli.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { createInitialState, saveState, stateExists } from \"../state.js\";\nimport {\n findRepoRoot,\n resolveCommsDir,\n log,\n logSuccess,\n logWarn,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport { version } from \"../version.js\";\nimport {\n applyClaudePermissions,\n applyCodexPermissions,\n buildPermissionSummary,\n} from \"../permissions.js\";\nimport type { CommandResult } from \"../types.js\";\nimport type { PermissionMode } from \"../permissions.js\";\nimport {\n resolveConfig,\n saveSharedConfig,\n loadSharedConfig,\n} from \"../config/index.js\";\n\nconst COMMS_DIRS = [\n \"inbox\",\n \"reviews\",\n \"findings\",\n \"handoff\",\n \"retros\",\n \"archive\",\n];\n\nfunction parsePermissionMode(args: string[]): PermissionMode {\n const idx = args.indexOf(\"--permissions\");\n if (idx !== -1 && args[idx + 1]) {\n const value = args[idx + 1];\n if (value === \"full\" || value === \"safe\") return value;\n logWarn(`Unknown permission mode: ${value}. Using \"safe\".`);\n }\n return \"safe\";\n}\n\nconst INIT_HELP = `\nUsage:\n tap init [options]\n\nDescription:\n Initialize the tap directory structure, state file, and permissions.\n Optionally clone a shared comms repository.\n\nOptions:\n --comms-dir <path> Override comms directory (default: tap-comms/)\n --comms-repo <url> Clone a shared comms git repo into comms directory\n --permissions <mode> Permission mode: safe (default) or full\n --force Re-initialize even if already set up\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap init\n npx @hua-labs/tap init --permissions full\n npx @hua-labs/tap init --comms-repo https://github.com/org/comms.git\n npx @hua-labs/tap init --comms-dir /shared/comms --force\n`.trim();\n\nexport async function initCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(INIT_HELP);\n return {\n ok: true,\n command: \"init\",\n code: \"TAP_NO_OP\",\n message: INIT_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const commsDir = resolveCommsDir(args, repoRoot);\n const permMode = parsePermissionMode(args);\n\n // Check if already initialized\n if (stateExists(repoRoot) && !args.includes(\"--force\")) {\n return {\n ok: true,\n command: \"init\",\n code: \"TAP_ALREADY_INITIALIZED\",\n message: \"Already initialized. Use --force to re-initialize.\",\n warnings: [],\n data: { commsDir, repoRoot },\n };\n }\n\n logHeader(\"@hua-labs/tap init\");\n\n // Clone comms repo if --comms-repo provided\n const commsRepoIdx = args.indexOf(\"--comms-repo\");\n const commsRepoUrl =\n commsRepoIdx !== -1 && args[commsRepoIdx + 1]\n ? args[commsRepoIdx + 1]\n : undefined;\n\n if (commsRepoUrl) {\n if (fs.existsSync(commsDir) && fs.readdirSync(commsDir).length > 0) {\n const gitDir = path.join(commsDir, \".git\");\n if (fs.existsSync(gitDir)) {\n log(`Comms directory exists: ${commsDir}`);\n logSuccess(\"Comms directory is already a git repo — linking only\");\n } else {\n logError(`Comms directory exists but is not a git repo: ${commsDir}`);\n return {\n ok: false,\n command: \"init\",\n code: \"TAP_INIT_CLONE_FAILED\",\n message: `Comms directory \"${commsDir}\" exists but is not a git repo. Remove it or use --force to reinitialize.`,\n warnings: [],\n data: { commsDir, commsRepoUrl },\n };\n }\n } else {\n log(`Cloning comms repo: ${commsRepoUrl}`);\n try {\n const cloneResult = spawnSync(\n \"git\",\n [\"clone\", commsRepoUrl, commsDir],\n {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n },\n );\n if (cloneResult.status !== 0) {\n throw new Error(\n cloneResult.stderr ||\n `git clone exited with code ${cloneResult.status}`,\n );\n }\n logSuccess(`Cloned comms repo to ${commsDir}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(`Failed to clone comms repo: ${msg}`);\n return {\n ok: false,\n command: \"init\",\n code: \"TAP_INIT_CLONE_FAILED\",\n message: `Failed to clone comms repo: ${msg}`,\n warnings: [],\n data: { commsRepoUrl },\n };\n }\n }\n }\n\n // Persist comms config (commsDir + optional repoUrl) for tap comms pull/push\n {\n const sharedConfig = loadSharedConfig(repoRoot) ?? {};\n let configChanged = false;\n if (commsRepoUrl) {\n sharedConfig.commsRepoUrl = commsRepoUrl;\n configChanged = true;\n }\n const commsDirRelative = path.relative(repoRoot, commsDir);\n if (commsDirRelative && commsDirRelative !== \"tap-comms\") {\n sharedConfig.commsDir = commsDirRelative;\n configChanged = true;\n }\n if (configChanged) {\n saveSharedConfig(repoRoot, sharedConfig);\n logSuccess(\"Saved comms config to tap-config.json\");\n }\n }\n\n // Create comms directory structure\n log(`Comms directory: ${commsDir}`);\n for (const dir of COMMS_DIRS) {\n const dirPath = path.join(commsDir, dir);\n fs.mkdirSync(dirPath, { recursive: true });\n logSuccess(`Created ${dir}/`);\n }\n\n // Create .gitignore in comms dir\n const gitignorePath = path.join(commsDir, \".gitignore\");\n if (!fs.existsSync(gitignorePath)) {\n fs.writeFileSync(\n gitignorePath,\n [\"tap.db\", \".lock\", \"*.tmp.*\", \".DS_Store\"].join(\"\\n\") + \"\\n\",\n \"utf-8\",\n );\n logSuccess(\"Created .gitignore\");\n }\n\n // Create state directory (config-resolved — may differ from default .tap-comms/)\n const { config } = resolveConfig({}, repoRoot);\n const stateDir = config.stateDir;\n fs.mkdirSync(path.join(stateDir, \"pids\"), { recursive: true });\n fs.mkdirSync(path.join(stateDir, \"logs\"), { recursive: true });\n fs.mkdirSync(path.join(stateDir, \"backups\"), { recursive: true });\n const stateDirRel = path.relative(repoRoot, stateDir);\n logSuccess(`Created ${stateDirRel}/ state directory`);\n\n // Add state dir + local config to repo .gitignore if not present\n const repoGitignore = path.join(repoRoot, \".gitignore\");\n const gitignoreEntries = [\n { entry: stateDirRel.replace(/\\\\/g, \"/\") + \"/\", label: \"tap-comms state\" },\n {\n entry: \"tap-config.local.json\",\n label: \"tap-comms local config (machine-specific)\",\n },\n ];\n if (fs.existsSync(repoGitignore)) {\n const content = fs.readFileSync(repoGitignore, \"utf-8\");\n for (const { entry, label } of gitignoreEntries) {\n if (!content.includes(entry)) {\n fs.appendFileSync(repoGitignore, `\\n# ${label}\\n${entry}\\n`);\n logSuccess(`Added ${entry} to .gitignore`);\n }\n }\n }\n\n // Create initial state\n const state = createInitialState(commsDir, repoRoot, version);\n saveState(repoRoot, state);\n logSuccess(\"Created state.json\");\n\n // Apply permissions\n const warnings: string[] = [];\n logHeader(`Permissions: ${permMode} mode`);\n\n const claudeResult = applyClaudePermissions(repoRoot, permMode);\n warnings.push(...claudeResult.warnings);\n\n const codexResult = applyCodexPermissions(repoRoot, commsDir, permMode);\n warnings.push(...codexResult.warnings);\n\n const permSummary = buildPermissionSummary(permMode, repoRoot, commsDir);\n\n if (permMode === \"full\") {\n logWarn(\"Full mode: no destructive operation guards. Use with caution.\");\n }\n\n logHeader(\"Done! Next steps:\");\n log(\"npx @hua-labs/tap add claude # Add Claude runtime\");\n log(\"npx @hua-labs/tap add codex # Add Codex runtime\");\n log(\"npx @hua-labs/tap status # Check status\");\n\n return {\n ok: true,\n command: \"init\",\n code: \"TAP_INIT_OK\",\n message: \"Initialized successfully\",\n warnings,\n data: {\n commsDir,\n repoRoot,\n permissions: permSummary,\n },\n };\n}\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 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, log } 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 log(\n \"No .git directory found. Resolved tap root via package.json. \" +\n \"That's fine outside git; use --comms-dir to choose a different comms location.\",\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 log(\n \"No git repository or package.json found. Using the current directory as tap root. \" +\n \"That's fine outside git; use --comms-dir to choose a different comms location.\",\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\nexport function 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","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, normalizeTapPath } 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;\nconst _loggedWarnings = new Set<string>();\n\nexport function _setNoGitWarned() {\n _noGitWarned = true;\n}\n\nexport function resetLoggedWarnings() {\n _loggedWarnings.clear();\n}\n\nexport function wasWarningLogged(message: string): boolean {\n return _loggedWarnings.has(message);\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 log(\n \"No .git directory found. Resolved tap root via package.json. \" +\n \"That's fine outside git; use --comms-dir to choose a different comms location.\",\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 log(\n \"No git repository or package.json found. Using the current directory as tap root. \" +\n \"That's fine outside git; use --comms-dir to choose a different comms location.\",\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(normalizeTapPath(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(normalizeTapPath(commsDir)),\n repoRoot: path.resolve(normalizeTapPath(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) return;\n _loggedWarnings.add(message);\n 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// ─── CLI argument validation ──────────────────────────────────\n\n/**\n * Parse and validate an integer CLI flag within a range.\n * Returns undefined if the flag is not provided, or the validated number.\n * Throws a descriptive error if invalid.\n */\nexport function parseIntFlag(\n value: string | undefined,\n name: string,\n min: number,\n max: number,\n): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < min || parsed > max) {\n throw new RangeError(\n `Invalid ${name}: ${value}. Must be an integer between ${min} and ${max}.`,\n );\n }\n return parsed;\n}\n\n/**\n * Parse and validate a port number (1-65535).\n */\nexport function parsePortFlag(value: string | undefined): number | null {\n if (value === undefined) return null;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65535) {\n throw new RangeError(\n `Invalid port: ${value}. Must be between 1 and 65535.`,\n );\n }\n return parsed;\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 { 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","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { logSuccess, logWarn } from \"./utils.js\";\nimport { replaceTomlTable, renderTomlTable, extractTomlTable } from \"./toml.js\";\n\nexport type PermissionMode = \"safe\" | \"full\";\n\n// ─── Claude Deny List ───────────────────────────────────────────\n\nconst CLAUDE_DENY_RULES = [\n \"Bash(git push --force:*)\",\n \"Bash(git push -f:*)\",\n \"Bash(git push --force-with-lease:*)\",\n \"Bash(git reset --hard:*)\",\n \"Bash(git checkout -- .:*)\",\n \"Bash(git clean -f:*)\",\n \"Bash(git clean -fd:*)\",\n \"Bash(git clean -fdx:*)\",\n \"Bash(git restore --source=:*)\",\n \"Bash(git branch -D:*)\",\n \"Bash(git stash drop:*)\",\n \"Bash(rm -rf:*)\",\n];\n\n/**\n * Apply Claude permission settings to .claude/settings.local.json.\n * Safe mode: adds deny list for destructive operations.\n * Full mode: removes tap-managed deny rules (restores full access).\n */\nexport function applyClaudePermissions(\n repoRoot: string,\n mode: PermissionMode,\n): { applied: boolean; warnings: string[] } {\n const warnings: string[] = [];\n const claudeDir = path.join(repoRoot, \".claude\");\n const settingsPath = path.join(claudeDir, \"settings.local.json\");\n\n fs.mkdirSync(claudeDir, { recursive: true });\n\n let settings: Record<string, unknown> = {};\n if (fs.existsSync(settingsPath)) {\n try {\n settings = JSON.parse(fs.readFileSync(settingsPath, \"utf-8\"));\n } catch {\n warnings.push(\n \".claude/settings.local.json was invalid JSON. Starting fresh.\",\n );\n settings = {};\n }\n }\n\n const existingDeny = Array.isArray(settings.deny)\n ? (settings.deny as string[])\n : [];\n\n if (mode === \"full\") {\n // Remove tap-managed deny rules, keep user-added ones\n const tapRuleSet = new Set(CLAUDE_DENY_RULES);\n const cleaned = existingDeny.filter((r) => !tapRuleSet.has(r));\n settings.deny = cleaned;\n\n const tmp = `${settingsPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(settings, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, settingsPath);\n\n logWarn(\"Claude: full mode — tap deny rules removed. Use with caution.\");\n warnings.push(\"Full permission mode: tap deny rules removed.\");\n return { applied: true, warnings };\n }\n\n // Safe mode: merge deny rules without duplicating\n const newDeny = [...new Set([...existingDeny, ...CLAUDE_DENY_RULES])];\n settings.deny = newDeny;\n\n const tmp = `${settingsPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(settings, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, settingsPath);\n\n logSuccess(\n `Claude: ${CLAUDE_DENY_RULES.length} deny rules applied to .claude/settings.local.json`,\n );\n\n return { applied: true, warnings };\n}\n\n// ─── Codex Config Patching ──────────────────────────────────────\n\nfunction findCodexConfigPath(): string {\n return path.join(os.homedir(), \".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\n/**\n * Apply Codex permission settings to ~/.codex/config.toml.\n * Safe mode: network full + trust project paths.\n * Full mode: danger-full-access warning (manual step).\n */\nexport function applyCodexPermissions(\n repoRoot: string,\n commsDir: string,\n mode: PermissionMode,\n): { applied: boolean; warnings: string[] } {\n const warnings: string[] = [];\n const configPath = findCodexConfigPath();\n\n // Read existing config\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n let content = \"\";\n if (fs.existsSync(configPath)) {\n content = fs.readFileSync(configPath, \"utf-8\");\n }\n\n // Both modes need trust paths\n const trustTargets = getCodexWritableRoots(repoRoot, commsDir);\n\n if (mode === \"full\") {\n // Full mode: danger-full-access + trust\n logWarn(\"Codex: full mode — setting sandbox to danger-full-access.\");\n warnings.push(\n \"Full mode: sandbox set to danger-full-access. Use with caution.\",\n );\n\n content = replaceTomlTable(\n content,\n \"sandbox\",\n renderTomlTable(\n \"sandbox\",\n { mode: \"danger-full-access\" },\n extractTomlTable(content, \"sandbox\"),\n ),\n );\n } else {\n // Safe mode: workspace-write + network full + writable_roots\n content = replaceTomlTable(\n content,\n \"sandbox\",\n renderTomlTable(\n \"sandbox\",\n { mode: \"workspace-write\", network_access: \"full\" },\n extractTomlTable(content, \"sandbox\"),\n ),\n );\n\n // Writable roots for workspace-write mode\n const forwardSlashRoots = trustTargets.map((r) => r.replace(/\\\\/g, \"/\"));\n content = replaceTomlTable(\n content,\n \"sandbox_workspace_write\",\n renderTomlTable(\n \"sandbox_workspace_write\",\n { writable_roots: forwardSlashRoots },\n extractTomlTable(content, \"sandbox_workspace_write\"),\n ),\n );\n\n // Windows elevated sandbox\n if (process.platform === \"win32\") {\n content = replaceTomlTable(\n content,\n \"windows\",\n renderTomlTable(\n \"windows\",\n { sandbox: \"elevated\" },\n extractTomlTable(content, \"windows\"),\n ),\n );\n }\n }\n\n // Trust project paths (both modes)\n for (const target of trustTargets) {\n const selector = `projects.'${canonicalizeTrustPath(target)}'`;\n content = replaceTomlTable(\n content,\n selector,\n renderTomlTable(\n selector,\n { trust_level: \"trusted\" },\n extractTomlTable(content, selector),\n ),\n );\n }\n\n // Write back\n const tmp = `${configPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, content, \"utf-8\");\n fs.renameSync(tmp, configPath);\n\n const modeLabel =\n mode === \"full\" ? \"danger-full-access\" : \"workspace-write, network=full\";\n logSuccess(\n `Codex: sandbox=${modeLabel}, ${trustTargets.length} path(s) trusted`,\n );\n\n return { applied: true, warnings };\n}\n\n// ─── Codex Writable Roots ───────────────────────────────────────\n\nexport function getCodexWritableRoots(\n repoRoot: string,\n commsDir: string,\n): string[] {\n const roots = [repoRoot, commsDir];\n\n // Add worktree siblings\n const parent = path.dirname(repoRoot);\n for (let i = 1; i <= 4; i++) {\n const wtPath = path.join(parent, `hua-wt-${i}`);\n if (fs.existsSync(wtPath)) roots.push(wtPath);\n }\n\n return [...new Set(roots.map((r) => path.resolve(r)))];\n}\n\n// ─── Permission Summary ────────────────────────────────────────\n\nexport interface PermissionSummary {\n mode: PermissionMode;\n claude: { applied: boolean; denyCount: number; warnings: string[] };\n codex: { applied: boolean; trustedPaths: string[]; warnings: string[] };\n}\n\nexport function buildPermissionSummary(\n mode: PermissionMode,\n repoRoot: string,\n commsDir: string,\n): PermissionSummary {\n const trustedPaths = getCodexWritableRoots(repoRoot, commsDir);\n\n return {\n mode,\n claude: {\n applied: true,\n denyCount: mode === \"safe\" ? CLAUDE_DENY_RULES.length : 0,\n warnings: mode === \"full\" ? [\"Full mode: tap deny rules removed.\"] : [],\n },\n codex: {\n applied: true,\n trustedPaths,\n warnings:\n mode === \"full\"\n ? [\"Full mode: sandbox set to danger-full-access.\"]\n : [],\n },\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 { 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\";\n\n// Legacy key name — used for auto-migration from pre-0.3 configs\nconst OLD_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 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 if (config.mcpServers?.[OLD_MCP_SERVER_KEY]) {\n conflicts.push(\n `Legacy \"${OLD_MCP_SERVER_KEY}\" entry will be migrated to \"${MCP_SERVER_KEY}\".`,\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 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 // Migrate: remove legacy \"tap-comms\" key if present\n const servers = config.mcpServers as\n | Record<string, unknown>\n | undefined;\n if (servers?.[OLD_MCP_SERVER_KEY]) {\n delete servers[OLD_MCP_SERVER_KEY];\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 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 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 const absolutePath = resolveCommandPath(candidate);\n return { command: absolutePath ?? candidate, version };\n }\n }\n\n return { command: null, version: null };\n}\n\n/**\n * Resolve a command name to its absolute filesystem path.\n * Uses `where.exe` on Windows, `which` on Unix.\n * Returns null if resolution fails (falls back to original candidate).\n */\nfunction resolveCommandPath(command: string): string | null {\n // Skip if already absolute\n if (path.isAbsolute(command)) return command;\n\n const whichCmd = process.platform === \"win32\" ? \"where.exe\" : \"which\";\n try {\n const result = spawnSync(whichCmd, [command], {\n encoding: \"utf-8\",\n windowsHide: true,\n });\n if (result.status !== 0) return null;\n const lines = result.stdout\n .trim()\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n\n if (lines.length === 0) return null;\n\n if (process.platform === \"win32\") {\n // On Windows, where.exe may return extensionless shims before .cmd/.exe.\n // Extensionless shims work with `shell: true` but fail with direct spawn.\n // Always prefer .cmd/.exe results that are directly executable.\n const candidateExt = path.extname(command).toLowerCase();\n\n // 1. If candidate has extension, match it exactly\n if (candidateExt) {\n const extMatch = lines.find(\n (l) =>\n path.extname(l).toLowerCase() === candidateExt && fs.existsSync(l),\n );\n if (extMatch) return extMatch;\n }\n\n // 2. For bare names (no extension), prefer .cmd or .exe over extensionless\n const executableMatch = lines.find(\n (l) => /\\.(cmd|exe|ps1)$/i.test(l) && fs.existsSync(l),\n );\n if (executableMatch) return executableMatch;\n }\n\n // Fallback: first existing result\n const firstValid = lines.find((l) => fs.existsSync(l));\n return firstValid ?? null;\n } catch {\n return null;\n }\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 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 const isEphemeralSource = isEphemeralPath(sourcePath);\n let command: string | null = bunCommand;\n let args: string[] = [toForwardSlashPath(sourcePath)];\n\n // Ephemeral source path (npx cache) → always use stable launcher, even with bun\n // This prevents persisting _npx cache paths in .mcp.json / config.toml\n if (isEphemeralSource && isBundled) {\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 (!command && isBundled) {\n // No bun, bundled .mjs — check node path stability\n const isEphemeralNode = isEphemeralPath(process.execPath);\n\n 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 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 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","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 parseTomlAssignments,\n removeTomlTable,\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\";\nimport type { ManagedMcpServerSpec } from \"./common.js\";\n\nconst MCP_SELECTOR = \"mcp_servers.tap\";\nconst ENV_SELECTOR = \"mcp_servers.tap.env\";\nconst SESSION_NEUTRAL_AGENT_NAME = \"<set-per-session>\";\n\n// Legacy key names — used for auto-migration from pre-0.3 configs\nconst OLD_MCP_SELECTOR = \"mcp_servers.tap-comms\";\nconst OLD_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 buildSessionNeutralCodexSpec(\n ctx: AdapterContext,\n): ManagedMcpServerSpec {\n const managed = buildManagedMcpServerSpec(ctx);\n const env: Record<string, string> = {\n ...managed.env,\n TAP_AGENT_NAME: SESSION_NEUTRAL_AGENT_NAME,\n };\n delete env.TAP_AGENT_ID;\n return { ...managed, env };\n}\n\nfunction buildCodexEnvEntries(\n existingTable: string | null,\n managedEnv: Record<string, string | string[]>,\n): Record<string, string | string[]> {\n const preservedEnv = parseTomlAssignments(existingTable ?? \"\");\n delete preservedEnv.TAP_AGENT_ID;\n return {\n ...preservedEnv,\n ...managedEnv,\n };\n}\n\nfunction verifyManagedToml(\n content: string,\n ctx: AdapterContext,\n configPath: string,\n): VerifyCheck[] {\n const checks: VerifyCheck[] = [];\n const managed = buildSessionNeutralCodexSpec(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 MCP table present\",\n passed: !!mainTable,\n message: mainTable ? undefined : `${MCP_SELECTOR} not found`,\n });\n checks.push({\n name: \"tap 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 const expectedArgs = managed.args\n .map((a) => `\"${a.replace(/\\\\/g, \"\\\\\\\\\")}\"`)\n .join(\", \");\n checks.push({\n name: \"Managed command configured\",\n passed:\n mainTable.includes(\n `command = \"${managed.command.replace(/\\\\/g, \"\\\\\\\\\")}\"`,\n ) && mainTable.includes(`args = [${expectedArgs}]`),\n message: \"Managed tap command/args do not match expected values\",\n });\n }\n\n if (envTable) {\n const envValues = parseTomlAssignments(envTable);\n checks.push({\n name: \"Managed TAP_AGENT_NAME is session-neutral\",\n passed: envValues.TAP_AGENT_NAME === managed.env.TAP_AGENT_NAME,\n message: `TAP_AGENT_NAME should be \"${SESSION_NEUTRAL_AGENT_NAME}\"`,\n });\n checks.push({\n name: \"Managed TAP_AGENT_ID is omitted\",\n passed: typeof envValues.TAP_AGENT_ID !== \"string\",\n message: \"TAP_AGENT_ID should not be persisted in Codex config\",\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, OLD_MCP_SELECTOR)) {\n conflicts.push(\n `Legacy ${OLD_MCP_SELECTOR} table will be migrated to ${MCP_SELECTOR}.`,\n );\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 = buildSessionNeutralCodexSpec(ctx);\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\n // Migrate: remove legacy \"tap-comms\" keys if present\n if (extractTomlTable(nextContent, OLD_ENV_SELECTOR)) {\n nextContent = removeTomlTable(nextContent, OLD_ENV_SELECTOR);\n }\n if (extractTomlTable(nextContent, OLD_MCP_SELECTOR)) {\n nextContent = removeTomlTable(nextContent, OLD_MCP_SELECTOR);\n }\n\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 buildCodexEnvEntries(\n extractTomlTable(existingContent, ENV_SELECTOR),\n managed.env,\n ),\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 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","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\";\n\n// Legacy key name — used for auto-migration from pre-0.3 configs\nconst OLD_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 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 if (readNestedKey(config, OLD_GEMINI_SELECTOR) !== undefined) {\n conflicts.push(\n `Legacy ${OLD_GEMINI_SELECTOR} entry will be migrated to ${GEMINI_SELECTOR}.`,\n );\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 // Migrate: remove legacy \"tap-comms\" key if present\n const oldValue = readNestedKey(config, OLD_GEMINI_SELECTOR);\n if (oldValue !== undefined) {\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n if (servers) {\n delete servers[\"tap-comms\"];\n }\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 type { InstanceId } from \"../types.js\";\n\nexport function appServerLogFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return path.join(stateDir, \"logs\", `app-server-${instanceId}.log`);\n}\n\nexport function appServerGatewayLogFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return path.join(stateDir, \"logs\", `app-server-gateway-${instanceId}.log`);\n}\n\nexport function 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\nexport function stderrLogFilePath(logPath: string): string {\n return `${logPath}.stderr`;\n}\n\nexport function pidFilePath(stateDir: string, instanceId: InstanceId): string {\n return path.join(stateDir, \"pids\", `bridge-${instanceId}.json`);\n}\n\nexport function logFilePath(stateDir: string, instanceId: InstanceId): string {\n return path.join(stateDir, \"logs\", `bridge-${instanceId}.log`);\n}\n\nexport function runtimeHeartbeatFilePath(runtimeStateDir: string): string {\n return path.join(runtimeStateDir, \"heartbeat.json\");\n}\n\nexport function runtimeThreadStateFilePath(runtimeStateDir: string): string {\n return path.join(runtimeStateDir, \"thread.json\");\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nconst APP_SERVER_AUTH_FILE_MODE = 0o600;\n\nexport function 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\nexport function 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\nexport function toPowerShellSingleQuotedString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nexport function toPowerShellStringArrayLiteral(values: string[]): string {\n return `@(${values.map(toPowerShellSingleQuotedString).join(\", \")})`;\n}\n","import * as net from \"node:net\";\nimport type { TapState, InstanceId } from \"../types.js\";\n\nconst DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\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\nexport type WebSocketCtor = new (\n url: string,\n protocols?: string | string[],\n) => WebSocketLike;\n\nexport function getWebSocketCtor(): WebSocketCtor | null {\n const candidate = (globalThis as { WebSocket?: unknown }).WebSocket;\n return typeof candidate === \"function\" ? (candidate as WebSocketCtor) : null;\n}\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isLoopbackHost(hostname: string): boolean {\n return hostname === \"127.0.0.1\" || hostname === \"localhost\";\n}\n\nexport async 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\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\n/**\n * Wait for a TCP port to become available after a process is stopped.\n * Polls isTcpPortAvailable at intervals until the port is free or timeout.\n * Returns true if the port was released, false if timeout expired.\n */\nexport async function waitForPortRelease(\n url: string,\n timeoutMs: number = 10_000,\n intervalMs: number = 500,\n): Promise<boolean> {\n let hostname: string;\n let port: number;\n try {\n const parsed = new URL(url);\n hostname = parsed.hostname;\n port = parseInt(parsed.port, 10);\n } catch {\n return true; // Can't parse URL — assume port is free\n }\n\n if (!port || !Number.isFinite(port)) return true;\n\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (await isTcpPortAvailable(hostname, port)) {\n return true;\n }\n await delay(intervalMs);\n }\n return false;\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","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Platform } from \"../types.js\";\nimport { probeCommand } from \"../adapters/common.js\";\n\n/**\n * Resolve the codex CLI command for the given platform.\n *\n * On Windows, npm-installed `codex.cmd` wrappers launch through cmd.exe,\n * which prevents PowerShell `Start-Process -WindowStyle Hidden` from properly\n * detaching the app-server process. When a `.cmd` wrapper is found, we parse\n * it to extract the underlying `node <script>` invocation and return that\n * instead, so the caller can spawn node directly.\n */\nexport function resolveCodexCommand(platform: Platform): string | null {\n const candidates =\n platform === \"win32\"\n ? [\"codex.cmd\", \"codex.exe\", \"codex\", \"codex.ps1\"]\n : [\"codex\"];\n const resolved = probeCommand(candidates).command;\n if (!resolved) return null;\n\n // Unwrap .cmd wrappers on Windows to avoid cmd.exe intermediate shell.\n // probeCommand() now returns absolute paths, so resolved is already\n // e.g. \"C:\\Users\\...\\npm\\codex.cmd\" — no extra where.exe lookup needed.\n if (platform === \"win32\" && resolved.endsWith(\".cmd\")) {\n const unwrapped = unwrapNpmCmdShim(resolved);\n if (unwrapped) return unwrapped;\n }\n\n return resolved;\n}\n\n/**\n * Parse an npm `.cmd` shim to extract the node + script path.\n *\n * npm `.cmd` shims follow this pattern:\n * ```\n * \"%_prog%\" \"%dp0%\\node_modules\\...\\bin\\script.js\" %*\n * ```\n *\n * Returns a space-separated `\"node /abs/path/to/script.js\"` string that\n * callers can split on the first space, or null if parsing fails.\n */\nexport function unwrapNpmCmdShim(cmdPath: string): string | null {\n let content: string;\n try {\n content = fs.readFileSync(cmdPath, \"utf-8\");\n } catch {\n return null;\n }\n\n // Match the final line: \"%_prog%\" \"%dp0%\\...\\script.js\" %*\n // npm shims use %dp0% (directory of the .cmd file) as base\n const match = content.match(\n /\"%_prog%\"\\s+\"(%dp0%\\\\[^\"]+)\"\\s+%\\*/,\n );\n if (!match) return null;\n\n const dp0 = path.dirname(cmdPath);\n const scriptRelative = match[1].replace(/%dp0%\\\\/g, \"\");\n const scriptPath = path.resolve(dp0, scriptRelative);\n\n if (!fs.existsSync(scriptPath)) return null;\n\n // Resolve node: prefer the local node next to the .cmd, else PATH node\n const localNode = path.join(dp0, \"node.exe\");\n const nodeCommand = fs.existsSync(localNode)\n ? localNode\n : (probeCommand([\"node.exe\", \"node\"]).command ?? \"node\");\n\n return `${nodeCommand}\\0${scriptPath}`;\n}\n\n/**\n * Split a resolved codex command into executable + prefix args.\n * If the command contains a NUL separator (from unwrapNpmCmdShim),\n * split on it. Otherwise return as-is with empty prefix args.\n */\nexport function splitResolvedCommand(resolved: string): {\n command: string;\n prefixArgs: string[];\n} {\n const parts = resolved.split(\"\\0\");\n if (parts.length === 2) {\n return { command: parts[0], prefixArgs: [parts[1]] };\n }\n return { command: resolved, prefixArgs: [] };\n}\n\nexport function resolvePowerShellCommand(): string {\n return (\n probeCommand([\"pwsh\", \"powershell\", \"powershell.exe\"]).command ??\n \"powershell\"\n );\n}\n\nexport function resolveAuthGatewayScript(repoRoot: string): string | null {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n // Bundled: dist/bridges/ sibling (npm install / built package)\n path.join(moduleDir, \"bridges\", \"codex-app-server-auth-gateway.mjs\"),\n // Source: src/bridges/ sibling (monorepo dev with ts runner)\n path.join(moduleDir, \"bridges\", \"codex-app-server-auth-gateway.ts\"),\n // Monorepo dist fallback\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","/**\n * Windows detached background spawn utilities for bridge/app-server processes.\n *\n * Extracted from engine/bridge.ts (Phase 3) to isolate wrapper generation,\n * hidden PowerShell launch, and listening PID discovery.\n *\n * @module engine/bridge-windows-spawn\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { spawnSync } from \"node:child_process\";\nimport type { Platform } from \"../types.js\";\nimport { stderrLogFilePath } from \"./bridge-paths.js\";\nimport {\n toPowerShellSingleQuotedString,\n toPowerShellStringArrayLiteral,\n removeFileIfExists,\n} from \"./bridge-file-io.js\";\nimport {\n resolvePowerShellCommand,\n splitResolvedCommand,\n} from \"./bridge-codex-command.js\";\n\nconst WINDOWS_SPAWN_WRAPPER_PREFIX = \"tap-spawn-\";\nconst WINDOWS_SPAWN_WRAPPER_STALE_MS = 60 * 60 * 1000;\n\nexport function cleanupStaleWindowsSpawnWrappers(now = Date.now()): void {\n let entries: string[];\n try {\n entries = fs.readdirSync(os.tmpdir());\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (\n !entry.startsWith(WINDOWS_SPAWN_WRAPPER_PREFIX) ||\n !/\\.(cmd|ps1)$/i.test(entry)\n ) {\n continue;\n }\n\n const wrapperPath = path.join(os.tmpdir(), entry);\n\n try {\n const stats = fs.statSync(wrapperPath);\n if (now - stats.mtimeMs < WINDOWS_SPAWN_WRAPPER_STALE_MS) {\n continue;\n }\n fs.unlinkSync(wrapperPath);\n } catch {\n // Best-effort cleanup only.\n }\n }\n}\n\nexport function buildWindowsDetachedWrapperScript(\n command: string,\n args: string[],\n logPath: string,\n stderrLogPath: string,\n env: NodeJS.ProcessEnv,\n): string {\n const lines = [\"$ErrorActionPreference = 'Stop'\"];\n\n for (const [key, value] of Object.entries(env)) {\n if (value !== undefined && value !== process.env[key]) {\n lines.push(\n `[Environment]::SetEnvironmentVariable(${toPowerShellSingleQuotedString(key)}, ${toPowerShellSingleQuotedString(value)}, 'Process')`,\n );\n }\n }\n\n lines.push(\n `$logPath = ${toPowerShellSingleQuotedString(logPath)}`,\n `$stderrLogPath = ${toPowerShellSingleQuotedString(stderrLogPath)}`,\n `$commandPath = ${toPowerShellSingleQuotedString(command)}`,\n `$commandArgs = ${toPowerShellStringArrayLiteral(args)}`,\n \"$exitCode = 1\",\n \"try {\",\n \" & $commandPath @commandArgs >> $logPath 2>> $stderrLogPath\",\n \" $exitCode = if ($null -ne $LASTEXITCODE) { $LASTEXITCODE } else { 0 }\",\n \"} finally {\",\n \" Remove-Item -LiteralPath $PSCommandPath -Force -ErrorAction SilentlyContinue\",\n \"}\",\n \"exit $exitCode\",\n );\n\n return `${lines.join(\"\\r\\n\")}\\r\\n`;\n}\n\n/**\n * Start a background process on Windows without creating a visible console window.\n *\n * Node.js `spawn({ detached: true })` sets `DETACHED_PROCESS` in CreateProcess,\n * which forces Windows to allocate a new console for console apps — even with\n * `windowsHide: true` (which only sets SW_HIDE, not CREATE_NO_WINDOW).\n * These two flags are mutually exclusive in the Windows API.\n *\n * Instead, we use PowerShell `Start-Process -WindowStyle Hidden` which internally\n * sets `ProcessStartInfo.CreateNoWindow = true`, preventing console allocation\n * entirely. A temp `.ps1` wrapper handles environment variables, robust argument\n * passing, append-mode log redirection, and self-cleans on normal exit.\n *\n * The returned PID is of the hidden PowerShell wrapper process, which stays alive\n * while the child runs.\n * `taskkill /PID <pid> /F /T` kills the entire tree.\n */\nexport function startWindowsDetachedProcess(\n command: string,\n args: string[],\n repoRoot: string,\n logPath: string,\n env: NodeJS.ProcessEnv = process.env,\n): number | null {\n const stderrLogPath = stderrLogFilePath(logPath);\n const powerShellCommand = resolvePowerShellCommand();\n\n cleanupStaleWindowsSpawnWrappers();\n\n const wrapperPath = path.join(\n os.tmpdir(),\n `${WINDOWS_SPAWN_WRAPPER_PREFIX}${randomBytes(4).toString(\"hex\")}.ps1`,\n );\n fs.writeFileSync(\n wrapperPath,\n buildWindowsDetachedWrapperScript(\n command,\n args,\n logPath,\n stderrLogPath,\n env,\n ),\n );\n\n const psCommand = [\n \"$p = Start-Process\",\n `-FilePath ${toPowerShellSingleQuotedString(powerShellCommand)}`,\n `-ArgumentList ${toPowerShellStringArrayLiteral([\"-NoLogo\", \"-NoProfile\", \"-File\", wrapperPath])}`,\n `-WorkingDirectory ${toPowerShellSingleQuotedString(repoRoot)}`,\n \"-WindowStyle Hidden\",\n \"-PassThru\",\n \"; Write-Output $p.Id\",\n ].join(\" \");\n\n const result = spawnSync(\n powerShellCommand,\n [\"-NoLogo\", \"-NoProfile\", \"-Command\", psCommand],\n {\n encoding: \"utf-8\",\n windowsHide: true,\n },\n );\n\n if (result.status !== 0) {\n removeFileIfExists(wrapperPath);\n return null;\n }\n\n const pid = parseInt(result.stdout.trim(), 10);\n if (!Number.isFinite(pid)) {\n removeFileIfExists(wrapperPath);\n return null;\n }\n\n return pid;\n}\n\nexport function startWindowsCodexAppServer(\n command: string,\n url: string,\n repoRoot: string,\n logPath: string,\n): number | null {\n const { command: exe, prefixArgs } = splitResolvedCommand(command);\n return startWindowsDetachedProcess(\n exe,\n [...prefixArgs, \"app-server\", \"--listen\", url],\n repoRoot,\n logPath,\n );\n}\n\nexport function 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","/**\n * Unix detached background spawn utilities for bridge/app-server processes.\n *\n * Extracted from inline non-Windows spawn paths to centralize detached launch\n * and listening PID discovery for macOS/Linux.\n *\n * @module engine/bridge-unix-spawn\n */\n\nimport * as fs from \"node:fs\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport type { Platform } from \"../types.js\";\nimport { splitResolvedCommand } from \"./bridge-codex-command.js\";\nimport { stderrLogFilePath } from \"./bridge-paths.js\";\n\nconst DEFAULT_UNIX_PLATFORM: Platform =\n process.platform === \"darwin\" ? \"darwin\" : \"linux\";\n\nfunction resolveUnixSpawnCommand(\n command: string,\n args: string[],\n platform: Platform,\n): { command: string; args: string[] } {\n if (platform === \"linux\") {\n // `nohup` keeps the child immune to SIGHUP when launched from SSH/login shells.\n return {\n command: \"nohup\",\n args: [command, ...args],\n };\n }\n\n return { command, args };\n}\n\nfunction findListeningPidWithLsof(port: number): number | null {\n const result = spawnSync(\n \"lsof\",\n [\"-nP\", `-iTCP:${port}`, \"-sTCP:LISTEN\", \"-t\"],\n {\n encoding: \"utf-8\",\n windowsHide: true,\n },\n );\n\n if (!result || 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\nfunction findListeningPidWithSs(port: number): number | null {\n const result = spawnSync(\"ss\", [\"-ltnpH\", `sport = :${port}`], {\n encoding: \"utf-8\",\n windowsHide: true,\n });\n\n if (!result || result.status !== 0) {\n return null;\n }\n\n const match = (result.stdout ?? \"\").match(/\\bpid=(\\d+)\\b/);\n if (!match) {\n return null;\n }\n\n const parsedPid = Number.parseInt(match[1], 10);\n return Number.isFinite(parsedPid) ? parsedPid : null;\n}\n\nexport function startUnixDetachedProcess(\n command: string,\n args: string[],\n repoRoot: string,\n logPath: string,\n env: NodeJS.ProcessEnv = process.env,\n platform: Platform = DEFAULT_UNIX_PLATFORM,\n): number | null {\n const stderrPath = stderrLogFilePath(logPath);\n let logFd: number | null = null;\n let stderrFd: number | null = null;\n\n try {\n logFd = fs.openSync(logPath, \"a\");\n stderrFd = fs.openSync(stderrPath, \"a\");\n const launch = resolveUnixSpawnCommand(command, args, platform);\n\n const child = spawn(launch.command, launch.args, {\n cwd: repoRoot,\n detached: true,\n stdio: [\"ignore\", logFd, stderrFd],\n env,\n windowsHide: true,\n });\n\n child.unref();\n return child.pid ?? null;\n } finally {\n if (logFd != null) {\n fs.closeSync(logFd);\n }\n if (stderrFd != null) {\n fs.closeSync(stderrFd);\n }\n }\n}\n\nexport function startUnixCodexAppServer(\n command: string,\n url: string,\n repoRoot: string,\n logPath: string,\n platform: Platform = DEFAULT_UNIX_PLATFORM,\n): number | null {\n const { command: exe, prefixArgs } = splitResolvedCommand(command);\n return startUnixDetachedProcess(\n exe,\n [...prefixArgs, \"app-server\", \"--listen\", url],\n repoRoot,\n logPath,\n process.env,\n platform,\n );\n}\n\nexport function findUnixListeningProcessId(\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 if (platform === \"linux\") {\n const ssPid = findListeningPidWithSs(port);\n if (ssPid != null) {\n return ssPid;\n }\n }\n\n return findListeningPidWithLsof(port);\n}\n","import { execSync, spawnSync } from \"node:child_process\";\nimport type { AppServerState, Platform } from \"../types.js\";\nimport { delay } from \"./bridge-port-network.js\";\nimport { removeFileIfExists } from \"./bridge-file-io.js\";\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\nfunction getUnixProcessGroupId(pid: number): number | null {\n const result = spawnSync(\"ps\", [\"-o\", \"pgid=\", \"-p\", String(pid)], {\n encoding: \"utf-8\",\n windowsHide: true,\n });\n\n if (!result || result.status !== 0) {\n return null;\n }\n\n const parsed = Number.parseInt((result.stdout ?? \"\").trim(), 10);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction isUnixProcessGroupAlive(processGroupId: number): boolean {\n try {\n process.kill(-processGroupId, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async 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 const processGroupId = getUnixProcessGroupId(pid);\n const signalTarget = processGroupId != null ? -processGroupId : pid;\n const isTargetAlive = (): boolean =>\n processGroupId != null\n ? isUnixProcessGroupAlive(processGroupId)\n : isProcessAlive(pid);\n\n process.kill(signalTarget, \"SIGTERM\");\n await delay(2_000);\n if (isTargetAlive()) {\n process.kill(signalTarget, \"SIGKILL\");\n await delay(500);\n }\n\n return !isTargetAlive();\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","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { InstanceId, BridgeState } from \"../types.js\";\nimport { loadState } from \"../state.js\";\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","/**\n * Bridge state management — persistence, process liveness, runtime state readers.\n *\n * Extracted from engine/bridge.ts (Phase 2) to isolate state CRUD and\n * runtime heartbeat/thread readers.\n * Observability helpers (heartbeat age, turn stuck, log rotation) live in\n * bridge-observability.ts.\n *\n * @module engine/bridge-state\n */\n\nimport * as fs from \"node:fs\";\nimport type { InstanceId, BridgeState } from \"../types.js\";\nimport {\n pidFilePath,\n runtimeHeartbeatFilePath,\n runtimeThreadStateFilePath,\n} from \"./bridge-paths.js\";\nimport { writeProtectedTextFile } from \"./bridge-file-io.js\";\nimport { isProcessAlive } from \"./bridge-process-control.js\";\n\n// ─── Types ────────────────────────────────────────────────────\n\nexport interface RuntimeBridgeHeartbeat {\n updatedAt?: string;\n threadId?: string | null;\n threadCwd?: string | null;\n activeTurnId?: string | null;\n turnStartedAt?: string | null;\n lastTurnStatus?: string | null;\n lastError?: string | null;\n connected?: boolean;\n initialized?: boolean;\n}\n\nexport interface RuntimeBridgeThreadState {\n threadId: string;\n updatedAt?: string;\n appServerUrl?: string;\n ephemeral?: boolean;\n cwd?: string | null;\n}\n\n// ─── Runtime state readers ────────────────────────────────────\n\nexport function loadRuntimeBridgeHeartbeat(\n bridgeState:\n | {\n runtimeStateDir?: string | null;\n }\n | null\n | undefined,\n): RuntimeBridgeHeartbeat | null {\n const runtimeStateDir = bridgeState?.runtimeStateDir;\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 return JSON.parse(\n fs.readFileSync(heartbeatPath, \"utf-8\"),\n ) as RuntimeBridgeHeartbeat;\n } catch {\n return null;\n }\n}\n\nexport function loadRuntimeBridgeThreadState(\n bridgeState:\n | {\n runtimeStateDir?: string | null;\n }\n | null\n | undefined,\n): RuntimeBridgeThreadState | null {\n const runtimeStateDir = bridgeState?.runtimeStateDir;\n if (!runtimeStateDir) {\n return null;\n }\n\n const threadPath = runtimeThreadStateFilePath(runtimeStateDir);\n if (!fs.existsSync(threadPath)) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(\n fs.readFileSync(threadPath, \"utf-8\"),\n ) as RuntimeBridgeThreadState;\n return parsed.threadId ? parsed : null;\n } catch {\n return null;\n }\n}\n\n// ─── Bridge state CRUD ────────────────────────────────────────\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\n// ─── Process liveness ─────────────────────────────────────────\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 * Bridge observability — heartbeat monitoring, turn stuck detection, log rotation.\n *\n * Consolidated from bridge-state.ts (heartbeat/turn functions) and\n * bridge-log-rotate.ts into a single observability module.\n *\n * @module engine/bridge-observability\n */\n\nimport * as fs from \"node:fs\";\nimport type { InstanceId, BridgeState } from \"../types.js\";\nimport {\n loadBridgeState,\n saveBridgeState,\n clearBridgeState,\n loadRuntimeBridgeHeartbeat,\n} from \"./bridge-state.js\";\nimport { isProcessAlive } from \"./bridge-process-control.js\";\n\n// ─── Re-export for convenience (moved from bridge-state.ts) ──\n\n// ─── Heartbeat ────────────────────────────────────────────────\n\n/**\n * Resolve the most recent heartbeat timestamp from runtime or persisted state.\n */\nfunction loadRuntimeHeartbeatTimestamp(\n runtimeStateDir: string | null | undefined,\n): string | null {\n const heartbeat = loadRuntimeBridgeHeartbeat({ runtimeStateDir });\n return typeof heartbeat?.updatedAt === \"string\" ? heartbeat.updatedAt : null;\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\n/**\n * Update the heartbeat timestamp for a running bridge.\n * Only the owning process (matching PID) can update the heartbeat.\n */\nexport function updateBridgeHeartbeat(\n stateDir: string,\n instanceId: InstanceId,\n): void {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return;\n\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\n// ─── Bridge status ────────────────────────────────────────────\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 if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return \"stale\";\n }\n\n return \"running\";\n}\n\n// ─── Turn stuck detection ─────────────────────────────────────\n\nexport interface TurnInfo {\n activeTurnId: string | null;\n lastTurnStatus: string | null;\n updatedAt: string | null;\n ageSeconds: number | null;\n stuck: boolean;\n}\n\n/**\n * Get current turn info from runtime heartbeat.\n * A turn is considered stuck if activeTurnId is set and turnStartedAt\n * exceeds the threshold.\n */\nexport function getTurnInfo(\n stateDir: string,\n instanceId: InstanceId,\n stuckThresholdSeconds: number = 300,\n): TurnInfo | null {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return null;\n\n const heartbeat = loadRuntimeBridgeHeartbeat(state);\n if (!heartbeat) return null;\n\n const activeTurnId = heartbeat.activeTurnId ?? null;\n const lastTurnStatus = heartbeat.lastTurnStatus ?? null;\n const turnTimestamp = heartbeat.turnStartedAt ?? null;\n const updatedAt = turnTimestamp ?? heartbeat.updatedAt ?? null;\n\n let ageSeconds: number | null = null;\n if (turnTimestamp) {\n const ts = new Date(turnTimestamp).getTime();\n if (!isNaN(ts)) {\n ageSeconds = Math.floor((Date.now() - ts) / 1000);\n }\n }\n\n const stuck =\n activeTurnId !== null &&\n ageSeconds !== null &&\n ageSeconds > stuckThresholdSeconds;\n\n return { activeTurnId, lastTurnStatus, updatedAt, ageSeconds, stuck };\n}\n\n/**\n * Check if a bridge's current turn is stuck.\n */\nexport function isTurnStuck(\n stateDir: string,\n instanceId: InstanceId,\n thresholdSeconds: number = 300,\n): boolean {\n const info = getTurnInfo(stateDir, instanceId, thresholdSeconds);\n return info?.stuck ?? false;\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","import * as net from \"node:net\";\nimport type { AppServerState } from \"../types.js\";\nimport { getWebSocketCtor, delay } from \"./bridge-port-network.js\";\n\nexport interface 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\nexport type WebSocketCtor = new (\n url: string,\n protocols?: string | string[],\n) => WebSocketLike;\n\nexport const APP_SERVER_HEALTH_TIMEOUT_MS = 1_500;\nexport const APP_SERVER_HEALTH_RETRY_MS = 250;\nexport const APP_SERVER_READYZ_PATH = \"/readyz\";\n\nexport const AUTH_SUBPROTOCOL_PREFIX = \"tap-auth-\";\n\nexport type AppServerReadyzStatus = \"ready\" | \"not-ready\" | \"unsupported\";\n\nexport async function checkAppServerHealth(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n gatewayToken?: string | null,\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 // Authenticate via WebSocket subprotocol when a gateway token is provided.\n const protocols = gatewayToken\n ? [`${AUTH_SUBPROTOCOL_PREFIX}${gatewayToken}`]\n : undefined;\n socket = new WebSocket(url, protocols);\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\nexport async function waitForAppServerHealth(\n url: string,\n timeoutMs: number,\n gatewayToken?: string | null,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n if (\n await checkAppServerHealth(\n url,\n APP_SERVER_HEALTH_TIMEOUT_MS,\n gatewayToken,\n )\n ) {\n return true;\n }\n await delay(APP_SERVER_HEALTH_RETRY_MS);\n }\n\n return false;\n}\n\nexport function buildAppServerReadyzUrl(url: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n\n if (parsed.protocol === \"ws:\") {\n parsed.protocol = \"http:\";\n } else if (parsed.protocol === \"wss:\") {\n parsed.protocol = \"https:\";\n } else if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n\n parsed.pathname = APP_SERVER_READYZ_PATH;\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nexport async function checkAppServerReadyz(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n): Promise<AppServerReadyzStatus> {\n const readyzUrl = buildAppServerReadyzUrl(url);\n if (!readyzUrl) {\n return \"unsupported\";\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(readyzUrl, {\n method: \"GET\",\n signal: controller.signal,\n headers: {\n accept: \"application/json\",\n },\n });\n\n if (response.ok) {\n return \"ready\";\n }\n\n if (\n response.status === 400 ||\n response.status === 404 ||\n response.status === 405 ||\n response.status === 426 ||\n response.status === 501\n ) {\n return \"unsupported\";\n }\n\n return \"not-ready\";\n } catch {\n return \"not-ready\";\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Check if a TCP port is accepting connections (without WebSocket upgrade).\n * Use this for managed startup health checks to avoid creating app-server sessions.\n */\nexport async function checkTcpPortListening(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n): Promise<boolean> {\n let hostname: string;\n let port: number;\n try {\n const parsed = new URL(url.replace(/^ws/, \"http\"));\n hostname = parsed.hostname;\n port = parseInt(parsed.port, 10);\n } catch {\n return false;\n }\n if (!port || !Number.isFinite(port)) return false;\n\n return new Promise<boolean>((resolve) => {\n const socket = net.createConnection({ host: hostname, port });\n const timer = setTimeout(() => {\n socket.destroy();\n resolve(false);\n }, timeoutMs);\n\n socket.once(\"connect\", () => {\n clearTimeout(timer);\n socket.destroy();\n resolve(true);\n });\n socket.once(\"error\", () => {\n clearTimeout(timer);\n socket.destroy();\n resolve(false);\n });\n });\n}\n\n/**\n * Wait for a TCP port to start accepting connections.\n * Does NOT open a WebSocket, so no app-server session is created.\n */\nexport async function waitForTcpPortListening(\n url: string,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n if (await checkTcpPortListening(url, APP_SERVER_HEALTH_TIMEOUT_MS)) {\n return true;\n }\n await delay(APP_SERVER_HEALTH_RETRY_MS);\n }\n\n return false;\n}\n\nexport async function checkManagedAppServerReady(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n): Promise<boolean> {\n const readyzStatus = await checkAppServerReadyz(url, timeoutMs);\n if (readyzStatus === \"ready\") {\n return true;\n }\n\n if (readyzStatus === \"unsupported\") {\n return checkTcpPortListening(url, timeoutMs);\n }\n\n return false;\n}\n\nexport async function waitForManagedAppServerReady(\n url: string,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const remaining = Math.max(\n 1,\n Math.min(APP_SERVER_HEALTH_TIMEOUT_MS, deadline - Date.now()),\n );\n if (await checkManagedAppServerReady(url, remaining)) {\n return true;\n }\n await delay(APP_SERVER_HEALTH_RETRY_MS);\n }\n\n return false;\n}\n\nexport function markAppServerHealthy(\n appServer: AppServerState,\n): AppServerState {\n const checkedAt = new Date().toISOString();\n return {\n ...appServer,\n healthy: true,\n lastCheckedAt: checkedAt,\n lastHealthyAt: checkedAt,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport type {\n InstanceId,\n AppServerState,\n AppServerAuthState,\n Platform,\n} from \"../types.js\";\nimport { resolveNodeRuntime, buildRuntimeEnv } from \"../runtime/index.js\";\nimport {\n appServerGatewayTokenFilePath,\n appServerGatewayLogFilePath,\n} from \"./bridge-paths.js\";\nimport {\n writeProtectedTextFile,\n removeFileIfExists,\n} from \"./bridge-file-io.js\";\nimport { allocateLoopbackPort } from \"./bridge-port-network.js\";\nimport { resolveAuthGatewayScript } from \"./bridge-codex-command.js\";\nimport { isProcessAlive } from \"./bridge-process-control.js\";\nimport { startWindowsDetachedProcess } from \"./bridge-windows-spawn.js\";\nimport { startUnixDetachedProcess } from \"./bridge-unix-spawn.js\";\nimport { rotateLog } from \"./bridge-observability.js\";\nimport {\n checkAppServerHealth,\n waitForAppServerHealth,\n} from \"./bridge-app-server-health.js\";\n\nexport { AUTH_SUBPROTOCOL_PREFIX } from \"./bridge-app-server-health.js\";\n\ninterface ManagedAppServerGatewayOptions {\n instanceId: InstanceId;\n stateDir: string;\n repoRoot: string;\n platform: Platform;\n publicUrl: string;\n}\n\nexport function buildProtectedAppServerUrl(\n publicUrl: string,\n _token: string,\n): string {\n // Subprotocol auth: token is no longer embedded in the URL.\n // Kept for backward compatibility with state display — shows base URL only.\n return publicUrl;\n}\n\nexport function readGatewayTokenFromPath(tokenPath: string): string {\n return fs.readFileSync(tokenPath, \"utf8\").trim();\n}\n\nexport function 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\nexport function 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\nexport async 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 try {\n gatewayPid =\n options.platform === \"win32\"\n ? startWindowsDetachedProcess(\n runtime.command,\n gatewayArgs,\n options.repoRoot,\n gatewayLogPath,\n gatewayEnv,\n )\n : startUnixDetachedProcess(\n runtime.command,\n gatewayArgs,\n options.repoRoot,\n gatewayLogPath,\n gatewayEnv,\n options.platform,\n );\n } catch (error) {\n removeFileIfExists(tokenPath);\n throw error;\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: \"subprotocol\",\n protectedUrl,\n upstreamUrl: upstreamUrl.toString().replace(/\\/$/, \"\"),\n tokenPath,\n gatewayPid,\n gatewayLogPath,\n };\n}\n\nexport function 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\nexport { checkAppServerHealth, waitForAppServerHealth };\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","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n InstanceId,\n BridgeState,\n AppServerState,\n Platform,\n} from \"../types.js\";\n\nimport { appServerLogFilePath } from \"./bridge-paths.js\";\nimport { removeFileIfExists } from \"./bridge-file-io.js\";\nimport { isLoopbackHost } from \"./bridge-port-network.js\";\nimport { resolveCodexCommand } from \"./bridge-codex-command.js\";\nimport {\n startWindowsCodexAppServer,\n findListeningProcessId,\n} from \"./bridge-windows-spawn.js\";\nimport {\n startUnixCodexAppServer,\n findUnixListeningProcessId,\n} from \"./bridge-unix-spawn.js\";\nimport { terminateProcess, isProcessAlive } from \"./bridge-process-control.js\";\nimport {\n checkAppServerHealth,\n waitForManagedAppServerReady,\n markAppServerHealthy,\n} from \"./bridge-app-server-health.js\";\nimport {\n readGatewayToken,\n createManagedAppServerAuth,\n canReuseManagedAppServer,\n} from \"./bridge-app-server-auth.js\";\nimport { rotateLog } from \"./bridge-observability.js\";\n\nexport interface 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\nexport const DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\nexport const APP_SERVER_START_TIMEOUT_MS = 20_000;\nexport const APP_SERVER_GATEWAY_START_TIMEOUT_MS = 5_000;\n\n/**\n * Check if any OTHER running bridge is using the same managed app-server.\n * Used to prevent killing a shared app-server when one bridge fails to start.\n */\nexport function isAppServerUsedByOtherBridge(\n stateDir: string,\n excludeInstanceId: InstanceId,\n appServer: AppServerState,\n): boolean {\n const pidDir = path.join(stateDir, \"pids\");\n if (!fs.existsSync(pidDir)) return false;\n\n for (const name of fs.readdirSync(pidDir)) {\n if (!name.startsWith(\"bridge-\") || !name.endsWith(\".json\")) continue;\n const otherId = name.slice(\"bridge-\".length, -\".json\".length);\n if (otherId === excludeInstanceId) continue;\n\n try {\n const raw = fs.readFileSync(path.join(pidDir, name), \"utf-8\");\n const state = JSON.parse(raw) as BridgeState;\n if (\n state.appServer?.url === appServer.url &&\n state.appServer?.pid === appServer.pid &&\n isProcessAlive(state.pid)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n return false;\n}\n\nexport function 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\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 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 try {\n pid = startUnixCodexAppServer(\n resolvedCommand,\n effectiveUrl,\n options.repoRoot,\n logPath,\n options.platform,\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 }\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 // Managed startup uses HTTP /readyz (with TCP fallback for older servers)\n // so readiness is verified without opening an extra WebSocket session.\n const healthy = await waitForManagedAppServerReady(\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 =\n (options.platform === \"win32\"\n ? findListeningProcessId(effectiveUrl, options.platform)\n : findUnixListeningProcessId(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 try {\n pid = startUnixCodexAppServer(\n resolvedCommand,\n auth.upstreamUrl,\n options.repoRoot,\n logPath,\n options.platform,\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 }\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 // Managed startup uses HTTP /readyz (with TCP fallback for older servers)\n // so readiness is verified without opening an extra WebSocket session.\n const healthy = await waitForManagedAppServerReady(\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 // Gateway readiness hits /readyz on the public URL, which verifies the\n // gateway itself plus upstream readiness end-to-end without creating a\n // WebSocket session.\n const gatewayHealthy = await waitForManagedAppServerReady(\n effectiveUrl,\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 =\n (options.platform === \"win32\"\n ? findListeningProcessId(auth.upstreamUrl, options.platform)\n : findUnixListeningProcessId(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\nexport function formatCodexAppServerCommand(\n command: string,\n url: string,\n): string {\n return `${command} app-server --listen ${url}`;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport type {\n RuntimeName,\n InstanceId,\n BridgeState,\n AppServerState,\n HeadlessConfig,\n Platform,\n} from \"../types.js\";\nimport { resolveNodeRuntime, buildRuntimeEnv } from \"../runtime/index.js\";\n\nimport { pidFilePath, logFilePath } from \"./bridge-paths.js\";\nimport { startWindowsDetachedProcess } from \"./bridge-windows-spawn.js\";\nimport { startUnixDetachedProcess } from \"./bridge-unix-spawn.js\";\nimport { stopManagedAppServer } from \"./bridge-process-control.js\";\nimport { resolveAgentName } from \"./bridge-config.js\";\nimport {\n loadBridgeState,\n saveBridgeState,\n clearBridgeState,\n isBridgeRunning,\n} from \"./bridge-state.js\";\nimport { materializeGatewayTokenFile } from \"./bridge-app-server-auth.js\";\nimport { rotateLog } from \"./bridge-observability.js\";\nimport {\n isAppServerUsedByOtherBridge,\n resolveAppServerUrl,\n ensureCodexAppServer,\n} from \"./bridge-app-server-lifecycle.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 function getBridgeRuntimeStateDir(\n repoRoot: string,\n instanceId: InstanceId,\n): string {\n return path.join(repoRoot, \".tmp\", `codex-app-server-bridge-${instanceId}`);\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 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 clearBridgeState(stateDir, instanceId);\n\n const logPath = logFilePath(stateDir, instanceId);\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n rotateLog(logPath);\n\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 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 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 ...(process.env.TAP_COLD_START_WARMUP === \"true\"\n ? { TAP_COLD_START_WARMUP: \"true\" }\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 const bridgePid =\n options.platform === \"win32\"\n ? startWindowsDetachedProcess(\n command,\n [bridgeScript],\n repoRoot,\n logPath,\n bridgeEnv,\n )\n : startUnixDetachedProcess(\n command,\n [bridgeScript],\n repoRoot,\n logPath,\n bridgeEnv,\n options.platform,\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 return state;\n } catch (err) {\n if (appServer?.managed) {\n const shared = isAppServerUsedByOtherBridge(\n stateDir,\n instanceId,\n appServer,\n );\n if (!shared) {\n await stopManagedAppServer(appServer, options.platform);\n }\n }\n throw err;\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport type { InstanceId, BridgeState, Platform } from \"../types.js\";\n\nimport { isProcessAlive, terminateProcess } from \"./bridge-process-control.js\";\nimport { cleanupHeadlessDispatch } from \"./bridge-config.js\";\nimport { loadBridgeState, clearBridgeState } from \"./bridge-state.js\";\nimport {\n getBridgeRuntimeStateDir,\n startBridge,\n type BridgeStartOptions,\n} from \"./bridge-startup.js\";\n\nexport interface BridgeStopOptions {\n instanceId: InstanceId;\n stateDir: string;\n platform: Platform;\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;\n }\n\n if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return false;\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\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 */\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 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;\n } catch {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n\n if (options.headless?.enabled && options.commsDir) {\n const agentName = options.agentName ?? instanceId;\n cleanupHeadlessDispatch(path.join(options.commsDir, \"inbox\"), agentName);\n }\n\n await stopBridge({ instanceId, stateDir, platform });\n\n return startBridge({\n ...options,\n processExistingMessages: true,\n });\n}\n","import {\n loadState,\n saveState,\n updateInstanceState,\n ensureBackupDir,\n} from \"../state.js\";\nimport {\n findRepoRoot,\n isValidRuntime,\n createAdapterContext,\n parseArgs,\n buildInstanceId,\n findPortConflict,\n log,\n logSuccess,\n logWarn,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n startBridge,\n findNextAvailableAppServerPort,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport type {\n RuntimeName,\n BridgeState,\n HeadlessConfig,\n AgentRole,\n CommandResult,\n} from \"../types.js\";\n\nconst ADD_HELP = `\nUsage:\n tap add <claude|codex|gemini> [options]\n\nDescription:\n Install a runtime instance and configure it to use tap.\n\nOptions:\n --name <name> Instance name (default: runtime name)\n --port <port> Port for app-server bridge\n --agent-name <name> Agent display name for bridge identification\n --force Re-install even if already configured\n --headless Enable headless reviewer mode (requires --name)\n --role <role> Headless role: reviewer, validator, long-running\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap add claude\n npx @hua-labs/tap add codex --name reviewer --port 4501 --headless --role reviewer\n`.trim();\n\nfunction normalizeAgentName(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction resolveAgentName(options: {\n explicit?: string | null;\n env?: string | null;\n stored?: string | null;\n fallback?: string | null;\n}): string | null {\n return (\n normalizeAgentName(options.explicit) ??\n normalizeAgentName(options.stored) ??\n normalizeAgentName(options.env) ??\n normalizeAgentName(options.fallback) ??\n null\n );\n}\n\nexport async function addCommand(args: string[]): Promise<CommandResult> {\n const { positional, flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(ADD_HELP);\n return {\n ok: true,\n command: \"add\",\n code: \"TAP_NO_OP\",\n message: ADD_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const runtimeArg = positional[0];\n\n if (!runtimeArg) {\n return {\n ok: false,\n command: \"add\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing runtime argument. Usage: npx @hua-labs/tap add <claude|codex|gemini> [--name <name>] [--port <port>] [--agent-name <name>] [--headless] [--role <role>]\",\n warnings: [],\n data: {},\n };\n }\n\n if (!isValidRuntime(runtimeArg)) {\n return {\n ok: false,\n command: \"add\",\n code: \"TAP_RUNTIME_UNKNOWN\",\n message: `Unknown runtime: ${runtimeArg}. Available: claude, codex, gemini`,\n warnings: [],\n data: {},\n };\n }\n\n const runtime: RuntimeName = runtimeArg;\n const instanceName =\n typeof flags[\"name\"] === \"string\" ? flags[\"name\"] : undefined;\n const instanceId = buildInstanceId(runtime, instanceName);\n const portStr = typeof flags[\"port\"] === \"string\" ? flags[\"port\"] : undefined;\n const port = portStr ? Number(portStr) : null;\n const agentNameFlag = normalizeAgentName(\n typeof flags[\"agent-name\"] === \"string\" ? flags[\"agent-name\"] : null,\n );\n const force = flags[\"force\"] === true;\n const headlessFlag = flags[\"headless\"] === true;\n const roleArg = typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : undefined;\n\n // Validate --role value\n const validRoles: AgentRole[] = [\"reviewer\", \"validator\", \"long-running\"];\n if (roleArg && !validRoles.includes(roleArg as AgentRole)) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid role: ${roleArg}. Available: ${validRoles.join(\", \")}`,\n warnings: [],\n data: {},\n };\n }\n\n // --headless requires --name (for instance isolation)\n if (headlessFlag && !instanceName) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: \"--headless requires --name for instance isolation\",\n warnings: [],\n data: {},\n };\n }\n\n // Build headless config\n const headless: HeadlessConfig | null = headlessFlag\n ? {\n enabled: true,\n role: (roleArg as AgentRole) ?? \"reviewer\",\n maxRounds: 5,\n qualitySeverityFloor: \"high\",\n }\n : null;\n\n if (portStr && (port === null || isNaN(port) || port < 1 || port > 65535)) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid port: ${portStr}. Must be between 1 and 65535.`,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n const adapter = getAdapter(runtime);\n\n if (!state) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const existingInstance = state.instances[instanceId];\n const mode = adapter.bridgeMode();\n const envAgentName = normalizeAgentName(\n process.env.TAP_AGENT_NAME ?? process.env.CODEX_TAP_AGENT_NAME,\n );\n const defaultAgentName = mode === \"app-server\" ? instanceId : null;\n const resolvedAgentName = resolveAgentName({\n explicit: agentNameFlag,\n env: envAgentName,\n stored: existingInstance?.agentName ?? null,\n fallback: defaultAgentName,\n });\n\n if (existingInstance?.installed && !force) {\n if (resolvedAgentName !== existingInstance.agentName) {\n const updatedState = updateInstanceState(state, instanceId, {\n ...existingInstance,\n agentName: resolvedAgentName,\n });\n saveState(repoRoot, updatedState);\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_ADD_OK\",\n message:\n resolvedAgentName === null\n ? `${instanceId} updated`\n : `${instanceId} agent name updated to \"${resolvedAgentName}\".`,\n warnings: [],\n data: {\n updatedFields: [\"agentName\"],\n agentName: resolvedAgentName,\n },\n };\n }\n\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_NO_OP\",\n message: `${instanceId} is already installed. Use --force to re-install.`,\n warnings: [],\n data: {},\n };\n }\n\n // Port conflict check\n if (port !== null) {\n const conflict = findPortConflict(state, port, instanceId);\n if (conflict) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_PORT_CONFLICT\",\n message: `Port ${port} is already used by instance \"${conflict}\".`,\n warnings: [],\n data: { conflictingInstance: conflict },\n };\n }\n }\n\n logHeader(`@hua-labs/tap add ${instanceId}`);\n if (instanceName) log(`Instance name: ${instanceName}`);\n if (port !== null) log(`Port: ${port}`);\n if (resolvedAgentName) log(`Agent name: ${resolvedAgentName}`);\n const ctx = {\n ...createAdapterContext(state.commsDir, repoRoot),\n instanceId,\n agentName: resolvedAgentName ?? undefined,\n };\n const warnings: string[] = [];\n\n // 1. Probe\n log(\"Probing runtime...\");\n const probe = await adapter.probe(ctx);\n\n if (!probe.installed) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_RUNTIME_NOT_FOUND\",\n message: `${runtime} runtime not found.`,\n warnings: probe.warnings,\n data: { issues: probe.issues },\n };\n }\n\n logSuccess(`Found ${runtime} (${probe.runtimeCommand ?? \"unknown\"})`);\n if (probe.configPath) log(`Config: ${probe.configPath}`);\n warnings.push(...probe.warnings);\n for (const w of probe.warnings) logWarn(w);\n\n // 2. Plan\n log(\"Planning patches...\");\n const plan = await adapter.plan(ctx, probe);\n warnings.push(...plan.warnings);\n\n if (plan.conflicts.length > 0) {\n logWarn(\"Conflicts detected:\");\n for (const c of plan.conflicts) logWarn(` ${c}`);\n }\n\n log(`Operations: ${plan.operations.length}`);\n log(`Artifacts: ${plan.ownedArtifacts.length}`);\n for (const w of plan.warnings) logWarn(w);\n\n // 3. Check for no-op plan\n if (plan.operations.length === 0) {\n const failureMessage =\n probe.issues[0] ??\n plan.warnings[0] ??\n probe.warnings[0] ??\n \"No operations to apply. Runtime not configured.\";\n const failureCode = /MCP server/i.test(failureMessage)\n ? \"TAP_LOCAL_SERVER_MISSING\"\n : \"TAP_PATCH_FAILED\";\n\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: failureCode,\n message: failureMessage,\n warnings,\n data: { planOps: 0 },\n };\n }\n\n // 4. Backup\n const backupDir = ensureBackupDir(ctx.stateDir, instanceId);\n log(`Backup dir: ${backupDir}`);\n\n // 5. Apply\n log(\"Applying patches...\");\n const result = await adapter.apply(ctx, plan);\n warnings.push(...result.warnings);\n\n if (!result.success) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_PATCH_FAILED\",\n message: \"Failed to apply patches.\",\n warnings,\n data: { appliedOps: result.appliedOps },\n };\n }\n\n logSuccess(`Applied ${result.appliedOps} operation(s)`);\n for (const f of result.changedFiles) logSuccess(`Modified: ${f}`);\n for (const w of result.warnings) logWarn(w);\n\n // 6. Verify\n log(\"Verifying...\");\n const verify = await adapter.verify(ctx, plan);\n warnings.push(...verify.warnings);\n\n for (const check of verify.checks) {\n if (check.passed) {\n logSuccess(`${check.name}`);\n } else {\n logError(`${check.name}: ${check.message ?? \"failed\"}`);\n }\n }\n\n if (!verify.ok) {\n logWarn(\n \"Verification had failures. Runtime may need manual configuration.\",\n );\n }\n\n // 7. Start bridge if needed (app-server mode only)\n let bridge: BridgeState | null = null;\n let effectivePort = port;\n if (mode === \"app-server\") {\n const bridgeScript = adapter.resolveBridgeScript?.(ctx);\n if (!bridgeScript) {\n logWarn(\"Bridge script not found. Bridge not started.\");\n warnings.push(\"Bridge script not found. Run bridge manually.\");\n } else {\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n // Auto-assign a free port for managed codex instances without --port\n if (effectivePort == null && runtime === \"codex\") {\n const currentState = loadState(repoRoot);\n effectivePort = await findNextAvailableAppServerPort(\n currentState,\n resolvedCfg.appServerUrl,\n 4501,\n instanceId,\n );\n log(`Auto-assigned port ${effectivePort} for ${instanceId}`);\n }\n log(`Starting bridge: ${bridgeScript}`);\n try {\n const manageAppServer = runtime === \"codex\";\n bridge = await startBridge({\n instanceId,\n runtime,\n stateDir: ctx.stateDir,\n commsDir: ctx.commsDir,\n bridgeScript,\n platform: ctx.platform,\n agentName: resolvedAgentName ?? undefined,\n runtimeCommand: resolvedCfg.runtimeCommand,\n appServerUrl: resolvedCfg.appServerUrl,\n repoRoot,\n port: effectivePort ?? undefined,\n manageAppServer,\n headless,\n });\n logSuccess(`Bridge started (PID: ${bridge.pid})`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logWarn(`Bridge not started: ${msg}`);\n warnings.push(`Bridge not started: ${msg}`);\n }\n }\n }\n\n // 8. Save state\n const instanceState = {\n instanceId,\n runtime,\n agentName: resolvedAgentName,\n port: effectivePort,\n installed: true,\n configPath: probe.configPath ?? \"\",\n bridgeMode: mode,\n restartRequired: result.restartRequired,\n ownedArtifacts: result.ownedArtifacts,\n backupPath: backupDir,\n lastAppliedHash: result.lastAppliedHash,\n lastVerifiedAt: verify.ok ? new Date().toISOString() : null,\n bridge,\n manageAppServer: runtime === \"codex\",\n noAuth: false,\n headless,\n warnings: Array.from(new Set([...result.warnings, ...verify.warnings])),\n };\n\n const newState = updateInstanceState(state, instanceId, instanceState);\n saveState(repoRoot, newState);\n logSuccess(\"State saved\");\n\n if (result.restartRequired) {\n logWarn(`Restart ${runtime} to pick up the new configuration.`);\n }\n\n // Claude-specific: real-time notification hint\n if (runtime === \"claude\") {\n log(\"\");\n log(\"For real-time notifications:\");\n log(\" claude --dangerously-load-development-channels server:tap-comms\");\n log(\"Or polling mode (tools still work):\");\n log(\" claude\");\n }\n\n logHeader(\"Done!\");\n\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_ADD_OK\",\n message: `${instanceId} configured`,\n warnings,\n data: {\n appliedOps: result.appliedOps,\n restartRequired: result.restartRequired,\n changedFiles: result.changedFiles,\n verified: verify.ok,\n },\n };\n}\n","import { loadState, saveState, getInstalledInstances } from \"../state.js\";\nimport { isBridgeRunning } from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { findRepoRoot, log, logHeader, logWarn } from \"../utils.js\";\nimport { version } from \"../version.js\";\nimport type { InstanceState, CommandResult } from \"../types.js\";\n\nconst STATUS_HELP = `\nUsage:\n tap status\n\nDescription:\n Show all installed instances, their bridge status, and configuration info.\n\nExamples:\n npx @hua-labs/tap status\n`.trim();\n\nfunction resolveStatus(inst: InstanceState, stateDir: string): string {\n if (!inst.installed) return \"not installed\";\n\n switch (inst.bridgeMode) {\n case \"native-push\":\n case \"polling\":\n return inst.lastVerifiedAt ? \"active\" : \"configured\";\n\n case \"app-server\":\n if (inst.bridge && isBridgeRunning(stateDir, inst.instanceId)) {\n return \"active\";\n }\n // Clear stale bridge metadata if process is dead\n if (inst.bridge) {\n inst.bridge = null;\n }\n return inst.lastVerifiedAt ? \"configured\" : \"installed\";\n\n default:\n return \"installed\";\n }\n}\n\nfunction instanceStatusLine(inst: InstanceState, status: string): string {\n const bridgeInfo = inst.bridge ? ` (pid: ${inst.bridge.pid})` : \"\";\n const mode = inst.bridgeMode;\n const portStr = inst.port ? ` port:${inst.port}` : \"\";\n const restart = inst.restartRequired ? \" [restart required]\" : \"\";\n const warns =\n inst.warnings.length > 0 ? ` [${inst.warnings.length} warning(s)]` : \"\";\n\n return `${inst.instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${status.padEnd(14)} ${mode.padEnd(14)}${bridgeInfo}${portStr}${restart}${warns}`;\n}\n\nexport async function statusCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(STATUS_HELP);\n return {\n ok: true,\n command: \"status\",\n code: \"TAP_NO_OP\",\n message: STATUS_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"status\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n logHeader(\"@hua-labs/tap status\");\n\n log(`Version: ${version}`);\n log(`Comms dir: ${state.commsDir}`);\n log(`Repo root: ${state.repoRoot}`);\n log(`Schema: v${state.schemaVersion}`);\n log(`Updated: ${state.updatedAt}`);\n\n const installed = getInstalledInstances(state);\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg.stateDir;\n\n const instances: Record<\n string,\n {\n status: string;\n runtime: string;\n bridgeMode: string;\n bridge: unknown;\n port: number | null;\n warnings: string[];\n }\n > = {};\n\n // Track if any stale bridge metadata was cleaned\n const bridgesBefore = installed.map((id) => state.instances[id]?.bridge);\n\n if (installed.length === 0) {\n log(\"\");\n log(\"No instances installed.\");\n log(\"Run: npx @hua-labs/tap add <claude|codex|gemini>\");\n } else {\n log(\"\");\n log(\n `${\"Instance\".padEnd(20)} ${\"Runtime\".padEnd(8)} ${\"Status\".padEnd(14)} ${\"Bridge Mode\".padEnd(14)} Details`,\n );\n log(\n `${\"─\".repeat(20)} ${\"─\".repeat(8)} ${\"─\".repeat(14)} ${\"─\".repeat(14)} ${\"─\".repeat(20)}`,\n );\n\n for (const id of installed) {\n const inst = state.instances[id];\n if (inst) {\n // resolveStatus may clear inst.bridge if stale\n const status = resolveStatus(inst, stateDir);\n log(instanceStatusLine(inst, status));\n if (inst.warnings.length > 0) {\n for (const w of inst.warnings) {\n logWarn(` ${w}`);\n }\n }\n instances[id] = {\n status,\n runtime: inst.runtime,\n bridgeMode: inst.bridgeMode,\n bridge: inst.bridge,\n port: inst.port,\n warnings: inst.warnings,\n };\n }\n }\n }\n\n // Persist stale bridge cleanup if any were cleared\n const bridgesAfter = installed.map((id) => state.instances[id]?.bridge);\n const staleCleared = bridgesBefore.some((b, i) => b !== bridgesAfter[i]);\n if (staleCleared) {\n state.updatedAt = new Date().toISOString();\n saveState(repoRoot, state);\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"status\",\n code: \"TAP_STATUS_OK\",\n message: `${installed.length} instance(s) installed`,\n warnings: [],\n data: {\n version,\n commsDir: state.commsDir,\n repoRoot: state.repoRoot,\n instances,\n },\n };\n}\n","import * as fs from \"node:fs\";\nimport { readArtifactBackup } from \"../artifact-backups.js\";\nimport {\n extractTomlTable,\n removeTomlTable,\n replaceTomlTable,\n} from \"../toml.js\";\nimport type { InstanceId, InstanceState, OwnedArtifact } from \"../types.js\";\n\nexport interface RollbackResult {\n success: boolean;\n restoredCount: number;\n restoredFiles: string[];\n errors: string[];\n}\n\n/**\n * Roll back only the artifacts the runtime owns, restoring prior table/key\n * content when selector backups are available.\n */\nexport async function rollbackRuntime(\n _instanceId: InstanceId,\n runtimeState: InstanceState,\n): Promise<RollbackResult> {\n const errors: string[] = [];\n const restoredFiles: string[] = [];\n let restoredCount = 0;\n\n for (const artifact of runtimeState.ownedArtifacts) {\n try {\n const result = rollbackArtifact(artifact);\n if (result.restored) {\n restoredCount++;\n restoredFiles.push(artifact.path);\n }\n if (result.error) {\n errors.push(result.error);\n }\n } catch (err) {\n errors.push(\n `Failed to rollback ${artifact.path}#${artifact.selector}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return {\n success: errors.length === 0,\n restoredCount,\n restoredFiles,\n errors,\n };\n}\n\ninterface ArtifactRollbackResult {\n restored: boolean;\n error?: string;\n}\n\nfunction rollbackArtifact(artifact: OwnedArtifact): ArtifactRollbackResult {\n if (!fs.existsSync(artifact.path)) {\n return { restored: false, error: `File not found: ${artifact.path}` };\n }\n\n switch (artifact.kind) {\n case \"json-path\":\n return rollbackJsonPath(artifact);\n case \"toml-table\":\n return rollbackTomlTable(artifact);\n case \"file\":\n return rollbackFile(artifact);\n default:\n return {\n restored: false,\n error: `Unknown artifact kind: ${artifact.kind}`,\n };\n }\n}\n\nfunction rollbackJsonPath(artifact: OwnedArtifact): ArtifactRollbackResult {\n const raw = fs.readFileSync(artifact.path, \"utf-8\");\n let config: Record<string, unknown>;\n\n try {\n config = JSON.parse(raw);\n } catch {\n return { restored: false, error: `Invalid JSON: ${artifact.path}` };\n }\n\n const backup = artifact.backupPath\n ? readArtifactBackup(artifact.backupPath)\n : null;\n if (backup?.kind === \"json-path\" && backup.selector === artifact.selector) {\n if (backup.existed) {\n setNestedKey(config, artifact.selector, backup.value);\n } else {\n deleteNestedKey(config, artifact.selector);\n cleanEmptyParents(config, artifact.selector);\n }\n } else {\n const removed = deleteNestedKey(config, artifact.selector);\n if (!removed) {\n return {\n restored: false,\n error: `Key not found: ${artifact.selector} in ${artifact.path}`,\n };\n }\n cleanEmptyParents(config, artifact.selector);\n }\n\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n}\n\nfunction rollbackTomlTable(artifact: OwnedArtifact): ArtifactRollbackResult {\n const content = fs.readFileSync(artifact.path, \"utf-8\");\n const backup = artifact.backupPath\n ? readArtifactBackup(artifact.backupPath)\n : null;\n\n if (backup?.kind === \"toml-table\" && backup.selector === artifact.selector) {\n const nextContent = backup.existed\n ? replaceTomlTable(content, artifact.selector, backup.content ?? \"\")\n : removeTomlTable(content, artifact.selector);\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, nextContent, \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n }\n\n if (!extractTomlTable(content, artifact.selector)) {\n return {\n restored: false,\n error: `TOML table not found: ${artifact.selector}`,\n };\n }\n\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, removeTomlTable(content, artifact.selector), \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n}\n\nfunction rollbackFile(artifact: OwnedArtifact): ArtifactRollbackResult {\n if (fs.existsSync(artifact.path)) {\n fs.unlinkSync(artifact.path);\n return { restored: true };\n }\n return { restored: false, error: `File not found: ${artifact.path}` };\n}\n\nfunction deleteNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n): boolean {\n const keys = keyPath.split(\".\");\n let current = obj;\n\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 return false;\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (!(lastKey in current)) return false;\n delete current[lastKey];\n return true;\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\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\n current[keys[keys.length - 1]] = value;\n}\n\nfunction cleanEmptyParents(\n obj: Record<string, unknown>,\n keyPath: string,\n): void {\n const keys = keyPath.split(\".\");\n for (let depth = keys.length - 2; depth >= 0; depth--) {\n let current = obj;\n for (let i = 0; i < depth; i++) {\n current = current[keys[i]] as Record<string, unknown>;\n if (!current) return;\n }\n\n const key = keys[depth];\n const value = current[key];\n if (\n typeof value === \"object\" &&\n value !== null &&\n Object.keys(value).length === 0\n ) {\n delete current[key];\n }\n }\n}\n","import { loadState, saveState, removeInstanceState } from \"../state.js\";\nimport {\n findRepoRoot,\n createAdapterContext,\n resolveInstanceId,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport { rollbackRuntime } from \"../engine/rollback.js\";\nimport { stopBridge } from \"../engine/bridge.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst REMOVE_HELP = `\nUsage:\n tap remove <instance>\n\nDescription:\n Remove a registered instance, stop its bridge, and rollback config changes.\n\nArguments:\n <instance> Instance ID or runtime name (e.g. claude, codex-reviewer)\n\nExamples:\n npx @hua-labs/tap remove claude\n npx @hua-labs/tap remove codex-reviewer\n`.trim();\n\nexport async function removeCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(REMOVE_HELP);\n return {\n ok: true,\n command: \"remove\",\n code: \"TAP_NO_OP\",\n message: REMOVE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const identifier = args.find((a) => !a.startsWith(\"-\"));\n\n if (!identifier) {\n return {\n ok: false,\n command: \"remove\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing instance argument. Usage: npx @hua-labs/tap remove <instance>\",\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"remove\",\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: \"remove\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const instance = state.instances[instanceId];\n\n if (!instance?.installed) {\n return {\n ok: true,\n command: \"remove\",\n instanceId,\n code: \"TAP_NO_OP\",\n message: `${instanceId} is not installed.`,\n warnings: [],\n data: {},\n };\n }\n\n logHeader(`@hua-labs/tap remove ${instanceId}`);\n\n // Stop bridge if running before rollback\n if (instance.bridge) {\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const stopped = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n if (stopped) {\n logSuccess(`Bridge for ${instanceId} stopped`);\n } else {\n log(`No running bridge for ${instanceId}`);\n }\n }\n\n const result = await rollbackRuntime(instanceId, instance);\n\n if (result.success) {\n logSuccess(`Rolled back ${result.restoredCount} artifact(s)`);\n for (const f of result.restoredFiles) logSuccess(`Restored: ${f}`);\n\n const newState = removeInstanceState(state, instanceId);\n saveState(repoRoot, newState);\n logSuccess(\"State updated\");\n\n logHeader(\"Done!\");\n\n return {\n ok: true,\n command: \"remove\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_REMOVE_OK\",\n message: `${instanceId} removed successfully`,\n warnings: [],\n data: {\n restoredCount: result.restoredCount,\n restoredFiles: result.restoredFiles,\n },\n };\n }\n\n for (const e of result.errors) logError(e);\n\n return {\n ok: false,\n command: \"remove\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_ROLLBACK_FAILED\",\n message: \"Rollback had errors. State preserved for retry.\",\n warnings: result.errors,\n data: { restoredCount: result.restoredCount },\n };\n}\n","import { existsSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport * 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 loadRuntimeBridgeHeartbeat,\n loadRuntimeBridgeThreadState,\n saveBridgeState,\n stopManagedAppServer,\n resolveAppServerUrl,\n checkAppServerHealth,\n findNextAvailableAppServerPort,\n waitForPortRelease,\n getTurnInfo,\n isTurnStuck,\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 parseIntFlag,\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\ninterface BridgeHeartbeatRecord {\n agent?: string;\n timestamp?: string;\n lastActivity?: string;\n status?: \"active\" | \"idle\" | \"signing-off\" | string;\n}\n\nconst BRIDGE_UP_ACTIVE_HEARTBEAT_WINDOW_MS = 10 * 60 * 1000;\nconst BRIDGE_UP_ORPHAN_HEARTBEAT_WINDOW_MS = 24 * 60 * 60 * 1000;\nconst BRIDGE_UP_SIGNING_OFF_HEARTBEAT_WINDOW_MS = 5 * 60 * 1000;\n\nfunction loadBridgeHeartbeatStore(\n commsDir: string,\n): Record<string, BridgeHeartbeatRecord> | null {\n const heartbeatsPath = path.join(commsDir, \"heartbeats.json\");\n if (!existsSync(heartbeatsPath)) return {};\n try {\n return JSON.parse(readFileSync(heartbeatsPath, \"utf-8\")) as Record<\n string,\n BridgeHeartbeatRecord\n >;\n } catch {\n return null;\n }\n}\n\nfunction saveBridgeHeartbeatStore(\n commsDir: string,\n store: Record<string, BridgeHeartbeatRecord>,\n): void {\n const heartbeatsPath = path.join(commsDir, \"heartbeats.json\");\n const tmp = `${heartbeatsPath}.tmp.${process.pid}`;\n writeFileSync(tmp, JSON.stringify(store, null, 2), \"utf-8\");\n renameSync(tmp, heartbeatsPath);\n}\n\nfunction parseBridgeHeartbeatAgeMs(\n record: BridgeHeartbeatRecord,\n now: number,\n): number {\n const raw = record.lastActivity ?? record.timestamp;\n if (!raw) return Number.POSITIVE_INFINITY;\n const parsed = new Date(raw).getTime();\n if (!Number.isFinite(parsed)) return Number.POSITIVE_INFINITY;\n return Math.max(0, now - parsed);\n}\n\nfunction resolveBridgeHeartbeatInstanceId(\n state: TapState,\n heartbeatId: string,\n): InstanceId | null {\n if (state.instances[heartbeatId]) return heartbeatId as InstanceId;\n const hyphenated = heartbeatId.replace(/_/g, \"-\");\n if (state.instances[hyphenated]) return hyphenated as InstanceId;\n const underscored = heartbeatId.replace(/-/g, \"_\");\n if (state.instances[underscored]) return underscored as InstanceId;\n return null;\n}\n\nfunction pruneStaleHeartbeatsForBridgeUp(\n state: TapState,\n stateDir: string,\n commsDir: string,\n): { removed: number; warning?: string } {\n const store = loadBridgeHeartbeatStore(commsDir);\n if (store === null) {\n return {\n removed: 0,\n warning: \"Auto-clean skipped — heartbeats.json unreadable\",\n };\n }\n\n const now = Date.now();\n let removed = 0;\n\n for (const [heartbeatId, heartbeat] of Object.entries(store)) {\n const ageMs = parseBridgeHeartbeatAgeMs(heartbeat, now);\n const instanceId = resolveBridgeHeartbeatInstanceId(state, heartbeatId);\n const instance = instanceId ? state.instances[instanceId] : null;\n const bridgeBacked = instance?.bridgeMode === \"app-server\";\n const bridgeRunning =\n bridgeBacked && instanceId\n ? getBridgeStatus(stateDir, instanceId) === \"running\"\n : false;\n const status = heartbeat.status ?? \"active\";\n\n const staleByStatus =\n status === \"signing-off\" &&\n ageMs >= BRIDGE_UP_SIGNING_OFF_HEARTBEAT_WINDOW_MS;\n const staleByDeadBridge =\n bridgeBacked &&\n !bridgeRunning &&\n ageMs >= BRIDGE_UP_ACTIVE_HEARTBEAT_WINDOW_MS;\n const staleByAge =\n !bridgeRunning && ageMs >= BRIDGE_UP_ORPHAN_HEARTBEAT_WINDOW_MS;\n\n if (staleByStatus || staleByDeadBridge || staleByAge) {\n delete store[heartbeatId];\n removed += 1;\n }\n }\n\n if (removed > 0) {\n saveBridgeHeartbeatStore(commsDir, store);\n }\n\n return { removed };\n}\n\nconst BRIDGE_HELP = `\nUsage:\n tap 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 tui <instance> Show the safe Codex TUI attach command for a running bridge\n watch Monitor bridges and auto-restart stuck/stale ones\n\nOptions:\n --agent-name <name> Agent identity for bridge (or set TAP_AGENT_NAME env)\n Overrides the stored name from 'tap add' when needed\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 npx @hua-labs/tap bridge tui codex\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 // Subprotocol auth: token is no longer in the URL.\n // Keep function for backward compat with old state files that may contain query tokens.\n try {\n const parsed = new URL(url);\n if (parsed.searchParams.has(\"tap_token\")) {\n parsed.searchParams.delete(\"tap_token\");\n }\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return url.replace(/[?&]tap_token=[^&]+/g, \"\");\n }\n}\n\nfunction resolveTuiConnectUrl(appServer: AppServerState): string {\n return appServer.auth?.upstreamUrl ?? appServer.url;\n}\n\nfunction quoteCliArg(value: string): string {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nfunction formatCodexTuiAttachCommand(\n tuiConnectUrl: string,\n cwd: string,\n): string {\n return `codex --enable tui_app_server --remote ${quoteCliArg(tuiConnectUrl)} --cd ${quoteCliArg(cwd)}`;\n}\n\nfunction resolveTuiAttachCwd(\n repoRoot: string,\n stateRepoRoot: string | null | undefined,\n runtimeThreadCwd: string | null | undefined,\n savedThreadCwd: string | null | undefined,\n): string {\n return runtimeThreadCwd ?? savedThreadCwd ?? stateRepoRoot ?? repoRoot;\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 formatThreadSummary(\n threadId: string | null | undefined,\n cwd: string | null | undefined,\n): string {\n if (!threadId) {\n return \"-\";\n }\n\n return cwd ? `${threadId} (${cwd})` : threadId;\n}\n\nfunction normalizeComparablePath(value: string): string {\n return path.resolve(value).replace(/\\\\/g, \"/\").toLowerCase();\n}\n\nfunction sameOptionalPath(\n left: string | null | undefined,\n right: string | null | undefined,\n): boolean {\n if (!left || !right) {\n return left === right;\n }\n\n return normalizeComparablePath(left) === normalizeComparablePath(right);\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 pollSecondsRaw =\n typeof flags[\"poll-seconds\"] === \"string\"\n ? flags[\"poll-seconds\"]\n : undefined;\n const reconnectSecondsRaw =\n typeof flags[\"reconnect-seconds\"] === \"string\"\n ? flags[\"reconnect-seconds\"]\n : undefined;\n const lookbackRaw =\n typeof flags[\"message-lookback-minutes\"] === \"string\"\n ? flags[\"message-lookback-minutes\"]\n : undefined;\n\n let pollSeconds: number | undefined;\n let reconnectSeconds: number | undefined;\n let messageLookbackMinutes: number | undefined;\n try {\n pollSeconds = parseIntFlag(pollSecondsRaw, \"--poll-seconds\", 1, 3600);\n reconnectSeconds = parseIntFlag(\n reconnectSecondsRaw,\n \"--reconnect-seconds\",\n 1,\n 3600,\n );\n messageLookbackMinutes = parseIntFlag(\n lookbackRaw,\n \"--message-lookback-minutes\",\n 1,\n 10080,\n );\n } catch (err) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: err instanceof Error ? err.message : String(err),\n warnings: [],\n data: {},\n };\n }\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 // Scope TAP_COLD_START_WARMUP so the bridge can bootstrap its first turn\n const previousWarmup = process.env.TAP_COLD_START_WARMUP;\n process.env.TAP_COLD_START_WARMUP = \"true\";\n let bridge: BridgeState;\n try {\n 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 } finally {\n if (previousWarmup === undefined) {\n delete process.env.TAP_COLD_START_WARMUP;\n } else {\n process.env.TAP_COLD_START_WARMUP = previousWarmup;\n }\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 ctx = createAdapterContext(state.commsDir, repoRoot);\n const warnings: string[] = [];\n let prunedHeartbeats = 0;\n if (flags[\"auto-prune-heartbeats\"] === true) {\n const cleanup = pruneStaleHeartbeatsForBridgeUp(\n state,\n ctx.stateDir,\n ctx.commsDir,\n );\n prunedHeartbeats = cleanup.removed;\n if (cleanup.warning) {\n warnings.push(cleanup.warning);\n log(cleanup.warning);\n }\n if (prunedHeartbeats > 0) {\n log(\n `Auto-clean: pruned ${prunedHeartbeats} stale heartbeat entr${prunedHeartbeats === 1 ? \"y\" : \"ies\"}`,\n );\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 const cleanupSuffix =\n prunedHeartbeats > 0\n ? ` Auto-clean pruned ${prunedHeartbeats} stale heartbeat entr${prunedHeartbeats === 1 ? \"y\" : \"ies\"}.`\n : \"\";\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_NO_OP\",\n message: `No app-server instances found to start.${cleanupSuffix}`,\n warnings,\n data: { prunedHeartbeats },\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\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 // Restore saved --no-server / --no-auth mode (M197: inferRestartMode for start --all)\n const stateDir = path.join(repoRoot, \".tap-comms\");\n const currentBridgeState = loadBridgeState(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 const mergedFlags = {\n ...flags,\n ...(manageAppServer === false ? { \"no-server\": true } : {}),\n ...(noAuth === true ? { \"no-auth\": true } : {}),\n };\n\n log(`Starting ${instanceId} (agent: ${storedName})...`);\n const result = await bridgeStart(instanceId, storedName, mergedFlags);\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 const cleanupSuffix =\n prunedHeartbeats > 0\n ? ` Auto-clean pruned ${prunedHeartbeats} stale heartbeat entr${prunedHeartbeats === 1 ? \"y\" : \"ies\"}.`\n : \"\";\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: `${message}${cleanupSuffix}`,\n warnings,\n data: { started, failed, prunedHeartbeats },\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 // Wait for port to be released so the next bridge start won't\n // hit TIME_WAIT conflicts (port zombie prevention)\n const released = await waitForPortRelease(appServer.url, 5_000);\n if (!released) {\n log(\n `Warning: port for ${appServer.url} still in use after stop — next start may need a different port`,\n );\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 const releasePorts: string[] = [];\n for (const appServer of managedAppServers.values()) {\n if (await stopManagedAppServer(appServer, ctx.platform)) {\n stoppedAppServers.push(appServer.pid!);\n releasePorts.push(appServer.url);\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 // Wait for all stopped app-server ports to release (parallel)\n if (releasePorts.length > 0) {\n await Promise.all(\n releasePorts.map((url) => waitForPortRelease(url, 5_000)),\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: watch ───────────────────────────────────────\n\n/**\n * Monitor all bridges and auto-restart stuck or stale ones.\n * Runs a single check cycle and returns results.\n * For continuous monitoring, call periodically (e.g., from a cron or loop).\n */\nasync function bridgeWatch(\n _intervalSeconds: number,\n stuckThresholdSeconds: number,\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 { config: resolvedCfg } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg.stateDir;\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n\n logHeader(\"@hua-labs/tap bridge watch\");\n log(\n `Checking ${instanceIds.length} instance(s), stuck threshold: ${stuckThresholdSeconds}s`,\n );\n\n const restarted: string[] = [];\n const cleaned: string[] = [];\n const healthy: string[] = [];\n const warnings: string[] = [];\n\n for (const instanceId of instanceIds) {\n const inst = state.instances[instanceId];\n if (!inst?.installed || inst.bridgeMode !== \"app-server\") continue;\n\n const status = getBridgeStatus(stateDir, instanceId);\n\n if (status === \"stale\") {\n log(`${instanceId}: stale (process dead) — cleaning up`);\n cleaned.push(instanceId);\n continue;\n }\n\n if (status === \"stopped\") {\n log(`${instanceId}: stopped`);\n continue;\n }\n\n // Running — check for stuck turns\n if (isTurnStuck(stateDir, instanceId, stuckThresholdSeconds)) {\n const turnInfo = getTurnInfo(stateDir, instanceId, stuckThresholdSeconds);\n const ageStr =\n turnInfo?.ageSeconds != null ? formatAge(turnInfo.ageSeconds) : \"?\";\n log(\n `${instanceId}: ⚠ STUCK turn ${turnInfo?.activeTurnId?.slice(0, 8)}... (${ageStr}) — restarting`,\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 warnings.push(\n `${instanceId}: cannot restart — bridge script not found`,\n );\n continue;\n }\n\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const { manageAppServer, noAuth } = inferRestartMode(bridgeState, {});\n\n // Scope TAP_COLD_START_WARMUP around restart (mirrors bridgeRestart, PR #847)\n const previousWarmup = process.env.TAP_COLD_START_WARMUP;\n process.env.TAP_COLD_START_WARMUP = \"true\";\n try {\n const newBridgeState = 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: resolvedCfg.runtimeCommand,\n appServerUrl: resolvedCfg.appServerUrl,\n repoRoot,\n port: inst.port ?? undefined,\n headless: inst.headless,\n drainTimeoutSeconds: 30,\n manageAppServer,\n noAuth,\n });\n // Backwrite new bridge state to state.json (mirrors bridgeRestart)\n const updatedInst = { ...inst, bridge: newBridgeState };\n const updatedState = updateInstanceState(\n state,\n instanceId,\n updatedInst,\n );\n saveState(repoRoot, updatedState);\n restarted.push(instanceId);\n logSuccess(`${instanceId}: restarted`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n warnings.push(`${instanceId}: restart failed — ${msg}`);\n logError(`${instanceId}: restart failed — ${msg}`);\n } finally {\n if (previousWarmup === undefined) {\n delete process.env.TAP_COLD_START_WARMUP;\n } else {\n process.env.TAP_COLD_START_WARMUP = previousWarmup;\n }\n }\n } else {\n healthy.push(instanceId);\n log(`${instanceId}: healthy`);\n }\n }\n\n const message =\n [\n restarted.length > 0 ? `Restarted: ${restarted.join(\", \")}` : null,\n cleaned.length > 0 ? `Cleaned stale: ${cleaned.join(\", \")}` : null,\n healthy.length > 0 ? `Healthy: ${healthy.join(\", \")}` : null,\n ]\n .filter(Boolean)\n .join(\". \") || \"No app-server bridges found\";\n\n log(\"\");\n log(message);\n\n return {\n ok: true,\n command: \"bridge\",\n code:\n restarted.length > 0\n ? \"TAP_BRIDGE_WATCH_RESTARTED\"\n : \"TAP_BRIDGE_WATCH_OK\",\n message,\n warnings,\n data: { restarted, cleaned, healthy },\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 threadId: string | null;\n threadCwd: string | null;\n savedThreadId: string | null;\n savedThreadCwd: 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 threadId: null,\n threadCwd: null,\n savedThreadId: null,\n savedThreadCwd: null,\n appServer: null,\n };\n continue;\n }\n\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const savedThread = loadRuntimeBridgeThreadState(bridgeState);\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 if (runtimeHeartbeat?.threadId) {\n log(\n ` Thread: ${formatThreadSummary(runtimeHeartbeat.threadId, runtimeHeartbeat.threadCwd)}`,\n );\n }\n if (\n savedThread?.threadId &&\n (savedThread.threadId !== runtimeHeartbeat?.threadId ||\n !sameOptionalPath(savedThread.cwd, runtimeHeartbeat?.threadCwd))\n ) {\n log(\n ` Saved: ${formatThreadSummary(savedThread.threadId, savedThread.cwd)}`,\n );\n }\n\n // Turn stuck detection (M160)\n const turnInfo = getTurnInfo(stateDir, instanceId);\n if (turnInfo?.activeTurnId) {\n const ageStr =\n turnInfo.ageSeconds != null ? formatAge(turnInfo.ageSeconds) : \"?\";\n if (turnInfo.stuck) {\n log(\n ` ⚠ STUCK: turn ${turnInfo.activeTurnId.slice(0, 8)}... active ${ageStr} (threshold: 5m)`,\n );\n } else {\n log(\n ` Turn: ${turnInfo.activeTurnId.slice(0, 8)}... active ${ageStr}`,\n );\n }\n }\n\n bridges[instanceId] = {\n status,\n runtime: inst.runtime,\n pid,\n port: inst.port,\n lastHeartbeat: heartbeat,\n threadId: runtimeHeartbeat?.threadId ?? null,\n threadCwd: runtimeHeartbeat?.threadCwd ?? null,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\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 threadId: null,\n threadCwd: null,\n savedThreadId: null,\n savedThreadCwd: 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 runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const savedThread = loadRuntimeBridgeThreadState(bridgeState);\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 if (runtimeHeartbeat?.threadId) {\n log(\n `Thread: ${formatThreadSummary(runtimeHeartbeat.threadId, runtimeHeartbeat.threadCwd)}`,\n );\n }\n if (\n savedThread?.threadId &&\n (savedThread.threadId !== runtimeHeartbeat?.threadId ||\n !sameOptionalPath(savedThread.cwd, runtimeHeartbeat?.threadCwd))\n ) {\n log(\n `Saved: ${formatThreadSummary(savedThread.threadId, savedThread.cwd)}`,\n );\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 threadId: runtimeHeartbeat?.threadId ?? null,\n threadCwd: runtimeHeartbeat?.threadCwd ?? null,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n appServer: bridgeState?.appServer ?? null,\n },\n };\n}\n\nfunction bridgeTuiOne(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 if (inst.runtime !== \"codex\" || inst.bridgeMode !== \"app-server\") {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `${instanceId} does not support Codex TUI attach. Use a Codex app-server bridge instance.`,\n warnings: [],\n data: {},\n };\n }\n\n const { config: resolvedConfig } = resolveConfig({}, repoRoot);\n const stateDir = resolvedConfig.stateDir;\n const status = getBridgeStatus(stateDir, instanceId);\n if (status !== \"running\") {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_NOT_RUNNING\",\n message: `${instanceId} bridge is ${status}. Start it first with: npx @hua-labs/tap bridge start ${instanceId}`,\n warnings: [],\n data: { status },\n };\n }\n\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const appServer = bridgeState?.appServer;\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const savedThread = loadRuntimeBridgeThreadState(bridgeState);\n if (!appServer) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_NOT_RUNNING\",\n message: `${instanceId} app-server state is missing. Restart the bridge first.`,\n warnings: [],\n data: { status },\n };\n }\n\n const tuiConnectUrl = resolveTuiConnectUrl(appServer);\n const attachCwd = resolveTuiAttachCwd(\n repoRoot,\n state.repoRoot,\n runtimeHeartbeat?.threadCwd,\n savedThread?.cwd,\n );\n const attachCommand = formatCodexTuiAttachCommand(tuiConnectUrl, attachCwd);\n const warnings =\n appServer.auth != null\n ? [\n \"Use the upstream TUI URL, not the protected gateway URL. The protected URL is bridge-only.\",\n ]\n : [];\n\n logHeader(`@hua-labs/tap bridge tui ${instanceId}`);\n if (appServer.auth) {\n log(`Protected: ${redactProtectedUrl(appServer.auth.protectedUrl)}`);\n log(`Upstream: ${appServer.auth.upstreamUrl}`);\n }\n log(`Using: ${tuiConnectUrl}`);\n log(`Attach: ${attachCommand}`);\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} TUI attach command ready`,\n warnings,\n data: {\n status,\n tuiConnectUrl,\n attachCwd,\n attachCommand,\n appServer,\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\"\n ? flags[\"drain-timeout\"]\n : undefined;\n let drainTimeout: number;\n try {\n drainTimeout = parseIntFlag(drainStr, \"--drain-timeout\", 1, 300) ?? 30;\n } catch (err) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: err instanceof Error ? err.message : String(err),\n warnings: [],\n data: {},\n };\n }\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 previousColdStartWarmup = process.env.TAP_COLD_START_WARMUP;\n process.env.TAP_COLD_START_WARMUP = \"true\";\n let bridge: BridgeState;\n try {\n 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 } finally {\n if (previousColdStartWarmup === undefined) {\n delete process.env.TAP_COLD_START_WARMUP;\n } else {\n process.env.TAP_COLD_START_WARMUP = previousColdStartWarmup;\n }\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 \"tui\": {\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 tui <instance>\",\n warnings: [],\n data: {},\n };\n }\n return bridgeTuiOne(identifierArg);\n }\n\n case \"watch\": {\n const intervalStr =\n typeof flags[\"interval\"] === \"string\" ? flags[\"interval\"] : undefined;\n const interval = intervalStr ? parseInt(intervalStr, 10) : 30;\n const stuckThresholdStr =\n typeof flags[\"stuck-threshold\"] === \"string\"\n ? flags[\"stuck-threshold\"]\n : undefined;\n const stuckThreshold = stuckThresholdStr\n ? parseInt(stuckThresholdStr, 10)\n : 300;\n return bridgeWatch(interval, stuckThreshold);\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, tui`,\n warnings: [],\n data: {},\n };\n }\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 { 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 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 tap up auto-prunes stale heartbeat entries before bridge startup.\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 previousColdStartWarmup = process.env.TAP_COLD_START_WARMUP;\n process.env.TAP_COLD_START_WARMUP = \"true\";\n let result: CommandResult;\n try {\n result = await bridgeCommand([\n \"start\",\n \"--all\",\n \"--auto-prune-heartbeats\",\n ...args,\n ]);\n } finally {\n if (previousColdStartWarmup === undefined) {\n delete process.env.TAP_COLD_START_WARMUP;\n } else {\n process.env.TAP_COLD_START_WARMUP = previousColdStartWarmup;\n }\n }\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 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","import * as path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { buildManagedMcpServerSpec } from \"../adapters/common.js\";\nimport { createAdapterContext, findRepoRoot, log } from \"../utils.js\";\nimport { normalizeTapPath } from \"../config/index.js\";\nimport { loadState } from \"../state.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst SERVE_HELP = `\nUsage:\n tap serve [options]\n\nDescription:\n Start the tap MCP server over stdio. This command takes over the\n process — it is intended to be launched by an MCP host (e.g. Claude Code).\n\nOptions:\n --comms-dir <path> Override comms directory (also reads TAP_COMMS_DIR env)\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap serve\n npx @hua-labs/tap serve --comms-dir /shared/comms\n`.trim();\n\n/**\n * serve is special: it takes over the process on success.\n * Only returns a CommandResult on error.\n */\nexport async function serveCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(SERVE_HELP);\n return {\n ok: true,\n command: \"serve\",\n code: \"TAP_NO_OP\",\n message: SERVE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n\n let commsDir: string | undefined;\n\n const commsDirIdx = args.indexOf(\"--comms-dir\");\n if (commsDirIdx !== -1 && args[commsDirIdx + 1]) {\n commsDir = path.resolve(normalizeTapPath(args[commsDirIdx + 1]));\n }\n\n if (!commsDir && process.env.TAP_COMMS_DIR) {\n commsDir = path.resolve(normalizeTapPath(process.env.TAP_COMMS_DIR));\n }\n\n if (!commsDir) {\n const state = loadState(repoRoot);\n if (state) {\n commsDir = state.commsDir;\n }\n }\n\n if (!commsDir) {\n return {\n ok: false,\n command: \"serve\",\n code: \"TAP_NOT_INITIALIZED\",\n message:\n \"Cannot determine comms directory. Set TAP_COMMS_DIR env var, use --comms-dir, or run 'init' first.\",\n warnings: [],\n data: {},\n };\n }\n\n const ctx = createAdapterContext(commsDir, repoRoot);\n const managed = buildManagedMcpServerSpec(ctx);\n if (!managed.command || !managed.sourcePath) {\n const fallbackMessage =\n managed.issues[0] ??\n \"tap-comms MCP server not found. Reinstall @hua-labs/tap or run from a repo with packages/tap-plugin/channels/.\";\n return {\n ok: false,\n command: \"serve\",\n code: managed.sourcePath\n ? \"TAP_SERVE_BUN_REQUIRED\"\n : \"TAP_SERVE_NO_SERVER\",\n message: fallbackMessage,\n warnings: [],\n data: {},\n };\n }\n\n // For serve, always use direct path (not npx launcher which would recurse)\n const serveCommand = managed.command === \"npx\" ? \"node\" : managed.command;\n const serveArgs =\n managed.command === \"npx\" && managed.sourcePath\n ? [managed.sourcePath]\n : managed.args;\n\n // Start MCP server\n const child = spawn(serveCommand, serveArgs, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n TAP_COMMS_DIR: commsDir,\n },\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (err) => {\n resolve({\n ok: false,\n command: \"serve\",\n code: \"TAP_INTERNAL_ERROR\",\n message: `Failed to start MCP server: ${err.message}`,\n warnings: [],\n data: {},\n });\n });\n\n child.on(\"exit\", (code) => {\n resolve({\n ok: code === 0,\n command: \"serve\",\n code: code === 0 ? \"TAP_SERVE_OK\" : \"TAP_INTERNAL_ERROR\",\n message:\n code === 0\n ? \"MCP server stopped\"\n : `MCP server exited with code ${code}`,\n warnings: [],\n data: { exitCode: code },\n });\n });\n });\n}\n","import * 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 findRepoRoot,\n parseArgs,\n log,\n logSuccess,\n logWarn,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst INIT_WORKTREE_HELP = `\nUsage:\n tap init-worktree [options]\n\nOptions:\n --path <dir> Worktree directory (required, e.g. ../hua-wt-3)\n --branch <name> Branch name to create (default: derived from path)\n --base <ref> Base ref for new branch (default: origin/main)\n --mission <file> Mission file to associate (e.g. m74-feature.md)\n --comms-dir <path> Override comms directory\n --skip-install Skip pnpm install step\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap init-worktree --path ../hua-wt-3 --branch feat/my-feature\n npx @hua-labs/tap init-worktree --path ../hua-wt-4 --branch fix/bug --mission m74-fix.md\n`.trim();\n\ninterface WorktreeOptions {\n worktreePath: string;\n branch: string;\n base: string;\n mission?: string;\n commsDir: string;\n skipInstall: boolean;\n repoRoot: string;\n}\n\n// ─── Warning collector ─────────────────────────────────────────\n\nfunction warn(warnings: string[], message: string): void {\n logWarn(message);\n warnings.push(message);\n}\n\n// ─── Step helpers ──────────────────────────────────────────────\n\nfunction run(\n cmd: string,\n opts?: { cwd?: string; ignoreError?: boolean },\n): string {\n try {\n return execSync(cmd, {\n cwd: opts?.cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 120_000,\n }).trim();\n } catch (err) {\n if (opts?.ignoreError) return \"\";\n throw err;\n }\n}\n\nfunction toAbsolute(p: string): string {\n const resolved = path.resolve(p);\n // Normalize to forward slashes for .mcp.json compatibility\n return resolved.replace(/\\\\/g, \"/\");\n}\n\nfunction probeBun(candidate: string): boolean {\n try {\n const out = execSync(`\"${candidate}\" --version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }).trim();\n return /^\\d+\\.\\d+/.test(out);\n } catch {\n return false;\n }\n}\n\nfunction findBun(): string | null {\n const candidates =\n process.platform === \"win32\" ? [\"bun.exe\", \"bun\"] : [\"bun\"];\n\n for (const name of candidates) {\n try {\n const out = execSync(\n process.platform === \"win32\" ? `where ${name}` : `which ${name}`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"], timeout: 5000 },\n ).trim();\n // Validate each candidate with --version before accepting\n for (const line of out.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (trimmed && probeBun(trimmed)) return trimmed;\n }\n } catch {\n // not found\n }\n }\n\n // Check common locations\n const home = process.env.HOME || process.env.USERPROFILE || \"\";\n const bunHome = path.join(\n home,\n \".bun\",\n \"bin\",\n process.platform === \"win32\" ? \"bun.exe\" : \"bun\",\n );\n if (fs.existsSync(bunHome) && probeBun(bunHome)) return bunHome;\n\n return null;\n}\n\n// ─── Step 1: Create worktree ───────────────────────────────────\n\nfunction step1CreateWorktree(opts: WorktreeOptions): boolean {\n log(\"Step 1/9: Creating worktree...\");\n\n if (fs.existsSync(opts.worktreePath)) {\n logWarn(`Directory already exists: ${opts.worktreePath}`);\n // Check if it's already a worktree\n try {\n run(\"git rev-parse --git-dir\", { cwd: opts.worktreePath });\n logWarn(\"Already a git worktree. Continuing...\");\n return true;\n } catch {\n logError(\"Directory exists but is not a git worktree.\");\n return false;\n }\n }\n\n try {\n // Try creating with new branch\n run(\n `git worktree add \"${opts.worktreePath}\" -b ${opts.branch} ${opts.base}`,\n { cwd: opts.repoRoot },\n );\n logSuccess(`Worktree created: ${opts.worktreePath}`);\n logSuccess(`Branch: ${opts.branch} (from ${opts.base})`);\n } catch {\n // Branch may already exist\n try {\n run(`git worktree add \"${opts.worktreePath}\" ${opts.branch}`, {\n cwd: opts.repoRoot,\n });\n logSuccess(`Worktree created with existing branch: ${opts.branch}`);\n } catch (err) {\n logError(\n `Failed to create worktree: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n }\n return true;\n}\n\n// ─── Step 2: Merge origin/main ─────────────────────────────────\n\nfunction step2MergeMain(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 2/9: Merging origin/main...\");\n\n try {\n run(\"git fetch origin main\", { cwd: opts.worktreePath });\n } catch {\n warn(warnings, \"Could not fetch origin/main. Skipping merge.\");\n return;\n }\n\n try {\n const behind = run(\"git rev-list --count HEAD..origin/main\", {\n cwd: opts.worktreePath,\n });\n if (behind === \"0\") {\n logSuccess(\"Already up to date with origin/main.\");\n return;\n }\n\n run(\"git merge origin/main --no-edit -X theirs\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"Merged origin/main.\");\n } catch {\n warn(\n warnings,\n \"Merge had issues. You may need to resolve conflicts manually.\",\n );\n }\n}\n\n// ─── Step 3: Copy permissions ──────────────────────────────────\n\nfunction step3CopyPermissions(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 3/9: Copying permissions...\");\n\n const srcSettings = path.join(\n opts.repoRoot,\n \".claude\",\n \"settings.local.json\",\n );\n const destDir = path.join(opts.worktreePath, \".claude\");\n const destSettings = path.join(destDir, \"settings.local.json\");\n\n if (!fs.existsSync(srcSettings)) {\n warn(\n warnings,\n \"No .claude/settings.local.json found in main repo. Skipping.\",\n );\n return;\n }\n\n fs.mkdirSync(destDir, { recursive: true });\n fs.copyFileSync(srcSettings, destSettings);\n logSuccess(\"Copied settings.local.json\");\n\n try {\n run(\"git update-index --skip-worktree .claude/settings.local.json\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"Marked skip-worktree\");\n } catch {\n warn(warnings, \"Could not set skip-worktree. File may show as modified.\");\n }\n}\n\n// ─── Step 4: Generate .mcp.json ────────────────────────────────\n\nfunction step4GenerateMcpJson(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 4/9: Generating .mcp.json...\");\n\n const bunPath = findBun();\n if (!bunPath) {\n warn(warnings, \"bun not found. .mcp.json not generated.\");\n warn(\n warnings,\n \"Install bun (https://bun.sh) and re-run, or create .mcp.json manually.\",\n );\n return;\n }\n\n const wtAbs = toAbsolute(opts.worktreePath);\n const bunAbs = toAbsolute(bunPath);\n const commsAbs = toAbsolute(opts.commsDir);\n\n // Find tap-comms channel entry point\n const channelEntry = path.join(\n wtAbs,\n \"packages/tap-plugin/channels/tap-comms.ts\",\n );\n\n const mcpConfig = {\n mcpServers: {\n tap: {\n command: bunAbs,\n args: [channelEntry],\n cwd: wtAbs,\n env: {\n TAP_COMMS_DIR: commsAbs,\n TAP_AGENT_NAME: \"unnamed\",\n },\n },\n },\n };\n\n const mcpPath = path.join(opts.worktreePath, \".mcp.json\");\n fs.writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2) + \"\\n\", \"utf-8\");\n logSuccess(`.mcp.json generated (absolute paths + cwd)`);\n log(` bun: ${bunAbs}`);\n log(` comms: ${commsAbs}`);\n}\n\n// ─── Step 5: Install dependencies ──────────────────────────────\n\nfunction step5Install(opts: WorktreeOptions, warnings: string[]): void {\n if (opts.skipInstall) {\n log(\"Step 5/9: Skipping pnpm install (--skip-install).\");\n return;\n }\n\n log(\"Step 5/9: Installing dependencies...\");\n\n try {\n run(\"pnpm install --prefer-offline\", { cwd: opts.worktreePath });\n logSuccess(\"Dependencies installed.\");\n } catch {\n warn(\n warnings,\n \"pnpm install failed. Try running manually in the worktree.\",\n );\n }\n}\n\n// ─── Step 6: Build ESLint plugin ───────────────────────────────\n\nfunction step6BuildEslintPlugin(\n opts: WorktreeOptions,\n warnings: string[],\n): void {\n if (opts.skipInstall) {\n log(\"Step 6/9: Skipping eslint plugin build (--skip-install).\");\n return;\n }\n\n log(\"Step 6/9: Building eslint-plugin-i18n...\");\n\n try {\n run(\"pnpm build --filter @hua-labs/eslint-plugin-i18n\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"eslint-plugin-i18n built.\");\n } catch {\n warn(warnings, \"eslint-plugin-i18n build failed. Non-blocking.\");\n }\n}\n\n// ─── Step 7: Verify comms ──────────────────────────────────────\n\nfunction step7VerifyComms(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 7/9: Verifying comms directory...\");\n\n if (!fs.existsSync(opts.commsDir)) {\n warn(warnings, `Comms directory not found: ${opts.commsDir}`);\n warn(warnings, \"Create it or run: npx @hua-labs/tap init\");\n return;\n }\n\n const requiredDirs = [\"inbox\", \"findings\", \"reviews\", \"letters\"];\n for (const dir of requiredDirs) {\n const dirPath = path.join(opts.commsDir, dir);\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n logSuccess(`Created ${dir}/`);\n }\n }\n\n logSuccess(`Comms verified: ${opts.commsDir}`);\n}\n\n// ─── Step 8: Verify bun ────────────────────────────────────────\n\nfunction step8VerifyBun(warnings: string[]): void {\n log(\"Step 8/9: Verifying bun...\");\n\n const bunPath = findBun();\n if (!bunPath) {\n warn(warnings, \"bun not found in PATH.\");\n warn(warnings, \"Install: curl -fsSL https://bun.sh/install | bash\");\n return;\n }\n\n try {\n const version = run(`\"${bunPath}\" --version`);\n logSuccess(`bun ${version} found: ${bunPath}`);\n } catch {\n warn(warnings, \"bun found but version check failed.\");\n }\n}\n\n// ─── Step 9: Ready message ─────────────────────────────────────\n\nfunction step9Ready(opts: WorktreeOptions): void {\n logHeader(\"Ready!\");\n log(`Worktree: ${toAbsolute(opts.worktreePath)}`);\n log(`Branch: ${opts.branch}`);\n log(`Comms: ${toAbsolute(opts.commsDir)}`);\n if (opts.mission) log(`Mission: ${opts.mission}`);\n log(\"\");\n log(\"Next steps:\");\n log(` cd ${opts.worktreePath}`);\n log(\" claude # Start Claude Code session\");\n log(\"\");\n}\n\n// ─── Command entry ─────────────────────────────────────────────\n\nexport async function initWorktreeCommand(\n args: string[],\n): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(INIT_WORKTREE_HELP);\n return {\n ok: true,\n command: \"init-worktree\",\n code: \"TAP_NO_OP\",\n message: INIT_WORKTREE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const worktreePath =\n typeof flags[\"path\"] === \"string\" ? flags[\"path\"] : undefined;\n if (!worktreePath) {\n return {\n ok: false,\n command: \"init-worktree\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing --path. Usage: npx @hua-labs/tap init-worktree --path ../hua-wt-3\",\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const { config } = resolveConfig({}, repoRoot);\n\n const branch =\n typeof flags[\"branch\"] === \"string\"\n ? flags[\"branch\"]\n : path.basename(path.resolve(worktreePath));\n const base =\n typeof flags[\"base\"] === \"string\" ? flags[\"base\"] : \"origin/main\";\n const mission =\n typeof flags[\"mission\"] === \"string\" ? flags[\"mission\"] : undefined;\n const commsDir =\n typeof flags[\"comms-dir\"] === \"string\"\n ? flags[\"comms-dir\"]\n : config.commsDir;\n const skipInstall = flags[\"skip-install\"] === true;\n\n const opts: WorktreeOptions = {\n worktreePath: path.resolve(worktreePath),\n branch,\n base,\n mission,\n commsDir: path.resolve(commsDir),\n skipInstall,\n repoRoot,\n };\n\n logHeader(`@hua-labs/tap init-worktree`);\n log(`Path: ${opts.worktreePath}`);\n log(`Branch: ${opts.branch}`);\n log(`Base: ${opts.base}`);\n log(`Comms: ${opts.commsDir}`);\n if (mission) log(`Mission: ${mission}`);\n log(\"\");\n\n const warnings: string[] = [];\n\n // Execute steps\n const created = step1CreateWorktree(opts);\n if (!created) {\n return {\n ok: false,\n command: \"init-worktree\",\n code: \"TAP_PATCH_FAILED\",\n message: \"Failed to create worktree.\",\n warnings,\n data: {},\n };\n }\n\n step2MergeMain(opts, warnings);\n step3CopyPermissions(opts, warnings);\n step4GenerateMcpJson(opts, warnings);\n step5Install(opts, warnings);\n step6BuildEslintPlugin(opts, warnings);\n step7VerifyComms(opts, warnings);\n step8VerifyBun(warnings);\n step9Ready(opts);\n\n return {\n ok: true,\n command: \"init-worktree\" as never,\n code: \"TAP_INIT_OK\",\n message: `Worktree initialized: ${opts.worktreePath}`,\n warnings,\n data: {\n path: opts.worktreePath,\n branch: opts.branch,\n commsDir: opts.commsDir,\n },\n };\n}\n","import { collectDashboardSnapshot } from \"../engine/dashboard.js\";\nimport type { DashboardSnapshot } from \"../engine/dashboard.js\";\nimport { findRepoRoot, parseArgs, log, logHeader } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\n// ─── Formatting helpers ────────────────────────────────────────\n\nfunction formatAge(seconds: number | null): string {\n if (seconds === null) return \"-\";\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\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"running\":\n return \"running\";\n case \"stale\":\n return \"stale!\";\n case \"stopped\":\n return \"stopped\";\n case \"MERGED\":\n return \"merged\";\n case \"OPEN\":\n return \"open\";\n case \"CLOSED\":\n return \"closed\";\n default:\n return status;\n }\n}\n\nfunction truncate(str: string, len: number): string {\n return str.length > len ? str.slice(0, len - 1) + \"…\" : str;\n}\n\n// ─── Render ────────────────────────────────────────────────────\n\nfunction renderSnapshot(snapshot: DashboardSnapshot): void {\n logHeader(\"tap dashboard\");\n log(`Time: ${snapshot.generatedAt}`);\n log(`Repo: ${snapshot.repoRoot}`);\n log(`Comms: ${snapshot.commsDir}`);\n\n // ── Agents ──\n log(\"\");\n log(\"── Agents ──────────────────────────\");\n if (snapshot.agents.length === 0) {\n log(\" (no heartbeats)\");\n } else {\n for (const agent of snapshot.agents) {\n const activity = agent.lastActivity\n ? formatAge(\n Math.floor(\n (Date.now() - new Date(agent.lastActivity).getTime()) / 1000,\n ),\n )\n : \"unknown\";\n const status = agent.status ?? \"unknown\";\n log(` ${agent.name.padEnd(12)} ${status.padEnd(10)} active ${activity}`);\n }\n }\n\n // ── Bridges ──\n log(\"\");\n log(\"── Bridges ─────────────────────────\");\n if (snapshot.bridges.length === 0) {\n log(\" (none)\");\n } else {\n log(\n ` ${\"Instance\".padEnd(20)} ${\"Status\".padEnd(10)} ${\"PID\".padEnd(8)} ${\"Port\".padEnd(6)} ${\"Heartbeat\"}`,\n );\n log(\n ` ${\"─\".repeat(20)} ${\"─\".repeat(10)} ${\"─\".repeat(8)} ${\"─\".repeat(6)} ${\"─\".repeat(12)}`,\n );\n for (const b of snapshot.bridges) {\n const headlessTag = b.headless ? \" [H]\" : \"\";\n log(\n ` ${truncate(b.instanceId + headlessTag, 20).padEnd(20)} ${formatStatus(b.status).padEnd(10)} ${(b.pid ? String(b.pid) : \"-\").padEnd(8)} ${(b.port ? String(b.port) : \"-\").padEnd(6)} ${formatAge(b.heartbeatAge)}`,\n );\n }\n }\n\n // ── PRs ──\n log(\"\");\n log(\"── PRs ─────────────────────────────\");\n if (snapshot.prs.length === 0) {\n log(\" (gh CLI unavailable or no PRs)\");\n } else {\n for (const pr of snapshot.prs) {\n const icon =\n pr.state === \"MERGED\" ? \"+\" : pr.state === \"OPEN\" ? \"~\" : \"x\";\n log(\n ` ${icon} #${String(pr.number).padEnd(5)} ${formatStatus(pr.state).padEnd(8)} ${truncate(pr.title, 50)}`,\n );\n }\n }\n\n // ── Warnings ──\n log(\"\");\n log(\"── Warnings ────────────────────────\");\n if (snapshot.warnings.length === 0) {\n log(\" [OK] no warnings\");\n } else {\n for (const w of snapshot.warnings) {\n const prefix = w.level === \"error\" ? \"[ERR]\" : \"[WARN]\";\n log(` ${prefix} ${w.message}`);\n }\n }\n}\n\nconst DASHBOARD_HELP = `\nUsage:\n tap dashboard [options]\n\nDescription:\n Display a unified ops dashboard: agents, bridges, PRs, and warnings.\n\nOptions:\n --json Output snapshot as JSON\n --watch Refresh dashboard on an interval\n --interval <seconds> Refresh interval in seconds (default: 5, min: 2)\n --comms-dir <path> Override comms directory\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap dashboard\n npx @hua-labs/tap dashboard --watch --interval 10\n npx @hua-labs/tap dashboard --json\n`.trim();\n\n// ─── Command ───────────────────────────────────────────────────\n\nexport async function dashboardCommand(args: string[]): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(DASHBOARD_HELP);\n return {\n ok: true,\n command: \"dashboard\",\n code: \"TAP_NO_OP\",\n message: DASHBOARD_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const jsonMode = flags[\"json\"] === true;\n const watchMode = flags[\"watch\"] === true;\n const intervalStr =\n typeof flags[\"interval\"] === \"string\" ? flags[\"interval\"] : \"5\";\n const intervalSeconds = Math.max(2, parseInt(intervalStr, 10) || 5);\n const commsDirOverride =\n typeof flags[\"comms-dir\"] === \"string\" ? flags[\"comms-dir\"] : undefined;\n\n const repoRoot = findRepoRoot();\n\n if (watchMode) {\n // Watch loop — runs until Ctrl+C\n const run = (): void => {\n const snapshot = collectDashboardSnapshot(repoRoot, commsDirOverride);\n if (jsonMode) {\n console.log(JSON.stringify(snapshot, null, 2));\n } else {\n // Clear screen\n process.stdout.write(\"\\x1B[2J\\x1B[H\");\n renderSnapshot(snapshot);\n log(\"\");\n log(` Refreshing every ${intervalSeconds}s — Ctrl+C to exit`);\n }\n };\n\n run();\n const timer = setInterval(run, intervalSeconds * 1000);\n\n // Handle graceful shutdown\n const cleanup = (): void => {\n clearInterval(timer);\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Keep alive\n await new Promise(() => {});\n\n return {\n ok: true,\n command: \"unknown\",\n code: \"TAP_NO_OP\",\n message: \"Watch mode ended\",\n warnings: [],\n data: {},\n };\n }\n\n // Single run\n const snapshot = collectDashboardSnapshot(repoRoot, commsDirOverride);\n\n if (jsonMode) {\n console.log(JSON.stringify(snapshot, null, 2));\n } else {\n renderSnapshot(snapshot);\n }\n\n return {\n ok: true,\n command: \"dashboard\",\n code: \"TAP_STATUS_OK\",\n message: `Dashboard: ${snapshot.bridges.length} bridge(s), ${snapshot.agents.length} agent(s), ${snapshot.prs.length} PR(s)`,\n warnings: snapshot.warnings.map((w) => w.message),\n data: snapshot as unknown as Record<string, unknown>,\n };\n}\n","/**\n * `tap doctor` — Diagnose and optionally fix tap infrastructure health.\n *\n * Checks: comms directory, state file, instances, bridge health,\n * watcher readiness, MCP server, message lifecycle.\n *\n * M95: Diagnostic layer for tap.\n * M100: --fix auto-repair for common issues.\n */\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { spawnSync } from \"node:child_process\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n buildManagedMcpServerSpec,\n type ManagedMcpServerSpec,\n} from \"../adapters/common.js\";\nimport { loadState, saveState, getInstalledInstances } from \"../state.js\";\nimport {\n isBridgeRunning,\n getHeartbeatAge,\n loadBridgeState,\n loadRuntimeBridgeHeartbeat,\n loadRuntimeBridgeThreadState,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport {\n createAdapterContext,\n findRepoRoot,\n log,\n logHeader,\n logSuccess,\n logWarn,\n} from \"../utils.js\";\nimport {\n extractTomlTable,\n parseTomlAssignments,\n removeTomlTable,\n renderTomlTable,\n replaceTomlTable,\n} from \"../toml.js\";\nimport { version } from \"../version.js\";\nimport type { CommandResult, TapState } from \"../types.js\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\ninterface Check {\n name: string;\n status: \"pass\" | \"warn\" | \"fail\" | \"skip\";\n message?: string;\n fix?: () => string; // Returns description of what was fixed\n}\n\ninterface DoctorHeartbeatRecord {\n id?: string;\n agent?: string;\n timestamp?: string;\n lastActivity?: string;\n status?: \"active\" | \"idle\" | \"signing-off\" | string;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nconst PASS = \"pass\" as const;\nconst WARN = \"warn\" as const;\nconst FAIL = \"fail\" as const;\nconst HEARTBEAT_ACTIVE_WINDOW_MS = 10 * 60 * 1000;\nconst ORPHAN_HEARTBEAT_WINDOW_MS = 24 * 60 * 60 * 1000;\nconst SIGNING_OFF_HEARTBEAT_WINDOW_MS = 5 * 60 * 1000;\nconst CODEX_ENV_DRIFT_KEYS = [\n \"TAP_COMMS_DIR\",\n \"TAP_STATE_DIR\",\n \"TAP_REPO_ROOT\",\n] as const;\nconst CODEX_SESSION_NEUTRAL_NAME = \"<set-per-session>\";\n\nfunction normalizeComparablePath(value: string): string {\n return resolve(value).replace(/\\\\/g, \"/\").toLowerCase();\n}\n\nfunction samePath(left: string, right: string): boolean {\n return normalizeComparablePath(left) === normalizeComparablePath(right);\n}\n\nfunction looksLikePathToken(value: string): boolean {\n return (\n /^[A-Za-z]:[\\\\/]/.test(value) ||\n value.startsWith(\"/\") ||\n value.startsWith(\"\\\\\") ||\n value.startsWith(\".\") ||\n value.includes(\"/\") ||\n value.includes(\"\\\\\")\n );\n}\n\nfunction sameCommandToken(left: string, right: string): boolean {\n return looksLikePathToken(left) || looksLikePathToken(right)\n ? samePath(left, right)\n : left === right;\n}\n\nfunction sameStringArray(left: string[], right: string[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => sameCommandToken(value, right[index] ?? \"\"))\n );\n}\n\nfunction appendWarningMessage(message: string, extra: string): string {\n return message.includes(extra) ? message : `${message}; ${extra}`;\n}\n\nfunction findCodexConfigPath(): string {\n return join(homedir(), \".codex\", \"config.toml\");\n}\n\nfunction canonicalizeTrustPath(targetPath: string): string {\n let resolved = 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 writeTomlAtomically(filePath: string, content: string): void {\n const dir = dirname(filePath);\n mkdirSync(dir, { recursive: true });\n const tmp = `${filePath}.tmp.${process.pid}`;\n writeFileSync(tmp, content, \"utf-8\");\n renameSync(tmp, filePath);\n}\n\nfunction hasInstalledCodexInstance(state: TapState | null): boolean {\n return state\n ? Object.values(state.instances).some(\n (instance) => instance.runtime === \"codex\" && instance.installed,\n )\n : false;\n}\n\nfunction getCodexTrustTargets(repoRoot: string): string[] {\n return [...new Set([repoRoot, process.cwd()].map((value) => resolve(value)))];\n}\n\nfunction buildSessionNeutralCodexEnv(\n env: Record<string, string>,\n): Record<string, string> {\n const neutralEnv: Record<string, string> = {\n ...env,\n TAP_AGENT_NAME: CODEX_SESSION_NEUTRAL_NAME,\n };\n delete neutralEnv.TAP_AGENT_ID;\n return neutralEnv;\n}\n\nfunction buildCodexEnvEntries(\n existingTable: string | null,\n managedEnv: Record<string, string | string[]>,\n): Record<string, string | string[]> {\n const preservedEnv = parseTomlAssignments(existingTable ?? \"\");\n delete preservedEnv.TAP_AGENT_ID;\n return {\n ...preservedEnv,\n ...managedEnv,\n };\n}\n\nfunction buildCodexDoctorSpec(\n repoRoot: string,\n commsDir: string,\n): {\n configPath: string;\n trustTargets: string[];\n managed: ManagedMcpServerSpec;\n} | null {\n const state = loadState(repoRoot);\n if (!hasInstalledCodexInstance(state)) {\n return null;\n }\n\n const ctx = createAdapterContext(commsDir, repoRoot);\n const managed = buildManagedMcpServerSpec(ctx);\n\n return {\n configPath: findCodexConfigPath(),\n trustTargets: getCodexTrustTargets(repoRoot),\n managed: {\n ...managed,\n env: buildSessionNeutralCodexEnv(managed.env),\n },\n };\n}\n\nfunction repairCodexConfig(repoRoot: string, commsDir: string): string {\n const spec = buildCodexDoctorSpec(repoRoot, commsDir);\n if (!spec) {\n throw new Error(\"No installed Codex instance found in tap state.\");\n }\n if (!spec.managed.command || spec.managed.issues.length > 0) {\n throw new Error(\n spec.managed.issues[0] ??\n \"Unable to resolve the managed tap MCP server for Codex.\",\n );\n }\n\n const existingContent = existsSync(spec.configPath)\n ? readFileSync(spec.configPath, \"utf-8\")\n : \"\";\n const existingTapEnvTable = extractTomlTable(\n existingContent,\n \"mcp_servers.tap.env\",\n );\n const existingLegacyEnvTable = extractTomlTable(\n existingContent,\n \"mcp_servers.tap-comms.env\",\n );\n const preservedEnv = parseTomlAssignments(\n existingTapEnvTable ?? existingLegacyEnvTable ?? \"\",\n );\n const repairedEnv: Record<string, string | string[]> = {\n ...preservedEnv,\n ...(Object.fromEntries(\n CODEX_ENV_DRIFT_KEYS.map((key) => [key, spec.managed.env[key]]),\n ) as Record<string, string>),\n };\n repairedEnv.TAP_AGENT_NAME = spec.managed.env.TAP_AGENT_NAME;\n delete repairedEnv.TAP_AGENT_ID;\n\n let nextContent = existingContent;\n if (extractTomlTable(nextContent, \"mcp_servers.tap-comms.env\")) {\n nextContent = removeTomlTable(nextContent, \"mcp_servers.tap-comms.env\");\n }\n if (extractTomlTable(nextContent, \"mcp_servers.tap-comms\")) {\n nextContent = removeTomlTable(nextContent, \"mcp_servers.tap-comms\");\n }\n\n nextContent = replaceTomlTable(\n nextContent,\n \"mcp_servers.tap\",\n renderTomlTable(\n \"mcp_servers.tap\",\n {\n command: spec.managed.command,\n args: spec.managed.args,\n },\n extractTomlTable(existingContent, \"mcp_servers.tap\"),\n ),\n );\n nextContent = replaceTomlTable(\n nextContent,\n \"mcp_servers.tap.env\",\n renderTomlTable(\n \"mcp_servers.tap.env\",\n buildCodexEnvEntries(\n existingTapEnvTable ?? existingLegacyEnvTable,\n repairedEnv,\n ),\n ),\n );\n for (const trustTarget of spec.trustTargets) {\n const selector = trustSelector(trustTarget);\n nextContent = replaceTomlTable(\n nextContent,\n selector,\n renderTomlTable(\n selector,\n { trust_level: \"trusted\" },\n extractTomlTable(existingContent, selector),\n ),\n );\n }\n\n writeTomlAtomically(spec.configPath, nextContent);\n return `Repaired Codex config at ${spec.configPath}. Restart Codex to reload MCP settings.`;\n}\n\nfunction countFiles(dir: string, ext = \".md\"): number {\n if (!existsSync(dir)) return 0;\n try {\n return readdirSync(dir).filter((f) => f.endsWith(ext)).length;\n } catch {\n return 0;\n }\n}\n\nfunction recentFileCount(dir: string, withinMs: number): number {\n if (!existsSync(dir)) return 0;\n const cutoff = Date.now() - withinMs;\n let count = 0;\n try {\n for (const f of readdirSync(dir)) {\n if (!f.endsWith(\".md\")) continue;\n try {\n if (statSync(join(dir, f)).mtimeMs > cutoff) count++;\n } catch {\n // skip\n }\n }\n } catch {\n // skip\n }\n return count;\n}\n\nfunction loadDoctorHeartbeatStore(\n commsDir: string,\n): Record<string, DoctorHeartbeatRecord> | null {\n const heartbeatsPath = join(commsDir, \"heartbeats.json\");\n if (!existsSync(heartbeatsPath)) return null;\n try {\n return JSON.parse(readFileSync(heartbeatsPath, \"utf-8\")) as Record<\n string,\n DoctorHeartbeatRecord\n >;\n } catch {\n return null;\n }\n}\n\nfunction saveDoctorHeartbeatStore(\n commsDir: string,\n store: Record<string, DoctorHeartbeatRecord>,\n): void {\n const heartbeatsPath = join(commsDir, \"heartbeats.json\");\n const tmp = `${heartbeatsPath}.tmp.${process.pid}`;\n writeFileSync(tmp, JSON.stringify(store, null, 2), \"utf-8\");\n renameSync(tmp, heartbeatsPath);\n}\n\nfunction parseHeartbeatAgeMs(\n record: DoctorHeartbeatRecord,\n now: number,\n): number {\n const raw = record.lastActivity ?? record.timestamp;\n if (!raw) return Number.POSITIVE_INFINITY;\n const parsed = new Date(raw).getTime();\n if (!Number.isFinite(parsed)) return Number.POSITIVE_INFINITY;\n return Math.max(0, now - parsed);\n}\n\nfunction resolveHeartbeatInstanceId(\n state: TapState | null,\n heartbeatId: string,\n): string | null {\n if (!state) return null;\n if (state.instances[heartbeatId]) return heartbeatId;\n const hyphenated = heartbeatId.replace(/_/g, \"-\");\n if (state.instances[hyphenated]) return hyphenated;\n const underscored = heartbeatId.replace(/-/g, \"_\");\n if (state.instances[underscored]) return underscored;\n return null;\n}\n\nfunction collectStaleHeartbeatIds(\n commsDir: string,\n state: TapState | null,\n stateDir: string,\n): Array<{ id: string; label: string; ageMs: number }> {\n const store = loadDoctorHeartbeatStore(commsDir);\n if (!store) return [];\n\n const now = Date.now();\n const stale: Array<{ id: string; label: string; ageMs: number }> = [];\n\n for (const [heartbeatId, heartbeat] of Object.entries(store)) {\n const ageMs = parseHeartbeatAgeMs(heartbeat, now);\n const instanceId = resolveHeartbeatInstanceId(state, heartbeatId);\n const instance = instanceId ? state?.instances[instanceId] : null;\n const bridgeBacked = instance?.bridgeMode === \"app-server\";\n const bridgeRunning =\n bridgeBacked && instanceId\n ? isBridgeRunning(stateDir, instanceId)\n : false;\n const status = heartbeat.status ?? \"active\";\n\n const staleByStatus =\n status === \"signing-off\" && ageMs >= SIGNING_OFF_HEARTBEAT_WINDOW_MS;\n const staleByDeadBridge =\n bridgeBacked && !bridgeRunning && ageMs >= HEARTBEAT_ACTIVE_WINDOW_MS;\n const staleByAge = !bridgeRunning && ageMs >= ORPHAN_HEARTBEAT_WINDOW_MS;\n\n if (staleByStatus || staleByDeadBridge || staleByAge) {\n stale.push({\n id: heartbeatId,\n label: heartbeat.agent?.trim() || heartbeatId,\n ageMs,\n });\n }\n }\n\n return stale;\n}\n\nfunction pruneHeartbeatIds(commsDir: string, heartbeatIds: string[]): number {\n if (heartbeatIds.length === 0) return 0;\n const store = loadDoctorHeartbeatStore(commsDir);\n if (!store) return 0;\n\n let removed = 0;\n for (const heartbeatId of new Set(heartbeatIds)) {\n if (heartbeatId in store) {\n delete store[heartbeatId];\n removed += 1;\n }\n }\n\n if (removed > 0) {\n saveDoctorHeartbeatStore(commsDir, store);\n }\n\n return removed;\n}\n\n// ── Checks ──────────────────────────────────────────────────────────────\n\nfunction checkComms(commsDir: string): Check[] {\n const checks: Check[] = [];\n\n checks.push({\n name: \"comms directory\",\n status: existsSync(commsDir) ? PASS : FAIL,\n message: existsSync(commsDir) ? commsDir : `Not found: ${commsDir}`,\n fix: existsSync(commsDir)\n ? undefined\n : () => {\n mkdirSync(commsDir, { recursive: true });\n return `Created ${commsDir}`;\n },\n });\n\n for (const [subdir, required] of [\n [\"inbox\", true],\n [\"reviews\", false],\n [\"findings\", false],\n ] as const) {\n const dir = join(commsDir, subdir);\n const exists = existsSync(dir);\n checks.push({\n name: `${subdir} directory`,\n status: exists ? PASS : required ? FAIL : WARN,\n message: exists\n ? subdir === \"findings\"\n ? `${countFiles(dir)} findings`\n : subdir === \"inbox\"\n ? `${countFiles(dir)} messages`\n : \"exists\"\n : `Missing${required ? \"\" : \" (optional)\"}`,\n fix: exists\n ? undefined\n : () => {\n mkdirSync(dir, { recursive: true });\n return `Created ${dir}`;\n },\n });\n }\n\n // Heartbeats\n const heartbeats = join(commsDir, \"heartbeats.json\");\n if (existsSync(heartbeats)) {\n try {\n const store = JSON.parse(readFileSync(heartbeats, \"utf-8\"));\n const agents = Object.keys(store);\n const now = Date.now();\n const active = agents.filter((a) => {\n const ts = store[a]?.lastActivity;\n return ts && now - new Date(ts).getTime() < HEARTBEAT_ACTIVE_WINDOW_MS;\n });\n checks.push({\n name: \"heartbeats\",\n status: active.length > 0 ? PASS : WARN,\n message: `${active.length} active / ${agents.length} total`,\n });\n } catch {\n checks.push({\n name: \"heartbeats\",\n status: WARN,\n message: \"File exists but unreadable\",\n });\n }\n } else {\n checks.push({\n name: \"heartbeats\",\n status: WARN,\n message: \"No heartbeats file\",\n });\n }\n\n return checks;\n}\n\nfunction checkStaleHeartbeats(\n repoRoot: string,\n commsDir: string,\n stateDir: string,\n): Check[] {\n const state = loadState(repoRoot);\n const stale = collectStaleHeartbeatIds(commsDir, state, stateDir);\n if (stale.length === 0) {\n return [\n {\n name: \"stale heartbeats\",\n status: PASS,\n message: \"none\",\n },\n ];\n }\n\n const preview = stale\n .slice(0, 3)\n .map((entry) => `${entry.label} (${Math.round(entry.ageMs / 60000)}m)`)\n .join(\", \");\n\n return [\n {\n name: \"stale heartbeats\",\n status: WARN,\n message:\n stale.length > 3\n ? `${stale.length} stale entries: ${preview}, ...`\n : `${stale.length} stale entr${stale.length === 1 ? \"y\" : \"ies\"}: ${preview}`,\n fix: () => {\n const removed = pruneHeartbeatIds(\n commsDir,\n stale.map((entry) => entry.id),\n );\n return `Pruned ${removed} stale heartbeat entr${removed === 1 ? \"y\" : \"ies\"}`;\n },\n },\n ];\n}\n\nfunction checkInstances(\n repoRoot: string,\n stateDir: string,\n commsDir: string,\n): Check[] {\n const checks: Check[] = [];\n const state = loadState(repoRoot);\n\n if (!state) {\n checks.push({\n name: \"tap state\",\n status: FAIL,\n message: \"Not initialized. Run: tap init\",\n });\n return checks;\n }\n\n checks.push({\n name: \"tap state\",\n status: PASS,\n message: `v${state.schemaVersion}, ${getInstalledInstances(state).length} instance(s)`,\n });\n\n const installed = getInstalledInstances(state);\n for (const id of installed) {\n const inst = state.instances[id];\n if (!inst) continue;\n\n if (inst.bridgeMode === \"app-server\") {\n const running = isBridgeRunning(stateDir, id);\n const bridgeState = loadBridgeState(stateDir, id);\n const heartbeatAge = getHeartbeatAge(stateDir, id);\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const savedThread = loadRuntimeBridgeThreadState(bridgeState);\n\n let status: \"pass\" | \"warn\" | \"fail\";\n let message: string;\n let fix: (() => string) | undefined;\n\n if (running && bridgeState) {\n if (heartbeatAge !== null && heartbeatAge > 120) {\n status = WARN;\n message = `PID ${bridgeState.pid} alive but heartbeat stale (${Math.round(heartbeatAge)}s ago)`;\n } else {\n status = PASS;\n message = `PID ${bridgeState.pid}, port ${inst.port ?? \"auto\"}`;\n }\n } else if (bridgeState && !running) {\n status = WARN;\n message = `Stale PID ${bridgeState.pid} (process dead)`;\n fix = () => {\n // Kill managed app-server/gateway if still alive\n const appServer = bridgeState.appServer;\n if (appServer?.managed) {\n for (const pid of [appServer.auth?.gatewayPid, appServer.pid]) {\n if (pid) {\n try {\n if (process.platform === \"win32\") {\n spawnSync(\"taskkill\", [\"/PID\", String(pid), \"/F\", \"/T\"], {\n stdio: \"pipe\",\n });\n } else {\n process.kill(pid);\n }\n } catch {\n // Already dead — fine\n }\n }\n }\n }\n // Clean up stale bridge PID file\n const pidPath = join(stateDir, \"pids\", `bridge-${id}.json`);\n try {\n unlinkSync(pidPath);\n } catch {\n // ignore\n }\n // Clear bridge reference in instance state\n const currentState = loadState(repoRoot);\n if (currentState?.instances[id]) {\n currentState.instances[id].bridge = null;\n currentState.updatedAt = new Date().toISOString();\n saveState(repoRoot, currentState);\n }\n const removedHeartbeats = pruneHeartbeatIds(commsDir, [\n id,\n id.replace(/-/g, \"_\"),\n id.replace(/_/g, \"-\"),\n ]);\n const suffix =\n removedHeartbeats > 0\n ? `; pruned ${removedHeartbeats} heartbeat entr${removedHeartbeats === 1 ? \"y\" : \"ies\"}`\n : \"\";\n return `Cleaned stale bridge + managed processes for ${id}${suffix}`;\n };\n } else {\n status = WARN;\n message = \"Not running\";\n }\n\n const lastRuntimeError = runtimeHeartbeat?.lastError?.trim();\n if (lastRuntimeError) {\n status = WARN;\n message = `${message}; bridge last error: ${lastRuntimeError}`;\n }\n\n if (\n savedThread?.threadId &&\n savedThread.cwd &&\n !samePath(savedThread.cwd, repoRoot)\n ) {\n status = WARN;\n message = appendWarningMessage(\n message,\n `saved thread cwd mismatch (${savedThread.cwd})`,\n );\n }\n\n if (\n runtimeHeartbeat?.threadId &&\n savedThread?.threadId &&\n runtimeHeartbeat.threadId !== savedThread.threadId\n ) {\n status = WARN;\n message = appendWarningMessage(\n message,\n `saved thread ${savedThread.threadId} differs from active thread ${runtimeHeartbeat.threadId}`,\n );\n }\n\n if (\n runtimeHeartbeat?.threadCwd &&\n !samePath(runtimeHeartbeat.threadCwd, repoRoot)\n ) {\n status = WARN;\n message = appendWarningMessage(\n message,\n `active thread cwd mismatch (${runtimeHeartbeat.threadCwd})`,\n );\n }\n\n checks.push({ name: `bridge: ${id}`, status, message, fix });\n } else {\n checks.push({\n name: `instance: ${id}`,\n status: PASS,\n message: `${inst.runtime} (${inst.bridgeMode})`,\n });\n }\n }\n\n return checks;\n}\n\nfunction checkMessageLifecycle(commsDir: string): Check[] {\n const checks: Check[] = [];\n const inbox = join(commsDir, \"inbox\");\n\n if (!existsSync(inbox)) {\n checks.push({\n name: \"message flow\",\n status: FAIL,\n message: \"No inbox\",\n });\n return checks;\n }\n\n const total = countFiles(inbox);\n const recent1h = recentFileCount(inbox, 60 * 60 * 1000);\n const recent10m = recentFileCount(inbox, 10 * 60 * 1000);\n\n checks.push({\n name: \"message flow\",\n status: recent10m > 0 ? PASS : total > 0 ? WARN : FAIL,\n message: `${total} total, ${recent1h} in last 1h, ${recent10m} in last 10m`,\n });\n\n // Receipt coverage\n const receiptsPath = join(commsDir, \"receipts\", \"receipts.json\");\n if (existsSync(receiptsPath)) {\n try {\n const receipts = JSON.parse(readFileSync(receiptsPath, \"utf-8\"));\n const receiptCount = Object.keys(receipts).length;\n checks.push({\n name: \"read receipts\",\n status: PASS,\n message: `${receiptCount} receipts tracked`,\n });\n } catch {\n checks.push({\n name: \"read receipts\",\n status: WARN,\n message: \"File exists but unreadable\",\n });\n }\n }\n\n return checks;\n}\n\nfunction checkMcpServer(repoRoot: string): Check[] {\n const checks: Check[] = [];\n\n const mcpJson = join(repoRoot, \".mcp.json\");\n if (!existsSync(mcpJson)) {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: WARN,\n message: \"Not found — MCP channel notifications won't work\",\n });\n return checks;\n }\n\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(readFileSync(mcpJson, \"utf-8\"));\n } catch {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: WARN,\n message: \"File exists but invalid JSON\",\n });\n return checks;\n }\n\n const mcpServers = config?.mcpServers as Record<string, unknown> | undefined;\n const hasTap = mcpServers?.[\"tap\"] as\n | {\n command?: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n }\n | undefined;\n const hasOldKey = mcpServers?.[\"tap-comms\"] as\n | Record<string, unknown>\n | undefined;\n\n if (hasOldKey) {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: WARN,\n message:\n 'Legacy \"tap-comms\" key found. Run \"tap add claude\" to migrate to the new \"tap\" key.',\n });\n }\n\n if (!hasTap && !hasOldKey) {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: WARN,\n message: \"tap not configured\",\n });\n return checks;\n }\n\n // Use new key if available, fall back to old key for backward compat\n const hasTapComms = (hasTap ?? hasOldKey) as\n | {\n command?: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n }\n | undefined;\n if (!hasTapComms) {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: FAIL,\n message: \"No tap or tap-comms key found in .mcp.json\",\n });\n return checks;\n }\n\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: PASS,\n message: `command: ${hasTapComms.command}`,\n });\n\n // Check if MCP command is available (absolute path or PATH lookup)\n if (hasTapComms.command) {\n const cmd = hasTapComms.command;\n let cmdAvailable = existsSync(cmd); // Absolute path check\n if (!cmdAvailable) {\n // PATH-based command — try running with --version\n try {\n const result = spawnSync(cmd, [\"--version\"], {\n stdio: \"pipe\",\n timeout: 5000,\n shell: process.platform === \"win32\",\n });\n cmdAvailable = result.status === 0;\n } catch {\n // command not found or failed\n }\n }\n checks.push({\n name: \"MCP command binary\",\n status: cmdAvailable ? PASS : FAIL,\n message: cmdAvailable\n ? cmd\n : `Not found: ${cmd} (checked PATH and absolute)`,\n });\n }\n\n // Check if MCP server script/args exist\n if (hasTapComms.args?.[0]) {\n const mcpScript = hasTapComms.args[0];\n checks.push({\n name: \"MCP server script\",\n status: existsSync(mcpScript) ? PASS : FAIL,\n message: existsSync(mcpScript) ? mcpScript : `Not found: ${mcpScript}`,\n });\n\n // Warn if using compiled .mjs with node (bun:sqlite fallback)\n if (\n mcpScript.endsWith(\".mjs\") &&\n hasTapComms.command &&\n !hasTapComms.command.includes(\"bun\")\n ) {\n checks.push({\n name: \"MCP SQLite support\",\n status: WARN,\n message:\n \"Node + .mjs = no SQLite (bun:sqlite unavailable). Use bun or .ts source for full features.\",\n });\n }\n }\n\n // Check cwd field — missing cwd caused MCP connection failures in Gen 11\n if (!hasTapComms.cwd) {\n checks.push({\n name: \"MCP cwd field\",\n status: WARN,\n message:\n \"No cwd in .mcp.json — worktree sessions may fail to resolve MCP server dependencies\",\n });\n } else {\n checks.push({\n name: \"MCP cwd field\",\n status: PASS,\n message: hasTapComms.cwd,\n });\n }\n\n // Check TAP_COMMS_DIR in env\n const envCommsDir = hasTapComms.env?.TAP_COMMS_DIR;\n if (!envCommsDir) {\n checks.push({\n name: \"MCP TAP_COMMS_DIR\",\n status: FAIL,\n message:\n \"TAP_COMMS_DIR not set in .mcp.json env — server will fail to start\",\n });\n } else {\n checks.push({\n name: \"MCP TAP_COMMS_DIR\",\n status: existsSync(envCommsDir) ? PASS : FAIL,\n message: existsSync(envCommsDir)\n ? envCommsDir\n : `Directory not found: ${envCommsDir}`,\n });\n }\n\n // Note about --resume/--continue cache behavior\n // (Can't detect at runtime, but document in output)\n checks.push({\n name: \"MCP session cache\",\n status: PASS,\n message:\n \"If .mcp.json was changed mid-session, restart Claude (Ctrl+C → claude --resume) to reload\",\n });\n\n return checks;\n}\n\nfunction checkCodexConfig(repoRoot: string, commsDir: string): Check[] {\n const spec = buildCodexDoctorSpec(repoRoot, commsDir);\n if (!spec) {\n return [];\n }\n\n const checks: Check[] = [];\n const fixHint = 'Run \"tap doctor --fix\" or \"tap add codex --force\".';\n\n if (!existsSync(spec.configPath)) {\n checks.push({\n name: \"MCP config (~/.codex/config.toml)\",\n status: WARN,\n message: `${spec.configPath} not found. ${fixHint}`,\n fix: () => repairCodexConfig(repoRoot, commsDir),\n });\n return checks;\n }\n\n const content = readFileSync(spec.configPath, \"utf-8\");\n const tapTable = extractTomlTable(content, \"mcp_servers.tap\");\n const tapEnvTable = extractTomlTable(content, \"mcp_servers.tap.env\");\n const legacyTable = extractTomlTable(content, \"mcp_servers.tap-comms\");\n const legacyEnvTable = extractTomlTable(content, \"mcp_servers.tap-comms.env\");\n const selectedMain = parseTomlAssignments(tapTable ?? \"\");\n const selectedEnv = parseTomlAssignments(tapEnvTable ?? legacyEnvTable ?? \"\");\n const issues: string[] = [];\n\n if (legacyTable || legacyEnvTable) {\n issues.push('legacy \"tap-comms\" key present');\n }\n if (!tapTable && !legacyTable) {\n issues.push(\"tap MCP table missing\");\n }\n if (!tapEnvTable && !legacyEnvTable) {\n issues.push(\"tap MCP env table missing\");\n }\n if (tapTable && spec.managed.command) {\n const actualCommand = selectedMain.command;\n if (typeof actualCommand !== \"string\") {\n issues.push(\"tap MCP command missing\");\n } else if (!sameCommandToken(actualCommand, spec.managed.command)) {\n issues.push(`tap MCP command drift (${actualCommand})`);\n }\n\n const actualArgs = selectedMain.args;\n if (!Array.isArray(actualArgs)) {\n issues.push(\"tap MCP args missing\");\n } else if (!sameStringArray(actualArgs, spec.managed.args)) {\n issues.push(`tap MCP args drift (${JSON.stringify(actualArgs)})`);\n }\n }\n\n for (const key of CODEX_ENV_DRIFT_KEYS) {\n const expected = spec.managed.env[key];\n const actual = selectedEnv[key];\n if (typeof actual !== \"string\") {\n issues.push(`${key} missing`);\n continue;\n }\n if (!samePath(actual, expected)) {\n issues.push(`${key} drift (${actual})`);\n }\n }\n\n const actualAgentName = selectedEnv.TAP_AGENT_NAME;\n if (typeof actualAgentName !== \"string\") {\n issues.push(\"TAP_AGENT_NAME missing\");\n } else if (actualAgentName !== spec.managed.env.TAP_AGENT_NAME) {\n issues.push(`non-neutral TAP_AGENT_NAME persisted (${actualAgentName})`);\n }\n\n const actualAgentId = selectedEnv.TAP_AGENT_ID;\n if (typeof actualAgentId === \"string\" && actualAgentId.trim()) {\n issues.push(`concrete TAP_AGENT_ID persisted (${actualAgentId})`);\n }\n\n for (const trustTarget of spec.trustTargets) {\n const trustTable = extractTomlTable(content, trustSelector(trustTarget));\n if (!trustTable || !trustTable.includes('trust_level = \"trusted\"')) {\n issues.push(`missing trust for ${trustTarget}`);\n }\n }\n\n if (issues.length === 0) {\n checks.push({\n name: \"MCP config (~/.codex/config.toml)\",\n status: PASS,\n message: spec.configPath,\n });\n return checks;\n }\n\n checks.push({\n name: \"MCP config (~/.codex/config.toml)\",\n status: WARN,\n message: `${issues.join(\"; \")}. ${fixHint}`,\n fix: () => repairCodexConfig(repoRoot, commsDir),\n });\n\n return checks;\n}\n\n// ── Bridge Turn Health (zombie detection) ───────────────────────────\n\nfunction checkBridgeTurnHealth(repoRoot: string): Check[] {\n const checks: Check[] = [];\n const tmpDir = join(repoRoot, \".tmp\");\n if (!existsSync(tmpDir)) return checks;\n\n // Only scan dirs that belong to active instances or their agents\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 // Also match agentName-based dirs (manual runbook pattern)\n if (inst.agentName) activeMatchers.add(inst.agentName);\n }\n }\n }\n\n let dirs: string[];\n try {\n dirs = readdirSync(tmpDir).filter((d) => {\n if (!d.startsWith(\"codex-app-server-bridge\")) return false;\n const suffix = d.replace(\"codex-app-server-bridge-\", \"\");\n if (activeMatchers.size === 0) return true; // No state → scan all\n for (const matcher of activeMatchers) {\n if (suffix === matcher || suffix.startsWith(matcher)) return true;\n }\n return false;\n });\n } catch {\n return checks;\n }\n\n for (const dir of dirs) {\n const heartbeatPath = join(tmpDir, dir, \"heartbeat.json\");\n if (!existsSync(heartbeatPath)) continue;\n\n let heartbeat: {\n updatedAt?: string;\n activeTurnId?: string | null;\n lastTurnStatus?: string;\n lastNotificationAt?: string;\n lastNotificationMethod?: string;\n connected?: boolean;\n initialized?: boolean;\n authenticated?: boolean;\n consecutiveFailureCount?: number;\n lastError?: string | null;\n };\n\n try {\n heartbeat = JSON.parse(readFileSync(heartbeatPath, \"utf-8\"));\n } catch {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message: \"heartbeat.json unreadable\",\n });\n continue;\n }\n\n // Calculate heartbeat age\n const heartbeatAge = heartbeat.updatedAt\n ? Math.floor(\n (Date.now() - new Date(heartbeat.updatedAt).getTime()) / 1000,\n )\n : null;\n\n // Not connected\n if (heartbeat.connected === false || heartbeat.initialized === false) {\n checks.push({\n name: `turn: ${dir}`,\n status: FAIL,\n message: `disconnected (connected=${heartbeat.connected}, initialized=${heartbeat.initialized})${heartbeat.lastError ? ` — ${heartbeat.lastError}` : \"\"}`,\n });\n continue;\n }\n\n // Dead — no heartbeat update for 5+ minutes\n if (heartbeatAge !== null && heartbeatAge > 300) {\n checks.push({\n name: `turn: ${dir}`,\n status: FAIL,\n message: `dead — heartbeat ${Math.round(heartbeatAge)}s ago, no updates`,\n });\n continue;\n }\n\n // Zombie — active turn with no notification progress for 30+ minutes (Fix 1)\n if (heartbeat.activeTurnId) {\n const ZOMBIE_THRESHOLD = 30 * 60; // 30 minutes\n const lastNotifAge = heartbeat.lastNotificationAt\n ? Math.floor(\n (Date.now() - new Date(heartbeat.lastNotificationAt).getTime()) /\n 1000,\n )\n : null;\n\n // Primary: use lastNotificationAt to detect stuck turns\n if (lastNotifAge !== null && lastNotifAge > ZOMBIE_THRESHOLD) {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message: `zombie — active turn ${heartbeat.activeTurnId}, last notification ${Math.round(lastNotifAge / 60)}m ago (${heartbeat.lastNotificationMethod ?? \"?\"}). MCP tools may not be exposed in app-server turns — try bridge restart${heartbeat.lastError ? `. Error: ${heartbeat.lastError}` : \"\"}`,\n });\n continue;\n }\n\n // Fallback: consecutive failures + active turn = zombie signal\n const failures = heartbeat.consecutiveFailureCount ?? 0;\n if (failures > 0 && heartbeatAge !== null && heartbeatAge < 60) {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message: `zombie — active turn ${heartbeat.activeTurnId}, ${failures} consecutive failures. MCP tools may not be exposed in app-server turns — try bridge restart${heartbeat.lastError ? `. Error: ${heartbeat.lastError}` : \"\"}`,\n });\n continue;\n }\n }\n\n // Slow — heartbeat fresh but lots of failures\n const failures = heartbeat.consecutiveFailureCount ?? 0;\n if (failures > 5) {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message: `slow — ${failures} consecutive failures, last: ${heartbeat.lastError ?? \"unknown\"}`,\n });\n continue;\n }\n\n // M175: Warn when a live bridge is running without auth\n if (heartbeat.authenticated === false) {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message:\n \"bridge running without auth — app-server session is unprotected. \" +\n \"Use --gateway-token-file to enable auth.\",\n });\n }\n\n // Healthy\n const turnInfo = heartbeat.activeTurnId\n ? `active turn ${heartbeat.activeTurnId}`\n : `idle (last: ${heartbeat.lastTurnStatus ?? \"none\"})`;\n checks.push({\n name: `turn: ${dir}`,\n status: PASS,\n message: `healthy — ${turnInfo}, heartbeat ${heartbeatAge ?? \"?\"}s ago`,\n });\n }\n\n return checks;\n}\n\n// ── Render ──────────────────────────────────────────────────────────────\n\nfunction renderCheck(check: Check, fixMode: boolean): string {\n const icons: Record<string, string> = {\n pass: \"[OK]\",\n warn: \"[!!]\",\n fail: \"[XX]\",\n skip: \"[--]\",\n };\n const icon = icons[check.status] || \"[??]\";\n const fixable = fixMode && check.fix ? \" (fixable)\" : \"\";\n const msg = check.message ? ` — ${check.message}${fixable}` : \"\";\n return ` ${icon} ${check.name}${msg}`;\n}\n\nconst DOCTOR_HELP = `\nUsage:\n tap doctor [options]\n\nDescription:\n Diagnose tap infrastructure health: comms directory, instances, bridges,\n message lifecycle, and MCP server configuration.\n\nOptions:\n --fix Auto-repair detected issues where possible\n --comms-dir <path> Override comms directory\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap doctor\n npx @hua-labs/tap doctor --fix\n`.trim();\n\n// ── Command ─────────────────────────────────────────────────────────────\n\nexport async function doctorCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(DOCTOR_HELP);\n return {\n ok: true,\n command: \"doctor\",\n code: \"TAP_NO_OP\",\n message: DOCTOR_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n\n // Parse flags\n const overrides: Record<string, string> = {};\n let fixMode = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--comms-dir\" && args[i + 1]) {\n overrides.commsDir = args[i + 1];\n }\n if (args[i] === \"--fix\") {\n fixMode = true;\n }\n }\n\n const { config } = resolveConfig(overrides, repoRoot);\n const state = loadState(repoRoot);\n const commsDir = overrides.commsDir\n ? config.commsDir\n : (state?.commsDir ?? config.commsDir);\n\n logHeader(`@hua-labs/tap doctor (v${version})${fixMode ? \" --fix\" : \"\"}`);\n\n function runAllChecks(): Check[] {\n const checks: Check[] = [];\n checks.push(...checkComms(commsDir));\n checks.push(...checkStaleHeartbeats(repoRoot, commsDir, config.stateDir));\n checks.push(...checkInstances(repoRoot, config.stateDir, commsDir));\n checks.push(...checkMessageLifecycle(commsDir));\n checks.push(...checkMcpServer(repoRoot));\n checks.push(...checkCodexConfig(repoRoot, commsDir));\n checks.push(...checkBridgeTurnHealth(repoRoot));\n return checks;\n }\n\n // Initial scan\n const initialChecks = runAllChecks();\n for (const section of [\n \"Comms\",\n \"Instances\",\n \"Messages\",\n \"MCP\",\n \"Turns\",\n ] as const) {\n const sectionChecks = {\n Comms: initialChecks.filter((c) =>\n [\n \"comms directory\",\n \"inbox directory\",\n \"reviews directory\",\n \"findings directory\",\n \"heartbeats\",\n \"stale heartbeats\",\n ].includes(c.name),\n ),\n Instances: initialChecks.filter(\n (c) =>\n c.name.startsWith(\"bridge:\") ||\n c.name.startsWith(\"instance:\") ||\n c.name === \"tap state\",\n ),\n Messages: initialChecks.filter((c) =>\n [\"message flow\", \"read receipts\"].includes(c.name),\n ),\n MCP: initialChecks.filter(\n (c) => c.name.startsWith(\"MCP\") || c.name === \"MCP server script\",\n ),\n Turns: initialChecks.filter((c) => c.name.startsWith(\"turn:\")),\n }[section];\n if (sectionChecks.length > 0) {\n log(`${section}:`);\n for (const c of sectionChecks) log(renderCheck(c, fixMode));\n log(\"\");\n }\n }\n\n // Auto-fix + re-verify\n const fixed: string[] = [];\n let finalChecks = initialChecks;\n\n if (fixMode) {\n const fixable = initialChecks.filter(\n (c) => (c.status === \"warn\" || c.status === \"fail\") && c.fix,\n );\n if (fixable.length > 0) {\n log(\"Fixes:\");\n for (const c of fixable) {\n try {\n const desc = c.fix!();\n fixed.push(desc);\n logSuccess(` ${desc}`);\n } catch (err) {\n logWarn(\n ` Failed to fix ${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n // Re-run all checks after fixes for accurate post-fix status\n log(\"\");\n log(\"Re-verifying...\");\n finalChecks = runAllChecks();\n const postFails = finalChecks.filter((c) => c.status === \"fail\").length;\n const postWarns = finalChecks.filter((c) => c.status === \"warn\").length;\n log(\n ` ${postFails === 0 ? \"All clear\" : `${postFails} remaining failures, ${postWarns} warnings`}`,\n );\n } else {\n log(\"Nothing to fix.\");\n }\n }\n\n // Summary (based on final state)\n const passes = finalChecks.filter((c) => c.status === \"pass\").length;\n const warns = finalChecks.filter((c) => c.status === \"warn\").length;\n const fails = finalChecks.filter((c) => c.status === \"fail\").length;\n\n log(\"\");\n log(\n `${finalChecks.length} checks: ${passes} passed, ${warns} warnings, ${fails} failures` +\n (fixed.length > 0 ? ` (${fixed.length} fixed)` : \"\"),\n );\n\n return {\n ok: fails === 0,\n command: \"doctor\",\n code: fails === 0 ? \"TAP_STATUS_OK\" : \"TAP_VERIFY_FAILED\",\n message: `${passes} passed, ${warns} warnings, ${fails} failures`,\n warnings: finalChecks\n .filter((c) => c.status === \"warn\")\n .map((c) => `${c.name}: ${c.message}`),\n data: {\n checks: finalChecks.map(({ fix, ...rest }) => rest),\n summary: { total: finalChecks.length, passes, warns, fails },\n fixed,\n },\n };\n}\n","/**\n * tap comms pull/push — sync comms directory with remote repo.\n * M108: GitHub/comms repo connection.\n */\n\nimport { execSync, spawnSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n findRepoRoot,\n resolveCommsDir as resolveCommsDirFromArgs,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst COMMS_HELP = `\nUsage:\n tap comms <subcommand>\n\nSubcommands:\n pull Pull latest changes from comms remote repo\n push Commit and push comms changes to remote repo\n\nExamples:\n npx @hua-labs/tap comms pull\n npx @hua-labs/tap comms push\n`.trim();\n\nfunction isGitRepo(dir: string): boolean {\n return fs.existsSync(path.join(dir, \".git\"));\n}\n\nfunction commsPull(commsDir: string): CommandResult {\n logHeader(\"tap comms pull\");\n\n if (!isGitRepo(commsDir)) {\n logError(`${commsDir} is not a git repository`);\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_NOT_REPO\",\n message: `Comms directory is not a git repo. Use 'tap init --comms-repo <url>' to set up.`,\n warnings: [],\n data: { commsDir },\n };\n }\n\n try {\n const output = execSync(\"git pull --rebase\", {\n cwd: commsDir,\n encoding: \"utf-8\",\n stdio: \"pipe\",\n });\n logSuccess(\"Comms pull complete\");\n if (output.trim()) log(output.trim());\n return {\n ok: true,\n command: \"comms\",\n code: \"TAP_COMMS_PULL_OK\",\n message: \"Comms pull complete\",\n warnings: [],\n data: { commsDir },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(`Pull failed: ${msg}`);\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_PULL_FAILED\",\n message: `Pull failed: ${msg}`,\n warnings: [],\n data: { commsDir },\n };\n }\n}\n\nfunction commsPush(commsDir: string): CommandResult {\n logHeader(\"tap comms push\");\n\n if (!isGitRepo(commsDir)) {\n logError(`${commsDir} is not a git repository`);\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_NOT_REPO\",\n message: `Comms directory is not a git repo. Use 'tap init --comms-repo <url>' to set up.`,\n warnings: [],\n data: { commsDir },\n };\n }\n\n try {\n // Stage all changes\n execSync(\"git add -A\", { cwd: commsDir, stdio: \"pipe\" });\n\n // Check if there are changes to commit\n const status = execSync(\"git status --porcelain\", {\n cwd: commsDir,\n encoding: \"utf-8\",\n stdio: \"pipe\",\n }).trim();\n\n if (!status) {\n log(\"Nothing to push — comms directory is clean\");\n return {\n ok: true,\n command: \"comms\",\n code: \"TAP_COMMS_PUSH_OK\",\n message: \"Nothing to push\",\n warnings: [],\n data: { commsDir, changed: false },\n };\n }\n\n // Commit\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const commitResult = spawnSync(\n \"git\",\n [\"commit\", \"-m\", `chore(comms): sync ${timestamp}`],\n { cwd: commsDir, stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (commitResult.status !== 0) {\n const msg =\n commitResult.stderr ||\n `git commit exited with code ${commitResult.status}`;\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_PUSH_FAILED\",\n message: `Commit failed: ${msg}`,\n warnings: [],\n data: { commsDir },\n };\n }\n\n // Push\n execSync(\"git push\", { cwd: commsDir, stdio: \"pipe\" });\n logSuccess(\"Comms push complete\");\n\n return {\n ok: true,\n command: \"comms\",\n code: \"TAP_COMMS_PUSH_OK\",\n message: \"Comms push complete\",\n warnings: [],\n data: { commsDir, changed: true },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(`Push failed: ${msg}`);\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_PUSH_FAILED\",\n message: `Push failed: ${msg}`,\n warnings: [],\n data: { commsDir },\n };\n }\n}\n\nexport async function commsCommand(args: string[]): Promise<CommandResult> {\n const subcommand = args[0];\n\n if (!subcommand || subcommand === \"--help\" || subcommand === \"-h\") {\n log(COMMS_HELP);\n return {\n ok: true,\n command: \"comms\",\n code: \"TAP_NO_OP\",\n message: COMMS_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n // --comms-dir flag > config (shared/local/env) > auto-default\n const commsDir = resolveCommsDirFromArgs(args, repoRoot);\n\n switch (subcommand) {\n case \"pull\":\n return commsPull(commsDir);\n case \"push\":\n return commsPush(commsDir);\n default:\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Unknown comms subcommand: ${subcommand}. Use pull or push.`,\n warnings: [],\n data: {},\n };\n }\n}\n","import { bridgeCommand } from \"./bridge.js\";\nimport { log, logHeader, parseArgs, parseIntFlag } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst WATCH_HELP = `\nUsage:\n tap watch [options]\n\nDescription:\n Monitor all bridges and auto-restart stuck/stale ones.\n Single-pass by default. Use --loop for continuous monitoring.\n\nOptions:\n --stuck-threshold <seconds> Turn stuck threshold (default: 300)\n --interval <seconds> Loop interval (default: 60)\n --loop Run continuously instead of single-pass\n --max-rounds <n> Max loop iterations (default: unlimited)\n\nExamples:\n npx @hua-labs/tap watch # single check\n npx @hua-labs/tap watch --loop # continuous\n npx @hua-labs/tap watch --loop --interval 30 # check every 30s\n npx @hua-labs/tap watch --stuck-threshold 120 # 2 min threshold\n`.trim();\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function watchCommand(args: string[]): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(WATCH_HELP);\n return {\n ok: true,\n command: \"watch\",\n code: \"TAP_NO_OP\",\n message: WATCH_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const stuckThresholdStr =\n typeof flags[\"stuck-threshold\"] === \"string\"\n ? flags[\"stuck-threshold\"]\n : undefined;\n const intervalStr =\n typeof flags[\"interval\"] === \"string\" ? flags[\"interval\"] : undefined;\n const loop = flags[\"loop\"] === true;\n const maxRoundsStr =\n typeof flags[\"max-rounds\"] === \"string\" ? flags[\"max-rounds\"] : undefined;\n\n let stuckThreshold: number;\n let interval: number;\n let maxRounds: number | null;\n try {\n stuckThreshold =\n parseIntFlag(stuckThresholdStr, \"--stuck-threshold\", 30, 3600) ?? 300;\n interval = parseIntFlag(intervalStr, \"--interval\", 5, 3600) ?? 60;\n maxRounds = parseIntFlag(maxRoundsStr, \"--max-rounds\", 1, 10000) ?? null;\n } catch (err) {\n return {\n ok: false,\n command: \"watch\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: err instanceof Error ? err.message : String(err),\n warnings: [],\n data: {},\n };\n }\n\n // Build bridge watch args\n const bridgeArgs = [\"watch\", \"--stuck-threshold\", String(stuckThreshold)];\n\n if (!loop) {\n // Single-pass mode\n return bridgeCommand(bridgeArgs);\n }\n\n // Loop mode\n logHeader(\"@hua-labs/tap watch (loop mode)\");\n log(`Interval: ${interval}s, Stuck threshold: ${stuckThreshold}s`);\n if (maxRounds != null) {\n log(`Max rounds: ${maxRounds}`);\n }\n log(\"\");\n\n let round = 0;\n let failedRounds = 0;\n const allRestarted: string[] = [];\n const allWarnings: string[] = [];\n while (maxRounds == null || round < maxRounds) {\n round++;\n const timestamp = new Date().toISOString().slice(11, 19);\n log(`[${timestamp}] Round ${round}`);\n\n const result = await bridgeCommand(bridgeArgs);\n\n if (!result.ok) {\n failedRounds++;\n allWarnings.push(`Round ${round}: ${result.message}`);\n }\n\n if (result.data?.restarted) {\n const restarted = result.data.restarted as string[];\n allRestarted.push(...restarted);\n }\n if (result.warnings?.length) {\n allWarnings.push(...result.warnings);\n }\n\n if (maxRounds != null && round >= maxRounds) break;\n\n await delay(interval * 1000);\n }\n\n const allOk = failedRounds === 0;\n const message = [\n `Completed ${round} round(s)`,\n failedRounds > 0 ? `${failedRounds} failed` : null,\n allRestarted.length > 0\n ? `Total restarts: ${allRestarted.length} (${allRestarted.join(\", \")})`\n : \"No restarts needed\",\n ]\n .filter(Boolean)\n .join(\". \");\n\n return {\n ok: allOk,\n command: \"watch\",\n code: !allOk\n ? \"TAP_WATCH_FAILED\"\n : allRestarted.length > 0\n ? \"TAP_WATCH_RESTARTED\"\n : \"TAP_WATCH_OK\",\n message,\n warnings: allWarnings,\n data: { rounds: round, restarted: allRestarted },\n };\n}\n","import * as http from \"node:http\";\nimport { collectDashboardSnapshot } from \"../engine/dashboard.js\";\nimport { getTurnInfo } from \"../engine/bridge.js\";\nimport { parseMissionsFile } from \"../engine/missions.js\";\nimport { fetchPrs } from \"../engine/pull-requests.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { loadState } from \"../state.js\";\nimport {\n findRepoRoot,\n log,\n logHeader,\n logSuccess,\n parseArgs,\n parseIntFlag,\n} from \"../utils.js\";\nimport type { CommandResult, InstanceId } from \"../types.js\";\n\nconst GUI_HELP = `\nUsage:\n tap gui [options]\n\nDescription:\n Start a local web dashboard showing bridge status, agents, and turn info.\n\nOptions:\n --port <n> Dashboard port (default: 3847)\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap gui\n npx @hua-labs/tap gui --port 8080\n`.trim();\n\n/** Escape HTML special characters to prevent XSS */\nfunction esc(str: string | null | undefined): string {\n if (!str) return \"-\";\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction buildHtml(\n snapshot: ReturnType<typeof collectDashboardSnapshot>,\n turnData: Record<string, unknown>,\n): string {\n const agentRows = snapshot.agents\n .map(\n (a) =>\n `<tr><td>${esc(a.name)}</td><td class=\"${a.status === \"active\" ? \"ok\" : \"warn\"}\">${esc(a.status)}</td><td>${a.lastActivity ? esc(new Date(a.lastActivity).toLocaleTimeString()) : \"-\"}</td></tr>`,\n )\n .join(\"\\n\");\n\n const bridgeRows = snapshot.bridges\n .map((b) => {\n const turn = turnData[b.instanceId] as {\n activeTurnId?: string;\n stuck?: boolean;\n ageSeconds?: number;\n } | null;\n const turnCell = turn?.activeTurnId\n ? `<span class=\"${turn.stuck ? \"stuck\" : \"ok\"}\">${esc(turn.activeTurnId.slice(0, 8))}... ${turn.stuck ? \"⚠ STUCK\" : \"\"} ${turn.ageSeconds != null ? `(${turn.ageSeconds}s)` : \"\"}</span>`\n : \"-\";\n const statusClass =\n b.status === \"running\" ? \"ok\" : b.status === \"stale\" ? \"stuck\" : \"off\";\n return `<tr><td>${esc(b.instanceId)}</td><td>${esc(b.runtime)}</td><td class=\"${statusClass}\">${esc(b.status)}</td><td>${b.pid ?? \"-\"}</td><td>${b.port ?? \"-\"}</td><td>${b.heartbeatAge != null ? `${b.heartbeatAge}s ago` : \"-\"}</td><td>${turnCell}</td></tr>`;\n })\n .join(\"\\n\");\n\n const warningRows = snapshot.warnings\n .map(\n (w) =>\n `<tr><td class=\"warn\">${esc(w.level)}</td><td>${esc(w.message)}</td></tr>`,\n )\n .join(\"\\n\");\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>tap dashboard</title>\n<style>\n body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; margin: 0; padding: 20px; }\n h1 { color: #58a6ff; font-size: 1.4em; }\n h2 { color: #8b949e; font-size: 1.1em; margin-top: 24px; }\n table { border-collapse: collapse; width: 100%; margin: 8px 0; }\n th, td { text-align: left; padding: 6px 12px; border-bottom: 1px solid #21262d; }\n th { color: #8b949e; font-size: 0.85em; text-transform: uppercase; }\n .ok { color: #3fb950; }\n .warn { color: #d29922; }\n .stuck { color: #f85149; font-weight: bold; }\n .off { color: #8b949e; }\n .meta { color: #8b949e; font-size: 0.85em; }\n .refresh { color: #8b949e; font-size: 0.8em; margin-top: 16px; }\n</style>\n</head>\n<body>\n<h1>tap dashboard</h1>\n<p class=\"meta\">${esc(snapshot.generatedAt)} &middot; ${esc(snapshot.repoRoot)}</p>\n\n<h2>Agents</h2>\n<table>\n<tr><th>Name</th><th>Status</th><th>Last Activity</th></tr>\n${agentRows || '<tr><td colspan=\"3\" class=\"off\">No agents</td></tr>'}\n</table>\n\n<h2>Bridges</h2>\n<table>\n<tr><th>Instance</th><th>Runtime</th><th>Status</th><th>PID</th><th>Port</th><th>Heartbeat</th><th>Turn</th></tr>\n${bridgeRows || '<tr><td colspan=\"7\" class=\"off\">No bridges</td></tr>'}\n</table>\n\n${warningRows ? `<h2>Warnings</h2><table><tr><th>Level</th><th>Message</th></tr>${warningRows}</table>` : \"\"}\n\n<p class=\"refresh\" id=\"status\">Connecting to live updates...</p>\n<script>\nconst es = new EventSource('/api/events');\nconst statusEl = document.getElementById('status');\nlet lastReloadAt = Date.now();\nes.onmessage = (e) => {\n statusEl.textContent = 'Live — updated ' + new Date().toLocaleTimeString();\n statusEl.style.color = '#3fb950';\n const elapsed = Date.now() - lastReloadAt;\n if (elapsed >= 9000) { lastReloadAt = Date.now(); location.reload(); }\n};\nes.onerror = () => {\n statusEl.textContent = 'Disconnected — will retry...';\n statusEl.style.color = '#f85149';\n};\n</script>\n<p class=\"refresh\"><a href=\"/missions\" style=\"color:#58a6ff;\">Mission Kanban</a> &middot; <a href=\"/prs\" style=\"color:#58a6ff;\">PR Board</a></p>\n</body>\n</html>`;\n}\n\nfunction buildMissionsHtml(repoRoot: string): string {\n const missions = parseMissionsFile(repoRoot);\n\n const byStatus = {\n active: missions.filter((m) => m.status === \"active\"),\n planned: missions.filter((m) => m.status === \"planned\"),\n completed: missions.filter((m) => m.status === \"completed\"),\n };\n\n function card(m: ReturnType<typeof parseMissionsFile>[number]): string {\n return `<div class=\"card\">\n <div class=\"card-id\">${esc(m.id)}</div>\n <div class=\"card-title\">${esc(m.title)}</div>\n ${m.owner ? `<div class=\"card-meta\">Owner: ${esc(m.owner)}</div>` : \"\"}\n ${m.branch ? `<div class=\"card-meta card-branch\">${esc(m.branch)}</div>` : \"\"}\n</div>`;\n }\n\n function column(\n label: string,\n headerClass: string,\n items: ReturnType<typeof parseMissionsFile>,\n ): string {\n return `<div class=\"column\">\n <div class=\"col-header ${headerClass}\">${label} <span class=\"badge\">${items.length}</span></div>\n <div class=\"col-body\">\n ${items.length ? items.map(card).join(\"\\n \") : '<div class=\"empty\">No missions</div>'}\n </div>\n</div>`;\n }\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>tap — mission kanban</title>\n<meta http-equiv=\"refresh\" content=\"30\">\n<style>\n body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; margin: 0; padding: 20px; }\n h1 { color: #58a6ff; font-size: 1.4em; }\n a { color: #58a6ff; text-decoration: none; }\n a:hover { text-decoration: underline; }\n .meta { color: #8b949e; font-size: 0.85em; }\n .refresh { color: #8b949e; font-size: 0.8em; margin-top: 16px; }\n .board { display: flex; gap: 16px; margin-top: 16px; align-items: flex-start; flex-wrap: wrap; }\n .column { flex: 1; min-width: 240px; background: #161b22; border: 1px solid #21262d; border-radius: 6px; overflow: hidden; }\n .col-header { padding: 10px 14px; font-size: 0.85em; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; display: flex; justify-content: space-between; align-items: center; }\n .col-header.active { color: #3fb950; border-bottom: 2px solid #3fb950; }\n .col-header.planned { color: #d29922; border-bottom: 2px solid #d29922; }\n .col-header.completed { color: #8b949e; border-bottom: 2px solid #8b949e; }\n .badge { background: #21262d; color: #c9d1d9; border-radius: 10px; padding: 1px 7px; font-size: 0.8em; }\n .col-body { padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n .card { background: #0d1117; border: 1px solid #21262d; border-radius: 4px; padding: 10px 12px; }\n .card-id { font-size: 0.75em; color: #58a6ff; font-weight: 600; margin-bottom: 4px; }\n .card-title { font-size: 0.9em; color: #e6edf3; line-height: 1.4; }\n .card-meta { font-size: 0.75em; color: #8b949e; margin-top: 4px; }\n .card-branch { font-family: ui-monospace, monospace; color: #6e7681; }\n .empty { color: #6e7681; font-size: 0.85em; padding: 8px 4px; }\n</style>\n</head>\n<body>\n<h1>mission kanban</h1>\n<p class=\"meta\"><a href=\"/\">&larr; Dashboard</a> &middot; ${esc(repoRoot)}</p>\n<div class=\"board\">\n ${column(\"Active\", \"active\", byStatus.active)}\n ${column(\"Planned\", \"planned\", byStatus.planned)}\n ${column(\"Completed\", \"completed\", byStatus.completed)}\n</div>\n<p class=\"refresh\">Auto-refresh every 30s</p>\n</body>\n</html>`;\n}\n\nfunction buildPrsHtml(repoRoot: string): string {\n const { open, merged } = fetchPrs(repoRoot);\n\n function prRow(pr: ReturnType<typeof fetchPrs>[\"open\"][number]): string {\n return `<tr>\n <td><a href=\"${esc(pr.url)}\" target=\"_blank\" rel=\"noopener\" style=\"color:#58a6ff;\">#${pr.number}</a></td>\n <td>${esc(pr.title)}</td>\n <td>${esc(pr.author)}</td>\n <td class=\"branch\">${esc(pr.branch)}</td>\n</tr>`;\n }\n\n const openRows = open.map(prRow).join(\"\\n\");\n const mergedRows = merged\n .map(\n (pr) =>\n `<tr>\n <td><a href=\"${esc(pr.url)}\" target=\"_blank\" rel=\"noopener\" style=\"color:#58a6ff;\">#${pr.number}</a></td>\n <td>${esc(pr.title)}</td>\n <td>${esc(pr.author)}</td>\n</tr>`,\n )\n .join(\"\\n\");\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>tap — pr board</title>\n<meta http-equiv=\"refresh\" content=\"60\">\n<style>\n body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; margin: 0; padding: 20px; }\n h1 { color: #58a6ff; font-size: 1.4em; }\n h2 { color: #8b949e; font-size: 1.1em; margin-top: 24px; }\n a { color: #58a6ff; text-decoration: none; }\n a:hover { text-decoration: underline; }\n table { border-collapse: collapse; width: 100%; margin: 8px 0; }\n th, td { text-align: left; padding: 6px 12px; border-bottom: 1px solid #21262d; }\n th { color: #8b949e; font-size: 0.85em; text-transform: uppercase; }\n .branch { font-family: ui-monospace, monospace; font-size: 0.85em; color: #6e7681; }\n .meta { color: #8b949e; font-size: 0.85em; }\n .refresh { color: #8b949e; font-size: 0.8em; margin-top: 16px; }\n .off { color: #8b949e; }\n</style>\n</head>\n<body>\n<h1>pr board</h1>\n<p class=\"meta\"><a href=\"/\">&larr; Dashboard</a> &middot; ${esc(repoRoot)}</p>\n\n<h2>Open PRs <span style=\"color:#3fb950;\">(${open.length})</span></h2>\n<table>\n<tr><th>#</th><th>Title</th><th>Author</th><th>Branch</th></tr>\n${openRows || '<tr><td colspan=\"4\" class=\"off\">No open PRs</td></tr>'}\n</table>\n\n<h2>Recently Merged <span style=\"color:#8b949e;\">(${merged.length})</span></h2>\n<table>\n<tr><th>#</th><th>Title</th><th>Author</th></tr>\n${mergedRows || '<tr><td colspan=\"3\" class=\"off\">No merged PRs</td></tr>'}\n</table>\n\n<p class=\"refresh\">Auto-refresh every 60s</p>\n</body>\n</html>`;\n}\n\nexport async function guiCommand(args: string[]): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(GUI_HELP);\n return {\n ok: true,\n command: \"gui\",\n code: \"TAP_NO_OP\",\n message: GUI_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const portStr = typeof flags[\"port\"] === \"string\" ? flags[\"port\"] : undefined;\n let port: number;\n try {\n port = parseIntFlag(portStr, \"--port\", 1024, 65535) ?? 3847;\n } catch (err) {\n return {\n ok: false,\n command: \"gui\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: err instanceof Error ? err.message : String(err),\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n\n const server = http.createServer((req, res) => {\n const snapshot = collectDashboardSnapshot(repoRoot);\n\n // Collect turn info for each bridge\n const state = loadState(repoRoot);\n const { config } = resolveConfig({}, repoRoot);\n const turnData: Record<string, unknown> = {};\n if (state) {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (!inst?.installed || inst.bridgeMode !== \"app-server\") continue;\n turnData[id] = getTurnInfo(config.stateDir, id as InstanceId);\n }\n }\n\n const jsonHeaders = {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n };\n\n if (req.url === \"/api/snapshot\") {\n res.writeHead(200, jsonHeaders);\n res.end(JSON.stringify({ ...snapshot, turns: turnData }, null, 2));\n return;\n }\n\n // SSE endpoint — push updates every 5 seconds\n if (req.url === \"/api/events\") {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n const sendEvent = () => {\n const s = collectDashboardSnapshot(repoRoot);\n const st = loadState(repoRoot);\n const cfg = resolveConfig({}, repoRoot).config;\n const td: Record<string, unknown> = {};\n if (st) {\n for (const [id, inst] of Object.entries(st.instances)) {\n if (!inst?.installed || inst.bridgeMode !== \"app-server\") continue;\n td[id] = getTurnInfo(cfg.stateDir, id as InstanceId);\n }\n }\n res.write(`data: ${JSON.stringify({ ...s, turns: td })}\\n\\n`);\n };\n\n sendEvent();\n const interval = setInterval(sendEvent, 5000);\n req.on(\"close\", () => clearInterval(interval));\n return;\n }\n\n if (req.url === \"/api/missions\") {\n const missions = parseMissionsFile(repoRoot);\n res.writeHead(200, jsonHeaders);\n res.end(JSON.stringify(missions, null, 2));\n return;\n }\n\n if (req.url === \"/missions\") {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(buildMissionsHtml(repoRoot));\n return;\n }\n\n if (req.url === \"/api/prs\") {\n const prs = fetchPrs(repoRoot);\n res.writeHead(200, jsonHeaders);\n res.end(JSON.stringify(prs, null, 2));\n return;\n }\n\n if (req.url === \"/prs\") {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(buildPrsHtml(repoRoot));\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(buildHtml(snapshot, turnData));\n });\n\n return new Promise<CommandResult>((resolve) => {\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n resolve({\n ok: false,\n command: \"gui\",\n code: \"TAP_PORT_IN_USE\",\n message: `Port ${port} is already in use. Try: tap gui --port <other>`,\n warnings: [],\n data: {},\n });\n } else {\n resolve({\n ok: false,\n command: \"gui\",\n code: \"TAP_GUI_ERROR\",\n message: err.message,\n warnings: [],\n data: {},\n });\n }\n });\n\n server.listen(port, \"127.0.0.1\", () => {\n logHeader(\"tap gui dashboard\");\n logSuccess(`Dashboard: http://127.0.0.1:${port}`);\n log(`API: http://127.0.0.1:${port}/api/snapshot`);\n log(\"Press Ctrl+C to stop\");\n });\n });\n}\n","/**\n * Mission kanban engine.\n * Parses docs/missions/MISSIONS.md into structured Mission objects.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport interface Mission {\n id: string;\n title: string;\n branch: string | null;\n status: \"active\" | \"planned\" | \"completed\";\n owner: string | null;\n}\n\n// ─── Status mapping ─────────────────────────────────────────────\n\nfunction parseStatus(raw: string): Mission[\"status\"] {\n const trimmed = raw.trim();\n if (trimmed.includes(\"active\")) return \"active\";\n if (trimmed.includes(\"completed\")) return \"completed\";\n return \"planned\";\n}\n\n// ─── Row parser ─────────────────────────────────────────────────\n\n/**\n * Parse a single markdown table row into a Mission, or return null if the\n * row is not a valid mission row (header, separator, empty, etc.).\n */\nfunction parseRow(line: string): Mission | null {\n // Must start and end with a pipe\n if (!line.startsWith(\"|\") || !line.endsWith(\"|\")) return null;\n\n // Split by pipe, discard first/last empty segments\n const cells = line\n .split(\"|\")\n .slice(1, -1)\n .map((c) => c.trim());\n\n if (cells.length < 4) return null;\n\n const [idCell, missionCell, branchCell, statusCell, ownerCell] = cells;\n\n // Skip separator rows (contain only dashes/spaces)\n if (/^[-: ]+$/.test(idCell ?? \"\")) return null;\n\n // Skip rows with no real ID (e.g. \"—\" or empty)\n const id = (idCell ?? \"\").replace(/[^\\w]/g, \"\");\n if (!id || !/^M\\d+$/i.test(id)) return null;\n\n // Extract title from markdown link [Title](./file.md) or plain text\n const titleMatch = missionCell?.match(/\\[([^\\]]+)\\]/);\n const title = titleMatch ? titleMatch[1] : (missionCell ?? \"\").trim();\n if (!title) return null;\n\n // Extract branch from backtick-wrapped value or \"—\"\n const branchMatch = branchCell?.match(/`([^`]+)`/);\n const branch = branchMatch ? branchMatch[1] : null;\n\n const status = parseStatus(statusCell ?? \"\");\n\n // Owner — strip leading/trailing whitespace, treat \"—\" or \"미배정\" as null\n const rawOwner = (ownerCell ?? \"\").trim();\n const owner =\n rawOwner === \"\" || rawOwner === \"—\" || rawOwner === \"미배정\"\n ? null\n : rawOwner;\n\n return { id: id.toUpperCase(), title, branch, status, owner };\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/**\n * Read and parse docs/missions/MISSIONS.md from the given repo root.\n * Returns an empty array if the file does not exist.\n */\nexport function parseMissionsFile(repoRoot: string): Mission[] {\n const missionsPath = path.join(repoRoot, \"docs\", \"missions\", \"MISSIONS.md\");\n\n let content: string;\n try {\n content = fs.readFileSync(missionsPath, \"utf-8\");\n } catch {\n return [];\n }\n\n const missions: Mission[] = [];\n\n for (const line of content.split(\"\\n\")) {\n const mission = parseRow(line);\n if (!mission) continue;\n missions.push(mission);\n }\n\n return missions;\n}\n","/**\n * Pull request board engine.\n * Uses `gh pr list` to fetch open and recently merged PRs.\n */\n\nimport { spawnSync } from \"node:child_process\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport interface PullRequest {\n number: number;\n title: string;\n state: \"open\" | \"merged\" | \"closed\";\n author: string;\n branch: string;\n url: string;\n mergedAt: string | null;\n}\n\nexport interface PrBoard {\n open: PullRequest[];\n merged: PullRequest[];\n}\n\n// ─── gh helpers ─────────────────────────────────────────────────\n\ninterface GhPrEntry {\n number: number;\n title: string;\n state: string;\n author: { login: string };\n headRefName: string;\n url: string;\n mergedAt: string | null;\n}\n\nfunction runGhPrList(\n repoRoot: string,\n extraArgs: string[],\n): GhPrEntry[] | null {\n try {\n const result = spawnSync(\n \"gh\",\n [\n \"pr\",\n \"list\",\n \"--json\",\n \"number,title,state,author,headRefName,url,mergedAt\",\n ...extraArgs,\n ],\n { cwd: repoRoot, encoding: \"utf-8\", timeout: 10_000 },\n );\n\n if (result.error || result.status !== 0) return null;\n\n const raw = result.stdout.trim();\n if (!raw) return null;\n\n return JSON.parse(raw) as GhPrEntry[];\n } catch {\n return null;\n }\n}\n\nfunction mapEntry(entry: GhPrEntry): PullRequest {\n const state = entry.state?.toLowerCase();\n return {\n number: entry.number,\n title: entry.title ?? \"\",\n state:\n state === \"merged\" ? \"merged\" : state === \"closed\" ? \"closed\" : \"open\",\n author: entry.author?.login ?? \"\",\n branch: entry.headRefName ?? \"\",\n url: entry.url ?? \"\",\n mergedAt: entry.mergedAt ?? null,\n };\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/**\n * Fetch open PRs from the repository.\n * Returns an empty array if `gh` is unavailable or the command fails.\n */\nexport function fetchOpenPrs(repoRoot: string): PullRequest[] {\n const entries = runGhPrList(repoRoot, [\"--limit\", \"50\"]);\n if (!entries) return [];\n return entries.map(mapEntry);\n}\n\n/**\n * Fetch recently merged PRs from the repository.\n * Returns an empty array if `gh` is unavailable or the command fails.\n */\nexport function fetchMergedPrs(\n repoRoot: string,\n limit: number = 20,\n): PullRequest[] {\n const entries = runGhPrList(repoRoot, [\n \"--state\",\n \"merged\",\n \"--limit\",\n String(limit),\n ]);\n if (!entries) return [];\n return entries\n .map(mapEntry)\n .sort((a, b) => {\n if (!a.mergedAt || !b.mergedAt) return 0;\n return new Date(b.mergedAt).getTime() - new Date(a.mergedAt).getTime();\n });\n}\n\n/**\n * Fetch both open and recently merged PRs.\n * Returns empty arrays if `gh` is unavailable.\n */\nexport function fetchPrs(repoRoot: string): PrBoard {\n return {\n open: fetchOpenPrs(repoRoot),\n merged: fetchMergedPrs(repoRoot),\n };\n}\n","import type { CommandResult } from \"./types.js\";\nimport { logSuccess, logWarn, logError, wasWarningLogged } from \"./utils.js\";\n\n/**\n * Emit a CommandResult to stdout.\n * --json mode: single JSON object.\n * Human mode: formatted log messages.\n */\nexport function emitResult(result: CommandResult, jsonMode: boolean): void {\n if (jsonMode) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Human mode\n if (result.ok) {\n logSuccess(result.message);\n } else {\n logError(result.message);\n }\n\n const emittedWarnings = new Set<string>();\n for (const w of result.warnings) {\n if (emittedWarnings.has(w) || wasWarningLogged(w)) {\n continue;\n }\n emittedWarnings.add(w);\n logWarn(w);\n }\n}\n\n/**\n * Determine exit code from CommandResult.\n * 0 = ok:true, 1 = ok:false\n */\nexport function exitCode(result: CommandResult): number {\n return result.ok ? 0 : 1;\n}\n\n/**\n * Check if --json flag is present in args.\n * Removes it from the array and returns the flag state.\n */\nexport function extractJsonFlag(args: string[]): {\n jsonMode: boolean;\n cleanArgs: string[];\n} {\n const jsonMode = args.includes(\"--json\");\n const cleanArgs = args.filter((a) => a !== \"--json\");\n return { jsonMode, cleanArgs };\n}\n","/**\n * Command suggestion utilities for the tap CLI.\n * Extracted for testability.\n */\n\nexport const COMMANDS = [\n \"init\",\n \"init-worktree\",\n \"add\",\n \"remove\",\n \"status\",\n \"bridge\",\n \"up\",\n \"down\",\n \"comms\",\n \"dashboard\",\n \"doctor\",\n \"serve\",\n \"version\",\n] as const;\n\nexport function suggestCommand(input: string): string | null {\n let best: string | null = null;\n let bestDist = Infinity;\n for (const cmd of COMMANDS) {\n const d = levenshtein(input.toLowerCase(), cmd);\n if (d < bestDist && d <= Math.max(2, Math.floor(cmd.length / 2))) {\n bestDist = d;\n best = cmd;\n }\n }\n return best;\n}\n\nexport function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n Array.from<number>({ length: n + 1 }).fill(0),\n );\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n","import { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { removeCommand } from \"./commands/remove.js\";\nimport { bridgeCommand } from \"./commands/bridge.js\";\nimport { upCommand } from \"./commands/up.js\";\nimport { downCommand } from \"./commands/down.js\";\nimport { serveCommand } from \"./commands/serve.js\";\nimport { initWorktreeCommand } from \"./commands/init-worktree.js\";\nimport { dashboardCommand } from \"./commands/dashboard.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { commsCommand } from \"./commands/comms.js\";\nimport { watchCommand } from \"./commands/watch.js\";\nimport { guiCommand } from \"./commands/gui.js\";\nimport { version } from \"./version.js\";\nimport { extractJsonFlag, emitResult, exitCode } from \"./output.js\";\nimport { resetLoggedWarnings, setJsonMode } from \"./utils.js\";\nimport { suggestCommand } from \"./cli-suggest.js\";\nimport type { CommandName, CommandResult } from \"./types.js\";\n\nconst HELP = `\n@hua-labs/tap — Cross-model AI agent communication setup\n\nUsage:\n tap <command> [options]\n\nCommands:\n init Initialize comms directory and state\n init-worktree Set up a new git worktree with tap\n add <runtime> Add a runtime instance (claude, codex, gemini)\n remove <instance> Remove an instance and rollback config\n status Show installed instances and bridge status\n bridge <sub> [inst] Manage bridges (start, stop, status)\n up Start all registered bridge daemons\n down Stop all running bridge daemons\n comms <pull|push> Sync comms directory with remote repo\n dashboard Show unified ops dashboard\n watch Monitor bridges and auto-restart stuck ones\n gui Start local web dashboard (http)\n doctor Diagnose tap infrastructure health\n serve Start tap MCP server (stdio)\n version Show version\n\nOptions:\n --help, -h Show help\n --json Machine-readable JSON output\n --comms-dir <path> Override comms directory path\n\nExamples:\n npx @hua-labs/tap init\n npx @hua-labs/tap init-worktree --path ../hua-wt-3 --branch feat/my-feature\n npx @hua-labs/tap add claude\n npx @hua-labs/tap add codex --name reviewer --port 4501\n npx @hua-labs/tap status\n`.trim();\n\nfunction normalizeCommandName(command: string | undefined): CommandName {\n switch (command) {\n case \"init\":\n case \"init-worktree\":\n case \"add\":\n case \"remove\":\n case \"status\":\n case \"bridge\":\n case \"up\":\n case \"down\":\n case \"comms\":\n case \"dashboard\":\n case \"doctor\":\n case \"serve\":\n case \"watch\":\n case \"gui\":\n return command;\n default:\n return \"unknown\";\n }\n}\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n const { jsonMode, cleanArgs } = extractJsonFlag(rawArgs);\n resetLoggedWarnings();\n setJsonMode(jsonMode);\n const command = cleanArgs[0];\n\n if (!command || command === \"--help\" || command === \"-h\") {\n if (jsonMode) {\n console.log(JSON.stringify({ help: HELP }));\n } else {\n console.log(HELP);\n }\n process.exit(0);\n }\n\n if (command === \"version\" || command === \"--version\" || command === \"-v\") {\n if (jsonMode) {\n console.log(JSON.stringify({ version }));\n } else {\n console.log(`@hua-labs/tap v${version}`);\n }\n process.exit(0);\n }\n\n const commandArgs = cleanArgs.slice(1);\n let result: CommandResult;\n\n try {\n switch (command) {\n case \"init\":\n result = await initCommand(commandArgs);\n break;\n case \"init-worktree\":\n result = await initWorktreeCommand(commandArgs);\n break;\n case \"add\":\n result = await addCommand(commandArgs);\n break;\n case \"remove\":\n result = await removeCommand(commandArgs);\n break;\n case \"status\":\n result = await statusCommand(commandArgs);\n break;\n case \"bridge\":\n result = await bridgeCommand(commandArgs);\n break;\n case \"up\":\n result = await upCommand(commandArgs);\n break;\n case \"down\":\n result = await downCommand(commandArgs);\n break;\n case \"comms\":\n result = await commsCommand(commandArgs);\n break;\n case \"dashboard\":\n result = await dashboardCommand(commandArgs);\n break;\n case \"doctor\":\n result = await doctorCommand(commandArgs);\n break;\n case \"watch\":\n result = await watchCommand(commandArgs);\n break;\n case \"gui\":\n result = await guiCommand(commandArgs);\n break;\n case \"serve\": {\n // serve takes over stdio for MCP protocol — don't emit result on stdout\n const serveResult = await serveCommand(commandArgs);\n if (!serveResult.ok || serveResult.code === \"TAP_NO_OP\") {\n // Emit on error OR help (help returns ok+TAP_NO_OP but needs output)\n emitResult(serveResult, jsonMode);\n }\n process.exit(exitCode(serveResult));\n break;\n }\n default: {\n const suggestion = suggestCommand(command);\n const hint = suggestion\n ? `\\n\\nDid you mean: tap ${suggestion}?`\n : \"\\n\\nRun tap --help for a list of commands.\";\n result = {\n ok: false,\n command: \"unknown\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Unknown command: ${command}${hint}`,\n warnings: [],\n data: { requestedCommand: command, suggestion },\n };\n break;\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n result = {\n ok: false,\n command: normalizeCommandName(command),\n code: \"TAP_INTERNAL_ERROR\",\n message,\n warnings: [],\n data: command ? { requestedCommand: command } : {},\n };\n }\n\n emitResult(result, jsonMode);\n process.exit(exitCode(result));\n}\n\nmain();\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","findRepoRoot","basename","fs","path","fs","path","tmp","fs","path","fs","os","path","spawnSync","fileURLToPath","version","fs","path","fileURLToPath","crypto","fs","path","findCodexConfigPath","canonicalizeTrustPath","fileURLToPath","fs","path","setNestedKey","path","fs","path","DEFAULT_APP_SERVER_URL","resolve","fs","path","fileURLToPath","fileURLToPath","fs","os","path","spawnSync","spawnSync","fs","spawnSync","spawnSync","execSync","spawnSync","spawnSync","execSync","fs","path","fs","fs","net","resolve","resolve","fs","path","randomBytes","fs","path","execSync","version","major","randomBytes","fs","path","DEFAULT_APP_SERVER_URL","manualCommand","pid","healthy","healthyAt","fs","path","fs","path","resolve","resolveAgentName","fs","setNestedKey","tmp","existsSync","readFileSync","renameSync","writeFileSync","path","existsSync","readFileSync","writeFileSync","renameSync","cleanupSuffix","ageStr","fs","path","execSync","execSync","path","spawn","serveCommand","spawn","resolve","fs","path","execSync","execSync","version","formatAge","run","snapshot","existsSync","mkdirSync","readdirSync","readFileSync","renameSync","statSync","unlinkSync","writeFileSync","homedir","spawnSync","dirname","join","resolve","normalizeComparablePath","resolve","findCodexConfigPath","join","homedir","canonicalizeTrustPath","trustSelector","dirname","mkdirSync","writeFileSync","renameSync","buildCodexEnvEntries","existsSync","readFileSync","readdirSync","statSync","spawnSync","unlinkSync","failures","execSync","spawnSync","fs","path","execSync","spawnSync","delay","resolve","fs","path","spawnSync","resolve"]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/config/resolve.ts","../src/permissions/presets.ts","../src/config/instance-config.ts","../src/config/drift-detector.ts","../src/config/index.ts","../src/commands/init.ts","../src/state.ts","../src/version.ts","../src/permissions.ts","../src/toml.ts","../src/commands/add.ts","../src/adapters/claude.ts","../src/adapters/common.ts","../src/adapters/codex.ts","../src/artifact-backups.ts","../src/adapters/gemini.ts","../src/adapters/index.ts","../src/engine/bridge-paths.ts","../src/engine/bridge-file-io.ts","../src/engine/bridge-port-network.ts","../src/engine/bridge-codex-command.ts","../src/engine/bridge-windows-spawn.ts","../src/engine/bridge-unix-spawn.ts","../src/engine/bridge-process-control.ts","../src/engine/bridge-config.ts","../src/engine/bridge-state.ts","../src/engine/bridge-observability.ts","../src/engine/server-lifecycle.ts","../src/engine/codex-session-state.ts","../src/engine/bridge-app-server-health.ts","../src/engine/bridge-app-server-auth.ts","../src/runtime/resolve-node.ts","../src/engine/bridge-app-server-lifecycle.ts","../src/engine/bridge-startup.ts","../src/engine/bridge-orchestrator.ts","../src/commands/status.ts","../src/commands/remove.ts","../src/engine/rollback.ts","../src/commands/bridge.ts","../src/commands/bridge-start.ts","../src/commands/bridge-helpers.ts","../src/commands/bridge-heartbeat.ts","../src/commands/bridge-stop.ts","../src/commands/bridge-watch.ts","../src/commands/bridge-status.ts","../src/commands/bridge-tui.ts","../src/commands/bridge-restart.ts","../src/engine/dashboard.ts","../src/commands/up.ts","../src/commands/down.ts","../src/commands/serve.ts","../src/commands/init-worktree.ts","../src/commands/dashboard.ts","../src/commands/doctor.ts","../src/commands/comms.ts","../src/commands/watch.ts","../src/commands/gui.ts","../src/engine/missions.ts","../src/engine/pull-requests.ts","../src/output.ts","../src/cli.ts","../src/cli-suggest.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, normalizeTapPath } 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;\nconst _loggedWarnings = new Set<string>();\n\nexport function _setNoGitWarned() {\n _noGitWarned = true;\n}\n\nexport function resetLoggedWarnings() {\n _loggedWarnings.clear();\n}\n\nexport function wasWarningLogged(message: string): boolean {\n return _loggedWarnings.has(message);\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 log(\n \"No .git directory found. Resolved tap root via package.json. \" +\n \"That's fine outside git; use --comms-dir to choose a different comms location.\",\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 log(\n \"No git repository or package.json found. Using the current directory as tap root. \" +\n \"That's fine outside git; use --comms-dir to choose a different comms location.\",\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(normalizeTapPath(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(normalizeTapPath(commsDir)),\n repoRoot: path.resolve(normalizeTapPath(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) return;\n _loggedWarnings.add(message);\n 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// ─── CLI argument validation ──────────────────────────────────\n\n/**\n * Parse and validate an integer CLI flag within a range.\n * Returns undefined if the flag is not provided, or the validated number.\n * Throws a descriptive error if invalid.\n */\nexport function parseIntFlag(\n value: string | undefined,\n name: string,\n min: number,\n max: number,\n): number | undefined {\n if (value === undefined) return undefined;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < min || parsed > max) {\n throw new RangeError(\n `Invalid ${name}: ${value}. Must be an integer between ${min} and ${max}.`,\n );\n }\n return parsed;\n}\n\n/**\n * Parse and validate a port number (1-65535).\n */\nexport function parsePortFlag(value: string | undefined): number | null {\n if (value === undefined) return null;\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65535) {\n throw new RangeError(\n `Invalid port: ${value}. Must be between 1 and 65535.`,\n );\n }\n return parsed;\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/**\n * Reject instance names containing path-traversal sequences or separators.\n * Prevents directory escape when the ID is interpolated into file paths.\n */\nexport function validateInstanceName(name: string): void {\n if (/[/\\\\]/.test(name) || name.includes(\"..\")) {\n throw new Error(\n `Invalid instance name \"${name}\": must not contain path separators or \"..\" sequences`,\n );\n }\n}\n\n/** Build an instance ID from runtime + optional name. */\nexport function buildInstanceId(\n runtime: RuntimeName,\n name?: string,\n): InstanceId {\n if (name) {\n validateInstanceName(name);\n }\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 TrackedConfigSource,\n TrackedValue,\n TapTrackedConfig,\n} from \"./types.js\";\nimport { computeConfigHash } from \"./config-hash.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, log } 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 log(\n \"No .git directory found. Resolved tap root via package.json. \" +\n \"That's fine outside git; use --comms-dir to choose a different comms location.\",\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 log(\n \"No git repository or package.json found. Using the current directory as tap root. \" +\n \"That's fine outside git; use --comms-dir to choose a different comms location.\",\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\n// ─── Instance / Session Config Loading ────────────────────────\n\n/** Subset of config fields that can be overridden per-instance or per-session. */\ninterface ResolveOverrides {\n agentName?: string | null;\n port?: number | null;\n bridgeMode?: string | null;\n commsDir?: string;\n stateDir?: string;\n runtimeCommand?: string;\n appServerUrl?: string;\n towerName?: string;\n}\n\ntype SessionOverrides = ResolveOverrides;\n\n/**\n * Verify that a resolved path stays within the expected subdirectory.\n * Prevents crafted IDs from crossing source boundaries\n * (e.g., instanceId=\"../sessions/gen22\" reading a session file as instance).\n */\nfunction assertConfigPathContained(\n resolved: string,\n baseDir: string,\n subDir: string,\n): string {\n const expectedDir = path.resolve(baseDir, subDir) + path.sep;\n const normalizedResolved = path.resolve(resolved);\n if (!normalizedResolved.startsWith(expectedDir)) {\n throw new Error(\n `Config path traversal blocked: resolved path escapes \"${subDir}/\" directory`,\n );\n }\n return normalizedResolved;\n}\n\nexport function loadInstanceConfig(\n stateDir: string,\n instanceId: string,\n): ResolveOverrides | null {\n const filePath = path.join(stateDir, \"instances\", `${instanceId}.json`);\n assertConfigPathContained(filePath, stateDir, \"instances\");\n return loadJsonFile<ResolveOverrides>(filePath);\n}\n\nexport function loadSessionConfig(\n stateDir: string,\n sessionId: string,\n): SessionOverrides | null {\n const filePath = path.join(stateDir, \"sessions\", `${sessionId}.json`);\n assertConfigPathContained(filePath, stateDir, \"sessions\");\n return loadJsonFile<SessionOverrides>(filePath);\n}\n\n// ─── Tracked Config Resolution ────────────────────────────────\n\nfunction tracked<T>(\n value: T,\n source: TrackedConfigSource,\n sourceFile: string | null = null,\n): TrackedValue<T> {\n return { value, source, sourceFile };\n}\n\nexport interface TrackedResolveOpts extends ConfigOverrides {\n instanceId?: string;\n sessionId?: string;\n}\n\n/**\n * Resolve config with full source tracking.\n * 7-level priority: cli > env > instance > session > local > project > default\n */\nexport function resolveTrackedConfig(\n opts: TrackedResolveOpts = {},\n startDir?: string,\n): { tracked: TapTrackedConfig; hash: string } {\n const repoRoot = findRepoRoot(startDir);\n const shared = loadSharedConfig(repoRoot) ?? {};\n const local = loadLocalConfig(repoRoot) ?? {};\n const legacy = loadLegacyShellConfig(repoRoot) ?? {};\n\n // Resolve stateDir first (needed for instance/session paths)\n const rawStateDir =\n opts.stateDir ??\n process.env.TAP_STATE_DIR ??\n local.stateDir ??\n shared.stateDir ??\n null;\n const stateDir = rawStateDir\n ? resolvePath(repoRoot, rawStateDir)\n : path.join(repoRoot, \".tap-comms\");\n\n // Load instance/session configs (graceful fallback)\n const inst = opts.instanceId\n ? loadInstanceConfig(stateDir, opts.instanceId)\n : null;\n const instFile = opts.instanceId\n ? path.join(stateDir, \"instances\", `${opts.instanceId}.json`)\n : null;\n const sess = opts.sessionId\n ? loadSessionConfig(stateDir, opts.sessionId)\n : null;\n const sessFile = opts.sessionId\n ? path.join(stateDir, \"sessions\", `${opts.sessionId}.json`)\n : null;\n\n // Chain resolution helper — finds first defined value from highest priority\n function resolveField<T>(\n cliVal: T | undefined,\n envVal: T | undefined,\n instVal: T | undefined,\n sessVal: T | undefined,\n localVal: T | undefined,\n projectVal: T | undefined,\n defaultVal: T,\n ): TrackedValue<T> {\n if (cliVal !== undefined) return tracked(cliVal, \"cli\");\n if (envVal !== undefined) return tracked(envVal, \"env\");\n if (instVal !== undefined) return tracked(instVal, \"instance\", instFile);\n if (sessVal !== undefined) return tracked(sessVal, \"session\", sessFile);\n if (localVal !== undefined)\n return tracked(localVal, \"local\", path.join(repoRoot, LOCAL_CONFIG_FILE));\n if (projectVal !== undefined)\n return tracked(\n projectVal,\n \"project\",\n path.join(repoRoot, SHARED_CONFIG_FILE),\n );\n return tracked(defaultVal, \"default\");\n }\n\n const commsDirTracked = resolveField(\n opts.commsDir ? resolvePath(repoRoot, opts.commsDir) : undefined,\n process.env.TAP_COMMS_DIR\n ? resolvePath(repoRoot, process.env.TAP_COMMS_DIR)\n : undefined,\n inst?.commsDir ? resolvePath(repoRoot, inst.commsDir) : undefined,\n sess?.commsDir ? resolvePath(repoRoot, sess.commsDir) : undefined,\n local.commsDir ? resolvePath(repoRoot, local.commsDir) : undefined,\n (shared.commsDir ?? legacy.commsDir)\n ? resolvePath(repoRoot, (shared.commsDir ?? legacy.commsDir)!)\n : undefined,\n path.join(repoRoot, \"tap-comms\"),\n );\n\n const stateDirTracked = resolveField(\n opts.stateDir ? resolvePath(repoRoot, opts.stateDir) : undefined,\n process.env.TAP_STATE_DIR\n ? resolvePath(repoRoot, process.env.TAP_STATE_DIR)\n : undefined,\n inst?.stateDir ? resolvePath(repoRoot, inst.stateDir) : undefined,\n sess?.stateDir ? resolvePath(repoRoot, sess.stateDir) : undefined,\n local.stateDir ? resolvePath(repoRoot, local.stateDir) : undefined,\n shared.stateDir ? resolvePath(repoRoot, shared.stateDir) : undefined,\n stateDir,\n );\n\n const runtimeCommandTracked = resolveField(\n opts.runtimeCommand,\n process.env.TAP_RUNTIME_COMMAND,\n inst?.runtimeCommand,\n sess?.runtimeCommand,\n local.runtimeCommand,\n shared.runtimeCommand,\n DEFAULT_RUNTIME_COMMAND,\n );\n\n const appServerUrlTracked = resolveField(\n opts.appServerUrl,\n process.env.TAP_APP_SERVER_URL,\n inst?.appServerUrl,\n sess?.appServerUrl,\n local.appServerUrl,\n shared.appServerUrl,\n DEFAULT_APP_SERVER_URL,\n );\n\n const towerNameTracked = resolveField<string | null>(\n undefined, // no CLI flag for towerName\n undefined, // no env for towerName\n inst?.towerName ?? undefined,\n sess?.towerName ?? undefined,\n local.towerName ?? undefined,\n shared.towerName ?? undefined,\n null,\n );\n\n const agentNameTracked = resolveField<string | null>(\n undefined,\n undefined,\n inst?.agentName ?? undefined,\n sess?.agentName ?? undefined,\n undefined,\n undefined,\n null,\n );\n\n const portTracked = resolveField<number | null>(\n undefined,\n undefined,\n inst?.port ?? undefined,\n sess?.port ?? undefined,\n undefined,\n undefined,\n null,\n );\n\n const bridgeModeTracked = resolveField<string | null>(\n undefined,\n undefined,\n inst?.bridgeMode ?? undefined,\n sess?.bridgeMode ?? undefined,\n undefined,\n undefined,\n null,\n );\n\n const trackedConfig: TapTrackedConfig = {\n repoRoot: tracked(repoRoot, \"default\"),\n commsDir: commsDirTracked,\n stateDir: stateDirTracked,\n runtimeCommand: runtimeCommandTracked,\n appServerUrl: appServerUrlTracked,\n towerName: towerNameTracked,\n agentName: agentNameTracked,\n port: portTracked,\n bridgeMode: bridgeModeTracked,\n };\n\n return { tracked: trackedConfig, hash: computeConfigHash(trackedConfig) };\n}\n\nexport function 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","import type { AgentRole, AgentPermission } from \"./types.js\";\n\n/**\n * Default permission presets per role.\n * These define the starting point — can be customized per instance.\n */\nexport const ROLE_PRESETS: Record<\n AgentRole,\n Omit<AgentPermission, \"agentId\">\n> = {\n tower: {\n role: \"tower\",\n mode: \"full-access\",\n allowedTools: [\"*\"],\n deniedTools: [],\n allowedPaths: [\"**\"],\n escalateTo: null,\n },\n implementer: {\n role: \"implementer\",\n mode: \"workspace-write\",\n allowedTools: [\n \"Read\",\n \"Edit\",\n \"Write\",\n \"Bash\",\n \"Grep\",\n \"Glob\",\n \"mcp__tap__*\",\n ],\n deniedTools: [\"Bash(git push --force:*)\", \"Bash(git reset --hard:*)\"],\n allowedPaths: [\"packages/**\", \"apps/**\", \"docs/**\"],\n escalateTo: \"tower\",\n },\n reviewer: {\n role: \"reviewer\",\n mode: \"readonly\",\n allowedTools: [\n \"Read\",\n \"Grep\",\n \"Glob\",\n \"Bash(grep:*)\",\n \"Bash(git diff:*)\",\n \"mcp__tap__*\",\n ],\n deniedTools: [\"Edit\", \"Write\", \"Bash(rm:*)\"],\n allowedPaths: [\"hua-comms/reviews/**\"],\n escalateTo: \"tower\",\n },\n custom: {\n role: \"custom\",\n mode: \"prompt\",\n allowedTools: [],\n deniedTools: [],\n allowedPaths: [],\n escalateTo: \"tower\",\n },\n};\n\n/**\n * Create an AgentPermission from a role preset.\n */\nexport function createPermissionFromRole(role: AgentRole): AgentPermission {\n const preset = ROLE_PRESETS[role];\n return {\n ...preset,\n allowedTools: [...preset.allowedTools],\n deniedTools: [...preset.deniedTools],\n allowedPaths: [...preset.allowedPaths],\n };\n}\n\n/**\n * Valid role names for CLI validation.\n */\nexport const VALID_ROLES: AgentRole[] = [\n \"tower\",\n \"implementer\",\n \"reviewer\",\n \"custom\",\n];\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { InstanceId } from \"../types.js\";\nimport { validateInstanceName } from \"../utils.js\";\nimport type { AgentPermission, AgentRole } from \"../permissions/types.js\";\nimport { createPermissionFromRole } from \"../permissions/presets.js\";\n\n// ─── Instance Config Schema ────────────────────────────────────\n\nconst INSTANCE_CONFIG_SCHEMA_VERSION = 1;\n\nexport interface InstanceConfig {\n schemaVersion: number;\n instanceId: string;\n runtime: \"codex\" | \"claude\" | \"gemini\";\n\n // identity\n agentName: string | null;\n agentId: string | null;\n\n // network\n port: number | null;\n appServerUrl: string;\n\n // config override fields (consumed by resolveTrackedConfig)\n commsDir?: string;\n stateDir?: string;\n runtimeCommand?: string;\n bridgeMode?: string | null;\n towerName?: string;\n\n // permissions (Phase 3-1)\n permission: AgentPermission;\n\n // Codex MCP tool approval mode (M224)\n approvalMode?: \"auto\" | \"approve\";\n\n // MCP env (tap source-of-truth for runtime injection)\n mcpEnv: Record<string, string>;\n\n // meta\n configHash: string;\n lastSyncedToRuntime: string | null;\n runtimeConfigHash: string;\n createdAt: string;\n updatedAt: string;\n}\n\n// ─── Path helpers ──────────────────────────────────────────────\n\nfunction instancesDir(stateDir: string): string {\n return path.join(stateDir, \"instances\");\n}\n\nfunction instanceConfigPath(stateDir: string, instanceId: InstanceId): string {\n // Validate to prevent path traversal (M190)\n if (\n instanceId.includes(\"/\") ||\n instanceId.includes(\"\\\\\") ||\n instanceId.includes(\"..\")\n ) {\n throw new Error(\n `Invalid instanceId \"${instanceId}\": must not contain path separators or \"..\" sequences`,\n );\n }\n return path.join(instancesDir(stateDir), `${instanceId}.json`);\n}\n\n// ─── CRUD ──────────────────────────────────────────────────────\n\nexport function loadInstanceConfig(\n stateDir: string,\n instanceId: InstanceId,\n): InstanceConfig | null {\n const filePath = instanceConfigPath(stateDir, instanceId);\n if (!fs.existsSync(filePath)) return null;\n try {\n const raw = fs.readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as InstanceConfig;\n // Backfill permission for pre-M219 instance configs\n if (!parsed.permission) {\n parsed.permission = createPermissionFromRole(\"custom\");\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function saveInstanceConfig(\n stateDir: string,\n config: InstanceConfig,\n): string {\n const dir = instancesDir(stateDir);\n fs.mkdirSync(dir, { recursive: true });\n const filePath = instanceConfigPath(stateDir, config.instanceId);\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 return filePath;\n}\n\nexport function listInstanceConfigs(stateDir: string): InstanceConfig[] {\n const dir = instancesDir(stateDir);\n if (!fs.existsSync(dir)) return [];\n\n const files = fs.readdirSync(dir).filter((f) => f.endsWith(\".json\"));\n const configs: InstanceConfig[] = [];\n for (const file of files) {\n try {\n const raw = fs.readFileSync(path.join(dir, file), \"utf-8\");\n configs.push(JSON.parse(raw) as InstanceConfig);\n } catch {\n // Skip corrupted files\n }\n }\n return configs;\n}\n\nexport function deleteInstanceConfig(\n stateDir: string,\n instanceId: InstanceId,\n): boolean {\n const filePath = instanceConfigPath(stateDir, instanceId);\n if (!fs.existsSync(filePath)) return false;\n fs.unlinkSync(filePath);\n return true;\n}\n\n// ─── Factory ───────────────────────────────────────────────────\n\nexport interface CreateInstanceConfigOpts {\n instanceId: InstanceId;\n runtime: \"codex\" | \"claude\" | \"gemini\";\n agentName: string | null;\n agentId: string | null;\n port: number | null;\n appServerUrl: string;\n commsDir: string;\n stateDir: string;\n repoRoot: string;\n role?: AgentRole;\n}\n\nexport function createInstanceConfig(\n opts: CreateInstanceConfigOpts,\n): InstanceConfig {\n // Validate instanceId for path safety\n const parts = opts.instanceId.split(\"-\");\n if (parts.length > 1) {\n validateInstanceName(parts.slice(1).join(\"-\"));\n }\n\n const now = new Date().toISOString();\n const config: InstanceConfig = {\n schemaVersion: INSTANCE_CONFIG_SCHEMA_VERSION,\n instanceId: opts.instanceId,\n runtime: opts.runtime,\n agentName: opts.agentName,\n agentId: opts.agentId,\n port: opts.port,\n appServerUrl: opts.appServerUrl,\n permission: createPermissionFromRole(opts.role ?? \"custom\"),\n // Top-level overrides consumed by resolveTrackedConfig\n commsDir: opts.commsDir,\n stateDir: opts.stateDir,\n mcpEnv: {\n TAP_COMMS_DIR: opts.commsDir,\n TAP_STATE_DIR: opts.stateDir,\n TAP_REPO_ROOT: opts.repoRoot,\n TAP_AGENT_NAME: opts.agentName ?? \"<set-per-session>\",\n },\n configHash: \"\",\n lastSyncedToRuntime: null,\n runtimeConfigHash: \"\",\n createdAt: now,\n updatedAt: now,\n };\n\n // Compute hash after creation\n config.configHash = computeInstanceConfigHash(config);\n return config;\n}\n\nexport function updateInstanceConfig(\n existing: InstanceConfig,\n updates: Partial<\n Pick<InstanceConfig, \"agentName\" | \"agentId\" | \"port\" | \"appServerUrl\">\n >,\n): InstanceConfig {\n const updated: InstanceConfig = {\n ...existing,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n\n // Sync mcpEnv if agentName changed\n if (updates.agentName !== undefined) {\n updated.mcpEnv = {\n ...updated.mcpEnv,\n TAP_AGENT_NAME: updates.agentName ?? \"<set-per-session>\",\n };\n }\n\n updated.configHash = computeInstanceConfigHash(updated);\n return updated;\n}\n\n// ─── Hash ──────────────────────────────────────────────────────\n\nfunction computeInstanceConfigHash(config: InstanceConfig): string {\n // Hash the mutable fields that affect runtime behavior\n const hashInput: Record<string, unknown> = {\n instanceId: config.instanceId,\n runtime: config.runtime,\n agentName: config.agentName,\n agentId: config.agentId,\n port: config.port,\n appServerUrl: config.appServerUrl,\n mcpEnv: config.mcpEnv,\n permission: config.permission,\n };\n const serialized = JSON.stringify(hashInput, Object.keys(hashInput).sort());\n\n // FNV-1a 32-bit (same algorithm as config-hash.ts)\n let hash = 0x811c9dc5;\n for (let i = 0; i < serialized.length; i++) {\n hash ^= serialized.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n","import * as fs from \"node:fs\";\nimport * as crypto from \"node:crypto\";\nimport type { InstanceId, TapState } from \"../types.js\";\nimport { loadInstanceConfig } from \"./instance-config.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport type DriftSource = \"instance-config\" | \"runtime-config\" | \"state-json\";\n\nexport interface DriftCheck {\n name: string;\n source: DriftSource;\n target: DriftSource;\n status: \"ok\" | \"drifted\" | \"missing\";\n details: string | null;\n autoFixable: boolean;\n}\n\nexport interface DriftCheckResult {\n instanceId: string;\n status: \"ok\" | \"drifted\" | \"missing\" | \"orphaned\";\n checks: DriftCheck[];\n}\n\n// ─── Hash helpers ──────────────────────────────────────────────\n\n/**\n * Compute a stable hash of a file's contents for drift comparison.\n * Returns empty string if file doesn't exist.\n */\nexport function computeFileHash(filePath: string): string {\n if (!fs.existsSync(filePath)) return \"\";\n const content = fs.readFileSync(filePath, \"utf-8\");\n return crypto.createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 16);\n}\n\n// ─── Instance Drift Check ──────────────────────────────────────\n\n/**\n * Check drift for a single instance across 3 sources:\n * 1. instance config existence + state.json consistency\n * 2. instance config ↔ runtime config (config.toml) via hash\n * 3. config hash baseline (empty = not yet baselined)\n */\nexport function checkInstanceDrift(\n stateDir: string,\n instanceId: InstanceId,\n state: TapState | null,\n): DriftCheckResult {\n const checks: DriftCheck[] = [];\n const instConfig = loadInstanceConfig(stateDir, instanceId);\n const stateInstance = state?.instances[instanceId] ?? null;\n\n // 1. Instance config existence\n if (!instConfig) {\n if (stateInstance?.installed) {\n // Pre-M214 instances have no configSourceFile — instance config absence is expected\n if (!stateInstance.configSourceFile) {\n return { instanceId, status: \"ok\", checks };\n }\n checks.push({\n name: \"instance config exists\",\n source: \"instance-config\",\n target: \"state-json\",\n status: \"missing\",\n details: `Instance \"${instanceId}\" is in state.json but has no instance config file. Run \"tap add ${instanceId} --force\" to recreate.`,\n autoFixable: false, // Cannot generate config from state alone\n });\n return { instanceId, status: \"missing\", checks };\n }\n return { instanceId, status: \"ok\", checks };\n }\n\n // Orphan check: instance config exists but not in state.json\n if (!stateInstance) {\n checks.push({\n name: \"instance registered\",\n source: \"instance-config\",\n target: \"state-json\",\n status: \"missing\",\n details: `Instance config exists for \"${instanceId}\" but not registered in state.json`,\n autoFixable: false,\n });\n return { instanceId, status: \"orphaned\", checks };\n }\n\n // 2. Instance config ↔ state.json field comparison\n const fieldMismatches: string[] = [];\n\n if (instConfig.agentName !== stateInstance.agentName) {\n fieldMismatches.push(\n `agentName: instance=\"${instConfig.agentName}\" vs state=\"${stateInstance.agentName}\"`,\n );\n }\n if (instConfig.port !== stateInstance.port) {\n fieldMismatches.push(\n `port: instance=${instConfig.port} vs state=${stateInstance.port}`,\n );\n }\n\n if (fieldMismatches.length > 0) {\n checks.push({\n name: \"state consistency\",\n source: \"instance-config\",\n target: \"state-json\",\n status: \"drifted\",\n details: fieldMismatches.join(\"; \"),\n autoFixable: true,\n });\n } else {\n checks.push({\n name: \"state consistency\",\n source: \"instance-config\",\n target: \"state-json\",\n status: \"ok\",\n details: null,\n autoFixable: false,\n });\n }\n\n // 3. Config hash — detect changes since last sync\n const stateHash = stateInstance.configHash ?? \"\";\n if (!stateHash) {\n // Empty hash = never baselined (e.g., v2→v3 migration).\n // Report as drifted so doctor --fix can backfill.\n checks.push({\n name: \"config hash baseline\",\n source: \"instance-config\",\n target: \"state-json\",\n status: \"drifted\",\n details: `configHash not baselined for \"${instanceId}\" — needs backfill`,\n autoFixable: true,\n });\n } else if (instConfig.configHash !== stateHash) {\n checks.push({\n name: \"config hash\",\n source: \"instance-config\",\n target: \"state-json\",\n status: \"drifted\",\n details: `instance hash=\"${instConfig.configHash}\" vs state hash=\"${stateHash}\"`,\n autoFixable: true,\n });\n } else {\n checks.push({\n name: \"config hash\",\n source: \"instance-config\",\n target: \"state-json\",\n status: \"ok\",\n details: null,\n autoFixable: false,\n });\n }\n\n // 4. Runtime config drift (config.toml)\n // Compare instance config's runtimeConfigHash against actual file\n if (stateInstance.configPath && fs.existsSync(stateInstance.configPath)) {\n const currentRuntimeHash = computeFileHash(stateInstance.configPath);\n const lastSyncedHash = instConfig.runtimeConfigHash || \"\";\n if (!lastSyncedHash) {\n // Never baselined — report so doctor --fix can backfill\n checks.push({\n name: \"runtime config baseline\",\n source: \"instance-config\",\n target: \"runtime-config\",\n status: \"drifted\",\n details: `runtimeConfigHash not baselined for \"${instanceId}\" — needs backfill`,\n autoFixable: true,\n });\n } else if (currentRuntimeHash !== lastSyncedHash) {\n checks.push({\n name: \"runtime config\",\n source: \"instance-config\",\n target: \"runtime-config\",\n status: \"drifted\",\n details: `${stateInstance.configPath} has changed since last sync (hash: ${currentRuntimeHash.slice(0, 8)} vs synced: ${lastSyncedHash.slice(0, 8)})`,\n autoFixable: true,\n });\n } else {\n checks.push({\n name: \"runtime config\",\n source: \"instance-config\",\n target: \"runtime-config\",\n status: \"ok\",\n details: null,\n autoFixable: false,\n });\n }\n }\n\n const hasDrift = checks.some((c) => c.status !== \"ok\");\n return {\n instanceId,\n status: hasDrift ? \"drifted\" : \"ok\",\n checks,\n };\n}\n\n/**\n * Check drift for all instances in state.json + any orphaned instance configs.\n */\nexport function checkAllDrift(\n stateDir: string,\n state: TapState | null,\n): DriftCheckResult[] {\n const results: DriftCheckResult[] = [];\n const checkedIds = new Set<string>();\n\n // Check all instances in state.json\n if (state) {\n for (const instanceId of Object.keys(state.instances)) {\n checkedIds.add(instanceId);\n results.push(checkInstanceDrift(stateDir, instanceId, state));\n }\n }\n\n // Check for orphaned instance configs\n const instancesDir = `${stateDir}/instances`;\n if (fs.existsSync(instancesDir)) {\n for (const file of fs.readdirSync(instancesDir)) {\n if (!file.endsWith(\".json\")) continue;\n const id = file.replace(/\\.json$/, \"\");\n if (!checkedIds.has(id)) {\n results.push(checkInstanceDrift(stateDir, id, state));\n }\n }\n }\n\n return results;\n}\n","export type {\n TapSharedConfig,\n TapLocalConfig,\n TapResolvedConfig,\n ConfigSource,\n ConfigResolution,\n TrackedConfigSource,\n TrackedValue,\n TapTrackedConfig,\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 resolveTrackedConfig,\n loadInstanceConfig,\n loadSessionConfig,\n saveSharedConfig,\n saveLocalConfig,\n normalizeTapPath,\n} from \"./resolve.js\";\n\nexport type { ConfigOverrides, TrackedResolveOpts } from \"./resolve.js\";\n\nexport { computeConfigHash } from \"./config-hash.js\";\n\nexport type {\n DriftCheckResult,\n DriftCheck,\n DriftSource,\n} from \"./drift-detector.js\";\nexport {\n checkInstanceDrift,\n checkAllDrift,\n computeFileHash,\n} from \"./drift-detector.js\";\n\nexport type {\n InstanceConfig,\n CreateInstanceConfigOpts,\n} from \"./instance-config.js\";\nexport {\n loadInstanceConfig as loadFullInstanceConfig,\n saveInstanceConfig,\n listInstanceConfigs,\n deleteInstanceConfig,\n createInstanceConfig,\n updateInstanceConfig,\n} from \"./instance-config.js\";\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { createInitialState, saveState, stateExists } from \"../state.js\";\nimport {\n findRepoRoot,\n resolveCommsDir,\n log,\n logSuccess,\n logWarn,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport { version } from \"../version.js\";\nimport {\n applyClaudePermissions,\n applyCodexPermissions,\n buildPermissionSummary,\n} from \"../permissions.js\";\nimport type { CommandResult } from \"../types.js\";\nimport type { PermissionMode } from \"../permissions.js\";\nimport {\n resolveConfig,\n saveSharedConfig,\n loadSharedConfig,\n} from \"../config/index.js\";\n\nconst COMMS_DIRS = [\n \"inbox\",\n \"reviews\",\n \"findings\",\n \"handoff\",\n \"retros\",\n \"archive\",\n];\n\nfunction parsePermissionMode(args: string[]): PermissionMode {\n const idx = args.indexOf(\"--permissions\");\n if (idx !== -1 && args[idx + 1]) {\n const value = args[idx + 1];\n if (value === \"full\" || value === \"safe\") return value;\n logWarn(`Unknown permission mode: ${value}. Using \"safe\".`);\n }\n return \"safe\";\n}\n\nconst INIT_HELP = `\nUsage:\n tap init [options]\n\nDescription:\n Initialize the tap directory structure, state file, and permissions.\n Optionally clone a shared comms repository.\n\nOptions:\n --comms-dir <path> Override comms directory (default: tap-comms/)\n --comms-repo <url> Clone a shared comms git repo into comms directory\n --permissions <mode> Permission mode: safe (default) or full\n --force Re-initialize even if already set up\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap init\n npx @hua-labs/tap init --permissions full\n npx @hua-labs/tap init --comms-repo https://github.com/org/comms.git\n npx @hua-labs/tap init --comms-dir /shared/comms --force\n`.trim();\n\nexport async function initCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(INIT_HELP);\n return {\n ok: true,\n command: \"init\",\n code: \"TAP_NO_OP\",\n message: INIT_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const commsDir = resolveCommsDir(args, repoRoot);\n const permMode = parsePermissionMode(args);\n\n // Check if already initialized\n if (stateExists(repoRoot) && !args.includes(\"--force\")) {\n return {\n ok: true,\n command: \"init\",\n code: \"TAP_ALREADY_INITIALIZED\",\n message: \"Already initialized. Use --force to re-initialize.\",\n warnings: [],\n data: { commsDir, repoRoot },\n };\n }\n\n logHeader(\"@hua-labs/tap init\");\n\n // Clone comms repo if --comms-repo provided\n const commsRepoIdx = args.indexOf(\"--comms-repo\");\n const commsRepoUrl =\n commsRepoIdx !== -1 && args[commsRepoIdx + 1]\n ? args[commsRepoIdx + 1]\n : undefined;\n\n if (commsRepoUrl) {\n if (fs.existsSync(commsDir) && fs.readdirSync(commsDir).length > 0) {\n const gitDir = path.join(commsDir, \".git\");\n if (fs.existsSync(gitDir)) {\n log(`Comms directory exists: ${commsDir}`);\n logSuccess(\"Comms directory is already a git repo — linking only\");\n } else {\n logError(`Comms directory exists but is not a git repo: ${commsDir}`);\n return {\n ok: false,\n command: \"init\",\n code: \"TAP_INIT_CLONE_FAILED\",\n message: `Comms directory \"${commsDir}\" exists but is not a git repo. Remove it or use --force to reinitialize.`,\n warnings: [],\n data: { commsDir, commsRepoUrl },\n };\n }\n } else {\n log(`Cloning comms repo: ${commsRepoUrl}`);\n try {\n const cloneResult = spawnSync(\n \"git\",\n [\"clone\", commsRepoUrl, commsDir],\n {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n },\n );\n if (cloneResult.status !== 0) {\n throw new Error(\n cloneResult.stderr ||\n `git clone exited with code ${cloneResult.status}`,\n );\n }\n logSuccess(`Cloned comms repo to ${commsDir}`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(`Failed to clone comms repo: ${msg}`);\n return {\n ok: false,\n command: \"init\",\n code: \"TAP_INIT_CLONE_FAILED\",\n message: `Failed to clone comms repo: ${msg}`,\n warnings: [],\n data: { commsRepoUrl },\n };\n }\n }\n }\n\n // Persist comms config (commsDir + optional repoUrl) for tap comms pull/push\n {\n const sharedConfig = loadSharedConfig(repoRoot) ?? {};\n let configChanged = false;\n if (commsRepoUrl) {\n sharedConfig.commsRepoUrl = commsRepoUrl;\n configChanged = true;\n }\n const commsDirRelative = path.relative(repoRoot, commsDir);\n if (commsDirRelative && commsDirRelative !== \"tap-comms\") {\n sharedConfig.commsDir = commsDirRelative;\n configChanged = true;\n }\n if (configChanged) {\n saveSharedConfig(repoRoot, sharedConfig);\n logSuccess(\"Saved comms config to tap-config.json\");\n }\n }\n\n // Create comms directory structure\n log(`Comms directory: ${commsDir}`);\n for (const dir of COMMS_DIRS) {\n const dirPath = path.join(commsDir, dir);\n fs.mkdirSync(dirPath, { recursive: true });\n logSuccess(`Created ${dir}/`);\n }\n\n // Create .gitignore in comms dir\n const gitignorePath = path.join(commsDir, \".gitignore\");\n if (!fs.existsSync(gitignorePath)) {\n fs.writeFileSync(\n gitignorePath,\n [\"tap.db\", \".lock\", \"*.tmp.*\", \".DS_Store\"].join(\"\\n\") + \"\\n\",\n \"utf-8\",\n );\n logSuccess(\"Created .gitignore\");\n }\n\n // Create state directory (config-resolved — may differ from default .tap-comms/)\n const { config } = resolveConfig({}, repoRoot);\n const stateDir = config.stateDir;\n fs.mkdirSync(path.join(stateDir, \"pids\"), { recursive: true });\n fs.mkdirSync(path.join(stateDir, \"logs\"), { recursive: true });\n fs.mkdirSync(path.join(stateDir, \"backups\"), { recursive: true });\n const stateDirRel = path.relative(repoRoot, stateDir);\n logSuccess(`Created ${stateDirRel}/ state directory`);\n\n // Add state dir + local config to repo .gitignore if not present\n const repoGitignore = path.join(repoRoot, \".gitignore\");\n const gitignoreEntries = [\n { entry: stateDirRel.replace(/\\\\/g, \"/\") + \"/\", label: \"tap-comms state\" },\n {\n entry: \"tap-config.local.json\",\n label: \"tap-comms local config (machine-specific)\",\n },\n ];\n if (fs.existsSync(repoGitignore)) {\n const content = fs.readFileSync(repoGitignore, \"utf-8\");\n for (const { entry, label } of gitignoreEntries) {\n if (!content.includes(entry)) {\n fs.appendFileSync(repoGitignore, `\\n# ${label}\\n${entry}\\n`);\n logSuccess(`Added ${entry} to .gitignore`);\n }\n }\n }\n\n // Create initial state\n const state = createInitialState(commsDir, repoRoot, version);\n saveState(repoRoot, state);\n logSuccess(\"Created state.json\");\n\n // Apply permissions\n const warnings: string[] = [];\n logHeader(`Permissions: ${permMode} mode`);\n\n const claudeResult = applyClaudePermissions(repoRoot, permMode);\n warnings.push(...claudeResult.warnings);\n\n const codexResult = applyCodexPermissions(repoRoot, commsDir, permMode);\n warnings.push(...codexResult.warnings);\n\n const permSummary = buildPermissionSummary(permMode, repoRoot, commsDir);\n\n if (permMode === \"full\") {\n logWarn(\"Full mode: no destructive operation guards. Use with caution.\");\n }\n\n logHeader(\"Done! Next steps:\");\n log(\"npx @hua-labs/tap add claude # Add Claude runtime\");\n log(\"npx @hua-labs/tap add codex # Add Codex runtime\");\n log(\"npx @hua-labs/tap status # Check status\");\n\n return {\n ok: true,\n command: \"init\",\n code: \"TAP_INIT_OK\",\n message: \"Initialized successfully\",\n warnings,\n data: {\n commsDir,\n repoRoot,\n permissions: permSummary,\n },\n };\n}\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 = 3;\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// ─── v2 → v3 Migration ────────────────────────────────────────\n\nexport function migrateStateV2toV3(v2: TapState): TapState {\n const instances: Record<InstanceId, InstanceState> = {};\n\n for (const [id, inst] of Object.entries(v2.instances)) {\n instances[id] = {\n ...inst,\n configHash: inst.configHash ?? \"\",\n configSourceFile: inst.configSourceFile ?? \"\",\n };\n }\n\n return {\n ...v2,\n schemaVersion: SCHEMA_VERSION,\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 v2 = migrateStateV1toV2(parsed as TapStateV1);\n const v3 = migrateStateV2toV3(v2);\n saveState(repoRoot, v3);\n return v3;\n }\n\n // Auto-migrate v2 → v3\n if (parsed.schemaVersion === 2) {\n const v3 = migrateStateV2toV3(parsed as TapState);\n saveState(repoRoot, v3);\n return v3;\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 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","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { logSuccess, logWarn } from \"./utils.js\";\nimport { replaceTomlTable, renderTomlTable, extractTomlTable } from \"./toml.js\";\n\nexport type PermissionMode = \"safe\" | \"full\";\n\n// ─── Claude Deny List ───────────────────────────────────────────\n\nconst CLAUDE_DENY_RULES = [\n \"Bash(git push --force:*)\",\n \"Bash(git push -f:*)\",\n \"Bash(git push --force-with-lease:*)\",\n \"Bash(git reset --hard:*)\",\n \"Bash(git checkout -- .:*)\",\n \"Bash(git clean -f:*)\",\n \"Bash(git clean -fd:*)\",\n \"Bash(git clean -fdx:*)\",\n \"Bash(git restore --source=:*)\",\n \"Bash(git branch -D:*)\",\n \"Bash(git stash drop:*)\",\n \"Bash(rm -rf:*)\",\n];\n\n/**\n * Apply Claude permission settings to .claude/settings.local.json.\n * Safe mode: adds deny list for destructive operations.\n * Full mode: removes tap-managed deny rules (restores full access).\n */\nexport function applyClaudePermissions(\n repoRoot: string,\n mode: PermissionMode,\n): { applied: boolean; warnings: string[] } {\n const warnings: string[] = [];\n const claudeDir = path.join(repoRoot, \".claude\");\n const settingsPath = path.join(claudeDir, \"settings.local.json\");\n\n fs.mkdirSync(claudeDir, { recursive: true });\n\n let settings: Record<string, unknown> = {};\n if (fs.existsSync(settingsPath)) {\n try {\n settings = JSON.parse(fs.readFileSync(settingsPath, \"utf-8\"));\n } catch {\n warnings.push(\n \".claude/settings.local.json was invalid JSON. Starting fresh.\",\n );\n settings = {};\n }\n }\n\n const existingDeny = Array.isArray(settings.deny)\n ? (settings.deny as string[])\n : [];\n\n if (mode === \"full\") {\n // Remove tap-managed deny rules, keep user-added ones\n const tapRuleSet = new Set(CLAUDE_DENY_RULES);\n const cleaned = existingDeny.filter((r) => !tapRuleSet.has(r));\n settings.deny = cleaned;\n\n const tmp = `${settingsPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(settings, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, settingsPath);\n\n logWarn(\"Claude: full mode — tap deny rules removed. Use with caution.\");\n warnings.push(\"Full permission mode: tap deny rules removed.\");\n return { applied: true, warnings };\n }\n\n // Safe mode: merge deny rules without duplicating\n const newDeny = [...new Set([...existingDeny, ...CLAUDE_DENY_RULES])];\n settings.deny = newDeny;\n\n const tmp = `${settingsPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(settings, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, settingsPath);\n\n logSuccess(\n `Claude: ${CLAUDE_DENY_RULES.length} deny rules applied to .claude/settings.local.json`,\n );\n\n return { applied: true, warnings };\n}\n\n// ─── Codex Config Patching ──────────────────────────────────────\n\nfunction findCodexConfigPath(): string {\n return path.join(os.homedir(), \".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\n/**\n * Apply Codex permission settings to ~/.codex/config.toml.\n * Safe mode: network full + trust project paths.\n * Full mode: danger-full-access warning (manual step).\n */\nexport function applyCodexPermissions(\n repoRoot: string,\n commsDir: string,\n mode: PermissionMode,\n): { applied: boolean; warnings: string[] } {\n const warnings: string[] = [];\n const configPath = findCodexConfigPath();\n\n // Read existing config\n fs.mkdirSync(path.dirname(configPath), { recursive: true });\n let content = \"\";\n if (fs.existsSync(configPath)) {\n content = fs.readFileSync(configPath, \"utf-8\");\n }\n\n // Both modes need trust paths\n const trustTargets = getCodexWritableRoots(repoRoot, commsDir);\n\n if (mode === \"full\") {\n // Full mode: danger-full-access + trust\n logWarn(\"Codex: full mode — setting sandbox to danger-full-access.\");\n warnings.push(\n \"Full mode: sandbox set to danger-full-access. Use with caution.\",\n );\n\n content = replaceTomlTable(\n content,\n \"sandbox\",\n renderTomlTable(\n \"sandbox\",\n { mode: \"danger-full-access\" },\n extractTomlTable(content, \"sandbox\"),\n ),\n );\n } else {\n // Safe mode: workspace-write + network full + writable_roots\n content = replaceTomlTable(\n content,\n \"sandbox\",\n renderTomlTable(\n \"sandbox\",\n { mode: \"workspace-write\", network_access: \"full\" },\n extractTomlTable(content, \"sandbox\"),\n ),\n );\n\n // Writable roots for workspace-write mode\n const forwardSlashRoots = trustTargets.map((r) => r.replace(/\\\\/g, \"/\"));\n content = replaceTomlTable(\n content,\n \"sandbox_workspace_write\",\n renderTomlTable(\n \"sandbox_workspace_write\",\n { writable_roots: forwardSlashRoots },\n extractTomlTable(content, \"sandbox_workspace_write\"),\n ),\n );\n\n // Windows elevated sandbox\n if (process.platform === \"win32\") {\n content = replaceTomlTable(\n content,\n \"windows\",\n renderTomlTable(\n \"windows\",\n { sandbox: \"elevated\" },\n extractTomlTable(content, \"windows\"),\n ),\n );\n }\n }\n\n // Trust project paths (both modes)\n for (const target of trustTargets) {\n const selector = `projects.'${canonicalizeTrustPath(target)}'`;\n content = replaceTomlTable(\n content,\n selector,\n renderTomlTable(\n selector,\n { trust_level: \"trusted\" },\n extractTomlTable(content, selector),\n ),\n );\n }\n\n // Write back\n const tmp = `${configPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, content, \"utf-8\");\n fs.renameSync(tmp, configPath);\n\n const modeLabel =\n mode === \"full\" ? \"danger-full-access\" : \"workspace-write, network=full\";\n logSuccess(\n `Codex: sandbox=${modeLabel}, ${trustTargets.length} path(s) trusted`,\n );\n\n return { applied: true, warnings };\n}\n\n// ─── Codex Writable Roots ───────────────────────────────────────\n\nexport function getCodexWritableRoots(\n repoRoot: string,\n commsDir: string,\n): string[] {\n const roots = [repoRoot, commsDir];\n\n // Add worktree siblings\n const parent = path.dirname(repoRoot);\n for (let i = 1; i <= 4; i++) {\n const wtPath = path.join(parent, `hua-wt-${i}`);\n if (fs.existsSync(wtPath)) roots.push(wtPath);\n }\n\n return [...new Set(roots.map((r) => path.resolve(r)))];\n}\n\n// ─── Permission Summary ────────────────────────────────────────\n\nexport interface PermissionSummary {\n mode: PermissionMode;\n claude: { applied: boolean; denyCount: number; warnings: string[] };\n codex: { applied: boolean; trustedPaths: string[]; warnings: string[] };\n}\n\nexport function buildPermissionSummary(\n mode: PermissionMode,\n repoRoot: string,\n commsDir: string,\n): PermissionSummary {\n const trustedPaths = getCodexWritableRoots(repoRoot, commsDir);\n\n return {\n mode,\n claude: {\n applied: true,\n denyCount: mode === \"safe\" ? CLAUDE_DENY_RULES.length : 0,\n warnings: mode === \"full\" ? [\"Full mode: tap deny rules removed.\"] : [],\n },\n codex: {\n applied: true,\n trustedPaths,\n warnings:\n mode === \"full\"\n ? [\"Full mode: sandbox set to danger-full-access.\"]\n : [],\n },\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 {\n loadState,\n saveState,\n updateInstanceState,\n ensureBackupDir,\n} from \"../state.js\";\nimport {\n findRepoRoot,\n isValidRuntime,\n createAdapterContext,\n parseArgs,\n buildInstanceId,\n findPortConflict,\n log,\n logSuccess,\n logWarn,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n startBridge,\n findNextAvailableAppServerPort,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport {\n createInstanceConfig,\n saveInstanceConfig,\n} from \"../config/instance-config.js\";\nimport type {\n RuntimeName,\n BridgeState,\n HeadlessConfig,\n AgentRole,\n CommandResult,\n} from \"../types.js\";\n\nconst ADD_HELP = `\nUsage:\n tap add <claude|codex|gemini> [options]\n\nDescription:\n Install a runtime instance and configure it to use tap.\n\nOptions:\n --name <name> Instance name (default: runtime name)\n --port <port> Port for app-server bridge\n --agent-name <name> Agent display name for bridge identification\n --force Re-install even if already configured\n --headless Enable headless reviewer mode (requires --name)\n --role <role> Headless role: reviewer, validator, long-running\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap add claude\n npx @hua-labs/tap add codex --name reviewer --port 4501 --headless --role reviewer\n`.trim();\n\nfunction normalizeAgentName(value: string | null | undefined): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction resolveAgentName(options: {\n explicit?: string | null;\n env?: string | null;\n stored?: string | null;\n fallback?: string | null;\n}): string | null {\n return (\n normalizeAgentName(options.explicit) ??\n normalizeAgentName(options.stored) ??\n normalizeAgentName(options.env) ??\n normalizeAgentName(options.fallback) ??\n null\n );\n}\n\nexport async function addCommand(args: string[]): Promise<CommandResult> {\n const { positional, flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(ADD_HELP);\n return {\n ok: true,\n command: \"add\",\n code: \"TAP_NO_OP\",\n message: ADD_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const runtimeArg = positional[0];\n\n if (!runtimeArg) {\n return {\n ok: false,\n command: \"add\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing runtime argument. Usage: npx @hua-labs/tap add <claude|codex|gemini> [--name <name>] [--port <port>] [--agent-name <name>] [--headless] [--role <role>]\",\n warnings: [],\n data: {},\n };\n }\n\n if (!isValidRuntime(runtimeArg)) {\n return {\n ok: false,\n command: \"add\",\n code: \"TAP_RUNTIME_UNKNOWN\",\n message: `Unknown runtime: ${runtimeArg}. Available: claude, codex, gemini`,\n warnings: [],\n data: {},\n };\n }\n\n const runtime: RuntimeName = runtimeArg;\n const instanceName =\n typeof flags[\"name\"] === \"string\" ? flags[\"name\"] : undefined;\n const instanceId = buildInstanceId(runtime, instanceName);\n const portStr = typeof flags[\"port\"] === \"string\" ? flags[\"port\"] : undefined;\n const port = portStr ? Number(portStr) : null;\n const agentNameFlag = normalizeAgentName(\n typeof flags[\"agent-name\"] === \"string\" ? flags[\"agent-name\"] : null,\n );\n const force = flags[\"force\"] === true;\n const headlessFlag = flags[\"headless\"] === true;\n const roleArg = typeof flags[\"role\"] === \"string\" ? flags[\"role\"] : undefined;\n\n // Validate --role value\n const validRoles: AgentRole[] = [\"reviewer\", \"validator\", \"long-running\"];\n if (roleArg && !validRoles.includes(roleArg as AgentRole)) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid role: ${roleArg}. Available: ${validRoles.join(\", \")}`,\n warnings: [],\n data: {},\n };\n }\n\n // --headless requires --name (for instance isolation)\n if (headlessFlag && !instanceName) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: \"--headless requires --name for instance isolation\",\n warnings: [],\n data: {},\n };\n }\n\n // Build headless config\n const headless: HeadlessConfig | null = headlessFlag\n ? {\n enabled: true,\n role: (roleArg as AgentRole) ?? \"reviewer\",\n maxRounds: 5,\n qualitySeverityFloor: \"high\",\n }\n : null;\n\n if (portStr && (port === null || isNaN(port) || port < 1 || port > 65535)) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Invalid port: ${portStr}. Must be between 1 and 65535.`,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n const adapter = getAdapter(runtime);\n\n if (!state) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n const existingInstance = state.instances[instanceId];\n const mode = adapter.bridgeMode();\n const envAgentName = normalizeAgentName(\n process.env.TAP_AGENT_NAME ?? process.env.CODEX_TAP_AGENT_NAME,\n );\n const defaultAgentName = mode === \"app-server\" ? instanceId : null;\n const resolvedAgentName = resolveAgentName({\n explicit: agentNameFlag,\n env: envAgentName,\n stored: existingInstance?.agentName ?? null,\n fallback: defaultAgentName,\n });\n\n if (existingInstance?.installed && !force) {\n if (resolvedAgentName !== existingInstance.agentName) {\n const updatedState = updateInstanceState(state, instanceId, {\n ...existingInstance,\n agentName: resolvedAgentName,\n });\n saveState(repoRoot, updatedState);\n\n // Sync instance config if it exists (Phase 1-2)\n const { config: cfg } = resolveConfig({}, repoRoot);\n try {\n const {\n loadInstanceConfig: loadInstCfg,\n updateInstanceConfig: updateInstCfg,\n saveInstanceConfig: saveInstCfg,\n } = await import(\"../config/instance-config.js\");\n const existing = loadInstCfg(cfg.stateDir, instanceId);\n if (existing) {\n const updated = updateInstCfg(existing, {\n agentName: resolvedAgentName,\n });\n saveInstCfg(cfg.stateDir, updated);\n }\n } catch {\n // instance config sync failed — non-fatal\n }\n\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_ADD_OK\",\n message:\n resolvedAgentName === null\n ? `${instanceId} updated`\n : `${instanceId} agent name updated to \"${resolvedAgentName}\".`,\n warnings: [],\n data: {\n updatedFields: [\"agentName\"],\n agentName: resolvedAgentName,\n },\n };\n }\n\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_NO_OP\",\n message: `${instanceId} is already installed. Use --force to re-install.`,\n warnings: [],\n data: {},\n };\n }\n\n // Port conflict check\n if (port !== null) {\n const conflict = findPortConflict(state, port, instanceId);\n if (conflict) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_PORT_CONFLICT\",\n message: `Port ${port} is already used by instance \"${conflict}\".`,\n warnings: [],\n data: { conflictingInstance: conflict },\n };\n }\n }\n\n logHeader(`@hua-labs/tap add ${instanceId}`);\n if (instanceName) log(`Instance name: ${instanceName}`);\n if (port !== null) log(`Port: ${port}`);\n if (resolvedAgentName) log(`Agent name: ${resolvedAgentName}`);\n const ctx = {\n ...createAdapterContext(state.commsDir, repoRoot),\n instanceId,\n agentName: resolvedAgentName ?? undefined,\n };\n const warnings: string[] = [];\n\n // 1. Probe\n log(\"Probing runtime...\");\n const probe = await adapter.probe(ctx);\n\n if (!probe.installed) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_RUNTIME_NOT_FOUND\",\n message: `${runtime} runtime not found.`,\n warnings: probe.warnings,\n data: { issues: probe.issues },\n };\n }\n\n logSuccess(`Found ${runtime} (${probe.runtimeCommand ?? \"unknown\"})`);\n if (probe.configPath) log(`Config: ${probe.configPath}`);\n warnings.push(...probe.warnings);\n for (const w of probe.warnings) logWarn(w);\n\n // 2. Plan\n log(\"Planning patches...\");\n const plan = await adapter.plan(ctx, probe);\n warnings.push(...plan.warnings);\n\n if (plan.conflicts.length > 0) {\n logWarn(\"Conflicts detected:\");\n for (const c of plan.conflicts) logWarn(` ${c}`);\n }\n\n log(`Operations: ${plan.operations.length}`);\n log(`Artifacts: ${plan.ownedArtifacts.length}`);\n for (const w of plan.warnings) logWarn(w);\n\n // 3. Check for no-op plan\n if (plan.operations.length === 0) {\n const failureMessage =\n probe.issues[0] ??\n plan.warnings[0] ??\n probe.warnings[0] ??\n \"No operations to apply. Runtime not configured.\";\n const failureCode = /MCP server/i.test(failureMessage)\n ? \"TAP_LOCAL_SERVER_MISSING\"\n : \"TAP_PATCH_FAILED\";\n\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: failureCode,\n message: failureMessage,\n warnings,\n data: { planOps: 0 },\n };\n }\n\n // 4. Backup\n const backupDir = ensureBackupDir(ctx.stateDir, instanceId);\n log(`Backup dir: ${backupDir}`);\n\n // 5. Apply\n log(\"Applying patches...\");\n const result = await adapter.apply(ctx, plan);\n warnings.push(...result.warnings);\n\n if (!result.success) {\n return {\n ok: false,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_PATCH_FAILED\",\n message: \"Failed to apply patches.\",\n warnings,\n data: { appliedOps: result.appliedOps },\n };\n }\n\n logSuccess(`Applied ${result.appliedOps} operation(s)`);\n for (const f of result.changedFiles) logSuccess(`Modified: ${f}`);\n for (const w of result.warnings) logWarn(w);\n\n // 6. Verify\n log(\"Verifying...\");\n const verify = await adapter.verify(ctx, plan);\n warnings.push(...verify.warnings);\n\n for (const check of verify.checks) {\n if (check.passed) {\n logSuccess(`${check.name}`);\n } else {\n logError(`${check.name}: ${check.message ?? \"failed\"}`);\n }\n }\n\n if (!verify.ok) {\n logWarn(\n \"Verification had failures. Runtime may need manual configuration.\",\n );\n }\n\n // Resolve config for bridge + instance config\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n\n // 7. Start bridge if needed (app-server mode only)\n let bridge: BridgeState | null = null;\n let effectivePort = port;\n if (mode === \"app-server\") {\n const bridgeScript = adapter.resolveBridgeScript?.(ctx);\n if (!bridgeScript) {\n logWarn(\"Bridge script not found. Bridge not started.\");\n warnings.push(\"Bridge script not found. Run bridge manually.\");\n } else {\n // Auto-assign a free port for managed codex instances without --port\n if (effectivePort == null && runtime === \"codex\") {\n const currentState = loadState(repoRoot) ?? state;\n effectivePort = await findNextAvailableAppServerPort(\n currentState,\n resolvedCfg.appServerUrl,\n 4501,\n instanceId,\n );\n log(`Auto-assigned port ${effectivePort} for ${instanceId}`);\n }\n log(`Starting bridge: ${bridgeScript}`);\n try {\n const manageAppServer = runtime === \"codex\";\n bridge = await startBridge({\n instanceId,\n runtime,\n stateDir: ctx.stateDir,\n commsDir: ctx.commsDir,\n bridgeScript,\n platform: ctx.platform,\n agentName: resolvedAgentName ?? undefined,\n runtimeCommand: resolvedCfg.runtimeCommand,\n appServerUrl: resolvedCfg.appServerUrl,\n repoRoot,\n port: effectivePort ?? undefined,\n manageAppServer,\n headless,\n });\n logSuccess(`Bridge started (PID: ${bridge.pid})`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logWarn(`Bridge not started: ${msg}`);\n warnings.push(`Bridge not started: ${msg}`);\n }\n }\n }\n\n // 8. Create/update instance config (source-of-truth — Phase 1-2)\n // Build the actual appServerUrl with the effective port (may differ from default)\n let effectiveAppServerUrl = resolvedCfg.appServerUrl;\n if (effectivePort != null) {\n try {\n const parsed = new URL(resolvedCfg.appServerUrl);\n parsed.port = String(effectivePort);\n effectiveAppServerUrl = parsed.toString().replace(/\\/$/, \"\");\n } catch {\n // URL parse failed — use base URL as-is\n }\n }\n // Map headless role to permission role\n const permRole =\n roleArg === \"reviewer\"\n ? (\"reviewer\" as const)\n : headlessFlag\n ? (\"implementer\" as const) // non-reviewer headless agents get workspace-write\n : undefined;\n const instConfig = createInstanceConfig({\n instanceId,\n runtime,\n agentName: resolvedAgentName,\n agentId: null,\n port: effectivePort,\n appServerUrl: effectiveAppServerUrl,\n commsDir: ctx.commsDir,\n stateDir: ctx.stateDir,\n repoRoot,\n role: permRole,\n });\n // Baseline runtime config hash so drift detection works from the start\n if (probe.configPath) {\n try {\n const { computeFileHash } = await import(\"../config/drift-detector.js\");\n const runtimeHash = computeFileHash(probe.configPath);\n if (runtimeHash) {\n instConfig.runtimeConfigHash = runtimeHash;\n instConfig.lastSyncedToRuntime = new Date().toISOString();\n }\n } catch {\n // non-fatal — hash will be backfilled by doctor --fix\n }\n }\n const instConfigPath = saveInstanceConfig(ctx.stateDir, instConfig);\n logSuccess(`Instance config: ${instConfigPath}`);\n\n // 9. Save state\n const instanceState = {\n instanceId,\n runtime,\n agentName: resolvedAgentName,\n port: effectivePort,\n installed: true,\n configPath: probe.configPath ?? \"\",\n bridgeMode: mode,\n restartRequired: result.restartRequired,\n ownedArtifacts: result.ownedArtifacts,\n backupPath: backupDir,\n lastAppliedHash: result.lastAppliedHash,\n lastVerifiedAt: verify.ok ? new Date().toISOString() : null,\n bridge,\n manageAppServer: runtime === \"codex\",\n noAuth: false,\n headless,\n configHash: instConfig.configHash,\n configSourceFile: instConfigPath,\n warnings: Array.from(new Set([...result.warnings, ...verify.warnings])),\n };\n\n const newState = updateInstanceState(state, instanceId, instanceState);\n saveState(repoRoot, newState);\n logSuccess(\"State saved\");\n\n if (result.restartRequired) {\n logWarn(`Restart ${runtime} to pick up the new configuration.`);\n }\n\n // Claude-specific: real-time notification hint\n if (runtime === \"claude\") {\n log(\"\");\n log(\"For real-time notifications:\");\n log(\" claude --dangerously-load-development-channels server:tap-comms\");\n log(\"Or polling mode (tools still work):\");\n log(\" claude\");\n }\n\n logHeader(\"Done!\");\n\n return {\n ok: true,\n command: \"add\",\n runtime,\n instanceId,\n code: \"TAP_ADD_OK\",\n message: `${instanceId} configured`,\n warnings,\n data: {\n appliedOps: result.appliedOps,\n restartRequired: result.restartRequired,\n changedFiles: result.changedFiles,\n verified: verify.ok,\n },\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\";\n\n// Legacy key name — used for auto-migration from pre-0.3 configs\nconst OLD_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 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 if (config.mcpServers?.[OLD_MCP_SERVER_KEY]) {\n conflicts.push(\n `Legacy \"${OLD_MCP_SERVER_KEY}\" entry will be migrated to \"${MCP_SERVER_KEY}\".`,\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 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 // Migrate: remove legacy \"tap-comms\" key if present\n const servers = config.mcpServers as\n | Record<string, unknown>\n | undefined;\n if (servers?.[OLD_MCP_SERVER_KEY]) {\n delete servers[OLD_MCP_SERVER_KEY];\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 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 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 const absolutePath = resolveCommandPath(candidate);\n return { command: absolutePath ?? candidate, version };\n }\n }\n\n return { command: null, version: null };\n}\n\n/**\n * Resolve a command name to its absolute filesystem path.\n * Uses `where.exe` on Windows, `which` on Unix.\n * Returns null if resolution fails (falls back to original candidate).\n */\nfunction resolveCommandPath(command: string): string | null {\n // Skip if already absolute\n if (path.isAbsolute(command)) return command;\n\n const whichCmd = process.platform === \"win32\" ? \"where.exe\" : \"which\";\n try {\n const result = spawnSync(whichCmd, [command], {\n encoding: \"utf-8\",\n windowsHide: true,\n });\n if (result.status !== 0) return null;\n const lines = result.stdout\n .trim()\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n\n if (lines.length === 0) return null;\n\n if (process.platform === \"win32\") {\n // On Windows, where.exe may return extensionless shims before .cmd/.exe.\n // Extensionless shims work with `shell: true` but fail with direct spawn.\n // Always prefer .cmd/.exe results that are directly executable.\n const candidateExt = path.extname(command).toLowerCase();\n\n // 1. If candidate has extension, match it exactly\n if (candidateExt) {\n const extMatch = lines.find(\n (l) =>\n path.extname(l).toLowerCase() === candidateExt && fs.existsSync(l),\n );\n if (extMatch) return extMatch;\n }\n\n // 2. For bare names (no extension), prefer .cmd or .exe over extensionless\n const executableMatch = lines.find(\n (l) => /\\.(cmd|exe|ps1)$/i.test(l) && fs.existsSync(l),\n );\n if (executableMatch) return executableMatch;\n }\n\n // Fallback: first existing result\n const firstValid = lines.find((l) => fs.existsSync(l));\n return firstValid ?? null;\n } catch {\n return null;\n }\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 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 // M201: bundled .mjs uses node; .ts source requires bun\n const isBundled = sourcePath.endsWith(\".mjs\");\n const isEphemeralSource = isEphemeralPath(sourcePath);\n let command: string | null = null;\n let args: string[] = [toForwardSlashPath(sourcePath)];\n\n // Ephemeral source path (npx cache) → always use stable launcher\n // This prevents persisting _npx cache paths in .mcp.json / config.toml\n if (isEphemeralSource && isBundled) {\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 (isBundled) {\n // Bundled .mjs — always use node (M201: bun dependency removed)\n const nodeProbe = probeCommand(\n process.platform === \"win32\" ? [\"node\", \"node.exe\"] : [\"node\"],\n );\n command = nodeProbe.command ?? \"node\";\n } else {\n // .ts source — requires bun for direct execution\n command = bunCommand;\n }\n\n if (!command) {\n issues.push(\n isBundled\n ? \"node is required to run the compiled MCP server (.mjs). Ensure node is in PATH.\"\n : \"bun is required to run the repo-local tap 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","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 parseTomlAssignments,\n removeTomlTable,\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\";\nimport type { ManagedMcpServerSpec } from \"./common.js\";\n\nconst MCP_SELECTOR = \"mcp_servers.tap\";\nconst ENV_SELECTOR = \"mcp_servers.tap.env\";\nconst SESSION_NEUTRAL_AGENT_NAME = \"<set-per-session>\";\n\n// Legacy key names — used for auto-migration from pre-0.3 configs\nconst OLD_MCP_SELECTOR = \"mcp_servers.tap-comms\";\nconst OLD_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 buildSessionNeutralCodexSpec(\n ctx: AdapterContext,\n): ManagedMcpServerSpec {\n const managed = buildManagedMcpServerSpec(ctx);\n const env: Record<string, string> = {\n ...managed.env,\n TAP_AGENT_NAME: SESSION_NEUTRAL_AGENT_NAME,\n };\n delete env.TAP_AGENT_ID;\n return { ...managed, env };\n}\n\nfunction buildCodexEnvEntries(\n existingTable: string | null,\n managedEnv: Record<string, string | string[]>,\n): Record<string, string | string[]> {\n const preservedEnv = parseTomlAssignments(existingTable ?? \"\");\n delete preservedEnv.TAP_AGENT_ID;\n return {\n ...preservedEnv,\n ...managedEnv,\n };\n}\n\nfunction verifyManagedToml(\n content: string,\n ctx: AdapterContext,\n configPath: string,\n): VerifyCheck[] {\n const checks: VerifyCheck[] = [];\n const managed = buildSessionNeutralCodexSpec(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 MCP table present\",\n passed: !!mainTable,\n message: mainTable ? undefined : `${MCP_SELECTOR} not found`,\n });\n checks.push({\n name: \"tap 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 const expectedArgs = managed.args\n .map((a) => `\"${a.replace(/\\\\/g, \"\\\\\\\\\")}\"`)\n .join(\", \");\n checks.push({\n name: \"Managed command configured\",\n passed:\n mainTable.includes(\n `command = \"${managed.command.replace(/\\\\/g, \"\\\\\\\\\")}\"`,\n ) && mainTable.includes(`args = [${expectedArgs}]`),\n message: \"Managed tap command/args do not match expected values\",\n });\n }\n\n if (mainTable) {\n const mainValues = parseTomlAssignments(mainTable);\n checks.push({\n name: \"approval_mode is auto\",\n passed: mainValues.approval_mode === \"auto\",\n message: mainValues.approval_mode\n ? `approval_mode is \"${mainValues.approval_mode}\", expected \"auto\"`\n : 'approval_mode missing, expected \"auto\"',\n });\n }\n\n if (envTable) {\n const envValues = parseTomlAssignments(envTable);\n checks.push({\n name: \"Managed TAP_AGENT_NAME is session-neutral\",\n passed: envValues.TAP_AGENT_NAME === managed.env.TAP_AGENT_NAME,\n message: `TAP_AGENT_NAME should be \"${SESSION_NEUTRAL_AGENT_NAME}\"`,\n });\n checks.push({\n name: \"Managed TAP_AGENT_ID is omitted\",\n passed: typeof envValues.TAP_AGENT_ID !== \"string\",\n message: \"TAP_AGENT_ID should not be persisted in Codex config\",\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, OLD_MCP_SELECTOR)) {\n conflicts.push(\n `Legacy ${OLD_MCP_SELECTOR} table will be migrated to ${MCP_SELECTOR}.`,\n );\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 = buildSessionNeutralCodexSpec(ctx);\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\n // Migrate: remove legacy \"tap-comms\" keys if present\n if (extractTomlTable(nextContent, OLD_ENV_SELECTOR)) {\n nextContent = removeTomlTable(nextContent, OLD_ENV_SELECTOR);\n }\n if (extractTomlTable(nextContent, OLD_MCP_SELECTOR)) {\n nextContent = removeTomlTable(nextContent, OLD_MCP_SELECTOR);\n }\n\n nextContent = replaceTomlTable(\n nextContent,\n MCP_SELECTOR,\n renderTomlTable(\n MCP_SELECTOR,\n {\n command: managed.command,\n args: managed.args,\n approval_mode: \"auto\",\n },\n extractTomlTable(existingContent, MCP_SELECTOR),\n ),\n );\n nextContent = replaceTomlTable(\n nextContent,\n ENV_SELECTOR,\n renderTomlTable(\n ENV_SELECTOR,\n buildCodexEnvEntries(\n extractTomlTable(existingContent, ENV_SELECTOR),\n managed.env,\n ),\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\n// ─── Public helpers ──────────────────────────────────────────\n\n/**\n * Ensure Codex config.toml has approval_mode = \"auto\" for the tap MCP server.\n * Codex resets this to \"approve\" on session restart, so we re-patch before\n * bridge startup. Only patches when [mcp_servers.tap] already exists\n * (i.e. tap was previously added to this Codex installation).\n *\n * Returns the config path if patched, null otherwise.\n */\nexport function patchCodexApprovalMode(): string | null {\n const configPath = findCodexConfigPath();\n if (!fs.existsSync(configPath)) return null;\n\n const content = fs.readFileSync(configPath, \"utf-8\");\n const tapTable = extractTomlTable(content, MCP_SELECTOR);\n if (!tapTable) return null;\n\n const values = parseTomlAssignments(tapTable);\n if (values.approval_mode === \"auto\") return null;\n\n const patched = replaceTomlTable(\n content,\n MCP_SELECTOR,\n renderTomlTable(MCP_SELECTOR, { approval_mode: \"auto\" }, tapTable),\n );\n\n writeTomlFile(configPath, patched);\n return configPath;\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","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\";\n\n// Legacy key name — used for auto-migration from pre-0.3 configs\nconst OLD_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 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 if (readNestedKey(config, OLD_GEMINI_SELECTOR) !== undefined) {\n conflicts.push(\n `Legacy ${OLD_GEMINI_SELECTOR} entry will be migrated to ${GEMINI_SELECTOR}.`,\n );\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 // Migrate: remove legacy \"tap-comms\" key if present\n const oldValue = readNestedKey(config, OLD_GEMINI_SELECTOR);\n if (oldValue !== undefined) {\n const servers = config.mcpServers as Record<string, unknown> | undefined;\n if (servers) {\n delete servers[\"tap-comms\"];\n }\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 type { InstanceId } from \"../types.js\";\n\n/**\n * Verify that a resolved path stays within the expected subdirectory.\n * Prevents path traversal via crafted instanceId or other interpolated values.\n */\nfunction assertPathContained(\n resolved: string,\n stateDir: string,\n subDir: string,\n): string {\n const expectedDir = path.resolve(stateDir, subDir) + path.sep;\n const normalizedResolved = path.resolve(resolved);\n if (!normalizedResolved.startsWith(expectedDir)) {\n throw new Error(\n `Path traversal blocked: resolved path escapes \"${subDir}/\" directory`,\n );\n }\n return normalizedResolved;\n}\n\nexport function appServerLogFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return assertPathContained(\n path.join(stateDir, \"logs\", `app-server-${instanceId}.log`),\n stateDir,\n \"logs\",\n );\n}\n\nexport function appServerGatewayLogFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return assertPathContained(\n path.join(stateDir, \"logs\", `app-server-gateway-${instanceId}.log`),\n stateDir,\n \"logs\",\n );\n}\n\nexport function appServerGatewayTokenFilePath(\n stateDir: string,\n instanceId: InstanceId,\n): string {\n return assertPathContained(\n path.join(stateDir, \"secrets\", `app-server-gateway-${instanceId}.token`),\n stateDir,\n \"secrets\",\n );\n}\n\nexport function stderrLogFilePath(logPath: string): string {\n return `${logPath}.stderr`;\n}\n\nexport function pidFilePath(stateDir: string, instanceId: InstanceId): string {\n return assertPathContained(\n path.join(stateDir, \"pids\", `bridge-${instanceId}.json`),\n stateDir,\n \"pids\",\n );\n}\n\nexport function logFilePath(stateDir: string, instanceId: InstanceId): string {\n return assertPathContained(\n path.join(stateDir, \"logs\", `bridge-${instanceId}.log`),\n stateDir,\n \"logs\",\n );\n}\n\nexport function runtimeHeartbeatFilePath(runtimeStateDir: string): string {\n return path.join(runtimeStateDir, \"heartbeat.json\");\n}\n\nexport function runtimeThreadStateFilePath(runtimeStateDir: string): string {\n return path.join(runtimeStateDir, \"thread.json\");\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nconst APP_SERVER_AUTH_FILE_MODE = 0o600;\n\nexport function 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\nexport function 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\nexport function toPowerShellSingleQuotedString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nexport function toPowerShellStringArrayLiteral(values: string[]): string {\n return `@(${values.map(toPowerShellSingleQuotedString).join(\", \")})`;\n}\n","import * as net from \"node:net\";\nimport type { TapState, InstanceId } from \"../types.js\";\n\nconst DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\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\nexport type WebSocketCtor = new (\n url: string,\n protocols?: string | string[],\n) => WebSocketLike;\n\nexport function getWebSocketCtor(): WebSocketCtor | null {\n const candidate = (globalThis as { WebSocket?: unknown }).WebSocket;\n return typeof candidate === \"function\" ? (candidate as WebSocketCtor) : null;\n}\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function isLoopbackHost(hostname: string): boolean {\n return hostname === \"127.0.0.1\" || hostname === \"localhost\";\n}\n\nexport async 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\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\n/**\n * Wait for a TCP port to become available after a process is stopped.\n * Polls isTcpPortAvailable at intervals until the port is free or timeout.\n * Returns true if the port was released, false if timeout expired.\n */\nexport async function waitForPortRelease(\n url: string,\n timeoutMs: number = 10_000,\n intervalMs: number = 500,\n): Promise<boolean> {\n let hostname: string;\n let port: number;\n try {\n const parsed = new URL(url);\n hostname = parsed.hostname;\n port = parseInt(parsed.port, 10);\n } catch {\n return true; // Can't parse URL — assume port is free\n }\n\n if (!port || !Number.isFinite(port)) return true;\n\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (await isTcpPortAvailable(hostname, port)) {\n return true;\n }\n await delay(intervalMs);\n }\n return false;\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","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Platform } from \"../types.js\";\nimport { probeCommand } from \"../adapters/common.js\";\n\n/**\n * Resolve the codex CLI command for the given platform.\n *\n * On Windows, npm-installed `codex.cmd` wrappers launch through cmd.exe,\n * which prevents PowerShell `Start-Process -WindowStyle Hidden` from properly\n * detaching the app-server process. When a `.cmd` wrapper is found, we parse\n * it to extract the underlying `node <script>` invocation and return that\n * instead, so the caller can spawn node directly.\n */\nexport function resolveCodexCommand(platform: Platform): string | null {\n const candidates =\n platform === \"win32\"\n ? [\"codex.cmd\", \"codex.exe\", \"codex\", \"codex.ps1\"]\n : [\"codex\"];\n const resolved = probeCommand(candidates).command;\n if (!resolved) return null;\n\n // Unwrap .cmd wrappers on Windows to avoid cmd.exe intermediate shell.\n // probeCommand() now returns absolute paths, so resolved is already\n // e.g. \"C:\\Users\\...\\npm\\codex.cmd\" — no extra where.exe lookup needed.\n if (platform === \"win32\" && resolved.endsWith(\".cmd\")) {\n const unwrapped = unwrapNpmCmdShim(resolved);\n if (unwrapped) return unwrapped;\n }\n\n return resolved;\n}\n\n/**\n * Parse an npm `.cmd` shim to extract the node + script path.\n *\n * npm `.cmd` shims follow this pattern:\n * ```\n * \"%_prog%\" \"%dp0%\\node_modules\\...\\bin\\script.js\" %*\n * ```\n *\n * Returns a space-separated `\"node /abs/path/to/script.js\"` string that\n * callers can split on the first space, or null if parsing fails.\n */\nexport function unwrapNpmCmdShim(cmdPath: string): string | null {\n let content: string;\n try {\n content = fs.readFileSync(cmdPath, \"utf-8\");\n } catch {\n return null;\n }\n\n // Match the final line: \"%_prog%\" \"%dp0%\\...\\script.js\" %*\n // npm shims use %dp0% (directory of the .cmd file) as base\n const match = content.match(/\"%_prog%\"\\s+\"(%dp0%\\\\[^\"]+)\"\\s+%\\*/);\n if (!match) return null;\n\n const dp0 = path.dirname(cmdPath);\n const scriptRelative = match[1].replace(/%dp0%\\\\/g, \"\");\n const scriptPath = path.resolve(dp0, scriptRelative);\n\n if (!fs.existsSync(scriptPath)) return null;\n\n // Resolve node: prefer the local node next to the .cmd, else PATH node\n const localNode = path.join(dp0, \"node.exe\");\n const nodeCommand = fs.existsSync(localNode)\n ? localNode\n : (probeCommand([\"node.exe\", \"node\"]).command ?? \"node\");\n\n return `${nodeCommand}\\0${scriptPath}`;\n}\n\n/**\n * Split a resolved codex command into executable + prefix args.\n * If the command contains a NUL separator (from unwrapNpmCmdShim),\n * split on it. Otherwise return as-is with empty prefix args.\n */\nexport function splitResolvedCommand(resolved: string): {\n command: string;\n prefixArgs: string[];\n} {\n const parts = resolved.split(\"\\0\");\n if (parts.length === 2) {\n return { command: parts[0], prefixArgs: [parts[1]] };\n }\n return { command: resolved, prefixArgs: [] };\n}\n\nexport function resolvePowerShellCommand(): string {\n return (\n probeCommand([\"pwsh\", \"powershell\", \"powershell.exe\"]).command ??\n \"powershell\"\n );\n}\n\nexport function resolveAuthGatewayScript(repoRoot: string): string | null {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const resolvedModuleDir = path.resolve(moduleDir);\n const resolvedRepoRoot = path.resolve(repoRoot);\n\n const candidates = [\n // Bundled: dist/bridges/ sibling (npm install / built package)\n path.join(moduleDir, \"bridges\", \"codex-app-server-auth-gateway.mjs\"),\n // Source: src/bridges/ sibling (monorepo dev with ts runner)\n path.join(moduleDir, \"bridges\", \"codex-app-server-auth-gateway.ts\"),\n // Monorepo dist fallback\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 const resolved = path.resolve(candidate);\n // Verify the resolved path stays within moduleDir or repoRoot\n if (\n !resolved.startsWith(resolvedModuleDir + path.sep) &&\n !resolved.startsWith(resolvedRepoRoot + path.sep)\n ) {\n continue;\n }\n if (fs.existsSync(resolved)) {\n return resolved;\n }\n }\n\n return null;\n}\n","/**\n * Windows detached background spawn utilities for bridge/app-server processes.\n *\n * Extracted from engine/bridge.ts (Phase 3) to isolate wrapper generation,\n * hidden PowerShell launch, and listening PID discovery.\n *\n * @module engine/bridge-windows-spawn\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { spawnSync } from \"node:child_process\";\nimport type { Platform } from \"../types.js\";\nimport { stderrLogFilePath } from \"./bridge-paths.js\";\nimport {\n toPowerShellSingleQuotedString,\n toPowerShellStringArrayLiteral,\n removeFileIfExists,\n} from \"./bridge-file-io.js\";\nimport {\n resolvePowerShellCommand,\n splitResolvedCommand,\n} from \"./bridge-codex-command.js\";\n\nconst WINDOWS_SPAWN_WRAPPER_PREFIX = \"tap-spawn-\";\nconst WINDOWS_SPAWN_WRAPPER_STALE_MS = 60 * 60 * 1000;\n\nexport function cleanupStaleWindowsSpawnWrappers(now = Date.now()): void {\n let entries: string[];\n try {\n entries = fs.readdirSync(os.tmpdir());\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (\n !entry.startsWith(WINDOWS_SPAWN_WRAPPER_PREFIX) ||\n !/\\.(cmd|ps1)$/i.test(entry)\n ) {\n continue;\n }\n\n const wrapperPath = path.join(os.tmpdir(), entry);\n\n try {\n const stats = fs.statSync(wrapperPath);\n if (now - stats.mtimeMs < WINDOWS_SPAWN_WRAPPER_STALE_MS) {\n continue;\n }\n fs.unlinkSync(wrapperPath);\n } catch {\n // Best-effort cleanup only.\n }\n }\n}\n\nexport function buildWindowsDetachedWrapperScript(\n command: string,\n args: string[],\n logPath: string,\n stderrLogPath: string,\n env: NodeJS.ProcessEnv,\n): string {\n const lines = [\"$ErrorActionPreference = 'Stop'\"];\n\n for (const [key, value] of Object.entries(env)) {\n if (value !== undefined && value !== process.env[key]) {\n lines.push(\n `[Environment]::SetEnvironmentVariable(${toPowerShellSingleQuotedString(key)}, ${toPowerShellSingleQuotedString(value)}, 'Process')`,\n );\n }\n }\n\n lines.push(\n `$logPath = ${toPowerShellSingleQuotedString(logPath)}`,\n `$stderrLogPath = ${toPowerShellSingleQuotedString(stderrLogPath)}`,\n `$commandPath = ${toPowerShellSingleQuotedString(command)}`,\n `$commandArgs = ${toPowerShellStringArrayLiteral(args)}`,\n \"$exitCode = 1\",\n \"try {\",\n \" & $commandPath @commandArgs >> $logPath 2>> $stderrLogPath\",\n \" $exitCode = if ($null -ne $LASTEXITCODE) { $LASTEXITCODE } else { 0 }\",\n \"} finally {\",\n \" Remove-Item -LiteralPath $PSCommandPath -Force -ErrorAction SilentlyContinue\",\n \"}\",\n \"exit $exitCode\",\n );\n\n return `${lines.join(\"\\r\\n\")}\\r\\n`;\n}\n\n/**\n * Start a background process on Windows without creating a visible console window.\n *\n * Node.js `spawn({ detached: true })` sets `DETACHED_PROCESS` in CreateProcess,\n * which forces Windows to allocate a new console for console apps — even with\n * `windowsHide: true` (which only sets SW_HIDE, not CREATE_NO_WINDOW).\n * These two flags are mutually exclusive in the Windows API.\n *\n * Instead, we use PowerShell `Start-Process -WindowStyle Hidden` which internally\n * sets `ProcessStartInfo.CreateNoWindow = true`, preventing console allocation\n * entirely. A temp `.ps1` wrapper handles environment variables, robust argument\n * passing, append-mode log redirection, and self-cleans on normal exit.\n *\n * The returned PID is of the hidden PowerShell wrapper process, which stays alive\n * while the child runs.\n * `taskkill /PID <pid> /F /T` kills the entire tree.\n */\nexport function startWindowsDetachedProcess(\n command: string,\n args: string[],\n repoRoot: string,\n logPath: string,\n env: NodeJS.ProcessEnv = process.env,\n): number | null {\n const stderrLogPath = stderrLogFilePath(logPath);\n const powerShellCommand = resolvePowerShellCommand();\n\n cleanupStaleWindowsSpawnWrappers();\n\n const wrapperPath = path.join(\n os.tmpdir(),\n `${WINDOWS_SPAWN_WRAPPER_PREFIX}${randomBytes(4).toString(\"hex\")}.ps1`,\n );\n fs.writeFileSync(\n wrapperPath,\n buildWindowsDetachedWrapperScript(\n command,\n args,\n logPath,\n stderrLogPath,\n env,\n ),\n );\n\n const psCommand = [\n \"$p = Start-Process\",\n `-FilePath ${toPowerShellSingleQuotedString(powerShellCommand)}`,\n `-ArgumentList ${toPowerShellStringArrayLiteral([\"-NoLogo\", \"-NoProfile\", \"-File\", wrapperPath])}`,\n `-WorkingDirectory ${toPowerShellSingleQuotedString(repoRoot)}`,\n \"-WindowStyle Hidden\",\n \"-PassThru\",\n \"; Write-Output $p.Id\",\n ].join(\" \");\n\n const result = spawnSync(\n powerShellCommand,\n [\"-NoLogo\", \"-NoProfile\", \"-Command\", psCommand],\n {\n encoding: \"utf-8\",\n windowsHide: true,\n },\n );\n\n if (result.status !== 0) {\n removeFileIfExists(wrapperPath);\n return null;\n }\n\n const pid = parseInt(result.stdout.trim(), 10);\n if (!Number.isFinite(pid)) {\n removeFileIfExists(wrapperPath);\n return null;\n }\n\n return pid;\n}\n\nexport function startWindowsCodexAppServer(\n command: string,\n url: string,\n repoRoot: string,\n logPath: string,\n): number | null {\n const { command: exe, prefixArgs } = splitResolvedCommand(command);\n return startWindowsDetachedProcess(\n exe,\n [...prefixArgs, \"app-server\", \"--listen\", url],\n repoRoot,\n logPath,\n );\n}\n\nexport function 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","/**\n * Unix detached background spawn utilities for bridge/app-server processes.\n *\n * Extracted from inline non-Windows spawn paths to centralize detached launch\n * and listening PID discovery for macOS/Linux.\n *\n * @module engine/bridge-unix-spawn\n */\n\nimport * as fs from \"node:fs\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport type { Platform } from \"../types.js\";\nimport { splitResolvedCommand } from \"./bridge-codex-command.js\";\nimport { stderrLogFilePath } from \"./bridge-paths.js\";\n\nconst DEFAULT_UNIX_PLATFORM: Platform =\n process.platform === \"darwin\" ? \"darwin\" : \"linux\";\n\nfunction resolveUnixSpawnCommand(\n command: string,\n args: string[],\n platform: Platform,\n): { command: string; args: string[] } {\n if (platform === \"linux\") {\n // `nohup` keeps the child immune to SIGHUP when launched from SSH/login shells.\n return {\n command: \"nohup\",\n args: [command, ...args],\n };\n }\n\n return { command, args };\n}\n\nfunction findListeningPidWithLsof(port: number): number | null {\n const result = spawnSync(\n \"lsof\",\n [\"-nP\", `-iTCP:${port}`, \"-sTCP:LISTEN\", \"-t\"],\n {\n encoding: \"utf-8\",\n windowsHide: true,\n },\n );\n\n if (!result || 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\nfunction findListeningPidWithSs(port: number): number | null {\n const result = spawnSync(\"ss\", [\"-ltnpH\", `sport = :${port}`], {\n encoding: \"utf-8\",\n windowsHide: true,\n });\n\n if (!result || result.status !== 0) {\n return null;\n }\n\n const match = (result.stdout ?? \"\").match(/\\bpid=(\\d+)\\b/);\n if (!match) {\n return null;\n }\n\n const parsedPid = Number.parseInt(match[1], 10);\n return Number.isFinite(parsedPid) ? parsedPid : null;\n}\n\nexport function startUnixDetachedProcess(\n command: string,\n args: string[],\n repoRoot: string,\n logPath: string,\n env: NodeJS.ProcessEnv = process.env,\n platform: Platform = DEFAULT_UNIX_PLATFORM,\n): number | null {\n const stderrPath = stderrLogFilePath(logPath);\n let logFd: number | null = null;\n let stderrFd: number | null = null;\n\n try {\n logFd = fs.openSync(logPath, \"a\");\n stderrFd = fs.openSync(stderrPath, \"a\");\n const launch = resolveUnixSpawnCommand(command, args, platform);\n\n const child = spawn(launch.command, launch.args, {\n cwd: repoRoot,\n detached: true,\n stdio: [\"ignore\", logFd, stderrFd],\n env,\n windowsHide: true,\n });\n\n child.unref();\n return child.pid ?? null;\n } finally {\n if (logFd != null) {\n fs.closeSync(logFd);\n }\n if (stderrFd != null) {\n fs.closeSync(stderrFd);\n }\n }\n}\n\nexport function startUnixCodexAppServer(\n command: string,\n url: string,\n repoRoot: string,\n logPath: string,\n platform: Platform = DEFAULT_UNIX_PLATFORM,\n): number | null {\n const { command: exe, prefixArgs } = splitResolvedCommand(command);\n return startUnixDetachedProcess(\n exe,\n [...prefixArgs, \"app-server\", \"--listen\", url],\n repoRoot,\n logPath,\n process.env,\n platform,\n );\n}\n\nexport function findUnixListeningProcessId(\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 if (platform === \"linux\") {\n const ssPid = findListeningPidWithSs(port);\n if (ssPid != null) {\n return ssPid;\n }\n }\n\n return findListeningPidWithLsof(port);\n}\n","import { execSync, spawnSync } from \"node:child_process\";\nimport type { AppServerState, Platform } from \"../types.js\";\nimport { delay } from \"./bridge-port-network.js\";\nimport { removeFileIfExists } from \"./bridge-file-io.js\";\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\nfunction getUnixProcessGroupId(pid: number): number | null {\n const result = spawnSync(\"ps\", [\"-o\", \"pgid=\", \"-p\", String(pid)], {\n encoding: \"utf-8\",\n windowsHide: true,\n });\n\n if (!result || result.status !== 0) {\n return null;\n }\n\n const parsed = Number.parseInt((result.stdout ?? \"\").trim(), 10);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction isUnixProcessGroupAlive(processGroupId: number): boolean {\n try {\n process.kill(-processGroupId, 0);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async 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 const processGroupId = getUnixProcessGroupId(pid);\n const signalTarget = processGroupId != null ? -processGroupId : pid;\n const isTargetAlive = (): boolean =>\n processGroupId != null\n ? isUnixProcessGroupAlive(processGroupId)\n : isProcessAlive(pid);\n\n process.kill(signalTarget, \"SIGTERM\");\n await delay(2_000);\n if (isTargetAlive()) {\n process.kill(signalTarget, \"SIGKILL\");\n await delay(500);\n }\n\n return !isTargetAlive();\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","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { InstanceId, BridgeState } from \"../types.js\";\nimport { loadState } from \"../state.js\";\nimport { loadInstanceConfig } from \"../config/instance-config.js\";\n\n/**\n * Resolve agent name: explicit > instance config > 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 // Instance config (Phase 1-2 source-of-truth)\n if (context?.stateDir) {\n try {\n const instConfig = loadInstanceConfig(context.stateDir, instanceId);\n if (instConfig?.agentName) return instConfig.agentName;\n } catch {\n // instance config read failed — fall through\n }\n }\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","/**\n * Bridge state management — persistence, process liveness, runtime state readers.\n *\n * Extracted from engine/bridge.ts (Phase 2) to isolate state CRUD and\n * runtime heartbeat/thread readers.\n * Observability helpers (heartbeat age, turn stuck, log rotation) live in\n * bridge-observability.ts.\n *\n * @module engine/bridge-state\n */\n\nimport * as fs from \"node:fs\";\nimport type {\n InstanceId,\n BridgeLifecycleRecord,\n BridgeState,\n PersistedBridgeLifecycleState,\n} from \"../types.js\";\nimport {\n pidFilePath,\n runtimeHeartbeatFilePath,\n runtimeThreadStateFilePath,\n} from \"./bridge-paths.js\";\nimport { writeProtectedTextFile } from \"./bridge-file-io.js\";\nimport { isProcessAlive } from \"./bridge-process-control.js\";\n\n// ─── Types ────────────────────────────────────────────────────\n\nexport interface RuntimeBridgeHeartbeat {\n updatedAt?: string;\n threadId?: string | null;\n threadCwd?: string | null;\n activeTurnId?: string | null;\n turnStartedAt?: string | null;\n lastTurnStatus?: string | null;\n lastTurnAt?: string | null;\n lastDispatchAt?: string | null;\n idleSince?: string | null;\n turnState?: \"active\" | \"idle\" | \"waiting-approval\" | \"disconnected\" | null;\n lastError?: string | null;\n connected?: boolean;\n initialized?: boolean;\n}\n\nexport interface RuntimeBridgeThreadState {\n threadId: string;\n updatedAt?: string;\n appServerUrl?: string;\n ephemeral?: boolean;\n cwd?: string | null;\n}\n\n// ─── Persisted lifecycle helpers ──────────────────────────────\n\nexport function transitionBridgeLifecycle(\n previous: BridgeLifecycleRecord | null | undefined,\n nextState: PersistedBridgeLifecycleState,\n reason: string | null,\n options?: {\n at?: string;\n incrementRestart?: boolean;\n },\n): BridgeLifecycleRecord {\n const at = options?.at ?? new Date().toISOString();\n const changed = previous?.state !== nextState;\n\n return {\n state: nextState,\n since: changed || !previous?.since ? at : previous.since,\n updatedAt: at,\n lastTransitionAt:\n changed || !previous?.lastTransitionAt ? at : previous.lastTransitionAt,\n lastTransitionReason:\n changed || previous?.lastTransitionReason == null\n ? reason\n : previous.lastTransitionReason,\n restartCount:\n (previous?.restartCount ?? 0) + (options?.incrementRestart ? 1 : 0),\n };\n}\n\n// ─── Runtime state readers ────────────────────────────────────\n\nexport function loadRuntimeBridgeHeartbeat(\n bridgeState:\n | {\n runtimeStateDir?: string | null;\n }\n | null\n | undefined,\n): RuntimeBridgeHeartbeat | null {\n const runtimeStateDir = bridgeState?.runtimeStateDir;\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 return JSON.parse(\n fs.readFileSync(heartbeatPath, \"utf-8\"),\n ) as RuntimeBridgeHeartbeat;\n } catch {\n return null;\n }\n}\n\nexport function loadRuntimeBridgeThreadState(\n bridgeState:\n | {\n runtimeStateDir?: string | null;\n }\n | null\n | undefined,\n): RuntimeBridgeThreadState | null {\n const runtimeStateDir = bridgeState?.runtimeStateDir;\n if (!runtimeStateDir) {\n return null;\n }\n\n const threadPath = runtimeThreadStateFilePath(runtimeStateDir);\n if (!fs.existsSync(threadPath)) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(\n fs.readFileSync(threadPath, \"utf-8\"),\n ) as RuntimeBridgeThreadState;\n return parsed.threadId ? parsed : null;\n } catch {\n return null;\n }\n}\n\n// ─── Bridge state CRUD ────────────────────────────────────────\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\n// ─── Process liveness ─────────────────────────────────────────\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 * Bridge observability — heartbeat monitoring, turn stuck detection, log rotation.\n *\n * Consolidated from bridge-state.ts (heartbeat/turn functions) and\n * bridge-log-rotate.ts into a single observability module.\n *\n * @module engine/bridge-observability\n */\n\nimport * as fs from \"node:fs\";\nimport type { InstanceId, BridgeState } from \"../types.js\";\nimport {\n loadBridgeState,\n saveBridgeState,\n clearBridgeState,\n loadRuntimeBridgeHeartbeat,\n} from \"./bridge-state.js\";\nimport { isProcessAlive } from \"./bridge-process-control.js\";\n\n// ─── Re-export for convenience (moved from bridge-state.ts) ──\n\n// ─── Heartbeat ────────────────────────────────────────────────\n\n/**\n * Resolve the most recent heartbeat timestamp from runtime or persisted state.\n */\nfunction loadRuntimeHeartbeatTimestamp(\n runtimeStateDir: string | null | undefined,\n): string | null {\n const heartbeat = loadRuntimeBridgeHeartbeat({ runtimeStateDir });\n return typeof heartbeat?.updatedAt === \"string\" ? heartbeat.updatedAt : null;\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\n/**\n * Update the heartbeat timestamp for a running bridge.\n * Only the owning process (matching PID) can update the heartbeat.\n */\nexport function updateBridgeHeartbeat(\n stateDir: string,\n instanceId: InstanceId,\n): void {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return;\n\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\n// ─── Bridge status ────────────────────────────────────────────\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 if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return \"stale\";\n }\n\n return \"running\";\n}\n\n// ─── Turn stuck detection ─────────────────────────────────────\n\nexport interface TurnInfo {\n activeTurnId: string | null;\n lastTurnStatus: string | null;\n updatedAt: string | null;\n ageSeconds: number | null;\n stuck: boolean;\n}\n\n/**\n * Get current turn info from runtime heartbeat.\n * A turn is considered stuck if activeTurnId is set and turnStartedAt\n * exceeds the threshold.\n */\nexport function getTurnInfo(\n stateDir: string,\n instanceId: InstanceId,\n stuckThresholdSeconds: number = 300,\n): TurnInfo | null {\n const state = loadBridgeState(stateDir, instanceId);\n if (!state) return null;\n\n const heartbeat = loadRuntimeBridgeHeartbeat(state);\n if (!heartbeat) return null;\n\n const activeTurnId = heartbeat.activeTurnId ?? null;\n const lastTurnStatus = heartbeat.lastTurnStatus ?? null;\n const turnTimestamp = heartbeat.turnStartedAt ?? null;\n const updatedAt = turnTimestamp ?? heartbeat.updatedAt ?? null;\n\n let ageSeconds: number | null = null;\n if (turnTimestamp) {\n const ts = new Date(turnTimestamp).getTime();\n if (!isNaN(ts)) {\n ageSeconds = Math.floor((Date.now() - ts) / 1000);\n }\n }\n\n const stuck =\n activeTurnId !== null &&\n ageSeconds !== null &&\n ageSeconds > stuckThresholdSeconds;\n\n return { activeTurnId, lastTurnStatus, updatedAt, ageSeconds, stuck };\n}\n\n/**\n * Check if a bridge's current turn is stuck.\n */\nexport function isTurnStuck(\n stateDir: string,\n instanceId: InstanceId,\n thresholdSeconds: number = 300,\n): boolean {\n const info = getTurnInfo(stateDir, instanceId, thresholdSeconds);\n return info?.stuck ?? false;\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","import type {\n BridgeLifecycleRecord,\n BridgeState,\n InstanceId,\n} from \"../types.js\";\nimport type {\n RuntimeBridgeHeartbeat,\n RuntimeBridgeThreadState,\n} from \"./bridge-state.js\";\nimport {\n loadBridgeState,\n loadRuntimeBridgeHeartbeat,\n loadRuntimeBridgeThreadState,\n} from \"./bridge-state.js\";\nimport { getBridgeStatus } from \"./bridge-observability.js\";\n\nexport type BridgePresence =\n | \"bridge-live\"\n | \"bridge-stale\"\n | \"stopped\";\n\nexport type BridgeLifecycleStatus =\n | \"ready\"\n | \"initializing\"\n | \"degraded-no-thread\"\n | \"bridge-stale\"\n | \"stopped\";\n\nexport interface BridgeLifecycleSnapshot {\n presence: BridgePresence;\n status: BridgeLifecycleStatus;\n summary: string;\n lastTransitionAt: string | null;\n lastTransitionReason: string | null;\n restartCount: number;\n threadId: string | null;\n threadCwd: string | null;\n savedThreadId: string | null;\n savedThreadCwd: string | null;\n activeTurnId: string | null;\n connected: boolean | null;\n initialized: boolean | null;\n appServerHealthy: boolean | null;\n}\n\nexport interface DeriveBridgeLifecycleOptions {\n bridgeStatus: \"running\" | \"stopped\" | \"stale\";\n bridgeState?: BridgeState | null;\n runtimeHeartbeat?: RuntimeBridgeHeartbeat | null;\n savedThread?: RuntimeBridgeThreadState | null;\n persistedLifecycle?: BridgeLifecycleRecord | null;\n}\n\nfunction lifecycleMeta(\n persistedLifecycle: BridgeLifecycleRecord | null | undefined,\n): Pick<\n BridgeLifecycleSnapshot,\n \"lastTransitionAt\" | \"lastTransitionReason\" | \"restartCount\"\n> {\n return {\n lastTransitionAt: persistedLifecycle?.lastTransitionAt ?? null,\n lastTransitionReason: persistedLifecycle?.lastTransitionReason ?? null,\n restartCount: persistedLifecycle?.restartCount ?? 0,\n };\n}\n\nexport function resolveBridgeLifecycleSnapshot(\n stateDir: string,\n instanceId: InstanceId,\n fallbackBridgeState?: BridgeState | null,\n persistedLifecycle?: BridgeLifecycleRecord | null,\n): BridgeLifecycleSnapshot {\n const persistedBridgeState =\n loadBridgeState(stateDir, instanceId) ?? fallbackBridgeState ?? null;\n const bridgeStatus = getBridgeStatus(stateDir, instanceId);\n const bridgeState =\n bridgeStatus === \"running\"\n ? loadBridgeState(stateDir, instanceId) ?? persistedBridgeState\n : persistedBridgeState;\n\n return deriveBridgeLifecycleState({\n bridgeStatus,\n bridgeState,\n runtimeHeartbeat: loadRuntimeBridgeHeartbeat(bridgeState),\n savedThread: loadRuntimeBridgeThreadState(bridgeState),\n persistedLifecycle,\n });\n}\n\nexport function deriveBridgeLifecycleState(\n options: DeriveBridgeLifecycleOptions,\n): BridgeLifecycleSnapshot {\n const runtimeHeartbeat = options.runtimeHeartbeat ?? null;\n const savedThread = options.savedThread ?? null;\n const meta = lifecycleMeta(\n options.persistedLifecycle ?? options.bridgeState?.lifecycle ?? null,\n );\n\n if (options.bridgeStatus === \"stopped\") {\n return {\n presence: \"stopped\",\n status: \"stopped\",\n summary: \"stopped\",\n ...meta,\n threadId: null,\n threadCwd: null,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n activeTurnId: null,\n connected: null,\n initialized: null,\n appServerHealthy: options.bridgeState?.appServer?.healthy ?? null,\n };\n }\n\n if (options.bridgeStatus === \"stale\") {\n return {\n presence: \"bridge-stale\",\n status: \"bridge-stale\",\n summary: \"bridge-stale\",\n ...meta,\n threadId: runtimeHeartbeat?.threadId ?? null,\n threadCwd: runtimeHeartbeat?.threadCwd ?? null,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n activeTurnId: runtimeHeartbeat?.activeTurnId ?? null,\n connected: runtimeHeartbeat?.connected ?? null,\n initialized: runtimeHeartbeat?.initialized ?? null,\n appServerHealthy: options.bridgeState?.appServer?.healthy ?? null,\n };\n }\n\n const appServerHealthy = options.bridgeState?.appServer?.healthy ?? null;\n const threadId = runtimeHeartbeat?.threadId ?? null;\n const threadCwd = runtimeHeartbeat?.threadCwd ?? null;\n const connected = runtimeHeartbeat?.connected ?? null;\n const initialized = runtimeHeartbeat?.initialized ?? null;\n\n if (!runtimeHeartbeat) {\n return {\n presence: \"bridge-live\",\n status: \"initializing\",\n summary: \"bridge-live, initializing\",\n ...meta,\n threadId: null,\n threadCwd: null,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n activeTurnId: null,\n connected: null,\n initialized: null,\n appServerHealthy,\n };\n }\n\n if (initialized === false) {\n return {\n presence: \"bridge-live\",\n status: \"initializing\",\n summary: \"bridge-live, initializing\",\n ...meta,\n threadId,\n threadCwd,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n activeTurnId: runtimeHeartbeat.activeTurnId ?? null,\n connected,\n initialized,\n appServerHealthy,\n };\n }\n\n if (threadId && connected !== false) {\n return {\n presence: \"bridge-live\",\n status: \"ready\",\n summary: \"bridge-live, ready\",\n ...meta,\n threadId,\n threadCwd,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n activeTurnId: runtimeHeartbeat.activeTurnId ?? null,\n connected,\n initialized,\n appServerHealthy,\n };\n }\n\n const degradedReason = savedThread?.threadId\n ? \"saved thread only\"\n : connected === false\n ? \"disconnected\"\n : \"no active thread\";\n\n return {\n presence: \"bridge-live\",\n status: \"degraded-no-thread\",\n summary: `bridge-live, degraded-no-thread (${degradedReason})`,\n ...meta,\n threadId,\n threadCwd,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n activeTurnId: runtimeHeartbeat.activeTurnId ?? null,\n connected,\n initialized,\n appServerHealthy,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { RuntimeBridgeHeartbeat } from \"./bridge-state.js\";\n\nexport type CodexSessionTurnState =\n | \"active\"\n | \"idle\"\n | \"waiting-approval\"\n | \"disconnected\";\n\nexport type CodexSessionStatus =\n | \"initializing\"\n | \"active\"\n | \"idle\"\n | \"waiting-approval\"\n | \"disconnected\";\n\nexport interface CodexSessionSnapshot {\n status: CodexSessionStatus;\n turnState: CodexSessionTurnState | null;\n summary: string;\n activeTurnId: string | null;\n lastTurnAt: string | null;\n lastDispatchAt: string | null;\n idleSince: string | null;\n connected: boolean | null;\n initialized: boolean | null;\n}\n\ninterface LastDispatchRecord {\n dispatchedAt?: string;\n}\n\nexport interface DeriveCodexSessionOptions {\n runtimeHeartbeat?: RuntimeBridgeHeartbeat | null;\n runtimeStateDir?: string | null;\n}\n\nfunction readLastDispatchAt(\n runtimeStateDir: string | null | undefined,\n): string | null {\n if (!runtimeStateDir) return null;\n\n const filePath = path.join(runtimeStateDir, \"last-dispatch.json\");\n if (!fs.existsSync(filePath)) return null;\n\n try {\n const parsed = JSON.parse(\n fs.readFileSync(filePath, \"utf-8\"),\n ) as LastDispatchRecord;\n return typeof parsed.dispatchedAt === \"string\" ? parsed.dispatchedAt : null;\n } catch {\n return null;\n }\n}\n\nfunction formatIdleSummary(idleSince: string | null): string {\n if (!idleSince) return \"idle\";\n return `idle since ${idleSince}`;\n}\n\nexport function deriveCodexSessionState(\n options: DeriveCodexSessionOptions,\n): CodexSessionSnapshot {\n const runtimeHeartbeat = options.runtimeHeartbeat ?? null;\n\n if (!runtimeHeartbeat) {\n return {\n status: \"initializing\",\n turnState: null,\n summary: \"initializing\",\n activeTurnId: null,\n lastTurnAt: null,\n lastDispatchAt: null,\n idleSince: null,\n connected: null,\n initialized: null,\n };\n }\n\n const turnState = runtimeHeartbeat.turnState ?? null;\n const activeTurnId = runtimeHeartbeat.activeTurnId ?? null;\n const lastTurnAt = runtimeHeartbeat.lastTurnAt ?? null;\n const lastDispatchAt =\n runtimeHeartbeat.lastDispatchAt ??\n readLastDispatchAt(options.runtimeStateDir) ??\n null;\n const idleSince = runtimeHeartbeat.idleSince ?? null;\n const connected = runtimeHeartbeat.connected ?? null;\n const initialized = runtimeHeartbeat.initialized ?? null;\n\n if (initialized === false) {\n return {\n status: \"initializing\",\n turnState,\n summary: \"initializing\",\n activeTurnId,\n lastTurnAt,\n lastDispatchAt,\n idleSince,\n connected,\n initialized,\n };\n }\n\n if (turnState === \"active\" || activeTurnId) {\n return {\n status: \"active\",\n turnState: \"active\",\n summary: activeTurnId ? `active turn ${activeTurnId}` : \"active\",\n activeTurnId,\n lastTurnAt,\n lastDispatchAt,\n idleSince: null,\n connected,\n initialized,\n };\n }\n\n if (turnState === \"waiting-approval\") {\n return {\n status: \"waiting-approval\",\n turnState,\n summary: `waiting-approval (${formatIdleSummary(idleSince)})`,\n activeTurnId,\n lastTurnAt,\n lastDispatchAt,\n idleSince,\n connected,\n initialized,\n };\n }\n\n if (turnState === \"disconnected\" || connected === false) {\n return {\n status: \"disconnected\",\n turnState: \"disconnected\",\n summary: \"disconnected\",\n activeTurnId,\n lastTurnAt,\n lastDispatchAt,\n idleSince: null,\n connected,\n initialized,\n };\n }\n\n return {\n status: \"idle\",\n turnState: turnState === \"idle\" ? turnState : \"idle\",\n summary: formatIdleSummary(idleSince),\n activeTurnId,\n lastTurnAt,\n lastDispatchAt,\n idleSince,\n connected,\n initialized,\n };\n}\n","import * as net from \"node:net\";\nimport type { AppServerState } from \"../types.js\";\nimport { getWebSocketCtor, delay } from \"./bridge-port-network.js\";\n\nexport interface 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\nexport type WebSocketCtor = new (\n url: string,\n protocols?: string | string[],\n) => WebSocketLike;\n\nexport const APP_SERVER_HEALTH_TIMEOUT_MS = 1_500;\nexport const APP_SERVER_HEALTH_RETRY_MS = 250;\nexport const APP_SERVER_READYZ_PATH = \"/readyz\";\n\nexport const AUTH_SUBPROTOCOL_PREFIX = \"tap-auth-\";\n\nexport type AppServerReadyzStatus = \"ready\" | \"not-ready\" | \"unsupported\";\n\nexport async function checkAppServerHealth(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n gatewayToken?: string | null,\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 // Authenticate via WebSocket subprotocol when a gateway token is provided.\n const protocols = gatewayToken\n ? [`${AUTH_SUBPROTOCOL_PREFIX}${gatewayToken}`]\n : undefined;\n socket = new WebSocket(url, protocols);\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\nexport async function waitForAppServerHealth(\n url: string,\n timeoutMs: number,\n gatewayToken?: string | null,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n if (\n await checkAppServerHealth(\n url,\n APP_SERVER_HEALTH_TIMEOUT_MS,\n gatewayToken,\n )\n ) {\n return true;\n }\n await delay(APP_SERVER_HEALTH_RETRY_MS);\n }\n\n return false;\n}\n\nexport function buildAppServerReadyzUrl(url: string): string | null {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return null;\n }\n\n if (parsed.protocol === \"ws:\") {\n parsed.protocol = \"http:\";\n } else if (parsed.protocol === \"wss:\") {\n parsed.protocol = \"https:\";\n } else if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n\n parsed.pathname = APP_SERVER_READYZ_PATH;\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n}\n\nexport async function checkAppServerReadyz(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n): Promise<AppServerReadyzStatus> {\n const readyzUrl = buildAppServerReadyzUrl(url);\n if (!readyzUrl) {\n return \"unsupported\";\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(readyzUrl, {\n method: \"GET\",\n signal: controller.signal,\n headers: {\n accept: \"application/json\",\n },\n });\n\n if (response.ok) {\n return \"ready\";\n }\n\n if (\n response.status === 400 ||\n response.status === 404 ||\n response.status === 405 ||\n response.status === 426 ||\n response.status === 501\n ) {\n return \"unsupported\";\n }\n\n return \"not-ready\";\n } catch {\n return \"not-ready\";\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Check if a TCP port is accepting connections (without WebSocket upgrade).\n * Use this for managed startup health checks to avoid creating app-server sessions.\n */\nexport async function checkTcpPortListening(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n): Promise<boolean> {\n let hostname: string;\n let port: number;\n try {\n const parsed = new URL(url.replace(/^ws/, \"http\"));\n hostname = parsed.hostname;\n port = parseInt(parsed.port, 10);\n } catch {\n return false;\n }\n if (!port || !Number.isFinite(port)) return false;\n\n return new Promise<boolean>((resolve) => {\n const socket = net.createConnection({ host: hostname, port });\n const timer = setTimeout(() => {\n socket.destroy();\n resolve(false);\n }, timeoutMs);\n\n socket.once(\"connect\", () => {\n clearTimeout(timer);\n socket.destroy();\n resolve(true);\n });\n socket.once(\"error\", () => {\n clearTimeout(timer);\n socket.destroy();\n resolve(false);\n });\n });\n}\n\n/**\n * Wait for a TCP port to start accepting connections.\n * Does NOT open a WebSocket, so no app-server session is created.\n */\nexport async function waitForTcpPortListening(\n url: string,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n if (await checkTcpPortListening(url, APP_SERVER_HEALTH_TIMEOUT_MS)) {\n return true;\n }\n await delay(APP_SERVER_HEALTH_RETRY_MS);\n }\n\n return false;\n}\n\nexport async function checkManagedAppServerReady(\n url: string,\n timeoutMs: number = APP_SERVER_HEALTH_TIMEOUT_MS,\n): Promise<boolean> {\n const readyzStatus = await checkAppServerReadyz(url, timeoutMs);\n if (readyzStatus === \"ready\") {\n return true;\n }\n\n if (readyzStatus === \"unsupported\") {\n return checkTcpPortListening(url, timeoutMs);\n }\n\n return false;\n}\n\nexport async function waitForManagedAppServerReady(\n url: string,\n timeoutMs: number,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const remaining = Math.max(\n 1,\n Math.min(APP_SERVER_HEALTH_TIMEOUT_MS, deadline - Date.now()),\n );\n if (await checkManagedAppServerReady(url, remaining)) {\n return true;\n }\n await delay(APP_SERVER_HEALTH_RETRY_MS);\n }\n\n return false;\n}\n\nexport function markAppServerHealthy(\n appServer: AppServerState,\n): AppServerState {\n const checkedAt = new Date().toISOString();\n return {\n ...appServer,\n healthy: true,\n lastCheckedAt: checkedAt,\n lastHealthyAt: checkedAt,\n };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport type {\n InstanceId,\n AppServerState,\n AppServerAuthState,\n Platform,\n} from \"../types.js\";\nimport { resolveNodeRuntime, buildRuntimeEnv } from \"../runtime/index.js\";\nimport {\n appServerGatewayTokenFilePath,\n appServerGatewayLogFilePath,\n} from \"./bridge-paths.js\";\nimport {\n writeProtectedTextFile,\n removeFileIfExists,\n} from \"./bridge-file-io.js\";\nimport { allocateLoopbackPort } from \"./bridge-port-network.js\";\nimport { resolveAuthGatewayScript } from \"./bridge-codex-command.js\";\nimport { isProcessAlive } from \"./bridge-process-control.js\";\nimport { startWindowsDetachedProcess } from \"./bridge-windows-spawn.js\";\nimport { startUnixDetachedProcess } from \"./bridge-unix-spawn.js\";\nimport { rotateLog } from \"./bridge-observability.js\";\nimport {\n checkAppServerHealth,\n waitForAppServerHealth,\n} from \"./bridge-app-server-health.js\";\n\nexport { AUTH_SUBPROTOCOL_PREFIX } from \"./bridge-app-server-health.js\";\n\ninterface ManagedAppServerGatewayOptions {\n instanceId: InstanceId;\n stateDir: string;\n repoRoot: string;\n platform: Platform;\n publicUrl: string;\n}\n\nexport function buildProtectedAppServerUrl(\n publicUrl: string,\n _token: string,\n): string {\n // Subprotocol auth: token is no longer embedded in the URL.\n // Kept for backward compatibility with state display — shows base URL only.\n return publicUrl;\n}\n\nexport function readGatewayTokenFromPath(tokenPath: string): string {\n return fs.readFileSync(tokenPath, \"utf8\").trim();\n}\n\nexport function 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\nexport function 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\nexport async 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 try {\n gatewayPid =\n options.platform === \"win32\"\n ? startWindowsDetachedProcess(\n runtime.command,\n gatewayArgs,\n options.repoRoot,\n gatewayLogPath,\n gatewayEnv,\n )\n : startUnixDetachedProcess(\n runtime.command,\n gatewayArgs,\n options.repoRoot,\n gatewayLogPath,\n gatewayEnv,\n options.platform,\n );\n } catch (error) {\n removeFileIfExists(tokenPath);\n throw error;\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: \"subprotocol\",\n protectedUrl,\n upstreamUrl: upstreamUrl.toString().replace(/\\/$/, \"\"),\n tokenPath,\n gatewayPid,\n gatewayLogPath,\n };\n}\n\nexport function 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\nexport { checkAppServerHealth, waitForAppServerHealth };\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","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type {\n InstanceId,\n BridgeState,\n AppServerState,\n Platform,\n} from \"../types.js\";\n\nimport { appServerLogFilePath } from \"./bridge-paths.js\";\nimport { removeFileIfExists } from \"./bridge-file-io.js\";\nimport { isLoopbackHost } from \"./bridge-port-network.js\";\nimport { resolveCodexCommand } from \"./bridge-codex-command.js\";\nimport {\n startWindowsCodexAppServer,\n findListeningProcessId,\n} from \"./bridge-windows-spawn.js\";\nimport {\n startUnixCodexAppServer,\n findUnixListeningProcessId,\n} from \"./bridge-unix-spawn.js\";\nimport { terminateProcess, isProcessAlive } from \"./bridge-process-control.js\";\nimport {\n checkAppServerHealth,\n waitForManagedAppServerReady,\n markAppServerHealthy,\n} from \"./bridge-app-server-health.js\";\nimport {\n readGatewayToken,\n createManagedAppServerAuth,\n canReuseManagedAppServer,\n} from \"./bridge-app-server-auth.js\";\nimport { rotateLog } from \"./bridge-observability.js\";\n\nexport interface 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\nexport const DEFAULT_APP_SERVER_URL = \"ws://127.0.0.1:4501\";\nexport const APP_SERVER_START_TIMEOUT_MS = 20_000;\nexport const APP_SERVER_GATEWAY_START_TIMEOUT_MS = 5_000;\n\n/**\n * Check if any OTHER running bridge is using the same managed app-server.\n * Used to prevent killing a shared app-server when one bridge fails to start.\n */\nexport function isAppServerUsedByOtherBridge(\n stateDir: string,\n excludeInstanceId: InstanceId,\n appServer: AppServerState,\n): boolean {\n const pidDir = path.join(stateDir, \"pids\");\n if (!fs.existsSync(pidDir)) return false;\n\n for (const name of fs.readdirSync(pidDir)) {\n if (!name.startsWith(\"bridge-\") || !name.endsWith(\".json\")) continue;\n const otherId = name.slice(\"bridge-\".length, -\".json\".length);\n if (otherId === excludeInstanceId) continue;\n\n try {\n const raw = fs.readFileSync(path.join(pidDir, name), \"utf-8\");\n const state = JSON.parse(raw) as BridgeState;\n if (\n state.appServer?.url === appServer.url &&\n state.appServer?.pid === appServer.pid &&\n isProcessAlive(state.pid)\n ) {\n return true;\n }\n } catch {\n continue;\n }\n }\n return false;\n}\n\nexport function 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\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 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 try {\n pid = startUnixCodexAppServer(\n resolvedCommand,\n effectiveUrl,\n options.repoRoot,\n logPath,\n options.platform,\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 }\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 // Managed startup uses HTTP /readyz (with TCP fallback for older servers)\n // so readiness is verified without opening an extra WebSocket session.\n const healthy = await waitForManagedAppServerReady(\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 =\n (options.platform === \"win32\"\n ? findListeningProcessId(effectiveUrl, options.platform)\n : findUnixListeningProcessId(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 try {\n pid = startUnixCodexAppServer(\n resolvedCommand,\n auth.upstreamUrl,\n options.repoRoot,\n logPath,\n options.platform,\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 }\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 // Managed startup uses HTTP /readyz (with TCP fallback for older servers)\n // so readiness is verified without opening an extra WebSocket session.\n const healthy = await waitForManagedAppServerReady(\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 // Gateway readiness hits /readyz on the public URL, which verifies the\n // gateway itself plus upstream readiness end-to-end without creating a\n // WebSocket session.\n const gatewayHealthy = await waitForManagedAppServerReady(\n effectiveUrl,\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 =\n (options.platform === \"win32\"\n ? findListeningProcessId(auth.upstreamUrl, options.platform)\n : findUnixListeningProcessId(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\nexport function formatCodexAppServerCommand(\n command: string,\n url: string,\n): string {\n return `${command} app-server --listen ${url}`;\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport type {\n RuntimeName,\n InstanceId,\n BridgeLifecycleRecord,\n BridgeState,\n AppServerState,\n HeadlessConfig,\n Platform,\n} from \"../types.js\";\nimport { resolveNodeRuntime, buildRuntimeEnv } from \"../runtime/index.js\";\n\nimport { pidFilePath, logFilePath } from \"./bridge-paths.js\";\nimport { startWindowsDetachedProcess } from \"./bridge-windows-spawn.js\";\nimport { startUnixDetachedProcess } from \"./bridge-unix-spawn.js\";\nimport { isProcessAlive, stopManagedAppServer } from \"./bridge-process-control.js\";\nimport { resolveAgentName } from \"./bridge-config.js\";\nimport {\n loadBridgeState,\n saveBridgeState,\n clearBridgeState,\n isBridgeRunning,\n transitionBridgeLifecycle,\n} from \"./bridge-state.js\";\nimport { materializeGatewayTokenFile } from \"./bridge-app-server-auth.js\";\nimport { rotateLog } from \"./bridge-observability.js\";\nimport {\n isAppServerUsedByOtherBridge,\n resolveAppServerUrl,\n ensureCodexAppServer,\n} from \"./bridge-app-server-lifecycle.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 /** Persisted lifecycle from the previous session, used to track restarts. */\n previousLifecycle?: BridgeLifecycleRecord | null;\n}\n\nexport function getBridgeRuntimeStateDir(\n repoRoot: string,\n instanceId: InstanceId,\n): string {\n const resolved = path.resolve(\n path.join(repoRoot, \".tmp\", `codex-app-server-bridge-${instanceId}`),\n );\n const expectedBase = path.resolve(repoRoot, \".tmp\") + path.sep;\n if (!resolved.startsWith(expectedBase)) {\n throw new Error(\n `Path traversal blocked: runtime state dir escapes .tmp/ directory`,\n );\n }\n return resolved;\n}\n\ntype CommsHeartbeatRecord = {\n id?: string;\n agent?: string;\n timestamp?: string;\n lastActivity?: string;\n joinedAt?: string;\n status?: string;\n source?: \"bridge-dispatch\" | \"mcp-direct\";\n instanceId?: string | null;\n bridgePid?: number | null;\n connectHash?: string;\n};\n\nconst STALE_DIRECT_HEARTBEAT_MS = 5 * 60 * 1000;\n\nfunction warnHeartbeatCleanup(instanceId: InstanceId, message: string): void {\n console.warn(\n `[tap] heartbeat cleanup skipped for ${instanceId}: ${message}`,\n );\n}\n\nfunction getHeartbeatActivityMs(record: CommsHeartbeatRecord): number | null {\n const timestamp = new Date(record.lastActivity ?? record.timestamp ?? 0).getTime();\n return Number.isFinite(timestamp) ? timestamp : null;\n}\n\nfunction isSameInstanceHeartbeat(\n key: string,\n heartbeat: CommsHeartbeatRecord,\n instanceId: InstanceId,\n): boolean {\n if (heartbeat.instanceId === instanceId) return true;\n if (heartbeat.connectHash === `instance:${instanceId}`) return true;\n return (\n key === instanceId ||\n key.replace(/_/g, \"-\") === instanceId ||\n key.replace(/-/g, \"_\") === instanceId\n );\n}\n\nfunction cleanupStaleSameInstanceHeartbeats(\n commsDir: string,\n instanceId: InstanceId,\n): void {\n const heartbeatsPath = path.join(commsDir, \"heartbeats.json\");\n if (!fs.existsSync(heartbeatsPath)) return;\n\n const lockPath = path.join(commsDir, \".heartbeats.lock\");\n try {\n fs.writeFileSync(lockPath, String(process.pid), { flag: \"wx\" });\n } catch {\n warnHeartbeatCleanup(instanceId, \"heartbeat store busy\");\n return;\n }\n\n try {\n let store: Record<string, CommsHeartbeatRecord> = {};\n try {\n store = JSON.parse(\n fs.readFileSync(heartbeatsPath, \"utf-8\"),\n ) as Record<string, CommsHeartbeatRecord>;\n } catch {\n warnHeartbeatCleanup(instanceId, \"heartbeat store unreadable\");\n return;\n }\n\n let changed = false;\n for (const [key, heartbeat] of Object.entries(store)) {\n if (!isSameInstanceHeartbeat(key, heartbeat, instanceId)) continue;\n\n const status = heartbeat.status ?? \"active\";\n const isDeadBridge =\n heartbeat.source === \"bridge-dispatch\" &&\n heartbeat.bridgePid != null &&\n !isProcessAlive(heartbeat.bridgePid);\n const activityMs = getHeartbeatActivityMs(heartbeat);\n const isStaleDirect =\n heartbeat.source !== \"bridge-dispatch\" &&\n activityMs != null &&\n Date.now() - activityMs > STALE_DIRECT_HEARTBEAT_MS;\n\n if (status === \"signing-off\" || isDeadBridge || isStaleDirect) {\n delete store[key];\n changed = true;\n }\n }\n\n if (!changed) return;\n const tmpPath = `${heartbeatsPath}.tmp.${process.pid}`;\n fs.writeFileSync(tmpPath, JSON.stringify(store, null, 2), \"utf-8\");\n fs.renameSync(tmpPath, heartbeatsPath);\n } catch (error) {\n warnHeartbeatCleanup(\n instanceId,\n error instanceof Error ? error.message : String(error),\n );\n } finally {\n try {\n fs.unlinkSync(lockPath);\n } catch {\n // lock already removed\n }\n }\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 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 previousLifecycle =\n options.previousLifecycle ?? previousBridgeState?.lifecycle ?? null;\n const previousAppServer = previousBridgeState?.appServer ?? null;\n\n clearBridgeState(stateDir, instanceId);\n cleanupStaleSameInstanceHeartbeats(commsDir, instanceId);\n\n const logPath = logFilePath(stateDir, instanceId);\n fs.mkdirSync(path.dirname(logPath), { recursive: true });\n rotateLog(logPath);\n\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 const runtimeEnv = buildRuntimeEnv(repoRoot);\n const effectiveAppServerUrl = resolveAppServerUrl(options.appServerUrl, port);\n let appServer: AppServerState | null = null;\n let bridgeAppServerUrl = effectiveAppServerUrl;\n const startedAt = new Date().toISOString();\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 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 ...(process.env.TAP_COLD_START_WARMUP === \"true\"\n ? { TAP_COLD_START_WARMUP: \"true\" }\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 const bridgePid =\n options.platform === \"win32\"\n ? startWindowsDetachedProcess(\n command,\n [bridgeScript],\n repoRoot,\n logPath,\n bridgeEnv,\n )\n : startUnixDetachedProcess(\n command,\n [bridgeScript],\n repoRoot,\n logPath,\n bridgeEnv,\n options.platform,\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: startedAt,\n appServer,\n runtimeStateDir,\n lifecycle: transitionBridgeLifecycle(\n previousLifecycle,\n \"initializing\",\n previousLifecycle ? \"bridge restart\" : \"bridge start\",\n {\n at: startedAt,\n incrementRestart: previousLifecycle != null,\n },\n ),\n };\n\n saveBridgeState(stateDir, instanceId, state);\n\n return state;\n } catch (err) {\n if (appServer?.managed) {\n const shared = isAppServerUsedByOtherBridge(\n stateDir,\n instanceId,\n appServer,\n );\n if (!shared) {\n await stopManagedAppServer(appServer, options.platform);\n }\n }\n throw err;\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport type {\n BridgeLifecycleRecord,\n BridgeState,\n InstanceId,\n Platform,\n} from \"../types.js\";\n\nimport { isProcessAlive, terminateProcess } from \"./bridge-process-control.js\";\nimport { cleanupHeadlessDispatch } from \"./bridge-config.js\";\nimport {\n loadBridgeState,\n saveBridgeState,\n clearBridgeState,\n transitionBridgeLifecycle,\n} from \"./bridge-state.js\";\nimport {\n getBridgeRuntimeStateDir,\n startBridge,\n type BridgeStartOptions,\n} from \"./bridge-startup.js\";\n\nexport interface BridgeStopOptions {\n instanceId: InstanceId;\n stateDir: string;\n platform: Platform;\n}\n\nexport interface BridgeStopResult {\n stopped: boolean;\n lifecycle: BridgeLifecycleRecord | null;\n}\n\nexport async function stopBridge(\n options: BridgeStopOptions,\n): Promise<BridgeStopResult> {\n const { instanceId, stateDir, platform } = options;\n const state = loadBridgeState(stateDir, instanceId);\n\n if (!state) {\n return {\n stopped: false,\n lifecycle: null,\n };\n }\n\n const currentLifecycle = state.lifecycle ?? null;\n\n if (!isProcessAlive(state.pid)) {\n clearBridgeState(stateDir, instanceId);\n return {\n stopped: false,\n lifecycle: transitionBridgeLifecycle(\n currentLifecycle,\n \"crashed\",\n \"bridge pid not alive\",\n ),\n };\n }\n\n state.lifecycle = transitionBridgeLifecycle(\n currentLifecycle,\n \"stopping\",\n \"bridge stop requested\",\n );\n saveBridgeState(stateDir, instanceId, state);\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 {\n stopped: true,\n lifecycle: transitionBridgeLifecycle(\n state.lifecycle ?? currentLifecycle,\n \"stopped\",\n \"bridge stopped\",\n ),\n };\n}\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 */\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 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;\n } catch {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n\n if (options.headless?.enabled && options.commsDir) {\n const agentName = options.agentName ?? instanceId;\n cleanupHeadlessDispatch(path.join(options.commsDir, \"inbox\"), agentName);\n }\n\n const stopResult = await stopBridge({ instanceId, stateDir, platform });\n\n return startBridge({\n ...options,\n processExistingMessages: true,\n previousLifecycle: stopResult.lifecycle ?? options.previousLifecycle ?? null,\n });\n}\n","import { loadState, saveState, getInstalledInstances } from \"../state.js\";\nimport {\n deriveBridgeLifecycleState,\n resolveBridgeLifecycleSnapshot,\n deriveCodexSessionState,\n loadRuntimeBridgeHeartbeat,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { findRepoRoot, log, logHeader, logWarn } from \"../utils.js\";\nimport { version } from \"../version.js\";\nimport type { InstanceState, CommandResult } from \"../types.js\";\nimport type {\n BridgeLifecycleSnapshot,\n CodexSessionSnapshot,\n} from \"../engine/bridge.js\";\n\nconst STATUS_HELP = `\nUsage:\n tap status\n\nDescription:\n Show all installed instances, their bridge status, and configuration info.\n\nExamples:\n npx @hua-labs/tap status\n`.trim();\n\ninterface ResolvedStatus {\n status: string;\n lifecycle: BridgeLifecycleSnapshot | null;\n session: CodexSessionSnapshot | null;\n}\n\nfunction resolveStatus(inst: InstanceState, stateDir: string): ResolvedStatus {\n if (!inst.installed) {\n return {\n status: \"not installed\",\n lifecycle: null,\n session: null,\n };\n }\n\n switch (inst.bridgeMode) {\n case \"native-push\":\n case \"polling\":\n return {\n status: inst.lastVerifiedAt ? \"active\" : \"configured\",\n lifecycle: null,\n session: null,\n };\n\n case \"app-server\": {\n if (inst.bridge) {\n const lifecycle = resolveBridgeLifecycleSnapshot(\n stateDir,\n inst.instanceId,\n inst.bridge,\n );\n if (lifecycle.status === \"bridge-stale\") {\n inst.bridge = null;\n return {\n status: inst.lastVerifiedAt ? \"configured\" : \"installed\",\n lifecycle,\n session: null,\n };\n }\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(inst.bridge);\n return {\n status: \"active\",\n lifecycle,\n session: deriveCodexSessionState({\n runtimeHeartbeat,\n runtimeStateDir: inst.bridge.runtimeStateDir ?? null,\n }),\n };\n }\n return {\n status: inst.lastVerifiedAt ? \"configured\" : \"installed\",\n lifecycle: deriveBridgeLifecycleState({\n bridgeStatus: \"stopped\",\n }),\n session: deriveCodexSessionState({ runtimeHeartbeat: null }),\n };\n }\n\n default:\n return {\n status: \"installed\",\n lifecycle: null,\n session: null,\n };\n }\n}\n\nfunction instanceStatusLine(\n inst: InstanceState,\n status: string,\n lifecycle: BridgeLifecycleSnapshot | null,\n session: CodexSessionSnapshot | null,\n): string {\n const bridgeInfo = inst.bridge ? ` (pid: ${inst.bridge.pid})` : \"\";\n const lifecycleStr = lifecycle?.status ?? \"-\";\n const sessionStr = session?.status ?? \"-\";\n const mode = inst.bridgeMode;\n const portStr = inst.port ? ` port:${inst.port}` : \"\";\n const restart = inst.restartRequired ? \" [restart required]\" : \"\";\n const warns =\n inst.warnings.length > 0 ? ` [${inst.warnings.length} warning(s)]` : \"\";\n\n return `${inst.instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${status.padEnd(14)} ${lifecycleStr.padEnd(20)} ${sessionStr.padEnd(18)} ${mode.padEnd(14)}${bridgeInfo}${portStr}${restart}${warns}`;\n}\n\nexport async function statusCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(STATUS_HELP);\n return {\n ok: true,\n command: \"status\",\n code: \"TAP_NO_OP\",\n message: STATUS_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"status\",\n code: \"TAP_NOT_INITIALIZED\",\n message: \"Not initialized. Run: npx @hua-labs/tap init\",\n warnings: [],\n data: {},\n };\n }\n\n logHeader(\"@hua-labs/tap status\");\n\n log(`Version: ${version}`);\n log(`Comms dir: ${state.commsDir}`);\n log(`Repo root: ${state.repoRoot}`);\n log(`Schema: v${state.schemaVersion}`);\n log(`Updated: ${state.updatedAt}`);\n\n const installed = getInstalledInstances(state);\n const { config: resolvedCfg } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg.stateDir;\n\n const instances: Record<\n string,\n {\n status: string;\n lifecycle: BridgeLifecycleSnapshot | null;\n session: CodexSessionSnapshot | null;\n runtime: string;\n bridgeMode: string;\n bridge: unknown;\n port: number | null;\n warnings: string[];\n }\n > = {};\n\n // Track if any stale bridge metadata was cleaned\n const bridgesBefore = installed.map((id) => state.instances[id]?.bridge);\n\n if (installed.length === 0) {\n log(\"\");\n log(\"No instances installed.\");\n log(\"Run: npx @hua-labs/tap add <claude|codex|gemini>\");\n } else {\n log(\"\");\n log(\n `${\"Instance\".padEnd(20)} ${\"Runtime\".padEnd(8)} ${\"Status\".padEnd(14)} ${\"Lifecycle\".padEnd(20)} ${\"Session\".padEnd(18)} ${\"Bridge Mode\".padEnd(14)} Details`,\n );\n log(\n `${\"─\".repeat(20)} ${\"─\".repeat(8)} ${\"─\".repeat(14)} ${\"─\".repeat(20)} ${\"─\".repeat(18)} ${\"─\".repeat(14)} ${\"─\".repeat(20)}`,\n );\n\n for (const id of installed) {\n const inst = state.instances[id];\n if (inst) {\n // resolveStatus may clear inst.bridge if stale\n const { status, lifecycle, session } = resolveStatus(inst, stateDir);\n log(instanceStatusLine(inst, status, lifecycle, session));\n if (inst.warnings.length > 0) {\n for (const w of inst.warnings) {\n logWarn(` ${w}`);\n }\n }\n instances[id] = {\n status,\n lifecycle,\n session,\n runtime: inst.runtime,\n bridgeMode: inst.bridgeMode,\n bridge: inst.bridge,\n port: inst.port,\n warnings: inst.warnings,\n };\n }\n }\n }\n\n // Persist stale bridge cleanup if any were cleared\n const bridgesAfter = installed.map((id) => state.instances[id]?.bridge);\n const staleCleared = bridgesBefore.some((b, i) => b !== bridgesAfter[i]);\n if (staleCleared) {\n state.updatedAt = new Date().toISOString();\n saveState(repoRoot, state);\n }\n\n log(\"\");\n\n return {\n ok: true,\n command: \"status\",\n code: \"TAP_STATUS_OK\",\n message: `${installed.length} instance(s) installed`,\n warnings: [],\n data: {\n version,\n commsDir: state.commsDir,\n repoRoot: state.repoRoot,\n instances,\n },\n };\n}\n","import { loadState, saveState, removeInstanceState } from \"../state.js\";\nimport {\n findRepoRoot,\n createAdapterContext,\n resolveInstanceId,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport { rollbackRuntime } from \"../engine/rollback.js\";\nimport { stopBridge } from \"../engine/bridge.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst REMOVE_HELP = `\nUsage:\n tap remove <instance>\n\nDescription:\n Remove a registered instance, stop its bridge, and rollback config changes.\n\nArguments:\n <instance> Instance ID or runtime name (e.g. claude, codex-reviewer)\n\nExamples:\n npx @hua-labs/tap remove claude\n npx @hua-labs/tap remove codex-reviewer\n`.trim();\n\nexport async function removeCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(REMOVE_HELP);\n return {\n ok: true,\n command: \"remove\",\n code: \"TAP_NO_OP\",\n message: REMOVE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const identifier = args.find((a) => !a.startsWith(\"-\"));\n\n if (!identifier) {\n return {\n ok: false,\n command: \"remove\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing instance argument. Usage: npx @hua-labs/tap remove <instance>\",\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const state = loadState(repoRoot);\n\n if (!state) {\n return {\n ok: false,\n command: \"remove\",\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: \"remove\",\n code: resolved.code,\n message: resolved.message,\n warnings: [],\n data: {},\n };\n }\n\n const instanceId = resolved.instanceId;\n const instance = state.instances[instanceId];\n\n if (!instance?.installed) {\n return {\n ok: true,\n command: \"remove\",\n instanceId,\n code: \"TAP_NO_OP\",\n message: `${instanceId} is not installed.`,\n warnings: [],\n data: {},\n };\n }\n\n logHeader(`@hua-labs/tap remove ${instanceId}`);\n\n // Stop bridge if running before rollback\n if (instance.bridge) {\n const ctx = createAdapterContext(state.commsDir, repoRoot);\n const stopResult = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n if (stopResult.stopped) {\n logSuccess(`Bridge for ${instanceId} stopped`);\n } else {\n log(`No running bridge for ${instanceId}`);\n }\n }\n\n const result = await rollbackRuntime(instanceId, instance);\n\n if (result.success) {\n logSuccess(`Rolled back ${result.restoredCount} artifact(s)`);\n for (const f of result.restoredFiles) logSuccess(`Restored: ${f}`);\n\n const newState = removeInstanceState(state, instanceId);\n saveState(repoRoot, newState);\n logSuccess(\"State updated\");\n\n logHeader(\"Done!\");\n\n return {\n ok: true,\n command: \"remove\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_REMOVE_OK\",\n message: `${instanceId} removed successfully`,\n warnings: [],\n data: {\n restoredCount: result.restoredCount,\n restoredFiles: result.restoredFiles,\n },\n };\n }\n\n for (const e of result.errors) logError(e);\n\n return {\n ok: false,\n command: \"remove\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_ROLLBACK_FAILED\",\n message: \"Rollback had errors. State preserved for retry.\",\n warnings: result.errors,\n data: { restoredCount: result.restoredCount },\n };\n}\n","import * as fs from \"node:fs\";\nimport { readArtifactBackup } from \"../artifact-backups.js\";\nimport {\n extractTomlTable,\n removeTomlTable,\n replaceTomlTable,\n} from \"../toml.js\";\nimport type { InstanceId, InstanceState, OwnedArtifact } from \"../types.js\";\n\nexport interface RollbackResult {\n success: boolean;\n restoredCount: number;\n restoredFiles: string[];\n errors: string[];\n}\n\n/**\n * Roll back only the artifacts the runtime owns, restoring prior table/key\n * content when selector backups are available.\n */\nexport async function rollbackRuntime(\n _instanceId: InstanceId,\n runtimeState: InstanceState,\n): Promise<RollbackResult> {\n const errors: string[] = [];\n const restoredFiles: string[] = [];\n let restoredCount = 0;\n\n for (const artifact of runtimeState.ownedArtifacts) {\n try {\n const result = rollbackArtifact(artifact);\n if (result.restored) {\n restoredCount++;\n restoredFiles.push(artifact.path);\n }\n if (result.error) {\n errors.push(result.error);\n }\n } catch (err) {\n errors.push(\n `Failed to rollback ${artifact.path}#${artifact.selector}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n return {\n success: errors.length === 0,\n restoredCount,\n restoredFiles,\n errors,\n };\n}\n\ninterface ArtifactRollbackResult {\n restored: boolean;\n error?: string;\n}\n\nfunction rollbackArtifact(artifact: OwnedArtifact): ArtifactRollbackResult {\n if (!fs.existsSync(artifact.path)) {\n return { restored: false, error: `File not found: ${artifact.path}` };\n }\n\n switch (artifact.kind) {\n case \"json-path\":\n return rollbackJsonPath(artifact);\n case \"toml-table\":\n return rollbackTomlTable(artifact);\n case \"file\":\n return rollbackFile(artifact);\n default:\n return {\n restored: false,\n error: `Unknown artifact kind: ${artifact.kind}`,\n };\n }\n}\n\nfunction rollbackJsonPath(artifact: OwnedArtifact): ArtifactRollbackResult {\n const raw = fs.readFileSync(artifact.path, \"utf-8\");\n let config: Record<string, unknown>;\n\n try {\n config = JSON.parse(raw);\n } catch {\n return { restored: false, error: `Invalid JSON: ${artifact.path}` };\n }\n\n const backup = artifact.backupPath\n ? readArtifactBackup(artifact.backupPath)\n : null;\n if (backup?.kind === \"json-path\" && backup.selector === artifact.selector) {\n if (backup.existed) {\n setNestedKey(config, artifact.selector, backup.value);\n } else {\n deleteNestedKey(config, artifact.selector);\n cleanEmptyParents(config, artifact.selector);\n }\n } else {\n const removed = deleteNestedKey(config, artifact.selector);\n if (!removed) {\n return {\n restored: false,\n error: `Key not found: ${artifact.selector} in ${artifact.path}`,\n };\n }\n cleanEmptyParents(config, artifact.selector);\n }\n\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n}\n\nfunction rollbackTomlTable(artifact: OwnedArtifact): ArtifactRollbackResult {\n const content = fs.readFileSync(artifact.path, \"utf-8\");\n const backup = artifact.backupPath\n ? readArtifactBackup(artifact.backupPath)\n : null;\n\n if (backup?.kind === \"toml-table\" && backup.selector === artifact.selector) {\n const nextContent = backup.existed\n ? replaceTomlTable(content, artifact.selector, backup.content ?? \"\")\n : removeTomlTable(content, artifact.selector);\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, nextContent, \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n }\n\n if (!extractTomlTable(content, artifact.selector)) {\n return {\n restored: false,\n error: `TOML table not found: ${artifact.selector}`,\n };\n }\n\n const tmp = `${artifact.path}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, removeTomlTable(content, artifact.selector), \"utf-8\");\n fs.renameSync(tmp, artifact.path);\n return { restored: true };\n}\n\nfunction rollbackFile(artifact: OwnedArtifact): ArtifactRollbackResult {\n if (fs.existsSync(artifact.path)) {\n fs.unlinkSync(artifact.path);\n return { restored: true };\n }\n return { restored: false, error: `File not found: ${artifact.path}` };\n}\n\nfunction deleteNestedKey(\n obj: Record<string, unknown>,\n keyPath: string,\n): boolean {\n const keys = keyPath.split(\".\");\n let current = obj;\n\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 return false;\n }\n current = current[key] as Record<string, unknown>;\n }\n\n const lastKey = keys[keys.length - 1];\n if (!(lastKey in current)) return false;\n delete current[lastKey];\n return true;\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\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\n current[keys[keys.length - 1]] = value;\n}\n\nfunction cleanEmptyParents(\n obj: Record<string, unknown>,\n keyPath: string,\n): void {\n const keys = keyPath.split(\".\");\n for (let depth = keys.length - 2; depth >= 0; depth--) {\n let current = obj;\n for (let i = 0; i < depth; i++) {\n current = current[keys[i]] as Record<string, unknown>;\n if (!current) return;\n }\n\n const key = keys[depth];\n const value = current[key];\n if (\n typeof value === \"object\" &&\n value !== null &&\n Object.keys(value).length === 0\n ) {\n delete current[key];\n }\n }\n}\n","import { parseArgs, log } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\nimport { bridgeStart, bridgeStartAll } from \"./bridge-start.js\";\nimport { bridgeStopOne, bridgeStopAll } from \"./bridge-stop.js\";\nimport { bridgeWatch } from \"./bridge-watch.js\";\nimport { bridgeStatusAll, bridgeStatusOne } from \"./bridge-status.js\";\nimport { bridgeTuiOne } from \"./bridge-tui.js\";\nimport { bridgeRestart } from \"./bridge-restart.js\";\n\nconst BRIDGE_HELP = `\nUsage:\n tap 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 tui <instance> Show the safe Codex TUI attach command for a running bridge\n watch Monitor bridges and auto-restart stuck/stale ones\n\nOptions:\n --agent-name <name> Agent identity for bridge (or set TAP_AGENT_NAME env)\n Overrides the stored name from 'tap add' when needed\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 npx @hua-labs/tap bridge tui codex\n`.trim();\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 \"tui\": {\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 tui <instance>\",\n warnings: [],\n data: {},\n };\n }\n return bridgeTuiOne(identifierArg);\n }\n\n case \"watch\": {\n const intervalStr =\n typeof flags[\"interval\"] === \"string\" ? flags[\"interval\"] : undefined;\n const interval = intervalStr ? parseInt(intervalStr, 10) : 30;\n const stuckThresholdStr =\n typeof flags[\"stuck-threshold\"] === \"string\"\n ? flags[\"stuck-threshold\"]\n : undefined;\n const stuckThreshold = stuckThresholdStr\n ? parseInt(stuckThresholdStr, 10)\n : 300;\n return bridgeWatch(interval, stuckThreshold);\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, tui`,\n warnings: [],\n data: {},\n };\n }\n}\n","import * as path from \"node:path\";\nimport { loadState, saveState, updateInstanceState, fileHash } from \"../state.js\";\nimport { loadInstanceConfig, saveInstanceConfig } from \"../config/instance-config.js\";\nimport {\n startBridge,\n inferRestartMode,\n loadBridgeState,\n checkAppServerHealth,\n findNextAvailableAppServerPort,\n resolveAppServerUrl,\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 parseIntFlag,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type {\n InstanceId,\n HeadlessConfig,\n AgentRole,\n CommandResult,\n BridgeState,\n} from \"../types.js\";\nimport {\n formatAppServerState,\n redactProtectedUrl,\n resolveRecoveredAgentName,\n} from \"./bridge-helpers.js\";\nimport { pruneStaleHeartbeatsForBridgeUp } from \"./bridge-heartbeat.js\";\nimport { patchCodexApprovalMode } from \"../adapters/codex.js\";\n\n// ─── Subcommand: start ─────────────────────────────────────────\n\nexport async 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 const ctx = createAdapterContext(state.commsDir, repoRoot);\n\n // M224: patch approval_mode before Codex bridge startup\n if (instance.runtime === \"codex\") {\n const patched = patchCodexApprovalMode();\n if (patched) {\n log(`patched approval_mode → auto in ${patched}`);\n // Resync runtimeConfigHash to prevent drift false-positive\n const instConfig = loadInstanceConfig(ctx.stateDir, instanceId);\n if (instConfig) {\n instConfig.runtimeConfigHash = fileHash(patched);\n instConfig.updatedAt = new Date().toISOString();\n saveInstanceConfig(ctx.stateDir, instConfig);\n }\n }\n }\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 const resolvedAgentName = resolveRecoveredAgentName(\n instanceId,\n agentName,\n repoRoot,\n ctx.stateDir,\n );\n\n if ((resolvedAgentName ?? null) !== instance.agentName) {\n instance = { ...instance, agentName: resolvedAgentName ?? null };\n const updatedState = updateInstanceState(state, instanceId, instance);\n saveState(repoRoot, updatedState);\n state = updatedState;\n }\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 pollSecondsRaw =\n typeof flags[\"poll-seconds\"] === \"string\"\n ? flags[\"poll-seconds\"]\n : undefined;\n const reconnectSecondsRaw =\n typeof flags[\"reconnect-seconds\"] === \"string\"\n ? flags[\"reconnect-seconds\"]\n : undefined;\n const lookbackRaw =\n typeof flags[\"message-lookback-minutes\"] === \"string\"\n ? flags[\"message-lookback-minutes\"]\n : undefined;\n\n let pollSeconds: number | undefined;\n let reconnectSeconds: number | undefined;\n let messageLookbackMinutes: number | undefined;\n try {\n pollSeconds = parseIntFlag(pollSecondsRaw, \"--poll-seconds\", 1, 3600);\n reconnectSeconds = parseIntFlag(\n reconnectSecondsRaw,\n \"--reconnect-seconds\",\n 1,\n 3600,\n );\n messageLookbackMinutes = parseIntFlag(\n lookbackRaw,\n \"--message-lookback-minutes\",\n 1,\n 10080,\n );\n } catch (err) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: instance.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: err instanceof Error ? err.message : String(err),\n warnings: [],\n data: {},\n };\n }\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 // Scope TAP_COLD_START_WARMUP so the bridge can bootstrap its first turn\n const previousWarmup = process.env.TAP_COLD_START_WARMUP;\n process.env.TAP_COLD_START_WARMUP = \"true\";\n let bridge: BridgeState;\n try {\n 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 previousLifecycle:\n instance.bridgeLifecycle ?? instance.bridge?.lifecycle ?? null,\n });\n } finally {\n if (previousWarmup === undefined) {\n delete process.env.TAP_COLD_START_WARMUP;\n } else {\n process.env.TAP_COLD_START_WARMUP = previousWarmup;\n }\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 = {\n ...instance,\n bridge,\n bridgeLifecycle: bridge.lifecycle ?? instance.bridgeLifecycle ?? null,\n manageAppServer,\n noAuth,\n };\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\nexport async 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 ctx = createAdapterContext(state.commsDir, repoRoot);\n const warnings: string[] = [];\n let prunedHeartbeats = 0;\n if (flags[\"auto-prune-heartbeats\"] === true) {\n const cleanup = pruneStaleHeartbeatsForBridgeUp(\n state,\n ctx.stateDir,\n ctx.commsDir,\n );\n prunedHeartbeats = cleanup.removed;\n if (cleanup.warning) {\n warnings.push(cleanup.warning);\n log(cleanup.warning);\n }\n if (prunedHeartbeats > 0) {\n log(\n `Auto-clean: pruned ${prunedHeartbeats} stale heartbeat entr${prunedHeartbeats === 1 ? \"y\" : \"ies\"}`,\n );\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 const cleanupSuffix =\n prunedHeartbeats > 0\n ? ` Auto-clean pruned ${prunedHeartbeats} stale heartbeat entr${prunedHeartbeats === 1 ? \"y\" : \"ies\"}.`\n : \"\";\n return {\n ok: true,\n command: \"bridge\",\n code: \"TAP_NO_OP\",\n message: `No app-server instances found to start.${cleanupSuffix}`,\n warnings,\n data: { prunedHeartbeats },\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\n for (const instanceId of appServerInstances) {\n const inst = state.instances[instanceId];\n const storedName = resolveRecoveredAgentName(\n instanceId,\n inst?.agentName ?? undefined,\n repoRoot,\n ctx.stateDir,\n );\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 // Restore saved --no-server / --no-auth mode (M197: inferRestartMode for start --all)\n const stateDir = path.join(repoRoot, \".tap-comms\");\n const currentBridgeState = loadBridgeState(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 const mergedFlags = {\n ...flags,\n ...(manageAppServer === false ? { \"no-server\": true } : {}),\n ...(noAuth === true ? { \"no-auth\": true } : {}),\n };\n\n log(`Starting ${instanceId} (agent: ${storedName})...`);\n const result = await bridgeStart(instanceId, storedName, mergedFlags);\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 const cleanupSuffix =\n prunedHeartbeats > 0\n ? ` Auto-clean pruned ${prunedHeartbeats} stale heartbeat entr${prunedHeartbeats === 1 ? \"y\" : \"ies\"}.`\n : \"\";\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: `${message}${cleanupSuffix}`,\n warnings,\n data: { started, failed, prunedHeartbeats },\n };\n}\n","import * as path from \"node:path\";\nimport {\n getBridgeStatus,\n loadBridgeState,\n resolveAgentName,\n saveBridgeState,\n} from \"../engine/bridge.js\";\nimport type {\n InstanceId,\n AppServerState,\n BridgeState,\n TapState,\n} from \"../types.js\";\nimport type { BridgeLifecycleSnapshot } from \"../engine/bridge.js\";\n\nexport function 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\nexport function 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\nexport function redactProtectedUrl(url: string): string {\n // Subprotocol auth: token is no longer in the URL.\n // Keep function for backward compat with old state files that may contain query tokens.\n try {\n const parsed = new URL(url);\n if (parsed.searchParams.has(\"tap_token\")) {\n parsed.searchParams.delete(\"tap_token\");\n }\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return url.replace(/[?&]tap_token=[^&]+/g, \"\");\n }\n}\n\nexport function resolveTuiConnectUrl(appServer: AppServerState): string {\n return appServer.auth?.upstreamUrl ?? appServer.url;\n}\n\nexport function quoteCliArg(value: string): string {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n}\n\nexport function formatCodexTuiAttachCommand(\n tuiConnectUrl: string,\n cwd: string,\n): string {\n return `codex --enable tui_app_server --remote ${quoteCliArg(tuiConnectUrl)} --cd ${quoteCliArg(cwd)}`;\n}\n\nexport function resolveTuiAttachCwd(\n repoRoot: string,\n stateRepoRoot: string | null | undefined,\n runtimeThreadCwd: string | null | undefined,\n savedThreadCwd: string | null | undefined,\n): string {\n return runtimeThreadCwd ?? savedThreadCwd ?? stateRepoRoot ?? repoRoot;\n}\n\nexport function loadCurrentBridgeState(\n stateDir: string,\n instanceId: InstanceId,\n fallback: BridgeState | null | undefined,\n): BridgeState | null {\n return loadBridgeState(stateDir, instanceId) ?? fallback ?? null;\n}\n\nexport function formatThreadSummary(\n threadId: string | null | undefined,\n cwd: string | null | undefined,\n): string {\n if (!threadId) {\n return \"-\";\n }\n\n return cwd ? `${threadId} (${cwd})` : threadId;\n}\n\nexport function normalizeComparablePath(value: string): string {\n return path.resolve(value).replace(/\\\\/g, \"/\").toLowerCase();\n}\n\nexport function sameOptionalPath(\n left: string | null | undefined,\n right: string | null | undefined,\n): boolean {\n if (!left || !right) {\n return left === right;\n }\n\n return normalizeComparablePath(left) === normalizeComparablePath(right);\n}\n\nexport function resolveRecoveredAgentName(\n instanceId: InstanceId,\n explicitAgentName: string | undefined,\n repoRoot: string,\n stateDir: string,\n): string | undefined {\n return (\n resolveAgentName(instanceId, explicitAgentName, { repoRoot, stateDir }) ??\n undefined\n );\n}\n\nexport function formatLifecycleTransition(\n lifecycle: Pick<\n BridgeLifecycleSnapshot,\n \"lastTransitionAt\" | \"lastTransitionReason\" | \"restartCount\"\n > | null,\n): string | null {\n if (!lifecycle?.lastTransitionAt) {\n return null;\n }\n\n const reason = lifecycle.lastTransitionReason\n ? ` (${lifecycle.lastTransitionReason})`\n : \"\";\n return `${lifecycle.lastTransitionAt}${reason}, restarts=${lifecycle.restartCount}`;\n}\n\nexport function 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\nexport function 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","import { existsSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { getBridgeStatus } from \"../engine/bridge.js\";\nimport type { InstanceId, TapState } from \"../types.js\";\n\nexport interface BridgeHeartbeatRecord {\n agent?: string;\n timestamp?: string;\n lastActivity?: string;\n status?: \"active\" | \"idle\" | \"signing-off\" | string;\n}\n\nexport const BRIDGE_UP_ACTIVE_HEARTBEAT_WINDOW_MS = 10 * 60 * 1000;\nexport const BRIDGE_UP_ORPHAN_HEARTBEAT_WINDOW_MS = 24 * 60 * 60 * 1000;\nexport const BRIDGE_UP_SIGNING_OFF_HEARTBEAT_WINDOW_MS = 5 * 60 * 1000;\n\nexport function loadBridgeHeartbeatStore(\n commsDir: string,\n): Record<string, BridgeHeartbeatRecord> | null {\n const heartbeatsPath = path.join(commsDir, \"heartbeats.json\");\n if (!existsSync(heartbeatsPath)) return {};\n try {\n return JSON.parse(readFileSync(heartbeatsPath, \"utf-8\")) as Record<\n string,\n BridgeHeartbeatRecord\n >;\n } catch {\n return null;\n }\n}\n\nexport function saveBridgeHeartbeatStore(\n commsDir: string,\n store: Record<string, BridgeHeartbeatRecord>,\n): void {\n const heartbeatsPath = path.join(commsDir, \"heartbeats.json\");\n const tmp = `${heartbeatsPath}.tmp.${process.pid}`;\n writeFileSync(tmp, JSON.stringify(store, null, 2), \"utf-8\");\n renameSync(tmp, heartbeatsPath);\n}\n\nexport function parseBridgeHeartbeatAgeMs(\n record: BridgeHeartbeatRecord,\n now: number,\n): number {\n const raw = record.lastActivity ?? record.timestamp;\n if (!raw) return Number.POSITIVE_INFINITY;\n const parsed = new Date(raw).getTime();\n if (!Number.isFinite(parsed)) return Number.POSITIVE_INFINITY;\n return Math.max(0, now - parsed);\n}\n\nexport function resolveBridgeHeartbeatInstanceId(\n state: TapState,\n heartbeatId: string,\n): InstanceId | null {\n if (state.instances[heartbeatId]) return heartbeatId as InstanceId;\n const hyphenated = heartbeatId.replace(/_/g, \"-\");\n if (state.instances[hyphenated]) return hyphenated as InstanceId;\n const underscored = heartbeatId.replace(/-/g, \"_\");\n if (state.instances[underscored]) return underscored as InstanceId;\n return null;\n}\n\nexport function pruneStaleHeartbeatsForBridgeUp(\n state: TapState,\n stateDir: string,\n commsDir: string,\n): { removed: number; warning?: string } {\n const store = loadBridgeHeartbeatStore(commsDir);\n if (store === null) {\n return {\n removed: 0,\n warning: \"Auto-clean skipped — heartbeats.json unreadable\",\n };\n }\n\n const now = Date.now();\n let removed = 0;\n\n for (const [heartbeatId, heartbeat] of Object.entries(store)) {\n const ageMs = parseBridgeHeartbeatAgeMs(heartbeat, now);\n const instanceId = resolveBridgeHeartbeatInstanceId(state, heartbeatId);\n const instance = instanceId ? state.instances[instanceId] : null;\n const bridgeBacked = instance?.bridgeMode === \"app-server\";\n const bridgeRunning =\n bridgeBacked && instanceId\n ? getBridgeStatus(stateDir, instanceId) === \"running\"\n : false;\n const status = heartbeat.status ?? \"active\";\n\n const staleByStatus =\n status === \"signing-off\" &&\n ageMs >= BRIDGE_UP_SIGNING_OFF_HEARTBEAT_WINDOW_MS;\n const staleByDeadBridge =\n bridgeBacked &&\n !bridgeRunning &&\n ageMs >= BRIDGE_UP_ACTIVE_HEARTBEAT_WINDOW_MS;\n const staleByAge =\n !bridgeRunning && ageMs >= BRIDGE_UP_ORPHAN_HEARTBEAT_WINDOW_MS;\n\n if (staleByStatus || staleByDeadBridge || staleByAge) {\n delete store[heartbeatId];\n removed += 1;\n }\n }\n\n if (removed > 0) {\n saveBridgeHeartbeatStore(commsDir, store);\n }\n\n return { removed };\n}\n","import { loadState, saveState, updateInstanceState } from \"../state.js\";\nimport {\n stopBridge,\n stopManagedAppServer,\n waitForPortRelease,\n} from \"../engine/bridge.js\";\nimport {\n findRepoRoot,\n createAdapterContext,\n resolveInstanceId,\n log,\n logSuccess,\n logHeader,\n} from \"../utils.js\";\nimport type { InstanceId, AppServerState, CommandResult } from \"../types.js\";\nimport {\n loadCurrentBridgeState,\n getSharedAppServerUsers,\n transferManagedAppServerOwnership,\n} from \"./bridge-helpers.js\";\n\n// ─── Subcommand: stop ──────────────────────────────────────────\n\nexport async function bridgeStopOne(\n identifier: string,\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 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 stopResult = 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 (stopResult.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 // Wait for port to be released so the next bridge start won't\n // hit TIME_WAIT conflicts (port zombie prevention)\n const released = await waitForPortRelease(appServer.url, 5_000);\n if (!released) {\n log(\n `Warning: port for ${appServer.url} still in use after stop — next start may need a different port`,\n );\n }\n }\n }\n }\n\n // Clear bridge from state\n if (instance) {\n const updated = {\n ...instance,\n bridge: null,\n bridgeLifecycle: stopResult.lifecycle ?? instance.bridgeLifecycle ?? null,\n };\n const newState = updateInstanceState(state, instanceId, updated);\n saveState(repoRoot, newState);\n }\n\n if (stopResult.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\nexport async 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 stopResult = await stopBridge({\n instanceId,\n stateDir: ctx.stateDir,\n platform: ctx.platform,\n });\n\n if (stopResult.stopped) {\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 || stopResult.lifecycle) {\n state.instances[instanceId] = {\n ...instance,\n bridge: null,\n bridgeLifecycle:\n stopResult.lifecycle ?? instance.bridgeLifecycle ?? null,\n };\n stateChanged = true;\n }\n }\n\n const stoppedAppServers: number[] = [];\n const releasePorts: string[] = [];\n for (const appServer of managedAppServers.values()) {\n if (await stopManagedAppServer(appServer, ctx.platform)) {\n stoppedAppServers.push(appServer.pid!);\n releasePorts.push(appServer.url);\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 // Wait for all stopped app-server ports to release (parallel)\n if (releasePorts.length > 0) {\n await Promise.all(\n releasePorts.map((url) => waitForPortRelease(url, 5_000)),\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","import { loadState, saveState, updateInstanceState } from \"../state.js\";\nimport {\n restartBridge,\n inferRestartMode,\n getBridgeStatus,\n loadBridgeState,\n getTurnInfo,\n isTurnStuck,\n resolveBridgeLifecycleSnapshot,\n transitionBridgeLifecycle,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { getAdapter } from \"../adapters/index.js\";\nimport {\n findRepoRoot,\n createAdapterContext,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type { InstanceId, CommandResult } from \"../types.js\";\nimport { formatAge, resolveRecoveredAgentName } from \"./bridge-helpers.js\";\n\n// ─── Subcommand: watch ───────────────────────────────────────\n\n/**\n * Monitor all bridges and auto-restart stuck or stale ones.\n * Runs a single check cycle and returns results.\n * For continuous monitoring, call periodically (e.g., from a cron or loop).\n */\nexport async function bridgeWatch(\n _intervalSeconds: number,\n stuckThresholdSeconds: number,\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 { config: resolvedCfg } = resolveConfig({}, repoRoot);\n const stateDir = resolvedCfg.stateDir;\n const instanceIds = Object.keys(state.instances) as InstanceId[];\n\n logHeader(\"@hua-labs/tap bridge watch\");\n log(\n `Checking ${instanceIds.length} instance(s), stuck threshold: ${stuckThresholdSeconds}s`,\n );\n\n const restarted: string[] = [];\n const cleaned: string[] = [];\n const initializing: string[] = [];\n const degraded: string[] = [];\n const healthy: string[] = [];\n const warnings: string[] = [];\n let stateChanged = false;\n\n for (const instanceId of instanceIds) {\n const inst = state.instances[instanceId];\n if (!inst?.installed || inst.bridgeMode !== \"app-server\") continue;\n\n const status = getBridgeStatus(stateDir, instanceId);\n\n if (status === \"stale\") {\n log(`${instanceId}: stale (process dead) — cleaning up`);\n state.instances[instanceId] = {\n ...inst,\n bridge: null,\n bridgeLifecycle: transitionBridgeLifecycle(\n inst.bridgeLifecycle ?? inst.bridge?.lifecycle ?? null,\n \"crashed\",\n \"bridge pid not alive\",\n ),\n };\n stateChanged = true;\n cleaned.push(instanceId);\n continue;\n }\n\n if (status === \"stopped\") {\n log(`${instanceId}: stopped`);\n continue;\n }\n\n const lifecycle = resolveBridgeLifecycleSnapshot(\n stateDir,\n instanceId,\n inst.bridge,\n inst.bridgeLifecycle ?? null,\n );\n\n if (lifecycle.status === \"initializing\") {\n initializing.push(instanceId);\n log(`${instanceId}: initializing`);\n continue;\n }\n\n if (lifecycle.status === \"degraded-no-thread\") {\n degraded.push(instanceId);\n log(\n `${instanceId}: degraded-no-thread${\n lifecycle.savedThreadId\n ? ` (saved thread ${lifecycle.savedThreadId})`\n : \"\"\n }`,\n );\n continue;\n }\n\n // Running — check for stuck turns\n if (isTurnStuck(stateDir, instanceId, stuckThresholdSeconds)) {\n const turnInfo = getTurnInfo(stateDir, instanceId, stuckThresholdSeconds);\n const ageStr =\n turnInfo?.ageSeconds != null ? formatAge(turnInfo.ageSeconds) : \"?\";\n log(\n `${instanceId}: ⚠ STUCK turn ${turnInfo?.activeTurnId?.slice(0, 8)}... (${ageStr}) — restarting`,\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 warnings.push(\n `${instanceId}: cannot restart — bridge script not found`,\n );\n continue;\n }\n\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const { manageAppServer, noAuth } = inferRestartMode(bridgeState, {});\n\n // Scope TAP_COLD_START_WARMUP around restart (mirrors bridgeRestart, PR #847)\n const previousWarmup = process.env.TAP_COLD_START_WARMUP;\n process.env.TAP_COLD_START_WARMUP = \"true\";\n try {\n const recoveredAgentName = resolveRecoveredAgentName(\n instanceId,\n undefined,\n repoRoot,\n ctx.stateDir,\n );\n const newBridgeState = await restartBridge({\n instanceId,\n runtime: inst.runtime,\n stateDir: ctx.stateDir,\n commsDir: ctx.commsDir,\n bridgeScript,\n platform: ctx.platform,\n agentName: recoveredAgentName,\n runtimeCommand: resolvedCfg.runtimeCommand,\n appServerUrl: resolvedCfg.appServerUrl,\n repoRoot,\n port: inst.port ?? undefined,\n headless: inst.headless,\n drainTimeoutSeconds: 30,\n manageAppServer,\n noAuth,\n previousLifecycle:\n inst.bridgeLifecycle ?? inst.bridge?.lifecycle ?? null,\n });\n // Backwrite new bridge state to state.json (mirrors bridgeRestart)\n const updatedInst = {\n ...inst,\n agentName: recoveredAgentName ?? inst.agentName ?? null,\n bridge: newBridgeState,\n bridgeLifecycle:\n newBridgeState.lifecycle ?? inst.bridgeLifecycle ?? null,\n };\n const updatedState = updateInstanceState(\n state,\n instanceId,\n updatedInst,\n );\n saveState(repoRoot, updatedState);\n state = updatedState;\n restarted.push(instanceId);\n logSuccess(`${instanceId}: restarted`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n warnings.push(`${instanceId}: restart failed — ${msg}`);\n logError(`${instanceId}: restart failed — ${msg}`);\n } finally {\n if (previousWarmup === undefined) {\n delete process.env.TAP_COLD_START_WARMUP;\n } else {\n process.env.TAP_COLD_START_WARMUP = previousWarmup;\n }\n }\n } else {\n healthy.push(instanceId);\n log(`${instanceId}: healthy`);\n }\n }\n\n const message =\n [\n restarted.length > 0 ? `Restarted: ${restarted.join(\", \")}` : null,\n cleaned.length > 0 ? `Cleaned stale: ${cleaned.join(\", \")}` : null,\n initializing.length > 0\n ? `Initializing: ${initializing.join(\", \")}`\n : null,\n degraded.length > 0 ? `Degraded: ${degraded.join(\", \")}` : null,\n healthy.length > 0 ? `Healthy: ${healthy.join(\", \")}` : null,\n ]\n .filter(Boolean)\n .join(\". \") || \"No app-server bridges found\";\n\n log(\"\");\n log(message);\n\n if (stateChanged) {\n saveState(repoRoot, state);\n }\n\n return {\n ok: true,\n command: \"bridge\",\n code:\n restarted.length > 0\n ? \"TAP_BRIDGE_WATCH_RESTARTED\"\n : \"TAP_BRIDGE_WATCH_OK\",\n message,\n warnings,\n data: { restarted, cleaned, initializing, degraded, healthy },\n };\n}\n","import * as path from \"node:path\";\nimport { loadState, saveState } from \"../state.js\";\nimport {\n getBridgeStatus,\n loadBridgeState,\n getHeartbeatAge,\n getBridgeHeartbeatTimestamp,\n loadRuntimeBridgeHeartbeat,\n loadRuntimeBridgeThreadState,\n getTurnInfo,\n deriveBridgeLifecycleState,\n deriveCodexSessionState,\n transitionBridgeLifecycle,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { findRepoRoot, resolveInstanceId, log, logHeader } from \"../utils.js\";\nimport type { CommandResult, AppServerState } from \"../types.js\";\nimport type {\n BridgeLifecycleSnapshot,\n CodexSessionSnapshot,\n} from \"../engine/bridge.js\";\nimport {\n formatAge,\n formatAppServerState,\n formatLifecycleTransition,\n redactProtectedUrl,\n formatThreadSummary,\n sameOptionalPath,\n} from \"./bridge-helpers.js\";\n\n// ─── Subcommand: status ────────────────────────────────────────\n\nexport function 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 Array<\n keyof typeof state.instances\n >;\n const bridges: Record<\n string,\n {\n status: string;\n lifecycle: BridgeLifecycleSnapshot | null;\n session: CodexSessionSnapshot | null;\n runtime: string;\n pid: number | null;\n port: number | null;\n lastHeartbeat: string | null;\n threadId: string | null;\n threadCwd: string | null;\n savedThreadId: string | null;\n savedThreadCwd: 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)} ${\"Lifecycle\".padEnd(20)} ${\"Session\".padEnd(18)} ${\"PID\".padEnd(8)} ${\"Port\".padEnd(6)} ${\"Last Heartbeat\"}`,\n );\n log(\n `${\"─\".repeat(20)} ${\"─\".repeat(8)} ${\"─\".repeat(10)} ${\"─\".repeat(20)} ${\"─\".repeat(18)} ${\"─\".repeat(8)} ${\"─\".repeat(6)} ${\"─\".repeat(20)}`,\n );\n\n let stateChanged = false;\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 lifecycle: null,\n session: null,\n runtime: inst.runtime,\n pid: null,\n port: inst.port,\n lastHeartbeat: null,\n threadId: null,\n threadCwd: null,\n savedThreadId: null,\n savedThreadCwd: null,\n appServer: null,\n };\n continue;\n }\n\n const status = getBridgeStatus(stateDir, instanceId);\n const bridgeState = loadBridgeState(stateDir, instanceId) ?? inst.bridge;\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const savedThread = loadRuntimeBridgeThreadState(bridgeState);\n const lifecycle = deriveBridgeLifecycleState({\n bridgeStatus: status,\n bridgeState,\n runtimeHeartbeat,\n savedThread,\n persistedLifecycle:\n inst.bridgeLifecycle ?? bridgeState?.lifecycle ?? null,\n });\n const session =\n status === \"running\"\n ? deriveCodexSessionState({\n runtimeHeartbeat,\n runtimeStateDir: bridgeState?.runtimeStateDir ?? null,\n })\n : null;\n const age = getHeartbeatAge(stateDir, instanceId);\n\n if (lifecycle.status === \"bridge-stale\" && inst.bridge) {\n state.instances[instanceId] = {\n ...inst,\n bridge: null,\n bridgeLifecycle: transitionBridgeLifecycle(\n inst.bridgeLifecycle ?? inst.bridge?.lifecycle ?? null,\n \"crashed\",\n \"bridge pid not alive\",\n ),\n };\n stateChanged = true;\n }\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 log(\n `${instanceId.padEnd(20)} ${inst.runtime.padEnd(8)} ${status.padEnd(10)} ${lifecycle.status.padEnd(20)} ${(session?.status ?? \"-\").padEnd(18)} ${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 if (runtimeHeartbeat?.threadId) {\n log(\n ` Thread: ${formatThreadSummary(runtimeHeartbeat.threadId, runtimeHeartbeat.threadCwd)}`,\n );\n }\n if (\n savedThread?.threadId &&\n (savedThread.threadId !== runtimeHeartbeat?.threadId ||\n !sameOptionalPath(savedThread.cwd, runtimeHeartbeat?.threadCwd))\n ) {\n log(\n ` Saved: ${formatThreadSummary(savedThread.threadId, savedThread.cwd)}`,\n );\n }\n const transition = formatLifecycleTransition(lifecycle);\n if (transition) {\n log(` Transition: ${transition}`);\n }\n\n // Turn stuck detection (M160)\n const turnInfo = getTurnInfo(stateDir, instanceId);\n if (turnInfo?.activeTurnId) {\n const ageStr2 =\n turnInfo.ageSeconds != null ? formatAge(turnInfo.ageSeconds) : \"?\";\n if (turnInfo.stuck) {\n log(\n ` ⚠ STUCK: turn ${turnInfo.activeTurnId.slice(0, 8)}... active ${ageStr2} (threshold: 5m)`,\n );\n } else {\n log(\n ` Turn: ${turnInfo.activeTurnId.slice(0, 8)}... active ${ageStr2}`,\n );\n }\n }\n\n bridges[instanceId] = {\n status,\n lifecycle,\n session,\n runtime: inst.runtime,\n pid,\n port: inst.port,\n lastHeartbeat: heartbeat,\n threadId: runtimeHeartbeat?.threadId ?? null,\n threadCwd: runtimeHeartbeat?.threadCwd ?? null,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n appServer: bridgeState?.appServer ?? null,\n };\n }\n\n if (instanceIds.length === 0) {\n log(\"No instances installed.\");\n }\n\n if (stateChanged) {\n saveState(repoRoot, state);\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\nexport function 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 lifecycle: {\n presence: \"stopped\",\n status: \"stopped\",\n summary: \"stopped\",\n lastTransitionAt: null,\n lastTransitionReason: null,\n restartCount: 0,\n },\n session: null,\n bridgeMode: inst.bridgeMode,\n pid: null,\n port: inst.port,\n lastHeartbeat: null,\n threadId: null,\n threadCwd: null,\n savedThreadId: null,\n savedThreadCwd: 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) ?? inst.bridge;\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const savedThread = loadRuntimeBridgeThreadState(bridgeState);\n const age = getHeartbeatAge(stateDir, instanceId);\n const heartbeat = getBridgeHeartbeatTimestamp(stateDir, instanceId);\n const lifecycle = deriveBridgeLifecycleState({\n bridgeStatus: status,\n bridgeState,\n runtimeHeartbeat,\n savedThread,\n persistedLifecycle: inst.bridgeLifecycle ?? bridgeState?.lifecycle ?? null,\n });\n const session = deriveCodexSessionState({\n runtimeHeartbeat,\n runtimeStateDir: bridgeState?.runtimeStateDir ?? null,\n });\n\n log(`Status: ${status}`);\n log(`Lifecycle: ${lifecycle.summary}`);\n log(`Session: ${session.summary}`);\n\n if (bridgeState) {\n log(`PID: ${bridgeState.pid}`);\n log(\n `Heartbeat: ${heartbeat ?? \"-\"}${age !== null ? ` (${formatAge(age)})` : \"\"}`,\n );\n if (runtimeHeartbeat?.threadId) {\n log(\n `Thread: ${formatThreadSummary(runtimeHeartbeat.threadId, runtimeHeartbeat.threadCwd)}`,\n );\n }\n if (\n savedThread?.threadId &&\n (savedThread.threadId !== runtimeHeartbeat?.threadId ||\n !sameOptionalPath(savedThread.cwd, runtimeHeartbeat?.threadCwd))\n ) {\n log(\n `Saved: ${formatThreadSummary(savedThread.threadId, savedThread.cwd)}`,\n );\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 const transition = formatLifecycleTransition(lifecycle);\n if (transition) {\n log(`Transition: ${transition}`);\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 lifecycle: {\n presence: lifecycle.presence,\n status: lifecycle.status,\n summary: lifecycle.summary,\n lastTransitionAt: lifecycle.lastTransitionAt,\n lastTransitionReason: lifecycle.lastTransitionReason,\n restartCount: lifecycle.restartCount,\n },\n session: {\n status: session.status,\n turnState: session.turnState,\n summary: session.summary,\n activeTurnId: session.activeTurnId,\n idleSince: session.idleSince,\n lastTurnAt: session.lastTurnAt,\n lastDispatchAt: session.lastDispatchAt,\n },\n bridgeMode: inst.bridgeMode,\n pid: bridgeState?.pid ?? null,\n port: inst.port,\n lastHeartbeat: heartbeat,\n threadId: runtimeHeartbeat?.threadId ?? null,\n threadCwd: runtimeHeartbeat?.threadCwd ?? null,\n savedThreadId: savedThread?.threadId ?? null,\n savedThreadCwd: savedThread?.cwd ?? null,\n appServer: bridgeState?.appServer ?? null,\n },\n };\n}\n","import { loadState } from \"../state.js\";\nimport {\n getBridgeStatus,\n loadBridgeState,\n loadRuntimeBridgeHeartbeat,\n loadRuntimeBridgeThreadState,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { findRepoRoot, resolveInstanceId, log, logHeader } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\nimport {\n resolveTuiConnectUrl,\n resolveTuiAttachCwd,\n formatCodexTuiAttachCommand,\n redactProtectedUrl,\n} from \"./bridge-helpers.js\";\n\nexport function bridgeTuiOne(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 if (inst.runtime !== \"codex\" || inst.bridgeMode !== \"app-server\") {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: `${instanceId} does not support Codex TUI attach. Use a Codex app-server bridge instance.`,\n warnings: [],\n data: {},\n };\n }\n\n const { config: resolvedConfig } = resolveConfig({}, repoRoot);\n const stateDir = resolvedConfig.stateDir;\n const status = getBridgeStatus(stateDir, instanceId);\n if (status !== \"running\") {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_NOT_RUNNING\",\n message: `${instanceId} bridge is ${status}. Start it first with: npx @hua-labs/tap bridge start ${instanceId}`,\n warnings: [],\n data: { status },\n };\n }\n\n const bridgeState = loadBridgeState(stateDir, instanceId);\n const appServer = bridgeState?.appServer;\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const savedThread = loadRuntimeBridgeThreadState(bridgeState);\n if (!appServer) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_BRIDGE_NOT_RUNNING\",\n message: `${instanceId} app-server state is missing. Restart the bridge first.`,\n warnings: [],\n data: { status },\n };\n }\n\n const tuiConnectUrl = resolveTuiConnectUrl(appServer);\n const attachCwd = resolveTuiAttachCwd(\n repoRoot,\n state.repoRoot,\n runtimeHeartbeat?.threadCwd,\n savedThread?.cwd,\n );\n const attachCommand = formatCodexTuiAttachCommand(tuiConnectUrl, attachCwd);\n const warnings =\n appServer.auth != null\n ? [\n \"Use the upstream TUI URL, not the protected gateway URL. The protected URL is bridge-only.\",\n ]\n : [];\n\n logHeader(`@hua-labs/tap bridge tui ${instanceId}`);\n if (appServer.auth) {\n log(`Protected: ${redactProtectedUrl(appServer.auth.protectedUrl)}`);\n log(`Upstream: ${appServer.auth.upstreamUrl}`);\n }\n log(`Using: ${tuiConnectUrl}`);\n log(`Attach: ${attachCommand}`);\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} TUI attach command ready`,\n warnings,\n data: {\n status,\n tuiConnectUrl,\n attachCwd,\n attachCommand,\n appServer,\n },\n };\n}\n","import { loadState, saveState, updateInstanceState } from \"../state.js\";\nimport {\n restartBridge,\n inferRestartMode,\n loadBridgeState,\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 parseIntFlag,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type { CommandResult, BridgeState } from \"../types.js\";\nimport { resolveRecoveredAgentName } from \"./bridge-helpers.js\";\n\n// ─── Subcommand: restart ───────────────────────────────────────\n\nexport async function bridgeRestart(\n identifier: string,\n flags: Record<string, string | boolean>,\n explicitAgentName?: string,\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\"\n ? flags[\"drain-timeout\"]\n : undefined;\n let drainTimeout: number;\n try {\n drainTimeout = parseIntFlag(drainStr, \"--drain-timeout\", 1, 300) ?? 30;\n } catch (err) {\n return {\n ok: false,\n command: \"bridge\",\n instanceId,\n runtime: inst.runtime,\n code: \"TAP_INVALID_ARGUMENT\",\n message: err instanceof Error ? err.message : String(err),\n warnings: [],\n data: {},\n };\n }\n\n logHeader(`@hua-labs/tap bridge restart ${instanceId}`);\n log(`Drain timeout: ${drainTimeout}s`);\n\n try {\n const resolvedAgentName = resolveRecoveredAgentName(\n instanceId,\n explicitAgentName,\n repoRoot,\n ctx.stateDir,\n );\n\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 previousColdStartWarmup = process.env.TAP_COLD_START_WARMUP;\n process.env.TAP_COLD_START_WARMUP = \"true\";\n let bridge: BridgeState;\n try {\n 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: resolvedAgentName,\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 previousLifecycle:\n inst.bridgeLifecycle ?? inst.bridge?.lifecycle ?? null,\n });\n } finally {\n if (previousColdStartWarmup === undefined) {\n delete process.env.TAP_COLD_START_WARMUP;\n } else {\n process.env.TAP_COLD_START_WARMUP = previousColdStartWarmup;\n }\n }\n\n logSuccess(`Bridge restarted (PID: ${bridge.pid})`);\n\n // Save bridge mode for next restart (#799 follow-up)\n const updated = {\n ...inst,\n agentName: resolvedAgentName ?? inst.agentName ?? null,\n bridge,\n bridgeLifecycle: bridge.lifecycle ?? inst.bridgeLifecycle ?? null,\n manageAppServer,\n noAuth,\n };\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","/**\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 loadRuntimeBridgeHeartbeat,\n resolveBridgeLifecycleSnapshot,\n deriveCodexSessionState,\n} from \"./bridge.js\";\nimport type { InstanceId } from \"../types.js\";\nimport { loadState } from \"../state.js\";\nimport type {\n BridgeLifecycleSnapshot,\n CodexSessionSnapshot,\n} from \"./bridge.js\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport interface AgentInfo {\n name: string;\n instanceId: string | null;\n presence: \"bridge-live\" | \"bridge-stale\" | \"mcp-only\";\n lifecycle: BridgeLifecycleSnapshot[\"status\"] | null;\n status: string | null;\n lastActivity: string | null;\n joinedAt: string | null;\n idleSeconds: number | null;\n}\n\nexport interface BridgeInfo {\n instanceId: string;\n runtime: string;\n status: \"running\" | \"stopped\" | \"stale\";\n lifecycle: BridgeLifecycleSnapshot | null;\n session: CodexSessionSnapshot | null;\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 formatAgentLabel(\n agentIdOrName: string,\n displayName?: string | null,\n): string {\n const normalizedId = agentIdOrName.trim();\n const normalizedName = displayName?.trim();\n\n if (!normalizedId) {\n return normalizedName ?? agentIdOrName;\n }\n\n if (!normalizedName || normalizedName === normalizedId) {\n return normalizedId;\n }\n\n return `${normalizedName} [${normalizedId}]`;\n}\n\nfunction parseIsoAgeSeconds(value: string | null | undefined): number | null {\n if (!value) return null;\n const timestamp = new Date(value).getTime();\n if (Number.isNaN(timestamp)) return null;\n return Math.max(0, Math.floor((Date.now() - timestamp) / 1000));\n}\n\nfunction resolveHeartbeatInstanceId(\n heartbeatId: string,\n displayName: string | null,\n state: ReturnType<typeof loadState>,\n): string | null {\n if (!state) return null;\n if (state.instances[heartbeatId]?.installed) return heartbeatId;\n\n const hyphenated = heartbeatId.replace(/_/g, \"-\");\n if (state.instances[hyphenated]?.installed) return hyphenated;\n\n const underscored = heartbeatId.replace(/-/g, \"_\");\n if (state.instances[underscored]?.installed) return underscored;\n\n if (!displayName) return null;\n const matches = Object.values(state.instances).filter(\n (inst) => inst?.installed && inst.agentName === displayName,\n );\n return matches.length === 1 ? matches[0].instanceId : null;\n}\n\nfunction collectAgents(\n commsDir: string,\n state: ReturnType<typeof loadState>,\n bridges: BridgeInfo[],\n): 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(([agentId, info]) => {\n const instanceId = resolveHeartbeatInstanceId(\n agentId,\n info.agent ?? null,\n state,\n );\n const bridge = instanceId\n ? (bridges.find((candidate) => candidate.instanceId === instanceId) ??\n null)\n : null;\n const presence =\n bridge?.status === \"stale\" ||\n bridge?.lifecycle?.status === \"bridge-stale\"\n ? \"bridge-stale\"\n : bridge?.status === \"running\"\n ? \"bridge-live\"\n : \"mcp-only\";\n const lastActivity = info.lastActivity ?? info.timestamp ?? null;\n const idleBasis = bridge?.session?.idleSince ?? lastActivity;\n\n return {\n name: formatAgentLabel(agentId, info.agent ?? null),\n instanceId,\n presence,\n lifecycle: bridge?.lifecycle?.status ?? null,\n status: info.status ?? null,\n lastActivity,\n joinedAt: info.joinedAt ?? null,\n idleSeconds: parseIsoAgeSeconds(idleBasis),\n };\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 persistedBridgeState = loadBridgeState(stateDir, instanceId);\n const bridgeState = persistedBridgeState ?? inst.bridge ?? null;\n const age = getHeartbeatAge(stateDir, instanceId);\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const lifecycle =\n bridgeState != null\n ? resolveBridgeLifecycleSnapshot(stateDir, instanceId, bridgeState)\n : null;\n const session =\n bridgeState != null\n ? deriveCodexSessionState({\n runtimeHeartbeat,\n runtimeStateDir: bridgeState.runtimeStateDir ?? null,\n })\n : null;\n\n bridges.push({\n instanceId: id,\n runtime: inst.runtime,\n status,\n lifecycle,\n session,\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 lifecycle: null,\n session: null,\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 if (bridge.lifecycle?.status === \"degraded-no-thread\") {\n warnings.push({\n level: \"warn\",\n message: `Bridge ${bridge.instanceId} is degraded (no active thread)`,\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 state = loadState(resolved.repoRoot);\n const bridges = collectBridges(resolved.repoRoot);\n const agents = collectAgents(resolved.commsDir, state, bridges);\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 { 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 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 tap up auto-prunes stale heartbeat entries before bridge startup.\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\nfunction summarizeLifecycle(snapshot: DashboardSnapshot): string {\n const ready = snapshot.bridges.filter(\n (bridge) => bridge.lifecycle?.status === \"ready\",\n ).length;\n const initializing = snapshot.bridges.filter(\n (bridge) => bridge.lifecycle?.status === \"initializing\",\n ).length;\n const degraded = snapshot.bridges.filter(\n (bridge) => bridge.lifecycle?.status === \"degraded-no-thread\",\n ).length;\n\n return `${ready} ready, ${initializing} initializing, ${degraded} degraded`;\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 previousColdStartWarmup = process.env.TAP_COLD_START_WARMUP;\n process.env.TAP_COLD_START_WARMUP = \"true\";\n let result: CommandResult;\n try {\n result = await bridgeCommand([\n \"start\",\n \"--all\",\n \"--auto-prune-heartbeats\",\n ...args,\n ]);\n } finally {\n if (previousColdStartWarmup === undefined) {\n delete process.env.TAP_COLD_START_WARMUP;\n } else {\n process.env.TAP_COLD_START_WARMUP = previousColdStartWarmup;\n }\n }\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 (${summarizeLifecycle(snapshot)})`,\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 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","import * as path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { buildManagedMcpServerSpec } from \"../adapters/common.js\";\nimport { createAdapterContext, findRepoRoot, log } from \"../utils.js\";\nimport { normalizeTapPath } from \"../config/index.js\";\nimport { loadState } from \"../state.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst SERVE_HELP = `\nUsage:\n tap serve [options]\n\nDescription:\n Start the tap MCP server over stdio. This command takes over the\n process — it is intended to be launched by an MCP host (e.g. Claude Code).\n\nOptions:\n --comms-dir <path> Override comms directory (also reads TAP_COMMS_DIR env)\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap serve\n npx @hua-labs/tap serve --comms-dir /shared/comms\n`.trim();\n\n/**\n * serve is special: it takes over the process on success.\n * Only returns a CommandResult on error.\n */\nexport async function serveCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(SERVE_HELP);\n return {\n ok: true,\n command: \"serve\",\n code: \"TAP_NO_OP\",\n message: SERVE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n\n let commsDir: string | undefined;\n\n const commsDirIdx = args.indexOf(\"--comms-dir\");\n if (commsDirIdx !== -1 && args[commsDirIdx + 1]) {\n commsDir = path.resolve(normalizeTapPath(args[commsDirIdx + 1]));\n }\n\n if (!commsDir && process.env.TAP_COMMS_DIR) {\n commsDir = path.resolve(normalizeTapPath(process.env.TAP_COMMS_DIR));\n }\n\n if (!commsDir) {\n const state = loadState(repoRoot);\n if (state) {\n commsDir = state.commsDir;\n }\n }\n\n if (!commsDir) {\n return {\n ok: false,\n command: \"serve\",\n code: \"TAP_NOT_INITIALIZED\",\n message:\n \"Cannot determine comms directory. Set TAP_COMMS_DIR env var, use --comms-dir, or run 'init' first.\",\n warnings: [],\n data: {},\n };\n }\n\n const ctx = createAdapterContext(commsDir, repoRoot);\n const managed = buildManagedMcpServerSpec(ctx);\n if (!managed.command || !managed.sourcePath) {\n const fallbackMessage =\n managed.issues[0] ??\n \"tap-comms MCP server not found. Reinstall @hua-labs/tap or run from a repo with packages/tap-plugin/channels/.\";\n return {\n ok: false,\n command: \"serve\",\n code: managed.sourcePath\n ? \"TAP_SERVE_BUN_REQUIRED\"\n : \"TAP_SERVE_NO_SERVER\",\n message: fallbackMessage,\n warnings: [],\n data: {},\n };\n }\n\n // For serve, always use direct path (not npx launcher which would recurse)\n const serveCommand = managed.command === \"npx\" ? \"node\" : managed.command;\n const serveArgs =\n managed.command === \"npx\" && managed.sourcePath\n ? [managed.sourcePath]\n : managed.args;\n\n // Start MCP server\n const child = spawn(serveCommand, serveArgs, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n TAP_COMMS_DIR: commsDir,\n },\n });\n\n return new Promise((resolve) => {\n child.on(\"error\", (err) => {\n resolve({\n ok: false,\n command: \"serve\",\n code: \"TAP_INTERNAL_ERROR\",\n message: `Failed to start MCP server: ${err.message}`,\n warnings: [],\n data: {},\n });\n });\n\n child.on(\"exit\", (code) => {\n resolve({\n ok: code === 0,\n command: \"serve\",\n code: code === 0 ? \"TAP_SERVE_OK\" : \"TAP_INTERNAL_ERROR\",\n message:\n code === 0\n ? \"MCP server stopped\"\n : `MCP server exited with code ${code}`,\n warnings: [],\n data: { exitCode: code },\n });\n });\n });\n}\n","import * 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 findRepoRoot,\n parseArgs,\n log,\n logSuccess,\n logWarn,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst INIT_WORKTREE_HELP = `\nUsage:\n tap init-worktree [options]\n\nOptions:\n --path <dir> Worktree directory (required, e.g. ../hua-wt-3)\n --branch <name> Branch name to create (default: derived from path)\n --base <ref> Base ref for new branch (default: origin/main)\n --mission <file> Mission file to associate (e.g. m74-feature.md)\n --comms-dir <path> Override comms directory\n --skip-install Skip pnpm install step\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap init-worktree --path ../hua-wt-3 --branch feat/my-feature\n npx @hua-labs/tap init-worktree --path ../hua-wt-4 --branch fix/bug --mission m74-fix.md\n`.trim();\n\ninterface WorktreeOptions {\n worktreePath: string;\n branch: string;\n base: string;\n mission?: string;\n commsDir: string;\n skipInstall: boolean;\n repoRoot: string;\n}\n\n// ─── Warning collector ─────────────────────────────────────────\n\nfunction warn(warnings: string[], message: string): void {\n logWarn(message);\n warnings.push(message);\n}\n\n// ─── Step helpers ──────────────────────────────────────────────\n\nfunction run(\n cmd: string,\n opts?: { cwd?: string; ignoreError?: boolean },\n): string {\n try {\n return execSync(cmd, {\n cwd: opts?.cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 120_000,\n }).trim();\n } catch (err) {\n if (opts?.ignoreError) return \"\";\n throw err;\n }\n}\n\nfunction toAbsolute(p: string): string {\n const resolved = path.resolve(p);\n // Normalize to forward slashes for .mcp.json compatibility\n return resolved.replace(/\\\\/g, \"/\");\n}\n\nfunction probeBun(candidate: string): boolean {\n try {\n const out = execSync(`\"${candidate}\" --version`, {\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }).trim();\n return /^\\d+\\.\\d+/.test(out);\n } catch {\n return false;\n }\n}\n\nfunction findBun(): string | null {\n const candidates =\n process.platform === \"win32\" ? [\"bun.exe\", \"bun\"] : [\"bun\"];\n\n for (const name of candidates) {\n try {\n const out = execSync(\n process.platform === \"win32\" ? `where ${name}` : `which ${name}`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"], timeout: 5000 },\n ).trim();\n // Validate each candidate with --version before accepting\n for (const line of out.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (trimmed && probeBun(trimmed)) return trimmed;\n }\n } catch {\n // not found\n }\n }\n\n // Check common locations\n const home = process.env.HOME || process.env.USERPROFILE || \"\";\n const bunHome = path.join(\n home,\n \".bun\",\n \"bin\",\n process.platform === \"win32\" ? \"bun.exe\" : \"bun\",\n );\n if (fs.existsSync(bunHome) && probeBun(bunHome)) return bunHome;\n\n return null;\n}\n\n// ─── Step 1: Create worktree ───────────────────────────────────\n\nfunction step1CreateWorktree(opts: WorktreeOptions): boolean {\n log(\"Step 1/9: Creating worktree...\");\n\n if (fs.existsSync(opts.worktreePath)) {\n logWarn(`Directory already exists: ${opts.worktreePath}`);\n // Check if it's already a worktree\n try {\n run(\"git rev-parse --git-dir\", { cwd: opts.worktreePath });\n logWarn(\"Already a git worktree. Continuing...\");\n return true;\n } catch {\n logError(\"Directory exists but is not a git worktree.\");\n return false;\n }\n }\n\n try {\n // Try creating with new branch\n run(\n `git worktree add \"${opts.worktreePath}\" -b ${opts.branch} ${opts.base}`,\n { cwd: opts.repoRoot },\n );\n logSuccess(`Worktree created: ${opts.worktreePath}`);\n logSuccess(`Branch: ${opts.branch} (from ${opts.base})`);\n } catch {\n // Branch may already exist\n try {\n run(`git worktree add \"${opts.worktreePath}\" ${opts.branch}`, {\n cwd: opts.repoRoot,\n });\n logSuccess(`Worktree created with existing branch: ${opts.branch}`);\n } catch (err) {\n logError(\n `Failed to create worktree: ${err instanceof Error ? err.message : String(err)}`,\n );\n return false;\n }\n }\n return true;\n}\n\n// ─── Step 2: Merge origin/main ─────────────────────────────────\n\nfunction step2MergeMain(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 2/9: Merging origin/main...\");\n\n try {\n run(\"git fetch origin main\", { cwd: opts.worktreePath });\n } catch {\n warn(warnings, \"Could not fetch origin/main. Skipping merge.\");\n return;\n }\n\n try {\n const behind = run(\"git rev-list --count HEAD..origin/main\", {\n cwd: opts.worktreePath,\n });\n if (behind === \"0\") {\n logSuccess(\"Already up to date with origin/main.\");\n return;\n }\n\n run(\"git merge origin/main --no-edit -X theirs\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"Merged origin/main.\");\n } catch {\n warn(\n warnings,\n \"Merge had issues. You may need to resolve conflicts manually.\",\n );\n }\n}\n\n// ─── Step 3: Copy permissions ──────────────────────────────────\n\nfunction step3CopyPermissions(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 3/9: Copying permissions...\");\n\n const srcSettings = path.join(\n opts.repoRoot,\n \".claude\",\n \"settings.local.json\",\n );\n const destDir = path.join(opts.worktreePath, \".claude\");\n const destSettings = path.join(destDir, \"settings.local.json\");\n\n if (!fs.existsSync(srcSettings)) {\n warn(\n warnings,\n \"No .claude/settings.local.json found in main repo. Skipping.\",\n );\n return;\n }\n\n fs.mkdirSync(destDir, { recursive: true });\n fs.copyFileSync(srcSettings, destSettings);\n logSuccess(\"Copied settings.local.json\");\n\n try {\n run(\"git update-index --skip-worktree .claude/settings.local.json\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"Marked skip-worktree\");\n } catch {\n warn(warnings, \"Could not set skip-worktree. File may show as modified.\");\n }\n}\n\n// ─── Step 4: Generate .mcp.json ────────────────────────────────\n\nfunction step4GenerateMcpJson(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 4/9: Generating .mcp.json...\");\n\n const bunPath = findBun();\n if (!bunPath) {\n warn(warnings, \"bun not found. .mcp.json not generated.\");\n warn(\n warnings,\n \"Install bun (https://bun.sh) and re-run, or create .mcp.json manually.\",\n );\n return;\n }\n\n const wtAbs = toAbsolute(opts.worktreePath);\n const bunAbs = toAbsolute(bunPath);\n const commsAbs = toAbsolute(opts.commsDir);\n\n // Find tap-comms channel entry point\n const channelEntry = path.join(\n wtAbs,\n \"packages/tap-plugin/channels/tap-comms.ts\",\n );\n\n const mcpConfig = {\n mcpServers: {\n tap: {\n command: bunAbs,\n args: [channelEntry],\n cwd: wtAbs,\n env: {\n TAP_COMMS_DIR: commsAbs,\n TAP_AGENT_NAME: \"unnamed\",\n },\n },\n },\n };\n\n const mcpPath = path.join(opts.worktreePath, \".mcp.json\");\n fs.writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2) + \"\\n\", \"utf-8\");\n logSuccess(`.mcp.json generated (absolute paths + cwd)`);\n log(` bun: ${bunAbs}`);\n log(` comms: ${commsAbs}`);\n}\n\n// ─── Step 5: Install dependencies ──────────────────────────────\n\nfunction step5Install(opts: WorktreeOptions, warnings: string[]): void {\n if (opts.skipInstall) {\n log(\"Step 5/9: Skipping pnpm install (--skip-install).\");\n return;\n }\n\n log(\"Step 5/9: Installing dependencies...\");\n\n try {\n run(\"pnpm install --prefer-offline\", { cwd: opts.worktreePath });\n logSuccess(\"Dependencies installed.\");\n } catch {\n warn(\n warnings,\n \"pnpm install failed. Try running manually in the worktree.\",\n );\n }\n}\n\n// ─── Step 6: Build ESLint plugin ───────────────────────────────\n\nfunction step6BuildEslintPlugin(\n opts: WorktreeOptions,\n warnings: string[],\n): void {\n if (opts.skipInstall) {\n log(\"Step 6/9: Skipping eslint plugin build (--skip-install).\");\n return;\n }\n\n log(\"Step 6/9: Building eslint-plugin-i18n...\");\n\n try {\n run(\"pnpm build --filter @hua-labs/eslint-plugin-i18n\", {\n cwd: opts.worktreePath,\n });\n logSuccess(\"eslint-plugin-i18n built.\");\n } catch {\n warn(warnings, \"eslint-plugin-i18n build failed. Non-blocking.\");\n }\n}\n\n// ─── Step 7: Verify comms ──────────────────────────────────────\n\nfunction step7VerifyComms(opts: WorktreeOptions, warnings: string[]): void {\n log(\"Step 7/9: Verifying comms directory...\");\n\n if (!fs.existsSync(opts.commsDir)) {\n warn(warnings, `Comms directory not found: ${opts.commsDir}`);\n warn(warnings, \"Create it or run: npx @hua-labs/tap init\");\n return;\n }\n\n const requiredDirs = [\"inbox\", \"findings\", \"reviews\", \"letters\"];\n for (const dir of requiredDirs) {\n const dirPath = path.join(opts.commsDir, dir);\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n logSuccess(`Created ${dir}/`);\n }\n }\n\n logSuccess(`Comms verified: ${opts.commsDir}`);\n}\n\n// ─── Step 8: Verify bun ────────────────────────────────────────\n\nfunction step8VerifyBun(warnings: string[]): void {\n log(\"Step 8/9: Verifying bun...\");\n\n const bunPath = findBun();\n if (!bunPath) {\n warn(warnings, \"bun not found in PATH.\");\n warn(warnings, \"Install: curl -fsSL https://bun.sh/install | bash\");\n return;\n }\n\n try {\n const version = run(`\"${bunPath}\" --version`);\n logSuccess(`bun ${version} found: ${bunPath}`);\n } catch {\n warn(warnings, \"bun found but version check failed.\");\n }\n}\n\n// ─── Step 9: Ready message ─────────────────────────────────────\n\nfunction step9Ready(opts: WorktreeOptions): void {\n logHeader(\"Ready!\");\n log(`Worktree: ${toAbsolute(opts.worktreePath)}`);\n log(`Branch: ${opts.branch}`);\n log(`Comms: ${toAbsolute(opts.commsDir)}`);\n if (opts.mission) log(`Mission: ${opts.mission}`);\n log(\"\");\n log(\"Next steps:\");\n log(` cd ${opts.worktreePath}`);\n log(\" claude # Start Claude Code session\");\n log(\"\");\n}\n\n// ─── Command entry ─────────────────────────────────────────────\n\nexport async function initWorktreeCommand(\n args: string[],\n): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(INIT_WORKTREE_HELP);\n return {\n ok: true,\n command: \"init-worktree\",\n code: \"TAP_NO_OP\",\n message: INIT_WORKTREE_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const worktreePath =\n typeof flags[\"path\"] === \"string\" ? flags[\"path\"] : undefined;\n if (!worktreePath) {\n return {\n ok: false,\n command: \"init-worktree\",\n code: \"TAP_INVALID_ARGUMENT\",\n message:\n \"Missing --path. Usage: npx @hua-labs/tap init-worktree --path ../hua-wt-3\",\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n const { config } = resolveConfig({}, repoRoot);\n\n const branch =\n typeof flags[\"branch\"] === \"string\"\n ? flags[\"branch\"]\n : path.basename(path.resolve(worktreePath));\n const base =\n typeof flags[\"base\"] === \"string\" ? flags[\"base\"] : \"origin/main\";\n const mission =\n typeof flags[\"mission\"] === \"string\" ? flags[\"mission\"] : undefined;\n const commsDir =\n typeof flags[\"comms-dir\"] === \"string\"\n ? flags[\"comms-dir\"]\n : config.commsDir;\n const skipInstall = flags[\"skip-install\"] === true;\n\n const opts: WorktreeOptions = {\n worktreePath: path.resolve(worktreePath),\n branch,\n base,\n mission,\n commsDir: path.resolve(commsDir),\n skipInstall,\n repoRoot,\n };\n\n logHeader(`@hua-labs/tap init-worktree`);\n log(`Path: ${opts.worktreePath}`);\n log(`Branch: ${opts.branch}`);\n log(`Base: ${opts.base}`);\n log(`Comms: ${opts.commsDir}`);\n if (mission) log(`Mission: ${mission}`);\n log(\"\");\n\n const warnings: string[] = [];\n\n // Execute steps\n const created = step1CreateWorktree(opts);\n if (!created) {\n return {\n ok: false,\n command: \"init-worktree\",\n code: \"TAP_PATCH_FAILED\",\n message: \"Failed to create worktree.\",\n warnings,\n data: {},\n };\n }\n\n step2MergeMain(opts, warnings);\n step3CopyPermissions(opts, warnings);\n step4GenerateMcpJson(opts, warnings);\n step5Install(opts, warnings);\n step6BuildEslintPlugin(opts, warnings);\n step7VerifyComms(opts, warnings);\n step8VerifyBun(warnings);\n step9Ready(opts);\n\n return {\n ok: true,\n command: \"init-worktree\" as never,\n code: \"TAP_INIT_OK\",\n message: `Worktree initialized: ${opts.worktreePath}`,\n warnings,\n data: {\n path: opts.worktreePath,\n branch: opts.branch,\n commsDir: opts.commsDir,\n },\n };\n}\n","import { collectDashboardSnapshot } from \"../engine/dashboard.js\";\nimport type { DashboardSnapshot } from \"../engine/dashboard.js\";\nimport { findRepoRoot, parseArgs, log, logHeader } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\n// ─── Formatting helpers ────────────────────────────────────────\n\nfunction formatAge(seconds: number | null): string {\n if (seconds === null) return \"-\";\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\nfunction formatStatus(status: string): string {\n switch (status) {\n case \"running\":\n return \"running\";\n case \"stale\":\n return \"stale!\";\n case \"stopped\":\n return \"stopped\";\n case \"MERGED\":\n return \"merged\";\n case \"OPEN\":\n return \"open\";\n case \"CLOSED\":\n return \"closed\";\n default:\n return status;\n }\n}\n\nfunction truncate(str: string, len: number): string {\n return str.length > len ? str.slice(0, len - 1) + \"…\" : str;\n}\n\n// ─── Render ────────────────────────────────────────────────────\n\nfunction renderSnapshot(snapshot: DashboardSnapshot): void {\n logHeader(\"tap dashboard\");\n log(`Time: ${snapshot.generatedAt}`);\n log(`Repo: ${snapshot.repoRoot}`);\n log(`Comms: ${snapshot.commsDir}`);\n\n // ── Agents ──\n log(\"\");\n log(\"── Agents ──────────────────────────\");\n if (snapshot.agents.length === 0) {\n log(\" (no heartbeats)\");\n } else {\n log(\n ` ${\"Agent\".padEnd(18)} ${\"Presence\".padEnd(18)} ${\"Lifecycle\".padEnd(20)} ${\"Idle\"}`,\n );\n log(\n ` ${\"─\".repeat(18)} ${\"─\".repeat(18)} ${\"─\".repeat(20)} ${\"─\".repeat(12)}`,\n );\n for (const agent of snapshot.agents) {\n log(\n ` ${truncate(agent.name, 18).padEnd(18)} ${agent.presence.padEnd(18)} ${String(agent.lifecycle ?? \"-\").padEnd(20)} ${formatAge(agent.idleSeconds)}`,\n );\n }\n }\n\n // ── Bridges ──\n log(\"\");\n log(\"── Bridges ─────────────────────────\");\n if (snapshot.bridges.length === 0) {\n log(\" (none)\");\n } else {\n log(\n ` ${\"Instance\".padEnd(20)} ${\"Status\".padEnd(10)} ${\"Lifecycle\".padEnd(20)} ${\"PID\".padEnd(8)} ${\"Port\".padEnd(6)} ${\"Heartbeat\"}`,\n );\n log(\n ` ${\"─\".repeat(20)} ${\"─\".repeat(10)} ${\"─\".repeat(20)} ${\"─\".repeat(8)} ${\"─\".repeat(6)} ${\"─\".repeat(12)}`,\n );\n for (const b of snapshot.bridges) {\n const headlessTag = b.headless ? \" [H]\" : \"\";\n const lifecycle = b.lifecycle?.status ?? \"-\";\n log(\n ` ${truncate(b.instanceId + headlessTag, 20).padEnd(20)} ${formatStatus(b.status).padEnd(10)} ${truncate(lifecycle, 20).padEnd(20)} ${(b.pid ? String(b.pid) : \"-\").padEnd(8)} ${(b.port ? String(b.port) : \"-\").padEnd(6)} ${formatAge(b.heartbeatAge)}`,\n );\n }\n }\n\n // ── PRs ──\n log(\"\");\n log(\"── PRs ─────────────────────────────\");\n if (snapshot.prs.length === 0) {\n log(\" (gh CLI unavailable or no PRs)\");\n } else {\n for (const pr of snapshot.prs) {\n const icon =\n pr.state === \"MERGED\" ? \"+\" : pr.state === \"OPEN\" ? \"~\" : \"x\";\n log(\n ` ${icon} #${String(pr.number).padEnd(5)} ${formatStatus(pr.state).padEnd(8)} ${truncate(pr.title, 50)}`,\n );\n }\n }\n\n // ── Warnings ──\n log(\"\");\n log(\"── Warnings ────────────────────────\");\n if (snapshot.warnings.length === 0) {\n log(\" [OK] no warnings\");\n } else {\n for (const w of snapshot.warnings) {\n const prefix = w.level === \"error\" ? \"[ERR]\" : \"[WARN]\";\n log(` ${prefix} ${w.message}`);\n }\n }\n}\n\nconst DASHBOARD_HELP = `\nUsage:\n tap dashboard [options]\n\nDescription:\n Display a unified ops dashboard: agents, bridges, PRs, and warnings.\n\nOptions:\n --json Output snapshot as JSON\n --watch Refresh dashboard on an interval\n --interval <seconds> Refresh interval in seconds (default: 5, min: 2)\n --comms-dir <path> Override comms directory\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap dashboard\n npx @hua-labs/tap dashboard --watch --interval 10\n npx @hua-labs/tap dashboard --json\n`.trim();\n\n// ─── Command ───────────────────────────────────────────────────\n\nexport async function dashboardCommand(args: string[]): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(DASHBOARD_HELP);\n return {\n ok: true,\n command: \"dashboard\",\n code: \"TAP_NO_OP\",\n message: DASHBOARD_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const jsonMode = flags[\"json\"] === true;\n const watchMode = flags[\"watch\"] === true;\n const intervalStr =\n typeof flags[\"interval\"] === \"string\" ? flags[\"interval\"] : \"5\";\n const intervalSeconds = Math.max(2, parseInt(intervalStr, 10) || 5);\n const commsDirOverride =\n typeof flags[\"comms-dir\"] === \"string\" ? flags[\"comms-dir\"] : undefined;\n\n const repoRoot = findRepoRoot();\n\n if (watchMode) {\n // Watch loop — runs until Ctrl+C\n const run = (): void => {\n const snapshot = collectDashboardSnapshot(repoRoot, commsDirOverride);\n if (jsonMode) {\n console.log(JSON.stringify(snapshot, null, 2));\n } else {\n // Clear screen\n process.stdout.write(\"\\x1B[2J\\x1B[H\");\n renderSnapshot(snapshot);\n log(\"\");\n log(` Refreshing every ${intervalSeconds}s — Ctrl+C to exit`);\n }\n };\n\n run();\n const timer = setInterval(run, intervalSeconds * 1000);\n\n // Handle graceful shutdown\n const cleanup = (): void => {\n clearInterval(timer);\n process.exit(0);\n };\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Keep alive\n await new Promise(() => {});\n\n return {\n ok: true,\n command: \"unknown\",\n code: \"TAP_NO_OP\",\n message: \"Watch mode ended\",\n warnings: [],\n data: {},\n };\n }\n\n // Single run\n const snapshot = collectDashboardSnapshot(repoRoot, commsDirOverride);\n\n if (jsonMode) {\n console.log(JSON.stringify(snapshot, null, 2));\n } else {\n renderSnapshot(snapshot);\n }\n\n return {\n ok: true,\n command: \"dashboard\",\n code: \"TAP_STATUS_OK\",\n message: `Dashboard: ${snapshot.bridges.length} bridge(s), ${snapshot.agents.length} agent(s), ${snapshot.prs.length} PR(s)`,\n warnings: snapshot.warnings.map((w) => w.message),\n data: snapshot as unknown as Record<string, unknown>,\n };\n}\n","/**\n * `tap doctor` — Diagnose and optionally fix tap infrastructure health.\n *\n * Checks: comms directory, state file, instances, bridge health,\n * watcher readiness, MCP server, message lifecycle.\n *\n * M95: Diagnostic layer for tap.\n * M100: --fix auto-repair for common issues.\n */\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { spawnSync } from \"node:child_process\";\nimport { dirname, join, resolve } from \"node:path\";\nimport {\n buildManagedMcpServerSpec,\n type ManagedMcpServerSpec,\n} from \"../adapters/common.js\";\nimport { loadState, saveState, getInstalledInstances } from \"../state.js\";\nimport {\n isBridgeRunning,\n getHeartbeatAge,\n loadBridgeState,\n loadRuntimeBridgeHeartbeat,\n loadRuntimeBridgeThreadState,\n} from \"../engine/bridge.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { checkAllDrift } from \"../config/drift-detector.js\";\nimport {\n createAdapterContext,\n findRepoRoot,\n log,\n logHeader,\n logSuccess,\n logWarn,\n} from \"../utils.js\";\nimport {\n extractTomlTable,\n parseTomlAssignments,\n removeTomlTable,\n renderTomlTable,\n replaceTomlTable,\n} from \"../toml.js\";\nimport { version } from \"../version.js\";\nimport type { CommandResult, TapState } from \"../types.js\";\n\n// ── Types ───────────────────────────────────────────────────────────────\n\ninterface Check {\n name: string;\n status: \"pass\" | \"warn\" | \"fail\" | \"skip\";\n message?: string;\n fix?: () => string; // Returns description of what was fixed\n}\n\ninterface DoctorHeartbeatRecord {\n id?: string;\n agent?: string;\n timestamp?: string;\n lastActivity?: string;\n status?: \"active\" | \"idle\" | \"signing-off\" | string;\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────\n\nconst PASS = \"pass\" as const;\nconst WARN = \"warn\" as const;\nconst FAIL = \"fail\" as const;\nconst HEARTBEAT_ACTIVE_WINDOW_MS = 10 * 60 * 1000;\nconst ORPHAN_HEARTBEAT_WINDOW_MS = 24 * 60 * 60 * 1000;\nconst SIGNING_OFF_HEARTBEAT_WINDOW_MS = 5 * 60 * 1000;\nconst CODEX_ENV_DRIFT_KEYS = [\n \"TAP_COMMS_DIR\",\n \"TAP_STATE_DIR\",\n \"TAP_REPO_ROOT\",\n] as const;\nconst CODEX_SESSION_NEUTRAL_NAME = \"<set-per-session>\";\n\nfunction normalizeComparablePath(value: string): string {\n return resolve(value).replace(/\\\\/g, \"/\").toLowerCase();\n}\n\nfunction samePath(left: string, right: string): boolean {\n return normalizeComparablePath(left) === normalizeComparablePath(right);\n}\n\nfunction looksLikePathToken(value: string): boolean {\n return (\n /^[A-Za-z]:[\\\\/]/.test(value) ||\n value.startsWith(\"/\") ||\n value.startsWith(\"\\\\\") ||\n value.startsWith(\".\") ||\n value.includes(\"/\") ||\n value.includes(\"\\\\\")\n );\n}\n\nfunction sameCommandToken(left: string, right: string): boolean {\n return looksLikePathToken(left) || looksLikePathToken(right)\n ? samePath(left, right)\n : left === right;\n}\n\nfunction sameStringArray(left: string[], right: string[]): boolean {\n return (\n left.length === right.length &&\n left.every((value, index) => sameCommandToken(value, right[index] ?? \"\"))\n );\n}\n\nfunction appendWarningMessage(message: string, extra: string): string {\n return message.includes(extra) ? message : `${message}; ${extra}`;\n}\n\nfunction findCodexConfigPath(): string {\n return join(homedir(), \".codex\", \"config.toml\");\n}\n\nfunction canonicalizeTrustPath(targetPath: string): string {\n let resolved = 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 writeTomlAtomically(filePath: string, content: string): void {\n const dir = dirname(filePath);\n mkdirSync(dir, { recursive: true });\n const tmp = `${filePath}.tmp.${process.pid}`;\n writeFileSync(tmp, content, \"utf-8\");\n renameSync(tmp, filePath);\n}\n\nfunction hasInstalledCodexInstance(state: TapState | null): boolean {\n return state\n ? Object.values(state.instances).some(\n (instance) => instance.runtime === \"codex\" && instance.installed,\n )\n : false;\n}\n\nfunction getCodexTrustTargets(repoRoot: string): string[] {\n return [...new Set([repoRoot, process.cwd()].map((value) => resolve(value)))];\n}\n\nfunction buildSessionNeutralCodexEnv(\n env: Record<string, string>,\n): Record<string, string> {\n const neutralEnv: Record<string, string> = {\n ...env,\n TAP_AGENT_NAME: CODEX_SESSION_NEUTRAL_NAME,\n };\n delete neutralEnv.TAP_AGENT_ID;\n return neutralEnv;\n}\n\nfunction buildCodexEnvEntries(\n existingTable: string | null,\n managedEnv: Record<string, string | string[]>,\n): Record<string, string | string[]> {\n const preservedEnv = parseTomlAssignments(existingTable ?? \"\");\n delete preservedEnv.TAP_AGENT_ID;\n return {\n ...preservedEnv,\n ...managedEnv,\n };\n}\n\nfunction buildCodexDoctorSpec(\n repoRoot: string,\n commsDir: string,\n): {\n configPath: string;\n trustTargets: string[];\n managed: ManagedMcpServerSpec;\n} | null {\n const state = loadState(repoRoot);\n if (!hasInstalledCodexInstance(state)) {\n return null;\n }\n\n const ctx = createAdapterContext(commsDir, repoRoot);\n const managed = buildManagedMcpServerSpec(ctx);\n\n return {\n configPath: findCodexConfigPath(),\n trustTargets: getCodexTrustTargets(repoRoot),\n managed: {\n ...managed,\n env: buildSessionNeutralCodexEnv(managed.env),\n },\n };\n}\n\nfunction repairCodexConfig(repoRoot: string, commsDir: string): string {\n const spec = buildCodexDoctorSpec(repoRoot, commsDir);\n if (!spec) {\n throw new Error(\"No installed Codex instance found in tap state.\");\n }\n if (!spec.managed.command || spec.managed.issues.length > 0) {\n throw new Error(\n spec.managed.issues[0] ??\n \"Unable to resolve the managed tap MCP server for Codex.\",\n );\n }\n\n const existingContent = existsSync(spec.configPath)\n ? readFileSync(spec.configPath, \"utf-8\")\n : \"\";\n const existingTapEnvTable = extractTomlTable(\n existingContent,\n \"mcp_servers.tap.env\",\n );\n const existingLegacyEnvTable = extractTomlTable(\n existingContent,\n \"mcp_servers.tap-comms.env\",\n );\n const preservedEnv = parseTomlAssignments(\n existingTapEnvTable ?? existingLegacyEnvTable ?? \"\",\n );\n const repairedEnv: Record<string, string | string[]> = {\n ...preservedEnv,\n ...(Object.fromEntries(\n CODEX_ENV_DRIFT_KEYS.map((key) => [key, spec.managed.env[key]]),\n ) as Record<string, string>),\n };\n repairedEnv.TAP_AGENT_NAME = spec.managed.env.TAP_AGENT_NAME;\n delete repairedEnv.TAP_AGENT_ID;\n\n let nextContent = existingContent;\n if (extractTomlTable(nextContent, \"mcp_servers.tap-comms.env\")) {\n nextContent = removeTomlTable(nextContent, \"mcp_servers.tap-comms.env\");\n }\n if (extractTomlTable(nextContent, \"mcp_servers.tap-comms\")) {\n nextContent = removeTomlTable(nextContent, \"mcp_servers.tap-comms\");\n }\n\n nextContent = replaceTomlTable(\n nextContent,\n \"mcp_servers.tap\",\n renderTomlTable(\n \"mcp_servers.tap\",\n {\n command: spec.managed.command,\n args: spec.managed.args,\n approval_mode: \"auto\",\n },\n extractTomlTable(existingContent, \"mcp_servers.tap\"),\n ),\n );\n nextContent = replaceTomlTable(\n nextContent,\n \"mcp_servers.tap.env\",\n renderTomlTable(\n \"mcp_servers.tap.env\",\n buildCodexEnvEntries(\n existingTapEnvTable ?? existingLegacyEnvTable,\n repairedEnv,\n ),\n ),\n );\n for (const trustTarget of spec.trustTargets) {\n const selector = trustSelector(trustTarget);\n nextContent = replaceTomlTable(\n nextContent,\n selector,\n renderTomlTable(\n selector,\n { trust_level: \"trusted\" },\n extractTomlTable(existingContent, selector),\n ),\n );\n }\n\n writeTomlAtomically(spec.configPath, nextContent);\n return `Repaired Codex config at ${spec.configPath}. Restart Codex to reload MCP settings.`;\n}\n\nfunction countFiles(dir: string, ext = \".md\"): number {\n if (!existsSync(dir)) return 0;\n try {\n return readdirSync(dir).filter((f) => f.endsWith(ext)).length;\n } catch {\n return 0;\n }\n}\n\nfunction recentFileCount(dir: string, withinMs: number): number {\n if (!existsSync(dir)) return 0;\n const cutoff = Date.now() - withinMs;\n let count = 0;\n try {\n for (const f of readdirSync(dir)) {\n if (!f.endsWith(\".md\")) continue;\n try {\n if (statSync(join(dir, f)).mtimeMs > cutoff) count++;\n } catch {\n // skip\n }\n }\n } catch {\n // skip\n }\n return count;\n}\n\nfunction loadDoctorHeartbeatStore(\n commsDir: string,\n): Record<string, DoctorHeartbeatRecord> | null {\n const heartbeatsPath = join(commsDir, \"heartbeats.json\");\n if (!existsSync(heartbeatsPath)) return null;\n try {\n return JSON.parse(readFileSync(heartbeatsPath, \"utf-8\")) as Record<\n string,\n DoctorHeartbeatRecord\n >;\n } catch {\n return null;\n }\n}\n\nfunction saveDoctorHeartbeatStore(\n commsDir: string,\n store: Record<string, DoctorHeartbeatRecord>,\n): void {\n const heartbeatsPath = join(commsDir, \"heartbeats.json\");\n const tmp = `${heartbeatsPath}.tmp.${process.pid}`;\n writeFileSync(tmp, JSON.stringify(store, null, 2), \"utf-8\");\n renameSync(tmp, heartbeatsPath);\n}\n\nfunction parseHeartbeatAgeMs(\n record: DoctorHeartbeatRecord,\n now: number,\n): number {\n const raw = record.lastActivity ?? record.timestamp;\n if (!raw) return Number.POSITIVE_INFINITY;\n const parsed = new Date(raw).getTime();\n if (!Number.isFinite(parsed)) return Number.POSITIVE_INFINITY;\n return Math.max(0, now - parsed);\n}\n\nfunction resolveHeartbeatInstanceId(\n state: TapState | null,\n heartbeatId: string,\n): string | null {\n if (!state) return null;\n if (state.instances[heartbeatId]) return heartbeatId;\n const hyphenated = heartbeatId.replace(/_/g, \"-\");\n if (state.instances[hyphenated]) return hyphenated;\n const underscored = heartbeatId.replace(/-/g, \"_\");\n if (state.instances[underscored]) return underscored;\n return null;\n}\n\nfunction collectStaleHeartbeatIds(\n commsDir: string,\n state: TapState | null,\n stateDir: string,\n): Array<{ id: string; label: string; ageMs: number }> {\n const store = loadDoctorHeartbeatStore(commsDir);\n if (!store) return [];\n\n const now = Date.now();\n const stale: Array<{ id: string; label: string; ageMs: number }> = [];\n\n for (const [heartbeatId, heartbeat] of Object.entries(store)) {\n const ageMs = parseHeartbeatAgeMs(heartbeat, now);\n const instanceId = resolveHeartbeatInstanceId(state, heartbeatId);\n const instance = instanceId ? state?.instances[instanceId] : null;\n const bridgeBacked = instance?.bridgeMode === \"app-server\";\n const bridgeRunning =\n bridgeBacked && instanceId\n ? isBridgeRunning(stateDir, instanceId)\n : false;\n const status = heartbeat.status ?? \"active\";\n\n const staleByStatus =\n status === \"signing-off\" && ageMs >= SIGNING_OFF_HEARTBEAT_WINDOW_MS;\n const staleByDeadBridge =\n bridgeBacked && !bridgeRunning && ageMs >= HEARTBEAT_ACTIVE_WINDOW_MS;\n const staleByAge = !bridgeRunning && ageMs >= ORPHAN_HEARTBEAT_WINDOW_MS;\n\n if (staleByStatus || staleByDeadBridge || staleByAge) {\n stale.push({\n id: heartbeatId,\n label: heartbeat.agent?.trim() || heartbeatId,\n ageMs,\n });\n }\n }\n\n return stale;\n}\n\nfunction pruneHeartbeatIds(commsDir: string, heartbeatIds: string[]): number {\n if (heartbeatIds.length === 0) return 0;\n const store = loadDoctorHeartbeatStore(commsDir);\n if (!store) return 0;\n\n let removed = 0;\n for (const heartbeatId of new Set(heartbeatIds)) {\n if (heartbeatId in store) {\n delete store[heartbeatId];\n removed += 1;\n }\n }\n\n if (removed > 0) {\n saveDoctorHeartbeatStore(commsDir, store);\n }\n\n return removed;\n}\n\n// ── Checks ──────────────────────────────────────────────────────────────\n\nfunction checkComms(commsDir: string): Check[] {\n const checks: Check[] = [];\n\n checks.push({\n name: \"comms directory\",\n status: existsSync(commsDir) ? PASS : FAIL,\n message: existsSync(commsDir) ? commsDir : `Not found: ${commsDir}`,\n fix: existsSync(commsDir)\n ? undefined\n : () => {\n mkdirSync(commsDir, { recursive: true });\n return `Created ${commsDir}`;\n },\n });\n\n for (const [subdir, required] of [\n [\"inbox\", true],\n [\"reviews\", false],\n [\"findings\", false],\n ] as const) {\n const dir = join(commsDir, subdir);\n const exists = existsSync(dir);\n checks.push({\n name: `${subdir} directory`,\n status: exists ? PASS : required ? FAIL : WARN,\n message: exists\n ? subdir === \"findings\"\n ? `${countFiles(dir)} findings`\n : subdir === \"inbox\"\n ? `${countFiles(dir)} messages`\n : \"exists\"\n : `Missing${required ? \"\" : \" (optional)\"}`,\n fix: exists\n ? undefined\n : () => {\n mkdirSync(dir, { recursive: true });\n return `Created ${dir}`;\n },\n });\n }\n\n // Heartbeats\n const heartbeats = join(commsDir, \"heartbeats.json\");\n if (existsSync(heartbeats)) {\n try {\n const store = JSON.parse(readFileSync(heartbeats, \"utf-8\"));\n const agents = Object.keys(store);\n const now = Date.now();\n const active = agents.filter((a) => {\n const ts = store[a]?.lastActivity;\n return ts && now - new Date(ts).getTime() < HEARTBEAT_ACTIVE_WINDOW_MS;\n });\n checks.push({\n name: \"heartbeats\",\n status: active.length > 0 ? PASS : WARN,\n message: `${active.length} active / ${agents.length} total`,\n });\n } catch {\n checks.push({\n name: \"heartbeats\",\n status: WARN,\n message: \"File exists but unreadable\",\n });\n }\n } else {\n checks.push({\n name: \"heartbeats\",\n status: WARN,\n message: \"No heartbeats file\",\n });\n }\n\n return checks;\n}\n\nfunction checkStaleHeartbeats(\n repoRoot: string,\n commsDir: string,\n stateDir: string,\n): Check[] {\n const state = loadState(repoRoot);\n const stale = collectStaleHeartbeatIds(commsDir, state, stateDir);\n if (stale.length === 0) {\n return [\n {\n name: \"stale heartbeats\",\n status: PASS,\n message: \"none\",\n },\n ];\n }\n\n const preview = stale\n .slice(0, 3)\n .map((entry) => `${entry.label} (${Math.round(entry.ageMs / 60000)}m)`)\n .join(\", \");\n\n return [\n {\n name: \"stale heartbeats\",\n status: WARN,\n message:\n stale.length > 3\n ? `${stale.length} stale entries: ${preview}, ...`\n : `${stale.length} stale entr${stale.length === 1 ? \"y\" : \"ies\"}: ${preview}`,\n fix: () => {\n const removed = pruneHeartbeatIds(\n commsDir,\n stale.map((entry) => entry.id),\n );\n return `Pruned ${removed} stale heartbeat entr${removed === 1 ? \"y\" : \"ies\"}`;\n },\n },\n ];\n}\n\nfunction checkInstances(\n repoRoot: string,\n stateDir: string,\n commsDir: string,\n): Check[] {\n const checks: Check[] = [];\n const state = loadState(repoRoot);\n\n if (!state) {\n checks.push({\n name: \"tap state\",\n status: FAIL,\n message: \"Not initialized. Run: tap init\",\n });\n return checks;\n }\n\n checks.push({\n name: \"tap state\",\n status: PASS,\n message: `v${state.schemaVersion}, ${getInstalledInstances(state).length} instance(s)`,\n });\n\n const installed = getInstalledInstances(state);\n for (const id of installed) {\n const inst = state.instances[id];\n if (!inst) continue;\n\n if (inst.bridgeMode === \"app-server\") {\n const running = isBridgeRunning(stateDir, id);\n const bridgeState = loadBridgeState(stateDir, id);\n const heartbeatAge = getHeartbeatAge(stateDir, id);\n const runtimeHeartbeat = loadRuntimeBridgeHeartbeat(bridgeState);\n const savedThread = loadRuntimeBridgeThreadState(bridgeState);\n\n let status: \"pass\" | \"warn\" | \"fail\";\n let message: string;\n let fix: (() => string) | undefined;\n\n if (running && bridgeState) {\n if (heartbeatAge !== null && heartbeatAge > 120) {\n status = WARN;\n message = `PID ${bridgeState.pid} alive but heartbeat stale (${Math.round(heartbeatAge)}s ago)`;\n } else {\n status = PASS;\n message = `PID ${bridgeState.pid}, port ${inst.port ?? \"auto\"}`;\n }\n } else if (bridgeState && !running) {\n status = WARN;\n message = `Stale PID ${bridgeState.pid} (process dead)`;\n fix = () => {\n // Kill managed app-server/gateway if still alive\n const appServer = bridgeState.appServer;\n if (appServer?.managed) {\n for (const pid of [appServer.auth?.gatewayPid, appServer.pid]) {\n if (pid) {\n try {\n if (process.platform === \"win32\") {\n spawnSync(\"taskkill\", [\"/PID\", String(pid), \"/F\", \"/T\"], {\n stdio: \"pipe\",\n });\n } else {\n process.kill(pid);\n }\n } catch {\n // Already dead — fine\n }\n }\n }\n }\n // Clean up stale bridge PID file\n const pidPath = join(stateDir, \"pids\", `bridge-${id}.json`);\n try {\n unlinkSync(pidPath);\n } catch {\n // ignore\n }\n // Clear bridge reference in instance state\n const currentState = loadState(repoRoot);\n if (currentState?.instances[id]) {\n currentState.instances[id].bridge = null;\n currentState.updatedAt = new Date().toISOString();\n saveState(repoRoot, currentState);\n }\n const removedHeartbeats = pruneHeartbeatIds(commsDir, [\n id,\n id.replace(/-/g, \"_\"),\n id.replace(/_/g, \"-\"),\n ]);\n const suffix =\n removedHeartbeats > 0\n ? `; pruned ${removedHeartbeats} heartbeat entr${removedHeartbeats === 1 ? \"y\" : \"ies\"}`\n : \"\";\n return `Cleaned stale bridge + managed processes for ${id}${suffix}`;\n };\n } else {\n status = WARN;\n message = \"Not running\";\n }\n\n const lastRuntimeError = runtimeHeartbeat?.lastError?.trim();\n if (lastRuntimeError) {\n status = WARN;\n message = `${message}; bridge last error: ${lastRuntimeError}`;\n }\n\n if (\n savedThread?.threadId &&\n savedThread.cwd &&\n !samePath(savedThread.cwd, repoRoot)\n ) {\n status = WARN;\n message = appendWarningMessage(\n message,\n `saved thread cwd mismatch (${savedThread.cwd})`,\n );\n }\n\n if (\n runtimeHeartbeat?.threadId &&\n savedThread?.threadId &&\n runtimeHeartbeat.threadId !== savedThread.threadId\n ) {\n status = WARN;\n message = appendWarningMessage(\n message,\n `saved thread ${savedThread.threadId} differs from active thread ${runtimeHeartbeat.threadId}`,\n );\n }\n\n if (\n runtimeHeartbeat?.threadCwd &&\n !samePath(runtimeHeartbeat.threadCwd, repoRoot)\n ) {\n status = WARN;\n message = appendWarningMessage(\n message,\n `active thread cwd mismatch (${runtimeHeartbeat.threadCwd})`,\n );\n }\n\n checks.push({ name: `bridge: ${id}`, status, message, fix });\n } else {\n checks.push({\n name: `instance: ${id}`,\n status: PASS,\n message: `${inst.runtime} (${inst.bridgeMode})`,\n });\n }\n }\n\n return checks;\n}\n\nfunction checkMessageLifecycle(commsDir: string): Check[] {\n const checks: Check[] = [];\n const inbox = join(commsDir, \"inbox\");\n\n if (!existsSync(inbox)) {\n checks.push({\n name: \"message flow\",\n status: FAIL,\n message: \"No inbox\",\n });\n return checks;\n }\n\n const total = countFiles(inbox);\n const recent1h = recentFileCount(inbox, 60 * 60 * 1000);\n const recent10m = recentFileCount(inbox, 10 * 60 * 1000);\n\n checks.push({\n name: \"message flow\",\n status: recent10m > 0 ? PASS : total > 0 ? WARN : FAIL,\n message: `${total} total, ${recent1h} in last 1h, ${recent10m} in last 10m`,\n });\n\n // Receipt coverage\n const receiptsPath = join(commsDir, \"receipts\", \"receipts.json\");\n if (existsSync(receiptsPath)) {\n try {\n const receipts = JSON.parse(readFileSync(receiptsPath, \"utf-8\"));\n const receiptCount = Object.keys(receipts).length;\n checks.push({\n name: \"read receipts\",\n status: PASS,\n message: `${receiptCount} receipts tracked`,\n });\n } catch {\n checks.push({\n name: \"read receipts\",\n status: WARN,\n message: \"File exists but unreadable\",\n });\n }\n }\n\n return checks;\n}\n\nfunction checkMcpServer(repoRoot: string): Check[] {\n const checks: Check[] = [];\n\n const mcpJson = join(repoRoot, \".mcp.json\");\n if (!existsSync(mcpJson)) {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: WARN,\n message: \"Not found — MCP channel notifications won't work\",\n });\n return checks;\n }\n\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(readFileSync(mcpJson, \"utf-8\"));\n } catch {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: WARN,\n message: \"File exists but invalid JSON\",\n });\n return checks;\n }\n\n const mcpServers = config?.mcpServers as Record<string, unknown> | undefined;\n const hasTap = mcpServers?.[\"tap\"] as\n | {\n command?: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n }\n | undefined;\n const hasOldKey = mcpServers?.[\"tap-comms\"] as\n | Record<string, unknown>\n | undefined;\n\n if (hasOldKey) {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: WARN,\n message:\n 'Legacy \"tap-comms\" key found. Run \"tap add claude\" to migrate to the new \"tap\" key.',\n });\n }\n\n if (!hasTap && !hasOldKey) {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: WARN,\n message: \"tap not configured\",\n });\n return checks;\n }\n\n // Use new key if available, fall back to old key for backward compat\n const hasTapComms = (hasTap ?? hasOldKey) as\n | {\n command?: string;\n args?: string[];\n cwd?: string;\n env?: Record<string, string>;\n }\n | undefined;\n if (!hasTapComms) {\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: FAIL,\n message: \"No tap or tap-comms key found in .mcp.json\",\n });\n return checks;\n }\n\n checks.push({\n name: \"MCP config (.mcp.json)\",\n status: PASS,\n message: `command: ${hasTapComms.command}`,\n });\n\n // Check if MCP command is available (absolute path or PATH lookup)\n if (hasTapComms.command) {\n const cmd = hasTapComms.command;\n let cmdAvailable = existsSync(cmd); // Absolute path check\n if (!cmdAvailable) {\n // PATH-based command — try running with --version\n try {\n const result = spawnSync(cmd, [\"--version\"], {\n stdio: \"pipe\",\n timeout: 5000,\n shell: process.platform === \"win32\",\n });\n cmdAvailable = result.status === 0;\n } catch {\n // command not found or failed\n }\n }\n checks.push({\n name: \"MCP command binary\",\n status: cmdAvailable ? PASS : FAIL,\n message: cmdAvailable\n ? cmd\n : `Not found: ${cmd} (checked PATH and absolute)`,\n });\n }\n\n // Check if MCP server script/args exist\n if (hasTapComms.args?.[0]) {\n const mcpScript = hasTapComms.args[0];\n checks.push({\n name: \"MCP server script\",\n status: existsSync(mcpScript) ? PASS : FAIL,\n message: existsSync(mcpScript) ? mcpScript : `Not found: ${mcpScript}`,\n });\n\n // Warn if using compiled .mjs with node (bun:sqlite fallback)\n if (\n mcpScript.endsWith(\".mjs\") &&\n hasTapComms.command &&\n !hasTapComms.command.includes(\"bun\")\n ) {\n checks.push({\n name: \"MCP SQLite support\",\n status: WARN,\n message:\n \"Node + .mjs = no SQLite (bun:sqlite unavailable). Use bun or .ts source for full features.\",\n });\n }\n }\n\n // Check cwd field — missing cwd caused MCP connection failures in Gen 11\n if (!hasTapComms.cwd) {\n checks.push({\n name: \"MCP cwd field\",\n status: WARN,\n message:\n \"No cwd in .mcp.json — worktree sessions may fail to resolve MCP server dependencies\",\n });\n } else {\n checks.push({\n name: \"MCP cwd field\",\n status: PASS,\n message: hasTapComms.cwd,\n });\n }\n\n // Check TAP_COMMS_DIR in env\n const envCommsDir = hasTapComms.env?.TAP_COMMS_DIR;\n if (!envCommsDir) {\n checks.push({\n name: \"MCP TAP_COMMS_DIR\",\n status: FAIL,\n message:\n \"TAP_COMMS_DIR not set in .mcp.json env — server will fail to start\",\n });\n } else {\n checks.push({\n name: \"MCP TAP_COMMS_DIR\",\n status: existsSync(envCommsDir) ? PASS : FAIL,\n message: existsSync(envCommsDir)\n ? envCommsDir\n : `Directory not found: ${envCommsDir}`,\n });\n }\n\n // Note about --resume/--continue cache behavior\n // (Can't detect at runtime, but document in output)\n checks.push({\n name: \"MCP session cache\",\n status: PASS,\n message:\n \"If .mcp.json was changed mid-session, restart Claude (Ctrl+C → claude --resume) to reload\",\n });\n\n return checks;\n}\n\nfunction checkCodexConfig(repoRoot: string, commsDir: string): Check[] {\n const spec = buildCodexDoctorSpec(repoRoot, commsDir);\n if (!spec) {\n return [];\n }\n\n const checks: Check[] = [];\n const fixHint = 'Run \"tap doctor --fix\" or \"tap add codex --force\".';\n\n if (!existsSync(spec.configPath)) {\n checks.push({\n name: \"MCP config (~/.codex/config.toml)\",\n status: WARN,\n message: `${spec.configPath} not found. ${fixHint}`,\n fix: () => repairCodexConfig(repoRoot, commsDir),\n });\n return checks;\n }\n\n const content = readFileSync(spec.configPath, \"utf-8\");\n const tapTable = extractTomlTable(content, \"mcp_servers.tap\");\n const tapEnvTable = extractTomlTable(content, \"mcp_servers.tap.env\");\n const legacyTable = extractTomlTable(content, \"mcp_servers.tap-comms\");\n const legacyEnvTable = extractTomlTable(content, \"mcp_servers.tap-comms.env\");\n const selectedMain = parseTomlAssignments(tapTable ?? \"\");\n const selectedEnv = parseTomlAssignments(tapEnvTable ?? legacyEnvTable ?? \"\");\n const issues: string[] = [];\n\n if (legacyTable || legacyEnvTable) {\n issues.push('legacy \"tap-comms\" key present');\n }\n if (!tapTable && !legacyTable) {\n issues.push(\"tap MCP table missing\");\n }\n if (!tapEnvTable && !legacyEnvTable) {\n issues.push(\"tap MCP env table missing\");\n }\n if (tapTable && spec.managed.command) {\n const actualCommand = selectedMain.command;\n if (typeof actualCommand !== \"string\") {\n issues.push(\"tap MCP command missing\");\n } else if (!sameCommandToken(actualCommand, spec.managed.command)) {\n issues.push(`tap MCP command drift (${actualCommand})`);\n }\n\n const actualArgs = selectedMain.args;\n if (!Array.isArray(actualArgs)) {\n issues.push(\"tap MCP args missing\");\n } else if (!sameStringArray(actualArgs, spec.managed.args)) {\n issues.push(`tap MCP args drift (${JSON.stringify(actualArgs)})`);\n }\n }\n\n for (const key of CODEX_ENV_DRIFT_KEYS) {\n const expected = spec.managed.env[key];\n const actual = selectedEnv[key];\n if (typeof actual !== \"string\") {\n issues.push(`${key} missing`);\n continue;\n }\n if (!samePath(actual, expected)) {\n issues.push(`${key} drift (${actual})`);\n }\n }\n\n const actualAgentName = selectedEnv.TAP_AGENT_NAME;\n if (typeof actualAgentName !== \"string\") {\n issues.push(\"TAP_AGENT_NAME missing\");\n } else if (actualAgentName !== spec.managed.env.TAP_AGENT_NAME) {\n issues.push(`non-neutral TAP_AGENT_NAME persisted (${actualAgentName})`);\n }\n\n const actualAgentId = selectedEnv.TAP_AGENT_ID;\n if (typeof actualAgentId === \"string\" && actualAgentId.trim()) {\n issues.push(`concrete TAP_AGENT_ID persisted (${actualAgentId})`);\n }\n\n // M224: approval_mode drift check\n if (tapTable) {\n const actualApprovalMode = selectedMain.approval_mode;\n if (typeof actualApprovalMode !== \"string\") {\n issues.push(\"approval_mode missing (expected auto)\");\n } else if (actualApprovalMode !== \"auto\") {\n issues.push(`approval_mode drift (${actualApprovalMode})`);\n }\n }\n\n for (const trustTarget of spec.trustTargets) {\n const trustTable = extractTomlTable(content, trustSelector(trustTarget));\n if (!trustTable || !trustTable.includes('trust_level = \"trusted\"')) {\n issues.push(`missing trust for ${trustTarget}`);\n }\n }\n\n if (issues.length === 0) {\n checks.push({\n name: \"MCP config (~/.codex/config.toml)\",\n status: PASS,\n message: spec.configPath,\n });\n return checks;\n }\n\n checks.push({\n name: \"MCP config (~/.codex/config.toml)\",\n status: WARN,\n message: `${issues.join(\"; \")}. ${fixHint}`,\n fix: () => repairCodexConfig(repoRoot, commsDir),\n });\n\n return checks;\n}\n\n// ── Bridge Turn Health (zombie detection) ───────────────────────────\n\nfunction checkBridgeTurnHealth(repoRoot: string): Check[] {\n const checks: Check[] = [];\n const tmpDir = join(repoRoot, \".tmp\");\n if (!existsSync(tmpDir)) return checks;\n\n // Only scan dirs that belong to active instances or their agents\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 // Also match agentName-based dirs (manual runbook pattern)\n if (inst.agentName) activeMatchers.add(inst.agentName);\n }\n }\n }\n\n let dirs: string[];\n try {\n dirs = readdirSync(tmpDir).filter((d) => {\n if (!d.startsWith(\"codex-app-server-bridge\")) return false;\n const suffix = d.replace(\"codex-app-server-bridge-\", \"\");\n if (activeMatchers.size === 0) return true; // No state → scan all\n for (const matcher of activeMatchers) {\n if (suffix === matcher || suffix.startsWith(matcher)) return true;\n }\n return false;\n });\n } catch {\n return checks;\n }\n\n for (const dir of dirs) {\n const heartbeatPath = join(tmpDir, dir, \"heartbeat.json\");\n if (!existsSync(heartbeatPath)) continue;\n\n let heartbeat: {\n updatedAt?: string;\n activeTurnId?: string | null;\n lastTurnStatus?: string;\n lastNotificationAt?: string;\n lastNotificationMethod?: string;\n connected?: boolean;\n initialized?: boolean;\n authenticated?: boolean;\n consecutiveFailureCount?: number;\n lastError?: string | null;\n };\n\n try {\n heartbeat = JSON.parse(readFileSync(heartbeatPath, \"utf-8\"));\n } catch {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message: \"heartbeat.json unreadable\",\n });\n continue;\n }\n\n // Calculate heartbeat age\n const heartbeatAge = heartbeat.updatedAt\n ? Math.floor(\n (Date.now() - new Date(heartbeat.updatedAt).getTime()) / 1000,\n )\n : null;\n\n // Not connected\n if (heartbeat.connected === false || heartbeat.initialized === false) {\n checks.push({\n name: `turn: ${dir}`,\n status: FAIL,\n message: `disconnected (connected=${heartbeat.connected}, initialized=${heartbeat.initialized})${heartbeat.lastError ? ` — ${heartbeat.lastError}` : \"\"}`,\n });\n continue;\n }\n\n // Dead — no heartbeat update for 5+ minutes\n if (heartbeatAge !== null && heartbeatAge > 300) {\n checks.push({\n name: `turn: ${dir}`,\n status: FAIL,\n message: `dead — heartbeat ${Math.round(heartbeatAge)}s ago, no updates`,\n });\n continue;\n }\n\n // Zombie — active turn with no notification progress for 30+ minutes (Fix 1)\n if (heartbeat.activeTurnId) {\n const ZOMBIE_THRESHOLD = 30 * 60; // 30 minutes\n const lastNotifAge = heartbeat.lastNotificationAt\n ? Math.floor(\n (Date.now() - new Date(heartbeat.lastNotificationAt).getTime()) /\n 1000,\n )\n : null;\n\n // Primary: use lastNotificationAt to detect stuck turns\n if (lastNotifAge !== null && lastNotifAge > ZOMBIE_THRESHOLD) {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message: `zombie — active turn ${heartbeat.activeTurnId}, last notification ${Math.round(lastNotifAge / 60)}m ago (${heartbeat.lastNotificationMethod ?? \"?\"}). MCP tools may not be exposed in app-server turns — try bridge restart${heartbeat.lastError ? `. Error: ${heartbeat.lastError}` : \"\"}`,\n });\n continue;\n }\n\n // Fallback: consecutive failures + active turn = zombie signal\n const failures = heartbeat.consecutiveFailureCount ?? 0;\n if (failures > 0 && heartbeatAge !== null && heartbeatAge < 60) {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message: `zombie — active turn ${heartbeat.activeTurnId}, ${failures} consecutive failures. MCP tools may not be exposed in app-server turns — try bridge restart${heartbeat.lastError ? `. Error: ${heartbeat.lastError}` : \"\"}`,\n });\n continue;\n }\n }\n\n // Slow — heartbeat fresh but lots of failures\n const failures = heartbeat.consecutiveFailureCount ?? 0;\n if (failures > 5) {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message: `slow — ${failures} consecutive failures, last: ${heartbeat.lastError ?? \"unknown\"}`,\n });\n continue;\n }\n\n // M175: Warn when a live bridge is running without auth\n if (heartbeat.authenticated === false) {\n checks.push({\n name: `turn: ${dir}`,\n status: WARN,\n message:\n \"bridge running without auth — app-server session is unprotected. \" +\n \"Use --gateway-token-file to enable auth.\",\n });\n }\n\n // Healthy\n const turnInfo = heartbeat.activeTurnId\n ? `active turn ${heartbeat.activeTurnId}`\n : `idle (last: ${heartbeat.lastTurnStatus ?? \"none\"})`;\n checks.push({\n name: `turn: ${dir}`,\n status: PASS,\n message: `healthy — ${turnInfo}, heartbeat ${heartbeatAge ?? \"?\"}s ago`,\n });\n }\n\n return checks;\n}\n\n// ── Render ──────────────────────────────────────────────────────────────\n\nfunction renderCheck(check: Check, fixMode: boolean): string {\n const icons: Record<string, string> = {\n pass: \"[OK]\",\n warn: \"[!!]\",\n fail: \"[XX]\",\n skip: \"[--]\",\n };\n const icon = icons[check.status] || \"[??]\";\n const fixable = fixMode && check.fix ? \" (fixable)\" : \"\";\n const msg = check.message ? ` — ${check.message}${fixable}` : \"\";\n return ` ${icon} ${check.name}${msg}`;\n}\n\nconst DOCTOR_HELP = `\nUsage:\n tap doctor [options]\n\nDescription:\n Diagnose tap infrastructure health: comms directory, instances, bridges,\n message lifecycle, and MCP server configuration.\n\nOptions:\n --fix Auto-repair detected issues where possible\n --comms-dir <path> Override comms directory\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap doctor\n npx @hua-labs/tap doctor --fix\n`.trim();\n\n// ── Command ─────────────────────────────────────────────────────────────\n\nexport async function doctorCommand(args: string[]): Promise<CommandResult> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n log(DOCTOR_HELP);\n return {\n ok: true,\n command: \"doctor\",\n code: \"TAP_NO_OP\",\n message: DOCTOR_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n\n // Parse flags\n const overrides: Record<string, string> = {};\n let fixMode = false;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--comms-dir\" && args[i + 1]) {\n overrides.commsDir = args[i + 1];\n }\n if (args[i] === \"--fix\") {\n fixMode = true;\n }\n }\n\n const { config } = resolveConfig(overrides, repoRoot);\n const state = loadState(repoRoot);\n const commsDir = overrides.commsDir\n ? config.commsDir\n : (state?.commsDir ?? config.commsDir);\n\n logHeader(`@hua-labs/tap doctor (v${version})${fixMode ? \" --fix\" : \"\"}`);\n\n function checkConfigDrift(): Check[] {\n let driftResults;\n try {\n driftResults = checkAllDrift(config.stateDir, state);\n } catch (err) {\n // Surface the error as a warn so drift check failure is visible\n return [\n {\n name: \"drift:infrastructure\",\n status: \"warn\" as const,\n message: `Config drift check failed: ${err instanceof Error ? err.message : String(err)}`,\n },\n ];\n }\n const checks: Check[] = [];\n for (const result of driftResults) {\n for (const dc of result.checks) {\n const check: Check = {\n name: `drift:${result.instanceId}:${dc.name}`,\n status:\n dc.status === \"ok\" ? \"pass\" : dc.autoFixable ? \"warn\" : \"fail\",\n message: dc.details ?? undefined,\n };\n if (dc.autoFixable && dc.status !== \"ok\") {\n check.fix = () => {\n const {\n loadInstanceConfig: loadInst,\n saveInstanceConfig: saveInst,\n } = require(\"../config/instance-config.js\");\n const {\n computeFileHash: hashFile,\n } = require(\"../config/drift-detector.js\");\n const instConfig = loadInst(config.stateDir, result.instanceId);\n if (!instConfig || !state) {\n return `Skipped: instance config not found for ${result.instanceId}`;\n }\n const inst = state.instances[result.instanceId];\n if (!inst) {\n return `Skipped: instance not in state.json for ${result.instanceId}`;\n }\n\n // Sync state.json fields from instance config\n inst.agentName = instConfig.agentName;\n inst.port = instConfig.port;\n inst.configHash = instConfig.configHash;\n inst.configSourceFile =\n inst.configSourceFile ||\n join(config.stateDir, \"instances\", `${result.instanceId}.json`);\n saveState(repoRoot, state);\n\n // Resync runtime config hash if configPath exists\n if (inst.configPath && existsSync(inst.configPath)) {\n const currentHash = hashFile(inst.configPath);\n if (instConfig.runtimeConfigHash !== currentHash) {\n instConfig.runtimeConfigHash = currentHash;\n instConfig.lastSyncedToRuntime = new Date().toISOString();\n saveInst(config.stateDir, instConfig);\n }\n }\n\n return `Synced state.json + runtime hash for ${result.instanceId}`;\n };\n }\n checks.push(check);\n }\n }\n return checks;\n }\n\n function runAllChecks(): Check[] {\n const checks: Check[] = [];\n checks.push(...checkComms(commsDir));\n checks.push(...checkStaleHeartbeats(repoRoot, commsDir, config.stateDir));\n checks.push(...checkInstances(repoRoot, config.stateDir, commsDir));\n checks.push(...checkConfigDrift());\n checks.push(...checkMessageLifecycle(commsDir));\n checks.push(...checkMcpServer(repoRoot));\n checks.push(...checkCodexConfig(repoRoot, commsDir));\n checks.push(...checkBridgeTurnHealth(repoRoot));\n return checks;\n }\n\n // Initial scan\n const initialChecks = runAllChecks();\n for (const section of [\n \"Comms\",\n \"Instances\",\n \"Config Drift\",\n \"Messages\",\n \"MCP\",\n \"Turns\",\n ] as const) {\n const sectionChecks = {\n Comms: initialChecks.filter((c) =>\n [\n \"comms directory\",\n \"inbox directory\",\n \"reviews directory\",\n \"findings directory\",\n \"heartbeats\",\n \"stale heartbeats\",\n ].includes(c.name),\n ),\n Instances: initialChecks.filter(\n (c) =>\n c.name.startsWith(\"bridge:\") ||\n c.name.startsWith(\"instance:\") ||\n c.name === \"tap state\",\n ),\n \"Config Drift\": initialChecks.filter((c) => c.name.startsWith(\"drift:\")),\n Messages: initialChecks.filter((c) =>\n [\"message flow\", \"read receipts\"].includes(c.name),\n ),\n MCP: initialChecks.filter(\n (c) => c.name.startsWith(\"MCP\") || c.name === \"MCP server script\",\n ),\n Turns: initialChecks.filter((c) => c.name.startsWith(\"turn:\")),\n }[section];\n if (sectionChecks.length > 0) {\n log(`${section}:`);\n for (const c of sectionChecks) log(renderCheck(c, fixMode));\n log(\"\");\n }\n }\n\n // Auto-fix + re-verify\n const fixed: string[] = [];\n let finalChecks = initialChecks;\n\n if (fixMode) {\n const fixable = initialChecks.filter(\n (c) => (c.status === \"warn\" || c.status === \"fail\") && c.fix,\n );\n if (fixable.length > 0) {\n log(\"Fixes:\");\n for (const c of fixable) {\n try {\n const desc = c.fix!();\n fixed.push(desc);\n logSuccess(` ${desc}`);\n } catch (err) {\n logWarn(\n ` Failed to fix ${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n // Re-run all checks after fixes for accurate post-fix status\n log(\"\");\n log(\"Re-verifying...\");\n finalChecks = runAllChecks();\n const postFails = finalChecks.filter((c) => c.status === \"fail\").length;\n const postWarns = finalChecks.filter((c) => c.status === \"warn\").length;\n log(\n ` ${postFails === 0 ? \"All clear\" : `${postFails} remaining failures, ${postWarns} warnings`}`,\n );\n } else {\n log(\"Nothing to fix.\");\n }\n }\n\n // Summary (based on final state)\n const passes = finalChecks.filter((c) => c.status === \"pass\").length;\n const warns = finalChecks.filter((c) => c.status === \"warn\").length;\n const fails = finalChecks.filter((c) => c.status === \"fail\").length;\n\n log(\"\");\n log(\n `${finalChecks.length} checks: ${passes} passed, ${warns} warnings, ${fails} failures` +\n (fixed.length > 0 ? ` (${fixed.length} fixed)` : \"\"),\n );\n\n return {\n ok: fails === 0,\n command: \"doctor\",\n code: fails === 0 ? \"TAP_STATUS_OK\" : \"TAP_VERIFY_FAILED\",\n message: `${passes} passed, ${warns} warnings, ${fails} failures`,\n warnings: finalChecks\n .filter((c) => c.status === \"warn\")\n .map((c) => `${c.name}: ${c.message}`),\n data: {\n checks: finalChecks.map(({ fix, ...rest }) => rest),\n summary: { total: finalChecks.length, passes, warns, fails },\n fixed,\n },\n };\n}\n","/**\n * tap comms pull/push — sync comms directory with remote repo.\n * M108: GitHub/comms repo connection.\n */\n\nimport { execSync, spawnSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n findRepoRoot,\n resolveCommsDir as resolveCommsDirFromArgs,\n log,\n logSuccess,\n logError,\n logHeader,\n} from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst COMMS_HELP = `\nUsage:\n tap comms <subcommand>\n\nSubcommands:\n pull Pull latest changes from comms remote repo\n push Commit and push comms changes to remote repo\n\nExamples:\n npx @hua-labs/tap comms pull\n npx @hua-labs/tap comms push\n`.trim();\n\nfunction isGitRepo(dir: string): boolean {\n return fs.existsSync(path.join(dir, \".git\"));\n}\n\nfunction commsPull(commsDir: string): CommandResult {\n logHeader(\"tap comms pull\");\n\n if (!isGitRepo(commsDir)) {\n logError(`${commsDir} is not a git repository`);\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_NOT_REPO\",\n message: `Comms directory is not a git repo. Use 'tap init --comms-repo <url>' to set up.`,\n warnings: [],\n data: { commsDir },\n };\n }\n\n try {\n const output = execSync(\"git pull --rebase\", {\n cwd: commsDir,\n encoding: \"utf-8\",\n stdio: \"pipe\",\n });\n logSuccess(\"Comms pull complete\");\n if (output.trim()) log(output.trim());\n return {\n ok: true,\n command: \"comms\",\n code: \"TAP_COMMS_PULL_OK\",\n message: \"Comms pull complete\",\n warnings: [],\n data: { commsDir },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(`Pull failed: ${msg}`);\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_PULL_FAILED\",\n message: `Pull failed: ${msg}`,\n warnings: [],\n data: { commsDir },\n };\n }\n}\n\nfunction commsPush(commsDir: string): CommandResult {\n logHeader(\"tap comms push\");\n\n if (!isGitRepo(commsDir)) {\n logError(`${commsDir} is not a git repository`);\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_NOT_REPO\",\n message: `Comms directory is not a git repo. Use 'tap init --comms-repo <url>' to set up.`,\n warnings: [],\n data: { commsDir },\n };\n }\n\n try {\n // Stage all changes\n execSync(\"git add -A\", { cwd: commsDir, stdio: \"pipe\" });\n\n // Check if there are changes to commit\n const status = execSync(\"git status --porcelain\", {\n cwd: commsDir,\n encoding: \"utf-8\",\n stdio: \"pipe\",\n }).trim();\n\n if (!status) {\n log(\"Nothing to push — comms directory is clean\");\n return {\n ok: true,\n command: \"comms\",\n code: \"TAP_COMMS_PUSH_OK\",\n message: \"Nothing to push\",\n warnings: [],\n data: { commsDir, changed: false },\n };\n }\n\n // Commit\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const commitResult = spawnSync(\n \"git\",\n [\"commit\", \"-m\", `chore(comms): sync ${timestamp}`],\n { cwd: commsDir, stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (commitResult.status !== 0) {\n const msg =\n commitResult.stderr ||\n `git commit exited with code ${commitResult.status}`;\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_PUSH_FAILED\",\n message: `Commit failed: ${msg}`,\n warnings: [],\n data: { commsDir },\n };\n }\n\n // Push\n execSync(\"git push\", { cwd: commsDir, stdio: \"pipe\" });\n logSuccess(\"Comms push complete\");\n\n return {\n ok: true,\n command: \"comms\",\n code: \"TAP_COMMS_PUSH_OK\",\n message: \"Comms push complete\",\n warnings: [],\n data: { commsDir, changed: true },\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logError(`Push failed: ${msg}`);\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_COMMS_PUSH_FAILED\",\n message: `Push failed: ${msg}`,\n warnings: [],\n data: { commsDir },\n };\n }\n}\n\nexport async function commsCommand(args: string[]): Promise<CommandResult> {\n const subcommand = args[0];\n\n if (!subcommand || subcommand === \"--help\" || subcommand === \"-h\") {\n log(COMMS_HELP);\n return {\n ok: true,\n command: \"comms\",\n code: \"TAP_NO_OP\",\n message: COMMS_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n // --comms-dir flag > config (shared/local/env) > auto-default\n const commsDir = resolveCommsDirFromArgs(args, repoRoot);\n\n switch (subcommand) {\n case \"pull\":\n return commsPull(commsDir);\n case \"push\":\n return commsPush(commsDir);\n default:\n return {\n ok: false,\n command: \"comms\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Unknown comms subcommand: ${subcommand}. Use pull or push.`,\n warnings: [],\n data: {},\n };\n }\n}\n","import { bridgeCommand } from \"./bridge.js\";\nimport { log, logHeader, parseArgs, parseIntFlag } from \"../utils.js\";\nimport type { CommandResult } from \"../types.js\";\n\nconst WATCH_HELP = `\nUsage:\n tap watch [options]\n\nDescription:\n Monitor all bridges and auto-restart stuck/stale ones.\n Single-pass by default. Use --loop for continuous monitoring.\n\nOptions:\n --stuck-threshold <seconds> Turn stuck threshold (default: 300)\n --interval <seconds> Loop interval (default: 60)\n --loop Run continuously instead of single-pass\n --max-rounds <n> Max loop iterations (default: unlimited)\n\nExamples:\n npx @hua-labs/tap watch # single check\n npx @hua-labs/tap watch --loop # continuous\n npx @hua-labs/tap watch --loop --interval 30 # check every 30s\n npx @hua-labs/tap watch --stuck-threshold 120 # 2 min threshold\n`.trim();\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function watchCommand(args: string[]): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(WATCH_HELP);\n return {\n ok: true,\n command: \"watch\",\n code: \"TAP_NO_OP\",\n message: WATCH_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const stuckThresholdStr =\n typeof flags[\"stuck-threshold\"] === \"string\"\n ? flags[\"stuck-threshold\"]\n : undefined;\n const intervalStr =\n typeof flags[\"interval\"] === \"string\" ? flags[\"interval\"] : undefined;\n const loop = flags[\"loop\"] === true;\n const maxRoundsStr =\n typeof flags[\"max-rounds\"] === \"string\" ? flags[\"max-rounds\"] : undefined;\n\n let stuckThreshold: number;\n let interval: number;\n let maxRounds: number | null;\n try {\n stuckThreshold =\n parseIntFlag(stuckThresholdStr, \"--stuck-threshold\", 30, 3600) ?? 300;\n interval = parseIntFlag(intervalStr, \"--interval\", 5, 3600) ?? 60;\n maxRounds = parseIntFlag(maxRoundsStr, \"--max-rounds\", 1, 10000) ?? null;\n } catch (err) {\n return {\n ok: false,\n command: \"watch\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: err instanceof Error ? err.message : String(err),\n warnings: [],\n data: {},\n };\n }\n\n // Build bridge watch args\n const bridgeArgs = [\"watch\", \"--stuck-threshold\", String(stuckThreshold)];\n\n if (!loop) {\n // Single-pass mode\n return bridgeCommand(bridgeArgs);\n }\n\n // Loop mode\n logHeader(\"@hua-labs/tap watch (loop mode)\");\n log(`Interval: ${interval}s, Stuck threshold: ${stuckThreshold}s`);\n if (maxRounds != null) {\n log(`Max rounds: ${maxRounds}`);\n }\n log(\"\");\n\n let round = 0;\n let failedRounds = 0;\n const allRestarted: string[] = [];\n const allWarnings: string[] = [];\n while (maxRounds == null || round < maxRounds) {\n round++;\n const timestamp = new Date().toISOString().slice(11, 19);\n log(`[${timestamp}] Round ${round}`);\n\n const result = await bridgeCommand(bridgeArgs);\n\n if (!result.ok) {\n failedRounds++;\n allWarnings.push(`Round ${round}: ${result.message}`);\n }\n\n if (result.data?.restarted) {\n const restarted = result.data.restarted as string[];\n allRestarted.push(...restarted);\n }\n if (result.warnings?.length) {\n allWarnings.push(...result.warnings);\n }\n\n if (maxRounds != null && round >= maxRounds) break;\n\n await delay(interval * 1000);\n }\n\n const allOk = failedRounds === 0;\n const message = [\n `Completed ${round} round(s)`,\n failedRounds > 0 ? `${failedRounds} failed` : null,\n allRestarted.length > 0\n ? `Total restarts: ${allRestarted.length} (${allRestarted.join(\", \")})`\n : \"No restarts needed\",\n ]\n .filter(Boolean)\n .join(\". \");\n\n return {\n ok: allOk,\n command: \"watch\",\n code: !allOk\n ? \"TAP_WATCH_FAILED\"\n : allRestarted.length > 0\n ? \"TAP_WATCH_RESTARTED\"\n : \"TAP_WATCH_OK\",\n message,\n warnings: allWarnings,\n data: { rounds: round, restarted: allRestarted },\n };\n}\n","import * as http from \"node:http\";\nimport { collectDashboardSnapshot } from \"../engine/dashboard.js\";\nimport { getTurnInfo } from \"../engine/bridge.js\";\nimport { parseMissionsFile } from \"../engine/missions.js\";\nimport { fetchPrs } from \"../engine/pull-requests.js\";\nimport { resolveConfig } from \"../config/index.js\";\nimport { loadState } from \"../state.js\";\nimport {\n findRepoRoot,\n log,\n logHeader,\n logSuccess,\n parseArgs,\n parseIntFlag,\n} from \"../utils.js\";\nimport type { CommandResult, InstanceId } from \"../types.js\";\n\nconst GUI_HELP = `\nUsage:\n tap gui [options]\n\nDescription:\n Start a local web dashboard showing bridge status, agents, and turn info.\n\nOptions:\n --port <n> Dashboard port (default: 3847)\n --help, -h Show help\n\nExamples:\n npx @hua-labs/tap gui\n npx @hua-labs/tap gui --port 8080\n`.trim();\n\n/** Escape HTML special characters to prevent XSS */\nfunction esc(str: string | null | undefined): string {\n if (!str) return \"-\";\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\");\n}\n\nfunction buildHtml(\n snapshot: ReturnType<typeof collectDashboardSnapshot>,\n turnData: Record<string, unknown>,\n): string {\n const agentRows = snapshot.agents\n .map(\n (a) =>\n `<tr><td>${esc(a.name)}</td><td class=\"${a.presence === \"bridge-live\" ? \"ok\" : a.presence === \"bridge-stale\" ? \"warn\" : \"off\"}\">${esc(a.presence)}</td><td>${esc(a.lifecycle ?? \"-\")}</td><td>${a.lastActivity ? esc(new Date(a.lastActivity).toLocaleTimeString()) : \"-\"}</td></tr>`,\n )\n .join(\"\\n\");\n\n const bridgeRows = snapshot.bridges\n .map((b) => {\n const turn = turnData[b.instanceId] as {\n activeTurnId?: string;\n stuck?: boolean;\n ageSeconds?: number;\n } | null;\n const turnCell = turn?.activeTurnId\n ? `<span class=\"${turn.stuck ? \"stuck\" : \"ok\"}\">${esc(turn.activeTurnId.slice(0, 8))}... ${turn.stuck ? \"⚠ STUCK\" : \"\"} ${turn.ageSeconds != null ? `(${turn.ageSeconds}s)` : \"\"}</span>`\n : \"-\";\n const statusClass =\n b.status === \"running\" ? \"ok\" : b.status === \"stale\" ? \"stuck\" : \"off\";\n return `<tr><td>${esc(b.instanceId)}</td><td>${esc(b.runtime)}</td><td class=\"${statusClass}\">${esc(b.status)}</td><td>${b.pid ?? \"-\"}</td><td>${b.port ?? \"-\"}</td><td>${b.heartbeatAge != null ? `${b.heartbeatAge}s ago` : \"-\"}</td><td>${turnCell}</td></tr>`;\n })\n .join(\"\\n\");\n\n const warningRows = snapshot.warnings\n .map(\n (w) =>\n `<tr><td class=\"warn\">${esc(w.level)}</td><td>${esc(w.message)}</td></tr>`,\n )\n .join(\"\\n\");\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>tap dashboard</title>\n<style>\n body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; margin: 0; padding: 20px; }\n h1 { color: #58a6ff; font-size: 1.4em; }\n h2 { color: #8b949e; font-size: 1.1em; margin-top: 24px; }\n table { border-collapse: collapse; width: 100%; margin: 8px 0; }\n th, td { text-align: left; padding: 6px 12px; border-bottom: 1px solid #21262d; }\n th { color: #8b949e; font-size: 0.85em; text-transform: uppercase; }\n .ok { color: #3fb950; }\n .warn { color: #d29922; }\n .stuck { color: #f85149; font-weight: bold; }\n .off { color: #8b949e; }\n .meta { color: #8b949e; font-size: 0.85em; }\n .refresh { color: #8b949e; font-size: 0.8em; margin-top: 16px; }\n</style>\n</head>\n<body>\n<h1>tap dashboard</h1>\n<p class=\"meta\">${esc(snapshot.generatedAt)} &middot; ${esc(snapshot.repoRoot)}</p>\n\n<h2>Agents</h2>\n<table>\n<tr><th>Name</th><th>Presence</th><th>Lifecycle</th><th>Last Activity</th></tr>\n${agentRows || '<tr><td colspan=\"4\" class=\"off\">No agents</td></tr>'}\n</table>\n\n<h2>Bridges</h2>\n<table>\n<tr><th>Instance</th><th>Runtime</th><th>Status</th><th>PID</th><th>Port</th><th>Heartbeat</th><th>Turn</th></tr>\n${bridgeRows || '<tr><td colspan=\"7\" class=\"off\">No bridges</td></tr>'}\n</table>\n\n${warningRows ? `<h2>Warnings</h2><table><tr><th>Level</th><th>Message</th></tr>${warningRows}</table>` : \"\"}\n\n<p class=\"refresh\" id=\"status\">Connecting to live updates...</p>\n<script>\nconst es = new EventSource('/api/events');\nconst statusEl = document.getElementById('status');\nlet lastReloadAt = Date.now();\nes.onmessage = (e) => {\n statusEl.textContent = 'Live — updated ' + new Date().toLocaleTimeString();\n statusEl.style.color = '#3fb950';\n const elapsed = Date.now() - lastReloadAt;\n if (elapsed >= 9000) { lastReloadAt = Date.now(); location.reload(); }\n};\nes.onerror = () => {\n statusEl.textContent = 'Disconnected — will retry...';\n statusEl.style.color = '#f85149';\n};\n</script>\n<p class=\"refresh\"><a href=\"/missions\" style=\"color:#58a6ff;\">Mission Kanban</a> &middot; <a href=\"/prs\" style=\"color:#58a6ff;\">PR Board</a></p>\n</body>\n</html>`;\n}\n\nfunction buildMissionsHtml(repoRoot: string): string {\n const missions = parseMissionsFile(repoRoot);\n\n const byStatus = {\n active: missions.filter((m) => m.status === \"active\"),\n planned: missions.filter((m) => m.status === \"planned\"),\n completed: missions.filter((m) => m.status === \"completed\"),\n };\n\n function card(m: ReturnType<typeof parseMissionsFile>[number]): string {\n return `<div class=\"card\">\n <div class=\"card-id\">${esc(m.id)}</div>\n <div class=\"card-title\">${esc(m.title)}</div>\n ${m.owner ? `<div class=\"card-meta\">Owner: ${esc(m.owner)}</div>` : \"\"}\n ${m.branch ? `<div class=\"card-meta card-branch\">${esc(m.branch)}</div>` : \"\"}\n</div>`;\n }\n\n function column(\n label: string,\n headerClass: string,\n items: ReturnType<typeof parseMissionsFile>,\n ): string {\n return `<div class=\"column\">\n <div class=\"col-header ${headerClass}\">${label} <span class=\"badge\">${items.length}</span></div>\n <div class=\"col-body\">\n ${items.length ? items.map(card).join(\"\\n \") : '<div class=\"empty\">No missions</div>'}\n </div>\n</div>`;\n }\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>tap — mission kanban</title>\n<meta http-equiv=\"refresh\" content=\"30\">\n<style>\n body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; margin: 0; padding: 20px; }\n h1 { color: #58a6ff; font-size: 1.4em; }\n a { color: #58a6ff; text-decoration: none; }\n a:hover { text-decoration: underline; }\n .meta { color: #8b949e; font-size: 0.85em; }\n .refresh { color: #8b949e; font-size: 0.8em; margin-top: 16px; }\n .board { display: flex; gap: 16px; margin-top: 16px; align-items: flex-start; flex-wrap: wrap; }\n .column { flex: 1; min-width: 240px; background: #161b22; border: 1px solid #21262d; border-radius: 6px; overflow: hidden; }\n .col-header { padding: 10px 14px; font-size: 0.85em; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; display: flex; justify-content: space-between; align-items: center; }\n .col-header.active { color: #3fb950; border-bottom: 2px solid #3fb950; }\n .col-header.planned { color: #d29922; border-bottom: 2px solid #d29922; }\n .col-header.completed { color: #8b949e; border-bottom: 2px solid #8b949e; }\n .badge { background: #21262d; color: #c9d1d9; border-radius: 10px; padding: 1px 7px; font-size: 0.8em; }\n .col-body { padding: 8px; display: flex; flex-direction: column; gap: 8px; }\n .card { background: #0d1117; border: 1px solid #21262d; border-radius: 4px; padding: 10px 12px; }\n .card-id { font-size: 0.75em; color: #58a6ff; font-weight: 600; margin-bottom: 4px; }\n .card-title { font-size: 0.9em; color: #e6edf3; line-height: 1.4; }\n .card-meta { font-size: 0.75em; color: #8b949e; margin-top: 4px; }\n .card-branch { font-family: ui-monospace, monospace; color: #6e7681; }\n .empty { color: #6e7681; font-size: 0.85em; padding: 8px 4px; }\n</style>\n</head>\n<body>\n<h1>mission kanban</h1>\n<p class=\"meta\"><a href=\"/\">&larr; Dashboard</a> &middot; ${esc(repoRoot)}</p>\n<div class=\"board\">\n ${column(\"Active\", \"active\", byStatus.active)}\n ${column(\"Planned\", \"planned\", byStatus.planned)}\n ${column(\"Completed\", \"completed\", byStatus.completed)}\n</div>\n<p class=\"refresh\">Auto-refresh every 30s</p>\n</body>\n</html>`;\n}\n\nfunction buildPrsHtml(repoRoot: string): string {\n const { open, merged } = fetchPrs(repoRoot);\n\n function prRow(pr: ReturnType<typeof fetchPrs>[\"open\"][number]): string {\n return `<tr>\n <td><a href=\"${esc(pr.url)}\" target=\"_blank\" rel=\"noopener\" style=\"color:#58a6ff;\">#${pr.number}</a></td>\n <td>${esc(pr.title)}</td>\n <td>${esc(pr.author)}</td>\n <td class=\"branch\">${esc(pr.branch)}</td>\n</tr>`;\n }\n\n const openRows = open.map(prRow).join(\"\\n\");\n const mergedRows = merged\n .map(\n (pr) =>\n `<tr>\n <td><a href=\"${esc(pr.url)}\" target=\"_blank\" rel=\"noopener\" style=\"color:#58a6ff;\">#${pr.number}</a></td>\n <td>${esc(pr.title)}</td>\n <td>${esc(pr.author)}</td>\n</tr>`,\n )\n .join(\"\\n\");\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>tap — pr board</title>\n<meta http-equiv=\"refresh\" content=\"60\">\n<style>\n body { font-family: system-ui, -apple-system, sans-serif; background: #0d1117; color: #c9d1d9; margin: 0; padding: 20px; }\n h1 { color: #58a6ff; font-size: 1.4em; }\n h2 { color: #8b949e; font-size: 1.1em; margin-top: 24px; }\n a { color: #58a6ff; text-decoration: none; }\n a:hover { text-decoration: underline; }\n table { border-collapse: collapse; width: 100%; margin: 8px 0; }\n th, td { text-align: left; padding: 6px 12px; border-bottom: 1px solid #21262d; }\n th { color: #8b949e; font-size: 0.85em; text-transform: uppercase; }\n .branch { font-family: ui-monospace, monospace; font-size: 0.85em; color: #6e7681; }\n .meta { color: #8b949e; font-size: 0.85em; }\n .refresh { color: #8b949e; font-size: 0.8em; margin-top: 16px; }\n .off { color: #8b949e; }\n</style>\n</head>\n<body>\n<h1>pr board</h1>\n<p class=\"meta\"><a href=\"/\">&larr; Dashboard</a> &middot; ${esc(repoRoot)}</p>\n\n<h2>Open PRs <span style=\"color:#3fb950;\">(${open.length})</span></h2>\n<table>\n<tr><th>#</th><th>Title</th><th>Author</th><th>Branch</th></tr>\n${openRows || '<tr><td colspan=\"4\" class=\"off\">No open PRs</td></tr>'}\n</table>\n\n<h2>Recently Merged <span style=\"color:#8b949e;\">(${merged.length})</span></h2>\n<table>\n<tr><th>#</th><th>Title</th><th>Author</th></tr>\n${mergedRows || '<tr><td colspan=\"3\" class=\"off\">No merged PRs</td></tr>'}\n</table>\n\n<p class=\"refresh\">Auto-refresh every 60s</p>\n</body>\n</html>`;\n}\n\nexport async function guiCommand(args: string[]): Promise<CommandResult> {\n const { flags } = parseArgs(args);\n\n if (flags[\"help\"] === true || flags[\"h\"] === true) {\n log(GUI_HELP);\n return {\n ok: true,\n command: \"gui\",\n code: \"TAP_NO_OP\",\n message: GUI_HELP,\n warnings: [],\n data: {},\n };\n }\n\n const portStr = typeof flags[\"port\"] === \"string\" ? flags[\"port\"] : undefined;\n let port: number;\n try {\n port = parseIntFlag(portStr, \"--port\", 1024, 65535) ?? 3847;\n } catch (err) {\n return {\n ok: false,\n command: \"gui\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: err instanceof Error ? err.message : String(err),\n warnings: [],\n data: {},\n };\n }\n\n const repoRoot = findRepoRoot();\n\n const server = http.createServer((req, res) => {\n const snapshot = collectDashboardSnapshot(repoRoot);\n\n // Collect turn info for each bridge\n const state = loadState(repoRoot);\n const { config } = resolveConfig({}, repoRoot);\n const turnData: Record<string, unknown> = {};\n if (state) {\n for (const [id, inst] of Object.entries(state.instances)) {\n if (!inst?.installed || inst.bridgeMode !== \"app-server\") continue;\n turnData[id] = getTurnInfo(config.stateDir, id as InstanceId);\n }\n }\n\n const jsonHeaders = {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n };\n\n if (req.url === \"/api/snapshot\") {\n res.writeHead(200, jsonHeaders);\n res.end(JSON.stringify({ ...snapshot, turns: turnData }, null, 2));\n return;\n }\n\n // SSE endpoint — push updates every 5 seconds\n if (req.url === \"/api/events\") {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n const sendEvent = () => {\n const s = collectDashboardSnapshot(repoRoot);\n const st = loadState(repoRoot);\n const cfg = resolveConfig({}, repoRoot).config;\n const td: Record<string, unknown> = {};\n if (st) {\n for (const [id, inst] of Object.entries(st.instances)) {\n if (!inst?.installed || inst.bridgeMode !== \"app-server\") continue;\n td[id] = getTurnInfo(cfg.stateDir, id as InstanceId);\n }\n }\n res.write(`data: ${JSON.stringify({ ...s, turns: td })}\\n\\n`);\n };\n\n sendEvent();\n const interval = setInterval(sendEvent, 5000);\n req.on(\"close\", () => clearInterval(interval));\n return;\n }\n\n if (req.url === \"/api/missions\") {\n const missions = parseMissionsFile(repoRoot);\n res.writeHead(200, jsonHeaders);\n res.end(JSON.stringify(missions, null, 2));\n return;\n }\n\n if (req.url === \"/missions\") {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(buildMissionsHtml(repoRoot));\n return;\n }\n\n if (req.url === \"/api/prs\") {\n const prs = fetchPrs(repoRoot);\n res.writeHead(200, jsonHeaders);\n res.end(JSON.stringify(prs, null, 2));\n return;\n }\n\n if (req.url === \"/prs\") {\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(buildPrsHtml(repoRoot));\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(buildHtml(snapshot, turnData));\n });\n\n return new Promise<CommandResult>((resolve) => {\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n resolve({\n ok: false,\n command: \"gui\",\n code: \"TAP_PORT_IN_USE\",\n message: `Port ${port} is already in use. Try: tap gui --port <other>`,\n warnings: [],\n data: {},\n });\n } else {\n resolve({\n ok: false,\n command: \"gui\",\n code: \"TAP_GUI_ERROR\",\n message: err.message,\n warnings: [],\n data: {},\n });\n }\n });\n\n server.listen(port, \"127.0.0.1\", () => {\n logHeader(\"tap gui dashboard\");\n logSuccess(`Dashboard: http://127.0.0.1:${port}`);\n log(`API: http://127.0.0.1:${port}/api/snapshot`);\n log(\"Press Ctrl+C to stop\");\n });\n });\n}\n","/**\n * Mission kanban engine.\n * Parses docs/missions/MISSIONS.md into structured Mission objects.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport interface Mission {\n id: string;\n title: string;\n branch: string | null;\n status: \"active\" | \"planned\" | \"completed\";\n owner: string | null;\n}\n\n// ─── Status mapping ─────────────────────────────────────────────\n\nfunction parseStatus(raw: string): Mission[\"status\"] {\n const trimmed = raw.trim();\n if (trimmed.includes(\"active\")) return \"active\";\n if (trimmed.includes(\"completed\")) return \"completed\";\n return \"planned\";\n}\n\n// ─── Row parser ─────────────────────────────────────────────────\n\n/**\n * Parse a single markdown table row into a Mission, or return null if the\n * row is not a valid mission row (header, separator, empty, etc.).\n */\nfunction parseRow(line: string): Mission | null {\n // Must start and end with a pipe\n if (!line.startsWith(\"|\") || !line.endsWith(\"|\")) return null;\n\n // Split by pipe, discard first/last empty segments\n const cells = line\n .split(\"|\")\n .slice(1, -1)\n .map((c) => c.trim());\n\n if (cells.length < 4) return null;\n\n const [idCell, missionCell, branchCell, statusCell, ownerCell] = cells;\n\n // Skip separator rows (contain only dashes/spaces)\n if (/^[-: ]+$/.test(idCell ?? \"\")) return null;\n\n // Skip rows with no real ID (e.g. \"—\" or empty)\n const id = (idCell ?? \"\").replace(/[^\\w]/g, \"\");\n if (!id || !/^M\\d+$/i.test(id)) return null;\n\n // Extract title from markdown link [Title](./file.md) or plain text\n const titleMatch = missionCell?.match(/\\[([^\\]]+)\\]/);\n const title = titleMatch ? titleMatch[1] : (missionCell ?? \"\").trim();\n if (!title) return null;\n\n // Extract branch from backtick-wrapped value or \"—\"\n const branchMatch = branchCell?.match(/`([^`]+)`/);\n const branch = branchMatch ? branchMatch[1] : null;\n\n const status = parseStatus(statusCell ?? \"\");\n\n // Owner — strip leading/trailing whitespace, treat \"—\" or \"미배정\" as null\n const rawOwner = (ownerCell ?? \"\").trim();\n const owner =\n rawOwner === \"\" || rawOwner === \"—\" || rawOwner === \"미배정\"\n ? null\n : rawOwner;\n\n return { id: id.toUpperCase(), title, branch, status, owner };\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/**\n * Read and parse docs/missions/MISSIONS.md from the given repo root.\n * Returns an empty array if the file does not exist.\n */\nexport function parseMissionsFile(repoRoot: string): Mission[] {\n const missionsPath = path.join(repoRoot, \"docs\", \"missions\", \"MISSIONS.md\");\n\n let content: string;\n try {\n content = fs.readFileSync(missionsPath, \"utf-8\");\n } catch {\n return [];\n }\n\n const missions: Mission[] = [];\n\n for (const line of content.split(\"\\n\")) {\n const mission = parseRow(line);\n if (!mission) continue;\n missions.push(mission);\n }\n\n return missions;\n}\n","/**\n * Pull request board engine.\n * Uses `gh pr list` to fetch open and recently merged PRs.\n */\n\nimport { spawnSync } from \"node:child_process\";\n\n// ─── Types ─────────────────────────────────────────────────────\n\nexport interface PullRequest {\n number: number;\n title: string;\n state: \"open\" | \"merged\" | \"closed\";\n author: string;\n branch: string;\n url: string;\n mergedAt: string | null;\n}\n\nexport interface PrBoard {\n open: PullRequest[];\n merged: PullRequest[];\n}\n\n// ─── gh helpers ─────────────────────────────────────────────────\n\ninterface GhPrEntry {\n number: number;\n title: string;\n state: string;\n author: { login: string };\n headRefName: string;\n url: string;\n mergedAt: string | null;\n}\n\nfunction runGhPrList(\n repoRoot: string,\n extraArgs: string[],\n): GhPrEntry[] | null {\n try {\n const result = spawnSync(\n \"gh\",\n [\n \"pr\",\n \"list\",\n \"--json\",\n \"number,title,state,author,headRefName,url,mergedAt\",\n ...extraArgs,\n ],\n { cwd: repoRoot, encoding: \"utf-8\", timeout: 10_000 },\n );\n\n if (result.error || result.status !== 0) return null;\n\n const raw = result.stdout.trim();\n if (!raw) return null;\n\n return JSON.parse(raw) as GhPrEntry[];\n } catch {\n return null;\n }\n}\n\nfunction mapEntry(entry: GhPrEntry): PullRequest {\n const state = entry.state?.toLowerCase();\n return {\n number: entry.number,\n title: entry.title ?? \"\",\n state:\n state === \"merged\" ? \"merged\" : state === \"closed\" ? \"closed\" : \"open\",\n author: entry.author?.login ?? \"\",\n branch: entry.headRefName ?? \"\",\n url: entry.url ?? \"\",\n mergedAt: entry.mergedAt ?? null,\n };\n}\n\n// ─── Public API ─────────────────────────────────────────────────\n\n/**\n * Fetch open PRs from the repository.\n * Returns an empty array if `gh` is unavailable or the command fails.\n */\nexport function fetchOpenPrs(repoRoot: string): PullRequest[] {\n const entries = runGhPrList(repoRoot, [\"--limit\", \"50\"]);\n if (!entries) return [];\n return entries.map(mapEntry);\n}\n\n/**\n * Fetch recently merged PRs from the repository.\n * Returns an empty array if `gh` is unavailable or the command fails.\n */\nexport function fetchMergedPrs(\n repoRoot: string,\n limit: number = 20,\n): PullRequest[] {\n const entries = runGhPrList(repoRoot, [\n \"--state\",\n \"merged\",\n \"--limit\",\n String(limit),\n ]);\n if (!entries) return [];\n return entries\n .map(mapEntry)\n .sort((a, b) => {\n if (!a.mergedAt || !b.mergedAt) return 0;\n return new Date(b.mergedAt).getTime() - new Date(a.mergedAt).getTime();\n });\n}\n\n/**\n * Fetch both open and recently merged PRs.\n * Returns empty arrays if `gh` is unavailable.\n */\nexport function fetchPrs(repoRoot: string): PrBoard {\n return {\n open: fetchOpenPrs(repoRoot),\n merged: fetchMergedPrs(repoRoot),\n };\n}\n","import type { CommandResult } from \"./types.js\";\nimport { logSuccess, logWarn, logError, wasWarningLogged } from \"./utils.js\";\n\n/**\n * Emit a CommandResult to stdout.\n * --json mode: single JSON object.\n * Human mode: formatted log messages.\n */\nexport function emitResult(result: CommandResult, jsonMode: boolean): void {\n if (jsonMode) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Human mode\n if (result.ok) {\n logSuccess(result.message);\n } else {\n logError(result.message);\n }\n\n const emittedWarnings = new Set<string>();\n for (const w of result.warnings) {\n if (emittedWarnings.has(w) || wasWarningLogged(w)) {\n continue;\n }\n emittedWarnings.add(w);\n logWarn(w);\n }\n}\n\n/**\n * Determine exit code from CommandResult.\n * 0 = ok:true, 1 = ok:false\n */\nexport function exitCode(result: CommandResult): number {\n return result.ok ? 0 : 1;\n}\n\n/**\n * Check if --json flag is present in args.\n * Removes it from the array and returns the flag state.\n */\nexport function extractJsonFlag(args: string[]): {\n jsonMode: boolean;\n cleanArgs: string[];\n} {\n const jsonMode = args.includes(\"--json\");\n const cleanArgs = args.filter((a) => a !== \"--json\");\n return { jsonMode, cleanArgs };\n}\n","import { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { removeCommand } from \"./commands/remove.js\";\nimport { bridgeCommand } from \"./commands/bridge.js\";\nimport { upCommand } from \"./commands/up.js\";\nimport { downCommand } from \"./commands/down.js\";\nimport { serveCommand } from \"./commands/serve.js\";\nimport { initWorktreeCommand } from \"./commands/init-worktree.js\";\nimport { dashboardCommand } from \"./commands/dashboard.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { commsCommand } from \"./commands/comms.js\";\nimport { watchCommand } from \"./commands/watch.js\";\nimport { guiCommand } from \"./commands/gui.js\";\nimport { version } from \"./version.js\";\nimport { extractJsonFlag, emitResult, exitCode } from \"./output.js\";\nimport { resetLoggedWarnings, setJsonMode } from \"./utils.js\";\nimport { suggestCommand } from \"./cli-suggest.js\";\nimport type { CommandName, CommandResult } from \"./types.js\";\n\nconst HELP = `\n@hua-labs/tap — Cross-model AI agent communication setup\n\nUsage:\n tap <command> [options]\n\nCommands:\n init Initialize comms directory and state\n init-worktree Set up a new git worktree with tap\n add <runtime> Add a runtime instance (claude, codex, gemini)\n remove <instance> Remove an instance and rollback config\n status Show installed instances and bridge status\n bridge <sub> [inst] Manage bridges (start, stop, status)\n up Start all registered bridge daemons\n down Stop all running bridge daemons\n comms <pull|push> Sync comms directory with remote repo\n dashboard Show unified ops dashboard\n watch Monitor bridges and auto-restart stuck ones\n gui Start local web dashboard (http)\n doctor Diagnose tap infrastructure health\n serve Start tap MCP server (stdio)\n version Show version\n\nOptions:\n --help, -h Show help\n --json Machine-readable JSON output\n --comms-dir <path> Override comms directory path\n\nExamples:\n npx @hua-labs/tap init\n npx @hua-labs/tap init-worktree --path ../hua-wt-3 --branch feat/my-feature\n npx @hua-labs/tap add claude\n npx @hua-labs/tap add codex --name reviewer --port 4501\n npx @hua-labs/tap status\n`.trim();\n\nfunction normalizeCommandName(command: string | undefined): CommandName {\n switch (command) {\n case \"init\":\n case \"init-worktree\":\n case \"add\":\n case \"remove\":\n case \"status\":\n case \"bridge\":\n case \"up\":\n case \"down\":\n case \"comms\":\n case \"dashboard\":\n case \"doctor\":\n case \"serve\":\n case \"watch\":\n case \"gui\":\n return command;\n default:\n return \"unknown\";\n }\n}\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n const { jsonMode, cleanArgs } = extractJsonFlag(rawArgs);\n resetLoggedWarnings();\n setJsonMode(jsonMode);\n const command = cleanArgs[0];\n\n if (!command || command === \"--help\" || command === \"-h\") {\n if (jsonMode) {\n console.log(JSON.stringify({ help: HELP }));\n } else {\n console.log(HELP);\n }\n process.exit(0);\n }\n\n if (command === \"version\" || command === \"--version\" || command === \"-v\") {\n if (jsonMode) {\n console.log(JSON.stringify({ version }));\n } else {\n console.log(`@hua-labs/tap v${version}`);\n }\n process.exit(0);\n }\n\n const commandArgs = cleanArgs.slice(1);\n let result: CommandResult;\n\n try {\n switch (command) {\n case \"init\":\n result = await initCommand(commandArgs);\n break;\n case \"init-worktree\":\n result = await initWorktreeCommand(commandArgs);\n break;\n case \"add\":\n result = await addCommand(commandArgs);\n break;\n case \"remove\":\n result = await removeCommand(commandArgs);\n break;\n case \"status\":\n result = await statusCommand(commandArgs);\n break;\n case \"bridge\":\n result = await bridgeCommand(commandArgs);\n break;\n case \"up\":\n result = await upCommand(commandArgs);\n break;\n case \"down\":\n result = await downCommand(commandArgs);\n break;\n case \"comms\":\n result = await commsCommand(commandArgs);\n break;\n case \"dashboard\":\n result = await dashboardCommand(commandArgs);\n break;\n case \"doctor\":\n result = await doctorCommand(commandArgs);\n break;\n case \"watch\":\n result = await watchCommand(commandArgs);\n break;\n case \"gui\":\n result = await guiCommand(commandArgs);\n break;\n case \"serve\": {\n // serve takes over stdio for MCP protocol — don't emit result on stdout\n const serveResult = await serveCommand(commandArgs);\n if (!serveResult.ok || serveResult.code === \"TAP_NO_OP\") {\n // Emit on error OR help (help returns ok+TAP_NO_OP but needs output)\n emitResult(serveResult, jsonMode);\n }\n process.exit(exitCode(serveResult));\n break;\n }\n default: {\n const suggestion = suggestCommand(command);\n const hint = suggestion\n ? `\\n\\nDid you mean: tap ${suggestion}?`\n : \"\\n\\nRun tap --help for a list of commands.\";\n result = {\n ok: false,\n command: \"unknown\",\n code: \"TAP_INVALID_ARGUMENT\",\n message: `Unknown command: ${command}${hint}`,\n warnings: [],\n data: { requestedCommand: command, suggestion },\n };\n break;\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n result = {\n ok: false,\n command: normalizeCommandName(command),\n code: \"TAP_INTERNAL_ERROR\",\n message,\n warnings: [],\n data: command ? { requestedCommand: command } : {},\n };\n }\n\n emitResult(result, jsonMode);\n process.exit(exitCode(result));\n}\n\nmain();\n","/**\n * Command suggestion utilities for the tap CLI.\n * Extracted for testability.\n */\n\nexport const COMMANDS = [\n \"init\",\n \"init-worktree\",\n \"add\",\n \"remove\",\n \"status\",\n \"bridge\",\n \"up\",\n \"down\",\n \"comms\",\n \"dashboard\",\n \"doctor\",\n \"serve\",\n \"version\",\n] as const;\n\nexport function suggestCommand(input: string): string | null {\n let best: string | null = null;\n let bestDist = Infinity;\n for (const cmd of COMMANDS) {\n const d = levenshtein(input.toLowerCase(), cmd);\n if (d < bestDist && d <= Math.max(2, Math.floor(cmd.length / 2))) {\n bestDist = d;\n best = cmd;\n }\n }\n return best;\n}\n\nexport function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n Array.from<number>({ length: n + 1 }).fill(0),\n );\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n"],"mappings":"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","names":["fs","path","findRepoRoot","fs","path","fs","instancesDir","fs","path","fs","path","crypto","basename","fs","path","fs","path","tmp","fs","path","fs","os","path","spawnSync","fileURLToPath","version","fs","path","fileURLToPath","crypto","fs","path","findCodexConfigPath","canonicalizeTrustPath","fileURLToPath","fs","path","setNestedKey","path","fs","path","DEFAULT_APP_SERVER_URL","resolve","fs","path","fileURLToPath","fileURLToPath","fs","os","path","spawnSync","spawnSync","fs","spawnSync","spawnSync","execSync","spawnSync","spawnSync","execSync","fs","path","fs","fs","fs","path","net","resolve","resolve","fs","path","randomBytes","fs","path","execSync","version","major","randomBytes","fs","path","DEFAULT_APP_SERVER_URL","manualCommand","pid","healthy","healthyAt","fs","path","fs","path","resolve","resolveAgentName","computeFileHash","fs","setNestedKey","tmp","path","path","existsSync","readFileSync","renameSync","writeFileSync","path","existsSync","readFileSync","writeFileSync","renameSync","cleanupSuffix","path","fs","path","execSync","execSync","path","spawn","serveCommand","spawn","resolve","fs","path","execSync","version","formatAge","run","snapshot","existsSync","mkdirSync","readdirSync","readFileSync","renameSync","statSync","unlinkSync","writeFileSync","homedir","spawnSync","dirname","join","resolve","normalizeComparablePath","resolve","findCodexConfigPath","join","homedir","canonicalizeTrustPath","trustSelector","dirname","mkdirSync","writeFileSync","renameSync","buildCodexEnvEntries","existsSync","readFileSync","readdirSync","statSync","resolveHeartbeatInstanceId","spawnSync","unlinkSync","failures","execSync","spawnSync","fs","path","delay","resolve","fs","path","spawnSync","resolve"]}