overlord-cli 0.2607121101.0 → 0.2607122001.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/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/redact-secrets.ts", "../src/errors.ts", "../src/version.ts", "../src/args.ts", "../src/output.ts", "../src/update.ts", "../../node_modules/smol-toml/src/date.ts", "../../node_modules/smol-toml/src/error.ts", "../../node_modules/smol-toml/src/primitive.ts", "../../node_modules/smol-toml/src/util.ts", "../../node_modules/smol-toml/src/extract.ts", "../../node_modules/smol-toml/src/struct.ts", "../../node_modules/smol-toml/src/parse.ts", "../../node_modules/smol-toml/src/stringify.ts", "../../node_modules/smol-toml/src/index.ts", "../src/agent-catalog-defaults.ts", "../src/agent-catalog.ts", "../src/env.ts", "../src/config.ts", "../src/auth-credentials.ts", "../src/auth-login.ts", "../src/auth-status.ts", "../src/agent-binaries.ts", "../src/connector-core-render.ts", "../src/connectors.ts", "../../packages/core/service/device-identity.ts", "../src/device-identity.ts", "../src/backend-client.ts", "../src/runtime.ts", "../src/terminal-launch-chord.ts", "../src/terminal-profile-types.ts", "../src/terminal-profile.ts", "../src/setup.ts", "../src/user-token.ts", "../src/project-tmp.ts", "../src/sync-root.ts", "../src/execution-target-migration-doctor.ts", "../src/management.ts", "../src/serve.ts", "../../packages/core/service/util.ts", "../../packages/core/service/local-target/project-metadata.ts", "../../packages/core/repository/git-tree.ts", "../../packages/core/service/local-target/git-run.ts", "../../packages/core/service/local-target/worktree-git.ts", "../../packages/core/service/local-target/branch-actions-git.ts", "../../packages/core/service/local-target/branch-status-git.ts", "../../packages/core/service/local-target/commit-message-diff-git.ts", "../../packages/core/service/local-target/doctor-checks.ts", "../../packages/core/service/local-target/result.ts", "../../packages/core/service/local-target/in-process-provider.ts", "../../packages/core/service/local-target/registry.ts", "../../packages/core/service/change-feed.ts", "../../packages/core/service/errors.ts", "../../packages/core/service/context.ts", "../../packages/core/service/local-target-mutations.ts", "../../packages/core/service/local-target-mutation-runner.ts", "../../packages/core/service/project-resource-key.ts", "../src/branch-planning.ts", "../src/branch-preparation.ts", "../src/discover-project-local.ts", "../src/terminal-launcher.ts", "../src/launch.ts", "../src/native-session.ts", "../src/org-setup.ts", "../src/protocol-help.ts", "../src/vcs-sessions.ts", "../src/vcs.ts", "../src/record-touched.ts", "../src/resource-observations.ts", "../src/runner-service.ts", "../src/select-prompt.ts", "../src/session-key.ts", "../src/commands.ts", "../src/index.ts", "../src/help.ts"],
4
- "sourcesContent": ["/**\n * Shared secret-redaction helper for CLI diagnostics.\n *\n * `USER_TOKEN` secrets are `out_`-prefixed, high-entropy strings (see\n * `auth/docs/07-user-token-authentication.md`). The security audit (2026-06-18)\n * recommended a single redaction utility so token-like values never leak into\n * error output, verbose logs, or crash reports as new code paths are added.\n *\n * The first 12 characters (`out_` + the 8-char non-secret display prefix) are\n * preserved for correlation/debugging; everything after the prefix \u2014 the actual\n * secret material \u2014 is masked.\n */\n\nconst TOKEN_PATTERN = /out_[A-Za-z0-9_-]{8,}/g;\n\n/** Mask any `out_\u2026` USER_TOKEN secrets found in `value`, keeping the display prefix. */\nexport function redactSecrets(value: unknown): string {\n const text = typeof value === 'string' ? value : String(value);\n return text.replace(TOKEN_PATTERN, match => `${match.slice(0, 12)}\u2026[redacted]`);\n}\n", "import { redactSecrets } from './redact-secrets.js';\n\nexport class CliError extends Error {\n readonly exitCode: number;\n\n constructor({ message, exitCode = 1 }: { message: string; exitCode?: number }) {\n super(message);\n this.name = 'CliError';\n this.exitCode = exitCode;\n }\n}\n\nexport function formatCliError(error: unknown): string {\n if (error instanceof CliError) {\n return redactSecrets(error.message);\n }\n\n if (error instanceof Error) {\n return redactSecrets(error.message);\n }\n\n return redactSecrets(String(error));\n}\n", "import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction resolvePackageJsonPath(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n while (true) {\n const candidate = path.join(dir, 'package.json');\n if (existsSync(candidate)) {\n const packageJson = JSON.parse(readFileSync(candidate, 'utf8')) as { name?: string };\n if (packageJson.name === 'overlord-cli') {\n return candidate;\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) {\n break;\n }\n dir = parent;\n }\n\n throw new Error('Cannot locate overlord-cli package.json');\n}\n\nexport function getCliVersion(): string {\n const packageJson = JSON.parse(readFileSync(resolvePackageJsonPath(), 'utf8')) as {\n version: string;\n };\n return packageJson.version;\n}\n\nexport function runVersionCommand({ json = false }: { json?: boolean } = {}): void {\n const version = getCliVersion();\n\n if (json) {\n console.log(JSON.stringify({ version, node: process.version }));\n return;\n }\n\n console.log(`Overlord CLI ${version}`);\n}\n", "import { CliError } from './errors.js';\n\nexport type ParsedArgs = {\n positional: string[];\n flags: Map<string, string | true>;\n};\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const positional: string[] = [];\n const flags = new Map<string, string | true>();\n\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token) continue;\n\n if (token === '--') {\n positional.push(...argv.slice(index + 1));\n break;\n }\n\n if (token.startsWith('--')) {\n const eqIndex = token.indexOf('=');\n if (eqIndex >= 0) {\n flags.set(token.slice(0, eqIndex), token.slice(eqIndex + 1));\n continue;\n }\n\n const next = argv[index + 1];\n if (next !== undefined && (!next.startsWith('-') || next === '-')) {\n flags.set(token, next);\n index += 1;\n } else {\n flags.set(token, true);\n }\n continue;\n }\n\n positional.push(token);\n }\n\n return { positional, flags };\n}\n\nexport function flagValue(flags: Map<string, string | true>, name: string): string | undefined {\n const value = flags.get(name);\n if (value === true || value === undefined) return undefined;\n return value;\n}\n\nexport function flagBoolean(flags: Map<string, string | true>, name: string): boolean {\n return flags.has(name);\n}\n\nexport function requireFlag(flags: Map<string, string | true>, name: string): string {\n const value = flagValue(flags, name);\n if (!value) {\n throw new Error(`Missing required flag: ${name}`);\n }\n return value;\n}\n\nexport async function readFlagOrFile({\n flags,\n flagName,\n fileFlagName,\n stdin\n}: {\n flags: Map<string, string | true>;\n flagName: string;\n fileFlagName: string;\n stdin?: string;\n}): Promise<string | undefined> {\n const direct = flagValue(flags, flagName);\n if (direct) return direct;\n\n const filePath = flagValue(flags, fileFlagName);\n if (filePath === '-') {\n if (stdin !== undefined) {\n return stdin;\n }\n const { readFileSync } = await import('node:fs');\n return readFileSync(0, 'utf8');\n }\n if (filePath) {\n const { readFileSync } = await import('node:fs');\n return readFileSync(filePath, 'utf8');\n }\n\n return undefined;\n}\n\nexport function parseJsonFlag(\n flags: Map<string, string | true>,\n flagName: string\n): Record<string, unknown> | undefined {\n const raw = flagValue(flags, flagName);\n if (!raw) return undefined;\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\n/** Inline `--*-json` values larger than this are rejected; use the paired `--*-file -` flag. */\nexport const MAX_INLINE_JSON_CHARS = 8_192;\n\nconst INLINE_JSON_FLAG_PAIRS = [\n { jsonFlag: '--change-rationales-json', fileFlag: '--change-rationales-file' },\n { jsonFlag: '--payload-json', fileFlag: '--payload-file' },\n { jsonFlag: '--artifacts-json', fileFlag: '--artifacts-file' },\n { jsonFlag: '--objectives-json', fileFlag: '--objectives-file' },\n { jsonFlag: '--changed-files-json', fileFlag: '--changed-files-file' },\n { jsonFlag: '--value-json', fileFlag: '--value-file' }\n] as const;\n\nexport function rejectOversizedInlineJson({ flags }: { flags: Map<string, string | true> }): void {\n for (const { jsonFlag, fileFlag } of INLINE_JSON_FLAG_PAIRS) {\n const value = flagValue(flags, jsonFlag);\n if (value === undefined || value.length <= MAX_INLINE_JSON_CHARS) continue;\n\n throw new CliError({\n message:\n `${jsonFlag} is too large (${value.length} chars; limit ${MAX_INLINE_JSON_CHARS}). ` +\n `Pass the JSON via ${fileFlag} - and stream it on stdin instead. ` +\n 'Keep short values like --summary inline.'\n });\n }\n}\n\nexport function parseCsvFlag(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n return value\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n}\n", "const BLUE = '\\x1b[34m';\nconst RESET = '\\x1b[0m';\n\nexport function printJson(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport function printLine(line: string): void {\n process.stdout.write(`${line}\\n`);\n}\n\nexport function printStepTitle(title: string): void {\n if (process.stdout.isTTY) {\n printLine(`${BLUE}${title}${RESET}`);\n } else {\n printLine(title);\n }\n}\n\nexport function printLines(lines: string[]): void {\n for (const line of lines) {\n printLine(line);\n }\n}\n\nexport function printKeyValue(stderrPairs: Record<string, string>): void {\n for (const [key, value] of Object.entries(stderrPairs)) {\n process.stderr.write(`${key}=${value}\\n`);\n }\n}\n", "import { spawn } from 'node:child_process';\n\nimport { flagBoolean, parseArgs } from './args.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\nimport { getCliVersion } from './version.js';\n\nconst PACKAGE_NAME = 'overlord-cli';\n\nexport const DEFAULT_UPDATE_INSTALL_ARGS = [\n 'install',\n '-g',\n '--no-fund',\n `${PACKAGE_NAME}@latest`\n] as const;\n\ntype SpawnResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\ntype UpdateStatus = {\n packageName: string;\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n installed: boolean;\n packageManager: string;\n};\n\nfunction resolvePackageManager(): string {\n if (process.env.OVLD_UPDATE_BIN) return process.env.OVLD_UPDATE_BIN;\n return process.platform === 'win32' ? 'npm.cmd' : 'npm';\n}\n\nfunction resolveSpawnEnv(): NodeJS.ProcessEnv {\n return {\n ...process.env,\n NPM_CONFIG_FUND: 'false'\n };\n}\n\nfunction resolveCommandArgs({\n envName,\n fallback\n}: {\n envName: string;\n fallback: string[];\n}): string[] {\n const raw = process.env[envName];\n if (!raw) return fallback;\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed) || !parsed.every(value => typeof value === 'string')) {\n throw new CliError({\n message: `${envName} must be a JSON array of strings.`\n });\n }\n return parsed;\n}\n\nfunction normalizeVersion(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) {\n throw new CliError({ message: 'Received an empty version from npm.' });\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (typeof parsed === 'string' && parsed.trim()) return parsed.trim();\n } catch {\n // Fall back to raw output below.\n }\n\n return trimmed.replace(/^\"+|\"+$/g, '');\n}\n\nfunction compareVersions(left: string, right: string): number {\n const leftParts = left.split('.').map(part => Number.parseInt(part, 10));\n const rightParts = right.split('.').map(part => Number.parseInt(part, 10));\n const length = Math.max(leftParts.length, rightParts.length);\n\n for (let index = 0; index < length; index += 1) {\n const leftPart = Number.isFinite(leftParts[index]) ? leftParts[index]! : 0;\n const rightPart = Number.isFinite(rightParts[index]) ? rightParts[index]! : 0;\n if (leftPart !== rightPart) return leftPart - rightPart;\n }\n\n return 0;\n}\n\nasync function runCapturedCommand({\n command,\n args\n}: {\n command: string;\n args: string[];\n}): Promise<SpawnResult> {\n return await new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n env: resolveSpawnEnv(),\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', chunk => {\n stdout += String(chunk);\n });\n child.stderr.on('data', chunk => {\n stderr += String(chunk);\n });\n child.on('error', reject);\n child.on('close', exitCode => {\n resolve({ exitCode: exitCode ?? 1, stdout, stderr });\n });\n });\n}\n\nasync function runStreamingCommand({\n command,\n args\n}: {\n command: string;\n args: string[];\n}): Promise<number> {\n return await new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n env: resolveSpawnEnv(),\n stdio: 'inherit'\n });\n\n child.on('error', reject);\n child.on('close', exitCode => {\n resolve(exitCode ?? 1);\n });\n });\n}\n\nasync function readLatestVersion(packageManager: string): Promise<string> {\n const args = resolveCommandArgs({\n envName: 'OVLD_UPDATE_VIEW_ARGS_JSON',\n fallback: ['view', PACKAGE_NAME, 'version', '--json']\n });\n const result = await runCapturedCommand({ command: packageManager, args });\n if (result.exitCode !== 0) {\n const detail = result.stderr.trim() || result.stdout.trim() || `exit ${result.exitCode}`;\n throw new CliError({\n message: `Unable to check the latest ${PACKAGE_NAME} version via ${packageManager}: ${detail}`\n });\n }\n return normalizeVersion(result.stdout);\n}\n\nfunction printStatus(status: UpdateStatus, json: boolean): void {\n if (json) {\n printJson(status);\n return;\n }\n\n if (!status.updateAvailable) {\n console.log(`Overlord CLI ${status.currentVersion} is already up to date.`);\n return;\n }\n\n if (!status.installed) {\n console.log(`Overlord CLI ${status.currentVersion} can be updated to ${status.latestVersion}.`);\n return;\n }\n\n console.log(`Updated Overlord CLI from ${status.currentVersion} to ${status.latestVersion}.`);\n}\n\nexport async function runUpdateCommand({ rest }: { rest: string[] }): Promise<void> {\n const parsed = parseArgs(rest);\n const json = flagBoolean(parsed.flags, '--json');\n const check = flagBoolean(parsed.flags, '--check');\n const force = flagBoolean(parsed.flags, '--force');\n\n const currentVersion = getCliVersion();\n const packageManager = resolvePackageManager();\n const latestVersion = await readLatestVersion(packageManager);\n const updateAvailable = compareVersions(currentVersion, latestVersion) < 0;\n\n if (check || (!updateAvailable && !force)) {\n printStatus(\n {\n packageName: PACKAGE_NAME,\n currentVersion,\n latestVersion,\n updateAvailable,\n installed: false,\n packageManager\n },\n json\n );\n return;\n }\n\n const installArgs = resolveCommandArgs({\n envName: 'OVLD_UPDATE_INSTALL_ARGS_JSON',\n fallback: [...DEFAULT_UPDATE_INSTALL_ARGS]\n });\n\n if (!json) {\n console.log(`Updating Overlord CLI via ${packageManager}...`);\n }\n\n const exitCode = await runStreamingCommand({ command: packageManager, args: installArgs }).catch(\n error => {\n throw new CliError({\n message:\n error instanceof Error\n ? `Failed to start ${packageManager}: ${error.message}`\n : `Failed to start ${packageManager}: ${String(error)}`\n });\n }\n );\n\n if (exitCode !== 0) {\n throw new CliError({\n message: `${packageManager} exited with status ${exitCode} while updating ${PACKAGE_NAME}.`\n });\n }\n\n printStatus(\n {\n packageName: PACKAGE_NAME,\n currentVersion,\n latestVersion,\n updateAvailable: true,\n installed: true,\n packageManager\n },\n json\n );\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n// Hopefully this class will disappear once Temporal lands in JS\n// But for now we have to reinvent the wheel once more!\n\ntype Offset = string | null\n\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i\n\nexport class TomlDate extends Date {\n\t#hasDate = false\n\t#hasTime = false\n\t#offset: Offset = null\n\n\tconstructor(date: string | Date) {\n\t\tlet hasDate = true\n\t\tlet hasTime = true\n\t\tlet offset: Offset = 'Z'\n\n\t\tif (typeof date === 'string') {\n\t\t\tlet match = date.match(DATE_TIME_RE)\n\t\t\tif (match) {\n\t\t\t\tif (!match[1]) {\n\t\t\t\t\thasDate = false\n\t\t\t\t\tdate = `0000-01-01T${date}`\n\t\t\t\t}\n\n\t\t\t\thasTime = !!match[2]\n\t\t\t\t// Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n\t\t\t\thasTime && date[10] === ' ' && (date = date.replace(' ', 'T'))\n\t\t\t\t// Do not allow rollover hours.\n\t\t\t\tif (match[2] && +match[2] > 23) {\n\t\t\t\t\tdate = ''\n\t\t\t\t} else {\n\t\t\t\t\toffset = match[3] || null\n\t\t\t\t\tdate = date.toUpperCase()\n\t\t\t\t\tif (!offset && hasTime) date += 'Z'\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdate = ''\n\t\t\t}\n\t\t}\n\n\t\tsuper(date)\n\t\tif (!isNaN(this.getTime())) {\n\t\t\tthis.#hasDate = hasDate\n\t\t\tthis.#hasTime = hasTime\n\t\t\tthis.#offset = offset\n\t\t}\n\t}\n\n\tisDateTime() {\n\t\treturn this.#hasDate && this.#hasTime\n\t}\n\n\tisLocal() {\n\t\treturn !this.#hasDate || !this.#hasTime || !this.#offset\n\t}\n\n\tisDate() {\n\t\treturn this.#hasDate && !this.#hasTime\n\t}\n\n\tisTime() {\n\t\treturn this.#hasTime && !this.#hasDate\n\t}\n\n\tisValid() {\n\t\treturn this.#hasDate || this.#hasTime\n\t}\n\n\toverride toISOString() {\n\t\tlet iso = super.toISOString()\n\n\t\t// Local Date\n\t\tif (this.isDate())\n\t\t\treturn iso.slice(0, 10)\n\n\t\t// Local Time\n\t\tif (this.isTime())\n\t\t\treturn iso.slice(11, 23)\n\n\t\t// Local DateTime\n\t\tif (this.#offset === null)\n\t\t\treturn iso.slice(0, -1)\n\n\t\t// Offset DateTime\n\t\tif (this.#offset === 'Z')\n\t\t\treturn iso\n\n\t\t// This part is quite annoying: JS strips the original timezone from the ISO string representation\n\t\t// Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n\n\t\tlet offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6))\n\t\toffset = this.#offset[0] === '-' ? offset : -offset\n\n\t\tlet offsetDate = new Date(this.getTime() - (offset * 60e3))\n\t\treturn offsetDate.toISOString().slice(0, -1) + this.#offset\n\t}\n\n\tstatic wrapAsOffsetDateTime(jsDate: Date, offset = 'Z') {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#offset = offset\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalDateTime(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalDate(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#hasTime = false\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalTime(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#hasDate = false\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\ntype TomlErrorOptions = ErrorOptions & {\n\ttoml: string\n\tptr: number\n}\n\nfunction getLineColFromPtr(string: string, ptr: number): [number, number] {\n\tlet lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g)\n\treturn [lines.length, lines.pop()!.length + 1]\n}\n\nfunction makeCodeBlock(string: string, line: number, column: number) {\n\tlet lines = string.split(/\\r\\n|\\n|\\r/g)\n\tlet codeblock = ''\n\n\tlet numberLen = (Math.log10(line + 1) | 0) + 1\n\n\tfor (let i = line - 1; i <= line + 1; i++) {\n\t\tlet l = lines[i - 1]\n\t\tif (!l) continue\n\n\t\tcodeblock += i.toString().padEnd(numberLen, ' ')\n\t\tcodeblock += ': '\n\t\tcodeblock += l\n\t\tcodeblock += '\\n'\n\n\t\tif (i === line) {\n\t\t\tcodeblock += ' '.repeat(numberLen + column + 2)\n\t\t\tcodeblock += '^\\n'\n\t\t}\n\t}\n\n\treturn codeblock\n}\n\nexport class TomlError extends Error {\n\tline: number\n\tcolumn: number\n\tcodeblock: string\n\n\tconstructor(message: string, options: TomlErrorOptions) {\n\t\tconst [line, column] = getLineColFromPtr(options.toml, options.ptr)\n\t\tconst codeblock = makeCodeBlock(options.toml, line, column)\n\n\t\tsuper(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options)\n\t\tthis.line = line\n\t\tthis.column = column\n\t\tthis.codeblock = codeblock\n\t}\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { TomlDate } from './date.js'\nimport { TomlError } from './error.js'\n\n// let CTRL_REGEX = /[\\x00-\\x08\\x0f-\\x1f\\x7f]/\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/\nlet LEADING_ZERO = /^[+-]?0[0-9_]/\n\nexport function parseString(str: string, ptr: number): [string, number] {\n\tlet c = str[ptr++]!\n\tlet first = c\n\tlet isLiteral = c === \"'\"\n\tlet isMultiline = c === str[ptr] && c === str[ptr + 1]\n\tif (isMultiline) {\n\t\t// Trim initial newline\n\t\tif (str[ptr += 2] === '\\n') ptr++\n\t\telse if (str[ptr] === '\\r' && str[ptr + 1] === '\\n') ptr += 2\n\t}\n\n\t/*\n\tThe fast path does not seem to bring significant performance gains, so it's commented out.\n\tKept for reference and/or future fafoing.\n\n\tWithout: spec 5.08 \u00B5s/iter 3.88 ipc (99.44% cache) 23.90 branch misses 28.61k cycles 111.01k instructions\n\t 5MB 115.73 ms/iter 2.51 ipc (98.36% cache) 3.12M branch misses 619.30M cycles 1.56G instructions\n\n\tWith: spec 5.09 \u00B5s/iter 3.90 ipc (99.46% cache) 24.42 branch misses 28.57k cycles 111.49k instructions\n\t 5MB 113.89 ms/iter 2.47 ipc (98.38% cache) 3.12M branch misses 611.94M cycles 1.51G instructions\n\n\tif (c === \"'\") {\n\t\t// Literal strings fast path - no transform needs to occur; just grab the str and that's it\n\t\tlet endPtr = str.indexOf(isMultiline ? \"'''\" : \"'\", ptr)\n\t\tif (endPtr < 0) {\n\t\t\tthrow new TomlError(\"unfinished string literal\", { toml: str, ptr })\n\t\t}\n\n\t\tif (isMultiline) {\n\t\t\t// If the string ends with 4-5 quotes, then the first 1-2 are part of the string\n\t\t\tif (str[endPtr + 3] === \"'\") endPtr++\n\t\t\tif (str[endPtr + 3] === \"'\") endPtr++\n\t\t}\n\n\t\tlet string = str.slice(ptr, endPtr)\n\t\tif (CTRL_REGEX.test(string)) {\n\t\t\tlet match = string.match(CTRL_REGEX)!\n\t\t\tthrow new TomlError('control characters are not allowed in strings', { toml: str, ptr: ptr + (match.index ?? 0) })\n\t\t}\n\t\treturn [string, endPtr + (isMultiline ? 3 : 1)]\n\t}\n\t*/\n\n\tlet parsed = ''\n\tlet sliceStart = ptr\n\n\t// states:\n\t// 0 - decoding\n\t// 1 - decoding escape\n\t// 2 - whitespace escape (no newline encountered yet, must fail on non-whitespace)\n\t// 3 - whitespace escape (newline encountered, allowed to transition back to normal decode)\n\tlet state = 0\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tc = str[i]!\n\n\t\t// Deal with newlines first, since that simplifies control character checking and handling across all states\n\t\tif (isMultiline && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n'))) {\n\t\t\tstate = state && 3\n\t\t}\n\n\t\t// Control characters are banned in TOML, so we throw an error if we encounter them\n\t\telse if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n\t\t\tthrow new TomlError('control characters are not allowed in strings', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: i,\n\t\t\t})\n\t\t}\n\n\t\t// The string might terminate while we're parsing through a newline escape.\n\t\t// It must have encountered a newline; otherwise, it'll simply fail in another branch.\n\t\telse if ((!state || state === 3) && c === first && (!isMultiline || (str[i + 1] === first && str[i + 2] === first))) {\n\t\t\tif (isMultiline) {\n\t\t\t\t// If the string ends with 4-5 quotes, then the first 1-2 are part of the string\n\t\t\t\tif (str[i + 3] === first) i++\n\t\t\t\tif (str[i + 3] === first) i++\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\t// If we're in a newline escape still, then there's nothing to add.\n\t\t\t\t// Also try to avoid concat if there's nothing to add to parsed, or nothing has been added to parsed.\n\t\t\t\tstate ? parsed : parsed + str.slice(sliceStart, i),\n\t\t\t\ti + (isMultiline ? 3 : 1),\n\t\t\t]\n\t\t}\n\n\t\telse if (!state) {\n\t\t\tif (!isLiteral && c === '\\\\') {\n\t\t\t\tparsed += str.slice(sliceStart, (sliceStart = i))\n\t\t\t\tstate = 1\n\t\t\t}\n\t\t}\n\n\t\telse if (state === 1) {\n\t\t\tif (c === 'x' || c === 'u' || c === 'U') { // Unicode escape\n\t\t\t\tlet value = 0\n\t\t\t\tlet len = c === 'x' ? 2 : c === 'u' ? 4 : 8\n\t\t\t\tfor (let j = 0; j < len; j++, i++) {\n\t\t\t\t\tlet hex = str.charCodeAt(i + 1)\n\t\t\t\t\tlet digit =\n\t\t\t\t\t\t/* 0-9 */ hex >= 0x30 && hex <= 0x39 ? hex - 0x30 :\n\t\t\t\t\t\t/* A-F */ hex >= 0x41 && hex <= 0x46 ? hex - 0x41 + 10 :\n\t\t\t\t\t\t/* a-f */ hex >= 0x61 && hex <= 0x66 ? hex - 0x61 + 10 : -1\n\n\t\t\t\t\tif (digit < 0) throw new TomlError('invalid non-hex character in unicode escape', { toml: str, ptr: i + 1 })\n\t\t\t\t\tvalue = (value << 4) | digit\n\t\t\t\t}\n\n\t\t\t\t// Because JS does bitwise on signed 32bit integers, all 0xfzzzzzzz values are actually seen as negative\n\t\t\t\tif (value < 0 || value > 0x10ffff || (value >= 0xd800 && value <= 0xdfff)) {\n\t\t\t\t\tthrow new TomlError('invalid unicode escape', { toml: str, ptr: i })\n\t\t\t\t}\n\n\t\t\t\tparsed += String.fromCodePoint(value)\n\t\t\t\tsliceStart = i + 1\n\t\t\t\tstate = 0\n\t\t\t}\n\n\t\t\telse if (c === ' ' || c === '\\t') { // If it was a newline, it'd have been handled earlier\n\t\t\t\tstate = 2\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tif (c === 'b') parsed += '\\b'\n\t\t\t\telse if (c === 't') parsed += '\\t'\n\t\t\t\telse if (c === 'n') parsed += '\\n'\n\t\t\t\telse if (c === 'f') parsed += '\\f'\n\t\t\t\telse if (c === 'r') parsed += '\\r'\n\t\t\t\telse if (c === 'e') parsed += '\\x1b'\n\t\t\t\telse if (c === '\"') parsed += '\"'\n\t\t\t\telse if (c === '\\\\') parsed += '\\\\'\n\t\t\t\telse throw new TomlError('unrecognized escape sequence', { toml: str, ptr: i })\n\t\t\t\tsliceStart = i + 1\n\t\t\t\tstate = 0\n\t\t\t}\n\t\t}\n\n\t\telse if (c !== ' ' && c !== '\\t') {\n\t\t\tif (state === 2) {\n\t\t\t\tthrow new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: sliceStart,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// State cannot be zero, or we'd have branched earlier already.\n\t\t\t// If it's a backslash, immediately transition to the escape state so it can be processed.\n\t\t\tstate = !isLiteral && c === '\\\\' ? 1 : 0\n\t\t\tsliceStart = i\n\t\t}\n\t}\n\n\tthrow new TomlError('unfinished string', { toml: str, ptr })\n}\n\nexport type IntegersAsBigInt = undefined | boolean | 'asNeeded'\n\nexport function parseValue(value: string, toml: string, ptr: number, integersAsBigInt: IntegersAsBigInt): boolean | number | bigint | TomlDate {\n\t// Constant values\n\tif (value === 'true') return true\n\tif (value === 'false') return false\n\tif (value === '-inf') return -Infinity\n\tif (value === 'inf' || value === '+inf') return Infinity\n\tif (value === 'nan' || value === '+nan' || value === '-nan') return NaN\n\n\t// Avoid FP representation of -0\n\tif (value === '-0') return integersAsBigInt ? 0n : 0\n\n\t// Numbers\n\tlet isInt = INT_REGEX.test(value)\n\tif (isInt || FLOAT_REGEX.test(value)) {\n\t\tif (LEADING_ZERO.test(value)) {\n\t\t\tthrow new TomlError('leading zeroes are not allowed', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\n\t\tvalue = value.replace(/_/g, '')\n\t\tlet numeric: number | bigint = +value\n\n\t\tif (isNaN(numeric)) {\n\t\t\tthrow new TomlError('invalid number', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\n\t\tif (isInt) {\n\t\t\tif ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n\t\t\t\tthrow new TomlError('integer value cannot be represented losslessly', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (isInt || integersAsBigInt === true) numeric = BigInt(value)\n\t\t}\n\n\t\treturn numeric\n\t}\n\n\tconst date = new TomlDate(value)\n\tif (!date.isValid()) {\n\t\tthrow new TomlError('invalid value', {\n\t\t\ttoml: toml,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn date\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport type { TomlDate } from './date.js'\nimport { TomlError } from './error.js'\n\nexport type TomlPrimitive = string | number | bigint | boolean | TomlDate\nexport type TomlTable = { [key: string]: TomlValue }\nexport type TomlValue = TomlPrimitive | TomlValue[] | TomlTable\n\nexport type TomlTableWithoutBigInt = { [key: string]: TomlValueWithoutBigInt }\nexport type TomlValueWithoutBigInt = Exclude<TomlPrimitive, bigint> | TomlValueWithoutBigInt[] | TomlTableWithoutBigInt\n\nexport function indexOfNewline(str: string, start = 0, end = str.length) {\n\tlet idx = str.indexOf('\\n', start)\n\tif (str[idx - 1] === '\\r') idx--\n\treturn idx <= end ? idx : -1\n}\n\nexport function skipComment(str: string, ptr: number) {\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tlet c = str[i]!\n\t\tif (c === '\\n')\n\t\t\treturn i\n\n\t\tif (c === '\\r' && str[i + 1] === '\\n')\n\t\t\treturn i + 1\n\n\t\tif ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n\t\t\tthrow new TomlError('control characters are not allowed in comments', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn str.length\n}\n\nexport function skipVoid(str: string, ptr: number, banNewLines?: boolean, banComments?: boolean): number {\n\tlet c\n\twhile (1) {\n\t\twhile ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || (c === '\\r' && str[ptr + 1] === '\\n')))) ptr++\n\n\t\t// Tucking the return statement here would save 5 characters >:)\n\t\t// But TypeScript fails to detect there is no way to exit the loop so it complains about the lack of final return\n\t\tif (banComments || c !== '#') break\n\n\t\tptr = skipComment(str, ptr)\n\t}\n\n\treturn ptr\n}\n\nexport function skipUntil(str: string, ptr: number, sep: string, end?: string, banNewLines: boolean = false) {\n\tif (!end) {\n\t\tptr = indexOfNewline(str, ptr)\n\t\treturn ptr < 0 ? str.length : ptr\n\t}\n\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tlet c = str[i]\n\t\tif (c === '#') {\n\t\t\ti = indexOfNewline(str, i)\n\t\t} else if (c === sep) {\n\t\t\treturn i + 1\n\t\t} else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tthrow new TomlError('cannot find end of structure', {\n\t\ttoml: str,\n\t\tptr: ptr,\n\t})\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { type IntegersAsBigInt, parseString, parseValue } from './primitive.js'\nimport { parseArray, parseInlineTable } from './struct.js'\nimport { skipVoid, skipUntil, skipComment, type TomlValue } from './util.js'\nimport { TomlError } from './error.js'\n\nfunction sliceAndTrimEndOf(str: string, startPtr: number, endPtr: number): [string, number] {\n\tlet value = str.slice(startPtr, endPtr)\n\n\tlet commentIdx = value.indexOf('#')\n\tif (commentIdx > -1) {\n\t\t// The call to skipComment allows to \"validate\" the comment\n\t\t// (absence of control characters)\n\t\tskipComment(str, commentIdx)\n\t\tvalue = value.slice(0, commentIdx)\n\t}\n\n\treturn [value.trimEnd(), commentIdx]\n}\n\nexport function extractValue(str: string, ptr: number, end: string | undefined, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlValue, number] {\n\tif (depth === 0) {\n\t\tthrow new TomlError('document contains excessively nested structures. aborting.', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tlet c = str[ptr]\n\tif (c === '[' || c === '{') {\n\t\tlet [value, endPtr] = c === '['\n\t\t\t? parseArray(str, ptr, depth, integersAsBigInt)\n\t\t\t: parseInlineTable(str, ptr, depth, integersAsBigInt)\n\n\t\tif (end) {\n\t\t\tendPtr = skipVoid(str, endPtr)\n\t\t\tif (str[endPtr] === ',') endPtr++\n\t\t\telse if (str[endPtr] !== end) {\n\t\t\t\tthrow new TomlError('expected comma or end of structure', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: endPtr,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn [value, endPtr]\n\t}\n\n\tif (c === '\"' || c === \"'\") {\n\t\tlet [parsed, endPtr] = parseString(str, ptr)\n\t\tif (end) {\n\t\t\tendPtr = skipVoid(str, endPtr)\n\n\t\t\tif (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n\t\t\t\tthrow new TomlError('unexpected character encountered', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: endPtr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (str[endPtr] === ',') endPtr++\n\t\t}\n\n\t\treturn [parsed, endPtr]\n\t}\n\n\tlet endPtr = skipUntil(str, ptr, ',', end)\n\tlet slice = sliceAndTrimEndOf(str, ptr, endPtr - (str[endPtr - 1] === ',' ? 1 : 0))\n\tif (!slice[0]) {\n\t\tthrow new TomlError('incomplete key-value declaration: no value specified', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tif (end && slice[1] > -1) {\n\t\tendPtr = skipVoid(str, ptr + slice[1])\n\t\tif (str[endPtr] === ',') endPtr++\n\t}\n\n\treturn [\n\t\tparseValue(slice[0], str, ptr, integersAsBigInt),\n\t\tendPtr,\n\t]\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { type IntegersAsBigInt, parseString } from './primitive.js'\nimport { extractValue } from './extract.js'\nimport { indexOfNewline, skipComment, skipVoid, type TomlTable, type TomlValue } from './util.js'\nimport { TomlError } from './error.js'\n\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/\n\nexport function parseKey(str: string, ptr: number, end = '='): [string[], number] {\n\tlet dot = ptr - 1\n\tlet parsed = []\n\n\tlet endPtr = str.indexOf(end, ptr)\n\tif (endPtr < 0) {\n\t\tthrow new TomlError('incomplete key-value: cannot find end of key', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tdo {\n\t\tlet c = str[(ptr = ++dot)]\n\n\t\t// If it's whitespace, ignore\n\t\tif (c !== ' ' && c !== '\\t') {\n\t\t\t// If it's a string\n\t\t\tif (c === '\"' || c === \"'\") {\n\t\t\t\tif (c === str[ptr + 1] && c === str[ptr + 2]) {\n\t\t\t\t\tthrow new TomlError('multiline strings are not allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tlet [part, eos] = parseString(str, ptr)\n\t\t\t\tdot = str.indexOf('.', eos)\n\n\t\t\t\tlet strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot)\n\t\t\t\tlet newLine = indexOfNewline(strEnd)\n\t\t\t\tif (newLine > -1) {\n\t\t\t\t\tthrow new TomlError('newlines are not allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr + dot + newLine,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (strEnd.trimStart()) {\n\t\t\t\t\tthrow new TomlError('found extra tokens after the string part', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: eos,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (endPtr < eos) {\n\t\t\t\t\tendPtr = str.indexOf(end, eos)\n\t\t\t\t\tif (endPtr < 0) {\n\t\t\t\t\t\tthrow new TomlError('incomplete key-value: cannot find end of key', {\n\t\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparsed.push(part)\n\t\t\t} else {\n\t\t\t\t// Normal raw key part consumption and validation\n\t\t\t\tdot = str.indexOf('.', ptr)\n\t\t\t\tlet part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot)\n\t\t\t\tif (!KEY_PART_RE.test(part)) {\n\t\t\t\t\tthrow new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tparsed.push(part.trimEnd())\n\t\t\t}\n\t\t}\n\t\t// Until there's no more dot\n\t} while (dot + 1 && dot < endPtr)\n\n\treturn [parsed, skipVoid(str, endPtr + 1, true, true)]\n}\n\nexport function parseInlineTable(str: string, ptr: number, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlTable, number] {\n\tlet res: TomlTable = {}\n\tlet seen = new Set()\n\tlet c: string\n\n\tptr++\n\twhile ((c = str[ptr++]!) !== '}' && c) {\n\t\tif (c === ',') {\n\t\t\tthrow new TomlError('expected value, found comma', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr - 1,\n\t\t\t})\n\t\t} else if (c === '#') ptr = skipComment(str, ptr)\n\t\telse if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n\t\t\tlet k: string\n\t\t\tlet t: any = res\n\t\t\tlet hasOwn = false\n\n\t\t\tlet [key, keyEndPtr] = parseKey(str, ptr - 1)\n\t\t\tfor (let i = 0; i < key.length; i++) {\n\t\t\t\tif (i) t = hasOwn! ? t[k!] : (t[k!] = {})\n\n\t\t\t\tk = key[i]!\n\t\t\t\tif ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n\t\t\t\t\tthrow new TomlError('trying to redefine an already defined value', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (!hasOwn && k === '__proto__') {\n\t\t\t\t\tObject.defineProperty(t, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hasOwn) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined value', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt)\n\t\t\tseen.add(value)\n\n\t\t\tt[k!] = value\n\t\t\tptr = valueEndPtr\n\t\t}\n\t}\n\n\tif (!c) {\n\t\tthrow new TomlError('unfinished table encountered', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn [res, ptr]\n}\n\nexport function parseArray(str: string, ptr: number, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlValue[], number] {\n\tlet res: TomlValue[] = []\n\tlet c\n\n\tptr++\n\twhile ((c = str[ptr++]) !== ']' && c) {\n\t\tif (c === ',') {\n\t\t\tthrow new TomlError('expected value, found comma', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr - 1,\n\t\t\t})\n\t\t} else if (c === '#') ptr = skipComment(str, ptr)\n\t\telse if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n\t\t\tlet e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt)\n\t\t\tres.push(e[0])\n\t\t\tptr = e[1]\n\t\t}\n\t}\n\n\tif (!c) {\n\t\tthrow new TomlError('unfinished array encountered', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn [res, ptr]\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport type { IntegersAsBigInt } from './primitive.js'\nimport { parseKey } from './struct.js'\nimport { extractValue } from './extract.js'\nimport { skipVoid, type TomlTable, type TomlTableWithoutBigInt } from './util.js'\nimport { TomlError } from './error.js'\n\nconst enum Type { DOTTED, EXPLICIT, ARRAY, ARRAY_DOTTED }\n\ntype MetaState = { t: Type; d: boolean; i: number; c: MetaRecord }\ntype MetaRecord = { [k: string]: MetaState }\ntype PeekResult = [string, TomlTable, MetaRecord] | null\n\nfunction peekTable(key: string[], table: TomlTable, meta: MetaRecord, type: Type): PeekResult {\n\tlet t: any = table\n\tlet m = meta\n\tlet k: string\n\tlet hasOwn = false\n\tlet state: MetaState\n\n\tfor (let i = 0; i < key.length; i++) {\n\t\tif (i) {\n\t\t\tt = hasOwn! ? t[k!] : (t[k!] = {})\n\t\t\tm = (state = m[k!]!).c\n\n\t\t\tif (type === Type.DOTTED && (state.t === Type.EXPLICIT || state.t === Type.ARRAY)) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tif (state.t === Type.ARRAY) {\n\t\t\t\tlet l = t.length - 1\n\t\t\t\tt = t[l]\n\t\t\t\tm = m[l]!.c\n\t\t\t}\n\t\t}\n\n\t\tk = key[i]!\n\t\tif ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === Type.DOTTED && m[k]?.d) {\n\t\t\treturn null\n\t\t}\n\n\t\tif (!hasOwn) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(t, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t\tObject.defineProperty(m, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t}\n\n\t\t\tm[k] = {\n\t\t\t\tt: i < key.length - 1 && type === Type.ARRAY\n\t\t\t\t\t? Type.ARRAY_DOTTED\n\t\t\t\t\t: type,\n\t\t\t\td: false,\n\t\t\t\ti: 0,\n\t\t\t\tc: {},\n\t\t\t}\n\t\t}\n\t}\n\n\tstate = m[k!]!\n\tif (state.t !== type && !(type === Type.EXPLICIT && state.t === Type.ARRAY_DOTTED)) {\n\t\t// Bad key type!\n\t\treturn null\n\t}\n\n\tif (type === Type.ARRAY) {\n\t\tif (!state.d) {\n\t\t\tstate.d = true\n\t\t\tt[k!] = []\n\t\t}\n\n\t\tt[k!].push(t = {})\n\t\tstate.c[state.i++] = (state = { t: Type.EXPLICIT, d: false, i: 0, c: {} })\n\t}\n\n\tif (state.d) {\n\t\t// Redefining a table!\n\t\treturn null\n\t}\n\n\tstate.d = true\n\tif (type === Type.EXPLICIT) {\n\t\tt = hasOwn ? t[k!] : (t[k!] = {})\n\t} else if (type === Type.DOTTED && hasOwn) {\n\t\treturn null\n\t}\n\n\treturn [k!, t, state.c]\n}\n\nexport interface ParseOptions {\n\tmaxDepth?: number\n\tintegersAsBigInt?: IntegersAsBigInt\n}\n\nexport function parse(toml: string, options?: ParseOptions & { integersAsBigInt: Exclude<IntegersAsBigInt, undefined | false> }): TomlTable\nexport function parse(toml: string, options?: ParseOptions): TomlTableWithoutBigInt\nexport function parse(toml: string, { maxDepth = 1000, integersAsBigInt }: ParseOptions = {}): TomlTable {\n\tlet res = {}\n\tlet meta = {}\n\n\tlet tbl = res\n\tlet m = meta\n\n\tfor (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n\t\tif (toml[ptr] === '[') {\n\t\t\tlet isTableArray = toml[++ptr] === '['\n\t\t\tlet k = parseKey(toml, (ptr += +isTableArray), ']')\n\n\t\t\tif (isTableArray) {\n\t\t\t\tif (toml[k[1] - 1] !== ']') {\n\t\t\t\t\tthrow new TomlError('expected end of table declaration', {\n\t\t\t\t\t\ttoml: toml,\n\t\t\t\t\t\tptr: k[1] - 1,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tk[1]++\n\t\t\t}\n\n\t\t\tlet p = peekTable(k[0], res, meta, isTableArray ? Type.ARRAY : Type.EXPLICIT)\n\t\t\tif (!p) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined table or value', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tm = p[2]\n\t\t\ttbl = p[1]\n\t\t\tptr = k[1]\n\t\t} else {\n\t\t\tlet k = parseKey(toml, ptr)\n\t\t\tlet p = peekTable(k[0], tbl, m, Type.DOTTED)\n\t\t\tif (!p) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined table or value', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt)\n\t\t\tp[1][p[0]] = v[0]\n\t\t\tptr = v[1]\n\t\t}\n\n\t\tptr = skipVoid(toml, ptr, true)\n\t\tif (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n\t\t\tthrow new TomlError('each key-value declaration must be followed by an end-of-line', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\t\tptr = skipVoid(toml, ptr)\n\t}\n\n\treturn res\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nlet BARE_KEY = /^[a-z0-9-_]+$/i\n\ntype ExtendedType = ReturnType<typeof extendedTypeOf>\nfunction extendedTypeOf(obj: any) {\n\tlet type = typeof obj\n\tif (type === 'object') {\n\t\tif (Array.isArray(obj)) return 'array'\n\t\tif (obj instanceof Date) return 'date'\n\t}\n\n\treturn type\n}\n\nfunction isArrayOfTables(obj: any[]) {\n\tfor (let i = 0; i < obj.length; i++) {\n\t\tif (extendedTypeOf(obj[i]) !== 'object') return false\n\t}\n\n\treturn obj.length != 0\n}\n\nfunction formatString(s: string) {\n\treturn JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f')\n}\n\nfunction stringifyValue(val: any, type: ExtendedType, depth: number, numberAsFloat: boolean) {\n\tif (depth === 0) {\n\t\tthrow new Error('Could not stringify the object: maximum object depth exceeded')\n\t}\n\n\tif (type === 'number') {\n\t\tif (isNaN(val)) return 'nan'\n\t\tif (val === Infinity) return 'inf'\n\t\tif (val === -Infinity) return '-inf'\n\t\tif (Number.isInteger(val) && (numberAsFloat || !Number.isSafeInteger(val))) return val.toFixed(1)\n\t\treturn val.toString()\n\t}\n\n\tif (type === 'bigint' || type === 'boolean') {\n\t\treturn val.toString()\n\t}\n\n\tif (type === 'string') {\n\t\treturn formatString(val)\n\t}\n\n\tif (type === 'date') {\n\t\tif (isNaN(val.getTime())) {\n\t\t\tthrow new TypeError('cannot serialize invalid date')\n\t\t}\n\n\t\treturn val.toISOString()\n\t}\n\n\tif (type === 'object') {\n\t\treturn stringifyInlineTable(val, depth, numberAsFloat)\n\t}\n\n\tif (type === 'array') {\n\t\treturn stringifyArray(val, depth, numberAsFloat)\n\t}\n}\n\nfunction stringifyInlineTable(obj: any, depth: number, numberAsFloat: boolean) {\n\tlet keys = Object.keys(obj)\n\tif (keys.length === 0) return '{}'\n\n\tlet res = '{ '\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet k = keys[i]!\n\t\tif (i) res += ', '\n\n\t\tres += BARE_KEY.test(k) ? k : formatString(k)\n\t\tres += ' = '\n\t\tres += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat)\n\t}\n\n\treturn res + ' }'\n}\n\nfunction stringifyArray(array: any[], depth: number, numberAsFloat: boolean) {\n\tif (array.length === 0) return '[]'\n\n\tlet res = '[ '\n\tfor (let i = 0; i < array.length; i++) {\n\t\tif (i) res += ', '\n\t\tif (array[i] === null || array[i] === void 0) {\n\t\t\tthrow new TypeError('arrays cannot contain null or undefined values')\n\t\t}\n\n\t\tres += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat)\n\t}\n\n\treturn res + ' ]'\n}\n\nfunction stringifyArrayTable(array: any[], key: string, depth: number, numberAsFloat: boolean) {\n\tif (depth === 0) {\n\t\tthrow new Error('Could not stringify the object: maximum object depth exceeded')\n\t}\n\n\tlet res = ''\n\tfor (let i = 0; i < array.length; i++) {\n\t\tres += `${res && '\\n'}[[${key}]]\\n`\n\t\tres += stringifyTable(0, array[i], key, depth, numberAsFloat)\n\t}\n\n\treturn res\n}\n\nfunction stringifyTable(tableKey: string | 0, obj: any, prefix: string, depth: number, numberAsFloat: boolean) {\n\tif (depth === 0) {\n\t\tthrow new Error('Could not stringify the object: maximum object depth exceeded')\n\t}\n\n\tlet preamble = ''\n\tlet tables = ''\n\n\tlet keys = Object.keys(obj)\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet k = keys[i]!\n\t\tif (obj[k] !== null && obj[k] !== void 0) {\n\t\t\tlet type: ExtendedType = extendedTypeOf(obj[k])\n\t\t\tif (type === 'symbol' || type === 'function') {\n\t\t\t\tthrow new TypeError(`cannot serialize values of type '${type}'`)\n\t\t\t}\n\n\t\t\tlet key = BARE_KEY.test(k) ? k : formatString(k)\n\n\t\t\tif (type === 'array' && isArrayOfTables(obj[k])) {\n\t\t\t\ttables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat)\n\t\t\t} else if (type === 'object') {\n\t\t\t\tlet tblKey = prefix ? `${prefix}.${key}` : key\n\t\t\t\ttables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat)\n\t\t\t} else {\n\t\t\t\tpreamble += key\n\t\t\t\tpreamble += ' = '\n\t\t\t\tpreamble += stringifyValue(obj[k], type, depth, numberAsFloat)\n\t\t\t\tpreamble += '\\n'\n\t\t\t}\n\t\t}\n\t}\n\n\tif (tableKey && (preamble || !tables)) // Create table only if necessary\n\t\tpreamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`\n\n\treturn preamble && tables\n\t\t? `${preamble}\\n${tables}`\n\t\t: preamble || tables\n}\n\nexport function stringify (\n\tobj: any,\n\t{ maxDepth = 1000, numbersAsFloat = false }: { maxDepth?: number, numbersAsFloat?: boolean } = {},\n) {\n\tif (extendedTypeOf(obj) !== 'object') {\n\t\tthrow new TypeError('stringify can only be called with an object')\n\t}\n\n\tlet str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat)\n\tif (str[str.length - 1] !== '\\n') return str + '\\n'\n\treturn str\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { parse } from './parse.js'\nimport { stringify } from './stringify.js'\n\nimport { TomlDate } from './date.js'\nimport { TomlError } from './error.js'\n\nexport type { TomlValue, TomlTable, TomlValueWithoutBigInt, TomlTableWithoutBigInt } from './util.js'\nexport default { parse, stringify, TomlDate, TomlError }\nexport { parse, stringify, TomlDate, TomlError }\n\nexport type {\n\t/** @deprecated use TomlValue instead */\n\tTomlValue as TomlPrimitive,\n} from './util.js'\n", "/** Bundled workspace agent catalog seeded when overlord.toml has no [agent_catalog]. */\nexport type CatalogAgent = {\n label: string;\n availableByDefault: boolean;\n models: Array<{ id: string; displayName: string; reasoningOptions: string[] }>;\n defaultModel: string | null;\n defaultReasoningEffort: string | null;\n reasoningLabel: string;\n};\n\nexport const BUNDLED_AGENT_CATALOG: Record<string, CatalogAgent> = {\n claude: {\n label: 'Claude Code',\n availableByDefault: true,\n models: [\n {\n id: 'claude-fable-5',\n displayName: 'Fable 5',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max', 'ultracode']\n },\n {\n id: 'claude-opus-4-8',\n displayName: 'Opus 4.8',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max', 'ultracode']\n },\n {\n id: 'claude-sonnet-5',\n displayName: 'Sonnet 5',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max', 'ultracode']\n },\n {\n id: 'claude-sonnet-4-6',\n displayName: 'Sonnet 4.6',\n reasoningOptions: ['low', 'medium', 'high', 'max']\n },\n { id: 'claude-haiku-4-5', displayName: 'Haiku 4.5', reasoningOptions: [] }\n ],\n defaultModel: null,\n defaultReasoningEffort: null,\n reasoningLabel: 'Thinking'\n },\n codex: {\n label: 'Codex',\n availableByDefault: true,\n models: [\n {\n id: 'gpt-5.4',\n displayName: 'GPT-5.4',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh']\n },\n\n {\n id: 'gpt-5.5',\n displayName: 'GPT-5.5',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh']\n },\n {\n id: 'gpt-5.6-sol',\n displayName: 'GPT-5.6 Sol',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max']\n },\n {\n id: 'gpt-5.6-luna',\n displayName: 'GPT-5.6 Luna',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max']\n },\n {\n id: 'gpt-5.6-terra',\n displayName: 'GPT-5.6 Terra',\n reasoningOptions: ['none', 'low', 'medium', 'high', 'xhigh', 'max']\n }\n ],\n defaultModel: 'gpt-5.4',\n defaultReasoningEffort: 'medium',\n reasoningLabel: 'Effort'\n },\n cursor: {\n label: 'Cursor',\n availableByDefault: true,\n models: [\n { id: 'auto', displayName: 'Auto', reasoningOptions: [] },\n { id: 'composer-2.5', displayName: 'Composer 2.5', reasoningOptions: [] },\n {\n id: 'grok-4.5-fast-high',\n displayName: 'Grok 4.5 Fast High',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-fast-medium',\n displayName: 'Grok 4.5 Fast Medium',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-fast-xhigh',\n displayName: 'Grok 4.5 Fast Xhigh',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-high',\n displayName: 'Grok 4.5 High',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-medium',\n displayName: 'Grok 4.5 Medium',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-xhigh',\n displayName: 'Grok 4.5 Xhigh',\n reasoningOptions: []\n },\n {\n id: 'glm-5.2-high',\n displayName: 'GLM 5.2 High',\n reasoningOptions: []\n },\n {\n id: 'gpt-5.6-sol',\n displayName: 'GPT-5.6 Sol',\n reasoningOptions: []\n },\n\n {\n id: 'gpt-5.6-terra',\n displayName: 'GPT-5.6 Terra',\n reasoningOptions: []\n },\n {\n id: 'gpt-5.6-luna',\n displayName: 'GPT-5.6 Luna',\n reasoningOptions: []\n }\n ],\n defaultModel: 'auto',\n defaultReasoningEffort: null,\n reasoningLabel: 'Thinking'\n }\n};\n", "import { BUNDLED_AGENT_CATALOG, type CatalogAgent } from './agent-catalog-defaults.ts';\n\ntype TomlCatalogModel = {\n id?: string;\n display_name?: string;\n reasoning_options?: string[];\n};\n\ntype TomlCatalogAgent = {\n label?: string;\n available_by_default?: boolean;\n default_model?: string;\n default_reasoning_effort?: string;\n reasoning_label?: string;\n models?: TomlCatalogModel[];\n};\n\nfunction emptyToNull(value: string | undefined): string | null {\n if (value === undefined || value === '') return null;\n return value;\n}\n\nexport function parseAgentCatalogFromToml(raw: unknown): Record<string, CatalogAgent> | null {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n\n const agents: Record<string, CatalogAgent> = {};\n for (const [key, entry] of Object.entries(raw as Record<string, TomlCatalogAgent>)) {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;\n\n const models = (entry.models ?? [])\n .filter((model): model is TomlCatalogModel & { id: string } => {\n return Boolean(model && typeof model === 'object' && typeof model.id === 'string');\n })\n .map(model => ({\n id: model.id,\n displayName: model.display_name?.trim() || model.id,\n reasoningOptions: Array.isArray(model.reasoning_options)\n ? model.reasoning_options.filter((option): option is string => typeof option === 'string')\n : []\n }));\n\n if (!entry.label?.trim() || models.length === 0) continue;\n\n agents[key] = {\n label: entry.label.trim(),\n availableByDefault: entry.available_by_default !== false,\n models,\n defaultModel: emptyToNull(entry.default_model),\n defaultReasoningEffort: emptyToNull(entry.default_reasoning_effort),\n reasoningLabel: entry.reasoning_label?.trim() || 'Thinking'\n };\n }\n\n return Object.keys(agents).length > 0 ? agents : null;\n}\n\nfunction mergeAgentCatalogs({\n base,\n overrides\n}: {\n base: Record<string, CatalogAgent>;\n overrides: Record<string, CatalogAgent>;\n}): Record<string, CatalogAgent> {\n const merged = structuredClone(base);\n\n for (const [key, override] of Object.entries(overrides)) {\n const existing = merged[key];\n if (!existing) {\n merged[key] = structuredClone(override);\n continue;\n }\n\n const modelsById = new Map(existing.models.map(model => [model.id, model]));\n for (const model of override.models) {\n modelsById.set(model.id, model);\n }\n\n merged[key] = {\n ...existing,\n ...override,\n models: Array.from(modelsById.values())\n };\n }\n\n return merged;\n}\n\n/** Instance catalog: bundled defaults merged with optional overlord.toml overrides. */\nexport function resolveInstanceAgentCatalog({\n configCatalog\n}: {\n configCatalog: Record<string, CatalogAgent> | null;\n}): Record<string, CatalogAgent> {\n if (!configCatalog) {\n return structuredClone(BUNDLED_AGENT_CATALOG);\n }\n return mergeAgentCatalogs({ base: BUNDLED_AGENT_CATALOG, overrides: configCatalog });\n}\n", "import { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** Minimal .env parser (dotenv-compatible `parse` only \u2014 avoids bundling CJS dotenv). */\nfunction parseDotenv(src: string): Record<string, string> {\n const obj: Record<string, string> = {};\n const line =\n /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/gm;\n let lines = src.replace(/\\r\\n?/g, '\\n');\n let match: RegExpExecArray | null;\n while ((match = line.exec(lines)) !== null) {\n const key = match[1];\n if (!key) continue;\n let value = (match[2] ?? '').trim();\n const maybeQuote = value[0];\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/m, '$2');\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r');\n }\n obj[key] = value;\n }\n return obj;\n}\n\nexport type EnvProfile = 'development' | 'production';\n\nexport function resolveEnvFileNames(profile: EnvProfile): string[] {\n return profile === 'production' ? ['.env.prod'] : ['.env.local'];\n}\n\n/** True when a built module lives inside an installed package (`node_modules`). */\nexport function isInstalledModulePath(moduleDir: string): boolean {\n return /[\\\\/]node_modules[\\\\/]/.test(moduleDir);\n}\n\n/**\n * True when the invoked `ovld` entrypoint came from an installed package path.\n * Node resolves package symlinks before exposing `import.meta.url`, so a globally\n * linked `overlord-cli` package can otherwise look like the in-repo source build.\n */\nexport function isInstalledCliEntrypointPath(entrypointPath: string): boolean {\n if (!entrypointPath) return false;\n if (isInstalledModulePath(entrypointPath)) return true;\n\n try {\n const stat = lstatSync(entrypointPath);\n if (!stat.isSymbolicLink()) return false;\n\n const target = readlinkSync(entrypointPath);\n const resolvedTarget = path.isAbsolute(target)\n ? target\n : path.resolve(path.dirname(entrypointPath), target);\n return isInstalledModulePath(resolvedTarget);\n } catch {\n return false;\n }\n}\n\n/**\n * Default env profile for a bare `ovld` invocation. The **installed/published**\n * CLI (under `node_modules`) runs as `production`: it never auto-loads `.env.local`\n * and never reads the dev-only `OVERLORD_BACKEND_URL_DEV`, so a development variable\n * can never leak into a production CLI even when it is run from inside a dev\n * checkout. Only the in-repo source build \u2014 and the dev/test tooling that runs it\n * (`yarn dev`, `with-ovld-home`) \u2014 defaults to `development`. Webapp/server and\n * desktop pass their own profile explicitly and are unaffected.\n */\nexport function detectCliEnvProfile(): EnvProfile {\n try {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n return isInstalledModulePath(moduleDir) || isInstalledCliEntrypointPath(process.argv[1] ?? '')\n ? 'production'\n : 'development';\n } catch {\n return 'development';\n }\n}\n\nfunction snapshotRuntimeEnv(): Set<string> {\n return new Set(\n Object.entries(process.env)\n .filter(([, value]) => Boolean(value?.trim()))\n .map(([key]) => key)\n );\n}\n\n/**\n * Snapshot of which env vars were set by the real process environment (shell\n * export, Docker/launcher injection) before this module ever loads a `.env`\n * file. Captured once at import time, which always runs before any call to\n * `loadEnvDefaults` below \u2014 so a later `isExplicitRuntimeEnv(key)` can tell a\n * genuine runtime override apart from a value that only exists because a\n * `.env` file backfilled it.\n */\nlet explicitRuntimeKeys = snapshotRuntimeEnv();\n\nexport function isExplicitRuntimeEnv(key: string): boolean {\n return explicitRuntimeKeys.has(key);\n}\n\n/**\n * True when the CLI is running inside an agent pod / container. A containerized\n * `ovld` must never persist its network context into the shared, host-mounted\n * `overlord.toml` (a context-specific value such as `host.docker.internal` would\n * then leak onto every host process that resolves the same file). Containers are\n * pure consumers of an injected runtime `OVERLORD_BACKEND_URL` instead.\n *\n * Detection prefers an explicit launcher-set marker (`OVERLORD_IN_POD`, runtime-\n * agnostic across Docker/podman/k8s), and falls back to the Docker-created\n * `/.dockerenv` sentinel so the guard still holds if a launcher predates the\n * marker. `OVERLORD_ALLOW_CONFIG_WRITE` is a deliberate escape hatch (e.g. baking\n * config into an image at build time).\n */\nexport function isRunningInContainer(): boolean {\n if (isTruthyEnv(process.env.OVERLORD_ALLOW_CONFIG_WRITE)) return false;\n if (isTruthyEnv(process.env.OVERLORD_IN_POD)) return true;\n return existsSync('/.dockerenv');\n}\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n const normalized = value?.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n}\n\n/**\n * Profile-aware env resolution for keys mirrored in `overlord.toml`.\n * Development: explicit runtime > env file > toml > fallback.\n * Production: explicit runtime > toml > env file > fallback.\n */\nexport function resolveLayeredEnv({\n envKey,\n configValue,\n fallback = '',\n envProfile = 'development'\n}: {\n envKey: string;\n configValue: string;\n fallback?: string;\n envProfile?: EnvProfile;\n}): string {\n const value = process.env[envKey]?.trim();\n if (value && isExplicitRuntimeEnv(envKey)) return value;\n if (envProfile === 'development' && value) return value;\n if (configValue) return configValue;\n return value || fallback;\n}\n\n/**\n * Test-only: re-snapshot the runtime environment. Production code never calls\n * this \u2014 the snapshot is meant to be captured exactly once, before any `.env`\n * file is loaded, for the lifetime of a single process. Tests that mutate\n * `process.env` across cases within one process need to re-establish the\n * \"before .env loaded\" baseline themselves.\n */\nexport function resetExplicitRuntimeEnvForTests(): void {\n explicitRuntimeKeys = snapshotRuntimeEnv();\n}\n\n/**\n * Backfills `process.env` from the env file for `profile` in `dir`, without\n * overwriting any value already present. Development workflows read `.env.local`\n * only; production/packaged workflows read `.env.prod` only. Missing files are\n * silently skipped \u2014 most `ovld` invocations (global installs, arbitrary\n * working directories) have neither.\n */\nexport function loadEnvDefaults(dir: string, profile: EnvProfile = 'development'): void {\n for (const file of resolveEnvFileNames(profile)) {\n const filePath = path.join(dir, file);\n if (!existsSync(filePath)) continue;\n const parsed = parseDotenv(readFileSync(filePath, 'utf8'));\n for (const [key, value] of Object.entries(parsed)) {\n if (!process.env[key]?.trim()) {\n process.env[key] = normalizeEnvFileValue({ key, value, baseDir: path.dirname(filePath) });\n }\n }\n }\n}\n\nfunction normalizeEnvFileValue({\n key,\n value,\n baseDir\n}: {\n key: string;\n value: string;\n baseDir: string;\n}): string {\n if (key !== 'OVLD_HOME') return value;\n if (!value.trim() || path.isAbsolute(value)) return value;\n return path.resolve(baseDir, value);\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { parse } from 'smol-toml';\n\nimport { parseAgentCatalogFromToml } from './agent-catalog.ts';\nimport type { CatalogAgent } from './agent-catalog-defaults.ts';\nimport {\n detectCliEnvProfile,\n type EnvProfile,\n isExplicitRuntimeEnv,\n isRunningInContainer,\n loadEnvDefaults,\n resolveLayeredEnv\n} from './env.ts';\nimport { CliError } from './errors.ts';\n\n/**\n * Default profile for bare CLI calls: `production` for an installed binary,\n * `development` only for the source build. Keeps the dev-only\n * `OVERLORD_BACKEND_URL_DEV` / `.env.local` out of the production CLI. Callers\n * with their own context (backend, desktop) pass an explicit profile.\n */\nconst CLI_ENV_PROFILE: EnvProfile = detectCliEnvProfile();\n\nexport const DEFAULT_LOCAL_BACKEND_DIR = '~/.ovld';\nexport const DEFAULT_LOCAL_BACKEND_DATABASE_PATH = '~/.ovld/Overlord.sqlite';\nexport const DEFAULT_LOCAL_BACKEND_URL = 'http://127.0.0.1:4310';\n\n/** Ensure backend URLs are fetch-ready; agent pods often inject host:port without a scheme. */\nexport function normalizeBackendUrl(value: string): string {\n const trimmed = value.trim().replace(/\\/+$/, '');\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n return `http://${trimmed}`;\n}\n\n/** True when the configured backend is the loopback Local edition server. */\nexport function isLoopbackBackendUrl(backendUrl: string): boolean {\n try {\n const hostname = new URL(normalizeBackendUrl(backendUrl)).hostname;\n return hostname === '127.0.0.1' || hostname === 'localhost' || hostname === '::1';\n } catch {\n return false;\n }\n}\n\nexport type BackendMode = 'local' | 'cloud';\n\nexport type OverlordConfig = {\n instanceName: string;\n backendMode: BackendMode;\n backendUrl: string | null;\n /**\n * Developer override for the local SQLite location. Relative paths resolve\n * against the `overlord.toml` directory; absolute paths are used as-is.\n * `null` means use the per-user global default (`~/.ovld/Overlord.sqlite`).\n */\n databasePath: string | null;\n /**\n * Admin-configured cloud database connection string (e.g. a PostgreSQL URL)\n * for running Overlord against a hosted database. `null` means use the local\n * SQLite database at `databasePath`. Feeds the shared `resolveAdapter()`\n * selection point.\n */\n databaseUrl: string | null;\n webHost: string;\n webPort: number;\n sqlStudioEnabled: boolean;\n sqlStudioHost: string;\n sqlStudioPort: number;\n sqlStudioBinary: string;\n defaultAgent: string;\n defaultModel: string | null;\n /** Parsed from `[agent_catalog]`; merged over bundled defaults when seeding the workspace catalog. */\n agentCatalog: Record<string, CatalogAgent> | null;\n};\n\nconst DEFAULT_CONFIG: OverlordConfig = {\n instanceName: 'Local Overlord',\n backendMode: 'local',\n backendUrl: null,\n databasePath: null,\n databaseUrl: null,\n webHost: '127.0.0.1',\n webPort: 4310,\n sqlStudioEnabled: false,\n sqlStudioHost: '127.0.0.1',\n sqlStudioPort: 4311,\n sqlStudioBinary: 'sql-studio',\n defaultAgent: 'claude',\n defaultModel: null,\n agentCatalog: null\n};\n\nfunction tomlString(value: string): string {\n return JSON.stringify(value);\n}\n\ntype TomlConfig = {\n instance_name?: string;\n backend_mode?: string;\n backend_url?: string;\n database_path?: string;\n database_url?: string;\n web_host?: string;\n web_port?: number;\n sql_studio_enabled?: boolean;\n sql_studio_host?: string;\n sql_studio_port?: number;\n sql_studio_binary?: string;\n default_agent?: string;\n default_model?: string;\n agent_catalog?: unknown;\n};\n\nfunction parseTomlConfig(raw: string): TomlConfig {\n try {\n return parse(raw) as TomlConfig;\n } catch {\n return {};\n }\n}\n\nfunction configFromToml(toml: TomlConfig): OverlordConfig {\n const backendMode: BackendMode = toml.backend_mode === 'cloud' ? 'cloud' : 'local';\n return {\n instanceName: toml.instance_name ?? DEFAULT_CONFIG.instanceName,\n backendMode,\n backendUrl: toml.backend_url?.trim() ? toml.backend_url.trim() : null,\n databasePath: toml.database_path?.trim() ? toml.database_path.trim() : null,\n databaseUrl: toml.database_url?.trim() ? toml.database_url.trim() : null,\n webHost: toml.web_host ?? DEFAULT_CONFIG.webHost,\n webPort: typeof toml.web_port === 'number' ? toml.web_port : DEFAULT_CONFIG.webPort,\n sqlStudioEnabled:\n typeof toml.sql_studio_enabled === 'boolean'\n ? toml.sql_studio_enabled\n : DEFAULT_CONFIG.sqlStudioEnabled,\n sqlStudioHost: toml.sql_studio_host ?? DEFAULT_CONFIG.sqlStudioHost,\n sqlStudioPort:\n typeof toml.sql_studio_port === 'number'\n ? toml.sql_studio_port\n : DEFAULT_CONFIG.sqlStudioPort,\n sqlStudioBinary: toml.sql_studio_binary?.trim()\n ? toml.sql_studio_binary\n : DEFAULT_CONFIG.sqlStudioBinary,\n defaultAgent: toml.default_agent ?? DEFAULT_CONFIG.defaultAgent,\n defaultModel: toml.default_model?.trim() ? toml.default_model : null,\n agentCatalog: parseAgentCatalogFromToml(toml.agent_catalog)\n };\n}\n\nexport function resolveProjectRoot(startDir = process.cwd()): string {\n const configPath = findConfigPath(startDir);\n if (configPath) {\n return path.dirname(configPath);\n }\n return startDir;\n}\n\nexport function resolveRepoPath(relativePath: string, startDir = process.cwd()): string {\n return path.resolve(resolveProjectRoot(startDir), relativePath);\n}\n\nexport function findConfigPath(startDir = process.cwd()): string | null {\n let current = path.resolve(startDir);\n while (true) {\n const candidate = path.join(current, 'overlord.toml');\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n\nexport function resolveGlobalDataDir(): string {\n return process.env.OVLD_HOME?.trim() || path.join(os.homedir(), '.ovld');\n}\n\nexport function resolveGlobalConfigPath(): string {\n return path.join(resolveGlobalDataDir(), 'overlord.toml');\n}\n\nexport function findEffectiveConfigPath(startDir = process.cwd()): string | null {\n const localPath = findConfigPath(startDir);\n if (localPath) return localPath;\n\n const globalPath = resolveGlobalConfigPath();\n return existsSync(globalPath) ? globalPath : null;\n}\n\nexport function resolveConfigWritePath(startDir = process.cwd()): string {\n return findConfigPath(startDir) ?? resolveGlobalConfigPath();\n}\n\nexport function loadConfig(\n configPath?: string | null,\n envProfile: EnvProfile = CLI_ENV_PROFILE\n): OverlordConfig {\n const resolvedPath = configPath ?? findEffectiveConfigPath();\n loadEnvDefaults(resolvedPath ? path.dirname(resolvedPath) : process.cwd(), envProfile);\n\n if (!resolvedPath || !existsSync(resolvedPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = readFileSync(resolvedPath, 'utf8');\n return configFromToml(parseTomlConfig(raw));\n}\n\nexport function writeConfig({\n targetPath,\n config\n}: {\n targetPath: string;\n config: Partial<OverlordConfig>;\n}): void {\n // A containerized CLI must not persist config into the (host-mounted, shared)\n // `overlord.toml`: a context-specific value such as `host.docker.internal`\n // would leak onto every host process resolving the same file. Containers\n // consume an injected runtime `OVERLORD_BACKEND_URL` instead \u2014 see\n // `isRunningInContainer` and `resolveBackendUrl`. Use `OVERLORD_ALLOW_CONFIG_WRITE`\n // to bypass intentionally (e.g. baking config into an image at build time).\n if (isRunningInContainer()) {\n throw new CliError({\n message:\n 'Refusing to write overlord.toml from inside a container. Configure the backend with the OVERLORD_BACKEND_URL environment variable instead (set OVERLORD_ALLOW_CONFIG_WRITE=1 to override).'\n });\n }\n\n mkdirSync(path.dirname(targetPath), { recursive: true });\n const merged = { ...DEFAULT_CONFIG, ...config };\n const contents = `# Overlord local instance configuration\ninstance_name = ${tomlString(merged.instanceName)}\nbackend_mode = ${tomlString(merged.backendMode)}\n${merged.backendUrl ? `backend_url = ${tomlString(merged.backendUrl)}` : `backend_url = ${tomlString(DEFAULT_LOCAL_BACKEND_URL)}`}\n\n# Published CLI backend target.\n# Local mode expects a Desktop/local backend listening on the loopback URL.\n# Cloud mode points at a hosted Overlord backend.\n#\n# backend_mode = \"local\"\n# backend_url = \"http://127.0.0.1:4310\"\n# backend_mode = \"cloud\"\n# backend_url = \"https://overlord.example.com\"\n\n${merged.databasePath ? `database_path = ${tomlString(merged.databasePath)}` : '# database_path = \"\"'}\n# Legacy local-backend database location. The published npm CLI does not open\n# SQLite; these keys are consumed only by local backend packages such as Desktop.\n# database_path = \"./database/.local/Overlord.sqlite\"\n#\n# Legacy backend database URL for backend packages that talk directly to Postgres.\n${merged.databaseUrl ? `database_url = ${tomlString(merged.databaseUrl)}` : '# database_url = \"postgres://user:password@host:5432/overlord\"'}\nweb_host = ${tomlString(merged.webHost)}\nweb_port = ${merged.webPort}\nsql_studio_enabled = ${merged.sqlStudioEnabled}\nsql_studio_host = ${tomlString(merged.sqlStudioHost)}\nsql_studio_port = ${merged.sqlStudioPort}\nsql_studio_binary = ${tomlString(merged.sqlStudioBinary)}\ndefault_agent = ${tomlString(merged.defaultAgent)}\n${merged.defaultModel ? `default_model = ${tomlString(merged.defaultModel)}` : '# default_model = \"\"'}\n# Terminal launch settings live on user_execution_target_preferences.terminal_profile_json\n# for this user's local target fingerprint. Configure them with ovld setup.\n\n# Optional workspace agent catalog (merged over bundled defaults on first seed / refresh).\n# [agent_catalog.claude]\n# label = \"Claude Code\"\n# available_by_default = true\n# reasoning_label = \"Thinking\"\n#\n# [[agent_catalog.claude.models]]\n# id = \"claude-sonnet-4-6\"\n# display_name = \"Sonnet 4.6\"\n# reasoning_options = [\"low\", \"medium\", \"high\"]\n`;\n\n writeFileSync(targetPath, contents);\n}\n\nexport function hasExplicitBackendConfig(config: OverlordConfig): boolean {\n return Boolean(config.backendUrl?.trim());\n}\n\n/**\n * Expand a leading `~` (or `~/\u2026`) to the user's home directory. TOML strings\n * are not shell-expanded, so `database_path = \"~/.ovld/Overlord.sqlite\"` would\n * otherwise be treated as a relative `./~/\u2026` path. Other paths are returned\n * unchanged.\n */\nfunction expandTilde(input: string): string {\n if (input === '~') return os.homedir();\n if (input.startsWith('~/') || input.startsWith(`~${path.sep}`)) {\n return path.join(os.homedir(), input.slice(2));\n }\n return input;\n}\n\nexport function resolveDatabasePath(config: OverlordConfig, startDir = process.cwd()): string {\n // A real runtime override (shell export, container launcher) beats the\n // persisted `overlord.toml` value; an env-file-backfilled value does not \u2014 see\n // `isExplicitRuntimeEnv` in `env.ts`.\n const explicit = process.env.OVERLORD_SQLITE_PATH;\n if (explicit && isExplicitRuntimeEnv('OVERLORD_SQLITE_PATH')) {\n const expanded = expandTilde(explicit);\n return path.isAbsolute(expanded)\n ? expanded\n : path.resolve(resolveProjectRoot(startDir), expanded);\n }\n\n if (config.databasePath) {\n const expanded = expandTilde(config.databasePath);\n const configPath = findConfigPath(startDir);\n const baseDir = configPath ? path.dirname(configPath) : resolveProjectRoot(startDir);\n return path.isAbsolute(expanded) ? expanded : path.resolve(baseDir, expanded);\n }\n\n // No explicit runtime override or toml override: fall back to an env-file\n // baked-in default if present, otherwise the per-user global default.\n if (explicit) {\n const expanded = expandTilde(explicit);\n return path.isAbsolute(expanded)\n ? expanded\n : path.resolve(resolveProjectRoot(startDir), expanded);\n }\n\n return path.join(resolveGlobalDataDir(), 'Overlord.sqlite');\n}\n\nexport function resolveBackendUrl(\n config: OverlordConfig,\n envProfile: EnvProfile = CLI_ENV_PROFILE\n): string {\n // Precedence, highest first:\n // 1. an explicit runtime export of the channel's variable (shell / launcher);\n // 2. the per-instance `overlord.toml` `backend_url` (e.g. `ovld config set`);\n // 3. the profile env-file default (`.env.local`/`.env.prod`, backfilled);\n // 4. a hardcoded fallback.\n // Development and production read SEPARATE variables so the two channels never\n // collide: development uses `OVERLORD_BACKEND_URL_DEV` (`.env.local`), production\n // uses `OVERLORD_BACKEND_URL` (`.env.prod`). A backfilled env-file value is only a\n // default \u2014 an explicit `overlord.toml` (which is per-instance and uncommitted)\n // outranks it, so `ovld config set` / `ovld init` take effect as expected. Only a\n // deliberate shell export of the channel variable outranks the toml.\n const override = process.env.OVERLORD_BACKEND_URL?.trim();\n if (override && isExplicitRuntimeEnv('OVERLORD_BACKEND_URL')) {\n return normalizeBackendUrl(override);\n }\n\n const devOverride = process.env.OVERLORD_BACKEND_URL_DEV?.trim();\n if (\n envProfile === 'development' &&\n devOverride &&\n isExplicitRuntimeEnv('OVERLORD_BACKEND_URL_DEV')\n ) {\n return normalizeBackendUrl(devOverride);\n }\n\n if (config.backendUrl?.trim()) return normalizeBackendUrl(config.backendUrl.trim());\n\n if (envProfile === 'development') {\n return normalizeBackendUrl(devOverride || DEFAULT_LOCAL_BACKEND_URL);\n }\n return normalizeBackendUrl(override || DEFAULT_LOCAL_BACKEND_URL);\n}\n\n/**\n * Bridge the admin `database_url` from `overlord.toml` into `DATABASE_URL` so\n * the components that already resolve the database from the environment \u2014 the\n * auth layer and `resolveAdapter()` \u2014 coordinate with the toml without each\n * needing to re-read the config. An existing `DATABASE_URL` is left untouched.\n */\nexport function applyDatabaseEnv(config: OverlordConfig): void {\n if (config.databaseUrl && !process.env.DATABASE_URL?.trim()) {\n process.env.DATABASE_URL = config.databaseUrl;\n }\n}\n", "import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\n\nexport type AuthCredentialType = 'session_bearer' | 'user_token';\n\nexport type StoredAuthCredentials = {\n type: AuthCredentialType;\n token: string;\n backendUrl: string;\n updatedAt: string;\n};\n\nexport function authCredentialsPath(): string {\n return path.join(resolveGlobalDataDir(), 'auth.json');\n}\n\nexport function readStoredAuthCredentials(): StoredAuthCredentials | null {\n const filePath = authCredentialsPath();\n if (!existsSync(filePath)) return null;\n try {\n const raw = JSON.parse(readFileSync(filePath, 'utf8')) as StoredAuthCredentials;\n if (typeof raw.token !== 'string' || !raw.token.trim()) return null;\n if (raw.type !== 'session_bearer' && raw.type !== 'user_token') return null;\n if (typeof raw.backendUrl !== 'string' || !raw.backendUrl.trim()) return null;\n return raw;\n } catch {\n return null;\n }\n}\n\nexport function writeStoredAuthCredentials({\n type,\n token,\n backendUrl\n}: {\n type: AuthCredentialType;\n token: string;\n backendUrl: string;\n}): void {\n const filePath = authCredentialsPath();\n mkdirSync(path.dirname(filePath), { recursive: true });\n const payload: StoredAuthCredentials = {\n type,\n token,\n backendUrl: backendUrl.replace(/\\/+$/, ''),\n updatedAt: new Date().toISOString()\n };\n writeFileSync(filePath, `${JSON.stringify(payload, null, 2)}\\n`, { mode: 0o600 });\n try {\n chmodSync(filePath, 0o600);\n } catch {\n // Best effort on platforms that restrict chmod.\n }\n}\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nexport function clearStoredAuthCredentials(): void {\n const filePath = authCredentialsPath();\n if (!existsSync(filePath)) return;\n unlinkSync(filePath);\n}\n\nexport function resolveAuthBearerToken({\n backendUrl,\n env = process.env\n}: {\n backendUrl?: string;\n env?: NodeJS.ProcessEnv;\n} = {}): string | undefined {\n const fromEnv =\n env.OVERLORD_USER_TOKEN?.trim() || env.OVLD_USER_TOKEN?.trim() || env.USER_TOKEN?.trim();\n if (fromEnv) return fromEnv;\n\n const stored = readStoredAuthCredentials();\n if (!stored) return undefined;\n if (backendUrl && normalizeBaseUrl(stored.backendUrl) !== normalizeBaseUrl(backendUrl)) {\n return undefined;\n }\n return stored.token;\n}\n", "import { hostname } from 'node:os';\nimport { createInterface } from 'node:readline/promises';\n\nimport { writeStoredAuthCredentials } from './auth-credentials.js';\nimport { CliError } from './errors.js';\n\nexport type AuthLoginMethod = 'password' | 'user_token';\n\nexport type AuthLoginResult = {\n ok: true;\n authMethod: AuthLoginMethod;\n credentialType: 'session_bearer' | 'user_token';\n backendUrl: string;\n credentialsPath: string;\n};\n\nexport type PasswordLoginCredentialTarget = 'session_bearer' | 'full_user_token';\n\nexport function normalizeEmail(email: string): string {\n return email.trim().toLowerCase();\n}\n\nexport function validateEmail(email: string): string | null {\n const normalized = normalizeEmail(email);\n if (!/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(normalized)) {\n return 'Enter a valid email address.';\n }\n return null;\n}\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nexport function isBackendReachabilityError(error: unknown): boolean {\n if (!(error instanceof CliError)) return false;\n return error.message.startsWith('Could not reach Overlord backend at ');\n}\n\nexport async function probeBackendReachability({\n backendUrl\n}: {\n backendUrl: string;\n}): Promise<{ reachable: boolean; error: string | null }> {\n const baseUrl = normalizeBaseUrl(backendUrl);\n try {\n const response = await fetch(`${baseUrl}/api/health`, {\n method: 'GET',\n headers: { Accept: 'application/json' }\n });\n if (response.ok) return { reachable: true, error: null };\n return {\n reachable: false,\n error: `Backend at ${baseUrl} returned HTTP ${response.status}.`\n };\n } catch (error) {\n return {\n reachable: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nasync function promptLine({\n message,\n defaultValue\n}: {\n message: string;\n defaultValue?: string;\n}): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new CliError({\n message:\n 'Interactive login requires a TTY. Set OVERLORD_USER_TOKEN / OVLD_USER_TOKEN / USER_TOKEN for non-interactive use.'\n });\n }\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n const answer = await rl.question(`${message}${suffix}: `);\n return answer.trim() || defaultValue || '';\n } finally {\n rl.close();\n }\n}\n\nasync function promptPassword({ message }: { message: string }): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new CliError({\n message:\n 'Interactive login requires a TTY. Set OVERLORD_USER_TOKEN / OVLD_USER_TOKEN / USER_TOKEN for non-interactive use.'\n });\n }\n\n process.stdout.write(`${message}: `);\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n stdin.setRawMode?.(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n return new Promise((resolve, reject) => {\n let password = '';\n\n const cleanup = (): void => {\n stdin.setRawMode?.(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n };\n\n const onData = (chunk: string): void => {\n const char = chunk;\n\n if (char === '\\u0003') {\n cleanup();\n process.stdout.write('\\n');\n reject(new CliError({ message: 'Login cancelled.' }));\n return;\n }\n\n if (char === '\\r' || char === '\\n' || char === '\\u0004') {\n cleanup();\n process.stdout.write('\\n');\n resolve(password);\n return;\n }\n\n if (char === '\\u007f' || char === '\\b') {\n password = password.slice(0, -1);\n return;\n }\n\n password += char;\n };\n\n stdin.on('data', onData);\n });\n}\n\nasync function promptAuthMethod(): Promise<AuthLoginMethod> {\n console.log('Choose how to authenticate:');\n console.log(' 1. Email and password');\n console.log(' 2. USER_TOKEN (generate one in Overlord Desktop: Settings > Tokens)');\n\n const answer = (await promptLine({ message: 'Selection', defaultValue: '1' })).toLowerCase();\n if (answer === '2' || answer === 'token' || answer === 'user_token') return 'user_token';\n if (answer === '1' || answer === 'password' || answer === 'email') return 'password';\n throw new CliError({ message: 'Selection must be 1 or 2.' });\n}\n\nfunction errorMessageFromJson(value: unknown): string | null {\n if (!value || typeof value !== 'object') return null;\n const record = value as Record<string, unknown>;\n return typeof record.error === 'string'\n ? record.error\n : typeof record.message === 'string'\n ? record.message\n : null;\n}\n\nasync function readResponseJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nexport function formatUserTokenLoginCommand(token: string): string {\n return `ovld auth login --token ${token}`;\n}\n\nexport async function loginWithUserToken({\n backendUrl,\n token\n}: {\n backendUrl: string;\n token: string;\n}): Promise<AuthLoginResult> {\n const normalizedBackendUrl = normalizeBaseUrl(backendUrl);\n const trimmedToken = token.trim();\n if (!trimmedToken) throw new CliError({ message: 'USER_TOKEN is required.' });\n if (!trimmedToken.startsWith('out_')) {\n throw new CliError({\n message:\n 'USER_TOKEN must start with \"out_\". Generate one in Overlord Desktop: Settings > Tokens.'\n });\n }\n\n await validateBearerToken({ backendUrl: normalizedBackendUrl, token: trimmedToken });\n writeStoredAuthCredentials({\n type: 'user_token',\n token: trimmedToken,\n backendUrl: normalizedBackendUrl\n });\n\n const { authCredentialsPath } = await import('./auth-credentials.js');\n return {\n ok: true,\n authMethod: 'user_token',\n credentialType: 'user_token',\n backendUrl: normalizedBackendUrl,\n credentialsPath: authCredentialsPath()\n };\n}\n\nexport async function validateBearerToken({\n backendUrl,\n token\n}: {\n backendUrl: string;\n token: string;\n}): Promise<void> {\n const baseUrl = normalizeBaseUrl(backendUrl);\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/meta`, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n Authorization: `Bearer ${token}`\n }\n });\n } catch (error) {\n throw new CliError({\n message:\n `Could not reach Overlord backend at ${baseUrl}.\\n` +\n (error instanceof Error ? error.message : String(error))\n });\n }\n\n if (response.ok) return;\n\n const payload = await readResponseJson(response);\n throw new CliError({\n message:\n errorMessageFromJson(payload) ??\n `Authentication failed (${response.status}). Check your credentials and try again.`\n });\n}\n\ntype CreateUserTokenResult = {\n secret?: unknown;\n};\n\nfunction defaultCliLoginTokenLabel(): string {\n const host = hostname().trim();\n return `CLI login on ${host || 'unknown host'}`;\n}\n\nexport async function createFullUserTokenFromSession({\n backendUrl,\n sessionToken,\n label = defaultCliLoginTokenLabel()\n}: {\n backendUrl: string;\n sessionToken: string;\n label?: string;\n}): Promise<string> {\n const baseUrl = normalizeBaseUrl(backendUrl);\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/user-tokens`, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${sessionToken}`\n },\n body: JSON.stringify({ label, scope: 'full' })\n });\n } catch (error) {\n throw new CliError({\n message:\n `Could not create CLI USER_TOKEN at ${baseUrl}.\\n` +\n (error instanceof Error ? error.message : String(error))\n });\n }\n\n const payload = (await readResponseJson(response)) as CreateUserTokenResult | unknown;\n if (response.ok && payload && typeof payload === 'object') {\n const secret = (payload as CreateUserTokenResult).secret;\n if (typeof secret === 'string' && secret.startsWith('out_')) return secret;\n }\n\n throw new CliError({\n message:\n errorMessageFromJson(payload) ??\n `Could not create CLI USER_TOKEN (${response.status}). Check your account permissions.`\n });\n}\n\nexport async function signInWithEmailPassword({\n backendUrl,\n email: rawEmail,\n password\n}: {\n backendUrl: string;\n email: string;\n password: string;\n}): Promise<string> {\n const emailError = validateEmail(rawEmail);\n if (emailError) throw new CliError({ message: emailError });\n if (!password) throw new CliError({ message: 'Password is required.' });\n\n const baseUrl = normalizeBaseUrl(backendUrl);\n const email = normalizeEmail(rawEmail);\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/auth/sign-in/email`, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n // Better Auth enforces a CSRF/origin check on POST sign-in. Node's fetch\n // sends `Sec-Fetch-*` headers, which engages that check, so a missing\n // Origin is rejected with \"Missing or null Origin\". The backend trusts\n // its own loopback/base origin, so send it explicitly.\n Origin: baseUrl\n },\n body: JSON.stringify({ email, password })\n });\n } catch (error) {\n throw new CliError({\n message:\n `Could not reach Overlord backend at ${baseUrl}.\\n` +\n (error instanceof Error ? error.message : String(error))\n });\n }\n\n const token = response.headers.get('set-auth-token')?.trim();\n if (response.ok && token) return token;\n\n const payload = await readResponseJson(response);\n throw new CliError({\n message:\n errorMessageFromJson(payload) ??\n `Sign-in failed (${response.status}). Check your email and password.`\n });\n}\n\nexport async function runInteractiveAuthLogin({\n backendUrl,\n passwordCredentialTarget = 'session_bearer'\n}: {\n backendUrl: string;\n passwordCredentialTarget?: PasswordLoginCredentialTarget;\n}): Promise<AuthLoginResult> {\n const method = await promptAuthMethod();\n const normalizedBackendUrl = normalizeBaseUrl(backendUrl);\n const { authCredentialsPath } = await import('./auth-credentials.js');\n\n if (method === 'user_token') {\n const token = await promptLine({ message: 'Paste your USER_TOKEN' });\n return loginWithUserToken({ backendUrl: normalizedBackendUrl, token });\n }\n\n const email = await promptLine({ message: 'Email' });\n const emailError = validateEmail(email);\n if (emailError) throw new CliError({ message: emailError });\n\n const password = await promptPassword({ message: 'Password' });\n const sessionToken = await signInWithEmailPassword({\n backendUrl: normalizedBackendUrl,\n email,\n password\n });\n await validateBearerToken({ backendUrl: normalizedBackendUrl, token: sessionToken });\n\n if (passwordCredentialTarget === 'full_user_token') {\n const userToken = await createFullUserTokenFromSession({\n backendUrl: normalizedBackendUrl,\n sessionToken\n });\n await validateBearerToken({ backendUrl: normalizedBackendUrl, token: userToken });\n writeStoredAuthCredentials({\n type: 'user_token',\n token: userToken,\n backendUrl: normalizedBackendUrl\n });\n\n return {\n ok: true,\n authMethod: 'password',\n credentialType: 'user_token',\n backendUrl: normalizedBackendUrl,\n credentialsPath: authCredentialsPath()\n };\n }\n\n writeStoredAuthCredentials({\n type: 'session_bearer',\n token: sessionToken,\n backendUrl: normalizedBackendUrl\n });\n\n return {\n ok: true,\n authMethod: 'password',\n credentialType: 'session_bearer',\n backendUrl: normalizedBackendUrl,\n credentialsPath: authCredentialsPath()\n };\n}\n", "import {\n authCredentialsPath,\n type AuthCredentialType,\n readStoredAuthCredentials,\n resolveAuthBearerToken\n} from './auth-credentials.js';\nimport { validateBearerToken } from './auth-login.js';\nimport {\n type BackendMode,\n findEffectiveConfigPath,\n hasExplicitBackendConfig,\n loadConfig,\n resolveBackendUrl\n} from './config.js';\n\nexport type AuthCredentialSource = 'environment' | 'stored' | 'stored_mismatch' | 'none';\n\nexport type AuthStatusResult = {\n backendUrl: string;\n backendMode: BackendMode | 'unset';\n configPath: string | null;\n loggedIn: boolean;\n credentialSource: AuthCredentialSource;\n credentialType: AuthCredentialType | null;\n credentialsPath: string | null;\n validationError: string | null;\n};\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nfunction inferCredentialTypeFromToken(token: string): AuthCredentialType {\n return token.startsWith('out_') ? 'user_token' : 'session_bearer';\n}\n\nexport function resolveAuthCredentialSource({\n backendUrl,\n env = process.env\n}: {\n backendUrl: string;\n env?: NodeJS.ProcessEnv;\n}): {\n source: AuthCredentialSource;\n type: AuthCredentialType | null;\n credentialsPath: string | null;\n} {\n const fromEnv =\n env.OVERLORD_USER_TOKEN?.trim() || env.OVLD_USER_TOKEN?.trim() || env.USER_TOKEN?.trim();\n if (fromEnv) {\n return {\n source: 'environment',\n type: inferCredentialTypeFromToken(fromEnv),\n credentialsPath: null\n };\n }\n\n const stored = readStoredAuthCredentials();\n if (!stored) {\n return { source: 'none', type: null, credentialsPath: null };\n }\n\n const credentialsPath = authCredentialsPath();\n if (normalizeBaseUrl(stored.backendUrl) !== normalizeBaseUrl(backendUrl)) {\n return {\n source: 'stored_mismatch',\n type: stored.type,\n credentialsPath\n };\n }\n\n return {\n source: 'stored',\n type: stored.type,\n credentialsPath\n };\n}\n\nexport async function resolveAuthStatus({\n env = process.env\n}: {\n env?: NodeJS.ProcessEnv;\n} = {}): Promise<AuthStatusResult> {\n const config = loadConfig();\n const backendUrl = resolveBackendUrl(config);\n const backendMode = hasExplicitBackendConfig(config) ? config.backendMode : 'unset';\n const configPath = findEffectiveConfigPath();\n const credential = resolveAuthCredentialSource({ backendUrl, env });\n const token = resolveAuthBearerToken({ backendUrl, env });\n\n if (!token) {\n return {\n backendUrl,\n backendMode,\n configPath,\n loggedIn: false,\n credentialSource: credential.source,\n credentialType: credential.type,\n credentialsPath: credential.credentialsPath,\n validationError:\n credential.source === 'stored_mismatch'\n ? `Stored credentials are for ${readStoredAuthCredentials()?.backendUrl ?? 'another backend'}.`\n : null\n };\n }\n\n try {\n await validateBearerToken({ backendUrl, token });\n return {\n backendUrl,\n backendMode,\n configPath,\n loggedIn: true,\n credentialSource: credential.source,\n credentialType: credential.type,\n credentialsPath: credential.credentialsPath,\n validationError: null\n };\n } catch (error) {\n return {\n backendUrl,\n backendMode,\n configPath,\n loggedIn: false,\n credentialSource: credential.source,\n credentialType: credential.type,\n credentialsPath: credential.credentialsPath,\n validationError: error instanceof Error ? error.message : String(error)\n };\n }\n}\n", "/** Native agent binary names by connector key, for PATH detection and launch. */\nconst AGENT_BINARIES: Record<string, string> = {\n claude: 'claude',\n codex: 'codex',\n cursor: 'agent'\n};\n\n/** Map a connector agent key to the executable invoked at launch time. */\nexport function resolveAgentBinary(agentKey: string): string {\n return AGENT_BINARIES[agentKey] ?? agentKey;\n}\n", "import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { resolveRepoPath } from './config.js';\nimport { CliError } from './errors.js';\n\n/** Marker in adapter skill templates where connector core body is interpolated. */\nexport const CONNECTOR_CORE_MARKER = '<!-- @connector-core -->';\n\nexport const CONNECTOR_CORE_SKILL_RELATIVE_PATH = 'skills/overlord-mission/SKILL.md';\nexport const CONNECTOR_CORE_REFERENCE_PREFIX = 'skills/overlord-mission/reference/';\n\n/**\n * Locate `connectors/core/overlord-mission`. The CLI package ships a copy under\n * `dist/connectors`, but source checkouts and development overrides are also\n * supported.\n */\nexport function connectorCoreRoot(): string {\n const override = process.env.OVERLORD_CONNECTORS_DIR;\n if (override) {\n const candidate = path.join(path.dirname(override), 'core', 'overlord-mission');\n if (existsSync(candidate)) return candidate;\n }\n\n const packaged = path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n 'connectors',\n 'core',\n 'overlord-mission'\n );\n if (existsSync(packaged)) return packaged;\n\n let dir = process.cwd();\n while (true) {\n const candidate = path.join(dir, 'connectors', 'core', 'overlord-mission');\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return resolveRepoPath('connectors/core/overlord-mission');\n}\n\nexport function isConnectorCoreSkillPath(relativePath: string): boolean {\n return relativePath === CONNECTOR_CORE_SKILL_RELATIVE_PATH;\n}\n\nexport function isConnectorCoreReferencePath(relativePath: string): boolean {\n return (\n relativePath.startsWith(CONNECTOR_CORE_REFERENCE_PREFIX) &&\n relativePath.endsWith('.md') &&\n !relativePath.includes('..')\n );\n}\n\nexport function stripMarkdownFrontmatter(text: string): string {\n if (!text.startsWith('---\\n')) return text;\n const end = text.indexOf('\\n---\\n', 4);\n if (end < 0) return text;\n return text.slice(end + 5);\n}\n\nexport function readConnectorCoreSkillBody(coreRoot = connectorCoreRoot()): string {\n const coreSkillPath = path.join(coreRoot, 'SKILL.md');\n if (!existsSync(coreSkillPath)) {\n throw new CliError({\n message: `Connector core skill missing at ${coreSkillPath}.`\n });\n }\n return stripMarkdownFrontmatter(readFileSync(coreSkillPath, 'utf8')).trim();\n}\n\nexport function renderConnectorSkill({\n adapterTemplate,\n coreRoot = connectorCoreRoot()\n}: {\n adapterTemplate: string;\n coreRoot?: string;\n}): string {\n if (!adapterTemplate.includes(CONNECTOR_CORE_MARKER)) {\n throw new CliError({\n message:\n `Adapter skill template is missing ${CONNECTOR_CORE_MARKER}. ` +\n `Add the marker where connector core content should be interpolated.`\n });\n }\n\n const coreBody = readConnectorCoreSkillBody(coreRoot);\n const rendered = adapterTemplate.replace(CONNECTOR_CORE_MARKER, coreBody).trimEnd();\n return `${rendered}\\n`;\n}\n\nexport function readConnectorCoreReference({\n relativePath,\n coreRoot = connectorCoreRoot()\n}: {\n relativePath: string;\n coreRoot?: string;\n}): Buffer {\n if (!isConnectorCoreReferencePath(relativePath)) {\n throw new CliError({\n message: `Not a connector core reference path: ${relativePath}`\n });\n }\n\n const referencePath = path.join(coreRoot, 'reference', path.basename(relativePath));\n if (!existsSync(referencePath)) {\n throw new CliError({\n message: `Connector core reference missing at ${referencePath}.`\n });\n }\n return readFileSync(referencePath);\n}\n\nexport function managedFileSourceExists({\n sourceDir,\n relativePath,\n coreRoot = connectorCoreRoot()\n}: {\n sourceDir: string;\n relativePath: string;\n coreRoot?: string;\n}): boolean {\n if (isConnectorCoreReferencePath(relativePath)) {\n return existsSync(path.join(coreRoot, 'reference', path.basename(relativePath)));\n }\n return existsSync(path.join(sourceDir, relativePath));\n}\n\nexport function resolveManagedFileContents({\n sourceDir,\n relativePath,\n coreRoot = connectorCoreRoot()\n}: {\n sourceDir: string;\n relativePath: string;\n coreRoot?: string;\n}): Buffer {\n if (isConnectorCoreReferencePath(relativePath)) {\n return readConnectorCoreReference({ relativePath, coreRoot });\n }\n\n if (isConnectorCoreSkillPath(relativePath)) {\n const templatePath = path.join(sourceDir, relativePath);\n if (!existsSync(templatePath)) {\n throw new CliError({\n message: `Adapter skill template missing at ${templatePath}.`\n });\n }\n const rendered = renderConnectorSkill({\n adapterTemplate: readFileSync(templatePath, 'utf8'),\n coreRoot\n });\n return Buffer.from(rendered, 'utf8');\n }\n\n const sourcePath = path.join(sourceDir, relativePath);\n if (!existsSync(sourcePath)) {\n throw new CliError({\n message: `Declared managed file missing from connector source: ${relativePath}`\n });\n }\n return readFileSync(sourcePath);\n}\n", "import { spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n rmSync,\n statSync,\n writeFileSync\n} from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { resolveAgentBinary } from './agent-binaries.js';\nimport { resolveRepoPath } from './config.js';\nimport { managedFileSourceExists, resolveManagedFileContents } from './connector-core-render.js';\nimport { CliError } from './errors.js';\n\n/**\n * Connector setup/doctor for the Connector Layer (see CONTRACT.md \u2192 Connector\n * Layer). `ovld agent-setup <agent>` materializes a connector adapter's declared\n * `managedFiles` into the agent's native plugin install path. Adapter skill\n * templates and reference paths under `skills/overlord-mission/` are rendered from\n * `connectors/core/overlord-mission/` at install time. Setup records a local\n * install manifest so `ovld doctor` can detect stale, missing, or\n * modified files. Installs are idempotent and never touch files outside the\n * connector's own install path.\n */\n\nexport type ConnectorManifest = {\n contractVersion: string;\n componentType: string;\n componentKey: string;\n label?: string;\n description?: string;\n connector: {\n agentIdentifier: string;\n capabilities: string[];\n hookTypes: string[];\n installPath: string;\n managedFiles: string[];\n };\n};\n\nexport type ManagedFileResult = {\n path: string;\n action: 'written' | 'unchanged' | 'would-write';\n executable: boolean;\n};\n\nexport type SetupResult = {\n agentKey: string;\n agentIdentifier: string;\n installPath: string;\n contractVersion: string;\n files: ManagedFileResult[];\n binaryFound: boolean;\n binaryName: string;\n dryRun: boolean;\n warnings: string[];\n};\n\nexport type InstallState = {\n agentKey: string;\n agentIdentifier: string;\n contractVersion: string;\n installPath: string;\n installedAt: string;\n files: Array<{ path: string; sha256: string }>;\n};\n\nexport type ConnectorReport = {\n agentKey: string;\n installed: boolean;\n healthy: boolean;\n installPath: string;\n binaryName: string;\n binaryFound: boolean;\n staleContractVersion: boolean;\n problems: string[];\n};\n\nconst CURSOR_HOOK_COMMAND = 'plugins/local/overlord/hooks/overlord-user-prompt-submit.sh';\nconst CURSOR_PROTOCOL_PERMISSION = 'Shell(ovld protocol:*)';\nconst CODEX_PLUGIN_KEY = 'overlord@overlord-local';\nconst CODEX_RULES_START = '# overlord:permissions:start';\nconst CODEX_RULES_END = '# overlord:permissions:end';\nconst CLAUDE_MARKETPLACE_NAME = 'overlord-local';\nconst CLAUDE_PLUGIN_KEY = `overlord@${CLAUDE_MARKETPLACE_NAME}`;\n\n/**\n * Locate the connector adapter source tree. The CLI package ships a copy under\n * `dist/connectors`, but source checkouts and development overrides are also\n * supported.\n */\nfunction connectorsRoot(): string {\n const override = process.env.OVERLORD_CONNECTORS_DIR;\n if (override) return override;\n\n const packaged = path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n 'connectors',\n 'adapters'\n );\n if (existsSync(packaged)) return packaged;\n\n let dir = process.cwd();\n while (true) {\n const candidate = path.join(dir, 'connectors', 'adapters');\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return resolveRepoPath('connectors/adapters');\n}\n\nfunction connectorDir(agentKey: string): string {\n return path.join(connectorsRoot(), agentKey);\n}\n\nfunction manifestPath(agentKey: string): string {\n return path.join(connectorDir(agentKey), 'conformance-manifest.yaml');\n}\n\n/** List connector adapter keys that ship a conformance manifest on disk. */\nexport function listAvailableConnectors(): string[] {\n const root = connectorsRoot();\n if (!existsSync(root)) return [];\n return readdirSync(root, { withFileTypes: true })\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n .filter(name => existsSync(manifestPath(name)))\n .sort();\n}\n\n/**\n * Minimal YAML reader for connector conformance manifests. Supports the\n * constrained subset these manifests use: top-level scalars, one nested map\n * (`connector:`), and scalar sequences. It is intentionally not a general YAML\n * parser \u2014 manifests are controlled, contract-governed artifacts.\n */\nexport function parseConnectorManifestYaml(text: string): Record<string, unknown> {\n const root: Record<string, unknown> = {};\n type Frame = { indent: number; container: Record<string, unknown> | unknown[] };\n const stack: Frame[] = [{ indent: 0, container: root }];\n let pending: { parent: Record<string, unknown>; key: string; indent: number } | null = null;\n\n const parseScalar = (raw: string): string => {\n const value = raw.trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n };\n\n for (const rawLine of text.split('\\n')) {\n const line = rawLine.replace(/\\r$/, '');\n const trimmed = line.trim();\n if (trimmed === '' || trimmed.startsWith('#')) continue;\n const indent = line.length - line.trimStart().length;\n\n if (pending) {\n if (indent > pending.indent) {\n const container: Record<string, unknown> | unknown[] = trimmed.startsWith('- ') ? [] : {};\n pending.parent[pending.key] = container;\n stack.push({ indent, container });\n pending = null;\n } else {\n pending.parent[pending.key] = '';\n pending = null;\n }\n }\n\n while (stack.length > 1 && stack[stack.length - 1]!.indent > indent) {\n stack.pop();\n }\n const frame = stack[stack.length - 1]!;\n\n if (trimmed.startsWith('- ')) {\n if (Array.isArray(frame.container)) {\n frame.container.push(parseScalar(trimmed.slice(2)));\n }\n continue;\n }\n\n const colon = trimmed.indexOf(':');\n if (colon < 0 || Array.isArray(frame.container)) continue;\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n if (rest === '') {\n pending = { parent: frame.container, key, indent };\n } else {\n frame.container[key] = parseScalar(rest);\n }\n }\n\n return root;\n}\n\nexport function readConnectorManifest(agentKey: string): ConnectorManifest {\n const file = manifestPath(agentKey);\n if (!existsSync(file)) {\n throw new CliError({\n message:\n `Unknown connector: ${agentKey}\\n` +\n `Available connectors: ${listAvailableConnectors().join(', ') || '(none)'}`\n });\n }\n const parsed = parseConnectorManifestYaml(readFileSync(file, 'utf8'));\n const connector = (parsed.connector ?? {}) as Record<string, unknown>;\n const asList = (value: unknown): string[] =>\n Array.isArray(value) ? value.map(item => String(item)) : [];\n\n const installPath = String(connector.installPath ?? '');\n const managedFiles = asList(connector.managedFiles);\n if (!installPath || managedFiles.length === 0) {\n throw new CliError({\n message: `Connector manifest for ${agentKey} is missing installPath or managedFiles.`\n });\n }\n\n return {\n contractVersion: String(parsed.contractVersion ?? ''),\n componentType: String(parsed.componentType ?? ''),\n componentKey: String(parsed.componentKey ?? agentKey),\n label: parsed.label ? String(parsed.label) : undefined,\n description: parsed.description ? String(parsed.description) : undefined,\n connector: {\n agentIdentifier: String(connector.agentIdentifier ?? agentKey),\n capabilities: asList(connector.capabilities),\n hookTypes: asList(connector.hookTypes),\n installPath,\n managedFiles\n }\n };\n}\n\nexport function resolveHome(home?: string): string {\n return home ?? process.env.OVERLORD_HOME ?? os.homedir();\n}\n\n/** Expand a leading `~` in a manifest install path against the resolved home. */\nexport function expandInstallPath(installPath: string, home: string): string {\n if (installPath === '~') return home;\n if (installPath.startsWith('~/')) return path.join(home, installPath.slice(2));\n return installPath;\n}\n\nfunction installStatePath(agentKey: string, home: string): string {\n return path.join(home, '.ovld', 'connectors', `${agentKey}.json`);\n}\n\nfunction sha256(contents: Buffer | string): string {\n return createHash('sha256').update(contents).digest('hex');\n}\n\nfunction findOnPath(command: string): boolean {\n const pathEnv = process.env.PATH ?? '';\n for (const dir of pathEnv.split(path.delimiter)) {\n if (!dir) continue;\n const candidate = path.join(dir, command);\n try {\n if (statSync(candidate).isFile()) return true;\n } catch {\n // not here; keep looking\n }\n }\n return false;\n}\n\nfunction isExecutableManaged(relativePath: string): boolean {\n return relativePath.endsWith('.sh');\n}\n\nfunction readJsonObject(filePath: string): Record<string, unknown> | null {\n if (!existsSync(filePath)) return null;\n try {\n const parsed = JSON.parse(readFileSync(filePath, 'utf8')) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/** Merge Cursor harness hooks and permission rules without clobbering user settings. */\nfunction configureCursorHarness({\n home,\n dryRun = false\n}: {\n home: string;\n dryRun?: boolean;\n}): string[] {\n const warnings: string[] = [];\n const cursorDir = path.join(home, '.cursor');\n const hooksPath = path.join(cursorDir, 'hooks.json');\n const settingsPath = path.join(cursorDir, 'settings.json');\n\n const hooks =\n readJsonObject(hooksPath) ??\n ({\n version: 1,\n hooks: {}\n } as Record<string, unknown>);\n const hookRoot = hooks.hooks;\n const hookEntries =\n hookRoot && typeof hookRoot === 'object' && !Array.isArray(hookRoot)\n ? (hookRoot as Record<string, unknown>)\n : {};\n const beforeSubmit = Array.isArray(hookEntries.beforeSubmitPrompt)\n ? [...(hookEntries.beforeSubmitPrompt as unknown[])]\n : [];\n const alreadyInstalled = beforeSubmit.some(entry => {\n if (!entry || typeof entry !== 'object') return false;\n const command = (entry as Record<string, unknown>).command;\n return typeof command === 'string' && command.includes('overlord-user-prompt-submit');\n });\n if (!alreadyInstalled) {\n beforeSubmit.push({ command: CURSOR_HOOK_COMMAND });\n hookEntries.beforeSubmitPrompt = beforeSubmit;\n hooks.hooks = hookEntries;\n if (dryRun) {\n warnings.push(`Would merge beforeSubmitPrompt hook into ${hooksPath}.`);\n } else {\n mkdirSync(cursorDir, { recursive: true });\n writeFileSync(hooksPath, `${JSON.stringify(hooks, null, 2)}\\n`);\n }\n }\n\n const settings = readJsonObject(settingsPath) ?? {};\n const permissionsRoot = settings.permissions;\n const permissions =\n permissionsRoot && typeof permissionsRoot === 'object' && !Array.isArray(permissionsRoot)\n ? (permissionsRoot as Record<string, unknown>)\n : {};\n const allow = Array.isArray(permissions.allow) ? [...(permissions.allow as unknown[])] : [];\n if (!allow.includes(CURSOR_PROTOCOL_PERMISSION)) {\n allow.push(CURSOR_PROTOCOL_PERMISSION);\n permissions.allow = allow;\n settings.permissions = permissions;\n if (dryRun) {\n warnings.push(`Would add ${CURSOR_PROTOCOL_PERMISSION} to ${settingsPath}.`);\n } else {\n mkdirSync(cursorDir, { recursive: true });\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n }\n }\n\n return warnings;\n}\n\nfunction mergeCodexRules(existingContent: string): string {\n const managedBlock = [\n CODEX_RULES_START,\n 'prefix_rule(',\n ' pattern = [\"npx\", \"overlord\", \"protocol\"],',\n ' decision = \"allow\",',\n ' justification = \"Allow all Overlord protocol commands without prompts.\",',\n ')',\n '',\n 'prefix_rule(',\n ' pattern = [\"ovld\", \"protocol\"],',\n ' decision = \"allow\",',\n ' justification = \"Allow all Overlord protocol commands without prompts.\",',\n ')',\n CODEX_RULES_END\n ].join('\\n');\n\n const startIndex = existingContent.indexOf(CODEX_RULES_START);\n const endIndex = existingContent.indexOf(CODEX_RULES_END);\n if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {\n const before = existingContent.slice(0, startIndex).trimEnd();\n const after = existingContent.slice(endIndex + CODEX_RULES_END.length).trimStart();\n if (!before && !after) return `${managedBlock}\\n`;\n if (!before) return `${managedBlock}\\n\\n${after}`;\n if (!after) return `${before}\\n\\n${managedBlock}\\n`;\n return `${before}\\n\\n${managedBlock}\\n\\n${after}`;\n }\n\n const trimmed = existingContent.trimEnd();\n if (!trimmed) return `${managedBlock}\\n`;\n return `${trimmed}\\n\\n${managedBlock}\\n`;\n}\n\nfunction rewriteCodexHookCommands({\n hooks,\n eventName,\n targetCommand\n}: {\n hooks: Record<string, unknown>;\n eventName: string;\n targetCommand: string;\n}): void {\n const hookRoot = hooks.hooks;\n if (!hookRoot || typeof hookRoot !== 'object' || Array.isArray(hookRoot)) return;\n const groups = (hookRoot as Record<string, unknown>)[eventName];\n if (!Array.isArray(groups)) return;\n for (const group of groups) {\n if (!group || typeof group !== 'object') continue;\n const entries = (group as Record<string, unknown>).hooks;\n if (!Array.isArray(entries)) continue;\n for (const hook of entries) {\n if (\n hook &&\n typeof hook === 'object' &&\n (hook as Record<string, unknown>).type === 'command'\n ) {\n (hook as Record<string, unknown>).command = targetCommand;\n }\n }\n }\n}\n\n/** Merge Codex marketplace, rules, hook paths, and plugin enablement without clobbering user settings. */\nfunction configureCodexHarness({\n home,\n installPath,\n dryRun = false\n}: {\n home: string;\n installPath: string;\n dryRun?: boolean;\n}): string[] {\n const warnings: string[] = [];\n const marketplacePath = path.join(home, '.agents', 'plugins', 'marketplace.json');\n const rulesPath = path.join(home, '.codex', 'rules', 'default.rules');\n const legacyAgentsPath = path.join(home, '.codex', 'AGENTS.md');\n const hooksPath = path.join(installPath, '.codex-plugin', 'hooks.json');\n const userPromptHook = path.join(installPath, 'scripts', 'user-prompt-submit-hook.sh');\n const permissionHook = path.join(installPath, 'scripts', 'permission-hook.sh');\n\n const currentMarketplace = readJsonObject(marketplacePath) ?? {\n name: 'overlord-local',\n interface: { displayName: 'Overlord Local Plugins' },\n plugins: []\n };\n const nextPlugins = Array.isArray(currentMarketplace.plugins)\n ? [...(currentMarketplace.plugins as unknown[])]\n : [];\n const entry = {\n name: 'overlord',\n source: { source: 'local', path: './.codex/plugins/overlord' },\n policy: { installation: 'AVAILABLE', authentication: 'ON_INSTALL' },\n category: 'Productivity'\n };\n const existingIndex = nextPlugins.findIndex(\n plugin =>\n plugin &&\n typeof plugin === 'object' &&\n (plugin as Record<string, unknown>).name === 'overlord'\n );\n if (existingIndex === -1) nextPlugins.push(entry);\n else nextPlugins[existingIndex] = entry;\n\n if (dryRun) {\n warnings.push(`Would update Codex marketplace at ${marketplacePath}.`);\n warnings.push(`Would merge protocol permission rules into ${rulesPath}.`);\n warnings.push(`Would rewrite Codex hook commands in ${hooksPath}.`);\n if (existsSync(legacyAgentsPath)) {\n warnings.push(`Would remove legacy Codex bundle at ${legacyAgentsPath}.`);\n }\n warnings.push(\n `Would run \\`codex plugin add ${CODEX_PLUGIN_KEY}\\` when the Codex CLI is available.`\n );\n return warnings;\n }\n\n mkdirSync(path.dirname(marketplacePath), { recursive: true });\n writeFileSync(\n marketplacePath,\n `${JSON.stringify(\n {\n name: currentMarketplace.name ?? 'overlord-local',\n interface: {\n displayName:\n (currentMarketplace.interface as Record<string, unknown> | undefined)?.displayName ??\n 'Overlord Local Plugins'\n },\n plugins: nextPlugins\n },\n null,\n 2\n )}\\n`\n );\n\n const existingRules = existsSync(rulesPath) ? readFileSync(rulesPath, 'utf8') : '';\n mkdirSync(path.dirname(rulesPath), { recursive: true });\n writeFileSync(rulesPath, mergeCodexRules(existingRules));\n\n const hooks = readJsonObject(hooksPath);\n if (hooks) {\n rewriteCodexHookCommands({\n hooks,\n eventName: 'PermissionRequest',\n targetCommand: permissionHook\n });\n rewriteCodexHookCommands({\n hooks,\n eventName: 'UserPromptSubmit',\n targetCommand: userPromptHook\n });\n writeFileSync(hooksPath, `${JSON.stringify(hooks, null, 2)}\\n`);\n } else {\n warnings.push(`Codex hook manifest missing or invalid at ${hooksPath}.`);\n }\n\n if (existsSync(legacyAgentsPath)) {\n rmSync(legacyAgentsPath, { force: true });\n }\n\n const codexAdd = spawnSync('codex', ['plugin', 'add', CODEX_PLUGIN_KEY], {\n encoding: 'utf8',\n timeout: 30_000\n });\n if (codexAdd.error && (codexAdd.error as NodeJS.ErrnoException).code === 'ENOENT') {\n warnings.push(\n `Codex CLI not found on PATH \u2014 wrote the marketplace but could not install the plugin. ` +\n `Run \\`codex plugin add ${CODEX_PLUGIN_KEY}\\` once Codex is installed.`\n );\n } else if (codexAdd.status !== 0) {\n const output = `${codexAdd.stdout ?? ''}${codexAdd.stderr ?? ''}`;\n if (/already/i.test(output)) {\n return warnings;\n }\n warnings.push(\n `Could not install the Codex plugin via the Codex CLI. Re-run \\`ovld agent-setup codex\\` to retry.`\n );\n }\n\n return warnings;\n}\n\n/**\n * Register the Overlord plugin with Claude Code. Unlike Cursor and Codex, Claude\n * Code never auto-discovers a plugin merely dropped into `~/.claude/plugins`; it\n * only loads plugins published through a registered marketplace. So we build a\n * local marketplace whose single plugin entry points at the freshly-installed\n * plugin tree (`installPath`), then drive the Claude CLI to add the marketplace\n * and install + enable the plugin. The CLI writes the same files (`config dir`'s\n * `known_marketplaces.json`, `installed_plugins.json`, and `enabledPlugins` in\n * `settings.json`) it would on an interactive `/plugin install`, so the result\n * is identical to a hand-installed plugin.\n *\n * `installPath` ends in `plugins/overlord`; its grandparent is the marketplace\n * root that holds `.claude-plugin/marketplace.json`. The plugin `source` must be\n * a path relative to that root \u2014 Claude rejects absolute sources.\n */\nfunction configureClaudeHarness({\n home,\n installPath,\n dryRun = false\n}: {\n home: string;\n installPath: string;\n dryRun?: boolean;\n}): string[] {\n const warnings: string[] = [];\n const marketplaceRoot = path.dirname(path.dirname(installPath));\n const marketplacePath = path.join(marketplaceRoot, '.claude-plugin', 'marketplace.json');\n const relativeSource = `./${path.relative(marketplaceRoot, installPath).split(path.sep).join('/')}`;\n const configDir = path.join(home, '.claude');\n\n const marketplace = {\n name: CLAUDE_MARKETPLACE_NAME,\n owner: { name: 'Cooperativ' },\n metadata: { description: 'Overlord local plugin marketplace.' },\n plugins: [\n {\n name: 'overlord',\n source: relativeSource,\n description: 'Overlord mission protocol workflow for Claude Code.'\n }\n ]\n };\n\n if (dryRun) {\n warnings.push(`Would write Claude marketplace manifest at ${marketplacePath}.`);\n warnings.push(\n `Would run \\`claude plugin marketplace add\\` and \\`claude plugin install ${CLAUDE_PLUGIN_KEY}\\` ` +\n `when the Claude CLI is available.`\n );\n return warnings;\n }\n\n mkdirSync(path.dirname(marketplacePath), { recursive: true });\n writeFileSync(marketplacePath, `${JSON.stringify(marketplace, null, 2)}\\n`);\n\n const runClaude = (args: string[]): ReturnType<typeof spawnSync> =>\n spawnSync('claude', args, {\n encoding: 'utf8',\n timeout: 60_000,\n // Pin the CLI to the same home we installed into so the marketplace and\n // plugin land in this home's config dir rather than the caller's real one.\n env: { ...process.env, CLAUDE_CONFIG_DIR: configDir }\n });\n\n const add = runClaude(['plugin', 'marketplace', 'add', marketplaceRoot]);\n if (add.error && (add.error as NodeJS.ErrnoException).code === 'ENOENT') {\n warnings.push(\n `Claude CLI not found on PATH \u2014 wrote the marketplace but could not install the plugin. ` +\n `Run \\`claude plugin marketplace add ${marketplaceRoot}\\` then ` +\n `\\`claude plugin install ${CLAUDE_PLUGIN_KEY}\\` once Claude Code is installed.`\n );\n return warnings;\n }\n // `marketplace add` fails when the marketplace already exists; refresh it from\n // source instead so re-running `ovld agent-setup claude` picks up plugin changes.\n if (add.status !== 0) {\n const output = `${add.stdout ?? ''}${add.stderr ?? ''}`;\n if (/already|exists/i.test(output)) {\n runClaude(['plugin', 'marketplace', 'update', CLAUDE_MARKETPLACE_NAME]);\n } else {\n warnings.push(\n `Could not register the Claude marketplace. Re-run \\`ovld agent-setup claude\\` to retry.`\n );\n return warnings;\n }\n }\n\n const install = runClaude(['plugin', 'install', CLAUDE_PLUGIN_KEY, '--scope', 'user']);\n if (install.status !== 0) {\n const output = `${install.stdout ?? ''}${install.stderr ?? ''}`;\n if (/already/i.test(output)) {\n // Already installed \u2014 refresh the cached copy so file edits take effect.\n runClaude(['plugin', 'update', CLAUDE_PLUGIN_KEY]);\n } else {\n warnings.push(\n `Could not install the Claude plugin via the Claude CLI. Re-run \\`ovld agent-setup claude\\` to retry.`\n );\n }\n }\n\n return warnings;\n}\n\nexport function setupConnector({\n agentKey,\n home,\n dryRun = false\n}: {\n agentKey: string;\n home?: string;\n dryRun?: boolean;\n}): SetupResult {\n const manifest = readConnectorManifest(agentKey);\n const resolvedHome = resolveHome(home);\n const installPath = expandInstallPath(manifest.connector.installPath, resolvedHome);\n const sourceDir = connectorDir(agentKey);\n const warnings: string[] = [];\n\n const files: ManagedFileResult[] = [];\n const stateFiles: Array<{ path: string; sha256: string }> = [];\n\n for (const relativePath of manifest.connector.managedFiles) {\n if (!managedFileSourceExists({ sourceDir, relativePath })) {\n warnings.push(`Declared managed file missing from connector source: ${relativePath}`);\n continue;\n }\n\n let contents: Buffer;\n try {\n contents = resolveManagedFileContents({ sourceDir, relativePath });\n } catch (error) {\n const message = error instanceof CliError ? error.message : String(error);\n warnings.push(message);\n continue;\n }\n const target = path.join(installPath, relativePath);\n const executable = isExecutableManaged(relativePath);\n\n const targetExists = existsSync(target);\n const unchanged = targetExists && sha256(readFileSync(target)) === sha256(contents);\n\n if (dryRun) {\n files.push({\n path: relativePath,\n action: unchanged ? 'unchanged' : 'would-write',\n executable\n });\n } else {\n if (!unchanged) {\n mkdirSync(path.dirname(target), { recursive: true });\n writeFileSync(target, contents);\n }\n if (executable) {\n chmodSync(target, 0o755);\n }\n files.push({ path: relativePath, action: unchanged ? 'unchanged' : 'written', executable });\n }\n if (!dryRun) {\n stateFiles.push({ path: relativePath, sha256: sha256(contents) });\n }\n }\n\n const binaryName = resolveAgentBinary(agentKey);\n const binaryFound = findOnPath(binaryName);\n if (!binaryFound) {\n warnings.push(\n `Agent binary \"${binaryName}\" not found on PATH. The connector is installed; ` +\n `install ${binaryName} to launch this agent.`\n );\n }\n\n if (agentKey === 'cursor') {\n warnings.push(...configureCursorHarness({ home: resolvedHome, dryRun }));\n }\n\n if (agentKey === 'codex') {\n warnings.push(...configureCodexHarness({ home: resolvedHome, installPath, dryRun }));\n }\n\n if (agentKey === 'claude') {\n warnings.push(...configureClaudeHarness({ home: resolvedHome, installPath, dryRun }));\n }\n\n if (!dryRun) {\n const installedStateFiles = manifest.connector.managedFiles\n .map(relativePath => {\n const target = path.join(installPath, relativePath);\n if (!existsSync(target)) return null;\n return { path: relativePath, sha256: sha256(readFileSync(target)) };\n })\n .filter((entry): entry is { path: string; sha256: string } => entry !== null);\n\n const state: InstallState = {\n agentKey,\n agentIdentifier: manifest.connector.agentIdentifier,\n contractVersion: manifest.contractVersion,\n installPath,\n installedAt: new Date().toISOString(),\n files: installedStateFiles\n };\n const statePath = installStatePath(agentKey, resolvedHome);\n mkdirSync(path.dirname(statePath), { recursive: true });\n writeFileSync(statePath, `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n return {\n agentKey,\n agentIdentifier: manifest.connector.agentIdentifier,\n installPath,\n contractVersion: manifest.contractVersion,\n files,\n binaryFound,\n binaryName,\n dryRun,\n warnings\n };\n}\n\nexport function setupAllConnectors({\n home,\n dryRun = false\n}: {\n home?: string;\n dryRun?: boolean;\n}): SetupResult[] {\n const agents = listAvailableConnectors();\n if (agents.length === 0) {\n throw new CliError({ message: 'No connector adapters found under connectors/adapters.' });\n }\n return agents.map(agentKey => setupConnector({ agentKey, home, dryRun }));\n}\n\nfunction readInstallState(agentKey: string, home: string): InstallState | null {\n const statePath = installStatePath(agentKey, home);\n if (!existsSync(statePath)) return null;\n try {\n return JSON.parse(readFileSync(statePath, 'utf8')) as InstallState;\n } catch {\n return null;\n }\n}\n\n/** Inspect one connector's local install for `ovld doctor`. */\nexport function inspectConnector({\n agentKey,\n home\n}: {\n agentKey: string;\n home?: string;\n}): ConnectorReport {\n const resolvedHome = resolveHome(home);\n const manifest = readConnectorManifest(agentKey);\n const binaryName = resolveAgentBinary(agentKey);\n const binaryFound = findOnPath(binaryName);\n const state = readInstallState(agentKey, resolvedHome);\n\n if (!state) {\n return {\n agentKey,\n installed: false,\n healthy: false,\n installPath: expandInstallPath(manifest.connector.installPath, resolvedHome),\n binaryName,\n binaryFound,\n staleContractVersion: false,\n problems: []\n };\n }\n\n const problems: string[] = [];\n const staleContractVersion = state.contractVersion !== manifest.contractVersion;\n if (staleContractVersion) {\n problems.push(\n `Installed against contract ${state.contractVersion}; connector now declares ` +\n `${manifest.contractVersion}. Re-run \\`ovld agent-setup ${agentKey}\\`.`\n );\n }\n\n const declared = new Set(manifest.connector.managedFiles);\n for (const relativePath of manifest.connector.managedFiles) {\n const target = path.join(state.installPath, relativePath);\n if (!existsSync(target)) {\n problems.push(`Missing managed file: ${relativePath}`);\n continue;\n }\n const recorded = state.files.find(file => file.path === relativePath);\n const actual = sha256(readFileSync(target));\n const expected = recorded?.sha256;\n if (expected && actual !== expected) {\n problems.push(`Modified or stale managed file: ${relativePath}`);\n }\n }\n for (const recorded of state.files) {\n if (!declared.has(recorded.path)) {\n problems.push(`Undeclared managed file recorded in install state: ${recorded.path}`);\n }\n }\n\n return {\n agentKey,\n installed: true,\n healthy: problems.length === 0,\n installPath: state.installPath,\n binaryName,\n binaryFound,\n staleContractVersion,\n problems\n };\n}\n", "import { createHash } from 'node:crypto';\n\nexport type DeviceIdentity = {\n deviceFingerprint: string;\n deviceLabel: string;\n devicePlatform: string;\n};\n\n/** Optional-label variant used on REST bodies and service context. */\nexport type ClientDeviceIdentity = {\n deviceFingerprint: string;\n deviceLabel?: string | null;\n devicePlatform?: string | null;\n};\n\n/** Stable fingerprint from a device label + platform pair (CLI, desktop, runners). */\nexport function computeDeviceFingerprint({\n deviceLabel,\n devicePlatform\n}: {\n deviceLabel: string;\n devicePlatform: string;\n}): string {\n return createHash('sha256').update(`${deviceLabel}:${devicePlatform}`).digest('hex').slice(0, 32);\n}\n\nexport function deviceIdentityFromParts({\n deviceLabel,\n devicePlatform\n}: {\n deviceLabel: string;\n devicePlatform: string;\n}): DeviceIdentity {\n return {\n deviceLabel,\n devicePlatform,\n deviceFingerprint: computeDeviceFingerprint({ deviceLabel, devicePlatform })\n };\n}\n", "import { deviceIdentityFromParts } from '@overlord/core/service/device-identity';\nimport { hostname, platform } from 'node:os';\n\n/** Stable device identity for the machine running the CLI (matches core `devices.ts`). */\nexport function clientDeviceIdentity(): {\n deviceFingerprint: string;\n deviceLabel: string;\n devicePlatform: string;\n} {\n return deviceIdentityFromParts({\n deviceLabel: hostname(),\n devicePlatform: platform()\n });\n}\n", "import { clearStoredAuthCredentials, readStoredAuthCredentials } from './auth-credentials.js';\nimport { loadConfig, resolveBackendUrl } from './config.js';\nimport { clientDeviceIdentity } from './device-identity.js';\nimport { CliError } from './errors.js';\n\nexport type BackendClient = {\n baseUrl: string;\n health: () => Promise<{ ok: boolean; [key: string]: unknown }>;\n get: <T>(path: string) => Promise<T>;\n post: <T>({ path, body }: { path: string; body?: unknown }) => Promise<T>;\n patch: <T>({ path, body }: { path: string; body?: unknown }) => Promise<T>;\n delete: <T>(path: string) => Promise<T>;\n /**\n * Upload raw bytes (e.g. an image file), mirroring the web client's\n * `api.uploadImage`: the body rides as-is (no JSON encoding) and the\n * filename travels in a header since the server parses it without\n * multipart support.\n */\n postRaw: <T>({\n path,\n body,\n contentType,\n filename\n }: {\n path: string;\n body: Buffer;\n contentType?: string;\n filename: string;\n }) => Promise<T>;\n};\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nfunction resolveAuthHeaders({ baseUrl }: { baseUrl: string }): {\n headers: Record<string, string>;\n fromStored: boolean;\n} {\n const fromEnv =\n process.env.OVERLORD_USER_TOKEN?.trim() ||\n process.env.OVLD_USER_TOKEN?.trim() ||\n process.env.USER_TOKEN?.trim();\n if (fromEnv) {\n return { headers: { Authorization: `Bearer ${fromEnv}` }, fromStored: false };\n }\n\n const stored = readStoredAuthCredentials();\n if (!stored) return { headers: {}, fromStored: false };\n if (normalizeBaseUrl(stored.backendUrl) !== normalizeBaseUrl(baseUrl)) {\n return { headers: {}, fromStored: false };\n }\n\n return {\n headers: { Authorization: `Bearer ${stored.token}` },\n fromStored: true\n };\n}\n\nasync function readResponseJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\ntype MissingRationaleDetail = {\n filePath: string;\n classification: 'mine' | 'claimed' | 'unclaimed';\n suggestedSkip: { filePath: string; reason: string } | null;\n};\n\n/**\n * A `missing_rationale` error carries a structured `details.missingRationales`\n * payload so the retry is mechanical: paths needing a real rationale (`mine`) are\n * named, and every other path gets a ready-to-use `--skip-rationale-for-json`\n * entry the agent can paste verbatim instead of re-deriving attribution by hand.\n */\nfunction formatMissingRationaleDetails(details: unknown): string | null {\n if (!details || typeof details !== 'object') return null;\n const list = (details as Record<string, unknown>).missingRationales;\n if (!Array.isArray(list) || list.length === 0) return null;\n\n const entries = list as MissingRationaleDetail[];\n const lines = entries.map(entry => ` - ${entry.filePath} [${entry.classification}]`);\n const skips = entries\n .map(entry => entry.suggestedSkip)\n .filter((skip): skip is { filePath: string; reason: string } => skip !== null)\n .map(skip => ({ file_path: skip.filePath, reason: skip.reason }));\n\n const parts = [`Per-path classification:`, ...lines];\n if (skips.length > 0) {\n parts.push(\n `Ready-to-use skip JSON for non-'mine' paths (add --skip-rationale-for-json '${JSON.stringify(\n skips\n )}' to retry):`\n );\n }\n const mineOnly = entries.filter(entry => entry.classification === 'mine');\n if (mineOnly.length > 0) {\n parts.push(\n `Paths classified 'mine' need a real --change-rationales-json entry, not a skip: ${mineOnly\n .map(entry => entry.filePath)\n .join(', ')}`\n );\n }\n return parts.join('\\n');\n}\n\nfunction errorMessageFromJson(value: unknown): string | null {\n if (!value || typeof value !== 'object') return null;\n const record = value as Record<string, unknown>;\n const error =\n typeof record.error === 'string'\n ? record.error\n : typeof record.message === 'string'\n ? record.message\n : null;\n if (!error) return null;\n\n const parts = [error];\n const detail = typeof record.detail === 'string' ? record.detail.trim() : '';\n if (detail && detail !== error) parts.push(detail);\n const code = typeof record.code === 'string' ? record.code.trim() : '';\n if (code) parts.push(`(${code})`);\n if (code === 'missing_rationale') {\n const structured = formatMissingRationaleDetails(record.details);\n if (structured) parts.push(`\\n${structured}`);\n }\n return parts.join(' \u2014 ');\n}\n\nexport function createBackendClient(): BackendClient {\n const baseUrl = normalizeBaseUrl(resolveBackendUrl(loadConfig()));\n const clientDevice = clientDeviceIdentity();\n\n async function request<T>({\n method,\n path,\n body,\n extraHeaders,\n rawBody\n }: {\n method: string;\n path: string;\n body?: unknown;\n extraHeaders?: Record<string, string>;\n rawBody?: Buffer;\n }): Promise<T> {\n const url = `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n const auth = resolveAuthHeaders({ baseUrl });\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers: {\n Accept: 'application/json',\n ...(rawBody === undefined && body !== undefined\n ? { 'Content-Type': 'application/json' }\n : {}),\n 'x-overlord-device-fingerprint': clientDevice.deviceFingerprint,\n 'x-overlord-device-label': clientDevice.deviceLabel,\n 'x-overlord-device-platform': clientDevice.devicePlatform,\n ...auth.headers,\n ...extraHeaders\n },\n body:\n rawBody !== undefined ? rawBody : body === undefined ? undefined : JSON.stringify(body)\n });\n } catch (error) {\n throw new CliError({\n message:\n `Could not reach Overlord backend at ${baseUrl}.\\n` +\n 'Start the Desktop/local backend or run `ovld config set cloud <url>`.\\n' +\n (error instanceof Error ? error.message : String(error))\n });\n }\n\n const payload = await readResponseJson(response);\n if (!response.ok) {\n if (response.status === 401 && auth.headers.Authorization) {\n if (auth.fromStored) clearStoredAuthCredentials();\n const detail =\n errorMessageFromJson(payload) ??\n `Backend request failed: ${method} ${path} (${response.status})`;\n throw new CliError({\n message:\n `${detail}\\n` +\n (auth.fromStored\n ? 'Saved credentials were cleared. Run `ovld auth login` to sign in again.'\n : 'Run `ovld auth login` or refresh your USER_TOKEN environment variable.')\n });\n }\n\n throw new CliError({\n message:\n errorMessageFromJson(payload) ??\n `Backend request failed: ${method} ${path} (${response.status})`\n });\n }\n return payload as T;\n }\n\n return {\n baseUrl,\n health: () => request({ method: 'GET', path: '/api/health' }),\n get: path => request({ method: 'GET', path }),\n post: ({ path, body }) => request({ method: 'POST', path, body }),\n patch: ({ path, body }) => request({ method: 'PATCH', path, body }),\n delete: path => request({ method: 'DELETE', path }),\n postRaw: ({ path, body, contentType, filename }) =>\n request({\n method: 'POST',\n path,\n rawBody: body,\n extraHeaders: {\n 'Content-Type': contentType || 'application/octet-stream',\n 'X-Upload-Filename': encodeURIComponent(filename)\n }\n })\n };\n}\n", "import { type BackendClient, createBackendClient } from './backend-client.js';\n\nexport type CliRuntime = {\n backend: BackendClient;\n close: () => void;\n};\n\nexport function openCliRuntime(): CliRuntime {\n const backend = createBackendClient();\n return {\n backend,\n close: () => {}\n };\n}\n", "import type { TerminalLaunchPlacement } from '@overlord/core/service/terminal-profile-types';\n\nexport type { TerminalLaunchPlacement } from '@overlord/core/service/terminal-profile-types';\n\nexport type ParsedTerminalChord = {\n modifiers: Array<'command' | 'control' | 'option' | 'shift'>;\n key: string;\n};\n\nconst MODIFIER_ALIASES: Record<string, ParsedTerminalChord['modifiers'][number]> = {\n cmd: 'command',\n command: 'command',\n meta: 'command',\n ctrl: 'control',\n control: 'control',\n alt: 'option',\n option: 'option',\n opt: 'option',\n shift: 'shift'\n};\n\nconst SPECIAL_KEYS: Record<string, string> = {\n enter: '\\r',\n return: '\\r',\n tab: '\\t',\n space: ' ',\n escape: '\\u001b',\n esc: '\\u001b',\n backspace: '\\u0008',\n delete: '\\u007f',\n up: '\\u001b[A',\n down: '\\u001b[B',\n left: '\\u001b[D',\n right: '\\u001b[C'\n};\n\n/** Parse a typed chord such as `cmd+d` or `ctrl+shift+\\\\`. */\nexport function parseTerminalLaunchChord(input: string): ParsedTerminalChord | null {\n const normalized = input.trim().toLowerCase();\n if (!normalized || /\\+\\+|^\\+|\\+$/.test(normalized)) return null;\n\n const parts = normalized\n .split('+')\n .map(part => part.trim())\n .filter(Boolean);\n if (parts.length === 0) return null;\n\n const modifiers: ParsedTerminalChord['modifiers'] = [];\n const keyParts: string[] = [];\n\n for (const part of parts) {\n const modifier = MODIFIER_ALIASES[part];\n if (modifier) {\n if (!modifiers.includes(modifier)) modifiers.push(modifier);\n continue;\n }\n keyParts.push(part);\n }\n\n if (keyParts.length !== 1) return null;\n\n const rawKey = keyParts[0] ?? '';\n const key =\n rawKey.length === 1\n ? rawKey\n : SPECIAL_KEYS[rawKey] !== undefined\n ? SPECIAL_KEYS[rawKey]\n : rawKey;\n\n if (!key) return null;\n return { modifiers, key };\n}\n\n/** Canonical display form for a parsed chord. */\nexport function formatTerminalLaunchChord(chord: ParsedTerminalChord): string {\n const modifierLabels = chord.modifiers.map(modifier => {\n switch (modifier) {\n case 'command':\n return 'cmd';\n case 'control':\n return 'ctrl';\n case 'option':\n return 'alt';\n case 'shift':\n return 'shift';\n }\n });\n\n const keyLabel =\n chord.key === '\\r'\n ? 'enter'\n : chord.key === '\\t'\n ? 'tab'\n : chord.key === ' '\n ? 'space'\n : chord.key.length === 1\n ? chord.key\n : 'key';\n\n return [...modifierLabels, keyLabel].join('+');\n}\n\n/** AppleScript `keystroke` modifier list for System Events. */\nexport function appleScriptKeystrokeClause(chord: ParsedTerminalChord): string {\n const modifierClause =\n chord.modifiers.length > 0\n ? ` using {${chord.modifiers.map(modifier => `${modifier} down`).join(', ')}}`\n : '';\n\n const keyLiteral =\n chord.key.length === 1 && chord.key !== '\\\\'\n ? JSON.stringify(chord.key)\n : JSON.stringify(chord.key);\n\n return `keystroke ${keyLiteral}${modifierClause}`;\n}\n\nexport function normalizeTerminalLaunchPlacement(\n value: string | undefined | null\n): TerminalLaunchPlacement {\n switch (value?.trim().toLowerCase()) {\n case 'tab':\n return 'tab';\n case 'chord':\n case 'split':\n case 'shortcut':\n return 'chord';\n default:\n return 'window';\n }\n}\n", "export type {\n TerminalLaunchPlacement,\n TerminalProfile\n} from '@overlord/core/service/terminal-profile-types';\nexport {\n DEFAULT_TERMINAL_PROFILE,\n EMPTY_TERMINAL_PROFILE,\n parseTerminalProfileJson,\n serializeTerminalProfile\n} from '@overlord/core/service/terminal-profile-types';\n", "import { existsSync, readFileSync } from 'node:fs';\nimport { parse } from 'smol-toml';\n\nimport type { BackendClient } from './backend-client.js';\nimport { findEffectiveConfigPath } from './config.js';\nimport { normalizeTerminalLaunchPlacement } from './terminal-launch-chord.js';\nimport {\n EMPTY_TERMINAL_PROFILE,\n parseTerminalProfileJson,\n type TerminalProfile\n} from './terminal-profile-types.js';\n\ntype LaunchSettingsResponse = {\n executionTargetId: string;\n deviceLabel: string;\n terminalProfile?: TerminalProfile;\n terminal_profile?: TerminalProfile;\n};\n\nfunction terminalProfileFromResponse(body: LaunchSettingsResponse): TerminalProfile {\n const profile = body.terminalProfile ?? body.terminal_profile;\n if (!profile) return { ...EMPTY_TERMINAL_PROFILE };\n return {\n launcher: profile.launcher ?? null,\n placement: profile.placement ?? 'window',\n chord: profile.chord ?? null\n };\n}\n\n/** Read deprecated terminal keys from overlord.toml for one-time migration during setup. */\nexport function readLegacyTerminalProfileFromToml(): TerminalProfile | null {\n const configPath = findEffectiveConfigPath();\n if (!configPath || !existsSync(configPath)) return null;\n\n const toml = parse(readFileSync(configPath, 'utf8')) as {\n terminal_launcher?: string;\n terminal_launch_placement?: string;\n terminal_launch_chord?: string;\n };\n\n const launcher = toml.terminal_launcher?.trim();\n if (!launcher) return null;\n\n return {\n launcher,\n placement: normalizeTerminalLaunchPlacement(toml.terminal_launch_placement),\n chord: toml.terminal_launch_chord?.trim() ? toml.terminal_launch_chord.trim() : null\n };\n}\n\nexport async function fetchTerminalProfile({\n backend\n}: {\n backend: BackendClient;\n}): Promise<TerminalProfile & { executionTargetId: string; deviceLabel: string }> {\n const response = await backend.get<LaunchSettingsResponse>('/api/launch-settings');\n const profile = terminalProfileFromResponse(response);\n return {\n ...profile,\n executionTargetId: response.executionTargetId,\n deviceLabel: response.deviceLabel\n };\n}\n\nexport async function saveTerminalProfile({\n backend,\n profile\n}: {\n backend: BackendClient;\n profile: TerminalProfile;\n}): Promise<TerminalProfile & { executionTargetId: string; deviceLabel: string }> {\n const response = await backend.patch<LaunchSettingsResponse>({\n path: '/api/launch-settings/terminal-profile',\n body: profile\n });\n const saved = terminalProfileFromResponse(response);\n return {\n ...saved,\n executionTargetId: response.executionTargetId,\n deviceLabel: response.deviceLabel\n };\n}\n\nexport function terminalProfileToLaunchSettings(profile: TerminalProfile): {\n terminalLauncher: string | null;\n terminalLaunchPlacement: TerminalProfile['placement'];\n terminalLaunchChord: string | null;\n} {\n return {\n terminalLauncher: profile.launcher,\n terminalLaunchPlacement: profile.placement,\n terminalLaunchChord: profile.chord\n };\n}\n\nexport { EMPTY_TERMINAL_PROFILE, parseTerminalProfileJson, type TerminalProfile };\n", "import { flagBoolean, flagValue, parseArgs } from './args.js';\nimport {\n type AuthLoginResult,\n isBackendReachabilityError,\n type PasswordLoginCredentialTarget,\n probeBackendReachability,\n runInteractiveAuthLogin\n} from './auth-login.js';\nimport { resolveAuthStatus } from './auth-status.js';\nimport {\n DEFAULT_LOCAL_BACKEND_URL,\n loadConfig,\n resolveConfigWritePath,\n writeConfig\n} from './config.js';\nimport {\n listAvailableConnectors,\n setupAllConnectors,\n setupConnector,\n type SetupResult\n} from './connectors.js';\nimport { CliError } from './errors.js';\nimport { printJson, printLine, printStepTitle } from './output.js';\nimport type { CliRuntime } from './runtime.js';\nimport { openCliRuntime } from './runtime.js';\nimport { parseTerminalLaunchChord, type TerminalLaunchPlacement } from './terminal-launch-chord.js';\nimport {\n fetchTerminalProfile,\n readLegacyTerminalProfileFromToml,\n saveTerminalProfile,\n type TerminalProfile\n} from './terminal-profile.js';\n\nconst DESKTOP_DOWNLOAD_URL =\n 'https://github.com/cooperativ-labs/OpenOverlord/releases/latest/download/';\n\nconst TERMINAL_OPTIONS = [\n { label: 'Terminal', launcher: 'Terminal' },\n { label: 'iTerm2', launcher: 'iTerm2' },\n { label: 'Ghostty', launcher: \"open -a 'Ghostty' --args\" },\n { label: 'Warp', launcher: \"open -a 'Warp' --args\" },\n { label: 'WezTerm', launcher: \"open -a 'WezTerm' --args\" },\n { label: 'Alacritty', launcher: \"open -a 'Alacritty' --args\" },\n { label: 'Kitty', launcher: \"open -a 'kitty' --args\" }\n] as const;\n\nfunction printHumanResult(result: SetupResult): void {\n const verb = result.dryRun ? 'Would install' : 'Installed';\n printLine(`${verb} connector \"${result.agentKey}\" \u2192 ${result.installPath}`);\n for (const file of result.files) {\n const marker = file.action === 'written' ? '+' : file.action === 'would-write' ? '~' : '=';\n printLine(` ${marker} ${file.path}${file.executable ? ' (executable)' : ''}`);\n }\n for (const warning of result.warnings) {\n printLine(` warn: ${warning}`);\n }\n}\n\nfunction isHttpUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value.trim());\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction launcherForApplicationName(appName: string): string {\n return `open -a ${shellQuote(appName.trim())} --args`;\n}\n\nasync function promptLine({\n message,\n defaultValue\n}: {\n message: string;\n defaultValue?: string;\n}): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new CliError({\n message:\n 'Interactive setup requires a TTY. Use `ovld config set ...` and `ovld agent-setup ...` for non-interactive setup.'\n });\n }\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n const answer = await rl.question(`${message}${suffix}: `);\n return answer.trim() || defaultValue || '';\n } finally {\n rl.close();\n }\n}\n\nasync function promptYesNo(message: string, defaultValue: boolean): Promise<boolean> {\n const answer = (\n await promptLine({ message, defaultValue: defaultValue ? 'Y' : 'N' })\n ).toLowerCase();\n if (['y', 'yes'].includes(answer)) return true;\n if (['n', 'no'].includes(answer)) return false;\n throw new CliError({ message: 'Answer yes or no.' });\n}\n\nasync function configureBackendForSetup(): Promise<{\n mode: 'local' | 'cloud';\n url: string;\n path: string;\n}> {\n const targetPath = resolveConfigWritePath();\n const current = loadConfig(targetPath);\n\n printStepTitle('Step 1: Choose the backend the CLI should use.');\n const type = (\n await promptLine({ message: 'Backend type (local/cloud)', defaultValue: current.backendMode })\n ).toLowerCase();\n\n if (type === 'cloud') {\n const cloudUrl = await promptLine({\n message: 'Cloud backend URL',\n defaultValue: current.backendMode === 'cloud' ? (current.backendUrl ?? undefined) : undefined\n });\n if (!cloudUrl) throw new CliError({ message: 'Cloud backend URL is required.' });\n if (!isHttpUrl(cloudUrl)) {\n throw new CliError({ message: 'Cloud backend must be an http:// or https:// URL.' });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'cloud', backendUrl: cloudUrl }\n });\n printLine(`Configured cloud backend at ${cloudUrl}.`);\n return { mode: 'cloud', url: cloudUrl, path: targetPath };\n }\n\n if (type !== 'local') {\n throw new CliError({ message: 'Backend type must be `local` or `cloud`.' });\n }\n\n const hasDesktop = await promptYesNo(\n 'Have you installed the Overlord Desktop app on this machine?',\n true\n );\n if (!hasDesktop) {\n printLine(`Download Overlord Desktop: ${DESKTOP_DOWNLOAD_URL}`);\n }\n const localUrl = await promptLine({\n message: 'Local backend URL',\n defaultValue: current.backendUrl ?? DEFAULT_LOCAL_BACKEND_URL\n });\n if (!isHttpUrl(localUrl)) {\n throw new CliError({ message: 'Local backend must be an http:// or https:// URL.' });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'local', backendUrl: localUrl }\n });\n printLine(`Configured local backend at ${localUrl}.`);\n return { mode: 'local', url: localUrl, path: targetPath };\n}\n\nasync function configureAuthForSetup({\n backendUrl,\n passwordCredentialTarget\n}: {\n backendUrl: string;\n passwordCredentialTarget: PasswordLoginCredentialTarget;\n}): Promise<AuthLoginResult> {\n printLine('');\n printStepTitle('Step 2: Authenticate with the backend.');\n\n const status = await resolveAuthStatus();\n if (status.loggedIn) {\n const methodLabel =\n status.credentialType === 'user_token' ? 'USER_TOKEN' : 'email and password';\n printLine(`Already authenticated with ${status.backendUrl} using ${methodLabel}.`);\n return {\n ok: true,\n authMethod: status.credentialType === 'user_token' ? 'user_token' : 'password',\n credentialType: status.credentialType ?? 'session_bearer',\n backendUrl: status.backendUrl,\n credentialsPath: status.credentialsPath ?? ''\n };\n }\n\n try {\n const login = await runInteractiveAuthLogin({ backendUrl, passwordCredentialTarget });\n const methodLabel = login.authMethod === 'user_token' ? 'USER_TOKEN' : 'email and password';\n printLine(`Authenticated with ${login.backendUrl} using ${methodLabel}.`);\n return login;\n } catch (error) {\n const reachability = await probeBackendReachability({ backendUrl });\n if (isBackendReachabilityError(error) || !reachability.reachable) {\n printLine('');\n printLine(\n `Warning: Could not reach the backend at ${backendUrl}. ` +\n 'Check that `backend_url` in overlord.toml is correct and the backend is running.'\n );\n if (reachability.error) {\n printLine(` ${reachability.error}`);\n }\n }\n throw error;\n }\n}\n\nfunction parseAgentSelection(input: string): string[] {\n const available = listAvailableConnectors();\n const normalized = input.trim().toLowerCase();\n if (!normalized || normalized === 'all') return available;\n if (normalized === 'none' || normalized === 'skip') return [];\n\n const selected = normalized\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n const invalid = selected.filter(agent => !available.includes(agent));\n if (invalid.length > 0) {\n throw new CliError({\n message: `Unknown connector(s): ${invalid.join(', ')}. Available: ${available.join(', ')}.`\n });\n }\n return selected;\n}\n\nasync function configureAgentsForSetup(): Promise<SetupResult[]> {\n const available = listAvailableConnectors();\n printLine('');\n printStepTitle('Step 3: Configure agent connectors.');\n printLine(`Available agents: ${available.join(', ')}`);\n const answer = await promptLine({\n message: 'Agents to configure (comma-separated, all, or none)',\n defaultValue: 'all'\n });\n const selected = parseAgentSelection(answer);\n const results = selected.map(agentKey => setupConnector({ agentKey }));\n for (const result of results) {\n printHumanResult(result);\n }\n if (results.length === 0) {\n printLine('Skipped agent connector setup.');\n }\n return results;\n}\n\nfunction isBuiltinTerminalLauncher(launcher: string): boolean {\n const normalized = launcher.trim().toLowerCase();\n return (\n normalized === 'iterm2' ||\n normalized === 'iterm' ||\n normalized === 'iterm.app' ||\n normalized === 'terminal' ||\n normalized === 'terminal.app' ||\n normalized === 'apple terminal'\n );\n}\n\nconst CHORD_PRESETS = [\n { label: 'cmd+d (vertical split)', chord: 'cmd+d' },\n { label: 'cmd+shift+d (horizontal split)', chord: 'cmd+shift+d' },\n { label: 'Custom shortcut', chord: null }\n] as const;\n\nasync function promptTerminalLaunchChord({\n defaultValue\n}: {\n defaultValue?: string | null;\n}): Promise<string> {\n printLine('');\n printLine('Choose a split-pane shortcut (type it \u2014 do not press the keys):');\n CHORD_PRESETS.forEach((preset, index) => {\n printLine(` ${index + 1}. ${preset.label}`);\n });\n\n const answer = await promptLine({\n message: 'Split shortcut preset',\n defaultValue: defaultValue ? 'current' : '1'\n });\n const normalized = answer.trim().toLowerCase();\n\n if (normalized === 'current' && defaultValue) {\n return defaultValue;\n }\n\n const selectedIndex = Number.parseInt(answer, 10);\n const preset =\n Number.isNaN(selectedIndex) || selectedIndex < 1 || selectedIndex > CHORD_PRESETS.length\n ? CHORD_PRESETS.find(entry => entry.label.toLowerCase().includes(normalized))\n : CHORD_PRESETS[selectedIndex - 1];\n\n if (preset?.chord) {\n return preset.chord;\n }\n\n const typed = await promptLine({\n message: 'Split shortcut (type, e.g. cmd+d)',\n defaultValue: defaultValue ?? undefined\n });\n if (!typed.trim()) {\n throw new CliError({ message: 'Split shortcut is required for split-pane launches.' });\n }\n if (!parseTerminalLaunchChord(typed)) {\n throw new CliError({\n message: 'Invalid shortcut. Use forms like cmd+d, ctrl+shift+d, or alt+enter.'\n });\n }\n return typed.trim();\n}\n\nasync function configureTerminalPlacementForSetup({\n terminalLauncher,\n current\n}: {\n terminalLauncher: string;\n current: TerminalProfile;\n}): Promise<{ placement: TerminalLaunchPlacement; chord: string | null }> {\n printLine('');\n printLine('How should launched agents open?');\n printLine(' 1. New window (default)');\n printLine(' 2. New tab');\n printLine(' 3. Split pane (keyboard shortcut)');\n\n const defaultPlacement = current.placement !== 'window' || current.chord ? 'current' : '1';\n const answer = await promptLine({\n message: 'Launch placement',\n defaultValue: defaultPlacement\n });\n const normalized = answer.trim().toLowerCase();\n\n let placement: TerminalLaunchPlacement;\n let chord: string | null = null;\n\n if (normalized === 'current') {\n placement = current.placement;\n chord = current.chord;\n } else if (normalized === 'window' || normalized === '1') {\n placement = 'window';\n } else if (normalized === 'tab' || normalized === '2') {\n placement = 'tab';\n } else if (\n normalized === 'chord' ||\n normalized === 'split' ||\n normalized === 'shortcut' ||\n normalized === '3'\n ) {\n placement = 'chord';\n chord = await promptTerminalLaunchChord({ defaultValue: current.chord });\n } else {\n throw new CliError({ message: 'Choose new window, new tab, or split pane.' });\n }\n\n if (placement === 'chord' && !chord) {\n chord = await promptTerminalLaunchChord({ defaultValue: current.chord });\n }\n\n if (!isBuiltinTerminalLauncher(terminalLauncher) && placement === 'tab') {\n printLine('Note: new-tab placement uses Cmd+T via System Events for non-iTerm/Terminal apps.');\n }\n if (!isBuiltinTerminalLauncher(terminalLauncher) && placement === 'chord') {\n printLine(\n 'Note: split-pane placement sends your shortcut via System Events, then launches the agent.'\n );\n }\n\n if (placement === 'window') {\n printLine('Will open launched agents in a new window.');\n } else if (placement === 'tab') {\n printLine('Will open launched agents in a new tab.');\n } else {\n printLine(`Will split with shortcut ${chord}.`);\n }\n\n return { placement, chord };\n}\n\nasync function resolveCurrentTerminalProfile({\n runtime\n}: {\n runtime: CliRuntime;\n}): Promise<TerminalProfile> {\n try {\n const stored = await fetchTerminalProfile({ backend: runtime.backend });\n if (stored.launcher) return stored;\n const legacy = readLegacyTerminalProfileFromToml();\n return legacy ?? stored;\n } catch {\n return (\n readLegacyTerminalProfileFromToml() ?? {\n launcher: 'Terminal',\n placement: 'window',\n chord: null\n }\n );\n }\n}\n\nasync function configureTerminalForSetup({ runtime }: { runtime: CliRuntime }): Promise<{\n executionTargetId: string;\n deviceLabel: string;\n launcher: string | null;\n placement: TerminalLaunchPlacement | null;\n chord: string | null;\n}> {\n const current = await resolveCurrentTerminalProfile({ runtime });\n\n printLine('');\n printStepTitle('Step 4: Choose the default terminal for launched agents.');\n TERMINAL_OPTIONS.forEach((option, index) => {\n printLine(` ${index + 1}. ${option.label}`);\n });\n printLine(` ${TERMINAL_OPTIONS.length + 1}. Custom application name`);\n printLine(` ${TERMINAL_OPTIONS.length + 2}. Inline in the current terminal`);\n\n const answer = await promptLine({\n message: 'Default terminal',\n defaultValue: current.launcher ? 'current' : '1'\n });\n const normalized = answer.trim().toLowerCase();\n let terminalLauncher: string | null;\n\n if (normalized === 'current') {\n terminalLauncher = current.launcher;\n } else if (normalized === 'inline' || normalized === String(TERMINAL_OPTIONS.length + 2)) {\n terminalLauncher = null;\n } else if (normalized === 'custom' || normalized === String(TERMINAL_OPTIONS.length + 1)) {\n const appName = await promptLine({ message: 'Terminal application name' });\n if (!appName) throw new CliError({ message: 'Terminal application name is required.' });\n terminalLauncher = launcherForApplicationName(appName);\n } else {\n const selectedIndex = Number.parseInt(answer, 10);\n const selected =\n Number.isNaN(selectedIndex) || selectedIndex < 1 || selectedIndex > TERMINAL_OPTIONS.length\n ? TERMINAL_OPTIONS.find(option => option.label.toLowerCase() === normalized)\n : TERMINAL_OPTIONS[selectedIndex - 1];\n if (!selected) {\n throw new CliError({ message: 'Choose a listed terminal, custom, or inline.' });\n }\n terminalLauncher = selected.launcher;\n }\n\n let placement: TerminalLaunchPlacement = 'window';\n let chord: string | null = null;\n\n if (terminalLauncher) {\n const selectedPlacement = await configureTerminalPlacementForSetup({\n terminalLauncher,\n current: { ...current, launcher: terminalLauncher }\n });\n placement = selectedPlacement.placement;\n chord = selectedPlacement.chord;\n }\n\n const saved = await saveTerminalProfile({\n backend: runtime.backend,\n profile: {\n launcher: terminalLauncher,\n placement: terminalLauncher ? placement : 'window',\n chord: terminalLauncher && placement === 'chord' ? chord : null\n }\n });\n\n printLine(\n terminalLauncher\n ? `Saved terminal profile for local target ${saved.executionTargetId} (${saved.deviceLabel}).`\n : 'Saved terminal profile: launched agents will run inline.'\n );\n\n return {\n executionTargetId: saved.executionTargetId,\n deviceLabel: saved.deviceLabel,\n launcher: terminalLauncher,\n placement: terminalLauncher ? placement : null,\n chord: terminalLauncher && placement === 'chord' ? chord : null\n };\n}\n\nasync function runFullSetupCommand({ json }: { json: boolean }): Promise<void> {\n const backend = await configureBackendForSetup();\n const auth = await configureAuthForSetup({\n backendUrl: backend.url,\n passwordCredentialTarget: backend.mode === 'cloud' ? 'full_user_token' : 'session_bearer'\n });\n const agents = await configureAgentsForSetup();\n const runtime = openCliRuntime();\n try {\n const terminal = await configureTerminalForSetup({ runtime });\n\n if (json) {\n printJson({\n ok: true,\n backend,\n auth: {\n authMethod: auth.authMethod,\n credentialType: auth.credentialType,\n backendUrl: auth.backendUrl,\n credentialsPath: auth.credentialsPath\n },\n agents: agents.map(result => result.agentKey),\n terminal\n });\n } else {\n printLine('');\n printLine(`Setup complete. Wrote ${backend.path}.`);\n }\n } finally {\n runtime.close();\n }\n}\n\nexport async function runAgentSetupCommand({\n rest,\n json\n}: {\n rest: string[];\n json: boolean;\n}): Promise<void> {\n const parsed = parseArgs(rest);\n const target = parsed.positional[0];\n const dryRun = flagBoolean(parsed.flags, '--dry-run');\n const home = flagValue(parsed.flags, '--home');\n\n if (!target) {\n const available = listAvailableConnectors();\n if (json) {\n printJson({ available, usage: 'ovld agent-setup <agent>|all [--dry-run] [--json]' });\n } else {\n printLine('Available connectors:');\n for (const agent of available) {\n printLine(` ${agent}`);\n }\n printLine('');\n printLine('Install one with `ovld agent-setup <agent>` or all with `ovld agent-setup all`.');\n }\n return;\n }\n\n const results =\n target === 'all'\n ? setupAllConnectors({ home, dryRun })\n : [setupConnector({ agentKey: target, home, dryRun })];\n\n if (json) {\n printJson({ ok: true, dryRun, results });\n } else {\n for (const result of results) {\n printHumanResult(result);\n }\n }\n}\n\nexport async function runSetupCommand({\n rest,\n json\n}: {\n rest: string[];\n json: boolean;\n}): Promise<void> {\n const parsed = parseArgs(rest);\n if (parsed.positional.length > 0) {\n throw new CliError({\n message:\n 'Connector setup moved to `ovld agent-setup`. Run `ovld setup` for full configuration or `ovld agent-setup <agent>|all` for connectors.'\n });\n }\n await runFullSetupCommand({ json });\n}\n", "import { flagBoolean, flagValue, parseArgs } from './args.js';\nimport { createBackendClient } from './backend-client.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\n\n// Light local mirrors of the relevant shared DTOs (the CLI package does not\n// depend on the webapp shared contract). Only the fields the CLI reads/sends.\ntype TokenScope = 'full' | 'mission_lifecycle';\n\ninterface UserTokenDto {\n id: string;\n label: string;\n tokenPrefix: string;\n status: string;\n scope: TokenScope;\n scopeGrants: string[];\n expiresAt: string | null;\n lastUsedAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n}\n\ninterface CreateUserTokenResultDto {\n token: UserTokenDto;\n secret: string;\n}\n\nconst DURATION_PATTERN = /^(\\d+)\\s*(h|d|w|mo|m|y)$/i;\n\n/**\n * Parse a human duration (`90d`, `12w`, `3mo`, `6h`, `1y`) into an ISO-8601\n * timestamp that many units from now. `m` is treated as months for ergonomics\n * (`mo` also accepted); use `h` for hours.\n */\nexport function durationToIso(value: string, now: number = Date.now()): string {\n const match = DURATION_PATTERN.exec(value.trim());\n if (!match || match[1] === undefined || match[2] === undefined) {\n throw new CliError({\n message: `Invalid --expires-in '${value}'. Use forms like 90d, 12w, 3mo, 6h, or 1y.`\n });\n }\n const amount = Number.parseInt(match[1], 10);\n const unit = match[2].toLowerCase();\n const date = new Date(now);\n // Use UTC mutators so the arithmetic is timezone-independent; local-time\n // mutators drift by an hour when the span crosses a DST boundary.\n switch (unit) {\n case 'h':\n date.setUTCHours(date.getUTCHours() + amount);\n break;\n case 'd':\n date.setUTCDate(date.getUTCDate() + amount);\n break;\n case 'w':\n date.setUTCDate(date.getUTCDate() + amount * 7);\n break;\n case 'mo':\n case 'm':\n date.setUTCMonth(date.getUTCMonth() + amount);\n break;\n case 'y':\n date.setUTCFullYear(date.getUTCFullYear() + amount);\n break;\n default:\n throw new CliError({ message: `Unsupported duration unit in '${value}'.` });\n }\n return date.toISOString();\n}\n\nfunction normalizeScope(raw: string | undefined): TokenScope | undefined {\n if (raw === undefined) return undefined;\n const value = raw.trim().toLowerCase();\n if (value === 'full') return 'full';\n if (value === 'mission-lifecycle' || value === 'mission_lifecycle') return 'mission_lifecycle';\n throw new CliError({\n message: `Unknown --scope '${raw}'. Use 'full' or 'mission-lifecycle'.`\n });\n}\n\nfunction formatDate(iso: string | null): string {\n return iso ?? '\u2014';\n}\n\nfunction printTokenTable(tokens: UserTokenDto[]): void {\n if (tokens.length === 0) {\n console.log('No tokens. Create one with `ovld user-token create --label \"<label>\"`.');\n return;\n }\n for (const token of tokens) {\n const expiry = token.expiresAt ? `expires ${formatDate(token.expiresAt)}` : 'no expiry';\n console.log(\n `${token.tokenPrefix}\u2026 ${token.status.padEnd(8)} ${token.scope.padEnd(16)} ${expiry} ${token.label}`\n );\n console.log(` id: ${token.id}`);\n }\n}\n\n/**\n * `ovld user-token <create|list|revoke|rename>` \u2014 manage user-owned\n * non-interactive credentials. Subcommands call the existing REST endpoints\n * through the backend client; secrets are printed exactly once at creation.\n */\nexport async function runUserTokenCommand({ rest }: { rest: string[] }): Promise<void> {\n const [subcommand, ...subArgs] = rest;\n const parsed = parseArgs(subArgs);\n const json = flagBoolean(parsed.flags, '--json');\n const backend = createBackendClient();\n\n switch (subcommand) {\n case 'create': {\n const label = flagValue(parsed.flags, '--label') ?? parsed.positional[0];\n if (!label || !label.trim()) {\n throw new CliError({ message: 'A label is required: --label \"macbook runner\".' });\n }\n const scope = normalizeScope(flagValue(parsed.flags, '--scope'));\n\n // Expiry: --no-expiry sends null (never expires); --expires-in sets it;\n // omitting both lets the backend apply its 90-day default (send undefined).\n let expiresAt: string | null | undefined;\n if (flagBoolean(parsed.flags, '--no-expiry')) {\n expiresAt = null;\n } else {\n const expiresIn = flagValue(parsed.flags, '--expires-in');\n expiresAt = expiresIn ? durationToIso(expiresIn) : undefined;\n }\n\n const body: Record<string, unknown> = { label: label.trim() };\n if (expiresAt !== undefined) body.expiresAt = expiresAt;\n if (scope !== undefined) body.scope = scope;\n\n const result = await backend.post<CreateUserTokenResultDto>({\n path: '/api/user-tokens',\n body\n });\n\n if (json) {\n printJson(result);\n return;\n }\n console.log('Token created. Copy the secret now \u2014 it will not be shown again:\\n');\n console.log(` ${result.secret}\\n`);\n console.log(` label: ${result.token.label}`);\n console.log(` scope: ${result.token.scope}`);\n console.log(\n ` expiry: ${result.token.expiresAt ? formatDate(result.token.expiresAt) : 'no expiry'}`\n );\n console.log('\\nAuthenticate with: ovld auth login --token <secret>');\n return;\n }\n\n case 'list': {\n const tokens = await backend.get<UserTokenDto[]>('/api/user-tokens');\n if (json) {\n printJson(tokens);\n return;\n }\n printTokenTable(tokens);\n return;\n }\n\n case 'revoke': {\n const id = flagValue(parsed.flags, '--id') ?? parsed.positional[0];\n if (!id) throw new CliError({ message: 'Usage: ovld user-token revoke <token-id>' });\n const token = await backend.post<UserTokenDto>({ path: `/api/user-tokens/${id}/revoke` });\n if (json) {\n printJson(token);\n return;\n }\n console.log(`Revoked token ${token.tokenPrefix}\u2026 (${token.label}).`);\n return;\n }\n\n case 'rename': {\n const id = flagValue(parsed.flags, '--id') ?? parsed.positional[0];\n const label = flagValue(parsed.flags, '--label') ?? parsed.positional[1];\n if (!id || !label) {\n throw new CliError({ message: 'Usage: ovld user-token rename <token-id> \"<new label>\"' });\n }\n const token = await backend.patch<UserTokenDto>({\n path: `/api/user-tokens/${id}`,\n body: { label }\n });\n if (json) {\n printJson(token);\n return;\n }\n console.log(`Renamed token ${token.tokenPrefix}\u2026 to \"${token.label}\".`);\n return;\n }\n\n default:\n throw new CliError({\n message:\n `Unknown user-token subcommand: ${subcommand ?? '(none)'}\\n` +\n 'Usage: ovld user-token <create|list|revoke|rename>'\n });\n }\n}\n", "import { type Dirent, existsSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nexport const PROJECT_TMP_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport function projectTmpDir(workingDirectory: string): string {\n return path.join(workingDirectory, '.overlord', 'tmp');\n}\n\nexport function ensureProjectTmpDir(workingDirectory: string): string {\n const tmpDir = projectTmpDir(workingDirectory);\n mkdirSync(tmpDir, { recursive: true });\n return tmpDir;\n}\n\nexport function pruneStaleProjectTmp({\n workingDirectory,\n create = false,\n now = Date.now(),\n retentionMs = PROJECT_TMP_RETENTION_MS\n}: {\n workingDirectory: string;\n create?: boolean;\n now?: number;\n retentionMs?: number;\n}): void {\n const tmpDir = projectTmpDir(workingDirectory);\n if (!create && !existsSync(tmpDir)) return;\n if (create) ensureProjectTmpDir(workingDirectory);\n const cutoff = now - retentionMs;\n pruneChildren(tmpDir, cutoff);\n}\n\nexport function pruneProjectTmpContents(workingDirectory: string): {\n warned: boolean;\n removedCount: number;\n} {\n const overlordDir = path.join(workingDirectory, '.overlord');\n if (!existsSync(overlordDir)) {\n return { warned: true, removedCount: 0 };\n }\n\n const tmpDir = projectTmpDir(workingDirectory);\n if (!existsSync(tmpDir)) {\n return { warned: false, removedCount: 0 };\n }\n\n const entries = readdirSync(tmpDir, { withFileTypes: true, encoding: 'utf8' });\n for (const entry of entries) {\n rmSync(path.join(tmpDir, entry.name), { recursive: true, force: true });\n }\n return { warned: false, removedCount: entries.length };\n}\n\nfunction pruneChildren(directory: string, cutoff: number): void {\n let entries: Dirent<string>[];\n try {\n entries = readdirSync(directory, { withFileTypes: true, encoding: 'utf8' });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const target = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n pruneDirectory(target, cutoff);\n continue;\n }\n pruneLeaf(target, cutoff);\n }\n}\n\nfunction pruneDirectory(directory: string, cutoff: number): void {\n pruneChildren(directory, cutoff);\n\n try {\n const stats = statSync(directory);\n if (stats.mtimeMs > cutoff) return;\n } catch {\n return;\n }\n\n try {\n if (readdirSync(directory).length === 0) {\n rmSync(directory, { recursive: true, force: true });\n }\n } catch {\n // Best-effort cleanup only.\n }\n}\n\nfunction pruneLeaf(target: string, cutoff: number): void {\n try {\n const stats = statSync(target);\n if (stats.mtimeMs > cutoff) return;\n rmSync(target, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup only.\n }\n}\n", "import path from 'node:path';\n\n/**\n * Detects whether a credentials directory sits inside a continuously-synced\n * cloud folder (security audit 2026-06-18). Storing the `0600` `auth.json` token\n * there silently replicates the plaintext secret to cloud storage, bypassing the\n * local file-permission protection. `ovld doctor` warns when this is the case.\n */\n\nexport interface SyncRootMatch {\n /** Human-readable provider name, e.g. \"iCloud Drive\". */\n provider: string;\n /** The path segment (or joined segments) that matched, for the warning message. */\n matchedSegment: string;\n}\n\ninterface SyncRootRule {\n provider: string;\n /** Matches a single path segment (case-insensitive). */\n segment?: RegExp;\n /** Matches a run of consecutive segments joined with '/'. */\n joined?: RegExp;\n}\n\nconst RULES: SyncRootRule[] = [\n // iCloud Drive stores under ~/Library/Mobile Documents and, for third-party\n // app containers, ~/Library/CloudStorage.\n { provider: 'iCloud Drive', joined: /(^|\\/)Library\\/Mobile Documents(\\/|$)/i },\n { provider: 'iCloud Drive', joined: /(^|\\/)Library\\/CloudStorage\\/iCloud[^/]*(\\/|$)/i },\n // Dropbox: a \"Dropbox\" or \"Dropbox (Personal/Work)\" folder.\n { provider: 'Dropbox', segment: /^Dropbox(\\s|$|\\s*\\(.*\\))/i },\n // OneDrive: \"OneDrive\" or \"OneDrive - Company\".\n { provider: 'OneDrive', segment: /^OneDrive(\\s-\\s.+)?$/i },\n // Google Drive desktop: \"Google Drive\", \"My Drive\", or the CloudStorage mount.\n { provider: 'Google Drive', segment: /^(Google Drive|My Drive)$/i },\n { provider: 'Google Drive', joined: /(^|\\/)Library\\/CloudStorage\\/GoogleDrive[^/]*(\\/|$)/i }\n];\n\n/**\n * Return the first cloud-sync root the given directory is nested inside, or\n * `null` when the path looks safe. The check is purely lexical (no filesystem\n * access) so it is cheap and testable.\n */\nexport function detectCloudSyncRoot(dir: string): SyncRootMatch | null {\n const normalized = path.resolve(dir).split(path.sep).join('/');\n const segments = normalized.split('/').filter(Boolean);\n\n for (const rule of RULES) {\n if (rule.joined && rule.joined.test(normalized)) {\n const match = normalized.match(rule.joined);\n return {\n provider: rule.provider,\n matchedSegment: (match?.[0] ?? '').replace(/^\\/|\\/$/g, '')\n };\n }\n if (rule.segment) {\n const hit = segments.find(seg => rule.segment!.test(seg));\n if (hit) return { provider: rule.provider, matchedSegment: hit };\n }\n }\n\n return null;\n}\n", "export type DoctorCheck = {\n name: string;\n ok: boolean;\n required: boolean;\n detail: string;\n};\n\nexport type ExecutionTargetMigrationDiagnostics = {\n hostedBackend: boolean;\n backendHostFingerprint: string;\n staleBackendHostTargets: Array<{\n executionTargetId: string;\n label: string;\n deviceLabel: string | null;\n deviceFingerprint: string;\n }>;\n staleQueuedExecutionRequestCount: number;\n};\n\nexport function buildExecutionTargetMigrationDoctorCheck({\n diagnostics\n}: {\n diagnostics: ExecutionTargetMigrationDiagnostics;\n}): DoctorCheck | null {\n if (!diagnostics.hostedBackend) return null;\n\n const staleCount = diagnostics.staleBackendHostTargets.length;\n if (staleCount === 0 && diagnostics.staleQueuedExecutionRequestCount === 0) {\n return {\n name: 'execution-target-migration',\n ok: true,\n required: false,\n detail: 'No execution targets are stamped with the hosted backend host fingerprint.'\n };\n }\n\n const targetSummary =\n staleCount === 1\n ? `1 execution target (${diagnostics.staleBackendHostTargets[0]!.label})`\n : `${staleCount} execution targets`;\n\n const queueSummary =\n diagnostics.staleQueuedExecutionRequestCount > 0\n ? ` ${diagnostics.staleQueuedExecutionRequestCount} queued execution request(s) still reference stale target(s).`\n : '';\n\n return {\n name: 'execution-target-migration',\n ok: false,\n required: false,\n detail:\n `${targetSummary} use the hosted backend/container hostname fingerprint and cannot run checkout-local work.` +\n queueSummary +\n ' In the web app, open Project Settings \u2192 Resources, re-select your client device as the execution target, re-link the primary resource to that target, and clear or re-queue stale execution requests. See docs/upgrading-client-checkout-bridge.md.'\n };\n}\n", "import { createInterface } from 'node:readline/promises';\n\nimport { flagBoolean, flagValue, parseArgs } from './args.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\n\ntype BackendConfigResult = {\n configPath: string;\n mode: 'local' | 'cloud';\n url: string;\n};\n\nfunction isHttpUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value.trim());\n}\n\nasync function promptLine({\n message,\n defaultValue\n}: {\n message: string;\n defaultValue?: string;\n}): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new CliError({\n message:\n 'Interactive backend configuration requires a TTY. Run `ovld config set local [url]` or `ovld config set cloud <url>`.'\n });\n }\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n const answer = await rl.question(`${message}${suffix}: `);\n return answer.trim() || defaultValue || '';\n } finally {\n rl.close();\n }\n}\n\nasync function configureBackendInteractive(): Promise<BackendConfigResult> {\n const { DEFAULT_LOCAL_BACKEND_URL, loadConfig, resolveConfigWritePath, writeConfig } =\n await import('./config.js');\n\n console.log('Choose an Overlord backend before continuing.');\n console.log(\n 'Use local for a Desktop/local backend on this machine, or cloud for a hosted Overlord backend.'\n );\n\n const type = (\n await promptLine({\n message: 'Backend type (local/cloud)',\n defaultValue: 'local'\n })\n ).toLowerCase();\n const targetPath = resolveConfigWritePath();\n const current = loadConfig(targetPath);\n\n if (type === 'cloud') {\n const cloudUrl = await promptLine({ message: 'Cloud backend URL' });\n if (!cloudUrl) throw new CliError({ message: 'Cloud backend URL is required.' });\n if (!isHttpUrl(cloudUrl)) {\n throw new CliError({\n message: 'Cloud backend must be an http:// or https:// URL.'\n });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'cloud', backendUrl: cloudUrl }\n });\n return { configPath: targetPath, mode: 'cloud', url: cloudUrl };\n }\n\n if (type !== 'local') {\n throw new CliError({ message: 'Backend type must be `local` or `cloud`.' });\n }\n\n const localUrl = await promptLine({\n message: 'Local backend URL',\n defaultValue: DEFAULT_LOCAL_BACKEND_URL\n });\n if (!isHttpUrl(localUrl)) {\n throw new CliError({ message: 'Local backend must be an http:// or https:// URL.' });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'local', backendUrl: localUrl }\n });\n return { configPath: targetPath, mode: 'local', url: localUrl };\n}\n\nasync function configureBackendFromArgs({\n parsed,\n json\n}: {\n parsed: ReturnType<typeof parseArgs>;\n json: boolean;\n}): Promise<void> {\n const {\n DEFAULT_LOCAL_BACKEND_URL,\n findEffectiveConfigPath,\n loadConfig,\n resolveConfigWritePath,\n resolveBackendUrl,\n writeConfig\n } = await import('./config.js');\n\n const sub = parsed.positional[0] ?? 'list';\n const targetPath = resolveConfigWritePath();\n const current = loadConfig(targetPath);\n\n if (sub === 'list') {\n const effectivePath = findEffectiveConfigPath();\n const mode = current.backendUrl ? current.backendMode : 'unset';\n const backendUrl = resolveBackendUrl(current);\n if (json) {\n printJson({\n config: current,\n path: effectivePath,\n backend: {\n configured: mode !== 'unset',\n mode,\n url: backendUrl\n }\n });\n } else {\n console.log(`config_path=${effectivePath ?? '(not configured)'}`);\n console.log(`backend_mode=${mode}`);\n console.log(`backend_url=${backendUrl}`);\n console.log(`web_host=${current.webHost}`);\n console.log(`web_port=${current.webPort}`);\n console.log(`default_agent=${current.defaultAgent}`);\n }\n return;\n }\n\n if (sub === 'get') {\n const key = parsed.positional[1] ?? 'backend';\n const values: Record<string, string | number | boolean | null> = {\n backend: current.backendUrl ?? `default local (${DEFAULT_LOCAL_BACKEND_URL})`,\n backend_mode: current.backendMode,\n backend_url: resolveBackendUrl(current),\n web_host: current.webHost,\n web_port: current.webPort,\n default_agent: current.defaultAgent\n };\n if (!(key in values)) throw new CliError({ message: `Unknown config key: ${key}` });\n if (json) printJson({ key, value: values[key] });\n else console.log(`${key}=${values[key] ?? ''}`);\n return;\n }\n\n if (sub !== 'set') {\n throw new CliError({\n message:\n 'Usage: ovld config list|get <key>|set [local <path>|cloud <postgres-url>|database_path <path>|database_url <postgres-url>]'\n });\n }\n\n const target = parsed.positional[1];\n const value =\n parsed.positional[2] ?? flagValue(parsed.flags, '--path') ?? flagValue(parsed.flags, '--url');\n\n let result: BackendConfigResult;\n if (!target) {\n result = await configureBackendInteractive();\n } else if (target === 'local' || target === 'backend_url') {\n const backendUrl = value?.trim() || DEFAULT_LOCAL_BACKEND_URL;\n if (!isHttpUrl(backendUrl)) {\n throw new CliError({ message: 'Local backend must be an http:// or https:// URL.' });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'local', backendUrl }\n });\n result = { configPath: targetPath, mode: 'local', url: backendUrl };\n } else if (target === 'cloud') {\n if (!value) throw new CliError({ message: 'Cloud backend URL is required.' });\n if (!isHttpUrl(value)) {\n throw new CliError({\n message: 'Cloud backend must be an http:// or https:// URL.'\n });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'cloud', backendUrl: value }\n });\n result = { configPath: targetPath, mode: 'cloud', url: value };\n } else {\n throw new CliError({\n message: 'Usage: ovld config set [local <url>|cloud <url>]'\n });\n }\n\n if (json) printJson(result);\n else {\n console.log(`Configured ${result.mode} backend at ${result.url}`);\n console.log(`Wrote ${result.configPath}`);\n }\n}\n\nasync function runAuthStatusCommand({ json }: { json: boolean }): Promise<void> {\n const { resolveAuthStatus } = await import('./auth-status.js');\n const status = await resolveAuthStatus();\n\n if (json) {\n printJson(status);\n return;\n }\n\n console.log(`backend_url=${status.backendUrl}`);\n console.log(`backend_mode=${status.backendMode}`);\n console.log(`config_path=${status.configPath ?? '(not configured)'}`);\n console.log(`logged_in=${status.loggedIn ? 'true' : 'false'}`);\n console.log(`credential_source=${status.credentialSource}`);\n if (status.credentialType) console.log(`credential_type=${status.credentialType}`);\n if (status.credentialsPath) console.log(`credentials_path=${status.credentialsPath}`);\n if (status.validationError) console.log(`validation_error=${status.validationError}`);\n}\n\nasync function runAuthCommand({ rest, json }: { rest: string[]; json: boolean }): Promise<void> {\n const parsed = parseArgs(rest);\n const sub = parsed.positional[0] ?? 'login';\n\n if (sub === 'status') {\n await runAuthStatusCommand({ json });\n return;\n }\n\n if (sub !== 'login') {\n throw new CliError({\n message: 'Usage: ovld auth login [--token <out_...>] | ovld auth status [--json]'\n });\n }\n\n const tokenFlag = flagValue(parsed.flags, '--token');\n\n const { findEffectiveConfigPath, hasExplicitBackendConfig, loadConfig } =\n await import('./config.js');\n let config = loadConfig();\n let configPath = findEffectiveConfigPath();\n let configured = hasExplicitBackendConfig(config);\n let setup: BackendConfigResult | null = null;\n\n if (!configured) {\n setup = await configureBackendInteractive();\n config = loadConfig(setup.configPath);\n configPath = setup.configPath;\n configured = hasExplicitBackendConfig(config);\n }\n\n if (!configured)\n throw new CliError({ message: 'Backend configuration is required before login.' });\n\n const { resolveBackendUrl } = await import('./config.js');\n const mode = config.backendMode;\n const backendUrl = resolveBackendUrl(config);\n const { loginWithUserToken, runInteractiveAuthLogin } = await import('./auth-login.js');\n const login = tokenFlag\n ? await loginWithUserToken({ backendUrl, token: tokenFlag })\n : await runInteractiveAuthLogin({\n backendUrl,\n passwordCredentialTarget: mode === 'cloud' ? 'full_user_token' : 'session_bearer'\n });\n\n if (json) {\n printJson({\n ...login,\n backend: {\n mode,\n url: backendUrl,\n configPath\n },\n configuredDuringLogin: setup !== null\n });\n } else {\n const methodLabel = login.authMethod === 'user_token' ? 'USER_TOKEN' : 'email and password';\n console.log(`Logged in to ${backendUrl} using ${methodLabel}.`);\n console.log(`Saved credentials to ${login.credentialsPath}`);\n }\n}\n\n/**\n * Local management commands that do NOT require the database/service layer:\n * `update`, `init`, `doctor`, `setup`, `agent-setup`, `config`, `auth login`, and `auth status`. These are dispatched separately from the\n * DB-backed commands in `commands.ts` so they never statically import the\n * service layer \u2014 keeping them runnable from a globally installed `ovld`\n * binary (where the root project `dist/` is not on disk).\n */\nexport async function runLocalCommand({\n command,\n rest\n}: {\n command: string;\n rest: string[];\n}): Promise<void> {\n const parsed = parseArgs(rest);\n const json = flagBoolean(parsed.flags, '--json');\n\n switch (command) {\n case 'update': {\n const { runUpdateCommand } = await import('./update.js');\n await runUpdateCommand({ rest });\n return;\n }\n case 'init': {\n const {\n DEFAULT_LOCAL_BACKEND_URL,\n writeConfig,\n resolveRepoPath,\n loadConfig,\n resolveBackendUrl\n } = await import('./config.js');\n const target = resolveRepoPath('overlord.toml');\n writeConfig({\n targetPath: target,\n config: {\n instanceName: 'Local Overlord',\n backendMode: 'local',\n backendUrl: DEFAULT_LOCAL_BACKEND_URL\n }\n });\n // Report the URL that will actually be used: in development a repo-local\n // `OVERLORD_BACKEND_URL_DEV` (.env.local) overrides the toml default.\n const backendUrl = resolveBackendUrl(loadConfig(target));\n if (json) {\n printJson({ ok: true, configPath: target, backendUrl });\n } else {\n console.log(`Initialized Overlord at ${target}`);\n console.log(`Configured local backend at ${backendUrl}`);\n }\n return;\n }\n case 'setup': {\n const { runSetupCommand } = await import('./setup.js');\n await runSetupCommand({ rest, json });\n return;\n }\n case 'agent-setup': {\n const { runAgentSetupCommand } = await import('./setup.js');\n await runAgentSetupCommand({ rest, json });\n return;\n }\n case 'config': {\n await configureBackendFromArgs({ parsed, json });\n return;\n }\n case 'auth': {\n await runAuthCommand({ rest, json });\n return;\n }\n case 'user-token': {\n const { runUserTokenCommand } = await import('./user-token.js');\n await runUserTokenCommand({ rest });\n return;\n }\n case 'prune': {\n const { pruneProjectTmpContents } = await import('./project-tmp.js');\n const workingDirectory = process.cwd();\n const result = pruneProjectTmpContents(workingDirectory);\n if (json) {\n printJson({ ok: true, ...result });\n } else if (result.warned) {\n console.warn('Warning: no .overlord folder found in the current directory.');\n } else {\n console.log(`Removed ${result.removedCount} item(s) from .overlord/tmp.`);\n }\n return;\n }\n case 'doctor': {\n const { createBackendClient } = await import('./backend-client.js');\n const { inspectConnector, listAvailableConnectors } = await import('./connectors.js');\n const backend = createBackendClient();\n const health = await backend.health().catch(error => ({\n ok: false,\n detail: error instanceof Error ? error.message : String(error)\n }));\n const checks: Array<{ name: string; ok: boolean; required: boolean; detail: string }> = [\n {\n name: 'backend',\n ok: health.ok,\n required: true,\n detail: health.ok ? backend.baseUrl : `Backend unreachable at ${backend.baseUrl}`\n }\n ];\n\n for (const agentKey of listAvailableConnectors()) {\n const report = inspectConnector({ agentKey });\n if (!report.installed) {\n checks.push({\n name: `connector:${agentKey}`,\n ok: true,\n required: false,\n detail: `not installed \u2014 run \\`ovld agent-setup ${agentKey}\\``\n });\n } else {\n checks.push({\n name: `connector:${agentKey}`,\n ok: report.healthy,\n required: true,\n detail: report.healthy\n ? `installed at ${report.installPath}`\n : report.problems.join('; ')\n });\n }\n checks.push({\n name: `agent-binary:${report.binaryName}`,\n ok: report.binaryFound,\n required: false,\n detail: report.binaryFound\n ? `found on PATH`\n : `not found on PATH (install ${report.binaryName} to launch this agent)`\n });\n }\n\n // Warn when the credentials directory is nested inside a cloud-sync root,\n // which silently replicates the plaintext `auth.json` token off-device\n // (security audit 2026-06-18).\n {\n const pathMod = await import('node:path');\n const { authCredentialsPath } = await import('./auth-credentials.js');\n const { detectCloudSyncRoot } = await import('./sync-root.js');\n const credentialsDir = pathMod.dirname(authCredentialsPath());\n const syncMatch = detectCloudSyncRoot(credentialsDir);\n checks.push({\n name: 'credentials-sync-root',\n ok: syncMatch === null,\n required: false,\n detail:\n syncMatch === null\n ? `${credentialsDir} is not inside a known cloud-sync folder`\n : `${credentialsDir} is inside ${syncMatch.provider} (${syncMatch.matchedSegment}); the plaintext token is replicated to cloud storage. Relocate it with OVLD_HOME or exclude this folder from sync.`\n });\n }\n\n if (health.ok) {\n const { isLoopbackBackendUrl } = await import('./config.js');\n const { readStoredAuthCredentials } = await import('./auth-credentials.js');\n const { buildExecutionTargetMigrationDoctorCheck } =\n await import('./execution-target-migration-doctor.js');\n const hasAuth =\n Boolean(\n process.env.OVERLORD_USER_TOKEN?.trim() ||\n process.env.OVLD_USER_TOKEN?.trim() ||\n process.env.USER_TOKEN?.trim()\n ) || readStoredAuthCredentials() !== null;\n if (hasAuth && !isLoopbackBackendUrl(backend.baseUrl)) {\n try {\n const diagnostics = await backend.get<\n import('./execution-target-migration-doctor.js').ExecutionTargetMigrationDiagnostics\n >('/api/diagnostics/execution-target-migration');\n const migrationCheck = buildExecutionTargetMigrationDoctorCheck({ diagnostics });\n if (migrationCheck) checks.push(migrationCheck);\n } catch {\n // Older backends may not expose migration diagnostics yet.\n }\n }\n }\n\n const allOk = checks.every(check => !check.required || check.ok);\n if (json) {\n printJson({ ok: allOk, checks });\n } else {\n for (const check of checks) {\n const status = check.ok ? 'ok' : check.required ? 'fail' : 'warn';\n console.log(`${status} ${check.name}: ${check.detail}`);\n }\n }\n if (!allOk) {\n throw new CliError({ message: 'Doctor found problems. Fix the items above and retry.' });\n }\n return;\n }\n default:\n throw new CliError({ message: `Unknown command: ${command}` });\n }\n}\n", "import { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { flagBoolean, flagValue, parseArgs } from './args.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\n\n/**\n * `ovld serve` \u2014 boot a fully-initialized local Overlord instance.\n *\n * This is the single \"start the web/REST server\" entrypoint shared by the repo,\n * hosted (Railway/Postgres) deployments, and the desktop bundle. It does not\n * reimplement the server: it resolves where the server entry lives, sets the\n * host/port/database environment the server reads on boot, and spawns it. The\n * server itself creates + migrates the SQLite database on first run (see\n * `backend/db.ts`), so a fresh machine comes up with no extra steps.\n *\n * Entry resolution (first match wins):\n * 1. `OVERLORD_SERVER_ENTRY` env \u2014 an explicit path (run with the matching\n * runtime by extension: `.ts` via tsx, otherwise `node`).\n * 2. `<project>/backend/dist-server/index.cjs` \u2014 the esbuild server bundle\n * (`yarn build:server:prod`), run with `node`. Preferred when present.\n * 3. `<project>/backend/index.ts` \u2014 the TypeScript source, run with\n * tsx. The repo dev path.\n *\n * The desktop app does not use this command: it forks the server bundle inside\n * an Electron `utilityProcess` directly. `ovld serve` is the CLI/repo path.\n */\nexport async function runServeCommand({ rest }: { rest: string[] }): Promise<void> {\n const parsed = parseArgs(rest);\n const json = flagBoolean(parsed.flags, '--json');\n\n const { loadConfig, resolveProjectRoot } = await import('./config.js');\n const config = loadConfig();\n const projectRoot = resolveProjectRoot();\n\n const host = flagValue(parsed.flags, '--host') ?? process.env.OVERLORD_WEB_HOST ?? config.webHost;\n const port =\n flagValue(parsed.flags, '--port') ?? process.env.OVERLORD_WEB_PORT ?? String(config.webPort);\n const dbPath = flagValue(parsed.flags, '--db') ?? process.env.OVERLORD_SQLITE_PATH;\n\n const resolved = resolveServerEntry(projectRoot);\n if (!resolved) {\n throw new CliError({\n message:\n 'Could not find the Overlord web server to serve.\\n' +\n `Looked for ${path.join(projectRoot, 'backend', 'dist-server', 'index.cjs')} (built bundle) ` +\n `and ${path.join(projectRoot, 'backend', 'index.ts')} (source).\\n` +\n 'Run `ovld serve` from an OpenOverlord checkout, build the server bundle with ' +\n '`yarn build:server:prod`, or set OVERLORD_SERVER_ENTRY to the server entry file.'\n });\n }\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n OVERLORD_WEB_HOST: host,\n OVERLORD_WEB_PORT: String(port)\n };\n if (dbPath) env.OVERLORD_SQLITE_PATH = dbPath;\n\n if (json) {\n printJson({\n ok: true,\n entry: resolved.entry,\n runtime: resolved.runtime,\n host,\n port: Number(port),\n databasePath: dbPath ?? null\n });\n } else {\n console.log(`Starting Overlord server (${resolved.runtime}) \u2192 http://${host}:${port}`);\n }\n\n await spawnServer({ ...resolved, env, cwd: projectRoot });\n}\n\ntype ResolvedEntry = { entry: string; runtime: 'node' | 'tsx' };\n\nfunction resolveServerEntry(projectRoot: string): ResolvedEntry | null {\n const override = process.env.OVERLORD_SERVER_ENTRY?.trim();\n if (override) {\n const entry = path.isAbsolute(override) ? override : path.resolve(projectRoot, override);\n return { entry, runtime: override.endsWith('.ts') ? 'tsx' : 'node' };\n }\n\n const bundle = path.join(projectRoot, 'backend', 'dist-server', 'index.cjs');\n if (existsSync(bundle)) return { entry: bundle, runtime: 'node' };\n\n const source = path.join(projectRoot, 'backend', 'index.ts');\n if (existsSync(source)) return { entry: source, runtime: 'tsx' };\n\n return null;\n}\n\n/**\n * Spawn the resolved server entry, inheriting stdio so its logs stream through,\n * forwarding termination signals so Ctrl-C / `kill` stop the child cleanly, and\n * resolving (exiting) with the child's exit code.\n */\nfunction spawnServer({\n entry,\n runtime,\n env,\n cwd\n}: ResolvedEntry & { env: NodeJS.ProcessEnv; cwd: string }): Promise<void> {\n // `node` runs the bundled .mjs directly; `tsx` is loaded via Node's --import\n // hook so the TypeScript source runs without a separate build step.\n const args = runtime === 'tsx' ? ['--import', 'tsx', entry] : [entry];\n\n const child = spawn(process.execPath, args, { cwd, env, stdio: 'inherit' });\n\n const forward = (signal: NodeJS.Signals) => {\n if (!child.killed) child.kill(signal);\n };\n process.on('SIGINT', forward);\n process.on('SIGTERM', forward);\n\n return new Promise<void>((resolve, reject) => {\n child.on('error', error => {\n reject(\n new CliError({\n message: `Failed to start the Overlord server: ${\n error instanceof Error ? error.message : String(error)\n }`\n })\n );\n });\n child.on('close', (code, signal) => {\n process.off('SIGINT', forward);\n process.off('SIGTERM', forward);\n if (signal) {\n // The child was terminated by a signal (e.g. Ctrl-C) \u2014 exit cleanly.\n resolve();\n return;\n }\n if (code && code !== 0) {\n reject(new CliError({ message: `Overlord server exited with code ${code}.` }));\n return;\n }\n resolve();\n });\n });\n}\n", "import { createHash, randomBytes, randomUUID } from 'node:crypto';\n\nconst SESSION_KEY_PREFIX = 'sess_';\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function newId(): string {\n return randomUUID();\n}\n\nexport function slugify(input: string): string {\n const base = input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48);\n return base.length > 0 ? base : 'project';\n}\n\nexport function initialTitleFromInstruction(instruction: string): string {\n const firstLine = instruction.split('\\n')[0]?.trim() ?? instruction.trim();\n if (firstLine.length <= 80) return firstLine;\n return `${firstLine.slice(0, 77)}...`;\n}\n\nexport function generateSessionKey(): { rawKey: string; prefix: string; hash: string } {\n const rawKey = SESSION_KEY_PREFIX + randomBytes(24).toString('base64url');\n const prefix = rawKey.slice(0, SESSION_KEY_PREFIX.length + 8);\n const hash = createHash('sha256').update(rawKey).digest('hex');\n return { rawKey, prefix, hash };\n}\n\nexport function hashSessionKey(rawKey: string): string {\n return createHash('sha256').update(rawKey).digest('hex');\n}\n\nexport function sessionKeyPrefix(rawKey: string): string {\n return rawKey.slice(0, 'sess_'.length + 8);\n}\n", "// The `writeProjectMetadata` capability's implementation: write a linked\n// checkout's `.overlord/project.json` on the machine that owns the checkout.\n//\n// This lives in the local-target module (not projects.ts) so the in-process\n// provider can wrap it without a cycle \u2014 projects.ts depends on the local-target\n// module, never the other way around. The hosted backend must NOT write this to\n// its own filesystem; routing through a provider\n// makes that automatic \u2014 only a co-located in-process provider writes.\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { nowIso } from '../util.js';\n\nexport const PROJECT_JSON_VERSION = 2;\n\nexport interface ProjectJsonContents {\n _warning: string;\n version: number;\n projectId: string;\n resourceId: string;\n resourceKey?: string;\n resourceIdsByExecutionTarget?: Record<string, string>;\n isPrimary: boolean;\n linkedAt: string;\n}\n\nexport interface ReadProjectJsonOptions {\n preferredExecutionTargetId?: string | null;\n}\n\nexport interface ProjectJsonLink {\n projectId: string;\n resourceId: string;\n resourceKey: string | null;\n resourceIdsByExecutionTarget: Record<string, string>;\n isPrimary: boolean;\n}\n\nfunction parseProjectJson(projectJsonPath: string): ProjectJsonContents | null {\n if (!existsSync(projectJsonPath)) return null;\n const parsed = JSON.parse(readFileSync(projectJsonPath, 'utf8')) as {\n _warning?: unknown;\n version?: unknown;\n projectId?: unknown;\n resourceId?: unknown;\n resourceKey?: unknown;\n resourceIdsByExecutionTarget?: unknown;\n isPrimary?: unknown;\n linkedAt?: unknown;\n };\n if (typeof parsed.projectId !== 'string' || typeof parsed.resourceId !== 'string') return null;\n\n const resourceIdsByExecutionTarget =\n parsed.resourceIdsByExecutionTarget &&\n typeof parsed.resourceIdsByExecutionTarget === 'object' &&\n !Array.isArray(parsed.resourceIdsByExecutionTarget)\n ? Object.fromEntries(\n Object.entries(parsed.resourceIdsByExecutionTarget).filter(\n (entry): entry is [string, string] =>\n typeof entry[0] === 'string' &&\n entry[0].trim().length > 0 &&\n typeof entry[1] === 'string' &&\n entry[1].trim().length > 0\n )\n )\n : {};\n\n return {\n _warning:\n typeof parsed._warning === 'string'\n ? parsed._warning\n : 'This file is managed by Overlord and is regenerated automatically when this folder is linked as a project resource. Do not edit it manually \u2014 manual changes will be overwritten.',\n version: typeof parsed.version === 'number' ? parsed.version : 1,\n projectId: parsed.projectId,\n resourceId: parsed.resourceId,\n resourceKey:\n typeof parsed.resourceKey === 'string' && parsed.resourceKey.trim().length > 0\n ? parsed.resourceKey.trim()\n : undefined,\n resourceIdsByExecutionTarget,\n isPrimary: parsed.isPrimary === true,\n linkedAt: typeof parsed.linkedAt === 'string' ? parsed.linkedAt : nowIso()\n };\n}\n\nexport function readProjectJsonLink(\n projectJsonPath: string,\n options: ReadProjectJsonOptions = {}\n): ProjectJsonLink | null {\n const parsed = parseProjectJson(projectJsonPath);\n if (!parsed) return null;\n\n const preferredExecutionTargetId = options.preferredExecutionTargetId?.trim() || null;\n const preferredResourceId =\n preferredExecutionTargetId && parsed.resourceIdsByExecutionTarget?.[preferredExecutionTargetId];\n\n return {\n projectId: parsed.projectId,\n resourceId: preferredResourceId ?? parsed.resourceId,\n resourceKey: parsed.resourceKey ?? null,\n resourceIdsByExecutionTarget: parsed.resourceIdsByExecutionTarget ?? {},\n isPrimary: parsed.isPrimary\n };\n}\n\n/**\n * Write `<directoryPath>/.overlord/project.json` (creating the `.overlord`\n * scratch dirs), returning the absolute path written.\n */\nexport function writeProjectJson({\n directoryPath,\n projectId,\n resourceId,\n resourceKey,\n executionTargetId,\n isPrimary\n}: {\n directoryPath: string;\n projectId: string;\n resourceId: string;\n resourceKey?: string | null;\n executionTargetId?: string | null;\n isPrimary: boolean;\n}): string {\n const overlordDir = path.join(directoryPath, '.overlord');\n mkdirSync(overlordDir, { recursive: true });\n mkdirSync(path.join(overlordDir, 'tmp'), { recursive: true });\n mkdirSync(path.join(overlordDir, 'logs'), { recursive: true });\n\n const projectJsonPath = path.join(overlordDir, 'project.json');\n const existing = readProjectJsonLink(projectJsonPath);\n const resourceIdsByExecutionTarget = {\n ...(existing?.projectId === projectId ? existing.resourceIdsByExecutionTarget : {})\n };\n if (executionTargetId?.trim()) {\n resourceIdsByExecutionTarget[executionTargetId.trim()] = resourceId;\n }\n writeFileSync(\n projectJsonPath,\n `${JSON.stringify(\n {\n _warning:\n 'This file is managed by Overlord and is regenerated automatically when this folder is linked as a project resource. Do not edit it manually \u2014 manual changes will be overwritten.',\n version: PROJECT_JSON_VERSION,\n projectId,\n resourceId,\n ...(resourceKey?.trim() ? { resourceKey: resourceKey.trim() } : {}),\n ...(Object.keys(resourceIdsByExecutionTarget).length > 0\n ? { resourceIdsByExecutionTarget }\n : {}),\n isPrimary,\n linkedAt: nowIso()\n } satisfies ProjectJsonContents,\n null,\n 2\n )}\\n`\n );\n return projectJsonPath;\n}\n", "import { execFileSync } from 'node:child_process';\nimport path from 'node:path';\n\nexport type RepositoryTreeEntryType = 'file' | 'directory';\n\nexport interface RepositoryTreeEntry {\n path: string;\n name: string;\n type: RepositoryTreeEntryType;\n parentPath: string | null;\n depth: number;\n}\n\nexport interface RepositoryTree {\n rootPath: string;\n gitRoot: string;\n branch: string | null;\n commit: string | null;\n entries: RepositoryTreeEntry[];\n truncated: boolean;\n}\n\nexport interface ReadRepositoryTreeOptions {\n maxEntries?: number;\n}\n\nexport class RepositoryReadError extends Error {\n code: 'not_git_repository' | 'unreadable';\n\n constructor(code: 'not_git_repository' | 'unreadable', message: string) {\n super(message);\n this.code = code;\n }\n}\n\nconst DEFAULT_MAX_ENTRIES = 5_000;\n\nfunction runGit(cwd: string, args: string[]): string {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n maxBuffer: 10 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'pipe']\n }).trim();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new RepositoryReadError('unreadable', message);\n }\n}\n\nfunction gitPath(cwd: string, args: string[]): string | null {\n try {\n const value = runGit(cwd, args);\n return value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction addDirectoryAncestors(paths: Set<string>, filePath: string): void {\n let parent = path.posix.dirname(filePath);\n while (parent !== '.' && parent !== '/') {\n paths.add(parent);\n parent = path.posix.dirname(parent);\n }\n}\n\nfunction toEntry(entryPath: string, type: RepositoryTreeEntryType): RepositoryTreeEntry {\n const parentPath = path.posix.dirname(entryPath);\n return {\n path: entryPath,\n name: path.posix.basename(entryPath),\n type,\n parentPath: parentPath === '.' ? null : parentPath,\n depth: entryPath.split('/').length - 1\n };\n}\n\nfunction compareEntries(a: RepositoryTreeEntry, b: RepositoryTreeEntry): number {\n if (a.path === b.path) return 0;\n return a.path < b.path ? -1 : 1;\n}\n\nexport function readRepositoryTree(\n rootPath: string,\n options: ReadRepositoryTreeOptions = {}\n): RepositoryTree {\n const resolvedRoot = path.resolve(rootPath);\n const gitRoot = gitPath(resolvedRoot, ['rev-parse', '--show-toplevel']);\n if (!gitRoot) {\n throw new RepositoryReadError(\n 'not_git_repository',\n `${resolvedRoot} is not inside a git repository.`\n );\n }\n\n const trackedAndUntracked = runGit(gitRoot, [\n 'ls-files',\n '--cached',\n '--others',\n '--exclude-standard'\n ]);\n const filePaths = trackedAndUntracked\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n\n const directoryPaths = new Set<string>();\n for (const filePath of filePaths) addDirectoryAncestors(directoryPaths, filePath);\n\n const entries = [\n ...Array.from(directoryPaths, directoryPath => toEntry(directoryPath, 'directory')),\n ...filePaths.map(filePath => toEntry(filePath, 'file'))\n ].sort(compareEntries);\n\n const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;\n const truncated = entries.length > maxEntries;\n\n return {\n rootPath: resolvedRoot,\n gitRoot: path.resolve(gitRoot),\n branch: gitPath(gitRoot, ['branch', '--show-current']),\n commit: gitPath(gitRoot, ['rev-parse', '--short', 'HEAD']),\n entries: truncated ? entries.slice(0, maxEntries) : entries,\n truncated\n };\n}\n", "import { execFileSync } from 'node:child_process';\n\nexport type GitRun = { ok: boolean; stdout: string; stderr: string };\n\nexport function runGit(cwd: string, args: string[]): string {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n maxBuffer: 2 * 1024 * 1024\n }).trim();\n } catch {\n return '';\n }\n}\n\n/** Surfaces failure (exit code + stderr) for mutations where the outcome drives typed errors. */\nexport function runGitResult(cwd: string, args: string[]): GitRun {\n try {\n const stdout = execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n maxBuffer: 16 * 1024 * 1024\n });\n return { ok: true, stdout: stdout.trim(), stderr: '' };\n } catch (error) {\n const e = error as { stdout?: string | Buffer; stderr?: string | Buffer };\n return {\n ok: false,\n stdout: (e.stdout ? String(e.stdout) : '').trim(),\n stderr: (e.stderr ? String(e.stderr) : '').trim()\n };\n }\n}\n", "import { existsSync, realpathSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { runGitResult } from './git-run.ts';\nimport type { ManagedWorktreeEntry, PurgeWorktreesResult } from './types.ts';\n\nexport function resolveRealPath(targetPath: string): string {\n try {\n return realpathSync.native(targetPath);\n } catch {\n return path.resolve(targetPath);\n }\n}\n\nexport function worktreeIsDirty(worktreePath: string): boolean {\n const status = runGitResult(worktreePath, ['status', '--porcelain']);\n return status.ok && status.stdout.length > 0;\n}\n\nexport function worktreePathForBranch(repoPath: string, branch: string): string | null {\n const out = runGitResult(repoPath, ['worktree', 'list', '--porcelain']);\n if (!out.ok) return null;\n let currentPath: string | null = null;\n for (const line of out.stdout.split('\\n')) {\n if (line.startsWith('worktree ')) {\n currentPath = line.slice('worktree '.length).trim();\n } else if (line.startsWith('branch ')) {\n const ref = line\n .slice('branch '.length)\n .trim()\n .replace(/^refs\\/heads\\//, '');\n if (ref === branch && currentPath) return currentPath;\n }\n }\n return null;\n}\n\nexport function removeGitWorktree({\n primaryRepoPath,\n worktreePath,\n force\n}: {\n primaryRepoPath: string;\n worktreePath: string;\n force: boolean;\n}): boolean {\n const args = ['worktree', 'remove'];\n if (force) args.push('--force');\n args.push(worktreePath);\n runGitResult(primaryRepoPath, args);\n runGitResult(primaryRepoPath, ['worktree', 'prune']);\n return !existsSync(worktreePath);\n}\n\nexport function collectManagedWorktrees({\n worktreeRoot,\n projects\n}: {\n worktreeRoot: string;\n projects: Array<{ primaryRepoPath: string }>;\n}): ManagedWorktreeEntry[] {\n const resolvedRoot = resolveRealPath(worktreeRoot);\n const entries: ManagedWorktreeEntry[] = [];\n const seen = new Set<string>();\n\n for (const project of projects) {\n const repoPath = project.primaryRepoPath;\n if (!repoPath || !existsSync(repoPath)) continue;\n const out = runGitResult(repoPath, ['worktree', 'list', '--porcelain']);\n if (!out.ok) continue;\n\n let currentPath: string | null = null;\n let currentBranch: string | null = null;\n const flush = (): void => {\n if (!currentPath) return;\n const resolved = resolveRealPath(currentPath);\n const underRoot = resolved === resolvedRoot || resolved.startsWith(resolvedRoot + path.sep);\n if (underRoot && !seen.has(resolved)) {\n seen.add(resolved);\n entries.push({\n path: resolved,\n branch: currentBranch,\n primaryRepoPath: repoPath,\n dirty: worktreeIsDirty(resolved)\n });\n }\n currentPath = null;\n currentBranch = null;\n };\n\n for (const line of out.stdout.split('\\n')) {\n if (line.startsWith('worktree ')) {\n flush();\n currentPath = line.slice('worktree '.length).trim();\n } else if (line.startsWith('branch ')) {\n currentBranch = line\n .slice('branch '.length)\n .trim()\n .replace(/^refs\\/heads\\//, '');\n } else if (line.trim() === '') {\n flush();\n }\n }\n flush();\n }\n\n return entries;\n}\n\nexport function removeManagedWorktree({\n path: worktreePath,\n primaryRepoPath,\n force\n}: {\n path: string;\n primaryRepoPath: string;\n force: boolean;\n}): PurgeWorktreesResult {\n const target = path.resolve(worktreePath);\n if (!force && worktreeIsDirty(target)) {\n return {\n removed: [],\n skipped: [{ path: target, reason: 'uncommitted changes' }]\n };\n }\n const removed = removeGitWorktree({ primaryRepoPath, worktreePath: target, force });\n return removed\n ? { removed: [target], skipped: [] }\n : { removed: [], skipped: [{ path: target, reason: 'git refused to remove the worktree' }] };\n}\n\nexport function purgeManagedWorktrees({\n entries\n}: {\n entries: Array<{ path: string; primaryRepoPath: string }>;\n}): PurgeWorktreesResult {\n const removed: string[] = [];\n const skipped: Array<{ path: string; reason: string }> = [];\n for (const entry of entries) {\n const target = path.resolve(entry.path);\n if (worktreeIsDirty(target)) {\n skipped.push({ path: target, reason: 'uncommitted changes' });\n continue;\n }\n if (\n removeGitWorktree({\n primaryRepoPath: entry.primaryRepoPath,\n worktreePath: target,\n force: false\n })\n ) {\n removed.push(target);\n } else {\n skipped.push({ path: target, reason: 'git refused to remove the worktree' });\n }\n }\n return { removed, skipped };\n}\n", "import { existsSync } from 'node:fs';\n\nimport { runGitResult } from './git-run.ts';\nimport type { BranchActionKind, PerformBranchActionInput } from './types.ts';\nimport { removeGitWorktree, worktreeIsDirty, worktreePathForBranch } from './worktree-git.ts';\n\nexport type BranchActionErrorCode =\n | 'BRANCH_NO_WORKTREE'\n | 'BRANCH_WORKTREE_MISMATCH'\n | 'BRANCH_DIRTY'\n | 'BRANCH_MERGE_CONFLICT'\n | 'BRANCH_PARENT_NOT_CHECKED_OUT'\n | 'BRANCH_MERGE_FAILED'\n | 'BRANCH_COMMIT_MESSAGE_REQUIRED'\n | 'BRANCH_NOTHING_TO_COMMIT'\n | 'BRANCH_COMMIT_FAILED'\n | 'BRANCH_PUSH_FAILED';\n\nexport type BranchActionGitResult =\n | { ok: true; summary: string }\n | { ok: false; code: BranchActionErrorCode; message: string; detail?: string };\n\nfunction integrateBranch(input: PerformBranchActionInput): BranchActionGitResult {\n const { branchName, baseBranch, worktreePath, primaryRepoPath } = input;\n if (!existsSync(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NO_WORKTREE',\n message: `The branch's worktree is not present at ${worktreePath}.`\n };\n }\n const wtBranch = runGitResult(worktreePath, ['branch', '--show-current']);\n if (!wtBranch.ok || wtBranch.stdout !== branchName) {\n return {\n ok: false,\n code: 'BRANCH_WORKTREE_MISMATCH',\n message: `The worktree at ${worktreePath} is not checked out on ${branchName}.`\n };\n }\n if (worktreeIsDirty(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_DIRTY',\n message: `The branch worktree has uncommitted changes \u2014 resolve/commit them first: ${worktreePath}`,\n detail: worktreePath\n };\n }\n\n const merge = runGitResult(worktreePath, ['merge', '--no-edit', baseBranch]);\n if (!merge.ok) {\n const conflicted = runGitResult(worktreePath, ['diff', '--name-only', '--diff-filter=U']);\n const files = conflicted.ok && conflicted.stdout ? conflicted.stdout.split('\\n') : [];\n const detail =\n `Worktree: ${worktreePath}.` +\n (files.length ? ` Conflicting files: ${files.join(', ')}.` : '');\n return {\n ok: false,\n code: 'BRANCH_MERGE_CONFLICT',\n message: `Merging ${baseBranch} into ${branchName} hit conflicts.`,\n detail\n };\n }\n\n const parentWorktree = worktreePathForBranch(primaryRepoPath, baseBranch);\n if (!parentWorktree) {\n return {\n ok: false,\n code: 'BRANCH_PARENT_NOT_CHECKED_OUT',\n message: `Cannot advance ${baseBranch}: it is not checked out in any worktree. Check out ${baseBranch} in the primary repository and re-run.`\n };\n }\n if (worktreeIsDirty(parentWorktree)) {\n return {\n ok: false,\n code: 'BRANCH_DIRTY',\n message: `The ${baseBranch} checkout has uncommitted changes \u2014 commit or stash them first: ${parentWorktree}`,\n detail: parentWorktree\n };\n }\n const advance = runGitResult(parentWorktree, [\n 'merge',\n '--no-ff',\n '--no-edit',\n '-m',\n `Merge ${branchName} into ${baseBranch}`,\n branchName\n ]);\n if (!advance.ok) {\n return {\n ok: false,\n code: 'BRANCH_MERGE_FAILED',\n message: `Failed to advance ${baseBranch} to ${branchName}.`,\n detail: advance.stderr || advance.stdout\n };\n }\n return {\n ok: true,\n summary: `Merged ${baseBranch} into ${branchName} and advanced ${baseBranch} locally.`\n };\n}\n\nfunction commitBranch(input: PerformBranchActionInput): BranchActionGitResult {\n const { branchName, worktreePath } = input;\n const trimmed = (input.message ?? '').trim();\n if (!trimmed) {\n return {\n ok: false,\n code: 'BRANCH_COMMIT_MESSAGE_REQUIRED',\n message: 'A commit message is required.'\n };\n }\n if (!existsSync(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NO_WORKTREE',\n message: `The branch's worktree is not present at ${worktreePath}.`\n };\n }\n const wtBranch = runGitResult(worktreePath, ['branch', '--show-current']);\n if (!wtBranch.ok || wtBranch.stdout !== branchName) {\n return {\n ok: false,\n code: 'BRANCH_WORKTREE_MISMATCH',\n message: `The worktree at ${worktreePath} is not checked out on ${branchName}.`\n };\n }\n if (!worktreeIsDirty(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NOTHING_TO_COMMIT',\n message: 'There are no uncommitted changes in the branch worktree to commit.',\n detail: worktreePath\n };\n }\n const staged = runGitResult(worktreePath, ['add', '-A']);\n if (!staged.ok) {\n return {\n ok: false,\n code: 'BRANCH_COMMIT_FAILED',\n message: `Failed to stage changes in ${worktreePath}.`,\n detail: staged.stderr || staged.stdout\n };\n }\n const commit = runGitResult(worktreePath, ['commit', '-m', trimmed]);\n if (!commit.ok) {\n return {\n ok: false,\n code: 'BRANCH_COMMIT_FAILED',\n message: `Failed to commit changes on ${branchName}.`,\n detail: commit.stderr || commit.stdout\n };\n }\n return { ok: true, summary: `Committed changes on ${branchName}.` };\n}\n\nfunction pushParent(input: PerformBranchActionInput): BranchActionGitResult {\n const { branchName, baseBranch, worktreePath, primaryRepoPath } = input;\n const repo = worktreePathForBranch(primaryRepoPath, baseBranch) ?? primaryRepoPath;\n const push = runGitResult(repo, ['push', 'origin', baseBranch]);\n if (!push.ok) {\n return {\n ok: false,\n code: 'BRANCH_PUSH_FAILED',\n message: `Failed to push ${baseBranch} to origin.`,\n detail: push.stderr || push.stdout\n };\n }\n let summary = `Pushed ${baseBranch} to origin.`;\n if (existsSync(worktreePath) && !worktreeIsDirty(worktreePath)) {\n if (removeGitWorktree({ primaryRepoPath, worktreePath, force: false })) {\n summary += ` Removed the merged worktree for ${branchName}.`;\n }\n }\n return { ok: true, summary };\n}\n\nfunction publishBranch(input: PerformBranchActionInput): BranchActionGitResult {\n const { branchName, worktreePath, primaryRepoPath } = input;\n const repo = existsSync(worktreePath) ? worktreePath : primaryRepoPath;\n const push = runGitResult(repo, ['push', '-u', 'origin', branchName]);\n if (!push.ok) {\n return {\n ok: false,\n code: 'BRANCH_PUSH_FAILED',\n message: `Failed to publish ${branchName} to origin.`,\n detail: push.stderr || push.stdout\n };\n }\n return { ok: true, summary: `Published ${branchName} to origin.` };\n}\n\nexport function performBranchActionGit(input: PerformBranchActionInput): BranchActionGitResult {\n switch (input.action) {\n case 'integrate':\n return integrateBranch(input);\n case 'commit':\n return commitBranch(input);\n case 'push_parent':\n return pushParent(input);\n case 'publish':\n return publishBranch(input);\n default:\n return {\n ok: false,\n code: 'BRANCH_COMMIT_FAILED',\n message: `Unsupported branch action: ${String(input.action)}`\n };\n }\n}\n", "import { runGit } from './git-run.ts';\n\nexport type BranchPublicationStatus = 'created' | 'published' | 'merged_unpushed' | 'merged';\n\n/** Resolves the absolute SHA a ref points at, or null when the ref does not exist. */\nexport function resolveRef(repoPath: string, ref: string): string | null {\n const sha = runGit(repoPath, ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`]);\n return sha || null;\n}\n\n/** True when `sha` sits on the base's first-parent trunk (merge-with-parent semantics). */\nexport function isOnFirstParentTrunk(repoPath: string, base: string, sha: string): boolean {\n const trunk = runGit(repoPath, ['rev-list', '--first-parent', base]);\n if (!trunk) return false;\n return trunk.split('\\n').some(line => line.trim() === sha);\n}\n\n/** True when the branch tip is contained in the base via a non-ff merge (not merely reachable). */\nexport function branchMergedIntoBase(repoPath: string, branchSha: string, base: string): boolean {\n const baseSha = resolveRef(repoPath, base);\n if (!baseSha) return false;\n if (baseSha === branchSha) return false;\n const ahead = runGit(repoPath, ['rev-list', '--count', `${baseSha}..${branchSha}`]).trim();\n if (ahead !== '0') return false;\n return !isOnFirstParentTrunk(repoPath, base, branchSha);\n}\n\n/**\n * Derive mission-branch publication status from live git refs in a repo checkout.\n * Callers supply `repoPath` after resolving id \u2192 path (DB-free provider input).\n */\nexport function deriveBranchPublicationStatus({\n repoPath,\n branchName,\n baseBranch\n}: {\n repoPath: string;\n branchName: string;\n baseBranch: string | null;\n}): BranchPublicationStatus {\n const branchSha =\n resolveRef(repoPath, `refs/heads/${branchName}`) ??\n resolveRef(repoPath, `refs/remotes/origin/${branchName}`);\n const remoteExists = resolveRef(repoPath, `refs/remotes/origin/${branchName}`) !== null;\n if (!branchSha) return 'created';\n\n if (baseBranch) {\n if (branchMergedIntoBase(repoPath, branchSha, `origin/${baseBranch}`)) return 'merged';\n if (branchMergedIntoBase(repoPath, branchSha, baseBranch)) return 'merged_unpushed';\n }\n\n return remoteExists ? 'published' : 'created';\n}\n\n/** True when the local branch tip is ahead of `origin/<branchName>`. */\nexport function branchHasUnpushedCommits({\n repoPath,\n branchName\n}: {\n repoPath: string;\n branchName: string;\n}): boolean {\n const localSha = resolveRef(repoPath, `refs/heads/${branchName}`);\n const remoteSha = resolveRef(repoPath, `refs/remotes/origin/${branchName}`);\n if (!localSha || !remoteSha || localSha === remoteSha) return false;\n const ahead = runGit(repoPath, ['rev-list', '--count', `${remoteSha}..${localSha}`]).trim();\n return ahead !== '0' && ahead !== '';\n}\n\nexport function normalizeBranchRef(ref: string): string {\n return ref\n .replace(/^origin\\//, '')\n .replace(/^refs\\/heads\\//, '')\n .replace(/^refs\\/remotes\\/origin\\//, '')\n .trim();\n}\n\n/** Current branch in the primary worktree, or null when not on a branch. */\nexport function readPrimaryCheckoutBranch(repoPath: string): string | null {\n const worktrees = runGit(repoPath, ['worktree', 'list', '--porcelain']);\n let inMainWorktree = false;\n for (const line of worktrees.split('\\n')) {\n if (line.startsWith('worktree ')) {\n if (inMainWorktree) break;\n inMainWorktree = true;\n continue;\n }\n if (!inMainWorktree || !line.startsWith('branch ')) continue;\n const branch = normalizeBranchRef(line.slice('branch '.length));\n return branch || null;\n }\n\n const current = runGit(repoPath, ['branch', '--show-current']);\n return current || null;\n}\n", "import { existsSync } from 'node:fs';\n\nimport { runGitResult } from './git-run.ts';\nimport { worktreeIsDirty } from './worktree-git.ts';\n\nexport type CommitMessageGatherErrorCode = 'BRANCH_NO_WORKTREE' | 'BRANCH_NOTHING_TO_COMMIT';\n\nexport type CommitMessageGatherResult =\n | { ok: true; diff: string }\n | { ok: false; code: CommitMessageGatherErrorCode; message: string; detail?: string };\n\n/** Read-only snapshot of uncommitted work for commit-message drafting. */\nexport function collectWorktreeChanges(worktreePath: string): string {\n const status = runGitResult(worktreePath, ['status', '--porcelain']);\n const diff = runGitResult(worktreePath, ['diff', 'HEAD']);\n const sections: string[] = [];\n if (status.ok && status.stdout) {\n sections.push(`Changed files (git status --porcelain):\\n${status.stdout}`);\n }\n if (diff.ok && diff.stdout) {\n sections.push(`Diff against HEAD:\\n${diff.stdout}`);\n }\n return sections.join('\\n\\n');\n}\n\nexport function gatherCommitMessageDiff(worktreePath: string): CommitMessageGatherResult {\n if (!existsSync(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NO_WORKTREE',\n message: `The branch's worktree is not present at ${worktreePath}.`\n };\n }\n if (!worktreeIsDirty(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NOTHING_TO_COMMIT',\n message: 'There are no uncommitted changes to draft a commit message from.',\n detail: worktreePath\n };\n }\n return { ok: true, diff: collectWorktreeChanges(worktreePath) };\n}\n", "import { execFileSync } from 'node:child_process';\n\nimport type { DoctorCheck } from './types.ts';\n\nexport function commandOnPath(command: string, args: string[]): DoctorCheck {\n try {\n const detail = execFileSync(command, args, {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore']\n }).trim();\n return { name: command, ok: true, detail: detail || 'found on PATH' };\n } catch {\n return { name: command, ok: false, detail: `${command} not found on PATH` };\n }\n}\n\n/** Portable local-target health checks that do not require CLI connector state. */\nexport function runLocalTargetDoctorChecks(): DoctorCheck[] {\n return [commandOnPath('git', ['--version']), commandOnPath('node', ['--version'])];\n}\n", "// Result constructors and guards for the local-target capability contract.\n// Keeping these tiny helpers in one place means providers never hand-assemble\n// the discriminated union (and never forget the `target` metadata).\n\nimport type {\n CapabilityFailure,\n CapabilityResult,\n CapabilitySuccess,\n LocalTargetErrorCode,\n TargetMetadata\n} from './types.ts';\n\n/** Build a success result carrying the originating target metadata. */\nexport function ok<T>(target: TargetMetadata, value: T): CapabilitySuccess<T> {\n return { ok: true, value, target };\n}\n\n/** Build a typed failure result carrying the originating target metadata. */\nexport function fail(\n target: TargetMetadata,\n code: LocalTargetErrorCode,\n message: string,\n details?: unknown\n): CapabilityFailure {\n return details === undefined\n ? { ok: false, code, message, target }\n : { ok: false, code, message, details, target };\n}\n\n/** Narrow a result to its success branch. */\nexport function isOk<T>(result: CapabilityResult<T>): result is CapabilitySuccess<T> {\n return result.ok;\n}\n\n/** Narrow a result to its failure branch. */\nexport function isFailure<T>(result: CapabilityResult<T>): result is CapabilityFailure {\n return !result.ok;\n}\n", "// The in-process provider transport: capabilities served by direct calls on a\n// machine co-located with the checkout \u2014 the Local SQLite backend, or the local\n// runner acting on its own machine (design \u00A74 \"Transport & Providers\").\n//\n// Capability bodies accrue here as WS-D migrates each caller off its ad-hoc\n// `existsSync`/`git` call. Capabilities not yet routed return a typed\n// CAPABILITY_NOT_IMPLEMENTED failure (never throw), so a partially-migrated\n// provider is still safe to hand to any caller.\n\nimport { existsSync } from 'node:fs';\n\nimport {\n readRepositoryTree as readGitRepositoryTree,\n RepositoryReadError\n} from '../../repository/git-tree.ts';\n\nimport { performBranchActionGit } from './branch-actions-git.ts';\nimport { normalizeBranchRef } from './branch-status-git.ts';\nimport { gatherCommitMessageDiff } from './commit-message-diff-git.ts';\nimport { runLocalTargetDoctorChecks } from './doctor-checks.ts';\nimport { runGit } from './git-run.ts';\nimport { writeProjectJson } from './project-metadata.ts';\nimport { fail, ok } from './result.ts';\nimport type {\n CapabilityFailure,\n CapabilityResult,\n GenerateCommitMessageInput,\n LaunchAgentInput,\n ListBranchesInput,\n ListWorktreesInput,\n LocalTargetCapabilities,\n ObserveResourceInput,\n PerformBranchActionInput,\n PrepareBranchInput,\n PurgeMergedWorktreesInput,\n ReadCurrentDiffInput,\n ReadRepositoryTreeInput,\n RemoveWorktreeInput,\n ResourceObservation,\n TargetMetadata,\n WriteProjectMetadataInput,\n WriteProjectMetadataResult\n} from './types.ts';\nimport {\n collectManagedWorktrees,\n purgeManagedWorktrees,\n removeManagedWorktree\n} from './worktree-git.ts';\n\nexport class InProcessProvider implements LocalTargetCapabilities {\n constructor(readonly target: TargetMetadata) {}\n\n // ---- routed (WS-D 1) -------------------------------------------------\n\n /**\n * Observe whether the linked checkout exists on this machine. Byte-identical\n * to the prior host-side `existsSync(path)` check the resource-status\n * derivation used (available/missing); richer git-root/branch/commit\n * enrichment is an additive follow-up.\n */\n async observeResource(\n input: ObserveResourceInput\n ): Promise<CapabilityResult<ResourceObservation>> {\n const observedAt = new Date().toISOString();\n const state = existsSync(input.path) ? 'available' : 'missing';\n return ok(this.target, { state, observedAt });\n }\n\n /**\n * Write the linked checkout's `.overlord/project.json` on this machine (WS-D 2).\n * Only reachable when this provider was resolved (co-located backend / local\n * runner); a hosted backend resolves an unavailable provider instead and never\n * writes to its own filesystem.\n */\n async writeProjectMetadata(\n input: WriteProjectMetadataInput\n ): Promise<CapabilityResult<WriteProjectMetadataResult>> {\n try {\n const metadataPath = writeProjectJson(input);\n return ok(this.target, { path: metadataPath, written: true });\n } catch (error) {\n return fail(\n this.target,\n 'TARGET_OPERATION_FAILED',\n `Failed to write project metadata: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n // ---- routed (WS-D 3) -------------------------------------------------\n\n async readRepositoryTree(input: ReadRepositoryTreeInput) {\n try {\n const tree = readGitRepositoryTree(input.repoPath);\n return ok(this.target, {\n rootPath: tree.rootPath,\n gitRoot: tree.gitRoot,\n branch: tree.branch,\n commit: tree.commit,\n entries: tree.entries,\n truncated: tree.truncated\n });\n } catch (error) {\n if (error instanceof RepositoryReadError && error.code === 'not_git_repository') {\n return fail(this.target, 'NOT_GIT_REPOSITORY', error.message, {\n resourceId: input.resourceId\n });\n }\n return fail(\n this.target,\n 'TARGET_OPERATION_FAILED',\n error instanceof Error ? error.message : 'Could not read repository.',\n { resourceId: input.resourceId }\n );\n }\n }\n\n async listBranches(input: ListBranchesInput) {\n try {\n const local = runGit(input.repoPath, ['branch', '--format=%(refname:short)']);\n const remote = runGit(input.repoPath, ['branch', '-r', '--format=%(refname:short)']);\n const current = runGit(input.repoPath, ['branch', '--show-current']) || null;\n return ok(this.target, {\n local: local\n .split('\\n')\n .map(normalizeBranchRef)\n .filter(name => name && !name.includes('->') && name !== 'HEAD'),\n remote: remote\n .split('\\n')\n .map(normalizeBranchRef)\n .filter(name => name && !name.includes('->') && name !== 'HEAD'),\n current\n });\n } catch (error) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n error instanceof Error ? error.message : 'Could not list repository branches.',\n { resourceId: input.resourceId }\n );\n }\n }\n\n // ---- routed (WS-D 4) -------------------------------------------------\n\n async listWorktrees(input: ListWorktreesInput) {\n try {\n const worktrees = collectManagedWorktrees(input);\n return ok(this.target, { worktrees });\n } catch (error) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n error instanceof Error ? error.message : 'Could not list worktrees.'\n );\n }\n }\n\n async removeWorktree(input: RemoveWorktreeInput) {\n try {\n const result = removeManagedWorktree({\n path: input.path,\n primaryRepoPath: input.primaryRepoPath,\n force: input.force ?? false\n });\n if (!input.force && result.skipped.some(s => s.reason === 'uncommitted changes')) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n `The worktree has uncommitted changes \u2014 removing it would lose work: ${input.path}`,\n { branchActionCode: 'WORKTREE_DIRTY', detail: 'Re-run with force to remove it anyway.' }\n );\n }\n return ok(this.target, result);\n } catch (error) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n error instanceof Error ? error.message : 'Could not remove worktree.'\n );\n }\n }\n\n async purgeMergedWorktrees(input: PurgeMergedWorktreesInput) {\n try {\n return ok(this.target, purgeManagedWorktrees(input));\n } catch (error) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n error instanceof Error ? error.message : 'Could not purge worktrees.'\n );\n }\n }\n\n async performBranchAction(input: PerformBranchActionInput) {\n const result = performBranchActionGit(input);\n if (result.ok) return ok(this.target, { summary: result.summary });\n return fail(this.target, 'GIT_COMMAND_FAILED', result.message, {\n branchActionCode: result.code,\n detail: result.detail\n });\n }\n\n // ---- routed (WS-D 5) -------------------------------------------------\n\n async generateCommitMessageFromLocalDiff(input: GenerateCommitMessageInput) {\n const result = gatherCommitMessageDiff(input.worktreePath);\n if (!result.ok) {\n return fail(this.target, 'GIT_COMMAND_FAILED', result.message, {\n branchActionCode: result.code,\n detail: result.detail\n });\n }\n return ok(this.target, { diff: result.diff });\n }\n\n // ---- routed (WS-D 6) -------------------------------------------------\n\n async launchAgent(_input: LaunchAgentInput) {\n return fail(\n this.target,\n 'CAPABILITY_NOT_IMPLEMENTED',\n 'Agent launch is owned by the CLI runner (`ovld runner` / `ovld launch`).'\n );\n }\n\n async doctor() {\n return ok(this.target, { checks: runLocalTargetDoctorChecks() });\n }\n\n // ---- not yet routed (CLI-owned or future WS-D paths) -----------------\n\n prepareBranch(_input: PrepareBranchInput) {\n return this.#notImplemented();\n }\n readCurrentDiff(_input: ReadCurrentDiffInput) {\n return this.#notImplemented();\n }\n\n #notImplemented(): Promise<CapabilityFailure> {\n return Promise.resolve(\n fail(\n this.target,\n 'CAPABILITY_NOT_IMPLEMENTED',\n 'This capability is not yet routed through the in-process provider.'\n )\n );\n }\n}\n", "// Provider registry/resolver: maps a selected execution *target* to a capability\n// *provider transport*. Callers select a target, never a transport \u2014 the\n// resolver picks in-process / desktop-bridge / runner-queue from the target's\n// type and reachability (R2). This keeps the same product code working whether\n// the chosen target is co-located, across an IPC bridge, or a CLI-only VM on the\n// far side of the runner queue.\n\nimport { fail } from './result.ts';\nimport type {\n CapabilityFailure,\n GenerateCommitMessageInput,\n LaunchAgentInput,\n ListBranchesInput,\n ListWorktreesInput,\n LocalTargetCapabilities,\n LocalTargetErrorCode,\n ObserveResourceInput,\n PerformBranchActionInput,\n PrepareBranchInput,\n PurgeMergedWorktreesInput,\n ReadCurrentDiffInput,\n ReadRepositoryTreeInput,\n RemoveWorktreeInput,\n TargetMetadata,\n WriteProjectMetadataInput\n} from './types.ts';\n\n/**\n * The minimal view of an execution target the resolver needs. Built from\n * `execution_targets` rows plus reachability joined from \u00A75 observations; kept\n * structural so this module stays dependency-free.\n */\nexport interface ExecutionTargetRef {\n executionTargetId: string | null;\n /** `execution_targets.type`: 'local' | 'cloud_persistent' | 'cloud_sandbox' | 'ssh' | \u2026 */\n type: string;\n deviceLabel?: string | null;\n /** Whether the target is currently reachable (from heartbeat/observations). */\n reachable?: boolean;\n}\n\n/**\n * A factory inspects a target and returns a provider that can serve it, or\n * `null` to defer to the next factory. Registration order is priority order.\n */\nexport type LocalTargetProviderFactory = (\n target: ExecutionTargetRef\n) => LocalTargetCapabilities | null;\n\nexport class LocalTargetProviderRegistry {\n readonly #factories: LocalTargetProviderFactory[] = [];\n\n /** Register a factory. Earlier registrations win. */\n register(factory: LocalTargetProviderFactory): this {\n this.#factories.push(factory);\n return this;\n }\n\n /** Resolve a provider for the target, or `null` when none can serve it. */\n resolve(target: ExecutionTargetRef): LocalTargetCapabilities | null {\n for (const factory of this.#factories) {\n const provider = factory(target);\n if (provider) return provider;\n }\n return null;\n }\n\n /**\n * Resolve a provider, falling back to an {@link UnavailableProvider} that\n * returns `LOCAL_TARGET_REQUIRED` from every capability. Callers then always\n * get a typed {@link CapabilityResult} and never have to null-check.\n */\n resolveOrUnavailable(target: ExecutionTargetRef): LocalTargetCapabilities {\n return (\n this.resolve(target) ??\n new UnavailableProvider(\n targetMetadata(target, 'fake'),\n 'LOCAL_TARGET_REQUIRED',\n 'No local execution target is available to serve this operation. Select a logged-in target with access to this checkout.'\n )\n );\n }\n}\n\n/** Derive {@link TargetMetadata} for a target ref under a given transport. */\nexport function targetMetadata(\n target: ExecutionTargetRef,\n transport: TargetMetadata['transport']\n): TargetMetadata {\n return {\n executionTargetId: target.executionTargetId,\n deviceLabel: target.deviceLabel ?? null,\n transport\n };\n}\n\n/**\n * A provider whose every capability returns the same typed failure. Used when no\n * transport can serve a target (the generalized successor to the host-side\n * `LOCAL_FILESYSTEM_UNAVAILABLE` guard) and as a base for partial providers.\n */\nexport class UnavailableProvider implements LocalTargetCapabilities {\n constructor(\n readonly target: TargetMetadata,\n private readonly code: LocalTargetErrorCode,\n private readonly message: string\n ) {}\n\n // A CapabilityFailure is assignable to CapabilityResult<T> for any T (the\n // failure branch is generic-independent), so one helper serves every method.\n #fail(): Promise<CapabilityFailure> {\n return Promise.resolve(fail(this.target, this.code, this.message));\n }\n\n writeProjectMetadata(_input: WriteProjectMetadataInput) {\n return this.#fail();\n }\n observeResource(_input: ObserveResourceInput) {\n return this.#fail();\n }\n readRepositoryTree(_input: ReadRepositoryTreeInput) {\n return this.#fail();\n }\n listBranches(_input: ListBranchesInput) {\n return this.#fail();\n }\n prepareBranch(_input: PrepareBranchInput) {\n return this.#fail();\n }\n listWorktrees(_input: ListWorktreesInput) {\n return this.#fail();\n }\n removeWorktree(_input: RemoveWorktreeInput) {\n return this.#fail();\n }\n purgeMergedWorktrees(_input: PurgeMergedWorktreesInput) {\n return this.#fail();\n }\n performBranchAction(_input: PerformBranchActionInput) {\n return this.#fail();\n }\n readCurrentDiff(_input: ReadCurrentDiffInput) {\n return this.#fail();\n }\n generateCommitMessageFromLocalDiff(_input: GenerateCommitMessageInput) {\n return this.#fail();\n }\n launchAgent(_input: LaunchAgentInput) {\n return this.#fail();\n }\n doctor() {\n return this.#fail();\n }\n}\n", "import type { DatabaseClient } from '@overlord/database';\n\nimport type { ServiceContext } from './context.js';\nimport { newId, nowIso } from './util.js';\n\n// Mirrors the canonical `ChangeOperation` in `@overlord/contract`. Kept as a\n// local definition because `@overlord/core` does not depend on the contract\n// package; it must stay a superset of every operation either data layer records.\nexport type ChangeOperation = 'insert' | 'update' | 'delete' | 'restore';\n\n/**\n * The fully-resolved column values for one `entity_changes` row. Every caller\n * resolves its own context (workspace/actor/source/token) and hands the result\n * to {@link insertEntityChange}, so the raw SQL and column order live in exactly\n * one place and the REST and protocol writers cannot silently diverge.\n */\nexport interface EntityChangeFields {\n workspaceId: string;\n projectId?: string | null;\n missionId?: string | null;\n objectiveId?: string | null;\n entityType: string;\n entityId: string;\n operation: ChangeOperation;\n entityRevision?: number | null;\n changedFields?: string[];\n actorWorkspaceUserId: string | null;\n /** REST path fills this from the active token; the protocol path leaves it NULL. */\n actorTokenId?: string | null;\n source: string;\n}\n\n/**\n * The single `entity_changes` writer shared by both data layers (the REST\n * `backend/db.ts` path and the protocol/CLI service path). This must run\n * inside the same transaction as the domain mutation so the realtime feed never\n * diverges from the data; the realtime poller turns these rows into SSE deltas.\n */\nexport async function insertEntityChange(\n client: DatabaseClient,\n fields: EntityChangeFields\n): Promise<void> {\n await client.run(\n `INSERT INTO entity_changes (\n id, workspace_id, project_id, mission_id, objective_id,\n entity_type, entity_id, operation, entity_revision,\n changed_fields_json, actor_workspace_user_id, actor_token_id, source, occurred_at\n ) VALUES (\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?, ?\n )`,\n [\n newId(),\n fields.workspaceId,\n fields.projectId ?? null,\n fields.missionId ?? null,\n fields.objectiveId ?? null,\n fields.entityType,\n fields.entityId,\n fields.operation,\n fields.entityRevision ?? null,\n JSON.stringify(fields.changedFields ?? []),\n fields.actorWorkspaceUserId,\n fields.actorTokenId ?? null,\n fields.source,\n nowIso()\n ]\n );\n}\n\nexport async function recordChange({\n ctx,\n entityType,\n entityId,\n operation,\n entityRevision,\n projectId,\n missionId,\n objectiveId,\n changedFields\n}: {\n ctx: ServiceContext;\n entityType: string;\n entityId: string;\n operation: ChangeOperation;\n entityRevision?: number | null;\n projectId?: string | null;\n missionId?: string | null;\n objectiveId?: string | null;\n changedFields?: string[];\n}): Promise<void> {\n await insertEntityChange(ctx.db, {\n workspaceId: ctx.workspace.id,\n projectId,\n missionId,\n objectiveId,\n entityType,\n entityId,\n operation,\n entityRevision,\n changedFields,\n actorWorkspaceUserId: ctx.actorWorkspaceUserId,\n // The protocol/service path does not attribute changes to a token.\n actorTokenId: null,\n source: ctx.source\n });\n}\n", "export class ServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status = 400,\n /** Structured, machine-readable payload for self-servicing error recovery. */\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'ServiceError';\n }\n}\n\nexport function assertFound<T>(value: T | null | undefined, message: string): T {\n if (value === null || value === undefined) {\n throw new ServiceError(message, 'not_found', 404);\n }\n return value;\n}\n", "import { type DatabaseClient } from '@overlord/database';\n\nimport type { ClientDeviceIdentity } from './device-identity.js';\nimport { ServiceError } from './errors.js';\n\nexport type WorkspaceContext = {\n id: string;\n slug: string;\n name: string;\n};\n\nexport type { ClientDeviceIdentity } from './device-identity.js';\n\nexport type ServiceContext = {\n db: DatabaseClient;\n workspace: WorkspaceContext;\n actorWorkspaceUserId: string | null;\n source: 'cli' | 'protocol' | 'webapp' | 'runner';\n /** Client machine identity (browser/desktop/CLI). Required on hosted backends. */\n clientDevice?: ClientDeviceIdentity | null;\n};\n\nexport async function createServiceContext({\n db,\n source\n}: {\n db: DatabaseClient;\n source: ServiceContext['source'];\n}): Promise<ServiceContext> {\n const workspace = await db.get<WorkspaceContext>(\n `SELECT id, slug, name FROM workspaces\n WHERE deleted_at IS NULL ORDER BY created_at ASC LIMIT 1`\n );\n\n if (!workspace) {\n throw new ServiceError(\n 'No workspace found. Run `ovld init` and `yarn start:local` first.',\n 'no_workspace',\n 503\n );\n }\n\n const actor = await db.get<{ id: string }>(\n `SELECT id FROM workspace_users\n WHERE workspace_id = ? AND status = 'active' AND deleted_at IS NULL\n ORDER BY created_at ASC LIMIT 1`,\n [workspace.id]\n );\n\n return {\n db,\n workspace,\n actorWorkspaceUserId: actor?.id ?? null,\n source\n };\n}\n\nexport async function resolveMissionId(\n ctx: ServiceContext,\n missionRef: string\n): Promise<{ id: string; displayId: string; projectId: string }> {\n const byId = await ctx.db.get<{ id: string; display_id: string; project_id: string }>(\n `SELECT id, display_id, project_id FROM missions\n WHERE id = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [missionRef, ctx.workspace.id]\n );\n\n if (byId) {\n return { id: byId.id, displayId: byId.display_id, projectId: byId.project_id };\n }\n\n const byDisplay = await ctx.db.get<{ id: string; display_id: string; project_id: string }>(\n `SELECT id, display_id, project_id FROM missions\n WHERE display_id = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [missionRef, ctx.workspace.id]\n );\n\n if (byDisplay) {\n return {\n id: byDisplay.id,\n displayId: byDisplay.display_id,\n projectId: byDisplay.project_id\n };\n }\n\n throw new ServiceError(`Mission not found: ${missionRef}`, 'mission_not_found', 404);\n}\n\nexport async function resolveProjectId(ctx: ServiceContext, projectRef: string): Promise<string> {\n const byId = await ctx.db.get<{ id: string }>(\n `SELECT id FROM projects\n WHERE id = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [projectRef, ctx.workspace.id]\n );\n if (byId) return byId.id;\n\n const bySlug = await ctx.db.get<{ id: string }>(\n `SELECT id FROM projects\n WHERE slug = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [projectRef, ctx.workspace.id]\n );\n if (bySlug) return bySlug.id;\n\n const byName = await ctx.db.get<{ id: string }>(\n `SELECT id FROM projects\n WHERE lower(name) = lower(?) AND workspace_id = ? AND deleted_at IS NULL`,\n [projectRef, ctx.workspace.id]\n );\n if (byName) return byName.id;\n\n throw new ServiceError(`Project not found: ${projectRef}`, 'project_not_found', 404);\n}\n", "import type { CapabilityFailure, CapabilitySuccess } from './local-target/types.ts';\nimport { recordChange } from './change-feed.ts';\nimport type { ServiceContext } from './context.ts';\nimport { resolveMissionId, resolveProjectId } from './context.ts';\nimport { ServiceError } from './errors.ts';\nimport { newId, nowIso } from './util.ts';\n\nexport const LOCAL_TARGET_MUTATION_METADATA_KEY = 'overlord.localTargetMutation';\nexport const LOCAL_TARGET_MUTATION_REQUESTED_SOURCE = 'local_target_mutation';\n\nexport type LocalTargetMutationKind = 'branch_action' | 'worktree_purge';\n\nexport type LocalTargetMutationCapability =\n | 'performBranchAction'\n | 'purgeMergedWorktrees'\n | 'removeWorktree';\n\nexport type LocalTargetMutationPayload = {\n kind: LocalTargetMutationKind;\n capability: LocalTargetMutationCapability;\n input: Record<string, unknown>;\n result?:\n | { ok: true; value: unknown }\n | { ok: false; code: string; message: string; details?: unknown };\n};\n\nexport type LocalTargetMutationResult = CapabilitySuccess<unknown> | CapabilityFailure;\n\nfunction parseMetadataObject(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nexport function buildLocalTargetMutationMetadata({\n kind,\n capability,\n input\n}: {\n kind: LocalTargetMutationKind;\n capability: LocalTargetMutationCapability;\n input: Record<string, unknown>;\n}): Record<string, unknown> {\n return {\n [LOCAL_TARGET_MUTATION_METADATA_KEY]: {\n kind,\n capability,\n input\n } satisfies LocalTargetMutationPayload\n };\n}\n\nexport function parseLocalTargetMutation(\n metadataJson: string | Record<string, unknown>\n): LocalTargetMutationPayload | null {\n const metadata =\n typeof metadataJson === 'string' ? parseMetadataObject(metadataJson) : metadataJson;\n const raw = metadata[LOCAL_TARGET_MUTATION_METADATA_KEY];\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n const payload = raw as Record<string, unknown>;\n const kind = payload.kind;\n const capability = payload.capability;\n if (kind !== 'branch_action' && kind !== 'worktree_purge') return null;\n if (\n capability !== 'performBranchAction' &&\n capability !== 'purgeMergedWorktrees' &&\n capability !== 'removeWorktree'\n ) {\n return null;\n }\n const input =\n payload.input && typeof payload.input === 'object' && !Array.isArray(payload.input)\n ? (payload.input as Record<string, unknown>)\n : {};\n const result = payload.result;\n const parsedResult =\n result && typeof result === 'object' && !Array.isArray(result)\n ? (result as LocalTargetMutationPayload['result'])\n : undefined;\n return {\n kind,\n capability,\n input,\n ...(parsedResult ? { result: parsedResult } : {})\n };\n}\n\nexport function isLocalTargetMutationMetadata(metadataJson: string): boolean {\n return parseLocalTargetMutation(metadataJson) !== null;\n}\n\nasync function resolveMutationObjectiveId({\n ctx,\n missionId\n}: {\n ctx: ServiceContext;\n missionId: string;\n}): Promise<string> {\n const row = (await ctx.db.get(\n `SELECT id FROM objectives\n WHERE mission_id = ? AND workspace_id = ? AND deleted_at IS NULL\n ORDER BY position ASC\n LIMIT 1`,\n [missionId, ctx.workspace.id]\n )) as { id: string } | undefined;\n if (!row) {\n throw new ServiceError(\n 'Mission has no objectives to anchor a local-target mutation request.',\n 'no_objective_for_mutation',\n 409\n );\n }\n return row.id;\n}\n\nexport async function createLocalTargetMutationRequest({\n ctx,\n projectId,\n missionId,\n executionTargetId,\n kind,\n capability,\n input,\n eventSummary\n}: {\n ctx: ServiceContext;\n projectId: string;\n missionId: string;\n executionTargetId: string;\n kind: LocalTargetMutationKind;\n capability: LocalTargetMutationCapability;\n input: Record<string, unknown>;\n eventSummary?: string;\n}): Promise<{ id: string }> {\n const mission = await resolveMissionId(ctx, missionId);\n const resolvedProjectId = await resolveProjectId(ctx, projectId);\n const objectiveId = await resolveMutationObjectiveId({ ctx, missionId: mission.id });\n const now = nowIso();\n const id = newId();\n const metadata = buildLocalTargetMutationMetadata({ kind, capability, input });\n\n await ctx.db.transaction(async tx => {\n const txCtx = { ...ctx, db: tx };\n await txCtx.db.run(\n `INSERT INTO execution_requests\n (id, workspace_id, project_id, mission_id, objective_id, execution_target_id,\n requested_agent, requested_model, requested_reasoning_effort, launch_mode,\n launch_flags_json, target_kind, requested_source, idempotency_key, status,\n requested_by_workspace_user_id, resolved_resource_id, resolved_working_directory,\n metadata_json, created_at, updated_at, revision)\n VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 'run', '{}', 'local', ?, NULL, 'queued', ?, NULL, NULL, ?, ?, ?, 1)`,\n [\n id,\n ctx.workspace.id,\n resolvedProjectId,\n mission.id,\n objectiveId,\n executionTargetId,\n LOCAL_TARGET_MUTATION_REQUESTED_SOURCE,\n ctx.actorWorkspaceUserId,\n JSON.stringify(metadata),\n now,\n now\n ]\n );\n await recordChange({\n ctx: txCtx,\n entityType: 'execution_request',\n entityId: id,\n operation: 'insert',\n entityRevision: 1,\n projectId: resolvedProjectId,\n missionId: mission.id,\n objectiveId,\n changedFields: ['status', 'requested_source', 'metadata_json']\n });\n await txCtx.db.run(\n `INSERT INTO mission_events\n (id, workspace_id, project_id, mission_id, objective_id, type, phase, summary,\n payload_json, source, actor_workspace_user_id, created_at)\n VALUES (?, ?, ?, ?, ?, 'execution_requested', 'execute', ?, ?, 'webapp', ?, ?)`,\n [\n newId(),\n ctx.workspace.id,\n resolvedProjectId,\n mission.id,\n objectiveId,\n eventSummary ?? `Queued ${kind.replace('_', ' ')} on remote execution target.`,\n JSON.stringify({ executionRequestId: id, kind, capability }),\n ctx.actorWorkspaceUserId,\n now\n ]\n );\n });\n\n return { id };\n}\n\nexport async function completeLocalTargetMutationRequest({\n ctx,\n requestId,\n result\n}: {\n ctx: ServiceContext;\n requestId: string;\n result: LocalTargetMutationResult;\n}): Promise<LocalTargetMutationPayload | null> {\n const row = (await ctx.db.get(\n `SELECT id, workspace_id, project_id, mission_id, objective_id, status, revision, metadata_json,\n requested_source\n FROM execution_requests\n WHERE id = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [requestId, ctx.workspace.id]\n )) as\n | {\n id: string;\n workspace_id: string;\n project_id: string;\n mission_id: string;\n objective_id: string;\n status: string;\n revision: number;\n metadata_json: string;\n requested_source: string;\n }\n | undefined;\n\n if (!row) {\n throw new ServiceError('Execution request not found', 'execution_request_not_found', 404);\n }\n if (row.requested_source !== LOCAL_TARGET_MUTATION_REQUESTED_SOURCE) {\n throw new ServiceError(\n 'Execution request is not a local-target mutation.',\n 'not_local_target_mutation',\n 409\n );\n }\n if (row.status !== 'launching' && row.status !== 'claimed') {\n throw new ServiceError(\n `Cannot complete local-target mutation from status ${row.status}.`,\n 'invalid_execution_request_transition',\n 409\n );\n }\n\n const mutation = parseLocalTargetMutation(row.metadata_json);\n if (!mutation) {\n throw new ServiceError(\n 'Execution request is missing local-target mutation metadata.',\n 'invalid_local_target_mutation',\n 409\n );\n }\n\n const storedResult = result.ok\n ? { ok: true as const, value: result.value }\n : {\n ok: false as const,\n code: result.code,\n message: result.message,\n ...(result.details !== undefined ? { details: result.details } : {})\n };\n\n const metadata = parseMetadataObject(row.metadata_json);\n metadata[LOCAL_TARGET_MUTATION_METADATA_KEY] = {\n ...mutation,\n result: storedResult\n };\n\n const now = nowIso();\n const revision = row.revision + 1;\n const nextStatus = result.ok ? 'launched' : 'failed';\n const lastError = result.ok ? null : result.message;\n\n await ctx.db.transaction(async tx => {\n const txCtx = { ...ctx, db: tx };\n const updated = await txCtx.db.run(\n `UPDATE execution_requests\n SET status = ?,\n metadata_json = ?,\n last_error = ?,\n launch_completed_at = ?,\n updated_at = ?,\n revision = ?\n WHERE id = ? AND status = ? AND revision = ?`,\n [\n nextStatus,\n JSON.stringify(metadata),\n lastError,\n now,\n now,\n revision,\n row.id,\n row.status,\n row.revision\n ]\n );\n if (updated.changes === 0) {\n throw new ServiceError(\n 'Execution request changed while completing local-target mutation.',\n 'execution_request_conflict',\n 409\n );\n }\n await recordChange({\n ctx: txCtx,\n entityType: 'execution_request',\n entityId: row.id,\n operation: 'update',\n entityRevision: revision,\n projectId: row.project_id,\n missionId: row.mission_id,\n objectiveId: row.objective_id,\n changedFields: ['status', 'metadata_json', 'last_error', 'launch_completed_at']\n });\n await txCtx.db.run(\n `INSERT INTO mission_events\n (id, workspace_id, project_id, mission_id, objective_id, type, phase, summary,\n payload_json, source, actor_workspace_user_id, created_at)\n VALUES (?, ?, ?, ?, ?, 'update', 'execute', ?, ?, 'runner', NULL, ?)`,\n [\n newId(),\n ctx.workspace.id,\n row.project_id,\n row.mission_id,\n row.objective_id,\n result.ok\n ? `Completed ${mutation.kind.replace('_', ' ')} on execution target.`\n : `Local-target mutation failed: ${result.message}`,\n JSON.stringify({ executionRequestId: row.id, result: storedResult }),\n now\n ]\n );\n });\n\n return parseLocalTargetMutation(JSON.stringify(metadata));\n}\n", "import { InProcessProvider } from './local-target/in-process-provider.ts';\nimport { targetMetadata } from './local-target/registry.ts';\nimport type {\n LocalTargetCapabilities,\n PerformBranchActionInput,\n PurgeMergedWorktreesInput,\n RemoveWorktreeInput\n} from './local-target/types.ts';\nimport type { CapabilityResult } from './local-target/types.ts';\nimport { worktreePathForBranch } from './local-target/worktree-git.ts';\nimport {\n type LocalTargetMutationPayload,\n parseLocalTargetMutation\n} from './local-target-mutations.ts';\n\nfunction inProcessProvider(): LocalTargetCapabilities {\n return new InProcessProvider(\n targetMetadata({ executionTargetId: 'runner', type: 'local', reachable: true }, 'in_process')\n );\n}\n\nexport async function executeLocalTargetMutation({\n mutation\n}: {\n mutation: LocalTargetMutationPayload;\n}): Promise<CapabilityResult<unknown>> {\n const provider = inProcessProvider();\n\n switch (mutation.capability) {\n case 'performBranchAction': {\n // The control plane predicts `worktreePath` without filesystem access (it may\n // not be co-located with the checkout), so it always resolves to the canonical\n // worktree-mode path even for a branch-only mission checked out directly in the\n // primary repo. This runner *is* on the execution target with real git access,\n // so re-derive the actual checkout location the same way the desktop bridge does\n // for local execution, falling back to the queued path when the branch isn't\n // checked out anywhere yet.\n const input = mutation.input as unknown as PerformBranchActionInput;\n const resolvedWorktreePath =\n worktreePathForBranch(input.primaryRepoPath, input.branchName) ?? input.worktreePath;\n return provider.performBranchAction({ ...input, worktreePath: resolvedWorktreePath });\n }\n case 'removeWorktree':\n return provider.removeWorktree(mutation.input as unknown as RemoveWorktreeInput);\n case 'purgeMergedWorktrees':\n return provider.purgeMergedWorktrees(mutation.input as unknown as PurgeMergedWorktreesInput);\n default:\n return {\n ok: false,\n code: 'CAPABILITY_NOT_IMPLEMENTED',\n message: `Unsupported local-target mutation capability.`,\n target: targetMetadata(\n { executionTargetId: 'runner', type: 'local', reachable: true },\n 'in_process'\n )\n };\n }\n}\n\nexport function parseMutationFromMetadata(metadata: unknown): LocalTargetMutationPayload | null {\n if (!metadata || typeof metadata !== 'object') return null;\n return parseLocalTargetMutation(metadata as Record<string, unknown>);\n}\n", "import path from 'node:path';\n\nimport { slugify } from './util.js';\n\n/** Stable logical key for a project checkout within a project + execution target. */\nexport function deriveProjectResourceKey({\n resourceKey,\n label,\n directoryPath\n}: {\n resourceKey?: string | null;\n label?: string | null;\n directoryPath: string;\n}): string {\n const explicit = resourceKey?.trim();\n if (explicit) return slugify(explicit);\n const labelKey = label?.trim();\n if (labelKey) return slugify(labelKey);\n return slugify(path.basename(path.resolve(directoryPath)));\n}\n", "// Deterministic per-mission branch/worktree planning for the Runner Layer.\n//\n// This is one of Overlord's \"Shared Deterministic Algorithms\" (see CONTRACT.md):\n// the service layer keeps a byte-for-byte-equivalent copy at\n// backend/branch-planning.ts. Both are pinned to the shared conformance\n// fixture contract/branch-planning-vectors.json. Do not import the webapp copy\n// across the component boundary, and bump the contract version (regenerating the\n// fixture) on any behavioral change here.\nimport path from 'node:path';\n\nexport type BranchAutomationAction = 'create' | 'reuse' | 'new_cycle';\n\nexport type BranchDecisionInput = {\n mission: { title: string; sequence: number };\n project: { slug: string };\n resourceKey: string;\n recordedBranch: string | null;\n base: string;\n refs: { local: string[]; remote: string[]; merged: string[]; checkedOut?: string[] };\n worktreeRoot: string;\n overrideBranch?: string | null;\n};\n\nexport type BranchDecision =\n | {\n action: 'reuse';\n branch: string;\n worktreePath: string;\n baseBranch: string;\n cycle: number;\n }\n | {\n action: 'create';\n branch: string;\n worktreePath: string;\n baseBranch: string;\n cycle: number;\n from: string;\n }\n | {\n action: 'new_cycle';\n branch: string;\n worktreePath: string;\n baseBranch: string;\n cycle: number;\n from: string;\n };\n\nexport type MissionBranchPreviewInput = Pick<\n BranchDecisionInput,\n 'mission' | 'project' | 'resourceKey' | 'base' | 'worktreeRoot'\n>;\n\nconst TITLE_SLUG_MAX = 48;\n\nfunction stripCombiningMarks(value: string): string {\n return value.normalize('NFKD').replace(/[\\u0300-\\u036f]/g, '');\n}\n\nexport function slugifyBranchTitle(title: string, fallback: string): string {\n const slug = stripCombiningMarks(title)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n const truncated = slug.length > TITLE_SLUG_MAX ? slug.slice(0, TITLE_SLUG_MAX) : slug;\n const boundary = truncated.length === TITLE_SLUG_MAX ? truncated.lastIndexOf('-') : -1;\n const bounded =\n boundary > 0 && boundary >= Math.floor(TITLE_SLUG_MAX * 0.6)\n ? truncated.slice(0, boundary)\n : truncated;\n return bounded.replace(/^-+|-+$/g, '') || fallback;\n}\n\nexport function sanitizeBranchName(branch: string, fallback: string): string {\n let sanitized = stripCombiningMarks(branch)\n .toLowerCase()\n .replace(/\\\\/g, '/')\n .replace(/\\/+/g, '/')\n .replace(/\\.\\.+/g, '.')\n .replace(/(^|\\/)[.-]+/g, '$1')\n .replace(/[~^:?*[\\]\\s]+/g, '-')\n .replace(/\\/+/g, '/')\n .replace(/(?:\\.lock|[./-]+)$/g, '');\n\n if (!sanitized || sanitized.startsWith('/') || sanitized.includes('@{')) {\n sanitized = fallback;\n }\n\n return sanitized || fallback;\n}\n\nexport function canonicalMissionBranch(mission: { title: string; sequence: number }): string {\n const fallback = `mission-${mission.sequence}`;\n const titleSlug = slugifyBranchTitle(mission.title, fallback);\n return sanitizeBranchName(`${titleSlug}-${mission.sequence}`, fallback);\n}\n\nfunction branchLeaf(branch: string): string {\n return branch.replace(/[\\\\/]+/g, '-').replace(/^-+|-+$/g, '') || 'branch';\n}\n\nexport function missionWorktreePath({\n worktreeRoot,\n projectSlug,\n resourceKey,\n branch\n}: {\n worktreeRoot: string;\n projectSlug: string;\n resourceKey: string;\n branch: string;\n}): string {\n const key = resourceKey.trim() || 'project';\n return path.join(worktreeRoot, projectSlug || 'project', key, branchLeaf(branch));\n}\n\nfunction normalizeRemoteRef(ref: string): string {\n return ref\n .replace(/^origin\\//, '')\n .replace(/^refs\\/heads\\//, '')\n .replace(/^refs\\/remotes\\/origin\\//, '');\n}\n\nfunction refSet(refs: string[]): Set<string> {\n return new Set(refs.map(normalizeRemoteRef).filter(Boolean));\n}\n\nfunction highestExistingCycle(baseBranch: string, refs: Set<string>): number {\n let highest = refs.has(baseBranch) ? 1 : 0;\n const escaped = baseBranch.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`^${escaped}-(\\\\d+)$`);\n for (const ref of refs) {\n const match = ref.match(pattern);\n if (!match) continue;\n const value = Number.parseInt(match[1] ?? '', 10);\n if (Number.isFinite(value)) highest = Math.max(highest, value);\n }\n return highest;\n}\n\nfunction withWorktreeFields(input: BranchDecisionInput, branch: string) {\n const canonicalBranch = canonicalMissionBranch(input.mission);\n const cycleMatch = branch.startsWith(`${canonicalBranch}-`)\n ? Number.parseInt(branch.slice(canonicalBranch.length + 1), 10)\n : 1;\n return {\n branch,\n worktreePath: missionWorktreePath({\n worktreeRoot: input.worktreeRoot,\n projectSlug: input.project.slug,\n resourceKey: input.resourceKey,\n branch\n }),\n baseBranch: input.base,\n cycle: Number.isFinite(cycleMatch) && cycleMatch > 1 ? cycleMatch : 1\n };\n}\n\nexport function planMissionBranch(input: BranchDecisionInput): BranchDecision {\n const baseBranch = canonicalMissionBranch(input.mission);\n const allRefs = refSet([...input.refs.local, ...input.refs.remote]);\n const mergedRefs = refSet(input.refs.merged);\n const checkedOutRefs = refSet(input.refs.checkedOut ?? []);\n const override = input.overrideBranch\n ? sanitizeBranchName(input.overrideBranch, input.overrideBranch)\n : null;\n\n if (override) {\n const exists = allRefs.has(override);\n return exists\n ? { action: 'reuse', ...withWorktreeFields(input, override) }\n : { action: 'create', ...withWorktreeFields(input, override), from: input.base };\n }\n\n if (input.recordedBranch) {\n const recorded = normalizeRemoteRef(input.recordedBranch);\n const stillExists = allRefs.has(recorded);\n const merged = mergedRefs.has(recorded) || !stillExists;\n if (!merged) {\n return { action: 'reuse', ...withWorktreeFields(input, recorded) };\n }\n }\n\n if (!input.recordedBranch) {\n return allRefs.has(baseBranch)\n ? { action: 'reuse', ...withWorktreeFields(input, baseBranch) }\n : { action: 'create', ...withWorktreeFields(input, baseBranch), from: input.base };\n }\n\n const nextCycle = Math.max(2, highestExistingCycle(baseBranch, allRefs) + 1);\n let candidate = `${baseBranch}-${nextCycle}`;\n let cycle = nextCycle;\n while (allRefs.has(candidate) || checkedOutRefs.has(candidate) || mergedRefs.has(candidate)) {\n cycle += 1;\n candidate = `${baseBranch}-${cycle}`;\n }\n return { action: 'new_cycle', ...withWorktreeFields(input, candidate), from: input.base };\n}\n\nexport function previewMissionBranch(input: MissionBranchPreviewInput): BranchDecision {\n return planMissionBranch({\n ...input,\n recordedBranch: null,\n refs: { local: [], remote: [], merged: [] }\n });\n}\n", "import { deriveProjectResourceKey } from '@overlord/core/service/project-resource-key';\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, mkdirSync, statSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { type BranchDecision, planMissionBranch } from './branch-planning.js';\nimport type { CliRuntime } from './runtime.js';\n\nexport type BranchPreparationOptions = {\n missionId: string;\n workingDirectory: string;\n /** Logical project resource key for worktree path planning. */\n resourceKey?: string | null;\n /** Objective being launched; used to resolve resourceKey from the mission payload. */\n objectiveId?: string | null;\n /**\n * The workspace-wide worktree/branch automation setting. Used as a fallback to\n * recompute the mission's effective decision when the mission DTO does not\n * carry the resolved `willPrepareBranch`/`willUseWorktree` flags.\n */\n workspaceAutomationEnabled: boolean;\n /** No git side-effects; used for launch previews. */\n dryRun?: boolean;\n /** The `--no-worktree` flag: downgrade a worktree decision to a branch-only checkout. */\n noWorktree?: boolean;\n overrideBranch?: string | null;\n};\n\nexport type BranchPreparationResult = {\n workingDirectory: string;\n branchAutomation: BranchAutomationPayload | null;\n};\n\nexport type BranchAutomationPayload = {\n branchName: string;\n baseBranch: string;\n worktreePath: string;\n resourceKey: string;\n action: BranchDecision['action'];\n cycle: number;\n};\n\nexport type MissionShape = {\n title?: unknown;\n sequenceNumber?: unknown;\n sequence?: unknown;\n projectId?: unknown;\n projectSlug?: unknown;\n project?: { slug?: unknown };\n objectives?: Array<{ id?: unknown; resourceKey?: unknown }>;\n branch?: {\n name?: unknown;\n status?: unknown;\n baseBranch?: unknown;\n overrideBranch?: unknown;\n worktreePreference?: unknown;\n willPrepareBranch?: unknown;\n willUseWorktree?: unknown;\n } | null;\n};\n\ntype ProjectShape = {\n id?: unknown;\n slug?: unknown;\n};\n\nfunction runGit(cwd: string, args: string[], options: { optional?: boolean } = {}): string {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024\n }).trim();\n } catch (error) {\n if (options.optional) return '';\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`git ${args.join(' ')} failed in ${cwd}: ${message}`, { cause: error });\n }\n}\n\nfunction lines(value: string): string[] {\n return value\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n}\n\nfunction resolveGitRoot(workingDirectory: string): string {\n const root = runGit(workingDirectory, ['rev-parse', '--show-toplevel']);\n if (!root) throw new Error(`${workingDirectory} is not inside a git repository.`);\n return path.resolve(root);\n}\n\nfunction repoDefaultBranch(gitRoot: string): string {\n const symbolic = runGit(gitRoot, ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'], {\n optional: true\n });\n const fromOrigin = symbolic.replace(/^origin\\//, '').trim();\n if (fromOrigin) return fromOrigin;\n const local = lines(runGit(gitRoot, ['branch', '--format=%(refname:short)'], { optional: true }));\n if (local.includes('main')) return 'main';\n if (local.includes('master')) return 'master';\n return local[0] ?? 'main';\n}\n\nfunction mainWorktreeBranch(gitRoot: string): string | null {\n const out = runGit(gitRoot, ['worktree', 'list', '--porcelain'], { optional: true });\n let inMainWorktree = false;\n for (const line of out.split('\\n')) {\n if (line.startsWith('worktree ')) {\n if (inMainWorktree) break;\n inMainWorktree = true;\n continue;\n }\n if (!inMainWorktree || !line.startsWith('branch ')) continue;\n const branch = line\n .slice('branch '.length)\n .trim()\n .replace(/^refs\\/heads\\//, '');\n return branch || null;\n }\n const current = runGit(gitRoot, ['branch', '--show-current'], { optional: true });\n return current || null;\n}\n\nfunction refExists(gitRoot: string, ref: string): boolean {\n return (\n runGit(gitRoot, ['rev-parse', '--verify', '--quiet', `refs/heads/${ref}`], {\n optional: true\n }) !== '' ||\n runGit(gitRoot, ['rev-parse', '--verify', '--quiet', `refs/remotes/origin/${ref}`], {\n optional: true\n }) !== ''\n );\n}\n\n// Resolves the base/parent branch to cut from. The project-configured default\n// branch (surfaced on the mission as `branch.baseBranch`) wins when it actually\n// exists in this checkout. Otherwise, use the user's primary checkout branch\n// (the main worktree, not a linked worktree the runner may be standing in) before\n// falling back to the repo's git default.\nfunction resolveBaseBranch(gitRoot: string, mission: MissionShape): string {\n const configured = mission.branch?.baseBranch;\n if (typeof configured === 'string' && configured.trim()) {\n const base = configured.trim();\n if (refExists(gitRoot, base)) return base;\n }\n const checkedOut = mainWorktreeBranch(gitRoot);\n if (checkedOut && refExists(gitRoot, checkedOut)) return checkedOut;\n return repoDefaultBranch(gitRoot);\n}\n\nfunction currentWorktrees(gitRoot: string): string[] {\n return lines(runGit(gitRoot, ['worktree', 'list', '--porcelain'], { optional: true }))\n .filter(line => line.startsWith('branch '))\n .map(line => line.replace(/^branch refs\\/heads\\//, '').trim())\n .filter(Boolean);\n}\n\nfunction revParse(gitRoot: string, ref: string): string {\n return runGit(gitRoot, ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`], {\n optional: true\n }).trim();\n}\n\n// The set of commit SHAs on `base`'s first-parent trunk \u2014 the linear backbone you\n// walk by always following the first parent. Overlord's merge-with-parent flow\n// advances the parent with a `--no-ff` merge commit whose SECOND parent is the\n// branch tip, so a genuinely merged branch tip is NOT on this trunk; a branch the\n// base merely advanced past linearly (e.g. an empty mission branch) stays on it.\nfunction firstParentTrunk(gitRoot: string, base: string): Set<string> {\n return new Set(lines(runGit(gitRoot, ['rev-list', '--first-parent', base], { optional: true })));\n}\n\n// Branches genuinely merged into `base`: contained in the base AND off its\n// first-parent trunk (they landed via the `--no-ff` merge commit). Plain\n// `git branch --merged <base>` lists every branch whose tip is reachable from the\n// base \u2014 including freshly-cut/empty ones the base advanced past \u2014 which would make\n// the planner treat the mission's established (but un-merged) branch as merged and\n// spin up a new cycle branch for each objective. Filtering to off-trunk tips keeps\n// objectives on the same branch until it has actually been merged into its parent.\n// Mirrors the webapp's `branchMergedIntoBase` divergence/first-parent rule.\nexport function computeMergedBranches(gitRoot: string, base: string): string[] {\n const localTrunk = firstParentTrunk(gitRoot, base);\n const remoteTrunk = firstParentTrunk(gitRoot, `origin/${base}`);\n const result: string[] = [];\n const collect = (refArgs: string[], trunk: Set<string>): void => {\n for (const branch of lines(runGit(gitRoot, refArgs, { optional: true }))) {\n const sha = revParse(gitRoot, branch);\n // On the first-parent trunk \u21D2 a plain ancestor, not a real merge \u21D2 skip.\n if (sha && trunk.has(sha)) continue;\n result.push(branch);\n }\n };\n collect(['branch', '--merged', base, '--format=%(refname:short)'], localTrunk);\n collect(['branch', '-r', '--merged', `origin/${base}`, '--format=%(refname:short)'], remoteTrunk);\n return result;\n}\n\nfunction repoRefs(gitRoot: string, base: string) {\n return {\n local: lines(runGit(gitRoot, ['branch', '--format=%(refname:short)'], { optional: true })),\n remote: lines(\n runGit(gitRoot, ['branch', '-r', '--format=%(refname:short)'], { optional: true })\n ),\n merged: computeMergedBranches(gitRoot, base),\n checkedOut: currentWorktrees(gitRoot)\n };\n}\n\nfunction worktreeBranch(worktreePath: string): string | null {\n const inside = runGit(worktreePath, ['rev-parse', '--is-inside-work-tree'], { optional: true });\n if (inside !== 'true') return null;\n const branch = runGit(worktreePath, ['branch', '--show-current'], { optional: true });\n return branch || null;\n}\n\nfunction readMissionProjectSlug(mission: MissionShape): string | null {\n const slug = mission.project?.slug;\n if (typeof slug === 'string' && slug.trim()) return slug.trim();\n if (typeof mission.projectSlug === 'string' && mission.projectSlug.trim()) {\n return mission.projectSlug.trim();\n }\n return null;\n}\n\nexport async function resolveMissionProjectSlug({\n runtime,\n mission\n}: {\n runtime: CliRuntime;\n mission: MissionShape;\n}): Promise<string> {\n const embedded = readMissionProjectSlug(mission);\n if (embedded) return embedded;\n\n const projectId = typeof mission.projectId === 'string' ? mission.projectId.trim() : '';\n if (projectId) {\n try {\n const projects = (await runtime.backend.get('/api/projects')) as ProjectShape[];\n const project = Array.isArray(projects)\n ? projects.find(candidate => candidate.id === projectId)\n : null;\n if (typeof project?.slug === 'string' && project.slug.trim()) return project.slug.trim();\n } catch {\n // Keep branch preparation best-effort for older or restricted backends.\n }\n }\n\n return 'project';\n}\n\nfunction recordedMissionBranch(mission: MissionShape): string | null {\n const branch = mission.branch;\n if (!branch || branch.status === 'pending') return null;\n return typeof branch.name === 'string' && branch.name.trim() ? branch.name.trim() : null;\n}\n\n// A branch the user pinned in the mission panel to override the planner's default\n// (MissionBranchDto.overrideBranch). The explicit `--branch` flag still wins.\nfunction missionOverrideBranch(mission: MissionShape): string | null {\n const override = mission.branch?.overrideBranch;\n return typeof override === 'string' && override.trim() ? override.trim() : null;\n}\n\nfunction missionSequence(mission: MissionShape, missionId: string): number {\n const direct = mission.sequenceNumber ?? mission.sequence;\n if (typeof direct === 'number' && Number.isFinite(direct)) return direct;\n if (typeof direct === 'string') {\n const parsed = Number.parseInt(direct, 10);\n if (Number.isFinite(parsed)) return parsed;\n }\n const match = missionId.match(/:(\\d+)$/);\n return match ? Number.parseInt(match[1] ?? '0', 10) : 0;\n}\n\nfunction resolveWorktreeRoot(): string {\n const override = process.env.OVERLORD_WORKTREE_ROOT?.trim();\n if (override) return path.resolve(override);\n const home = process.env.OVLD_HOME?.trim() || process.env.OVERLORD_HOME?.trim();\n return path.join(home ? path.resolve(home) : path.join(os.homedir(), '.ovld'), 'worktrees');\n}\n\nfunction ensureBranchRef(gitRoot: string, decision: BranchDecision): void {\n if (decision.action === 'reuse') return;\n const check = runGit(gitRoot, ['check-ref-format', '--branch', decision.branch], {\n optional: true\n });\n if (!check) throw new Error(`Invalid branch name: ${decision.branch}`);\n}\n\nfunction ensureWorktree(gitRoot: string, decision: BranchDecision): void {\n ensureBranchRef(gitRoot, decision);\n mkdirSync(path.dirname(decision.worktreePath), { recursive: true });\n\n if (existsSync(decision.worktreePath)) {\n if (!statSync(decision.worktreePath).isDirectory()) {\n throw new Error(`Worktree path exists and is not a directory: ${decision.worktreePath}`);\n }\n const existingBranch = worktreeBranch(decision.worktreePath);\n if (!existingBranch) {\n throw new Error(`Worktree path exists but is not a git worktree: ${decision.worktreePath}`);\n }\n if (existingBranch !== decision.branch) {\n throw new Error(\n `Worktree path is checked out on ${existingBranch}, expected ${decision.branch}: ${decision.worktreePath}`\n );\n }\n return;\n }\n\n // The worktree directory is gone but git may still hold a stale registration\n // for this path (e.g. it was purged from Settings \u2192 Worktrees, or deleted\n // out-of-band). Prune first so re-adding the same path for a follow-on\n // objective succeeds instead of failing with \"already registered\".\n runGit(gitRoot, ['worktree', 'prune'], { optional: true });\n\n if (decision.action === 'reuse') {\n runGit(gitRoot, ['worktree', 'add', decision.worktreePath, decision.branch]);\n return;\n }\n runGit(gitRoot, ['worktree', 'add', '-b', decision.branch, decision.worktreePath, decision.from]);\n}\n\n// Creates (when needed) and checks out the planned branch directly in the\n// primary repo \u2014 the \"branch without a worktree\" mode (coo:9). Unlike\n// `ensureWorktree`, no separate worktree directory is added; the branch lives in\n// the working repo, switching it onto the branch.\nfunction ensureBranchCheckout(gitRoot: string, decision: BranchDecision): void {\n ensureBranchRef(gitRoot, decision);\n const exists = runGit(gitRoot, ['rev-parse', '--verify', '--quiet', decision.branch], {\n optional: true\n });\n if (!exists) {\n if (decision.action === 'reuse') {\n runGit(gitRoot, ['checkout', decision.branch]);\n return;\n }\n runGit(gitRoot, ['branch', decision.branch, decision.from]);\n }\n runGit(gitRoot, ['checkout', decision.branch]);\n}\n\n// Resolves the mission's effective branch behavior. Prefers the resolved flags\n// the REST layer computes on the mission DTO (`willPrepareBranch`/\n// `willUseWorktree`); falls back to recomputing from the per-mission\n// `worktreePreference` and the workspace automation setting for older backends.\nfunction resolveBranchDecision(\n mission: MissionShape,\n workspaceAutomationEnabled: boolean\n): { willPrepareBranch: boolean; willUseWorktree: boolean } {\n const branch = mission.branch;\n if (\n branch &&\n typeof branch.willPrepareBranch === 'boolean' &&\n typeof branch.willUseWorktree === 'boolean'\n ) {\n return {\n willPrepareBranch: branch.willPrepareBranch,\n willUseWorktree: branch.willUseWorktree\n };\n }\n const raw = branch?.worktreePreference;\n const preference = raw === 'worktree' || raw === 'branch' ? raw : null;\n const willPrepareBranch =\n preference === 'worktree' ||\n preference === 'branch' ||\n (preference === null && workspaceAutomationEnabled);\n const willUseWorktree =\n preference === 'worktree' || (preference === null && workspaceAutomationEnabled);\n return { willPrepareBranch, willUseWorktree };\n}\n\nfunction resolveLaunchResourceKey({\n mission,\n options\n}: {\n mission: MissionShape;\n options: BranchPreparationOptions;\n}): string {\n const explicit = options.resourceKey?.trim();\n if (explicit) return explicit;\n\n const objectiveId = options.objectiveId?.trim();\n if (objectiveId && Array.isArray(mission.objectives)) {\n const objective = mission.objectives.find(\n candidate => typeof candidate.id === 'string' && candidate.id === objectiveId\n );\n const key = typeof objective?.resourceKey === 'string' ? objective.resourceKey.trim() : '';\n if (key) return key;\n }\n\n return deriveProjectResourceKey({ directoryPath: options.workingDirectory });\n}\n\nexport async function prepareMissionBranch({\n runtime,\n options\n}: {\n runtime: CliRuntime;\n options: BranchPreparationOptions;\n}): Promise<BranchPreparationResult> {\n // A launch preview must never touch git.\n if (options.dryRun) {\n return { workingDirectory: options.workingDirectory, branchAutomation: null };\n }\n\n const gitRoot = resolveGitRoot(options.workingDirectory);\n const mission = (await runtime.backend.get(\n `/api/missions/${encodeURIComponent(options.missionId)}`\n )) as MissionShape;\n\n const { willPrepareBranch, willUseWorktree } = resolveBranchDecision(\n mission,\n options.workspaceAutomationEnabled\n );\n const overrideFlag = options.overrideBranch?.trim() || null;\n // An explicit `--branch` always forces at least a branch, even for a mission\n // that would otherwise run off its base (the legacy escape hatch).\n const prepareBranch = willPrepareBranch || Boolean(overrideFlag);\n if (!prepareBranch) {\n return { workingDirectory: options.workingDirectory, branchAutomation: null };\n }\n // `--no-worktree` downgrades a worktree decision to a branch-only checkout.\n const useWorktree = willUseWorktree && !options.noWorktree;\n\n const base = resolveBaseBranch(gitRoot, mission);\n const refs = repoRefs(gitRoot, base);\n // The explicit `--branch` flag wins; otherwise honor the mission's pinned\n // override (set in the mission panel's branch selector).\n const overrideBranch = overrideFlag || missionOverrideBranch(mission);\n const projectSlug = await resolveMissionProjectSlug({ runtime, mission });\n const resourceKey = resolveLaunchResourceKey({ mission, options });\n const decision = planMissionBranch({\n mission: {\n title: typeof mission.title === 'string' ? mission.title : 'mission',\n sequence: missionSequence(mission, options.missionId)\n },\n project: { slug: projectSlug },\n resourceKey,\n recordedBranch: recordedMissionBranch(mission),\n base,\n refs,\n worktreeRoot: resolveWorktreeRoot(),\n overrideBranch\n });\n\n if (useWorktree) {\n ensureWorktree(gitRoot, decision);\n return {\n workingDirectory: decision.worktreePath,\n branchAutomation: {\n branchName: decision.branch,\n baseBranch: decision.baseBranch,\n worktreePath: decision.worktreePath,\n resourceKey,\n action: decision.action,\n cycle: decision.cycle\n }\n };\n }\n\n // Branch-only: check the branch out in the primary repo (no worktree). The\n // branch's \"worktree\" is the primary repo itself, which the mission panel's\n // git-state derivation resolves via `git worktree list`.\n ensureBranchCheckout(gitRoot, decision);\n return {\n workingDirectory: gitRoot,\n branchAutomation: {\n branchName: decision.branch,\n baseBranch: decision.baseBranch,\n worktreePath: gitRoot,\n resourceKey,\n action: decision.action,\n cycle: decision.cycle\n }\n };\n}\n", "import type { ProjectDto } from '@overlord/contract';\nimport { readProjectJsonLink } from '@overlord/core/service/local-target/project-metadata';\nimport type { ProjectDiscovery } from '@overlord/core/service/projects';\nimport path from 'node:path';\n\nimport type { BackendClient } from './backend-client.js';\nimport { CliError } from './errors.js';\n\nexport async function resolvePreferredExecutionTargetId({\n backend\n}: {\n backend: BackendClient;\n}): Promise<string | null> {\n try {\n const launchSettings = await backend.get<{ executionTargetId?: string | null }>(\n '/api/launch-settings'\n );\n return typeof launchSettings.executionTargetId === 'string'\n ? launchSettings.executionTargetId\n : null;\n } catch {\n return null;\n }\n}\n\nfunction discoverProjectJsonFromFilesystem({\n workingDirectory,\n preferredExecutionTargetId\n}: {\n workingDirectory: string;\n preferredExecutionTargetId?: string | null;\n}): {\n projectId: string;\n resourceId: string;\n resourcePath: string;\n isPrimary: boolean;\n} | null {\n let current = path.resolve(workingDirectory);\n\n while (true) {\n const projectJsonPath = path.join(current, '.overlord', 'project.json');\n const raw = readProjectJsonLink(projectJsonPath, { preferredExecutionTargetId });\n if (raw) {\n return {\n projectId: raw.projectId,\n resourceId: raw.resourceId,\n resourcePath: current,\n isPrimary: raw.isPrimary\n };\n }\n\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return null;\n}\n\nasync function resolveProjectByIdOrName({\n backend,\n projectRef\n}: {\n backend: BackendClient;\n projectRef: string;\n}): Promise<ProjectDto> {\n const trimmed = projectRef.trim();\n const projects = await backend.get<ProjectDto[]>('/api/projects');\n const match =\n projects.find(project => project.id === trimmed) ??\n projects.find(project => project.name === trimmed) ??\n projects.find(project => project.slug === trimmed);\n if (!match) {\n throw new CliError({ message: `Project not found: ${trimmed}` });\n }\n return match;\n}\n\n/**\n * Resolve a project from the client filesystem when the backend is remote.\n * The hosted control plane cannot walk the agent machine's directories.\n */\nexport async function discoverProjectOnClient({\n backend,\n workingDirectory,\n projectId\n}: {\n backend: BackendClient;\n workingDirectory: string;\n projectId?: string | null;\n}): Promise<ProjectDiscovery> {\n if (projectId?.trim()) {\n const project = await resolveProjectByIdOrName({ backend, projectRef: projectId });\n return {\n projectId: project.id,\n projectName: project.name,\n resourceId: null,\n resourcePath: null,\n isPrimary: false\n };\n }\n\n const preferredExecutionTargetId = await resolvePreferredExecutionTargetId({ backend });\n const local = discoverProjectJsonFromFilesystem({ workingDirectory });\n const localWithTarget = discoverProjectJsonFromFilesystem({\n workingDirectory,\n preferredExecutionTargetId\n });\n const resolvedLocal = localWithTarget ?? local;\n if (!resolvedLocal) {\n throw new CliError({\n message: `No linked Overlord project found for ${path.resolve(workingDirectory)}. Run \\`ovld add-cwd\\` or \\`ovld create-project\\`.`\n });\n }\n\n const project = await resolveProjectByIdOrName({ backend, projectRef: resolvedLocal.projectId });\n return {\n projectId: project.id,\n projectName: project.name,\n resourceId: resolvedLocal.resourceId,\n resourcePath: resolvedLocal.resourcePath,\n isPrimary: resolvedLocal.isPrimary\n };\n}\n", "import { projectTmpDir } from './project-tmp.js';\nimport {\n appleScriptKeystrokeClause,\n parseTerminalLaunchChord,\n type TerminalLaunchPlacement\n} from './terminal-launch-chord.js';\n\n/** Resolved process invocation describing exactly how the agent is spawned. */\nexport type LaunchExecution = {\n /** The program (or full shell string when `useShell` is true) to spawn. */\n command: string;\n /** Argument vector; empty when `useShell` is true. */\n args: string[];\n /** When true, spawn through a shell so `command` is parsed as a shell line. */\n useShell: boolean;\n /** The resolved terminal launcher, or null when launching inline. */\n terminal: string | null;\n /** Human-readable description of what runs (for dry-run / JSON output). */\n display: string;\n};\n\nexport type TerminalLaunchSettings = {\n terminalLauncher?: string | null;\n terminalLaunchPlacement?: TerminalLaunchPlacement;\n terminalLaunchChord?: string | null;\n terminalScriptPath?: string | null;\n};\n\nexport function shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\n/** Build an AppleScript string expression, escaping content and preserving line breaks. */\nfunction appleScriptString(value: string): string {\n const literal = (segment: string): string =>\n `\"${segment.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n const segments = value.split(/\\r\\n|\\r|\\n/);\n if (segments.length === 1) return literal(value);\n return `(${segments.map(literal).join(' & linefeed & ')})`;\n}\n\n/** Map a configured launcher value to a built-in launcher, or null for a raw prefix. */\nfunction resolveBuiltinTerminal(value: string): 'iterm' | 'terminal' | null {\n switch (value.trim().toLowerCase()) {\n case 'iterm':\n case 'iterm2':\n case 'iterm.app':\n return 'iterm';\n case 'terminal':\n case 'terminal.app':\n case 'apple terminal':\n return 'terminal';\n default:\n return null;\n }\n}\n\n/** Extract a macOS app name from an `open -a \u2026 --args` launcher prefix. */\nexport function extractAppNameFromLauncher(launcher: string): string | null {\n const match = launcher.match(/open\\s+-a\\s+(?:'([^']+)'|\"([^\"]+)\"|(\\S+))/i);\n return match?.[1] ?? match?.[2] ?? match?.[3] ?? null;\n}\n\n/** The TMPDIR-family environment Overlord pins to the project `.overlord/tmp/`. */\nexport function tmpEnvFor(workingDirectory: string): Record<string, string> {\n const tmpDir = projectTmpDir(workingDirectory);\n return { TMPDIR: tmpDir, TMP: tmpDir, TEMP: tmpDir, OVERLORD_TMPDIR: tmpDir };\n}\n\n/** The agent invocation as a single shell line, optionally wrapped by a pre-command. */\nfunction agentShellCommand({\n command,\n args,\n preCommand,\n extraEnv = {},\n includeEnvPrefix = false\n}: {\n command: string;\n args: string[];\n preCommand?: string | null;\n extraEnv?: Record<string, string>;\n includeEnvPrefix?: boolean;\n}): string {\n const base = [shellQuote(command), ...args.map(shellQuote)].join(' ');\n const invocation = preCommand?.trim() ? `${preCommand.trim()} ${base}` : base;\n if (!includeEnvPrefix) return invocation;\n\n const assignments = Object.entries(extraEnv)\n .filter(([key, value]) => key.trim() && value.trim())\n .map(([key, value]) => `${key}=${shellQuote(value)}`)\n .join(' ');\n return assignments ? `env ${assignments} ${invocation}` : invocation;\n}\n\n/**\n * The command run *inside* a freshly opened terminal window. A new window does\n * not inherit our process cwd/env, so we cd into the project and re-export the\n * TMPDIR family before invoking the agent.\n */\nfunction terminalInnerCommand({\n workingDirectory,\n agentCommand,\n extraEnv = {}\n}: {\n workingDirectory: string;\n agentCommand: string;\n extraEnv?: Record<string, string>;\n}): string {\n const exports = Object.entries({ ...tmpEnvFor(workingDirectory), ...extraEnv })\n .map(([key, value]) => `export ${key}=${shellQuote(value)}`)\n .join('; ');\n return `cd ${shellQuote(workingDirectory)} && ${exports}; ${agentCommand}`;\n}\n\nexport function terminalLaunchScriptContent({\n command,\n args,\n workingDirectory,\n preCommand,\n extraEnv = {}\n}: {\n command: string;\n args: string[];\n workingDirectory: string;\n preCommand?: string | null;\n extraEnv?: Record<string, string>;\n}): string {\n const agentCommand = agentShellCommand({ command, args, preCommand });\n return `#!/usr/bin/env bash\\n${terminalInnerCommand({ workingDirectory, agentCommand, extraEnv })}\\n`;\n}\n\nfunction terminalScriptCommand(scriptPath: string): string {\n return `/bin/bash ${shellQuote(scriptPath)}`;\n}\n\nfunction resolveItermSplitKind(\n chord: string | null | undefined\n): 'vertical' | 'horizontal' | 'keystroke' {\n const parsed = chord ? parseTerminalLaunchChord(chord) : null;\n if (!parsed) return 'vertical';\n if (\n parsed.modifiers.includes('command') &&\n parsed.modifiers.includes('shift') &&\n parsed.key === 'd'\n ) {\n return 'horizontal';\n }\n if (parsed.modifiers.includes('command') && parsed.key === 'd' && parsed.modifiers.length === 1) {\n return 'vertical';\n }\n return 'keystroke';\n}\n\nfunction buildItermAppleScript({\n inner,\n placement,\n chordClause,\n chord\n}: {\n inner: string;\n placement: TerminalLaunchPlacement;\n chordClause?: string | null;\n chord?: string | null;\n}): string {\n const lines = ['tell application \"iTerm\"', 'activate'];\n\n if (placement === 'window') {\n lines.push(\n 'set newWindow to (create window with default profile)',\n `tell current session of newWindow to write text ${appleScriptString(inner)}`\n );\n lines.push('end tell');\n return lines.join('\\n');\n }\n\n const splitKind = placement === 'chord' ? resolveItermSplitKind(chord) : null;\n if (splitKind === 'keystroke' && chordClause) {\n // Keep every statement inside the single `tell application \"iTerm\"` block.\n // A bare top-level `if` (outside any tell) is what produced the\n // `Expected \"tell\", etc. but found \"if\"` syntax error when launching via a\n // custom chord. When no window exists yet we open one and use it directly;\n // only when a window is already open do we run the chord, after iTerm is\n // activated, so the terminal is always open before the chord fires.\n return [\n 'tell application \"iTerm\"',\n 'activate',\n 'if (count of windows) = 0 then',\n 'set overlordSession to current session of (create window with default profile)',\n 'else',\n `tell application \"System Events\" to ${chordClause}`,\n 'delay 0.2',\n 'set overlordSession to current session of current window',\n 'end if',\n `tell overlordSession to write text ${appleScriptString(inner)}`,\n 'end tell'\n ].join('\\n');\n }\n\n lines.push(\n 'if (count of windows) = 0 then',\n 'set newWindow to (create window with default profile)',\n `tell current session of newWindow to write text ${appleScriptString(inner)}`,\n 'else',\n 'tell current window'\n );\n\n if (placement === 'tab') {\n lines.push(\n 'create tab with default profile',\n `tell current session to write text ${appleScriptString(inner)}`\n );\n } else {\n const splitVerb = splitKind === 'horizontal' ? 'horizontally' : 'vertically';\n lines.push(\n 'tell current session',\n `split ${splitVerb} with default profile`,\n 'end tell',\n 'tell second session of current tab',\n `write text ${appleScriptString(inner)}`,\n 'end tell'\n );\n }\n\n lines.push('end tell', 'end if', 'end tell');\n return lines.join('\\n');\n}\n\nfunction buildTerminalAppleScript({\n inner,\n placement,\n chordClause\n}: {\n inner: string;\n placement: TerminalLaunchPlacement;\n chordClause?: string | null;\n}): string {\n const lines = ['tell application \"Terminal\"', 'activate'];\n\n if (placement === 'window') {\n lines.push(`do script ${appleScriptString(inner)}`);\n } else if (placement === 'tab') {\n lines.push(\n 'if (count of windows) = 0 then',\n `do script ${appleScriptString(inner)}`,\n 'else',\n `do script ${appleScriptString(inner)} in front window`,\n 'end if'\n );\n } else {\n lines.push(\n 'if (count of windows) = 0 then',\n `do script ${appleScriptString(inner)}`,\n 'else',\n 'tell application \"System Events\"',\n chordClause ?? 'keystroke \"d\" using command down',\n 'end tell',\n 'delay 0.2',\n `do script ${appleScriptString(inner)} in front window`,\n 'end if'\n );\n }\n\n lines.push('end tell');\n return lines.join('\\n');\n}\n\nfunction buildGenericPlacementShell({\n launcher,\n inner,\n placement,\n chordClause\n}: {\n launcher: string;\n inner: string;\n placement: TerminalLaunchPlacement;\n chordClause?: string | null;\n}): string {\n const appName = extractAppNameFromLauncher(launcher);\n const launch = `${launcher} ${inner}`;\n\n if (placement === 'window' || !appName) {\n return launch;\n }\n\n const activate = `osascript -e ${shellQuote(`tell application ${JSON.stringify(appName)} to activate`)}`;\n const chord =\n chordClause &&\n `osascript -e ${shellQuote(\n ['tell application \"System Events\"', chordClause, 'end tell'].join('\\n')\n )}`;\n\n if (placement === 'tab') {\n const newTab = `osascript -e ${shellQuote(\n [\n 'tell application \"System Events\"',\n `tell process ${JSON.stringify(appName)}`,\n 'keystroke \"t\" using command down',\n 'end tell',\n 'end tell'\n ].join('\\n')\n )}`;\n return [activate, newTab, 'sleep 0.2', launch].join(' && ');\n }\n\n return [activate, chord ?? '', 'sleep 0.2', launch].filter(Boolean).join(' && ');\n}\n\nfunction resolveChordClause(chord: string | null | undefined): string | null {\n if (!chord?.trim()) return null;\n const parsed = parseTerminalLaunchChord(chord);\n if (!parsed) return null;\n return appleScriptKeystrokeClause(parsed);\n}\n\n/**\n * Resolve how the agent should actually be spawned given the configured\n * pre-command and terminal launcher. Pure (no side effects) so it can be\n * inspected via `--dry-run` and unit-tested without launching anything.\n */\nexport function resolveLaunchExecution({\n command,\n args,\n workingDirectory,\n preCommand,\n terminalLauncher,\n terminalLaunchPlacement = 'window',\n terminalLaunchChord,\n terminalScriptPath,\n extraEnv = {}\n}: {\n command: string;\n args: string[];\n workingDirectory: string;\n preCommand?: string | null;\n extraEnv?: Record<string, string>;\n} & TerminalLaunchSettings): LaunchExecution {\n const agentCommand = agentShellCommand({ command, args, preCommand });\n const genericAgentCommand = agentShellCommand({\n command,\n args,\n preCommand,\n extraEnv,\n includeEnvPrefix: true\n });\n const launcher = terminalLauncher?.trim();\n const placement = terminalLaunchPlacement ?? 'window';\n const chordClause = resolveChordClause(terminalLaunchChord);\n\n if (!launcher) {\n return preCommand?.trim()\n ? { command: agentCommand, args: [], useShell: true, terminal: null, display: agentCommand }\n : { command, args, useShell: false, terminal: null, display: agentCommand };\n }\n\n const inner = terminalInnerCommand({ workingDirectory, agentCommand, extraEnv });\n const terminalInner = terminalScriptPath?.trim()\n ? terminalScriptCommand(terminalScriptPath.trim())\n : inner;\n const builtin = resolveBuiltinTerminal(launcher);\n\n if (builtin === 'terminal') {\n const script = buildTerminalAppleScript({\n inner: terminalInner,\n placement,\n chordClause\n });\n return {\n command: 'osascript',\n args: ['-e', script],\n useShell: false,\n terminal: 'Terminal',\n display: `Terminal.app (${placement}) \u203A ${terminalInner}`\n };\n }\n\n if (builtin === 'iterm') {\n const script = buildItermAppleScript({\n inner: terminalInner,\n placement,\n chordClause,\n chord: terminalLaunchChord\n });\n return {\n command: 'osascript',\n args: ['-e', script],\n useShell: false,\n terminal: 'iTerm2',\n display: `iTerm2 (${placement}) \u203A ${terminalInner}`\n };\n }\n\n const genericTerminalCommand = terminalScriptPath?.trim()\n ? terminalScriptCommand(terminalScriptPath.trim())\n : genericAgentCommand;\n\n const full =\n placement === 'window'\n ? `${launcher} ${genericTerminalCommand}`\n : buildGenericPlacementShell({\n launcher,\n inner: genericTerminalCommand,\n placement,\n chordClause\n });\n return { command: full, args: [], useShell: true, terminal: launcher, display: full };\n}\n", "import { spawnSync } from 'node:child_process';\nimport { chmodSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveAgentBinary } from './agent-binaries.js';\nimport { ensureProjectTmpDir, pruneStaleProjectTmp } from './project-tmp.js';\nimport type { CliRuntime } from './runtime.js';\nimport {\n type LaunchExecution,\n resolveLaunchExecution,\n terminalLaunchScriptContent,\n type TerminalLaunchSettings,\n tmpEnvFor\n} from './terminal-launcher.js';\n\nexport type LaunchOptions = {\n agent: string;\n missionId: string;\n workingDirectory: string;\n model?: string | null;\n thinking?: string | null;\n flags?: string[];\n preCommand?: string | null;\n executionRequestId?: string | null;\n executionTargetId?: string | null;\n /**\n * Open the agent in a new terminal window. A built-in name (`iTerm2`,\n * `Terminal`) or a raw prefix command (e.g. `open -a Ghostty --args`).\n * When omitted/null the agent runs inline in the current terminal.\n */\n terminalLauncher?: string | null;\n terminalLaunchPlacement?: TerminalLaunchSettings['terminalLaunchPlacement'];\n terminalLaunchChord?: string | null;\n dryRun?: boolean;\n};\n\ntype LaunchPlan = {\n command: string;\n args: string[];\n prompt: string;\n contextFile: string;\n workingDirectory: string;\n execution: LaunchExecution;\n env: Record<string, string>;\n};\n\ntype MissionContext = {\n displayId: string;\n title: string;\n launchContext: string;\n};\n\nfunction overlordLaunchEnv({\n backendUrl,\n missionId,\n executionRequestId,\n projectResources\n}: {\n backendUrl: string;\n missionId: string;\n executionRequestId?: string | null;\n projectResources?: unknown[] | null;\n}): Record<string, string> {\n return {\n MISSION_ID: missionId,\n OVERLORD_MISSION_ID: missionId,\n OVERLORD_BACKEND_URL: backendUrl,\n ...(executionRequestId ? { OVERLORD_EXECUTION_REQUEST_ID: executionRequestId } : {}),\n ...(projectResources && projectResources.length > 0\n ? { OVERLORD_PROJECT_RESOURCES: JSON.stringify(projectResources) }\n : {})\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n}\n\n/**\n * Operational lifecycle event types excluded from the \"Recent Activity\" history\n * surfaced to the agent. The agent only cares\n * about substantive events (updates, deliveries, asks, alerts, discussion), not\n * runner/orchestration status churn.\n */\nconst AGENT_HISTORY_EXCLUDED_EVENT_TYPES = new Set([\n 'status_change',\n 'execution_requested',\n 'awaiting_approval'\n]);\n\nasync function loadMissionContext({\n runtime,\n missionId\n}: {\n runtime: CliRuntime;\n missionId: string;\n}): Promise<MissionContext> {\n const mission = asRecord(\n await runtime.backend.get(`/api/missions/${encodeURIComponent(missionId)}`)\n );\n const events = await runtime.backend\n .get<unknown[]>(`/api/missions/${encodeURIComponent(missionId)}/events`)\n .catch(() => []);\n const artifacts = await runtime.backend\n .get<unknown[]>(`/api/missions/${encodeURIComponent(missionId)}/artifacts`)\n .catch(() => []);\n const displayId = String(mission.displayId ?? mission.id ?? missionId);\n const title = String(mission.title ?? '(untitled)');\n const objectives = Array.isArray(mission.objectives) ? mission.objectives.map(asRecord) : [];\n\n // Attachments are stored per objective and are not part of the mission detail\n // payload, so fetch them for each objective. Surfacing them in the launch\n // prompt is what lets the agent know files were attached to its objective\n // (otherwise it only ever sees them if it parses the raw attach JSON).\n const attachmentLines: string[] = [];\n await Promise.all(\n objectives.map(async (objective, index) => {\n const objectiveId = objective.id;\n if (typeof objectiveId !== 'string' || objectiveId.length === 0) return;\n const attachments = await runtime.backend\n .get<unknown[]>(`/api/objectives/${encodeURIComponent(objectiveId)}/attachments`)\n .catch(() => []);\n for (const attachment of attachments) {\n const record = asRecord(attachment);\n const filename = String(record.filename ?? 'attachment');\n const contentType = record.contentType ? ` (${String(record.contentType)})` : '';\n attachmentLines.push(`- [objective ${index + 1}] ${filename}${contentType}`);\n }\n })\n );\n\n const launchContext = [\n `# Overlord Mission: ${displayId}: ${title}`,\n '',\n '## Instructions',\n 'Use the Overlord skill. Follow the required protocol workflow.',\n '',\n '## Objectives',\n ...objectives.map((objective, index) => {\n const instruction = objective.instructionText ?? objective.instruction ?? '';\n return `${index + 1}. [${objective.state ?? 'unknown'}] ${instruction}`;\n }),\n '',\n ...(attachmentLines.length > 0\n ? [\n '## Attachments',\n 'Files attached to the objective(s) below. Use `ovld protocol attachment-list` and `ovld protocol attachment-download-url` to retrieve them.',\n ...attachmentLines,\n ''\n ]\n : []),\n '## Recent Activity',\n ...events\n .filter(event => !AGENT_HISTORY_EXCLUDED_EVENT_TYPES.has(String(asRecord(event).type)))\n .slice(-20)\n .map(event => `- ${asRecord(event).summary ?? JSON.stringify(event)}`),\n '',\n '## Artifacts',\n ...artifacts.map(\n artifact => `- ${asRecord(artifact).label ?? asRecord(artifact).type ?? 'artifact'}`\n ),\n '',\n 'Use `ovld protocol attach --mission-id <id>` before making changes, update during work, and ALWAYS deliver last.'\n ].join('\\n');\n\n return { displayId, title, launchContext };\n}\n\nasync function loadProjectResourcesForLaunch({\n runtime,\n missionId,\n executionTargetId\n}: {\n runtime: CliRuntime;\n missionId: string;\n executionTargetId?: string | null;\n}): Promise<unknown[] | null> {\n try {\n const context = await runtime.backend.post<unknown>({\n path: '/api/protocol/load-context',\n body: {\n flags: {\n '--mission-id': missionId,\n ...(executionTargetId ? { '--execution-target-id': executionTargetId } : {})\n }\n }\n });\n const record = asRecord(context);\n return Array.isArray(record.projectResources) ? record.projectResources : null;\n } catch {\n return null;\n }\n}\n\nfunction buildAgentCommand({\n agent,\n model,\n thinking,\n flags = [],\n prompt,\n contextFile,\n launchMessage\n}: {\n agent: string;\n model?: string | null;\n thinking?: string | null;\n flags?: string[];\n prompt: string;\n contextFile: string;\n launchMessage: string;\n}): { command: string; args: string[] } {\n if (agent === 'codex') {\n const args = [];\n if (model) args.push('--model', model);\n if (thinking) args.push('-c', `model_reasoning_effort=\"${thinking}\"`);\n args.push(...flags, prompt);\n return { command: 'codex', args };\n }\n\n if (agent === 'claude') {\n const args = ['--append-system-prompt-file', contextFile];\n if (model) args.push('--model', model);\n if (thinking) args.push('--effort', thinking);\n args.push(...flags, launchMessage);\n return { command: 'claude', args };\n }\n\n const args = [];\n if (model) args.push('--model', model);\n args.push(...flags, prompt);\n return { command: resolveAgentBinary(agent), args };\n}\n\nfunction safeLaunchScriptPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, '-').replace(/^-+|-+$/g, '') || 'launch';\n}\n\nfunction launchScriptPath({\n tmpDir,\n displayId,\n executionRequestId\n}: {\n tmpDir: string;\n displayId: string;\n executionRequestId?: string | null;\n}): string {\n const requestPart = executionRequestId\n ? safeLaunchScriptPart(executionRequestId)\n : `${process.pid}`;\n return path.join(tmpDir, `launch-${safeLaunchScriptPart(displayId)}-${requestPart}.sh`);\n}\n\nexport async function buildLaunchPlan({\n runtime,\n options\n}: {\n runtime: CliRuntime;\n options: LaunchOptions;\n}): Promise<LaunchPlan> {\n const context = await loadMissionContext({ runtime, missionId: options.missionId });\n pruneStaleProjectTmp({ workingDirectory: options.workingDirectory, create: true });\n const tmpDir = ensureProjectTmpDir(options.workingDirectory);\n const contextFile = path.join(\n tmpDir,\n `mission-${context.displayId.replace(/[^a-zA-Z0-9_-]/g, '-')}.md`\n );\n const launchContext = options.executionRequestId\n ? `${context.launchContext}\\nExecution request: ${options.executionRequestId}`\n : context.launchContext;\n writeFileSync(contextFile, `${launchContext}\\n`);\n const projectResources = await loadProjectResourcesForLaunch({\n runtime,\n missionId: options.missionId,\n executionTargetId: options.executionTargetId\n });\n const launchEnv = overlordLaunchEnv({\n backendUrl: runtime.backend.baseUrl,\n missionId: context.displayId,\n executionRequestId: options.executionRequestId,\n projectResources\n });\n\n const prompt =\n launchContext.length > 4000\n ? `Use the Overlord context file at ${contextFile} and attach to mission ${context.displayId}.`\n : launchContext;\n\n const command = buildAgentCommand({\n agent: options.agent,\n model: options.model,\n thinking: options.thinking,\n flags: options.flags,\n prompt,\n contextFile,\n launchMessage: `Start work on ${context.title} (ovld mission ${context.displayId})`\n });\n\n const terminalScriptPath = options.terminalLauncher?.trim()\n ? launchScriptPath({\n tmpDir,\n displayId: context.displayId,\n executionRequestId: options.executionRequestId\n })\n : null;\n if (terminalScriptPath) {\n writeFileSync(\n terminalScriptPath,\n terminalLaunchScriptContent({\n command: command.command,\n args: command.args,\n workingDirectory: options.workingDirectory,\n preCommand: options.preCommand,\n extraEnv: launchEnv\n })\n );\n chmodSync(terminalScriptPath, 0o700);\n }\n\n const execution = resolveLaunchExecution({\n command: command.command,\n args: command.args,\n workingDirectory: options.workingDirectory,\n preCommand: options.preCommand,\n terminalLauncher: options.terminalLauncher,\n terminalLaunchPlacement: options.terminalLaunchPlacement,\n terminalLaunchChord: options.terminalLaunchChord,\n terminalScriptPath,\n extraEnv: launchEnv\n });\n\n return {\n ...command,\n prompt,\n contextFile,\n workingDirectory: options.workingDirectory,\n execution,\n env: launchEnv\n };\n}\n\nexport async function launchAgent({\n runtime,\n options\n}: {\n runtime: CliRuntime;\n options: LaunchOptions;\n}): Promise<{ plan: LaunchPlan; status: number | null; signal: NodeJS.Signals | null }> {\n const plan = await buildLaunchPlan({ runtime, options });\n if (options.dryRun) {\n return { plan, status: 0, signal: null };\n }\n\n const env = {\n ...process.env,\n ...tmpEnvFor(options.workingDirectory),\n ...plan.env\n };\n\n const { execution } = plan;\n const result = execution.useShell\n ? spawnSync(execution.command, {\n cwd: options.workingDirectory,\n env,\n shell: true,\n stdio: 'inherit'\n })\n : spawnSync(execution.command, execution.args, {\n cwd: options.workingDirectory,\n env,\n stdio: 'inherit'\n });\n\n return { plan, status: result.status, signal: result.signal };\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\n\nconst UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;\n\nfunction sessionCachePath({\n agent,\n missionId,\n workingDirectory\n}: {\n agent: string;\n missionId: string;\n workingDirectory: string;\n}): string {\n const key = createHash('sha256')\n .update(`${path.resolve(workingDirectory)}\\0${missionId}\\0${agent}`)\n .digest('hex');\n return path.join(resolveGlobalDataDir(), 'native-sessions', key);\n}\n\nfunction readCachedNativeSessionId({\n agent,\n missionId,\n workingDirectory\n}: {\n agent: string;\n missionId: string;\n workingDirectory: string;\n}): string | undefined {\n try {\n const filePath = sessionCachePath({ agent, missionId, workingDirectory });\n if (!existsSync(filePath)) return undefined;\n const raw = JSON.parse(readFileSync(filePath, 'utf8')) as { externalSessionId?: unknown };\n return typeof raw.externalSessionId === 'string' && raw.externalSessionId.trim()\n ? raw.externalSessionId.trim()\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction detectCodexSessionIdFromDisk(workingDirectory: string): string | undefined {\n const sessionsDir = path.join(homedir(), '.codex', 'sessions');\n if (!existsSync(sessionsDir)) return undefined;\n\n const candidates: Array<{ mtime: number; filePath: string }> = [];\n const visit = (dir: string): void => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const filePath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n visit(filePath);\n continue;\n }\n if (!entry.isFile() || !entry.name.startsWith('rollout-') || !entry.name.endsWith('.jsonl')) {\n continue;\n }\n try {\n candidates.push({ mtime: statSync(filePath).mtimeMs, filePath });\n } catch {\n // Ignore files that disappear while scanning.\n }\n }\n };\n\n try {\n visit(sessionsDir);\n } catch {\n return undefined;\n }\n\n candidates.sort((a, b) => b.mtime - a.mtime);\n let fallback: string | undefined;\n\n for (const candidate of candidates.slice(0, 25)) {\n let nativeId: string | undefined;\n let cwd: string | undefined;\n try {\n const [firstLine = ''] = readFileSync(candidate.filePath, 'utf8').split(/\\r?\\n/, 1);\n const obj = JSON.parse(firstLine) as Record<string, unknown>;\n const payload =\n obj.payload && typeof obj.payload === 'object'\n ? (obj.payload as Record<string, unknown>)\n : obj;\n if (typeof payload.id === 'string') nativeId = payload.id.match(UUID_RE)?.[0];\n if (typeof payload.cwd === 'string') cwd = payload.cwd;\n } catch {\n nativeId = undefined;\n }\n nativeId ??= path.basename(candidate.filePath).match(UUID_RE)?.[0];\n if (!nativeId) continue;\n fallback ??= nativeId;\n if (cwd && path.resolve(cwd) === path.resolve(workingDirectory)) return nativeId;\n }\n\n return fallback;\n}\n\nexport function resolveNativeSessionId({\n explicit,\n agent,\n missionId,\n workingDirectory = process.cwd(),\n env = process.env\n}: {\n explicit?: string;\n agent: string;\n missionId: string;\n workingDirectory?: string;\n env?: NodeJS.ProcessEnv;\n}): string | null | undefined {\n if (explicit !== undefined) {\n const trimmed = explicit.trim();\n return trimmed === 'null' ? null : trimmed || undefined;\n }\n\n const normalizedAgent = agent.toLowerCase();\n if (normalizedAgent === 'codex') {\n return (\n env.CODEX_THREAD_ID?.trim() ||\n env.CODEX_SESSION_ID?.trim() ||\n readCachedNativeSessionId({ agent: 'codex', missionId, workingDirectory }) ||\n detectCodexSessionIdFromDisk(workingDirectory)\n );\n }\n\n if (normalizedAgent === 'claude') {\n return readCachedNativeSessionId({ agent: 'claude', missionId, workingDirectory });\n }\n\n if (normalizedAgent === 'cursor') {\n return readCachedNativeSessionId({ agent: 'cursor', missionId, workingDirectory });\n }\n\n return readCachedNativeSessionId({ agent: normalizedAgent, missionId, workingDirectory });\n}\n", "import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { createInterface } from 'node:readline';\n\nimport { flagBoolean, flagValue, type ParsedArgs } from './args.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\nimport type { CliRuntime } from './runtime.js';\n\ninterface OrganizationDto {\n id: string;\n name: string;\n logoUrl: string | null;\n}\n\ninterface WorkspaceDto {\n id: string;\n organizationId: string;\n slug: string;\n name: string;\n}\n\ninterface MetaDto {\n organization: OrganizationDto | null;\n organizations: OrganizationDto[];\n workspaces: WorkspaceDto[];\n workspace: WorkspaceDto | null;\n}\n\n/** Bare-bones slug suggestion shown to an interactive user; the server derives the canonical one. */\nfunction suggestSlug(name: string): string {\n const cleaned = name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return cleaned.slice(0, 3) || 'org';\n}\n\nfunction promptText({\n question,\n defaultValue\n}: {\n question: string;\n defaultValue?: string;\n}): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n return new Promise<string>(resolve => {\n rl.question(`${question}${suffix}: `, answer => {\n rl.close();\n const trimmed = answer.trim();\n resolve(trimmed || defaultValue || '');\n });\n });\n}\n\nconst DEFAULT_WORKSPACE_NAME = 'general';\n\n/**\n * `ovld org-setup`: creates an organization + first workspace for an\n * authenticated user with zero workspace memberships, via the same\n * `POST /api/onboarding` endpoint the web onboarding screen uses, so the two\n * clients cannot drift (planning/feature-plans/organization-workspace-hierarchy.md,\n * Phase 5). A failed logo upload is a warning, not a rollback.\n */\nexport async function runOrgSetupCommand({\n runtime,\n parsed\n}: {\n runtime: CliRuntime;\n parsed: ParsedArgs;\n}): Promise<void> {\n const json = flagBoolean(parsed.flags, '--json');\n const noInput = flagBoolean(parsed.flags, '--no-input');\n const ifNeeded = flagBoolean(parsed.flags, '--if-needed');\n const interactive = !noInput && process.stdin.isTTY;\n\n const existingMeta = await runtime.backend.get<MetaDto>('/api/meta');\n if (existingMeta.organizations.length > 0) {\n if (ifNeeded) {\n if (json) printJson({ skipped: true, reason: 'already has organization memberships' });\n else console.log('Already a member of an organization \u2014 nothing to do (--if-needed).');\n return;\n }\n throw new CliError({\n message:\n 'You already belong to at least one organization, so `ovld org-setup` does not apply.\\n' +\n 'Use `ovld create-project` to add a project to an existing workspace instead.'\n });\n }\n\n let organizationName = flagValue(parsed.flags, '--org-name');\n if (!organizationName && interactive) {\n organizationName = await promptText({ question: 'Organization name' });\n }\n if (!organizationName) {\n throw new CliError({ message: 'Missing --org-name' });\n }\n\n let workspaceName = flagValue(parsed.flags, '--workspace-name');\n if (!workspaceName && interactive) {\n workspaceName = await promptText({\n question: 'Workspace name',\n defaultValue: DEFAULT_WORKSPACE_NAME\n });\n }\n workspaceName = workspaceName || DEFAULT_WORKSPACE_NAME;\n\n let workspaceSlug = flagValue(parsed.flags, '--workspace-slug');\n if (!workspaceSlug && interactive) {\n workspaceSlug = await promptText({\n question: 'Workspace slug (advanced, leave blank to auto-derive)',\n defaultValue: suggestSlug(workspaceName)\n });\n if (workspaceSlug === suggestSlug(workspaceName)) workspaceSlug = undefined;\n }\n\n const meta = await runtime.backend.post<MetaDto>({\n path: '/api/onboarding',\n body: {\n organizationName,\n workspaceName,\n ...(workspaceSlug ? { workspaceSlug } : {})\n }\n });\n\n const organization = meta.organization;\n const workspace = meta.workspace;\n if (!organization) {\n throw new CliError({ message: 'Onboarding succeeded but returned no organization.' });\n }\n\n const logoPath = flagValue(parsed.flags, '--logo');\n let logoWarning: string | null = null;\n if (logoPath) {\n try {\n const resolvedPath = path.resolve(logoPath);\n const bytes = readFileSync(resolvedPath);\n const stored = await runtime.backend.postRaw<{ url: string }>({\n path: '/api/uploads/organization-images',\n body: bytes,\n filename: path.basename(resolvedPath)\n });\n await runtime.backend.patch({\n path: `/api/organizations/${encodeURIComponent(organization.id)}`,\n body: { logoUrl: stored.url }\n });\n } catch (error) {\n logoWarning = error instanceof Error ? error.message : String(error);\n }\n }\n\n if (json) {\n printJson({ organization, workspace, logoWarning });\n return;\n }\n\n console.log(`Created organization \"${organization.name}\" (${organization.id})`);\n if (workspace) console.log(`Created workspace \"${workspace.name}\" (${workspace.slug})`);\n if (logoWarning) console.warn(`Warning: logo upload failed \u2014 ${logoWarning}`);\n}\n", "/** Protocol subcommands implemented by the local backend (`backend/protocol.ts`). */\nexport const SUPPORTED_PROTOCOL_SUBCOMMANDS = [\n 'add-objectives',\n 'ask',\n 'attach',\n 'attachment-download-url',\n 'attachment-list',\n 'auth-status',\n 'changes',\n 'connect',\n 'create',\n 'deliver',\n 'discover-project',\n 'discuss-objective',\n 'heartbeat',\n 'hook-event',\n 'list-organizations',\n 'load-context',\n 'prompt',\n 'read-context',\n 'record-work',\n 'resume-follow-up',\n 'search-missions',\n 'update',\n 'write-context'\n] as const;\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport function printProtocolHelp({ primaryCommand }: { primaryCommand: string }): void {\n const subcommands = SUPPORTED_PROTOCOL_SUBCOMMANDS.join(', ');\n\n console.log(`${primaryCommand} protocol [flags]\n\nUse this for mission lifecycle work from an agent runtime: create a standalone\ndraft with \\`${primaryCommand} protocol create\\`, create-and-attach with\n\\`${primaryCommand} protocol prompt\\`, or attach to an existing mission with\n\\`${primaryCommand} protocol attach --mission-id <mission_id>\\`.\n\nBackend and auth:\n Configure the REST backend before protocol calls:\n ${primaryCommand} init Create overlord.toml with a local backend URL\n ${primaryCommand} config set local [url] Point at a local backend (default: http://127.0.0.1:4310)\n ${primaryCommand} config set cloud <url> Point at a hosted backend URL\n ${primaryCommand} auth login Choose backend interactively when needed, then log in\n ${primaryCommand} doctor Validate backend reachability and connector installs\n\n To check credentials machine-readably from a script, use\n \\`${primaryCommand} protocol auth-status\\` (returns ok=true|false).\n\nProject discovery:\n When prompting or creating missions, the CLI resolves the project from your\n working directory when --project-id is omitted. Discover it explicitly with:\n\n ${primaryCommand} protocol discover-project\n ${primaryCommand} protocol discover-project --project-id <id-or-name>\n ${primaryCommand} protocol discover-project --directory /path/to/repo\n\n Humans can also link checkouts with \\`${primaryCommand} add-cwd\\` and create\n projects with \\`${primaryCommand} create-project --name \"<name>\"\\`.\n\nAgent workflow (required):\n 1. Attach first with \\`${primaryCommand} protocol attach --mission-id <id>\\`.\n 2. Post progress with \\`${primaryCommand} protocol update\\` or liveness with\n \\`${primaryCommand} protocol heartbeat\\`.\n 3. Ask blocking questions with \\`${primaryCommand} protocol ask\\` and stop work.\n 4. Deliver with \\`${primaryCommand} protocol deliver\\` when work is complete.\n 5. Do not continue implementation after delivery without\n \\`${primaryCommand} protocol resume-follow-up\\` or \\`--begin-follow-up-work\\`\n on a still-live session.\n\nSubcommands:\n auth-status Return machine-readable auth/backend readiness\n discover-project Resolve a project from the working directory or explicit id\n list-organizations Legacy name; returns only the caller's current workspace context (not organizations)\n attach Start a mission session and return full working context\n connect Start a lightweight session without full context assembly\n load-context Read mission context without creating a session\n search-missions Find missions by keyword, status, or project\n discuss-objective Mark a draft objective as submitted (does not start execution)\n add-objectives Append ordered objectives to an existing mission\n create Create a draft mission without attaching\n prompt Create a mission and attach to it immediately\n record-work Record completed-from-chat work as a review mission (no attach)\n update Post progress, activity events, and optional change rationales\n heartbeat Send a liveness ping without creating a mission event\n ask Post a blocking question and move the mission to review\n deliver Finish work, send artifacts, and move the mission to review\n resume-follow-up Reopen a completed objective for post-delivery follow-up work\n hook-event Record a connector lifecycle hook (e.g. UserPromptSubmit)\n record-touched Local-only: append an edit hook's touched files to the session log\n changes Local-only: preflight \u2014 print classified mine/claimed/unclaimed\n paths and drafted rationales before delivering; run this instead\n of hand-triaging \\`git status\\`\n read-context Read shared persistent context for this mission\n write-context Write shared persistent context for future sessions\n attachment-list List all attachments for the mission\n attachment-download-url Get the download URL for a specific attachment\n\nRunner queue (management commands, not protocol):\n ${primaryCommand} runner once|start|status|clear|clear-all [--branch <name>] [--no-worktree]\n ${primaryCommand} launch <agent> --mission-id <missionId> [--branch <name>] [--no-worktree]\n\nEnvironment fallback:\n --session-key <- SESSION_KEY printed on stderr after attach/connect/prompt/resume-follow-up\n --mission-id <- mission display id (e.g. coo:8) or UUID\n backend URL <- overlord.toml backend_url, OVERLORD_BACKEND_URL, or dev OVERLORD_BACKEND_URL_DEV\n auth token <- OVERLORD_USER_TOKEN, OVLD_USER_TOKEN, or USER_TOKEN\n\nCommon flags:\n --mission-id <id> Mission identifier when operating on an existing mission\n --session-key <key> Session key returned by attach/connect/prompt/resume-follow-up\n --agent <identifier> Agent identifier sent to Overlord (default: unknown)\n --model <identifier> Model identifier to snapshot on executing objectives\n --timeout <ms> Request timeout in milliseconds (default: ${DEFAULT_TIMEOUT_MS})\n\nauth-status:\n Purpose:\n Check whether the local runtime can reach the configured backend.\n Returns:\n JSON with ok=true|false plus backend URL metadata. Does not print secrets.\n\ndiscover-project:\n Purpose:\n Resolve the Overlord project for the current or given working directory.\n Optional:\n --project-id <id-or-name> Resolve this project directly\n --directory <path> Directory to match (default: current working directory)\n Returns:\n Project JSON with id, name, and slug.\n\nattach:\n Purpose:\n Create the working session for an agent on an existing mission. Call this first.\n Required:\n --mission-id <id> Display id (e.g. coo:8) or UUID\n Optional:\n --session-key <key> Reuse an existing session key\n --agent <identifier>\n --model <identifier>\n --execution-request-id <id> Link this attach to a runner execution request\n --external-session-id <id> Native agent thread/session id for resume\n Returns:\n Full JSON including session.sessionKey, mission, history, artifacts, sharedState,\n and agentInstructions with required workflow instructions and structured-field pointers.\n Notes:\n The client CLI records a VCS baseline at attach so deliver can report the\n run-attributable changed-file delta automatically.\n\nconnect:\n Purpose:\n Create a lightweight session when you only need a session key, not full context.\n Required:\n --mission-id <id>\n Optional:\n --agent <identifier>\n --external-session-id <id>\n Returns:\n Session JSON and SESSION_KEY on stderr when available.\n\nload-context:\n Purpose:\n Read mission details without creating a session.\n Required:\n --mission-id <id>\n\nsearch-missions:\n Purpose:\n Find missions by keyword, status, or project.\n Optional:\n --query <text> Free-text search\n --status <csv> Comma-separated statuses (e.g. next-up,execute)\n --project-id <id> Restrict to one project\n --limit <n> Max results (default: 25)\n Returns:\n JSON with matching missions.\n\ndiscuss-objective:\n Purpose:\n Mark the latest draft objective as submitted. Does not start execution \u2014 use attach.\n Required:\n --mission-id <id>\n\nadd-objectives:\n Purpose:\n Append ordered objectives to an existing mission.\n Required:\n --mission-id <id>\n --objectives-json <json> or --objectives-file <path|->\n\ncreate:\n Purpose:\n Create a draft mission without attaching.\n Required:\n --objective \"<text>\" or --objectives-json / --objectives-file <path|->\n Optional:\n --title <text>\n --project-id <id> Skips working-directory project resolution\n\nprompt:\n Purpose:\n Create a mission and attach to it in one call.\n Required:\n --objective \"<text>\" or --objectives-json / --objectives-file <path|->\n Optional:\n --title <text>\n --project-id <id>\n --agent <identifier>\n --model <identifier>\n --external-session-id <id>\n Returns:\n New mission/session JSON plus SESSION_KEY on stderr when available.\n\nrecord-work:\n Purpose:\n Record work already completed in chat as a mission in review without a session.\n Use instead of create + attach + deliver when logging past work.\n Required:\n --objective \"<text>\" (or positional objective text)\n --summary or --summary-file <path|->\n Optional:\n --title <text>\n --project-id <id>\n --artifacts-json / --artifacts-file <path|->\n --change-rationales-json / --change-rationales-file <path|->\n Notes:\n Change-rationale entries use the same shape documented under \\`deliver\\`\n (file_path, label, summary, why, impact; summary is named \"summary\", not \"rationale\").\n\nupdate:\n Purpose:\n Post progress or activity events during execution.\n Required:\n --session-key <key>\n --mission-id <id>\n --summary or --summary-file <path|->\n Optional:\n --phase draft | execute | review | deliver | complete | blocked | cancelled\n --event-type update | user_follow_up | alert | discussion_summary | decision\n --begin-follow-up-work Reopen a delivered/review mission for execution\n --follow-up-intent discussion | execution | pending_delivery\n --payload-json / --payload-file <path|->\n --external-url <url|null>\n --external-session-id <id|null>\n --changed-files-json / --changed-files-file <path|->\n --change-rationales-json / --change-rationales-file <path|->\n Notes:\n Pass --summary-file - to read the summary from stdin and avoid shell quoting issues.\n Inline --*-json values larger than ~8 KB are rejected; use the paired --*-file - flag.\n After delivery, pass --begin-follow-up-work before posting execution updates.\n Change-rationale entries use the same shape documented under \\`deliver\\`\n (file_path, label, summary, why, impact; summary is named \"summary\", not \"rationale\").\n\nheartbeat:\n Purpose:\n Send a liveness ping without creating a mission event.\n Required:\n --session-key <key>\n --mission-id <id>\n Optional:\n --phase <phase>\n --note <text>\n\nask:\n Purpose:\n Raise a blocking question for a human reviewer. Stop work after ask succeeds.\n Required:\n --session-key <key>\n --mission-id <id>\n --question or --question-file <path|->\n\ndeliver:\n Purpose:\n Conclude the session and submit the final narrative plus artifacts/change rationales.\n Required:\n --session-key <key>\n --mission-id <id>\n --summary or --summary-file <path|->\n or: --payload-json / --payload-file <path|-> with { summary, artifacts, changeRationales }\n Optional:\n --artifacts-json / --artifacts-file <path|->\n --change-rationales-json / --change-rationales-file <path|->\n --changed-files-json / --changed-files-file <path|->\n --no-file-changes Assert this run changed no files\n --skip-rationale-for-json / --skip-rationale-for-file <path|->\n --verification-summary <text>\n --follow-up-notes <text>\n Change-rationale entry shape (each item in --change-rationales-json / -file):\n {\n \"file_path\": \"src/api.ts\", // required. repo-relative path. \"filePath\" also accepted; no \"path\" field.\n \"label\": \"Add retry\", // required. short reviewer-facing title.\n \"summary\": \"Added retry.\", // required. WHAT changed. The field is named \"summary\", NOT \"rationale\".\n \"why\": \"Flaky calls.\", // required. WHY it changed.\n \"impact\": \"Retries 3x.\", // required. behavioral impact.\n \"hunks\": [{ \"header\": \"@@ -10,6 +10,14 @@\" }] // optional.\n }\n Pass an array of these. Do NOT wrap entries under a \"rationale\" key and do not send a\n top-level \"file_changes\" artifact. label/summary/why/impact must be non-empty strings.\n Skip-rationale-for entry shape (each item in --skip-rationale-for-json / -file):\n {\n \"file_path\": \"webapp/package.json\", // required. repo-relative path. \"filePath\" also accepted.\n \"reason\": \"Concurrent host-side edit; not made by this mission.\"\n }\n Use when deliver would fail missing_rationale for a file you did not change. Do not\n fabricate a change rationale and do not revert the file.\n Notes:\n Changed files are captured mechanically: the CLI records a VCS baseline at attach\n and injects the run-attributable delta at deliver. Meaningful tracked changes\n require rationales unless --no-file-changes is passed or the file is listed in\n --skip-rationale-for-*. Do not continue\n implementation after delivery without explicit follow-up.\n Inline --*-json values larger than ~8 KB are rejected; use --change-rationales-file -\n (or --payload-file -) and stream JSON on stdin. Keep --summary inline.\n Run \\`${primaryCommand} protocol changes --mission-id <id>\\` first instead of hand-\n triaging \\`git status\\` \u2014 it prints the same mine/claimed/unclaimed classification\n deliver uses, plus drafted rationales. If deliver still rejects with\n missing_rationale, the error includes a per-path classification and a ready-to-use\n --skip-rationale-for-json value for every non-'mine' path \u2014 one mechanical retry.\n\nchanges:\n Purpose:\n Local-only preflight: print every currently dirty path classified as 'mine'\n (confirmed by this session's touched-files log), 'claimed' (confirmed by another\n active session's log), or 'unclaimed' (dirty, but confirmed by nobody), plus\n draft rationales from local edit notes and ready-to-use --skip-rationale-for-json\n entries for 'claimed' paths. Makes no backend call; safe to run at any time.\n Required:\n --mission-id <id>\n\nresume-follow-up:\n Purpose:\n Reopen a completed objective for post-delivery implementation follow-up.\n Required:\n --mission-id <id>\n Optional:\n --objective-id <id>\n --agent <identifier>\n --model <identifier>\n --summary or --summary-file <path|->\n --external-session-id <id>\n Returns:\n attach-response-v3 JSON with a new session key.\n\nhook-event:\n Purpose:\n Record a connector lifecycle hook without requiring a live session key.\n Required:\n --hook-type UserPromptSubmit\n --mission-id <id>\n Optional:\n --prompt or --prompt-file <path|->\n --session-key <key>\n --external-session-id <id>\n --turn-index <n>\n\nread-context:\n Purpose:\n Read persistent shared context written by earlier sessions.\n Required:\n --mission-id <id>\n Optional:\n --key <substring> Filter by key substring\n --limit <n> Max entries (default: 50)\n\nwrite-context:\n Purpose:\n Save shared facts for future sessions.\n Required:\n --mission-id <id>\n --key <name>\n --value <text> or --value-json / --value-file <path|->\n\nattachment-list:\n Purpose:\n List all attachments for the mission (across all objectives).\n Each entry includes id, filename, mimeType, sizeBytes, status, storageKey, and url.\n The url field is a server-relative path; prepend the backend base URL to download.\n Required:\n --mission-id <id>\n\nattachment-download-url:\n Purpose:\n Return the download URL for a specific attachment on the mission.\n Required:\n --mission-id <id>\n --attachment-id <id> (use the id from attachment-list output)\n\nlist-organizations:\n Purpose:\n Legacy name predating the real organizations hierarchy (coo:135) \u2014 despite the\n name, returns only the caller's current *workspace* context, not organization\n data. Kept as-is to avoid a breaking protocol rename.\n Returns:\n JSON array with a single { id, slug, name } entry for the active workspace.\n\nSupported subcommands: ${subcommands}\nRun \\`${primaryCommand} help\\` for management commands and \\`${primaryCommand} protocol help\\` for this reference.\n`);\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\n\n/**\n * Per-cwd active-session manifest.\n *\n * The Claude PostToolUse edit hook used to require `MISSION_ID` in the process\n * environment to know which mission's touched-files log to append to. Agent-pod\n * sessions never set that variable, so the hook was silently inert (see\n * planning/feature-plans/agent-change-attribution-optimization.md, Layer 1).\n *\n * Instead, `attach`/`resume-follow-up` record an entry here \u2014 keyed by the\n * working directory alone, since the hook only ever knows its own `cwd` \u2014 so the\n * hook (or any adapter) can resolve \"which mission is active in this directory\n * right now\" without needing the launching process to have exported anything.\n * `MISSION_ID` remains a valid override for callers that do set it explicitly.\n *\n * Entries are pruned on `deliver` (the session that owns them ends) and on read\n * (anything past `ACTIVE_SESSION_TTL_MS` is dropped as stale/abandoned).\n */\n\nexport type ActiveSessionEntry = {\n missionId: string;\n sessionKey: string;\n attachedAt: string;\n};\n\nconst ACTIVE_SESSION_TTL_MS = 12 * 60 * 60 * 1000;\n\nfunction manifestPath(workingDirectory: string): string {\n const key = createHash('sha256').update(path.resolve(workingDirectory)).digest('hex');\n return path.join(resolveGlobalDataDir(), 'vcs-sessions', `${key}.json`);\n}\n\nfunction readEntries(workingDirectory: string): ActiveSessionEntry[] {\n try {\n const target = manifestPath(workingDirectory);\n if (!existsSync(target)) return [];\n const raw = JSON.parse(readFileSync(target, 'utf8')) as { entries?: unknown };\n if (!Array.isArray(raw.entries)) return [];\n const now = Date.now();\n return raw.entries.flatMap(entry => {\n if (\n typeof entry !== 'object' ||\n entry === null ||\n typeof (entry as ActiveSessionEntry).missionId !== 'string' ||\n typeof (entry as ActiveSessionEntry).sessionKey !== 'string' ||\n typeof (entry as ActiveSessionEntry).attachedAt !== 'string'\n ) {\n return [];\n }\n const candidate = entry as ActiveSessionEntry;\n const attachedAtMs = Date.parse(candidate.attachedAt);\n if (Number.isNaN(attachedAtMs) || now - attachedAtMs > ACTIVE_SESSION_TTL_MS) return [];\n return [candidate];\n });\n } catch {\n return [];\n }\n}\n\nfunction writeEntries(workingDirectory: string, entries: ActiveSessionEntry[]): void {\n try {\n const target = manifestPath(workingDirectory);\n mkdirSync(path.dirname(target), { recursive: true });\n writeFileSync(target, JSON.stringify({ entries }));\n } catch {\n // Best-effort: without a manifest entry, hooks fall back to the MISSION_ID\n // env var (or stay inert), same as before this feature existed.\n }\n}\n\n/** Record (or refresh) this session as active for its working directory. */\nexport function writeActiveSession({\n workingDirectory,\n missionId,\n sessionKey\n}: {\n workingDirectory: string;\n missionId: string;\n sessionKey: string;\n}): void {\n const trimmedMission = missionId.trim();\n const trimmedKey = sessionKey.trim();\n if (!trimmedMission || !trimmedKey) return;\n const entries = readEntries(workingDirectory).filter(entry => entry.missionId !== trimmedMission);\n entries.push({\n missionId: trimmedMission,\n sessionKey: trimmedKey,\n attachedAt: new Date().toISOString()\n });\n writeEntries(workingDirectory, entries);\n}\n\n/** Drop this mission's entry once its session ends (deliver). */\nexport function removeActiveSession({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): void {\n const remaining = readEntries(workingDirectory).filter(entry => entry.missionId !== missionId);\n writeEntries(workingDirectory, remaining);\n}\n\n/** Live (non-expired) active-session entries for this working directory. */\nexport function readActiveSessions(workingDirectory: string): ActiveSessionEntry[] {\n return readEntries(workingDirectory);\n}\n\nexport type ResolvedMission = { missionId: string; ambiguous: boolean };\n\n/**\n * Resolve which mission is active for a working directory when the caller has\n * no explicit MISSION_ID. Returns `null` when nobody is attached here. When more\n * than one session is concurrently attached in the same directory (a shared\n * worktree), attribution is ambiguous from cwd alone \u2014 callers should treat that\n * as \"no confident answer\" rather than guess (Layer 3 adds proper cross-session\n * claims; this only needs to not mis-attribute).\n */\nexport function resolveActiveMissionForCwd(workingDirectory: string): ResolvedMission | null {\n const entries = readActiveSessions(workingDirectory);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [entry] = entries;\n return entry ? { missionId: entry.missionId, ambiguous: false } : null;\n }\n // Most-recently-attached wins, but flagged ambiguous so callers can log it.\n const mostRecent = [...entries].sort((a, b) => b.attachedAt.localeCompare(a.attachedAt))[0];\n return mostRecent ? { missionId: mostRecent.missionId, ambiguous: true } : null;\n}\n", "import { execFileSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n rmSync,\n writeFileSync\n} from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\nimport { readActiveSessions } from './vcs-sessions.js';\n\n/**\n * Client-side VCS change capture.\n *\n * Changed-file reporting must not depend on the agent remembering to enumerate\n * what it changed. Instead the CLI records a baseline snapshot of dirty paths\n * (path, status, worktree content hash) when a work session begins (`attach` /\n * `resume-follow-up`) and, at `deliver`, computes the run-attributable delta:\n * paths whose worktree state differs from that baseline.\n *\n * The worktree baseline cannot tell concurrent sessions apart: when several\n * missions run against the same repo at once, a file another mission edits *after*\n * this session attached has no baseline entry, so the worktree delta alone would\n * wrongly attribute it here. To stay accurate the CLI also consumes a per-session\n * \"touched files\" log written by the agent's PostToolUse edit hook (the exact set\n * of files this agent edited, including files changed via `Bash` \u2014 see\n * `recordBashObservedChanges`). When that log exists, the run-attributable set is\n * still every path whose worktree state changed since baseline \u2014 completeness\n * comes first \u2014 but each entry is classified as `'mine'` (named in my log),\n * `'claimed'` (named only in another live session's log), or `'unclaimed'`\n * (dirty, but nobody's log confirms it), so callers can exclude concurrent work\n * while still surfacing anything ambiguous for review. A tool-call log is\n * reliable positive evidence but unreliable negative evidence.\n *\n * Finally, a repo may carry an optional `.overlordignore` file at its root listing\n * gitignore-style patterns (e.g. generated artifacts like `install-state.gz`). Any\n * run-attributable path matching those patterns is dropped before reporting, so\n * Overlord never records churn the user has explicitly opted out of tracking.\n *\n * VCS is read on the client only \u2014 we never send diffs or file contents, just\n * normalized paths and short status codes. Everything here is best-effort: outside\n * a git repository (or when git is unavailable) we infer nothing.\n */\n\nexport type ChangedFile = {\n filePath: string;\n vcsStatus: string;\n /**\n * Set only when a touched-files log exists for this session. `'mine'` means the\n * edit hook recorded this path for the current mission. `'claimed'` means only\n * another live session's touched-files log recorded it, so callers can exclude\n * that concurrent work. `'unclaimed'` means the worktree delta includes it but\n * nobody's log confirms it (e.g. a Bash-mediated change the hook's git-status\n * diff hasn't caught up with yet). Completeness first: callers must still report\n * `'unclaimed'` paths, just flagged for review rather than silently dropped.\n */\n attribution?: 'mine' | 'claimed' | 'unclaimed';\n claimedByMissionIds?: string[];\n};\n\nexport type RationaleNoteInput = {\n filePath: string;\n toolName?: string | null;\n intent?: string | null;\n transcriptContext?: string | null;\n};\n\ntype RationaleNote = {\n filePath: string;\n toolName: string | null;\n intent: string | null;\n transcriptContext: string | null;\n contentHash: string | null;\n recordedAt: string;\n};\n\nexport type DraftChangeRationale = {\n file_path: string;\n label: string;\n summary: string;\n why: string;\n impact: string;\n};\n\ntype BaselineFile = {\n filePath: string;\n vcsStatus: string;\n /** `null` means this row came from a legacy path-only baseline. */\n contentHash: string | null;\n};\n\ntype BaselineSnapshot = {\n workingDirectory?: string;\n missionId?: string;\n capturedAt: string;\n files: BaselineFile[];\n};\n\ntype TouchedLog = {\n workingDirectory?: string;\n missionId?: string;\n updatedAt?: string;\n paths: string[];\n};\n\nfunction normalizePath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/').trim();\n}\n\nfunction sameWorkingDirectory(left: string | undefined, right: string): boolean {\n return typeof left === 'string' && path.resolve(left) === path.resolve(right);\n}\n\n/** Parse one `git status --porcelain` line into a changed-file record. */\nfunction parsePorcelainLine(line: string): ChangedFile | null {\n const trimmedEnd = line.replace(/\\s+$/, '');\n if (!trimmedEnd) return null;\n const vcsStatus = trimmedEnd.slice(0, 2).trim() || 'changed';\n let pathPart = trimmedEnd.slice(3).trim();\n // Renames/copies render as \"old -> new\"; the new path is what currently exists.\n const arrow = pathPart.indexOf(' -> ');\n if (arrow !== -1) pathPart = pathPart.slice(arrow + 4).trim();\n // git quotes paths containing special chars; strip the surrounding quotes.\n if (pathPart.startsWith('\"') && pathPart.endsWith('\"') && pathPart.length >= 2) {\n pathPart = pathPart.slice(1, -1);\n }\n const filePath = normalizePath(pathPart);\n return filePath ? { filePath, vcsStatus } : null;\n}\n\nfunction hashWorktreeFile({\n workingDirectory,\n filePath\n}: {\n workingDirectory: string;\n filePath: string;\n}): string | null {\n try {\n return execFileSync('git', ['hash-object', filePath], {\n cwd: workingDirectory,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore']\n }).trim();\n } catch {\n return null;\n }\n}\n\n/** Current changed files from `git status --porcelain`; `[]` when not a git repo. */\nexport function readChangedFiles(workingDirectory: string): ChangedFile[] {\n try {\n const output = execFileSync('git', ['status', '--porcelain'], {\n cwd: workingDirectory,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n maxBuffer: 10 * 1024 * 1024\n });\n const byPath = new Map<string, ChangedFile>();\n for (const line of output.split('\\n')) {\n const entry = parsePorcelainLine(line);\n if (entry) byPath.set(entry.filePath, entry);\n }\n return Array.from(byPath.values());\n } catch {\n return [];\n }\n}\n\n/**\n * Stable per-session key for the working dir + mission. MUST stay in sync with the\n * key the agents' PostToolUse edit hooks compute, so the touched-files log written\n * by the hook resolves to the same file the CLI reads at deliver. The hook mirror\n * is `sha256(abspath(cwd) + \"\\0\" + MISSION_ID)`.\n */\nfunction sessionKeyHash({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return createHash('sha256')\n .update(`${path.resolve(workingDirectory)}\\0${missionId}`)\n .digest('hex');\n}\n\nfunction baselineFilePath({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return path.join(\n resolveGlobalDataDir(),\n 'vcs-baselines',\n `${sessionKeyHash({ workingDirectory, missionId })}.json`\n );\n}\n\nfunction touchedFilesPath({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return path.join(\n resolveGlobalDataDir(),\n 'vcs-touched',\n `${sessionKeyHash({ workingDirectory, missionId })}.json`\n );\n}\n\nfunction rationaleNotesPath({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return path.join(\n resolveGlobalDataDir(),\n 'vcs-rationale-notes',\n `${sessionKeyHash({ workingDirectory, missionId })}.json`\n );\n}\n\n/**\n * Last-seen `git status` snapshot for this session, stored beside the touched-files\n * log. Used only to detect *newly* dirty/re-hashed paths after a `Bash` tool call,\n * so a long-running session doesn't re-record the same Bash-visible change on every\n * subsequent Bash invocation.\n */\nfunction bashSnapshotPath({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return path.join(\n resolveGlobalDataDir(),\n 'vcs-touched',\n `${sessionKeyHash({ workingDirectory, missionId })}.bash-snapshot.json`\n );\n}\n\nfunction readBashSnapshot({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): Map<string, { vcsStatus: string; contentHash: string | null }> {\n try {\n const target = bashSnapshotPath({ workingDirectory, missionId });\n if (!existsSync(target)) return new Map();\n const raw = JSON.parse(readFileSync(target, 'utf8')) as { files?: unknown };\n const byPath = new Map<string, { vcsStatus: string; contentHash: string | null }>();\n if (Array.isArray(raw.files)) {\n for (const entry of raw.files) {\n if (\n typeof entry === 'object' &&\n entry !== null &&\n typeof (entry as BaselineFile).filePath === 'string'\n ) {\n const file = entry as BaselineFile;\n byPath.set(file.filePath, {\n vcsStatus: typeof file.vcsStatus === 'string' ? file.vcsStatus : 'changed',\n contentHash: typeof file.contentHash === 'string' ? file.contentHash : null\n });\n }\n }\n }\n return byPath;\n } catch {\n return new Map();\n }\n}\n\nfunction writeBashSnapshot({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: BaselineFile[];\n}): void {\n try {\n const target = bashSnapshotPath({ workingDirectory, missionId });\n mkdirSync(path.dirname(target), { recursive: true });\n writeFileSync(target, JSON.stringify({ updatedAt: new Date().toISOString(), files }));\n } catch {\n // Best-effort: worst case a future Bash call re-records an already-touched path.\n }\n}\n\n/**\n * Close the Bash gap in the touched-files log. Files changed via `Bash` (codegen,\n * package managers, migration runners, `git mv`, build scripts) never fire Claude's\n * native file-editing tools, so the edit hook never sees them directly. Called after\n * every `Bash` tool invocation, this diffs the current `git status --porcelain`\n * output against the last-seen snapshot for this session and appends any\n * newly-changed or newly-re-hashed path to the touched-files log, so the deliver-time\n * intersection treats Bash-mediated edits the same as direct tool edits.\n */\nexport function recordBashObservedChanges({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): { addedCount: number } {\n try {\n const current = readChangedFiles(workingDirectory);\n const currentSnapshot = snapshotBaselineFiles({ workingDirectory, files: current });\n const previous = readBashSnapshot({ workingDirectory, missionId });\n\n const newlyChanged = currentSnapshot.filter(entry => {\n const prior = previous.get(entry.filePath);\n if (!prior) return true;\n if (entry.contentHash === null || prior.contentHash === null) {\n return entry.vcsStatus !== prior.vcsStatus;\n }\n return entry.contentHash !== prior.contentHash;\n });\n\n writeBashSnapshot({ workingDirectory, missionId, files: currentSnapshot });\n\n if (newlyChanged.length === 0) return { addedCount: 0 };\n\n recordTouchedFiles({\n workingDirectory,\n missionId,\n files: newlyChanged.map(entry => entry.filePath)\n });\n return { addedCount: newlyChanged.length };\n } catch {\n return { addedCount: 0 };\n }\n}\n\n/**\n * Absolute, symlink-resolved, slash-normalized path for cross-checking VCS and\n * touched entries. Resolving symlinks is what keeps both sides comparable: the\n * touched log records paths against the agent's working directory, while the\n * deliver-time intersection resolves them against `git rev-parse --show-toplevel`,\n * which git already canonicalizes (e.g. macOS `/var` \u2192 `/private/var`). Without\n * realpath here the two forms never match and every touched file is dropped.\n *\n * `realpathSync` needs the path to exist; for deleted files we resolve the\n * nearest existing ancestor and re-append the basename, falling back to a plain\n * resolve when even that is unavailable.\n */\nfunction normalizeAbsolute(filePath: string): string {\n const resolved = path.resolve(filePath);\n try {\n return realpathSync(resolved).replace(/\\\\/g, '/');\n } catch {\n try {\n return path\n .join(realpathSync(path.dirname(resolved)), path.basename(resolved))\n .replace(/\\\\/g, '/');\n } catch {\n return resolved.replace(/\\\\/g, '/');\n }\n }\n}\n\n/** Repo root for the working dir, or `null` outside a git repo. */\nfunction gitRepoRoot(workingDirectory: string): string | null {\n try {\n const root = execFileSync('git', ['rev-parse', '--show-toplevel'], {\n cwd: workingDirectory,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore']\n }).trim();\n return root || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Clear any touched-files log for this session so a freshly (re)started session\n * starts from an empty edit set. Called alongside `writeBaseline`.\n */\nexport function resetTouchedFiles({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): void {\n try {\n for (const target of [\n touchedFilesPath({ workingDirectory, missionId }),\n bashSnapshotPath({ workingDirectory, missionId })\n ]) {\n if (existsSync(target)) rmSync(target);\n }\n } catch {\n // Best-effort: a stale log at worst keeps prior edits in scope; the worktree\n // delta still gates what is reported.\n }\n}\n\n/** Clear any rationale-note log for this session. */\nexport function resetRationaleNotes({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): void {\n try {\n const target = rationaleNotesPath({ workingDirectory, missionId });\n if (existsSync(target)) rmSync(target);\n } catch {\n // Best-effort: stale notes only create reviewable drafts; they do not expand\n // changed-file attribution because the VCS delta still decides coverage.\n }\n}\n\nfunction truncateNoteText(value: string | null | undefined, max = 500): string | null {\n const trimmed = (value ?? '').replace(/\\s+/g, ' ').trim();\n if (!trimmed) return null;\n return trimmed.length > max ? `${trimmed.slice(0, max - 1)}...` : trimmed;\n}\n\nfunction readRationaleNotes({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): RationaleNote[] {\n try {\n const target = rationaleNotesPath({ workingDirectory, missionId });\n if (!existsSync(target)) return [];\n const raw = JSON.parse(readFileSync(target, 'utf8')) as { notes?: unknown };\n if (!Array.isArray(raw.notes)) return [];\n return raw.notes.flatMap(note => {\n if (\n typeof note !== 'object' ||\n note === null ||\n typeof (note as RationaleNote).filePath !== 'string'\n ) {\n return [];\n }\n const candidate = note as Partial<RationaleNote> & { filePath: string };\n return [\n {\n filePath: normalizeAbsolute(candidate.filePath),\n toolName: truncateNoteText(candidate.toolName),\n intent: truncateNoteText(candidate.intent),\n transcriptContext: truncateNoteText(candidate.transcriptContext),\n contentHash:\n typeof candidate.contentHash === 'string' && candidate.contentHash.trim()\n ? candidate.contentHash\n : null,\n recordedAt:\n typeof candidate.recordedAt === 'string' && candidate.recordedAt.trim()\n ? candidate.recordedAt\n : new Date(0).toISOString()\n }\n ];\n });\n } catch {\n return [];\n }\n}\n\n/**\n * Record lightweight edit context that can later become draft change\n * rationales. Notes are local-only session state, stored next to touched-file\n * logs, and are keyed by the same working directory + mission hash.\n */\nexport function recordRationaleNotes({\n workingDirectory,\n missionId,\n notes\n}: {\n workingDirectory: string;\n missionId: string;\n notes: RationaleNoteInput[];\n}): void {\n try {\n const additions = notes\n .map(note => ({\n filePath: (note.filePath ?? '').trim(),\n toolName: truncateNoteText(note.toolName, 80),\n intent: truncateNoteText(note.intent),\n transcriptContext: truncateNoteText(note.transcriptContext)\n }))\n .filter(note => note.filePath)\n .map(note => {\n const absolute = normalizeAbsolute(path.resolve(workingDirectory, note.filePath));\n return {\n filePath: absolute,\n toolName: note.toolName,\n intent: note.intent,\n transcriptContext: note.transcriptContext,\n contentHash: hashWorktreeFile({\n workingDirectory,\n filePath: path.relative(workingDirectory, absolute)\n }),\n recordedAt: new Date().toISOString()\n };\n });\n if (additions.length === 0) return;\n\n const target = rationaleNotesPath({ workingDirectory, missionId });\n mkdirSync(path.dirname(target), { recursive: true });\n const prior = readRationaleNotes({ workingDirectory, missionId });\n const notesToKeep = [...prior, ...additions].slice(-200);\n writeFileSync(\n target,\n JSON.stringify({ updatedAt: new Date().toISOString(), notes: notesToKeep })\n );\n } catch {\n // Best-effort: deliver can still proceed with explicit rationales.\n }\n}\n\n/**\n * Append the files an agent just edited to this session's touched-files log. Used\n * by edit hooks (and tests); paths are stored absolute and slash-normalized.\n */\nexport function recordTouchedFiles({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: string[];\n}): void {\n try {\n const additions = files\n .map(filePath => (filePath ?? '').trim())\n .filter(Boolean)\n .map(filePath => normalizeAbsolute(path.resolve(workingDirectory, filePath)));\n if (additions.length === 0) return;\n const target = touchedFilesPath({ workingDirectory, missionId });\n mkdirSync(path.dirname(target), { recursive: true });\n const existing = readTouchedLog({ workingDirectory, missionId })?.paths ?? new Set<string>();\n for (const filePath of additions) existing.add(filePath);\n writeFileSync(\n target,\n JSON.stringify({\n workingDirectory: path.resolve(workingDirectory),\n missionId,\n updatedAt: new Date().toISOString(),\n paths: Array.from(existing)\n })\n );\n } catch {\n // Best-effort: a failed write just means deliver falls back to the worktree\n // baseline for this session.\n }\n}\n\n/** Whether a touched-files log exists for this session (used for deliver-time diagnostics). */\nexport function hasTouchedFilesLog({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): boolean {\n return existsSync(touchedFilesPath({ workingDirectory, missionId }));\n}\n\n/**\n * Absolute paths this agent edited this session, or `null` when no log exists\n * (i.e. the connector has no edit hook). `null` disables the intersection so\n * hookless agents keep the legacy worktree-baseline behavior.\n */\nfunction readTouchedLog({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): { paths: Set<string>; workingDirectory?: string; missionId?: string } | null {\n try {\n const target = touchedFilesPath({ workingDirectory, missionId });\n if (!existsSync(target)) return null;\n const raw = JSON.parse(readFileSync(target, 'utf8')) as TouchedLog;\n const result = new Set<string>();\n if (Array.isArray(raw.paths)) {\n for (const entry of raw.paths) {\n if (typeof entry === 'string' && entry.trim()) result.add(normalizeAbsolute(entry));\n }\n }\n return {\n paths: result,\n workingDirectory: typeof raw.workingDirectory === 'string' ? raw.workingDirectory : undefined,\n missionId: typeof raw.missionId === 'string' ? raw.missionId : undefined\n };\n } catch {\n return null;\n }\n}\n\nfunction snapshotBaselineFiles({\n workingDirectory,\n files\n}: {\n workingDirectory: string;\n files: ChangedFile[];\n}): BaselineFile[] {\n return files.map(entry => ({\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n contentHash: hashWorktreeFile({ workingDirectory, filePath: entry.filePath })\n }));\n}\n\n/** Record the baseline snapshot for a session's working dir. */\nexport function writeBaseline({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: ChangedFile[];\n}): void {\n try {\n const target = baselineFilePath({ workingDirectory, missionId });\n mkdirSync(path.dirname(target), { recursive: true });\n const snapshot: BaselineSnapshot = {\n workingDirectory: path.resolve(workingDirectory),\n missionId,\n capturedAt: new Date().toISOString(),\n files: snapshotBaselineFiles({ workingDirectory, files })\n };\n writeFileSync(target, JSON.stringify(snapshot));\n } catch {\n // Best-effort: a missing baseline just means deliver treats every dirty path\n // as run-attributable, which is safe (errs toward completeness).\n }\n}\n\ntype PeerClaim = {\n missionId: string;\n paths: Set<string>;\n};\n\nfunction readPeerTouchedClaims({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): PeerClaim[] {\n const activeMissionIds = new Set(\n readActiveSessions(workingDirectory)\n .map(entry => entry.missionId.trim())\n .filter(Boolean)\n );\n if (activeMissionIds.size === 0) return [];\n\n const directory = path.join(resolveGlobalDataDir(), 'vcs-touched');\n if (!existsSync(directory)) return [];\n\n const claims: PeerClaim[] = [];\n for (const name of readdirSync(directory)) {\n if (!name.endsWith('.json') || name.endsWith('.bash-snapshot.json')) continue;\n try {\n const raw = JSON.parse(readFileSync(path.join(directory, name), 'utf8')) as TouchedLog;\n const candidateMissionId =\n typeof raw.missionId === 'string' && raw.missionId.trim() ? raw.missionId.trim() : null;\n if (!candidateMissionId || candidateMissionId === missionId) continue;\n if (!activeMissionIds.has(candidateMissionId)) continue;\n if (!sameWorkingDirectory(raw.workingDirectory, workingDirectory)) continue;\n\n const paths = new Set<string>();\n if (Array.isArray(raw.paths)) {\n for (const entry of raw.paths) {\n if (typeof entry === 'string' && entry.trim()) paths.add(normalizeAbsolute(entry));\n }\n }\n if (paths.size === 0) continue;\n claims.push({ missionId: candidateMissionId, paths });\n } catch {\n continue;\n }\n }\n\n return claims;\n}\n\nfunction readBaselineSnapshot({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): Map<string, BaselineFile> {\n try {\n const target = baselineFilePath({ workingDirectory, missionId });\n if (!existsSync(target)) return new Map();\n const raw = JSON.parse(readFileSync(target, 'utf8')) as {\n files?: unknown;\n paths?: unknown;\n };\n if (Array.isArray(raw.files)) {\n const byPath = new Map<string, BaselineFile>();\n for (const entry of raw.files) {\n if (\n typeof entry === 'object' &&\n entry !== null &&\n typeof (entry as BaselineFile).filePath === 'string'\n ) {\n const file = entry as BaselineFile;\n byPath.set(file.filePath, {\n filePath: file.filePath,\n vcsStatus: typeof file.vcsStatus === 'string' ? file.vcsStatus : 'changed',\n contentHash: typeof file.contentHash === 'string' ? file.contentHash : null\n });\n }\n }\n return byPath;\n }\n // Legacy path-only baselines cannot detect further edits within the same path.\n if (Array.isArray(raw.paths)) {\n const byPath = new Map<string, BaselineFile>();\n for (const filePath of raw.paths) {\n if (typeof filePath === 'string') {\n byPath.set(filePath, { filePath, vcsStatus: 'changed', contentHash: null });\n }\n }\n return byPath;\n }\n return new Map();\n } catch {\n return new Map();\n }\n}\n\nfunction isRunAttributableChange({\n workingDirectory,\n entry,\n baseline\n}: {\n workingDirectory: string;\n entry: ChangedFile;\n baseline: Map<string, BaselineFile>;\n}): boolean {\n const base = baseline.get(entry.filePath);\n if (!base) return true;\n if (base.contentHash === null) return false;\n const currentHash = hashWorktreeFile({ workingDirectory, filePath: entry.filePath });\n return currentHash !== base.contentHash;\n}\n\ntype IgnoreRule = {\n /** A `!`-prefixed pattern re-includes a path an earlier rule ignored. */\n negated: boolean;\n regex: RegExp;\n};\n\n/** Name of the per-repo ignore file, resolved at the git repo root. */\nexport const OVERLORD_IGNORE_FILENAME = '.overlordignore';\n\n/** Translate one gitignore-style glob body into a regex fragment (no anchors). */\nfunction ignoreGlobToRegExp(glob: string): string {\n let out = '';\n for (let index = 0; index < glob.length; index += 1) {\n const char = glob[index] ?? '';\n if (char === '*') {\n if (glob[index + 1] === '*') {\n index += 1;\n if (glob[index + 1] === '/') {\n // `**/` matches any number of leading path segments, including none.\n index += 1;\n out += '(.*/)?';\n } else {\n out += '.*';\n }\n } else {\n out += '[^/]*';\n }\n } else if (char === '?') {\n out += '[^/]';\n } else {\n out += char.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n }\n return out;\n}\n\n/** Compile a single `.overlordignore` line into a rule, or `null` to skip it. */\nfunction compileIgnorePattern(rawPattern: string): IgnoreRule | null {\n let pattern = rawPattern;\n let negated = false;\n if (pattern.startsWith('!')) {\n negated = true;\n pattern = pattern.slice(1);\n }\n // Allow escaping a literal leading '#' or '!' the same way gitignore does.\n if (pattern.startsWith('\\\\#') || pattern.startsWith('\\\\!')) {\n pattern = pattern.slice(1);\n }\n let directoryOnly = false;\n if (pattern.endsWith('/')) {\n directoryOnly = true;\n pattern = pattern.slice(0, -1);\n }\n if (!pattern) return null;\n\n // A slash anywhere but a trailing one anchors the pattern to the repo root;\n // an unanchored pattern matches its basename at any depth.\n const anchored = pattern.includes('/');\n if (pattern.startsWith('/')) pattern = pattern.slice(1);\n if (!pattern) return null;\n\n const prefix = anchored ? '^' : '(^|/)';\n const body = ignoreGlobToRegExp(pattern);\n // A directory pattern only matches files *under* it (changed paths are files);\n // a file pattern matches the path itself or, if it names a directory, its\n // contents.\n const suffix = directoryOnly ? '/.*$' : '(/.*)?$';\n try {\n return { negated, regex: new RegExp(`${prefix}${body}${suffix}`) };\n } catch {\n return null;\n }\n}\n\n/** Parse the repo's `.overlordignore` into ordered rules; `[]` when absent. */\nfunction loadIgnoreRules(repoRoot: string): IgnoreRule[] {\n try {\n const target = path.join(repoRoot, OVERLORD_IGNORE_FILENAME);\n if (!existsSync(target)) return [];\n const rules: IgnoreRule[] = [];\n for (const rawLine of readFileSync(target, 'utf8').split('\\n')) {\n const line = rawLine.replace(/\\r$/, '').trim();\n if (!line || line.startsWith('#')) continue;\n const rule = compileIgnorePattern(line);\n if (rule) rules.push(rule);\n }\n return rules;\n } catch {\n return [];\n }\n}\n\n/**\n * Whether a repo-root-relative path is ignored. Rules apply in order and the\n * last matching rule wins, so a later `!pattern` can re-include a path an earlier\n * pattern excluded (gitignore semantics).\n */\nfunction isIgnoredPath(rules: IgnoreRule[], relativePath: string): boolean {\n let ignored = false;\n for (const rule of rules) {\n if (rule.regex.test(relativePath)) ignored = !rule.negated;\n }\n return ignored;\n}\n\n/**\n * Keep only paths this run is responsible for, classifying each by whether the\n * agent's own touched-files log confirms it.\n *\n * A path qualifies when its worktree state differs from the session baseline.\n * When the connector's edit hook recorded a touched-files log, paths it names are\n * marked `attribution: 'mine'`. Paths only other live sessions claim are marked\n * `'claimed'`, so callers can exclude them from this mission's report and, at\n * deliver, attach truthful skip entries if stale server-side rows still demand\n * coverage. Paths nobody claims are marked `'unclaimed'` and are still returned\n * rather than dropped: a tool-call log is reliable positive evidence but\n * unreliable negative evidence (a hook outage, an unmatched tool, or a Bash call\n * the hook hasn't diffed yet all look identical to \"not mine\"), and completeness\n * is the first priority. Hookless connectors get `null` from `readTouchedLog` and\n * every entry is returned with no attribution marker (legacy baseline-only\n * behavior).\n *\n * `git status --porcelain` paths are repo-root-relative, so we resolve them\n * against the repo root before comparing with the absolute touched paths.\n *\n * Finally, any path matching the repo's optional `.overlordignore` is dropped,\n * letting users opt specific files (e.g. generated artifacts) out of tracking.\n */\nexport function filterRunAttributableChanges({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: ChangedFile[];\n}): ChangedFile[] {\n const baseline = readBaselineSnapshot({ workingDirectory, missionId });\n const touched = readTouchedLog({ workingDirectory, missionId });\n const repoRoot = gitRepoRoot(workingDirectory) ?? workingDirectory;\n const ignoreRules = loadIgnoreRules(repoRoot);\n const peerClaims = touched ? readPeerTouchedClaims({ workingDirectory, missionId }) : [];\n return files.flatMap(entry => {\n if (!isRunAttributableChange({ workingDirectory, entry, baseline })) return [];\n if (ignoreRules.length > 0 && isIgnoredPath(ignoreRules, normalizePath(entry.filePath))) {\n return [];\n }\n if (!touched) return [{ filePath: entry.filePath, vcsStatus: entry.vcsStatus }];\n const absolute = normalizeAbsolute(path.resolve(repoRoot, entry.filePath));\n if (touched.paths.has(absolute)) {\n return [\n {\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n attribution: 'mine'\n }\n ];\n }\n const claimedByMissionIds = peerClaims\n .filter(claim => claim.paths.has(absolute))\n .map(claim => claim.missionId)\n .sort();\n if (claimedByMissionIds.length > 0) {\n return [\n {\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n attribution: 'claimed',\n claimedByMissionIds\n }\n ];\n }\n return [\n {\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n attribution: 'unclaimed'\n }\n ];\n });\n}\n\nfunction titleFromPath(filePath: string): string {\n const base = path.basename(filePath).replace(/\\.[^.]+$/, '');\n const words = base\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[-_]+/g, ' ')\n .trim();\n if (!words) return `Update ${filePath}`;\n return `Update ${words.replace(/\\b\\w/g, char => char.toUpperCase())}`;\n}\n\nfunction latestRelevantNote({\n notes,\n filePath,\n currentHash\n}: {\n notes: RationaleNote[];\n filePath: string;\n currentHash: string | null;\n}): RationaleNote | null {\n const candidates = notes\n .filter(note => note.filePath === filePath)\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n if (candidates.length === 0) return null;\n return (\n candidates.find(note => currentHash && note.contentHash && note.contentHash === currentHash) ??\n candidates[0] ??\n null\n );\n}\n\n/**\n * Build reviewable draft rationales for the current run-attributable files from\n * local edit notes. This preserves the server-side coverage contract: the caller\n * can merge drafts for files that do not already have explicit rationales.\n */\nexport function draftChangeRationalesFromNotes({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: ChangedFile[];\n}): DraftChangeRationale[] {\n const notes = readRationaleNotes({ workingDirectory, missionId });\n if (notes.length === 0 || files.length === 0) return [];\n const repoRoot = gitRepoRoot(workingDirectory) ?? workingDirectory;\n return files.flatMap(file => {\n const absolute = normalizeAbsolute(path.resolve(repoRoot, file.filePath));\n const currentHash = hashWorktreeFile({ workingDirectory, filePath: file.filePath });\n const note = latestRelevantNote({ notes, filePath: absolute, currentHash });\n if (!note) return [];\n\n const action = note.intent ?? `edited with ${note.toolName ?? 'a file-editing tool'}`;\n const context = note.transcriptContext ? ` Session context: ${note.transcriptContext}` : '';\n return [\n {\n file_path: normalizePath(file.filePath),\n label: titleFromPath(file.filePath),\n summary: `Draft from local edit notes: ${action}.${context}`.slice(0, 700),\n why: `This file was changed for the active objective; the draft was generated from the edit note captured when the change was made.`,\n impact: `Preserves review coverage for ${normalizePath(\n file.filePath\n )}; review the final diff before delivery if a more specific product impact is needed.`\n }\n ];\n });\n}\n\n/** Files whose worktree state changed since the session began. */\nexport function computeRunDelta({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): ChangedFile[] {\n return filterRunAttributableChanges({\n workingDirectory,\n missionId,\n files: readChangedFiles(workingDirectory)\n });\n}\n", "import { readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { recordBashObservedChanges, recordRationaleNotes, recordTouchedFiles } from './vcs.js';\nimport { resolveActiveMissionForCwd } from './vcs-sessions.js';\n\n/**\n * Shared implementation behind `ovld protocol record-touched`.\n *\n * Any adapter's file-editing-tool hook (Claude's PostToolUse today; Codex/Cursor\n * once they grow one) can pipe its native hook JSON on stdin here instead of\n * reimplementing the touched-files log and rationale-note bookkeeping itself.\n * The only per-adapter assumption is the payload shape below (`tool_name`,\n * `tool_input.file_path` / `notebook_path` / `edits`, `cwd`, `transcript_path`),\n * which mirrors Claude Code's hook body; adapters with a different shape should\n * normalize to this shape before piping in.\n */\n\ntype HookPayload = {\n tool_name?: unknown;\n tool_input?: unknown;\n cwd?: unknown;\n transcript_path?: unknown;\n};\n\ntype EditCandidate = { filePath: string; editCount: number };\n\nfunction collectCandidates(toolInput: Record<string, unknown>): EditCandidate[] {\n const counts = new Map<string, number>();\n const order: string[] = [];\n const bump = (raw: unknown, amount: number) => {\n if (typeof raw !== 'string') return;\n const trimmed = raw.trim();\n if (!trimmed) return;\n if (!counts.has(trimmed)) order.push(trimmed);\n counts.set(trimmed, (counts.get(trimmed) ?? 0) + amount);\n };\n\n bump(toolInput.file_path, 1);\n bump(toolInput.notebook_path, 1);\n\n const edits = toolInput.edits;\n if (Array.isArray(edits)) {\n const topLevelPath = toolInput.file_path;\n if (typeof topLevelPath === 'string' && topLevelPath.trim()) {\n counts.set(topLevelPath.trim(), (counts.get(topLevelPath.trim()) ?? 0) - 1);\n }\n for (const edit of edits) {\n if (edit && typeof edit === 'object') {\n const value = (edit as Record<string, unknown>).file_path ?? topLevelPath;\n bump(value, 1);\n }\n }\n }\n\n return order.map(filePath => ({ filePath, editCount: Math.max(counts.get(filePath) ?? 1, 1) }));\n}\n\nfunction compact(value: string | null | undefined, limit = 500): string | null {\n if (typeof value !== 'string') return null;\n const text = value.split(/\\s+/).filter(Boolean).join(' ');\n if (!text) return null;\n return text.length > limit ? `${text.slice(0, limit - 1)}...` : text;\n}\n\nfunction editIntent({\n toolName,\n filePath,\n editCount\n}: {\n toolName: string;\n filePath: string;\n editCount: number;\n}): string {\n if (toolName === 'Write') return 'wrote or replaced the file';\n if (toolName === 'MultiEdit' || editCount > 1)\n return `applied ${editCount} targeted text edit(s)`;\n if (toolName === 'Edit') return 'replaced selected text';\n if (/notebook/i.test(filePath) || /notebook/i.test(toolName)) return 'edited notebook content';\n return `edited via ${toolName}`;\n}\n\n/** Best-effort: last assistant message text from the transcript, for rationale context. */\nfunction recentAssistantContext(transcriptPath: unknown): string | null {\n if (typeof transcriptPath !== 'string' || !transcriptPath.trim()) return null;\n try {\n const lines = readFileSync(transcriptPath, 'utf8').split('\\n').slice(-200);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index]?.trim();\n if (!line) continue;\n let event: unknown;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n if (typeof event !== 'object' || event === null) continue;\n const record = event as Record<string, unknown>;\n const message = record.message as Record<string, unknown> | undefined;\n const role = message?.role ?? record.type;\n if (role !== 'assistant') continue;\n const content = message?.content ?? record.content;\n const texts: string[] = [];\n if (typeof content === 'string') {\n texts.push(content);\n } else if (Array.isArray(content)) {\n for (const item of content) {\n if (\n item &&\n typeof item === 'object' &&\n (item as Record<string, unknown>).type === 'text'\n ) {\n const text = (item as Record<string, unknown>).text;\n if (typeof text === 'string') texts.push(text);\n }\n }\n }\n const compacted = compact(texts.join(' '));\n if (compacted) return compacted;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport type RecordTouchedResult =\n | { recorded: true; missionId: string; ambiguous: boolean; files: number }\n | { recorded: false; reason: string };\n\n/**\n * Parse a hook payload and append its edited files to the resolved mission's\n * touched-files log + rationale notes. `missionOverride` (from `--mission-id` or\n * the `MISSION_ID` env var) always wins over manifest resolution.\n */\nexport function recordTouchedFromPayload({\n rawPayload,\n missionOverride,\n fallbackCwd\n}: {\n rawPayload: string;\n missionOverride?: string;\n fallbackCwd: string;\n}): RecordTouchedResult {\n let payload: HookPayload;\n try {\n payload = JSON.parse(rawPayload) as HookPayload;\n } catch {\n return { recorded: false, reason: 'invalid JSON payload' };\n }\n\n const toolInputRaw = payload.tool_input;\n const toolInput =\n toolInputRaw && typeof toolInputRaw === 'object'\n ? (toolInputRaw as Record<string, unknown>)\n : {};\n const toolName =\n typeof payload.tool_name === 'string' && payload.tool_name.trim()\n ? payload.tool_name.trim()\n : 'file edit';\n\n const cwd =\n typeof payload.cwd === 'string' && payload.cwd.trim() ? payload.cwd.trim() : fallbackCwd;\n const workingDirectory = path.resolve(cwd);\n\n const trimmedOverride = missionOverride?.trim();\n let missionId: string;\n let ambiguous = false;\n if (trimmedOverride) {\n missionId = trimmedOverride;\n } else {\n const resolved = resolveActiveMissionForCwd(workingDirectory);\n if (!resolved) {\n return { recorded: false, reason: 'no active session manifest entry for this cwd' };\n }\n missionId = resolved.missionId;\n ambiguous = resolved.ambiguous;\n }\n\n if (toolName === 'Bash') {\n // Bash never names the files it changes (codegen, package managers, `git mv`,\n // build scripts), so there is nothing to extract from `tool_input`. Instead,\n // diff the current worktree against the last-seen snapshot for this session and\n // fold anything newly dirty into the touched-files log as positive evidence.\n const { addedCount } = recordBashObservedChanges({ workingDirectory, missionId });\n return { recorded: true, missionId, ambiguous, files: addedCount };\n }\n\n const candidates = collectCandidates(toolInput);\n if (candidates.length === 0) return { recorded: false, reason: 'no file candidates in payload' };\n\n const transcriptContext = recentAssistantContext(payload.transcript_path);\n\n recordTouchedFiles({\n workingDirectory,\n missionId,\n files: candidates.map(candidate => candidate.filePath)\n });\n recordRationaleNotes({\n workingDirectory,\n missionId,\n notes: candidates.map(candidate => ({\n filePath: candidate.filePath,\n toolName: compact(toolName, 80),\n intent: compact(\n editIntent({ toolName, filePath: candidate.filePath, editCount: candidate.editCount })\n ),\n transcriptContext\n }))\n });\n\n return { recorded: true, missionId, ambiguous, files: candidates.length };\n}\n", "import type { ProjectResourceDto } from '@overlord/contract';\nimport { InProcessProvider } from '@overlord/core/service/local-target/in-process-provider';\n\ntype BackendClient = {\n get: <T>(path: string) => Promise<T>;\n post: <T>(args: { path: string; body?: unknown }) => Promise<T>;\n};\n\nfunction resourcesForTarget({\n resources,\n executionTargetId\n}: {\n resources: ProjectResourceDto[];\n executionTargetId: string;\n}): ProjectResourceDto[] {\n return resources.filter(\n resource =>\n resource.type === 'local_directory' &&\n resource.status !== 'archived' &&\n (resource.executionTargetId === executionTargetId || resource.executionTargetId === null)\n );\n}\n\n/** Observe project resources on this machine and write results to the control plane. */\nexport async function reportRunnerResourceObservations({\n backend,\n projectId,\n executionTargetId\n}: {\n backend: BackendClient;\n projectId: string;\n executionTargetId: string;\n}): Promise<number> {\n const resources = await backend.get<ProjectResourceDto[]>(\n `/api/projects/${encodeURIComponent(projectId)}/resources`\n );\n const scoped = resourcesForTarget({ resources, executionTargetId });\n if (scoped.length === 0) return 0;\n\n const provider = new InProcessProvider({\n executionTargetId,\n deviceLabel: null,\n transport: 'in_process'\n });\n\n const observations = [];\n for (const resource of scoped) {\n const result = await provider.observeResource({\n resourceId: resource.id,\n path: resource.path\n });\n if (!result.ok) continue;\n observations.push({\n resourceId: resource.id,\n state: result.value.state,\n gitRoot: result.value.gitRoot ?? null,\n branch: result.value.branch ?? null,\n commit: result.value.commit ?? null,\n observedAt: result.value.observedAt\n });\n }\n\n if (observations.length === 0) return 0;\n\n const response = await backend.post<{ recorded: number }>({\n path: `/api/execution-targets/${encodeURIComponent(executionTargetId)}/observations`,\n body: { observations }\n });\n return response.recorded ?? observations.length;\n}\n", "// Persistent runner service (Runner Layer).\n//\n// A host-managed supervisor around the existing one-shot claim-and-launch path.\n// The CLI owns install/start/stop/status/uninstall of an OS-level user service\n// (macOS launchd LaunchAgent, Linux `systemd --user` unit) whose only job is to\n// run `ovld runner supervise` \u2014 the adaptive long-running loop that delegates\n// each poll to the same code used by `ovld runner once`.\n//\n// This module keeps all pure, testable logic \u2014 adaptive interval selection,\n// service-file rendering, and local state I/O \u2014 separate from the thin process\n// exec wiring so the behavior can be unit-tested without touching the host OS.\n\nimport { execFile } from 'node:child_process';\nimport { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { resolveGlobalDataDir } from './config.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * The rendered service definition embeds a user token in its environment, so the\n * file must never be world-readable. Owner read/write only.\n */\nfunction writeServiceFile(filePath: string, contents: string): void {\n writeFileSync(filePath, contents, { mode: 0o600 });\n // `mode` on writeFileSync is ignored when the file already exists, so enforce\n // it explicitly for the overwrite-an-existing-unit case.\n chmodSync(filePath, 0o600);\n}\n\n// ---- Constants --------------------------------------------------------------\n\nexport const RUNNER_SERVICE_STATE_FILENAME = 'runner-service.json';\n/** macOS launchd LaunchAgent label. */\nexport const LAUNCHD_LABEL = 'io.overlord.runner';\n/** Linux systemd --user unit name (without the `.service` suffix). */\nexport const SYSTEMD_UNIT_NAME = 'overlord-runner';\n\n/** Fast cadence used while a job launched recently. */\nexport const FAST_POLL_INTERVAL_MS = 3000;\n/** Slow cadence used after a long idle stretch. */\nexport const SLOW_POLL_INTERVAL_MS = 10000;\n/** Idle window (2h) after which polling backs off to the slow cadence. */\nexport const IDLE_BACKOFF_MS = 2 * 60 * 60 * 1000;\n\nexport type RunnerServiceKind = 'launchd' | 'systemd';\n\n// ---- Local state ------------------------------------------------------------\n\nexport interface RunnerServiceState {\n serviceKind: RunnerServiceKind | null;\n serviceIdentifier: string | null;\n execProgram: string | null;\n execArgs: string[];\n backendUrl: string | null;\n installedAt: string | null;\n lastHeartbeatAt: string | null;\n lastClaimedAt: string | null;\n lastLaunchedAt: string | null;\n lastError: string | null;\n currentPollIntervalMs: number | null;\n}\n\nexport function emptyRunnerServiceState(): RunnerServiceState {\n return {\n serviceKind: null,\n serviceIdentifier: null,\n execProgram: null,\n execArgs: [],\n backendUrl: null,\n installedAt: null,\n lastHeartbeatAt: null,\n lastClaimedAt: null,\n lastLaunchedAt: null,\n lastError: null,\n currentPollIntervalMs: null\n };\n}\n\nexport function runnerServiceStatePath(dataDir: string = resolveGlobalDataDir()): string {\n return path.join(dataDir, RUNNER_SERVICE_STATE_FILENAME);\n}\n\nexport function readRunnerServiceState(\n dataDir: string = resolveGlobalDataDir()\n): RunnerServiceState {\n const filePath = runnerServiceStatePath(dataDir);\n if (!existsSync(filePath)) return emptyRunnerServiceState();\n try {\n const parsed = JSON.parse(readFileSync(filePath, 'utf8')) as Partial<RunnerServiceState>;\n return { ...emptyRunnerServiceState(), ...parsed };\n } catch {\n // A corrupt state file is local diagnostic data only; never fail a poll or a\n // status read because of it \u2014 start from a clean slate.\n return emptyRunnerServiceState();\n }\n}\n\nexport function writeRunnerServiceState(\n state: RunnerServiceState,\n dataDir: string = resolveGlobalDataDir()\n): void {\n mkdirSync(dataDir, { recursive: true });\n writeFileSync(runnerServiceStatePath(dataDir), `${JSON.stringify(state, null, 2)}\\n`, 'utf8');\n}\n\n/** Merge a partial patch into the persisted state and write it back. */\nexport function patchRunnerServiceState(\n patch: Partial<RunnerServiceState>,\n dataDir: string = resolveGlobalDataDir()\n): RunnerServiceState {\n const next = { ...readRunnerServiceState(dataDir), ...patch };\n writeRunnerServiceState(next, dataDir);\n return next;\n}\n\n// ---- Adaptive polling -------------------------------------------------------\n\n/**\n * Base poll interval by the \"last launched job\" clock (not \"last poll with\n * work\"): fast while a job launched within the idle window, slow afterwards.\n * Pure and deterministic so the cadence is unit-testable.\n */\nexport function selectBasePollIntervalMs({\n lastLaunchedAt,\n now\n}: {\n lastLaunchedAt: string | null;\n now: number;\n}): number {\n if (!lastLaunchedAt) return SLOW_POLL_INTERVAL_MS;\n const launchedMs = Date.parse(lastLaunchedAt);\n if (Number.isNaN(launchedMs)) return SLOW_POLL_INTERVAL_MS;\n return now - launchedMs <= IDLE_BACKOFF_MS ? FAST_POLL_INTERVAL_MS : SLOW_POLL_INTERVAL_MS;\n}\n\n/**\n * Add ~10% jitter so many local runners polling a shared backend do not wake in\n * lockstep. `random` is injectable for deterministic tests.\n */\nexport function applyPollJitter(intervalMs: number, random: () => number = Math.random): number {\n const spread = intervalMs * 0.1;\n return Math.round(intervalMs + (random() * 2 - 1) * spread);\n}\n\n// ---- Service invocation resolution -----------------------------------------\n\nexport interface RunnerServiceInvocation {\n program: string;\n args: string[];\n /**\n * True when `program` is the Electron/Overlord app binary and must be run as\n * Node (`ELECTRON_RUN_AS_NODE=1`) instead of booting the GUI. Recording the\n * Overlord binary also makes macOS register the background item, login item,\n * and automation prompt under \"Overlord\" rather than the plain `node`\n * binary's \"Node.js Foundation\" signature.\n */\n runAsElectronNode?: boolean;\n}\n\n/**\n * If the Overlord desktop app is installed, resolve an invocation that runs the\n * persistent service through the app's own bundled binary and CLI (as Node).\n * macOS attributes a LaunchAgent's background item / automation prompt to the\n * code-signing identity of `ProgramArguments[0]`; using the signed Overlord\n * binary registers the service under \"Overlord\" instead of \"Node.js Foundation\".\n * Both the binary and the app-bundled CLI script are used so the runtime and its\n * native modules match the app's Electron ABI. Returns null when the app is not\n * found (e.g. a CLI-only install with no desktop app present).\n */\nexport function resolveOverlordAppInvocation({\n platform = process.platform,\n homedir = os.homedir(),\n exists = existsSync\n}: {\n platform?: NodeJS.Platform;\n homedir?: string;\n exists?: (candidate: string) => boolean;\n} = {}): RunnerServiceInvocation | null {\n if (platform !== 'darwin') return null;\n const appDirs = [\n '/Applications/Overlord.app',\n path.join(homedir, 'Applications', 'Overlord.app')\n ];\n for (const appDir of appDirs) {\n const program = path.join(appDir, 'Contents', 'MacOS', 'Overlord');\n const script = path.join(appDir, 'Contents', 'Resources', 'cli', 'bin', 'ovld.mjs');\n if (exists(program) && exists(script)) {\n return { program, args: [script, 'runner', 'supervise'], runAsElectronNode: true };\n }\n }\n return null;\n}\n\n/**\n * Resolve how the installed service should invoke `ovld runner supervise`.\n * Prefer an explicit override (`OVLD_RUNNER_EXEC`, space-free path), otherwise\n * re-run the current CLI entrypoint under the same Node runtime. Persistent\n * services start with a sparse environment, so we always record an absolute\n * program path rather than relying on `PATH` resolution of a bare `ovld`.\n *\n * When the installer already runs under Electron-as-Node (the desktop app path),\n * `process.execPath` is the Overlord binary \u2014 keep using it. Otherwise, for a\n * plain terminal install, prefer the installed Overlord app binary when present\n * so the service registers under \"Overlord\" rather than \"Node.js Foundation\".\n */\nexport function resolveOvldInvocation(\n argv: string[] = process.argv,\n execPath: string = process.execPath\n): RunnerServiceInvocation {\n const override = process.env.OVLD_RUNNER_EXEC?.trim();\n if (override) {\n return { program: override, args: ['runner', 'supervise'] };\n }\n const scriptPath = argv[1] ? path.resolve(argv[1]) : '';\n if (process.env.ELECTRON_RUN_AS_NODE) {\n return scriptPath\n ? { program: execPath, args: [scriptPath, 'runner', 'supervise'], runAsElectronNode: true }\n : { program: execPath, args: ['runner', 'supervise'], runAsElectronNode: true };\n }\n const appInvocation = resolveOverlordAppInvocation();\n if (appInvocation) return appInvocation;\n if (scriptPath) {\n return { program: execPath, args: [scriptPath, 'runner', 'supervise'] };\n }\n return { program: execPath, args: ['runner', 'supervise'] };\n}\n\n/**\n * Describe which code-signing identity macOS will attribute the installed\n * service to, based on the recorded exec program. Terminal installs that predate\n * app-binary resolution still run the plain `node` binary and register under\n * \"Node.js Foundation\"; reinstalling from a machine with the desktop app present\n * re-registers them under \"Overlord\". A no-op on non-macOS hosts.\n */\nexport function describeServicePublisher({\n execProgram,\n platform = process.platform\n}: {\n execProgram: string | null;\n platform?: NodeJS.Platform;\n}): { publisher: 'overlord' | 'node' | 'unknown'; needsReinstallForOverlord: boolean } {\n if (platform !== 'darwin' || !execProgram) {\n return { publisher: 'unknown', needsReinstallForOverlord: false };\n }\n if (execProgram.includes('.app/Contents/MacOS/')) {\n return { publisher: 'overlord', needsReinstallForOverlord: false };\n }\n return { publisher: 'node', needsReinstallForOverlord: true };\n}\n\n/**\n * Environment snapshot injected into the service definition. Persistent services\n * do not source interactive shell startup files, so the backend URL, Overlord\n * home, and a minimal PATH must be captured explicitly at install time.\n */\nexport function buildRunnerServiceEnv({\n backendUrl,\n overlordHome,\n runAsElectronNode\n}: {\n backendUrl: string;\n overlordHome?: string | null;\n runAsElectronNode?: boolean;\n}): Record<string, string> {\n const env: Record<string, string> = {\n OVERLORD_BACKEND_URL: backendUrl,\n PATH: process.env.PATH?.trim() || '/usr/local/bin:/usr/bin:/bin'\n };\n const home = overlordHome?.trim() || process.env.OVLD_HOME?.trim();\n if (home) env.OVLD_HOME = path.resolve(home);\n const token = process.env.OVERLORD_USER_TOKEN?.trim() || process.env.OVLD_USER_TOKEN?.trim();\n if (token) env.OVERLORD_USER_TOKEN = token;\n // When the service program is the Overlord/Electron binary \u2014 either because the\n // install ran inside the desktop shell (Electron executing this script as Node)\n // or because a terminal install resolved the installed app binary \u2014 the unit\n // must carry this flag or launchd/systemd would boot GUI app instances on a\n // KeepAlive loop instead of the supervisor. It also makes macOS register the\n // background item and automation prompt under \"Overlord\" rather than \"Node\".\n if (runAsElectronNode || process.env.ELECTRON_RUN_AS_NODE) env.ELECTRON_RUN_AS_NODE = '1';\n return env;\n}\n\n// ---- Service file rendering (pure) -----------------------------------------\n\nfunction xmlEscape(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nexport function renderLaunchdPlist({\n label,\n invocation,\n env,\n logDir\n}: {\n label: string;\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n logDir: string;\n}): string {\n const programArgs = [invocation.program, ...invocation.args]\n .map(arg => ` <string>${xmlEscape(arg)}</string>`)\n .join('\\n');\n const envEntries = Object.entries(env)\n .map(\n ([key, value]) => ` <key>${xmlEscape(key)}</key>\\n <string>${xmlEscape(value)}</string>`\n )\n .join('\\n');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${xmlEscape(label)}</string>\n <key>ProgramArguments</key>\n <array>\n${programArgs}\n </array>\n <key>EnvironmentVariables</key>\n <dict>\n${envEntries}\n </dict>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${xmlEscape(path.join(logDir, 'runner-service.out.log'))}</string>\n <key>StandardErrorPath</key>\n <string>${xmlEscape(path.join(logDir, 'runner-service.err.log'))}</string>\n <key>ProcessType</key>\n <string>Background</string>\n</dict>\n</plist>\n`;\n}\n\nexport function renderSystemdUnit({\n invocation,\n env\n}: {\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n}): string {\n // systemd ExecStart requires an absolute program; arguments are space-joined.\n // None of our arguments contain spaces (resolved script path aside, which we\n // quote defensively).\n const quote = (value: string): string => (/\\s/.test(value) ? `\"${value}\"` : value);\n const execStart = [invocation.program, ...invocation.args].map(quote).join(' ');\n const envLines = Object.entries(env)\n .map(([key, value]) => `Environment=${key}=${value}`)\n .join('\\n');\n return `[Unit]\nDescription=Overlord persistent runner supervisor\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nExecStart=${execStart}\n${envLines}\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=default.target\n`;\n}\n\n// ---- Service manager abstraction -------------------------------------------\n\nexport interface RunnerServiceRunState {\n installed: boolean;\n running: 'running' | 'stopped' | 'unknown';\n}\n\nexport interface RunnerServiceManager {\n kind: RunnerServiceKind;\n identifier: string;\n unitPath(): string;\n render(opts: { invocation: RunnerServiceInvocation; env: Record<string, string> }): string;\n install(opts: {\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n autoStart: boolean;\n }): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n restart(): Promise<void>;\n uninstall(): Promise<void>;\n status(): Promise<RunnerServiceRunState>;\n}\n\nfunction launchAgentsDir(): string {\n return path.join(os.homedir(), 'Library', 'LaunchAgents');\n}\n\nfunction systemdUserDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME?.trim();\n const base = xdg ? path.resolve(xdg) : path.join(os.homedir(), '.config');\n return path.join(base, 'systemd', 'user');\n}\n\nasync function runCommand(program: string, args: string[]): Promise<{ stdout: string }> {\n const { stdout } = await execFileAsync(program, args);\n return { stdout: stdout.toString() };\n}\n\nclass LaunchdManager implements RunnerServiceManager {\n readonly kind = 'launchd' as const;\n readonly identifier = LAUNCHD_LABEL;\n\n unitPath(): string {\n return path.join(launchAgentsDir(), `${LAUNCHD_LABEL}.plist`);\n }\n\n render(opts: { invocation: RunnerServiceInvocation; env: Record<string, string> }): string {\n return renderLaunchdPlist({\n label: LAUNCHD_LABEL,\n invocation: opts.invocation,\n env: opts.env,\n logDir: path.join(resolveGlobalDataDir(), 'logs')\n });\n }\n\n async install(opts: {\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n autoStart: boolean;\n }): Promise<void> {\n mkdirSync(launchAgentsDir(), { recursive: true });\n mkdirSync(path.join(resolveGlobalDataDir(), 'logs'), { recursive: true });\n writeServiceFile(this.unitPath(), this.render(opts));\n if (opts.autoStart) await this.start();\n }\n\n async start(): Promise<void> {\n // `load -w` is idempotent and enables the agent; ignore an already-loaded error.\n try {\n await runCommand('launchctl', ['load', '-w', this.unitPath()]);\n } catch {\n await runCommand('launchctl', [\n 'kickstart',\n '-k',\n `gui/${process.getuid?.() ?? ''}/${LAUNCHD_LABEL}`\n ]);\n }\n }\n\n async stop(): Promise<void> {\n await runCommand('launchctl', ['unload', '-w', this.unitPath()]);\n }\n\n async restart(): Promise<void> {\n try {\n await this.stop();\n } catch {\n // May not be loaded yet; proceed to start.\n }\n await this.start();\n }\n\n async uninstall(): Promise<void> {\n try {\n await this.stop();\n } catch {\n // Not loaded; still remove the plist below.\n }\n if (existsSync(this.unitPath())) rmSync(this.unitPath());\n }\n\n async status(): Promise<RunnerServiceRunState> {\n const installed = existsSync(this.unitPath());\n try {\n const { stdout } = await runCommand('launchctl', ['list']);\n const line = stdout.split('\\n').find(row => row.includes(LAUNCHD_LABEL));\n if (!line) return { installed, running: installed ? 'stopped' : 'unknown' };\n // launchctl list columns: PID Status Label. A numeric PID => running.\n const pid = line.trim().split(/\\s+/)[0];\n return { installed, running: pid && pid !== '-' ? 'running' : 'stopped' };\n } catch {\n return { installed, running: 'unknown' };\n }\n }\n}\n\nclass SystemdUserManager implements RunnerServiceManager {\n readonly kind = 'systemd' as const;\n readonly identifier = `${SYSTEMD_UNIT_NAME}.service`;\n\n unitPath(): string {\n return path.join(systemdUserDir(), `${SYSTEMD_UNIT_NAME}.service`);\n }\n\n render(opts: { invocation: RunnerServiceInvocation; env: Record<string, string> }): string {\n return renderSystemdUnit(opts);\n }\n\n async install(opts: {\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n autoStart: boolean;\n }): Promise<void> {\n mkdirSync(systemdUserDir(), { recursive: true });\n writeServiceFile(this.unitPath(), this.render(opts));\n await runCommand('systemctl', ['--user', 'daemon-reload']);\n await runCommand('systemctl', ['--user', 'enable', this.identifier]);\n if (opts.autoStart) await this.start();\n }\n\n async start(): Promise<void> {\n await runCommand('systemctl', ['--user', 'start', this.identifier]);\n }\n\n async stop(): Promise<void> {\n await runCommand('systemctl', ['--user', 'stop', this.identifier]);\n }\n\n async restart(): Promise<void> {\n await runCommand('systemctl', ['--user', 'restart', this.identifier]);\n }\n\n async uninstall(): Promise<void> {\n try {\n await this.stop();\n await runCommand('systemctl', ['--user', 'disable', this.identifier]);\n } catch {\n // Unit may not be active/enabled; still remove the file below.\n }\n if (existsSync(this.unitPath())) rmSync(this.unitPath());\n try {\n await runCommand('systemctl', ['--user', 'daemon-reload']);\n } catch {\n // Best effort.\n }\n }\n\n async status(): Promise<RunnerServiceRunState> {\n const installed = existsSync(this.unitPath());\n try {\n const { stdout } = await runCommand('systemctl', ['--user', 'is-active', this.identifier]);\n return { installed, running: stdout.trim() === 'active' ? 'running' : 'stopped' };\n } catch {\n // `is-active` exits non-zero when inactive/failed.\n return { installed, running: installed ? 'stopped' : 'unknown' };\n }\n }\n}\n\n/**\n * Resolve the host service manager for the current platform. Windows is not yet\n * supported (Task Scheduler is a documented follow-up), so it returns null.\n */\nexport function resolveServiceManager(\n platform: NodeJS.Platform = process.platform\n): RunnerServiceManager | null {\n if (platform === 'darwin') return new LaunchdManager();\n if (platform === 'linux') return new SystemdUserManager();\n return null;\n}\n", "import { createInterface } from 'node:readline';\n\nexport interface SelectableProject {\n id: string;\n name: string;\n slug: string;\n}\n\n/**\n * Parse a 1-based numbered selection against a list of `count` items. Returns the\n * 0-based index when the answer is a whole number inside `1..count`, otherwise\n * `null` (empty input, non-numeric text, or out-of-range numbers).\n */\nexport function parseNumberedSelection(answer: string, count: number): number | null {\n const trimmed = answer.trim();\n if (!/^\\d+$/.test(trimmed)) return null;\n const value = Number.parseInt(trimmed, 10);\n if (!Number.isInteger(value) || value < 1 || value > count) return null;\n return value - 1;\n}\n\n/**\n * Build the lines shown when prompting the user to pick a project. Kept pure so\n * the rendering is unit-testable without a TTY.\n */\nexport function renderProjectSelection(\n projects: SelectableProject[],\n directoryPath: string\n): string[] {\n const lines = [`Current directory:`, ` ${directoryPath}`, ``, `Projects:`];\n projects.forEach((project, index) => {\n lines.push(` ${index + 1}. ${project.name} (${project.slug})`);\n });\n return lines;\n}\n\nexport interface PromptForProjectOptions {\n projects: SelectableProject[];\n directoryPath: string;\n input?: NodeJS.ReadStream;\n output?: NodeJS.WriteStream;\n}\n\n/**\n * Interactively prompt the user to choose a project to link the directory with.\n * Lists the projects, reads a 1-based selection, and re-prompts on invalid input.\n * Resolves to the chosen project, or `null` if the user cancels with `q`.\n */\nexport function promptForProject({\n projects,\n directoryPath,\n input = process.stdin,\n output = process.stdout\n}: PromptForProjectOptions): Promise<SelectableProject | null> {\n if (projects.length === 0) {\n return Promise.reject(\n new Error('No projects available. Create one with `ovld create-project`.')\n );\n }\n\n const rl = createInterface({ input, output });\n const ask = (question: string): Promise<string> =>\n new Promise(resolve => rl.question(question, resolve));\n\n const run = async (): Promise<SelectableProject | null> => {\n while (true) {\n output.write(`\\n${renderProjectSelection(projects, directoryPath).join('\\n')}\\n`);\n const answer = await ask(\n `\\nSelect a project to link this directory with (1-${projects.length}, or 'q' to cancel): `\n );\n if (answer.trim().toLowerCase() === 'q') return null;\n const index = parseNumberedSelection(answer, projects.length);\n if (index !== null) return projects[index] ?? null;\n output.write(`Enter a number between 1 and ${projects.length}.\\n`);\n }\n };\n\n return run().finally(() => rl.close());\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\n\n// Client-side cache of the protocol session key returned by `attach`. Every Bash\n// tool call is a fresh shell, so a key captured at attach is otherwise gone by the\n// next `ovld protocol` command unless the agent threads it through manually. The\n// cache is scoped strictly to (resolve(workingDirectory), missionId) \u2014 the same\n// keying `native-session.ts` uses for `externalSessionId` \u2014 so a key can never\n// leak across working directories or missions.\n\nfunction sessionKeyCachePath({\n missionId,\n workingDirectory\n}: {\n missionId: string;\n workingDirectory: string;\n}): string {\n const key = createHash('sha256')\n .update(`${path.resolve(workingDirectory)}\\0${missionId}`)\n .digest('hex');\n return path.join(resolveGlobalDataDir(), 'protocol-session-keys', key);\n}\n\n/** Cached session key for this (workingDir, mission), or undefined when absent. */\nexport function readCachedSessionKey({\n missionId,\n workingDirectory\n}: {\n missionId: string;\n workingDirectory: string;\n}): string | undefined {\n try {\n const filePath = sessionKeyCachePath({ missionId, workingDirectory });\n if (!existsSync(filePath)) return undefined;\n const raw = JSON.parse(readFileSync(filePath, 'utf8')) as { sessionKey?: unknown };\n return typeof raw.sessionKey === 'string' && raw.sessionKey.trim()\n ? raw.sessionKey.trim()\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Persist the session key returned by attach/resume-follow-up for later reuse. */\nexport function writeCachedSessionKey({\n missionId,\n workingDirectory,\n sessionKey\n}: {\n missionId: string;\n workingDirectory: string;\n sessionKey: string;\n}): void {\n try {\n const trimmed = sessionKey.trim();\n if (!trimmed) return;\n const filePath = sessionKeyCachePath({ missionId, workingDirectory });\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(\n filePath,\n JSON.stringify({ sessionKey: trimmed, updatedAt: new Date().toISOString() }),\n { mode: 0o600 }\n );\n } catch {\n // Best-effort: a failed write just means the agent must pass --session-key\n // explicitly, the same as before this cache existed.\n }\n}\n\n/** Drop the cached key once the session ends so a stale key can't be reused. */\nexport function clearCachedSessionKey({\n missionId,\n workingDirectory\n}: {\n missionId: string;\n workingDirectory: string;\n}): void {\n try {\n const filePath = sessionKeyCachePath({ missionId, workingDirectory });\n if (existsSync(filePath)) rmSync(filePath);\n } catch {\n // Best-effort: a stale key at worst fails a downstream call with an invalid\n // session error, which the agent already handles by re-attaching.\n }\n}\n", "import {\n readProjectJsonLink,\n writeProjectJson\n} from '@overlord/core/service/local-target/project-metadata';\nimport {\n executeLocalTargetMutation,\n parseMutationFromMetadata\n} from '@overlord/core/service/local-target-mutation-runner';\nimport { existsSync, readFileSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport {\n flagBoolean,\n flagValue,\n parseArgs,\n rejectOversizedInlineJson,\n requireFlag\n} from './args.js';\nimport { type BranchAutomationPayload, prepareMissionBranch } from './branch-preparation.js';\nimport { isLoopbackBackendUrl, loadConfig, resolveBackendUrl } from './config.js';\nimport { clientDeviceIdentity } from './device-identity.js';\nimport {\n discoverProjectOnClient,\n resolvePreferredExecutionTargetId\n} from './discover-project-local.js';\nimport { CliError } from './errors.js';\nimport { launchAgent } from './launch.js';\nimport { resolveNativeSessionId } from './native-session.js';\nimport { runOrgSetupCommand } from './org-setup.js';\nimport { printJson, printKeyValue } from './output.js';\nimport { pruneStaleProjectTmp } from './project-tmp.js';\nimport { printProtocolHelp } from './protocol-help.js';\nimport { recordTouchedFromPayload } from './record-touched.js';\nimport { reportRunnerResourceObservations } from './resource-observations.js';\nimport {\n applyPollJitter,\n buildRunnerServiceEnv,\n describeServicePublisher,\n patchRunnerServiceState,\n readRunnerServiceState,\n resolveOvldInvocation,\n resolveServiceManager,\n selectBasePollIntervalMs,\n writeRunnerServiceState\n} from './runner-service.js';\nimport type { CliRuntime } from './runtime.js';\nimport { promptForProject } from './select-prompt.js';\nimport {\n clearCachedSessionKey,\n readCachedSessionKey,\n writeCachedSessionKey\n} from './session-key.js';\nimport type { TerminalLaunchSettings } from './terminal-launcher.js';\nimport { fetchTerminalProfile, terminalProfileToLaunchSettings } from './terminal-profile.js';\nimport {\n computeRunDelta,\n draftChangeRationalesFromNotes,\n filterRunAttributableChanges,\n hasTouchedFilesLog,\n readChangedFiles,\n resetRationaleNotes,\n resetTouchedFiles,\n writeBaseline\n} from './vcs.js';\nimport { removeActiveSession, writeActiveSession } from './vcs-sessions.js';\n\ntype ChangedFileEntry = {\n filePath: string;\n vcsStatus?: string | null;\n attribution?: 'mine' | 'claimed' | 'unclaimed';\n claimedByMissionIds?: string[];\n};\ntype ChangeRationaleEntry = {\n file_path?: string;\n filePath?: string;\n label?: string;\n summary?: string;\n why?: string;\n impact?: string;\n [key: string]: unknown;\n};\ntype SkipRationaleEntry = {\n file_path?: string;\n filePath?: string;\n reason?: string;\n [key: string]: unknown;\n};\n\nfunction writeProjectJsonFromResource({\n directory,\n projectId,\n resource\n}: {\n directory: string;\n projectId: string;\n resource: unknown;\n}): void {\n const record = asRecord(resource);\n if (typeof record.id !== 'string') return;\n writeProjectJson({\n directoryPath: directory,\n projectId,\n resourceId: record.id,\n resourceKey: typeof record.resourceKey === 'string' ? record.resourceKey : undefined,\n executionTargetId:\n typeof record.executionTargetId === 'string' ? record.executionTargetId : undefined,\n isPrimary: record.isPrimary !== false\n });\n}\n\n/** Parse an inline `--changed-files-json` value into entries (best-effort). */\nfunction parseChangedFilesJson(value: unknown): ChangedFileEntry[] {\n if (typeof value !== 'string' || value.trim() === '') return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (entry): entry is ChangedFileEntry =>\n typeof entry === 'object' &&\n entry !== null &&\n typeof (entry as ChangedFileEntry).filePath === 'string'\n );\n } catch {\n return [];\n }\n}\n\n/** Read `--changed-files-json` or `--changed-files-file` entries (best-effort). */\nfunction readChangedFilesFromFlags(\n flags: Record<string, string | true>,\n stdin?: string\n): ChangedFileEntry[] {\n const fileFlag = flags['--changed-files-file'];\n if (typeof fileFlag === 'string') {\n const raw =\n fileFlag === '-'\n ? (stdin ?? '')\n : (() => {\n try {\n return readFileSync(fileFlag, 'utf8');\n } catch {\n return '';\n }\n })();\n return parseChangedFilesJson(raw);\n }\n return parseChangedFilesJson(flags['--changed-files-json']);\n}\n\nfunction writeFilteredChangedFilesToFlags({\n flags,\n files\n}: {\n flags: Record<string, string | true>;\n files: ChangedFileEntry[];\n}): void {\n delete flags['--changed-files-file'];\n if (files.length === 0) {\n delete flags['--changed-files-json'];\n return;\n }\n flags['--changed-files-json'] = JSON.stringify(files);\n}\n\nfunction writeSkipRationaleForToFlags({\n flags,\n fileInputs,\n entries\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n entries: SkipRationaleEntry[];\n}): void {\n if (typeof flags['--skip-rationale-for-file'] === 'string') {\n fileInputs['--skip-rationale-for-file'] = JSON.stringify(entries, null, 2);\n delete flags['--skip-rationale-for-json'];\n return;\n }\n flags['--skip-rationale-for-json'] = JSON.stringify(entries);\n delete flags['--skip-rationale-for-file'];\n}\n\nfunction parseJsonArray(value: unknown): unknown[] {\n if (typeof value !== 'string' || value.trim() === '') return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction readJsonFlagContent({\n flags,\n fileInputs,\n jsonFlag,\n fileFlag\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n jsonFlag: string;\n fileFlag: string;\n}): string | undefined {\n const filePath = flags[fileFlag];\n if (typeof filePath === 'string') {\n if (fileInputs[fileFlag] !== undefined) return fileInputs[fileFlag];\n try {\n return readFileSync(filePath, 'utf8');\n } catch {\n return undefined;\n }\n }\n return typeof flags[jsonFlag] === 'string' ? flags[jsonFlag] : undefined;\n}\n\nfunction readChangeRationalesFromFlags({\n flags,\n fileInputs\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n}): ChangeRationaleEntry[] {\n const direct = parseJsonArray(\n readJsonFlagContent({\n flags,\n fileInputs,\n jsonFlag: '--change-rationales-json',\n fileFlag: '--change-rationales-file'\n })\n ).filter((entry): entry is ChangeRationaleEntry => typeof entry === 'object' && entry !== null);\n\n const payloadRaw = readJsonFlagContent({\n flags,\n fileInputs,\n jsonFlag: '--payload-json',\n fileFlag: '--payload-file'\n });\n let payloadRationales: ChangeRationaleEntry[] = [];\n if (payloadRaw) {\n try {\n const payload = JSON.parse(payloadRaw) as { changeRationales?: unknown };\n payloadRationales = Array.isArray(payload.changeRationales)\n ? payload.changeRationales.filter(\n (entry): entry is ChangeRationaleEntry => typeof entry === 'object' && entry !== null\n )\n : [];\n } catch {\n payloadRationales = [];\n }\n }\n\n return [...payloadRationales, ...direct];\n}\n\nfunction rationalePath(rationale: ChangeRationaleEntry): string {\n return (rationale.file_path ?? rationale.filePath ?? '').replace(/\\\\/g, '/').trim();\n}\n\nfunction readSkipRationaleForFromFlags({\n flags,\n fileInputs\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n}): SkipRationaleEntry[] {\n return parseJsonArray(\n readJsonFlagContent({\n flags,\n fileInputs,\n jsonFlag: '--skip-rationale-for-json',\n fileFlag: '--skip-rationale-for-file'\n })\n ).filter((entry): entry is SkipRationaleEntry => typeof entry === 'object' && entry !== null);\n}\n\nfunction skipRationalePath(entry: SkipRationaleEntry): string {\n return (entry.file_path ?? entry.filePath ?? '').replace(/\\\\/g, '/').trim();\n}\n\n/**\n * Filter protocol changed-file payloads so only run-attributable paths (not in\n * the session baseline) are sent. At deliver, merge explicit payloads with the\n * VCS delta so a partial explicit list does not suppress mechanically observed\n * files.\n */\nfunction applySessionChangedFiles({\n flags,\n workingDirectory,\n missionId,\n subcommand,\n stdin,\n fileInputs = {}\n}: {\n flags: Record<string, string | true>;\n workingDirectory: string;\n missionId: string;\n subcommand: string;\n stdin?: string;\n fileInputs?: Record<string, string>;\n}): void {\n const noFileChanges =\n subcommand === 'deliver' &&\n (flags['--no-file-changes'] === true || flags['--no-file-changes'] === 'true');\n const delta = computeRunDelta({ workingDirectory, missionId });\n\n // Full current dirty tree (not just the run-attributable delta), sent so the\n // server can reconcile changed_files rows that are no longer dirty to\n // 'resolved' \u2014 un-poisoning coverage from a past over-attribution. Sent even\n // for --no-file-changes so a leftover stale row still gets cleared.\n if (subcommand === 'deliver') {\n flags['--observed-dirty-paths-json'] = JSON.stringify(\n readChangedFiles(workingDirectory).map(entry => entry.filePath)\n );\n }\n\n if (noFileChanges) {\n if (delta.length > 0) {\n console.error(\n `[overlord] --no-file-changes was set, but VCS shows ${delta.length} changed file(s) for this run: ${delta\n .map(entry => entry.filePath)\n .join(', ')}`\n );\n }\n delete flags['--changed-files-json'];\n delete flags['--changed-files-file'];\n return;\n }\n\n const hasExplicitPayload = '--changed-files-json' in flags || '--changed-files-file' in flags;\n if (subcommand === 'update' && !hasExplicitPayload) return;\n\n const explicit = readChangedFilesFromFlags(flags, stdin);\n const merged =\n subcommand === 'deliver'\n ? [...explicit, ...delta].filter(\n (entry, index, all) => all.findIndex(item => item.filePath === entry.filePath) === index\n )\n : explicit;\n const classified = filterRunAttributableChanges({\n workingDirectory,\n missionId,\n files: merged.map(entry => ({\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus ?? 'changed'\n }))\n });\n\n const claimedElsewhere = classified.filter(entry => entry.attribution === 'claimed');\n const unclaimedFlagged = classified.filter(entry => entry.attribution === 'unclaimed');\n\n if (subcommand === 'deliver' && claimedElsewhere.length > 0) {\n console.error(\n `[overlord] excluded ${claimedElsewhere.length} changed file(s) claimed by concurrent mission logs: ` +\n `${claimedElsewhere\n .map(entry =>\n entry.claimedByMissionIds?.length\n ? `${entry.filePath} (${entry.claimedByMissionIds.join(', ')})`\n : entry.filePath\n )\n .join(', ')}`\n );\n }\n\n if (subcommand === 'deliver' && unclaimedFlagged.length > 0) {\n console.error(\n `[overlord] ${unclaimedFlagged.length} changed file(s) are not claimed by any edit-tracking log ` +\n `and are included for completeness \u2014 please confirm or --skip-rationale-for- them: ` +\n `${unclaimedFlagged.map(entry => entry.filePath).join(', ')}`\n );\n }\n\n // Attribution/claimedByMissionIds ride along to the backend (never persisted)\n // so a residual missing_rationale error can classify each path without the\n // server re-deriving touched-log state it has no access to.\n const attributable = classified\n .filter(entry => entry.attribution !== 'claimed')\n .map(entry => ({\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n ...(entry.attribution ? { attribution: entry.attribution } : {}),\n ...(entry.claimedByMissionIds?.length\n ? { claimedByMissionIds: entry.claimedByMissionIds }\n : {})\n }));\n\n const skipEntries =\n subcommand === 'deliver' ? readSkipRationaleForFromFlags({ flags, fileInputs }) : [];\n const rationalePaths =\n subcommand === 'deliver'\n ? new Set(\n readChangeRationalesFromFlags({ flags, fileInputs }).map(rationalePath).filter(Boolean)\n )\n : new Set<string>();\n const skipByPath = new Map<string, SkipRationaleEntry>();\n if (subcommand === 'deliver') {\n for (const entry of skipEntries) {\n const filePath = skipRationalePath(entry);\n if (!filePath) continue;\n skipByPath.set(filePath, entry);\n }\n }\n if (subcommand === 'deliver') {\n for (const entry of claimedElsewhere) {\n const filePath = entry.filePath;\n if (rationalePaths.has(filePath)) continue;\n if (skipByPath.has(filePath)) continue;\n const missionLabel =\n entry.claimedByMissionIds && entry.claimedByMissionIds.length > 0\n ? entry.claimedByMissionIds.join(', ')\n : 'another active mission';\n skipByPath.set(filePath, {\n file_path: filePath,\n reason: `Changed by concurrent mission ${missionLabel}; excluded from this delivery report.`\n });\n }\n if (skipByPath.size > 0) {\n writeSkipRationaleForToFlags({\n flags,\n fileInputs,\n entries: Array.from(skipByPath.values())\n });\n }\n }\n\n const skipPaths =\n subcommand === 'deliver'\n ? new Set(Array.from(skipByPath.keys()).filter(Boolean))\n : new Set<string>();\n const filtered =\n skipPaths.size > 0\n ? attributable.filter(entry => !skipPaths.has(entry.filePath))\n : attributable;\n\n writeFilteredChangedFilesToFlags({ flags, files: filtered });\n}\n\nfunction applyDraftChangeRationales({\n flags,\n fileInputs,\n workingDirectory,\n missionId\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n workingDirectory: string;\n missionId: string;\n}): void {\n const changedFiles = readChangedFilesFromFlags(flags, fileInputs['--changed-files-file']).map(\n entry => ({\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus ?? 'changed'\n })\n );\n if (changedFiles.length === 0) return;\n\n const explicitRationales = readChangeRationalesFromFlags({ flags, fileInputs });\n const covered = new Set(explicitRationales.map(rationalePath).filter(Boolean));\n const drafts = draftChangeRationalesFromNotes({\n workingDirectory,\n missionId,\n files: changedFiles\n }).filter(draft => !covered.has(draft.file_path));\n if (drafts.length === 0) return;\n\n const merged = [...explicitRationales, ...drafts];\n if (typeof flags['--change-rationales-file'] === 'string') {\n fileInputs['--change-rationales-file'] = JSON.stringify(merged, null, 2);\n } else {\n flags['--change-rationales-json'] = JSON.stringify(merged);\n }\n\n console.error(\n `[overlord] prefilled ${drafts.length} draft change rationale(s) from local edit notes.`\n );\n}\n\ntype JsonRecord = Record<string, unknown>;\n\ntype LaunchSettingsShape = {\n worktreeBranchAutomationEnabled?: unknown;\n};\n\nfunction repeatedFlagValues(args: string[], name: string): string[] {\n const values: string[] = [];\n for (let index = 0; index < args.length; index += 1) {\n if (args[index] !== name) continue;\n const value = args[index + 1];\n if (value !== undefined) {\n values.push(value);\n index += 1;\n }\n }\n return values;\n}\n\nasync function resolveTerminalLaunchSettings({\n runtime,\n flags\n}: {\n runtime: CliRuntime;\n flags: Map<string, string | true>;\n}): Promise<TerminalLaunchSettings> {\n if (flagBoolean(flags, '--no-terminal')) {\n return { terminalLauncher: null };\n }\n\n const override = flagValue(flags, '--terminal');\n if (override) {\n try {\n const profile = await fetchTerminalProfile({ backend: runtime.backend });\n return {\n terminalLauncher: override,\n terminalLaunchPlacement: profile.placement,\n terminalLaunchChord: profile.chord\n };\n } catch {\n return { terminalLauncher: override };\n }\n }\n\n try {\n const profile = await fetchTerminalProfile({ backend: runtime.backend });\n return terminalProfileToLaunchSettings(profile);\n } catch {\n return { terminalLauncher: null };\n }\n}\n\nfunction asRecord(value: unknown): JsonRecord {\n return value && typeof value === 'object' ? (value as JsonRecord) : {};\n}\n\nasync function readWorktreeBranchAutomationEnabled(runtime: CliRuntime): Promise<boolean> {\n try {\n const settings = await runtime.backend.get<LaunchSettingsShape>('/api/launch-settings');\n return settings.worktreeBranchAutomationEnabled === true;\n } catch {\n return false;\n }\n}\n\nasync function recordBranchPrepared({\n runtime,\n missionId,\n requestId,\n branchAutomation\n}: {\n runtime: CliRuntime;\n missionId: string;\n requestId?: string | null;\n branchAutomation: BranchAutomationPayload | null;\n}): Promise<void> {\n if (!branchAutomation) return;\n await runtime.backend.post({\n path: `/api/missions/${encodeURIComponent(missionId)}/branch-prepared`,\n body: { requestId: requestId ?? null, branchAutomation }\n });\n}\n\nfunction firstObjectiveId(mission: unknown): string | undefined {\n const objectives = asRecord(mission).objectives;\n if (!Array.isArray(objectives)) return undefined;\n const first = objectives[0];\n const id = asRecord(first).id;\n return typeof id === 'string' ? id : undefined;\n}\n\n/** Prefer the objective that would be launched next (matches server launchable states). */\nfunction launchableObjectiveId(mission: unknown): string | undefined {\n const objectives = asRecord(mission).objectives;\n if (!Array.isArray(objectives)) return undefined;\n const launchableStates = ['executing', 'submitted', 'launching', 'draft'];\n for (const state of launchableStates) {\n const match = objectives.find(objective => asRecord(objective).state === state);\n const id = asRecord(match).id;\n if (typeof id === 'string') return id;\n }\n return firstObjectiveId(mission);\n}\n\n/** The agent already assigned to an objective on a fetched mission payload, if any. */\nfunction objectiveAssignedAgent(mission: unknown, objectiveId: string): string | undefined {\n const objectives = asRecord(mission).objectives;\n if (!Array.isArray(objectives)) return undefined;\n const match = objectives.find(objective => asRecord(objective).id === objectiveId);\n const agent = asRecord(match).assignedAgent;\n return typeof agent === 'string' && agent.trim() ? agent.trim() : undefined;\n}\n\nfunction missionDisplayId(mission: unknown): string {\n const record = asRecord(mission);\n return typeof record.displayId === 'string'\n ? record.displayId\n : typeof record.id === 'string'\n ? record.id\n : 'unknown';\n}\n\nconst PROTOCOL_FILE_FLAGS = [\n '--summary-file',\n '--question-file',\n '--payload-file',\n '--artifacts-file',\n '--change-rationales-file',\n '--skip-rationale-for-file',\n '--objectives-file',\n '--changed-files-file',\n '--value-file',\n '--prompt-file'\n] as const;\n\n/** Protocol subcommands that require a session key the cache can auto-inject. */\nconst SESSION_KEY_SUBCOMMANDS = new Set([\n 'update',\n 'heartbeat',\n 'ask',\n 'deliver',\n 'record-change-rationales'\n]);\n\n/**\n * Resolve EACH `--*-file` flag independently into a `fileInputs` map so multiple\n * file payloads in one invocation no longer collide on a single `stdin` field.\n * At most one flag may use literal `-` (true stdin); real file paths are unlimited.\n * The single `-` payload is also returned as `stdin` so the backend keeps honoring\n * `body.stdin` for backward compatibility.\n */\nexport async function resolveProtocolFileInputs({\n flags,\n stdin\n}: {\n flags: Map<string, string | true>;\n stdin?: string;\n}): Promise<{ fileInputs: Record<string, string>; stdin?: string }> {\n const stdinFlags = PROTOCOL_FILE_FLAGS.filter(name => flagValue(flags, name) === '-');\n if (stdinFlags.length > 1) {\n throw new CliError({\n message:\n `Only one --*-file flag may read from stdin ('-') at a time, but received: ` +\n `${stdinFlags.join(', ')}. Pipe a single payload on stdin and pass the others ` +\n `as inline values or real file paths.`\n });\n }\n\n let stdinContent: string | undefined;\n const readStdinOnce = (): string => {\n if (stdinContent !== undefined) return stdinContent;\n if (stdin !== undefined) {\n stdinContent = stdin;\n } else if (process.stdin.isTTY) {\n stdinContent = '';\n } else {\n stdinContent = readFileSync(0, 'utf8');\n }\n return stdinContent;\n };\n\n const fileInputs: Record<string, string> = {};\n let stdinPayload: string | undefined;\n\n for (const flagName of PROTOCOL_FILE_FLAGS) {\n const filePath = flagValue(flags, flagName);\n if (!filePath) continue;\n if (filePath === '-') {\n const content = readStdinOnce();\n fileInputs[flagName] = content;\n stdinPayload = content;\n } else {\n fileInputs[flagName] = readFileSync(filePath, 'utf8');\n }\n }\n\n // No file flags but a piped/explicit stdin was supplied: preserve it as the\n // single backward-compatible payload (legacy behavior).\n if (stdinPayload === undefined && stdin !== undefined && Object.keys(fileInputs).length === 0) {\n stdinPayload = stdin;\n }\n\n return { fileInputs, stdin: stdinPayload };\n}\n\nasync function discoverProjectId(runtime: CliRuntime, explicit?: string): Promise<string> {\n if (explicit) return explicit;\n const projects = await runtime.backend.get<unknown[]>('/api/projects');\n const first = projects[0];\n const id = asRecord(first).id;\n if (typeof id !== 'string') {\n throw new CliError({ message: 'No project found. Create one with `ovld create-project`.' });\n }\n return id;\n}\n\nexport async function runProtocolCommand({\n runtime,\n subcommand,\n args,\n stdin,\n primaryCommand = 'ovld'\n}: {\n runtime: CliRuntime;\n subcommand: string;\n args: string[];\n stdin?: string;\n primaryCommand?: string;\n}): Promise<void> {\n const parsed = parseArgs(args);\n if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {\n printProtocolHelp({ primaryCommand });\n return;\n }\n\n rejectOversizedInlineJson({ flags: parsed.flags });\n\n const workingDirectory = process.cwd();\n const missionId = flagValue(parsed.flags, '--mission-id') ?? parsed.positional[0];\n const flags = Object.fromEntries(parsed.flags);\n if (\n subcommand === 'attach' &&\n typeof flags['--execution-request-id'] !== 'string' &&\n process.env.OVERLORD_EXECUTION_REQUEST_ID\n ) {\n flags['--execution-request-id'] = process.env.OVERLORD_EXECUTION_REQUEST_ID;\n }\n const { fileInputs, stdin: protocolStdin } = await resolveProtocolFileInputs({\n flags: parsed.flags,\n stdin\n });\n\n // Local-only: append this hook invocation's edited files to the resolved\n // mission's touched-files log. No backend call \u2014 an adapter's edit hook pipes\n // its native hook JSON on stdin and gets the same bookkeeping cli/src/vcs.ts\n // already does for the Claude hook, without needing MISSION_ID in env.\n if (subcommand === 'record-touched') {\n const missionOverride =\n flagValue(parsed.flags, '--mission-id') ??\n process.env.MISSION_ID ??\n process.env.OVERLORD_MISSION_ID;\n // The hook payload arrives as raw piped stdin, not a --*-file flag, so read\n // fd 0 directly rather than going through resolveProtocolFileInputs (which\n // only reads stdin when a --*-file flag is literally '-').\n const rawPayload = stdin ?? (process.stdin.isTTY ? '' : readFileSync(0, 'utf8'));\n const result = recordTouchedFromPayload({\n rawPayload,\n missionOverride,\n fallbackCwd: workingDirectory\n });\n printJson(result);\n return;\n }\n\n // Local-only preflight: classify every currently dirty path (mine/claimed/\n // unclaimed) exactly the way deliver will, plus draft rationales from local\n // edit notes. No backend call \u2014 this replaces hand-triaging `git status`\n // before delivering with one read-only, ready-to-use report.\n if (subcommand === 'changes') {\n if (!missionId) {\n throw new CliError({ message: 'Usage: ovld protocol changes --mission-id <id>' });\n }\n const classified = filterRunAttributableChanges({\n workingDirectory,\n missionId,\n files: readChangedFiles(workingDirectory)\n });\n const mine = classified.filter(\n entry => entry.attribution === 'mine' || entry.attribution === undefined\n );\n const claimed = classified.filter(entry => entry.attribution === 'claimed');\n const unclaimed = classified.filter(entry => entry.attribution === 'unclaimed');\n const draftRationales = draftChangeRationalesFromNotes({\n workingDirectory,\n missionId,\n files: [...mine, ...unclaimed]\n });\n const suggestedSkipRationaleFor = claimed.map(entry => ({\n file_path: entry.filePath,\n reason: `Changed by concurrent mission ${\n entry.claimedByMissionIds?.length\n ? entry.claimedByMissionIds.join(', ')\n : 'another active mission'\n }; excluded from this delivery report.`\n }));\n printJson({ mine, claimed, unclaimed, draftRationales, suggestedSkipRationaleFor });\n return;\n }\n\n // Session-key cache: when a command that needs a session key is missing the\n // flag, fall back to the key cached at attach for this (workingDir, mission).\n // An explicit --session-key always wins.\n if (\n SESSION_KEY_SUBCOMMANDS.has(subcommand) &&\n missionId &&\n (typeof flags['--session-key'] !== 'string' || flags['--session-key'].trim() === '')\n ) {\n const cached = readCachedSessionKey({ missionId, workingDirectory });\n if (cached) flags['--session-key'] = cached;\n }\n\n pruneStaleProjectTmp({ workingDirectory });\n\n // Client-side VCS capture: read git status here (the agent's machine), never on\n // the backend. Filter explicit payloads and, at deliver, merge the run delta.\n if ((subcommand === 'deliver' || subcommand === 'update') && missionId) {\n applySessionChangedFiles({\n flags,\n workingDirectory,\n missionId,\n subcommand,\n stdin: fileInputs['--changed-files-file'] ?? protocolStdin,\n fileInputs\n });\n }\n\n if (subcommand === 'deliver' && missionId) {\n applyDraftChangeRationales({\n flags,\n fileInputs,\n workingDirectory,\n missionId\n });\n }\n\n // Hosted backends cannot walk the agent machine's filesystem for discovery.\n if (subcommand === 'discover-project' && !isLoopbackBackendUrl(runtime.backend.baseUrl)) {\n const discovery = await discoverProjectOnClient({\n backend: runtime.backend,\n workingDirectory: flagValue(parsed.flags, '--directory') ?? workingDirectory,\n projectId: flagValue(parsed.flags, '--project-id')\n });\n printJson(discovery);\n return;\n }\n\n if (\n (subcommand === 'attach' ||\n subcommand === 'load-context' ||\n subcommand === 'resume-follow-up') &&\n typeof flags['--execution-target-id'] !== 'string'\n ) {\n const preferredTargetId = await resolvePreferredExecutionTargetId({ backend: runtime.backend });\n if (preferredTargetId) {\n flags['--execution-target-id'] = preferredTargetId;\n }\n }\n\n const result = await runtime.backend.post<unknown>({\n path: `/api/protocol/${encodeURIComponent(subcommand)}`,\n body: {\n args,\n positional: parsed.positional,\n flags,\n stdin: protocolStdin,\n fileInputs,\n externalSessionId:\n flagValue(parsed.flags, '--external-session-id') ??\n resolveNativeSessionId({\n explicit: undefined,\n agent: flagValue(parsed.flags, '--agent') ?? 'unknown',\n missionId: flagValue(parsed.flags, '--mission-id') ?? 'unknown',\n workingDirectory\n })\n }\n });\n\n // Record the dirty-file baseline once a work session begins, so deliver can\n // subtract pre-existing/concurrent changes from this run's reported delta.\n if ((subcommand === 'attach' || subcommand === 'resume-follow-up') && missionId) {\n writeBaseline({\n workingDirectory,\n missionId,\n files: readChangedFiles(workingDirectory)\n });\n resetTouchedFiles({ workingDirectory, missionId });\n resetRationaleNotes({ workingDirectory, missionId });\n }\n\n const resultRecord = asRecord(result);\n if (typeof resultRecord.sessionKey === 'string') {\n printKeyValue({ SESSION_KEY: resultRecord.sessionKey });\n // Persist the freshly minted key so subsequent commands in other shells for\n // this (workingDir, mission) can auto-resolve it without --session-key.\n if (missionId) {\n writeCachedSessionKey({ missionId, workingDirectory, sessionKey: resultRecord.sessionKey });\n // Also record this mission as \"active in this cwd\" so an edit hook that\n // never sees MISSION_ID in its own environment (e.g. agent-pod sessions)\n // can still resolve which mission's touched log to append to.\n if (subcommand === 'attach' || subcommand === 'resume-follow-up') {\n writeActiveSession({\n workingDirectory,\n missionId,\n sessionKey: resultRecord.sessionKey\n });\n }\n }\n }\n // The session ends at deliver: drop the cached key so it can't bind to a later\n // session for the same working dir + mission.\n if (subcommand === 'deliver' && missionId) {\n clearCachedSessionKey({ missionId, workingDirectory });\n removeActiveSession({ workingDirectory, missionId });\n\n // Self-diagnosis: a connector that installs an edit hook (today: Claude Code,\n // detected by the presence of ~/.claude) should always have a touched-files\n // log by deliver time if the run touched any files. A missing log with a\n // non-empty dirty tree means the hook silently failed to activate \u2014 the exact\n // failure mode Layer 1 fixes for the common case. Surface it loudly instead of\n // letting deliver quietly fall back to baseline-only attribution.\n const connectorInstallsEditHook = existsSync(path.join(os.homedir(), '.claude'));\n if (\n connectorInstallsEditHook &&\n !hasTouchedFilesLog({ workingDirectory, missionId }) &&\n readChangedFiles(workingDirectory).length > 0\n ) {\n const warning =\n `[overlord] warning: no touched-files log found at deliver for mission ${missionId} in ` +\n `${workingDirectory}, even though this connector installs a PostToolUse edit hook. Deliver is ` +\n `falling back to baseline-only attribution, which can misattribute concurrent sessions' edits. ` +\n `Check ~/.ovld/logs/post-tool-use-hook.log for why the hook did not record any touched files.`;\n console.error(warning);\n const sessionKeyForAlert =\n typeof flags['--session-key'] === 'string' ? flags['--session-key'] : undefined;\n if (sessionKeyForAlert) {\n try {\n await runtime.backend.post({\n path: '/api/protocol/update',\n body: {\n args: [],\n positional: [],\n flags: {\n '--mission-id': missionId,\n '--session-key': sessionKeyForAlert,\n '--event-type': 'alert',\n '--summary': warning\n },\n stdin: undefined,\n fileInputs: {}\n }\n });\n } catch {\n // Best-effort: the loud stderr warning above already surfaces the issue\n // even if the telemetry POST fails.\n }\n }\n }\n }\n if (typeof resultRecord.missionId === 'string') {\n printKeyValue({ MISSION_ID: resultRecord.missionId });\n }\n\n // Make attachment URLs absolute by prepending the backend base URL so agents\n // can use them directly with curl without guessing the backend address.\n if (subcommand === 'attachment-download-url') {\n const relUrl = resultRecord.url;\n if (typeof relUrl === 'string' && relUrl.startsWith('/')) {\n printJson({ ...resultRecord, url: `${runtime.backend.baseUrl}${relUrl}` });\n return;\n }\n }\n if (subcommand === 'attachment-list' && Array.isArray(result)) {\n const baseUrl = runtime.backend.baseUrl;\n const enhanced = result.map(entry => {\n const rec = asRecord(entry);\n const relUrl = rec.url;\n return typeof relUrl === 'string' && relUrl.startsWith('/')\n ? { ...rec, url: `${baseUrl}${relUrl}` }\n : rec;\n });\n printJson(enhanced);\n return;\n }\n\n printJson(result);\n}\n\nexport async function runManagementCommand({\n runtime,\n command,\n rest\n}: {\n runtime?: CliRuntime;\n command: string;\n rest: string[];\n}): Promise<void> {\n if (!runtime) throw new CliError({ message: `Command requires a backend: ${command}` });\n\n const parsed = parseArgs(rest);\n const json = flagBoolean(parsed.flags, '--json');\n\n switch (command) {\n case 'create-project': {\n const name = flagValue(parsed.flags, '--name') ?? parsed.positional.join(' ');\n if (!name) throw new CliError({ message: 'Missing --name' });\n const project = await runtime.backend.post<unknown>({\n path: '/api/projects',\n body: { name }\n });\n const projectId = asRecord(project).id;\n if (!flagBoolean(parsed.flags, '--no-directory') && typeof projectId === 'string') {\n const directory = flagValue(parsed.flags, '--directory') ?? process.cwd();\n const resource = await runtime.backend.post({\n path: `/api/projects/${encodeURIComponent(projectId)}/resources`,\n body: {\n directoryPath: directory,\n isPrimary: true\n }\n });\n writeProjectJsonFromResource({ directory, projectId, resource });\n }\n if (json) printJson({ project });\n else\n console.log(\n `Created project ${asRecord(project).name ?? name} (${projectId ?? 'unknown'})`\n );\n return;\n }\n case 'org-setup': {\n await runOrgSetupCommand({ runtime, parsed });\n return;\n }\n case 'add-cwd': {\n const directory = flagValue(parsed.flags, '--directory') ?? process.cwd();\n const existingProjectJson = readProjectJsonLink(\n path.join(directory, '.overlord', 'project.json')\n );\n const resourceKey = flagValue(parsed.flags, '--key') ?? existingProjectJson?.resourceKey;\n let projectId = flagValue(parsed.flags, '--project-id');\n if (!projectId) {\n const projects =\n await runtime.backend.get<Array<{ id: string; name: string; slug: string }>>(\n '/api/projects'\n );\n if (projects.length === 0) {\n throw new CliError({\n message: 'No project found. Create one with `ovld create-project`.'\n });\n }\n if (process.stdin.isTTY) {\n const chosen = await promptForProject({ projects, directoryPath: directory });\n if (!chosen) {\n console.log('Cancelled. No changes made.');\n return;\n }\n projectId = chosen.id;\n } else {\n projectId = projects[0]?.id;\n }\n }\n if (!projectId) throw new CliError({ message: 'No project selected.' });\n const resource = await runtime.backend.post({\n path: `/api/projects/${encodeURIComponent(projectId)}/resources`,\n body: {\n directoryPath: directory,\n ...(resourceKey ? { resourceKey } : {}),\n isPrimary: flagValue(parsed.flags, '--primary') !== 'false'\n }\n });\n writeProjectJsonFromResource({ directory, projectId, resource });\n if (json) printJson({ resource });\n else console.log(`Linked ${directory} to project ${projectId}`);\n return;\n }\n case 'add-url': {\n const sourceUrl = flagValue(parsed.flags, '--url');\n if (!sourceUrl) throw new CliError({ message: 'Missing --url <git-url>' });\n const projectId = flagValue(parsed.flags, '--project-id');\n if (!projectId) throw new CliError({ message: 'Missing --project-id for URL resources.' });\n const resource = await runtime.backend.post({\n path: `/api/projects/${encodeURIComponent(projectId)}/resources`,\n body: {\n sourceUrl,\n resourceKey: flagValue(parsed.flags, '--key'),\n isPrimary: flagValue(parsed.flags, '--primary') !== 'false'\n }\n });\n if (json) printJson({ resource });\n else console.log(`Linked ${sourceUrl} to project ${projectId}`);\n return;\n }\n case 'create':\n case 'prompt': {\n const objectivesJson = flagValue(parsed.flags, '--objectives-json');\n const objective =\n parsed.positional.join(' ') ||\n flagValue(parsed.flags, '--objective') ||\n flagValue(parsed.flags, '--prompt');\n const projectId = await discoverProjectId(runtime, flagValue(parsed.flags, '--project-id'));\n const objectives = objectivesJson\n ? (JSON.parse(objectivesJson) as Array<{\n objective: string;\n title?: string | null;\n autoAdvance?: boolean;\n resourceKey?: string | null;\n }>)\n : objective\n ? [\n {\n objective,\n title: flagValue(parsed.flags, '--title') ?? null,\n ...(flagValue(parsed.flags, '--resource')\n ? { resourceKey: flagValue(parsed.flags, '--resource') }\n : {})\n }\n ]\n : [];\n const first = objectives[0];\n if (!first) {\n throw new CliError({\n message: objectivesJson\n ? 'objectives-json must contain at least one objective'\n : 'Missing objective prompt text'\n });\n }\n\n const title = flagValue(parsed.flags, '--title') ?? first.title ?? first.objective;\n const mission = await runtime.backend.post<unknown>({\n path: '/api/missions',\n body: {\n projectId,\n title,\n objectives\n }\n });\n if (objectivesJson) {\n const missionObjectives = asRecord(mission).objectives;\n if (Array.isArray(missionObjectives) && missionObjectives.length !== objectives.length) {\n throw new CliError({\n message: `Backend created ${missionObjectives.length} objective(s), expected ${objectives.length}`\n });\n }\n }\n if (command === 'prompt') {\n const objectiveId = firstObjectiveId(mission);\n if (objectiveId) {\n await runtime.backend.post({\n path: `/api/objectives/${encodeURIComponent(objectiveId)}/launch`,\n body: { agent: flagValue(parsed.flags, '--agent') ?? 'unknown' }\n });\n }\n }\n if (json) printJson(mission);\n else console.log(`Created mission ${missionDisplayId(mission)}`);\n return;\n }\n case 'attach':\n case 'execution': {\n const missionId =\n command === 'attach'\n ? (parsed.positional[0] ?? flagValue(parsed.flags, '--mission-id'))\n : requireFlag(parsed.flags, '--mission-id');\n const explicitAgent = parsed.positional[1] ?? flagValue(parsed.flags, '--agent');\n if (!missionId) throw new CliError({ message: 'Usage: ovld attach <missionId> [agent]' });\n const mission = await runtime.backend.get<unknown>(\n `/api/missions/${encodeURIComponent(missionId)}`\n );\n const objectiveId = flagValue(parsed.flags, '--objective-id') ?? firstObjectiveId(mission);\n if (!objectiveId)\n throw new CliError({ message: `No launchable objective found for ${missionId}` });\n // Honor an explicit agent; otherwise reuse the agent already stored on the\n // objective (the db is the source of truth) so launching never overrides the\n // chosen agent, and fall back to the configured default rather than codex.\n const agent =\n explicitAgent ?? objectiveAssignedAgent(mission, objectiveId) ?? loadConfig().defaultAgent;\n const request = await runtime.backend.post({\n path: `/api/objectives/${encodeURIComponent(objectiveId)}/launch`,\n body: {\n agent,\n model: flagValue(parsed.flags, '--model'),\n reasoningEffort: flagValue(parsed.flags, '--thinking')\n }\n });\n if (json) printJson({ request });\n else console.log(`Queued ${agent} for ${missionDisplayId(mission)}`);\n return;\n }\n case 'launch':\n case 'restart':\n case 'run':\n case 'connect':\n case 'resume': {\n const agent =\n command === 'run' || command === 'connect' || command === 'resume'\n ? (flagValue(parsed.flags, '--agent') ??\n parsed.positional[0] ??\n loadConfig().defaultAgent)\n : parsed.positional[0];\n const missionId =\n flagValue(parsed.flags, '--mission-id') ??\n (command === 'run' || command === 'connect' || command === 'resume'\n ? parsed.positional[1]\n : parsed.positional[1]);\n if (!agent || !missionId) {\n throw new CliError({ message: `Usage: ovld ${command} <agent> --mission-id <missionId>` });\n }\n const workingDirectory = flagValue(parsed.flags, '--working-directory') ?? process.cwd();\n const terminal = await resolveTerminalLaunchSettings({ runtime, flags: parsed.flags });\n const dryRun = flagBoolean(parsed.flags, '--dry-run');\n const mission = await runtime.backend.get<unknown>(\n `/api/missions/${encodeURIComponent(missionId)}`\n );\n const objectiveId =\n flagValue(parsed.flags, '--objective-id') ?? launchableObjectiveId(mission);\n const executionTargetId = await resolvePreferredExecutionTargetId({\n backend: runtime.backend\n });\n const prepared = await prepareMissionBranch({\n runtime,\n options: {\n missionId,\n workingDirectory,\n objectiveId: objectiveId ?? undefined,\n workspaceAutomationEnabled: await readWorktreeBranchAutomationEnabled(runtime),\n dryRun,\n overrideBranch: flagValue(parsed.flags, '--branch'),\n noWorktree: flagBoolean(parsed.flags, '--no-worktree')\n }\n });\n await recordBranchPrepared({\n runtime,\n missionId,\n branchAutomation: prepared.branchAutomation\n });\n const result = await launchAgent({\n runtime,\n options: {\n agent,\n missionId,\n workingDirectory: prepared.workingDirectory,\n model: flagValue(parsed.flags, '--model'),\n thinking: flagValue(parsed.flags, '--thinking'),\n flags: repeatedFlagValues(rest, '--flag'),\n preCommand: flagValue(parsed.flags, '--pre-command'),\n executionTargetId: executionTargetId ?? undefined,\n ...terminal,\n dryRun\n }\n });\n if (json || dryRun) {\n printJson({ plan: result.plan, status: result.status, signal: result.signal });\n }\n if (result.status && result.status !== 0) {\n throw new CliError({ message: `Launch command exited with status ${result.status}` });\n }\n return;\n }\n case 'runner': {\n await runRunnerCommand({ runtime, parsed, json });\n return;\n }\n case 'missions': {\n const sub = parsed.positional[0];\n if (sub !== 'list') {\n throw new CliError({\n message: 'Usage: ovld missions list [--status <csv>] [--project-id <id>] [--json]'\n });\n }\n const params = new URLSearchParams();\n const query = flagValue(parsed.flags, '--query');\n const projectId = flagValue(parsed.flags, '--project-id');\n const limit = flagValue(parsed.flags, '--limit');\n if (query) params.set('q', query);\n if (projectId) params.set('projectId', projectId);\n if (limit) params.set('limit', limit);\n const result = await runtime.backend.get<{ missions: unknown[] }>(\n `/api/missions/search?${params}`\n );\n const missions = result.missions;\n if (json) printJson({ missions });\n else {\n for (const mission of missions) {\n const record = asRecord(mission);\n console.log(\n `${record.displayId ?? record.id}\\t${record.statusType ?? ''}\\t${record.title ?? ''}`\n );\n }\n }\n return;\n }\n case 'mission': {\n const sub = parsed.positional[0];\n const missionId = parsed.positional[1];\n if (!missionId) {\n throw new CliError({\n message:\n 'Usage: ovld mission context|events|deliveries|artifacts|rationales <missionId> [--json]'\n });\n }\n const pathBySub: Record<string, string> = {\n context: `/api/missions/${encodeURIComponent(missionId)}`,\n events: `/api/missions/${encodeURIComponent(missionId)}/events`,\n artifacts: `/api/missions/${encodeURIComponent(missionId)}/artifacts`,\n rationales: `/api/missions/${encodeURIComponent(missionId)}/file-changes`,\n deliveries: `/api/missions/${encodeURIComponent(missionId)}/events`\n };\n const path = sub ? pathBySub[sub] : undefined;\n if (!path) {\n throw new CliError({\n message:\n 'Usage: ovld mission context|events|deliveries|artifacts|rationales <missionId> [--json]'\n });\n }\n const result = await runtime.backend.get<unknown>(path);\n if (json || sub === 'context') printJson(result);\n else if (Array.isArray(result)) for (const row of result) console.log(JSON.stringify(row));\n else printJson(result);\n return;\n }\n case 'changes': {\n const sub = parsed.positional[0];\n const missionId = requireFlag(parsed.flags, '--mission-id');\n if (sub !== 'status' && sub !== 'rationales') {\n throw new CliError({ message: 'Usage: ovld changes status|rationales --mission-id <id>' });\n }\n const result = await runtime.backend.get<unknown[]>(\n `/api/missions/${encodeURIComponent(missionId)}/file-changes`\n );\n if (json) printJson({ files: result, rationales: result });\n else for (const row of result) console.log(JSON.stringify(row));\n return;\n }\n default:\n throw new CliError({ message: `Unknown command: ${command}` });\n }\n}\n\nasync function runRunnerCommand({\n runtime,\n parsed,\n json\n}: {\n runtime: CliRuntime;\n parsed: ReturnType<typeof parseArgs>;\n json: boolean;\n}): Promise<void> {\n const sub = parsed.positional[0] ?? 'status';\n if (sub === 'status') {\n const result = await runtime.backend.get<unknown>('/api/runner/status');\n if (json) printJson(result);\n else printJson(result);\n return;\n }\n if (sub === 'clear' || sub === 'clear-all') {\n const result = await runtime.backend.post({\n path: '/api/runner/clear',\n body: {\n objectiveId: sub === 'clear' ? parsed.positional[1] : undefined,\n projectId: flagValue(parsed.flags, '--project-id')\n }\n });\n if (json) printJson(result);\n else console.log(`Cleared ${asRecord(result).cleared ?? 0} execution request(s).`);\n return;\n }\n if (sub === 'service') {\n await runRunnerServiceCommand({ parsed, json });\n return;\n }\n if (sub !== 'once' && sub !== 'start' && sub !== 'supervise') {\n throw new CliError({\n message:\n 'Usage: ovld runner once|start|supervise|status|clear <objective_id>|clear-all|service <install|start|stop|restart|status|uninstall>'\n });\n }\n\n const runOnce = async (): Promise<boolean> => {\n const claim = await runtime.backend.post<unknown>({\n path: '/api/runner/claim',\n body: {\n projectId: flagValue(parsed.flags, '--project-id'),\n ...clientDeviceIdentity()\n }\n });\n const request = asRecord(claim).request;\n if (!request) return false;\n const requestRecord = asRecord(request);\n const requestId = String(requestRecord.id);\n const projectId = String(requestRecord.projectId ?? '');\n const executionTargetId =\n typeof requestRecord.executionTargetId === 'string'\n ? requestRecord.executionTargetId.trim()\n : '';\n if (projectId && executionTargetId) {\n try {\n await reportRunnerResourceObservations({\n backend: runtime.backend,\n projectId,\n executionTargetId\n });\n } catch {\n // Observation writeback is best-effort; launch should still proceed.\n }\n }\n await runtime.backend.post({ path: `/api/runner/requests/${requestId}/launching` });\n try {\n const mutation = parseMutationFromMetadata(requestRecord.metadata);\n if (mutation) {\n const mutationResult = await executeLocalTargetMutation({ mutation });\n if (!mutationResult.ok) {\n await runtime.backend.post({\n path: `/api/runner/requests/${requestId}/failed`,\n body: { error: mutationResult.message }\n });\n throw new CliError({ message: mutationResult.message });\n }\n await runtime.backend.post({\n path: `/api/runner/requests/${requestId}/completed`,\n body: { mutationResult }\n });\n if (json) printJson({ request, mutationResult });\n else console.log(`Completed ${mutation.kind} for ${requestRecord.missionId}`);\n return true;\n }\n\n // The execution request's agent is decided upstream from the objective row,\n // so a missing value is an invariant violation \u2014 never silently substitute a\n // default agent, which would launch work as the wrong tool. Fail the request\n // up front (the catch below reports it) so the cause surfaces instead of being\n // masked, and so no branch/terminal work is done for a request that can't run.\n const requestedAgent =\n typeof requestRecord.requestedAgent === 'string' ? requestRecord.requestedAgent.trim() : '';\n if (!requestedAgent) {\n throw new CliError({\n message: `Execution request ${requestId} has no agent; the objective must specify one before it can be launched.`\n });\n }\n const launchConfig = asRecord(requestRecord.launchConfig);\n const terminal = await resolveTerminalLaunchSettings({ runtime, flags: parsed.flags });\n const missionId = String(requestRecord.missionId);\n const dryRun = flagBoolean(parsed.flags, '--dry-run');\n const prepared = await prepareMissionBranch({\n runtime,\n options: {\n missionId,\n workingDirectory: String(requestRecord.workingDirectory ?? process.cwd()),\n objectiveId: String(requestRecord.objectiveId ?? ''),\n workspaceAutomationEnabled: await readWorktreeBranchAutomationEnabled(runtime),\n dryRun,\n overrideBranch: flagValue(parsed.flags, '--branch'),\n noWorktree: flagBoolean(parsed.flags, '--no-worktree')\n }\n });\n await recordBranchPrepared({\n runtime,\n missionId,\n requestId,\n branchAutomation: prepared.branchAutomation\n });\n const result = await launchAgent({\n runtime,\n options: {\n agent: requestedAgent,\n missionId,\n workingDirectory: prepared.workingDirectory,\n model:\n typeof requestRecord.requestedModel === 'string'\n ? requestRecord.requestedModel\n : undefined,\n thinking:\n typeof requestRecord.requestedReasoningEffort === 'string'\n ? requestRecord.requestedReasoningEffort\n : undefined,\n flags: Array.isArray(launchConfig.flags)\n ? launchConfig.flags.filter((value): value is string => typeof value === 'string')\n : [],\n preCommand:\n typeof launchConfig.preCommand === 'string' ? launchConfig.preCommand : undefined,\n executionRequestId: requestId,\n executionTargetId: executionTargetId || undefined,\n ...terminal,\n dryRun\n }\n });\n if (result.status && result.status !== 0) {\n throw new CliError({ message: `Launch command exited with status ${result.status}` });\n }\n await runtime.backend.post({ path: `/api/runner/requests/${requestId}/launched` });\n if (json || dryRun) {\n printJson({ request, plan: result.plan, status: result.status });\n } else {\n console.log(`Launched ${requestedAgent} for ${requestRecord.missionId}`);\n }\n return true;\n } catch (error) {\n await runtime.backend.post({\n path: `/api/runner/requests/${requestId}/failed`,\n body: { error: error instanceof Error ? error.message : String(error) }\n });\n throw error;\n }\n };\n\n if (sub === 'once') {\n const launched = await runOnce();\n if (!launched) {\n if (json) printJson({ launched: false });\n else console.log('No claimable execution requests.');\n }\n return;\n }\n\n if (sub === 'supervise') {\n await runRunnerSupervisor({ runOnce, json });\n return;\n }\n\n const intervalMs = Number.parseInt(flagValue(parsed.flags, '--poll-interval-ms') ?? '3000', 10);\n if (!json) console.log(`Runner started. Polling every ${intervalMs}ms for execution requests.`);\n while (true) {\n await runOnce();\n await new Promise(resolve => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * The persistent-runner supervisor loop behind `ovld runner supervise`. It owns\n * only the long-lived loop and adaptive polling; each poll delegates to the same\n * one-shot claim-and-launch closure used by `ovld runner once`, so claim,\n * worktree, terminal, and launch behavior are never duplicated. Backoff uses the\n * \"last launched job\" clock (see planning/feature-plans/persistent-runner-cli.md).\n */\nasync function runRunnerSupervisor({\n runOnce,\n json\n}: {\n runOnce: () => Promise<boolean>;\n json: boolean;\n}): Promise<void> {\n if (!json) console.log('Runner supervisor started. Adaptive polling for execution requests.');\n for (;;) {\n const now = new Date();\n let launched = false;\n let lastError: string | null = null;\n try {\n launched = await runOnce();\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n }\n const state = readRunnerServiceState();\n const base = selectBasePollIntervalMs({\n lastLaunchedAt: launched ? now.toISOString() : state.lastLaunchedAt,\n now: now.getTime()\n });\n patchRunnerServiceState({\n lastHeartbeatAt: now.toISOString(),\n lastClaimedAt: launched ? now.toISOString() : state.lastClaimedAt,\n lastLaunchedAt: launched ? now.toISOString() : state.lastLaunchedAt,\n lastError: lastError ?? state.lastError,\n currentPollIntervalMs: base\n });\n await new Promise(resolve => setTimeout(resolve, applyPollJitter(base)));\n }\n}\n\n/**\n * `ovld runner service <install|start|stop|restart|status|uninstall>` \u2014 manage\n * the OS-level persistent runner service. The desktop Settings panel and the\n * sidebar runner control invoke exactly these operations, so this is the single\n * owner of local service lifecycle.\n */\nasync function runRunnerServiceCommand({\n parsed,\n json\n}: {\n parsed: ReturnType<typeof parseArgs>;\n json: boolean;\n}): Promise<void> {\n const action = parsed.positional[1] ?? 'status';\n const manager = resolveServiceManager();\n if (!manager) {\n throw new CliError({\n message: `Persistent runner service is not supported on ${process.platform} yet. Use \\`ovld runner start\\` for a foreground runner.`\n });\n }\n\n if (action === 'status') {\n const runState = await manager.status();\n const state = readRunnerServiceState();\n const { publisher, needsReinstallForOverlord } = describeServicePublisher({\n execProgram: state.execProgram\n });\n const reinstallHint =\n runState.installed && needsReinstallForOverlord\n ? 'This service is registered under \"Node.js Foundation\" because it runs the plain node binary. Reinstall it from the Overlord desktop app (or with the desktop app present) to re-register it under \"Overlord\".'\n : null;\n const payload = {\n supported: true,\n kind: manager.kind,\n identifier: manager.identifier,\n unitPath: manager.unitPath(),\n installed: runState.installed,\n running: runState.running,\n backendUrl: state.backendUrl,\n installedAt: state.installedAt,\n lastHeartbeatAt: state.lastHeartbeatAt,\n lastClaimedAt: state.lastClaimedAt,\n lastLaunchedAt: state.lastLaunchedAt,\n lastError: state.lastError,\n currentPollIntervalMs: state.currentPollIntervalMs,\n publisher,\n reinstallHint\n };\n if (json) printJson(payload);\n else {\n printKeyValue({\n Service: `${manager.kind} (${manager.identifier})`,\n Installed: runState.installed ? 'yes' : 'no',\n Running: runState.running,\n Publisher: publisher === 'unknown' ? '(unknown)' : publisher,\n Backend: state.backendUrl ?? '(unknown)',\n 'Last heartbeat': state.lastHeartbeatAt ?? '(never)',\n 'Last launched': state.lastLaunchedAt ?? '(never)',\n 'Poll interval': state.currentPollIntervalMs\n ? `${state.currentPollIntervalMs}ms`\n : '(idle)',\n 'Last error': state.lastError ?? '(none)'\n });\n if (reinstallHint) console.log(`\\nNote: ${reinstallHint}`);\n }\n return;\n }\n\n if (action === 'install') {\n const config = loadConfig();\n const backendUrl = resolveBackendUrl(config);\n const invocation = resolveOvldInvocation();\n const env = buildRunnerServiceEnv({\n backendUrl,\n runAsElectronNode: invocation.runAsElectronNode\n });\n const autoStart = !flagBoolean(parsed.flags, '--no-start');\n await manager.install({ invocation, env, autoStart });\n writeRunnerServiceState({\n ...readRunnerServiceState(),\n serviceKind: manager.kind,\n serviceIdentifier: manager.identifier,\n execProgram: invocation.program,\n execArgs: invocation.args,\n backendUrl,\n installedAt: new Date().toISOString(),\n lastError: null\n });\n const runState = await manager.status();\n if (json) printJson({ started: autoStart, ...runState });\n else\n console.log(\n `Persistent runner installed (${manager.kind}) and ${autoStart ? 'started' : 'not started'}.`\n );\n return;\n }\n\n if (action === 'start' || action === 'stop' || action === 'restart') {\n await manager[action]();\n const runState = await manager.status();\n if (json) printJson({ action, ...runState });\n else console.log(`Persistent runner ${action} complete (running: ${runState.running}).`);\n return;\n }\n\n if (action === 'uninstall') {\n await manager.uninstall();\n writeRunnerServiceState({\n ...readRunnerServiceState(),\n serviceKind: null,\n serviceIdentifier: null,\n installedAt: null\n });\n if (json) printJson({ uninstalled: true });\n else console.log('Persistent runner uninstalled.');\n return;\n }\n\n throw new CliError({\n message:\n 'Usage: ovld runner service <install|start|stop|restart|status|uninstall> [--no-start] [--json]'\n });\n}\n", "import { CliError, formatCliError } from './errors.js';\nimport { printHelp } from './help.js';\nimport { runVersionCommand } from './version.js';\n\nconst MIN_NODE_MAJOR = 20;\n\nconst DB_FREE_COMMANDS = new Set([\n 'help',\n '--help',\n '-h',\n 'version',\n '--version',\n '-v',\n 'update',\n 'init',\n 'doctor',\n 'setup',\n 'agent-setup',\n 'serve',\n 'config',\n 'auth',\n 'user-token',\n 'prune'\n]);\n\nconst KNOWN_COMMANDS = new Set([\n ...DB_FREE_COMMANDS,\n 'protocol',\n 'create-project',\n 'org-setup',\n 'add-cwd',\n 'add-url',\n 'create',\n 'prompt',\n 'attach',\n 'launch',\n 'restart',\n 'connect',\n 'run',\n 'resume',\n 'runner',\n 'missions',\n 'mission',\n 'changes',\n 'execution',\n 'config'\n]);\n\nfunction assertSupportedNodeVersion(): void {\n const major = Number.parseInt(process.versions.node.split('.')[0] ?? '', 10);\n\n if (Number.isNaN(major) || major < MIN_NODE_MAJOR) {\n throw new CliError({\n message: `Overlord CLI requires Node.js ${MIN_NODE_MAJOR} or newer. Found ${process.version}.`\n });\n }\n}\n\nfunction wantsJsonOutput(args: string[]): boolean {\n return args.includes('--json');\n}\n\nasync function dispatchCommand({\n primaryCommand,\n command,\n args,\n stdin\n}: {\n primaryCommand: string;\n command: string | undefined;\n args: string[];\n stdin?: string;\n}): Promise<void> {\n switch (command) {\n case undefined:\n case 'help':\n case '--help':\n case '-h':\n printHelp({ primaryCommand });\n return;\n case 'version':\n case '--version':\n case '-v':\n runVersionCommand({ json: wantsJsonOutput(args) });\n return;\n case 'update': {\n const { runUpdateCommand } = await import('./update.js');\n await runUpdateCommand({ rest: args });\n return;\n }\n case 'init':\n case 'doctor':\n case 'setup':\n case 'agent-setup':\n case 'config':\n case 'auth':\n case 'user-token':\n case 'prune': {\n const { runLocalCommand } = await import('./management.js');\n await runLocalCommand({ command, rest: args });\n return;\n }\n case 'serve': {\n const { runServeCommand } = await import('./serve.js');\n await runServeCommand({ rest: args });\n return;\n }\n case 'protocol': {\n const [subcommand, ...rest] = args;\n if (!subcommand) {\n throw new CliError({ message: 'Usage: ovld protocol <subcommand> [flags]' });\n }\n const { openCliRuntime } = await import('./runtime.js');\n const { runProtocolCommand } = await import('./commands.js');\n const runtime = openCliRuntime();\n try {\n await runProtocolCommand({ runtime, subcommand, args: rest, stdin, primaryCommand });\n } finally {\n runtime.close();\n }\n return;\n }\n default: {\n if (!KNOWN_COMMANDS.has(command)) {\n throw new CliError({\n message: `Unknown command: ${command}\\nRun \\`${primaryCommand} help\\` for usage.`\n });\n }\n const { openCliRuntime } = await import('./runtime.js');\n const { runManagementCommand } = await import('./commands.js');\n const runtime = openCliRuntime();\n try {\n await runManagementCommand({ runtime, command, rest: args });\n } finally {\n runtime.close();\n }\n }\n }\n}\n\nexport async function runCli({\n primaryCommand,\n argv = process.argv.slice(2),\n stdin\n}: {\n primaryCommand: string;\n argv?: string[];\n stdin?: string;\n}): Promise<void> {\n assertSupportedNodeVersion();\n\n const [command, ...rest] = argv;\n\n try {\n await dispatchCommand({ primaryCommand, command, args: rest, stdin });\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError({ message: formatCliError(error) });\n }\n}\n\nexport { redactSecrets } from './redact-secrets.js';\nexport { getCliVersion } from './version.js';\n", "export function printHelp({ primaryCommand }: { primaryCommand: string }): void {\n console.log(`Overlord CLI\n \nINSTRUCTIONS FOR AI AGENTS: run \\`${primaryCommand} protocol help\\` for the full mission lifecycle reference.\n\nPrimary command: ${primaryCommand}\n\nGeneral:\n ${primaryCommand} auth login [--token <out_...>] Configure backend and log in\n ${primaryCommand} auth status [--json] Show backend URL and login status\n ${primaryCommand} user-token create --label <l> [--expires-in 90d] [--no-expiry] [--scope full|mission-lifecycle]\n Mint a USER_TOKEN (prints the secret once)\n ${primaryCommand} user-token list [--json] List your tokens (never shows secrets)\n ${primaryCommand} user-token revoke <id> Revoke a token immediately\n ${primaryCommand} user-token rename <id> <label> Rename a token without rotating it\n ${primaryCommand} help Show this help message\n ${primaryCommand} version [--json] Show the installed CLI version\n ${primaryCommand} update [--check] [--force] [--json]\n Check for or install the latest published CLI\n ${primaryCommand} init [--json] Create overlord.toml with a local backend URL\n ${primaryCommand} serve [--host <h>] [--port <p>] [--db <path>] [--json]\n Boot the web/REST server (creates + migrates the DB on first run)\n ${primaryCommand} doctor [--json] Validate backend and connector installs\n ${primaryCommand} prune [--json] Delete the contents of .overlord/tmp in the current directory\n ${primaryCommand} config list [--json] Show local configuration\n ${primaryCommand} config set Choose local/cloud backend interactively\n ${primaryCommand} config set local [url] Use a local backend URL (default: http://127.0.0.1:4310)\n ${primaryCommand} config set cloud <url> Use a hosted backend URL\n ${primaryCommand} setup [--json] Configure backend, agents, and terminal interactively\n\nConnectors:\n ${primaryCommand} agent-setup [--json] List installable agent connectors\n ${primaryCommand} agent-setup <agent> [--dry-run]\n Install/repair one connector (e.g. claude)\n ${primaryCommand} agent-setup all [--dry-run] Install/repair all supported connectors\n\nOrganizations:\n ${primaryCommand} org-setup --org-name \"<name>\" [--workspace-name <name>] [--workspace-slug <slug>]\n [--logo <path>] [--no-input] [--if-needed] [--json]\n One-time org + first-workspace onboarding for a\n profile with zero workspace memberships. Prompts\n interactively on a TTY; --if-needed is a no-op (exit 0)\n once you already belong to an organization.\n\nProjects:\n ${primaryCommand} create-project --name \"<name>\" [--directory <path>|--no-directory]\n ${primaryCommand} add-cwd [--directory <path>] [--project-id <id>] [--key <resourceKey>] [--primary true|false]\n (prompts to pick a project when --project-id is omitted)\n ${primaryCommand} add-url --url <git-url> --project-id <id> [--key <resourceKey>] [--primary true|false]\n\nMissions:\n ${primaryCommand} create \"<objective>\" [--objectives-json '[...]'] [--json]\n ${primaryCommand} prompt \"<objective>\" [--json]\n ${primaryCommand} attach <missionId> [agent] [--json]\n ${primaryCommand} missions list [--status <csv>] [--project-id <id>] [--json]\n ${primaryCommand} mission context|events|deliveries|artifacts|rationales <missionId> [--json]\n\nLaunch and runner:\n ${primaryCommand} launch <agent> --mission-id <missionId> [--branch <name>] [--no-worktree] [--dry-run] [--json]\n ${primaryCommand} runner once|start|status|clear|clear-all [--branch <name>] [--no-worktree] [--json]\n\nChanges:\n ${primaryCommand} changes status --mission-id <id> [--objective-id <id>] [--json]\n ${primaryCommand} changes rationales --mission-id <id> [--objective-id <id>] [--json]\n\nAgents:\n Built-in agents (claude, codex, cursor) need an installed connector\n (${primaryCommand} agent-setup <agent>). Launch with:\n ${primaryCommand} launch <agent> --mission-id <missionId>\n Use ${primaryCommand} protocol help for the full mission lifecycle reference.\n Key protocol commands: auth-status, discover-project, create, prompt, attach,\n connect, load-context, update, heartbeat, ask, deliver.\n\nProtocol (JSON output by default):\n ${primaryCommand} protocol attach --mission-id <id>\n ${primaryCommand} protocol update --mission-id <id> --session-key <key> --summary \"...\"\n ${primaryCommand} protocol heartbeat --mission-id <id> --session-key <key>\n ${primaryCommand} protocol ask --mission-id <id> --session-key <key> --question \"...\"\n ${primaryCommand} protocol deliver --mission-id <id> --session-key <key> --summary \"...\"\n ${primaryCommand} protocol search-missions --query \"<text>\" --status next-up,execute\n ${primaryCommand} protocol load-context --mission-id <id>\n ${primaryCommand} protocol help\n\nAfter installation, run \\`${primaryCommand} auth login\\` to choose your backend.\n\nSee cli/docs/ for the full command reference.\n`);\n}\n"],
5
- "mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uEAaqD,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAuM7E,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
4
+ "sourcesContent": ["/**\n * Shared secret-redaction helper for CLI diagnostics.\n *\n * `USER_TOKEN` secrets are `out_`-prefixed, high-entropy strings (see\n * `auth/docs/07-user-token-authentication.md`). The security audit (2026-06-18)\n * recommended a single redaction utility so token-like values never leak into\n * error output, verbose logs, or crash reports as new code paths are added.\n *\n * The first 12 characters (`out_` + the 8-char non-secret display prefix) are\n * preserved for correlation/debugging; everything after the prefix \u2014 the actual\n * secret material \u2014 is masked.\n */\n\nconst TOKEN_PATTERN = /out_[A-Za-z0-9_-]{8,}/g;\n\n/** Mask any `out_\u2026` USER_TOKEN secrets found in `value`, keeping the display prefix. */\nexport function redactSecrets(value: unknown): string {\n const text = typeof value === 'string' ? value : String(value);\n return text.replace(TOKEN_PATTERN, match => `${match.slice(0, 12)}\u2026[redacted]`);\n}\n", "import { redactSecrets } from './redact-secrets.js';\n\nexport class CliError extends Error {\n readonly exitCode: number;\n\n constructor({ message, exitCode = 1 }: { message: string; exitCode?: number }) {\n super(message);\n this.name = 'CliError';\n this.exitCode = exitCode;\n }\n}\n\nexport function formatCliError(error: unknown): string {\n if (error instanceof CliError) {\n return redactSecrets(error.message);\n }\n\n if (error instanceof Error) {\n return redactSecrets(error.message);\n }\n\n return redactSecrets(String(error));\n}\n", "import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nfunction resolvePackageJsonPath(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n while (true) {\n const candidate = path.join(dir, 'package.json');\n if (existsSync(candidate)) {\n const packageJson = JSON.parse(readFileSync(candidate, 'utf8')) as { name?: string };\n if (packageJson.name === 'overlord-cli') {\n return candidate;\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) {\n break;\n }\n dir = parent;\n }\n\n throw new Error('Cannot locate overlord-cli package.json');\n}\n\nexport function getCliVersion(): string {\n const packageJson = JSON.parse(readFileSync(resolvePackageJsonPath(), 'utf8')) as {\n version: string;\n };\n return packageJson.version;\n}\n\nexport function runVersionCommand({ json = false }: { json?: boolean } = {}): void {\n const version = getCliVersion();\n\n if (json) {\n console.log(JSON.stringify({ version, node: process.version }));\n return;\n }\n\n console.log(`Overlord CLI ${version}`);\n}\n", "import { CliError } from './errors.js';\n\nexport type ParsedArgs = {\n positional: string[];\n flags: Map<string, string | true>;\n};\n\nexport function parseArgs(argv: string[]): ParsedArgs {\n const positional: string[] = [];\n const flags = new Map<string, string | true>();\n\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token) continue;\n\n if (token === '--') {\n positional.push(...argv.slice(index + 1));\n break;\n }\n\n if (token.startsWith('--')) {\n const eqIndex = token.indexOf('=');\n if (eqIndex >= 0) {\n flags.set(token.slice(0, eqIndex), token.slice(eqIndex + 1));\n continue;\n }\n\n const next = argv[index + 1];\n if (next !== undefined && (!next.startsWith('-') || next === '-')) {\n flags.set(token, next);\n index += 1;\n } else {\n flags.set(token, true);\n }\n continue;\n }\n\n positional.push(token);\n }\n\n return { positional, flags };\n}\n\nexport function flagValue(flags: Map<string, string | true>, name: string): string | undefined {\n const value = flags.get(name);\n if (value === true || value === undefined) return undefined;\n return value;\n}\n\nexport function flagBoolean(flags: Map<string, string | true>, name: string): boolean {\n return flags.has(name);\n}\n\nexport function requireFlag(flags: Map<string, string | true>, name: string): string {\n const value = flagValue(flags, name);\n if (!value) {\n throw new Error(`Missing required flag: ${name}`);\n }\n return value;\n}\n\nexport async function readFlagOrFile({\n flags,\n flagName,\n fileFlagName,\n stdin\n}: {\n flags: Map<string, string | true>;\n flagName: string;\n fileFlagName: string;\n stdin?: string;\n}): Promise<string | undefined> {\n const direct = flagValue(flags, flagName);\n if (direct) return direct;\n\n const filePath = flagValue(flags, fileFlagName);\n if (filePath === '-') {\n if (stdin !== undefined) {\n return stdin;\n }\n const { readFileSync } = await import('node:fs');\n return readFileSync(0, 'utf8');\n }\n if (filePath) {\n const { readFileSync } = await import('node:fs');\n return readFileSync(filePath, 'utf8');\n }\n\n return undefined;\n}\n\nexport function parseJsonFlag(\n flags: Map<string, string | true>,\n flagName: string\n): Record<string, unknown> | undefined {\n const raw = flagValue(flags, flagName);\n if (!raw) return undefined;\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\n/** Inline `--*-json` values larger than this are rejected; use the paired `--*-file -` flag. */\nexport const MAX_INLINE_JSON_CHARS = 8_192;\n\nconst INLINE_JSON_FLAG_PAIRS = [\n { jsonFlag: '--change-rationales-json', fileFlag: '--change-rationales-file' },\n { jsonFlag: '--payload-json', fileFlag: '--payload-file' },\n { jsonFlag: '--artifacts-json', fileFlag: '--artifacts-file' },\n { jsonFlag: '--objectives-json', fileFlag: '--objectives-file' },\n { jsonFlag: '--changed-files-json', fileFlag: '--changed-files-file' },\n { jsonFlag: '--value-json', fileFlag: '--value-file' }\n] as const;\n\nexport function rejectOversizedInlineJson({ flags }: { flags: Map<string, string | true> }): void {\n for (const { jsonFlag, fileFlag } of INLINE_JSON_FLAG_PAIRS) {\n const value = flagValue(flags, jsonFlag);\n if (value === undefined || value.length <= MAX_INLINE_JSON_CHARS) continue;\n\n throw new CliError({\n message:\n `${jsonFlag} is too large (${value.length} chars; limit ${MAX_INLINE_JSON_CHARS}). ` +\n `Pass the JSON via ${fileFlag} - and stream it on stdin instead. ` +\n 'Keep short values like --summary inline.'\n });\n }\n}\n\nexport function parseCsvFlag(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n return value\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n}\n", "const BLUE = '\\x1b[34m';\nconst RESET = '\\x1b[0m';\n\nexport function printJson(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport function printLine(line: string): void {\n process.stdout.write(`${line}\\n`);\n}\n\nexport function printStepTitle(title: string): void {\n if (process.stdout.isTTY) {\n printLine(`${BLUE}${title}${RESET}`);\n } else {\n printLine(title);\n }\n}\n\nexport function printLines(lines: string[]): void {\n for (const line of lines) {\n printLine(line);\n }\n}\n\nexport function printKeyValue(stderrPairs: Record<string, string>): void {\n for (const [key, value] of Object.entries(stderrPairs)) {\n process.stderr.write(`${key}=${value}\\n`);\n }\n}\n", "import { spawn } from 'node:child_process';\n\nimport { flagBoolean, parseArgs } from './args.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\nimport { getCliVersion } from './version.js';\n\nconst PACKAGE_NAME = 'overlord-cli';\n\nexport const DEFAULT_UPDATE_INSTALL_ARGS = [\n 'install',\n '-g',\n '--no-fund',\n `${PACKAGE_NAME}@latest`\n] as const;\n\ntype SpawnResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\ntype UpdateStatus = {\n packageName: string;\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n installed: boolean;\n packageManager: string;\n};\n\nfunction resolvePackageManager(): string {\n if (process.env.OVLD_UPDATE_BIN) return process.env.OVLD_UPDATE_BIN;\n return process.platform === 'win32' ? 'npm.cmd' : 'npm';\n}\n\nfunction resolveSpawnEnv(): NodeJS.ProcessEnv {\n return {\n ...process.env,\n NPM_CONFIG_FUND: 'false'\n };\n}\n\nfunction resolveCommandArgs({\n envName,\n fallback\n}: {\n envName: string;\n fallback: string[];\n}): string[] {\n const raw = process.env[envName];\n if (!raw) return fallback;\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed) || !parsed.every(value => typeof value === 'string')) {\n throw new CliError({\n message: `${envName} must be a JSON array of strings.`\n });\n }\n return parsed;\n}\n\nfunction normalizeVersion(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) {\n throw new CliError({ message: 'Received an empty version from npm.' });\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n if (typeof parsed === 'string' && parsed.trim()) return parsed.trim();\n } catch {\n // Fall back to raw output below.\n }\n\n return trimmed.replace(/^\"+|\"+$/g, '');\n}\n\nfunction compareVersions(left: string, right: string): number {\n const leftParts = left.split('.').map(part => Number.parseInt(part, 10));\n const rightParts = right.split('.').map(part => Number.parseInt(part, 10));\n const length = Math.max(leftParts.length, rightParts.length);\n\n for (let index = 0; index < length; index += 1) {\n const leftPart = Number.isFinite(leftParts[index]) ? leftParts[index]! : 0;\n const rightPart = Number.isFinite(rightParts[index]) ? rightParts[index]! : 0;\n if (leftPart !== rightPart) return leftPart - rightPart;\n }\n\n return 0;\n}\n\nasync function runCapturedCommand({\n command,\n args\n}: {\n command: string;\n args: string[];\n}): Promise<SpawnResult> {\n return await new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n env: resolveSpawnEnv(),\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', chunk => {\n stdout += String(chunk);\n });\n child.stderr.on('data', chunk => {\n stderr += String(chunk);\n });\n child.on('error', reject);\n child.on('close', exitCode => {\n resolve({ exitCode: exitCode ?? 1, stdout, stderr });\n });\n });\n}\n\nasync function runStreamingCommand({\n command,\n args\n}: {\n command: string;\n args: string[];\n}): Promise<number> {\n return await new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n env: resolveSpawnEnv(),\n stdio: 'inherit'\n });\n\n child.on('error', reject);\n child.on('close', exitCode => {\n resolve(exitCode ?? 1);\n });\n });\n}\n\nasync function readLatestVersion(packageManager: string): Promise<string> {\n const args = resolveCommandArgs({\n envName: 'OVLD_UPDATE_VIEW_ARGS_JSON',\n fallback: ['view', PACKAGE_NAME, 'version', '--json']\n });\n const result = await runCapturedCommand({ command: packageManager, args });\n if (result.exitCode !== 0) {\n const detail = result.stderr.trim() || result.stdout.trim() || `exit ${result.exitCode}`;\n throw new CliError({\n message: `Unable to check the latest ${PACKAGE_NAME} version via ${packageManager}: ${detail}`\n });\n }\n return normalizeVersion(result.stdout);\n}\n\nfunction printStatus(status: UpdateStatus, json: boolean): void {\n if (json) {\n printJson(status);\n return;\n }\n\n if (!status.updateAvailable) {\n console.log(`Overlord CLI ${status.currentVersion} is already up to date.`);\n return;\n }\n\n if (!status.installed) {\n console.log(`Overlord CLI ${status.currentVersion} can be updated to ${status.latestVersion}.`);\n return;\n }\n\n console.log(`Updated Overlord CLI from ${status.currentVersion} to ${status.latestVersion}.`);\n}\n\nexport async function runUpdateCommand({ rest }: { rest: string[] }): Promise<void> {\n const parsed = parseArgs(rest);\n const json = flagBoolean(parsed.flags, '--json');\n const check = flagBoolean(parsed.flags, '--check');\n const force = flagBoolean(parsed.flags, '--force');\n\n const currentVersion = getCliVersion();\n const packageManager = resolvePackageManager();\n const latestVersion = await readLatestVersion(packageManager);\n const updateAvailable = compareVersions(currentVersion, latestVersion) < 0;\n\n if (check || (!updateAvailable && !force)) {\n printStatus(\n {\n packageName: PACKAGE_NAME,\n currentVersion,\n latestVersion,\n updateAvailable,\n installed: false,\n packageManager\n },\n json\n );\n return;\n }\n\n const installArgs = resolveCommandArgs({\n envName: 'OVLD_UPDATE_INSTALL_ARGS_JSON',\n fallback: [...DEFAULT_UPDATE_INSTALL_ARGS]\n });\n\n if (!json) {\n console.log(`Updating Overlord CLI via ${packageManager}...`);\n }\n\n const exitCode = await runStreamingCommand({ command: packageManager, args: installArgs }).catch(\n error => {\n throw new CliError({\n message:\n error instanceof Error\n ? `Failed to start ${packageManager}: ${error.message}`\n : `Failed to start ${packageManager}: ${String(error)}`\n });\n }\n );\n\n if (exitCode !== 0) {\n throw new CliError({\n message: `${packageManager} exited with status ${exitCode} while updating ${PACKAGE_NAME}.`\n });\n }\n\n printStatus(\n {\n packageName: PACKAGE_NAME,\n currentVersion,\n latestVersion,\n updateAvailable: true,\n installed: true,\n packageManager\n },\n json\n );\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n// Hopefully this class will disappear once Temporal lands in JS\n// But for now we have to reinvent the wheel once more!\n\ntype Offset = string | null\n\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i\n\nexport class TomlDate extends Date {\n\t#hasDate = false\n\t#hasTime = false\n\t#offset: Offset = null\n\n\tconstructor(date: string | Date) {\n\t\tlet hasDate = true\n\t\tlet hasTime = true\n\t\tlet offset: Offset = 'Z'\n\n\t\tif (typeof date === 'string') {\n\t\t\tlet match = date.match(DATE_TIME_RE)\n\t\t\tif (match) {\n\t\t\t\tif (!match[1]) {\n\t\t\t\t\thasDate = false\n\t\t\t\t\tdate = `0000-01-01T${date}`\n\t\t\t\t}\n\n\t\t\t\thasTime = !!match[2]\n\t\t\t\t// Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n\t\t\t\thasTime && date[10] === ' ' && (date = date.replace(' ', 'T'))\n\t\t\t\t// Do not allow rollover hours.\n\t\t\t\tif (match[2] && +match[2] > 23) {\n\t\t\t\t\tdate = ''\n\t\t\t\t} else {\n\t\t\t\t\toffset = match[3] || null\n\t\t\t\t\tdate = date.toUpperCase()\n\t\t\t\t\tif (!offset && hasTime) date += 'Z'\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdate = ''\n\t\t\t}\n\t\t}\n\n\t\tsuper(date)\n\t\tif (!isNaN(this.getTime())) {\n\t\t\tthis.#hasDate = hasDate\n\t\t\tthis.#hasTime = hasTime\n\t\t\tthis.#offset = offset\n\t\t}\n\t}\n\n\tisDateTime() {\n\t\treturn this.#hasDate && this.#hasTime\n\t}\n\n\tisLocal() {\n\t\treturn !this.#hasDate || !this.#hasTime || !this.#offset\n\t}\n\n\tisDate() {\n\t\treturn this.#hasDate && !this.#hasTime\n\t}\n\n\tisTime() {\n\t\treturn this.#hasTime && !this.#hasDate\n\t}\n\n\tisValid() {\n\t\treturn this.#hasDate || this.#hasTime\n\t}\n\n\toverride toISOString() {\n\t\tlet iso = super.toISOString()\n\n\t\t// Local Date\n\t\tif (this.isDate())\n\t\t\treturn iso.slice(0, 10)\n\n\t\t// Local Time\n\t\tif (this.isTime())\n\t\t\treturn iso.slice(11, 23)\n\n\t\t// Local DateTime\n\t\tif (this.#offset === null)\n\t\t\treturn iso.slice(0, -1)\n\n\t\t// Offset DateTime\n\t\tif (this.#offset === 'Z')\n\t\t\treturn iso\n\n\t\t// This part is quite annoying: JS strips the original timezone from the ISO string representation\n\t\t// Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n\n\t\tlet offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6))\n\t\toffset = this.#offset[0] === '-' ? offset : -offset\n\n\t\tlet offsetDate = new Date(this.getTime() - (offset * 60e3))\n\t\treturn offsetDate.toISOString().slice(0, -1) + this.#offset\n\t}\n\n\tstatic wrapAsOffsetDateTime(jsDate: Date, offset = 'Z') {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#offset = offset\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalDateTime(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalDate(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#hasTime = false\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n\n\tstatic wrapAsLocalTime(jsDate: Date) {\n\t\tlet date = new TomlDate(jsDate)\n\t\tdate.#hasDate = false\n\t\tdate.#offset = null\n\t\treturn date\n\t}\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\ntype TomlErrorOptions = ErrorOptions & {\n\ttoml: string\n\tptr: number\n}\n\nfunction getLineColFromPtr(string: string, ptr: number): [number, number] {\n\tlet lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g)\n\treturn [lines.length, lines.pop()!.length + 1]\n}\n\nfunction makeCodeBlock(string: string, line: number, column: number) {\n\tlet lines = string.split(/\\r\\n|\\n|\\r/g)\n\tlet codeblock = ''\n\n\tlet numberLen = (Math.log10(line + 1) | 0) + 1\n\n\tfor (let i = line - 1; i <= line + 1; i++) {\n\t\tlet l = lines[i - 1]\n\t\tif (!l) continue\n\n\t\tcodeblock += i.toString().padEnd(numberLen, ' ')\n\t\tcodeblock += ': '\n\t\tcodeblock += l\n\t\tcodeblock += '\\n'\n\n\t\tif (i === line) {\n\t\t\tcodeblock += ' '.repeat(numberLen + column + 2)\n\t\t\tcodeblock += '^\\n'\n\t\t}\n\t}\n\n\treturn codeblock\n}\n\nexport class TomlError extends Error {\n\tline: number\n\tcolumn: number\n\tcodeblock: string\n\n\tconstructor(message: string, options: TomlErrorOptions) {\n\t\tconst [line, column] = getLineColFromPtr(options.toml, options.ptr)\n\t\tconst codeblock = makeCodeBlock(options.toml, line, column)\n\n\t\tsuper(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options)\n\t\tthis.line = line\n\t\tthis.column = column\n\t\tthis.codeblock = codeblock\n\t}\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { TomlDate } from './date.js'\nimport { TomlError } from './error.js'\n\n// let CTRL_REGEX = /[\\x00-\\x08\\x0f-\\x1f\\x7f]/\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/\nlet LEADING_ZERO = /^[+-]?0[0-9_]/\n\nexport function parseString(str: string, ptr: number): [string, number] {\n\tlet c = str[ptr++]!\n\tlet first = c\n\tlet isLiteral = c === \"'\"\n\tlet isMultiline = c === str[ptr] && c === str[ptr + 1]\n\tif (isMultiline) {\n\t\t// Trim initial newline\n\t\tif (str[ptr += 2] === '\\n') ptr++\n\t\telse if (str[ptr] === '\\r' && str[ptr + 1] === '\\n') ptr += 2\n\t}\n\n\t/*\n\tThe fast path does not seem to bring significant performance gains, so it's commented out.\n\tKept for reference and/or future fafoing.\n\n\tWithout: spec 5.08 \u00B5s/iter 3.88 ipc (99.44% cache) 23.90 branch misses 28.61k cycles 111.01k instructions\n\t 5MB 115.73 ms/iter 2.51 ipc (98.36% cache) 3.12M branch misses 619.30M cycles 1.56G instructions\n\n\tWith: spec 5.09 \u00B5s/iter 3.90 ipc (99.46% cache) 24.42 branch misses 28.57k cycles 111.49k instructions\n\t 5MB 113.89 ms/iter 2.47 ipc (98.38% cache) 3.12M branch misses 611.94M cycles 1.51G instructions\n\n\tif (c === \"'\") {\n\t\t// Literal strings fast path - no transform needs to occur; just grab the str and that's it\n\t\tlet endPtr = str.indexOf(isMultiline ? \"'''\" : \"'\", ptr)\n\t\tif (endPtr < 0) {\n\t\t\tthrow new TomlError(\"unfinished string literal\", { toml: str, ptr })\n\t\t}\n\n\t\tif (isMultiline) {\n\t\t\t// If the string ends with 4-5 quotes, then the first 1-2 are part of the string\n\t\t\tif (str[endPtr + 3] === \"'\") endPtr++\n\t\t\tif (str[endPtr + 3] === \"'\") endPtr++\n\t\t}\n\n\t\tlet string = str.slice(ptr, endPtr)\n\t\tif (CTRL_REGEX.test(string)) {\n\t\t\tlet match = string.match(CTRL_REGEX)!\n\t\t\tthrow new TomlError('control characters are not allowed in strings', { toml: str, ptr: ptr + (match.index ?? 0) })\n\t\t}\n\t\treturn [string, endPtr + (isMultiline ? 3 : 1)]\n\t}\n\t*/\n\n\tlet parsed = ''\n\tlet sliceStart = ptr\n\n\t// states:\n\t// 0 - decoding\n\t// 1 - decoding escape\n\t// 2 - whitespace escape (no newline encountered yet, must fail on non-whitespace)\n\t// 3 - whitespace escape (newline encountered, allowed to transition back to normal decode)\n\tlet state = 0\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tc = str[i]!\n\n\t\t// Deal with newlines first, since that simplifies control character checking and handling across all states\n\t\tif (isMultiline && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n'))) {\n\t\t\tstate = state && 3\n\t\t}\n\n\t\t// Control characters are banned in TOML, so we throw an error if we encounter them\n\t\telse if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n\t\t\tthrow new TomlError('control characters are not allowed in strings', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: i,\n\t\t\t})\n\t\t}\n\n\t\t// The string might terminate while we're parsing through a newline escape.\n\t\t// It must have encountered a newline; otherwise, it'll simply fail in another branch.\n\t\telse if ((!state || state === 3) && c === first && (!isMultiline || (str[i + 1] === first && str[i + 2] === first))) {\n\t\t\tif (isMultiline) {\n\t\t\t\t// If the string ends with 4-5 quotes, then the first 1-2 are part of the string\n\t\t\t\tif (str[i + 3] === first) i++\n\t\t\t\tif (str[i + 3] === first) i++\n\t\t\t}\n\n\t\t\treturn [\n\t\t\t\t// If we're in a newline escape still, then there's nothing to add.\n\t\t\t\t// Also try to avoid concat if there's nothing to add to parsed, or nothing has been added to parsed.\n\t\t\t\tstate ? parsed : parsed + str.slice(sliceStart, i),\n\t\t\t\ti + (isMultiline ? 3 : 1),\n\t\t\t]\n\t\t}\n\n\t\telse if (!state) {\n\t\t\tif (!isLiteral && c === '\\\\') {\n\t\t\t\tparsed += str.slice(sliceStart, (sliceStart = i))\n\t\t\t\tstate = 1\n\t\t\t}\n\t\t}\n\n\t\telse if (state === 1) {\n\t\t\tif (c === 'x' || c === 'u' || c === 'U') { // Unicode escape\n\t\t\t\tlet value = 0\n\t\t\t\tlet len = c === 'x' ? 2 : c === 'u' ? 4 : 8\n\t\t\t\tfor (let j = 0; j < len; j++, i++) {\n\t\t\t\t\tlet hex = str.charCodeAt(i + 1)\n\t\t\t\t\tlet digit =\n\t\t\t\t\t\t/* 0-9 */ hex >= 0x30 && hex <= 0x39 ? hex - 0x30 :\n\t\t\t\t\t\t/* A-F */ hex >= 0x41 && hex <= 0x46 ? hex - 0x41 + 10 :\n\t\t\t\t\t\t/* a-f */ hex >= 0x61 && hex <= 0x66 ? hex - 0x61 + 10 : -1\n\n\t\t\t\t\tif (digit < 0) throw new TomlError('invalid non-hex character in unicode escape', { toml: str, ptr: i + 1 })\n\t\t\t\t\tvalue = (value << 4) | digit\n\t\t\t\t}\n\n\t\t\t\t// Because JS does bitwise on signed 32bit integers, all 0xfzzzzzzz values are actually seen as negative\n\t\t\t\tif (value < 0 || value > 0x10ffff || (value >= 0xd800 && value <= 0xdfff)) {\n\t\t\t\t\tthrow new TomlError('invalid unicode escape', { toml: str, ptr: i })\n\t\t\t\t}\n\n\t\t\t\tparsed += String.fromCodePoint(value)\n\t\t\t\tsliceStart = i + 1\n\t\t\t\tstate = 0\n\t\t\t}\n\n\t\t\telse if (c === ' ' || c === '\\t') { // If it was a newline, it'd have been handled earlier\n\t\t\t\tstate = 2\n\t\t\t}\n\n\t\t\telse {\n\t\t\t\tif (c === 'b') parsed += '\\b'\n\t\t\t\telse if (c === 't') parsed += '\\t'\n\t\t\t\telse if (c === 'n') parsed += '\\n'\n\t\t\t\telse if (c === 'f') parsed += '\\f'\n\t\t\t\telse if (c === 'r') parsed += '\\r'\n\t\t\t\telse if (c === 'e') parsed += '\\x1b'\n\t\t\t\telse if (c === '\"') parsed += '\"'\n\t\t\t\telse if (c === '\\\\') parsed += '\\\\'\n\t\t\t\telse throw new TomlError('unrecognized escape sequence', { toml: str, ptr: i })\n\t\t\t\tsliceStart = i + 1\n\t\t\t\tstate = 0\n\t\t\t}\n\t\t}\n\n\t\telse if (c !== ' ' && c !== '\\t') {\n\t\t\tif (state === 2) {\n\t\t\t\tthrow new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: sliceStart,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\t// State cannot be zero, or we'd have branched earlier already.\n\t\t\t// If it's a backslash, immediately transition to the escape state so it can be processed.\n\t\t\tstate = !isLiteral && c === '\\\\' ? 1 : 0\n\t\t\tsliceStart = i\n\t\t}\n\t}\n\n\tthrow new TomlError('unfinished string', { toml: str, ptr })\n}\n\nexport type IntegersAsBigInt = undefined | boolean | 'asNeeded'\n\nexport function parseValue(value: string, toml: string, ptr: number, integersAsBigInt: IntegersAsBigInt): boolean | number | bigint | TomlDate {\n\t// Constant values\n\tif (value === 'true') return true\n\tif (value === 'false') return false\n\tif (value === '-inf') return -Infinity\n\tif (value === 'inf' || value === '+inf') return Infinity\n\tif (value === 'nan' || value === '+nan' || value === '-nan') return NaN\n\n\t// Avoid FP representation of -0\n\tif (value === '-0') return integersAsBigInt ? 0n : 0\n\n\t// Numbers\n\tlet isInt = INT_REGEX.test(value)\n\tif (isInt || FLOAT_REGEX.test(value)) {\n\t\tif (LEADING_ZERO.test(value)) {\n\t\t\tthrow new TomlError('leading zeroes are not allowed', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\n\t\tvalue = value.replace(/_/g, '')\n\t\tlet numeric: number | bigint = +value\n\n\t\tif (isNaN(numeric)) {\n\t\t\tthrow new TomlError('invalid number', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\n\t\tif (isInt) {\n\t\t\tif ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n\t\t\t\tthrow new TomlError('integer value cannot be represented losslessly', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (isInt || integersAsBigInt === true) numeric = BigInt(value)\n\t\t}\n\n\t\treturn numeric\n\t}\n\n\tconst date = new TomlDate(value)\n\tif (!date.isValid()) {\n\t\tthrow new TomlError('invalid value', {\n\t\t\ttoml: toml,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn date\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport type { TomlDate } from './date.js'\nimport { TomlError } from './error.js'\n\nexport type TomlPrimitive = string | number | bigint | boolean | TomlDate\nexport type TomlTable = { [key: string]: TomlValue }\nexport type TomlValue = TomlPrimitive | TomlValue[] | TomlTable\n\nexport type TomlTableWithoutBigInt = { [key: string]: TomlValueWithoutBigInt }\nexport type TomlValueWithoutBigInt = Exclude<TomlPrimitive, bigint> | TomlValueWithoutBigInt[] | TomlTableWithoutBigInt\n\nexport function indexOfNewline(str: string, start = 0, end = str.length) {\n\tlet idx = str.indexOf('\\n', start)\n\tif (str[idx - 1] === '\\r') idx--\n\treturn idx <= end ? idx : -1\n}\n\nexport function skipComment(str: string, ptr: number) {\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tlet c = str[i]!\n\t\tif (c === '\\n')\n\t\t\treturn i\n\n\t\tif (c === '\\r' && str[i + 1] === '\\n')\n\t\t\treturn i + 1\n\n\t\tif ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n\t\t\tthrow new TomlError('control characters are not allowed in comments', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\t}\n\n\treturn str.length\n}\n\nexport function skipVoid(str: string, ptr: number, banNewLines?: boolean, banComments?: boolean): number {\n\tlet c\n\twhile (1) {\n\t\twhile ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || (c === '\\r' && str[ptr + 1] === '\\n')))) ptr++\n\n\t\t// Tucking the return statement here would save 5 characters >:)\n\t\t// But TypeScript fails to detect there is no way to exit the loop so it complains about the lack of final return\n\t\tif (banComments || c !== '#') break\n\n\t\tptr = skipComment(str, ptr)\n\t}\n\n\treturn ptr\n}\n\nexport function skipUntil(str: string, ptr: number, sep: string, end?: string, banNewLines: boolean = false) {\n\tif (!end) {\n\t\tptr = indexOfNewline(str, ptr)\n\t\treturn ptr < 0 ? str.length : ptr\n\t}\n\n\tfor (let i = ptr; i < str.length; i++) {\n\t\tlet c = str[i]\n\t\tif (c === '#') {\n\t\t\ti = indexOfNewline(str, i)\n\t\t} else if (c === sep) {\n\t\t\treturn i + 1\n\t\t} else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n\t\t\treturn i\n\t\t}\n\t}\n\n\tthrow new TomlError('cannot find end of structure', {\n\t\ttoml: str,\n\t\tptr: ptr,\n\t})\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { type IntegersAsBigInt, parseString, parseValue } from './primitive.js'\nimport { parseArray, parseInlineTable } from './struct.js'\nimport { skipVoid, skipUntil, skipComment, type TomlValue } from './util.js'\nimport { TomlError } from './error.js'\n\nfunction sliceAndTrimEndOf(str: string, startPtr: number, endPtr: number): [string, number] {\n\tlet value = str.slice(startPtr, endPtr)\n\n\tlet commentIdx = value.indexOf('#')\n\tif (commentIdx > -1) {\n\t\t// The call to skipComment allows to \"validate\" the comment\n\t\t// (absence of control characters)\n\t\tskipComment(str, commentIdx)\n\t\tvalue = value.slice(0, commentIdx)\n\t}\n\n\treturn [value.trimEnd(), commentIdx]\n}\n\nexport function extractValue(str: string, ptr: number, end: string | undefined, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlValue, number] {\n\tif (depth === 0) {\n\t\tthrow new TomlError('document contains excessively nested structures. aborting.', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tlet c = str[ptr]\n\tif (c === '[' || c === '{') {\n\t\tlet [value, endPtr] = c === '['\n\t\t\t? parseArray(str, ptr, depth, integersAsBigInt)\n\t\t\t: parseInlineTable(str, ptr, depth, integersAsBigInt)\n\n\t\tif (end) {\n\t\t\tendPtr = skipVoid(str, endPtr)\n\t\t\tif (str[endPtr] === ',') endPtr++\n\t\t\telse if (str[endPtr] !== end) {\n\t\t\t\tthrow new TomlError('expected comma or end of structure', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: endPtr,\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn [value, endPtr]\n\t}\n\n\tif (c === '\"' || c === \"'\") {\n\t\tlet [parsed, endPtr] = parseString(str, ptr)\n\t\tif (end) {\n\t\t\tendPtr = skipVoid(str, endPtr)\n\n\t\t\tif (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n\t\t\t\tthrow new TomlError('unexpected character encountered', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: endPtr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (str[endPtr] === ',') endPtr++\n\t\t}\n\n\t\treturn [parsed, endPtr]\n\t}\n\n\tlet endPtr = skipUntil(str, ptr, ',', end)\n\tlet slice = sliceAndTrimEndOf(str, ptr, endPtr - (str[endPtr - 1] === ',' ? 1 : 0))\n\tif (!slice[0]) {\n\t\tthrow new TomlError('incomplete key-value declaration: no value specified', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tif (end && slice[1] > -1) {\n\t\tendPtr = skipVoid(str, ptr + slice[1])\n\t\tif (str[endPtr] === ',') endPtr++\n\t}\n\n\treturn [\n\t\tparseValue(slice[0], str, ptr, integersAsBigInt),\n\t\tendPtr,\n\t]\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { type IntegersAsBigInt, parseString } from './primitive.js'\nimport { extractValue } from './extract.js'\nimport { indexOfNewline, skipComment, skipVoid, type TomlTable, type TomlValue } from './util.js'\nimport { TomlError } from './error.js'\n\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/\n\nexport function parseKey(str: string, ptr: number, end = '='): [string[], number] {\n\tlet dot = ptr - 1\n\tlet parsed = []\n\n\tlet endPtr = str.indexOf(end, ptr)\n\tif (endPtr < 0) {\n\t\tthrow new TomlError('incomplete key-value: cannot find end of key', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\tdo {\n\t\tlet c = str[(ptr = ++dot)]\n\n\t\t// If it's whitespace, ignore\n\t\tif (c !== ' ' && c !== '\\t') {\n\t\t\t// If it's a string\n\t\t\tif (c === '\"' || c === \"'\") {\n\t\t\t\tif (c === str[ptr + 1] && c === str[ptr + 2]) {\n\t\t\t\t\tthrow new TomlError('multiline strings are not allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tlet [part, eos] = parseString(str, ptr)\n\t\t\t\tdot = str.indexOf('.', eos)\n\n\t\t\t\tlet strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot)\n\t\t\t\tlet newLine = indexOfNewline(strEnd)\n\t\t\t\tif (newLine > -1) {\n\t\t\t\t\tthrow new TomlError('newlines are not allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr + dot + newLine,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (strEnd.trimStart()) {\n\t\t\t\t\tthrow new TomlError('found extra tokens after the string part', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: eos,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (endPtr < eos) {\n\t\t\t\t\tendPtr = str.indexOf(end, eos)\n\t\t\t\t\tif (endPtr < 0) {\n\t\t\t\t\t\tthrow new TomlError('incomplete key-value: cannot find end of key', {\n\t\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tparsed.push(part)\n\t\t\t} else {\n\t\t\t\t// Normal raw key part consumption and validation\n\t\t\t\tdot = str.indexOf('.', ptr)\n\t\t\t\tlet part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot)\n\t\t\t\tif (!KEY_PART_RE.test(part)) {\n\t\t\t\t\tthrow new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tparsed.push(part.trimEnd())\n\t\t\t}\n\t\t}\n\t\t// Until there's no more dot\n\t} while (dot + 1 && dot < endPtr)\n\n\treturn [parsed, skipVoid(str, endPtr + 1, true, true)]\n}\n\nexport function parseInlineTable(str: string, ptr: number, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlTable, number] {\n\tlet res: TomlTable = {}\n\tlet seen = new Set()\n\tlet c: string\n\n\tptr++\n\twhile ((c = str[ptr++]!) !== '}' && c) {\n\t\tif (c === ',') {\n\t\t\tthrow new TomlError('expected value, found comma', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr - 1,\n\t\t\t})\n\t\t} else if (c === '#') ptr = skipComment(str, ptr)\n\t\telse if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n\t\t\tlet k: string\n\t\t\tlet t: any = res\n\t\t\tlet hasOwn = false\n\n\t\t\tlet [key, keyEndPtr] = parseKey(str, ptr - 1)\n\t\t\tfor (let i = 0; i < key.length; i++) {\n\t\t\t\tif (i) t = hasOwn! ? t[k!] : (t[k!] = {})\n\n\t\t\t\tk = key[i]!\n\t\t\t\tif ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n\t\t\t\t\tthrow new TomlError('trying to redefine an already defined value', {\n\t\t\t\t\t\ttoml: str,\n\t\t\t\t\t\tptr: ptr,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (!hasOwn && k === '__proto__') {\n\t\t\t\t\tObject.defineProperty(t, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hasOwn) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined value', {\n\t\t\t\t\ttoml: str,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt)\n\t\t\tseen.add(value)\n\n\t\t\tt[k!] = value\n\t\t\tptr = valueEndPtr\n\t\t}\n\t}\n\n\tif (!c) {\n\t\tthrow new TomlError('unfinished table encountered', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn [res, ptr]\n}\n\nexport function parseArray(str: string, ptr: number, depth: number, integersAsBigInt: IntegersAsBigInt): [TomlValue[], number] {\n\tlet res: TomlValue[] = []\n\tlet c\n\n\tptr++\n\twhile ((c = str[ptr++]) !== ']' && c) {\n\t\tif (c === ',') {\n\t\t\tthrow new TomlError('expected value, found comma', {\n\t\t\t\ttoml: str,\n\t\t\t\tptr: ptr - 1,\n\t\t\t})\n\t\t} else if (c === '#') ptr = skipComment(str, ptr)\n\t\telse if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n\t\t\tlet e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt)\n\t\t\tres.push(e[0])\n\t\t\tptr = e[1]\n\t\t}\n\t}\n\n\tif (!c) {\n\t\tthrow new TomlError('unfinished array encountered', {\n\t\t\ttoml: str,\n\t\t\tptr: ptr,\n\t\t})\n\t}\n\n\treturn [res, ptr]\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport type { IntegersAsBigInt } from './primitive.js'\nimport { parseKey } from './struct.js'\nimport { extractValue } from './extract.js'\nimport { skipVoid, type TomlTable, type TomlTableWithoutBigInt } from './util.js'\nimport { TomlError } from './error.js'\n\nconst enum Type { DOTTED, EXPLICIT, ARRAY, ARRAY_DOTTED }\n\ntype MetaState = { t: Type; d: boolean; i: number; c: MetaRecord }\ntype MetaRecord = { [k: string]: MetaState }\ntype PeekResult = [string, TomlTable, MetaRecord] | null\n\nfunction peekTable(key: string[], table: TomlTable, meta: MetaRecord, type: Type): PeekResult {\n\tlet t: any = table\n\tlet m = meta\n\tlet k: string\n\tlet hasOwn = false\n\tlet state: MetaState\n\n\tfor (let i = 0; i < key.length; i++) {\n\t\tif (i) {\n\t\t\tt = hasOwn! ? t[k!] : (t[k!] = {})\n\t\t\tm = (state = m[k!]!).c\n\n\t\t\tif (type === Type.DOTTED && (state.t === Type.EXPLICIT || state.t === Type.ARRAY)) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\tif (state.t === Type.ARRAY) {\n\t\t\t\tlet l = t.length - 1\n\t\t\t\tt = t[l]\n\t\t\t\tm = m[l]!.c\n\t\t\t}\n\t\t}\n\n\t\tk = key[i]!\n\t\tif ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === Type.DOTTED && m[k]?.d) {\n\t\t\treturn null\n\t\t}\n\n\t\tif (!hasOwn) {\n\t\t\tif (k === '__proto__') {\n\t\t\t\tObject.defineProperty(t, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t\tObject.defineProperty(m, k, { enumerable: true, configurable: true, writable: true })\n\t\t\t}\n\n\t\t\tm[k] = {\n\t\t\t\tt: i < key.length - 1 && type === Type.ARRAY\n\t\t\t\t\t? Type.ARRAY_DOTTED\n\t\t\t\t\t: type,\n\t\t\t\td: false,\n\t\t\t\ti: 0,\n\t\t\t\tc: {},\n\t\t\t}\n\t\t}\n\t}\n\n\tstate = m[k!]!\n\tif (state.t !== type && !(type === Type.EXPLICIT && state.t === Type.ARRAY_DOTTED)) {\n\t\t// Bad key type!\n\t\treturn null\n\t}\n\n\tif (type === Type.ARRAY) {\n\t\tif (!state.d) {\n\t\t\tstate.d = true\n\t\t\tt[k!] = []\n\t\t}\n\n\t\tt[k!].push(t = {})\n\t\tstate.c[state.i++] = (state = { t: Type.EXPLICIT, d: false, i: 0, c: {} })\n\t}\n\n\tif (state.d) {\n\t\t// Redefining a table!\n\t\treturn null\n\t}\n\n\tstate.d = true\n\tif (type === Type.EXPLICIT) {\n\t\tt = hasOwn ? t[k!] : (t[k!] = {})\n\t} else if (type === Type.DOTTED && hasOwn) {\n\t\treturn null\n\t}\n\n\treturn [k!, t, state.c]\n}\n\nexport interface ParseOptions {\n\tmaxDepth?: number\n\tintegersAsBigInt?: IntegersAsBigInt\n}\n\nexport function parse(toml: string, options?: ParseOptions & { integersAsBigInt: Exclude<IntegersAsBigInt, undefined | false> }): TomlTable\nexport function parse(toml: string, options?: ParseOptions): TomlTableWithoutBigInt\nexport function parse(toml: string, { maxDepth = 1000, integersAsBigInt }: ParseOptions = {}): TomlTable {\n\tlet res = {}\n\tlet meta = {}\n\n\tlet tbl = res\n\tlet m = meta\n\n\tfor (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n\t\tif (toml[ptr] === '[') {\n\t\t\tlet isTableArray = toml[++ptr] === '['\n\t\t\tlet k = parseKey(toml, (ptr += +isTableArray), ']')\n\n\t\t\tif (isTableArray) {\n\t\t\t\tif (toml[k[1] - 1] !== ']') {\n\t\t\t\t\tthrow new TomlError('expected end of table declaration', {\n\t\t\t\t\t\ttoml: toml,\n\t\t\t\t\t\tptr: k[1] - 1,\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tk[1]++\n\t\t\t}\n\n\t\t\tlet p = peekTable(k[0], res, meta, isTableArray ? Type.ARRAY : Type.EXPLICIT)\n\t\t\tif (!p) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined table or value', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tm = p[2]\n\t\t\ttbl = p[1]\n\t\t\tptr = k[1]\n\t\t} else {\n\t\t\tlet k = parseKey(toml, ptr)\n\t\t\tlet p = peekTable(k[0], tbl, m, Type.DOTTED)\n\t\t\tif (!p) {\n\t\t\t\tthrow new TomlError('trying to redefine an already defined table or value', {\n\t\t\t\t\ttoml: toml,\n\t\t\t\t\tptr: ptr,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt)\n\t\t\tp[1][p[0]] = v[0]\n\t\t\tptr = v[1]\n\t\t}\n\n\t\tptr = skipVoid(toml, ptr, true)\n\t\tif (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n\t\t\tthrow new TomlError('each key-value declaration must be followed by an end-of-line', {\n\t\t\t\ttoml: toml,\n\t\t\t\tptr: ptr,\n\t\t\t})\n\t\t}\n\t\tptr = skipVoid(toml, ptr)\n\t}\n\n\treturn res\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nlet BARE_KEY = /^[a-z0-9-_]+$/i\n\ntype ExtendedType = ReturnType<typeof extendedTypeOf>\nfunction extendedTypeOf(obj: any) {\n\tlet type = typeof obj\n\tif (type === 'object') {\n\t\tif (Array.isArray(obj)) return 'array'\n\t\tif (obj instanceof Date) return 'date'\n\t}\n\n\treturn type\n}\n\nfunction isArrayOfTables(obj: any[]) {\n\tfor (let i = 0; i < obj.length; i++) {\n\t\tif (extendedTypeOf(obj[i]) !== 'object') return false\n\t}\n\n\treturn obj.length != 0\n}\n\nfunction formatString(s: string) {\n\treturn JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f')\n}\n\nfunction stringifyValue(val: any, type: ExtendedType, depth: number, numberAsFloat: boolean) {\n\tif (depth === 0) {\n\t\tthrow new Error('Could not stringify the object: maximum object depth exceeded')\n\t}\n\n\tif (type === 'number') {\n\t\tif (isNaN(val)) return 'nan'\n\t\tif (val === Infinity) return 'inf'\n\t\tif (val === -Infinity) return '-inf'\n\t\tif (Number.isInteger(val) && (numberAsFloat || !Number.isSafeInteger(val))) return val.toFixed(1)\n\t\treturn val.toString()\n\t}\n\n\tif (type === 'bigint' || type === 'boolean') {\n\t\treturn val.toString()\n\t}\n\n\tif (type === 'string') {\n\t\treturn formatString(val)\n\t}\n\n\tif (type === 'date') {\n\t\tif (isNaN(val.getTime())) {\n\t\t\tthrow new TypeError('cannot serialize invalid date')\n\t\t}\n\n\t\treturn val.toISOString()\n\t}\n\n\tif (type === 'object') {\n\t\treturn stringifyInlineTable(val, depth, numberAsFloat)\n\t}\n\n\tif (type === 'array') {\n\t\treturn stringifyArray(val, depth, numberAsFloat)\n\t}\n}\n\nfunction stringifyInlineTable(obj: any, depth: number, numberAsFloat: boolean) {\n\tlet keys = Object.keys(obj)\n\tif (keys.length === 0) return '{}'\n\n\tlet res = '{ '\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet k = keys[i]!\n\t\tif (i) res += ', '\n\n\t\tres += BARE_KEY.test(k) ? k : formatString(k)\n\t\tres += ' = '\n\t\tres += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat)\n\t}\n\n\treturn res + ' }'\n}\n\nfunction stringifyArray(array: any[], depth: number, numberAsFloat: boolean) {\n\tif (array.length === 0) return '[]'\n\n\tlet res = '[ '\n\tfor (let i = 0; i < array.length; i++) {\n\t\tif (i) res += ', '\n\t\tif (array[i] === null || array[i] === void 0) {\n\t\t\tthrow new TypeError('arrays cannot contain null or undefined values')\n\t\t}\n\n\t\tres += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat)\n\t}\n\n\treturn res + ' ]'\n}\n\nfunction stringifyArrayTable(array: any[], key: string, depth: number, numberAsFloat: boolean) {\n\tif (depth === 0) {\n\t\tthrow new Error('Could not stringify the object: maximum object depth exceeded')\n\t}\n\n\tlet res = ''\n\tfor (let i = 0; i < array.length; i++) {\n\t\tres += `${res && '\\n'}[[${key}]]\\n`\n\t\tres += stringifyTable(0, array[i], key, depth, numberAsFloat)\n\t}\n\n\treturn res\n}\n\nfunction stringifyTable(tableKey: string | 0, obj: any, prefix: string, depth: number, numberAsFloat: boolean) {\n\tif (depth === 0) {\n\t\tthrow new Error('Could not stringify the object: maximum object depth exceeded')\n\t}\n\n\tlet preamble = ''\n\tlet tables = ''\n\n\tlet keys = Object.keys(obj)\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tlet k = keys[i]!\n\t\tif (obj[k] !== null && obj[k] !== void 0) {\n\t\t\tlet type: ExtendedType = extendedTypeOf(obj[k])\n\t\t\tif (type === 'symbol' || type === 'function') {\n\t\t\t\tthrow new TypeError(`cannot serialize values of type '${type}'`)\n\t\t\t}\n\n\t\t\tlet key = BARE_KEY.test(k) ? k : formatString(k)\n\n\t\t\tif (type === 'array' && isArrayOfTables(obj[k])) {\n\t\t\t\ttables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat)\n\t\t\t} else if (type === 'object') {\n\t\t\t\tlet tblKey = prefix ? `${prefix}.${key}` : key\n\t\t\t\ttables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat)\n\t\t\t} else {\n\t\t\t\tpreamble += key\n\t\t\t\tpreamble += ' = '\n\t\t\t\tpreamble += stringifyValue(obj[k], type, depth, numberAsFloat)\n\t\t\t\tpreamble += '\\n'\n\t\t\t}\n\t\t}\n\t}\n\n\tif (tableKey && (preamble || !tables)) // Create table only if necessary\n\t\tpreamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`\n\n\treturn preamble && tables\n\t\t? `${preamble}\\n${tables}`\n\t\t: preamble || tables\n}\n\nexport function stringify (\n\tobj: any,\n\t{ maxDepth = 1000, numbersAsFloat = false }: { maxDepth?: number, numbersAsFloat?: boolean } = {},\n) {\n\tif (extendedTypeOf(obj) !== 'object') {\n\t\tthrow new TypeError('stringify can only be called with an object')\n\t}\n\n\tlet str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat)\n\tif (str[str.length - 1] !== '\\n') return str + '\\n'\n\treturn str\n}\n", "/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { parse } from './parse.js'\nimport { stringify } from './stringify.js'\n\nimport { TomlDate } from './date.js'\nimport { TomlError } from './error.js'\n\nexport type { TomlValue, TomlTable, TomlValueWithoutBigInt, TomlTableWithoutBigInt } from './util.js'\nexport default { parse, stringify, TomlDate, TomlError }\nexport { parse, stringify, TomlDate, TomlError }\n\nexport type {\n\t/** @deprecated use TomlValue instead */\n\tTomlValue as TomlPrimitive,\n} from './util.js'\n", "/** Bundled workspace agent catalog seeded when overlord.toml has no [agent_catalog]. */\nexport type CatalogAgent = {\n label: string;\n availableByDefault: boolean;\n models: Array<{ id: string; displayName: string; reasoningOptions: string[] }>;\n defaultModel: string | null;\n defaultReasoningEffort: string | null;\n reasoningLabel: string;\n};\n\nexport const BUNDLED_AGENT_CATALOG: Record<string, CatalogAgent> = {\n claude: {\n label: 'Claude Code',\n availableByDefault: true,\n models: [\n {\n id: 'claude-fable-5',\n displayName: 'Fable 5',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max', 'ultracode']\n },\n {\n id: 'claude-opus-4-8',\n displayName: 'Opus 4.8',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max', 'ultracode']\n },\n {\n id: 'claude-sonnet-5',\n displayName: 'Sonnet 5',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max', 'ultracode']\n },\n {\n id: 'claude-sonnet-4-6',\n displayName: 'Sonnet 4.6',\n reasoningOptions: ['low', 'medium', 'high', 'max']\n },\n { id: 'claude-haiku-4-5', displayName: 'Haiku 4.5', reasoningOptions: [] }\n ],\n defaultModel: null,\n defaultReasoningEffort: null,\n reasoningLabel: 'Thinking'\n },\n codex: {\n label: 'Codex',\n availableByDefault: true,\n models: [\n {\n id: 'gpt-5.4',\n displayName: 'GPT-5.4',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh']\n },\n\n {\n id: 'gpt-5.5',\n displayName: 'GPT-5.5',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh']\n },\n {\n id: 'gpt-5.6-sol',\n displayName: 'GPT-5.6 Sol',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max']\n },\n {\n id: 'gpt-5.6-luna',\n displayName: 'GPT-5.6 Luna',\n reasoningOptions: ['low', 'medium', 'high', 'xhigh', 'max']\n },\n {\n id: 'gpt-5.6-terra',\n displayName: 'GPT-5.6 Terra',\n reasoningOptions: ['none', 'low', 'medium', 'high', 'xhigh', 'max']\n }\n ],\n defaultModel: 'gpt-5.4',\n defaultReasoningEffort: 'medium',\n reasoningLabel: 'Effort'\n },\n cursor: {\n label: 'Cursor',\n availableByDefault: true,\n models: [\n { id: 'auto', displayName: 'Auto', reasoningOptions: [] },\n { id: 'composer-2.5', displayName: 'Composer 2.5', reasoningOptions: [] },\n {\n id: 'grok-4.5-fast-high',\n displayName: 'Grok 4.5 Fast High',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-fast-medium',\n displayName: 'Grok 4.5 Fast Medium',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-fast-xhigh',\n displayName: 'Grok 4.5 Fast Xhigh',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-high',\n displayName: 'Grok 4.5 High',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-medium',\n displayName: 'Grok 4.5 Medium',\n reasoningOptions: []\n },\n {\n id: 'grok-4.5-xhigh',\n displayName: 'Grok 4.5 Xhigh',\n reasoningOptions: []\n },\n {\n id: 'glm-5.2-high',\n displayName: 'GLM 5.2 High',\n reasoningOptions: []\n },\n {\n id: 'gpt-5.6-sol',\n displayName: 'GPT-5.6 Sol',\n reasoningOptions: []\n },\n\n {\n id: 'gpt-5.6-terra',\n displayName: 'GPT-5.6 Terra',\n reasoningOptions: []\n },\n {\n id: 'gpt-5.6-luna',\n displayName: 'GPT-5.6 Luna',\n reasoningOptions: []\n }\n ],\n defaultModel: 'auto',\n defaultReasoningEffort: null,\n reasoningLabel: 'Thinking'\n }\n};\n", "import { BUNDLED_AGENT_CATALOG, type CatalogAgent } from './agent-catalog-defaults.ts';\n\ntype TomlCatalogModel = {\n id?: string;\n display_name?: string;\n reasoning_options?: string[];\n};\n\ntype TomlCatalogAgent = {\n label?: string;\n available_by_default?: boolean;\n default_model?: string;\n default_reasoning_effort?: string;\n reasoning_label?: string;\n models?: TomlCatalogModel[];\n};\n\nfunction emptyToNull(value: string | undefined): string | null {\n if (value === undefined || value === '') return null;\n return value;\n}\n\nexport function parseAgentCatalogFromToml(raw: unknown): Record<string, CatalogAgent> | null {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n\n const agents: Record<string, CatalogAgent> = {};\n for (const [key, entry] of Object.entries(raw as Record<string, TomlCatalogAgent>)) {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;\n\n const models = (entry.models ?? [])\n .filter((model): model is TomlCatalogModel & { id: string } => {\n return Boolean(model && typeof model === 'object' && typeof model.id === 'string');\n })\n .map(model => ({\n id: model.id,\n displayName: model.display_name?.trim() || model.id,\n reasoningOptions: Array.isArray(model.reasoning_options)\n ? model.reasoning_options.filter((option): option is string => typeof option === 'string')\n : []\n }));\n\n if (!entry.label?.trim() || models.length === 0) continue;\n\n agents[key] = {\n label: entry.label.trim(),\n availableByDefault: entry.available_by_default !== false,\n models,\n defaultModel: emptyToNull(entry.default_model),\n defaultReasoningEffort: emptyToNull(entry.default_reasoning_effort),\n reasoningLabel: entry.reasoning_label?.trim() || 'Thinking'\n };\n }\n\n return Object.keys(agents).length > 0 ? agents : null;\n}\n\nfunction mergeAgentCatalogs({\n base,\n overrides\n}: {\n base: Record<string, CatalogAgent>;\n overrides: Record<string, CatalogAgent>;\n}): Record<string, CatalogAgent> {\n const merged = structuredClone(base);\n\n for (const [key, override] of Object.entries(overrides)) {\n const existing = merged[key];\n if (!existing) {\n merged[key] = structuredClone(override);\n continue;\n }\n\n const modelsById = new Map(existing.models.map(model => [model.id, model]));\n for (const model of override.models) {\n modelsById.set(model.id, model);\n }\n\n merged[key] = {\n ...existing,\n ...override,\n models: Array.from(modelsById.values())\n };\n }\n\n return merged;\n}\n\n/** Instance catalog: bundled defaults merged with optional overlord.toml overrides. */\nexport function resolveInstanceAgentCatalog({\n configCatalog\n}: {\n configCatalog: Record<string, CatalogAgent> | null;\n}): Record<string, CatalogAgent> {\n if (!configCatalog) {\n return structuredClone(BUNDLED_AGENT_CATALOG);\n }\n return mergeAgentCatalogs({ base: BUNDLED_AGENT_CATALOG, overrides: configCatalog });\n}\n", "import { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/** Minimal .env parser (dotenv-compatible `parse` only \u2014 avoids bundling CJS dotenv). */\nfunction parseDotenv(src: string): Record<string, string> {\n const obj: Record<string, string> = {};\n const line =\n /(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/gm;\n let lines = src.replace(/\\r\\n?/g, '\\n');\n let match: RegExpExecArray | null;\n while ((match = line.exec(lines)) !== null) {\n const key = match[1];\n if (!key) continue;\n let value = (match[2] ?? '').trim();\n const maybeQuote = value[0];\n value = value.replace(/^(['\"`])([\\s\\S]*)\\1$/m, '$2');\n if (maybeQuote === '\"') {\n value = value.replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r');\n }\n obj[key] = value;\n }\n return obj;\n}\n\nexport type EnvProfile = 'development' | 'production';\n\nexport function resolveEnvFileNames(profile: EnvProfile): string[] {\n return profile === 'production' ? ['.env.prod'] : ['.env.local'];\n}\n\n/** True when a built module lives inside an installed package (`node_modules`). */\nexport function isInstalledModulePath(moduleDir: string): boolean {\n return /[\\\\/]node_modules[\\\\/]/.test(moduleDir);\n}\n\n/**\n * True when the invoked `ovld` entrypoint came from an installed package path.\n * Node resolves package symlinks before exposing `import.meta.url`, so a globally\n * linked `overlord-cli` package can otherwise look like the in-repo source build.\n */\nexport function isInstalledCliEntrypointPath(entrypointPath: string): boolean {\n if (!entrypointPath) return false;\n if (isInstalledModulePath(entrypointPath)) return true;\n\n try {\n const stat = lstatSync(entrypointPath);\n if (!stat.isSymbolicLink()) return false;\n\n const target = readlinkSync(entrypointPath);\n const resolvedTarget = path.isAbsolute(target)\n ? target\n : path.resolve(path.dirname(entrypointPath), target);\n return isInstalledModulePath(resolvedTarget);\n } catch {\n return false;\n }\n}\n\n/**\n * Default env profile for a bare `ovld` invocation. The **installed/published**\n * CLI (under `node_modules`) runs as `production`: it never auto-loads `.env.local`\n * and never reads the dev-only `OVERLORD_BACKEND_URL_DEV`, so a development variable\n * can never leak into a production CLI even when it is run from inside a dev\n * checkout. Only the in-repo source build \u2014 and the dev/test tooling that runs it\n * (`yarn dev`, `with-ovld-home`) \u2014 defaults to `development`. Webapp/server and\n * desktop pass their own profile explicitly and are unaffected.\n */\nexport function detectCliEnvProfile(): EnvProfile {\n try {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n return isInstalledModulePath(moduleDir) || isInstalledCliEntrypointPath(process.argv[1] ?? '')\n ? 'production'\n : 'development';\n } catch {\n return 'development';\n }\n}\n\nfunction snapshotRuntimeEnv(): Set<string> {\n return new Set(\n Object.entries(process.env)\n .filter(([, value]) => Boolean(value?.trim()))\n .map(([key]) => key)\n );\n}\n\n/**\n * Snapshot of which env vars were set by the real process environment (shell\n * export, Docker/launcher injection) before this module ever loads a `.env`\n * file. Captured once at import time, which always runs before any call to\n * `loadEnvDefaults` below \u2014 so a later `isExplicitRuntimeEnv(key)` can tell a\n * genuine runtime override apart from a value that only exists because a\n * `.env` file backfilled it.\n */\nlet explicitRuntimeKeys = snapshotRuntimeEnv();\n\nexport function isExplicitRuntimeEnv(key: string): boolean {\n return explicitRuntimeKeys.has(key);\n}\n\n/**\n * True when the CLI is running inside an agent pod / container. A containerized\n * `ovld` must never persist its network context into the shared, host-mounted\n * `overlord.toml` (a context-specific value such as `host.docker.internal` would\n * then leak onto every host process that resolves the same file). Containers are\n * pure consumers of an injected runtime `OVERLORD_BACKEND_URL` instead.\n *\n * Detection prefers an explicit launcher-set marker (`OVERLORD_IN_POD`, runtime-\n * agnostic across Docker/podman/k8s), and falls back to the Docker-created\n * `/.dockerenv` sentinel so the guard still holds if a launcher predates the\n * marker. `OVERLORD_ALLOW_CONFIG_WRITE` is a deliberate escape hatch (e.g. baking\n * config into an image at build time).\n */\nexport function isRunningInContainer(): boolean {\n if (isTruthyEnv(process.env.OVERLORD_ALLOW_CONFIG_WRITE)) return false;\n if (isTruthyEnv(process.env.OVERLORD_IN_POD)) return true;\n return existsSync('/.dockerenv');\n}\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n const normalized = value?.trim().toLowerCase();\n return normalized === '1' || normalized === 'true' || normalized === 'yes';\n}\n\n/**\n * Profile-aware env resolution for keys mirrored in `overlord.toml`.\n * Development: explicit runtime > env file > toml > fallback.\n * Production: explicit runtime > toml > env file > fallback.\n */\nexport function resolveLayeredEnv({\n envKey,\n configValue,\n fallback = '',\n envProfile = 'development'\n}: {\n envKey: string;\n configValue: string;\n fallback?: string;\n envProfile?: EnvProfile;\n}): string {\n const value = process.env[envKey]?.trim();\n if (value && isExplicitRuntimeEnv(envKey)) return value;\n if (envProfile === 'development' && value) return value;\n if (configValue) return configValue;\n return value || fallback;\n}\n\n/**\n * Test-only: re-snapshot the runtime environment. Production code never calls\n * this \u2014 the snapshot is meant to be captured exactly once, before any `.env`\n * file is loaded, for the lifetime of a single process. Tests that mutate\n * `process.env` across cases within one process need to re-establish the\n * \"before .env loaded\" baseline themselves.\n */\nexport function resetExplicitRuntimeEnvForTests(): void {\n explicitRuntimeKeys = snapshotRuntimeEnv();\n}\n\n/**\n * Backfills `process.env` from the env file for `profile` in `dir`, without\n * overwriting any value already present. Development workflows read `.env.local`\n * only; production/packaged workflows read `.env.prod` only. Missing files are\n * silently skipped \u2014 most `ovld` invocations (global installs, arbitrary\n * working directories) have neither.\n */\nexport function loadEnvDefaults(dir: string, profile: EnvProfile = 'development'): void {\n for (const file of resolveEnvFileNames(profile)) {\n const filePath = path.join(dir, file);\n if (!existsSync(filePath)) continue;\n const parsed = parseDotenv(readFileSync(filePath, 'utf8'));\n for (const [key, value] of Object.entries(parsed)) {\n if (!process.env[key]?.trim()) {\n process.env[key] = normalizeEnvFileValue({ key, value, baseDir: path.dirname(filePath) });\n }\n }\n }\n}\n\nfunction normalizeEnvFileValue({\n key,\n value,\n baseDir\n}: {\n key: string;\n value: string;\n baseDir: string;\n}): string {\n if (key !== 'OVLD_HOME') return value;\n if (!value.trim() || path.isAbsolute(value)) return value;\n return path.resolve(baseDir, value);\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { parse } from 'smol-toml';\n\nimport { parseAgentCatalogFromToml } from './agent-catalog.ts';\nimport type { CatalogAgent } from './agent-catalog-defaults.ts';\nimport {\n detectCliEnvProfile,\n type EnvProfile,\n isExplicitRuntimeEnv,\n isRunningInContainer,\n loadEnvDefaults,\n resolveLayeredEnv\n} from './env.ts';\nimport { CliError } from './errors.ts';\n\n/**\n * Default profile for bare CLI calls: `production` for an installed binary,\n * `development` only for the source build. Keeps the dev-only\n * `OVERLORD_BACKEND_URL_DEV` / `.env.local` out of the production CLI. Callers\n * with their own context (backend, desktop) pass an explicit profile.\n */\nconst CLI_ENV_PROFILE: EnvProfile = detectCliEnvProfile();\n\nexport const DEFAULT_LOCAL_BACKEND_DIR = '~/.ovld';\nexport const DEFAULT_LOCAL_BACKEND_DATABASE_PATH = '~/.ovld/Overlord.sqlite';\nexport const DEFAULT_LOCAL_BACKEND_URL = 'http://127.0.0.1:4310';\n\n/** Ensure backend URLs are fetch-ready; agent pods often inject host:port without a scheme. */\nexport function normalizeBackendUrl(value: string): string {\n const trimmed = value.trim().replace(/\\/+$/, '');\n if (/^[a-z][a-z0-9+.-]*:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n return `http://${trimmed}`;\n}\n\n/** True when the configured backend is the loopback Local edition server. */\nexport function isLoopbackBackendUrl(backendUrl: string): boolean {\n try {\n const hostname = new URL(normalizeBackendUrl(backendUrl)).hostname;\n return hostname === '127.0.0.1' || hostname === 'localhost' || hostname === '::1';\n } catch {\n return false;\n }\n}\n\nexport type BackendMode = 'local' | 'cloud';\n\nexport type OverlordConfig = {\n instanceName: string;\n backendMode: BackendMode;\n backendUrl: string | null;\n /**\n * Developer override for the local SQLite location. Relative paths resolve\n * against the `overlord.toml` directory; absolute paths are used as-is.\n * `null` means use the per-user global default (`~/.ovld/Overlord.sqlite`).\n */\n databasePath: string | null;\n /**\n * Admin-configured cloud database connection string (e.g. a PostgreSQL URL)\n * for running Overlord against a hosted database. `null` means use the local\n * SQLite database at `databasePath`. Feeds the shared `resolveAdapter()`\n * selection point.\n */\n databaseUrl: string | null;\n webHost: string;\n webPort: number;\n sqlStudioEnabled: boolean;\n sqlStudioHost: string;\n sqlStudioPort: number;\n sqlStudioBinary: string;\n defaultAgent: string;\n defaultModel: string | null;\n /** Parsed from `[agent_catalog]`; merged over bundled defaults when seeding the workspace catalog. */\n agentCatalog: Record<string, CatalogAgent> | null;\n};\n\nconst DEFAULT_CONFIG: OverlordConfig = {\n instanceName: 'Local Overlord',\n backendMode: 'local',\n backendUrl: null,\n databasePath: null,\n databaseUrl: null,\n webHost: '127.0.0.1',\n webPort: 4310,\n sqlStudioEnabled: false,\n sqlStudioHost: '127.0.0.1',\n sqlStudioPort: 4311,\n sqlStudioBinary: 'sql-studio',\n defaultAgent: 'claude',\n defaultModel: null,\n agentCatalog: null\n};\n\nfunction tomlString(value: string): string {\n return JSON.stringify(value);\n}\n\ntype TomlConfig = {\n instance_name?: string;\n backend_mode?: string;\n backend_url?: string;\n database_path?: string;\n database_url?: string;\n web_host?: string;\n web_port?: number;\n sql_studio_enabled?: boolean;\n sql_studio_host?: string;\n sql_studio_port?: number;\n sql_studio_binary?: string;\n default_agent?: string;\n default_model?: string;\n agent_catalog?: unknown;\n};\n\nfunction parseTomlConfig(raw: string): TomlConfig {\n try {\n return parse(raw) as TomlConfig;\n } catch {\n return {};\n }\n}\n\nfunction configFromToml(toml: TomlConfig): OverlordConfig {\n const backendMode: BackendMode = toml.backend_mode === 'cloud' ? 'cloud' : 'local';\n return {\n instanceName: toml.instance_name ?? DEFAULT_CONFIG.instanceName,\n backendMode,\n backendUrl: toml.backend_url?.trim() ? toml.backend_url.trim() : null,\n databasePath: toml.database_path?.trim() ? toml.database_path.trim() : null,\n databaseUrl: toml.database_url?.trim() ? toml.database_url.trim() : null,\n webHost: toml.web_host ?? DEFAULT_CONFIG.webHost,\n webPort: typeof toml.web_port === 'number' ? toml.web_port : DEFAULT_CONFIG.webPort,\n sqlStudioEnabled:\n typeof toml.sql_studio_enabled === 'boolean'\n ? toml.sql_studio_enabled\n : DEFAULT_CONFIG.sqlStudioEnabled,\n sqlStudioHost: toml.sql_studio_host ?? DEFAULT_CONFIG.sqlStudioHost,\n sqlStudioPort:\n typeof toml.sql_studio_port === 'number'\n ? toml.sql_studio_port\n : DEFAULT_CONFIG.sqlStudioPort,\n sqlStudioBinary: toml.sql_studio_binary?.trim()\n ? toml.sql_studio_binary\n : DEFAULT_CONFIG.sqlStudioBinary,\n defaultAgent: toml.default_agent ?? DEFAULT_CONFIG.defaultAgent,\n defaultModel: toml.default_model?.trim() ? toml.default_model : null,\n agentCatalog: parseAgentCatalogFromToml(toml.agent_catalog)\n };\n}\n\nexport function resolveProjectRoot(startDir = process.cwd()): string {\n const configPath = findConfigPath(startDir);\n if (configPath) {\n return path.dirname(configPath);\n }\n return startDir;\n}\n\nexport function resolveRepoPath(relativePath: string, startDir = process.cwd()): string {\n return path.resolve(resolveProjectRoot(startDir), relativePath);\n}\n\nexport function findConfigPath(startDir = process.cwd()): string | null {\n let current = path.resolve(startDir);\n while (true) {\n const candidate = path.join(current, 'overlord.toml');\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n\nexport function resolveGlobalDataDir(): string {\n return process.env.OVLD_HOME?.trim() || path.join(os.homedir(), '.ovld');\n}\n\nexport function resolveGlobalConfigPath(): string {\n return path.join(resolveGlobalDataDir(), 'overlord.toml');\n}\n\nexport function findEffectiveConfigPath(startDir = process.cwd()): string | null {\n const localPath = findConfigPath(startDir);\n if (localPath) return localPath;\n\n const globalPath = resolveGlobalConfigPath();\n return existsSync(globalPath) ? globalPath : null;\n}\n\nexport function resolveConfigWritePath(startDir = process.cwd()): string {\n return findConfigPath(startDir) ?? resolveGlobalConfigPath();\n}\n\nexport function loadConfig(\n configPath?: string | null,\n envProfile: EnvProfile = CLI_ENV_PROFILE\n): OverlordConfig {\n const resolvedPath = configPath ?? findEffectiveConfigPath();\n loadEnvDefaults(resolvedPath ? path.dirname(resolvedPath) : process.cwd(), envProfile);\n\n if (!resolvedPath || !existsSync(resolvedPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n const raw = readFileSync(resolvedPath, 'utf8');\n return configFromToml(parseTomlConfig(raw));\n}\n\nexport function writeConfig({\n targetPath,\n config\n}: {\n targetPath: string;\n config: Partial<OverlordConfig>;\n}): void {\n // A containerized CLI must not persist config into the (host-mounted, shared)\n // `overlord.toml`: a context-specific value such as `host.docker.internal`\n // would leak onto every host process resolving the same file. Containers\n // consume an injected runtime `OVERLORD_BACKEND_URL` instead \u2014 see\n // `isRunningInContainer` and `resolveBackendUrl`. Use `OVERLORD_ALLOW_CONFIG_WRITE`\n // to bypass intentionally (e.g. baking config into an image at build time).\n if (isRunningInContainer()) {\n throw new CliError({\n message:\n 'Refusing to write overlord.toml from inside a container. Configure the backend with the OVERLORD_BACKEND_URL environment variable instead (set OVERLORD_ALLOW_CONFIG_WRITE=1 to override).'\n });\n }\n\n mkdirSync(path.dirname(targetPath), { recursive: true });\n const merged = { ...DEFAULT_CONFIG, ...config };\n const contents = `# Overlord local instance configuration\ninstance_name = ${tomlString(merged.instanceName)}\nbackend_mode = ${tomlString(merged.backendMode)}\n${merged.backendUrl ? `backend_url = ${tomlString(merged.backendUrl)}` : `backend_url = ${tomlString(DEFAULT_LOCAL_BACKEND_URL)}`}\n\n# Published CLI backend target.\n# Local mode expects a Desktop/local backend listening on the loopback URL.\n# Cloud mode points at a hosted Overlord backend.\n#\n# backend_mode = \"local\"\n# backend_url = \"http://127.0.0.1:4310\"\n# backend_mode = \"cloud\"\n# backend_url = \"https://overlord.example.com\"\n\n${merged.databasePath ? `database_path = ${tomlString(merged.databasePath)}` : '# database_path = \"\"'}\n# Legacy local-backend database location. The published npm CLI does not open\n# SQLite; these keys are consumed only by local backend packages such as Desktop.\n# database_path = \"./database/.local/Overlord.sqlite\"\n#\n# Legacy backend database URL for backend packages that talk directly to Postgres.\n${merged.databaseUrl ? `database_url = ${tomlString(merged.databaseUrl)}` : '# database_url = \"postgres://user:password@host:5432/overlord\"'}\nweb_host = ${tomlString(merged.webHost)}\nweb_port = ${merged.webPort}\nsql_studio_enabled = ${merged.sqlStudioEnabled}\nsql_studio_host = ${tomlString(merged.sqlStudioHost)}\nsql_studio_port = ${merged.sqlStudioPort}\nsql_studio_binary = ${tomlString(merged.sqlStudioBinary)}\ndefault_agent = ${tomlString(merged.defaultAgent)}\n${merged.defaultModel ? `default_model = ${tomlString(merged.defaultModel)}` : '# default_model = \"\"'}\n# Terminal launch settings live on user_execution_target_preferences.terminal_profile_json\n# for this user's local target fingerprint. Configure them with ovld setup.\n\n# Optional workspace agent catalog (merged over bundled defaults on first seed / refresh).\n# [agent_catalog.claude]\n# label = \"Claude Code\"\n# available_by_default = true\n# reasoning_label = \"Thinking\"\n#\n# [[agent_catalog.claude.models]]\n# id = \"claude-sonnet-4-6\"\n# display_name = \"Sonnet 4.6\"\n# reasoning_options = [\"low\", \"medium\", \"high\"]\n`;\n\n writeFileSync(targetPath, contents);\n}\n\nexport function hasExplicitBackendConfig(config: OverlordConfig): boolean {\n return Boolean(config.backendUrl?.trim());\n}\n\n/**\n * Expand a leading `~` (or `~/\u2026`) to the user's home directory. TOML strings\n * are not shell-expanded, so `database_path = \"~/.ovld/Overlord.sqlite\"` would\n * otherwise be treated as a relative `./~/\u2026` path. Other paths are returned\n * unchanged.\n */\nfunction expandTilde(input: string): string {\n if (input === '~') return os.homedir();\n if (input.startsWith('~/') || input.startsWith(`~${path.sep}`)) {\n return path.join(os.homedir(), input.slice(2));\n }\n return input;\n}\n\nexport function resolveDatabasePath(config: OverlordConfig, startDir = process.cwd()): string {\n // A real runtime override (shell export, container launcher) beats the\n // persisted `overlord.toml` value; an env-file-backfilled value does not \u2014 see\n // `isExplicitRuntimeEnv` in `env.ts`.\n const explicit = process.env.OVERLORD_SQLITE_PATH;\n if (explicit && isExplicitRuntimeEnv('OVERLORD_SQLITE_PATH')) {\n const expanded = expandTilde(explicit);\n return path.isAbsolute(expanded)\n ? expanded\n : path.resolve(resolveProjectRoot(startDir), expanded);\n }\n\n if (config.databasePath) {\n const expanded = expandTilde(config.databasePath);\n const configPath = findConfigPath(startDir);\n const baseDir = configPath ? path.dirname(configPath) : resolveProjectRoot(startDir);\n return path.isAbsolute(expanded) ? expanded : path.resolve(baseDir, expanded);\n }\n\n // No explicit runtime override or toml override: fall back to an env-file\n // baked-in default if present, otherwise the per-user global default.\n if (explicit) {\n const expanded = expandTilde(explicit);\n return path.isAbsolute(expanded)\n ? expanded\n : path.resolve(resolveProjectRoot(startDir), expanded);\n }\n\n return path.join(resolveGlobalDataDir(), 'Overlord.sqlite');\n}\n\nexport function resolveBackendUrl(\n config: OverlordConfig,\n envProfile: EnvProfile = CLI_ENV_PROFILE\n): string {\n // Precedence, highest first:\n // 1. an explicit runtime export of the channel's variable (shell / launcher);\n // 2. the per-instance `overlord.toml` `backend_url` (e.g. `ovld config set`);\n // 3. the profile env-file default (`.env.local`/`.env.prod`, backfilled);\n // 4. a hardcoded fallback.\n // Development and production read SEPARATE variables so the two channels never\n // collide: development uses `OVERLORD_BACKEND_URL_DEV` (`.env.local`), production\n // uses `OVERLORD_BACKEND_URL` (`.env.prod`). A backfilled env-file value is only a\n // default \u2014 an explicit `overlord.toml` (which is per-instance and uncommitted)\n // outranks it, so `ovld config set` / `ovld init` take effect as expected. Only a\n // deliberate shell export of the channel variable outranks the toml.\n const override = process.env.OVERLORD_BACKEND_URL?.trim();\n if (override && isExplicitRuntimeEnv('OVERLORD_BACKEND_URL')) {\n return normalizeBackendUrl(override);\n }\n\n const devOverride = process.env.OVERLORD_BACKEND_URL_DEV?.trim();\n if (\n envProfile === 'development' &&\n devOverride &&\n isExplicitRuntimeEnv('OVERLORD_BACKEND_URL_DEV')\n ) {\n return normalizeBackendUrl(devOverride);\n }\n\n if (config.backendUrl?.trim()) return normalizeBackendUrl(config.backendUrl.trim());\n\n if (envProfile === 'development') {\n return normalizeBackendUrl(devOverride || DEFAULT_LOCAL_BACKEND_URL);\n }\n return normalizeBackendUrl(override || DEFAULT_LOCAL_BACKEND_URL);\n}\n\n/**\n * Bridge the admin `database_url` from `overlord.toml` into `DATABASE_URL` so\n * the components that already resolve the database from the environment \u2014 the\n * auth layer and `resolveAdapter()` \u2014 coordinate with the toml without each\n * needing to re-read the config. An existing `DATABASE_URL` is left untouched.\n */\nexport function applyDatabaseEnv(config: OverlordConfig): void {\n if (config.databaseUrl && !process.env.DATABASE_URL?.trim()) {\n process.env.DATABASE_URL = config.databaseUrl;\n }\n}\n", "import { chmodSync, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\n\nexport type AuthCredentialType = 'session_bearer' | 'user_token';\n\nexport type StoredAuthCredentials = {\n type: AuthCredentialType;\n token: string;\n backendUrl: string;\n updatedAt: string;\n};\n\nexport function authCredentialsPath(): string {\n return path.join(resolveGlobalDataDir(), 'auth.json');\n}\n\nexport function readStoredAuthCredentials(): StoredAuthCredentials | null {\n const filePath = authCredentialsPath();\n if (!existsSync(filePath)) return null;\n try {\n const raw = JSON.parse(readFileSync(filePath, 'utf8')) as StoredAuthCredentials;\n if (typeof raw.token !== 'string' || !raw.token.trim()) return null;\n if (raw.type !== 'session_bearer' && raw.type !== 'user_token') return null;\n if (typeof raw.backendUrl !== 'string' || !raw.backendUrl.trim()) return null;\n return raw;\n } catch {\n return null;\n }\n}\n\nexport function writeStoredAuthCredentials({\n type,\n token,\n backendUrl\n}: {\n type: AuthCredentialType;\n token: string;\n backendUrl: string;\n}): void {\n const filePath = authCredentialsPath();\n mkdirSync(path.dirname(filePath), { recursive: true });\n const payload: StoredAuthCredentials = {\n type,\n token,\n backendUrl: backendUrl.replace(/\\/+$/, ''),\n updatedAt: new Date().toISOString()\n };\n writeFileSync(filePath, `${JSON.stringify(payload, null, 2)}\\n`, { mode: 0o600 });\n try {\n chmodSync(filePath, 0o600);\n } catch {\n // Best effort on platforms that restrict chmod.\n }\n}\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nexport function clearStoredAuthCredentials(): void {\n const filePath = authCredentialsPath();\n if (!existsSync(filePath)) return;\n unlinkSync(filePath);\n}\n\nexport function resolveAuthBearerToken({\n backendUrl,\n env = process.env\n}: {\n backendUrl?: string;\n env?: NodeJS.ProcessEnv;\n} = {}): string | undefined {\n const fromEnv =\n env.OVERLORD_USER_TOKEN?.trim() || env.OVLD_USER_TOKEN?.trim() || env.USER_TOKEN?.trim();\n if (fromEnv) return fromEnv;\n\n const stored = readStoredAuthCredentials();\n if (!stored) return undefined;\n if (backendUrl && normalizeBaseUrl(stored.backendUrl) !== normalizeBaseUrl(backendUrl)) {\n return undefined;\n }\n return stored.token;\n}\n", "import { hostname } from 'node:os';\nimport { createInterface } from 'node:readline/promises';\n\nimport { writeStoredAuthCredentials } from './auth-credentials.js';\nimport { CliError } from './errors.js';\n\nexport type AuthLoginMethod = 'password' | 'user_token';\n\nexport type AuthLoginResult = {\n ok: true;\n authMethod: AuthLoginMethod;\n credentialType: 'session_bearer' | 'user_token';\n backendUrl: string;\n credentialsPath: string;\n};\n\nexport type PasswordLoginCredentialTarget = 'session_bearer' | 'full_user_token';\n\nexport function normalizeEmail(email: string): string {\n return email.trim().toLowerCase();\n}\n\nexport function validateEmail(email: string): string | null {\n const normalized = normalizeEmail(email);\n if (!/^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(normalized)) {\n return 'Enter a valid email address.';\n }\n return null;\n}\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nexport function isBackendReachabilityError(error: unknown): boolean {\n if (!(error instanceof CliError)) return false;\n return error.message.startsWith('Could not reach Overlord backend at ');\n}\n\nexport async function probeBackendReachability({\n backendUrl\n}: {\n backendUrl: string;\n}): Promise<{ reachable: boolean; error: string | null }> {\n const baseUrl = normalizeBaseUrl(backendUrl);\n try {\n const response = await fetch(`${baseUrl}/api/health`, {\n method: 'GET',\n headers: { Accept: 'application/json' }\n });\n if (response.ok) return { reachable: true, error: null };\n return {\n reachable: false,\n error: `Backend at ${baseUrl} returned HTTP ${response.status}.`\n };\n } catch (error) {\n return {\n reachable: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n}\n\nasync function promptLine({\n message,\n defaultValue\n}: {\n message: string;\n defaultValue?: string;\n}): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new CliError({\n message:\n 'Interactive login requires a TTY. Set OVERLORD_USER_TOKEN / OVLD_USER_TOKEN / USER_TOKEN for non-interactive use.'\n });\n }\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n const answer = await rl.question(`${message}${suffix}: `);\n return answer.trim() || defaultValue || '';\n } finally {\n rl.close();\n }\n}\n\nasync function promptPassword({ message }: { message: string }): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new CliError({\n message:\n 'Interactive login requires a TTY. Set OVERLORD_USER_TOKEN / OVLD_USER_TOKEN / USER_TOKEN for non-interactive use.'\n });\n }\n\n process.stdout.write(`${message}: `);\n const stdin = process.stdin;\n const wasRaw = stdin.isRaw;\n stdin.setRawMode?.(true);\n stdin.resume();\n stdin.setEncoding('utf8');\n\n return new Promise((resolve, reject) => {\n let password = '';\n\n const cleanup = (): void => {\n stdin.setRawMode?.(wasRaw ?? false);\n stdin.pause();\n stdin.removeListener('data', onData);\n };\n\n const onData = (chunk: string): void => {\n const char = chunk;\n\n if (char === '\\u0003') {\n cleanup();\n process.stdout.write('\\n');\n reject(new CliError({ message: 'Login cancelled.' }));\n return;\n }\n\n if (char === '\\r' || char === '\\n' || char === '\\u0004') {\n cleanup();\n process.stdout.write('\\n');\n resolve(password);\n return;\n }\n\n if (char === '\\u007f' || char === '\\b') {\n password = password.slice(0, -1);\n return;\n }\n\n password += char;\n };\n\n stdin.on('data', onData);\n });\n}\n\nasync function promptAuthMethod(): Promise<AuthLoginMethod> {\n console.log('Choose how to authenticate:');\n console.log(' 1. Email and password');\n console.log(' 2. USER_TOKEN (generate one in Overlord Desktop: Settings > Tokens)');\n\n const answer = (await promptLine({ message: 'Selection', defaultValue: '1' })).toLowerCase();\n if (answer === '2' || answer === 'token' || answer === 'user_token') return 'user_token';\n if (answer === '1' || answer === 'password' || answer === 'email') return 'password';\n throw new CliError({ message: 'Selection must be 1 or 2.' });\n}\n\nfunction errorMessageFromJson(value: unknown): string | null {\n if (!value || typeof value !== 'object') return null;\n const record = value as Record<string, unknown>;\n return typeof record.error === 'string'\n ? record.error\n : typeof record.message === 'string'\n ? record.message\n : null;\n}\n\nasync function readResponseJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nexport function formatUserTokenLoginCommand(token: string): string {\n return `ovld auth login --token ${token}`;\n}\n\nexport async function loginWithUserToken({\n backendUrl,\n token\n}: {\n backendUrl: string;\n token: string;\n}): Promise<AuthLoginResult> {\n const normalizedBackendUrl = normalizeBaseUrl(backendUrl);\n const trimmedToken = token.trim();\n if (!trimmedToken) throw new CliError({ message: 'USER_TOKEN is required.' });\n if (!trimmedToken.startsWith('out_')) {\n throw new CliError({\n message:\n 'USER_TOKEN must start with \"out_\". Generate one in Overlord Desktop: Settings > Tokens.'\n });\n }\n\n await validateBearerToken({ backendUrl: normalizedBackendUrl, token: trimmedToken });\n writeStoredAuthCredentials({\n type: 'user_token',\n token: trimmedToken,\n backendUrl: normalizedBackendUrl\n });\n\n const { authCredentialsPath } = await import('./auth-credentials.js');\n return {\n ok: true,\n authMethod: 'user_token',\n credentialType: 'user_token',\n backendUrl: normalizedBackendUrl,\n credentialsPath: authCredentialsPath()\n };\n}\n\nexport async function validateBearerToken({\n backendUrl,\n token\n}: {\n backendUrl: string;\n token: string;\n}): Promise<void> {\n const baseUrl = normalizeBaseUrl(backendUrl);\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/meta`, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n Authorization: `Bearer ${token}`\n }\n });\n } catch (error) {\n throw new CliError({\n message:\n `Could not reach Overlord backend at ${baseUrl}.\\n` +\n (error instanceof Error ? error.message : String(error))\n });\n }\n\n if (response.ok) return;\n\n const payload = await readResponseJson(response);\n throw new CliError({\n message:\n errorMessageFromJson(payload) ??\n `Authentication failed (${response.status}). Check your credentials and try again.`\n });\n}\n\ntype CreateUserTokenResult = {\n secret?: unknown;\n};\n\nfunction defaultCliLoginTokenLabel(): string {\n const host = hostname().trim();\n return `CLI login on ${host || 'unknown host'}`;\n}\n\nexport async function createFullUserTokenFromSession({\n backendUrl,\n sessionToken,\n label = defaultCliLoginTokenLabel()\n}: {\n backendUrl: string;\n sessionToken: string;\n label?: string;\n}): Promise<string> {\n const baseUrl = normalizeBaseUrl(backendUrl);\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/user-tokens`, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${sessionToken}`\n },\n body: JSON.stringify({ label, scope: 'full' })\n });\n } catch (error) {\n throw new CliError({\n message:\n `Could not create CLI USER_TOKEN at ${baseUrl}.\\n` +\n (error instanceof Error ? error.message : String(error))\n });\n }\n\n const payload = (await readResponseJson(response)) as CreateUserTokenResult | unknown;\n if (response.ok && payload && typeof payload === 'object') {\n const secret = (payload as CreateUserTokenResult).secret;\n if (typeof secret === 'string' && secret.startsWith('out_')) return secret;\n }\n\n throw new CliError({\n message:\n errorMessageFromJson(payload) ??\n `Could not create CLI USER_TOKEN (${response.status}). Check your account permissions.`\n });\n}\n\nexport async function signInWithEmailPassword({\n backendUrl,\n email: rawEmail,\n password\n}: {\n backendUrl: string;\n email: string;\n password: string;\n}): Promise<string> {\n const emailError = validateEmail(rawEmail);\n if (emailError) throw new CliError({ message: emailError });\n if (!password) throw new CliError({ message: 'Password is required.' });\n\n const baseUrl = normalizeBaseUrl(backendUrl);\n const email = normalizeEmail(rawEmail);\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/auth/sign-in/email`, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n // Better Auth enforces a CSRF/origin check on POST sign-in. Node's fetch\n // sends `Sec-Fetch-*` headers, which engages that check, so a missing\n // Origin is rejected with \"Missing or null Origin\". The backend trusts\n // its own loopback/base origin, so send it explicitly.\n Origin: baseUrl\n },\n body: JSON.stringify({ email, password })\n });\n } catch (error) {\n throw new CliError({\n message:\n `Could not reach Overlord backend at ${baseUrl}.\\n` +\n (error instanceof Error ? error.message : String(error))\n });\n }\n\n const token = response.headers.get('set-auth-token')?.trim();\n if (response.ok && token) return token;\n\n const payload = await readResponseJson(response);\n throw new CliError({\n message:\n errorMessageFromJson(payload) ??\n `Sign-in failed (${response.status}). Check your email and password.`\n });\n}\n\nexport async function runInteractiveAuthLogin({\n backendUrl,\n passwordCredentialTarget = 'session_bearer'\n}: {\n backendUrl: string;\n passwordCredentialTarget?: PasswordLoginCredentialTarget;\n}): Promise<AuthLoginResult> {\n const method = await promptAuthMethod();\n const normalizedBackendUrl = normalizeBaseUrl(backendUrl);\n const { authCredentialsPath } = await import('./auth-credentials.js');\n\n if (method === 'user_token') {\n const token = await promptLine({ message: 'Paste your USER_TOKEN' });\n return loginWithUserToken({ backendUrl: normalizedBackendUrl, token });\n }\n\n const email = await promptLine({ message: 'Email' });\n const emailError = validateEmail(email);\n if (emailError) throw new CliError({ message: emailError });\n\n const password = await promptPassword({ message: 'Password' });\n const sessionToken = await signInWithEmailPassword({\n backendUrl: normalizedBackendUrl,\n email,\n password\n });\n await validateBearerToken({ backendUrl: normalizedBackendUrl, token: sessionToken });\n\n if (passwordCredentialTarget === 'full_user_token') {\n const userToken = await createFullUserTokenFromSession({\n backendUrl: normalizedBackendUrl,\n sessionToken\n });\n await validateBearerToken({ backendUrl: normalizedBackendUrl, token: userToken });\n writeStoredAuthCredentials({\n type: 'user_token',\n token: userToken,\n backendUrl: normalizedBackendUrl\n });\n\n return {\n ok: true,\n authMethod: 'password',\n credentialType: 'user_token',\n backendUrl: normalizedBackendUrl,\n credentialsPath: authCredentialsPath()\n };\n }\n\n writeStoredAuthCredentials({\n type: 'session_bearer',\n token: sessionToken,\n backendUrl: normalizedBackendUrl\n });\n\n return {\n ok: true,\n authMethod: 'password',\n credentialType: 'session_bearer',\n backendUrl: normalizedBackendUrl,\n credentialsPath: authCredentialsPath()\n };\n}\n", "import {\n authCredentialsPath,\n type AuthCredentialType,\n readStoredAuthCredentials,\n resolveAuthBearerToken\n} from './auth-credentials.js';\nimport { validateBearerToken } from './auth-login.js';\nimport {\n type BackendMode,\n findEffectiveConfigPath,\n hasExplicitBackendConfig,\n loadConfig,\n resolveBackendUrl\n} from './config.js';\n\nexport type AuthCredentialSource = 'environment' | 'stored' | 'stored_mismatch' | 'none';\n\nexport type AuthStatusResult = {\n backendUrl: string;\n backendMode: BackendMode | 'unset';\n configPath: string | null;\n loggedIn: boolean;\n credentialSource: AuthCredentialSource;\n credentialType: AuthCredentialType | null;\n credentialsPath: string | null;\n validationError: string | null;\n};\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nfunction inferCredentialTypeFromToken(token: string): AuthCredentialType {\n return token.startsWith('out_') ? 'user_token' : 'session_bearer';\n}\n\nexport function resolveAuthCredentialSource({\n backendUrl,\n env = process.env\n}: {\n backendUrl: string;\n env?: NodeJS.ProcessEnv;\n}): {\n source: AuthCredentialSource;\n type: AuthCredentialType | null;\n credentialsPath: string | null;\n} {\n const fromEnv =\n env.OVERLORD_USER_TOKEN?.trim() || env.OVLD_USER_TOKEN?.trim() || env.USER_TOKEN?.trim();\n if (fromEnv) {\n return {\n source: 'environment',\n type: inferCredentialTypeFromToken(fromEnv),\n credentialsPath: null\n };\n }\n\n const stored = readStoredAuthCredentials();\n if (!stored) {\n return { source: 'none', type: null, credentialsPath: null };\n }\n\n const credentialsPath = authCredentialsPath();\n if (normalizeBaseUrl(stored.backendUrl) !== normalizeBaseUrl(backendUrl)) {\n return {\n source: 'stored_mismatch',\n type: stored.type,\n credentialsPath\n };\n }\n\n return {\n source: 'stored',\n type: stored.type,\n credentialsPath\n };\n}\n\nexport async function resolveAuthStatus({\n env = process.env\n}: {\n env?: NodeJS.ProcessEnv;\n} = {}): Promise<AuthStatusResult> {\n const config = loadConfig();\n const backendUrl = resolveBackendUrl(config);\n const backendMode = hasExplicitBackendConfig(config) ? config.backendMode : 'unset';\n const configPath = findEffectiveConfigPath();\n const credential = resolveAuthCredentialSource({ backendUrl, env });\n const token = resolveAuthBearerToken({ backendUrl, env });\n\n if (!token) {\n return {\n backendUrl,\n backendMode,\n configPath,\n loggedIn: false,\n credentialSource: credential.source,\n credentialType: credential.type,\n credentialsPath: credential.credentialsPath,\n validationError:\n credential.source === 'stored_mismatch'\n ? `Stored credentials are for ${readStoredAuthCredentials()?.backendUrl ?? 'another backend'}.`\n : null\n };\n }\n\n try {\n await validateBearerToken({ backendUrl, token });\n return {\n backendUrl,\n backendMode,\n configPath,\n loggedIn: true,\n credentialSource: credential.source,\n credentialType: credential.type,\n credentialsPath: credential.credentialsPath,\n validationError: null\n };\n } catch (error) {\n return {\n backendUrl,\n backendMode,\n configPath,\n loggedIn: false,\n credentialSource: credential.source,\n credentialType: credential.type,\n credentialsPath: credential.credentialsPath,\n validationError: error instanceof Error ? error.message : String(error)\n };\n }\n}\n", "/** Native agent binary names by connector key, for PATH detection and launch. */\nconst AGENT_BINARIES: Record<string, string> = {\n claude: 'claude',\n codex: 'codex',\n cursor: 'agent'\n};\n\n/** Map a connector agent key to the executable invoked at launch time. */\nexport function resolveAgentBinary(agentKey: string): string {\n return AGENT_BINARIES[agentKey] ?? agentKey;\n}\n", "import { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { resolveRepoPath } from './config.js';\nimport { CliError } from './errors.js';\n\n/** Marker in adapter skill templates where connector core body is interpolated. */\nexport const CONNECTOR_CORE_MARKER = '<!-- @connector-core -->';\n\nexport const CONNECTOR_CORE_SKILL_RELATIVE_PATH = 'skills/overlord-mission/SKILL.md';\nexport const CONNECTOR_CORE_REFERENCE_PREFIX = 'skills/overlord-mission/reference/';\n\n/**\n * Locate `connectors/core/overlord-mission`. The CLI package ships a copy under\n * `dist/connectors`, but source checkouts and development overrides are also\n * supported.\n */\nexport function connectorCoreRoot(): string {\n const override = process.env.OVERLORD_CONNECTORS_DIR;\n if (override) {\n const candidate = path.join(path.dirname(override), 'core', 'overlord-mission');\n if (existsSync(candidate)) return candidate;\n }\n\n const packaged = path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n 'connectors',\n 'core',\n 'overlord-mission'\n );\n if (existsSync(packaged)) return packaged;\n\n let dir = process.cwd();\n while (true) {\n const candidate = path.join(dir, 'connectors', 'core', 'overlord-mission');\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return resolveRepoPath('connectors/core/overlord-mission');\n}\n\nexport function isConnectorCoreSkillPath(relativePath: string): boolean {\n return relativePath === CONNECTOR_CORE_SKILL_RELATIVE_PATH;\n}\n\nexport function isConnectorCoreReferencePath(relativePath: string): boolean {\n return (\n relativePath.startsWith(CONNECTOR_CORE_REFERENCE_PREFIX) &&\n relativePath.endsWith('.md') &&\n !relativePath.includes('..')\n );\n}\n\nexport function stripMarkdownFrontmatter(text: string): string {\n if (!text.startsWith('---\\n')) return text;\n const end = text.indexOf('\\n---\\n', 4);\n if (end < 0) return text;\n return text.slice(end + 5);\n}\n\nexport function readConnectorCoreSkillBody(coreRoot = connectorCoreRoot()): string {\n const coreSkillPath = path.join(coreRoot, 'SKILL.md');\n if (!existsSync(coreSkillPath)) {\n throw new CliError({\n message: `Connector core skill missing at ${coreSkillPath}.`\n });\n }\n return stripMarkdownFrontmatter(readFileSync(coreSkillPath, 'utf8')).trim();\n}\n\nexport function renderConnectorSkill({\n adapterTemplate,\n coreRoot = connectorCoreRoot()\n}: {\n adapterTemplate: string;\n coreRoot?: string;\n}): string {\n if (!adapterTemplate.includes(CONNECTOR_CORE_MARKER)) {\n throw new CliError({\n message:\n `Adapter skill template is missing ${CONNECTOR_CORE_MARKER}. ` +\n `Add the marker where connector core content should be interpolated.`\n });\n }\n\n const coreBody = readConnectorCoreSkillBody(coreRoot);\n const rendered = adapterTemplate.replace(CONNECTOR_CORE_MARKER, coreBody).trimEnd();\n return `${rendered}\\n`;\n}\n\nexport function readConnectorCoreReference({\n relativePath,\n coreRoot = connectorCoreRoot()\n}: {\n relativePath: string;\n coreRoot?: string;\n}): Buffer {\n if (!isConnectorCoreReferencePath(relativePath)) {\n throw new CliError({\n message: `Not a connector core reference path: ${relativePath}`\n });\n }\n\n const referencePath = path.join(coreRoot, 'reference', path.basename(relativePath));\n if (!existsSync(referencePath)) {\n throw new CliError({\n message: `Connector core reference missing at ${referencePath}.`\n });\n }\n return readFileSync(referencePath);\n}\n\nexport function managedFileSourceExists({\n sourceDir,\n relativePath,\n coreRoot = connectorCoreRoot()\n}: {\n sourceDir: string;\n relativePath: string;\n coreRoot?: string;\n}): boolean {\n if (isConnectorCoreReferencePath(relativePath)) {\n return existsSync(path.join(coreRoot, 'reference', path.basename(relativePath)));\n }\n return existsSync(path.join(sourceDir, relativePath));\n}\n\nexport function resolveManagedFileContents({\n sourceDir,\n relativePath,\n coreRoot = connectorCoreRoot()\n}: {\n sourceDir: string;\n relativePath: string;\n coreRoot?: string;\n}): Buffer {\n if (isConnectorCoreReferencePath(relativePath)) {\n return readConnectorCoreReference({ relativePath, coreRoot });\n }\n\n if (isConnectorCoreSkillPath(relativePath)) {\n const templatePath = path.join(sourceDir, relativePath);\n if (!existsSync(templatePath)) {\n throw new CliError({\n message: `Adapter skill template missing at ${templatePath}.`\n });\n }\n const rendered = renderConnectorSkill({\n adapterTemplate: readFileSync(templatePath, 'utf8'),\n coreRoot\n });\n return Buffer.from(rendered, 'utf8');\n }\n\n const sourcePath = path.join(sourceDir, relativePath);\n if (!existsSync(sourcePath)) {\n throw new CliError({\n message: `Declared managed file missing from connector source: ${relativePath}`\n });\n }\n return readFileSync(sourcePath);\n}\n", "import { spawnSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n chmodSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n rmSync,\n statSync,\n writeFileSync\n} from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { resolveAgentBinary } from './agent-binaries.js';\nimport { resolveRepoPath } from './config.js';\nimport { managedFileSourceExists, resolveManagedFileContents } from './connector-core-render.js';\nimport { CliError } from './errors.js';\n\n/**\n * Connector setup/doctor for the Connector Layer (see CONTRACT.md \u2192 Connector\n * Layer). `ovld agent-setup <agent>` materializes a connector adapter's declared\n * `managedFiles` into the agent's native plugin install path. Adapter skill\n * templates and reference paths under `skills/overlord-mission/` are rendered from\n * `connectors/core/overlord-mission/` at install time. Setup records a local\n * install manifest so `ovld doctor` can detect stale, missing, or\n * modified files. Installs are idempotent and never touch files outside the\n * connector's own install path.\n */\n\nexport type ConnectorManifest = {\n contractVersion: string;\n componentType: string;\n componentKey: string;\n label?: string;\n description?: string;\n connector: {\n agentIdentifier: string;\n capabilities: string[];\n hookTypes: string[];\n installPath: string;\n managedFiles: string[];\n };\n};\n\nexport type ManagedFileResult = {\n path: string;\n action: 'written' | 'unchanged' | 'would-write';\n executable: boolean;\n};\n\nexport type SetupResult = {\n agentKey: string;\n agentIdentifier: string;\n installPath: string;\n contractVersion: string;\n files: ManagedFileResult[];\n binaryFound: boolean;\n binaryName: string;\n dryRun: boolean;\n warnings: string[];\n};\n\nexport type InstallState = {\n agentKey: string;\n agentIdentifier: string;\n contractVersion: string;\n installPath: string;\n installedAt: string;\n files: Array<{ path: string; sha256: string }>;\n};\n\nexport type ConnectorReport = {\n agentKey: string;\n installed: boolean;\n healthy: boolean;\n installPath: string;\n binaryName: string;\n binaryFound: boolean;\n staleContractVersion: boolean;\n problems: string[];\n};\n\nconst CURSOR_HOOK_COMMAND = 'plugins/local/overlord/hooks/overlord-user-prompt-submit.sh';\nconst CURSOR_PROTOCOL_PERMISSION = 'Shell(ovld protocol:*)';\nconst CODEX_PLUGIN_KEY = 'overlord@overlord-local';\nconst CODEX_RULES_START = '# overlord:permissions:start';\nconst CODEX_RULES_END = '# overlord:permissions:end';\nconst CLAUDE_MARKETPLACE_NAME = 'overlord-local';\nconst CLAUDE_PLUGIN_KEY = `overlord@${CLAUDE_MARKETPLACE_NAME}`;\n\n/**\n * Locate the connector adapter source tree. The CLI package ships a copy under\n * `dist/connectors`, but source checkouts and development overrides are also\n * supported.\n */\nfunction connectorsRoot(): string {\n const override = process.env.OVERLORD_CONNECTORS_DIR;\n if (override) return override;\n\n const packaged = path.join(\n path.dirname(fileURLToPath(import.meta.url)),\n 'connectors',\n 'adapters'\n );\n if (existsSync(packaged)) return packaged;\n\n let dir = process.cwd();\n while (true) {\n const candidate = path.join(dir, 'connectors', 'adapters');\n if (existsSync(candidate)) return candidate;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return resolveRepoPath('connectors/adapters');\n}\n\nfunction connectorDir(agentKey: string): string {\n return path.join(connectorsRoot(), agentKey);\n}\n\nfunction manifestPath(agentKey: string): string {\n return path.join(connectorDir(agentKey), 'conformance-manifest.yaml');\n}\n\n/** List connector adapter keys that ship a conformance manifest on disk. */\nexport function listAvailableConnectors(): string[] {\n const root = connectorsRoot();\n if (!existsSync(root)) return [];\n return readdirSync(root, { withFileTypes: true })\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n .filter(name => existsSync(manifestPath(name)))\n .sort();\n}\n\n/**\n * Minimal YAML reader for connector conformance manifests. Supports the\n * constrained subset these manifests use: top-level scalars, one nested map\n * (`connector:`), and scalar sequences. It is intentionally not a general YAML\n * parser \u2014 manifests are controlled, contract-governed artifacts.\n */\nexport function parseConnectorManifestYaml(text: string): Record<string, unknown> {\n const root: Record<string, unknown> = {};\n type Frame = { indent: number; container: Record<string, unknown> | unknown[] };\n const stack: Frame[] = [{ indent: 0, container: root }];\n let pending: { parent: Record<string, unknown>; key: string; indent: number } | null = null;\n\n const parseScalar = (raw: string): string => {\n const value = raw.trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n };\n\n for (const rawLine of text.split('\\n')) {\n const line = rawLine.replace(/\\r$/, '');\n const trimmed = line.trim();\n if (trimmed === '' || trimmed.startsWith('#')) continue;\n const indent = line.length - line.trimStart().length;\n\n if (pending) {\n if (indent > pending.indent) {\n const container: Record<string, unknown> | unknown[] = trimmed.startsWith('- ') ? [] : {};\n pending.parent[pending.key] = container;\n stack.push({ indent, container });\n pending = null;\n } else {\n pending.parent[pending.key] = '';\n pending = null;\n }\n }\n\n while (stack.length > 1 && stack[stack.length - 1]!.indent > indent) {\n stack.pop();\n }\n const frame = stack[stack.length - 1]!;\n\n if (trimmed.startsWith('- ')) {\n if (Array.isArray(frame.container)) {\n frame.container.push(parseScalar(trimmed.slice(2)));\n }\n continue;\n }\n\n const colon = trimmed.indexOf(':');\n if (colon < 0 || Array.isArray(frame.container)) continue;\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n if (rest === '') {\n pending = { parent: frame.container, key, indent };\n } else {\n frame.container[key] = parseScalar(rest);\n }\n }\n\n return root;\n}\n\nexport function readConnectorManifest(agentKey: string): ConnectorManifest {\n const file = manifestPath(agentKey);\n if (!existsSync(file)) {\n throw new CliError({\n message:\n `Unknown connector: ${agentKey}\\n` +\n `Available connectors: ${listAvailableConnectors().join(', ') || '(none)'}`\n });\n }\n const parsed = parseConnectorManifestYaml(readFileSync(file, 'utf8'));\n const connector = (parsed.connector ?? {}) as Record<string, unknown>;\n const asList = (value: unknown): string[] =>\n Array.isArray(value) ? value.map(item => String(item)) : [];\n\n const installPath = String(connector.installPath ?? '');\n const managedFiles = asList(connector.managedFiles);\n if (!installPath || managedFiles.length === 0) {\n throw new CliError({\n message: `Connector manifest for ${agentKey} is missing installPath or managedFiles.`\n });\n }\n\n return {\n contractVersion: String(parsed.contractVersion ?? ''),\n componentType: String(parsed.componentType ?? ''),\n componentKey: String(parsed.componentKey ?? agentKey),\n label: parsed.label ? String(parsed.label) : undefined,\n description: parsed.description ? String(parsed.description) : undefined,\n connector: {\n agentIdentifier: String(connector.agentIdentifier ?? agentKey),\n capabilities: asList(connector.capabilities),\n hookTypes: asList(connector.hookTypes),\n installPath,\n managedFiles\n }\n };\n}\n\nexport function resolveHome(home?: string): string {\n return home ?? process.env.OVERLORD_HOME ?? os.homedir();\n}\n\n/** Expand a leading `~` in a manifest install path against the resolved home. */\nexport function expandInstallPath(installPath: string, home: string): string {\n if (installPath === '~') return home;\n if (installPath.startsWith('~/')) return path.join(home, installPath.slice(2));\n return installPath;\n}\n\nfunction installStatePath(agentKey: string, home: string): string {\n return path.join(home, '.ovld', 'connectors', `${agentKey}.json`);\n}\n\nfunction sha256(contents: Buffer | string): string {\n return createHash('sha256').update(contents).digest('hex');\n}\n\nfunction findOnPath(command: string): boolean {\n const pathEnv = process.env.PATH ?? '';\n for (const dir of pathEnv.split(path.delimiter)) {\n if (!dir) continue;\n const candidate = path.join(dir, command);\n try {\n if (statSync(candidate).isFile()) return true;\n } catch {\n // not here; keep looking\n }\n }\n return false;\n}\n\nfunction isExecutableManaged(relativePath: string): boolean {\n return relativePath.endsWith('.sh');\n}\n\nfunction readJsonObject(filePath: string): Record<string, unknown> | null {\n if (!existsSync(filePath)) return null;\n try {\n const parsed = JSON.parse(readFileSync(filePath, 'utf8')) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/** Merge Cursor harness hooks and permission rules without clobbering user settings. */\nfunction configureCursorHarness({\n home,\n dryRun = false\n}: {\n home: string;\n dryRun?: boolean;\n}): string[] {\n const warnings: string[] = [];\n const cursorDir = path.join(home, '.cursor');\n const hooksPath = path.join(cursorDir, 'hooks.json');\n const settingsPath = path.join(cursorDir, 'settings.json');\n\n const hooks =\n readJsonObject(hooksPath) ??\n ({\n version: 1,\n hooks: {}\n } as Record<string, unknown>);\n const hookRoot = hooks.hooks;\n const hookEntries =\n hookRoot && typeof hookRoot === 'object' && !Array.isArray(hookRoot)\n ? (hookRoot as Record<string, unknown>)\n : {};\n const beforeSubmit = Array.isArray(hookEntries.beforeSubmitPrompt)\n ? [...(hookEntries.beforeSubmitPrompt as unknown[])]\n : [];\n const alreadyInstalled = beforeSubmit.some(entry => {\n if (!entry || typeof entry !== 'object') return false;\n const command = (entry as Record<string, unknown>).command;\n return typeof command === 'string' && command.includes('overlord-user-prompt-submit');\n });\n if (!alreadyInstalled) {\n beforeSubmit.push({ command: CURSOR_HOOK_COMMAND });\n hookEntries.beforeSubmitPrompt = beforeSubmit;\n hooks.hooks = hookEntries;\n if (dryRun) {\n warnings.push(`Would merge beforeSubmitPrompt hook into ${hooksPath}.`);\n } else {\n mkdirSync(cursorDir, { recursive: true });\n writeFileSync(hooksPath, `${JSON.stringify(hooks, null, 2)}\\n`);\n }\n }\n\n const settings = readJsonObject(settingsPath) ?? {};\n const permissionsRoot = settings.permissions;\n const permissions =\n permissionsRoot && typeof permissionsRoot === 'object' && !Array.isArray(permissionsRoot)\n ? (permissionsRoot as Record<string, unknown>)\n : {};\n const allow = Array.isArray(permissions.allow) ? [...(permissions.allow as unknown[])] : [];\n if (!allow.includes(CURSOR_PROTOCOL_PERMISSION)) {\n allow.push(CURSOR_PROTOCOL_PERMISSION);\n permissions.allow = allow;\n settings.permissions = permissions;\n if (dryRun) {\n warnings.push(`Would add ${CURSOR_PROTOCOL_PERMISSION} to ${settingsPath}.`);\n } else {\n mkdirSync(cursorDir, { recursive: true });\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n }\n }\n\n return warnings;\n}\n\nfunction mergeCodexRules(existingContent: string): string {\n const managedBlock = [\n CODEX_RULES_START,\n 'prefix_rule(',\n ' pattern = [\"npx\", \"overlord\", \"protocol\"],',\n ' decision = \"allow\",',\n ' justification = \"Allow all Overlord protocol commands without prompts.\",',\n ')',\n '',\n 'prefix_rule(',\n ' pattern = [\"ovld\", \"protocol\"],',\n ' decision = \"allow\",',\n ' justification = \"Allow all Overlord protocol commands without prompts.\",',\n ')',\n CODEX_RULES_END\n ].join('\\n');\n\n const startIndex = existingContent.indexOf(CODEX_RULES_START);\n const endIndex = existingContent.indexOf(CODEX_RULES_END);\n if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {\n const before = existingContent.slice(0, startIndex).trimEnd();\n const after = existingContent.slice(endIndex + CODEX_RULES_END.length).trimStart();\n if (!before && !after) return `${managedBlock}\\n`;\n if (!before) return `${managedBlock}\\n\\n${after}`;\n if (!after) return `${before}\\n\\n${managedBlock}\\n`;\n return `${before}\\n\\n${managedBlock}\\n\\n${after}`;\n }\n\n const trimmed = existingContent.trimEnd();\n if (!trimmed) return `${managedBlock}\\n`;\n return `${trimmed}\\n\\n${managedBlock}\\n`;\n}\n\nfunction rewriteCodexHookCommands({\n hooks,\n eventName,\n targetCommand\n}: {\n hooks: Record<string, unknown>;\n eventName: string;\n targetCommand: string;\n}): void {\n const hookRoot = hooks.hooks;\n if (!hookRoot || typeof hookRoot !== 'object' || Array.isArray(hookRoot)) return;\n const groups = (hookRoot as Record<string, unknown>)[eventName];\n if (!Array.isArray(groups)) return;\n for (const group of groups) {\n if (!group || typeof group !== 'object') continue;\n const entries = (group as Record<string, unknown>).hooks;\n if (!Array.isArray(entries)) continue;\n for (const hook of entries) {\n if (\n hook &&\n typeof hook === 'object' &&\n (hook as Record<string, unknown>).type === 'command'\n ) {\n (hook as Record<string, unknown>).command = targetCommand;\n }\n }\n }\n}\n\n/** Merge Codex marketplace, rules, hook paths, and plugin enablement without clobbering user settings. */\nfunction configureCodexHarness({\n home,\n installPath,\n dryRun = false\n}: {\n home: string;\n installPath: string;\n dryRun?: boolean;\n}): string[] {\n const warnings: string[] = [];\n const marketplacePath = path.join(home, '.agents', 'plugins', 'marketplace.json');\n const rulesPath = path.join(home, '.codex', 'rules', 'default.rules');\n const legacyAgentsPath = path.join(home, '.codex', 'AGENTS.md');\n const hooksPath = path.join(installPath, '.codex-plugin', 'hooks.json');\n const userPromptHook = path.join(installPath, 'scripts', 'user-prompt-submit-hook.sh');\n const permissionHook = path.join(installPath, 'scripts', 'permission-hook.sh');\n\n const currentMarketplace = readJsonObject(marketplacePath) ?? {\n name: 'overlord-local',\n interface: { displayName: 'Overlord Local Plugins' },\n plugins: []\n };\n const nextPlugins = Array.isArray(currentMarketplace.plugins)\n ? [...(currentMarketplace.plugins as unknown[])]\n : [];\n const entry = {\n name: 'overlord',\n source: { source: 'local', path: './.codex/plugins/overlord' },\n policy: { installation: 'AVAILABLE', authentication: 'ON_INSTALL' },\n category: 'Productivity'\n };\n const existingIndex = nextPlugins.findIndex(\n plugin =>\n plugin &&\n typeof plugin === 'object' &&\n (plugin as Record<string, unknown>).name === 'overlord'\n );\n if (existingIndex === -1) nextPlugins.push(entry);\n else nextPlugins[existingIndex] = entry;\n\n if (dryRun) {\n warnings.push(`Would update Codex marketplace at ${marketplacePath}.`);\n warnings.push(`Would merge protocol permission rules into ${rulesPath}.`);\n warnings.push(`Would rewrite Codex hook commands in ${hooksPath}.`);\n if (existsSync(legacyAgentsPath)) {\n warnings.push(`Would remove legacy Codex bundle at ${legacyAgentsPath}.`);\n }\n warnings.push(\n `Would run \\`codex plugin add ${CODEX_PLUGIN_KEY}\\` when the Codex CLI is available.`\n );\n return warnings;\n }\n\n mkdirSync(path.dirname(marketplacePath), { recursive: true });\n writeFileSync(\n marketplacePath,\n `${JSON.stringify(\n {\n name: currentMarketplace.name ?? 'overlord-local',\n interface: {\n displayName:\n (currentMarketplace.interface as Record<string, unknown> | undefined)?.displayName ??\n 'Overlord Local Plugins'\n },\n plugins: nextPlugins\n },\n null,\n 2\n )}\\n`\n );\n\n const existingRules = existsSync(rulesPath) ? readFileSync(rulesPath, 'utf8') : '';\n mkdirSync(path.dirname(rulesPath), { recursive: true });\n writeFileSync(rulesPath, mergeCodexRules(existingRules));\n\n const hooks = readJsonObject(hooksPath);\n if (hooks) {\n rewriteCodexHookCommands({\n hooks,\n eventName: 'PermissionRequest',\n targetCommand: permissionHook\n });\n rewriteCodexHookCommands({\n hooks,\n eventName: 'UserPromptSubmit',\n targetCommand: userPromptHook\n });\n writeFileSync(hooksPath, `${JSON.stringify(hooks, null, 2)}\\n`);\n } else {\n warnings.push(`Codex hook manifest missing or invalid at ${hooksPath}.`);\n }\n\n if (existsSync(legacyAgentsPath)) {\n rmSync(legacyAgentsPath, { force: true });\n }\n\n const codexAdd = spawnSync('codex', ['plugin', 'add', CODEX_PLUGIN_KEY], {\n encoding: 'utf8',\n timeout: 30_000\n });\n if (codexAdd.error && (codexAdd.error as NodeJS.ErrnoException).code === 'ENOENT') {\n warnings.push(\n `Codex CLI not found on PATH \u2014 wrote the marketplace but could not install the plugin. ` +\n `Run \\`codex plugin add ${CODEX_PLUGIN_KEY}\\` once Codex is installed.`\n );\n } else if (codexAdd.status !== 0) {\n const output = `${codexAdd.stdout ?? ''}${codexAdd.stderr ?? ''}`;\n if (/already/i.test(output)) {\n return warnings;\n }\n warnings.push(\n `Could not install the Codex plugin via the Codex CLI. Re-run \\`ovld agent-setup codex\\` to retry.`\n );\n }\n\n return warnings;\n}\n\n/**\n * Register the Overlord plugin with Claude Code. Unlike Cursor and Codex, Claude\n * Code never auto-discovers a plugin merely dropped into `~/.claude/plugins`; it\n * only loads plugins published through a registered marketplace. So we build a\n * local marketplace whose single plugin entry points at the freshly-installed\n * plugin tree (`installPath`), then drive the Claude CLI to add the marketplace\n * and install + enable the plugin. The CLI writes the same files (`config dir`'s\n * `known_marketplaces.json`, `installed_plugins.json`, and `enabledPlugins` in\n * `settings.json`) it would on an interactive `/plugin install`, so the result\n * is identical to a hand-installed plugin.\n *\n * `installPath` ends in `plugins/overlord`; its grandparent is the marketplace\n * root that holds `.claude-plugin/marketplace.json`. The plugin `source` must be\n * a path relative to that root \u2014 Claude rejects absolute sources.\n */\nfunction configureClaudeHarness({\n home,\n installPath,\n dryRun = false\n}: {\n home: string;\n installPath: string;\n dryRun?: boolean;\n}): string[] {\n const warnings: string[] = [];\n const marketplaceRoot = path.dirname(path.dirname(installPath));\n const marketplacePath = path.join(marketplaceRoot, '.claude-plugin', 'marketplace.json');\n const relativeSource = `./${path.relative(marketplaceRoot, installPath).split(path.sep).join('/')}`;\n const configDir = path.join(home, '.claude');\n\n const marketplace = {\n name: CLAUDE_MARKETPLACE_NAME,\n owner: { name: 'Cooperativ' },\n metadata: { description: 'Overlord local plugin marketplace.' },\n plugins: [\n {\n name: 'overlord',\n source: relativeSource,\n description: 'Overlord mission protocol workflow for Claude Code.'\n }\n ]\n };\n\n if (dryRun) {\n warnings.push(`Would write Claude marketplace manifest at ${marketplacePath}.`);\n warnings.push(\n `Would run \\`claude plugin marketplace add\\` and \\`claude plugin install ${CLAUDE_PLUGIN_KEY}\\` ` +\n `when the Claude CLI is available.`\n );\n return warnings;\n }\n\n mkdirSync(path.dirname(marketplacePath), { recursive: true });\n writeFileSync(marketplacePath, `${JSON.stringify(marketplace, null, 2)}\\n`);\n\n const runClaude = (args: string[]): ReturnType<typeof spawnSync> =>\n spawnSync('claude', args, {\n encoding: 'utf8',\n timeout: 60_000,\n // Pin the CLI to the same home we installed into so the marketplace and\n // plugin land in this home's config dir rather than the caller's real one.\n env: { ...process.env, CLAUDE_CONFIG_DIR: configDir }\n });\n\n const add = runClaude(['plugin', 'marketplace', 'add', marketplaceRoot]);\n if (add.error && (add.error as NodeJS.ErrnoException).code === 'ENOENT') {\n warnings.push(\n `Claude CLI not found on PATH \u2014 wrote the marketplace but could not install the plugin. ` +\n `Run \\`claude plugin marketplace add ${marketplaceRoot}\\` then ` +\n `\\`claude plugin install ${CLAUDE_PLUGIN_KEY}\\` once Claude Code is installed.`\n );\n return warnings;\n }\n // `marketplace add` fails when the marketplace already exists; refresh it from\n // source instead so re-running `ovld agent-setup claude` picks up plugin changes.\n if (add.status !== 0) {\n const output = `${add.stdout ?? ''}${add.stderr ?? ''}`;\n if (/already|exists/i.test(output)) {\n runClaude(['plugin', 'marketplace', 'update', CLAUDE_MARKETPLACE_NAME]);\n } else {\n warnings.push(\n `Could not register the Claude marketplace. Re-run \\`ovld agent-setup claude\\` to retry.`\n );\n return warnings;\n }\n }\n\n const install = runClaude(['plugin', 'install', CLAUDE_PLUGIN_KEY, '--scope', 'user']);\n if (install.status !== 0) {\n const output = `${install.stdout ?? ''}${install.stderr ?? ''}`;\n if (/already/i.test(output)) {\n // Already installed \u2014 refresh the cached copy so file edits take effect.\n runClaude(['plugin', 'update', CLAUDE_PLUGIN_KEY]);\n } else {\n warnings.push(\n `Could not install the Claude plugin via the Claude CLI. Re-run \\`ovld agent-setup claude\\` to retry.`\n );\n }\n }\n\n return warnings;\n}\n\nexport function setupConnector({\n agentKey,\n home,\n dryRun = false\n}: {\n agentKey: string;\n home?: string;\n dryRun?: boolean;\n}): SetupResult {\n const manifest = readConnectorManifest(agentKey);\n const resolvedHome = resolveHome(home);\n const installPath = expandInstallPath(manifest.connector.installPath, resolvedHome);\n const sourceDir = connectorDir(agentKey);\n const warnings: string[] = [];\n\n const files: ManagedFileResult[] = [];\n const stateFiles: Array<{ path: string; sha256: string }> = [];\n\n for (const relativePath of manifest.connector.managedFiles) {\n if (!managedFileSourceExists({ sourceDir, relativePath })) {\n warnings.push(`Declared managed file missing from connector source: ${relativePath}`);\n continue;\n }\n\n let contents: Buffer;\n try {\n contents = resolveManagedFileContents({ sourceDir, relativePath });\n } catch (error) {\n const message = error instanceof CliError ? error.message : String(error);\n warnings.push(message);\n continue;\n }\n const target = path.join(installPath, relativePath);\n const executable = isExecutableManaged(relativePath);\n\n const targetExists = existsSync(target);\n const unchanged = targetExists && sha256(readFileSync(target)) === sha256(contents);\n\n if (dryRun) {\n files.push({\n path: relativePath,\n action: unchanged ? 'unchanged' : 'would-write',\n executable\n });\n } else {\n if (!unchanged) {\n mkdirSync(path.dirname(target), { recursive: true });\n writeFileSync(target, contents);\n }\n if (executable) {\n chmodSync(target, 0o755);\n }\n files.push({ path: relativePath, action: unchanged ? 'unchanged' : 'written', executable });\n }\n if (!dryRun) {\n stateFiles.push({ path: relativePath, sha256: sha256(contents) });\n }\n }\n\n const binaryName = resolveAgentBinary(agentKey);\n const binaryFound = findOnPath(binaryName);\n if (!binaryFound) {\n warnings.push(\n `Agent binary \"${binaryName}\" not found on PATH. The connector is installed; ` +\n `install ${binaryName} to launch this agent.`\n );\n }\n\n if (agentKey === 'cursor') {\n warnings.push(...configureCursorHarness({ home: resolvedHome, dryRun }));\n }\n\n if (agentKey === 'codex') {\n warnings.push(...configureCodexHarness({ home: resolvedHome, installPath, dryRun }));\n }\n\n if (agentKey === 'claude') {\n warnings.push(...configureClaudeHarness({ home: resolvedHome, installPath, dryRun }));\n }\n\n if (!dryRun) {\n const installedStateFiles = manifest.connector.managedFiles\n .map(relativePath => {\n const target = path.join(installPath, relativePath);\n if (!existsSync(target)) return null;\n return { path: relativePath, sha256: sha256(readFileSync(target)) };\n })\n .filter((entry): entry is { path: string; sha256: string } => entry !== null);\n\n const state: InstallState = {\n agentKey,\n agentIdentifier: manifest.connector.agentIdentifier,\n contractVersion: manifest.contractVersion,\n installPath,\n installedAt: new Date().toISOString(),\n files: installedStateFiles\n };\n const statePath = installStatePath(agentKey, resolvedHome);\n mkdirSync(path.dirname(statePath), { recursive: true });\n writeFileSync(statePath, `${JSON.stringify(state, null, 2)}\\n`);\n }\n\n return {\n agentKey,\n agentIdentifier: manifest.connector.agentIdentifier,\n installPath,\n contractVersion: manifest.contractVersion,\n files,\n binaryFound,\n binaryName,\n dryRun,\n warnings\n };\n}\n\nexport function setupAllConnectors({\n home,\n dryRun = false\n}: {\n home?: string;\n dryRun?: boolean;\n}): SetupResult[] {\n const agents = listAvailableConnectors();\n if (agents.length === 0) {\n throw new CliError({ message: 'No connector adapters found under connectors/adapters.' });\n }\n return agents.map(agentKey => setupConnector({ agentKey, home, dryRun }));\n}\n\nfunction readInstallState(agentKey: string, home: string): InstallState | null {\n const statePath = installStatePath(agentKey, home);\n if (!existsSync(statePath)) return null;\n try {\n return JSON.parse(readFileSync(statePath, 'utf8')) as InstallState;\n } catch {\n return null;\n }\n}\n\n/** Inspect one connector's local install for `ovld doctor`. */\nexport function inspectConnector({\n agentKey,\n home\n}: {\n agentKey: string;\n home?: string;\n}): ConnectorReport {\n const resolvedHome = resolveHome(home);\n const manifest = readConnectorManifest(agentKey);\n const binaryName = resolveAgentBinary(agentKey);\n const binaryFound = findOnPath(binaryName);\n const state = readInstallState(agentKey, resolvedHome);\n\n if (!state) {\n return {\n agentKey,\n installed: false,\n healthy: false,\n installPath: expandInstallPath(manifest.connector.installPath, resolvedHome),\n binaryName,\n binaryFound,\n staleContractVersion: false,\n problems: []\n };\n }\n\n const problems: string[] = [];\n const staleContractVersion = state.contractVersion !== manifest.contractVersion;\n if (staleContractVersion) {\n problems.push(\n `Installed against contract ${state.contractVersion}; connector now declares ` +\n `${manifest.contractVersion}. Re-run \\`ovld agent-setup ${agentKey}\\`.`\n );\n }\n\n const declared = new Set(manifest.connector.managedFiles);\n for (const relativePath of manifest.connector.managedFiles) {\n const target = path.join(state.installPath, relativePath);\n if (!existsSync(target)) {\n problems.push(`Missing managed file: ${relativePath}`);\n continue;\n }\n const recorded = state.files.find(file => file.path === relativePath);\n const actual = sha256(readFileSync(target));\n const expected = recorded?.sha256;\n if (expected && actual !== expected) {\n problems.push(`Modified or stale managed file: ${relativePath}`);\n }\n }\n for (const recorded of state.files) {\n if (!declared.has(recorded.path)) {\n problems.push(`Undeclared managed file recorded in install state: ${recorded.path}`);\n }\n }\n\n return {\n agentKey,\n installed: true,\n healthy: problems.length === 0,\n installPath: state.installPath,\n binaryName,\n binaryFound,\n staleContractVersion,\n problems\n };\n}\n", "import { createHash } from 'node:crypto';\n\nexport type DeviceIdentity = {\n deviceFingerprint: string;\n deviceLabel: string;\n devicePlatform: string;\n};\n\n/** Optional-label variant used on REST bodies and service context. */\nexport type ClientDeviceIdentity = {\n deviceFingerprint: string;\n deviceLabel?: string | null;\n devicePlatform?: string | null;\n};\n\n/** Stable fingerprint from a device label + platform pair (CLI, desktop, runners). */\nexport function computeDeviceFingerprint({\n deviceLabel,\n devicePlatform\n}: {\n deviceLabel: string;\n devicePlatform: string;\n}): string {\n return createHash('sha256').update(`${deviceLabel}:${devicePlatform}`).digest('hex').slice(0, 32);\n}\n\nexport function deviceIdentityFromParts({\n deviceLabel,\n devicePlatform\n}: {\n deviceLabel: string;\n devicePlatform: string;\n}): DeviceIdentity {\n return {\n deviceLabel,\n devicePlatform,\n deviceFingerprint: computeDeviceFingerprint({ deviceLabel, devicePlatform })\n };\n}\n", "import { deviceIdentityFromParts } from '@overlord/core/service/device-identity';\nimport { hostname, platform } from 'node:os';\n\n/** Stable device identity for the machine running the CLI (matches core `devices.ts`). */\nexport function clientDeviceIdentity(): {\n deviceFingerprint: string;\n deviceLabel: string;\n devicePlatform: string;\n} {\n return deviceIdentityFromParts({\n deviceLabel: hostname(),\n devicePlatform: platform()\n });\n}\n", "import { clearStoredAuthCredentials, readStoredAuthCredentials } from './auth-credentials.js';\nimport { loadConfig, resolveBackendUrl } from './config.js';\nimport { clientDeviceIdentity } from './device-identity.js';\nimport { CliError } from './errors.js';\n\nexport type BackendClient = {\n baseUrl: string;\n health: () => Promise<{ ok: boolean; [key: string]: unknown }>;\n get: <T>(path: string) => Promise<T>;\n post: <T>({ path, body }: { path: string; body?: unknown }) => Promise<T>;\n patch: <T>({ path, body }: { path: string; body?: unknown }) => Promise<T>;\n delete: <T>(path: string) => Promise<T>;\n /**\n * Upload raw bytes (e.g. an image file), mirroring the web client's\n * `api.uploadImage`: the body rides as-is (no JSON encoding) and the\n * filename travels in a header since the server parses it without\n * multipart support.\n */\n postRaw: <T>({\n path,\n body,\n contentType,\n filename\n }: {\n path: string;\n body: Buffer;\n contentType?: string;\n filename: string;\n }) => Promise<T>;\n};\n\nfunction normalizeBaseUrl(value: string): string {\n return value.replace(/\\/+$/, '');\n}\n\nfunction resolveAuthHeaders({ baseUrl }: { baseUrl: string }): {\n headers: Record<string, string>;\n fromStored: boolean;\n} {\n const fromEnv =\n process.env.OVERLORD_USER_TOKEN?.trim() ||\n process.env.OVLD_USER_TOKEN?.trim() ||\n process.env.USER_TOKEN?.trim();\n if (fromEnv) {\n return { headers: { Authorization: `Bearer ${fromEnv}` }, fromStored: false };\n }\n\n const stored = readStoredAuthCredentials();\n if (!stored) return { headers: {}, fromStored: false };\n if (normalizeBaseUrl(stored.backendUrl) !== normalizeBaseUrl(baseUrl)) {\n return { headers: {}, fromStored: false };\n }\n\n return {\n headers: { Authorization: `Bearer ${stored.token}` },\n fromStored: true\n };\n}\n\nasync function readResponseJson(response: Response): Promise<unknown> {\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\ntype MissingRationaleDetail = {\n filePath: string;\n classification: 'mine' | 'claimed' | 'unclaimed';\n suggestedSkip: { filePath: string; reason: string } | null;\n};\n\n/**\n * A `missing_rationale` error carries a structured `details.missingRationales`\n * payload so the retry is mechanical: paths needing a real rationale (`mine`) are\n * named, and every other path gets a ready-to-use `--skip-rationale-for-json`\n * entry the agent can paste verbatim instead of re-deriving attribution by hand.\n */\nfunction formatMissingRationaleDetails(details: unknown): string | null {\n if (!details || typeof details !== 'object') return null;\n const list = (details as Record<string, unknown>).missingRationales;\n if (!Array.isArray(list) || list.length === 0) return null;\n\n const entries = list as MissingRationaleDetail[];\n const lines = entries.map(entry => ` - ${entry.filePath} [${entry.classification}]`);\n const skips = entries\n .map(entry => entry.suggestedSkip)\n .filter((skip): skip is { filePath: string; reason: string } => skip !== null)\n .map(skip => ({ file_path: skip.filePath, reason: skip.reason }));\n\n const parts = [`Per-path classification:`, ...lines];\n if (skips.length > 0) {\n parts.push(\n `Ready-to-use skip JSON for non-'mine' paths (add --skip-rationale-for-json '${JSON.stringify(\n skips\n )}' to retry):`\n );\n }\n const mineOnly = entries.filter(entry => entry.classification === 'mine');\n if (mineOnly.length > 0) {\n parts.push(\n `Paths classified 'mine' need a real --change-rationales-json entry, not a skip: ${mineOnly\n .map(entry => entry.filePath)\n .join(', ')}`\n );\n }\n return parts.join('\\n');\n}\n\nfunction errorMessageFromJson(value: unknown): string | null {\n if (!value || typeof value !== 'object') return null;\n const record = value as Record<string, unknown>;\n const error =\n typeof record.error === 'string'\n ? record.error\n : typeof record.message === 'string'\n ? record.message\n : null;\n if (!error) return null;\n\n const parts = [error];\n const detail = typeof record.detail === 'string' ? record.detail.trim() : '';\n if (detail && detail !== error) parts.push(detail);\n const code = typeof record.code === 'string' ? record.code.trim() : '';\n if (code) parts.push(`(${code})`);\n if (code === 'missing_rationale') {\n const structured = formatMissingRationaleDetails(record.details);\n if (structured) parts.push(`\\n${structured}`);\n }\n return parts.join(' \u2014 ');\n}\n\nexport function createBackendClient(): BackendClient {\n const baseUrl = normalizeBaseUrl(resolveBackendUrl(loadConfig()));\n const clientDevice = clientDeviceIdentity();\n\n async function request<T>({\n method,\n path,\n body,\n extraHeaders,\n rawBody\n }: {\n method: string;\n path: string;\n body?: unknown;\n extraHeaders?: Record<string, string>;\n rawBody?: Buffer;\n }): Promise<T> {\n const url = `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n const auth = resolveAuthHeaders({ baseUrl });\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers: {\n Accept: 'application/json',\n ...(rawBody === undefined && body !== undefined\n ? { 'Content-Type': 'application/json' }\n : {}),\n 'x-overlord-device-fingerprint': clientDevice.deviceFingerprint,\n 'x-overlord-device-label': clientDevice.deviceLabel,\n 'x-overlord-device-platform': clientDevice.devicePlatform,\n ...auth.headers,\n ...extraHeaders\n },\n body:\n rawBody !== undefined ? rawBody : body === undefined ? undefined : JSON.stringify(body)\n });\n } catch (error) {\n throw new CliError({\n message:\n `Could not reach Overlord backend at ${baseUrl}.\\n` +\n 'Start the Desktop/local backend or run `ovld config set cloud <url>`.\\n' +\n (error instanceof Error ? error.message : String(error))\n });\n }\n\n const payload = await readResponseJson(response);\n if (!response.ok) {\n if (response.status === 401 && auth.headers.Authorization) {\n if (auth.fromStored) clearStoredAuthCredentials();\n const detail =\n errorMessageFromJson(payload) ??\n `Backend request failed: ${method} ${path} (${response.status})`;\n throw new CliError({\n message:\n `${detail}\\n` +\n (auth.fromStored\n ? 'Saved credentials were cleared. Run `ovld auth login` to sign in again.'\n : 'Run `ovld auth login` or refresh your USER_TOKEN environment variable.')\n });\n }\n\n throw new CliError({\n message:\n errorMessageFromJson(payload) ??\n `Backend request failed: ${method} ${path} (${response.status})`\n });\n }\n return payload as T;\n }\n\n return {\n baseUrl,\n health: () => request({ method: 'GET', path: '/api/health' }),\n get: path => request({ method: 'GET', path }),\n post: ({ path, body }) => request({ method: 'POST', path, body }),\n patch: ({ path, body }) => request({ method: 'PATCH', path, body }),\n delete: path => request({ method: 'DELETE', path }),\n postRaw: ({ path, body, contentType, filename }) =>\n request({\n method: 'POST',\n path,\n rawBody: body,\n extraHeaders: {\n 'Content-Type': contentType || 'application/octet-stream',\n 'X-Upload-Filename': encodeURIComponent(filename)\n }\n })\n };\n}\n", "import { type BackendClient, createBackendClient } from './backend-client.js';\n\nexport type CliRuntime = {\n backend: BackendClient;\n close: () => void;\n};\n\nexport function openCliRuntime(): CliRuntime {\n const backend = createBackendClient();\n return {\n backend,\n close: () => {}\n };\n}\n", "import type { TerminalLaunchPlacement } from '@overlord/core/service/terminal-profile-types';\n\nexport type { TerminalLaunchPlacement } from '@overlord/core/service/terminal-profile-types';\n\nexport type ParsedTerminalChord = {\n modifiers: Array<'command' | 'control' | 'option' | 'shift'>;\n key: string;\n};\n\nconst MODIFIER_ALIASES: Record<string, ParsedTerminalChord['modifiers'][number]> = {\n cmd: 'command',\n command: 'command',\n meta: 'command',\n ctrl: 'control',\n control: 'control',\n alt: 'option',\n option: 'option',\n opt: 'option',\n shift: 'shift'\n};\n\nconst SPECIAL_KEYS: Record<string, string> = {\n enter: '\\r',\n return: '\\r',\n tab: '\\t',\n space: ' ',\n escape: '\\u001b',\n esc: '\\u001b',\n backspace: '\\u0008',\n delete: '\\u007f',\n up: '\\u001b[A',\n down: '\\u001b[B',\n left: '\\u001b[D',\n right: '\\u001b[C'\n};\n\n/** Parse a typed chord such as `cmd+d` or `ctrl+shift+\\\\`. */\nexport function parseTerminalLaunchChord(input: string): ParsedTerminalChord | null {\n const normalized = input.trim().toLowerCase();\n if (!normalized || /\\+\\+|^\\+|\\+$/.test(normalized)) return null;\n\n const parts = normalized\n .split('+')\n .map(part => part.trim())\n .filter(Boolean);\n if (parts.length === 0) return null;\n\n const modifiers: ParsedTerminalChord['modifiers'] = [];\n const keyParts: string[] = [];\n\n for (const part of parts) {\n const modifier = MODIFIER_ALIASES[part];\n if (modifier) {\n if (!modifiers.includes(modifier)) modifiers.push(modifier);\n continue;\n }\n keyParts.push(part);\n }\n\n if (keyParts.length !== 1) return null;\n\n const rawKey = keyParts[0] ?? '';\n const key =\n rawKey.length === 1\n ? rawKey\n : SPECIAL_KEYS[rawKey] !== undefined\n ? SPECIAL_KEYS[rawKey]\n : rawKey;\n\n if (!key) return null;\n return { modifiers, key };\n}\n\n/** Canonical display form for a parsed chord. */\nexport function formatTerminalLaunchChord(chord: ParsedTerminalChord): string {\n const modifierLabels = chord.modifiers.map(modifier => {\n switch (modifier) {\n case 'command':\n return 'cmd';\n case 'control':\n return 'ctrl';\n case 'option':\n return 'alt';\n case 'shift':\n return 'shift';\n }\n });\n\n const keyLabel =\n chord.key === '\\r'\n ? 'enter'\n : chord.key === '\\t'\n ? 'tab'\n : chord.key === ' '\n ? 'space'\n : chord.key.length === 1\n ? chord.key\n : 'key';\n\n return [...modifierLabels, keyLabel].join('+');\n}\n\n/** AppleScript `keystroke` modifier list for System Events. */\nexport function appleScriptKeystrokeClause(chord: ParsedTerminalChord): string {\n const modifierClause =\n chord.modifiers.length > 0\n ? ` using {${chord.modifiers.map(modifier => `${modifier} down`).join(', ')}}`\n : '';\n\n const keyLiteral =\n chord.key.length === 1 && chord.key !== '\\\\'\n ? JSON.stringify(chord.key)\n : JSON.stringify(chord.key);\n\n return `keystroke ${keyLiteral}${modifierClause}`;\n}\n\nexport function normalizeTerminalLaunchPlacement(\n value: string | undefined | null\n): TerminalLaunchPlacement {\n switch (value?.trim().toLowerCase()) {\n case 'tab':\n return 'tab';\n case 'chord':\n case 'split':\n case 'shortcut':\n return 'chord';\n default:\n return 'window';\n }\n}\n", "export type {\n TerminalLaunchPlacement,\n TerminalProfile\n} from '@overlord/core/service/terminal-profile-types';\nexport {\n DEFAULT_TERMINAL_PROFILE,\n EMPTY_TERMINAL_PROFILE,\n parseTerminalProfileJson,\n serializeTerminalProfile\n} from '@overlord/core/service/terminal-profile-types';\n", "import { existsSync, readFileSync } from 'node:fs';\nimport { parse } from 'smol-toml';\n\nimport type { BackendClient } from './backend-client.js';\nimport { findEffectiveConfigPath } from './config.js';\nimport { normalizeTerminalLaunchPlacement } from './terminal-launch-chord.js';\nimport {\n EMPTY_TERMINAL_PROFILE,\n parseTerminalProfileJson,\n type TerminalProfile\n} from './terminal-profile-types.js';\n\ntype LaunchSettingsResponse = {\n executionTargetId: string;\n deviceLabel: string;\n terminalProfile?: TerminalProfile;\n terminal_profile?: TerminalProfile;\n};\n\nfunction terminalProfileFromResponse(body: LaunchSettingsResponse): TerminalProfile {\n const profile = body.terminalProfile ?? body.terminal_profile;\n if (!profile) return { ...EMPTY_TERMINAL_PROFILE };\n return {\n launcher: profile.launcher ?? null,\n placement: profile.placement ?? 'window',\n chord: profile.chord ?? null\n };\n}\n\n/** Read deprecated terminal keys from overlord.toml for one-time migration during setup. */\nexport function readLegacyTerminalProfileFromToml(): TerminalProfile | null {\n const configPath = findEffectiveConfigPath();\n if (!configPath || !existsSync(configPath)) return null;\n\n const toml = parse(readFileSync(configPath, 'utf8')) as {\n terminal_launcher?: string;\n terminal_launch_placement?: string;\n terminal_launch_chord?: string;\n };\n\n const launcher = toml.terminal_launcher?.trim();\n if (!launcher) return null;\n\n return {\n launcher,\n placement: normalizeTerminalLaunchPlacement(toml.terminal_launch_placement),\n chord: toml.terminal_launch_chord?.trim() ? toml.terminal_launch_chord.trim() : null\n };\n}\n\nexport async function fetchTerminalProfile({\n backend\n}: {\n backend: BackendClient;\n}): Promise<TerminalProfile & { executionTargetId: string; deviceLabel: string }> {\n const response = await backend.get<LaunchSettingsResponse>('/api/launch-settings');\n const profile = terminalProfileFromResponse(response);\n return {\n ...profile,\n executionTargetId: response.executionTargetId,\n deviceLabel: response.deviceLabel\n };\n}\n\nexport async function saveTerminalProfile({\n backend,\n profile\n}: {\n backend: BackendClient;\n profile: TerminalProfile;\n}): Promise<TerminalProfile & { executionTargetId: string; deviceLabel: string }> {\n const response = await backend.patch<LaunchSettingsResponse>({\n path: '/api/launch-settings/terminal-profile',\n body: profile\n });\n const saved = terminalProfileFromResponse(response);\n return {\n ...saved,\n executionTargetId: response.executionTargetId,\n deviceLabel: response.deviceLabel\n };\n}\n\nexport function terminalProfileToLaunchSettings(profile: TerminalProfile): {\n terminalLauncher: string | null;\n terminalLaunchPlacement: TerminalProfile['placement'];\n terminalLaunchChord: string | null;\n} {\n return {\n terminalLauncher: profile.launcher,\n terminalLaunchPlacement: profile.placement,\n terminalLaunchChord: profile.chord\n };\n}\n\nexport { EMPTY_TERMINAL_PROFILE, parseTerminalProfileJson, type TerminalProfile };\n", "import { flagBoolean, flagValue, parseArgs } from './args.js';\nimport {\n type AuthLoginResult,\n isBackendReachabilityError,\n type PasswordLoginCredentialTarget,\n probeBackendReachability,\n runInteractiveAuthLogin\n} from './auth-login.js';\nimport { resolveAuthStatus } from './auth-status.js';\nimport {\n DEFAULT_LOCAL_BACKEND_URL,\n loadConfig,\n resolveConfigWritePath,\n writeConfig\n} from './config.js';\nimport {\n listAvailableConnectors,\n setupAllConnectors,\n setupConnector,\n type SetupResult\n} from './connectors.js';\nimport { CliError } from './errors.js';\nimport { printJson, printLine, printStepTitle } from './output.js';\nimport type { CliRuntime } from './runtime.js';\nimport { openCliRuntime } from './runtime.js';\nimport { parseTerminalLaunchChord, type TerminalLaunchPlacement } from './terminal-launch-chord.js';\nimport {\n fetchTerminalProfile,\n readLegacyTerminalProfileFromToml,\n saveTerminalProfile,\n type TerminalProfile\n} from './terminal-profile.js';\n\nconst DESKTOP_DOWNLOAD_URL =\n 'https://github.com/cooperativ-labs/OpenOverlord/releases/latest/download/';\n\nconst TERMINAL_OPTIONS = [\n { label: 'Terminal', launcher: 'Terminal' },\n { label: 'iTerm2', launcher: 'iTerm2' },\n { label: 'Ghostty', launcher: \"open -a 'Ghostty' --args\" },\n { label: 'Warp', launcher: \"open -a 'Warp' --args\" },\n { label: 'WezTerm', launcher: \"open -a 'WezTerm' --args\" },\n { label: 'Alacritty', launcher: \"open -a 'Alacritty' --args\" },\n { label: 'Kitty', launcher: \"open -a 'kitty' --args\" }\n] as const;\n\nfunction printHumanResult(result: SetupResult): void {\n const verb = result.dryRun ? 'Would install' : 'Installed';\n printLine(`${verb} connector \"${result.agentKey}\" \u2192 ${result.installPath}`);\n for (const file of result.files) {\n const marker = file.action === 'written' ? '+' : file.action === 'would-write' ? '~' : '=';\n printLine(` ${marker} ${file.path}${file.executable ? ' (executable)' : ''}`);\n }\n for (const warning of result.warnings) {\n printLine(` warn: ${warning}`);\n }\n}\n\nfunction isHttpUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value.trim());\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction launcherForApplicationName(appName: string): string {\n return `open -a ${shellQuote(appName.trim())} --args`;\n}\n\nasync function promptLine({\n message,\n defaultValue\n}: {\n message: string;\n defaultValue?: string;\n}): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new CliError({\n message:\n 'Interactive setup requires a TTY. Use `ovld config set ...` and `ovld agent-setup ...` for non-interactive setup.'\n });\n }\n const { createInterface } = await import('node:readline/promises');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n const answer = await rl.question(`${message}${suffix}: `);\n return answer.trim() || defaultValue || '';\n } finally {\n rl.close();\n }\n}\n\nasync function promptYesNo(message: string, defaultValue: boolean): Promise<boolean> {\n const answer = (\n await promptLine({ message, defaultValue: defaultValue ? 'Y' : 'N' })\n ).toLowerCase();\n if (['y', 'yes'].includes(answer)) return true;\n if (['n', 'no'].includes(answer)) return false;\n throw new CliError({ message: 'Answer yes or no.' });\n}\n\nasync function configureBackendForSetup(): Promise<{\n mode: 'local' | 'cloud';\n url: string;\n path: string;\n}> {\n const targetPath = resolveConfigWritePath();\n const current = loadConfig(targetPath);\n\n printStepTitle('Step 1: Choose the backend the CLI should use.');\n const type = (\n await promptLine({ message: 'Backend type (local/cloud)', defaultValue: current.backendMode })\n ).toLowerCase();\n\n if (type === 'cloud') {\n const cloudUrl = await promptLine({\n message: 'Cloud backend URL',\n defaultValue: current.backendMode === 'cloud' ? (current.backendUrl ?? undefined) : undefined\n });\n if (!cloudUrl) throw new CliError({ message: 'Cloud backend URL is required.' });\n if (!isHttpUrl(cloudUrl)) {\n throw new CliError({ message: 'Cloud backend must be an http:// or https:// URL.' });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'cloud', backendUrl: cloudUrl }\n });\n printLine(`Configured cloud backend at ${cloudUrl}.`);\n return { mode: 'cloud', url: cloudUrl, path: targetPath };\n }\n\n if (type !== 'local') {\n throw new CliError({ message: 'Backend type must be `local` or `cloud`.' });\n }\n\n const hasDesktop = await promptYesNo(\n 'Have you installed the Overlord Desktop app on this machine?',\n true\n );\n if (!hasDesktop) {\n printLine(`Download Overlord Desktop: ${DESKTOP_DOWNLOAD_URL}`);\n }\n const localUrl = await promptLine({\n message: 'Local backend URL',\n defaultValue: current.backendUrl ?? DEFAULT_LOCAL_BACKEND_URL\n });\n if (!isHttpUrl(localUrl)) {\n throw new CliError({ message: 'Local backend must be an http:// or https:// URL.' });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'local', backendUrl: localUrl }\n });\n printLine(`Configured local backend at ${localUrl}.`);\n return { mode: 'local', url: localUrl, path: targetPath };\n}\n\nasync function configureAuthForSetup({\n backendUrl,\n passwordCredentialTarget\n}: {\n backendUrl: string;\n passwordCredentialTarget: PasswordLoginCredentialTarget;\n}): Promise<AuthLoginResult> {\n printLine('');\n printStepTitle('Step 2: Authenticate with the backend.');\n\n const status = await resolveAuthStatus();\n if (status.loggedIn) {\n const methodLabel =\n status.credentialType === 'user_token' ? 'USER_TOKEN' : 'email and password';\n printLine(`Already authenticated with ${status.backendUrl} using ${methodLabel}.`);\n return {\n ok: true,\n authMethod: status.credentialType === 'user_token' ? 'user_token' : 'password',\n credentialType: status.credentialType ?? 'session_bearer',\n backendUrl: status.backendUrl,\n credentialsPath: status.credentialsPath ?? ''\n };\n }\n\n try {\n const login = await runInteractiveAuthLogin({ backendUrl, passwordCredentialTarget });\n const methodLabel = login.authMethod === 'user_token' ? 'USER_TOKEN' : 'email and password';\n printLine(`Authenticated with ${login.backendUrl} using ${methodLabel}.`);\n return login;\n } catch (error) {\n const reachability = await probeBackendReachability({ backendUrl });\n if (isBackendReachabilityError(error) || !reachability.reachable) {\n printLine('');\n printLine(\n `Warning: Could not reach the backend at ${backendUrl}. ` +\n 'Check that `backend_url` in overlord.toml is correct and the backend is running.'\n );\n if (reachability.error) {\n printLine(` ${reachability.error}`);\n }\n }\n throw error;\n }\n}\n\nfunction parseAgentSelection(input: string): string[] {\n const available = listAvailableConnectors();\n const normalized = input.trim().toLowerCase();\n if (!normalized || normalized === 'all') return available;\n if (normalized === 'none' || normalized === 'skip') return [];\n\n const selected = normalized\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n const invalid = selected.filter(agent => !available.includes(agent));\n if (invalid.length > 0) {\n throw new CliError({\n message: `Unknown connector(s): ${invalid.join(', ')}. Available: ${available.join(', ')}.`\n });\n }\n return selected;\n}\n\nasync function configureAgentsForSetup(): Promise<SetupResult[]> {\n const available = listAvailableConnectors();\n printLine('');\n printStepTitle('Step 3: Configure agent connectors.');\n printLine(`Available agents: ${available.join(', ')}`);\n const answer = await promptLine({\n message: 'Agents to configure (comma-separated, all, or none)',\n defaultValue: 'all'\n });\n const selected = parseAgentSelection(answer);\n const results = selected.map(agentKey => setupConnector({ agentKey }));\n for (const result of results) {\n printHumanResult(result);\n }\n if (results.length === 0) {\n printLine('Skipped agent connector setup.');\n }\n return results;\n}\n\nfunction isBuiltinTerminalLauncher(launcher: string): boolean {\n const normalized = launcher.trim().toLowerCase();\n return (\n normalized === 'iterm2' ||\n normalized === 'iterm' ||\n normalized === 'iterm.app' ||\n normalized === 'terminal' ||\n normalized === 'terminal.app' ||\n normalized === 'apple terminal'\n );\n}\n\nconst CHORD_PRESETS = [\n { label: 'cmd+d (vertical split)', chord: 'cmd+d' },\n { label: 'cmd+shift+d (horizontal split)', chord: 'cmd+shift+d' },\n { label: 'Custom shortcut', chord: null }\n] as const;\n\nasync function promptTerminalLaunchChord({\n defaultValue\n}: {\n defaultValue?: string | null;\n}): Promise<string> {\n printLine('');\n printLine('Choose a split-pane shortcut (type it \u2014 do not press the keys):');\n CHORD_PRESETS.forEach((preset, index) => {\n printLine(` ${index + 1}. ${preset.label}`);\n });\n\n const answer = await promptLine({\n message: 'Split shortcut preset',\n defaultValue: defaultValue ? 'current' : '1'\n });\n const normalized = answer.trim().toLowerCase();\n\n if (normalized === 'current' && defaultValue) {\n return defaultValue;\n }\n\n const selectedIndex = Number.parseInt(answer, 10);\n const preset =\n Number.isNaN(selectedIndex) || selectedIndex < 1 || selectedIndex > CHORD_PRESETS.length\n ? CHORD_PRESETS.find(entry => entry.label.toLowerCase().includes(normalized))\n : CHORD_PRESETS[selectedIndex - 1];\n\n if (preset?.chord) {\n return preset.chord;\n }\n\n const typed = await promptLine({\n message: 'Split shortcut (type, e.g. cmd+d)',\n defaultValue: defaultValue ?? undefined\n });\n if (!typed.trim()) {\n throw new CliError({ message: 'Split shortcut is required for split-pane launches.' });\n }\n if (!parseTerminalLaunchChord(typed)) {\n throw new CliError({\n message: 'Invalid shortcut. Use forms like cmd+d, ctrl+shift+d, or alt+enter.'\n });\n }\n return typed.trim();\n}\n\nasync function configureTerminalPlacementForSetup({\n terminalLauncher,\n current\n}: {\n terminalLauncher: string;\n current: TerminalProfile;\n}): Promise<{ placement: TerminalLaunchPlacement; chord: string | null }> {\n printLine('');\n printLine('How should launched agents open?');\n printLine(' 1. New window (default)');\n printLine(' 2. New tab');\n printLine(' 3. Split pane (keyboard shortcut)');\n\n const defaultPlacement = current.placement !== 'window' || current.chord ? 'current' : '1';\n const answer = await promptLine({\n message: 'Launch placement',\n defaultValue: defaultPlacement\n });\n const normalized = answer.trim().toLowerCase();\n\n let placement: TerminalLaunchPlacement;\n let chord: string | null = null;\n\n if (normalized === 'current') {\n placement = current.placement;\n chord = current.chord;\n } else if (normalized === 'window' || normalized === '1') {\n placement = 'window';\n } else if (normalized === 'tab' || normalized === '2') {\n placement = 'tab';\n } else if (\n normalized === 'chord' ||\n normalized === 'split' ||\n normalized === 'shortcut' ||\n normalized === '3'\n ) {\n placement = 'chord';\n chord = await promptTerminalLaunchChord({ defaultValue: current.chord });\n } else {\n throw new CliError({ message: 'Choose new window, new tab, or split pane.' });\n }\n\n if (placement === 'chord' && !chord) {\n chord = await promptTerminalLaunchChord({ defaultValue: current.chord });\n }\n\n if (!isBuiltinTerminalLauncher(terminalLauncher) && placement === 'tab') {\n printLine('Note: new-tab placement uses Cmd+T via System Events for non-iTerm/Terminal apps.');\n }\n if (!isBuiltinTerminalLauncher(terminalLauncher) && placement === 'chord') {\n printLine(\n 'Note: split-pane placement sends your shortcut via System Events, then launches the agent.'\n );\n }\n\n if (placement === 'window') {\n printLine('Will open launched agents in a new window.');\n } else if (placement === 'tab') {\n printLine('Will open launched agents in a new tab.');\n } else {\n printLine(`Will split with shortcut ${chord}.`);\n }\n\n return { placement, chord };\n}\n\nasync function resolveCurrentTerminalProfile({\n runtime\n}: {\n runtime: CliRuntime;\n}): Promise<TerminalProfile> {\n try {\n const stored = await fetchTerminalProfile({ backend: runtime.backend });\n if (stored.launcher) return stored;\n const legacy = readLegacyTerminalProfileFromToml();\n return legacy ?? stored;\n } catch {\n return (\n readLegacyTerminalProfileFromToml() ?? {\n launcher: 'Terminal',\n placement: 'window',\n chord: null\n }\n );\n }\n}\n\nasync function configureTerminalForSetup({ runtime }: { runtime: CliRuntime }): Promise<{\n executionTargetId: string;\n deviceLabel: string;\n launcher: string | null;\n placement: TerminalLaunchPlacement | null;\n chord: string | null;\n}> {\n const current = await resolveCurrentTerminalProfile({ runtime });\n\n printLine('');\n printStepTitle('Step 4: Choose the default terminal for launched agents.');\n TERMINAL_OPTIONS.forEach((option, index) => {\n printLine(` ${index + 1}. ${option.label}`);\n });\n printLine(` ${TERMINAL_OPTIONS.length + 1}. Custom application name`);\n printLine(` ${TERMINAL_OPTIONS.length + 2}. Inline in the current terminal`);\n\n const answer = await promptLine({\n message: 'Default terminal',\n defaultValue: current.launcher ? 'current' : '1'\n });\n const normalized = answer.trim().toLowerCase();\n let terminalLauncher: string | null;\n\n if (normalized === 'current') {\n terminalLauncher = current.launcher;\n } else if (normalized === 'inline' || normalized === String(TERMINAL_OPTIONS.length + 2)) {\n terminalLauncher = null;\n } else if (normalized === 'custom' || normalized === String(TERMINAL_OPTIONS.length + 1)) {\n const appName = await promptLine({ message: 'Terminal application name' });\n if (!appName) throw new CliError({ message: 'Terminal application name is required.' });\n terminalLauncher = launcherForApplicationName(appName);\n } else {\n const selectedIndex = Number.parseInt(answer, 10);\n const selected =\n Number.isNaN(selectedIndex) || selectedIndex < 1 || selectedIndex > TERMINAL_OPTIONS.length\n ? TERMINAL_OPTIONS.find(option => option.label.toLowerCase() === normalized)\n : TERMINAL_OPTIONS[selectedIndex - 1];\n if (!selected) {\n throw new CliError({ message: 'Choose a listed terminal, custom, or inline.' });\n }\n terminalLauncher = selected.launcher;\n }\n\n let placement: TerminalLaunchPlacement = 'window';\n let chord: string | null = null;\n\n if (terminalLauncher) {\n const selectedPlacement = await configureTerminalPlacementForSetup({\n terminalLauncher,\n current: { ...current, launcher: terminalLauncher }\n });\n placement = selectedPlacement.placement;\n chord = selectedPlacement.chord;\n }\n\n const saved = await saveTerminalProfile({\n backend: runtime.backend,\n profile: {\n launcher: terminalLauncher,\n placement: terminalLauncher ? placement : 'window',\n chord: terminalLauncher && placement === 'chord' ? chord : null\n }\n });\n\n printLine(\n terminalLauncher\n ? `Saved terminal profile for local target ${saved.executionTargetId} (${saved.deviceLabel}).`\n : 'Saved terminal profile: launched agents will run inline.'\n );\n\n return {\n executionTargetId: saved.executionTargetId,\n deviceLabel: saved.deviceLabel,\n launcher: terminalLauncher,\n placement: terminalLauncher ? placement : null,\n chord: terminalLauncher && placement === 'chord' ? chord : null\n };\n}\n\nasync function runFullSetupCommand({ json }: { json: boolean }): Promise<void> {\n const backend = await configureBackendForSetup();\n const auth = await configureAuthForSetup({\n backendUrl: backend.url,\n passwordCredentialTarget: backend.mode === 'cloud' ? 'full_user_token' : 'session_bearer'\n });\n const agents = await configureAgentsForSetup();\n const runtime = openCliRuntime();\n try {\n const terminal = await configureTerminalForSetup({ runtime });\n\n if (json) {\n printJson({\n ok: true,\n backend,\n auth: {\n authMethod: auth.authMethod,\n credentialType: auth.credentialType,\n backendUrl: auth.backendUrl,\n credentialsPath: auth.credentialsPath\n },\n agents: agents.map(result => result.agentKey),\n terminal\n });\n } else {\n printLine('');\n printLine(`Setup complete. Wrote ${backend.path}.`);\n }\n } finally {\n runtime.close();\n }\n}\n\nexport async function runAgentSetupCommand({\n rest,\n json\n}: {\n rest: string[];\n json: boolean;\n}): Promise<void> {\n const parsed = parseArgs(rest);\n const target = parsed.positional[0];\n const dryRun = flagBoolean(parsed.flags, '--dry-run');\n const home = flagValue(parsed.flags, '--home');\n\n if (!target) {\n const available = listAvailableConnectors();\n if (json) {\n printJson({ available, usage: 'ovld agent-setup <agent>|all [--dry-run] [--json]' });\n } else {\n printLine('Available connectors:');\n for (const agent of available) {\n printLine(` ${agent}`);\n }\n printLine('');\n printLine('Install one with `ovld agent-setup <agent>` or all with `ovld agent-setup all`.');\n }\n return;\n }\n\n const results =\n target === 'all'\n ? setupAllConnectors({ home, dryRun })\n : [setupConnector({ agentKey: target, home, dryRun })];\n\n if (json) {\n printJson({ ok: true, dryRun, results });\n } else {\n for (const result of results) {\n printHumanResult(result);\n }\n }\n}\n\nexport async function runSetupCommand({\n rest,\n json\n}: {\n rest: string[];\n json: boolean;\n}): Promise<void> {\n const parsed = parseArgs(rest);\n if (parsed.positional.length > 0) {\n throw new CliError({\n message:\n 'Connector setup moved to `ovld agent-setup`. Run `ovld setup` for full configuration or `ovld agent-setup <agent>|all` for connectors.'\n });\n }\n await runFullSetupCommand({ json });\n}\n", "import { flagBoolean, flagValue, parseArgs } from './args.js';\nimport { createBackendClient } from './backend-client.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\n\n// Light local mirrors of the relevant shared DTOs (the CLI package does not\n// depend on the webapp shared contract). Only the fields the CLI reads/sends.\ntype TokenScope = 'full' | 'mission_lifecycle';\n\ninterface UserTokenDto {\n id: string;\n label: string;\n tokenPrefix: string;\n status: string;\n scope: TokenScope;\n scopeGrants: string[];\n expiresAt: string | null;\n lastUsedAt: string | null;\n revokedAt: string | null;\n createdAt: string;\n}\n\ninterface CreateUserTokenResultDto {\n token: UserTokenDto;\n secret: string;\n}\n\nconst DURATION_PATTERN = /^(\\d+)\\s*(h|d|w|mo|m|y)$/i;\n\n/**\n * Parse a human duration (`90d`, `12w`, `3mo`, `6h`, `1y`) into an ISO-8601\n * timestamp that many units from now. `m` is treated as months for ergonomics\n * (`mo` also accepted); use `h` for hours.\n */\nexport function durationToIso(value: string, now: number = Date.now()): string {\n const match = DURATION_PATTERN.exec(value.trim());\n if (!match || match[1] === undefined || match[2] === undefined) {\n throw new CliError({\n message: `Invalid --expires-in '${value}'. Use forms like 90d, 12w, 3mo, 6h, or 1y.`\n });\n }\n const amount = Number.parseInt(match[1], 10);\n const unit = match[2].toLowerCase();\n const date = new Date(now);\n // Use UTC mutators so the arithmetic is timezone-independent; local-time\n // mutators drift by an hour when the span crosses a DST boundary.\n switch (unit) {\n case 'h':\n date.setUTCHours(date.getUTCHours() + amount);\n break;\n case 'd':\n date.setUTCDate(date.getUTCDate() + amount);\n break;\n case 'w':\n date.setUTCDate(date.getUTCDate() + amount * 7);\n break;\n case 'mo':\n case 'm':\n date.setUTCMonth(date.getUTCMonth() + amount);\n break;\n case 'y':\n date.setUTCFullYear(date.getUTCFullYear() + amount);\n break;\n default:\n throw new CliError({ message: `Unsupported duration unit in '${value}'.` });\n }\n return date.toISOString();\n}\n\nfunction normalizeScope(raw: string | undefined): TokenScope | undefined {\n if (raw === undefined) return undefined;\n const value = raw.trim().toLowerCase();\n if (value === 'full') return 'full';\n if (value === 'mission-lifecycle' || value === 'mission_lifecycle') return 'mission_lifecycle';\n throw new CliError({\n message: `Unknown --scope '${raw}'. Use 'full' or 'mission-lifecycle'.`\n });\n}\n\nfunction formatDate(iso: string | null): string {\n return iso ?? '\u2014';\n}\n\nfunction printTokenTable(tokens: UserTokenDto[]): void {\n if (tokens.length === 0) {\n console.log('No tokens. Create one with `ovld user-token create --label \"<label>\"`.');\n return;\n }\n for (const token of tokens) {\n const expiry = token.expiresAt ? `expires ${formatDate(token.expiresAt)}` : 'no expiry';\n console.log(\n `${token.tokenPrefix}\u2026 ${token.status.padEnd(8)} ${token.scope.padEnd(16)} ${expiry} ${token.label}`\n );\n console.log(` id: ${token.id}`);\n }\n}\n\n/**\n * `ovld user-token <create|list|revoke|rename>` \u2014 manage user-owned\n * non-interactive credentials. Subcommands call the existing REST endpoints\n * through the backend client; secrets are printed exactly once at creation.\n */\nexport async function runUserTokenCommand({ rest }: { rest: string[] }): Promise<void> {\n const [subcommand, ...subArgs] = rest;\n const parsed = parseArgs(subArgs);\n const json = flagBoolean(parsed.flags, '--json');\n const backend = createBackendClient();\n\n switch (subcommand) {\n case 'create': {\n const label = flagValue(parsed.flags, '--label') ?? parsed.positional[0];\n if (!label || !label.trim()) {\n throw new CliError({ message: 'A label is required: --label \"macbook runner\".' });\n }\n const scope = normalizeScope(flagValue(parsed.flags, '--scope'));\n\n // Expiry: --no-expiry sends null (never expires); --expires-in sets it;\n // omitting both lets the backend apply its 90-day default (send undefined).\n let expiresAt: string | null | undefined;\n if (flagBoolean(parsed.flags, '--no-expiry')) {\n expiresAt = null;\n } else {\n const expiresIn = flagValue(parsed.flags, '--expires-in');\n expiresAt = expiresIn ? durationToIso(expiresIn) : undefined;\n }\n\n const body: Record<string, unknown> = { label: label.trim() };\n if (expiresAt !== undefined) body.expiresAt = expiresAt;\n if (scope !== undefined) body.scope = scope;\n\n const result = await backend.post<CreateUserTokenResultDto>({\n path: '/api/user-tokens',\n body\n });\n\n if (json) {\n printJson(result);\n return;\n }\n console.log('Token created. Copy the secret now \u2014 it will not be shown again:\\n');\n console.log(` ${result.secret}\\n`);\n console.log(` label: ${result.token.label}`);\n console.log(` scope: ${result.token.scope}`);\n console.log(\n ` expiry: ${result.token.expiresAt ? formatDate(result.token.expiresAt) : 'no expiry'}`\n );\n console.log('\\nAuthenticate with: ovld auth login --token <secret>');\n return;\n }\n\n case 'list': {\n const tokens = await backend.get<UserTokenDto[]>('/api/user-tokens');\n if (json) {\n printJson(tokens);\n return;\n }\n printTokenTable(tokens);\n return;\n }\n\n case 'revoke': {\n const id = flagValue(parsed.flags, '--id') ?? parsed.positional[0];\n if (!id) throw new CliError({ message: 'Usage: ovld user-token revoke <token-id>' });\n const token = await backend.post<UserTokenDto>({ path: `/api/user-tokens/${id}/revoke` });\n if (json) {\n printJson(token);\n return;\n }\n console.log(`Revoked token ${token.tokenPrefix}\u2026 (${token.label}).`);\n return;\n }\n\n case 'rename': {\n const id = flagValue(parsed.flags, '--id') ?? parsed.positional[0];\n const label = flagValue(parsed.flags, '--label') ?? parsed.positional[1];\n if (!id || !label) {\n throw new CliError({ message: 'Usage: ovld user-token rename <token-id> \"<new label>\"' });\n }\n const token = await backend.patch<UserTokenDto>({\n path: `/api/user-tokens/${id}`,\n body: { label }\n });\n if (json) {\n printJson(token);\n return;\n }\n console.log(`Renamed token ${token.tokenPrefix}\u2026 to \"${token.label}\".`);\n return;\n }\n\n default:\n throw new CliError({\n message:\n `Unknown user-token subcommand: ${subcommand ?? '(none)'}\\n` +\n 'Usage: ovld user-token <create|list|revoke|rename>'\n });\n }\n}\n", "import { type Dirent, existsSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nexport const PROJECT_TMP_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;\n\nexport function projectTmpDir(workingDirectory: string): string {\n return path.join(workingDirectory, '.overlord', 'tmp');\n}\n\nexport function ensureProjectTmpDir(workingDirectory: string): string {\n const tmpDir = projectTmpDir(workingDirectory);\n mkdirSync(tmpDir, { recursive: true });\n return tmpDir;\n}\n\nexport function pruneStaleProjectTmp({\n workingDirectory,\n create = false,\n now = Date.now(),\n retentionMs = PROJECT_TMP_RETENTION_MS\n}: {\n workingDirectory: string;\n create?: boolean;\n now?: number;\n retentionMs?: number;\n}): void {\n const tmpDir = projectTmpDir(workingDirectory);\n if (!create && !existsSync(tmpDir)) return;\n if (create) ensureProjectTmpDir(workingDirectory);\n const cutoff = now - retentionMs;\n pruneChildren(tmpDir, cutoff);\n}\n\nexport function pruneProjectTmpContents(workingDirectory: string): {\n warned: boolean;\n removedCount: number;\n} {\n const overlordDir = path.join(workingDirectory, '.overlord');\n if (!existsSync(overlordDir)) {\n return { warned: true, removedCount: 0 };\n }\n\n const tmpDir = projectTmpDir(workingDirectory);\n if (!existsSync(tmpDir)) {\n return { warned: false, removedCount: 0 };\n }\n\n const entries = readdirSync(tmpDir, { withFileTypes: true, encoding: 'utf8' });\n for (const entry of entries) {\n rmSync(path.join(tmpDir, entry.name), { recursive: true, force: true });\n }\n return { warned: false, removedCount: entries.length };\n}\n\nfunction pruneChildren(directory: string, cutoff: number): void {\n let entries: Dirent<string>[];\n try {\n entries = readdirSync(directory, { withFileTypes: true, encoding: 'utf8' });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const target = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n pruneDirectory(target, cutoff);\n continue;\n }\n pruneLeaf(target, cutoff);\n }\n}\n\nfunction pruneDirectory(directory: string, cutoff: number): void {\n pruneChildren(directory, cutoff);\n\n try {\n const stats = statSync(directory);\n if (stats.mtimeMs > cutoff) return;\n } catch {\n return;\n }\n\n try {\n if (readdirSync(directory).length === 0) {\n rmSync(directory, { recursive: true, force: true });\n }\n } catch {\n // Best-effort cleanup only.\n }\n}\n\nfunction pruneLeaf(target: string, cutoff: number): void {\n try {\n const stats = statSync(target);\n if (stats.mtimeMs > cutoff) return;\n rmSync(target, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup only.\n }\n}\n", "import path from 'node:path';\n\n/**\n * Detects whether a credentials directory sits inside a continuously-synced\n * cloud folder (security audit 2026-06-18). Storing the `0600` `auth.json` token\n * there silently replicates the plaintext secret to cloud storage, bypassing the\n * local file-permission protection. `ovld doctor` warns when this is the case.\n */\n\nexport interface SyncRootMatch {\n /** Human-readable provider name, e.g. \"iCloud Drive\". */\n provider: string;\n /** The path segment (or joined segments) that matched, for the warning message. */\n matchedSegment: string;\n}\n\ninterface SyncRootRule {\n provider: string;\n /** Matches a single path segment (case-insensitive). */\n segment?: RegExp;\n /** Matches a run of consecutive segments joined with '/'. */\n joined?: RegExp;\n}\n\nconst RULES: SyncRootRule[] = [\n // iCloud Drive stores under ~/Library/Mobile Documents and, for third-party\n // app containers, ~/Library/CloudStorage.\n { provider: 'iCloud Drive', joined: /(^|\\/)Library\\/Mobile Documents(\\/|$)/i },\n { provider: 'iCloud Drive', joined: /(^|\\/)Library\\/CloudStorage\\/iCloud[^/]*(\\/|$)/i },\n // Dropbox: a \"Dropbox\" or \"Dropbox (Personal/Work)\" folder.\n { provider: 'Dropbox', segment: /^Dropbox(\\s|$|\\s*\\(.*\\))/i },\n // OneDrive: \"OneDrive\" or \"OneDrive - Company\".\n { provider: 'OneDrive', segment: /^OneDrive(\\s-\\s.+)?$/i },\n // Google Drive desktop: \"Google Drive\", \"My Drive\", or the CloudStorage mount.\n { provider: 'Google Drive', segment: /^(Google Drive|My Drive)$/i },\n { provider: 'Google Drive', joined: /(^|\\/)Library\\/CloudStorage\\/GoogleDrive[^/]*(\\/|$)/i }\n];\n\n/**\n * Return the first cloud-sync root the given directory is nested inside, or\n * `null` when the path looks safe. The check is purely lexical (no filesystem\n * access) so it is cheap and testable.\n */\nexport function detectCloudSyncRoot(dir: string): SyncRootMatch | null {\n const normalized = path.resolve(dir).split(path.sep).join('/');\n const segments = normalized.split('/').filter(Boolean);\n\n for (const rule of RULES) {\n if (rule.joined && rule.joined.test(normalized)) {\n const match = normalized.match(rule.joined);\n return {\n provider: rule.provider,\n matchedSegment: (match?.[0] ?? '').replace(/^\\/|\\/$/g, '')\n };\n }\n if (rule.segment) {\n const hit = segments.find(seg => rule.segment!.test(seg));\n if (hit) return { provider: rule.provider, matchedSegment: hit };\n }\n }\n\n return null;\n}\n", "export type DoctorCheck = {\n name: string;\n ok: boolean;\n required: boolean;\n detail: string;\n};\n\nexport type ExecutionTargetMigrationDiagnostics = {\n hostedBackend: boolean;\n backendHostFingerprint: string;\n staleBackendHostTargets: Array<{\n executionTargetId: string;\n label: string;\n deviceLabel: string | null;\n deviceFingerprint: string;\n }>;\n staleQueuedExecutionRequestCount: number;\n};\n\nexport function buildExecutionTargetMigrationDoctorCheck({\n diagnostics\n}: {\n diagnostics: ExecutionTargetMigrationDiagnostics;\n}): DoctorCheck | null {\n if (!diagnostics.hostedBackend) return null;\n\n const staleCount = diagnostics.staleBackendHostTargets.length;\n if (staleCount === 0 && diagnostics.staleQueuedExecutionRequestCount === 0) {\n return {\n name: 'execution-target-migration',\n ok: true,\n required: false,\n detail: 'No execution targets are stamped with the hosted backend host fingerprint.'\n };\n }\n\n const targetSummary =\n staleCount === 1\n ? `1 execution target (${diagnostics.staleBackendHostTargets[0]!.label})`\n : `${staleCount} execution targets`;\n\n const queueSummary =\n diagnostics.staleQueuedExecutionRequestCount > 0\n ? ` ${diagnostics.staleQueuedExecutionRequestCount} queued execution request(s) still reference stale target(s).`\n : '';\n\n return {\n name: 'execution-target-migration',\n ok: false,\n required: false,\n detail:\n `${targetSummary} use the hosted backend/container hostname fingerprint and cannot run checkout-local work.` +\n queueSummary +\n ' In the web app, open Project Settings \u2192 Resources, re-select your client device as the execution target, re-link the primary resource to that target, and clear or re-queue stale execution requests. See docs/upgrading-client-checkout-bridge.md.'\n };\n}\n", "import { createInterface } from 'node:readline/promises';\n\nimport { flagBoolean, flagValue, parseArgs } from './args.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\n\ntype BackendConfigResult = {\n configPath: string;\n mode: 'local' | 'cloud';\n url: string;\n};\n\nfunction isHttpUrl(value: string): boolean {\n return /^https?:\\/\\//i.test(value.trim());\n}\n\nasync function promptLine({\n message,\n defaultValue\n}: {\n message: string;\n defaultValue?: string;\n}): Promise<string> {\n if (!process.stdin.isTTY) {\n throw new CliError({\n message:\n 'Interactive backend configuration requires a TTY. Run `ovld config set local [url]` or `ovld config set cloud <url>`.'\n });\n }\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n const answer = await rl.question(`${message}${suffix}: `);\n return answer.trim() || defaultValue || '';\n } finally {\n rl.close();\n }\n}\n\nasync function configureBackendInteractive(): Promise<BackendConfigResult> {\n const { DEFAULT_LOCAL_BACKEND_URL, loadConfig, resolveConfigWritePath, writeConfig } =\n await import('./config.js');\n\n console.log('Choose an Overlord backend before continuing.');\n console.log(\n 'Use local for a Desktop/local backend on this machine, or cloud for a hosted Overlord backend.'\n );\n\n const type = (\n await promptLine({\n message: 'Backend type (local/cloud)',\n defaultValue: 'local'\n })\n ).toLowerCase();\n const targetPath = resolveConfigWritePath();\n const current = loadConfig(targetPath);\n\n if (type === 'cloud') {\n const cloudUrl = await promptLine({ message: 'Cloud backend URL' });\n if (!cloudUrl) throw new CliError({ message: 'Cloud backend URL is required.' });\n if (!isHttpUrl(cloudUrl)) {\n throw new CliError({\n message: 'Cloud backend must be an http:// or https:// URL.'\n });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'cloud', backendUrl: cloudUrl }\n });\n return { configPath: targetPath, mode: 'cloud', url: cloudUrl };\n }\n\n if (type !== 'local') {\n throw new CliError({ message: 'Backend type must be `local` or `cloud`.' });\n }\n\n const localUrl = await promptLine({\n message: 'Local backend URL',\n defaultValue: DEFAULT_LOCAL_BACKEND_URL\n });\n if (!isHttpUrl(localUrl)) {\n throw new CliError({ message: 'Local backend must be an http:// or https:// URL.' });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'local', backendUrl: localUrl }\n });\n return { configPath: targetPath, mode: 'local', url: localUrl };\n}\n\nasync function configureBackendFromArgs({\n parsed,\n json\n}: {\n parsed: ReturnType<typeof parseArgs>;\n json: boolean;\n}): Promise<void> {\n const {\n DEFAULT_LOCAL_BACKEND_URL,\n findEffectiveConfigPath,\n loadConfig,\n resolveConfigWritePath,\n resolveBackendUrl,\n writeConfig\n } = await import('./config.js');\n\n const sub = parsed.positional[0] ?? 'list';\n const targetPath = resolveConfigWritePath();\n const current = loadConfig(targetPath);\n\n if (sub === 'list') {\n const effectivePath = findEffectiveConfigPath();\n const mode = current.backendUrl ? current.backendMode : 'unset';\n const backendUrl = resolveBackendUrl(current);\n if (json) {\n printJson({\n config: current,\n path: effectivePath,\n backend: {\n configured: mode !== 'unset',\n mode,\n url: backendUrl\n }\n });\n } else {\n console.log(`config_path=${effectivePath ?? '(not configured)'}`);\n console.log(`backend_mode=${mode}`);\n console.log(`backend_url=${backendUrl}`);\n console.log(`web_host=${current.webHost}`);\n console.log(`web_port=${current.webPort}`);\n console.log(`default_agent=${current.defaultAgent}`);\n }\n return;\n }\n\n if (sub === 'get') {\n const key = parsed.positional[1] ?? 'backend';\n const values: Record<string, string | number | boolean | null> = {\n backend: current.backendUrl ?? `default local (${DEFAULT_LOCAL_BACKEND_URL})`,\n backend_mode: current.backendMode,\n backend_url: resolveBackendUrl(current),\n web_host: current.webHost,\n web_port: current.webPort,\n default_agent: current.defaultAgent\n };\n if (!(key in values)) throw new CliError({ message: `Unknown config key: ${key}` });\n if (json) printJson({ key, value: values[key] });\n else console.log(`${key}=${values[key] ?? ''}`);\n return;\n }\n\n if (sub !== 'set') {\n throw new CliError({\n message:\n 'Usage: ovld config list|get <key>|set [local <path>|cloud <postgres-url>|database_path <path>|database_url <postgres-url>]'\n });\n }\n\n const target = parsed.positional[1];\n const value =\n parsed.positional[2] ?? flagValue(parsed.flags, '--path') ?? flagValue(parsed.flags, '--url');\n\n let result: BackendConfigResult;\n if (!target) {\n result = await configureBackendInteractive();\n } else if (target === 'local' || target === 'backend_url') {\n const backendUrl = value?.trim() || DEFAULT_LOCAL_BACKEND_URL;\n if (!isHttpUrl(backendUrl)) {\n throw new CliError({ message: 'Local backend must be an http:// or https:// URL.' });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'local', backendUrl }\n });\n result = { configPath: targetPath, mode: 'local', url: backendUrl };\n } else if (target === 'cloud') {\n if (!value) throw new CliError({ message: 'Cloud backend URL is required.' });\n if (!isHttpUrl(value)) {\n throw new CliError({\n message: 'Cloud backend must be an http:// or https:// URL.'\n });\n }\n writeConfig({\n targetPath,\n config: { ...current, backendMode: 'cloud', backendUrl: value }\n });\n result = { configPath: targetPath, mode: 'cloud', url: value };\n } else {\n throw new CliError({\n message: 'Usage: ovld config set [local <url>|cloud <url>]'\n });\n }\n\n if (json) printJson(result);\n else {\n console.log(`Configured ${result.mode} backend at ${result.url}`);\n console.log(`Wrote ${result.configPath}`);\n }\n}\n\nasync function runAuthStatusCommand({ json }: { json: boolean }): Promise<void> {\n const { resolveAuthStatus } = await import('./auth-status.js');\n const status = await resolveAuthStatus();\n\n if (json) {\n printJson(status);\n return;\n }\n\n console.log(`backend_url=${status.backendUrl}`);\n console.log(`backend_mode=${status.backendMode}`);\n console.log(`config_path=${status.configPath ?? '(not configured)'}`);\n console.log(`logged_in=${status.loggedIn ? 'true' : 'false'}`);\n console.log(`credential_source=${status.credentialSource}`);\n if (status.credentialType) console.log(`credential_type=${status.credentialType}`);\n if (status.credentialsPath) console.log(`credentials_path=${status.credentialsPath}`);\n if (status.validationError) console.log(`validation_error=${status.validationError}`);\n}\n\nasync function runAuthCommand({ rest, json }: { rest: string[]; json: boolean }): Promise<void> {\n const parsed = parseArgs(rest);\n const sub = parsed.positional[0] ?? 'login';\n\n if (sub === 'status') {\n await runAuthStatusCommand({ json });\n return;\n }\n\n if (sub !== 'login') {\n throw new CliError({\n message: 'Usage: ovld auth login [--token <out_...>] | ovld auth status [--json]'\n });\n }\n\n const tokenFlag = flagValue(parsed.flags, '--token');\n\n const { findEffectiveConfigPath, hasExplicitBackendConfig, loadConfig } =\n await import('./config.js');\n let config = loadConfig();\n let configPath = findEffectiveConfigPath();\n let configured = hasExplicitBackendConfig(config);\n let setup: BackendConfigResult | null = null;\n\n if (!configured) {\n setup = await configureBackendInteractive();\n config = loadConfig(setup.configPath);\n configPath = setup.configPath;\n configured = hasExplicitBackendConfig(config);\n }\n\n if (!configured)\n throw new CliError({ message: 'Backend configuration is required before login.' });\n\n const { resolveBackendUrl } = await import('./config.js');\n const mode = config.backendMode;\n const backendUrl = resolveBackendUrl(config);\n const { loginWithUserToken, runInteractiveAuthLogin } = await import('./auth-login.js');\n const login = tokenFlag\n ? await loginWithUserToken({ backendUrl, token: tokenFlag })\n : await runInteractiveAuthLogin({\n backendUrl,\n passwordCredentialTarget: mode === 'cloud' ? 'full_user_token' : 'session_bearer'\n });\n\n if (json) {\n printJson({\n ...login,\n backend: {\n mode,\n url: backendUrl,\n configPath\n },\n configuredDuringLogin: setup !== null\n });\n } else {\n const methodLabel = login.authMethod === 'user_token' ? 'USER_TOKEN' : 'email and password';\n console.log(`Logged in to ${backendUrl} using ${methodLabel}.`);\n console.log(`Saved credentials to ${login.credentialsPath}`);\n }\n}\n\n/**\n * Local management commands that do NOT require the database/service layer:\n * `update`, `init`, `doctor`, `setup`, `agent-setup`, `config`, `auth login`, and `auth status`. These are dispatched separately from the\n * DB-backed commands in `commands.ts` so they never statically import the\n * service layer \u2014 keeping them runnable from a globally installed `ovld`\n * binary (where the root project `dist/` is not on disk).\n */\nexport async function runLocalCommand({\n command,\n rest\n}: {\n command: string;\n rest: string[];\n}): Promise<void> {\n const parsed = parseArgs(rest);\n const json = flagBoolean(parsed.flags, '--json');\n\n switch (command) {\n case 'update': {\n const { runUpdateCommand } = await import('./update.js');\n await runUpdateCommand({ rest });\n return;\n }\n case 'init': {\n const {\n DEFAULT_LOCAL_BACKEND_URL,\n writeConfig,\n resolveRepoPath,\n loadConfig,\n resolveBackendUrl\n } = await import('./config.js');\n const target = resolveRepoPath('overlord.toml');\n writeConfig({\n targetPath: target,\n config: {\n instanceName: 'Local Overlord',\n backendMode: 'local',\n backendUrl: DEFAULT_LOCAL_BACKEND_URL\n }\n });\n // Report the URL that will actually be used: in development a repo-local\n // `OVERLORD_BACKEND_URL_DEV` (.env.local) overrides the toml default.\n const backendUrl = resolveBackendUrl(loadConfig(target));\n if (json) {\n printJson({ ok: true, configPath: target, backendUrl });\n } else {\n console.log(`Initialized Overlord at ${target}`);\n console.log(`Configured local backend at ${backendUrl}`);\n }\n return;\n }\n case 'setup': {\n const { runSetupCommand } = await import('./setup.js');\n await runSetupCommand({ rest, json });\n return;\n }\n case 'agent-setup': {\n const { runAgentSetupCommand } = await import('./setup.js');\n await runAgentSetupCommand({ rest, json });\n return;\n }\n case 'config': {\n await configureBackendFromArgs({ parsed, json });\n return;\n }\n case 'auth': {\n await runAuthCommand({ rest, json });\n return;\n }\n case 'user-token': {\n const { runUserTokenCommand } = await import('./user-token.js');\n await runUserTokenCommand({ rest });\n return;\n }\n case 'prune': {\n const { pruneProjectTmpContents } = await import('./project-tmp.js');\n const workingDirectory = process.cwd();\n const result = pruneProjectTmpContents(workingDirectory);\n if (json) {\n printJson({ ok: true, ...result });\n } else if (result.warned) {\n console.warn('Warning: no .overlord folder found in the current directory.');\n } else {\n console.log(`Removed ${result.removedCount} item(s) from .overlord/tmp.`);\n }\n return;\n }\n case 'doctor': {\n const { createBackendClient } = await import('./backend-client.js');\n const { inspectConnector, listAvailableConnectors } = await import('./connectors.js');\n const backend = createBackendClient();\n const health = await backend.health().catch(error => ({\n ok: false,\n detail: error instanceof Error ? error.message : String(error)\n }));\n const checks: Array<{ name: string; ok: boolean; required: boolean; detail: string }> = [\n {\n name: 'backend',\n ok: health.ok,\n required: true,\n detail: health.ok ? backend.baseUrl : `Backend unreachable at ${backend.baseUrl}`\n }\n ];\n\n for (const agentKey of listAvailableConnectors()) {\n const report = inspectConnector({ agentKey });\n if (!report.installed) {\n checks.push({\n name: `connector:${agentKey}`,\n ok: true,\n required: false,\n detail: `not installed \u2014 run \\`ovld agent-setup ${agentKey}\\``\n });\n } else {\n checks.push({\n name: `connector:${agentKey}`,\n ok: report.healthy,\n required: true,\n detail: report.healthy\n ? `installed at ${report.installPath}`\n : report.problems.join('; ')\n });\n }\n checks.push({\n name: `agent-binary:${report.binaryName}`,\n ok: report.binaryFound,\n required: false,\n detail: report.binaryFound\n ? `found on PATH`\n : `not found on PATH (install ${report.binaryName} to launch this agent)`\n });\n }\n\n // Warn when the credentials directory is nested inside a cloud-sync root,\n // which silently replicates the plaintext `auth.json` token off-device\n // (security audit 2026-06-18).\n {\n const pathMod = await import('node:path');\n const { authCredentialsPath } = await import('./auth-credentials.js');\n const { detectCloudSyncRoot } = await import('./sync-root.js');\n const credentialsDir = pathMod.dirname(authCredentialsPath());\n const syncMatch = detectCloudSyncRoot(credentialsDir);\n checks.push({\n name: 'credentials-sync-root',\n ok: syncMatch === null,\n required: false,\n detail:\n syncMatch === null\n ? `${credentialsDir} is not inside a known cloud-sync folder`\n : `${credentialsDir} is inside ${syncMatch.provider} (${syncMatch.matchedSegment}); the plaintext token is replicated to cloud storage. Relocate it with OVLD_HOME or exclude this folder from sync.`\n });\n }\n\n if (health.ok) {\n const { isLoopbackBackendUrl } = await import('./config.js');\n const { readStoredAuthCredentials } = await import('./auth-credentials.js');\n const { buildExecutionTargetMigrationDoctorCheck } =\n await import('./execution-target-migration-doctor.js');\n const hasAuth =\n Boolean(\n process.env.OVERLORD_USER_TOKEN?.trim() ||\n process.env.OVLD_USER_TOKEN?.trim() ||\n process.env.USER_TOKEN?.trim()\n ) || readStoredAuthCredentials() !== null;\n if (hasAuth && !isLoopbackBackendUrl(backend.baseUrl)) {\n try {\n const diagnostics = await backend.get<\n import('./execution-target-migration-doctor.js').ExecutionTargetMigrationDiagnostics\n >('/api/diagnostics/execution-target-migration');\n const migrationCheck = buildExecutionTargetMigrationDoctorCheck({ diagnostics });\n if (migrationCheck) checks.push(migrationCheck);\n } catch {\n // Older backends may not expose migration diagnostics yet.\n }\n }\n }\n\n const allOk = checks.every(check => !check.required || check.ok);\n if (json) {\n printJson({ ok: allOk, checks });\n } else {\n for (const check of checks) {\n const status = check.ok ? 'ok' : check.required ? 'fail' : 'warn';\n console.log(`${status} ${check.name}: ${check.detail}`);\n }\n }\n if (!allOk) {\n throw new CliError({ message: 'Doctor found problems. Fix the items above and retry.' });\n }\n return;\n }\n default:\n throw new CliError({ message: `Unknown command: ${command}` });\n }\n}\n", "import { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { flagBoolean, flagValue, parseArgs } from './args.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\n\n/**\n * `ovld serve` \u2014 boot a fully-initialized local Overlord instance.\n *\n * This is the single \"start the web/REST server\" entrypoint shared by the repo,\n * hosted (Railway/Postgres) deployments, and the desktop bundle. It does not\n * reimplement the server: it resolves where the server entry lives, sets the\n * host/port/database environment the server reads on boot, and spawns it. The\n * server itself creates + migrates the SQLite database on first run (see\n * `backend/db.ts`), so a fresh machine comes up with no extra steps.\n *\n * Entry resolution (first match wins):\n * 1. `OVERLORD_SERVER_ENTRY` env \u2014 an explicit path (run with the matching\n * runtime by extension: `.ts` via tsx, otherwise `node`).\n * 2. `<project>/backend/dist-server/index.cjs` \u2014 the esbuild server bundle\n * (`yarn build:server:prod`), run with `node`. Preferred when present.\n * 3. `<project>/backend/index.ts` \u2014 the TypeScript source, run with\n * tsx. The repo dev path.\n *\n * The desktop app does not use this command: it forks the server bundle inside\n * an Electron `utilityProcess` directly. `ovld serve` is the CLI/repo path.\n */\nexport async function runServeCommand({ rest }: { rest: string[] }): Promise<void> {\n const parsed = parseArgs(rest);\n const json = flagBoolean(parsed.flags, '--json');\n\n const { loadConfig, resolveProjectRoot } = await import('./config.js');\n const config = loadConfig();\n const projectRoot = resolveProjectRoot();\n\n const host = flagValue(parsed.flags, '--host') ?? process.env.OVERLORD_WEB_HOST ?? config.webHost;\n const port =\n flagValue(parsed.flags, '--port') ?? process.env.OVERLORD_WEB_PORT ?? String(config.webPort);\n const dbPath = flagValue(parsed.flags, '--db') ?? process.env.OVERLORD_SQLITE_PATH;\n\n const resolved = resolveServerEntry(projectRoot);\n if (!resolved) {\n throw new CliError({\n message:\n 'Could not find the Overlord web server to serve.\\n' +\n `Looked for ${path.join(projectRoot, 'backend', 'dist-server', 'index.cjs')} (built bundle) ` +\n `and ${path.join(projectRoot, 'backend', 'index.ts')} (source).\\n` +\n 'Run `ovld serve` from an OpenOverlord checkout, build the server bundle with ' +\n '`yarn build:server:prod`, or set OVERLORD_SERVER_ENTRY to the server entry file.'\n });\n }\n\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n OVERLORD_WEB_HOST: host,\n OVERLORD_WEB_PORT: String(port)\n };\n if (dbPath) env.OVERLORD_SQLITE_PATH = dbPath;\n\n if (json) {\n printJson({\n ok: true,\n entry: resolved.entry,\n runtime: resolved.runtime,\n host,\n port: Number(port),\n databasePath: dbPath ?? null\n });\n } else {\n console.log(`Starting Overlord server (${resolved.runtime}) \u2192 http://${host}:${port}`);\n }\n\n await spawnServer({ ...resolved, env, cwd: projectRoot });\n}\n\ntype ResolvedEntry = { entry: string; runtime: 'node' | 'tsx' };\n\nfunction resolveServerEntry(projectRoot: string): ResolvedEntry | null {\n const override = process.env.OVERLORD_SERVER_ENTRY?.trim();\n if (override) {\n const entry = path.isAbsolute(override) ? override : path.resolve(projectRoot, override);\n return { entry, runtime: override.endsWith('.ts') ? 'tsx' : 'node' };\n }\n\n const bundle = path.join(projectRoot, 'backend', 'dist-server', 'index.cjs');\n if (existsSync(bundle)) return { entry: bundle, runtime: 'node' };\n\n const source = path.join(projectRoot, 'backend', 'index.ts');\n if (existsSync(source)) return { entry: source, runtime: 'tsx' };\n\n return null;\n}\n\n/**\n * Spawn the resolved server entry, inheriting stdio so its logs stream through,\n * forwarding termination signals so Ctrl-C / `kill` stop the child cleanly, and\n * resolving (exiting) with the child's exit code.\n */\nfunction spawnServer({\n entry,\n runtime,\n env,\n cwd\n}: ResolvedEntry & { env: NodeJS.ProcessEnv; cwd: string }): Promise<void> {\n // `node` runs the bundled .mjs directly; `tsx` is loaded via Node's --import\n // hook so the TypeScript source runs without a separate build step.\n const args = runtime === 'tsx' ? ['--import', 'tsx', entry] : [entry];\n\n const child = spawn(process.execPath, args, { cwd, env, stdio: 'inherit' });\n\n const forward = (signal: NodeJS.Signals) => {\n if (!child.killed) child.kill(signal);\n };\n process.on('SIGINT', forward);\n process.on('SIGTERM', forward);\n\n return new Promise<void>((resolve, reject) => {\n child.on('error', error => {\n reject(\n new CliError({\n message: `Failed to start the Overlord server: ${\n error instanceof Error ? error.message : String(error)\n }`\n })\n );\n });\n child.on('close', (code, signal) => {\n process.off('SIGINT', forward);\n process.off('SIGTERM', forward);\n if (signal) {\n // The child was terminated by a signal (e.g. Ctrl-C) \u2014 exit cleanly.\n resolve();\n return;\n }\n if (code && code !== 0) {\n reject(new CliError({ message: `Overlord server exited with code ${code}.` }));\n return;\n }\n resolve();\n });\n });\n}\n", "import { createHash, randomBytes, randomUUID } from 'node:crypto';\n\nconst SESSION_KEY_PREFIX = 'sess_';\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function newId(): string {\n return randomUUID();\n}\n\nexport function slugify(input: string): string {\n const base = input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 48);\n return base.length > 0 ? base : 'project';\n}\n\nexport function initialTitleFromInstruction(instruction: string): string {\n const firstLine = instruction.split('\\n')[0]?.trim() ?? instruction.trim();\n if (firstLine.length <= 80) return firstLine;\n return `${firstLine.slice(0, 77)}...`;\n}\n\nexport function generateSessionKey(): { rawKey: string; prefix: string; hash: string } {\n const rawKey = SESSION_KEY_PREFIX + randomBytes(24).toString('base64url');\n const prefix = rawKey.slice(0, SESSION_KEY_PREFIX.length + 8);\n const hash = createHash('sha256').update(rawKey).digest('hex');\n return { rawKey, prefix, hash };\n}\n\nexport function hashSessionKey(rawKey: string): string {\n return createHash('sha256').update(rawKey).digest('hex');\n}\n\nexport function sessionKeyPrefix(rawKey: string): string {\n return rawKey.slice(0, 'sess_'.length + 8);\n}\n", "// The `writeProjectMetadata` capability's implementation: write a linked\n// checkout's `.overlord/project.json` on the machine that owns the checkout.\n//\n// This lives in the local-target module (not projects.ts) so the in-process\n// provider can wrap it without a cycle \u2014 projects.ts depends on the local-target\n// module, never the other way around. The hosted backend must NOT write this to\n// its own filesystem; routing through a provider\n// makes that automatic \u2014 only a co-located in-process provider writes.\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { nowIso } from '../util.js';\n\nexport const PROJECT_JSON_VERSION = 2;\n\nexport interface ProjectJsonContents {\n _warning: string;\n version: number;\n projectId: string;\n resourceId: string;\n resourceKey?: string;\n resourceIdsByExecutionTarget?: Record<string, string>;\n isPrimary: boolean;\n linkedAt: string;\n}\n\nexport interface ReadProjectJsonOptions {\n preferredExecutionTargetId?: string | null;\n}\n\nexport interface ProjectJsonLink {\n projectId: string;\n resourceId: string;\n resourceKey: string | null;\n resourceIdsByExecutionTarget: Record<string, string>;\n isPrimary: boolean;\n}\n\nfunction parseProjectJson(projectJsonPath: string): ProjectJsonContents | null {\n if (!existsSync(projectJsonPath)) return null;\n const parsed = JSON.parse(readFileSync(projectJsonPath, 'utf8')) as {\n _warning?: unknown;\n version?: unknown;\n projectId?: unknown;\n resourceId?: unknown;\n resourceKey?: unknown;\n resourceIdsByExecutionTarget?: unknown;\n isPrimary?: unknown;\n linkedAt?: unknown;\n };\n if (typeof parsed.projectId !== 'string' || typeof parsed.resourceId !== 'string') return null;\n\n const resourceIdsByExecutionTarget =\n parsed.resourceIdsByExecutionTarget &&\n typeof parsed.resourceIdsByExecutionTarget === 'object' &&\n !Array.isArray(parsed.resourceIdsByExecutionTarget)\n ? Object.fromEntries(\n Object.entries(parsed.resourceIdsByExecutionTarget).filter(\n (entry): entry is [string, string] =>\n typeof entry[0] === 'string' &&\n entry[0].trim().length > 0 &&\n typeof entry[1] === 'string' &&\n entry[1].trim().length > 0\n )\n )\n : {};\n\n return {\n _warning:\n typeof parsed._warning === 'string'\n ? parsed._warning\n : 'This file is managed by Overlord and is regenerated automatically when this folder is linked as a project resource. Do not edit it manually \u2014 manual changes will be overwritten.',\n version: typeof parsed.version === 'number' ? parsed.version : 1,\n projectId: parsed.projectId,\n resourceId: parsed.resourceId,\n resourceKey:\n typeof parsed.resourceKey === 'string' && parsed.resourceKey.trim().length > 0\n ? parsed.resourceKey.trim()\n : undefined,\n resourceIdsByExecutionTarget,\n isPrimary: parsed.isPrimary === true,\n linkedAt: typeof parsed.linkedAt === 'string' ? parsed.linkedAt : nowIso()\n };\n}\n\nexport function readProjectJsonLink(\n projectJsonPath: string,\n options: ReadProjectJsonOptions = {}\n): ProjectJsonLink | null {\n const parsed = parseProjectJson(projectJsonPath);\n if (!parsed) return null;\n\n const preferredExecutionTargetId = options.preferredExecutionTargetId?.trim() || null;\n const preferredResourceId =\n preferredExecutionTargetId && parsed.resourceIdsByExecutionTarget?.[preferredExecutionTargetId];\n\n return {\n projectId: parsed.projectId,\n resourceId: preferredResourceId ?? parsed.resourceId,\n resourceKey: parsed.resourceKey ?? null,\n resourceIdsByExecutionTarget: parsed.resourceIdsByExecutionTarget ?? {},\n isPrimary: parsed.isPrimary\n };\n}\n\n/**\n * Write `<directoryPath>/.overlord/project.json` (creating the `.overlord`\n * scratch dirs), returning the absolute path written.\n */\nexport function writeProjectJson({\n directoryPath,\n projectId,\n resourceId,\n resourceKey,\n executionTargetId,\n isPrimary\n}: {\n directoryPath: string;\n projectId: string;\n resourceId: string;\n resourceKey?: string | null;\n executionTargetId?: string | null;\n isPrimary: boolean;\n}): string {\n const overlordDir = path.join(directoryPath, '.overlord');\n mkdirSync(overlordDir, { recursive: true });\n mkdirSync(path.join(overlordDir, 'tmp'), { recursive: true });\n mkdirSync(path.join(overlordDir, 'logs'), { recursive: true });\n\n const projectJsonPath = path.join(overlordDir, 'project.json');\n const existing = readProjectJsonLink(projectJsonPath);\n const resourceIdsByExecutionTarget = {\n ...(existing?.projectId === projectId ? existing.resourceIdsByExecutionTarget : {})\n };\n if (executionTargetId?.trim()) {\n resourceIdsByExecutionTarget[executionTargetId.trim()] = resourceId;\n }\n writeFileSync(\n projectJsonPath,\n `${JSON.stringify(\n {\n _warning:\n 'This file is managed by Overlord and is regenerated automatically when this folder is linked as a project resource. Do not edit it manually \u2014 manual changes will be overwritten.',\n version: PROJECT_JSON_VERSION,\n projectId,\n resourceId,\n ...(resourceKey?.trim() ? { resourceKey: resourceKey.trim() } : {}),\n ...(Object.keys(resourceIdsByExecutionTarget).length > 0\n ? { resourceIdsByExecutionTarget }\n : {}),\n isPrimary,\n linkedAt: nowIso()\n } satisfies ProjectJsonContents,\n null,\n 2\n )}\\n`\n );\n return projectJsonPath;\n}\n", "import { execFileSync } from 'node:child_process';\nimport path from 'node:path';\n\nexport type RepositoryTreeEntryType = 'file' | 'directory';\n\nexport interface RepositoryTreeEntry {\n path: string;\n name: string;\n type: RepositoryTreeEntryType;\n parentPath: string | null;\n depth: number;\n}\n\nexport interface RepositoryTree {\n rootPath: string;\n gitRoot: string;\n branch: string | null;\n commit: string | null;\n entries: RepositoryTreeEntry[];\n truncated: boolean;\n}\n\nexport interface ReadRepositoryTreeOptions {\n maxEntries?: number;\n}\n\nexport class RepositoryReadError extends Error {\n code: 'not_git_repository' | 'unreadable';\n\n constructor(code: 'not_git_repository' | 'unreadable', message: string) {\n super(message);\n this.code = code;\n }\n}\n\nconst DEFAULT_MAX_ENTRIES = 5_000;\n\nfunction runGit(cwd: string, args: string[]): string {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n maxBuffer: 10 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'pipe']\n }).trim();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new RepositoryReadError('unreadable', message);\n }\n}\n\nfunction gitPath(cwd: string, args: string[]): string | null {\n try {\n const value = runGit(cwd, args);\n return value.length > 0 ? value : null;\n } catch {\n return null;\n }\n}\n\nfunction addDirectoryAncestors(paths: Set<string>, filePath: string): void {\n let parent = path.posix.dirname(filePath);\n while (parent !== '.' && parent !== '/') {\n paths.add(parent);\n parent = path.posix.dirname(parent);\n }\n}\n\nfunction toEntry(entryPath: string, type: RepositoryTreeEntryType): RepositoryTreeEntry {\n const parentPath = path.posix.dirname(entryPath);\n return {\n path: entryPath,\n name: path.posix.basename(entryPath),\n type,\n parentPath: parentPath === '.' ? null : parentPath,\n depth: entryPath.split('/').length - 1\n };\n}\n\nfunction compareEntries(a: RepositoryTreeEntry, b: RepositoryTreeEntry): number {\n if (a.path === b.path) return 0;\n return a.path < b.path ? -1 : 1;\n}\n\nexport function readRepositoryTree(\n rootPath: string,\n options: ReadRepositoryTreeOptions = {}\n): RepositoryTree {\n const resolvedRoot = path.resolve(rootPath);\n const gitRoot = gitPath(resolvedRoot, ['rev-parse', '--show-toplevel']);\n if (!gitRoot) {\n throw new RepositoryReadError(\n 'not_git_repository',\n `${resolvedRoot} is not inside a git repository.`\n );\n }\n\n const trackedAndUntracked = runGit(gitRoot, [\n 'ls-files',\n '--cached',\n '--others',\n '--exclude-standard'\n ]);\n const filePaths = trackedAndUntracked\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n\n const directoryPaths = new Set<string>();\n for (const filePath of filePaths) addDirectoryAncestors(directoryPaths, filePath);\n\n const entries = [\n ...Array.from(directoryPaths, directoryPath => toEntry(directoryPath, 'directory')),\n ...filePaths.map(filePath => toEntry(filePath, 'file'))\n ].sort(compareEntries);\n\n const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;\n const truncated = entries.length > maxEntries;\n\n return {\n rootPath: resolvedRoot,\n gitRoot: path.resolve(gitRoot),\n branch: gitPath(gitRoot, ['branch', '--show-current']),\n commit: gitPath(gitRoot, ['rev-parse', '--short', 'HEAD']),\n entries: truncated ? entries.slice(0, maxEntries) : entries,\n truncated\n };\n}\n", "import { execFileSync } from 'node:child_process';\n\nexport type GitRun = { ok: boolean; stdout: string; stderr: string };\n\nexport function runGit(cwd: string, args: string[]): string {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n maxBuffer: 2 * 1024 * 1024\n }).trim();\n } catch {\n return '';\n }\n}\n\n/** Surfaces failure (exit code + stderr) for mutations where the outcome drives typed errors. */\nexport function runGitResult(cwd: string, args: string[]): GitRun {\n try {\n const stdout = execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n maxBuffer: 16 * 1024 * 1024\n });\n return { ok: true, stdout: stdout.trim(), stderr: '' };\n } catch (error) {\n const e = error as { stdout?: string | Buffer; stderr?: string | Buffer };\n return {\n ok: false,\n stdout: (e.stdout ? String(e.stdout) : '').trim(),\n stderr: (e.stderr ? String(e.stderr) : '').trim()\n };\n }\n}\n", "import { existsSync, realpathSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { runGitResult } from './git-run.ts';\nimport type { ManagedWorktreeEntry, PurgeWorktreesResult } from './types.ts';\n\nexport function resolveRealPath(targetPath: string): string {\n try {\n return realpathSync.native(targetPath);\n } catch {\n return path.resolve(targetPath);\n }\n}\n\nexport function worktreeIsDirty(worktreePath: string): boolean {\n const status = runGitResult(worktreePath, ['status', '--porcelain']);\n return status.ok && status.stdout.length > 0;\n}\n\nexport function worktreePathForBranch(repoPath: string, branch: string): string | null {\n const out = runGitResult(repoPath, ['worktree', 'list', '--porcelain']);\n if (!out.ok) return null;\n let currentPath: string | null = null;\n for (const line of out.stdout.split('\\n')) {\n if (line.startsWith('worktree ')) {\n currentPath = line.slice('worktree '.length).trim();\n } else if (line.startsWith('branch ')) {\n const ref = line\n .slice('branch '.length)\n .trim()\n .replace(/^refs\\/heads\\//, '');\n if (ref === branch && currentPath) return currentPath;\n }\n }\n return null;\n}\n\nexport function removeGitWorktree({\n primaryRepoPath,\n worktreePath,\n force\n}: {\n primaryRepoPath: string;\n worktreePath: string;\n force: boolean;\n}): boolean {\n const args = ['worktree', 'remove'];\n if (force) args.push('--force');\n args.push(worktreePath);\n runGitResult(primaryRepoPath, args);\n runGitResult(primaryRepoPath, ['worktree', 'prune']);\n return !existsSync(worktreePath);\n}\n\nexport function collectManagedWorktrees({\n worktreeRoot,\n projects\n}: {\n worktreeRoot: string;\n projects: Array<{ primaryRepoPath: string }>;\n}): ManagedWorktreeEntry[] {\n const resolvedRoot = resolveRealPath(worktreeRoot);\n const entries: ManagedWorktreeEntry[] = [];\n const seen = new Set<string>();\n\n for (const project of projects) {\n const repoPath = project.primaryRepoPath;\n if (!repoPath || !existsSync(repoPath)) continue;\n const out = runGitResult(repoPath, ['worktree', 'list', '--porcelain']);\n if (!out.ok) continue;\n\n let currentPath: string | null = null;\n let currentBranch: string | null = null;\n const flush = (): void => {\n if (!currentPath) return;\n const resolved = resolveRealPath(currentPath);\n const underRoot = resolved === resolvedRoot || resolved.startsWith(resolvedRoot + path.sep);\n if (underRoot && !seen.has(resolved)) {\n seen.add(resolved);\n entries.push({\n path: resolved,\n branch: currentBranch,\n primaryRepoPath: repoPath,\n dirty: worktreeIsDirty(resolved)\n });\n }\n currentPath = null;\n currentBranch = null;\n };\n\n for (const line of out.stdout.split('\\n')) {\n if (line.startsWith('worktree ')) {\n flush();\n currentPath = line.slice('worktree '.length).trim();\n } else if (line.startsWith('branch ')) {\n currentBranch = line\n .slice('branch '.length)\n .trim()\n .replace(/^refs\\/heads\\//, '');\n } else if (line.trim() === '') {\n flush();\n }\n }\n flush();\n }\n\n return entries;\n}\n\nexport function removeManagedWorktree({\n path: worktreePath,\n primaryRepoPath,\n force\n}: {\n path: string;\n primaryRepoPath: string;\n force: boolean;\n}): PurgeWorktreesResult {\n const target = path.resolve(worktreePath);\n if (!force && worktreeIsDirty(target)) {\n return {\n removed: [],\n skipped: [{ path: target, reason: 'uncommitted changes' }]\n };\n }\n const removed = removeGitWorktree({ primaryRepoPath, worktreePath: target, force });\n return removed\n ? { removed: [target], skipped: [] }\n : { removed: [], skipped: [{ path: target, reason: 'git refused to remove the worktree' }] };\n}\n\nexport function purgeManagedWorktrees({\n entries\n}: {\n entries: Array<{ path: string; primaryRepoPath: string }>;\n}): PurgeWorktreesResult {\n const removed: string[] = [];\n const skipped: Array<{ path: string; reason: string }> = [];\n for (const entry of entries) {\n const target = path.resolve(entry.path);\n if (worktreeIsDirty(target)) {\n skipped.push({ path: target, reason: 'uncommitted changes' });\n continue;\n }\n if (\n removeGitWorktree({\n primaryRepoPath: entry.primaryRepoPath,\n worktreePath: target,\n force: false\n })\n ) {\n removed.push(target);\n } else {\n skipped.push({ path: target, reason: 'git refused to remove the worktree' });\n }\n }\n return { removed, skipped };\n}\n", "import { existsSync } from 'node:fs';\n\nimport { runGitResult } from './git-run.ts';\nimport type { BranchActionKind, PerformBranchActionInput } from './types.ts';\nimport { removeGitWorktree, worktreeIsDirty, worktreePathForBranch } from './worktree-git.ts';\n\nexport type BranchActionErrorCode =\n | 'BRANCH_NO_WORKTREE'\n | 'BRANCH_WORKTREE_MISMATCH'\n | 'BRANCH_DIRTY'\n | 'BRANCH_MERGE_CONFLICT'\n | 'BRANCH_PARENT_NOT_CHECKED_OUT'\n | 'BRANCH_MERGE_FAILED'\n | 'BRANCH_COMMIT_MESSAGE_REQUIRED'\n | 'BRANCH_NOTHING_TO_COMMIT'\n | 'BRANCH_COMMIT_FAILED'\n | 'BRANCH_PUSH_FAILED';\n\nexport type BranchActionGitResult =\n | { ok: true; summary: string }\n | { ok: false; code: BranchActionErrorCode; message: string; detail?: string };\n\nfunction integrateBranch(input: PerformBranchActionInput): BranchActionGitResult {\n const { branchName, baseBranch, worktreePath, primaryRepoPath } = input;\n if (!existsSync(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NO_WORKTREE',\n message: `The branch's worktree is not present at ${worktreePath}.`\n };\n }\n const wtBranch = runGitResult(worktreePath, ['branch', '--show-current']);\n if (!wtBranch.ok || wtBranch.stdout !== branchName) {\n return {\n ok: false,\n code: 'BRANCH_WORKTREE_MISMATCH',\n message: `The worktree at ${worktreePath} is not checked out on ${branchName}.`\n };\n }\n if (worktreeIsDirty(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_DIRTY',\n message: `The branch worktree has uncommitted changes \u2014 resolve/commit them first: ${worktreePath}`,\n detail: worktreePath\n };\n }\n\n const merge = runGitResult(worktreePath, ['merge', '--no-edit', baseBranch]);\n if (!merge.ok) {\n const conflicted = runGitResult(worktreePath, ['diff', '--name-only', '--diff-filter=U']);\n const files = conflicted.ok && conflicted.stdout ? conflicted.stdout.split('\\n') : [];\n const detail =\n `Worktree: ${worktreePath}.` +\n (files.length ? ` Conflicting files: ${files.join(', ')}.` : '');\n return {\n ok: false,\n code: 'BRANCH_MERGE_CONFLICT',\n message: `Merging ${baseBranch} into ${branchName} hit conflicts.`,\n detail\n };\n }\n\n const parentWorktree = worktreePathForBranch(primaryRepoPath, baseBranch);\n if (!parentWorktree) {\n return {\n ok: false,\n code: 'BRANCH_PARENT_NOT_CHECKED_OUT',\n message: `Cannot advance ${baseBranch}: it is not checked out in any worktree. Check out ${baseBranch} in the primary repository and re-run.`\n };\n }\n if (worktreeIsDirty(parentWorktree)) {\n return {\n ok: false,\n code: 'BRANCH_DIRTY',\n message: `The ${baseBranch} checkout has uncommitted changes \u2014 commit or stash them first: ${parentWorktree}`,\n detail: parentWorktree\n };\n }\n const advance = runGitResult(parentWorktree, [\n 'merge',\n '--no-ff',\n '--no-edit',\n '-m',\n `Merge ${branchName} into ${baseBranch}`,\n branchName\n ]);\n if (!advance.ok) {\n return {\n ok: false,\n code: 'BRANCH_MERGE_FAILED',\n message: `Failed to advance ${baseBranch} to ${branchName}.`,\n detail: advance.stderr || advance.stdout\n };\n }\n return {\n ok: true,\n summary: `Merged ${baseBranch} into ${branchName} and advanced ${baseBranch} locally.`\n };\n}\n\nfunction commitBranch(input: PerformBranchActionInput): BranchActionGitResult {\n const { branchName, worktreePath } = input;\n const trimmed = (input.message ?? '').trim();\n if (!trimmed) {\n return {\n ok: false,\n code: 'BRANCH_COMMIT_MESSAGE_REQUIRED',\n message: 'A commit message is required.'\n };\n }\n if (!existsSync(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NO_WORKTREE',\n message: `The branch's worktree is not present at ${worktreePath}.`\n };\n }\n const wtBranch = runGitResult(worktreePath, ['branch', '--show-current']);\n if (!wtBranch.ok || wtBranch.stdout !== branchName) {\n return {\n ok: false,\n code: 'BRANCH_WORKTREE_MISMATCH',\n message: `The worktree at ${worktreePath} is not checked out on ${branchName}.`\n };\n }\n if (!worktreeIsDirty(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NOTHING_TO_COMMIT',\n message: 'There are no uncommitted changes in the branch worktree to commit.',\n detail: worktreePath\n };\n }\n const staged = runGitResult(worktreePath, ['add', '-A']);\n if (!staged.ok) {\n return {\n ok: false,\n code: 'BRANCH_COMMIT_FAILED',\n message: `Failed to stage changes in ${worktreePath}.`,\n detail: staged.stderr || staged.stdout\n };\n }\n const commit = runGitResult(worktreePath, ['commit', '-m', trimmed]);\n if (!commit.ok) {\n return {\n ok: false,\n code: 'BRANCH_COMMIT_FAILED',\n message: `Failed to commit changes on ${branchName}.`,\n detail: commit.stderr || commit.stdout\n };\n }\n return { ok: true, summary: `Committed changes on ${branchName}.` };\n}\n\nfunction pushParent(input: PerformBranchActionInput): BranchActionGitResult {\n const { branchName, baseBranch, worktreePath, primaryRepoPath } = input;\n const repo = worktreePathForBranch(primaryRepoPath, baseBranch) ?? primaryRepoPath;\n const push = runGitResult(repo, ['push', 'origin', baseBranch]);\n if (!push.ok) {\n return {\n ok: false,\n code: 'BRANCH_PUSH_FAILED',\n message: `Failed to push ${baseBranch} to origin.`,\n detail: push.stderr || push.stdout\n };\n }\n let summary = `Pushed ${baseBranch} to origin.`;\n if (existsSync(worktreePath) && !worktreeIsDirty(worktreePath)) {\n if (removeGitWorktree({ primaryRepoPath, worktreePath, force: false })) {\n summary += ` Removed the merged worktree for ${branchName}.`;\n }\n }\n return { ok: true, summary };\n}\n\nfunction publishBranch(input: PerformBranchActionInput): BranchActionGitResult {\n const { branchName, worktreePath, primaryRepoPath } = input;\n const repo = existsSync(worktreePath) ? worktreePath : primaryRepoPath;\n const push = runGitResult(repo, ['push', '-u', 'origin', branchName]);\n if (!push.ok) {\n return {\n ok: false,\n code: 'BRANCH_PUSH_FAILED',\n message: `Failed to publish ${branchName} to origin.`,\n detail: push.stderr || push.stdout\n };\n }\n return { ok: true, summary: `Published ${branchName} to origin.` };\n}\n\nexport function performBranchActionGit(input: PerformBranchActionInput): BranchActionGitResult {\n switch (input.action) {\n case 'integrate':\n return integrateBranch(input);\n case 'commit':\n return commitBranch(input);\n case 'push_parent':\n return pushParent(input);\n case 'publish':\n return publishBranch(input);\n default:\n return {\n ok: false,\n code: 'BRANCH_COMMIT_FAILED',\n message: `Unsupported branch action: ${String(input.action)}`\n };\n }\n}\n", "import { runGit } from './git-run.ts';\n\nexport type BranchPublicationStatus = 'created' | 'published' | 'merged_unpushed' | 'merged';\n\n/** Resolves the absolute SHA a ref points at, or null when the ref does not exist. */\nexport function resolveRef(repoPath: string, ref: string): string | null {\n const sha = runGit(repoPath, ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`]);\n return sha || null;\n}\n\n/** True when `sha` sits on the base's first-parent trunk (merge-with-parent semantics). */\nexport function isOnFirstParentTrunk(repoPath: string, base: string, sha: string): boolean {\n const trunk = runGit(repoPath, ['rev-list', '--first-parent', base]);\n if (!trunk) return false;\n return trunk.split('\\n').some(line => line.trim() === sha);\n}\n\n/** True when the branch tip is contained in the base via a non-ff merge (not merely reachable). */\nexport function branchMergedIntoBase(repoPath: string, branchSha: string, base: string): boolean {\n const baseSha = resolveRef(repoPath, base);\n if (!baseSha) return false;\n if (baseSha === branchSha) return false;\n const ahead = runGit(repoPath, ['rev-list', '--count', `${baseSha}..${branchSha}`]).trim();\n if (ahead !== '0') return false;\n return !isOnFirstParentTrunk(repoPath, base, branchSha);\n}\n\n/**\n * Derive mission-branch publication status from live git refs in a repo checkout.\n * Callers supply `repoPath` after resolving id \u2192 path (DB-free provider input).\n */\nexport function deriveBranchPublicationStatus({\n repoPath,\n branchName,\n baseBranch\n}: {\n repoPath: string;\n branchName: string;\n baseBranch: string | null;\n}): BranchPublicationStatus {\n const branchSha =\n resolveRef(repoPath, `refs/heads/${branchName}`) ??\n resolveRef(repoPath, `refs/remotes/origin/${branchName}`);\n const remoteExists = resolveRef(repoPath, `refs/remotes/origin/${branchName}`) !== null;\n if (!branchSha) return 'created';\n\n if (baseBranch) {\n if (branchMergedIntoBase(repoPath, branchSha, `origin/${baseBranch}`)) return 'merged';\n if (branchMergedIntoBase(repoPath, branchSha, baseBranch)) return 'merged_unpushed';\n }\n\n return remoteExists ? 'published' : 'created';\n}\n\n/** True when the local branch tip is ahead of `origin/<branchName>`. */\nexport function branchHasUnpushedCommits({\n repoPath,\n branchName\n}: {\n repoPath: string;\n branchName: string;\n}): boolean {\n const localSha = resolveRef(repoPath, `refs/heads/${branchName}`);\n const remoteSha = resolveRef(repoPath, `refs/remotes/origin/${branchName}`);\n if (!localSha || !remoteSha || localSha === remoteSha) return false;\n const ahead = runGit(repoPath, ['rev-list', '--count', `${remoteSha}..${localSha}`]).trim();\n return ahead !== '0' && ahead !== '';\n}\n\nexport function normalizeBranchRef(ref: string): string {\n return ref\n .replace(/^origin\\//, '')\n .replace(/^refs\\/heads\\//, '')\n .replace(/^refs\\/remotes\\/origin\\//, '')\n .trim();\n}\n\n/** Current branch in the primary worktree, or null when not on a branch. */\nexport function readPrimaryCheckoutBranch(repoPath: string): string | null {\n const worktrees = runGit(repoPath, ['worktree', 'list', '--porcelain']);\n let inMainWorktree = false;\n for (const line of worktrees.split('\\n')) {\n if (line.startsWith('worktree ')) {\n if (inMainWorktree) break;\n inMainWorktree = true;\n continue;\n }\n if (!inMainWorktree || !line.startsWith('branch ')) continue;\n const branch = normalizeBranchRef(line.slice('branch '.length));\n return branch || null;\n }\n\n const current = runGit(repoPath, ['branch', '--show-current']);\n return current || null;\n}\n", "import { existsSync } from 'node:fs';\n\nimport { runGitResult } from './git-run.ts';\nimport { worktreeIsDirty } from './worktree-git.ts';\n\nexport type CommitMessageGatherErrorCode = 'BRANCH_NO_WORKTREE' | 'BRANCH_NOTHING_TO_COMMIT';\n\nexport type CommitMessageGatherResult =\n | { ok: true; diff: string }\n | { ok: false; code: CommitMessageGatherErrorCode; message: string; detail?: string };\n\n/** Read-only snapshot of uncommitted work for commit-message drafting. */\nexport function collectWorktreeChanges(worktreePath: string): string {\n const status = runGitResult(worktreePath, ['status', '--porcelain']);\n const diff = runGitResult(worktreePath, ['diff', 'HEAD']);\n const sections: string[] = [];\n if (status.ok && status.stdout) {\n sections.push(`Changed files (git status --porcelain):\\n${status.stdout}`);\n }\n if (diff.ok && diff.stdout) {\n sections.push(`Diff against HEAD:\\n${diff.stdout}`);\n }\n return sections.join('\\n\\n');\n}\n\nexport function gatherCommitMessageDiff(worktreePath: string): CommitMessageGatherResult {\n if (!existsSync(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NO_WORKTREE',\n message: `The branch's worktree is not present at ${worktreePath}.`\n };\n }\n if (!worktreeIsDirty(worktreePath)) {\n return {\n ok: false,\n code: 'BRANCH_NOTHING_TO_COMMIT',\n message: 'There are no uncommitted changes to draft a commit message from.',\n detail: worktreePath\n };\n }\n return { ok: true, diff: collectWorktreeChanges(worktreePath) };\n}\n", "import { execFileSync } from 'node:child_process';\n\nimport type { DoctorCheck } from './types.ts';\n\nexport function commandOnPath(command: string, args: string[]): DoctorCheck {\n try {\n const detail = execFileSync(command, args, {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore']\n }).trim();\n return { name: command, ok: true, detail: detail || 'found on PATH' };\n } catch {\n return { name: command, ok: false, detail: `${command} not found on PATH` };\n }\n}\n\n/** Portable local-target health checks that do not require CLI connector state. */\nexport function runLocalTargetDoctorChecks(): DoctorCheck[] {\n return [commandOnPath('git', ['--version']), commandOnPath('node', ['--version'])];\n}\n", "// Result constructors and guards for the local-target capability contract.\n// Keeping these tiny helpers in one place means providers never hand-assemble\n// the discriminated union (and never forget the `target` metadata).\n\nimport type {\n CapabilityFailure,\n CapabilityResult,\n CapabilitySuccess,\n LocalTargetErrorCode,\n TargetMetadata\n} from './types.ts';\n\n/** Build a success result carrying the originating target metadata. */\nexport function ok<T>(target: TargetMetadata, value: T): CapabilitySuccess<T> {\n return { ok: true, value, target };\n}\n\n/** Build a typed failure result carrying the originating target metadata. */\nexport function fail(\n target: TargetMetadata,\n code: LocalTargetErrorCode,\n message: string,\n details?: unknown\n): CapabilityFailure {\n return details === undefined\n ? { ok: false, code, message, target }\n : { ok: false, code, message, details, target };\n}\n\n/** Narrow a result to its success branch. */\nexport function isOk<T>(result: CapabilityResult<T>): result is CapabilitySuccess<T> {\n return result.ok;\n}\n\n/** Narrow a result to its failure branch. */\nexport function isFailure<T>(result: CapabilityResult<T>): result is CapabilityFailure {\n return !result.ok;\n}\n", "// The in-process provider transport: capabilities served by direct calls on a\n// machine co-located with the checkout \u2014 the Local SQLite backend, or the local\n// runner acting on its own machine (design \u00A74 \"Transport & Providers\").\n//\n// Capability bodies accrue here as WS-D migrates each caller off its ad-hoc\n// `existsSync`/`git` call. Capabilities not yet routed return a typed\n// CAPABILITY_NOT_IMPLEMENTED failure (never throw), so a partially-migrated\n// provider is still safe to hand to any caller.\n\nimport { existsSync } from 'node:fs';\n\nimport {\n readRepositoryTree as readGitRepositoryTree,\n RepositoryReadError\n} from '../../repository/git-tree.ts';\n\nimport { performBranchActionGit } from './branch-actions-git.ts';\nimport { normalizeBranchRef } from './branch-status-git.ts';\nimport { gatherCommitMessageDiff } from './commit-message-diff-git.ts';\nimport { runLocalTargetDoctorChecks } from './doctor-checks.ts';\nimport { runGit } from './git-run.ts';\nimport { writeProjectJson } from './project-metadata.ts';\nimport { fail, ok } from './result.ts';\nimport type {\n CapabilityFailure,\n CapabilityResult,\n GenerateCommitMessageInput,\n LaunchAgentInput,\n ListBranchesInput,\n ListWorktreesInput,\n LocalTargetCapabilities,\n ObserveResourceInput,\n PerformBranchActionInput,\n PrepareBranchInput,\n PurgeMergedWorktreesInput,\n ReadCurrentDiffInput,\n ReadRepositoryTreeInput,\n RemoveWorktreeInput,\n ResourceObservation,\n TargetMetadata,\n WriteProjectMetadataInput,\n WriteProjectMetadataResult\n} from './types.ts';\nimport {\n collectManagedWorktrees,\n purgeManagedWorktrees,\n removeManagedWorktree\n} from './worktree-git.ts';\n\nexport class InProcessProvider implements LocalTargetCapabilities {\n constructor(readonly target: TargetMetadata) {}\n\n // ---- routed (WS-D 1) -------------------------------------------------\n\n /**\n * Observe whether the linked checkout exists on this machine. Byte-identical\n * to the prior host-side `existsSync(path)` check the resource-status\n * derivation used (available/missing); richer git-root/branch/commit\n * enrichment is an additive follow-up.\n */\n async observeResource(\n input: ObserveResourceInput\n ): Promise<CapabilityResult<ResourceObservation>> {\n const observedAt = new Date().toISOString();\n const state = existsSync(input.path) ? 'available' : 'missing';\n return ok(this.target, { state, observedAt });\n }\n\n /**\n * Write the linked checkout's `.overlord/project.json` on this machine (WS-D 2).\n * Only reachable when this provider was resolved (co-located backend / local\n * runner); a hosted backend resolves an unavailable provider instead and never\n * writes to its own filesystem.\n */\n async writeProjectMetadata(\n input: WriteProjectMetadataInput\n ): Promise<CapabilityResult<WriteProjectMetadataResult>> {\n try {\n const metadataPath = writeProjectJson(input);\n return ok(this.target, { path: metadataPath, written: true });\n } catch (error) {\n return fail(\n this.target,\n 'TARGET_OPERATION_FAILED',\n `Failed to write project metadata: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n // ---- routed (WS-D 3) -------------------------------------------------\n\n async readRepositoryTree(input: ReadRepositoryTreeInput) {\n try {\n const tree = readGitRepositoryTree(input.repoPath);\n return ok(this.target, {\n rootPath: tree.rootPath,\n gitRoot: tree.gitRoot,\n branch: tree.branch,\n commit: tree.commit,\n entries: tree.entries,\n truncated: tree.truncated\n });\n } catch (error) {\n if (error instanceof RepositoryReadError && error.code === 'not_git_repository') {\n return fail(this.target, 'NOT_GIT_REPOSITORY', error.message, {\n resourceId: input.resourceId\n });\n }\n return fail(\n this.target,\n 'TARGET_OPERATION_FAILED',\n error instanceof Error ? error.message : 'Could not read repository.',\n { resourceId: input.resourceId }\n );\n }\n }\n\n async listBranches(input: ListBranchesInput) {\n try {\n const local = runGit(input.repoPath, ['branch', '--format=%(refname:short)']);\n const remote = runGit(input.repoPath, ['branch', '-r', '--format=%(refname:short)']);\n const current = runGit(input.repoPath, ['branch', '--show-current']) || null;\n return ok(this.target, {\n local: local\n .split('\\n')\n .map(normalizeBranchRef)\n .filter(name => name && !name.includes('->') && name !== 'HEAD'),\n remote: remote\n .split('\\n')\n .map(normalizeBranchRef)\n .filter(name => name && !name.includes('->') && name !== 'HEAD'),\n current\n });\n } catch (error) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n error instanceof Error ? error.message : 'Could not list repository branches.',\n { resourceId: input.resourceId }\n );\n }\n }\n\n // ---- routed (WS-D 4) -------------------------------------------------\n\n async listWorktrees(input: ListWorktreesInput) {\n try {\n const worktrees = collectManagedWorktrees(input);\n return ok(this.target, { worktrees });\n } catch (error) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n error instanceof Error ? error.message : 'Could not list worktrees.'\n );\n }\n }\n\n async removeWorktree(input: RemoveWorktreeInput) {\n try {\n const result = removeManagedWorktree({\n path: input.path,\n primaryRepoPath: input.primaryRepoPath,\n force: input.force ?? false\n });\n if (!input.force && result.skipped.some(s => s.reason === 'uncommitted changes')) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n `The worktree has uncommitted changes \u2014 removing it would lose work: ${input.path}`,\n { branchActionCode: 'WORKTREE_DIRTY', detail: 'Re-run with force to remove it anyway.' }\n );\n }\n return ok(this.target, result);\n } catch (error) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n error instanceof Error ? error.message : 'Could not remove worktree.'\n );\n }\n }\n\n async purgeMergedWorktrees(input: PurgeMergedWorktreesInput) {\n try {\n return ok(this.target, purgeManagedWorktrees(input));\n } catch (error) {\n return fail(\n this.target,\n 'GIT_COMMAND_FAILED',\n error instanceof Error ? error.message : 'Could not purge worktrees.'\n );\n }\n }\n\n async performBranchAction(input: PerformBranchActionInput) {\n const result = performBranchActionGit(input);\n if (result.ok) return ok(this.target, { summary: result.summary });\n return fail(this.target, 'GIT_COMMAND_FAILED', result.message, {\n branchActionCode: result.code,\n detail: result.detail\n });\n }\n\n // ---- routed (WS-D 5) -------------------------------------------------\n\n async generateCommitMessageFromLocalDiff(input: GenerateCommitMessageInput) {\n const result = gatherCommitMessageDiff(input.worktreePath);\n if (!result.ok) {\n return fail(this.target, 'GIT_COMMAND_FAILED', result.message, {\n branchActionCode: result.code,\n detail: result.detail\n });\n }\n return ok(this.target, { diff: result.diff });\n }\n\n // ---- routed (WS-D 6) -------------------------------------------------\n\n async launchAgent(_input: LaunchAgentInput) {\n return fail(\n this.target,\n 'CAPABILITY_NOT_IMPLEMENTED',\n 'Agent launch is owned by the CLI runner (`ovld runner` / `ovld launch`).'\n );\n }\n\n async doctor() {\n return ok(this.target, { checks: runLocalTargetDoctorChecks() });\n }\n\n // ---- not yet routed (CLI-owned or future WS-D paths) -----------------\n\n prepareBranch(_input: PrepareBranchInput) {\n return this.#notImplemented();\n }\n readCurrentDiff(_input: ReadCurrentDiffInput) {\n return this.#notImplemented();\n }\n\n #notImplemented(): Promise<CapabilityFailure> {\n return Promise.resolve(\n fail(\n this.target,\n 'CAPABILITY_NOT_IMPLEMENTED',\n 'This capability is not yet routed through the in-process provider.'\n )\n );\n }\n}\n", "// Provider registry/resolver: maps a selected execution *target* to a capability\n// *provider transport*. Callers select a target, never a transport \u2014 the\n// resolver picks in-process / desktop-bridge / runner-queue from the target's\n// type and reachability (R2). This keeps the same product code working whether\n// the chosen target is co-located, across an IPC bridge, or a CLI-only VM on the\n// far side of the runner queue.\n\nimport { fail } from './result.ts';\nimport type {\n CapabilityFailure,\n GenerateCommitMessageInput,\n LaunchAgentInput,\n ListBranchesInput,\n ListWorktreesInput,\n LocalTargetCapabilities,\n LocalTargetErrorCode,\n ObserveResourceInput,\n PerformBranchActionInput,\n PrepareBranchInput,\n PurgeMergedWorktreesInput,\n ReadCurrentDiffInput,\n ReadRepositoryTreeInput,\n RemoveWorktreeInput,\n TargetMetadata,\n WriteProjectMetadataInput\n} from './types.ts';\n\n/**\n * The minimal view of an execution target the resolver needs. Built from\n * `execution_targets` rows plus reachability joined from \u00A75 observations; kept\n * structural so this module stays dependency-free.\n */\nexport interface ExecutionTargetRef {\n executionTargetId: string | null;\n /** `execution_targets.type`: 'local' | 'cloud_persistent' | 'cloud_sandbox' | 'ssh' | \u2026 */\n type: string;\n deviceLabel?: string | null;\n /** Whether the target is currently reachable (from heartbeat/observations). */\n reachable?: boolean;\n}\n\n/**\n * A factory inspects a target and returns a provider that can serve it, or\n * `null` to defer to the next factory. Registration order is priority order.\n */\nexport type LocalTargetProviderFactory = (\n target: ExecutionTargetRef\n) => LocalTargetCapabilities | null;\n\nexport class LocalTargetProviderRegistry {\n readonly #factories: LocalTargetProviderFactory[] = [];\n\n /** Register a factory. Earlier registrations win. */\n register(factory: LocalTargetProviderFactory): this {\n this.#factories.push(factory);\n return this;\n }\n\n /** Resolve a provider for the target, or `null` when none can serve it. */\n resolve(target: ExecutionTargetRef): LocalTargetCapabilities | null {\n for (const factory of this.#factories) {\n const provider = factory(target);\n if (provider) return provider;\n }\n return null;\n }\n\n /**\n * Resolve a provider, falling back to an {@link UnavailableProvider} that\n * returns `LOCAL_TARGET_REQUIRED` from every capability. Callers then always\n * get a typed {@link CapabilityResult} and never have to null-check.\n */\n resolveOrUnavailable(target: ExecutionTargetRef): LocalTargetCapabilities {\n return (\n this.resolve(target) ??\n new UnavailableProvider(\n targetMetadata(target, 'fake'),\n 'LOCAL_TARGET_REQUIRED',\n 'No local execution target is available to serve this operation. Select a logged-in target with access to this checkout.'\n )\n );\n }\n}\n\n/** Derive {@link TargetMetadata} for a target ref under a given transport. */\nexport function targetMetadata(\n target: ExecutionTargetRef,\n transport: TargetMetadata['transport']\n): TargetMetadata {\n return {\n executionTargetId: target.executionTargetId,\n deviceLabel: target.deviceLabel ?? null,\n transport\n };\n}\n\n/**\n * A provider whose every capability returns the same typed failure. Used when no\n * transport can serve a target (the generalized successor to the host-side\n * `LOCAL_FILESYSTEM_UNAVAILABLE` guard) and as a base for partial providers.\n */\nexport class UnavailableProvider implements LocalTargetCapabilities {\n constructor(\n readonly target: TargetMetadata,\n private readonly code: LocalTargetErrorCode,\n private readonly message: string\n ) {}\n\n // A CapabilityFailure is assignable to CapabilityResult<T> for any T (the\n // failure branch is generic-independent), so one helper serves every method.\n #fail(): Promise<CapabilityFailure> {\n return Promise.resolve(fail(this.target, this.code, this.message));\n }\n\n writeProjectMetadata(_input: WriteProjectMetadataInput) {\n return this.#fail();\n }\n observeResource(_input: ObserveResourceInput) {\n return this.#fail();\n }\n readRepositoryTree(_input: ReadRepositoryTreeInput) {\n return this.#fail();\n }\n listBranches(_input: ListBranchesInput) {\n return this.#fail();\n }\n prepareBranch(_input: PrepareBranchInput) {\n return this.#fail();\n }\n listWorktrees(_input: ListWorktreesInput) {\n return this.#fail();\n }\n removeWorktree(_input: RemoveWorktreeInput) {\n return this.#fail();\n }\n purgeMergedWorktrees(_input: PurgeMergedWorktreesInput) {\n return this.#fail();\n }\n performBranchAction(_input: PerformBranchActionInput) {\n return this.#fail();\n }\n readCurrentDiff(_input: ReadCurrentDiffInput) {\n return this.#fail();\n }\n generateCommitMessageFromLocalDiff(_input: GenerateCommitMessageInput) {\n return this.#fail();\n }\n launchAgent(_input: LaunchAgentInput) {\n return this.#fail();\n }\n doctor() {\n return this.#fail();\n }\n}\n", "import type { DatabaseClient } from '@overlord/database';\n\nimport type { ServiceContext } from './context.js';\nimport { newId, nowIso } from './util.js';\n\n// Mirrors the canonical `ChangeOperation` in `@overlord/contract`. Kept as a\n// local definition because `@overlord/core` does not depend on the contract\n// package; it must stay a superset of every operation either data layer records.\nexport type ChangeOperation = 'insert' | 'update' | 'delete' | 'restore';\n\n/**\n * The fully-resolved column values for one `entity_changes` row. Every caller\n * resolves its own context (workspace/actor/source/token) and hands the result\n * to {@link insertEntityChange}, so the raw SQL and column order live in exactly\n * one place and the REST and protocol writers cannot silently diverge.\n */\nexport interface EntityChangeFields {\n workspaceId: string;\n projectId?: string | null;\n missionId?: string | null;\n objectiveId?: string | null;\n entityType: string;\n entityId: string;\n operation: ChangeOperation;\n entityRevision?: number | null;\n changedFields?: string[];\n actorWorkspaceUserId: string | null;\n /** REST path fills this from the active token; the protocol path leaves it NULL. */\n actorTokenId?: string | null;\n source: string;\n}\n\n/**\n * The single `entity_changes` writer shared by both data layers (the REST\n * `backend/db.ts` path and the protocol/CLI service path). This must run\n * inside the same transaction as the domain mutation so the realtime feed never\n * diverges from the data; the realtime poller turns these rows into SSE deltas.\n */\nexport async function insertEntityChange(\n client: DatabaseClient,\n fields: EntityChangeFields\n): Promise<void> {\n await client.run(\n `INSERT INTO entity_changes (\n id, workspace_id, project_id, mission_id, objective_id,\n entity_type, entity_id, operation, entity_revision,\n changed_fields_json, actor_workspace_user_id, actor_token_id, source, occurred_at\n ) VALUES (\n ?, ?, ?, ?, ?,\n ?, ?, ?, ?,\n ?, ?, ?, ?, ?\n )`,\n [\n newId(),\n fields.workspaceId,\n fields.projectId ?? null,\n fields.missionId ?? null,\n fields.objectiveId ?? null,\n fields.entityType,\n fields.entityId,\n fields.operation,\n fields.entityRevision ?? null,\n JSON.stringify(fields.changedFields ?? []),\n fields.actorWorkspaceUserId,\n fields.actorTokenId ?? null,\n fields.source,\n nowIso()\n ]\n );\n}\n\nexport async function recordChange({\n ctx,\n entityType,\n entityId,\n operation,\n entityRevision,\n projectId,\n missionId,\n objectiveId,\n changedFields\n}: {\n ctx: ServiceContext;\n entityType: string;\n entityId: string;\n operation: ChangeOperation;\n entityRevision?: number | null;\n projectId?: string | null;\n missionId?: string | null;\n objectiveId?: string | null;\n changedFields?: string[];\n}): Promise<void> {\n await insertEntityChange(ctx.db, {\n workspaceId: ctx.workspace.id,\n projectId,\n missionId,\n objectiveId,\n entityType,\n entityId,\n operation,\n entityRevision,\n changedFields,\n actorWorkspaceUserId: ctx.actorWorkspaceUserId,\n // The protocol/service path does not attribute changes to a token.\n actorTokenId: null,\n source: ctx.source\n });\n}\n", "export class ServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status = 400,\n /** Structured, machine-readable payload for self-servicing error recovery. */\n public readonly details?: unknown\n ) {\n super(message);\n this.name = 'ServiceError';\n }\n}\n\nexport function assertFound<T>(value: T | null | undefined, message: string): T {\n if (value === null || value === undefined) {\n throw new ServiceError(message, 'not_found', 404);\n }\n return value;\n}\n", "import { type DatabaseClient } from '@overlord/database';\n\nimport type { ClientDeviceIdentity } from './device-identity.js';\nimport { ServiceError } from './errors.js';\n\nexport type WorkspaceContext = {\n id: string;\n slug: string;\n name: string;\n};\n\nexport type { ClientDeviceIdentity } from './device-identity.js';\n\nexport type ServiceContext = {\n db: DatabaseClient;\n workspace: WorkspaceContext;\n actorWorkspaceUserId: string | null;\n source: 'cli' | 'protocol' | 'webapp' | 'runner';\n /** Client machine identity (browser/desktop/CLI). Required on hosted backends. */\n clientDevice?: ClientDeviceIdentity | null;\n};\n\nexport async function createServiceContext({\n db,\n source\n}: {\n db: DatabaseClient;\n source: ServiceContext['source'];\n}): Promise<ServiceContext> {\n const workspace = await db.get<WorkspaceContext>(\n `SELECT id, slug, name FROM workspaces\n WHERE deleted_at IS NULL ORDER BY created_at ASC LIMIT 1`\n );\n\n if (!workspace) {\n throw new ServiceError(\n 'No workspace found. Run `ovld init` and `yarn start:local` first.',\n 'no_workspace',\n 503\n );\n }\n\n const actor = await db.get<{ id: string }>(\n `SELECT id FROM workspace_users\n WHERE workspace_id = ? AND status = 'active' AND deleted_at IS NULL\n ORDER BY created_at ASC LIMIT 1`,\n [workspace.id]\n );\n\n return {\n db,\n workspace,\n actorWorkspaceUserId: actor?.id ?? null,\n source\n };\n}\n\nexport async function resolveMissionId(\n ctx: ServiceContext,\n missionRef: string\n): Promise<{ id: string; displayId: string; projectId: string }> {\n const byId = await ctx.db.get<{ id: string; display_id: string; project_id: string }>(\n `SELECT id, display_id, project_id FROM missions\n WHERE id = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [missionRef, ctx.workspace.id]\n );\n\n if (byId) {\n return { id: byId.id, displayId: byId.display_id, projectId: byId.project_id };\n }\n\n const byDisplay = await ctx.db.get<{ id: string; display_id: string; project_id: string }>(\n `SELECT id, display_id, project_id FROM missions\n WHERE display_id = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [missionRef, ctx.workspace.id]\n );\n\n if (byDisplay) {\n return {\n id: byDisplay.id,\n displayId: byDisplay.display_id,\n projectId: byDisplay.project_id\n };\n }\n\n throw new ServiceError(`Mission not found: ${missionRef}`, 'mission_not_found', 404);\n}\n\nexport async function resolveProjectId(ctx: ServiceContext, projectRef: string): Promise<string> {\n const byId = await ctx.db.get<{ id: string }>(\n `SELECT id FROM projects\n WHERE id = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [projectRef, ctx.workspace.id]\n );\n if (byId) return byId.id;\n\n const bySlug = await ctx.db.get<{ id: string }>(\n `SELECT id FROM projects\n WHERE slug = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [projectRef, ctx.workspace.id]\n );\n if (bySlug) return bySlug.id;\n\n const byName = await ctx.db.get<{ id: string }>(\n `SELECT id FROM projects\n WHERE lower(name) = lower(?) AND workspace_id = ? AND deleted_at IS NULL`,\n [projectRef, ctx.workspace.id]\n );\n if (byName) return byName.id;\n\n throw new ServiceError(`Project not found: ${projectRef}`, 'project_not_found', 404);\n}\n", "import type { CapabilityFailure, CapabilitySuccess } from './local-target/types.ts';\nimport { recordChange } from './change-feed.ts';\nimport type { ServiceContext } from './context.ts';\nimport { resolveMissionId, resolveProjectId } from './context.ts';\nimport { ServiceError } from './errors.ts';\nimport { newId, nowIso } from './util.ts';\n\nexport const LOCAL_TARGET_MUTATION_METADATA_KEY = 'overlord.localTargetMutation';\nexport const LOCAL_TARGET_MUTATION_REQUESTED_SOURCE = 'local_target_mutation';\n\nexport type LocalTargetMutationKind = 'branch_action' | 'worktree_purge';\n\nexport type LocalTargetMutationCapability =\n | 'performBranchAction'\n | 'purgeMergedWorktrees'\n | 'removeWorktree';\n\nexport type LocalTargetMutationPayload = {\n kind: LocalTargetMutationKind;\n capability: LocalTargetMutationCapability;\n input: Record<string, unknown>;\n result?:\n | { ok: true; value: unknown }\n | { ok: false; code: string; message: string; details?: unknown };\n};\n\nexport type LocalTargetMutationResult = CapabilitySuccess<unknown> | CapabilityFailure;\n\nfunction parseMetadataObject(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : {};\n } catch {\n return {};\n }\n}\n\nexport function buildLocalTargetMutationMetadata({\n kind,\n capability,\n input\n}: {\n kind: LocalTargetMutationKind;\n capability: LocalTargetMutationCapability;\n input: Record<string, unknown>;\n}): Record<string, unknown> {\n return {\n [LOCAL_TARGET_MUTATION_METADATA_KEY]: {\n kind,\n capability,\n input\n } satisfies LocalTargetMutationPayload\n };\n}\n\nexport function parseLocalTargetMutation(\n metadataJson: string | Record<string, unknown>\n): LocalTargetMutationPayload | null {\n const metadata =\n typeof metadataJson === 'string' ? parseMetadataObject(metadataJson) : metadataJson;\n const raw = metadata[LOCAL_TARGET_MUTATION_METADATA_KEY];\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null;\n const payload = raw as Record<string, unknown>;\n const kind = payload.kind;\n const capability = payload.capability;\n if (kind !== 'branch_action' && kind !== 'worktree_purge') return null;\n if (\n capability !== 'performBranchAction' &&\n capability !== 'purgeMergedWorktrees' &&\n capability !== 'removeWorktree'\n ) {\n return null;\n }\n const input =\n payload.input && typeof payload.input === 'object' && !Array.isArray(payload.input)\n ? (payload.input as Record<string, unknown>)\n : {};\n const result = payload.result;\n const parsedResult =\n result && typeof result === 'object' && !Array.isArray(result)\n ? (result as LocalTargetMutationPayload['result'])\n : undefined;\n return {\n kind,\n capability,\n input,\n ...(parsedResult ? { result: parsedResult } : {})\n };\n}\n\nexport function isLocalTargetMutationMetadata(metadataJson: string): boolean {\n return parseLocalTargetMutation(metadataJson) !== null;\n}\n\nasync function resolveMutationObjectiveId({\n ctx,\n missionId\n}: {\n ctx: ServiceContext;\n missionId: string;\n}): Promise<string> {\n const row = (await ctx.db.get(\n `SELECT id FROM objectives\n WHERE mission_id = ? AND workspace_id = ? AND deleted_at IS NULL\n ORDER BY position ASC\n LIMIT 1`,\n [missionId, ctx.workspace.id]\n )) as { id: string } | undefined;\n if (!row) {\n throw new ServiceError(\n 'Mission has no objectives to anchor a local-target mutation request.',\n 'no_objective_for_mutation',\n 409\n );\n }\n return row.id;\n}\n\nexport async function createLocalTargetMutationRequest({\n ctx,\n projectId,\n missionId,\n executionTargetId,\n kind,\n capability,\n input,\n eventSummary\n}: {\n ctx: ServiceContext;\n projectId: string;\n missionId: string;\n executionTargetId: string;\n kind: LocalTargetMutationKind;\n capability: LocalTargetMutationCapability;\n input: Record<string, unknown>;\n eventSummary?: string;\n}): Promise<{ id: string }> {\n const mission = await resolveMissionId(ctx, missionId);\n const resolvedProjectId = await resolveProjectId(ctx, projectId);\n const objectiveId = await resolveMutationObjectiveId({ ctx, missionId: mission.id });\n const now = nowIso();\n const id = newId();\n const metadata = buildLocalTargetMutationMetadata({ kind, capability, input });\n\n await ctx.db.transaction(async tx => {\n const txCtx = { ...ctx, db: tx };\n await txCtx.db.run(\n `INSERT INTO execution_requests\n (id, workspace_id, project_id, mission_id, objective_id, execution_target_id,\n requested_agent, requested_model, requested_reasoning_effort, launch_mode,\n launch_flags_json, target_kind, requested_source, idempotency_key, status,\n requested_by_workspace_user_id, resolved_resource_id, resolved_working_directory,\n metadata_json, created_at, updated_at, revision)\n VALUES (?, ?, ?, ?, ?, ?, NULL, NULL, NULL, 'run', '{}', 'local', ?, NULL, 'queued', ?, NULL, NULL, ?, ?, ?, 1)`,\n [\n id,\n ctx.workspace.id,\n resolvedProjectId,\n mission.id,\n objectiveId,\n executionTargetId,\n LOCAL_TARGET_MUTATION_REQUESTED_SOURCE,\n ctx.actorWorkspaceUserId,\n JSON.stringify(metadata),\n now,\n now\n ]\n );\n await recordChange({\n ctx: txCtx,\n entityType: 'execution_request',\n entityId: id,\n operation: 'insert',\n entityRevision: 1,\n projectId: resolvedProjectId,\n missionId: mission.id,\n objectiveId,\n changedFields: ['status', 'requested_source', 'metadata_json']\n });\n await txCtx.db.run(\n `INSERT INTO mission_events\n (id, workspace_id, project_id, mission_id, objective_id, type, phase, summary,\n payload_json, source, actor_workspace_user_id, created_at)\n VALUES (?, ?, ?, ?, ?, 'execution_requested', 'execute', ?, ?, 'webapp', ?, ?)`,\n [\n newId(),\n ctx.workspace.id,\n resolvedProjectId,\n mission.id,\n objectiveId,\n eventSummary ?? `Queued ${kind.replace('_', ' ')} on remote execution target.`,\n JSON.stringify({ executionRequestId: id, kind, capability }),\n ctx.actorWorkspaceUserId,\n now\n ]\n );\n });\n\n return { id };\n}\n\nexport async function completeLocalTargetMutationRequest({\n ctx,\n requestId,\n result\n}: {\n ctx: ServiceContext;\n requestId: string;\n result: LocalTargetMutationResult;\n}): Promise<LocalTargetMutationPayload | null> {\n const row = (await ctx.db.get(\n `SELECT id, workspace_id, project_id, mission_id, objective_id, status, revision, metadata_json,\n requested_source\n FROM execution_requests\n WHERE id = ? AND workspace_id = ? AND deleted_at IS NULL`,\n [requestId, ctx.workspace.id]\n )) as\n | {\n id: string;\n workspace_id: string;\n project_id: string;\n mission_id: string;\n objective_id: string;\n status: string;\n revision: number;\n metadata_json: string;\n requested_source: string;\n }\n | undefined;\n\n if (!row) {\n throw new ServiceError('Execution request not found', 'execution_request_not_found', 404);\n }\n if (row.requested_source !== LOCAL_TARGET_MUTATION_REQUESTED_SOURCE) {\n throw new ServiceError(\n 'Execution request is not a local-target mutation.',\n 'not_local_target_mutation',\n 409\n );\n }\n if (row.status !== 'launching' && row.status !== 'claimed') {\n throw new ServiceError(\n `Cannot complete local-target mutation from status ${row.status}.`,\n 'invalid_execution_request_transition',\n 409\n );\n }\n\n const mutation = parseLocalTargetMutation(row.metadata_json);\n if (!mutation) {\n throw new ServiceError(\n 'Execution request is missing local-target mutation metadata.',\n 'invalid_local_target_mutation',\n 409\n );\n }\n\n const storedResult = result.ok\n ? { ok: true as const, value: result.value }\n : {\n ok: false as const,\n code: result.code,\n message: result.message,\n ...(result.details !== undefined ? { details: result.details } : {})\n };\n\n const metadata = parseMetadataObject(row.metadata_json);\n metadata[LOCAL_TARGET_MUTATION_METADATA_KEY] = {\n ...mutation,\n result: storedResult\n };\n\n const now = nowIso();\n const revision = row.revision + 1;\n const nextStatus = result.ok ? 'launched' : 'failed';\n const lastError = result.ok ? null : result.message;\n\n await ctx.db.transaction(async tx => {\n const txCtx = { ...ctx, db: tx };\n const updated = await txCtx.db.run(\n `UPDATE execution_requests\n SET status = ?,\n metadata_json = ?,\n last_error = ?,\n launch_completed_at = ?,\n updated_at = ?,\n revision = ?\n WHERE id = ? AND status = ? AND revision = ?`,\n [\n nextStatus,\n JSON.stringify(metadata),\n lastError,\n now,\n now,\n revision,\n row.id,\n row.status,\n row.revision\n ]\n );\n if (updated.changes === 0) {\n throw new ServiceError(\n 'Execution request changed while completing local-target mutation.',\n 'execution_request_conflict',\n 409\n );\n }\n await recordChange({\n ctx: txCtx,\n entityType: 'execution_request',\n entityId: row.id,\n operation: 'update',\n entityRevision: revision,\n projectId: row.project_id,\n missionId: row.mission_id,\n objectiveId: row.objective_id,\n changedFields: ['status', 'metadata_json', 'last_error', 'launch_completed_at']\n });\n await txCtx.db.run(\n `INSERT INTO mission_events\n (id, workspace_id, project_id, mission_id, objective_id, type, phase, summary,\n payload_json, source, actor_workspace_user_id, created_at)\n VALUES (?, ?, ?, ?, ?, 'update', 'execute', ?, ?, 'runner', NULL, ?)`,\n [\n newId(),\n ctx.workspace.id,\n row.project_id,\n row.mission_id,\n row.objective_id,\n result.ok\n ? `Completed ${mutation.kind.replace('_', ' ')} on execution target.`\n : `Local-target mutation failed: ${result.message}`,\n JSON.stringify({ executionRequestId: row.id, result: storedResult }),\n now\n ]\n );\n });\n\n return parseLocalTargetMutation(JSON.stringify(metadata));\n}\n", "import { InProcessProvider } from './local-target/in-process-provider.ts';\nimport { targetMetadata } from './local-target/registry.ts';\nimport type {\n LocalTargetCapabilities,\n PerformBranchActionInput,\n PurgeMergedWorktreesInput,\n RemoveWorktreeInput\n} from './local-target/types.ts';\nimport type { CapabilityResult } from './local-target/types.ts';\nimport { worktreePathForBranch } from './local-target/worktree-git.ts';\nimport {\n type LocalTargetMutationPayload,\n parseLocalTargetMutation\n} from './local-target-mutations.ts';\n\nfunction inProcessProvider(): LocalTargetCapabilities {\n return new InProcessProvider(\n targetMetadata({ executionTargetId: 'runner', type: 'local', reachable: true }, 'in_process')\n );\n}\n\nexport async function executeLocalTargetMutation({\n mutation\n}: {\n mutation: LocalTargetMutationPayload;\n}): Promise<CapabilityResult<unknown>> {\n const provider = inProcessProvider();\n\n switch (mutation.capability) {\n case 'performBranchAction': {\n // The control plane predicts `worktreePath` without filesystem access (it may\n // not be co-located with the checkout), so it always resolves to the canonical\n // worktree-mode path even for a branch-only mission checked out directly in the\n // primary repo. This runner *is* on the execution target with real git access,\n // so re-derive the actual checkout location the same way the desktop bridge does\n // for local execution, falling back to the queued path when the branch isn't\n // checked out anywhere yet.\n const input = mutation.input as unknown as PerformBranchActionInput;\n const resolvedWorktreePath =\n worktreePathForBranch(input.primaryRepoPath, input.branchName) ?? input.worktreePath;\n return provider.performBranchAction({ ...input, worktreePath: resolvedWorktreePath });\n }\n case 'removeWorktree':\n return provider.removeWorktree(mutation.input as unknown as RemoveWorktreeInput);\n case 'purgeMergedWorktrees':\n return provider.purgeMergedWorktrees(mutation.input as unknown as PurgeMergedWorktreesInput);\n default:\n return {\n ok: false,\n code: 'CAPABILITY_NOT_IMPLEMENTED',\n message: `Unsupported local-target mutation capability.`,\n target: targetMetadata(\n { executionTargetId: 'runner', type: 'local', reachable: true },\n 'in_process'\n )\n };\n }\n}\n\nexport function parseMutationFromMetadata(metadata: unknown): LocalTargetMutationPayload | null {\n if (!metadata || typeof metadata !== 'object') return null;\n return parseLocalTargetMutation(metadata as Record<string, unknown>);\n}\n", "import path from 'node:path';\n\nimport { slugify } from './util.js';\n\n/** Stable logical key for a project checkout within a project + execution target. */\nexport function deriveProjectResourceKey({\n resourceKey,\n label,\n directoryPath\n}: {\n resourceKey?: string | null;\n label?: string | null;\n directoryPath: string;\n}): string {\n const explicit = resourceKey?.trim();\n if (explicit) return slugify(explicit);\n const labelKey = label?.trim();\n if (labelKey) return slugify(labelKey);\n return slugify(path.basename(path.resolve(directoryPath)));\n}\n", "// Deterministic per-mission branch/worktree planning for the Runner Layer.\n//\n// This is one of Overlord's \"Shared Deterministic Algorithms\" (see CONTRACT.md):\n// the service layer keeps a byte-for-byte-equivalent copy at\n// backend/branch-planning.ts. Both are pinned to the shared conformance\n// fixture contract/branch-planning-vectors.json. Do not import the webapp copy\n// across the component boundary, and bump the contract version (regenerating the\n// fixture) on any behavioral change here.\nimport path from 'node:path';\n\nexport type BranchAutomationAction = 'create' | 'reuse' | 'new_cycle';\n\nexport type BranchDecisionInput = {\n mission: { title: string; sequence: number };\n project: { slug: string };\n resourceKey: string;\n recordedBranch: string | null;\n base: string;\n refs: { local: string[]; remote: string[]; merged: string[]; checkedOut?: string[] };\n worktreeRoot: string;\n overrideBranch?: string | null;\n};\n\nexport type BranchDecision =\n | {\n action: 'reuse';\n branch: string;\n worktreePath: string;\n baseBranch: string;\n cycle: number;\n }\n | {\n action: 'create';\n branch: string;\n worktreePath: string;\n baseBranch: string;\n cycle: number;\n from: string;\n }\n | {\n action: 'new_cycle';\n branch: string;\n worktreePath: string;\n baseBranch: string;\n cycle: number;\n from: string;\n };\n\nexport type MissionBranchPreviewInput = Pick<\n BranchDecisionInput,\n 'mission' | 'project' | 'resourceKey' | 'base' | 'worktreeRoot'\n>;\n\nconst TITLE_SLUG_MAX = 48;\n\nfunction stripCombiningMarks(value: string): string {\n return value.normalize('NFKD').replace(/[\\u0300-\\u036f]/g, '');\n}\n\nexport function slugifyBranchTitle(title: string, fallback: string): string {\n const slug = stripCombiningMarks(title)\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n const truncated = slug.length > TITLE_SLUG_MAX ? slug.slice(0, TITLE_SLUG_MAX) : slug;\n const boundary = truncated.length === TITLE_SLUG_MAX ? truncated.lastIndexOf('-') : -1;\n const bounded =\n boundary > 0 && boundary >= Math.floor(TITLE_SLUG_MAX * 0.6)\n ? truncated.slice(0, boundary)\n : truncated;\n return bounded.replace(/^-+|-+$/g, '') || fallback;\n}\n\nexport function sanitizeBranchName(branch: string, fallback: string): string {\n let sanitized = stripCombiningMarks(branch)\n .toLowerCase()\n .replace(/\\\\/g, '/')\n .replace(/\\/+/g, '/')\n .replace(/\\.\\.+/g, '.')\n .replace(/(^|\\/)[.-]+/g, '$1')\n .replace(/[~^:?*[\\]\\s]+/g, '-')\n .replace(/\\/+/g, '/')\n .replace(/(?:\\.lock|[./-]+)$/g, '');\n\n if (!sanitized || sanitized.startsWith('/') || sanitized.includes('@{')) {\n sanitized = fallback;\n }\n\n return sanitized || fallback;\n}\n\nexport function canonicalMissionBranch(mission: { title: string; sequence: number }): string {\n const fallback = `mission-${mission.sequence}`;\n const titleSlug = slugifyBranchTitle(mission.title, fallback);\n return sanitizeBranchName(`${titleSlug}-${mission.sequence}`, fallback);\n}\n\nfunction branchLeaf(branch: string): string {\n return branch.replace(/[\\\\/]+/g, '-').replace(/^-+|-+$/g, '') || 'branch';\n}\n\nexport function missionWorktreePath({\n worktreeRoot,\n projectSlug,\n resourceKey,\n branch\n}: {\n worktreeRoot: string;\n projectSlug: string;\n resourceKey: string;\n branch: string;\n}): string {\n const key = resourceKey.trim() || 'project';\n return path.join(worktreeRoot, projectSlug || 'project', key, branchLeaf(branch));\n}\n\nfunction normalizeRemoteRef(ref: string): string {\n return ref\n .replace(/^origin\\//, '')\n .replace(/^refs\\/heads\\//, '')\n .replace(/^refs\\/remotes\\/origin\\//, '');\n}\n\nfunction refSet(refs: string[]): Set<string> {\n return new Set(refs.map(normalizeRemoteRef).filter(Boolean));\n}\n\nfunction highestExistingCycle(baseBranch: string, refs: Set<string>): number {\n let highest = refs.has(baseBranch) ? 1 : 0;\n const escaped = baseBranch.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`^${escaped}-(\\\\d+)$`);\n for (const ref of refs) {\n const match = ref.match(pattern);\n if (!match) continue;\n const value = Number.parseInt(match[1] ?? '', 10);\n if (Number.isFinite(value)) highest = Math.max(highest, value);\n }\n return highest;\n}\n\nfunction withWorktreeFields(input: BranchDecisionInput, branch: string) {\n const canonicalBranch = canonicalMissionBranch(input.mission);\n const cycleMatch = branch.startsWith(`${canonicalBranch}-`)\n ? Number.parseInt(branch.slice(canonicalBranch.length + 1), 10)\n : 1;\n return {\n branch,\n worktreePath: missionWorktreePath({\n worktreeRoot: input.worktreeRoot,\n projectSlug: input.project.slug,\n resourceKey: input.resourceKey,\n branch\n }),\n baseBranch: input.base,\n cycle: Number.isFinite(cycleMatch) && cycleMatch > 1 ? cycleMatch : 1\n };\n}\n\nexport function planMissionBranch(input: BranchDecisionInput): BranchDecision {\n const baseBranch = canonicalMissionBranch(input.mission);\n const allRefs = refSet([...input.refs.local, ...input.refs.remote]);\n const mergedRefs = refSet(input.refs.merged);\n const checkedOutRefs = refSet(input.refs.checkedOut ?? []);\n const override = input.overrideBranch\n ? sanitizeBranchName(input.overrideBranch, input.overrideBranch)\n : null;\n\n if (override) {\n const exists = allRefs.has(override);\n return exists\n ? { action: 'reuse', ...withWorktreeFields(input, override) }\n : { action: 'create', ...withWorktreeFields(input, override), from: input.base };\n }\n\n if (input.recordedBranch) {\n const recorded = normalizeRemoteRef(input.recordedBranch);\n const stillExists = allRefs.has(recorded);\n const merged = mergedRefs.has(recorded) || !stillExists;\n if (!merged) {\n return { action: 'reuse', ...withWorktreeFields(input, recorded) };\n }\n }\n\n if (!input.recordedBranch) {\n return allRefs.has(baseBranch)\n ? { action: 'reuse', ...withWorktreeFields(input, baseBranch) }\n : { action: 'create', ...withWorktreeFields(input, baseBranch), from: input.base };\n }\n\n const nextCycle = Math.max(2, highestExistingCycle(baseBranch, allRefs) + 1);\n let candidate = `${baseBranch}-${nextCycle}`;\n let cycle = nextCycle;\n while (allRefs.has(candidate) || checkedOutRefs.has(candidate) || mergedRefs.has(candidate)) {\n cycle += 1;\n candidate = `${baseBranch}-${cycle}`;\n }\n return { action: 'new_cycle', ...withWorktreeFields(input, candidate), from: input.base };\n}\n\nexport function previewMissionBranch(input: MissionBranchPreviewInput): BranchDecision {\n return planMissionBranch({\n ...input,\n recordedBranch: null,\n refs: { local: [], remote: [], merged: [] }\n });\n}\n", "import { deriveProjectResourceKey } from '@overlord/core/service/project-resource-key';\nimport { execFileSync } from 'node:child_process';\nimport { existsSync, mkdirSync, statSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { type BranchDecision, planMissionBranch } from './branch-planning.js';\nimport type { CliRuntime } from './runtime.js';\n\nexport type BranchPreparationOptions = {\n missionId: string;\n workingDirectory: string;\n /** Logical project resource key for worktree path planning. */\n resourceKey?: string | null;\n /** Objective being launched; used to resolve resourceKey from the mission payload. */\n objectiveId?: string | null;\n /**\n * The workspace-wide worktree/branch automation setting. Used as a fallback to\n * recompute the mission's effective decision when the mission DTO does not\n * carry the resolved `willPrepareBranch`/`willUseWorktree` flags.\n */\n workspaceAutomationEnabled: boolean;\n /** No git side-effects; used for launch previews. */\n dryRun?: boolean;\n /** The `--no-worktree` flag: downgrade a worktree decision to a branch-only checkout. */\n noWorktree?: boolean;\n overrideBranch?: string | null;\n};\n\nexport type BranchPreparationResult = {\n workingDirectory: string;\n branchAutomation: BranchAutomationPayload | null;\n};\n\nexport type BranchAutomationPayload = {\n branchName: string;\n baseBranch: string;\n worktreePath: string;\n resourceKey: string;\n action: BranchDecision['action'];\n cycle: number;\n};\n\nexport type MissionShape = {\n title?: unknown;\n sequenceNumber?: unknown;\n sequence?: unknown;\n projectId?: unknown;\n projectSlug?: unknown;\n project?: { slug?: unknown };\n objectives?: Array<{ id?: unknown; resourceKey?: unknown }>;\n branch?: {\n name?: unknown;\n status?: unknown;\n baseBranch?: unknown;\n overrideBranch?: unknown;\n worktreePreference?: unknown;\n willPrepareBranch?: unknown;\n willUseWorktree?: unknown;\n } | null;\n};\n\ntype ProjectShape = {\n id?: unknown;\n slug?: unknown;\n};\n\nfunction runGit(cwd: string, args: string[], options: { optional?: boolean } = {}): string {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024\n }).trim();\n } catch (error) {\n if (options.optional) return '';\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`git ${args.join(' ')} failed in ${cwd}: ${message}`, { cause: error });\n }\n}\n\nfunction lines(value: string): string[] {\n return value\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean);\n}\n\nfunction resolveGitRoot(workingDirectory: string): string {\n const root = runGit(workingDirectory, ['rev-parse', '--show-toplevel']);\n if (!root) throw new Error(`${workingDirectory} is not inside a git repository.`);\n return path.resolve(root);\n}\n\nfunction repoDefaultBranch(gitRoot: string): string {\n const symbolic = runGit(gitRoot, ['symbolic-ref', '--short', 'refs/remotes/origin/HEAD'], {\n optional: true\n });\n const fromOrigin = symbolic.replace(/^origin\\//, '').trim();\n if (fromOrigin) return fromOrigin;\n const local = lines(runGit(gitRoot, ['branch', '--format=%(refname:short)'], { optional: true }));\n if (local.includes('main')) return 'main';\n if (local.includes('master')) return 'master';\n return local[0] ?? 'main';\n}\n\nfunction mainWorktreeBranch(gitRoot: string): string | null {\n const out = runGit(gitRoot, ['worktree', 'list', '--porcelain'], { optional: true });\n let inMainWorktree = false;\n for (const line of out.split('\\n')) {\n if (line.startsWith('worktree ')) {\n if (inMainWorktree) break;\n inMainWorktree = true;\n continue;\n }\n if (!inMainWorktree || !line.startsWith('branch ')) continue;\n const branch = line\n .slice('branch '.length)\n .trim()\n .replace(/^refs\\/heads\\//, '');\n return branch || null;\n }\n const current = runGit(gitRoot, ['branch', '--show-current'], { optional: true });\n return current || null;\n}\n\nfunction refExists(gitRoot: string, ref: string): boolean {\n return (\n runGit(gitRoot, ['rev-parse', '--verify', '--quiet', `refs/heads/${ref}`], {\n optional: true\n }) !== '' ||\n runGit(gitRoot, ['rev-parse', '--verify', '--quiet', `refs/remotes/origin/${ref}`], {\n optional: true\n }) !== ''\n );\n}\n\n// Resolves the base/parent branch to cut from. The project-configured default\n// branch (surfaced on the mission as `branch.baseBranch`) wins when it actually\n// exists in this checkout. Otherwise, use the user's primary checkout branch\n// (the main worktree, not a linked worktree the runner may be standing in) before\n// falling back to the repo's git default.\nfunction resolveBaseBranch(gitRoot: string, mission: MissionShape): string {\n const configured = mission.branch?.baseBranch;\n if (typeof configured === 'string' && configured.trim()) {\n const base = configured.trim();\n if (refExists(gitRoot, base)) return base;\n }\n const checkedOut = mainWorktreeBranch(gitRoot);\n if (checkedOut && refExists(gitRoot, checkedOut)) return checkedOut;\n return repoDefaultBranch(gitRoot);\n}\n\nfunction currentWorktrees(gitRoot: string): string[] {\n return lines(runGit(gitRoot, ['worktree', 'list', '--porcelain'], { optional: true }))\n .filter(line => line.startsWith('branch '))\n .map(line => line.replace(/^branch refs\\/heads\\//, '').trim())\n .filter(Boolean);\n}\n\nfunction revParse(gitRoot: string, ref: string): string {\n return runGit(gitRoot, ['rev-parse', '--verify', '--quiet', `${ref}^{commit}`], {\n optional: true\n }).trim();\n}\n\n// The set of commit SHAs on `base`'s first-parent trunk \u2014 the linear backbone you\n// walk by always following the first parent. Overlord's merge-with-parent flow\n// advances the parent with a `--no-ff` merge commit whose SECOND parent is the\n// branch tip, so a genuinely merged branch tip is NOT on this trunk; a branch the\n// base merely advanced past linearly (e.g. an empty mission branch) stays on it.\nfunction firstParentTrunk(gitRoot: string, base: string): Set<string> {\n return new Set(lines(runGit(gitRoot, ['rev-list', '--first-parent', base], { optional: true })));\n}\n\n// Branches genuinely merged into `base`: contained in the base AND off its\n// first-parent trunk (they landed via the `--no-ff` merge commit). Plain\n// `git branch --merged <base>` lists every branch whose tip is reachable from the\n// base \u2014 including freshly-cut/empty ones the base advanced past \u2014 which would make\n// the planner treat the mission's established (but un-merged) branch as merged and\n// spin up a new cycle branch for each objective. Filtering to off-trunk tips keeps\n// objectives on the same branch until it has actually been merged into its parent.\n// Mirrors the webapp's `branchMergedIntoBase` divergence/first-parent rule.\nexport function computeMergedBranches(gitRoot: string, base: string): string[] {\n const localTrunk = firstParentTrunk(gitRoot, base);\n const remoteTrunk = firstParentTrunk(gitRoot, `origin/${base}`);\n const result: string[] = [];\n const collect = (refArgs: string[], trunk: Set<string>): void => {\n for (const branch of lines(runGit(gitRoot, refArgs, { optional: true }))) {\n const sha = revParse(gitRoot, branch);\n // On the first-parent trunk \u21D2 a plain ancestor, not a real merge \u21D2 skip.\n if (sha && trunk.has(sha)) continue;\n result.push(branch);\n }\n };\n collect(['branch', '--merged', base, '--format=%(refname:short)'], localTrunk);\n collect(['branch', '-r', '--merged', `origin/${base}`, '--format=%(refname:short)'], remoteTrunk);\n return result;\n}\n\nfunction repoRefs(gitRoot: string, base: string) {\n return {\n local: lines(runGit(gitRoot, ['branch', '--format=%(refname:short)'], { optional: true })),\n remote: lines(\n runGit(gitRoot, ['branch', '-r', '--format=%(refname:short)'], { optional: true })\n ),\n merged: computeMergedBranches(gitRoot, base),\n checkedOut: currentWorktrees(gitRoot)\n };\n}\n\nfunction worktreeBranch(worktreePath: string): string | null {\n const inside = runGit(worktreePath, ['rev-parse', '--is-inside-work-tree'], { optional: true });\n if (inside !== 'true') return null;\n const branch = runGit(worktreePath, ['branch', '--show-current'], { optional: true });\n return branch || null;\n}\n\nfunction readMissionProjectSlug(mission: MissionShape): string | null {\n const slug = mission.project?.slug;\n if (typeof slug === 'string' && slug.trim()) return slug.trim();\n if (typeof mission.projectSlug === 'string' && mission.projectSlug.trim()) {\n return mission.projectSlug.trim();\n }\n return null;\n}\n\nexport async function resolveMissionProjectSlug({\n runtime,\n mission\n}: {\n runtime: CliRuntime;\n mission: MissionShape;\n}): Promise<string> {\n const embedded = readMissionProjectSlug(mission);\n if (embedded) return embedded;\n\n const projectId = typeof mission.projectId === 'string' ? mission.projectId.trim() : '';\n if (projectId) {\n try {\n const projects = (await runtime.backend.get('/api/projects')) as ProjectShape[];\n const project = Array.isArray(projects)\n ? projects.find(candidate => candidate.id === projectId)\n : null;\n if (typeof project?.slug === 'string' && project.slug.trim()) return project.slug.trim();\n } catch {\n // Keep branch preparation best-effort for older or restricted backends.\n }\n }\n\n return 'project';\n}\n\nfunction recordedMissionBranch(mission: MissionShape): string | null {\n const branch = mission.branch;\n if (!branch || branch.status === 'pending') return null;\n return typeof branch.name === 'string' && branch.name.trim() ? branch.name.trim() : null;\n}\n\n// A branch the user pinned in the mission panel to override the planner's default\n// (MissionBranchDto.overrideBranch). The explicit `--branch` flag still wins.\nfunction missionOverrideBranch(mission: MissionShape): string | null {\n const override = mission.branch?.overrideBranch;\n return typeof override === 'string' && override.trim() ? override.trim() : null;\n}\n\nfunction missionSequence(mission: MissionShape, missionId: string): number {\n const direct = mission.sequenceNumber ?? mission.sequence;\n if (typeof direct === 'number' && Number.isFinite(direct)) return direct;\n if (typeof direct === 'string') {\n const parsed = Number.parseInt(direct, 10);\n if (Number.isFinite(parsed)) return parsed;\n }\n const match = missionId.match(/:(\\d+)$/);\n return match ? Number.parseInt(match[1] ?? '0', 10) : 0;\n}\n\nfunction resolveWorktreeRoot(): string {\n const override = process.env.OVERLORD_WORKTREE_ROOT?.trim();\n if (override) return path.resolve(override);\n const home = process.env.OVLD_HOME?.trim() || process.env.OVERLORD_HOME?.trim();\n return path.join(home ? path.resolve(home) : path.join(os.homedir(), '.ovld'), 'worktrees');\n}\n\nfunction ensureBranchRef(gitRoot: string, decision: BranchDecision): void {\n if (decision.action === 'reuse') return;\n const check = runGit(gitRoot, ['check-ref-format', '--branch', decision.branch], {\n optional: true\n });\n if (!check) throw new Error(`Invalid branch name: ${decision.branch}`);\n}\n\nfunction ensureWorktree(gitRoot: string, decision: BranchDecision): void {\n ensureBranchRef(gitRoot, decision);\n mkdirSync(path.dirname(decision.worktreePath), { recursive: true });\n\n if (existsSync(decision.worktreePath)) {\n if (!statSync(decision.worktreePath).isDirectory()) {\n throw new Error(`Worktree path exists and is not a directory: ${decision.worktreePath}`);\n }\n const existingBranch = worktreeBranch(decision.worktreePath);\n if (!existingBranch) {\n throw new Error(`Worktree path exists but is not a git worktree: ${decision.worktreePath}`);\n }\n if (existingBranch !== decision.branch) {\n throw new Error(\n `Worktree path is checked out on ${existingBranch}, expected ${decision.branch}: ${decision.worktreePath}`\n );\n }\n return;\n }\n\n // The worktree directory is gone but git may still hold a stale registration\n // for this path (e.g. it was purged from Settings \u2192 Worktrees, or deleted\n // out-of-band). Prune first so re-adding the same path for a follow-on\n // objective succeeds instead of failing with \"already registered\".\n runGit(gitRoot, ['worktree', 'prune'], { optional: true });\n\n if (decision.action === 'reuse') {\n runGit(gitRoot, ['worktree', 'add', decision.worktreePath, decision.branch]);\n return;\n }\n runGit(gitRoot, ['worktree', 'add', '-b', decision.branch, decision.worktreePath, decision.from]);\n}\n\n// Creates (when needed) and checks out the planned branch directly in the\n// primary repo \u2014 the \"branch without a worktree\" mode (coo:9). Unlike\n// `ensureWorktree`, no separate worktree directory is added; the branch lives in\n// the working repo, switching it onto the branch.\nfunction ensureBranchCheckout(gitRoot: string, decision: BranchDecision): void {\n ensureBranchRef(gitRoot, decision);\n const exists = runGit(gitRoot, ['rev-parse', '--verify', '--quiet', decision.branch], {\n optional: true\n });\n if (!exists) {\n if (decision.action === 'reuse') {\n runGit(gitRoot, ['checkout', decision.branch]);\n return;\n }\n runGit(gitRoot, ['branch', decision.branch, decision.from]);\n }\n runGit(gitRoot, ['checkout', decision.branch]);\n}\n\n// Resolves the mission's effective branch behavior. Prefers the resolved flags\n// the REST layer computes on the mission DTO (`willPrepareBranch`/\n// `willUseWorktree`); falls back to recomputing from the per-mission\n// `worktreePreference` and the workspace automation setting for older backends.\nfunction resolveBranchDecision(\n mission: MissionShape,\n workspaceAutomationEnabled: boolean\n): { willPrepareBranch: boolean; willUseWorktree: boolean } {\n const branch = mission.branch;\n if (\n branch &&\n typeof branch.willPrepareBranch === 'boolean' &&\n typeof branch.willUseWorktree === 'boolean'\n ) {\n return {\n willPrepareBranch: branch.willPrepareBranch,\n willUseWorktree: branch.willUseWorktree\n };\n }\n const raw = branch?.worktreePreference;\n const preference = raw === 'worktree' || raw === 'branch' ? raw : null;\n const willPrepareBranch =\n preference === 'worktree' ||\n preference === 'branch' ||\n (preference === null && workspaceAutomationEnabled);\n const willUseWorktree =\n preference === 'worktree' || (preference === null && workspaceAutomationEnabled);\n return { willPrepareBranch, willUseWorktree };\n}\n\nfunction resolveLaunchResourceKey({\n mission,\n options\n}: {\n mission: MissionShape;\n options: BranchPreparationOptions;\n}): string {\n const explicit = options.resourceKey?.trim();\n if (explicit) return explicit;\n\n const objectiveId = options.objectiveId?.trim();\n if (objectiveId && Array.isArray(mission.objectives)) {\n const objective = mission.objectives.find(\n candidate => typeof candidate.id === 'string' && candidate.id === objectiveId\n );\n const key = typeof objective?.resourceKey === 'string' ? objective.resourceKey.trim() : '';\n if (key) return key;\n }\n\n return deriveProjectResourceKey({ directoryPath: options.workingDirectory });\n}\n\nexport async function prepareMissionBranch({\n runtime,\n options\n}: {\n runtime: CliRuntime;\n options: BranchPreparationOptions;\n}): Promise<BranchPreparationResult> {\n // A launch preview must never touch git.\n if (options.dryRun) {\n return { workingDirectory: options.workingDirectory, branchAutomation: null };\n }\n\n const gitRoot = resolveGitRoot(options.workingDirectory);\n const mission = (await runtime.backend.get(\n `/api/missions/${encodeURIComponent(options.missionId)}`\n )) as MissionShape;\n\n const { willPrepareBranch, willUseWorktree } = resolveBranchDecision(\n mission,\n options.workspaceAutomationEnabled\n );\n const overrideFlag = options.overrideBranch?.trim() || null;\n // An explicit `--branch` always forces at least a branch, even for a mission\n // that would otherwise run off its base (the legacy escape hatch).\n const prepareBranch = willPrepareBranch || Boolean(overrideFlag);\n if (!prepareBranch) {\n return { workingDirectory: options.workingDirectory, branchAutomation: null };\n }\n // `--no-worktree` downgrades a worktree decision to a branch-only checkout.\n const useWorktree = willUseWorktree && !options.noWorktree;\n\n const base = resolveBaseBranch(gitRoot, mission);\n const refs = repoRefs(gitRoot, base);\n // The explicit `--branch` flag wins; otherwise honor the mission's pinned\n // override (set in the mission panel's branch selector).\n const overrideBranch = overrideFlag || missionOverrideBranch(mission);\n const projectSlug = await resolveMissionProjectSlug({ runtime, mission });\n const resourceKey = resolveLaunchResourceKey({ mission, options });\n const decision = planMissionBranch({\n mission: {\n title: typeof mission.title === 'string' ? mission.title : 'mission',\n sequence: missionSequence(mission, options.missionId)\n },\n project: { slug: projectSlug },\n resourceKey,\n recordedBranch: recordedMissionBranch(mission),\n base,\n refs,\n worktreeRoot: resolveWorktreeRoot(),\n overrideBranch\n });\n\n if (useWorktree) {\n ensureWorktree(gitRoot, decision);\n return {\n workingDirectory: decision.worktreePath,\n branchAutomation: {\n branchName: decision.branch,\n baseBranch: decision.baseBranch,\n worktreePath: decision.worktreePath,\n resourceKey,\n action: decision.action,\n cycle: decision.cycle\n }\n };\n }\n\n // Branch-only: check the branch out in the primary repo (no worktree). The\n // branch's \"worktree\" is the primary repo itself, which the mission panel's\n // git-state derivation resolves via `git worktree list`.\n ensureBranchCheckout(gitRoot, decision);\n return {\n workingDirectory: gitRoot,\n branchAutomation: {\n branchName: decision.branch,\n baseBranch: decision.baseBranch,\n worktreePath: gitRoot,\n resourceKey,\n action: decision.action,\n cycle: decision.cycle\n }\n };\n}\n", "import type { ProjectDto } from '@overlord/contract';\nimport { readProjectJsonLink } from '@overlord/core/service/local-target/project-metadata';\nimport type { ProjectDiscovery } from '@overlord/core/service/projects';\nimport path from 'node:path';\n\nimport type { BackendClient } from './backend-client.js';\nimport { CliError } from './errors.js';\n\nexport async function resolvePreferredExecutionTargetId({\n backend\n}: {\n backend: BackendClient;\n}): Promise<string | null> {\n try {\n const launchSettings = await backend.get<{ executionTargetId?: string | null }>(\n '/api/launch-settings'\n );\n return typeof launchSettings.executionTargetId === 'string'\n ? launchSettings.executionTargetId\n : null;\n } catch {\n return null;\n }\n}\n\nfunction discoverProjectJsonFromFilesystem({\n workingDirectory,\n preferredExecutionTargetId\n}: {\n workingDirectory: string;\n preferredExecutionTargetId?: string | null;\n}): {\n projectId: string;\n resourceId: string;\n resourcePath: string;\n isPrimary: boolean;\n} | null {\n let current = path.resolve(workingDirectory);\n\n while (true) {\n const projectJsonPath = path.join(current, '.overlord', 'project.json');\n const raw = readProjectJsonLink(projectJsonPath, { preferredExecutionTargetId });\n if (raw) {\n return {\n projectId: raw.projectId,\n resourceId: raw.resourceId,\n resourcePath: current,\n isPrimary: raw.isPrimary\n };\n }\n\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n return null;\n}\n\nasync function resolveProjectByIdOrName({\n backend,\n projectRef\n}: {\n backend: BackendClient;\n projectRef: string;\n}): Promise<ProjectDto> {\n const trimmed = projectRef.trim();\n const projects = await backend.get<ProjectDto[]>('/api/projects');\n const match =\n projects.find(project => project.id === trimmed) ??\n projects.find(project => project.name === trimmed) ??\n projects.find(project => project.slug === trimmed);\n if (!match) {\n throw new CliError({ message: `Project not found: ${trimmed}` });\n }\n return match;\n}\n\n/**\n * Resolve a project from the client filesystem when the backend is remote.\n * The hosted control plane cannot walk the agent machine's directories.\n */\nexport async function discoverProjectOnClient({\n backend,\n workingDirectory,\n projectId\n}: {\n backend: BackendClient;\n workingDirectory: string;\n projectId?: string | null;\n}): Promise<ProjectDiscovery> {\n if (projectId?.trim()) {\n const project = await resolveProjectByIdOrName({ backend, projectRef: projectId });\n return {\n projectId: project.id,\n projectName: project.name,\n resourceId: null,\n resourcePath: null,\n isPrimary: false\n };\n }\n\n const preferredExecutionTargetId = await resolvePreferredExecutionTargetId({ backend });\n const local = discoverProjectJsonFromFilesystem({ workingDirectory });\n const localWithTarget = discoverProjectJsonFromFilesystem({\n workingDirectory,\n preferredExecutionTargetId\n });\n const resolvedLocal = localWithTarget ?? local;\n if (!resolvedLocal) {\n throw new CliError({\n message: `No linked Overlord project found for ${path.resolve(workingDirectory)}. Run \\`ovld add-cwd\\` or \\`ovld create-project\\`.`\n });\n }\n\n const project = await resolveProjectByIdOrName({ backend, projectRef: resolvedLocal.projectId });\n return {\n projectId: project.id,\n projectName: project.name,\n resourceId: resolvedLocal.resourceId,\n resourcePath: resolvedLocal.resourcePath,\n isPrimary: resolvedLocal.isPrimary\n };\n}\n", "import { projectTmpDir } from './project-tmp.js';\nimport {\n appleScriptKeystrokeClause,\n parseTerminalLaunchChord,\n type TerminalLaunchPlacement\n} from './terminal-launch-chord.js';\n\n/** Resolved process invocation describing exactly how the agent is spawned. */\nexport type LaunchExecution = {\n /** The program (or full shell string when `useShell` is true) to spawn. */\n command: string;\n /** Argument vector; empty when `useShell` is true. */\n args: string[];\n /** When true, spawn through a shell so `command` is parsed as a shell line. */\n useShell: boolean;\n /** The resolved terminal launcher, or null when launching inline. */\n terminal: string | null;\n /** Human-readable description of what runs (for dry-run / JSON output). */\n display: string;\n};\n\nexport type TerminalLaunchSettings = {\n terminalLauncher?: string | null;\n terminalLaunchPlacement?: TerminalLaunchPlacement;\n terminalLaunchChord?: string | null;\n terminalScriptPath?: string | null;\n};\n\nexport function shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\n/** Build an AppleScript string expression, escaping content and preserving line breaks. */\nfunction appleScriptString(value: string): string {\n const literal = (segment: string): string =>\n `\"${segment.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n const segments = value.split(/\\r\\n|\\r|\\n/);\n if (segments.length === 1) return literal(value);\n return `(${segments.map(literal).join(' & linefeed & ')})`;\n}\n\n/** Map a configured launcher value to a built-in launcher, or null for a raw prefix. */\nfunction resolveBuiltinTerminal(value: string): 'iterm' | 'terminal' | null {\n switch (value.trim().toLowerCase()) {\n case 'iterm':\n case 'iterm2':\n case 'iterm.app':\n return 'iterm';\n case 'terminal':\n case 'terminal.app':\n case 'apple terminal':\n return 'terminal';\n default:\n return null;\n }\n}\n\n/** Extract a macOS app name from an `open -a \u2026 --args` launcher prefix. */\nexport function extractAppNameFromLauncher(launcher: string): string | null {\n const match = launcher.match(/open\\s+-a\\s+(?:'([^']+)'|\"([^\"]+)\"|(\\S+))/i);\n return match?.[1] ?? match?.[2] ?? match?.[3] ?? null;\n}\n\n/** The TMPDIR-family environment Overlord pins to the project `.overlord/tmp/`. */\nexport function tmpEnvFor(workingDirectory: string): Record<string, string> {\n const tmpDir = projectTmpDir(workingDirectory);\n return { TMPDIR: tmpDir, TMP: tmpDir, TEMP: tmpDir, OVERLORD_TMPDIR: tmpDir };\n}\n\n/** The agent invocation as a single shell line, optionally wrapped by a pre-command. */\nfunction agentShellCommand({\n command,\n args,\n preCommand,\n extraEnv = {},\n includeEnvPrefix = false\n}: {\n command: string;\n args: string[];\n preCommand?: string | null;\n extraEnv?: Record<string, string>;\n includeEnvPrefix?: boolean;\n}): string {\n const base = [shellQuote(command), ...args.map(shellQuote)].join(' ');\n const invocation = preCommand?.trim() ? `${preCommand.trim()} ${base}` : base;\n if (!includeEnvPrefix) return invocation;\n\n const assignments = Object.entries(extraEnv)\n .filter(([key, value]) => key.trim() && value.trim())\n .map(([key, value]) => `${key}=${shellQuote(value)}`)\n .join(' ');\n return assignments ? `env ${assignments} ${invocation}` : invocation;\n}\n\n/**\n * The command run *inside* a freshly opened terminal window. A new window does\n * not inherit our process cwd/env, so we cd into the project and re-export the\n * TMPDIR family before invoking the agent.\n */\nfunction terminalInnerCommand({\n workingDirectory,\n agentCommand,\n extraEnv = {}\n}: {\n workingDirectory: string;\n agentCommand: string;\n extraEnv?: Record<string, string>;\n}): string {\n const exports = Object.entries({ ...tmpEnvFor(workingDirectory), ...extraEnv })\n .map(([key, value]) => `export ${key}=${shellQuote(value)}`)\n .join('; ');\n return `cd ${shellQuote(workingDirectory)} && ${exports}; ${agentCommand}`;\n}\n\nexport function terminalLaunchScriptContent({\n command,\n args,\n workingDirectory,\n preCommand,\n extraEnv = {}\n}: {\n command: string;\n args: string[];\n workingDirectory: string;\n preCommand?: string | null;\n extraEnv?: Record<string, string>;\n}): string {\n const agentCommand = agentShellCommand({ command, args, preCommand });\n return `#!/usr/bin/env bash\\n${terminalInnerCommand({ workingDirectory, agentCommand, extraEnv })}\\n`;\n}\n\nfunction terminalScriptCommand(scriptPath: string): string {\n return `/bin/bash ${shellQuote(scriptPath)}`;\n}\n\nfunction resolveItermSplitKind(\n chord: string | null | undefined\n): 'vertical' | 'horizontal' | 'keystroke' {\n const parsed = chord ? parseTerminalLaunchChord(chord) : null;\n if (!parsed) return 'vertical';\n if (\n parsed.modifiers.includes('command') &&\n parsed.modifiers.includes('shift') &&\n parsed.key === 'd'\n ) {\n return 'horizontal';\n }\n if (parsed.modifiers.includes('command') && parsed.key === 'd' && parsed.modifiers.length === 1) {\n return 'vertical';\n }\n return 'keystroke';\n}\n\nfunction buildItermAppleScript({\n inner,\n placement,\n chordClause,\n chord\n}: {\n inner: string;\n placement: TerminalLaunchPlacement;\n chordClause?: string | null;\n chord?: string | null;\n}): string {\n const lines = ['tell application \"iTerm\"', 'activate'];\n\n if (placement === 'window') {\n lines.push(\n 'set newWindow to (create window with default profile)',\n `tell current session of newWindow to write text ${appleScriptString(inner)}`\n );\n lines.push('end tell');\n return lines.join('\\n');\n }\n\n const splitKind = placement === 'chord' ? resolveItermSplitKind(chord) : null;\n if (splitKind === 'keystroke' && chordClause) {\n // Keep every statement inside the single `tell application \"iTerm\"` block.\n // A bare top-level `if` (outside any tell) is what produced the\n // `Expected \"tell\", etc. but found \"if\"` syntax error when launching via a\n // custom chord. When no window exists yet we open one and use it directly;\n // only when a window is already open do we run the chord, after iTerm is\n // activated, so the terminal is always open before the chord fires.\n return [\n 'tell application \"iTerm\"',\n 'activate',\n 'if (count of windows) = 0 then',\n 'set overlordSession to current session of (create window with default profile)',\n 'else',\n `tell application \"System Events\" to ${chordClause}`,\n 'delay 0.2',\n 'set overlordSession to current session of current window',\n 'end if',\n `tell overlordSession to write text ${appleScriptString(inner)}`,\n 'end tell'\n ].join('\\n');\n }\n\n lines.push(\n 'if (count of windows) = 0 then',\n 'set newWindow to (create window with default profile)',\n `tell current session of newWindow to write text ${appleScriptString(inner)}`,\n 'else',\n 'tell current window'\n );\n\n if (placement === 'tab') {\n lines.push(\n 'create tab with default profile',\n `tell current session to write text ${appleScriptString(inner)}`\n );\n } else {\n const splitVerb = splitKind === 'horizontal' ? 'horizontally' : 'vertically';\n lines.push(\n 'tell current session',\n `split ${splitVerb} with default profile`,\n 'end tell',\n 'tell second session of current tab',\n `write text ${appleScriptString(inner)}`,\n 'end tell'\n );\n }\n\n lines.push('end tell', 'end if', 'end tell');\n return lines.join('\\n');\n}\n\nfunction buildTerminalAppleScript({\n inner,\n placement,\n chordClause\n}: {\n inner: string;\n placement: TerminalLaunchPlacement;\n chordClause?: string | null;\n}): string {\n const lines = ['tell application \"Terminal\"', 'activate'];\n\n if (placement === 'window') {\n lines.push(`do script ${appleScriptString(inner)}`);\n } else if (placement === 'tab') {\n lines.push(\n 'if (count of windows) = 0 then',\n `do script ${appleScriptString(inner)}`,\n 'else',\n `do script ${appleScriptString(inner)} in front window`,\n 'end if'\n );\n } else {\n lines.push(\n 'if (count of windows) = 0 then',\n `do script ${appleScriptString(inner)}`,\n 'else',\n 'tell application \"System Events\"',\n chordClause ?? 'keystroke \"d\" using command down',\n 'end tell',\n 'delay 0.2',\n `do script ${appleScriptString(inner)} in front window`,\n 'end if'\n );\n }\n\n lines.push('end tell');\n return lines.join('\\n');\n}\n\nfunction buildGenericPlacementShell({\n launcher,\n inner,\n placement,\n chordClause\n}: {\n launcher: string;\n inner: string;\n placement: TerminalLaunchPlacement;\n chordClause?: string | null;\n}): string {\n const appName = extractAppNameFromLauncher(launcher);\n const launch = `${launcher} ${inner}`;\n\n if (placement === 'window' || !appName) {\n return launch;\n }\n\n const activate = `osascript -e ${shellQuote(`tell application ${JSON.stringify(appName)} to activate`)}`;\n const chord =\n chordClause &&\n `osascript -e ${shellQuote(\n ['tell application \"System Events\"', chordClause, 'end tell'].join('\\n')\n )}`;\n\n if (placement === 'tab') {\n const newTab = `osascript -e ${shellQuote(\n [\n 'tell application \"System Events\"',\n `tell process ${JSON.stringify(appName)}`,\n 'keystroke \"t\" using command down',\n 'end tell',\n 'end tell'\n ].join('\\n')\n )}`;\n return [activate, newTab, 'sleep 0.2', launch].join(' && ');\n }\n\n return [activate, chord ?? '', 'sleep 0.2', launch].filter(Boolean).join(' && ');\n}\n\nfunction resolveChordClause(chord: string | null | undefined): string | null {\n if (!chord?.trim()) return null;\n const parsed = parseTerminalLaunchChord(chord);\n if (!parsed) return null;\n return appleScriptKeystrokeClause(parsed);\n}\n\n/**\n * Resolve how the agent should actually be spawned given the configured\n * pre-command and terminal launcher. Pure (no side effects) so it can be\n * inspected via `--dry-run` and unit-tested without launching anything.\n */\nexport function resolveLaunchExecution({\n command,\n args,\n workingDirectory,\n preCommand,\n terminalLauncher,\n terminalLaunchPlacement = 'window',\n terminalLaunchChord,\n terminalScriptPath,\n extraEnv = {}\n}: {\n command: string;\n args: string[];\n workingDirectory: string;\n preCommand?: string | null;\n extraEnv?: Record<string, string>;\n} & TerminalLaunchSettings): LaunchExecution {\n const agentCommand = agentShellCommand({ command, args, preCommand });\n const genericAgentCommand = agentShellCommand({\n command,\n args,\n preCommand,\n extraEnv,\n includeEnvPrefix: true\n });\n const launcher = terminalLauncher?.trim();\n const placement = terminalLaunchPlacement ?? 'window';\n const chordClause = resolveChordClause(terminalLaunchChord);\n\n if (!launcher) {\n return preCommand?.trim()\n ? { command: agentCommand, args: [], useShell: true, terminal: null, display: agentCommand }\n : { command, args, useShell: false, terminal: null, display: agentCommand };\n }\n\n const inner = terminalInnerCommand({ workingDirectory, agentCommand, extraEnv });\n const terminalInner = terminalScriptPath?.trim()\n ? terminalScriptCommand(terminalScriptPath.trim())\n : inner;\n const builtin = resolveBuiltinTerminal(launcher);\n\n if (builtin === 'terminal') {\n const script = buildTerminalAppleScript({\n inner: terminalInner,\n placement,\n chordClause\n });\n return {\n command: 'osascript',\n args: ['-e', script],\n useShell: false,\n terminal: 'Terminal',\n display: `Terminal.app (${placement}) \u203A ${terminalInner}`\n };\n }\n\n if (builtin === 'iterm') {\n const script = buildItermAppleScript({\n inner: terminalInner,\n placement,\n chordClause,\n chord: terminalLaunchChord\n });\n return {\n command: 'osascript',\n args: ['-e', script],\n useShell: false,\n terminal: 'iTerm2',\n display: `iTerm2 (${placement}) \u203A ${terminalInner}`\n };\n }\n\n const genericTerminalCommand = terminalScriptPath?.trim()\n ? terminalScriptCommand(terminalScriptPath.trim())\n : genericAgentCommand;\n\n const full =\n placement === 'window'\n ? `${launcher} ${genericTerminalCommand}`\n : buildGenericPlacementShell({\n launcher,\n inner: genericTerminalCommand,\n placement,\n chordClause\n });\n return { command: full, args: [], useShell: true, terminal: launcher, display: full };\n}\n", "import { spawnSync } from 'node:child_process';\nimport { chmodSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveAgentBinary } from './agent-binaries.js';\nimport { ensureProjectTmpDir, pruneStaleProjectTmp } from './project-tmp.js';\nimport type { CliRuntime } from './runtime.js';\nimport {\n type LaunchExecution,\n resolveLaunchExecution,\n terminalLaunchScriptContent,\n type TerminalLaunchSettings,\n tmpEnvFor\n} from './terminal-launcher.js';\n\nexport type LaunchOptions = {\n agent: string;\n missionId: string;\n workingDirectory: string;\n model?: string | null;\n thinking?: string | null;\n flags?: string[];\n preCommand?: string | null;\n executionRequestId?: string | null;\n executionTargetId?: string | null;\n /**\n * Open the agent in a new terminal window. A built-in name (`iTerm2`,\n * `Terminal`) or a raw prefix command (e.g. `open -a Ghostty --args`).\n * When omitted/null the agent runs inline in the current terminal.\n */\n terminalLauncher?: string | null;\n terminalLaunchPlacement?: TerminalLaunchSettings['terminalLaunchPlacement'];\n terminalLaunchChord?: string | null;\n dryRun?: boolean;\n};\n\ntype LaunchPlan = {\n command: string;\n args: string[];\n prompt: string;\n contextFile: string;\n workingDirectory: string;\n execution: LaunchExecution;\n env: Record<string, string>;\n};\n\ntype MissionContext = {\n displayId: string;\n title: string;\n launchContext: string;\n};\n\nfunction overlordLaunchEnv({\n backendUrl,\n missionId,\n executionRequestId,\n projectResources\n}: {\n backendUrl: string;\n missionId: string;\n executionRequestId?: string | null;\n projectResources?: unknown[] | null;\n}): Record<string, string> {\n return {\n MISSION_ID: missionId,\n OVERLORD_MISSION_ID: missionId,\n OVERLORD_BACKEND_URL: backendUrl,\n ...(executionRequestId ? { OVERLORD_EXECUTION_REQUEST_ID: executionRequestId } : {}),\n ...(projectResources && projectResources.length > 0\n ? { OVERLORD_PROJECT_RESOURCES: JSON.stringify(projectResources) }\n : {})\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n}\n\n/**\n * Operational lifecycle event types excluded from the \"Recent Activity\" history\n * surfaced to the agent. The agent only cares\n * about substantive events (updates, deliveries, asks, alerts, discussion), not\n * runner/orchestration status churn.\n */\nconst AGENT_HISTORY_EXCLUDED_EVENT_TYPES = new Set([\n 'status_change',\n 'execution_requested',\n 'awaiting_approval'\n]);\n\nasync function loadMissionContext({\n runtime,\n missionId\n}: {\n runtime: CliRuntime;\n missionId: string;\n}): Promise<MissionContext> {\n const mission = asRecord(\n await runtime.backend.get(`/api/missions/${encodeURIComponent(missionId)}`)\n );\n const events = await runtime.backend\n .get<unknown[]>(`/api/missions/${encodeURIComponent(missionId)}/events`)\n .catch(() => []);\n const artifacts = await runtime.backend\n .get<unknown[]>(`/api/missions/${encodeURIComponent(missionId)}/artifacts`)\n .catch(() => []);\n const displayId = String(mission.displayId ?? mission.id ?? missionId);\n const title = String(mission.title ?? '(untitled)');\n const objectives = Array.isArray(mission.objectives) ? mission.objectives.map(asRecord) : [];\n\n // Attachments are stored per objective and are not part of the mission detail\n // payload, so fetch them for each objective. Surfacing them in the launch\n // prompt is what lets the agent know files were attached to its objective\n // (otherwise it only ever sees them if it parses the raw attach JSON).\n const attachmentLines: string[] = [];\n await Promise.all(\n objectives.map(async (objective, index) => {\n const objectiveId = objective.id;\n if (typeof objectiveId !== 'string' || objectiveId.length === 0) return;\n const attachments = await runtime.backend\n .get<unknown[]>(`/api/objectives/${encodeURIComponent(objectiveId)}/attachments`)\n .catch(() => []);\n for (const attachment of attachments) {\n const record = asRecord(attachment);\n const filename = String(record.filename ?? 'attachment');\n const contentType = record.contentType ? ` (${String(record.contentType)})` : '';\n attachmentLines.push(`- [objective ${index + 1}] ${filename}${contentType}`);\n }\n })\n );\n\n const launchContext = [\n `# Overlord Mission: ${displayId}: ${title}`,\n '',\n '## Instructions',\n 'Use the Overlord skill. Follow the required protocol workflow.',\n '',\n '## Objectives',\n ...objectives.map((objective, index) => {\n const instruction = objective.instructionText ?? objective.instruction ?? '';\n return `${index + 1}. [${objective.state ?? 'unknown'}] ${instruction}`;\n }),\n '',\n ...(attachmentLines.length > 0\n ? [\n '## Attachments',\n 'Files attached to the objective(s) below. Use `ovld protocol attachment-list` and `ovld protocol attachment-download-url` to retrieve them.',\n ...attachmentLines,\n ''\n ]\n : []),\n '## Recent Activity',\n ...events\n .filter(event => !AGENT_HISTORY_EXCLUDED_EVENT_TYPES.has(String(asRecord(event).type)))\n .slice(-20)\n .map(event => `- ${asRecord(event).summary ?? JSON.stringify(event)}`),\n '',\n '## Artifacts',\n ...artifacts.map(\n artifact => `- ${asRecord(artifact).label ?? asRecord(artifact).type ?? 'artifact'}`\n ),\n '',\n 'Use `ovld protocol attach --mission-id <id>` before making changes, update during work, and ALWAYS deliver last.'\n ].join('\\n');\n\n return { displayId, title, launchContext };\n}\n\nasync function loadProjectResourcesForLaunch({\n runtime,\n missionId,\n executionTargetId\n}: {\n runtime: CliRuntime;\n missionId: string;\n executionTargetId?: string | null;\n}): Promise<unknown[] | null> {\n try {\n const context = await runtime.backend.post<unknown>({\n path: '/api/protocol/load-context',\n body: {\n flags: {\n '--mission-id': missionId,\n ...(executionTargetId ? { '--execution-target-id': executionTargetId } : {})\n }\n }\n });\n const record = asRecord(context);\n return Array.isArray(record.projectResources) ? record.projectResources : null;\n } catch {\n return null;\n }\n}\n\nfunction buildAgentCommand({\n agent,\n model,\n thinking,\n flags = [],\n prompt,\n contextFile,\n launchMessage\n}: {\n agent: string;\n model?: string | null;\n thinking?: string | null;\n flags?: string[];\n prompt: string;\n contextFile: string;\n launchMessage: string;\n}): { command: string; args: string[] } {\n if (agent === 'codex') {\n const args = [];\n if (model) args.push('--model', model);\n if (thinking) args.push('-c', `model_reasoning_effort=\"${thinking}\"`);\n args.push(...flags, prompt);\n return { command: 'codex', args };\n }\n\n if (agent === 'claude') {\n const args = ['--append-system-prompt-file', contextFile];\n if (model) args.push('--model', model);\n if (thinking) args.push('--effort', thinking);\n args.push(...flags, launchMessage);\n return { command: 'claude', args };\n }\n\n const args = [];\n if (model) args.push('--model', model);\n args.push(...flags, prompt);\n return { command: resolveAgentBinary(agent), args };\n}\n\nfunction safeLaunchScriptPart(value: string): string {\n return value.replace(/[^a-zA-Z0-9_-]/g, '-').replace(/^-+|-+$/g, '') || 'launch';\n}\n\nfunction launchScriptPath({\n tmpDir,\n displayId,\n executionRequestId\n}: {\n tmpDir: string;\n displayId: string;\n executionRequestId?: string | null;\n}): string {\n const requestPart = executionRequestId\n ? safeLaunchScriptPart(executionRequestId)\n : `${process.pid}`;\n return path.join(tmpDir, `launch-${safeLaunchScriptPart(displayId)}-${requestPart}.sh`);\n}\n\nexport async function buildLaunchPlan({\n runtime,\n options\n}: {\n runtime: CliRuntime;\n options: LaunchOptions;\n}): Promise<LaunchPlan> {\n const context = await loadMissionContext({ runtime, missionId: options.missionId });\n pruneStaleProjectTmp({ workingDirectory: options.workingDirectory, create: true });\n const tmpDir = ensureProjectTmpDir(options.workingDirectory);\n const contextFile = path.join(\n tmpDir,\n `mission-${context.displayId.replace(/[^a-zA-Z0-9_-]/g, '-')}.md`\n );\n const launchContext = options.executionRequestId\n ? `${context.launchContext}\\nExecution request: ${options.executionRequestId}`\n : context.launchContext;\n writeFileSync(contextFile, `${launchContext}\\n`);\n const projectResources = await loadProjectResourcesForLaunch({\n runtime,\n missionId: options.missionId,\n executionTargetId: options.executionTargetId\n });\n const launchEnv = overlordLaunchEnv({\n backendUrl: runtime.backend.baseUrl,\n missionId: context.displayId,\n executionRequestId: options.executionRequestId,\n projectResources\n });\n\n const prompt =\n launchContext.length > 4000\n ? `Use the Overlord context file at ${contextFile} and attach to mission ${context.displayId}.`\n : launchContext;\n\n const command = buildAgentCommand({\n agent: options.agent,\n model: options.model,\n thinking: options.thinking,\n flags: options.flags,\n prompt,\n contextFile,\n launchMessage: `Start work on ${context.title} (ovld mission ${context.displayId})`\n });\n\n const terminalScriptPath = options.terminalLauncher?.trim()\n ? launchScriptPath({\n tmpDir,\n displayId: context.displayId,\n executionRequestId: options.executionRequestId\n })\n : null;\n if (terminalScriptPath) {\n writeFileSync(\n terminalScriptPath,\n terminalLaunchScriptContent({\n command: command.command,\n args: command.args,\n workingDirectory: options.workingDirectory,\n preCommand: options.preCommand,\n extraEnv: launchEnv\n })\n );\n chmodSync(terminalScriptPath, 0o700);\n }\n\n const execution = resolveLaunchExecution({\n command: command.command,\n args: command.args,\n workingDirectory: options.workingDirectory,\n preCommand: options.preCommand,\n terminalLauncher: options.terminalLauncher,\n terminalLaunchPlacement: options.terminalLaunchPlacement,\n terminalLaunchChord: options.terminalLaunchChord,\n terminalScriptPath,\n extraEnv: launchEnv\n });\n\n return {\n ...command,\n prompt,\n contextFile,\n workingDirectory: options.workingDirectory,\n execution,\n env: launchEnv\n };\n}\n\nexport async function launchAgent({\n runtime,\n options\n}: {\n runtime: CliRuntime;\n options: LaunchOptions;\n}): Promise<{ plan: LaunchPlan; status: number | null; signal: NodeJS.Signals | null }> {\n const plan = await buildLaunchPlan({ runtime, options });\n if (options.dryRun) {\n return { plan, status: 0, signal: null };\n }\n\n const env = {\n ...process.env,\n ...tmpEnvFor(options.workingDirectory),\n ...plan.env\n };\n\n const { execution } = plan;\n const result = execution.useShell\n ? spawnSync(execution.command, {\n cwd: options.workingDirectory,\n env,\n shell: true,\n stdio: 'inherit'\n })\n : spawnSync(execution.command, execution.args, {\n cwd: options.workingDirectory,\n env,\n stdio: 'inherit'\n });\n\n return { plan, status: result.status, signal: result.signal };\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\n\nconst UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i;\n\nfunction sessionCachePath({\n agent,\n missionId,\n workingDirectory\n}: {\n agent: string;\n missionId: string;\n workingDirectory: string;\n}): string {\n const key = createHash('sha256')\n .update(`${path.resolve(workingDirectory)}\\0${missionId}\\0${agent}`)\n .digest('hex');\n return path.join(resolveGlobalDataDir(), 'native-sessions', key);\n}\n\nfunction readCachedNativeSessionId({\n agent,\n missionId,\n workingDirectory\n}: {\n agent: string;\n missionId: string;\n workingDirectory: string;\n}): string | undefined {\n try {\n const filePath = sessionCachePath({ agent, missionId, workingDirectory });\n if (!existsSync(filePath)) return undefined;\n const raw = JSON.parse(readFileSync(filePath, 'utf8')) as { externalSessionId?: unknown };\n return typeof raw.externalSessionId === 'string' && raw.externalSessionId.trim()\n ? raw.externalSessionId.trim()\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction detectCodexSessionIdFromDisk(workingDirectory: string): string | undefined {\n const sessionsDir = path.join(homedir(), '.codex', 'sessions');\n if (!existsSync(sessionsDir)) return undefined;\n\n const candidates: Array<{ mtime: number; filePath: string }> = [];\n const visit = (dir: string): void => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const filePath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n visit(filePath);\n continue;\n }\n if (!entry.isFile() || !entry.name.startsWith('rollout-') || !entry.name.endsWith('.jsonl')) {\n continue;\n }\n try {\n candidates.push({ mtime: statSync(filePath).mtimeMs, filePath });\n } catch {\n // Ignore files that disappear while scanning.\n }\n }\n };\n\n try {\n visit(sessionsDir);\n } catch {\n return undefined;\n }\n\n candidates.sort((a, b) => b.mtime - a.mtime);\n let fallback: string | undefined;\n\n for (const candidate of candidates.slice(0, 25)) {\n let nativeId: string | undefined;\n let cwd: string | undefined;\n try {\n const [firstLine = ''] = readFileSync(candidate.filePath, 'utf8').split(/\\r?\\n/, 1);\n const obj = JSON.parse(firstLine) as Record<string, unknown>;\n const payload =\n obj.payload && typeof obj.payload === 'object'\n ? (obj.payload as Record<string, unknown>)\n : obj;\n if (typeof payload.id === 'string') nativeId = payload.id.match(UUID_RE)?.[0];\n if (typeof payload.cwd === 'string') cwd = payload.cwd;\n } catch {\n nativeId = undefined;\n }\n nativeId ??= path.basename(candidate.filePath).match(UUID_RE)?.[0];\n if (!nativeId) continue;\n fallback ??= nativeId;\n if (cwd && path.resolve(cwd) === path.resolve(workingDirectory)) return nativeId;\n }\n\n return fallback;\n}\n\nexport function resolveNativeSessionId({\n explicit,\n agent,\n missionId,\n workingDirectory = process.cwd(),\n env = process.env\n}: {\n explicit?: string;\n agent: string;\n missionId: string;\n workingDirectory?: string;\n env?: NodeJS.ProcessEnv;\n}): string | null | undefined {\n if (explicit !== undefined) {\n const trimmed = explicit.trim();\n return trimmed === 'null' ? null : trimmed || undefined;\n }\n\n const normalizedAgent = agent.toLowerCase();\n if (normalizedAgent === 'codex') {\n return (\n env.CODEX_THREAD_ID?.trim() ||\n env.CODEX_SESSION_ID?.trim() ||\n readCachedNativeSessionId({ agent: 'codex', missionId, workingDirectory }) ||\n detectCodexSessionIdFromDisk(workingDirectory)\n );\n }\n\n if (normalizedAgent === 'claude') {\n return readCachedNativeSessionId({ agent: 'claude', missionId, workingDirectory });\n }\n\n if (normalizedAgent === 'cursor') {\n return readCachedNativeSessionId({ agent: 'cursor', missionId, workingDirectory });\n }\n\n return readCachedNativeSessionId({ agent: normalizedAgent, missionId, workingDirectory });\n}\n", "import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { createInterface } from 'node:readline';\n\nimport { flagBoolean, flagValue, type ParsedArgs } from './args.js';\nimport { CliError } from './errors.js';\nimport { printJson } from './output.js';\nimport type { CliRuntime } from './runtime.js';\n\ninterface OrganizationDto {\n id: string;\n name: string;\n logoUrl: string | null;\n}\n\ninterface WorkspaceDto {\n id: string;\n organizationId: string;\n slug: string;\n name: string;\n}\n\ninterface MetaDto {\n organization: OrganizationDto | null;\n organizations: OrganizationDto[];\n workspaces: WorkspaceDto[];\n workspace: WorkspaceDto | null;\n}\n\n/** Bare-bones slug suggestion shown to an interactive user; the server derives the canonical one. */\nfunction suggestSlug(name: string): string {\n const cleaned = name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return cleaned.slice(0, 3) || 'org';\n}\n\nfunction promptText({\n question,\n defaultValue\n}: {\n question: string;\n defaultValue?: string;\n}): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n const suffix = defaultValue ? ` [${defaultValue}]` : '';\n return new Promise<string>(resolve => {\n rl.question(`${question}${suffix}: `, answer => {\n rl.close();\n const trimmed = answer.trim();\n resolve(trimmed || defaultValue || '');\n });\n });\n}\n\nconst DEFAULT_WORKSPACE_NAME = 'general';\n\n/**\n * `ovld org-setup`: creates an organization + first workspace for an\n * authenticated user with zero workspace memberships, via the same\n * `POST /api/onboarding` endpoint the web onboarding screen uses, so the two\n * clients cannot drift (planning/feature-plans/organization-workspace-hierarchy.md,\n * Phase 5). A failed logo upload is a warning, not a rollback.\n */\nexport async function runOrgSetupCommand({\n runtime,\n parsed\n}: {\n runtime: CliRuntime;\n parsed: ParsedArgs;\n}): Promise<void> {\n const json = flagBoolean(parsed.flags, '--json');\n const noInput = flagBoolean(parsed.flags, '--no-input');\n const ifNeeded = flagBoolean(parsed.flags, '--if-needed');\n const interactive = !noInput && process.stdin.isTTY;\n\n const existingMeta = await runtime.backend.get<MetaDto>('/api/meta');\n if (existingMeta.organizations.length > 0) {\n if (ifNeeded) {\n if (json) printJson({ skipped: true, reason: 'already has organization memberships' });\n else console.log('Already a member of an organization \u2014 nothing to do (--if-needed).');\n return;\n }\n throw new CliError({\n message:\n 'You already belong to at least one organization, so `ovld org-setup` does not apply.\\n' +\n 'Use `ovld create-project` to add a project to an existing workspace instead.'\n });\n }\n\n let organizationName = flagValue(parsed.flags, '--org-name');\n if (!organizationName && interactive) {\n organizationName = await promptText({ question: 'Organization name' });\n }\n if (!organizationName) {\n throw new CliError({ message: 'Missing --org-name' });\n }\n\n let workspaceName = flagValue(parsed.flags, '--workspace-name');\n if (!workspaceName && interactive) {\n workspaceName = await promptText({\n question: 'Workspace name',\n defaultValue: DEFAULT_WORKSPACE_NAME\n });\n }\n workspaceName = workspaceName || DEFAULT_WORKSPACE_NAME;\n\n let workspaceSlug = flagValue(parsed.flags, '--workspace-slug');\n if (!workspaceSlug && interactive) {\n workspaceSlug = await promptText({\n question: 'Workspace slug (advanced, leave blank to auto-derive)',\n defaultValue: suggestSlug(workspaceName)\n });\n if (workspaceSlug === suggestSlug(workspaceName)) workspaceSlug = undefined;\n }\n\n const meta = await runtime.backend.post<MetaDto>({\n path: '/api/onboarding',\n body: {\n organizationName,\n workspaceName,\n ...(workspaceSlug ? { workspaceSlug } : {})\n }\n });\n\n const organization = meta.organization;\n const workspace = meta.workspace;\n if (!organization) {\n throw new CliError({ message: 'Onboarding succeeded but returned no organization.' });\n }\n\n const logoPath = flagValue(parsed.flags, '--logo');\n let logoWarning: string | null = null;\n if (logoPath) {\n try {\n const resolvedPath = path.resolve(logoPath);\n const bytes = readFileSync(resolvedPath);\n const stored = await runtime.backend.postRaw<{ url: string }>({\n path: '/api/uploads/organization-images',\n body: bytes,\n filename: path.basename(resolvedPath)\n });\n await runtime.backend.patch({\n path: `/api/organizations/${encodeURIComponent(organization.id)}`,\n body: { logoUrl: stored.url }\n });\n } catch (error) {\n logoWarning = error instanceof Error ? error.message : String(error);\n }\n }\n\n if (json) {\n printJson({ organization, workspace, logoWarning });\n return;\n }\n\n console.log(`Created organization \"${organization.name}\" (${organization.id})`);\n if (workspace) console.log(`Created workspace \"${workspace.name}\" (${workspace.slug})`);\n if (logoWarning) console.warn(`Warning: logo upload failed \u2014 ${logoWarning}`);\n}\n", "/** Protocol subcommands implemented by the local backend (`backend/protocol.ts`). */\nexport const SUPPORTED_PROTOCOL_SUBCOMMANDS = [\n 'add-objectives',\n 'ask',\n 'attach',\n 'attachment-download-url',\n 'attachment-list',\n 'auth-status',\n 'changes',\n 'connect',\n 'create',\n 'deliver',\n 'discover-project',\n 'discuss-objective',\n 'heartbeat',\n 'hook-event',\n 'list-organizations',\n 'load-context',\n 'prompt',\n 'read-context',\n 'record-work',\n 'resume-follow-up',\n 'search-missions',\n 'update',\n 'write-context'\n] as const;\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport function printProtocolHelp({ primaryCommand }: { primaryCommand: string }): void {\n const subcommands = SUPPORTED_PROTOCOL_SUBCOMMANDS.join(', ');\n\n console.log(`${primaryCommand} protocol [flags]\n\nUse this for mission lifecycle work from an agent runtime: create a standalone\ndraft with \\`${primaryCommand} protocol create\\`, create-and-attach with\n\\`${primaryCommand} protocol prompt\\`, or attach to an existing mission with\n\\`${primaryCommand} protocol attach --mission-id <mission_id>\\`.\n\nBackend and auth:\n Configure the REST backend before protocol calls:\n ${primaryCommand} init Create overlord.toml with a local backend URL\n ${primaryCommand} config set local [url] Point at a local backend (default: http://127.0.0.1:4310)\n ${primaryCommand} config set cloud <url> Point at a hosted backend URL\n ${primaryCommand} auth login Choose backend interactively when needed, then log in\n ${primaryCommand} doctor Validate backend reachability and connector installs\n\n To check credentials machine-readably from a script, use\n \\`${primaryCommand} protocol auth-status\\` (returns ok=true|false).\n\nProject discovery:\n When prompting or creating missions, the CLI resolves the project from your\n working directory when --project-id is omitted. Discover it explicitly with:\n\n ${primaryCommand} protocol discover-project\n ${primaryCommand} protocol discover-project --project-id <id-or-name>\n ${primaryCommand} protocol discover-project --directory /path/to/repo\n\n Humans can also link checkouts with \\`${primaryCommand} add-cwd\\` and create\n projects with \\`${primaryCommand} create-project --name \"<name>\"\\`.\n\nAgent workflow (required):\n 1. Attach first with \\`${primaryCommand} protocol attach --mission-id <id>\\`.\n 2. Post progress with \\`${primaryCommand} protocol update\\` or liveness with\n \\`${primaryCommand} protocol heartbeat\\`.\n 3. Ask blocking questions with \\`${primaryCommand} protocol ask\\` and stop work.\n 4. Deliver with \\`${primaryCommand} protocol deliver\\` when work is complete.\n 5. Do not continue implementation after delivery without\n \\`${primaryCommand} protocol resume-follow-up\\` or \\`--begin-follow-up-work\\`\n on a still-live session.\n\nSubcommands:\n auth-status Return machine-readable auth/backend readiness\n discover-project Resolve a project from the working directory or explicit id\n list-organizations Legacy name; returns only the caller's current workspace context (not organizations)\n attach Start a mission session and return full working context\n connect Start a lightweight session without full context assembly\n load-context Read mission context without creating a session\n search-missions Find missions by keyword, status, or project\n discuss-objective Mark a draft objective as submitted (does not start execution)\n add-objectives Append ordered objectives to an existing mission\n create Create a draft mission without attaching\n prompt Create a mission and attach to it immediately\n record-work Record completed-from-chat work as a review mission (no attach)\n update Post progress, activity events, and optional change rationales\n heartbeat Send a liveness ping without creating a mission event\n ask Post a blocking question and move the mission to review\n deliver Finish work, send artifacts, and move the mission to review\n resume-follow-up Reopen a completed objective for post-delivery follow-up work\n hook-event Record a connector lifecycle hook (e.g. UserPromptSubmit)\n record-touched Local-only: append an edit hook's touched files to the session log\n changes Local-only: preflight \u2014 print classified mine/claimed/unclaimed\n paths and drafted rationales before delivering; run this instead\n of hand-triaging \\`git status\\`\n read-context Read shared persistent context for this mission\n write-context Write shared persistent context for future sessions\n attachment-list List all attachments for the mission\n attachment-download-url Get the download URL for a specific attachment\n\nRunner queue (management commands, not protocol):\n ${primaryCommand} runner once|start|status|clear|clear-all [--branch <name>] [--no-worktree]\n ${primaryCommand} launch <agent> --mission-id <missionId> [--branch <name>] [--no-worktree]\n\nEnvironment fallback:\n --session-key <- SESSION_KEY printed on stderr after attach/connect/prompt/resume-follow-up\n --mission-id <- mission display id (e.g. coo:8) or UUID\n backend URL <- overlord.toml backend_url, OVERLORD_BACKEND_URL, or dev OVERLORD_BACKEND_URL_DEV\n auth token <- OVERLORD_USER_TOKEN, OVLD_USER_TOKEN, or USER_TOKEN\n\nCommon flags:\n --mission-id <id> Mission identifier when operating on an existing mission\n --session-key <key> Session key returned by attach/connect/prompt/resume-follow-up\n --agent <identifier> Agent identifier sent to Overlord (default: unknown)\n --model <identifier> Model identifier to snapshot on executing objectives\n --timeout <ms> Request timeout in milliseconds (default: ${DEFAULT_TIMEOUT_MS})\n\nauth-status:\n Purpose:\n Check whether the local runtime can reach the configured backend.\n Returns:\n JSON with ok=true|false plus backend URL metadata. Does not print secrets.\n\ndiscover-project:\n Purpose:\n Resolve the Overlord project for the current or given working directory.\n Optional:\n --project-id <id-or-name> Resolve this project directly\n --directory <path> Directory to match (default: current working directory)\n Returns:\n Project JSON with id, name, and slug.\n\nattach:\n Purpose:\n Create the working session for an agent on an existing mission. Call this first.\n Required:\n --mission-id <id> Display id (e.g. coo:8) or UUID\n Optional:\n --session-key <key> Reuse an existing session key\n --agent <identifier>\n --model <identifier>\n --execution-request-id <id> Link this attach to a runner execution request\n --external-session-id <id> Native agent thread/session id for resume\n Returns:\n Full JSON including session.sessionKey, mission, history, artifacts, sharedState,\n and agentInstructions with required workflow instructions and structured-field pointers.\n Notes:\n The client CLI records a VCS baseline at attach so deliver can report the\n run-attributable changed-file delta automatically.\n\nconnect:\n Purpose:\n Create a lightweight session when you only need a session key, not full context.\n Required:\n --mission-id <id>\n Optional:\n --agent <identifier>\n --external-session-id <id>\n Returns:\n Session JSON and SESSION_KEY on stderr when available.\n\nload-context:\n Purpose:\n Read mission details without creating a session.\n Required:\n --mission-id <id>\n\nsearch-missions:\n Purpose:\n Find missions by keyword, status, or project.\n Optional:\n --query <text> Free-text search\n --status <csv> Comma-separated statuses (e.g. next-up,execute)\n --project-id <id> Restrict to one project\n --limit <n> Max results (default: 25)\n Returns:\n JSON with matching missions.\n\ndiscuss-objective:\n Purpose:\n Mark the latest draft objective as submitted. Does not start execution \u2014 use attach.\n Required:\n --mission-id <id>\n\nadd-objectives:\n Purpose:\n Append ordered objectives to an existing mission.\n Required:\n --mission-id <id>\n --objectives-json <json> or --objectives-file <path|->\n\ncreate:\n Purpose:\n Create a draft mission without attaching.\n Required:\n --objective \"<text>\" or --objectives-json / --objectives-file <path|->\n Optional:\n --title <text>\n --project-id <id> Skips working-directory project resolution\n\nprompt:\n Purpose:\n Create a mission and attach to it in one call.\n Required:\n --objective \"<text>\" or --objectives-json / --objectives-file <path|->\n Optional:\n --title <text>\n --project-id <id>\n --agent <identifier>\n --model <identifier>\n --external-session-id <id>\n Returns:\n New mission/session JSON plus SESSION_KEY on stderr when available.\n\nrecord-work:\n Purpose:\n Record work already completed in chat as a mission in review without a session.\n Use instead of create + attach + deliver when logging past work.\n Required:\n --objective \"<text>\" (or positional objective text)\n --summary or --summary-file <path|->\n Optional:\n --title <text>\n --project-id <id>\n --artifacts-json / --artifacts-file <path|->\n --change-rationales-json / --change-rationales-file <path|->\n Notes:\n Change-rationale entries use the same shape documented under \\`deliver\\`\n (file_path, label, summary, why, impact; summary is named \"summary\", not \"rationale\").\n\nupdate:\n Purpose:\n Post progress or activity events during execution.\n Required:\n --session-key <key>\n --mission-id <id>\n --summary or --summary-file <path|->\n Optional:\n --phase draft | execute | review | deliver | complete | blocked | cancelled\n --event-type update | user_follow_up | alert | discussion_summary | decision\n --begin-follow-up-work Reopen a delivered/review mission for execution\n --follow-up-intent discussion | execution | pending_delivery\n --payload-json / --payload-file <path|->\n --external-url <url|null>\n --external-session-id <id|null>\n --changed-files-json / --changed-files-file <path|->\n --change-rationales-json / --change-rationales-file <path|->\n Notes:\n Pass --summary-file - to read the summary from stdin and avoid shell quoting issues.\n Inline --*-json values larger than ~8 KB are rejected; use the paired --*-file - flag.\n After delivery, pass --begin-follow-up-work before posting execution updates.\n Change-rationale entries use the same shape documented under \\`deliver\\`\n (file_path, label, summary, why, impact; summary is named \"summary\", not \"rationale\").\n\nheartbeat:\n Purpose:\n Send a liveness ping without creating a mission event.\n Required:\n --session-key <key>\n --mission-id <id>\n Optional:\n --phase <phase>\n --note <text>\n\nask:\n Purpose:\n Raise a blocking question for a human reviewer. Stop work after ask succeeds.\n Required:\n --session-key <key>\n --mission-id <id>\n --question or --question-file <path|->\n\ndeliver:\n Purpose:\n Conclude the session and submit the final narrative plus artifacts/change rationales.\n Required:\n --session-key <key>\n --mission-id <id>\n --summary or --summary-file <path|->\n or: --payload-json / --payload-file <path|-> with { summary, artifacts, changeRationales }\n Optional:\n --artifacts-json / --artifacts-file <path|->\n --change-rationales-json / --change-rationales-file <path|->\n --changed-files-json / --changed-files-file <path|->\n --no-file-changes Assert this run changed no files\n --skip-rationale-for-json / --skip-rationale-for-file <path|->\n --verification-summary <text>\n --follow-up-notes <text>\n Change-rationale entry shape (each item in --change-rationales-json / -file):\n {\n \"file_path\": \"src/api.ts\", // required. repo-relative path. \"filePath\" also accepted; no \"path\" field.\n \"label\": \"Add retry\", // required. short reviewer-facing title.\n \"summary\": \"Added retry.\", // required. WHAT changed. The field is named \"summary\", NOT \"rationale\".\n \"why\": \"Flaky calls.\", // required. WHY it changed.\n \"impact\": \"Retries 3x.\", // required. behavioral impact.\n \"hunks\": [{ \"header\": \"@@ -10,6 +10,14 @@\" }] // optional.\n }\n Pass an array of these. Do NOT wrap entries under a \"rationale\" key and do not send a\n top-level \"file_changes\" artifact. label/summary/why/impact must be non-empty strings.\n Skip-rationale-for entry shape (each item in --skip-rationale-for-json / -file):\n {\n \"file_path\": \"webapp/package.json\", // required. repo-relative path. \"filePath\" also accepted.\n \"reason\": \"Concurrent host-side edit; not made by this mission.\"\n }\n Use when deliver would fail missing_rationale for a file you did not change. Do not\n fabricate a change rationale and do not revert the file.\n Notes:\n Changed files are captured mechanically: the CLI records a VCS baseline at attach\n and injects the run-attributable delta at deliver. Meaningful tracked changes\n require rationales unless --no-file-changes is passed or the file is listed in\n --skip-rationale-for-*. Do not continue\n implementation after delivery without explicit follow-up.\n Inline --*-json values larger than ~8 KB are rejected; use --change-rationales-file -\n (or --payload-file -) and stream JSON on stdin. Keep --summary inline.\n Run \\`${primaryCommand} protocol changes --mission-id <id>\\` first instead of hand-\n triaging \\`git status\\` \u2014 it prints the same mine/claimed/unclaimed classification\n deliver uses, plus drafted rationales. If deliver still rejects with\n missing_rationale, the error includes a per-path classification and a ready-to-use\n --skip-rationale-for-json value for every non-'mine' path \u2014 one mechanical retry.\n\nchanges:\n Purpose:\n Local-only preflight: print every currently dirty path classified as 'mine'\n (confirmed by this session's touched-files log), 'claimed' (confirmed by another\n active session's log), or 'unclaimed' (dirty, but confirmed by nobody), plus\n draft rationales from local edit notes and ready-to-use --skip-rationale-for-json\n entries for 'claimed' paths. Makes no backend call; safe to run at any time.\n Required:\n --mission-id <id>\n\nresume-follow-up:\n Purpose:\n Reopen a completed objective for post-delivery implementation follow-up.\n Required:\n --mission-id <id>\n Optional:\n --objective-id <id>\n --agent <identifier>\n --model <identifier>\n --summary or --summary-file <path|->\n --external-session-id <id>\n Returns:\n attach-response-v3 JSON with a new session key.\n\nhook-event:\n Purpose:\n Record a connector lifecycle hook without requiring a live session key.\n Required:\n --hook-type UserPromptSubmit\n --mission-id <id>\n Optional:\n --prompt or --prompt-file <path|->\n --session-key <key>\n --external-session-id <id>\n --turn-index <n>\n\nread-context:\n Purpose:\n Read persistent shared context written by earlier sessions.\n Required:\n --mission-id <id>\n Optional:\n --key <substring> Filter by key substring\n --limit <n> Max entries (default: 50)\n\nwrite-context:\n Purpose:\n Save shared facts for future sessions.\n Required:\n --mission-id <id>\n --key <name>\n --value <text> or --value-json / --value-file <path|->\n\nattachment-list:\n Purpose:\n List all attachments for the mission (across all objectives).\n Each entry includes id, filename, mimeType, sizeBytes, status, storageKey, and url.\n The url field is a server-relative path; prepend the backend base URL to download.\n Required:\n --mission-id <id>\n\nattachment-download-url:\n Purpose:\n Return the download URL for a specific attachment on the mission.\n Required:\n --mission-id <id>\n --attachment-id <id> (use the id from attachment-list output)\n\nlist-organizations:\n Purpose:\n Legacy name predating the real organizations hierarchy (coo:135) \u2014 despite the\n name, returns only the caller's current *workspace* context, not organization\n data. Kept as-is to avoid a breaking protocol rename.\n Returns:\n JSON array with a single { id, slug, name } entry for the active workspace.\n\nSupported subcommands: ${subcommands}\nRun \\`${primaryCommand} help\\` for management commands and \\`${primaryCommand} protocol help\\` for this reference.\n`);\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\n\n/**\n * Per-cwd active-session manifest.\n *\n * The Claude PostToolUse edit hook used to require `MISSION_ID` in the process\n * environment to know which mission's touched-files log to append to. Agent-pod\n * sessions never set that variable, so the hook was silently inert (see\n * planning/feature-plans/agent-change-attribution-optimization.md, Layer 1).\n *\n * Instead, `attach`/`resume-follow-up` record an entry here \u2014 keyed by the\n * working directory alone, since the hook only ever knows its own `cwd` \u2014 so the\n * hook (or any adapter) can resolve \"which mission is active in this directory\n * right now\" without needing the launching process to have exported anything.\n * `MISSION_ID` remains a valid override for callers that do set it explicitly.\n *\n * Entries are pruned on `deliver` (the session that owns them ends) and on read\n * (anything past `ACTIVE_SESSION_TTL_MS` is dropped as stale/abandoned).\n */\n\nexport type ActiveSessionEntry = {\n missionId: string;\n sessionKey: string;\n attachedAt: string;\n};\n\nconst ACTIVE_SESSION_TTL_MS = 12 * 60 * 60 * 1000;\n\nfunction manifestPath(workingDirectory: string): string {\n const key = createHash('sha256').update(path.resolve(workingDirectory)).digest('hex');\n return path.join(resolveGlobalDataDir(), 'vcs-sessions', `${key}.json`);\n}\n\nfunction readEntries(workingDirectory: string): ActiveSessionEntry[] {\n try {\n const target = manifestPath(workingDirectory);\n if (!existsSync(target)) return [];\n const raw = JSON.parse(readFileSync(target, 'utf8')) as { entries?: unknown };\n if (!Array.isArray(raw.entries)) return [];\n const now = Date.now();\n return raw.entries.flatMap(entry => {\n if (\n typeof entry !== 'object' ||\n entry === null ||\n typeof (entry as ActiveSessionEntry).missionId !== 'string' ||\n typeof (entry as ActiveSessionEntry).sessionKey !== 'string' ||\n typeof (entry as ActiveSessionEntry).attachedAt !== 'string'\n ) {\n return [];\n }\n const candidate = entry as ActiveSessionEntry;\n const attachedAtMs = Date.parse(candidate.attachedAt);\n if (Number.isNaN(attachedAtMs) || now - attachedAtMs > ACTIVE_SESSION_TTL_MS) return [];\n return [candidate];\n });\n } catch {\n return [];\n }\n}\n\nfunction writeEntries(workingDirectory: string, entries: ActiveSessionEntry[]): void {\n try {\n const target = manifestPath(workingDirectory);\n mkdirSync(path.dirname(target), { recursive: true });\n writeFileSync(target, JSON.stringify({ entries }));\n } catch {\n // Best-effort: without a manifest entry, hooks fall back to the MISSION_ID\n // env var (or stay inert), same as before this feature existed.\n }\n}\n\n/** Record (or refresh) this session as active for its working directory. */\nexport function writeActiveSession({\n workingDirectory,\n missionId,\n sessionKey\n}: {\n workingDirectory: string;\n missionId: string;\n sessionKey: string;\n}): void {\n const trimmedMission = missionId.trim();\n const trimmedKey = sessionKey.trim();\n if (!trimmedMission || !trimmedKey) return;\n const entries = readEntries(workingDirectory).filter(entry => entry.missionId !== trimmedMission);\n entries.push({\n missionId: trimmedMission,\n sessionKey: trimmedKey,\n attachedAt: new Date().toISOString()\n });\n writeEntries(workingDirectory, entries);\n}\n\n/** Drop this mission's entry once its session ends (deliver). */\nexport function removeActiveSession({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): void {\n const remaining = readEntries(workingDirectory).filter(entry => entry.missionId !== missionId);\n writeEntries(workingDirectory, remaining);\n}\n\n/** Live (non-expired) active-session entries for this working directory. */\nexport function readActiveSessions(workingDirectory: string): ActiveSessionEntry[] {\n return readEntries(workingDirectory);\n}\n\nexport type ResolvedMission = { missionId: string; ambiguous: boolean };\n\n/**\n * Resolve which mission is active for a working directory when the caller has\n * no explicit MISSION_ID. Returns `null` when nobody is attached here. When more\n * than one session is concurrently attached in the same directory (a shared\n * worktree), attribution is ambiguous from cwd alone \u2014 callers should treat that\n * as \"no confident answer\" rather than guess (Layer 3 adds proper cross-session\n * claims; this only needs to not mis-attribute).\n */\nexport function resolveActiveMissionForCwd(workingDirectory: string): ResolvedMission | null {\n const entries = readActiveSessions(workingDirectory);\n if (entries.length === 0) return null;\n if (entries.length === 1) {\n const [entry] = entries;\n return entry ? { missionId: entry.missionId, ambiguous: false } : null;\n }\n // Most-recently-attached wins, but flagged ambiguous so callers can log it.\n const mostRecent = [...entries].sort((a, b) => b.attachedAt.localeCompare(a.attachedAt))[0];\n return mostRecent ? { missionId: mostRecent.missionId, ambiguous: true } : null;\n}\n", "import { execFileSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n rmSync,\n writeFileSync\n} from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\nimport { readActiveSessions } from './vcs-sessions.js';\n\n/**\n * Client-side VCS change capture.\n *\n * Changed-file reporting must not depend on the agent remembering to enumerate\n * what it changed. Instead the CLI records a baseline snapshot of dirty paths\n * (path, status, worktree content hash) when a work session begins (`attach` /\n * `resume-follow-up`) and, at `deliver`, computes the run-attributable delta:\n * paths whose worktree state differs from that baseline.\n *\n * The worktree baseline cannot tell concurrent sessions apart: when several\n * missions run against the same repo at once, a file another mission edits *after*\n * this session attached has no baseline entry, so the worktree delta alone would\n * wrongly attribute it here. To stay accurate the CLI also consumes a per-session\n * \"touched files\" log written by the agent's PostToolUse edit hook (the exact set\n * of files this agent edited, including files changed via `Bash` \u2014 see\n * `recordBashObservedChanges`). When that log exists, the run-attributable set is\n * still every path whose worktree state changed since baseline \u2014 completeness\n * comes first \u2014 but each entry is classified as `'mine'` (named in my log),\n * `'claimed'` (named only in another live session's log), or `'unclaimed'`\n * (dirty, but nobody's log confirms it), so callers can exclude concurrent work\n * while still surfacing anything ambiguous for review. A tool-call log is\n * reliable positive evidence but unreliable negative evidence.\n *\n * Finally, a repo may carry an optional `.overlordignore` file at its root listing\n * gitignore-style patterns (e.g. generated artifacts like `install-state.gz`). Any\n * run-attributable path matching those patterns is dropped before reporting, so\n * Overlord never records churn the user has explicitly opted out of tracking.\n *\n * VCS is read on the client only \u2014 we never send diffs or file contents, just\n * normalized paths and short status codes. Everything here is best-effort: outside\n * a git repository (or when git is unavailable) we infer nothing.\n */\n\nexport type ChangedFile = {\n filePath: string;\n vcsStatus: string;\n /**\n * Set only when a touched-files log exists for this session. `'mine'` means the\n * edit hook recorded this path for the current mission. `'claimed'` means only\n * another live session's touched-files log recorded it, so callers can exclude\n * that concurrent work. `'unclaimed'` means the worktree delta includes it but\n * nobody's log confirms it (e.g. a Bash-mediated change the hook's git-status\n * diff hasn't caught up with yet). Completeness first: callers must still report\n * `'unclaimed'` paths, just flagged for review rather than silently dropped.\n */\n attribution?: 'mine' | 'claimed' | 'unclaimed';\n claimedByMissionIds?: string[];\n};\n\nexport type RationaleNoteInput = {\n filePath: string;\n toolName?: string | null;\n intent?: string | null;\n transcriptContext?: string | null;\n};\n\ntype RationaleNote = {\n filePath: string;\n toolName: string | null;\n intent: string | null;\n transcriptContext: string | null;\n contentHash: string | null;\n recordedAt: string;\n};\n\nexport type DraftChangeRationale = {\n file_path: string;\n label: string;\n summary: string;\n why: string;\n impact: string;\n};\n\ntype BaselineFile = {\n filePath: string;\n vcsStatus: string;\n /** `null` means this row came from a legacy path-only baseline. */\n contentHash: string | null;\n};\n\ntype BaselineSnapshot = {\n workingDirectory?: string;\n missionId?: string;\n capturedAt: string;\n files: BaselineFile[];\n};\n\ntype TouchedLog = {\n workingDirectory?: string;\n missionId?: string;\n updatedAt?: string;\n paths: string[];\n};\n\nfunction normalizePath(filePath: string): string {\n return filePath.replace(/\\\\/g, '/').trim();\n}\n\nfunction sameWorkingDirectory(left: string | undefined, right: string): boolean {\n return typeof left === 'string' && path.resolve(left) === path.resolve(right);\n}\n\n/** Parse one `git status --porcelain` line into a changed-file record. */\nfunction parsePorcelainLine(line: string): ChangedFile | null {\n const trimmedEnd = line.replace(/\\s+$/, '');\n if (!trimmedEnd) return null;\n const vcsStatus = trimmedEnd.slice(0, 2).trim() || 'changed';\n let pathPart = trimmedEnd.slice(3).trim();\n // Renames/copies render as \"old -> new\"; the new path is what currently exists.\n const arrow = pathPart.indexOf(' -> ');\n if (arrow !== -1) pathPart = pathPart.slice(arrow + 4).trim();\n // git quotes paths containing special chars; strip the surrounding quotes.\n if (pathPart.startsWith('\"') && pathPart.endsWith('\"') && pathPart.length >= 2) {\n pathPart = pathPart.slice(1, -1);\n }\n const filePath = normalizePath(pathPart);\n return filePath ? { filePath, vcsStatus } : null;\n}\n\nfunction hashWorktreeFile({\n workingDirectory,\n filePath\n}: {\n workingDirectory: string;\n filePath: string;\n}): string | null {\n try {\n return execFileSync('git', ['hash-object', filePath], {\n cwd: workingDirectory,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore']\n }).trim();\n } catch {\n return null;\n }\n}\n\n/** Current changed files from `git status --porcelain`; `[]` when not a git repo. */\nexport function readChangedFiles(workingDirectory: string): ChangedFile[] {\n try {\n const output = execFileSync('git', ['status', '--porcelain'], {\n cwd: workingDirectory,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n maxBuffer: 10 * 1024 * 1024\n });\n const byPath = new Map<string, ChangedFile>();\n for (const line of output.split('\\n')) {\n const entry = parsePorcelainLine(line);\n if (entry) byPath.set(entry.filePath, entry);\n }\n return Array.from(byPath.values());\n } catch {\n return [];\n }\n}\n\n/**\n * Stable per-session key for the working dir + mission. MUST stay in sync with the\n * key the agents' PostToolUse edit hooks compute, so the touched-files log written\n * by the hook resolves to the same file the CLI reads at deliver. The hook mirror\n * is `sha256(abspath(cwd) + \"\\0\" + MISSION_ID)`.\n */\nfunction sessionKeyHash({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return createHash('sha256')\n .update(`${path.resolve(workingDirectory)}\\0${missionId}`)\n .digest('hex');\n}\n\nfunction baselineFilePath({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return path.join(\n resolveGlobalDataDir(),\n 'vcs-baselines',\n `${sessionKeyHash({ workingDirectory, missionId })}.json`\n );\n}\n\nfunction touchedFilesPath({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return path.join(\n resolveGlobalDataDir(),\n 'vcs-touched',\n `${sessionKeyHash({ workingDirectory, missionId })}.json`\n );\n}\n\nfunction rationaleNotesPath({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return path.join(\n resolveGlobalDataDir(),\n 'vcs-rationale-notes',\n `${sessionKeyHash({ workingDirectory, missionId })}.json`\n );\n}\n\n/**\n * Last-seen `git status` snapshot for this session, stored beside the touched-files\n * log. Used only to detect *newly* dirty/re-hashed paths after a `Bash` tool call,\n * so a long-running session doesn't re-record the same Bash-visible change on every\n * subsequent Bash invocation.\n */\nfunction bashSnapshotPath({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): string {\n return path.join(\n resolveGlobalDataDir(),\n 'vcs-touched',\n `${sessionKeyHash({ workingDirectory, missionId })}.bash-snapshot.json`\n );\n}\n\nfunction readBashSnapshot({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): Map<string, { vcsStatus: string; contentHash: string | null }> {\n try {\n const target = bashSnapshotPath({ workingDirectory, missionId });\n if (!existsSync(target)) return new Map();\n const raw = JSON.parse(readFileSync(target, 'utf8')) as { files?: unknown };\n const byPath = new Map<string, { vcsStatus: string; contentHash: string | null }>();\n if (Array.isArray(raw.files)) {\n for (const entry of raw.files) {\n if (\n typeof entry === 'object' &&\n entry !== null &&\n typeof (entry as BaselineFile).filePath === 'string'\n ) {\n const file = entry as BaselineFile;\n byPath.set(file.filePath, {\n vcsStatus: typeof file.vcsStatus === 'string' ? file.vcsStatus : 'changed',\n contentHash: typeof file.contentHash === 'string' ? file.contentHash : null\n });\n }\n }\n }\n return byPath;\n } catch {\n return new Map();\n }\n}\n\nfunction writeBashSnapshot({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: BaselineFile[];\n}): void {\n try {\n const target = bashSnapshotPath({ workingDirectory, missionId });\n mkdirSync(path.dirname(target), { recursive: true });\n writeFileSync(target, JSON.stringify({ updatedAt: new Date().toISOString(), files }));\n } catch {\n // Best-effort: worst case a future Bash call re-records an already-touched path.\n }\n}\n\n/**\n * Close the Bash gap in the touched-files log. Files changed via `Bash` (codegen,\n * package managers, migration runners, `git mv`, build scripts) never fire Claude's\n * native file-editing tools, so the edit hook never sees them directly. Called after\n * every `Bash` tool invocation, this diffs the current `git status --porcelain`\n * output against the last-seen snapshot for this session and appends any\n * newly-changed or newly-re-hashed path to the touched-files log, so the deliver-time\n * intersection treats Bash-mediated edits the same as direct tool edits.\n */\nexport function recordBashObservedChanges({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): { addedCount: number } {\n try {\n const current = readChangedFiles(workingDirectory);\n const currentSnapshot = snapshotBaselineFiles({ workingDirectory, files: current });\n const previous = readBashSnapshot({ workingDirectory, missionId });\n\n const newlyChanged = currentSnapshot.filter(entry => {\n const prior = previous.get(entry.filePath);\n if (!prior) return true;\n if (entry.contentHash === null || prior.contentHash === null) {\n return entry.vcsStatus !== prior.vcsStatus;\n }\n return entry.contentHash !== prior.contentHash;\n });\n\n writeBashSnapshot({ workingDirectory, missionId, files: currentSnapshot });\n\n if (newlyChanged.length === 0) return { addedCount: 0 };\n\n recordTouchedFiles({\n workingDirectory,\n missionId,\n files: newlyChanged.map(entry => entry.filePath)\n });\n return { addedCount: newlyChanged.length };\n } catch {\n return { addedCount: 0 };\n }\n}\n\n/**\n * Absolute, symlink-resolved, slash-normalized path for cross-checking VCS and\n * touched entries. Resolving symlinks is what keeps both sides comparable: the\n * touched log records paths against the agent's working directory, while the\n * deliver-time intersection resolves them against `git rev-parse --show-toplevel`,\n * which git already canonicalizes (e.g. macOS `/var` \u2192 `/private/var`). Without\n * realpath here the two forms never match and every touched file is dropped.\n *\n * `realpathSync` needs the path to exist; for deleted files we resolve the\n * nearest existing ancestor and re-append the basename, falling back to a plain\n * resolve when even that is unavailable.\n */\nfunction normalizeAbsolute(filePath: string): string {\n const resolved = path.resolve(filePath);\n try {\n return realpathSync(resolved).replace(/\\\\/g, '/');\n } catch {\n try {\n return path\n .join(realpathSync(path.dirname(resolved)), path.basename(resolved))\n .replace(/\\\\/g, '/');\n } catch {\n return resolved.replace(/\\\\/g, '/');\n }\n }\n}\n\n/** Repo root for the working dir, or `null` outside a git repo. */\nfunction gitRepoRoot(workingDirectory: string): string | null {\n try {\n const root = execFileSync('git', ['rev-parse', '--show-toplevel'], {\n cwd: workingDirectory,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore']\n }).trim();\n return root || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Clear any touched-files log for this session so a freshly (re)started session\n * starts from an empty edit set. Called alongside `writeBaseline`.\n */\nexport function resetTouchedFiles({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): void {\n try {\n for (const target of [\n touchedFilesPath({ workingDirectory, missionId }),\n bashSnapshotPath({ workingDirectory, missionId })\n ]) {\n if (existsSync(target)) rmSync(target);\n }\n } catch {\n // Best-effort: a stale log at worst keeps prior edits in scope; the worktree\n // delta still gates what is reported.\n }\n}\n\n/** Clear any rationale-note log for this session. */\nexport function resetRationaleNotes({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): void {\n try {\n const target = rationaleNotesPath({ workingDirectory, missionId });\n if (existsSync(target)) rmSync(target);\n } catch {\n // Best-effort: stale notes only create reviewable drafts; they do not expand\n // changed-file attribution because the VCS delta still decides coverage.\n }\n}\n\nfunction truncateNoteText(value: string | null | undefined, max = 500): string | null {\n const trimmed = (value ?? '').replace(/\\s+/g, ' ').trim();\n if (!trimmed) return null;\n return trimmed.length > max ? `${trimmed.slice(0, max - 1)}...` : trimmed;\n}\n\nfunction readRationaleNotes({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): RationaleNote[] {\n try {\n const target = rationaleNotesPath({ workingDirectory, missionId });\n if (!existsSync(target)) return [];\n const raw = JSON.parse(readFileSync(target, 'utf8')) as { notes?: unknown };\n if (!Array.isArray(raw.notes)) return [];\n return raw.notes.flatMap(note => {\n if (\n typeof note !== 'object' ||\n note === null ||\n typeof (note as RationaleNote).filePath !== 'string'\n ) {\n return [];\n }\n const candidate = note as Partial<RationaleNote> & { filePath: string };\n return [\n {\n filePath: normalizeAbsolute(candidate.filePath),\n toolName: truncateNoteText(candidate.toolName),\n intent: truncateNoteText(candidate.intent),\n transcriptContext: truncateNoteText(candidate.transcriptContext),\n contentHash:\n typeof candidate.contentHash === 'string' && candidate.contentHash.trim()\n ? candidate.contentHash\n : null,\n recordedAt:\n typeof candidate.recordedAt === 'string' && candidate.recordedAt.trim()\n ? candidate.recordedAt\n : new Date(0).toISOString()\n }\n ];\n });\n } catch {\n return [];\n }\n}\n\n/**\n * Record lightweight edit context that can later become draft change\n * rationales. Notes are local-only session state, stored next to touched-file\n * logs, and are keyed by the same working directory + mission hash.\n */\nexport function recordRationaleNotes({\n workingDirectory,\n missionId,\n notes\n}: {\n workingDirectory: string;\n missionId: string;\n notes: RationaleNoteInput[];\n}): void {\n try {\n const additions = notes\n .map(note => ({\n filePath: (note.filePath ?? '').trim(),\n toolName: truncateNoteText(note.toolName, 80),\n intent: truncateNoteText(note.intent),\n transcriptContext: truncateNoteText(note.transcriptContext)\n }))\n .filter(note => note.filePath)\n .map(note => {\n const absolute = normalizeAbsolute(path.resolve(workingDirectory, note.filePath));\n return {\n filePath: absolute,\n toolName: note.toolName,\n intent: note.intent,\n transcriptContext: note.transcriptContext,\n contentHash: hashWorktreeFile({\n workingDirectory,\n filePath: path.relative(workingDirectory, absolute)\n }),\n recordedAt: new Date().toISOString()\n };\n });\n if (additions.length === 0) return;\n\n const target = rationaleNotesPath({ workingDirectory, missionId });\n mkdirSync(path.dirname(target), { recursive: true });\n const prior = readRationaleNotes({ workingDirectory, missionId });\n const notesToKeep = [...prior, ...additions].slice(-200);\n writeFileSync(\n target,\n JSON.stringify({ updatedAt: new Date().toISOString(), notes: notesToKeep })\n );\n } catch {\n // Best-effort: deliver can still proceed with explicit rationales.\n }\n}\n\n/**\n * Append the files an agent just edited to this session's touched-files log. Used\n * by edit hooks (and tests); paths are stored absolute and slash-normalized.\n */\nexport function recordTouchedFiles({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: string[];\n}): void {\n try {\n const additions = files\n .map(filePath => (filePath ?? '').trim())\n .filter(Boolean)\n .map(filePath => normalizeAbsolute(path.resolve(workingDirectory, filePath)));\n if (additions.length === 0) return;\n const target = touchedFilesPath({ workingDirectory, missionId });\n mkdirSync(path.dirname(target), { recursive: true });\n const existing = readTouchedLog({ workingDirectory, missionId })?.paths ?? new Set<string>();\n for (const filePath of additions) existing.add(filePath);\n writeFileSync(\n target,\n JSON.stringify({\n workingDirectory: path.resolve(workingDirectory),\n missionId,\n updatedAt: new Date().toISOString(),\n paths: Array.from(existing)\n })\n );\n } catch {\n // Best-effort: a failed write just means deliver falls back to the worktree\n // baseline for this session.\n }\n}\n\n/** Whether a touched-files log exists for this session (used for deliver-time diagnostics). */\nexport function hasTouchedFilesLog({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): boolean {\n return existsSync(touchedFilesPath({ workingDirectory, missionId }));\n}\n\n/**\n * Absolute paths this agent edited this session, or `null` when no log exists\n * (i.e. the connector has no edit hook). `null` disables the intersection so\n * hookless agents keep the legacy worktree-baseline behavior.\n */\nfunction readTouchedLog({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): { paths: Set<string>; workingDirectory?: string; missionId?: string } | null {\n try {\n const target = touchedFilesPath({ workingDirectory, missionId });\n if (!existsSync(target)) return null;\n const raw = JSON.parse(readFileSync(target, 'utf8')) as TouchedLog;\n const result = new Set<string>();\n if (Array.isArray(raw.paths)) {\n for (const entry of raw.paths) {\n if (typeof entry === 'string' && entry.trim()) result.add(normalizeAbsolute(entry));\n }\n }\n return {\n paths: result,\n workingDirectory: typeof raw.workingDirectory === 'string' ? raw.workingDirectory : undefined,\n missionId: typeof raw.missionId === 'string' ? raw.missionId : undefined\n };\n } catch {\n return null;\n }\n}\n\nfunction snapshotBaselineFiles({\n workingDirectory,\n files\n}: {\n workingDirectory: string;\n files: ChangedFile[];\n}): BaselineFile[] {\n return files.map(entry => ({\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n contentHash: hashWorktreeFile({ workingDirectory, filePath: entry.filePath })\n }));\n}\n\n/** Record the baseline snapshot for a session's working dir. */\nexport function writeBaseline({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: ChangedFile[];\n}): void {\n try {\n const target = baselineFilePath({ workingDirectory, missionId });\n mkdirSync(path.dirname(target), { recursive: true });\n const snapshot: BaselineSnapshot = {\n workingDirectory: path.resolve(workingDirectory),\n missionId,\n capturedAt: new Date().toISOString(),\n files: snapshotBaselineFiles({ workingDirectory, files })\n };\n writeFileSync(target, JSON.stringify(snapshot));\n } catch {\n // Best-effort: a missing baseline just means deliver treats every dirty path\n // as run-attributable, which is safe (errs toward completeness).\n }\n}\n\ntype PeerClaim = {\n missionId: string;\n paths: Set<string>;\n};\n\nfunction readPeerTouchedClaims({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): PeerClaim[] {\n const activeMissionIds = new Set(\n readActiveSessions(workingDirectory)\n .map(entry => entry.missionId.trim())\n .filter(Boolean)\n );\n if (activeMissionIds.size === 0) return [];\n\n const directory = path.join(resolveGlobalDataDir(), 'vcs-touched');\n if (!existsSync(directory)) return [];\n\n const claims: PeerClaim[] = [];\n for (const name of readdirSync(directory)) {\n if (!name.endsWith('.json') || name.endsWith('.bash-snapshot.json')) continue;\n try {\n const raw = JSON.parse(readFileSync(path.join(directory, name), 'utf8')) as TouchedLog;\n const candidateMissionId =\n typeof raw.missionId === 'string' && raw.missionId.trim() ? raw.missionId.trim() : null;\n if (!candidateMissionId || candidateMissionId === missionId) continue;\n if (!activeMissionIds.has(candidateMissionId)) continue;\n if (!sameWorkingDirectory(raw.workingDirectory, workingDirectory)) continue;\n\n const paths = new Set<string>();\n if (Array.isArray(raw.paths)) {\n for (const entry of raw.paths) {\n if (typeof entry === 'string' && entry.trim()) paths.add(normalizeAbsolute(entry));\n }\n }\n if (paths.size === 0) continue;\n claims.push({ missionId: candidateMissionId, paths });\n } catch {\n continue;\n }\n }\n\n return claims;\n}\n\nfunction readBaselineSnapshot({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): Map<string, BaselineFile> {\n try {\n const target = baselineFilePath({ workingDirectory, missionId });\n if (!existsSync(target)) return new Map();\n const raw = JSON.parse(readFileSync(target, 'utf8')) as {\n files?: unknown;\n paths?: unknown;\n };\n if (Array.isArray(raw.files)) {\n const byPath = new Map<string, BaselineFile>();\n for (const entry of raw.files) {\n if (\n typeof entry === 'object' &&\n entry !== null &&\n typeof (entry as BaselineFile).filePath === 'string'\n ) {\n const file = entry as BaselineFile;\n byPath.set(file.filePath, {\n filePath: file.filePath,\n vcsStatus: typeof file.vcsStatus === 'string' ? file.vcsStatus : 'changed',\n contentHash: typeof file.contentHash === 'string' ? file.contentHash : null\n });\n }\n }\n return byPath;\n }\n // Legacy path-only baselines cannot detect further edits within the same path.\n if (Array.isArray(raw.paths)) {\n const byPath = new Map<string, BaselineFile>();\n for (const filePath of raw.paths) {\n if (typeof filePath === 'string') {\n byPath.set(filePath, { filePath, vcsStatus: 'changed', contentHash: null });\n }\n }\n return byPath;\n }\n return new Map();\n } catch {\n return new Map();\n }\n}\n\nfunction isRunAttributableChange({\n workingDirectory,\n entry,\n baseline\n}: {\n workingDirectory: string;\n entry: ChangedFile;\n baseline: Map<string, BaselineFile>;\n}): boolean {\n const base = baseline.get(entry.filePath);\n if (!base) return true;\n if (base.contentHash === null) return false;\n const currentHash = hashWorktreeFile({ workingDirectory, filePath: entry.filePath });\n return currentHash !== base.contentHash;\n}\n\ntype IgnoreRule = {\n /** A `!`-prefixed pattern re-includes a path an earlier rule ignored. */\n negated: boolean;\n regex: RegExp;\n};\n\n/** Name of the per-repo ignore file, resolved at the git repo root. */\nexport const OVERLORD_IGNORE_FILENAME = '.overlordignore';\n\n/** Translate one gitignore-style glob body into a regex fragment (no anchors). */\nfunction ignoreGlobToRegExp(glob: string): string {\n let out = '';\n for (let index = 0; index < glob.length; index += 1) {\n const char = glob[index] ?? '';\n if (char === '*') {\n if (glob[index + 1] === '*') {\n index += 1;\n if (glob[index + 1] === '/') {\n // `**/` matches any number of leading path segments, including none.\n index += 1;\n out += '(.*/)?';\n } else {\n out += '.*';\n }\n } else {\n out += '[^/]*';\n }\n } else if (char === '?') {\n out += '[^/]';\n } else {\n out += char.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n }\n return out;\n}\n\n/** Compile a single `.overlordignore` line into a rule, or `null` to skip it. */\nfunction compileIgnorePattern(rawPattern: string): IgnoreRule | null {\n let pattern = rawPattern;\n let negated = false;\n if (pattern.startsWith('!')) {\n negated = true;\n pattern = pattern.slice(1);\n }\n // Allow escaping a literal leading '#' or '!' the same way gitignore does.\n if (pattern.startsWith('\\\\#') || pattern.startsWith('\\\\!')) {\n pattern = pattern.slice(1);\n }\n let directoryOnly = false;\n if (pattern.endsWith('/')) {\n directoryOnly = true;\n pattern = pattern.slice(0, -1);\n }\n if (!pattern) return null;\n\n // A slash anywhere but a trailing one anchors the pattern to the repo root;\n // an unanchored pattern matches its basename at any depth.\n const anchored = pattern.includes('/');\n if (pattern.startsWith('/')) pattern = pattern.slice(1);\n if (!pattern) return null;\n\n const prefix = anchored ? '^' : '(^|/)';\n const body = ignoreGlobToRegExp(pattern);\n // A directory pattern only matches files *under* it (changed paths are files);\n // a file pattern matches the path itself or, if it names a directory, its\n // contents.\n const suffix = directoryOnly ? '/.*$' : '(/.*)?$';\n try {\n return { negated, regex: new RegExp(`${prefix}${body}${suffix}`) };\n } catch {\n return null;\n }\n}\n\n/** Parse the repo's `.overlordignore` into ordered rules; `[]` when absent. */\nfunction loadIgnoreRules(repoRoot: string): IgnoreRule[] {\n try {\n const target = path.join(repoRoot, OVERLORD_IGNORE_FILENAME);\n if (!existsSync(target)) return [];\n const rules: IgnoreRule[] = [];\n for (const rawLine of readFileSync(target, 'utf8').split('\\n')) {\n const line = rawLine.replace(/\\r$/, '').trim();\n if (!line || line.startsWith('#')) continue;\n const rule = compileIgnorePattern(line);\n if (rule) rules.push(rule);\n }\n return rules;\n } catch {\n return [];\n }\n}\n\n/**\n * Whether a repo-root-relative path is ignored. Rules apply in order and the\n * last matching rule wins, so a later `!pattern` can re-include a path an earlier\n * pattern excluded (gitignore semantics).\n */\nfunction isIgnoredPath(rules: IgnoreRule[], relativePath: string): boolean {\n let ignored = false;\n for (const rule of rules) {\n if (rule.regex.test(relativePath)) ignored = !rule.negated;\n }\n return ignored;\n}\n\n/**\n * Keep only paths this run is responsible for, classifying each by whether the\n * agent's own touched-files log confirms it.\n *\n * A path qualifies when its worktree state differs from the session baseline.\n * When the connector's edit hook recorded a touched-files log, paths it names are\n * marked `attribution: 'mine'`. Paths only other live sessions claim are marked\n * `'claimed'`, so callers can exclude them from this mission's report and, at\n * deliver, attach truthful skip entries if stale server-side rows still demand\n * coverage. Paths nobody claims are marked `'unclaimed'` and are still returned\n * rather than dropped: a tool-call log is reliable positive evidence but\n * unreliable negative evidence (a hook outage, an unmatched tool, or a Bash call\n * the hook hasn't diffed yet all look identical to \"not mine\"), and completeness\n * is the first priority. Hookless connectors get `null` from `readTouchedLog` and\n * every entry is returned with no attribution marker (legacy baseline-only\n * behavior).\n *\n * `git status --porcelain` paths are repo-root-relative, so we resolve them\n * against the repo root before comparing with the absolute touched paths.\n *\n * Finally, any path matching the repo's optional `.overlordignore` is dropped,\n * letting users opt specific files (e.g. generated artifacts) out of tracking.\n */\nexport function filterRunAttributableChanges({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: ChangedFile[];\n}): ChangedFile[] {\n const baseline = readBaselineSnapshot({ workingDirectory, missionId });\n const touched = readTouchedLog({ workingDirectory, missionId });\n const repoRoot = gitRepoRoot(workingDirectory) ?? workingDirectory;\n const ignoreRules = loadIgnoreRules(repoRoot);\n const peerClaims = touched ? readPeerTouchedClaims({ workingDirectory, missionId }) : [];\n return files.flatMap(entry => {\n if (!isRunAttributableChange({ workingDirectory, entry, baseline })) return [];\n if (ignoreRules.length > 0 && isIgnoredPath(ignoreRules, normalizePath(entry.filePath))) {\n return [];\n }\n if (!touched) return [{ filePath: entry.filePath, vcsStatus: entry.vcsStatus }];\n const absolute = normalizeAbsolute(path.resolve(repoRoot, entry.filePath));\n if (touched.paths.has(absolute)) {\n return [\n {\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n attribution: 'mine'\n }\n ];\n }\n const claimedByMissionIds = peerClaims\n .filter(claim => claim.paths.has(absolute))\n .map(claim => claim.missionId)\n .sort();\n if (claimedByMissionIds.length > 0) {\n return [\n {\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n attribution: 'claimed',\n claimedByMissionIds\n }\n ];\n }\n return [\n {\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n attribution: 'unclaimed'\n }\n ];\n });\n}\n\nfunction titleFromPath(filePath: string): string {\n const base = path.basename(filePath).replace(/\\.[^.]+$/, '');\n const words = base\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[-_]+/g, ' ')\n .trim();\n if (!words) return `Update ${filePath}`;\n return `Update ${words.replace(/\\b\\w/g, char => char.toUpperCase())}`;\n}\n\nfunction latestRelevantNote({\n notes,\n filePath,\n currentHash\n}: {\n notes: RationaleNote[];\n filePath: string;\n currentHash: string | null;\n}): RationaleNote | null {\n const candidates = notes\n .filter(note => note.filePath === filePath)\n .sort((left, right) => right.recordedAt.localeCompare(left.recordedAt));\n if (candidates.length === 0) return null;\n return (\n candidates.find(note => currentHash && note.contentHash && note.contentHash === currentHash) ??\n candidates[0] ??\n null\n );\n}\n\n/**\n * Build reviewable draft rationales for the current run-attributable files from\n * local edit notes. This preserves the server-side coverage contract: the caller\n * can merge drafts for files that do not already have explicit rationales.\n */\nexport function draftChangeRationalesFromNotes({\n workingDirectory,\n missionId,\n files\n}: {\n workingDirectory: string;\n missionId: string;\n files: ChangedFile[];\n}): DraftChangeRationale[] {\n const notes = readRationaleNotes({ workingDirectory, missionId });\n if (notes.length === 0 || files.length === 0) return [];\n const repoRoot = gitRepoRoot(workingDirectory) ?? workingDirectory;\n return files.flatMap(file => {\n const absolute = normalizeAbsolute(path.resolve(repoRoot, file.filePath));\n const currentHash = hashWorktreeFile({ workingDirectory, filePath: file.filePath });\n const note = latestRelevantNote({ notes, filePath: absolute, currentHash });\n if (!note) return [];\n\n const action = note.intent ?? `edited with ${note.toolName ?? 'a file-editing tool'}`;\n const context = note.transcriptContext ? ` Session context: ${note.transcriptContext}` : '';\n return [\n {\n file_path: normalizePath(file.filePath),\n label: titleFromPath(file.filePath),\n summary: `Draft from local edit notes: ${action}.${context}`.slice(0, 700),\n why: `This file was changed for the active objective; the draft was generated from the edit note captured when the change was made.`,\n impact: `Preserves review coverage for ${normalizePath(\n file.filePath\n )}; review the final diff before delivery if a more specific product impact is needed.`\n }\n ];\n });\n}\n\n/** Files whose worktree state changed since the session began. */\nexport function computeRunDelta({\n workingDirectory,\n missionId\n}: {\n workingDirectory: string;\n missionId: string;\n}): ChangedFile[] {\n return filterRunAttributableChanges({\n workingDirectory,\n missionId,\n files: readChangedFiles(workingDirectory)\n });\n}\n", "import { readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { recordBashObservedChanges, recordRationaleNotes, recordTouchedFiles } from './vcs.js';\nimport { resolveActiveMissionForCwd } from './vcs-sessions.js';\n\n/**\n * Shared implementation behind `ovld protocol record-touched`.\n *\n * Any adapter's file-editing-tool hook (Claude's PostToolUse today; Codex/Cursor\n * once they grow one) can pipe its native hook JSON on stdin here instead of\n * reimplementing the touched-files log and rationale-note bookkeeping itself.\n * The only per-adapter assumption is the payload shape below (`tool_name`,\n * `tool_input.file_path` / `notebook_path` / `edits`, `cwd`, `transcript_path`),\n * which mirrors Claude Code's hook body; adapters with a different shape should\n * normalize to this shape before piping in.\n */\n\ntype HookPayload = {\n tool_name?: unknown;\n tool_input?: unknown;\n cwd?: unknown;\n transcript_path?: unknown;\n};\n\ntype EditCandidate = { filePath: string; editCount: number };\n\nfunction collectCandidates(toolInput: Record<string, unknown>): EditCandidate[] {\n const counts = new Map<string, number>();\n const order: string[] = [];\n const bump = (raw: unknown, amount: number) => {\n if (typeof raw !== 'string') return;\n const trimmed = raw.trim();\n if (!trimmed) return;\n if (!counts.has(trimmed)) order.push(trimmed);\n counts.set(trimmed, (counts.get(trimmed) ?? 0) + amount);\n };\n\n bump(toolInput.file_path, 1);\n bump(toolInput.notebook_path, 1);\n\n const edits = toolInput.edits;\n if (Array.isArray(edits)) {\n const topLevelPath = toolInput.file_path;\n if (typeof topLevelPath === 'string' && topLevelPath.trim()) {\n counts.set(topLevelPath.trim(), (counts.get(topLevelPath.trim()) ?? 0) - 1);\n }\n for (const edit of edits) {\n if (edit && typeof edit === 'object') {\n const value = (edit as Record<string, unknown>).file_path ?? topLevelPath;\n bump(value, 1);\n }\n }\n }\n\n return order.map(filePath => ({ filePath, editCount: Math.max(counts.get(filePath) ?? 1, 1) }));\n}\n\nfunction compact(value: string | null | undefined, limit = 500): string | null {\n if (typeof value !== 'string') return null;\n const text = value.split(/\\s+/).filter(Boolean).join(' ');\n if (!text) return null;\n return text.length > limit ? `${text.slice(0, limit - 1)}...` : text;\n}\n\nfunction editIntent({\n toolName,\n filePath,\n editCount\n}: {\n toolName: string;\n filePath: string;\n editCount: number;\n}): string {\n if (toolName === 'Write') return 'wrote or replaced the file';\n if (toolName === 'MultiEdit' || editCount > 1)\n return `applied ${editCount} targeted text edit(s)`;\n if (toolName === 'Edit') return 'replaced selected text';\n if (/notebook/i.test(filePath) || /notebook/i.test(toolName)) return 'edited notebook content';\n return `edited via ${toolName}`;\n}\n\n/** Best-effort: last assistant message text from the transcript, for rationale context. */\nfunction recentAssistantContext(transcriptPath: unknown): string | null {\n if (typeof transcriptPath !== 'string' || !transcriptPath.trim()) return null;\n try {\n const lines = readFileSync(transcriptPath, 'utf8').split('\\n').slice(-200);\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index]?.trim();\n if (!line) continue;\n let event: unknown;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n if (typeof event !== 'object' || event === null) continue;\n const record = event as Record<string, unknown>;\n const message = record.message as Record<string, unknown> | undefined;\n const role = message?.role ?? record.type;\n if (role !== 'assistant') continue;\n const content = message?.content ?? record.content;\n const texts: string[] = [];\n if (typeof content === 'string') {\n texts.push(content);\n } else if (Array.isArray(content)) {\n for (const item of content) {\n if (\n item &&\n typeof item === 'object' &&\n (item as Record<string, unknown>).type === 'text'\n ) {\n const text = (item as Record<string, unknown>).text;\n if (typeof text === 'string') texts.push(text);\n }\n }\n }\n const compacted = compact(texts.join(' '));\n if (compacted) return compacted;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport type RecordTouchedResult =\n | { recorded: true; missionId: string; ambiguous: boolean; files: number }\n | { recorded: false; reason: string };\n\n/**\n * Parse a hook payload and append its edited files to the resolved mission's\n * touched-files log + rationale notes. `missionOverride` (from `--mission-id` or\n * the `MISSION_ID` env var) always wins over manifest resolution.\n */\nexport function recordTouchedFromPayload({\n rawPayload,\n missionOverride,\n fallbackCwd\n}: {\n rawPayload: string;\n missionOverride?: string;\n fallbackCwd: string;\n}): RecordTouchedResult {\n let payload: HookPayload;\n try {\n payload = JSON.parse(rawPayload) as HookPayload;\n } catch {\n return { recorded: false, reason: 'invalid JSON payload' };\n }\n\n const toolInputRaw = payload.tool_input;\n const toolInput =\n toolInputRaw && typeof toolInputRaw === 'object'\n ? (toolInputRaw as Record<string, unknown>)\n : {};\n const toolName =\n typeof payload.tool_name === 'string' && payload.tool_name.trim()\n ? payload.tool_name.trim()\n : 'file edit';\n\n const cwd =\n typeof payload.cwd === 'string' && payload.cwd.trim() ? payload.cwd.trim() : fallbackCwd;\n const workingDirectory = path.resolve(cwd);\n\n const trimmedOverride = missionOverride?.trim();\n let missionId: string;\n let ambiguous = false;\n if (trimmedOverride) {\n missionId = trimmedOverride;\n } else {\n const resolved = resolveActiveMissionForCwd(workingDirectory);\n if (!resolved) {\n return { recorded: false, reason: 'no active session manifest entry for this cwd' };\n }\n missionId = resolved.missionId;\n ambiguous = resolved.ambiguous;\n }\n\n if (toolName === 'Bash') {\n // Bash never names the files it changes (codegen, package managers, `git mv`,\n // build scripts), so there is nothing to extract from `tool_input`. Instead,\n // diff the current worktree against the last-seen snapshot for this session and\n // fold anything newly dirty into the touched-files log as positive evidence.\n const { addedCount } = recordBashObservedChanges({ workingDirectory, missionId });\n return { recorded: true, missionId, ambiguous, files: addedCount };\n }\n\n const candidates = collectCandidates(toolInput);\n if (candidates.length === 0) return { recorded: false, reason: 'no file candidates in payload' };\n\n const transcriptContext = recentAssistantContext(payload.transcript_path);\n\n recordTouchedFiles({\n workingDirectory,\n missionId,\n files: candidates.map(candidate => candidate.filePath)\n });\n recordRationaleNotes({\n workingDirectory,\n missionId,\n notes: candidates.map(candidate => ({\n filePath: candidate.filePath,\n toolName: compact(toolName, 80),\n intent: compact(\n editIntent({ toolName, filePath: candidate.filePath, editCount: candidate.editCount })\n ),\n transcriptContext\n }))\n });\n\n return { recorded: true, missionId, ambiguous, files: candidates.length };\n}\n", "import type { ProjectResourceDto } from '@overlord/contract';\nimport { InProcessProvider } from '@overlord/core/service/local-target/in-process-provider';\n\ntype BackendClient = {\n get: <T>(path: string) => Promise<T>;\n post: <T>(args: { path: string; body?: unknown }) => Promise<T>;\n};\n\nfunction resourcesForTarget({\n resources,\n executionTargetId\n}: {\n resources: ProjectResourceDto[];\n executionTargetId: string;\n}): ProjectResourceDto[] {\n return resources.filter(\n resource =>\n resource.type === 'local_directory' &&\n resource.status !== 'archived' &&\n (resource.executionTargetId === executionTargetId || resource.executionTargetId === null)\n );\n}\n\n/** Observe project resources on this machine and write results to the control plane. */\nexport async function reportRunnerResourceObservations({\n backend,\n projectId,\n executionTargetId\n}: {\n backend: BackendClient;\n projectId: string;\n executionTargetId: string;\n}): Promise<number> {\n const resources = await backend.get<ProjectResourceDto[]>(\n `/api/projects/${encodeURIComponent(projectId)}/resources`\n );\n const scoped = resourcesForTarget({ resources, executionTargetId });\n if (scoped.length === 0) return 0;\n\n const provider = new InProcessProvider({\n executionTargetId,\n deviceLabel: null,\n transport: 'in_process'\n });\n\n const observations = [];\n for (const resource of scoped) {\n const result = await provider.observeResource({\n resourceId: resource.id,\n path: resource.path\n });\n if (!result.ok) continue;\n observations.push({\n resourceId: resource.id,\n state: result.value.state,\n gitRoot: result.value.gitRoot ?? null,\n branch: result.value.branch ?? null,\n commit: result.value.commit ?? null,\n observedAt: result.value.observedAt\n });\n }\n\n if (observations.length === 0) return 0;\n\n const response = await backend.post<{ recorded: number }>({\n path: `/api/execution-targets/${encodeURIComponent(executionTargetId)}/observations`,\n body: { observations }\n });\n return response.recorded ?? observations.length;\n}\n", "// Persistent runner service (Runner Layer).\n//\n// A host-managed supervisor around the existing one-shot claim-and-launch path.\n// The CLI owns install/start/stop/status/uninstall of an OS-level user service\n// (macOS launchd LaunchAgent, Linux `systemd --user` unit) whose only job is to\n// run `ovld runner supervise` \u2014 the adaptive long-running loop that delegates\n// each poll to the same code used by `ovld runner once`.\n//\n// This module keeps all pure, testable logic \u2014 adaptive interval selection,\n// service-file rendering, and local state I/O \u2014 separate from the thin process\n// exec wiring so the behavior can be unit-tested without touching the host OS.\n\nimport { execFile } from 'node:child_process';\nimport { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { promisify } from 'node:util';\n\nimport { resolveGlobalDataDir } from './config.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * The rendered service definition embeds a user token in its environment, so the\n * file must never be world-readable. Owner read/write only.\n */\nfunction writeServiceFile(filePath: string, contents: string): void {\n writeFileSync(filePath, contents, { mode: 0o600 });\n // `mode` on writeFileSync is ignored when the file already exists, so enforce\n // it explicitly for the overwrite-an-existing-unit case.\n chmodSync(filePath, 0o600);\n}\n\n// ---- Constants --------------------------------------------------------------\n\nexport const RUNNER_SERVICE_STATE_FILENAME = 'runner-service.json';\n/** macOS launchd LaunchAgent label. */\nexport const LAUNCHD_LABEL = 'io.overlord.runner';\n/** Linux systemd --user unit name (without the `.service` suffix). */\nexport const SYSTEMD_UNIT_NAME = 'overlord-runner';\n\n/** Fast cadence used while a job launched recently. */\nexport const FAST_POLL_INTERVAL_MS = 3000;\n/** Slow cadence used after a long idle stretch. */\nexport const SLOW_POLL_INTERVAL_MS = 10000;\n/** Idle window (2h) after which polling backs off to the slow cadence. */\nexport const IDLE_BACKOFF_MS = 2 * 60 * 60 * 1000;\n\nexport type RunnerServiceKind = 'launchd' | 'systemd';\n\n// ---- Local state ------------------------------------------------------------\n\nexport interface RunnerServiceState {\n serviceKind: RunnerServiceKind | null;\n serviceIdentifier: string | null;\n execProgram: string | null;\n execArgs: string[];\n backendUrl: string | null;\n installedAt: string | null;\n lastHeartbeatAt: string | null;\n lastClaimedAt: string | null;\n lastLaunchedAt: string | null;\n lastError: string | null;\n currentPollIntervalMs: number | null;\n}\n\nexport function emptyRunnerServiceState(): RunnerServiceState {\n return {\n serviceKind: null,\n serviceIdentifier: null,\n execProgram: null,\n execArgs: [],\n backendUrl: null,\n installedAt: null,\n lastHeartbeatAt: null,\n lastClaimedAt: null,\n lastLaunchedAt: null,\n lastError: null,\n currentPollIntervalMs: null\n };\n}\n\nexport function runnerServiceStatePath(dataDir: string = resolveGlobalDataDir()): string {\n return path.join(dataDir, RUNNER_SERVICE_STATE_FILENAME);\n}\n\nexport function readRunnerServiceState(\n dataDir: string = resolveGlobalDataDir()\n): RunnerServiceState {\n const filePath = runnerServiceStatePath(dataDir);\n if (!existsSync(filePath)) return emptyRunnerServiceState();\n try {\n const parsed = JSON.parse(readFileSync(filePath, 'utf8')) as Partial<RunnerServiceState>;\n return { ...emptyRunnerServiceState(), ...parsed };\n } catch {\n // A corrupt state file is local diagnostic data only; never fail a poll or a\n // status read because of it \u2014 start from a clean slate.\n return emptyRunnerServiceState();\n }\n}\n\nexport function writeRunnerServiceState(\n state: RunnerServiceState,\n dataDir: string = resolveGlobalDataDir()\n): void {\n mkdirSync(dataDir, { recursive: true });\n writeFileSync(runnerServiceStatePath(dataDir), `${JSON.stringify(state, null, 2)}\\n`, 'utf8');\n}\n\n/** Merge a partial patch into the persisted state and write it back. */\nexport function patchRunnerServiceState(\n patch: Partial<RunnerServiceState>,\n dataDir: string = resolveGlobalDataDir()\n): RunnerServiceState {\n const next = { ...readRunnerServiceState(dataDir), ...patch };\n writeRunnerServiceState(next, dataDir);\n return next;\n}\n\n// ---- Adaptive polling -------------------------------------------------------\n\n/**\n * Base poll interval by the \"last launched job\" clock (not \"last poll with\n * work\"): fast while a job launched within the idle window, slow afterwards.\n * Pure and deterministic so the cadence is unit-testable.\n */\nexport function selectBasePollIntervalMs({\n lastLaunchedAt,\n now\n}: {\n lastLaunchedAt: string | null;\n now: number;\n}): number {\n if (!lastLaunchedAt) return SLOW_POLL_INTERVAL_MS;\n const launchedMs = Date.parse(lastLaunchedAt);\n if (Number.isNaN(launchedMs)) return SLOW_POLL_INTERVAL_MS;\n return now - launchedMs <= IDLE_BACKOFF_MS ? FAST_POLL_INTERVAL_MS : SLOW_POLL_INTERVAL_MS;\n}\n\n/**\n * Add ~10% jitter so many local runners polling a shared backend do not wake in\n * lockstep. `random` is injectable for deterministic tests.\n */\nexport function applyPollJitter(intervalMs: number, random: () => number = Math.random): number {\n const spread = intervalMs * 0.1;\n return Math.round(intervalMs + (random() * 2 - 1) * spread);\n}\n\n/**\n * The `lastError` to persist after a poll. It reflects the outcome of the most\n * recent poll: a failed poll records its error, a successful poll clears it.\n *\n * This must NOT fall back to the previously stored error on success. Doing so\n * makes the error sticky \u2014 e.g. an \"authentication required\" failure from before\n * the user logged in would never clear, so the desktop runner status box keeps\n * reading `serviceError` and showing \"Runner error\" long after the runner is\n * authenticated and polling cleanly. Surfacing the latest poll's result keeps a\n * genuine persistent failure visible (it re-throws every poll) while letting a\n * recovered runner self-heal on its next successful poll.\n */\nexport function nextRunnerLastError(pollError: string | null): string | null {\n return pollError;\n}\n\n// ---- Service invocation resolution -----------------------------------------\n\nexport interface RunnerServiceInvocation {\n program: string;\n args: string[];\n /**\n * True when `program` is the Electron/Overlord app binary and must be run as\n * Node (`ELECTRON_RUN_AS_NODE=1`) instead of booting the GUI. Recording the\n * Overlord binary also makes macOS register the background item, login item,\n * and automation prompt under \"Overlord\" rather than the plain `node`\n * binary's \"Node.js Foundation\" signature.\n */\n runAsElectronNode?: boolean;\n}\n\n/**\n * If the Overlord desktop app is installed, resolve an invocation that runs the\n * persistent service through the app's own bundled binary and CLI (as Node).\n * macOS attributes a LaunchAgent's background item / automation prompt to the\n * code-signing identity of `ProgramArguments[0]`; using the signed Overlord\n * binary registers the service under \"Overlord\" instead of \"Node.js Foundation\".\n * Both the binary and the app-bundled CLI script are used so the runtime and its\n * native modules match the app's Electron ABI. Returns null when the app is not\n * found (e.g. a CLI-only install with no desktop app present).\n */\nexport function resolveOverlordAppInvocation({\n platform = process.platform,\n homedir = os.homedir(),\n exists = existsSync\n}: {\n platform?: NodeJS.Platform;\n homedir?: string;\n exists?: (candidate: string) => boolean;\n} = {}): RunnerServiceInvocation | null {\n if (platform !== 'darwin') return null;\n const appDirs = [\n '/Applications/Overlord.app',\n path.join(homedir, 'Applications', 'Overlord.app')\n ];\n for (const appDir of appDirs) {\n const program = path.join(appDir, 'Contents', 'MacOS', 'Overlord');\n const script = path.join(appDir, 'Contents', 'Resources', 'cli', 'bin', 'ovld.mjs');\n if (exists(program) && exists(script)) {\n return { program, args: [script, 'runner', 'supervise'], runAsElectronNode: true };\n }\n }\n return null;\n}\n\n/**\n * Resolve how the installed service should invoke `ovld runner supervise`.\n * Prefer an explicit override (`OVLD_RUNNER_EXEC`, space-free path), otherwise\n * re-run the current CLI entrypoint under the same Node runtime. Persistent\n * services start with a sparse environment, so we always record an absolute\n * program path rather than relying on `PATH` resolution of a bare `ovld`.\n *\n * When the installer already runs under Electron-as-Node (the desktop app path),\n * `process.execPath` is the Overlord binary \u2014 keep using it. Otherwise, for a\n * plain terminal install, prefer the installed Overlord app binary when present\n * so the service registers under \"Overlord\" rather than \"Node.js Foundation\".\n */\nexport function resolveOvldInvocation(\n argv: string[] = process.argv,\n execPath: string = process.execPath\n): RunnerServiceInvocation {\n const override = process.env.OVLD_RUNNER_EXEC?.trim();\n if (override) {\n return { program: override, args: ['runner', 'supervise'] };\n }\n const scriptPath = argv[1] ? path.resolve(argv[1]) : '';\n if (process.env.ELECTRON_RUN_AS_NODE) {\n return scriptPath\n ? { program: execPath, args: [scriptPath, 'runner', 'supervise'], runAsElectronNode: true }\n : { program: execPath, args: ['runner', 'supervise'], runAsElectronNode: true };\n }\n const appInvocation = resolveOverlordAppInvocation();\n if (appInvocation) return appInvocation;\n if (scriptPath) {\n return { program: execPath, args: [scriptPath, 'runner', 'supervise'] };\n }\n return { program: execPath, args: ['runner', 'supervise'] };\n}\n\n/**\n * Describe which code-signing identity macOS will attribute the installed\n * service to, based on the recorded exec program. Terminal installs that predate\n * app-binary resolution still run the plain `node` binary and register under\n * \"Node.js Foundation\"; reinstalling from a machine with the desktop app present\n * re-registers them under \"Overlord\". A no-op on non-macOS hosts.\n */\nexport function describeServicePublisher({\n execProgram,\n platform = process.platform\n}: {\n execProgram: string | null;\n platform?: NodeJS.Platform;\n}): { publisher: 'overlord' | 'node' | 'unknown'; needsReinstallForOverlord: boolean } {\n if (platform !== 'darwin' || !execProgram) {\n return { publisher: 'unknown', needsReinstallForOverlord: false };\n }\n if (execProgram.includes('.app/Contents/MacOS/')) {\n return { publisher: 'overlord', needsReinstallForOverlord: false };\n }\n return { publisher: 'node', needsReinstallForOverlord: true };\n}\n\n/**\n * Environment snapshot injected into the service definition. Persistent services\n * do not source interactive shell startup files, so the backend URL, Overlord\n * home, and a minimal PATH must be captured explicitly at install time.\n */\nexport function buildRunnerServiceEnv({\n backendUrl,\n overlordHome,\n runAsElectronNode\n}: {\n backendUrl: string;\n overlordHome?: string | null;\n runAsElectronNode?: boolean;\n}): Record<string, string> {\n const env: Record<string, string> = {\n OVERLORD_BACKEND_URL: backendUrl,\n PATH: process.env.PATH?.trim() || '/usr/local/bin:/usr/bin:/bin'\n };\n const home = overlordHome?.trim() || process.env.OVLD_HOME?.trim();\n if (home) env.OVLD_HOME = path.resolve(home);\n const token = process.env.OVERLORD_USER_TOKEN?.trim() || process.env.OVLD_USER_TOKEN?.trim();\n if (token) env.OVERLORD_USER_TOKEN = token;\n // When the service program is the Overlord/Electron binary \u2014 either because the\n // install ran inside the desktop shell (Electron executing this script as Node)\n // or because a terminal install resolved the installed app binary \u2014 the unit\n // must carry this flag or launchd/systemd would boot GUI app instances on a\n // KeepAlive loop instead of the supervisor. It also makes macOS register the\n // background item and automation prompt under \"Overlord\" rather than \"Node\".\n if (runAsElectronNode || process.env.ELECTRON_RUN_AS_NODE) env.ELECTRON_RUN_AS_NODE = '1';\n return env;\n}\n\n// ---- Service file rendering (pure) -----------------------------------------\n\nfunction xmlEscape(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nexport function renderLaunchdPlist({\n label,\n invocation,\n env,\n logDir\n}: {\n label: string;\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n logDir: string;\n}): string {\n const programArgs = [invocation.program, ...invocation.args]\n .map(arg => ` <string>${xmlEscape(arg)}</string>`)\n .join('\\n');\n const envEntries = Object.entries(env)\n .map(\n ([key, value]) => ` <key>${xmlEscape(key)}</key>\\n <string>${xmlEscape(value)}</string>`\n )\n .join('\\n');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${xmlEscape(label)}</string>\n <key>ProgramArguments</key>\n <array>\n${programArgs}\n </array>\n <key>EnvironmentVariables</key>\n <dict>\n${envEntries}\n </dict>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <true/>\n <key>StandardOutPath</key>\n <string>${xmlEscape(path.join(logDir, 'runner-service.out.log'))}</string>\n <key>StandardErrorPath</key>\n <string>${xmlEscape(path.join(logDir, 'runner-service.err.log'))}</string>\n <key>ProcessType</key>\n <string>Background</string>\n</dict>\n</plist>\n`;\n}\n\nexport function renderSystemdUnit({\n invocation,\n env\n}: {\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n}): string {\n // systemd ExecStart requires an absolute program; arguments are space-joined.\n // None of our arguments contain spaces (resolved script path aside, which we\n // quote defensively).\n const quote = (value: string): string => (/\\s/.test(value) ? `\"${value}\"` : value);\n const execStart = [invocation.program, ...invocation.args].map(quote).join(' ');\n const envLines = Object.entries(env)\n .map(([key, value]) => `Environment=${key}=${value}`)\n .join('\\n');\n return `[Unit]\nDescription=Overlord persistent runner supervisor\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nExecStart=${execStart}\n${envLines}\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=default.target\n`;\n}\n\n// ---- Service manager abstraction -------------------------------------------\n\nexport interface RunnerServiceRunState {\n installed: boolean;\n running: 'running' | 'stopped' | 'unknown';\n}\n\nexport interface RunnerServiceManager {\n kind: RunnerServiceKind;\n identifier: string;\n unitPath(): string;\n render(opts: { invocation: RunnerServiceInvocation; env: Record<string, string> }): string;\n install(opts: {\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n autoStart: boolean;\n }): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n restart(): Promise<void>;\n uninstall(): Promise<void>;\n status(): Promise<RunnerServiceRunState>;\n}\n\nfunction launchAgentsDir(): string {\n return path.join(os.homedir(), 'Library', 'LaunchAgents');\n}\n\nfunction systemdUserDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME?.trim();\n const base = xdg ? path.resolve(xdg) : path.join(os.homedir(), '.config');\n return path.join(base, 'systemd', 'user');\n}\n\nasync function runCommand(program: string, args: string[]): Promise<{ stdout: string }> {\n const { stdout } = await execFileAsync(program, args);\n return { stdout: stdout.toString() };\n}\n\nclass LaunchdManager implements RunnerServiceManager {\n readonly kind = 'launchd' as const;\n readonly identifier = LAUNCHD_LABEL;\n\n unitPath(): string {\n return path.join(launchAgentsDir(), `${LAUNCHD_LABEL}.plist`);\n }\n\n render(opts: { invocation: RunnerServiceInvocation; env: Record<string, string> }): string {\n return renderLaunchdPlist({\n label: LAUNCHD_LABEL,\n invocation: opts.invocation,\n env: opts.env,\n logDir: path.join(resolveGlobalDataDir(), 'logs')\n });\n }\n\n async install(opts: {\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n autoStart: boolean;\n }): Promise<void> {\n mkdirSync(launchAgentsDir(), { recursive: true });\n mkdirSync(path.join(resolveGlobalDataDir(), 'logs'), { recursive: true });\n writeServiceFile(this.unitPath(), this.render(opts));\n if (opts.autoStart) await this.start();\n }\n\n async start(): Promise<void> {\n // `load -w` is idempotent and enables the agent; ignore an already-loaded error.\n try {\n await runCommand('launchctl', ['load', '-w', this.unitPath()]);\n } catch {\n await runCommand('launchctl', [\n 'kickstart',\n '-k',\n `gui/${process.getuid?.() ?? ''}/${LAUNCHD_LABEL}`\n ]);\n }\n }\n\n async stop(): Promise<void> {\n await runCommand('launchctl', ['unload', '-w', this.unitPath()]);\n }\n\n async restart(): Promise<void> {\n try {\n await this.stop();\n } catch {\n // May not be loaded yet; proceed to start.\n }\n await this.start();\n }\n\n async uninstall(): Promise<void> {\n try {\n await this.stop();\n } catch {\n // Not loaded; still remove the plist below.\n }\n if (existsSync(this.unitPath())) rmSync(this.unitPath());\n }\n\n async status(): Promise<RunnerServiceRunState> {\n const installed = existsSync(this.unitPath());\n try {\n const { stdout } = await runCommand('launchctl', ['list']);\n const line = stdout.split('\\n').find(row => row.includes(LAUNCHD_LABEL));\n if (!line) return { installed, running: installed ? 'stopped' : 'unknown' };\n // launchctl list columns: PID Status Label. A numeric PID => running.\n const pid = line.trim().split(/\\s+/)[0];\n return { installed, running: pid && pid !== '-' ? 'running' : 'stopped' };\n } catch {\n return { installed, running: 'unknown' };\n }\n }\n}\n\nclass SystemdUserManager implements RunnerServiceManager {\n readonly kind = 'systemd' as const;\n readonly identifier = `${SYSTEMD_UNIT_NAME}.service`;\n\n unitPath(): string {\n return path.join(systemdUserDir(), `${SYSTEMD_UNIT_NAME}.service`);\n }\n\n render(opts: { invocation: RunnerServiceInvocation; env: Record<string, string> }): string {\n return renderSystemdUnit(opts);\n }\n\n async install(opts: {\n invocation: RunnerServiceInvocation;\n env: Record<string, string>;\n autoStart: boolean;\n }): Promise<void> {\n mkdirSync(systemdUserDir(), { recursive: true });\n writeServiceFile(this.unitPath(), this.render(opts));\n await runCommand('systemctl', ['--user', 'daemon-reload']);\n await runCommand('systemctl', ['--user', 'enable', this.identifier]);\n if (opts.autoStart) await this.start();\n }\n\n async start(): Promise<void> {\n await runCommand('systemctl', ['--user', 'start', this.identifier]);\n }\n\n async stop(): Promise<void> {\n await runCommand('systemctl', ['--user', 'stop', this.identifier]);\n }\n\n async restart(): Promise<void> {\n await runCommand('systemctl', ['--user', 'restart', this.identifier]);\n }\n\n async uninstall(): Promise<void> {\n try {\n await this.stop();\n await runCommand('systemctl', ['--user', 'disable', this.identifier]);\n } catch {\n // Unit may not be active/enabled; still remove the file below.\n }\n if (existsSync(this.unitPath())) rmSync(this.unitPath());\n try {\n await runCommand('systemctl', ['--user', 'daemon-reload']);\n } catch {\n // Best effort.\n }\n }\n\n async status(): Promise<RunnerServiceRunState> {\n const installed = existsSync(this.unitPath());\n try {\n const { stdout } = await runCommand('systemctl', ['--user', 'is-active', this.identifier]);\n return { installed, running: stdout.trim() === 'active' ? 'running' : 'stopped' };\n } catch {\n // `is-active` exits non-zero when inactive/failed.\n return { installed, running: installed ? 'stopped' : 'unknown' };\n }\n }\n}\n\n/**\n * Resolve the host service manager for the current platform. Windows is not yet\n * supported (Task Scheduler is a documented follow-up), so it returns null.\n */\nexport function resolveServiceManager(\n platform: NodeJS.Platform = process.platform\n): RunnerServiceManager | null {\n if (platform === 'darwin') return new LaunchdManager();\n if (platform === 'linux') return new SystemdUserManager();\n return null;\n}\n", "import { createInterface } from 'node:readline';\n\nexport interface SelectableProject {\n id: string;\n name: string;\n slug: string;\n}\n\n/**\n * Parse a 1-based numbered selection against a list of `count` items. Returns the\n * 0-based index when the answer is a whole number inside `1..count`, otherwise\n * `null` (empty input, non-numeric text, or out-of-range numbers).\n */\nexport function parseNumberedSelection(answer: string, count: number): number | null {\n const trimmed = answer.trim();\n if (!/^\\d+$/.test(trimmed)) return null;\n const value = Number.parseInt(trimmed, 10);\n if (!Number.isInteger(value) || value < 1 || value > count) return null;\n return value - 1;\n}\n\n/**\n * Build the lines shown when prompting the user to pick a project. Kept pure so\n * the rendering is unit-testable without a TTY.\n */\nexport function renderProjectSelection(\n projects: SelectableProject[],\n directoryPath: string\n): string[] {\n const lines = [`Current directory:`, ` ${directoryPath}`, ``, `Projects:`];\n projects.forEach((project, index) => {\n lines.push(` ${index + 1}. ${project.name} (${project.slug})`);\n });\n return lines;\n}\n\nexport interface PromptForProjectOptions {\n projects: SelectableProject[];\n directoryPath: string;\n input?: NodeJS.ReadStream;\n output?: NodeJS.WriteStream;\n}\n\n/**\n * Interactively prompt the user to choose a project to link the directory with.\n * Lists the projects, reads a 1-based selection, and re-prompts on invalid input.\n * Resolves to the chosen project, or `null` if the user cancels with `q`.\n */\nexport function promptForProject({\n projects,\n directoryPath,\n input = process.stdin,\n output = process.stdout\n}: PromptForProjectOptions): Promise<SelectableProject | null> {\n if (projects.length === 0) {\n return Promise.reject(\n new Error('No projects available. Create one with `ovld create-project`.')\n );\n }\n\n const rl = createInterface({ input, output });\n const ask = (question: string): Promise<string> =>\n new Promise(resolve => rl.question(question, resolve));\n\n const run = async (): Promise<SelectableProject | null> => {\n while (true) {\n output.write(`\\n${renderProjectSelection(projects, directoryPath).join('\\n')}\\n`);\n const answer = await ask(\n `\\nSelect a project to link this directory with (1-${projects.length}, or 'q' to cancel): `\n );\n if (answer.trim().toLowerCase() === 'q') return null;\n const index = parseNumberedSelection(answer, projects.length);\n if (index !== null) return projects[index] ?? null;\n output.write(`Enter a number between 1 and ${projects.length}.\\n`);\n }\n };\n\n return run().finally(() => rl.close());\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { resolveGlobalDataDir } from './config.js';\n\n// Client-side cache of the protocol session key returned by `attach`. Every Bash\n// tool call is a fresh shell, so a key captured at attach is otherwise gone by the\n// next `ovld protocol` command unless the agent threads it through manually. The\n// cache is scoped strictly to (resolve(workingDirectory), missionId) \u2014 the same\n// keying `native-session.ts` uses for `externalSessionId` \u2014 so a key can never\n// leak across working directories or missions.\n\nfunction sessionKeyCachePath({\n missionId,\n workingDirectory\n}: {\n missionId: string;\n workingDirectory: string;\n}): string {\n const key = createHash('sha256')\n .update(`${path.resolve(workingDirectory)}\\0${missionId}`)\n .digest('hex');\n return path.join(resolveGlobalDataDir(), 'protocol-session-keys', key);\n}\n\n/** Cached session key for this (workingDir, mission), or undefined when absent. */\nexport function readCachedSessionKey({\n missionId,\n workingDirectory\n}: {\n missionId: string;\n workingDirectory: string;\n}): string | undefined {\n try {\n const filePath = sessionKeyCachePath({ missionId, workingDirectory });\n if (!existsSync(filePath)) return undefined;\n const raw = JSON.parse(readFileSync(filePath, 'utf8')) as { sessionKey?: unknown };\n return typeof raw.sessionKey === 'string' && raw.sessionKey.trim()\n ? raw.sessionKey.trim()\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Persist the session key returned by attach/resume-follow-up for later reuse. */\nexport function writeCachedSessionKey({\n missionId,\n workingDirectory,\n sessionKey\n}: {\n missionId: string;\n workingDirectory: string;\n sessionKey: string;\n}): void {\n try {\n const trimmed = sessionKey.trim();\n if (!trimmed) return;\n const filePath = sessionKeyCachePath({ missionId, workingDirectory });\n mkdirSync(path.dirname(filePath), { recursive: true });\n writeFileSync(\n filePath,\n JSON.stringify({ sessionKey: trimmed, updatedAt: new Date().toISOString() }),\n { mode: 0o600 }\n );\n } catch {\n // Best-effort: a failed write just means the agent must pass --session-key\n // explicitly, the same as before this cache existed.\n }\n}\n\n/** Drop the cached key once the session ends so a stale key can't be reused. */\nexport function clearCachedSessionKey({\n missionId,\n workingDirectory\n}: {\n missionId: string;\n workingDirectory: string;\n}): void {\n try {\n const filePath = sessionKeyCachePath({ missionId, workingDirectory });\n if (existsSync(filePath)) rmSync(filePath);\n } catch {\n // Best-effort: a stale key at worst fails a downstream call with an invalid\n // session error, which the agent already handles by re-attaching.\n }\n}\n", "import {\n readProjectJsonLink,\n writeProjectJson\n} from '@overlord/core/service/local-target/project-metadata';\nimport {\n executeLocalTargetMutation,\n parseMutationFromMetadata\n} from '@overlord/core/service/local-target-mutation-runner';\nimport { existsSync, readFileSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport {\n flagBoolean,\n flagValue,\n parseArgs,\n rejectOversizedInlineJson,\n requireFlag\n} from './args.js';\nimport { type BranchAutomationPayload, prepareMissionBranch } from './branch-preparation.js';\nimport { isLoopbackBackendUrl, loadConfig, resolveBackendUrl } from './config.js';\nimport { clientDeviceIdentity } from './device-identity.js';\nimport {\n discoverProjectOnClient,\n resolvePreferredExecutionTargetId\n} from './discover-project-local.js';\nimport { CliError } from './errors.js';\nimport { launchAgent } from './launch.js';\nimport { resolveNativeSessionId } from './native-session.js';\nimport { runOrgSetupCommand } from './org-setup.js';\nimport { printJson, printKeyValue } from './output.js';\nimport { pruneStaleProjectTmp } from './project-tmp.js';\nimport { printProtocolHelp } from './protocol-help.js';\nimport { recordTouchedFromPayload } from './record-touched.js';\nimport { reportRunnerResourceObservations } from './resource-observations.js';\nimport {\n applyPollJitter,\n buildRunnerServiceEnv,\n describeServicePublisher,\n nextRunnerLastError,\n patchRunnerServiceState,\n readRunnerServiceState,\n resolveOvldInvocation,\n resolveServiceManager,\n selectBasePollIntervalMs,\n writeRunnerServiceState\n} from './runner-service.js';\nimport type { CliRuntime } from './runtime.js';\nimport { promptForProject } from './select-prompt.js';\nimport {\n clearCachedSessionKey,\n readCachedSessionKey,\n writeCachedSessionKey\n} from './session-key.js';\nimport type { TerminalLaunchSettings } from './terminal-launcher.js';\nimport { fetchTerminalProfile, terminalProfileToLaunchSettings } from './terminal-profile.js';\nimport {\n computeRunDelta,\n draftChangeRationalesFromNotes,\n filterRunAttributableChanges,\n hasTouchedFilesLog,\n readChangedFiles,\n resetRationaleNotes,\n resetTouchedFiles,\n writeBaseline\n} from './vcs.js';\nimport { removeActiveSession, writeActiveSession } from './vcs-sessions.js';\n\ntype ChangedFileEntry = {\n filePath: string;\n vcsStatus?: string | null;\n attribution?: 'mine' | 'claimed' | 'unclaimed';\n claimedByMissionIds?: string[];\n};\ntype ChangeRationaleEntry = {\n file_path?: string;\n filePath?: string;\n label?: string;\n summary?: string;\n why?: string;\n impact?: string;\n [key: string]: unknown;\n};\ntype SkipRationaleEntry = {\n file_path?: string;\n filePath?: string;\n reason?: string;\n [key: string]: unknown;\n};\n\nfunction writeProjectJsonFromResource({\n directory,\n projectId,\n resource\n}: {\n directory: string;\n projectId: string;\n resource: unknown;\n}): void {\n const record = asRecord(resource);\n if (typeof record.id !== 'string') return;\n writeProjectJson({\n directoryPath: directory,\n projectId,\n resourceId: record.id,\n resourceKey: typeof record.resourceKey === 'string' ? record.resourceKey : undefined,\n executionTargetId:\n typeof record.executionTargetId === 'string' ? record.executionTargetId : undefined,\n isPrimary: record.isPrimary !== false\n });\n}\n\n/** Parse an inline `--changed-files-json` value into entries (best-effort). */\nfunction parseChangedFilesJson(value: unknown): ChangedFileEntry[] {\n if (typeof value !== 'string' || value.trim() === '') return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n if (!Array.isArray(parsed)) return [];\n return parsed.filter(\n (entry): entry is ChangedFileEntry =>\n typeof entry === 'object' &&\n entry !== null &&\n typeof (entry as ChangedFileEntry).filePath === 'string'\n );\n } catch {\n return [];\n }\n}\n\n/** Read `--changed-files-json` or `--changed-files-file` entries (best-effort). */\nfunction readChangedFilesFromFlags(\n flags: Record<string, string | true>,\n stdin?: string\n): ChangedFileEntry[] {\n const fileFlag = flags['--changed-files-file'];\n if (typeof fileFlag === 'string') {\n const raw =\n fileFlag === '-'\n ? (stdin ?? '')\n : (() => {\n try {\n return readFileSync(fileFlag, 'utf8');\n } catch {\n return '';\n }\n })();\n return parseChangedFilesJson(raw);\n }\n return parseChangedFilesJson(flags['--changed-files-json']);\n}\n\nfunction writeFilteredChangedFilesToFlags({\n flags,\n files\n}: {\n flags: Record<string, string | true>;\n files: ChangedFileEntry[];\n}): void {\n delete flags['--changed-files-file'];\n if (files.length === 0) {\n delete flags['--changed-files-json'];\n return;\n }\n flags['--changed-files-json'] = JSON.stringify(files);\n}\n\nfunction writeSkipRationaleForToFlags({\n flags,\n fileInputs,\n entries\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n entries: SkipRationaleEntry[];\n}): void {\n if (typeof flags['--skip-rationale-for-file'] === 'string') {\n fileInputs['--skip-rationale-for-file'] = JSON.stringify(entries, null, 2);\n delete flags['--skip-rationale-for-json'];\n return;\n }\n flags['--skip-rationale-for-json'] = JSON.stringify(entries);\n delete flags['--skip-rationale-for-file'];\n}\n\nfunction parseJsonArray(value: unknown): unknown[] {\n if (typeof value !== 'string' || value.trim() === '') return [];\n try {\n const parsed = JSON.parse(value) as unknown;\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n}\n\nfunction readJsonFlagContent({\n flags,\n fileInputs,\n jsonFlag,\n fileFlag\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n jsonFlag: string;\n fileFlag: string;\n}): string | undefined {\n const filePath = flags[fileFlag];\n if (typeof filePath === 'string') {\n if (fileInputs[fileFlag] !== undefined) return fileInputs[fileFlag];\n try {\n return readFileSync(filePath, 'utf8');\n } catch {\n return undefined;\n }\n }\n return typeof flags[jsonFlag] === 'string' ? flags[jsonFlag] : undefined;\n}\n\nfunction readChangeRationalesFromFlags({\n flags,\n fileInputs\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n}): ChangeRationaleEntry[] {\n const direct = parseJsonArray(\n readJsonFlagContent({\n flags,\n fileInputs,\n jsonFlag: '--change-rationales-json',\n fileFlag: '--change-rationales-file'\n })\n ).filter((entry): entry is ChangeRationaleEntry => typeof entry === 'object' && entry !== null);\n\n const payloadRaw = readJsonFlagContent({\n flags,\n fileInputs,\n jsonFlag: '--payload-json',\n fileFlag: '--payload-file'\n });\n let payloadRationales: ChangeRationaleEntry[] = [];\n if (payloadRaw) {\n try {\n const payload = JSON.parse(payloadRaw) as { changeRationales?: unknown };\n payloadRationales = Array.isArray(payload.changeRationales)\n ? payload.changeRationales.filter(\n (entry): entry is ChangeRationaleEntry => typeof entry === 'object' && entry !== null\n )\n : [];\n } catch {\n payloadRationales = [];\n }\n }\n\n return [...payloadRationales, ...direct];\n}\n\nfunction rationalePath(rationale: ChangeRationaleEntry): string {\n return (rationale.file_path ?? rationale.filePath ?? '').replace(/\\\\/g, '/').trim();\n}\n\nfunction readSkipRationaleForFromFlags({\n flags,\n fileInputs\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n}): SkipRationaleEntry[] {\n return parseJsonArray(\n readJsonFlagContent({\n flags,\n fileInputs,\n jsonFlag: '--skip-rationale-for-json',\n fileFlag: '--skip-rationale-for-file'\n })\n ).filter((entry): entry is SkipRationaleEntry => typeof entry === 'object' && entry !== null);\n}\n\nfunction skipRationalePath(entry: SkipRationaleEntry): string {\n return (entry.file_path ?? entry.filePath ?? '').replace(/\\\\/g, '/').trim();\n}\n\n/**\n * Filter protocol changed-file payloads so only run-attributable paths (not in\n * the session baseline) are sent. At deliver, merge explicit payloads with the\n * VCS delta so a partial explicit list does not suppress mechanically observed\n * files.\n */\nfunction applySessionChangedFiles({\n flags,\n workingDirectory,\n missionId,\n subcommand,\n stdin,\n fileInputs = {}\n}: {\n flags: Record<string, string | true>;\n workingDirectory: string;\n missionId: string;\n subcommand: string;\n stdin?: string;\n fileInputs?: Record<string, string>;\n}): void {\n const noFileChanges =\n subcommand === 'deliver' &&\n (flags['--no-file-changes'] === true || flags['--no-file-changes'] === 'true');\n const delta = computeRunDelta({ workingDirectory, missionId });\n\n // Full current dirty tree (not just the run-attributable delta), sent so the\n // server can reconcile changed_files rows that are no longer dirty to\n // 'resolved' \u2014 un-poisoning coverage from a past over-attribution. Sent even\n // for --no-file-changes so a leftover stale row still gets cleared.\n if (subcommand === 'deliver') {\n flags['--observed-dirty-paths-json'] = JSON.stringify(\n readChangedFiles(workingDirectory).map(entry => entry.filePath)\n );\n }\n\n if (noFileChanges) {\n if (delta.length > 0) {\n console.error(\n `[overlord] --no-file-changes was set, but VCS shows ${delta.length} changed file(s) for this run: ${delta\n .map(entry => entry.filePath)\n .join(', ')}`\n );\n }\n delete flags['--changed-files-json'];\n delete flags['--changed-files-file'];\n return;\n }\n\n const hasExplicitPayload = '--changed-files-json' in flags || '--changed-files-file' in flags;\n if (subcommand === 'update' && !hasExplicitPayload) return;\n\n const explicit = readChangedFilesFromFlags(flags, stdin);\n const merged =\n subcommand === 'deliver'\n ? [...explicit, ...delta].filter(\n (entry, index, all) => all.findIndex(item => item.filePath === entry.filePath) === index\n )\n : explicit;\n const classified = filterRunAttributableChanges({\n workingDirectory,\n missionId,\n files: merged.map(entry => ({\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus ?? 'changed'\n }))\n });\n\n const claimedElsewhere = classified.filter(entry => entry.attribution === 'claimed');\n const unclaimedFlagged = classified.filter(entry => entry.attribution === 'unclaimed');\n\n if (subcommand === 'deliver' && claimedElsewhere.length > 0) {\n console.error(\n `[overlord] excluded ${claimedElsewhere.length} changed file(s) claimed by concurrent mission logs: ` +\n `${claimedElsewhere\n .map(entry =>\n entry.claimedByMissionIds?.length\n ? `${entry.filePath} (${entry.claimedByMissionIds.join(', ')})`\n : entry.filePath\n )\n .join(', ')}`\n );\n }\n\n if (subcommand === 'deliver' && unclaimedFlagged.length > 0) {\n console.error(\n `[overlord] ${unclaimedFlagged.length} changed file(s) are not claimed by any edit-tracking log ` +\n `and are included for completeness \u2014 please confirm or --skip-rationale-for- them: ` +\n `${unclaimedFlagged.map(entry => entry.filePath).join(', ')}`\n );\n }\n\n // Attribution/claimedByMissionIds ride along to the backend (never persisted)\n // so a residual missing_rationale error can classify each path without the\n // server re-deriving touched-log state it has no access to.\n const attributable = classified\n .filter(entry => entry.attribution !== 'claimed')\n .map(entry => ({\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus,\n ...(entry.attribution ? { attribution: entry.attribution } : {}),\n ...(entry.claimedByMissionIds?.length\n ? { claimedByMissionIds: entry.claimedByMissionIds }\n : {})\n }));\n\n const skipEntries =\n subcommand === 'deliver' ? readSkipRationaleForFromFlags({ flags, fileInputs }) : [];\n const rationalePaths =\n subcommand === 'deliver'\n ? new Set(\n readChangeRationalesFromFlags({ flags, fileInputs }).map(rationalePath).filter(Boolean)\n )\n : new Set<string>();\n const skipByPath = new Map<string, SkipRationaleEntry>();\n if (subcommand === 'deliver') {\n for (const entry of skipEntries) {\n const filePath = skipRationalePath(entry);\n if (!filePath) continue;\n skipByPath.set(filePath, entry);\n }\n }\n if (subcommand === 'deliver') {\n for (const entry of claimedElsewhere) {\n const filePath = entry.filePath;\n if (rationalePaths.has(filePath)) continue;\n if (skipByPath.has(filePath)) continue;\n const missionLabel =\n entry.claimedByMissionIds && entry.claimedByMissionIds.length > 0\n ? entry.claimedByMissionIds.join(', ')\n : 'another active mission';\n skipByPath.set(filePath, {\n file_path: filePath,\n reason: `Changed by concurrent mission ${missionLabel}; excluded from this delivery report.`\n });\n }\n if (skipByPath.size > 0) {\n writeSkipRationaleForToFlags({\n flags,\n fileInputs,\n entries: Array.from(skipByPath.values())\n });\n }\n }\n\n const skipPaths =\n subcommand === 'deliver'\n ? new Set(Array.from(skipByPath.keys()).filter(Boolean))\n : new Set<string>();\n const filtered =\n skipPaths.size > 0\n ? attributable.filter(entry => !skipPaths.has(entry.filePath))\n : attributable;\n\n writeFilteredChangedFilesToFlags({ flags, files: filtered });\n}\n\nfunction applyDraftChangeRationales({\n flags,\n fileInputs,\n workingDirectory,\n missionId\n}: {\n flags: Record<string, string | true>;\n fileInputs: Record<string, string>;\n workingDirectory: string;\n missionId: string;\n}): void {\n const changedFiles = readChangedFilesFromFlags(flags, fileInputs['--changed-files-file']).map(\n entry => ({\n filePath: entry.filePath,\n vcsStatus: entry.vcsStatus ?? 'changed'\n })\n );\n if (changedFiles.length === 0) return;\n\n const explicitRationales = readChangeRationalesFromFlags({ flags, fileInputs });\n const covered = new Set(explicitRationales.map(rationalePath).filter(Boolean));\n const drafts = draftChangeRationalesFromNotes({\n workingDirectory,\n missionId,\n files: changedFiles\n }).filter(draft => !covered.has(draft.file_path));\n if (drafts.length === 0) return;\n\n const merged = [...explicitRationales, ...drafts];\n if (typeof flags['--change-rationales-file'] === 'string') {\n fileInputs['--change-rationales-file'] = JSON.stringify(merged, null, 2);\n } else {\n flags['--change-rationales-json'] = JSON.stringify(merged);\n }\n\n console.error(\n `[overlord] prefilled ${drafts.length} draft change rationale(s) from local edit notes.`\n );\n}\n\ntype JsonRecord = Record<string, unknown>;\n\ntype LaunchSettingsShape = {\n worktreeBranchAutomationEnabled?: unknown;\n};\n\nfunction repeatedFlagValues(args: string[], name: string): string[] {\n const values: string[] = [];\n for (let index = 0; index < args.length; index += 1) {\n if (args[index] !== name) continue;\n const value = args[index + 1];\n if (value !== undefined) {\n values.push(value);\n index += 1;\n }\n }\n return values;\n}\n\nasync function resolveTerminalLaunchSettings({\n runtime,\n flags\n}: {\n runtime: CliRuntime;\n flags: Map<string, string | true>;\n}): Promise<TerminalLaunchSettings> {\n if (flagBoolean(flags, '--no-terminal')) {\n return { terminalLauncher: null };\n }\n\n const override = flagValue(flags, '--terminal');\n if (override) {\n try {\n const profile = await fetchTerminalProfile({ backend: runtime.backend });\n return {\n terminalLauncher: override,\n terminalLaunchPlacement: profile.placement,\n terminalLaunchChord: profile.chord\n };\n } catch {\n return { terminalLauncher: override };\n }\n }\n\n try {\n const profile = await fetchTerminalProfile({ backend: runtime.backend });\n return terminalProfileToLaunchSettings(profile);\n } catch {\n return { terminalLauncher: null };\n }\n}\n\nfunction asRecord(value: unknown): JsonRecord {\n return value && typeof value === 'object' ? (value as JsonRecord) : {};\n}\n\nasync function readWorktreeBranchAutomationEnabled(runtime: CliRuntime): Promise<boolean> {\n try {\n const settings = await runtime.backend.get<LaunchSettingsShape>('/api/launch-settings');\n return settings.worktreeBranchAutomationEnabled === true;\n } catch {\n return false;\n }\n}\n\nasync function recordBranchPrepared({\n runtime,\n missionId,\n requestId,\n branchAutomation\n}: {\n runtime: CliRuntime;\n missionId: string;\n requestId?: string | null;\n branchAutomation: BranchAutomationPayload | null;\n}): Promise<void> {\n if (!branchAutomation) return;\n await runtime.backend.post({\n path: `/api/missions/${encodeURIComponent(missionId)}/branch-prepared`,\n body: { requestId: requestId ?? null, branchAutomation }\n });\n}\n\nfunction firstObjectiveId(mission: unknown): string | undefined {\n const objectives = asRecord(mission).objectives;\n if (!Array.isArray(objectives)) return undefined;\n const first = objectives[0];\n const id = asRecord(first).id;\n return typeof id === 'string' ? id : undefined;\n}\n\n/** Prefer the objective that would be launched next (matches server launchable states). */\nfunction launchableObjectiveId(mission: unknown): string | undefined {\n const objectives = asRecord(mission).objectives;\n if (!Array.isArray(objectives)) return undefined;\n const launchableStates = ['executing', 'submitted', 'launching', 'draft'];\n for (const state of launchableStates) {\n const match = objectives.find(objective => asRecord(objective).state === state);\n const id = asRecord(match).id;\n if (typeof id === 'string') return id;\n }\n return firstObjectiveId(mission);\n}\n\n/** The agent already assigned to an objective on a fetched mission payload, if any. */\nfunction objectiveAssignedAgent(mission: unknown, objectiveId: string): string | undefined {\n const objectives = asRecord(mission).objectives;\n if (!Array.isArray(objectives)) return undefined;\n const match = objectives.find(objective => asRecord(objective).id === objectiveId);\n const agent = asRecord(match).assignedAgent;\n return typeof agent === 'string' && agent.trim() ? agent.trim() : undefined;\n}\n\nfunction missionDisplayId(mission: unknown): string {\n const record = asRecord(mission);\n return typeof record.displayId === 'string'\n ? record.displayId\n : typeof record.id === 'string'\n ? record.id\n : 'unknown';\n}\n\nconst PROTOCOL_FILE_FLAGS = [\n '--summary-file',\n '--question-file',\n '--payload-file',\n '--artifacts-file',\n '--change-rationales-file',\n '--skip-rationale-for-file',\n '--objectives-file',\n '--changed-files-file',\n '--value-file',\n '--prompt-file'\n] as const;\n\n/** Protocol subcommands that require a session key the cache can auto-inject. */\nconst SESSION_KEY_SUBCOMMANDS = new Set([\n 'update',\n 'heartbeat',\n 'ask',\n 'deliver',\n 'record-change-rationales'\n]);\n\n/**\n * Resolve EACH `--*-file` flag independently into a `fileInputs` map so multiple\n * file payloads in one invocation no longer collide on a single `stdin` field.\n * At most one flag may use literal `-` (true stdin); real file paths are unlimited.\n * The single `-` payload is also returned as `stdin` so the backend keeps honoring\n * `body.stdin` for backward compatibility.\n */\nexport async function resolveProtocolFileInputs({\n flags,\n stdin\n}: {\n flags: Map<string, string | true>;\n stdin?: string;\n}): Promise<{ fileInputs: Record<string, string>; stdin?: string }> {\n const stdinFlags = PROTOCOL_FILE_FLAGS.filter(name => flagValue(flags, name) === '-');\n if (stdinFlags.length > 1) {\n throw new CliError({\n message:\n `Only one --*-file flag may read from stdin ('-') at a time, but received: ` +\n `${stdinFlags.join(', ')}. Pipe a single payload on stdin and pass the others ` +\n `as inline values or real file paths.`\n });\n }\n\n let stdinContent: string | undefined;\n const readStdinOnce = (): string => {\n if (stdinContent !== undefined) return stdinContent;\n if (stdin !== undefined) {\n stdinContent = stdin;\n } else if (process.stdin.isTTY) {\n stdinContent = '';\n } else {\n stdinContent = readFileSync(0, 'utf8');\n }\n return stdinContent;\n };\n\n const fileInputs: Record<string, string> = {};\n let stdinPayload: string | undefined;\n\n for (const flagName of PROTOCOL_FILE_FLAGS) {\n const filePath = flagValue(flags, flagName);\n if (!filePath) continue;\n if (filePath === '-') {\n const content = readStdinOnce();\n fileInputs[flagName] = content;\n stdinPayload = content;\n } else {\n fileInputs[flagName] = readFileSync(filePath, 'utf8');\n }\n }\n\n // No file flags but a piped/explicit stdin was supplied: preserve it as the\n // single backward-compatible payload (legacy behavior).\n if (stdinPayload === undefined && stdin !== undefined && Object.keys(fileInputs).length === 0) {\n stdinPayload = stdin;\n }\n\n return { fileInputs, stdin: stdinPayload };\n}\n\nasync function discoverProjectId(runtime: CliRuntime, explicit?: string): Promise<string> {\n if (explicit) return explicit;\n const projects = await runtime.backend.get<unknown[]>('/api/projects');\n const first = projects[0];\n const id = asRecord(first).id;\n if (typeof id !== 'string') {\n throw new CliError({ message: 'No project found. Create one with `ovld create-project`.' });\n }\n return id;\n}\n\nexport async function runProtocolCommand({\n runtime,\n subcommand,\n args,\n stdin,\n primaryCommand = 'ovld'\n}: {\n runtime: CliRuntime;\n subcommand: string;\n args: string[];\n stdin?: string;\n primaryCommand?: string;\n}): Promise<void> {\n const parsed = parseArgs(args);\n if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {\n printProtocolHelp({ primaryCommand });\n return;\n }\n\n rejectOversizedInlineJson({ flags: parsed.flags });\n\n const workingDirectory = process.cwd();\n const missionId = flagValue(parsed.flags, '--mission-id') ?? parsed.positional[0];\n const flags = Object.fromEntries(parsed.flags);\n if (\n subcommand === 'attach' &&\n typeof flags['--execution-request-id'] !== 'string' &&\n process.env.OVERLORD_EXECUTION_REQUEST_ID\n ) {\n flags['--execution-request-id'] = process.env.OVERLORD_EXECUTION_REQUEST_ID;\n }\n const { fileInputs, stdin: protocolStdin } = await resolveProtocolFileInputs({\n flags: parsed.flags,\n stdin\n });\n\n // Local-only: append this hook invocation's edited files to the resolved\n // mission's touched-files log. No backend call \u2014 an adapter's edit hook pipes\n // its native hook JSON on stdin and gets the same bookkeeping cli/src/vcs.ts\n // already does for the Claude hook, without needing MISSION_ID in env.\n if (subcommand === 'record-touched') {\n const missionOverride =\n flagValue(parsed.flags, '--mission-id') ??\n process.env.MISSION_ID ??\n process.env.OVERLORD_MISSION_ID;\n // The hook payload arrives as raw piped stdin, not a --*-file flag, so read\n // fd 0 directly rather than going through resolveProtocolFileInputs (which\n // only reads stdin when a --*-file flag is literally '-').\n const rawPayload = stdin ?? (process.stdin.isTTY ? '' : readFileSync(0, 'utf8'));\n const result = recordTouchedFromPayload({\n rawPayload,\n missionOverride,\n fallbackCwd: workingDirectory\n });\n printJson(result);\n return;\n }\n\n // Local-only preflight: classify every currently dirty path (mine/claimed/\n // unclaimed) exactly the way deliver will, plus draft rationales from local\n // edit notes. No backend call \u2014 this replaces hand-triaging `git status`\n // before delivering with one read-only, ready-to-use report.\n if (subcommand === 'changes') {\n if (!missionId) {\n throw new CliError({ message: 'Usage: ovld protocol changes --mission-id <id>' });\n }\n const classified = filterRunAttributableChanges({\n workingDirectory,\n missionId,\n files: readChangedFiles(workingDirectory)\n });\n const mine = classified.filter(\n entry => entry.attribution === 'mine' || entry.attribution === undefined\n );\n const claimed = classified.filter(entry => entry.attribution === 'claimed');\n const unclaimed = classified.filter(entry => entry.attribution === 'unclaimed');\n const draftRationales = draftChangeRationalesFromNotes({\n workingDirectory,\n missionId,\n files: [...mine, ...unclaimed]\n });\n const suggestedSkipRationaleFor = claimed.map(entry => ({\n file_path: entry.filePath,\n reason: `Changed by concurrent mission ${\n entry.claimedByMissionIds?.length\n ? entry.claimedByMissionIds.join(', ')\n : 'another active mission'\n }; excluded from this delivery report.`\n }));\n printJson({ mine, claimed, unclaimed, draftRationales, suggestedSkipRationaleFor });\n return;\n }\n\n // Session-key cache: when a command that needs a session key is missing the\n // flag, fall back to the key cached at attach for this (workingDir, mission).\n // An explicit --session-key always wins.\n if (\n SESSION_KEY_SUBCOMMANDS.has(subcommand) &&\n missionId &&\n (typeof flags['--session-key'] !== 'string' || flags['--session-key'].trim() === '')\n ) {\n const cached = readCachedSessionKey({ missionId, workingDirectory });\n if (cached) flags['--session-key'] = cached;\n }\n\n pruneStaleProjectTmp({ workingDirectory });\n\n // Client-side VCS capture: read git status here (the agent's machine), never on\n // the backend. Filter explicit payloads and, at deliver, merge the run delta.\n if ((subcommand === 'deliver' || subcommand === 'update') && missionId) {\n applySessionChangedFiles({\n flags,\n workingDirectory,\n missionId,\n subcommand,\n stdin: fileInputs['--changed-files-file'] ?? protocolStdin,\n fileInputs\n });\n }\n\n if (subcommand === 'deliver' && missionId) {\n applyDraftChangeRationales({\n flags,\n fileInputs,\n workingDirectory,\n missionId\n });\n }\n\n // Hosted backends cannot walk the agent machine's filesystem for discovery.\n if (subcommand === 'discover-project' && !isLoopbackBackendUrl(runtime.backend.baseUrl)) {\n const discovery = await discoverProjectOnClient({\n backend: runtime.backend,\n workingDirectory: flagValue(parsed.flags, '--directory') ?? workingDirectory,\n projectId: flagValue(parsed.flags, '--project-id')\n });\n printJson(discovery);\n return;\n }\n\n if (\n (subcommand === 'attach' ||\n subcommand === 'load-context' ||\n subcommand === 'resume-follow-up') &&\n typeof flags['--execution-target-id'] !== 'string'\n ) {\n const preferredTargetId = await resolvePreferredExecutionTargetId({ backend: runtime.backend });\n if (preferredTargetId) {\n flags['--execution-target-id'] = preferredTargetId;\n }\n }\n\n const result = await runtime.backend.post<unknown>({\n path: `/api/protocol/${encodeURIComponent(subcommand)}`,\n body: {\n args,\n positional: parsed.positional,\n flags,\n stdin: protocolStdin,\n fileInputs,\n externalSessionId:\n flagValue(parsed.flags, '--external-session-id') ??\n resolveNativeSessionId({\n explicit: undefined,\n agent: flagValue(parsed.flags, '--agent') ?? 'unknown',\n missionId: flagValue(parsed.flags, '--mission-id') ?? 'unknown',\n workingDirectory\n })\n }\n });\n\n // Record the dirty-file baseline once a work session begins, so deliver can\n // subtract pre-existing/concurrent changes from this run's reported delta.\n if ((subcommand === 'attach' || subcommand === 'resume-follow-up') && missionId) {\n writeBaseline({\n workingDirectory,\n missionId,\n files: readChangedFiles(workingDirectory)\n });\n resetTouchedFiles({ workingDirectory, missionId });\n resetRationaleNotes({ workingDirectory, missionId });\n }\n\n const resultRecord = asRecord(result);\n if (typeof resultRecord.sessionKey === 'string') {\n printKeyValue({ SESSION_KEY: resultRecord.sessionKey });\n // Persist the freshly minted key so subsequent commands in other shells for\n // this (workingDir, mission) can auto-resolve it without --session-key.\n if (missionId) {\n writeCachedSessionKey({ missionId, workingDirectory, sessionKey: resultRecord.sessionKey });\n // Also record this mission as \"active in this cwd\" so an edit hook that\n // never sees MISSION_ID in its own environment (e.g. agent-pod sessions)\n // can still resolve which mission's touched log to append to.\n if (subcommand === 'attach' || subcommand === 'resume-follow-up') {\n writeActiveSession({\n workingDirectory,\n missionId,\n sessionKey: resultRecord.sessionKey\n });\n }\n }\n }\n // The session ends at deliver: drop the cached key so it can't bind to a later\n // session for the same working dir + mission.\n if (subcommand === 'deliver' && missionId) {\n clearCachedSessionKey({ missionId, workingDirectory });\n removeActiveSession({ workingDirectory, missionId });\n\n // Self-diagnosis: a connector that installs an edit hook (today: Claude Code,\n // detected by the presence of ~/.claude) should always have a touched-files\n // log by deliver time if the run touched any files. A missing log with a\n // non-empty dirty tree means the hook silently failed to activate \u2014 the exact\n // failure mode Layer 1 fixes for the common case. Surface it loudly instead of\n // letting deliver quietly fall back to baseline-only attribution.\n const connectorInstallsEditHook = existsSync(path.join(os.homedir(), '.claude'));\n if (\n connectorInstallsEditHook &&\n !hasTouchedFilesLog({ workingDirectory, missionId }) &&\n readChangedFiles(workingDirectory).length > 0\n ) {\n const warning =\n `[overlord] warning: no touched-files log found at deliver for mission ${missionId} in ` +\n `${workingDirectory}, even though this connector installs a PostToolUse edit hook. Deliver is ` +\n `falling back to baseline-only attribution, which can misattribute concurrent sessions' edits. ` +\n `Check ~/.ovld/logs/post-tool-use-hook.log for why the hook did not record any touched files.`;\n console.error(warning);\n const sessionKeyForAlert =\n typeof flags['--session-key'] === 'string' ? flags['--session-key'] : undefined;\n if (sessionKeyForAlert) {\n try {\n await runtime.backend.post({\n path: '/api/protocol/update',\n body: {\n args: [],\n positional: [],\n flags: {\n '--mission-id': missionId,\n '--session-key': sessionKeyForAlert,\n '--event-type': 'alert',\n '--summary': warning\n },\n stdin: undefined,\n fileInputs: {}\n }\n });\n } catch {\n // Best-effort: the loud stderr warning above already surfaces the issue\n // even if the telemetry POST fails.\n }\n }\n }\n }\n if (typeof resultRecord.missionId === 'string') {\n printKeyValue({ MISSION_ID: resultRecord.missionId });\n }\n\n // Make attachment URLs absolute by prepending the backend base URL so agents\n // can use them directly with curl without guessing the backend address.\n if (subcommand === 'attachment-download-url') {\n const relUrl = resultRecord.url;\n if (typeof relUrl === 'string' && relUrl.startsWith('/')) {\n printJson({ ...resultRecord, url: `${runtime.backend.baseUrl}${relUrl}` });\n return;\n }\n }\n if (subcommand === 'attachment-list' && Array.isArray(result)) {\n const baseUrl = runtime.backend.baseUrl;\n const enhanced = result.map(entry => {\n const rec = asRecord(entry);\n const relUrl = rec.url;\n return typeof relUrl === 'string' && relUrl.startsWith('/')\n ? { ...rec, url: `${baseUrl}${relUrl}` }\n : rec;\n });\n printJson(enhanced);\n return;\n }\n\n printJson(result);\n}\n\nexport async function runManagementCommand({\n runtime,\n command,\n rest\n}: {\n runtime?: CliRuntime;\n command: string;\n rest: string[];\n}): Promise<void> {\n if (!runtime) throw new CliError({ message: `Command requires a backend: ${command}` });\n\n const parsed = parseArgs(rest);\n const json = flagBoolean(parsed.flags, '--json');\n\n switch (command) {\n case 'create-project': {\n const name = flagValue(parsed.flags, '--name') ?? parsed.positional.join(' ');\n if (!name) throw new CliError({ message: 'Missing --name' });\n const project = await runtime.backend.post<unknown>({\n path: '/api/projects',\n body: { name }\n });\n const projectId = asRecord(project).id;\n if (!flagBoolean(parsed.flags, '--no-directory') && typeof projectId === 'string') {\n const directory = flagValue(parsed.flags, '--directory') ?? process.cwd();\n const resource = await runtime.backend.post({\n path: `/api/projects/${encodeURIComponent(projectId)}/resources`,\n body: {\n directoryPath: directory,\n isPrimary: true\n }\n });\n writeProjectJsonFromResource({ directory, projectId, resource });\n }\n if (json) printJson({ project });\n else\n console.log(\n `Created project ${asRecord(project).name ?? name} (${projectId ?? 'unknown'})`\n );\n return;\n }\n case 'org-setup': {\n await runOrgSetupCommand({ runtime, parsed });\n return;\n }\n case 'add-cwd': {\n const directory = flagValue(parsed.flags, '--directory') ?? process.cwd();\n const existingProjectJson = readProjectJsonLink(\n path.join(directory, '.overlord', 'project.json')\n );\n const resourceKey = flagValue(parsed.flags, '--key') ?? existingProjectJson?.resourceKey;\n let projectId = flagValue(parsed.flags, '--project-id');\n if (!projectId) {\n const projects =\n await runtime.backend.get<Array<{ id: string; name: string; slug: string }>>(\n '/api/projects'\n );\n if (projects.length === 0) {\n throw new CliError({\n message: 'No project found. Create one with `ovld create-project`.'\n });\n }\n if (process.stdin.isTTY) {\n const chosen = await promptForProject({ projects, directoryPath: directory });\n if (!chosen) {\n console.log('Cancelled. No changes made.');\n return;\n }\n projectId = chosen.id;\n } else {\n projectId = projects[0]?.id;\n }\n }\n if (!projectId) throw new CliError({ message: 'No project selected.' });\n const resource = await runtime.backend.post({\n path: `/api/projects/${encodeURIComponent(projectId)}/resources`,\n body: {\n directoryPath: directory,\n ...(resourceKey ? { resourceKey } : {}),\n isPrimary: flagValue(parsed.flags, '--primary') !== 'false'\n }\n });\n writeProjectJsonFromResource({ directory, projectId, resource });\n if (json) printJson({ resource });\n else console.log(`Linked ${directory} to project ${projectId}`);\n return;\n }\n case 'add-url': {\n const sourceUrl = flagValue(parsed.flags, '--url');\n if (!sourceUrl) throw new CliError({ message: 'Missing --url <git-url>' });\n const projectId = flagValue(parsed.flags, '--project-id');\n if (!projectId) throw new CliError({ message: 'Missing --project-id for URL resources.' });\n const resource = await runtime.backend.post({\n path: `/api/projects/${encodeURIComponent(projectId)}/resources`,\n body: {\n sourceUrl,\n resourceKey: flagValue(parsed.flags, '--key'),\n isPrimary: flagValue(parsed.flags, '--primary') !== 'false'\n }\n });\n if (json) printJson({ resource });\n else console.log(`Linked ${sourceUrl} to project ${projectId}`);\n return;\n }\n case 'create':\n case 'prompt': {\n const objectivesJson = flagValue(parsed.flags, '--objectives-json');\n const objective =\n parsed.positional.join(' ') ||\n flagValue(parsed.flags, '--objective') ||\n flagValue(parsed.flags, '--prompt');\n const projectId = await discoverProjectId(runtime, flagValue(parsed.flags, '--project-id'));\n const objectives = objectivesJson\n ? (JSON.parse(objectivesJson) as Array<{\n objective: string;\n title?: string | null;\n autoAdvance?: boolean;\n resourceKey?: string | null;\n }>)\n : objective\n ? [\n {\n objective,\n title: flagValue(parsed.flags, '--title') ?? null,\n ...(flagValue(parsed.flags, '--resource')\n ? { resourceKey: flagValue(parsed.flags, '--resource') }\n : {})\n }\n ]\n : [];\n const first = objectives[0];\n if (!first) {\n throw new CliError({\n message: objectivesJson\n ? 'objectives-json must contain at least one objective'\n : 'Missing objective prompt text'\n });\n }\n\n const title = flagValue(parsed.flags, '--title') ?? first.title ?? first.objective;\n const mission = await runtime.backend.post<unknown>({\n path: '/api/missions',\n body: {\n projectId,\n title,\n objectives\n }\n });\n if (objectivesJson) {\n const missionObjectives = asRecord(mission).objectives;\n if (Array.isArray(missionObjectives) && missionObjectives.length !== objectives.length) {\n throw new CliError({\n message: `Backend created ${missionObjectives.length} objective(s), expected ${objectives.length}`\n });\n }\n }\n if (command === 'prompt') {\n const objectiveId = firstObjectiveId(mission);\n if (objectiveId) {\n await runtime.backend.post({\n path: `/api/objectives/${encodeURIComponent(objectiveId)}/launch`,\n body: { agent: flagValue(parsed.flags, '--agent') ?? 'unknown' }\n });\n }\n }\n if (json) printJson(mission);\n else console.log(`Created mission ${missionDisplayId(mission)}`);\n return;\n }\n case 'attach':\n case 'execution': {\n const missionId =\n command === 'attach'\n ? (parsed.positional[0] ?? flagValue(parsed.flags, '--mission-id'))\n : requireFlag(parsed.flags, '--mission-id');\n const explicitAgent = parsed.positional[1] ?? flagValue(parsed.flags, '--agent');\n if (!missionId) throw new CliError({ message: 'Usage: ovld attach <missionId> [agent]' });\n const mission = await runtime.backend.get<unknown>(\n `/api/missions/${encodeURIComponent(missionId)}`\n );\n const objectiveId = flagValue(parsed.flags, '--objective-id') ?? firstObjectiveId(mission);\n if (!objectiveId)\n throw new CliError({ message: `No launchable objective found for ${missionId}` });\n // Honor an explicit agent; otherwise reuse the agent already stored on the\n // objective (the db is the source of truth) so launching never overrides the\n // chosen agent, and fall back to the configured default rather than codex.\n const agent =\n explicitAgent ?? objectiveAssignedAgent(mission, objectiveId) ?? loadConfig().defaultAgent;\n const request = await runtime.backend.post({\n path: `/api/objectives/${encodeURIComponent(objectiveId)}/launch`,\n body: {\n agent,\n model: flagValue(parsed.flags, '--model'),\n reasoningEffort: flagValue(parsed.flags, '--thinking')\n }\n });\n if (json) printJson({ request });\n else console.log(`Queued ${agent} for ${missionDisplayId(mission)}`);\n return;\n }\n case 'launch':\n case 'restart':\n case 'run':\n case 'connect':\n case 'resume': {\n const agent =\n command === 'run' || command === 'connect' || command === 'resume'\n ? (flagValue(parsed.flags, '--agent') ??\n parsed.positional[0] ??\n loadConfig().defaultAgent)\n : parsed.positional[0];\n const missionId =\n flagValue(parsed.flags, '--mission-id') ??\n (command === 'run' || command === 'connect' || command === 'resume'\n ? parsed.positional[1]\n : parsed.positional[1]);\n if (!agent || !missionId) {\n throw new CliError({ message: `Usage: ovld ${command} <agent> --mission-id <missionId>` });\n }\n const workingDirectory = flagValue(parsed.flags, '--working-directory') ?? process.cwd();\n const terminal = await resolveTerminalLaunchSettings({ runtime, flags: parsed.flags });\n const dryRun = flagBoolean(parsed.flags, '--dry-run');\n const mission = await runtime.backend.get<unknown>(\n `/api/missions/${encodeURIComponent(missionId)}`\n );\n const objectiveId =\n flagValue(parsed.flags, '--objective-id') ?? launchableObjectiveId(mission);\n const executionTargetId = await resolvePreferredExecutionTargetId({\n backend: runtime.backend\n });\n const prepared = await prepareMissionBranch({\n runtime,\n options: {\n missionId,\n workingDirectory,\n objectiveId: objectiveId ?? undefined,\n workspaceAutomationEnabled: await readWorktreeBranchAutomationEnabled(runtime),\n dryRun,\n overrideBranch: flagValue(parsed.flags, '--branch'),\n noWorktree: flagBoolean(parsed.flags, '--no-worktree')\n }\n });\n await recordBranchPrepared({\n runtime,\n missionId,\n branchAutomation: prepared.branchAutomation\n });\n const result = await launchAgent({\n runtime,\n options: {\n agent,\n missionId,\n workingDirectory: prepared.workingDirectory,\n model: flagValue(parsed.flags, '--model'),\n thinking: flagValue(parsed.flags, '--thinking'),\n flags: repeatedFlagValues(rest, '--flag'),\n preCommand: flagValue(parsed.flags, '--pre-command'),\n executionTargetId: executionTargetId ?? undefined,\n ...terminal,\n dryRun\n }\n });\n if (json || dryRun) {\n printJson({ plan: result.plan, status: result.status, signal: result.signal });\n }\n if (result.status && result.status !== 0) {\n throw new CliError({ message: `Launch command exited with status ${result.status}` });\n }\n return;\n }\n case 'runner': {\n await runRunnerCommand({ runtime, parsed, json });\n return;\n }\n case 'missions': {\n const sub = parsed.positional[0];\n if (sub !== 'list') {\n throw new CliError({\n message: 'Usage: ovld missions list [--status <csv>] [--project-id <id>] [--json]'\n });\n }\n const params = new URLSearchParams();\n const query = flagValue(parsed.flags, '--query');\n const projectId = flagValue(parsed.flags, '--project-id');\n const limit = flagValue(parsed.flags, '--limit');\n if (query) params.set('q', query);\n if (projectId) params.set('projectId', projectId);\n if (limit) params.set('limit', limit);\n const result = await runtime.backend.get<{ missions: unknown[] }>(\n `/api/missions/search?${params}`\n );\n const missions = result.missions;\n if (json) printJson({ missions });\n else {\n for (const mission of missions) {\n const record = asRecord(mission);\n console.log(\n `${record.displayId ?? record.id}\\t${record.statusType ?? ''}\\t${record.title ?? ''}`\n );\n }\n }\n return;\n }\n case 'mission': {\n const sub = parsed.positional[0];\n const missionId = parsed.positional[1];\n if (!missionId) {\n throw new CliError({\n message:\n 'Usage: ovld mission context|events|deliveries|artifacts|rationales <missionId> [--json]'\n });\n }\n const pathBySub: Record<string, string> = {\n context: `/api/missions/${encodeURIComponent(missionId)}`,\n events: `/api/missions/${encodeURIComponent(missionId)}/events`,\n artifacts: `/api/missions/${encodeURIComponent(missionId)}/artifacts`,\n rationales: `/api/missions/${encodeURIComponent(missionId)}/file-changes`,\n deliveries: `/api/missions/${encodeURIComponent(missionId)}/events`\n };\n const path = sub ? pathBySub[sub] : undefined;\n if (!path) {\n throw new CliError({\n message:\n 'Usage: ovld mission context|events|deliveries|artifacts|rationales <missionId> [--json]'\n });\n }\n const result = await runtime.backend.get<unknown>(path);\n if (json || sub === 'context') printJson(result);\n else if (Array.isArray(result)) for (const row of result) console.log(JSON.stringify(row));\n else printJson(result);\n return;\n }\n case 'changes': {\n const sub = parsed.positional[0];\n const missionId = requireFlag(parsed.flags, '--mission-id');\n if (sub !== 'status' && sub !== 'rationales') {\n throw new CliError({ message: 'Usage: ovld changes status|rationales --mission-id <id>' });\n }\n const result = await runtime.backend.get<unknown[]>(\n `/api/missions/${encodeURIComponent(missionId)}/file-changes`\n );\n if (json) printJson({ files: result, rationales: result });\n else for (const row of result) console.log(JSON.stringify(row));\n return;\n }\n default:\n throw new CliError({ message: `Unknown command: ${command}` });\n }\n}\n\nasync function runRunnerCommand({\n runtime,\n parsed,\n json\n}: {\n runtime: CliRuntime;\n parsed: ReturnType<typeof parseArgs>;\n json: boolean;\n}): Promise<void> {\n const sub = parsed.positional[0] ?? 'status';\n if (sub === 'status') {\n const result = await runtime.backend.get<unknown>('/api/runner/status');\n if (json) printJson(result);\n else printJson(result);\n return;\n }\n if (sub === 'clear' || sub === 'clear-all') {\n const result = await runtime.backend.post({\n path: '/api/runner/clear',\n body: {\n objectiveId: sub === 'clear' ? parsed.positional[1] : undefined,\n projectId: flagValue(parsed.flags, '--project-id')\n }\n });\n if (json) printJson(result);\n else console.log(`Cleared ${asRecord(result).cleared ?? 0} execution request(s).`);\n return;\n }\n if (sub === 'service') {\n await runRunnerServiceCommand({ parsed, json });\n return;\n }\n if (sub !== 'once' && sub !== 'start' && sub !== 'supervise') {\n throw new CliError({\n message:\n 'Usage: ovld runner once|start|supervise|status|clear <objective_id>|clear-all|service <install|start|stop|restart|status|uninstall>'\n });\n }\n\n const runOnce = async (): Promise<boolean> => {\n const claim = await runtime.backend.post<unknown>({\n path: '/api/runner/claim',\n body: {\n projectId: flagValue(parsed.flags, '--project-id'),\n ...clientDeviceIdentity()\n }\n });\n const request = asRecord(claim).request;\n if (!request) return false;\n const requestRecord = asRecord(request);\n const requestId = String(requestRecord.id);\n const projectId = String(requestRecord.projectId ?? '');\n const executionTargetId =\n typeof requestRecord.executionTargetId === 'string'\n ? requestRecord.executionTargetId.trim()\n : '';\n if (projectId && executionTargetId) {\n try {\n await reportRunnerResourceObservations({\n backend: runtime.backend,\n projectId,\n executionTargetId\n });\n } catch {\n // Observation writeback is best-effort; launch should still proceed.\n }\n }\n await runtime.backend.post({ path: `/api/runner/requests/${requestId}/launching` });\n try {\n const mutation = parseMutationFromMetadata(requestRecord.metadata);\n if (mutation) {\n const mutationResult = await executeLocalTargetMutation({ mutation });\n if (!mutationResult.ok) {\n await runtime.backend.post({\n path: `/api/runner/requests/${requestId}/failed`,\n body: { error: mutationResult.message }\n });\n throw new CliError({ message: mutationResult.message });\n }\n await runtime.backend.post({\n path: `/api/runner/requests/${requestId}/completed`,\n body: { mutationResult }\n });\n if (json) printJson({ request, mutationResult });\n else console.log(`Completed ${mutation.kind} for ${requestRecord.missionId}`);\n return true;\n }\n\n // The execution request's agent is decided upstream from the objective row,\n // so a missing value is an invariant violation \u2014 never silently substitute a\n // default agent, which would launch work as the wrong tool. Fail the request\n // up front (the catch below reports it) so the cause surfaces instead of being\n // masked, and so no branch/terminal work is done for a request that can't run.\n const requestedAgent =\n typeof requestRecord.requestedAgent === 'string' ? requestRecord.requestedAgent.trim() : '';\n if (!requestedAgent) {\n throw new CliError({\n message: `Execution request ${requestId} has no agent; the objective must specify one before it can be launched.`\n });\n }\n const launchConfig = asRecord(requestRecord.launchConfig);\n const terminal = await resolveTerminalLaunchSettings({ runtime, flags: parsed.flags });\n const missionId = String(requestRecord.missionId);\n const dryRun = flagBoolean(parsed.flags, '--dry-run');\n const prepared = await prepareMissionBranch({\n runtime,\n options: {\n missionId,\n workingDirectory: String(requestRecord.workingDirectory ?? process.cwd()),\n objectiveId: String(requestRecord.objectiveId ?? ''),\n workspaceAutomationEnabled: await readWorktreeBranchAutomationEnabled(runtime),\n dryRun,\n overrideBranch: flagValue(parsed.flags, '--branch'),\n noWorktree: flagBoolean(parsed.flags, '--no-worktree')\n }\n });\n await recordBranchPrepared({\n runtime,\n missionId,\n requestId,\n branchAutomation: prepared.branchAutomation\n });\n const result = await launchAgent({\n runtime,\n options: {\n agent: requestedAgent,\n missionId,\n workingDirectory: prepared.workingDirectory,\n model:\n typeof requestRecord.requestedModel === 'string'\n ? requestRecord.requestedModel\n : undefined,\n thinking:\n typeof requestRecord.requestedReasoningEffort === 'string'\n ? requestRecord.requestedReasoningEffort\n : undefined,\n flags: Array.isArray(launchConfig.flags)\n ? launchConfig.flags.filter((value): value is string => typeof value === 'string')\n : [],\n preCommand:\n typeof launchConfig.preCommand === 'string' ? launchConfig.preCommand : undefined,\n executionRequestId: requestId,\n executionTargetId: executionTargetId || undefined,\n ...terminal,\n dryRun\n }\n });\n if (result.status && result.status !== 0) {\n throw new CliError({ message: `Launch command exited with status ${result.status}` });\n }\n await runtime.backend.post({ path: `/api/runner/requests/${requestId}/launched` });\n if (json || dryRun) {\n printJson({ request, plan: result.plan, status: result.status });\n } else {\n console.log(`Launched ${requestedAgent} for ${requestRecord.missionId}`);\n }\n return true;\n } catch (error) {\n await runtime.backend.post({\n path: `/api/runner/requests/${requestId}/failed`,\n body: { error: error instanceof Error ? error.message : String(error) }\n });\n throw error;\n }\n };\n\n if (sub === 'once') {\n const launched = await runOnce();\n if (!launched) {\n if (json) printJson({ launched: false });\n else console.log('No claimable execution requests.');\n }\n return;\n }\n\n if (sub === 'supervise') {\n await runRunnerSupervisor({ runOnce, json });\n return;\n }\n\n const intervalMs = Number.parseInt(flagValue(parsed.flags, '--poll-interval-ms') ?? '3000', 10);\n if (!json) console.log(`Runner started. Polling every ${intervalMs}ms for execution requests.`);\n while (true) {\n await runOnce();\n await new Promise(resolve => setTimeout(resolve, intervalMs));\n }\n}\n\n/**\n * The persistent-runner supervisor loop behind `ovld runner supervise`. It owns\n * only the long-lived loop and adaptive polling; each poll delegates to the same\n * one-shot claim-and-launch closure used by `ovld runner once`, so claim,\n * worktree, terminal, and launch behavior are never duplicated. Backoff uses the\n * \"last launched job\" clock (see planning/feature-plans/persistent-runner-cli.md).\n */\nasync function runRunnerSupervisor({\n runOnce,\n json\n}: {\n runOnce: () => Promise<boolean>;\n json: boolean;\n}): Promise<void> {\n if (!json) console.log('Runner supervisor started. Adaptive polling for execution requests.');\n for (;;) {\n const now = new Date();\n let launched = false;\n let lastError: string | null = null;\n try {\n launched = await runOnce();\n } catch (error) {\n lastError = error instanceof Error ? error.message : String(error);\n }\n const state = readRunnerServiceState();\n const base = selectBasePollIntervalMs({\n lastLaunchedAt: launched ? now.toISOString() : state.lastLaunchedAt,\n now: now.getTime()\n });\n patchRunnerServiceState({\n lastHeartbeatAt: now.toISOString(),\n lastClaimedAt: launched ? now.toISOString() : state.lastClaimedAt,\n lastLaunchedAt: launched ? now.toISOString() : state.lastLaunchedAt,\n // Reflect the latest poll's outcome so a resolved failure (e.g. an auth\n // error from before the user logged in) clears instead of sticking.\n lastError: nextRunnerLastError(lastError),\n currentPollIntervalMs: base\n });\n await new Promise(resolve => setTimeout(resolve, applyPollJitter(base)));\n }\n}\n\n/**\n * `ovld runner service <install|start|stop|restart|status|uninstall>` \u2014 manage\n * the OS-level persistent runner service. The desktop Settings panel and the\n * sidebar runner control invoke exactly these operations, so this is the single\n * owner of local service lifecycle.\n */\nasync function runRunnerServiceCommand({\n parsed,\n json\n}: {\n parsed: ReturnType<typeof parseArgs>;\n json: boolean;\n}): Promise<void> {\n const action = parsed.positional[1] ?? 'status';\n const manager = resolveServiceManager();\n if (!manager) {\n throw new CliError({\n message: `Persistent runner service is not supported on ${process.platform} yet. Use \\`ovld runner start\\` for a foreground runner.`\n });\n }\n\n if (action === 'status') {\n const runState = await manager.status();\n const state = readRunnerServiceState();\n const { publisher, needsReinstallForOverlord } = describeServicePublisher({\n execProgram: state.execProgram\n });\n const reinstallHint =\n runState.installed && needsReinstallForOverlord\n ? 'This service is registered under \"Node.js Foundation\" because it runs the plain node binary. Reinstall it from the Overlord desktop app (or with the desktop app present) to re-register it under \"Overlord\".'\n : null;\n const payload = {\n supported: true,\n kind: manager.kind,\n identifier: manager.identifier,\n unitPath: manager.unitPath(),\n installed: runState.installed,\n running: runState.running,\n backendUrl: state.backendUrl,\n installedAt: state.installedAt,\n lastHeartbeatAt: state.lastHeartbeatAt,\n lastClaimedAt: state.lastClaimedAt,\n lastLaunchedAt: state.lastLaunchedAt,\n lastError: state.lastError,\n currentPollIntervalMs: state.currentPollIntervalMs,\n publisher,\n reinstallHint\n };\n if (json) printJson(payload);\n else {\n printKeyValue({\n Service: `${manager.kind} (${manager.identifier})`,\n Installed: runState.installed ? 'yes' : 'no',\n Running: runState.running,\n Publisher: publisher === 'unknown' ? '(unknown)' : publisher,\n Backend: state.backendUrl ?? '(unknown)',\n 'Last heartbeat': state.lastHeartbeatAt ?? '(never)',\n 'Last launched': state.lastLaunchedAt ?? '(never)',\n 'Poll interval': state.currentPollIntervalMs\n ? `${state.currentPollIntervalMs}ms`\n : '(idle)',\n 'Last error': state.lastError ?? '(none)'\n });\n if (reinstallHint) console.log(`\\nNote: ${reinstallHint}`);\n }\n return;\n }\n\n if (action === 'install') {\n const config = loadConfig();\n const backendUrl = resolveBackendUrl(config);\n const invocation = resolveOvldInvocation();\n const env = buildRunnerServiceEnv({\n backendUrl,\n runAsElectronNode: invocation.runAsElectronNode\n });\n const autoStart = !flagBoolean(parsed.flags, '--no-start');\n await manager.install({ invocation, env, autoStart });\n writeRunnerServiceState({\n ...readRunnerServiceState(),\n serviceKind: manager.kind,\n serviceIdentifier: manager.identifier,\n execProgram: invocation.program,\n execArgs: invocation.args,\n backendUrl,\n installedAt: new Date().toISOString(),\n lastError: null\n });\n const runState = await manager.status();\n if (json) printJson({ started: autoStart, ...runState });\n else\n console.log(\n `Persistent runner installed (${manager.kind}) and ${autoStart ? 'started' : 'not started'}.`\n );\n return;\n }\n\n if (action === 'start' || action === 'stop' || action === 'restart') {\n await manager[action]();\n const runState = await manager.status();\n if (json) printJson({ action, ...runState });\n else console.log(`Persistent runner ${action} complete (running: ${runState.running}).`);\n return;\n }\n\n if (action === 'uninstall') {\n await manager.uninstall();\n writeRunnerServiceState({\n ...readRunnerServiceState(),\n serviceKind: null,\n serviceIdentifier: null,\n installedAt: null\n });\n if (json) printJson({ uninstalled: true });\n else console.log('Persistent runner uninstalled.');\n return;\n }\n\n throw new CliError({\n message:\n 'Usage: ovld runner service <install|start|stop|restart|status|uninstall> [--no-start] [--json]'\n });\n}\n", "import { CliError, formatCliError } from './errors.js';\nimport { printHelp } from './help.js';\nimport { runVersionCommand } from './version.js';\n\nconst MIN_NODE_MAJOR = 20;\n\nconst DB_FREE_COMMANDS = new Set([\n 'help',\n '--help',\n '-h',\n 'version',\n '--version',\n '-v',\n 'update',\n 'init',\n 'doctor',\n 'setup',\n 'agent-setup',\n 'serve',\n 'config',\n 'auth',\n 'user-token',\n 'prune'\n]);\n\nconst KNOWN_COMMANDS = new Set([\n ...DB_FREE_COMMANDS,\n 'protocol',\n 'create-project',\n 'org-setup',\n 'add-cwd',\n 'add-url',\n 'create',\n 'prompt',\n 'attach',\n 'launch',\n 'restart',\n 'connect',\n 'run',\n 'resume',\n 'runner',\n 'missions',\n 'mission',\n 'changes',\n 'execution',\n 'config'\n]);\n\nfunction assertSupportedNodeVersion(): void {\n const major = Number.parseInt(process.versions.node.split('.')[0] ?? '', 10);\n\n if (Number.isNaN(major) || major < MIN_NODE_MAJOR) {\n throw new CliError({\n message: `Overlord CLI requires Node.js ${MIN_NODE_MAJOR} or newer. Found ${process.version}.`\n });\n }\n}\n\nfunction wantsJsonOutput(args: string[]): boolean {\n return args.includes('--json');\n}\n\nasync function dispatchCommand({\n primaryCommand,\n command,\n args,\n stdin\n}: {\n primaryCommand: string;\n command: string | undefined;\n args: string[];\n stdin?: string;\n}): Promise<void> {\n switch (command) {\n case undefined:\n case 'help':\n case '--help':\n case '-h':\n printHelp({ primaryCommand });\n return;\n case 'version':\n case '--version':\n case '-v':\n runVersionCommand({ json: wantsJsonOutput(args) });\n return;\n case 'update': {\n const { runUpdateCommand } = await import('./update.js');\n await runUpdateCommand({ rest: args });\n return;\n }\n case 'init':\n case 'doctor':\n case 'setup':\n case 'agent-setup':\n case 'config':\n case 'auth':\n case 'user-token':\n case 'prune': {\n const { runLocalCommand } = await import('./management.js');\n await runLocalCommand({ command, rest: args });\n return;\n }\n case 'serve': {\n const { runServeCommand } = await import('./serve.js');\n await runServeCommand({ rest: args });\n return;\n }\n case 'protocol': {\n const [subcommand, ...rest] = args;\n if (!subcommand) {\n throw new CliError({ message: 'Usage: ovld protocol <subcommand> [flags]' });\n }\n const { openCliRuntime } = await import('./runtime.js');\n const { runProtocolCommand } = await import('./commands.js');\n const runtime = openCliRuntime();\n try {\n await runProtocolCommand({ runtime, subcommand, args: rest, stdin, primaryCommand });\n } finally {\n runtime.close();\n }\n return;\n }\n default: {\n if (!KNOWN_COMMANDS.has(command)) {\n throw new CliError({\n message: `Unknown command: ${command}\\nRun \\`${primaryCommand} help\\` for usage.`\n });\n }\n const { openCliRuntime } = await import('./runtime.js');\n const { runManagementCommand } = await import('./commands.js');\n const runtime = openCliRuntime();\n try {\n await runManagementCommand({ runtime, command, rest: args });\n } finally {\n runtime.close();\n }\n }\n }\n}\n\nexport async function runCli({\n primaryCommand,\n argv = process.argv.slice(2),\n stdin\n}: {\n primaryCommand: string;\n argv?: string[];\n stdin?: string;\n}): Promise<void> {\n assertSupportedNodeVersion();\n\n const [command, ...rest] = argv;\n\n try {\n await dispatchCommand({ primaryCommand, command, args: rest, stdin });\n } catch (error) {\n if (error instanceof CliError) {\n throw error;\n }\n throw new CliError({ message: formatCliError(error) });\n }\n}\n\nexport { redactSecrets } from './redact-secrets.js';\nexport { getCliVersion } from './version.js';\n", "export function printHelp({ primaryCommand }: { primaryCommand: string }): void {\n console.log(`Overlord CLI\n \nINSTRUCTIONS FOR AI AGENTS: run \\`${primaryCommand} protocol help\\` for the full mission lifecycle reference.\n\nPrimary command: ${primaryCommand}\n\nGeneral:\n ${primaryCommand} auth login [--token <out_...>] Configure backend and log in\n ${primaryCommand} auth status [--json] Show backend URL and login status\n ${primaryCommand} user-token create --label <l> [--expires-in 90d] [--no-expiry] [--scope full|mission-lifecycle]\n Mint a USER_TOKEN (prints the secret once)\n ${primaryCommand} user-token list [--json] List your tokens (never shows secrets)\n ${primaryCommand} user-token revoke <id> Revoke a token immediately\n ${primaryCommand} user-token rename <id> <label> Rename a token without rotating it\n ${primaryCommand} help Show this help message\n ${primaryCommand} version [--json] Show the installed CLI version\n ${primaryCommand} update [--check] [--force] [--json]\n Check for or install the latest published CLI\n ${primaryCommand} init [--json] Create overlord.toml with a local backend URL\n ${primaryCommand} serve [--host <h>] [--port <p>] [--db <path>] [--json]\n Boot the web/REST server (creates + migrates the DB on first run)\n ${primaryCommand} doctor [--json] Validate backend and connector installs\n ${primaryCommand} prune [--json] Delete the contents of .overlord/tmp in the current directory\n ${primaryCommand} config list [--json] Show local configuration\n ${primaryCommand} config set Choose local/cloud backend interactively\n ${primaryCommand} config set local [url] Use a local backend URL (default: http://127.0.0.1:4310)\n ${primaryCommand} config set cloud <url> Use a hosted backend URL\n ${primaryCommand} setup [--json] Configure backend, agents, and terminal interactively\n\nConnectors:\n ${primaryCommand} agent-setup [--json] List installable agent connectors\n ${primaryCommand} agent-setup <agent> [--dry-run]\n Install/repair one connector (e.g. claude)\n ${primaryCommand} agent-setup all [--dry-run] Install/repair all supported connectors\n\nOrganizations:\n ${primaryCommand} org-setup --org-name \"<name>\" [--workspace-name <name>] [--workspace-slug <slug>]\n [--logo <path>] [--no-input] [--if-needed] [--json]\n One-time org + first-workspace onboarding for a\n profile with zero workspace memberships. Prompts\n interactively on a TTY; --if-needed is a no-op (exit 0)\n once you already belong to an organization.\n\nProjects:\n ${primaryCommand} create-project --name \"<name>\" [--directory <path>|--no-directory]\n ${primaryCommand} add-cwd [--directory <path>] [--project-id <id>] [--key <resourceKey>] [--primary true|false]\n (prompts to pick a project when --project-id is omitted)\n ${primaryCommand} add-url --url <git-url> --project-id <id> [--key <resourceKey>] [--primary true|false]\n\nMissions:\n ${primaryCommand} create \"<objective>\" [--objectives-json '[...]'] [--json]\n ${primaryCommand} prompt \"<objective>\" [--json]\n ${primaryCommand} attach <missionId> [agent] [--json]\n ${primaryCommand} missions list [--status <csv>] [--project-id <id>] [--json]\n ${primaryCommand} mission context|events|deliveries|artifacts|rationales <missionId> [--json]\n\nLaunch and runner:\n ${primaryCommand} launch <agent> --mission-id <missionId> [--branch <name>] [--no-worktree] [--dry-run] [--json]\n ${primaryCommand} runner once|start|status|clear|clear-all [--branch <name>] [--no-worktree] [--json]\n\nChanges:\n ${primaryCommand} changes status --mission-id <id> [--objective-id <id>] [--json]\n ${primaryCommand} changes rationales --mission-id <id> [--objective-id <id>] [--json]\n\nAgents:\n Built-in agents (claude, codex, cursor) need an installed connector\n (${primaryCommand} agent-setup <agent>). Launch with:\n ${primaryCommand} launch <agent> --mission-id <missionId>\n Use ${primaryCommand} protocol help for the full mission lifecycle reference.\n Key protocol commands: auth-status, discover-project, create, prompt, attach,\n connect, load-context, update, heartbeat, ask, deliver.\n\nProtocol (JSON output by default):\n ${primaryCommand} protocol attach --mission-id <id>\n ${primaryCommand} protocol update --mission-id <id> --session-key <key> --summary \"...\"\n ${primaryCommand} protocol heartbeat --mission-id <id> --session-key <key>\n ${primaryCommand} protocol ask --mission-id <id> --session-key <key> --question \"...\"\n ${primaryCommand} protocol deliver --mission-id <id> --session-key <key> --summary \"...\"\n ${primaryCommand} protocol search-missions --query \"<text>\" --status next-up,execute\n ${primaryCommand} protocol load-context --mission-id <id>\n ${primaryCommand} protocol help\n\nAfter installation, run \\`${primaryCommand} auth login\\` to choose your backend.\n\nSee cli/docs/ for the full command reference.\n`);\n}\n"],
5
+ "mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uEAaqD,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAuM7E,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAkFD,WAAW;AAAA,QAC5B,cAAc,yCAAyC,cAAc;AAAA,CAC5E;AACD;AA9YA,IACa,gCA0BP;AA3BN;AAAA;AAAA;AACO,IAAM,iCAAiC;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,qBAAqB;AAAA;AAAA;;;AC3B3B,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,cAAAC,cAAY,aAAAC,YAAW,gBAAAC,gBAAc,iBAAAC,sBAAqB;AACnE,OAAOC,YAAU;AA8BjB,SAASC,cAAa,kBAAkC;AACtD,QAAM,MAAMN,YAAW,QAAQ,EAAE,OAAOK,OAAK,QAAQ,gBAAgB,CAAC,EAAE,OAAO,KAAK;AACpF,SAAOA,OAAK,KAAK,qBAAqB,GAAG,gBAAgB,GAAG,GAAG,OAAO;AACxE;AAEA,SAAS,YAAY,kBAAgD;AACnE,MAAI;AACF,UAAM,SAASC,cAAa,gBAAgB;AAC5C,QAAI,CAACL,aAAW,MAAM,EAAG,QAAO,CAAC;AACjC,UAAM,MAAM,KAAK,MAAME,eAAa,QAAQ,MAAM,CAAC;AACnD,QAAI,CAAC,MAAM,QAAQ,IAAI,OAAO,EAAG,QAAO,CAAC;AACzC,UAAM,MAAM,KAAK,IAAI;AACrB,WAAO,IAAI,QAAQ,QAAQ,WAAS;AAClC,UACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA6B,cAAc,YACnD,OAAQ,MAA6B,eAAe,YACpD,OAAQ,MAA6B,eAAe,UACpD;AACA,eAAO,CAAC;AAAA,MACV;AACA,YAAM,YAAY;AAClB,YAAM,eAAe,KAAK,MAAM,UAAU,UAAU;AACpD,UAAI,OAAO,MAAM,YAAY,KAAK,MAAM,eAAe,sBAAuB,QAAO,CAAC;AACtF,aAAO,CAAC,SAAS;AAAA,IACnB,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,aAAa,kBAA0B,SAAqC;AACnF,MAAI;AACF,UAAM,SAASG,cAAa,gBAAgB;AAC5C,IAAAJ,WAAUG,OAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,IAAAD,eAAc,QAAQ,KAAK,UAAU,EAAE,QAAQ,CAAC,CAAC;AAAA,EACnD,QAAQ;AAAA,EAGR;AACF;AAGO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,QAAM,iBAAiB,UAAU,KAAK;AACtC,QAAM,aAAa,WAAW,KAAK;AACnC,MAAI,CAAC,kBAAkB,CAAC,WAAY;AACpC,QAAM,UAAU,YAAY,gBAAgB,EAAE,OAAO,WAAS,MAAM,cAAc,cAAc;AAChG,UAAQ,KAAK;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC,CAAC;AACD,eAAa,kBAAkB,OAAO;AACxC;AAGO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGS;AACP,QAAM,YAAY,YAAY,gBAAgB,EAAE,OAAO,WAAS,MAAM,cAAc,SAAS;AAC7F,eAAa,kBAAkB,SAAS;AAC1C;AAGO,SAAS,mBAAmB,kBAAgD;AACjF,SAAO,YAAY,gBAAgB;AACrC;AAYO,SAAS,2BAA2B,kBAAkD;AAC3F,QAAM,UAAU,mBAAmB,gBAAgB;AACnD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,CAAC,KAAK,IAAI;AAChB,WAAO,QAAQ,EAAE,WAAW,MAAM,WAAW,WAAW,MAAM,IAAI;AAAA,EACpE;AAEA,QAAM,aAAa,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,cAAc,EAAE,UAAU,CAAC,EAAE,CAAC;AAC1F,SAAO,aAAa,EAAE,WAAW,WAAW,WAAW,WAAW,KAAK,IAAI;AAC7E;AAtIA,IA8BM;AA9BN;AAAA;AAAA;AAIA;AA0BA,IAAM,wBAAwB,KAAK,KAAK,KAAK;AAAA;AAAA;;;AC9B7C,SAAS,gBAAAG,qBAAoB;AAC7B,SAAS,cAAAC,mBAAkB;AAC3B;AAAA,EACE,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,UAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,OAAOC,YAAU;AAmGjB,SAAS,cAAc,UAA0B;AAC/C,SAAO,SAAS,QAAQ,OAAO,GAAG,EAAE,KAAK;AAC3C;AAEA,SAAS,qBAAqB,MAA0B,OAAwB;AAC9E,SAAO,OAAO,SAAS,YAAYA,OAAK,QAAQ,IAAI,MAAMA,OAAK,QAAQ,KAAK;AAC9E;AAGA,SAAS,mBAAmB,MAAkC;AAC5D,QAAM,aAAa,KAAK,QAAQ,QAAQ,EAAE;AAC1C,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,YAAY,WAAW,MAAM,GAAG,CAAC,EAAE,KAAK,KAAK;AACnD,MAAI,WAAW,WAAW,MAAM,CAAC,EAAE,KAAK;AAExC,QAAM,QAAQ,SAAS,QAAQ,MAAM;AACrC,MAAI,UAAU,GAAI,YAAW,SAAS,MAAM,QAAQ,CAAC,EAAE,KAAK;AAE5D,MAAI,SAAS,WAAW,GAAG,KAAK,SAAS,SAAS,GAAG,KAAK,SAAS,UAAU,GAAG;AAC9E,eAAW,SAAS,MAAM,GAAG,EAAE;AAAA,EACjC;AACA,QAAM,WAAW,cAAc,QAAQ;AACvC,SAAO,WAAW,EAAE,UAAU,UAAU,IAAI;AAC9C;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AACF,GAGkB;AAChB,MAAI;AACF,WAAOT,cAAa,OAAO,CAAC,eAAe,QAAQ,GAAG;AAAA,MACpD,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC,EAAE,KAAK;AAAA,EACV,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,iBAAiB,kBAAyC;AACxE,MAAI;AACF,UAAM,SAASA,cAAa,OAAO,CAAC,UAAU,aAAa,GAAG;AAAA,MAC5D,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MAClC,WAAW,KAAK,OAAO;AAAA,IACzB,CAAC;AACD,UAAM,SAAS,oBAAI,IAAyB;AAC5C,eAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,YAAM,QAAQ,mBAAmB,IAAI;AACrC,UAAI,MAAO,QAAO,IAAI,MAAM,UAAU,KAAK;AAAA,IAC7C;AACA,WAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,EACnC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAQA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AACF,GAGW;AACT,SAAOC,YAAW,QAAQ,EACvB,OAAO,GAAGQ,OAAK,QAAQ,gBAAgB,CAAC,KAAK,SAAS,EAAE,EACxD,OAAO,KAAK;AACjB;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AACF,GAGW;AACT,SAAOA,OAAK;AAAA,IACV,qBAAqB;AAAA,IACrB;AAAA,IACA,GAAG,eAAe,EAAE,kBAAkB,UAAU,CAAC,CAAC;AAAA,EACpD;AACF;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AACF,GAGW;AACT,SAAOA,OAAK;AAAA,IACV,qBAAqB;AAAA,IACrB;AAAA,IACA,GAAG,eAAe,EAAE,kBAAkB,UAAU,CAAC,CAAC;AAAA,EACpD;AACF;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AACF,GAGW;AACT,SAAOA,OAAK;AAAA,IACV,qBAAqB;AAAA,IACrB;AAAA,IACA,GAAG,eAAe,EAAE,kBAAkB,UAAU,CAAC,CAAC;AAAA,EACpD;AACF;AAQA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AACF,GAGW;AACT,SAAOA,OAAK;AAAA,IACV,qBAAqB;AAAA,IACrB;AAAA,IACA,GAAG,eAAe,EAAE,kBAAkB,UAAU,CAAC,CAAC;AAAA,EACpD;AACF;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AACF,GAGmE;AACjE,MAAI;AACF,UAAM,SAAS,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAC/D,QAAI,CAACP,aAAW,MAAM,EAAG,QAAO,oBAAI,IAAI;AACxC,UAAM,MAAM,KAAK,MAAMG,eAAa,QAAQ,MAAM,CAAC;AACnD,UAAM,SAAS,oBAAI,IAA+D;AAClF,QAAI,MAAM,QAAQ,IAAI,KAAK,GAAG;AAC5B,iBAAW,SAAS,IAAI,OAAO;AAC7B,YACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAAuB,aAAa,UAC5C;AACA,gBAAM,OAAO;AACb,iBAAO,IAAI,KAAK,UAAU;AAAA,YACxB,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,YACjE,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,UACzE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AACF;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,MAAI;AACF,UAAM,SAAS,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAC/D,IAAAF,WAAUM,OAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,IAAAD,eAAc,QAAQ,KAAK,UAAU,EAAE,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,MAAM,CAAC,CAAC;AAAA,EACtF,QAAQ;AAAA,EAER;AACF;AAWO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AACF,GAG2B;AACzB,MAAI;AACF,UAAM,UAAU,iBAAiB,gBAAgB;AACjD,UAAM,kBAAkB,sBAAsB,EAAE,kBAAkB,OAAO,QAAQ,CAAC;AAClF,UAAM,WAAW,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAEjE,UAAM,eAAe,gBAAgB,OAAO,WAAS;AACnD,YAAM,QAAQ,SAAS,IAAI,MAAM,QAAQ;AACzC,UAAI,CAAC,MAAO,QAAO;AACnB,UAAI,MAAM,gBAAgB,QAAQ,MAAM,gBAAgB,MAAM;AAC5D,eAAO,MAAM,cAAc,MAAM;AAAA,MACnC;AACA,aAAO,MAAM,gBAAgB,MAAM;AAAA,IACrC,CAAC;AAED,sBAAkB,EAAE,kBAAkB,WAAW,OAAO,gBAAgB,CAAC;AAEzE,QAAI,aAAa,WAAW,EAAG,QAAO,EAAE,YAAY,EAAE;AAEtD,uBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA,OAAO,aAAa,IAAI,WAAS,MAAM,QAAQ;AAAA,IACjD,CAAC;AACD,WAAO,EAAE,YAAY,aAAa,OAAO;AAAA,EAC3C,QAAQ;AACN,WAAO,EAAE,YAAY,EAAE;AAAA,EACzB;AACF;AAcA,SAAS,kBAAkB,UAA0B;AACnD,QAAM,WAAWC,OAAK,QAAQ,QAAQ;AACtC,MAAI;AACF,WAAOH,cAAa,QAAQ,EAAE,QAAQ,OAAO,GAAG;AAAA,EAClD,QAAQ;AACN,QAAI;AACF,aAAOG,OACJ,KAAKH,cAAaG,OAAK,QAAQ,QAAQ,CAAC,GAAGA,OAAK,SAAS,QAAQ,CAAC,EAClE,QAAQ,OAAO,GAAG;AAAA,IACvB,QAAQ;AACN,aAAO,SAAS,QAAQ,OAAO,GAAG;AAAA,IACpC;AAAA,EACF;AACF;AAGA,SAAS,YAAY,kBAAyC;AAC5D,MAAI;AACF,UAAM,OAAOT,cAAa,OAAO,CAAC,aAAa,iBAAiB,GAAG;AAAA,MACjE,KAAK;AAAA,MACL,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,IACpC,CAAC,EAAE,KAAK;AACR,WAAO,QAAQ;AAAA,EACjB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAGS;AACP,MAAI;AACF,eAAW,UAAU;AAAA,MACnB,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAAA,MAChD,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAAA,IAClD,GAAG;AACD,UAAIE,aAAW,MAAM,EAAG,CAAAK,QAAO,MAAM;AAAA,IACvC;AAAA,EACF,QAAQ;AAAA,EAGR;AACF;AAGO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGS;AACP,MAAI;AACF,UAAM,SAAS,mBAAmB,EAAE,kBAAkB,UAAU,CAAC;AACjE,QAAIL,aAAW,MAAM,EAAG,CAAAK,QAAO,MAAM;AAAA,EACvC,QAAQ;AAAA,EAGR;AACF;AAEA,SAAS,iBAAiB,OAAkC,MAAM,KAAoB;AACpF,QAAM,WAAW,SAAS,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACxD,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,QAAQ,SAAS,MAAM,GAAG,QAAQ,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ;AACpE;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AACF,GAGoB;AAClB,MAAI;AACF,UAAM,SAAS,mBAAmB,EAAE,kBAAkB,UAAU,CAAC;AACjE,QAAI,CAACL,aAAW,MAAM,EAAG,QAAO,CAAC;AACjC,UAAM,MAAM,KAAK,MAAMG,eAAa,QAAQ,MAAM,CAAC;AACnD,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAG,QAAO,CAAC;AACvC,WAAO,IAAI,MAAM,QAAQ,UAAQ;AAC/B,UACE,OAAO,SAAS,YAChB,SAAS,QACT,OAAQ,KAAuB,aAAa,UAC5C;AACA,eAAO,CAAC;AAAA,MACV;AACA,YAAM,YAAY;AAClB,aAAO;AAAA,QACL;AAAA,UACE,UAAU,kBAAkB,UAAU,QAAQ;AAAA,UAC9C,UAAU,iBAAiB,UAAU,QAAQ;AAAA,UAC7C,QAAQ,iBAAiB,UAAU,MAAM;AAAA,UACzC,mBAAmB,iBAAiB,UAAU,iBAAiB;AAAA,UAC/D,aACE,OAAO,UAAU,gBAAgB,YAAY,UAAU,YAAY,KAAK,IACpE,UAAU,cACV;AAAA,UACN,YACE,OAAO,UAAU,eAAe,YAAY,UAAU,WAAW,KAAK,IAClE,UAAU,cACV,oBAAI,KAAK,CAAC,GAAE,YAAY;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAOO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,MAAI;AACF,UAAM,YAAY,MACf,IAAI,WAAS;AAAA,MACZ,WAAW,KAAK,YAAY,IAAI,KAAK;AAAA,MACrC,UAAU,iBAAiB,KAAK,UAAU,EAAE;AAAA,MAC5C,QAAQ,iBAAiB,KAAK,MAAM;AAAA,MACpC,mBAAmB,iBAAiB,KAAK,iBAAiB;AAAA,IAC5D,EAAE,EACD,OAAO,UAAQ,KAAK,QAAQ,EAC5B,IAAI,UAAQ;AACX,YAAM,WAAW,kBAAkBI,OAAK,QAAQ,kBAAkB,KAAK,QAAQ,CAAC;AAChF,aAAO;AAAA,QACL,UAAU;AAAA,QACV,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,mBAAmB,KAAK;AAAA,QACxB,aAAa,iBAAiB;AAAA,UAC5B;AAAA,UACA,UAAUA,OAAK,SAAS,kBAAkB,QAAQ;AAAA,QACpD,CAAC;AAAA,QACD,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC;AAAA,IACF,CAAC;AACH,QAAI,UAAU,WAAW,EAAG;AAE5B,UAAM,SAAS,mBAAmB,EAAE,kBAAkB,UAAU,CAAC;AACjE,IAAAN,WAAUM,OAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,QAAQ,mBAAmB,EAAE,kBAAkB,UAAU,CAAC;AAChE,UAAM,cAAc,CAAC,GAAG,OAAO,GAAG,SAAS,EAAE,MAAM,IAAI;AACvD,IAAAD;AAAA,MACE;AAAA,MACA,KAAK,UAAU,EAAE,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,OAAO,YAAY,CAAC;AAAA,IAC5E;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAMO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,MAAI;AACF,UAAM,YAAY,MACf,IAAI,eAAa,YAAY,IAAI,KAAK,CAAC,EACvC,OAAO,OAAO,EACd,IAAI,cAAY,kBAAkBC,OAAK,QAAQ,kBAAkB,QAAQ,CAAC,CAAC;AAC9E,QAAI,UAAU,WAAW,EAAG;AAC5B,UAAM,SAAS,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAC/D,IAAAN,WAAUM,OAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,WAAW,eAAe,EAAE,kBAAkB,UAAU,CAAC,GAAG,SAAS,oBAAI,IAAY;AAC3F,eAAW,YAAY,UAAW,UAAS,IAAI,QAAQ;AACvD,IAAAD;AAAA,MACE;AAAA,MACA,KAAK,UAAU;AAAA,QACb,kBAAkBC,OAAK,QAAQ,gBAAgB;AAAA,QAC/C;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,OAAO,MAAM,KAAK,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF,QAAQ;AAAA,EAGR;AACF;AAGO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAGY;AACV,SAAOP,aAAW,iBAAiB,EAAE,kBAAkB,UAAU,CAAC,CAAC;AACrE;AAOA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AACF,GAGiF;AAC/E,MAAI;AACF,UAAM,SAAS,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAC/D,QAAI,CAACA,aAAW,MAAM,EAAG,QAAO;AAChC,UAAM,MAAM,KAAK,MAAMG,eAAa,QAAQ,MAAM,CAAC;AACnD,UAAM,SAAS,oBAAI,IAAY;AAC/B,QAAI,MAAM,QAAQ,IAAI,KAAK,GAAG;AAC5B,iBAAW,SAAS,IAAI,OAAO;AAC7B,YAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAG,QAAO,IAAI,kBAAkB,KAAK,CAAC;AAAA,MACpF;AAAA,IACF;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,kBAAkB,OAAO,IAAI,qBAAqB,WAAW,IAAI,mBAAmB;AAAA,MACpF,WAAW,OAAO,IAAI,cAAc,WAAW,IAAI,YAAY;AAAA,IACjE;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AACF,GAGmB;AACjB,SAAO,MAAM,IAAI,YAAU;AAAA,IACzB,UAAU,MAAM;AAAA,IAChB,WAAW,MAAM;AAAA,IACjB,aAAa,iBAAiB,EAAE,kBAAkB,UAAU,MAAM,SAAS,CAAC;AAAA,EAC9E,EAAE;AACJ;AAGO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,MAAI;AACF,UAAM,SAAS,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAC/D,IAAAF,WAAUM,OAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,WAA6B;AAAA,MACjC,kBAAkBA,OAAK,QAAQ,gBAAgB;AAAA,MAC/C;AAAA,MACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,OAAO,sBAAsB,EAAE,kBAAkB,MAAM,CAAC;AAAA,IAC1D;AACA,IAAAD,eAAc,QAAQ,KAAK,UAAU,QAAQ,CAAC;AAAA,EAChD,QAAQ;AAAA,EAGR;AACF;AAOA,SAAS,sBAAsB;AAAA,EAC7B;AAAA,EACA;AACF,GAGgB;AACd,QAAM,mBAAmB,IAAI;AAAA,IAC3B,mBAAmB,gBAAgB,EAChC,IAAI,WAAS,MAAM,UAAU,KAAK,CAAC,EACnC,OAAO,OAAO;AAAA,EACnB;AACA,MAAI,iBAAiB,SAAS,EAAG,QAAO,CAAC;AAEzC,QAAM,YAAYC,OAAK,KAAK,qBAAqB,GAAG,aAAa;AACjE,MAAI,CAACP,aAAW,SAAS,EAAG,QAAO,CAAC;AAEpC,QAAM,SAAsB,CAAC;AAC7B,aAAW,QAAQE,aAAY,SAAS,GAAG;AACzC,QAAI,CAAC,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,qBAAqB,EAAG;AACrE,QAAI;AACF,YAAM,MAAM,KAAK,MAAMC,eAAaI,OAAK,KAAK,WAAW,IAAI,GAAG,MAAM,CAAC;AACvE,YAAM,qBACJ,OAAO,IAAI,cAAc,YAAY,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI;AACrF,UAAI,CAAC,sBAAsB,uBAAuB,UAAW;AAC7D,UAAI,CAAC,iBAAiB,IAAI,kBAAkB,EAAG;AAC/C,UAAI,CAAC,qBAAqB,IAAI,kBAAkB,gBAAgB,EAAG;AAEnE,YAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAI,MAAM,QAAQ,IAAI,KAAK,GAAG;AAC5B,mBAAW,SAAS,IAAI,OAAO;AAC7B,cAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAG,OAAM,IAAI,kBAAkB,KAAK,CAAC;AAAA,QACnF;AAAA,MACF;AACA,UAAI,MAAM,SAAS,EAAG;AACtB,aAAO,KAAK,EAAE,WAAW,oBAAoB,MAAM,CAAC;AAAA,IACtD,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AACF,GAG8B;AAC5B,MAAI;AACF,UAAM,SAAS,iBAAiB,EAAE,kBAAkB,UAAU,CAAC;AAC/D,QAAI,CAACP,aAAW,MAAM,EAAG,QAAO,oBAAI,IAAI;AACxC,UAAM,MAAM,KAAK,MAAMG,eAAa,QAAQ,MAAM,CAAC;AAInD,QAAI,MAAM,QAAQ,IAAI,KAAK,GAAG;AAC5B,YAAM,SAAS,oBAAI,IAA0B;AAC7C,iBAAW,SAAS,IAAI,OAAO;AAC7B,YACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAAuB,aAAa,UAC5C;AACA,gBAAM,OAAO;AACb,iBAAO,IAAI,KAAK,UAAU;AAAA,YACxB,UAAU,KAAK;AAAA,YACf,WAAW,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AAAA,YACjE,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;AAAA,UACzE,CAAC;AAAA,QACH;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,QAAQ,IAAI,KAAK,GAAG;AAC5B,YAAM,SAAS,oBAAI,IAA0B;AAC7C,iBAAW,YAAY,IAAI,OAAO;AAChC,YAAI,OAAO,aAAa,UAAU;AAChC,iBAAO,IAAI,UAAU,EAAE,UAAU,WAAW,WAAW,aAAa,KAAK,CAAC;AAAA,QAC5E;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,WAAO,oBAAI,IAAI;AAAA,EACjB,QAAQ;AACN,WAAO,oBAAI,IAAI;AAAA,EACjB;AACF;AAEA,SAAS,wBAAwB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,GAIY;AACV,QAAM,OAAO,SAAS,IAAI,MAAM,QAAQ;AACxC,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,gBAAgB,KAAM,QAAO;AACtC,QAAM,cAAc,iBAAiB,EAAE,kBAAkB,UAAU,MAAM,SAAS,CAAC;AACnF,SAAO,gBAAgB,KAAK;AAC9B;AAYA,SAAS,mBAAmB,MAAsB;AAChD,MAAI,MAAM;AACV,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,QAAI,SAAS,KAAK;AAChB,UAAI,KAAK,QAAQ,CAAC,MAAM,KAAK;AAC3B,iBAAS;AACT,YAAI,KAAK,QAAQ,CAAC,MAAM,KAAK;AAE3B,mBAAS;AACT,iBAAO;AAAA,QACT,OAAO;AACL,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,WAAW,SAAS,KAAK;AACvB,aAAO;AAAA,IACT,OAAO;AACL,aAAO,KAAK,QAAQ,qBAAqB,MAAM;AAAA,IACjD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,qBAAqB,YAAuC;AACnE,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,cAAU;AACV,cAAU,QAAQ,MAAM,CAAC;AAAA,EAC3B;AAEA,MAAI,QAAQ,WAAW,KAAK,KAAK,QAAQ,WAAW,KAAK,GAAG;AAC1D,cAAU,QAAQ,MAAM,CAAC;AAAA,EAC3B;AACA,MAAI,gBAAgB;AACpB,MAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,oBAAgB;AAChB,cAAU,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC/B;AACA,MAAI,CAAC,QAAS,QAAO;AAIrB,QAAM,WAAW,QAAQ,SAAS,GAAG;AACrC,MAAI,QAAQ,WAAW,GAAG,EAAG,WAAU,QAAQ,MAAM,CAAC;AACtD,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,SAAS,WAAW,MAAM;AAChC,QAAM,OAAO,mBAAmB,OAAO;AAIvC,QAAM,SAAS,gBAAgB,SAAS;AACxC,MAAI;AACF,WAAO,EAAE,SAAS,OAAO,IAAI,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,EAAE;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,gBAAgB,UAAgC;AACvD,MAAI;AACF,UAAM,SAASI,OAAK,KAAK,UAAU,wBAAwB;AAC3D,QAAI,CAACP,aAAW,MAAM,EAAG,QAAO,CAAC;AACjC,UAAM,QAAsB,CAAC;AAC7B,eAAW,WAAWG,eAAa,QAAQ,MAAM,EAAE,MAAM,IAAI,GAAG;AAC9D,YAAM,OAAO,QAAQ,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC7C,UAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,EAAG;AACnC,YAAM,OAAO,qBAAqB,IAAI;AACtC,UAAI,KAAM,OAAM,KAAK,IAAI;AAAA,IAC3B;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAOA,SAAS,cAAc,OAAqB,cAA+B;AACzE,MAAI,UAAU;AACd,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,MAAM,KAAK,YAAY,EAAG,WAAU,CAAC,KAAK;AAAA,EACrD;AACA,SAAO;AACT;AAyBO,SAAS,6BAA6B;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF,GAIkB;AAChB,QAAM,WAAW,qBAAqB,EAAE,kBAAkB,UAAU,CAAC;AACrE,QAAM,UAAU,eAAe,EAAE,kBAAkB,UAAU,CAAC;AAC9D,QAAM,WAAW,YAAY,gBAAgB,KAAK;AAClD,QAAM,cAAc,gBAAgB,QAAQ;AAC5C,QAAM,aAAa,UAAU,sBAAsB,EAAE,kBAAkB,UAAU,CAAC,IAAI,CAAC;AACvF,SAAO,MAAM,QAAQ,WAAS;AAC5B,QAAI,CAAC,wBAAwB,EAAE,kBAAkB,OAAO,SAAS,CAAC,EAAG,QAAO,CAAC;AAC7E,QAAI,YAAY,SAAS,KAAK,cAAc,aAAa,cAAc,MAAM,QAAQ,CAAC,GAAG;AACvF,aAAO,CAAC;AAAA,IACV;AACA,QAAI,CAAC,QAAS,QAAO,CAAC,EAAE,UAAU,MAAM,UAAU,WAAW,MAAM,UAAU,CAAC;AAC9E,UAAM,WAAW,kBAAkBI,OAAK,QAAQ,UAAU,MAAM,QAAQ,CAAC;AACzE,QAAI,QAAQ,MAAM,IAAI,QAAQ,GAAG;AAC/B,aAAO;AAAA,QACL;AAAA,UACE,UAAU,MAAM;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,UAAM,sBAAsB,WACzB,OAAO,WAAS,MAAM,MAAM,IAAI,QAAQ,CAAC,EACzC,IAAI,WAAS,MAAM,SAAS,EAC5B,KAAK;AACR,QAAI,oBAAoB,SAAS,GAAG;AAClC,aAAO;AAAA,QACL;AAAA,UACE,UAAU,MAAM;AAAA,UAChB,WAAW,MAAM;AAAA,UACjB,aAAa;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,QACE,UAAU,MAAM;AAAA,QAChB,WAAW,MAAM;AAAA,QACjB,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,UAA0B;AAC/C,QAAM,OAAOA,OAAK,SAAS,QAAQ,EAAE,QAAQ,YAAY,EAAE;AAC3D,QAAM,QAAQ,KACX,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,UAAU,GAAG,EACrB,KAAK;AACR,MAAI,CAAC,MAAO,QAAO,UAAU,QAAQ;AACrC,SAAO,UAAU,MAAM,QAAQ,SAAS,UAAQ,KAAK,YAAY,CAAC,CAAC;AACrE;AAEA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF,GAIyB;AACvB,QAAM,aAAa,MAChB,OAAO,UAAQ,KAAK,aAAa,QAAQ,EACzC,KAAK,CAAC,MAAM,UAAU,MAAM,WAAW,cAAc,KAAK,UAAU,CAAC;AACxE,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SACE,WAAW,KAAK,UAAQ,eAAe,KAAK,eAAe,KAAK,gBAAgB,WAAW,KAC3F,WAAW,CAAC,KACZ;AAEJ;AAOO,SAAS,+BAA+B;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AACF,GAI2B;AACzB,QAAM,QAAQ,mBAAmB,EAAE,kBAAkB,UAAU,CAAC;AAChE,MAAI,MAAM,WAAW,KAAK,MAAM,WAAW,EAAG,QAAO,CAAC;AACtD,QAAM,WAAW,YAAY,gBAAgB,KAAK;AAClD,SAAO,MAAM,QAAQ,UAAQ;AAC3B,UAAM,WAAW,kBAAkBA,OAAK,QAAQ,UAAU,KAAK,QAAQ,CAAC;AACxE,UAAM,cAAc,iBAAiB,EAAE,kBAAkB,UAAU,KAAK,SAAS,CAAC;AAClF,UAAM,OAAO,mBAAmB,EAAE,OAAO,UAAU,UAAU,YAAY,CAAC;AAC1E,QAAI,CAAC,KAAM,QAAO,CAAC;AAEnB,UAAM,SAAS,KAAK,UAAU,eAAe,KAAK,YAAY,qBAAqB;AACnF,UAAM,UAAU,KAAK,oBAAoB,qBAAqB,KAAK,iBAAiB,KAAK;AACzF,WAAO;AAAA,MACL;AAAA,QACE,WAAW,cAAc,KAAK,QAAQ;AAAA,QACtC,OAAO,cAAc,KAAK,QAAQ;AAAA,QAClC,SAAS,gCAAgC,MAAM,IAAI,OAAO,GAAG,MAAM,GAAG,GAAG;AAAA,QACzE,KAAK;AAAA,QACL,QAAQ,iCAAiC;AAAA,UACvC,KAAK;AAAA,QACP,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAGO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAGkB;AAChB,SAAO,6BAA6B;AAAA,IAClC;AAAA,IACA;AAAA,IACA,OAAO,iBAAiB,gBAAgB;AAAA,EAC1C,CAAC;AACH;AAtgCA,IAqwBa;AArwBb;AAAA;AAAA;AAaA;AACA;AAuvBO,IAAM,2BAA2B;AAAA;AAAA;;;ACrwBxC,SAAS,gBAAAC,sBAAoB;AAC7B,OAAOC,YAAU;AA0BjB,SAAS,kBAAkB,WAAqD;AAC9E,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,CAAC,KAAc,WAAmB;AAC7C,QAAI,OAAO,QAAQ,SAAU;AAC7B,UAAM,UAAU,IAAI,KAAK;AACzB,QAAI,CAAC,QAAS;AACd,QAAI,CAAC,OAAO,IAAI,OAAO,EAAG,OAAM,KAAK,OAAO;AAC5C,WAAO,IAAI,UAAU,OAAO,IAAI,OAAO,KAAK,KAAK,MAAM;AAAA,EACzD;AAEA,OAAK,UAAU,WAAW,CAAC;AAC3B,OAAK,UAAU,eAAe,CAAC;AAE/B,QAAM,QAAQ,UAAU;AACxB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,eAAe,UAAU;AAC/B,QAAI,OAAO,iBAAiB,YAAY,aAAa,KAAK,GAAG;AAC3D,aAAO,IAAI,aAAa,KAAK,IAAI,OAAO,IAAI,aAAa,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,IAC5E;AACA,eAAW,QAAQ,OAAO;AACxB,UAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,cAAM,QAAS,KAAiC,aAAa;AAC7D,aAAK,OAAO,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,IAAI,eAAa,EAAE,UAAU,WAAW,KAAK,IAAI,OAAO,IAAI,QAAQ,KAAK,GAAG,CAAC,EAAE,EAAE;AAChG;AAEA,SAAS,QAAQ,OAAkC,QAAQ,KAAoB;AAC7E,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,OAAO,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACxD,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,SAAS,QAAQ,GAAG,KAAK,MAAM,GAAG,QAAQ,CAAC,CAAC,QAAQ;AAClE;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIW;AACT,MAAI,aAAa,QAAS,QAAO;AACjC,MAAI,aAAa,eAAe,YAAY;AAC1C,WAAO,WAAW,SAAS;AAC7B,MAAI,aAAa,OAAQ,QAAO;AAChC,MAAI,YAAY,KAAK,QAAQ,KAAK,YAAY,KAAK,QAAQ,EAAG,QAAO;AACrE,SAAO,cAAc,QAAQ;AAC/B;AAGA,SAAS,uBAAuB,gBAAwC;AACtE,MAAI,OAAO,mBAAmB,YAAY,CAAC,eAAe,KAAK,EAAG,QAAO;AACzE,MAAI;AACF,UAAMC,SAAQF,eAAa,gBAAgB,MAAM,EAAE,MAAM,IAAI,EAAE,MAAM,IAAI;AACzE,aAAS,QAAQE,OAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACzD,YAAM,OAAOA,OAAM,KAAK,GAAG,KAAK;AAChC,UAAI,CAAC,KAAM;AACX,UAAI;AACJ,UAAI;AACF,gBAAQ,KAAK,MAAM,IAAI;AAAA,MACzB,QAAQ;AACN;AAAA,MACF;AACA,UAAI,OAAO,UAAU,YAAY,UAAU,KAAM;AACjD,YAAM,SAAS;AACf,YAAM,UAAU,OAAO;AACvB,YAAM,OAAO,SAAS,QAAQ,OAAO;AACrC,UAAI,SAAS,YAAa;AAC1B,YAAM,UAAU,SAAS,WAAW,OAAO;AAC3C,YAAM,QAAkB,CAAC;AACzB,UAAI,OAAO,YAAY,UAAU;AAC/B,cAAM,KAAK,OAAO;AAAA,MACpB,WAAW,MAAM,QAAQ,OAAO,GAAG;AACjC,mBAAW,QAAQ,SAAS;AAC1B,cACE,QACA,OAAO,SAAS,YACf,KAAiC,SAAS,QAC3C;AACA,kBAAM,OAAQ,KAAiC;AAC/C,gBAAI,OAAO,SAAS,SAAU,OAAM,KAAK,IAAI;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AACA,YAAM,YAAY,QAAQ,MAAM,KAAK,GAAG,CAAC;AACzC,UAAI,UAAW,QAAO;AAAA,IACxB;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAWO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,GAIwB;AACtB,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,UAAU;AAAA,EACjC,QAAQ;AACN,WAAO,EAAE,UAAU,OAAO,QAAQ,uBAAuB;AAAA,EAC3D;AAEA,QAAM,eAAe,QAAQ;AAC7B,QAAM,YACJ,gBAAgB,OAAO,iBAAiB,WACnC,eACD,CAAC;AACP,QAAM,WACJ,OAAO,QAAQ,cAAc,YAAY,QAAQ,UAAU,KAAK,IAC5D,QAAQ,UAAU,KAAK,IACvB;AAEN,QAAM,MACJ,OAAO,QAAQ,QAAQ,YAAY,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI;AAC/E,QAAM,mBAAmBD,OAAK,QAAQ,GAAG;AAEzC,QAAM,kBAAkB,iBAAiB,KAAK;AAC9C,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI,iBAAiB;AACnB,gBAAY;AAAA,EACd,OAAO;AACL,UAAM,WAAW,2BAA2B,gBAAgB;AAC5D,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,UAAU,OAAO,QAAQ,gDAAgD;AAAA,IACpF;AACA,gBAAY,SAAS;AACrB,gBAAY,SAAS;AAAA,EACvB;AAEA,MAAI,aAAa,QAAQ;AAKvB,UAAM,EAAE,WAAW,IAAI,0BAA0B,EAAE,kBAAkB,UAAU,CAAC;AAChF,WAAO,EAAE,UAAU,MAAM,WAAW,WAAW,OAAO,WAAW;AAAA,EACnE;AAEA,QAAM,aAAa,kBAAkB,SAAS;AAC9C,MAAI,WAAW,WAAW,EAAG,QAAO,EAAE,UAAU,OAAO,QAAQ,gCAAgC;AAE/F,QAAM,oBAAoB,uBAAuB,QAAQ,eAAe;AAExE,qBAAmB;AAAA,IACjB;AAAA,IACA;AAAA,IACA,OAAO,WAAW,IAAI,eAAa,UAAU,QAAQ;AAAA,EACvD,CAAC;AACD,uBAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA,OAAO,WAAW,IAAI,gBAAc;AAAA,MAClC,UAAU,UAAU;AAAA,MACpB,UAAU,QAAQ,UAAU,EAAE;AAAA,MAC9B,QAAQ;AAAA,QACN,WAAW,EAAE,UAAU,UAAU,UAAU,UAAU,WAAW,UAAU,UAAU,CAAC;AAAA,MACvF;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACJ,CAAC;AAED,SAAO,EAAE,UAAU,MAAM,WAAW,WAAW,OAAO,WAAW,OAAO;AAC1E;AApNA;AAAA;AAAA;AAGA;AACA;AAAA;AAAA;;;ACIA,SAAS,mBAAmB;AAAA,EAC1B;AAAA,EACA;AACF,GAGyB;AACvB,SAAO,UAAU;AAAA,IACf,cACE,SAAS,SAAS,qBAClB,SAAS,WAAW,eACnB,SAAS,sBAAsB,qBAAqB,SAAS,sBAAsB;AAAA,EACxF;AACF;AAGA,eAAsB,iCAAiC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AACF,GAIoB;AAClB,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,EAChD;AACA,QAAM,SAAS,mBAAmB,EAAE,WAAW,kBAAkB,CAAC;AAClE,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QAAM,WAAW,IAAI,kBAAkB;AAAA,IACrC;AAAA,IACA,aAAa;AAAA,IACb,WAAW;AAAA,EACb,CAAC;AAED,QAAM,eAAe,CAAC;AACtB,aAAW,YAAY,QAAQ;AAC7B,UAAM,SAAS,MAAM,SAAS,gBAAgB;AAAA,MAC5C,YAAY,SAAS;AAAA,MACrB,MAAM,SAAS;AAAA,IACjB,CAAC;AACD,QAAI,CAAC,OAAO,GAAI;AAChB,iBAAa,KAAK;AAAA,MAChB,YAAY,SAAS;AAAA,MACrB,OAAO,OAAO,MAAM;AAAA,MACpB,SAAS,OAAO,MAAM,WAAW;AAAA,MACjC,QAAQ,OAAO,MAAM,UAAU;AAAA,MAC/B,QAAQ,OAAO,MAAM,UAAU;AAAA,MAC/B,YAAY,OAAO,MAAM;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,QAAM,WAAW,MAAM,QAAQ,KAA2B;AAAA,IACxD,MAAM,0BAA0B,mBAAmB,iBAAiB,CAAC;AAAA,IACrE,MAAM,EAAE,aAAa;AAAA,EACvB,CAAC;AACD,SAAO,SAAS,YAAY,aAAa;AAC3C;AArEA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACWA,SAAS,gBAAgB;AACzB,SAAS,aAAAE,YAAW,cAAAC,cAAY,aAAAC,YAAW,gBAAAC,gBAAc,UAAAC,SAAQ,iBAAAC,sBAAqB;AACtF,OAAOC,SAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,iBAAiB;AAU1B,SAAS,iBAAiB,UAAkB,UAAwB;AAClE,EAAAF,eAAc,UAAU,UAAU,EAAE,MAAM,IAAM,CAAC;AAGjD,EAAAL,WAAU,UAAU,GAAK;AAC3B;AAmCO,SAAS,0BAA8C;AAC5D,SAAO;AAAA,IACL,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,UAAU,CAAC;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,WAAW;AAAA,IACX,uBAAuB;AAAA,EACzB;AACF;AAEO,SAAS,uBAAuB,UAAkB,qBAAqB,GAAW;AACvF,SAAOO,OAAK,KAAK,SAAS,6BAA6B;AACzD;AAEO,SAAS,uBACd,UAAkB,qBAAqB,GACnB;AACpB,QAAM,WAAW,uBAAuB,OAAO;AAC/C,MAAI,CAACN,aAAW,QAAQ,EAAG,QAAO,wBAAwB;AAC1D,MAAI;AACF,UAAM,SAAS,KAAK,MAAME,eAAa,UAAU,MAAM,CAAC;AACxD,WAAO,EAAE,GAAG,wBAAwB,GAAG,GAAG,OAAO;AAAA,EACnD,QAAQ;AAGN,WAAO,wBAAwB;AAAA,EACjC;AACF;AAEO,SAAS,wBACd,OACA,UAAkB,qBAAqB,GACjC;AACN,EAAAD,WAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,EAAAG,eAAc,uBAAuB,OAAO,GAAG,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC9F;AAGO,SAAS,wBACd,OACA,UAAkB,qBAAqB,GACnB;AACpB,QAAM,OAAO,EAAE,GAAG,uBAAuB,OAAO,GAAG,GAAG,MAAM;AAC5D,0BAAwB,MAAM,OAAO;AACrC,SAAO;AACT;AASO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AACF,GAGW;AACT,MAAI,CAAC,eAAgB,QAAO;AAC5B,QAAM,aAAa,KAAK,MAAM,cAAc;AAC5C,MAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AACrC,SAAO,MAAM,cAAc,kBAAkB,wBAAwB;AACvE;AAMO,SAAS,gBAAgB,YAAoB,SAAuB,KAAK,QAAgB;AAC9F,QAAM,SAAS,aAAa;AAC5B,SAAO,KAAK,MAAM,cAAc,OAAO,IAAI,IAAI,KAAK,MAAM;AAC5D;AAcO,SAAS,oBAAoB,WAAyC;AAC3E,SAAO;AACT;AA2BO,SAAS,6BAA6B;AAAA,EAC3C,UAAAG,YAAW,QAAQ;AAAA,EACnB,SAAAC,WAAUH,IAAG,QAAQ;AAAA,EACrB,SAASL;AACX,IAII,CAAC,GAAmC;AACtC,MAAIO,cAAa,SAAU,QAAO;AAClC,QAAM,UAAU;AAAA,IACd;AAAA,IACAD,OAAK,KAAKE,UAAS,gBAAgB,cAAc;AAAA,EACnD;AACA,aAAW,UAAU,SAAS;AAC5B,UAAM,UAAUF,OAAK,KAAK,QAAQ,YAAY,SAAS,UAAU;AACjE,UAAM,SAASA,OAAK,KAAK,QAAQ,YAAY,aAAa,OAAO,OAAO,UAAU;AAClF,QAAI,OAAO,OAAO,KAAK,OAAO,MAAM,GAAG;AACrC,aAAO,EAAE,SAAS,MAAM,CAAC,QAAQ,UAAU,WAAW,GAAG,mBAAmB,KAAK;AAAA,IACnF;AAAA,EACF;AACA,SAAO;AACT;AAcO,SAAS,sBACd,OAAiB,QAAQ,MACzB,WAAmB,QAAQ,UACF;AACzB,QAAM,WAAW,QAAQ,IAAI,kBAAkB,KAAK;AACpD,MAAI,UAAU;AACZ,WAAO,EAAE,SAAS,UAAU,MAAM,CAAC,UAAU,WAAW,EAAE;AAAA,EAC5D;AACA,QAAM,aAAa,KAAK,CAAC,IAAIA,OAAK,QAAQ,KAAK,CAAC,CAAC,IAAI;AACrD,MAAI,QAAQ,IAAI,sBAAsB;AACpC,WAAO,aACH,EAAE,SAAS,UAAU,MAAM,CAAC,YAAY,UAAU,WAAW,GAAG,mBAAmB,KAAK,IACxF,EAAE,SAAS,UAAU,MAAM,CAAC,UAAU,WAAW,GAAG,mBAAmB,KAAK;AAAA,EAClF;AACA,QAAM,gBAAgB,6BAA6B;AACnD,MAAI,cAAe,QAAO;AAC1B,MAAI,YAAY;AACd,WAAO,EAAE,SAAS,UAAU,MAAM,CAAC,YAAY,UAAU,WAAW,EAAE;AAAA,EACxE;AACA,SAAO,EAAE,SAAS,UAAU,MAAM,CAAC,UAAU,WAAW,EAAE;AAC5D;AASO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,UAAAC,YAAW,QAAQ;AACrB,GAGuF;AACrF,MAAIA,cAAa,YAAY,CAAC,aAAa;AACzC,WAAO,EAAE,WAAW,WAAW,2BAA2B,MAAM;AAAA,EAClE;AACA,MAAI,YAAY,SAAS,sBAAsB,GAAG;AAChD,WAAO,EAAE,WAAW,YAAY,2BAA2B,MAAM;AAAA,EACnE;AACA,SAAO,EAAE,WAAW,QAAQ,2BAA2B,KAAK;AAC9D;AAOO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAI2B;AACzB,QAAM,MAA8B;AAAA,IAClC,sBAAsB;AAAA,IACtB,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK;AAAA,EACpC;AACA,QAAM,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,WAAW,KAAK;AACjE,MAAI,KAAM,KAAI,YAAYD,OAAK,QAAQ,IAAI;AAC3C,QAAM,QAAQ,QAAQ,IAAI,qBAAqB,KAAK,KAAK,QAAQ,IAAI,iBAAiB,KAAK;AAC3F,MAAI,MAAO,KAAI,sBAAsB;AAOrC,MAAI,qBAAqB,QAAQ,IAAI,qBAAsB,KAAI,uBAAuB;AACtF,SAAO;AACT;AAIA,SAAS,UAAU,OAAuB;AACxC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKW;AACT,QAAM,cAAc,CAAC,WAAW,SAAS,GAAG,WAAW,IAAI,EACxD,IAAI,SAAO,eAAe,UAAU,GAAG,CAAC,WAAW,EACnD,KAAK,IAAI;AACZ,QAAM,aAAa,OAAO,QAAQ,GAAG,EAClC;AAAA,IACC,CAAC,CAAC,KAAK,KAAK,MAAM,YAAY,UAAU,GAAG,CAAC;AAAA,cAAuB,UAAU,KAAK,CAAC;AAAA,EACrF,EACC,KAAK,IAAI;AACZ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,YAKG,UAAU,KAAK,CAAC;AAAA;AAAA;AAAA,EAG1B,WAAW;AAAA;AAAA;AAAA;AAAA,EAIX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOA,UAAUA,OAAK,KAAK,QAAQ,wBAAwB,CAAC,CAAC;AAAA;AAAA,YAEtD,UAAUA,OAAK,KAAK,QAAQ,wBAAwB,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAMlE;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AACF,GAGW;AAIT,QAAM,QAAQ,CAAC,UAA2B,KAAK,KAAK,KAAK,IAAI,IAAI,KAAK,MAAM;AAC5E,QAAM,YAAY,CAAC,WAAW,SAAS,GAAG,WAAW,IAAI,EAAE,IAAI,KAAK,EAAE,KAAK,GAAG;AAC9E,QAAM,WAAW,OAAO,QAAQ,GAAG,EAChC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,eAAe,GAAG,IAAI,KAAK,EAAE,EACnD,KAAK,IAAI;AACZ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOG,SAAS;AAAA,EACnB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOV;AA0BA,SAAS,kBAA0B;AACjC,SAAOA,OAAK,KAAKD,IAAG,QAAQ,GAAG,WAAW,cAAc;AAC1D;AAEA,SAAS,iBAAyB;AAChC,QAAM,MAAM,QAAQ,IAAI,iBAAiB,KAAK;AAC9C,QAAM,OAAO,MAAMC,OAAK,QAAQ,GAAG,IAAIA,OAAK,KAAKD,IAAG,QAAQ,GAAG,SAAS;AACxE,SAAOC,OAAK,KAAK,MAAM,WAAW,MAAM;AAC1C;AAEA,eAAe,WAAW,SAAiB,MAA6C;AACtF,QAAM,EAAE,OAAO,IAAI,MAAM,cAAc,SAAS,IAAI;AACpD,SAAO,EAAE,QAAQ,OAAO,SAAS,EAAE;AACrC;AAmJO,SAAS,sBACdC,YAA4B,QAAQ,UACP;AAC7B,MAAIA,cAAa,SAAU,QAAO,IAAI,eAAe;AACrD,MAAIA,cAAa,QAAS,QAAO,IAAI,mBAAmB;AACxD,SAAO;AACT;AAtkBA,IAoBM,eAeO,+BAEA,eAEA,mBAGA,uBAEA,uBAEA,iBAiYP,gBA8EA;AA7fN;AAAA;AAAA;AAkBA;AAEA,IAAM,gBAAgB,UAAU,QAAQ;AAejC,IAAM,gCAAgC;AAEtC,IAAM,gBAAgB;AAEtB,IAAM,oBAAoB;AAG1B,IAAM,wBAAwB;AAE9B,IAAM,wBAAwB;AAE9B,IAAM,kBAAkB,IAAI,KAAK,KAAK;AAiY7C,IAAM,iBAAN,MAAqD;AAAA,MAC1C,OAAO;AAAA,MACP,aAAa;AAAA,MAEtB,WAAmB;AACjB,eAAOD,OAAK,KAAK,gBAAgB,GAAG,GAAG,aAAa,QAAQ;AAAA,MAC9D;AAAA,MAEA,OAAO,MAAoF;AACzF,eAAO,mBAAmB;AAAA,UACxB,OAAO;AAAA,UACP,YAAY,KAAK;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,QAAQA,OAAK,KAAK,qBAAqB,GAAG,MAAM;AAAA,QAClD,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,QAAQ,MAII;AAChB,QAAAL,WAAU,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,QAAAA,WAAUK,OAAK,KAAK,qBAAqB,GAAG,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACxE,yBAAiB,KAAK,SAAS,GAAG,KAAK,OAAO,IAAI,CAAC;AACnD,YAAI,KAAK,UAAW,OAAM,KAAK,MAAM;AAAA,MACvC;AAAA,MAEA,MAAM,QAAuB;AAE3B,YAAI;AACF,gBAAM,WAAW,aAAa,CAAC,QAAQ,MAAM,KAAK,SAAS,CAAC,CAAC;AAAA,QAC/D,QAAQ;AACN,gBAAM,WAAW,aAAa;AAAA,YAC5B;AAAA,YACA;AAAA,YACA,OAAO,QAAQ,SAAS,KAAK,EAAE,IAAI,aAAa;AAAA,UAClD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,MAAM,OAAsB;AAC1B,cAAM,WAAW,aAAa,CAAC,UAAU,MAAM,KAAK,SAAS,CAAC,CAAC;AAAA,MACjE;AAAA,MAEA,MAAM,UAAyB;AAC7B,YAAI;AACF,gBAAM,KAAK,KAAK;AAAA,QAClB,QAAQ;AAAA,QAER;AACA,cAAM,KAAK,MAAM;AAAA,MACnB;AAAA,MAEA,MAAM,YAA2B;AAC/B,YAAI;AACF,gBAAM,KAAK,KAAK;AAAA,QAClB,QAAQ;AAAA,QAER;AACA,YAAIN,aAAW,KAAK,SAAS,CAAC,EAAG,CAAAG,QAAO,KAAK,SAAS,CAAC;AAAA,MACzD;AAAA,MAEA,MAAM,SAAyC;AAC7C,cAAM,YAAYH,aAAW,KAAK,SAAS,CAAC;AAC5C,YAAI;AACF,gBAAM,EAAE,OAAO,IAAI,MAAM,WAAW,aAAa,CAAC,MAAM,CAAC;AACzD,gBAAM,OAAO,OAAO,MAAM,IAAI,EAAE,KAAK,SAAO,IAAI,SAAS,aAAa,CAAC;AACvE,cAAI,CAAC,KAAM,QAAO,EAAE,WAAW,SAAS,YAAY,YAAY,UAAU;AAE1E,gBAAM,MAAM,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,CAAC;AACtC,iBAAO,EAAE,WAAW,SAAS,OAAO,QAAQ,MAAM,YAAY,UAAU;AAAA,QAC1E,QAAQ;AACN,iBAAO,EAAE,WAAW,SAAS,UAAU;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAM,qBAAN,MAAyD;AAAA,MAC9C,OAAO;AAAA,MACP,aAAa,GAAG,iBAAiB;AAAA,MAE1C,WAAmB;AACjB,eAAOM,OAAK,KAAK,eAAe,GAAG,GAAG,iBAAiB,UAAU;AAAA,MACnE;AAAA,MAEA,OAAO,MAAoF;AACzF,eAAO,kBAAkB,IAAI;AAAA,MAC/B;AAAA,MAEA,MAAM,QAAQ,MAII;AAChB,QAAAL,WAAU,eAAe,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/C,yBAAiB,KAAK,SAAS,GAAG,KAAK,OAAO,IAAI,CAAC;AACnD,cAAM,WAAW,aAAa,CAAC,UAAU,eAAe,CAAC;AACzD,cAAM,WAAW,aAAa,CAAC,UAAU,UAAU,KAAK,UAAU,CAAC;AACnE,YAAI,KAAK,UAAW,OAAM,KAAK,MAAM;AAAA,MACvC;AAAA,MAEA,MAAM,QAAuB;AAC3B,cAAM,WAAW,aAAa,CAAC,UAAU,SAAS,KAAK,UAAU,CAAC;AAAA,MACpE;AAAA,MAEA,MAAM,OAAsB;AAC1B,cAAM,WAAW,aAAa,CAAC,UAAU,QAAQ,KAAK,UAAU,CAAC;AAAA,MACnE;AAAA,MAEA,MAAM,UAAyB;AAC7B,cAAM,WAAW,aAAa,CAAC,UAAU,WAAW,KAAK,UAAU,CAAC;AAAA,MACtE;AAAA,MAEA,MAAM,YAA2B;AAC/B,YAAI;AACF,gBAAM,KAAK,KAAK;AAChB,gBAAM,WAAW,aAAa,CAAC,UAAU,WAAW,KAAK,UAAU,CAAC;AAAA,QACtE,QAAQ;AAAA,QAER;AACA,YAAID,aAAW,KAAK,SAAS,CAAC,EAAG,CAAAG,QAAO,KAAK,SAAS,CAAC;AACvD,YAAI;AACF,gBAAM,WAAW,aAAa,CAAC,UAAU,eAAe,CAAC;AAAA,QAC3D,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,MAEA,MAAM,SAAyC;AAC7C,cAAM,YAAYH,aAAW,KAAK,SAAS,CAAC;AAC5C,YAAI;AACF,gBAAM,EAAE,OAAO,IAAI,MAAM,WAAW,aAAa,CAAC,UAAU,aAAa,KAAK,UAAU,CAAC;AACzF,iBAAO,EAAE,WAAW,SAAS,OAAO,KAAK,MAAM,WAAW,YAAY,UAAU;AAAA,QAClF,QAAQ;AAEN,iBAAO,EAAE,WAAW,SAAS,YAAY,YAAY,UAAU;AAAA,QACjE;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC1jBA,SAAS,mBAAAS,wBAAuB;AAazB,SAAS,uBAAuB,QAAgB,OAA8B;AACnF,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,QAAQ,KAAK,OAAO,EAAG,QAAO;AACnC,QAAM,QAAQ,OAAO,SAAS,SAAS,EAAE;AACzC,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,MAAO,QAAO;AACnE,SAAO,QAAQ;AACjB;AAMO,SAAS,uBACd,UACA,eACU;AACV,QAAMC,SAAQ,CAAC,sBAAsB,KAAK,aAAa,IAAI,IAAI,WAAW;AAC1E,WAAS,QAAQ,CAAC,SAAS,UAAU;AACnC,IAAAA,OAAM,KAAK,KAAK,QAAQ,CAAC,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAAI,GAAG;AAAA,EAChE,CAAC;AACD,SAAOA;AACT;AAcO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,QAAQ,QAAQ;AAAA,EAChB,SAAS,QAAQ;AACnB,GAA+D;AAC7D,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,QAAQ;AAAA,MACb,IAAI,MAAM,+DAA+D;AAAA,IAC3E;AAAA,EACF;AAEA,QAAM,KAAKD,iBAAgB,EAAE,OAAO,OAAO,CAAC;AAC5C,QAAM,MAAM,CAAC,aACX,IAAI,QAAQ,aAAW,GAAG,SAAS,UAAU,OAAO,CAAC;AAEvD,QAAM,MAAM,YAA+C;AACzD,WAAO,MAAM;AACX,aAAO,MAAM;AAAA,EAAK,uBAAuB,UAAU,aAAa,EAAE,KAAK,IAAI,CAAC;AAAA,CAAI;AAChF,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,kDAAqD,SAAS,MAAM;AAAA,MACtE;AACA,UAAI,OAAO,KAAK,EAAE,YAAY,MAAM,IAAK,QAAO;AAChD,YAAM,QAAQ,uBAAuB,QAAQ,SAAS,MAAM;AAC5D,UAAI,UAAU,KAAM,QAAO,SAAS,KAAK,KAAK;AAC9C,aAAO,MAAM,gCAAgC,SAAS,MAAM;AAAA,CAAK;AAAA,IACnE;AAAA,EACF;AAEA,SAAO,IAAI,EAAE,QAAQ,MAAM,GAAG,MAAM,CAAC;AACvC;AA9EA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,cAAAC,cAAY,aAAAC,aAAW,gBAAAC,gBAAc,UAAAC,SAAQ,iBAAAC,sBAAqB;AAC3E,OAAOC,YAAU;AAWjB,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AACF,GAGW;AACT,QAAM,MAAMN,YAAW,QAAQ,EAC5B,OAAO,GAAGM,OAAK,QAAQ,gBAAgB,CAAC,KAAK,SAAS,EAAE,EACxD,OAAO,KAAK;AACf,SAAOA,OAAK,KAAK,qBAAqB,GAAG,yBAAyB,GAAG;AACvE;AAGO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,GAGuB;AACrB,MAAI;AACF,UAAM,WAAW,oBAAoB,EAAE,WAAW,iBAAiB,CAAC;AACpE,QAAI,CAACL,aAAW,QAAQ,EAAG,QAAO;AAClC,UAAM,MAAM,KAAK,MAAME,eAAa,UAAU,MAAM,CAAC;AACrD,WAAO,OAAO,IAAI,eAAe,YAAY,IAAI,WAAW,KAAK,IAC7D,IAAI,WAAW,KAAK,IACpB;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,MAAI;AACF,UAAM,UAAU,WAAW,KAAK;AAChC,QAAI,CAAC,QAAS;AACd,UAAM,WAAW,oBAAoB,EAAE,WAAW,iBAAiB,CAAC;AACpE,IAAAD,YAAUI,OAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,IAAAD;AAAA,MACE;AAAA,MACA,KAAK,UAAU,EAAE,YAAY,SAAS,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AAAA,MAC3E,EAAE,MAAM,IAAM;AAAA,IAChB;AAAA,EACF,QAAQ;AAAA,EAGR;AACF;AAGO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAGS;AACP,MAAI;AACF,UAAM,WAAW,oBAAoB,EAAE,WAAW,iBAAiB,CAAC;AACpE,QAAIJ,aAAW,QAAQ,EAAG,CAAAG,QAAO,QAAQ;AAAA,EAC3C,QAAQ;AAAA,EAGR;AACF;AAvFA;AAAA;AAAA;AAIA;AAAA;AAAA;;;ACJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAS,cAAAG,cAAY,gBAAAC,sBAAoB;AACzC,OAAOC,SAAQ;AACf,OAAOC,YAAU;AAgFjB,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,QAAM,SAASC,UAAS,QAAQ;AAChC,MAAI,OAAO,OAAO,OAAO,SAAU;AACnC,mBAAiB;AAAA,IACf,eAAe;AAAA,IACf;AAAA,IACA,YAAY,OAAO;AAAA,IACnB,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,IAC3E,mBACE,OAAO,OAAO,sBAAsB,WAAW,OAAO,oBAAoB;AAAA,IAC5E,WAAW,OAAO,cAAc;AAAA,EAClC,CAAC;AACH;AAGA,SAAS,sBAAsB,OAAoC;AACjE,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,GAAI,QAAO,CAAC;AAC9D,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,QAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,WAAO,OAAO;AAAA,MACZ,CAAC,UACC,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA2B,aAAa;AAAA,IACpD;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGA,SAAS,0BACP,OACA,OACoB;AACpB,QAAM,WAAW,MAAM,sBAAsB;AAC7C,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,MACJ,aAAa,MACR,SAAS,MACT,MAAM;AACL,UAAI;AACF,eAAOH,eAAa,UAAU,MAAM;AAAA,MACtC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,GAAG;AACT,WAAO,sBAAsB,GAAG;AAAA,EAClC;AACA,SAAO,sBAAsB,MAAM,sBAAsB,CAAC;AAC5D;AAEA,SAAS,iCAAiC;AAAA,EACxC;AAAA,EACA;AACF,GAGS;AACP,SAAO,MAAM,sBAAsB;AACnC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,MAAM,sBAAsB;AACnC;AAAA,EACF;AACA,QAAM,sBAAsB,IAAI,KAAK,UAAU,KAAK;AACtD;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,MAAI,OAAO,MAAM,2BAA2B,MAAM,UAAU;AAC1D,eAAW,2BAA2B,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC;AACzE,WAAO,MAAM,2BAA2B;AACxC;AAAA,EACF;AACA,QAAM,2BAA2B,IAAI,KAAK,UAAU,OAAO;AAC3D,SAAO,MAAM,2BAA2B;AAC1C;AAEA,SAAS,eAAe,OAA2B;AACjD,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,GAAI,QAAO,CAAC;AAC9D,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAAA,EAC3C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,oBAAoB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKuB;AACrB,QAAM,WAAW,MAAM,QAAQ;AAC/B,MAAI,OAAO,aAAa,UAAU;AAChC,QAAI,WAAW,QAAQ,MAAM,OAAW,QAAO,WAAW,QAAQ;AAClE,QAAI;AACF,aAAOA,eAAa,UAAU,MAAM;AAAA,IACtC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,OAAO,MAAM,QAAQ,MAAM,WAAW,MAAM,QAAQ,IAAI;AACjE;AAEA,SAAS,8BAA8B;AAAA,EACrC;AAAA,EACA;AACF,GAG2B;AACzB,QAAM,SAAS;AAAA,IACb,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,EAAE,OAAO,CAAC,UAAyC,OAAO,UAAU,YAAY,UAAU,IAAI;AAE9F,QAAM,aAAa,oBAAoB;AAAA,IACrC;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,UAAU;AAAA,EACZ,CAAC;AACD,MAAI,oBAA4C,CAAC;AACjD,MAAI,YAAY;AACd,QAAI;AACF,YAAM,UAAU,KAAK,MAAM,UAAU;AACrC,0BAAoB,MAAM,QAAQ,QAAQ,gBAAgB,IACtD,QAAQ,iBAAiB;AAAA,QACvB,CAAC,UAAyC,OAAO,UAAU,YAAY,UAAU;AAAA,MACnF,IACA,CAAC;AAAA,IACP,QAAQ;AACN,0BAAoB,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,mBAAmB,GAAG,MAAM;AACzC;AAEA,SAAS,cAAc,WAAyC;AAC9D,UAAQ,UAAU,aAAa,UAAU,YAAY,IAAI,QAAQ,OAAO,GAAG,EAAE,KAAK;AACpF;AAEA,SAAS,8BAA8B;AAAA,EACrC;AAAA,EACA;AACF,GAGyB;AACvB,SAAO;AAAA,IACL,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,EAAE,OAAO,CAAC,UAAuC,OAAO,UAAU,YAAY,UAAU,IAAI;AAC9F;AAEA,SAAS,kBAAkB,OAAmC;AAC5D,UAAQ,MAAM,aAAa,MAAM,YAAY,IAAI,QAAQ,OAAO,GAAG,EAAE,KAAK;AAC5E;AAQA,SAAS,yBAAyB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,CAAC;AAChB,GAOS;AACP,QAAM,gBACJ,eAAe,cACd,MAAM,mBAAmB,MAAM,QAAQ,MAAM,mBAAmB,MAAM;AACzE,QAAM,QAAQ,gBAAgB,EAAE,kBAAkB,UAAU,CAAC;AAM7D,MAAI,eAAe,WAAW;AAC5B,UAAM,6BAA6B,IAAI,KAAK;AAAA,MAC1C,iBAAiB,gBAAgB,EAAE,IAAI,WAAS,MAAM,QAAQ;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,eAAe;AACjB,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ;AAAA,QACN,uDAAuD,MAAM,MAAM,kCAAkC,MAClG,IAAI,WAAS,MAAM,QAAQ,EAC3B,KAAK,IAAI,CAAC;AAAA,MACf;AAAA,IACF;AACA,WAAO,MAAM,sBAAsB;AACnC,WAAO,MAAM,sBAAsB;AACnC;AAAA,EACF;AAEA,QAAM,qBAAqB,0BAA0B,SAAS,0BAA0B;AACxF,MAAI,eAAe,YAAY,CAAC,mBAAoB;AAEpD,QAAM,WAAW,0BAA0B,OAAO,KAAK;AACvD,QAAM,SACJ,eAAe,YACX,CAAC,GAAG,UAAU,GAAG,KAAK,EAAE;AAAA,IACtB,CAAC,OAAO,OAAO,QAAQ,IAAI,UAAU,UAAQ,KAAK,aAAa,MAAM,QAAQ,MAAM;AAAA,EACrF,IACA;AACN,QAAM,aAAa,6BAA6B;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,OAAO,OAAO,IAAI,YAAU;AAAA,MAC1B,UAAU,MAAM;AAAA,MAChB,WAAW,MAAM,aAAa;AAAA,IAChC,EAAE;AAAA,EACJ,CAAC;AAED,QAAM,mBAAmB,WAAW,OAAO,WAAS,MAAM,gBAAgB,SAAS;AACnF,QAAM,mBAAmB,WAAW,OAAO,WAAS,MAAM,gBAAgB,WAAW;AAErF,MAAI,eAAe,aAAa,iBAAiB,SAAS,GAAG;AAC3D,YAAQ;AAAA,MACN,uBAAuB,iBAAiB,MAAM,wDACzC,iBACA;AAAA,QAAI,WACH,MAAM,qBAAqB,SACvB,GAAG,MAAM,QAAQ,KAAK,MAAM,oBAAoB,KAAK,IAAI,CAAC,MAC1D,MAAM;AAAA,MACZ,EACC,KAAK,IAAI,CAAC;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,eAAe,aAAa,iBAAiB,SAAS,GAAG;AAC3D,YAAQ;AAAA,MACN,cAAc,iBAAiB,MAAM,oJAEhC,iBAAiB,IAAI,WAAS,MAAM,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA,IAC/D;AAAA,EACF;AAKA,QAAM,eAAe,WAClB,OAAO,WAAS,MAAM,gBAAgB,SAAS,EAC/C,IAAI,YAAU;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,WAAW,MAAM;AAAA,IACjB,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,IAC9D,GAAI,MAAM,qBAAqB,SAC3B,EAAE,qBAAqB,MAAM,oBAAoB,IACjD,CAAC;AAAA,EACP,EAAE;AAEJ,QAAM,cACJ,eAAe,YAAY,8BAA8B,EAAE,OAAO,WAAW,CAAC,IAAI,CAAC;AACrF,QAAM,iBACJ,eAAe,YACX,IAAI;AAAA,IACF,8BAA8B,EAAE,OAAO,WAAW,CAAC,EAAE,IAAI,aAAa,EAAE,OAAO,OAAO;AAAA,EACxF,IACA,oBAAI,IAAY;AACtB,QAAM,aAAa,oBAAI,IAAgC;AACvD,MAAI,eAAe,WAAW;AAC5B,eAAW,SAAS,aAAa;AAC/B,YAAM,WAAW,kBAAkB,KAAK;AACxC,UAAI,CAAC,SAAU;AACf,iBAAW,IAAI,UAAU,KAAK;AAAA,IAChC;AAAA,EACF;AACA,MAAI,eAAe,WAAW;AAC5B,eAAW,SAAS,kBAAkB;AACpC,YAAM,WAAW,MAAM;AACvB,UAAI,eAAe,IAAI,QAAQ,EAAG;AAClC,UAAI,WAAW,IAAI,QAAQ,EAAG;AAC9B,YAAM,eACJ,MAAM,uBAAuB,MAAM,oBAAoB,SAAS,IAC5D,MAAM,oBAAoB,KAAK,IAAI,IACnC;AACN,iBAAW,IAAI,UAAU;AAAA,QACvB,WAAW;AAAA,QACX,QAAQ,iCAAiC,YAAY;AAAA,MACvD,CAAC;AAAA,IACH;AACA,QAAI,WAAW,OAAO,GAAG;AACvB,mCAA6B;AAAA,QAC3B;AAAA,QACA;AAAA,QACA,SAAS,MAAM,KAAK,WAAW,OAAO,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YACJ,eAAe,YACX,IAAI,IAAI,MAAM,KAAK,WAAW,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,IACrD,oBAAI,IAAY;AACtB,QAAM,WACJ,UAAU,OAAO,IACb,aAAa,OAAO,WAAS,CAAC,UAAU,IAAI,MAAM,QAAQ,CAAC,IAC3D;AAEN,mCAAiC,EAAE,OAAO,OAAO,SAAS,CAAC;AAC7D;AAEA,SAAS,2BAA2B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKS;AACP,QAAM,eAAe,0BAA0B,OAAO,WAAW,sBAAsB,CAAC,EAAE;AAAA,IACxF,YAAU;AAAA,MACR,UAAU,MAAM;AAAA,MAChB,WAAW,MAAM,aAAa;AAAA,IAChC;AAAA,EACF;AACA,MAAI,aAAa,WAAW,EAAG;AAE/B,QAAM,qBAAqB,8BAA8B,EAAE,OAAO,WAAW,CAAC;AAC9E,QAAM,UAAU,IAAI,IAAI,mBAAmB,IAAI,aAAa,EAAE,OAAO,OAAO,CAAC;AAC7E,QAAM,SAAS,+BAA+B;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT,CAAC,EAAE,OAAO,WAAS,CAAC,QAAQ,IAAI,MAAM,SAAS,CAAC;AAChD,MAAI,OAAO,WAAW,EAAG;AAEzB,QAAM,SAAS,CAAC,GAAG,oBAAoB,GAAG,MAAM;AAChD,MAAI,OAAO,MAAM,0BAA0B,MAAM,UAAU;AACzD,eAAW,0BAA0B,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACzE,OAAO;AACL,UAAM,0BAA0B,IAAI,KAAK,UAAU,MAAM;AAAA,EAC3D;AAEA,UAAQ;AAAA,IACN,wBAAwB,OAAO,MAAM;AAAA,EACvC;AACF;AAQA,SAAS,mBAAmB,MAAgB,MAAwB;AAClE,QAAM,SAAmB,CAAC;AAC1B,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,QAAI,KAAK,KAAK,MAAM,KAAM;AAC1B,UAAM,QAAQ,KAAK,QAAQ,CAAC;AAC5B,QAAI,UAAU,QAAW;AACvB,aAAO,KAAK,KAAK;AACjB,eAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,8BAA8B;AAAA,EAC3C;AAAA,EACA;AACF,GAGoC;AAClC,MAAI,YAAY,OAAO,eAAe,GAAG;AACvC,WAAO,EAAE,kBAAkB,KAAK;AAAA,EAClC;AAEA,QAAM,WAAW,UAAU,OAAO,YAAY;AAC9C,MAAI,UAAU;AACZ,QAAI;AACF,YAAM,UAAU,MAAM,qBAAqB,EAAE,SAAS,QAAQ,QAAQ,CAAC;AACvE,aAAO;AAAA,QACL,kBAAkB;AAAA,QAClB,yBAAyB,QAAQ;AAAA,QACjC,qBAAqB,QAAQ;AAAA,MAC/B;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,kBAAkB,SAAS;AAAA,IACtC;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,qBAAqB,EAAE,SAAS,QAAQ,QAAQ,CAAC;AACvE,WAAO,gCAAgC,OAAO;AAAA,EAChD,QAAQ;AACN,WAAO,EAAE,kBAAkB,KAAK;AAAA,EAClC;AACF;AAEA,SAASG,UAAS,OAA4B;AAC5C,SAAO,SAAS,OAAO,UAAU,WAAY,QAAuB,CAAC;AACvE;AAEA,eAAe,oCAAoC,SAAuC;AACxF,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,QAAQ,IAAyB,sBAAsB;AACtF,WAAO,SAAS,oCAAoC;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,qBAAqB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKkB;AAChB,MAAI,CAAC,iBAAkB;AACvB,QAAM,QAAQ,QAAQ,KAAK;AAAA,IACzB,MAAM,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,IACpD,MAAM,EAAE,WAAW,aAAa,MAAM,iBAAiB;AAAA,EACzD,CAAC;AACH;AAEA,SAAS,iBAAiB,SAAsC;AAC9D,QAAM,aAAaA,UAAS,OAAO,EAAE;AACrC,MAAI,CAAC,MAAM,QAAQ,UAAU,EAAG,QAAO;AACvC,QAAM,QAAQ,WAAW,CAAC;AAC1B,QAAM,KAAKA,UAAS,KAAK,EAAE;AAC3B,SAAO,OAAO,OAAO,WAAW,KAAK;AACvC;AAGA,SAAS,sBAAsB,SAAsC;AACnE,QAAM,aAAaA,UAAS,OAAO,EAAE;AACrC,MAAI,CAAC,MAAM,QAAQ,UAAU,EAAG,QAAO;AACvC,QAAM,mBAAmB,CAAC,aAAa,aAAa,aAAa,OAAO;AACxE,aAAW,SAAS,kBAAkB;AACpC,UAAM,QAAQ,WAAW,KAAK,eAAaA,UAAS,SAAS,EAAE,UAAU,KAAK;AAC9E,UAAM,KAAKA,UAAS,KAAK,EAAE;AAC3B,QAAI,OAAO,OAAO,SAAU,QAAO;AAAA,EACrC;AACA,SAAO,iBAAiB,OAAO;AACjC;AAGA,SAAS,uBAAuB,SAAkB,aAAyC;AACzF,QAAM,aAAaA,UAAS,OAAO,EAAE;AACrC,MAAI,CAAC,MAAM,QAAQ,UAAU,EAAG,QAAO;AACvC,QAAM,QAAQ,WAAW,KAAK,eAAaA,UAAS,SAAS,EAAE,OAAO,WAAW;AACjF,QAAM,QAAQA,UAAS,KAAK,EAAE;AAC9B,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,iBAAiB,SAA0B;AAClD,QAAM,SAASA,UAAS,OAAO;AAC/B,SAAO,OAAO,OAAO,cAAc,WAC/B,OAAO,YACP,OAAO,OAAO,OAAO,WACnB,OAAO,KACP;AACR;AA+BA,eAAsB,0BAA0B;AAAA,EAC9C;AAAA,EACA;AACF,GAGoE;AAClE,QAAM,aAAa,oBAAoB,OAAO,UAAQ,UAAU,OAAO,IAAI,MAAM,GAAG;AACpF,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,IAAI,SAAS;AAAA,MACjB,SACE,6EACG,WAAW,KAAK,IAAI,CAAC;AAAA,IAE5B,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,QAAM,gBAAgB,MAAc;AAClC,QAAI,iBAAiB,OAAW,QAAO;AACvC,QAAI,UAAU,QAAW;AACvB,qBAAe;AAAA,IACjB,WAAW,QAAQ,MAAM,OAAO;AAC9B,qBAAe;AAAA,IACjB,OAAO;AACL,qBAAeH,eAAa,GAAG,MAAM;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAqC,CAAC;AAC5C,MAAI;AAEJ,aAAW,YAAY,qBAAqB;AAC1C,UAAM,WAAW,UAAU,OAAO,QAAQ;AAC1C,QAAI,CAAC,SAAU;AACf,QAAI,aAAa,KAAK;AACpB,YAAM,UAAU,cAAc;AAC9B,iBAAW,QAAQ,IAAI;AACvB,qBAAe;AAAA,IACjB,OAAO;AACL,iBAAW,QAAQ,IAAIA,eAAa,UAAU,MAAM;AAAA,IACtD;AAAA,EACF;AAIA,MAAI,iBAAiB,UAAa,UAAU,UAAa,OAAO,KAAK,UAAU,EAAE,WAAW,GAAG;AAC7F,mBAAe;AAAA,EACjB;AAEA,SAAO,EAAE,YAAY,OAAO,aAAa;AAC3C;AAEA,eAAe,kBAAkB,SAAqB,UAAoC;AACxF,MAAI,SAAU,QAAO;AACrB,QAAM,WAAW,MAAM,QAAQ,QAAQ,IAAe,eAAe;AACrE,QAAM,QAAQ,SAAS,CAAC;AACxB,QAAM,KAAKG,UAAS,KAAK,EAAE;AAC3B,MAAI,OAAO,OAAO,UAAU;AAC1B,UAAM,IAAI,SAAS,EAAE,SAAS,2DAA2D,CAAC;AAAA,EAC5F;AACA,SAAO;AACT;AAEA,eAAsB,mBAAmB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAMkB;AAChB,QAAM,SAAS,UAAU,IAAI;AAC7B,MAAI,eAAe,UAAU,eAAe,YAAY,eAAe,MAAM;AAC3E,sBAAkB,EAAE,eAAe,CAAC;AACpC;AAAA,EACF;AAEA,4BAA0B,EAAE,OAAO,OAAO,MAAM,CAAC;AAEjD,QAAM,mBAAmB,QAAQ,IAAI;AACrC,QAAM,YAAY,UAAU,OAAO,OAAO,cAAc,KAAK,OAAO,WAAW,CAAC;AAChF,QAAM,QAAQ,OAAO,YAAY,OAAO,KAAK;AAC7C,MACE,eAAe,YACf,OAAO,MAAM,wBAAwB,MAAM,YAC3C,QAAQ,IAAI,+BACZ;AACA,UAAM,wBAAwB,IAAI,QAAQ,IAAI;AAAA,EAChD;AACA,QAAM,EAAE,YAAY,OAAO,cAAc,IAAI,MAAM,0BAA0B;AAAA,IAC3E,OAAO,OAAO;AAAA,IACd;AAAA,EACF,CAAC;AAMD,MAAI,eAAe,kBAAkB;AACnC,UAAM,kBACJ,UAAU,OAAO,OAAO,cAAc,KACtC,QAAQ,IAAI,cACZ,QAAQ,IAAI;AAId,UAAM,aAAa,UAAU,QAAQ,MAAM,QAAQ,KAAKH,eAAa,GAAG,MAAM;AAC9E,UAAMI,UAAS,yBAAyB;AAAA,MACtC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AACD,cAAUA,OAAM;AAChB;AAAA,EACF;AAMA,MAAI,eAAe,WAAW;AAC5B,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,SAAS,EAAE,SAAS,iDAAiD,CAAC;AAAA,IAClF;AACA,UAAM,aAAa,6BAA6B;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,OAAO,iBAAiB,gBAAgB;AAAA,IAC1C,CAAC;AACD,UAAM,OAAO,WAAW;AAAA,MACtB,WAAS,MAAM,gBAAgB,UAAU,MAAM,gBAAgB;AAAA,IACjE;AACA,UAAM,UAAU,WAAW,OAAO,WAAS,MAAM,gBAAgB,SAAS;AAC1E,UAAM,YAAY,WAAW,OAAO,WAAS,MAAM,gBAAgB,WAAW;AAC9E,UAAM,kBAAkB,+BAA+B;AAAA,MACrD;AAAA,MACA;AAAA,MACA,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS;AAAA,IAC/B,CAAC;AACD,UAAM,4BAA4B,QAAQ,IAAI,YAAU;AAAA,MACtD,WAAW,MAAM;AAAA,MACjB,QAAQ,iCACN,MAAM,qBAAqB,SACvB,MAAM,oBAAoB,KAAK,IAAI,IACnC,wBACN;AAAA,IACF,EAAE;AACF,cAAU,EAAE,MAAM,SAAS,WAAW,iBAAiB,0BAA0B,CAAC;AAClF;AAAA,EACF;AAKA,MACE,wBAAwB,IAAI,UAAU,KACtC,cACC,OAAO,MAAM,eAAe,MAAM,YAAY,MAAM,eAAe,EAAE,KAAK,MAAM,KACjF;AACA,UAAM,SAAS,qBAAqB,EAAE,WAAW,iBAAiB,CAAC;AACnE,QAAI,OAAQ,OAAM,eAAe,IAAI;AAAA,EACvC;AAEA,uBAAqB,EAAE,iBAAiB,CAAC;AAIzC,OAAK,eAAe,aAAa,eAAe,aAAa,WAAW;AACtE,6BAAyB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,WAAW,sBAAsB,KAAK;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,eAAe,aAAa,WAAW;AACzC,+BAA2B;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,eAAe,sBAAsB,CAAC,qBAAqB,QAAQ,QAAQ,OAAO,GAAG;AACvF,UAAM,YAAY,MAAM,wBAAwB;AAAA,MAC9C,SAAS,QAAQ;AAAA,MACjB,kBAAkB,UAAU,OAAO,OAAO,aAAa,KAAK;AAAA,MAC5D,WAAW,UAAU,OAAO,OAAO,cAAc;AAAA,IACnD,CAAC;AACD,cAAU,SAAS;AACnB;AAAA,EACF;AAEA,OACG,eAAe,YACd,eAAe,kBACf,eAAe,uBACjB,OAAO,MAAM,uBAAuB,MAAM,UAC1C;AACA,UAAM,oBAAoB,MAAM,kCAAkC,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAC9F,QAAI,mBAAmB;AACrB,YAAM,uBAAuB,IAAI;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,QAAQ,QAAQ,KAAc;AAAA,IACjD,MAAM,iBAAiB,mBAAmB,UAAU,CAAC;AAAA,IACrD,MAAM;AAAA,MACJ;AAAA,MACA,YAAY,OAAO;AAAA,MACnB;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,mBACE,UAAU,OAAO,OAAO,uBAAuB,KAC/C,uBAAuB;AAAA,QACrB,UAAU;AAAA,QACV,OAAO,UAAU,OAAO,OAAO,SAAS,KAAK;AAAA,QAC7C,WAAW,UAAU,OAAO,OAAO,cAAc,KAAK;AAAA,QACtD;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACF,CAAC;AAID,OAAK,eAAe,YAAY,eAAe,uBAAuB,WAAW;AAC/E,kBAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA,OAAO,iBAAiB,gBAAgB;AAAA,IAC1C,CAAC;AACD,sBAAkB,EAAE,kBAAkB,UAAU,CAAC;AACjD,wBAAoB,EAAE,kBAAkB,UAAU,CAAC;AAAA,EACrD;AAEA,QAAM,eAAeD,UAAS,MAAM;AACpC,MAAI,OAAO,aAAa,eAAe,UAAU;AAC/C,kBAAc,EAAE,aAAa,aAAa,WAAW,CAAC;AAGtD,QAAI,WAAW;AACb,4BAAsB,EAAE,WAAW,kBAAkB,YAAY,aAAa,WAAW,CAAC;AAI1F,UAAI,eAAe,YAAY,eAAe,oBAAoB;AAChE,2BAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA,YAAY,aAAa;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,eAAe,aAAa,WAAW;AACzC,0BAAsB,EAAE,WAAW,iBAAiB,CAAC;AACrD,wBAAoB,EAAE,kBAAkB,UAAU,CAAC;AAQnD,UAAM,4BAA4BJ,aAAWG,OAAK,KAAKD,IAAG,QAAQ,GAAG,SAAS,CAAC;AAC/E,QACE,6BACA,CAAC,mBAAmB,EAAE,kBAAkB,UAAU,CAAC,KACnD,iBAAiB,gBAAgB,EAAE,SAAS,GAC5C;AACA,YAAM,UACJ,yEAAyE,SAAS,OAC/E,gBAAgB;AAGrB,cAAQ,MAAM,OAAO;AACrB,YAAM,qBACJ,OAAO,MAAM,eAAe,MAAM,WAAW,MAAM,eAAe,IAAI;AACxE,UAAI,oBAAoB;AACtB,YAAI;AACF,gBAAM,QAAQ,QAAQ,KAAK;AAAA,YACzB,MAAM;AAAA,YACN,MAAM;AAAA,cACJ,MAAM,CAAC;AAAA,cACP,YAAY,CAAC;AAAA,cACb,OAAO;AAAA,gBACL,gBAAgB;AAAA,gBAChB,iBAAiB;AAAA,gBACjB,gBAAgB;AAAA,gBAChB,aAAa;AAAA,cACf;AAAA,cACA,OAAO;AAAA,cACP,YAAY,CAAC;AAAA,YACf;AAAA,UACF,CAAC;AAAA,QACH,QAAQ;AAAA,QAGR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,OAAO,aAAa,cAAc,UAAU;AAC9C,kBAAc,EAAE,YAAY,aAAa,UAAU,CAAC;AAAA,EACtD;AAIA,MAAI,eAAe,2BAA2B;AAC5C,UAAM,SAAS,aAAa;AAC5B,QAAI,OAAO,WAAW,YAAY,OAAO,WAAW,GAAG,GAAG;AACxD,gBAAU,EAAE,GAAG,cAAc,KAAK,GAAG,QAAQ,QAAQ,OAAO,GAAG,MAAM,GAAG,CAAC;AACzE;AAAA,IACF;AAAA,EACF;AACA,MAAI,eAAe,qBAAqB,MAAM,QAAQ,MAAM,GAAG;AAC7D,UAAM,UAAU,QAAQ,QAAQ;AAChC,UAAM,WAAW,OAAO,IAAI,WAAS;AACnC,YAAM,MAAME,UAAS,KAAK;AAC1B,YAAM,SAAS,IAAI;AACnB,aAAO,OAAO,WAAW,YAAY,OAAO,WAAW,GAAG,IACtD,EAAE,GAAG,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,IACrC;AAAA,IACN,CAAC;AACD,cAAU,QAAQ;AAClB;AAAA,EACF;AAEA,YAAU,MAAM;AAClB;AAEA,eAAsB,qBAAqB;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,GAIkB;AAChB,MAAI,CAAC,QAAS,OAAM,IAAI,SAAS,EAAE,SAAS,+BAA+B,OAAO,GAAG,CAAC;AAEtF,QAAM,SAAS,UAAU,IAAI;AAC7B,QAAM,OAAO,YAAY,OAAO,OAAO,QAAQ;AAE/C,UAAQ,SAAS;AAAA,IACf,KAAK,kBAAkB;AACrB,YAAM,OAAO,UAAU,OAAO,OAAO,QAAQ,KAAK,OAAO,WAAW,KAAK,GAAG;AAC5E,UAAI,CAAC,KAAM,OAAM,IAAI,SAAS,EAAE,SAAS,iBAAiB,CAAC;AAC3D,YAAM,UAAU,MAAM,QAAQ,QAAQ,KAAc;AAAA,QAClD,MAAM;AAAA,QACN,MAAM,EAAE,KAAK;AAAA,MACf,CAAC;AACD,YAAM,YAAYA,UAAS,OAAO,EAAE;AACpC,UAAI,CAAC,YAAY,OAAO,OAAO,gBAAgB,KAAK,OAAO,cAAc,UAAU;AACjF,cAAM,YAAY,UAAU,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI;AACxE,cAAM,WAAW,MAAM,QAAQ,QAAQ,KAAK;AAAA,UAC1C,MAAM,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,UACpD,MAAM;AAAA,YACJ,eAAe;AAAA,YACf,WAAW;AAAA,UACb;AAAA,QACF,CAAC;AACD,qCAA6B,EAAE,WAAW,WAAW,SAAS,CAAC;AAAA,MACjE;AACA,UAAI,KAAM,WAAU,EAAE,QAAQ,CAAC;AAAA;AAE7B,gBAAQ;AAAA,UACN,mBAAmBA,UAAS,OAAO,EAAE,QAAQ,IAAI,KAAK,aAAa,SAAS;AAAA,QAC9E;AACF;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,mBAAmB,EAAE,SAAS,OAAO,CAAC;AAC5C;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,YAAM,YAAY,UAAU,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI;AACxE,YAAM,sBAAsB;AAAA,QAC1BD,OAAK,KAAK,WAAW,aAAa,cAAc;AAAA,MAClD;AACA,YAAM,cAAc,UAAU,OAAO,OAAO,OAAO,KAAK,qBAAqB;AAC7E,UAAI,YAAY,UAAU,OAAO,OAAO,cAAc;AACtD,UAAI,CAAC,WAAW;AACd,cAAM,WACJ,MAAM,QAAQ,QAAQ;AAAA,UACpB;AAAA,QACF;AACF,YAAI,SAAS,WAAW,GAAG;AACzB,gBAAM,IAAI,SAAS;AAAA,YACjB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AACA,YAAI,QAAQ,MAAM,OAAO;AACvB,gBAAM,SAAS,MAAM,iBAAiB,EAAE,UAAU,eAAe,UAAU,CAAC;AAC5E,cAAI,CAAC,QAAQ;AACX,oBAAQ,IAAI,6BAA6B;AACzC;AAAA,UACF;AACA,sBAAY,OAAO;AAAA,QACrB,OAAO;AACL,sBAAY,SAAS,CAAC,GAAG;AAAA,QAC3B;AAAA,MACF;AACA,UAAI,CAAC,UAAW,OAAM,IAAI,SAAS,EAAE,SAAS,uBAAuB,CAAC;AACtE,YAAM,WAAW,MAAM,QAAQ,QAAQ,KAAK;AAAA,QAC1C,MAAM,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,QACpD,MAAM;AAAA,UACJ,eAAe;AAAA,UACf,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,UACrC,WAAW,UAAU,OAAO,OAAO,WAAW,MAAM;AAAA,QACtD;AAAA,MACF,CAAC;AACD,mCAA6B,EAAE,WAAW,WAAW,SAAS,CAAC;AAC/D,UAAI,KAAM,WAAU,EAAE,SAAS,CAAC;AAAA,UAC3B,SAAQ,IAAI,UAAU,SAAS,eAAe,SAAS,EAAE;AAC9D;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,YAAM,YAAY,UAAU,OAAO,OAAO,OAAO;AACjD,UAAI,CAAC,UAAW,OAAM,IAAI,SAAS,EAAE,SAAS,0BAA0B,CAAC;AACzE,YAAM,YAAY,UAAU,OAAO,OAAO,cAAc;AACxD,UAAI,CAAC,UAAW,OAAM,IAAI,SAAS,EAAE,SAAS,0CAA0C,CAAC;AACzF,YAAM,WAAW,MAAM,QAAQ,QAAQ,KAAK;AAAA,QAC1C,MAAM,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,QACpD,MAAM;AAAA,UACJ;AAAA,UACA,aAAa,UAAU,OAAO,OAAO,OAAO;AAAA,UAC5C,WAAW,UAAU,OAAO,OAAO,WAAW,MAAM;AAAA,QACtD;AAAA,MACF,CAAC;AACD,UAAI,KAAM,WAAU,EAAE,SAAS,CAAC;AAAA,UAC3B,SAAQ,IAAI,UAAU,SAAS,eAAe,SAAS,EAAE;AAC9D;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,UAAU;AACb,YAAM,iBAAiB,UAAU,OAAO,OAAO,mBAAmB;AAClE,YAAM,YACJ,OAAO,WAAW,KAAK,GAAG,KAC1B,UAAU,OAAO,OAAO,aAAa,KACrC,UAAU,OAAO,OAAO,UAAU;AACpC,YAAM,YAAY,MAAM,kBAAkB,SAAS,UAAU,OAAO,OAAO,cAAc,CAAC;AAC1F,YAAM,aAAa,iBACd,KAAK,MAAM,cAAc,IAM1B,YACE;AAAA,QACE;AAAA,UACE;AAAA,UACA,OAAO,UAAU,OAAO,OAAO,SAAS,KAAK;AAAA,UAC7C,GAAI,UAAU,OAAO,OAAO,YAAY,IACpC,EAAE,aAAa,UAAU,OAAO,OAAO,YAAY,EAAE,IACrD,CAAC;AAAA,QACP;AAAA,MACF,IACA,CAAC;AACP,YAAM,QAAQ,WAAW,CAAC;AAC1B,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,SAAS;AAAA,UACjB,SAAS,iBACL,wDACA;AAAA,QACN,CAAC;AAAA,MACH;AAEA,YAAM,QAAQ,UAAU,OAAO,OAAO,SAAS,KAAK,MAAM,SAAS,MAAM;AACzE,YAAM,UAAU,MAAM,QAAQ,QAAQ,KAAc;AAAA,QAClD,MAAM;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AACD,UAAI,gBAAgB;AAClB,cAAM,oBAAoBC,UAAS,OAAO,EAAE;AAC5C,YAAI,MAAM,QAAQ,iBAAiB,KAAK,kBAAkB,WAAW,WAAW,QAAQ;AACtF,gBAAM,IAAI,SAAS;AAAA,YACjB,SAAS,mBAAmB,kBAAkB,MAAM,2BAA2B,WAAW,MAAM;AAAA,UAClG,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,YAAY,UAAU;AACxB,cAAM,cAAc,iBAAiB,OAAO;AAC5C,YAAI,aAAa;AACf,gBAAM,QAAQ,QAAQ,KAAK;AAAA,YACzB,MAAM,mBAAmB,mBAAmB,WAAW,CAAC;AAAA,YACxD,MAAM,EAAE,OAAO,UAAU,OAAO,OAAO,SAAS,KAAK,UAAU;AAAA,UACjE,CAAC;AAAA,QACH;AAAA,MACF;AACA,UAAI,KAAM,WAAU,OAAO;AAAA,UACtB,SAAQ,IAAI,mBAAmB,iBAAiB,OAAO,CAAC,EAAE;AAC/D;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,aAAa;AAChB,YAAM,YACJ,YAAY,WACP,OAAO,WAAW,CAAC,KAAK,UAAU,OAAO,OAAO,cAAc,IAC/D,YAAY,OAAO,OAAO,cAAc;AAC9C,YAAM,gBAAgB,OAAO,WAAW,CAAC,KAAK,UAAU,OAAO,OAAO,SAAS;AAC/E,UAAI,CAAC,UAAW,OAAM,IAAI,SAAS,EAAE,SAAS,yCAAyC,CAAC;AACxF,YAAM,UAAU,MAAM,QAAQ,QAAQ;AAAA,QACpC,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,MAChD;AACA,YAAM,cAAc,UAAU,OAAO,OAAO,gBAAgB,KAAK,iBAAiB,OAAO;AACzF,UAAI,CAAC;AACH,cAAM,IAAI,SAAS,EAAE,SAAS,qCAAqC,SAAS,GAAG,CAAC;AAIlF,YAAM,QACJ,iBAAiB,uBAAuB,SAAS,WAAW,KAAK,WAAW,EAAE;AAChF,YAAM,UAAU,MAAM,QAAQ,QAAQ,KAAK;AAAA,QACzC,MAAM,mBAAmB,mBAAmB,WAAW,CAAC;AAAA,QACxD,MAAM;AAAA,UACJ;AAAA,UACA,OAAO,UAAU,OAAO,OAAO,SAAS;AAAA,UACxC,iBAAiB,UAAU,OAAO,OAAO,YAAY;AAAA,QACvD;AAAA,MACF,CAAC;AACD,UAAI,KAAM,WAAU,EAAE,QAAQ,CAAC;AAAA,UAC1B,SAAQ,IAAI,UAAU,KAAK,QAAQ,iBAAiB,OAAO,CAAC,EAAE;AACnE;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,UAAU;AACb,YAAM,QACJ,YAAY,SAAS,YAAY,aAAa,YAAY,WACrD,UAAU,OAAO,OAAO,SAAS,KAClC,OAAO,WAAW,CAAC,KACnB,WAAW,EAAE,eACb,OAAO,WAAW,CAAC;AACzB,YAAM,YACJ,UAAU,OAAO,OAAO,cAAc,MACrC,YAAY,SAAS,YAAY,aAAa,YAAY,WACvD,OAAO,WAAW,CAAC,IACnB,OAAO,WAAW,CAAC;AACzB,UAAI,CAAC,SAAS,CAAC,WAAW;AACxB,cAAM,IAAI,SAAS,EAAE,SAAS,eAAe,OAAO,oCAAoC,CAAC;AAAA,MAC3F;AACA,YAAM,mBAAmB,UAAU,OAAO,OAAO,qBAAqB,KAAK,QAAQ,IAAI;AACvF,YAAM,WAAW,MAAM,8BAA8B,EAAE,SAAS,OAAO,OAAO,MAAM,CAAC;AACrF,YAAM,SAAS,YAAY,OAAO,OAAO,WAAW;AACpD,YAAM,UAAU,MAAM,QAAQ,QAAQ;AAAA,QACpC,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,MAChD;AACA,YAAM,cACJ,UAAU,OAAO,OAAO,gBAAgB,KAAK,sBAAsB,OAAO;AAC5E,YAAM,oBAAoB,MAAM,kCAAkC;AAAA,QAChE,SAAS,QAAQ;AAAA,MACnB,CAAC;AACD,YAAM,WAAW,MAAM,qBAAqB;AAAA,QAC1C;AAAA,QACA,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,aAAa,eAAe;AAAA,UAC5B,4BAA4B,MAAM,oCAAoC,OAAO;AAAA,UAC7E;AAAA,UACA,gBAAgB,UAAU,OAAO,OAAO,UAAU;AAAA,UAClD,YAAY,YAAY,OAAO,OAAO,eAAe;AAAA,QACvD;AAAA,MACF,CAAC;AACD,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA,kBAAkB,SAAS;AAAA,MAC7B,CAAC;AACD,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B;AAAA,QACA,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,kBAAkB,SAAS;AAAA,UAC3B,OAAO,UAAU,OAAO,OAAO,SAAS;AAAA,UACxC,UAAU,UAAU,OAAO,OAAO,YAAY;AAAA,UAC9C,OAAO,mBAAmB,MAAM,QAAQ;AAAA,UACxC,YAAY,UAAU,OAAO,OAAO,eAAe;AAAA,UACnD,mBAAmB,qBAAqB;AAAA,UACxC,GAAG;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC;AACD,UAAI,QAAQ,QAAQ;AAClB,kBAAU,EAAE,MAAM,OAAO,MAAM,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,CAAC;AAAA,MAC/E;AACA,UAAI,OAAO,UAAU,OAAO,WAAW,GAAG;AACxC,cAAM,IAAI,SAAS,EAAE,SAAS,qCAAqC,OAAO,MAAM,GAAG,CAAC;AAAA,MACtF;AACA;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,iBAAiB,EAAE,SAAS,QAAQ,KAAK,CAAC;AAChD;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf,YAAM,MAAM,OAAO,WAAW,CAAC;AAC/B,UAAI,QAAQ,QAAQ;AAClB,cAAM,IAAI,SAAS;AAAA,UACjB,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AACA,YAAM,SAAS,IAAI,gBAAgB;AACnC,YAAM,QAAQ,UAAU,OAAO,OAAO,SAAS;AAC/C,YAAM,YAAY,UAAU,OAAO,OAAO,cAAc;AACxD,YAAM,QAAQ,UAAU,OAAO,OAAO,SAAS;AAC/C,UAAI,MAAO,QAAO,IAAI,KAAK,KAAK;AAChC,UAAI,UAAW,QAAO,IAAI,aAAa,SAAS;AAChD,UAAI,MAAO,QAAO,IAAI,SAAS,KAAK;AACpC,YAAM,SAAS,MAAM,QAAQ,QAAQ;AAAA,QACnC,wBAAwB,MAAM;AAAA,MAChC;AACA,YAAM,WAAW,OAAO;AACxB,UAAI,KAAM,WAAU,EAAE,SAAS,CAAC;AAAA,WAC3B;AACH,mBAAW,WAAW,UAAU;AAC9B,gBAAM,SAASA,UAAS,OAAO;AAC/B,kBAAQ;AAAA,YACN,GAAG,OAAO,aAAa,OAAO,EAAE,IAAK,OAAO,cAAc,EAAE,IAAK,OAAO,SAAS,EAAE;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,YAAM,MAAM,OAAO,WAAW,CAAC;AAC/B,YAAM,YAAY,OAAO,WAAW,CAAC;AACrC,UAAI,CAAC,WAAW;AACd,cAAM,IAAI,SAAS;AAAA,UACjB,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,YAAoC;AAAA,QACxC,SAAS,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,QACvD,QAAQ,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,QACtD,WAAW,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,QACzD,YAAY,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,QAC1D,YAAY,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,MAC5D;AACA,YAAMD,SAAO,MAAM,UAAU,GAAG,IAAI;AACpC,UAAI,CAACA,QAAM;AACT,cAAM,IAAI,SAAS;AAAA,UACjB,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,SAAS,MAAM,QAAQ,QAAQ,IAAaA,MAAI;AACtD,UAAI,QAAQ,QAAQ,UAAW,WAAU,MAAM;AAAA,eACtC,MAAM,QAAQ,MAAM,EAAG,YAAW,OAAO,OAAQ,SAAQ,IAAI,KAAK,UAAU,GAAG,CAAC;AAAA,UACpF,WAAU,MAAM;AACrB;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,YAAM,MAAM,OAAO,WAAW,CAAC;AAC/B,YAAM,YAAY,YAAY,OAAO,OAAO,cAAc;AAC1D,UAAI,QAAQ,YAAY,QAAQ,cAAc;AAC5C,cAAM,IAAI,SAAS,EAAE,SAAS,0DAA0D,CAAC;AAAA,MAC3F;AACA,YAAM,SAAS,MAAM,QAAQ,QAAQ;AAAA,QACnC,iBAAiB,mBAAmB,SAAS,CAAC;AAAA,MAChD;AACA,UAAI,KAAM,WAAU,EAAE,OAAO,QAAQ,YAAY,OAAO,CAAC;AAAA,UACpD,YAAW,OAAO,OAAQ,SAAQ,IAAI,KAAK,UAAU,GAAG,CAAC;AAC9D;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI,SAAS,EAAE,SAAS,oBAAoB,OAAO,GAAG,CAAC;AAAA,EACjE;AACF;AAEA,eAAe,iBAAiB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIkB;AAChB,QAAM,MAAM,OAAO,WAAW,CAAC,KAAK;AACpC,MAAI,QAAQ,UAAU;AACpB,UAAM,SAAS,MAAM,QAAQ,QAAQ,IAAa,oBAAoB;AACtE,QAAI,KAAM,WAAU,MAAM;AAAA,QACrB,WAAU,MAAM;AACrB;AAAA,EACF;AACA,MAAI,QAAQ,WAAW,QAAQ,aAAa;AAC1C,UAAM,SAAS,MAAM,QAAQ,QAAQ,KAAK;AAAA,MACxC,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,aAAa,QAAQ,UAAU,OAAO,WAAW,CAAC,IAAI;AAAA,QACtD,WAAW,UAAU,OAAO,OAAO,cAAc;AAAA,MACnD;AAAA,IACF,CAAC;AACD,QAAI,KAAM,WAAU,MAAM;AAAA,QACrB,SAAQ,IAAI,WAAWC,UAAS,MAAM,EAAE,WAAW,CAAC,wBAAwB;AACjF;AAAA,EACF;AACA,MAAI,QAAQ,WAAW;AACrB,UAAM,wBAAwB,EAAE,QAAQ,KAAK,CAAC;AAC9C;AAAA,EACF;AACA,MAAI,QAAQ,UAAU,QAAQ,WAAW,QAAQ,aAAa;AAC5D,UAAM,IAAI,SAAS;AAAA,MACjB,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,YAA8B;AAC5C,UAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAc;AAAA,MAChD,MAAM;AAAA,MACN,MAAM;AAAA,QACJ,WAAW,UAAU,OAAO,OAAO,cAAc;AAAA,QACjD,GAAG,qBAAqB;AAAA,MAC1B;AAAA,IACF,CAAC;AACD,UAAM,UAAUA,UAAS,KAAK,EAAE;AAChC,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,gBAAgBA,UAAS,OAAO;AACtC,UAAM,YAAY,OAAO,cAAc,EAAE;AACzC,UAAM,YAAY,OAAO,cAAc,aAAa,EAAE;AACtD,UAAM,oBACJ,OAAO,cAAc,sBAAsB,WACvC,cAAc,kBAAkB,KAAK,IACrC;AACN,QAAI,aAAa,mBAAmB;AAClC,UAAI;AACF,cAAM,iCAAiC;AAAA,UACrC,SAAS,QAAQ;AAAA,UACjB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,wBAAwB,SAAS,aAAa,CAAC;AAClF,QAAI;AACF,YAAM,WAAW,0BAA0B,cAAc,QAAQ;AACjE,UAAI,UAAU;AACZ,cAAM,iBAAiB,MAAM,2BAA2B,EAAE,SAAS,CAAC;AACpE,YAAI,CAAC,eAAe,IAAI;AACtB,gBAAM,QAAQ,QAAQ,KAAK;AAAA,YACzB,MAAM,wBAAwB,SAAS;AAAA,YACvC,MAAM,EAAE,OAAO,eAAe,QAAQ;AAAA,UACxC,CAAC;AACD,gBAAM,IAAI,SAAS,EAAE,SAAS,eAAe,QAAQ,CAAC;AAAA,QACxD;AACA,cAAM,QAAQ,QAAQ,KAAK;AAAA,UACzB,MAAM,wBAAwB,SAAS;AAAA,UACvC,MAAM,EAAE,eAAe;AAAA,QACzB,CAAC;AACD,YAAI,KAAM,WAAU,EAAE,SAAS,eAAe,CAAC;AAAA,YAC1C,SAAQ,IAAI,aAAa,SAAS,IAAI,QAAQ,cAAc,SAAS,EAAE;AAC5E,eAAO;AAAA,MACT;AAOA,YAAM,iBACJ,OAAO,cAAc,mBAAmB,WAAW,cAAc,eAAe,KAAK,IAAI;AAC3F,UAAI,CAAC,gBAAgB;AACnB,cAAM,IAAI,SAAS;AAAA,UACjB,SAAS,qBAAqB,SAAS;AAAA,QACzC,CAAC;AAAA,MACH;AACA,YAAM,eAAeA,UAAS,cAAc,YAAY;AACxD,YAAM,WAAW,MAAM,8BAA8B,EAAE,SAAS,OAAO,OAAO,MAAM,CAAC;AACrF,YAAM,YAAY,OAAO,cAAc,SAAS;AAChD,YAAM,SAAS,YAAY,OAAO,OAAO,WAAW;AACpD,YAAM,WAAW,MAAM,qBAAqB;AAAA,QAC1C;AAAA,QACA,SAAS;AAAA,UACP;AAAA,UACA,kBAAkB,OAAO,cAAc,oBAAoB,QAAQ,IAAI,CAAC;AAAA,UACxE,aAAa,OAAO,cAAc,eAAe,EAAE;AAAA,UACnD,4BAA4B,MAAM,oCAAoC,OAAO;AAAA,UAC7E;AAAA,UACA,gBAAgB,UAAU,OAAO,OAAO,UAAU;AAAA,UAClD,YAAY,YAAY,OAAO,OAAO,eAAe;AAAA,QACvD;AAAA,MACF,CAAC;AACD,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA,kBAAkB,SAAS;AAAA,MAC7B,CAAC;AACD,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B;AAAA,QACA,SAAS;AAAA,UACP,OAAO;AAAA,UACP;AAAA,UACA,kBAAkB,SAAS;AAAA,UAC3B,OACE,OAAO,cAAc,mBAAmB,WACpC,cAAc,iBACd;AAAA,UACN,UACE,OAAO,cAAc,6BAA6B,WAC9C,cAAc,2BACd;AAAA,UACN,OAAO,MAAM,QAAQ,aAAa,KAAK,IACnC,aAAa,MAAM,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAC/E,CAAC;AAAA,UACL,YACE,OAAO,aAAa,eAAe,WAAW,aAAa,aAAa;AAAA,UAC1E,oBAAoB;AAAA,UACpB,mBAAmB,qBAAqB;AAAA,UACxC,GAAG;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC;AACD,UAAI,OAAO,UAAU,OAAO,WAAW,GAAG;AACxC,cAAM,IAAI,SAAS,EAAE,SAAS,qCAAqC,OAAO,MAAM,GAAG,CAAC;AAAA,MACtF;AACA,YAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,wBAAwB,SAAS,YAAY,CAAC;AACjF,UAAI,QAAQ,QAAQ;AAClB,kBAAU,EAAE,SAAS,MAAM,OAAO,MAAM,QAAQ,OAAO,OAAO,CAAC;AAAA,MACjE,OAAO;AACL,gBAAQ,IAAI,YAAY,cAAc,QAAQ,cAAc,SAAS,EAAE;AAAA,MACzE;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,QAAQ,QAAQ,KAAK;AAAA,QACzB,MAAM,wBAAwB,SAAS;AAAA,QACvC,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,MACxE,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,WAAW,MAAM,QAAQ;AAC/B,QAAI,CAAC,UAAU;AACb,UAAI,KAAM,WAAU,EAAE,UAAU,MAAM,CAAC;AAAA,UAClC,SAAQ,IAAI,kCAAkC;AAAA,IACrD;AACA;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa;AACvB,UAAM,oBAAoB,EAAE,SAAS,KAAK,CAAC;AAC3C;AAAA,EACF;AAEA,QAAM,aAAa,OAAO,SAAS,UAAU,OAAO,OAAO,oBAAoB,KAAK,QAAQ,EAAE;AAC9F,MAAI,CAAC,KAAM,SAAQ,IAAI,iCAAiC,UAAU,4BAA4B;AAC9F,SAAO,MAAM;AACX,UAAM,QAAQ;AACd,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,UAAU,CAAC;AAAA,EAC9D;AACF;AASA,eAAe,oBAAoB;AAAA,EACjC;AAAA,EACA;AACF,GAGkB;AAChB,MAAI,CAAC,KAAM,SAAQ,IAAI,qEAAqE;AAC5F,aAAS;AACP,UAAM,MAAM,oBAAI,KAAK;AACrB,QAAI,WAAW;AACf,QAAI,YAA2B;AAC/B,QAAI;AACF,iBAAW,MAAM,QAAQ;AAAA,IAC3B,SAAS,OAAO;AACd,kBAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IACnE;AACA,UAAM,QAAQ,uBAAuB;AACrC,UAAM,OAAO,yBAAyB;AAAA,MACpC,gBAAgB,WAAW,IAAI,YAAY,IAAI,MAAM;AAAA,MACrD,KAAK,IAAI,QAAQ;AAAA,IACnB,CAAC;AACD,4BAAwB;AAAA,MACtB,iBAAiB,IAAI,YAAY;AAAA,MACjC,eAAe,WAAW,IAAI,YAAY,IAAI,MAAM;AAAA,MACpD,gBAAgB,WAAW,IAAI,YAAY,IAAI,MAAM;AAAA;AAAA;AAAA,MAGrD,WAAW,oBAAoB,SAAS;AAAA,MACxC,uBAAuB;AAAA,IACzB,CAAC;AACD,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,gBAAgB,IAAI,CAAC,CAAC;AAAA,EACzE;AACF;AAQA,eAAe,wBAAwB;AAAA,EACrC;AAAA,EACA;AACF,GAGkB;AAChB,QAAM,SAAS,OAAO,WAAW,CAAC,KAAK;AACvC,QAAM,UAAU,sBAAsB;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,SAAS;AAAA,MACjB,SAAS,iDAAiD,QAAQ,QAAQ;AAAA,IAC5E,CAAC;AAAA,EACH;AAEA,MAAI,WAAW,UAAU;AACvB,UAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,UAAM,QAAQ,uBAAuB;AACrC,UAAM,EAAE,WAAW,0BAA0B,IAAI,yBAAyB;AAAA,MACxE,aAAa,MAAM;AAAA,IACrB,CAAC;AACD,UAAM,gBACJ,SAAS,aAAa,4BAClB,kNACA;AACN,UAAM,UAAU;AAAA,MACd,WAAW;AAAA,MACX,MAAM,QAAQ;AAAA,MACd,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ,SAAS;AAAA,MAC3B,WAAW,SAAS;AAAA,MACpB,SAAS,SAAS;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,aAAa,MAAM;AAAA,MACnB,iBAAiB,MAAM;AAAA,MACvB,eAAe,MAAM;AAAA,MACrB,gBAAgB,MAAM;AAAA,MACtB,WAAW,MAAM;AAAA,MACjB,uBAAuB,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,IACF;AACA,QAAI,KAAM,WAAU,OAAO;AAAA,SACtB;AACH,oBAAc;AAAA,QACZ,SAAS,GAAG,QAAQ,IAAI,KAAK,QAAQ,UAAU;AAAA,QAC/C,WAAW,SAAS,YAAY,QAAQ;AAAA,QACxC,SAAS,SAAS;AAAA,QAClB,WAAW,cAAc,YAAY,cAAc;AAAA,QACnD,SAAS,MAAM,cAAc;AAAA,QAC7B,kBAAkB,MAAM,mBAAmB;AAAA,QAC3C,iBAAiB,MAAM,kBAAkB;AAAA,QACzC,iBAAiB,MAAM,wBACnB,GAAG,MAAM,qBAAqB,OAC9B;AAAA,QACJ,cAAc,MAAM,aAAa;AAAA,MACnC,CAAC;AACD,UAAI,cAAe,SAAQ,IAAI;AAAA,QAAW,aAAa,EAAE;AAAA,IAC3D;AACA;AAAA,EACF;AAEA,MAAI,WAAW,WAAW;AACxB,UAAM,SAAS,WAAW;AAC1B,UAAM,aAAa,kBAAkB,MAAM;AAC3C,UAAM,aAAa,sBAAsB;AACzC,UAAM,MAAM,sBAAsB;AAAA,MAChC;AAAA,MACA,mBAAmB,WAAW;AAAA,IAChC,CAAC;AACD,UAAM,YAAY,CAAC,YAAY,OAAO,OAAO,YAAY;AACzD,UAAM,QAAQ,QAAQ,EAAE,YAAY,KAAK,UAAU,CAAC;AACpD,4BAAwB;AAAA,MACtB,GAAG,uBAAuB;AAAA,MAC1B,aAAa,QAAQ;AAAA,MACrB,mBAAmB,QAAQ;AAAA,MAC3B,aAAa,WAAW;AAAA,MACxB,UAAU,WAAW;AAAA,MACrB;AAAA,MACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,WAAW;AAAA,IACb,CAAC;AACD,UAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,QAAI,KAAM,WAAU,EAAE,SAAS,WAAW,GAAG,SAAS,CAAC;AAAA;AAErD,cAAQ;AAAA,QACN,gCAAgC,QAAQ,IAAI,SAAS,YAAY,YAAY,aAAa;AAAA,MAC5F;AACF;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,WAAW,UAAU,WAAW,WAAW;AACnE,UAAM,QAAQ,MAAM,EAAE;AACtB,UAAM,WAAW,MAAM,QAAQ,OAAO;AACtC,QAAI,KAAM,WAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;AAAA,QACtC,SAAQ,IAAI,qBAAqB,MAAM,uBAAuB,SAAS,OAAO,IAAI;AACvF;AAAA,EACF;AAEA,MAAI,WAAW,aAAa;AAC1B,UAAM,QAAQ,UAAU;AACxB,4BAAwB;AAAA,MACtB,GAAG,uBAAuB;AAAA,MAC1B,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,aAAa;AAAA,IACf,CAAC;AACD,QAAI,KAAM,WAAU,EAAE,aAAa,KAAK,CAAC;AAAA,QACpC,SAAQ,IAAI,gCAAgC;AACjD;AAAA,EACF;AAEA,QAAM,IAAI,SAAS;AAAA,IACjB,SACE;AAAA,EACJ,CAAC;AACH;AA7oDA,IAwlBM,qBAcA;AAtmBN;AAAA;AAAA;AAAA;AAIA;AAQA;AAOA;AACA;AACA,IAAAE;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAaA;AACA;AAMA;AACA;AAUA;AAshBA,IAAM,sBAAsB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,IAAM,0BAA0B,oBAAI,IAAI;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;AC5mBD;;;ACAO,SAAS,UAAU,EAAE,eAAe,GAAqC;AAC9E,UAAQ,IAAI;AAAA;AAAA,oCAEsB,cAAc;AAAA;AAAA,mBAE/B,cAAc;AAAA;AAAA;AAAA,IAG7B,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA,IAEd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA,IAEd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA,IAEd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA;AAAA,IAGd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA,IAEd,cAAc;AAAA;AAAA;AAAA,IAGd,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA,IAEd,cAAc;AAAA;AAAA;AAAA,IAGd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA;AAAA,IAGd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA;AAAA,IAGd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA;AAAA;AAAA,KAIb,cAAc;AAAA,IACf,cAAc;AAAA,QACV,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA,IAKlB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA;AAAA,4BAEU,cAAc;AAAA;AAAA;AAAA,CAGzC;AACD;;;ADrFA;AAiKA;AACA;AAhKA,IAAM,iBAAiB;AAEvB,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B,GAAG;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,6BAAmC;AAC1C,QAAM,QAAQ,OAAO,SAAS,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE;AAE3E,MAAI,OAAO,MAAM,KAAK,KAAK,QAAQ,gBAAgB;AACjD,UAAM,IAAI,SAAS;AAAA,MACjB,SAAS,iCAAiC,cAAc,oBAAoB,QAAQ,OAAO;AAAA,IAC7F,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,MAAyB;AAChD,SAAO,KAAK,SAAS,QAAQ;AAC/B;AAEA,eAAe,gBAAgB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKkB;AAChB,UAAQ,SAAS;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,gBAAU,EAAE,eAAe,CAAC;AAC5B;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,wBAAkB,EAAE,MAAM,gBAAgB,IAAI,EAAE,CAAC;AACjD;AAAA,IACF,KAAK,UAAU;AACb,YAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM;AACnC,YAAMA,kBAAiB,EAAE,MAAM,KAAK,CAAC;AACrC;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,SAAS;AACZ,YAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,YAAMA,iBAAgB,EAAE,SAAS,MAAM,KAAK,CAAC;AAC7C;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,YAAMA,iBAAgB,EAAE,MAAM,KAAK,CAAC;AACpC;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf,YAAM,CAAC,YAAY,GAAG,IAAI,IAAI;AAC9B,UAAI,CAAC,YAAY;AACf,cAAM,IAAI,SAAS,EAAE,SAAS,4CAA4C,CAAC;AAAA,MAC7E;AACA,YAAM,EAAE,gBAAAC,gBAAe,IAAI,MAAM;AACjC,YAAM,EAAE,oBAAAC,oBAAmB,IAAI,MAAM;AACrC,YAAM,UAAUD,gBAAe;AAC/B,UAAI;AACF,cAAMC,oBAAmB,EAAE,SAAS,YAAY,MAAM,MAAM,OAAO,eAAe,CAAC;AAAA,MACrF,UAAE;AACA,gBAAQ,MAAM;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IACA,SAAS;AACP,UAAI,CAAC,eAAe,IAAI,OAAO,GAAG;AAChC,cAAM,IAAI,SAAS;AAAA,UACjB,SAAS,oBAAoB,OAAO;AAAA,QAAW,cAAc;AAAA,QAC/D,CAAC;AAAA,MACH;AACA,YAAM,EAAE,gBAAAD,gBAAe,IAAI,MAAM;AACjC,YAAM,EAAE,sBAAAE,sBAAqB,IAAI,MAAM;AACvC,YAAM,UAAUF,gBAAe;AAC/B,UAAI;AACF,cAAME,sBAAqB,EAAE,SAAS,SAAS,MAAM,KAAK,CAAC;AAAA,MAC7D,UAAE;AACA,gBAAQ,MAAM;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,OAAO;AAAA,EAC3B;AAAA,EACA,OAAO,QAAQ,KAAK,MAAM,CAAC;AAAA,EAC3B;AACF,GAIkB;AAChB,6BAA2B;AAE3B,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAE3B,MAAI;AACF,UAAM,gBAAgB,EAAE,gBAAgB,SAAS,MAAM,MAAM,MAAM,CAAC;AAAA,EACtE,SAAS,OAAO;AACd,QAAI,iBAAiB,UAAU;AAC7B,YAAM;AAAA,IACR;AACA,UAAM,IAAI,SAAS,EAAE,SAAS,eAAe,KAAK,EAAE,CAAC;AAAA,EACvD;AACF;",
6
6
  "names": ["lines", "endPtr", "existsSync", "readFileSync", "path", "fileURLToPath", "lines", "existsSync", "readFileSync", "path", "hostname", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "path", "normalizeBaseUrl", "authCredentialsPath", "normalizeBaseUrl", "existsSync", "readFileSync", "path", "fileURLToPath", "chmodSync", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "os", "path", "fileURLToPath", "createHash", "hostname", "init_device_identity", "normalizeBaseUrl", "readResponseJson", "lines", "errorMessageFromJson", "path", "init_device_identity", "existsSync", "readFileSync", "promptLine", "createInterface", "preset", "existsSync", "mkdirSync", "readdirSync", "rmSync", "statSync", "path", "path", "createInterface", "isHttpUrl", "promptLine", "DEFAULT_LOCAL_BACKEND_URL", "loadConfig", "resolveConfigWritePath", "writeConfig", "findEffectiveConfigPath", "resolveBackendUrl", "resolveAuthStatus", "hasExplicitBackendConfig", "loginWithUserToken", "runInteractiveAuthLogin", "runUpdateCommand", "resolveRepoPath", "runSetupCommand", "runAgentSetupCommand", "runUserTokenCommand", "pruneProjectTmpContents", "createBackendClient", "inspectConnector", "listAvailableConnectors", "authCredentialsPath", "detectCloudSyncRoot", "isLoopbackBackendUrl", "readStoredAuthCredentials", "buildExecutionTargetMigrationDoctorCheck", "spawn", "existsSync", "path", "loadConfig", "resolveProjectRoot", "init_util", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "path", "init_util", "path", "execFileSync", "runGit", "existsSync", "path", "existsSync", "existsSync", "execFileSync", "existsSync", "runGit", "init_util", "init_errors", "init_errors", "init_errors", "init_util", "path", "init_util", "path", "execFileSync", "existsSync", "mkdirSync", "statSync", "os", "path", "runGit", "path", "project", "shellQuote", "lines", "spawnSync", "chmodSync", "writeFileSync", "path", "args", "createHash", "existsSync", "readdirSync", "readFileSync", "statSync", "path", "readFileSync", "path", "createInterface", "createHash", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "path", "manifestPath", "execFileSync", "createHash", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "realpathSync", "rmSync", "writeFileSync", "path", "readFileSync", "path", "lines", "chmodSync", "existsSync", "mkdirSync", "readFileSync", "rmSync", "writeFileSync", "os", "path", "platform", "homedir", "createInterface", "lines", "createHash", "existsSync", "mkdirSync", "readFileSync", "rmSync", "writeFileSync", "path", "existsSync", "readFileSync", "os", "path", "asRecord", "result", "init_device_identity", "runUpdateCommand", "runLocalCommand", "runServeCommand", "openCliRuntime", "runProtocolCommand", "runManagementCommand"]
7
7
  }