nexos-connect 0.6.0 → 0.7.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main.ts","../src/cli/environment.ts","../src/shared/file-formats/json/parse-json.ts","../src/shared/http/request-errors.ts","../src/shared/text/format-seconds.ts","../src/shared/http/send-request.ts","../src/shared/oauth/authorize-url.ts","../src/shared/text/trim-trailing-slashes.ts","../src/product/identity/token-schemas.ts","../src/product/identity/identity-client.ts","../src/product/internal-api-proxy/api-keys.ts","../src/shared/http/is-allowed-host.ts","../src/product/public-api/desired-config.ts","../src/product/internal-api-proxy/format-proxy-failure.ts","../src/product/internal-api-proxy/proxy-request.ts","../src/product/internal-api-proxy/user-profile.ts","../src/product/internal-api-proxy/internal-api-proxy-client.ts","../src/product/public-api/models/predefined-models.ts","../src/shared/text/has-line-break.ts","../src/shared/text/read-non-blank.ts","../src/cli/errors/usage-error.ts","../src/cli/errors/classify-failure.ts","../src/shared/text/describe-error.ts","../src/ui/terminal/cancelled-error.ts","../src/cli/errors/failed-run-error.ts","../src/cli/parse-key-id.ts","../src/cli/help.ts","../src/cli/parse-cli-arguments.ts","../src/shared/file-formats/shell/escape-posix-single-quoted.ts","../src/shared/file-formats/shell/escape-powershell-single-quoted.ts","../src/shared/text/escape-control-characters.ts","../src/product/secrets/key-prefix.ts","../src/product/secrets/masker.ts","../src/shared/platform/has-binary.ts","../src/shared/file-system/is-file.ts","../src/shared/file-system/errors/is-missing-file-error.ts","../src/shared/platform/platform-context.ts","../src/cli/parse-key-name.ts","../src/cli/should-open-menu.ts","../src/cli/command-outcome.ts","../src/harnesses/claude-code/claude-code.ts","../src/shared/text/display-path.ts","../src/shared/file-system/find-first-existing-file.ts","../src/harnesses/config/detect-config-file.ts","../src/harnesses/config/detect-config-or-binary.ts","../src/harnesses/config/is-public-api-url.ts","../src/harnesses/config/read-jsonc-file.ts","../src/shared/file-formats/config-errors.ts","../src/shared/file-formats/json/jsonc.ts","../src/shared/file-formats/detect-line-ending.ts","../src/shared/file-formats/key-path.ts","../src/shared/file-formats/key-original.ts","../src/shared/file-formats/split-byte-order-mark.ts","../src/shared/file-system/read-file-if-exists.ts","../src/shared/file-system/errors/utf16-file-error.ts","../src/harnesses/claude-desktop/claude-desktop.ts","../src/shared/file-system/is-directory.ts","../src/shared/file-system/list-directory.ts","../src/harnesses/codex/codex.ts","../src/shared/file-formats/toml.ts","../src/harnesses/copilot-cli/copilot-cli.ts","../src/harnesses/crush/crush.ts","../src/shared/text/read-literal-key.ts","../src/harnesses/launch/launch-recipe.ts","../src/harnesses/opencode/opencode.ts","../src/harnesses/pi/pi.ts","../src/harnesses/qwen-code/qwen.ts","../src/harnesses/registry.ts","../src/cli/refuse-prompts.ts","../src/cli/announce-host-overrides.ts","../src/cli/resolve-named-harnesses.ts","../src/flows/auth/key-name.ts","../src/flows/auth/session-refresh.ts","../src/shared/oauth/local-auth-server.ts","../src/shared/oauth/pkce.ts","../src/shared/text/escape-html.ts","../src/product/identity/pages/render-pages.ts","../src/shared/platform/open-browser.ts","../src/flows/auth/sign-in.ts","../src/flows/auth/login-flow.ts","../src/flows/auth/remember-saved-key.ts","../src/flows/auth/revoke-session.ts","../src/flows/auth/rotate-key.ts","../src/flows/auth/sign-in-services.ts","../src/flows/auth/auth-step.ts","../src/flows/configure/agent-with-config.ts","../src/product/storage/backups/resolve-backup-root.ts","../src/shared/text/format-count.ts","../src/ui/report/preview/format-preview.ts","../src/ui/diff/diff-lines.ts","../src/ui/diff/render-diff.ts","../src/ui/glyphs.ts","../src/ui/report/format-heading.ts","../src/ui/report/format-user-environment.ts","../src/ui/report/indent.ts","../src/ui/report/result/format-result.ts","../src/flows/configure/configure-result.ts","../src/product/storage/env-file/syntax/env-syntaxes.ts","../src/product/storage/env-file/syntax/posix-env-syntax.ts","../src/product/storage/env-file/syntax/env-syntax.ts","../src/product/storage/env-file/syntax/powershell-env-syntax.ts","../src/ui/format-list.ts","../src/ui/report/outcome-style.ts","../src/flows/key/key-step.ts","../src/flows/key/key-offers.ts","../src/harnesses/summarize-current-values.ts","../src/harnesses/model-fit.ts","../src/product/storage/preferences/preferences.ts","../src/shared/file-system/errors/describe-file-error.ts","../src/shared/file-system/errors/link-escape-error.ts","../src/ui/prompts/model/model-choices.ts","../src/product/public-api/models/protocol.ts","../src/product/public-api/models/model-capability.ts","../src/flows/model/suggest-defaults.ts","../src/flows/model/model-step.ts","../src/flows/configure/apply-changes.ts","../src/shared/file-system/assert-no-link-escape.ts","../src/shared/text/is-inside-directory.ts","../src/shared/file-system/resolve-real-path.ts","../src/product/storage/backups/back-up-file.ts","../src/shared/file-system/read-file-mode.ts","../src/product/storage/backups/back-up-before-writing.ts","../src/shared/file-system/resolve-owner-only-mode.ts","../src/shared/file-system/write-file-with-mode.ts","../src/product/storage/env-file/write-env-file.ts","../src/product/storage/windows-environment/user-environment.ts","../src/product/storage/windows-environment/describe-user-environment-failure.ts","../src/shared/file-system/resolve-write-mode.ts","../src/shared/file-system/write-file-refusing-links.ts","../src/flows/configure/change-plan.ts","../src/product/storage/env-file/read-env-file.ts","../src/product/storage/env-file/split-lines.ts","../src/product/storage/env-file/render-env-file.ts","../src/shared/file-formats/config-format.ts","../src/product/storage/env-file/parse-env-file.ts","../src/product/storage/restore-record/add-originals.ts","../src/product/storage/restore-record/restore-record.ts","../src/product/storage/restore-record/restore-record-location.ts","../src/flows/configure/record-originals.ts","../src/flows/configure/configure-agents.ts","../src/flows/configure/desired-by-agent.ts","../src/flows/configure/read-current-configs.ts","../src/harnesses/read-agent-config.ts","../src/product/storage/env-file/env-file-path.ts","../src/flows/configure/resolve-change-scope.ts","../src/flows/configure/select-target-agents.ts","../src/flows/key/describe-key-destination.ts","../src/flows/key/find-existing-keys.ts","../src/flows/key/key-check.ts","../src/product/public-api/list-models.ts","../src/product/public-api/describe-public-api-failure.ts","../src/product/public-api/error-codes.ts","../src/product/public-api/key-rejected-statuses.ts","../src/product/public-api/model-schema.ts","../src/product/public-api/probes/probe-result.ts","../src/ui/report/detection/format-probes.ts","../src/flows/key/probe-summaries.ts","../src/commands/change-key/change-key.ts","../src/commands/change-key/run-change-key.ts","../src/flows/model/model-probe.ts","../src/product/public-api/models/router-availability.ts","../src/product/public-api/probes/probe-anthropic.ts","../src/product/public-api/probes/probe-openai.ts","../src/flows/model/per-key/read-each-key.ts","../src/flows/model/choose-model.ts","../src/flows/model/per-key/probe-each-key.ts","../src/flows/model/per-key/probe-groups.ts","../src/flows/model/per-key/shared-models.ts","../src/flows/model/pick-probed-model.ts","../src/flows/model/choose-model-for-kept-keys.ts","../src/commands/change-model/change-model.ts","../src/commands/change-model/run-change-model.ts","../src/commands/forget-key/forget-key.ts","../src/commands/launch/start-agent.ts","../src/flows/install/install-harness.ts","../src/flows/model/choose-checked-model.ts","../src/commands/launch/launch.ts","../src/commands/login/run-login.ts","../src/commands/logout/run-logout.ts","../src/commands/menu/run-menu.ts","../src/commands/restore/restore-agents.ts","../src/ui/report/preview/format-restore-preview.ts","../src/ui/report/result/format-restore-result.ts","../src/commands/restore/restore-result.ts","../src/commands/restore/apply-restore.ts","../src/product/storage/restore-record/remove-harness-records.ts","../src/commands/restore/restore-env-text.ts","../src/commands/restore/restore-plan.ts","../src/commands/restore/restore-secrets.ts","../src/flows/configure/resolve-scope.ts","../src/flows/install/install-missing-harnesses.ts","../src/ui/report/detection/format-detection.ts","../src/commands/setup/answers/harness-selection.ts","../src/commands/setup/set-up-agents.ts","../src/commands/menu/build-menu-items.ts","../src/commands/menu/read-menu-state.ts","../src/commands/restore/run-restore.ts","../src/commands/setup/run-setup.ts","../src/ui/report/result/format-status.ts","../src/ui/report/result/format-status-json.ts","../src/commands/status/inspect-harness.ts","../src/commands/status/display-scope-path.ts","../src/commands/status/detect-drift.ts","../src/commands/status/status-result.ts","../src/commands/status/read-global-status.ts","../src/commands/status/run-status.ts","../src/flows/install/run-npm.ts","../src/harnesses/launch/run-launch.ts","../src/product/storage/keychain/keychain.ts","../src/product/storage/keychain/keystore.ts","../src/product/storage/keychain/mac-keychain-probe.ts","../src/product/storage/session/session-store.ts","../src/product/storage/windows-environment/powershell-user-environment.ts","../src/shared/platform/read-user-name.ts","../src/ui/output.ts","../src/ui/prompts/confirm.ts","../src/ui/prompts/key/ask-for-key.ts","../src/ui/prompts/key/ask-for-new-key.ts","../src/ui/prompts/key/ask-key-name.ts","../src/ui/prompts/key/choose-key-source.ts","../src/ui/prompts/key/account-option.ts","../src/ui/prompts/key/choose-on-failed-key-check.ts","../src/ui/prompts/key/choose-on-saved-key-rejected.ts","../src/ui/prompts/menu/select-menu-item.ts","../src/ui/terminal/back-keys.ts","../src/ui/prompts/model/ask-for-model-id.ts","../src/ui/prompts/model/choose-on-model-probe-failure.ts","../src/ui/prompts/model/choose-saved-model.ts","../src/ui/prompts/model/select-model.ts","../src/ui/prompts/model/browse-catalogue.ts","../src/ui/prompts/select-change-scope.ts","../src/ui/prompts/list-enabled-first.ts","../src/ui/prompts/select-harnesses.ts","../src/ui/prompts/select-launch-agent.ts","../src/ui/prompts/select-restore-harnesses.ts","../src/ui/prompts/select-restore-scope.ts","../src/ui/prompts/select-scope.ts","../src/ui/prompts/select-target-agents.ts","../src/ui/terminal/spinner.ts","../src/ui/terminal-ui.ts","../src/ui/terminal/track-interrupt-key.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process'\nimport { createRequire } from 'node:module'\nimport os from 'node:os'\nimport path from 'node:path'\nimport crossSpawn from 'cross-spawn'\nimport pc from 'picocolors'\nimport * as v from 'valibot'\nimport { KEY_ENV_VARIABLE, readEnvironmentInputs } from './cli/environment'\nimport { classifyFailure, exitCodeForFailure } from './cli/errors/classify-failure'\nimport { EXIT_CODE, type AgentExitCode } from './cli/exit-code'\nimport { COMMAND_NAME, renderHelp } from './cli/help'\nimport { isAgentName, parseCliArguments, type CliOptions, type Command } from './cli/parse-cli-arguments'\nimport { shouldOpenMenu } from './cli/should-open-menu'\nimport { runChangeKey } from './commands/change-key/run-change-key'\nimport { runChangeModel } from './commands/change-model/run-change-model'\nimport { forgetKey } from './commands/forget-key/forget-key'\nimport type { LaunchDeps } from './commands/launch/launch'\nimport { startAgent, type AgentRequest } from './commands/launch/start-agent'\nimport { runLogin } from './commands/login/run-login'\nimport { runLogout } from './commands/logout/run-logout'\nimport { runMenu } from './commands/menu/run-menu'\nimport { runRestore } from './commands/restore/run-restore'\nimport { runSetup } from './commands/setup/run-setup'\nimport { runStatus } from './commands/status/run-status'\nimport { createRunNpm } from './flows/install/run-npm'\nimport { runLaunch, type LaunchResult, type RunnerDeps } from './harnesses/launch/run-launch'\nimport { findHarnessByBinary, harnesses, isLaunchingHarness, listLaunchBinaries } from './harnesses/registry'\nimport { DEFAULT_MODEL, PREDEFINED_MODELS } from './product/public-api/models/predefined-models'\nimport { createMasker, type Masker } from './product/secrets/masker'\nimport { PROJECT_BACKUP_DIRECTORY, USER_BACKUP_DIRECTORY } from './product/storage/backups/resolve-backup-root'\nimport {\n KEYCHAIN_DISABLED,\n KEYCHAIN_ENV_VARIABLE,\n KEYCHAIN_INTERACTION_TIMEOUT_MS,\n KEYCHAIN_PROBE_TIMEOUT_MS,\n createKeychain,\n} from './product/storage/keychain/keychain'\nimport { createKeystore, type Keystore } from './product/storage/keychain/keystore'\nimport { isMacKeychainAvailable } from './product/storage/keychain/mac-keychain-probe'\nimport { createSessionStore } from './product/storage/session/session-store'\nimport { runPowerShell as runPowerShellWithExecutable } from './product/storage/windows-environment/powershell-user-environment'\nimport { createUserEnvironment } from './product/storage/windows-environment/user-environment'\nimport { withUserAgent, type Fetch } from './shared/http/send-request'\nimport { createPlatformContext, type PlatformContext } from './shared/platform/platform-context'\nimport { readUserName } from './shared/platform/read-user-name'\nimport { describeError } from './shared/text/describe-error'\nimport { createTerminalUi, type TerminalUi } from './ui/terminal-ui'\nimport { trackInterruptKey } from './ui/terminal/track-interrupt-key'\n\nconst NODE_AND_SCRIPT_ARGUMENT_COUNT = 2\n\nconst masker = createMasker({ secrets: [] })\n\nconst keychain = createKeychain({\n importKeyring: () => import('@napi-rs/keyring'),\n platform: process.platform,\n isWsl: () => process.env.WSL_DISTRO_NAME !== undefined || /microsoft/i.test(os.release()),\n hasMacKeychain: () =>\n isMacKeychainAvailable({\n resolveBinary: (name) => createContext().resolveBinary(name),\n timeoutMs: KEYCHAIN_PROBE_TIMEOUT_MS,\n spawn: (command, commandArguments, options) => spawnSync(command, commandArguments, options),\n }),\n isEnabled: process.env[KEYCHAIN_ENV_VARIABLE] !== KEYCHAIN_DISABLED,\n probeTimeoutMs: KEYCHAIN_PROBE_TIMEOUT_MS,\n interactionTimeoutMs: KEYCHAIN_INTERACTION_TIMEOUT_MS,\n})\nconst keystore = createKeystore(keychain)\nconst sessionStore = createSessionStore(keychain)\n\nconst userEnvironment = createUserEnvironment({\n platform: process.platform,\n runPowerShell: ({ script, input }) => {\n const executable = createContext().resolveBinary('powershell')\n return runPowerShellWithExecutable({\n script,\n input,\n executablePath: executable?.path,\n env: executable?.env ?? {},\n spawn: (command, commandArguments, options) =>\n spawnSync(command, commandArguments, { ...options, env: executable?.env ?? {} }),\n })\n },\n})\n\nconst runnerDeps: RunnerDeps = {\n spawn: (command, commandArguments, options) => crossSpawn(command, commandArguments, options),\n tmpdir: os.tmpdir,\n pid: process.pid,\n uid: process.getuid?.(),\n isAlive: isProcessAlive,\n signals: process,\n stdin: process.stdin,\n env: process.env,\n onError: (message) => console.error(masker.maskText(message)),\n}\n\n/** EPERM means the pid exists but belongs to someone else — alive. */\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === 'EPERM'\n }\n}\n\nconst runNpm = createRunNpm({ ctx: createContext(), spawn: crossSpawn })\n\nconst launchWithRunner: LaunchDeps['runLaunch'] = (recipe, passthrough, resolved) =>\n runLaunch({ recipe, passthrough, resolved, deps: runnerDeps })\n\nexport type CliServices = { keystore: Keystore; masker: Masker; ctx: PlatformContext }\n\n/** `argv` is what follows the command name. */\nexport type ExtensionCommandParams = { argv: readonly string[]; services: CliServices; ui: TerminalUi }\n\nexport type ExtensionCommand = (params: ExtensionCommandParams) => Promise<number>\n\n/** What a wrapper entry adds to the CLI; the published entry passes none. */\nexport type CliExtensions = {\n /** Matched on the first argument, before the arguments are parsed. */\n commands?: ReadonlyMap<string, ExtensionCommand>\n decorateUi?: (ui: TerminalUi, services: CliServices) => TerminalUi\n}\n\nexport async function runCli(extensions: CliExtensions = {}): Promise<void> {\n try {\n finish(await main(extensions))\n } catch (error) {\n console.error(pc.red(masker.maskText(describeError(error))))\n finish(EXIT_CODE.failed)\n }\n}\n\nasync function main(extensions: CliExtensions): Promise<number> {\n const services: CliServices = { keystore, masker, ctx: createContext() }\n const terminalUi = createTerminalUi({\n input: process.stdin,\n output: process.stdout,\n errorOutput: process.stderr,\n onInterrupt: listenForSigint,\n })\n const ui = extensions.decorateUi?.(terminalUi, services) ?? terminalUi\n\n try {\n const argv = process.argv.slice(NODE_AND_SCRIPT_ARGUMENT_COUNT)\n const [commandName, ...commandArguments] = argv\n const extensionCommand = commandName === undefined ? undefined : extensions.commands?.get(commandName)\n if (extensionCommand !== undefined) return await extensionCommand({ argv: commandArguments, services, ui })\n\n return await runCommand(ui, argv)\n } catch (error) {\n const failure = classifyFailure(error, masker)\n if (failure.kind === 'usage') console.error(pc.red(failure.message))\n if (failure.kind === 'cancelled') ui.cancel('Cancelled.')\n if (failure.kind === 'failed' || failure.kind === 'unexpected') ui.log.error(failure.message)\n return exitCodeForFailure(failure)\n }\n}\n\nfunction listenForSigint(listener: () => void): () => void {\n process.once('SIGINT', listener)\n return () => process.removeListener('SIGINT', listener)\n}\n\nconst LAUNCH_BINARIES = listLaunchBinaries()\n\nconst HELP = renderHelp({\n harnessIds: harnesses.map((harness) => harness.id),\n launchBinaries: LAUNCH_BINARIES,\n predefinedModelIds: PREDEFINED_MODELS.map((model) => model.id),\n defaultModel: DEFAULT_MODEL,\n backupDirectories: {\n user: path.join('~', USER_BACKUP_DIRECTORY),\n project: `.${path.sep}${PROJECT_BACKUP_DIRECTORY}`,\n },\n})\n\nfunction describeUnknownAgent(binary: string): string {\n const oneOf = `One of: ${LAUNCH_BINARIES.join(', ')}`\n if (isAgentName(binary)) return `Unknown agent \"${binary}\". ${oneOf}`\n\n return `Unknown agent. ${oneOf}. To pass a key, use --key or set $${KEY_ENV_VARIABLE}.`\n}\n\nconst PackageSchema = v.object({ version: v.string() })\n\nfunction readCliVersion(): string {\n return v.parse(PackageSchema, createRequire(import.meta.url)('../package.json')).version\n}\n\nasync function runCommand(ui: TerminalUi, argv: readonly string[]): Promise<number> {\n const options = parseCliArguments(argv)\n\n if (options.shouldShowHelp) {\n console.log(HELP)\n return EXIT_CODE.ok\n }\n if (options.shouldShowVersion) {\n console.log(readCliVersion())\n return EXIT_CODE.ok\n }\n if (shouldOpenMenu({ argv, isInteractive: createContext().isInteractive })) return await runMenuSession(options, ui)\n\n if (options.command.kind === 'forget-key') return await forgetKey({ keystore, sessionStore, ui, masker })\n if (options.command.kind === 'login') {\n const ctx = createContext()\n return await runLogin({\n options: { shouldAssumeYes: options.shouldAssumeYes, keyName: options.keyName },\n ctx,\n ui,\n keystore,\n sessionStore,\n masker,\n fetch: identifiedFetch(ctx),\n spawn: crossSpawn,\n now: () => new Date(),\n environment: readEnvironmentInputs(ctx.env),\n })\n }\n if (options.command.kind === 'logout') {\n const ctx = createContext()\n return await runLogout({\n ui,\n keystore,\n sessionStore,\n masker,\n fetch: identifiedFetch(ctx),\n environment: readEnvironmentInputs(ctx.env),\n })\n }\n if (options.command.kind === 'launch') return await runLaunchCommand({ command: options.command, options, ui })\n if (options.command.kind === 'status') {\n const baseContext = createContext()\n return await runStatus({\n options,\n baseContext,\n ui,\n keystore,\n sessionStore,\n masker,\n fetch: identifiedFetch(baseContext),\n })\n }\n\n const commandParams = {\n options,\n baseContext: createContext(),\n ui,\n now: () => new Date(),\n masker,\n userEnvironment,\n }\n if (options.command.kind === 'restore') return await runRestore(commandParams)\n if (options.command.kind === 'change-model') {\n return await runChangeModel({ ...commandParams, fetch: identifiedFetch(commandParams.baseContext) })\n }\n\n const keyCommandParams = {\n ...commandParams,\n fetch: identifiedFetch(commandParams.baseContext),\n keystore,\n sessionStore,\n spawn: crossSpawn,\n }\n if (options.command.kind === 'change-key') return await runChangeKey(keyCommandParams)\n\n return await runSetup({ ...keyCommandParams, runNpm })\n}\n\nasync function runMenuSession(options: CliOptions, ui: TerminalUi): Promise<AgentExitCode> {\n const baseContext = createContext()\n const result = await runMenu({\n options,\n baseContext,\n ui,\n fetch: identifiedFetch(baseContext),\n now: () => new Date(),\n masker,\n keystore,\n sessionStore,\n spawn: crossSpawn,\n runNpm,\n userEnvironment,\n runLaunch: launchWithRunner,\n isLastKeyInterrupt: trackInterruptKey(process.stdin),\n })\n return passOnLaunchResult(result)\n}\n\nfunction identifiedFetch(ctx: PlatformContext): Fetch {\n return withUserAgent(fetch, `${COMMAND_NAME}/${readCliVersion()} (${ctx.platform})`)\n}\n\nfunction createContext(): PlatformContext {\n return createPlatformContext({\n home: os.homedir(),\n cwd: process.cwd(),\n platform: process.platform,\n env: process.env,\n isInteractive: process.stdin.isTTY === true && process.stdout.isTTY === true,\n hostname: os.hostname(),\n userName: readUserName({ userInfo: os.userInfo, env: process.env }),\n })\n}\n\ntype LaunchCommandParams = {\n command: Extract<Command, { kind: 'launch' }>\n options: CliOptions\n ui: TerminalUi\n}\n\nasync function runLaunchCommand({ command, options, ui }: LaunchCommandParams): Promise<AgentExitCode> {\n const { binary, passthrough } = command\n if (binary === undefined) return await startRequestedAgent({ agent: { kind: 'ask' }, passthrough, options, ui })\n\n const harness = findHarnessByBinary(binary)\n if (harness === undefined) {\n console.error(pc.red(masker.maskText(describeUnknownAgent(binary))))\n console.error(`\\n${HELP}`)\n return EXIT_CODE.usage\n }\n if (!isLaunchingHarness(harness)) {\n const reason =\n harness.kind === 'unsupported' ? `not configurable — ${harness.reason}` : 'cannot be started this way'\n console.error(pc.red(`${harness.label}: ${reason}`))\n return EXIT_CODE.usage\n }\n\n return await startRequestedAgent({ agent: { kind: 'named', harness }, passthrough, options, ui })\n}\n\ntype StartRequestedAgentParams = {\n agent: AgentRequest\n passthrough: readonly string[]\n options: CliOptions\n ui: TerminalUi\n}\n\nasync function startRequestedAgent({\n agent,\n passthrough,\n options,\n ui,\n}: StartRequestedAgentParams): Promise<AgentExitCode> {\n const ctx = createContext()\n const result = await startAgent({\n agent,\n passthrough,\n options,\n keystore,\n sessionStore,\n ui,\n masker,\n ctx,\n fetch: identifiedFetch(ctx),\n spawn: crossSpawn,\n now: () => new Date(),\n runLaunch: launchWithRunner,\n runNpm,\n })\n return passOnLaunchResult(result)\n}\n\nfunction passOnLaunchResult(result: LaunchResult): AgentExitCode {\n if ('signal' in result) {\n // Our own handlers are gone by now, so the default action ends this process too.\n process.kill(process.pid, result.signal)\n return EXIT_CODE.failed\n }\n return result.code\n}\n\nfunction finish(exitCode: number): void {\n // A hung keychain call leaves a native thread holding the event loop open; only a forced exit ends it.\n if (keystore.isHung) process.exit(exitCode)\n process.exitCode = exitCode\n}\n","import * as v from 'valibot'\nimport { AUTH_ENV_VARIABLE } from '../product/identity/identity-client'\nimport { INTERNAL_API_PROXY_ENV_VARIABLE } from '../product/internal-api-proxy/internal-api-proxy-client'\nimport { PUBLIC_API_ENV_VARIABLE } from '../product/public-api/desired-config'\nimport { normalizeModel } from '../product/public-api/models/predefined-models'\nimport { isAllowedHost } from '../shared/http/is-allowed-host'\nimport type { EnvironmentVariables } from '../shared/platform/platform-context'\nimport { hasLineBreak } from '../shared/text/has-line-break'\nimport { readNonBlank } from '../shared/text/read-non-blank'\nimport { trimTrailingSlashes } from '../shared/text/trim-trailing-slashes'\nimport { UsageError } from './errors/usage-error'\n\nexport const KEY_ENV_VARIABLE = 'NEXOS_API_KEY'\nexport const MODEL_ENV_VARIABLE = 'NEXOS_MODEL'\nexport { AUTH_ENV_VARIABLE, INTERNAL_API_PROXY_ENV_VARIABLE, PUBLIC_API_ENV_VARIABLE }\n\nexport type EnvironmentInputs = {\n key: string | undefined\n model: string | undefined\n publicApiHost: string | undefined\n authHost: string | undefined\n internalApiProxyHost: string | undefined\n}\n\nconst BlankAsAbsentSchema = v.pipe(v.optional(v.string()), v.transform(readNonBlank))\n\nconst ModelSchema = v.pipe(\n BlankAsAbsentSchema,\n v.transform((model) => (model === undefined ? undefined : normalizeModel(model))),\n)\n\nconst EnvironmentSchema = v.object({\n [KEY_ENV_VARIABLE]: BlankAsAbsentSchema,\n [MODEL_ENV_VARIABLE]: ModelSchema,\n [PUBLIC_API_ENV_VARIABLE]: BlankAsAbsentSchema,\n [AUTH_ENV_VARIABLE]: BlankAsAbsentSchema,\n [INTERNAL_API_PROXY_ENV_VARIABLE]: BlankAsAbsentSchema,\n})\n\nconst PUBLIC_API_UNSET_HINT = 'Unset it to use the nexos.ai Gateway.'\nconst AUTH_UNSET_HINT = 'Unset it to sign in at nexos.ai.'\nconst INTERNAL_API_PROXY_UNSET_HINT = 'Unset it to create keys at nexos.ai.'\n\nexport function readEnvironmentInputs(env: EnvironmentVariables): EnvironmentInputs {\n const parsed = v.safeParse(EnvironmentSchema, env)\n if (!parsed.success) throw new UsageError(parsed.issues[0].message)\n\n return {\n key: parsed.output[KEY_ENV_VARIABLE],\n model: parsed.output[MODEL_ENV_VARIABLE],\n publicApiHost: parseHostOverride({\n variable: PUBLIC_API_ENV_VARIABLE,\n value: parsed.output[PUBLIC_API_ENV_VARIABLE],\n unsetHint: PUBLIC_API_UNSET_HINT,\n }),\n authHost: parseHostOverride({\n variable: AUTH_ENV_VARIABLE,\n value: parsed.output[AUTH_ENV_VARIABLE],\n unsetHint: AUTH_UNSET_HINT,\n }),\n internalApiProxyHost: parseHostOverride({\n variable: INTERNAL_API_PROXY_ENV_VARIABLE,\n value: parsed.output[INTERNAL_API_PROXY_ENV_VARIABLE],\n unsetHint: INTERNAL_API_PROXY_UNSET_HINT,\n }),\n }\n}\n\nexport function parseEnvironmentKey(key: string | undefined): string | undefined {\n if (key !== undefined && hasLineBreak(key)) {\n throw new UsageError(`$${KEY_ENV_VARIABLE} contains a line break. Set it on one line, or pass --key.`)\n }\n\n return key\n}\n\ntype HostOverrideParams = { variable: string; value: string | undefined; unsetHint: string }\n\nfunction parseHostOverride({ variable, value, unsetHint }: HostOverrideParams): string | undefined {\n if (value === undefined) return undefined\n\n const host = trimTrailingSlashes(value)\n if (!URL.canParse(host)) throw new UsageError(`$${variable} is not a URL. ${unsetHint}`)\n if (!isAllowedHost(host)) {\n throw new UsageError(`$${variable} must be an https:// URL, or http:// on this machine. ${unsetHint}`)\n }\n return host\n}\n","import * as v from 'valibot'\n\n/** Malformed text reads as absent, so the caller can report an unreadable file; a real error still throws. */\nexport function parseJson(text: string): unknown {\n try {\n return JSON.parse(text)\n } catch (error) {\n if (error instanceof SyntaxError) return undefined\n throw error\n }\n}\n\nexport function parseJsonBody<TSchema extends v.GenericSchema>(\n schema: TSchema,\n text: string,\n): v.InferOutput<TSchema> | undefined {\n const result = v.safeParse(schema, parseJson(text))\n return result.success ? result.output : undefined\n}\n","import { match } from 'ts-pattern'\nimport { formatSeconds } from '../text/format-seconds'\n\nexport type TransportFailure = UnreachableError | RequestTimeoutError\n\nexport type UnreachableReason =\n | {\n kind: 'network'\n causeCode: string | undefined\n causeMessage: string\n }\n | { kind: 'redirect' }\n | { kind: 'invalid-header' }\n\nexport type UnreachableErrorParams = { endpoint: string; reason: UnreachableReason }\n\nexport class UnreachableError extends Error {\n readonly kind = 'unreachable'\n readonly endpoint: string\n readonly reason: UnreachableReason\n\n constructor({ endpoint, reason }: UnreachableErrorParams) {\n super(`${endpoint}: ${describeUnreachableReason(reason)}.`)\n this.name = 'UnreachableError'\n this.endpoint = endpoint\n this.reason = reason\n }\n}\n\nexport type RequestTimeoutErrorParams = { endpoint: string; timeoutMs: number }\n\nexport class RequestTimeoutError extends Error {\n readonly kind = 'timed-out'\n readonly endpoint: string\n readonly timeoutMs: number\n\n constructor({ endpoint, timeoutMs }: RequestTimeoutErrorParams) {\n super(`${endpoint}: ${describeTimeout(timeoutMs)}.`)\n this.name = 'RequestTimeoutError'\n this.endpoint = endpoint\n this.timeoutMs = timeoutMs\n }\n}\n\nexport type HttpStatusErrorParams = { endpoint: string; status: number; detail: string }\n\nexport class HttpStatusError extends Error {\n readonly endpoint: string\n readonly status: number\n readonly detail: string\n\n constructor({ endpoint, status, detail }: HttpStatusErrorParams) {\n super(`${endpoint} answered ${detail}`)\n this.name = 'HttpStatusError'\n this.endpoint = endpoint\n this.status = status\n this.detail = detail\n }\n}\n\nexport function isTransportFailure(error: unknown): error is TransportFailure {\n return error instanceof UnreachableError || error instanceof RequestTimeoutError\n}\n\nexport function describeTransportFailure(failure: TransportFailure): string {\n return match(failure)\n .with({ kind: 'unreachable' }, ({ reason }) => describeUnreachableReason(reason))\n .with({ kind: 'timed-out' }, ({ timeoutMs }) => describeTimeout(timeoutMs))\n .exhaustive()\n}\n\nfunction describeUnreachableReason(reason: UnreachableReason): string {\n return match(reason)\n .with({ kind: 'network' }, ({ causeCode, causeMessage }) => `could not connect (${causeCode ?? causeMessage})`)\n .with({ kind: 'redirect' }, () => 'answered with a redirect, which is refused')\n .with({ kind: 'invalid-header' }, () => 'not sent, as a header held a character HTTP cannot carry')\n .exhaustive()\n}\n\nfunction describeTimeout(timeoutMs: number): string {\n return `no response within ${formatSeconds(timeoutMs)}`\n}\n\nexport interface TextMasker {\n maskText(text: string): string\n}\n\nconst SNIPPET_MAX_LENGTH = 200\n\n// Masked before truncating: a secret cut short no longer matches, and would print in part.\nexport function formatHttpFailure(status: number, explanation: string, masker: TextMasker): string {\n const snippet = masker.maskText(explanation).replace(/\\s+/g, ' ').trim().slice(0, SNIPPET_MAX_LENGTH)\n return snippet === '' ? `HTTP ${status}` : `HTTP ${status} — ${snippet}`\n}\n","const MS_PER_SECOND = 1_000\n\nexport function formatSeconds(milliseconds: number): string {\n return `${milliseconds / MS_PER_SECOND}s`\n}\n","import { RequestTimeoutError, UnreachableError, type UnreachableReason } from './request-errors'\n\nexport type Fetch = (url: string, init: RequestInit) => Promise<Response>\n\nexport type SendRequestParams = {\n url: string\n init: RequestInit\n fetch: Fetch\n timeoutMs: number\n signal?: AbortSignal | undefined\n}\n\nexport type HttpResponse = { status: number; text: string }\n\nexport const REQUEST_TIMEOUT_MS = 15_000\n\nexport async function sendRequest(params: SendRequestParams): Promise<HttpResponse> {\n const { url, init } = params\n if (!hasValidHeaders(init.headers)) {\n throw new UnreachableError({ endpoint: url, reason: { kind: 'invalid-header' } })\n }\n\n const response = await exchangeWithinTimeout(params)\n if (isRedirectStatus(response.status)) {\n throw new UnreachableError({ endpoint: url, reason: { kind: 'redirect' } })\n }\n\n return response\n}\n\nconst SUCCESS_STATUS_MIN = 200\nconst SUCCESS_STATUS_MAX = 299\n\nexport function isSuccessStatus(status: number): boolean {\n return status >= SUCCESS_STATUS_MIN && status <= SUCCESS_STATUS_MAX\n}\n\nconst BEARER_PREFIX = 'Bearer '\n\nexport function buildBearerHeaders(token: string): { authorization: string } {\n return { authorization: `${BEARER_PREFIX}${token}` }\n}\n\nconst USER_AGENT_HEADER = 'user-agent'\n\nexport function withUserAgent(fetch: Fetch, userAgent: string): Fetch {\n return async (url, init) => {\n const headers = new Headers(init.headers)\n headers.set(USER_AGENT_HEADER, userAgent)\n return await fetch(url, { ...init, headers })\n }\n}\n\nfunction hasValidHeaders(headers: RequestInit['headers']): boolean {\n try {\n new Headers(headers)\n return true\n } catch {\n return false\n }\n}\n\nasync function exchangeWithinTimeout({\n url,\n init,\n fetch,\n timeoutMs,\n signal: cancelSignal,\n}: SendRequestParams): Promise<HttpResponse> {\n const timeoutSignal = AbortSignal.timeout(timeoutMs)\n const signal = cancelSignal === undefined ? timeoutSignal : AbortSignal.any([cancelSignal, timeoutSignal])\n try {\n return await rejectOnAbort(exchange(url, { ...init, redirect: 'manual', signal }, fetch), signal)\n } catch (error) {\n if (cancelSignal?.aborted === true) throw cancelSignal.reason\n if (timeoutSignal.aborted) throw new RequestTimeoutError({ endpoint: url, timeoutMs })\n const reason: UnreachableReason = {\n kind: 'network',\n causeCode: findCauseCode(error),\n causeMessage: findDeepestMessage(error),\n }\n throw new UnreachableError({ endpoint: url, reason })\n }\n}\n\n// oxlint-disable-next-line no-magic-numbers -- HTTP statuses, named by the list\nconst REDIRECT_STATUSES: readonly number[] = [301, 302, 303, 307, 308]\n\nfunction isRedirectStatus(status: number): boolean {\n return REDIRECT_STATUSES.includes(status)\n}\n\nasync function exchange(url: string, init: RequestInit, fetch: Fetch): Promise<HttpResponse> {\n const response = await fetch(url, init)\n return { status: response.status, text: await response.text() }\n}\n\nasync function rejectOnAbort<T>(work: Promise<T>, signal: AbortSignal): Promise<T> {\n const aborted = new Promise<never>((_resolve, reject) => {\n signal.addEventListener('abort', () => reject(signal.reason), { once: true })\n })\n return await Promise.race([work, aborted])\n}\n\nfunction findCauseCode(error: unknown): string | undefined {\n if (!(error instanceof Error)) return undefined\n if ('code' in error && typeof error.code === 'string') return error.code\n return findCauseCode(error.cause)\n}\n\nfunction findDeepestMessage(error: unknown): string {\n if (!(error instanceof Error)) return String(error)\n if (error.cause instanceof Error) return findDeepestMessage(error.cause)\n return error.message\n}\n","export type BuildAuthorizeUrlParams = {\n authorizationEndpoint: string\n clientId: string\n redirectUri: string\n scopes: readonly string[]\n state: string\n codeChallenge: string\n maxAgeSeconds?: number\n}\n\nconst CODE_CHALLENGE_METHOD = 'S256'\n\nconst RESPONSE_TYPE = 'code'\nconst SCOPE_SEPARATOR = ' '\n\nexport function buildAuthorizeUrl(params: BuildAuthorizeUrlParams): string {\n const url = new URL(params.authorizationEndpoint)\n url.searchParams.set('response_type', RESPONSE_TYPE)\n url.searchParams.set('client_id', params.clientId)\n url.searchParams.set('redirect_uri', params.redirectUri)\n url.searchParams.set('scope', params.scopes.join(SCOPE_SEPARATOR))\n url.searchParams.set('state', params.state)\n url.searchParams.set('code_challenge', params.codeChallenge)\n url.searchParams.set('code_challenge_method', CODE_CHALLENGE_METHOD)\n if (params.maxAgeSeconds !== undefined) url.searchParams.set('max_age', String(params.maxAgeSeconds))\n return url.toString()\n}\n","export function trimTrailingSlashes(text: string): string {\n return text.replace(/\\/+$/, '')\n}\n","import * as v from 'valibot'\n\nexport const TokenResponseSchema = v.pipe(\n v.object({\n access_token: v.pipe(v.string(), v.nonEmpty()),\n token_type: v.string(),\n expires_in: v.optional(v.number()),\n refresh_token: v.optional(v.pipe(v.string(), v.nonEmpty())),\n id_token: v.optional(v.string()),\n scope: v.optional(v.string()),\n }),\n v.transform((body) => ({\n accessToken: body.access_token,\n refreshToken: body.refresh_token,\n idToken: body.id_token,\n expiresInSeconds: body.expires_in,\n })),\n)\n\nexport type TokenSet = v.InferOutput<typeof TokenResponseSchema>\n\nexport const OAuthErrorSchema = v.object({ error: v.string(), error_description: v.optional(v.string()) })\n\nexport const INVALID_GRANT = 'invalid_grant'\n","import { parseJsonBody } from '../../shared/file-formats/json/parse-json'\nimport { formatHttpFailure } from '../../shared/http/request-errors'\nimport {\n REQUEST_TIMEOUT_MS,\n isSuccessStatus,\n sendRequest,\n type Fetch,\n type HttpResponse,\n} from '../../shared/http/send-request'\nimport { buildAuthorizeUrl } from '../../shared/oauth/authorize-url'\nimport type { Authorization, AuthorizationRequest } from '../../shared/oauth/local-auth-server'\nimport { trimTrailingSlashes } from '../../shared/text/trim-trailing-slashes'\nimport type { Masker } from '../secrets/masker'\nimport { OAuthErrorSchema, TokenResponseSchema, type TokenSet } from './token-schemas'\n\nexport const AUTH_HOST = 'https://auth.nexos.ai'\n\nexport const AUTH_ENV_VARIABLE = 'NEXOS_AUTH_URL'\n\nexport type TokenTypeHint = 'access_token' | 'refresh_token'\n\nexport type IdentityCallOptions = { signal?: AbortSignal | undefined }\n\nexport interface IdentityClient {\n buildAuthorizeUrl(request: AuthorizationRequest): string\n exchangeCode(authorization: Authorization, options?: IdentityCallOptions): Promise<TokenSet>\n refreshTokens(refreshToken: string): Promise<TokenSet>\n revokeToken(token: string, tokenTypeHint: TokenTypeHint): Promise<void>\n}\n\nexport type IdentityErrorParams = { endpoint: string; status: number; oauthError: string | undefined; detail: string }\n\nexport class IdentityError extends Error {\n readonly endpoint: string\n readonly status: number\n readonly oauthError: string | undefined\n readonly detail: string\n\n constructor({ endpoint, status, oauthError, detail }: IdentityErrorParams) {\n super(`${endpoint}: ${detail}`)\n this.name = 'IdentityError'\n this.endpoint = endpoint\n this.status = status\n this.oauthError = oauthError\n this.detail = detail\n }\n}\n\nexport type CreateIdentityClientParams = { host: string; fetch: Fetch; masker: Masker }\n\nconst CLIENT_ID = '66b37ea8-f042-4db2-857d-2bae1811d4f0'\nconst SCOPES = ['openid', 'email', 'profile', 'offline_access'] as const\nconst MAX_AGE_SECONDS = 300\nconst FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded'\n\nexport function createIdentityClient({ host, fetch, masker }: CreateIdentityClientParams): IdentityClient {\n const baseUrl = trimTrailingSlashes(host)\n const postForm = async ({ path, fields, signal }: FormRoute): Promise<FormReply> => {\n const endpoint = `${baseUrl}${path}`\n const response = await sendRequest({\n url: endpoint,\n init: {\n method: 'POST',\n headers: { 'content-type': FORM_CONTENT_TYPE },\n body: new URLSearchParams({ ...fields, client_id: CLIENT_ID }).toString(),\n },\n fetch,\n timeoutMs: REQUEST_TIMEOUT_MS,\n signal,\n })\n if (!isSuccessStatus(response.status)) throw toIdentityError(endpoint, response, masker)\n\n return { endpoint, response }\n }\n\n return {\n buildAuthorizeUrl: (request) =>\n buildAuthorizeUrl({\n ...request,\n authorizationEndpoint: `${baseUrl}/oauth2/auth`,\n clientId: CLIENT_ID,\n scopes: SCOPES,\n maxAgeSeconds: MAX_AGE_SECONDS,\n }),\n\n exchangeCode: async ({ code, codeVerifier, redirectUri }, options = {}) => {\n const reply = await postForm({\n path: '/oauth2/token',\n fields: {\n grant_type: 'authorization_code',\n code,\n redirect_uri: redirectUri,\n code_verifier: codeVerifier,\n },\n signal: options.signal,\n })\n return readTokenSet({ ...reply, previousRefreshToken: undefined, masker })\n },\n\n refreshTokens: async (refreshToken) => {\n const reply = await postForm({\n path: '/oauth2/token',\n fields: { grant_type: 'refresh_token', refresh_token: refreshToken },\n })\n return readTokenSet({ ...reply, previousRefreshToken: refreshToken, masker })\n },\n\n revokeToken: async (token, tokenTypeHint) => {\n await postForm({ path: '/oauth2/revoke', fields: { token, token_type_hint: tokenTypeHint } })\n },\n }\n}\n\ntype FormRoute = { path: string; fields: Record<string, string>; signal?: AbortSignal | undefined }\n\ntype FormReply = { endpoint: string; response: HttpResponse }\n\nfunction toIdentityError(endpoint: string, { status, text }: HttpResponse, masker: Masker): IdentityError {\n const oauthError = parseJsonBody(OAuthErrorSchema, text)\n const explanation = oauthError?.error_description ?? oauthError?.error ?? text\n return new IdentityError({\n endpoint,\n status,\n oauthError: oauthError?.error,\n detail: formatHttpFailure(status, explanation, masker),\n })\n}\n\ntype ReadTokenSetParams = FormReply & { previousRefreshToken: string | undefined; masker: Masker }\n\nfunction readTokenSet({ endpoint, response, previousRefreshToken, masker }: ReadTokenSetParams): TokenSet {\n const parsed = parseJsonBody(TokenResponseSchema, response.text)\n if (parsed === undefined) {\n throw new IdentityError({\n endpoint,\n status: response.status,\n oauthError: undefined,\n detail: 'nexos.ai sent a sign-in reply that could not be read',\n })\n }\n\n const tokenSet: TokenSet = { ...parsed, refreshToken: parsed.refreshToken ?? previousRefreshToken }\n masker.registerSecrets(\n [tokenSet.accessToken, tokenSet.refreshToken, tokenSet.idToken].filter((token) => token !== undefined),\n )\n return tokenSet\n}\n","import * as v from 'valibot'\nimport { API_KEYS_URL } from '../public-api/desired-config'\n\nexport const IssuedApiKeySchema = v.pipe(\n v.looseObject({\n id: v.pipe(v.string(), v.nonEmpty()),\n api_key: v.pipe(v.string(), v.nonEmpty()),\n name: v.string(),\n }),\n v.transform((body) => ({ keyId: body.id, key: body.api_key, keyName: body.name })),\n)\n\nexport type IssuedApiKey = v.InferOutput<typeof IssuedApiKeySchema>\n\nexport class ApiKeyNameTakenError extends Error {\n readonly keyName: string\n\n constructor(keyName: string) {\n super(`A key named \"${keyName}\" already exists.`)\n this.name = 'ApiKeyNameTakenError'\n this.keyName = keyName\n }\n}\n\nexport const NO_PUBLIC_API_ACCESS =\n 'Your nexos.ai account has no access to the Gateway, so no key was created. ' +\n 'Ask your workspace owner to give you access, then try again.'\n\nexport class NoPublicApiAccessError extends Error {\n constructor() {\n super(NO_PUBLIC_API_ACCESS)\n this.name = 'NoPublicApiAccessError'\n }\n}\n\nexport const KEY_NAME_TAKEN_CODE = 100502\n\nexport class KeyRotationRefusedError extends Error {\n constructor(keyId: string) {\n super(\n `nexos.ai refused to rotate key ${keyId}: your account has no access to the Gateway. ` +\n 'The key was not changed, so its current value still works. ' +\n 'Ask your workspace owner for access, then try again.',\n )\n this.name = 'KeyRotationRefusedError'\n }\n}\n\nexport class ApiKeyNotFoundError extends Error {\n constructor(keyId: string) {\n super(\n `Your nexos.ai account has no personal key with ID ${keyId}. ` +\n `Copy the ID of one of your own keys from ${API_KEYS_URL}, then try again.`,\n )\n this.name = 'ApiKeyNotFoundError'\n }\n}\n\nexport type KeyRotationUnconfirmedErrorParams = { keyId: string; requestId: string }\n\nexport class KeyRotationUnconfirmedError extends Error {\n readonly requestId: string\n\n constructor({ keyId, requestId }: KeyRotationUnconfirmedErrorParams) {\n super(\n `nexos.ai did not confirm whether key ${keyId} was rotated (request ID ${requestId}). ` +\n 'If it was, its current value no longer works. Try again to rotate it and get a new value.',\n )\n this.name = 'KeyRotationUnconfirmedError'\n this.requestId = requestId\n }\n}\n","const LOOPBACK_HOSTNAMES = ['localhost', '127.0.0.1', '[::1]']\n\nexport function isAllowedHost(host: string): boolean {\n if (!URL.canParse(host)) return false\n\n const { protocol, hostname, pathname } = new URL(host)\n if (pathname !== '/' && pathname !== '') return false\n return protocol === 'https:' || (protocol === 'http:' && LOOPBACK_HOSTNAMES.includes(hostname))\n}\n","import { isAllowedHost } from '../../shared/http/is-allowed-host'\nimport type { EnvironmentVariables } from '../../shared/platform/platform-context'\nimport { trimTrailingSlashes } from '../../shared/text/trim-trailing-slashes'\n\nexport type DesiredConfig = {\n anthropicBaseUrl: string\n openaiBaseUrl: string\n apiKey: string\n model: string\n}\n\n// Keyed by harness id.\nexport type DesiredByAgent = ReadonlyMap<string, DesiredConfig>\n\nexport const PUBLIC_API_HOST = 'https://api.nexos.ai'\n\nexport const PUBLIC_API_ENV_VARIABLE = 'NEXOS_BASE_URL'\n\nexport const API_KEYS_URL = 'https://workspace.nexos.ai/gateway/api-keys'\n\nexport function resolvePublicApiHost(env: EnvironmentVariables): string {\n const configured = trimTrailingSlashes(env[PUBLIC_API_ENV_VARIABLE]?.trim() ?? '')\n return isAllowedHost(configured) ? configured : PUBLIC_API_HOST\n}\n\nexport type PublicApiUrls = Pick<DesiredConfig, 'anthropicBaseUrl' | 'openaiBaseUrl'>\n\nconst OPENAI_PATH = '/v1'\n\nexport function buildPublicApiUrls(host: string): PublicApiUrls {\n return { anthropicBaseUrl: host, openaiBaseUrl: `${host}${OPENAI_PATH}` }\n}\n\nexport type BuildDesiredConfigParams = { publicApiUrls: PublicApiUrls; apiKey: string; model: string }\n\nexport function buildDesiredConfig({ publicApiUrls, apiKey, model }: BuildDesiredConfigParams): DesiredConfig {\n return { ...publicApiUrls, apiKey, model }\n}\n","import * as v from 'valibot'\nimport { parseJsonBody } from '../../shared/file-formats/json/parse-json'\nimport { formatHttpFailure, type TextMasker } from '../../shared/http/request-errors'\n\nexport function formatProxyFailure(status: number, text: string, masker: TextMasker): string {\n return formatHttpFailure(status, parseProxyErrorBody(text)?.message ?? text, masker)\n}\n\n// The proxy wraps its own failures as the internal API does, `{ error: { code, message } }`: its codes are strings\n// (`not_found`), the internal API's numbers (`100502`).\nconst ProxyErrorBodySchema = v.pipe(\n v.looseObject({\n error: v.looseObject({\n code: v.optional(v.union([v.number(), v.string()])),\n message: v.optional(v.string()),\n }),\n }),\n v.transform(({ error }) => ({ code: error.code, message: error.message })),\n)\n\nexport type ProxyErrorBody = v.InferOutput<typeof ProxyErrorBodySchema>\n\nexport function parseProxyErrorBody(text: string): ProxyErrorBody | undefined {\n return parseJsonBody(ProxyErrorBodySchema, text)\n}\n","import { randomUUID } from 'node:crypto'\nimport type * as v from 'valibot'\nimport { parseJsonBody } from '../../shared/file-formats/json/parse-json'\nimport { HttpStatusError, isTransportFailure, type TransportFailure } from '../../shared/http/request-errors'\nimport {\n REQUEST_TIMEOUT_MS,\n buildBearerHeaders,\n isSuccessStatus,\n sendRequest,\n type Fetch,\n type HttpResponse,\n} from '../../shared/http/send-request'\nimport type { Masker } from '../secrets/masker'\nimport { formatProxyFailure } from './format-proxy-failure'\n\nexport type Authorize = <T>(send: (accessToken: string) => Promise<T>) => Promise<T>\n\nexport type ProxyCallOptions = { signal?: AbortSignal | undefined }\n\nexport type ProxyFailure =\n | { kind: 'answered'; requestId: string; status: number; text: string }\n | { kind: 'unanswered'; requestId: string; error: TransportFailure }\n\nexport type FailureRule = (failure: ProxyFailure) => Error | undefined\n\nexport type ProxyRoute<TSchema extends v.GenericSchema> = {\n method: 'GET' | 'POST' | 'PATCH'\n path: string\n body?: Record<string, string>\n schema: TSchema\n unreadableDetail: string\n failures?: readonly FailureRule[]\n secretsOf?: (output: v.InferOutput<TSchema>) => string[]\n}\n\nexport type ProxyRequest = <TSchema extends v.GenericSchema>(\n route: ProxyRoute<TSchema>,\n options?: ProxyCallOptions,\n) => Promise<v.InferOutput<TSchema>>\n\nexport type CreateProxyRequestParams = { baseUrl: string; fetch: Fetch; masker: Masker; authorize: Authorize }\n\nexport function createProxyRequest(params: CreateProxyRequestParams): ProxyRequest {\n return async (route, options = {}) =>\n await params.authorize(\n async (accessToken) => await sendOnce({ ...params, route, accessToken, signal: options.signal }),\n )\n}\n\ntype SendOnceParams<TSchema extends v.GenericSchema> = CreateProxyRequestParams & {\n route: ProxyRoute<TSchema>\n accessToken: string\n signal: AbortSignal | undefined\n}\n\nasync function sendOnce<TSchema extends v.GenericSchema>(\n params: SendOnceParams<TSchema>,\n): Promise<v.InferOutput<TSchema>> {\n const { baseUrl, fetch, masker, route, accessToken, signal } = params\n const url = `${baseUrl}${route.path}`\n const requestId = randomUUID()\n const failures = route.failures ?? []\n const init = buildInit({ accessToken, requestId, route })\n const response = await exchange({ url, init, fetch, signal, requestId, failures })\n if (!isSuccessStatus(response.status)) throw describeFailure({ url, requestId, failures, response, masker })\n\n const output = parseJsonBody(route.schema, response.text)\n if (output === undefined) {\n const detail = `HTTP ${response.status} — ${route.unreadableDetail}${nameRequest(requestId)}`\n throw new HttpStatusError({ endpoint: url, status: response.status, detail })\n }\n\n masker.registerSecrets(route.secretsOf?.(output) ?? [])\n return output\n}\n\nconst JSON_CONTENT_TYPE = 'application/json'\nconst REQUEST_ID_HEADER = 'x-request-id'\n\ntype BuildInitParams = {\n accessToken: string\n requestId: string\n route: Pick<ProxyRoute<v.GenericSchema>, 'method' | 'body'>\n}\n\nfunction buildInit({ accessToken, requestId, route: { method, body } }: BuildInitParams): RequestInit {\n const headers = { ...buildBearerHeaders(accessToken), [REQUEST_ID_HEADER]: requestId }\n if (body === undefined) return { method, headers }\n\n return { method, headers: { ...headers, 'content-type': JSON_CONTENT_TYPE }, body: JSON.stringify(body) }\n}\n\ntype ExchangeParams = {\n url: string\n init: RequestInit\n fetch: Fetch\n signal: AbortSignal | undefined\n requestId: string\n failures: readonly FailureRule[]\n}\n\nasync function exchange({ requestId, failures, ...request }: ExchangeParams): Promise<HttpResponse> {\n try {\n return await sendRequest({ ...request, timeoutMs: REQUEST_TIMEOUT_MS })\n } catch (error) {\n if (!isTransportFailure(error)) throw error\n throw claimFailure(failures, { kind: 'unanswered', requestId, error }) ?? error\n }\n}\n\ntype DescribeFailureParams = {\n url: string\n requestId: string\n failures: readonly FailureRule[]\n response: HttpResponse\n masker: Masker\n}\n\nfunction describeFailure({ url, requestId, failures, response, masker }: DescribeFailureParams): Error {\n const { status, text } = response\n const claimed = claimFailure(failures, { kind: 'answered', requestId, status, text })\n if (claimed !== undefined) return claimed\n\n const detail = `${formatProxyFailure(status, text, masker)}${nameRequest(requestId)}`\n return new HttpStatusError({ endpoint: url, status, detail })\n}\n\nfunction claimFailure(failures: readonly FailureRule[], failure: ProxyFailure): Error | undefined {\n return failures.map((rule) => rule(failure)).find((error) => error !== undefined)\n}\n\nfunction nameRequest(requestId: string): string {\n return ` (request ID ${requestId})`\n}\n","import * as v from 'valibot'\n\nexport const UserProfileSchema = v.looseObject({\n id: v.pipe(v.string(), v.nonEmpty()),\n email: v.pipe(v.string(), v.nonEmpty()),\n})\n\nexport type UserProfile = v.InferOutput<typeof UserProfileSchema>\n","import type { Fetch } from '../../shared/http/send-request'\nimport { trimTrailingSlashes } from '../../shared/text/trim-trailing-slashes'\nimport type { Masker } from '../secrets/masker'\nimport {\n ApiKeyNameTakenError,\n ApiKeyNotFoundError,\n IssuedApiKeySchema,\n KEY_NAME_TAKEN_CODE,\n KeyRotationRefusedError,\n KeyRotationUnconfirmedError,\n NoPublicApiAccessError,\n type IssuedApiKey,\n} from './api-keys'\nimport { parseProxyErrorBody } from './format-proxy-failure'\nimport {\n createProxyRequest,\n type Authorize,\n type FailureRule,\n type ProxyCallOptions,\n type ProxyFailure,\n} from './proxy-request'\nimport { UserProfileSchema, type UserProfile } from './user-profile'\n\nexport const INTERNAL_API_PROXY_HOST = 'https://comms.nexos.ai'\n\nexport const INTERNAL_API_PROXY_ENV_VARIABLE = 'NEXOS_INTERNAL_API_PROXY_URL'\n\nexport interface InternalApiProxyClient {\n readProfile(options?: ProxyCallOptions): Promise<UserProfile>\n createApiKey(keyName: string, options?: ProxyCallOptions): Promise<IssuedApiKey>\n rotateApiKey(keyId: string, options?: ProxyCallOptions): Promise<IssuedApiKey>\n withAccessToken(accessToken: string): InternalApiProxyClient\n}\n\nexport type CreateInternalApiProxyClientParams = { host: string; fetch: Fetch; masker: Masker; authorize: Authorize }\n\nexport function createInternalApiProxyClient(params: CreateInternalApiProxyClientParams): InternalApiProxyClient {\n const { host, fetch, masker, authorize } = params\n const request = createProxyRequest({ baseUrl: trimTrailingSlashes(host), fetch, masker, authorize })\n\n return {\n readProfile: async (options) =>\n await request(\n {\n method: 'GET',\n path: '/cli/v1/user/profile',\n schema: UserProfileSchema,\n unreadableDetail: 'the profile could not be read',\n },\n options,\n ),\n\n createApiKey: async (keyName, options) =>\n await request(\n {\n method: 'POST',\n path: '/cli/v1/user/api-keys',\n body: { name: keyName },\n schema: IssuedApiKeySchema,\n unreadableDetail: 'the created key could not be read',\n failures: [rejectWithoutGatewayAccess, rejectTakenName(keyName)],\n secretsOf: (created) => [created.key],\n },\n options,\n ),\n\n rotateApiKey: async (keyId, options) =>\n await request(\n {\n method: 'PATCH',\n path: `/cli/v1/user/api-keys/${encodeURIComponent(keyId)}/regenerate`,\n schema: IssuedApiKeySchema,\n unreadableDetail:\n 'the key was rotated, but its new value could not be read, so its old value no longer works',\n failures: [\n refuseRotationWithoutGatewayAccess(keyId),\n rejectUnknownKey(keyId),\n flagUnconfirmedRotation(keyId),\n ],\n secretsOf: (rotated) => [rotated.key],\n },\n options,\n ),\n\n withAccessToken: (accessToken) =>\n createInternalApiProxyClient({ ...params, authorize: async (send) => await send(accessToken) }),\n }\n}\n\nconst NO_GATEWAY_ACCESS_STATUS = 403\n\nconst rejectWithoutGatewayAccess: FailureRule = (failure) =>\n isAnsweredWith(failure, NO_GATEWAY_ACCESS_STATUS) ? new NoPublicApiAccessError() : undefined\n\nfunction isAnsweredWith(failure: ProxyFailure, status: number): boolean {\n return failure.kind === 'answered' && failure.status === status\n}\n\nfunction rejectTakenName(keyName: string): FailureRule {\n return (failure) =>\n failure.kind === 'answered' && parseProxyErrorBody(failure.text)?.code === KEY_NAME_TAKEN_CODE\n ? new ApiKeyNameTakenError(keyName)\n : undefined\n}\n\nfunction refuseRotationWithoutGatewayAccess(keyId: string): FailureRule {\n return (failure) =>\n isAnsweredWith(failure, NO_GATEWAY_ACCESS_STATUS) ? new KeyRotationRefusedError(keyId) : undefined\n}\n\nconst NOT_FOUND_STATUS = 404\nconst ROUTE_NOT_FOUND_CODE = 'not_found'\n\n// The proxy's own `not_found` means it has no such route, as a proxy older than rotation answers; the internal API's\n// 404 means the account has no such key.\nfunction rejectUnknownKey(keyId: string): FailureRule {\n return (failure) => {\n if (failure.kind !== 'answered' || failure.status !== NOT_FOUND_STATUS) return undefined\n if (parseProxyErrorBody(failure.text)?.code === ROUTE_NOT_FOUND_CODE) return undefined\n\n return new ApiKeyNotFoundError(keyId)\n }\n}\n\n// The internal API may still rotate the key after the proxy, or this CLI, stops waiting for its answer.\nfunction flagUnconfirmedRotation(keyId: string): FailureRule {\n return (failure) =>\n isOutcomeUnknown(failure) ? new KeyRotationUnconfirmedError({ keyId, requestId: failure.requestId }) : undefined\n}\n\nconst BAD_GATEWAY_STATUS = 502\nconst GATEWAY_TIMEOUT_STATUS = 504\n\nfunction isOutcomeUnknown(failure: ProxyFailure): boolean {\n if (failure.kind === 'answered') {\n return failure.status === BAD_GATEWAY_STATUS || failure.status === GATEWAY_TIMEOUT_STATUS\n }\n\n const { error } = failure\n return error.kind === 'timed-out' || error.reason.kind === 'network'\n}\n","export const PREDEFINED_MODELS = [{ id: 'smart-router', hint: 'nexos.ai router — the default' }] as const\n\nexport const DEFAULT_MODEL: string = PREDEFINED_MODELS[0].id\n\n/** Claude Code's own syntax for the router at 1M context; every other agent would send it verbatim. */\nexport const ONE_MILLION_CONTEXT_ROUTER = `${DEFAULT_MODEL}[1m]`\n\nexport function isPredefinedModel(model: string): boolean {\n return PREDEFINED_MODELS.some((predefined) => predefined.id === model)\n}\n\n// The gateway refuses a router prompt over 1,048,572 tokens; Claude Code's `[1m]` assumes 1,000,000 as well.\nconst ROUTER_CONTEXT_TOKENS = 1_000_000\n\n/** The window to give an agent that cannot know the model's own; undefined for any model but the router. */\nexport function findContextWindow(model: string): number | undefined {\n return model === DEFAULT_MODEL ? ROUTER_CONTEXT_TOKENS : undefined\n}\n\nexport function normalizeModel(model: string): string {\n return model === ONE_MILLION_CONTEXT_ROUTER ? DEFAULT_MODEL : model\n}\n","const LINE_BREAK_PATTERN = /[\\r\\n]/\n\nexport function hasLineBreak(text: string): boolean {\n return LINE_BREAK_PATTERN.test(text)\n}\n","export function readNonBlank(value: string | undefined): string | undefined {\n const trimmed = value?.trim()\n return trimmed === '' ? undefined : trimmed\n}\n","export class UsageError extends Error {\n override readonly name = 'UsageError'\n}\n","import { match } from 'ts-pattern'\nimport type { Masker } from '../../product/secrets/masker'\nimport { describeError } from '../../shared/text/describe-error'\nimport { CancelledError } from '../../ui/terminal/cancelled-error'\nimport { EXIT_CODE, type ExitCode } from '../exit-code'\nimport { FailedRunError } from './failed-run-error'\nimport { UsageError } from './usage-error'\n\nexport type Failure =\n | { kind: 'usage'; message: string }\n | { kind: 'cancelled' }\n | { kind: 'failed'; message: string }\n | { kind: 'unexpected'; message: string }\n\nconst UNEXPECTED_NEXT_STEP =\n 'Run again with --dry-run to see what would change. If this keeps happening, it is a bug — please report it.'\n\nexport function classifyFailure(error: unknown, masker: Masker): Failure {\n if (error instanceof CancelledError) return { kind: 'cancelled' }\n\n const message = masker.maskText(describeError(error))\n if (error instanceof UsageError) return { kind: 'usage', message }\n if (error instanceof FailedRunError) return { kind: 'failed', message }\n\n return { kind: 'unexpected', message: `${message}\\n${UNEXPECTED_NEXT_STEP}` }\n}\n\nexport function exitCodeForFailure(failure: Failure): ExitCode {\n return match(failure.kind)\n .with('usage', () => EXIT_CODE.usage)\n .with('cancelled', () => EXIT_CODE.cancelled)\n .with('failed', () => EXIT_CODE.failed)\n .with('unexpected', () => EXIT_CODE.failed)\n .exhaustive()\n}\n","export function describeError(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","import * as clack from '@clack/prompts'\n\nexport class CancelledError extends Error {\n constructor() {\n super('cancelled by the user')\n this.name = 'CancelledError'\n }\n}\n\n// Narrowing on clack's cancel symbol leaves the wider `symbol` in the union, hence the cast.\nexport async function throwIfCancelled<T>(pending: Promise<T | symbol>): Promise<Exclude<T, symbol>> {\n const value = await pending\n if (clack.isCancel(value)) throw new CancelledError()\n return value as Exclude<T, symbol>\n}\n","export class FailedRunError extends Error {\n override readonly name = 'FailedRunError'\n}\n","import * as v from 'valibot'\nimport { API_KEYS_URL } from '../product/public-api/desired-config'\nimport { UsageError } from './errors/usage-error'\n\nexport const IS_KEY_ID_ENABLED: boolean = false\n\nexport const KEY_ID_ON_DRY_RUN = '--key-id rotates the key at nexos.ai, so it cannot be used with --dry-run.'\n\nconst KeyIdSchema = v.pipe(v.string(), v.trim(), v.uuid(), v.toLowerCase())\n\n// The value is never echoed: a key pasted here by mistake must not reach the terminal.\nexport function parseKeyId(value: string): string {\n const result = v.safeParse(KeyIdSchema, value)\n if (!result.success) {\n throw new UsageError(\n '--key-id must be the ID of one of your keys, a UUID such as 3f2b8c1e-6d4a-4f7e-9b2c-1a5d8e7f6c4b. ' +\n `Copy it from ${API_KEYS_URL}.`,\n )\n }\n\n return result.output\n}\n","import { API_KEYS_URL } from '../product/public-api/desired-config'\nimport { KEY_ENV_VARIABLE, MODEL_ENV_VARIABLE } from './environment'\nimport { EXIT_CODE } from './exit-code'\nimport { IS_KEY_ID_ENABLED } from './parse-key-id'\n\nexport const COMMAND_NAME = 'nexos-connect'\nexport const SETUP_COMMAND = 'setup'\nexport const LAUNCH_COMMAND = 'launch'\nexport const RESTORE_COMMAND = 'restore'\nexport const STATUS_COMMAND = 'status'\nexport const LOGIN_COMMAND = 'login'\nexport const LOGOUT_COMMAND = 'logout'\nexport const CHANGE_KEY_COMMAND = 'change-key'\nexport const CHANGE_MODEL_COMMAND = 'change-model'\nexport const TAGLINE = `${COMMAND_NAME} — point your coding agents at the nexos.ai Gateway`\n\nexport type RenderHelpParams = {\n harnessIds: readonly string[]\n launchBinaries: readonly string[]\n predefinedModelIds: readonly string[]\n defaultModel: string\n backupDirectories: { user: string; project: string }\n}\n\nconst KEY_ID_OPTION = IS_KEY_ID_ENABLED\n ? `\n --key-id <id> Rotate one of your personal keys, named by its ID from\n ${API_KEYS_URL}, and use its new value.\n Its current value stops working at once, wherever it is used.\n Asks first unless --yes. Uses your saved sign-in, else opens\n the browser to sign in. Not with --key, --key-name or --dry-run.`\n : ''\n\nexport const LAUNCH_KEY_FLAGS = IS_KEY_ID_ENABLED ? '--key, --key-id, --key-name' : '--key, --key-name'\n\nconst KEY_ID_EXIT_LINE = IS_KEY_ID_ENABLED\n ? '\\n With --key-id: signing in or rotating the key failed.'\n : ''\n\nexport function renderHelp({\n harnessIds,\n launchBinaries,\n predefinedModelIds,\n defaultModel,\n backupDirectories,\n}: RenderHelpParams): string {\n const predefinedModels = predefinedModelIds.join(', ')\n return `${TAGLINE}\n\nUsage\n ${COMMAND_NAME} in a terminal, open the menu described below\n ${COMMAND_NAME} [options] point the agents at the gateway\n ${COMMAND_NAME} ${SETUP_COMMAND} [options] the same, by name\n ${COMMAND_NAME} <agent> [options] [-- <agent arguments>]\n ${COMMAND_NAME} ${LAUNCH_COMMAND} [<agent>] [options] [-- <agent arguments>]\n ${COMMAND_NAME} forget-key\n ${COMMAND_NAME} ${CHANGE_KEY_COMMAND} [options] give the configured agents a new key\n ${COMMAND_NAME} ${CHANGE_MODEL_COMMAND} [options] give the configured agents a new model\n ${COMMAND_NAME} ${RESTORE_COMMAND} [options] put back what it changed in each agent's config\n ${COMMAND_NAME} ${STATUS_COMMAND} [options] report what is configured, and whether it still matches\n ${COMMAND_NAME} ${LOGIN_COMMAND} [options] sign in with your nexos.ai account and create a key\n ${COMMAND_NAME} ${LOGOUT_COMMAND} sign out and clear the saved key from this machine\n\n <agent> starts one agent once, pointed at the gateway, without changing its config;\n ${LAUNCH_COMMAND} <agent> does the same, and ${LAUNCH_COMMAND} alone asks which agent to start.\n One of: ${launchBinaries.join(', ')}.\n\nWith no options in a terminal, it opens a menu: set up agents, launch one, change the key or\nthe model, restore. The menu never takes $${KEY_ENV_VARIABLE} or $${MODEL_ENV_VARIABLE} as an answer.\nEvery question has a flag that answers it, so the flags exist for scripting and CI as much as\nfor convenience.\n\n${CHANGE_KEY_COMMAND} gives the agents configured at a scope a new key; each keeps its model. Only\n--key answers its key question, never $${KEY_ENV_VARIABLE}; --yes changes every configured\nagent it can and reports the rest. It takes --scope, --harnesses, --key, --key-name,\n--save-key, --no-verify, --dry-run, --backup-dir and --yes.\n\n${CHANGE_MODEL_COMMAND} gives the agents configured at a scope a new model; each keeps its key,\nwhich is not checked again. Only --model answers its model question, never $${MODEL_ENV_VARIABLE};\n--yes changes every configured agent it can and reports the rest, and needs --model. It takes\n--scope, --harnesses, --model, --save-model, --no-verify, --dry-run, --backup-dir and --yes.\n\n${RESTORE_COMMAND} puts every key ${COMMAND_NAME} set back the way it was before the first\nsetup, and keeps everything added since. It takes --harnesses, --scope, --yes,\n--dry-run and --backup-dir; --yes restores every agent it has a record of.\n\n${STATUS_COMMAND} is read-only: it reports the key, the env file, the backup folders and every\nagent, at user and project scope. It takes --harnesses, --verify and --json.\n\n${LOGIN_COMMAND} opens your browser to sign in to nexos.ai, then creates a personal Gateway API\nkey named after this machine and keeps you signed in through your system keychain, so\nsetup and starting an agent can use it without pasting a key. It takes --key-name to\nname the key, and --yes to take the default name and replace a saved key without\nasking. It needs a terminal, a system keychain and a browser on this machine; without\nthem, create a key at ${API_KEYS_URL} and pass it with\n--key. That page also gives a key a spending limit or an expiry date. No command\ndeletes a key: an old one stays active until you delete it there.\n${LOGOUT_COMMAND} signs you out and clears the saved key from this machine; forget-key clears\nthis machine without signing you out at nexos.ai.\n\nOptions\n --harnesses <ids> Comma-separated agent ids; skips the picker.\n One of: ${harnessIds.join(', ')}\n --key <key> nexos.ai API key. Falls back to $${KEY_ENV_VARIABLE}, then the key saved\n in your system keychain, then a prompt.${KEY_ID_OPTION}\n --save-key Save the key in your system keychain for future runs, once it\n passes the key check. A usage error on a machine with no keychain.\n --model <id> Model every agent should use; skips the model picker.\n Falls back to $${MODEL_ENV_VARIABLE}, then the agents' saved default, then\n the picker: ${predefinedModels}, or any id from GET /v1/models.\n --save-model Save the model as the default of each agent it is used for,\n without asking. Never on a dry run.\n --install Install a not-installed agent with npm. Setup installs the\n ones you pick in the list; starting an agent installs the\n named one first. --yes never installs.\n --scope <scope> Where to write: user (the default — your home directory,\n applying everywhere) or project (this directory only).\n -y, --yes Answer every question with its default: user scope, the\n detected agents, a key already on this machine, and the\n agents' saved default model, else ${defaultModel}. A gateway that\n rejects the router is a usage error; one that could not\n confirm it only warns. Writes without asking; a failed key\n check warns and continues.\n --dry-run Show the diffs and write nothing.\n --no-verify Skip the gateway entirely (useful offline). The model picker\n then shows no model list; ${predefinedModels} is not offered.\n --backup-dir <path> Where originals are copied, in a <timestamp> folder.\n Default: ${backupDirectories.user} (user scope), ${backupDirectories.project} (project).\n --verify With ${STATUS_COMMAND}: check the resolved key against the gateway once.\n --json With ${STATUS_COMMAND}: print the report as one JSON object.\n --key-name <name> The name of the key to create when signing in.\n Default: nexos-connect (<hostname>) <date and time>.\n -h, --help Show this help.\n -v, --version Show the version.\n\nStarting an agent takes ${LAUNCH_KEY_FLAGS}, --model, --save-key,\n--save-model, --install, --no-verify and --yes only. Its model is --model, else $${MODEL_ENV_VARIABLE}, else the agent's saved default, else\nthe picker (--yes: ${defaultModel}).\n\nExit codes\n ${EXIT_CODE.ok} done\n ${EXIT_CODE.failed} an agent failed, while planning or while writing; or an agent could not start.\n With ${STATUS_COMMAND}: an agent drifted, a config could not be read, or --verify rejected the key.\n With ${LOGIN_COMMAND}: signing in or creating the key failed.${KEY_ID_EXIT_LINE}\n With ${LOGOUT_COMMAND}: the system keychain could not be read or cleared.\n ${EXIT_CODE.usage} usage error, or a question asked with no terminal to answer it\n ${EXIT_CODE.cancelled} cancelled, by Ctrl-C or by declining a confirmation\n Once an agent has started, its own exit code passes through unchanged.\n\nGet a key at ${API_KEYS_URL}\n`\n}\n","import { parseArgs, type ParseArgsOptionsConfig } from 'node:util'\nimport { match } from 'ts-pattern'\nimport { normalizeModel } from '../product/public-api/models/predefined-models'\nimport { createMasker } from '../product/secrets/masker'\nimport { CONFIG_SCOPES, isConfigScope, type ConfigScope } from '../shared/platform/platform-context'\nimport { describeError } from '../shared/text/describe-error'\nimport { hasLineBreak } from '../shared/text/has-line-break'\nimport { readNonBlank } from '../shared/text/read-non-blank'\nimport { UsageError } from './errors/usage-error'\nimport {\n CHANGE_KEY_COMMAND,\n CHANGE_MODEL_COMMAND,\n COMMAND_NAME,\n LAUNCH_COMMAND,\n LAUNCH_KEY_FLAGS,\n LOGIN_COMMAND,\n LOGOUT_COMMAND,\n RESTORE_COMMAND,\n SETUP_COMMAND,\n STATUS_COMMAND,\n} from './help'\nimport { IS_KEY_ID_ENABLED, KEY_ID_ON_DRY_RUN, parseKeyId } from './parse-key-id'\nimport { parseKeyName } from './parse-key-name'\n\nexport const FORGET_KEY_COMMAND = 'forget-key'\n\nexport type Command =\n | { kind: 'setup' }\n | { kind: 'restore' }\n | { kind: 'status' }\n | { kind: 'launch'; binary: string | undefined; passthrough: string[] }\n | { kind: 'forget-key' }\n | { kind: 'change-key' }\n | { kind: 'change-model' }\n | { kind: 'login' }\n | { kind: 'logout' }\n\nexport type CliOptions = {\n command: Command\n harnessIds: string[]\n key: string | undefined\n keyId: string | undefined\n keyName: string | undefined\n model: string | undefined\n scope: ConfigScope | undefined\n shouldAssumeYes: boolean\n shouldSaveKey: boolean\n shouldSaveModel: boolean\n shouldInstall: boolean\n isDryRun: boolean\n shouldVerify: boolean\n shouldVerifyStatus: boolean\n isJson: boolean\n backupDirectory: string | undefined\n shouldShowHelp: boolean\n shouldShowVersion: boolean\n}\n\nexport function parseCliArguments(argv: readonly string[]): CliOptions {\n const { values, tokens } = parseFlags(argv)\n return {\n command: commandFrom(tokens, values),\n harnessIds: parseHarnessIds(values.harnesses ?? values.harness),\n key: values.key === undefined ? undefined : parseKeyFlag(values.key),\n keyId: parseKeyIdFlag(values),\n keyName: values['key-name'] === undefined ? undefined : parseKeyName(values['key-name']),\n model: parseModelFlag(values.model),\n scope: parseScope(values.scope),\n shouldAssumeYes: values.yes === true,\n shouldSaveKey: values['save-key'] === true,\n shouldSaveModel: values['save-model'] === true,\n shouldInstall: values.install === true,\n isDryRun: values['dry-run'] === true,\n shouldVerify: values['no-verify'] !== true,\n shouldVerifyStatus: values.verify === true,\n isJson: values.json === true,\n backupDirectory: readNonBlank(values['backup-dir']),\n shouldShowHelp: values.help === true,\n shouldShowVersion: values.version === true,\n }\n}\n\nexport function isKeyNamedByFlag(options: Pick<CliOptions, 'key' | 'keyId'>): boolean {\n return options.key !== undefined || options.keyId !== undefined\n}\n\nconst FLAGS = {\n harnesses: { type: 'string' },\n harness: { type: 'string' },\n key: { type: 'string' },\n 'key-id': { type: 'string' },\n 'key-name': { type: 'string' },\n model: { type: 'string' },\n scope: { type: 'string' },\n yes: { type: 'boolean', short: 'y' },\n 'save-key': { type: 'boolean' },\n 'save-model': { type: 'boolean' },\n install: { type: 'boolean' },\n 'dry-run': { type: 'boolean' },\n 'no-verify': { type: 'boolean' },\n verify: { type: 'boolean' },\n json: { type: 'boolean' },\n 'backup-dir': { type: 'string' },\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n} as const satisfies ParseArgsOptionsConfig\n\nfunction omitKeyIdFlag(): typeof FLAGS {\n const { 'key-id': _keyId, ...accepted } = FLAGS\n return accepted as typeof FLAGS\n}\n\nconst ACCEPTED_FLAGS: typeof FLAGS = IS_KEY_ID_ENABLED ? FLAGS : omitKeyIdFlag()\n\ntype ArgumentToken = { kind: string; value?: string | undefined }\n\nfunction parseFlags(argv: readonly string[]) {\n try {\n return parseArgs({ args: [...argv], options: ACCEPTED_FLAGS, allowPositionals: true, tokens: true, strict: true })\n } catch (error) {\n throw new UsageError(describeParseError(error, argv))\n }\n}\n\n/** True when an agent was named before `--`, so an unknown option is likely its own argument. */\nfunction hasNamedAgent(argv: readonly string[]): boolean {\n for (const argument of argv) {\n if (argument === '--') return false\n if (!argument.startsWith('-') && isAgentName(argument)) return true\n }\n return false\n}\n\ntype FlagValues = ReturnType<typeof parseFlags>['values']\n\nconst HELP_HINT = `Run \\`${COMMAND_NAME} --help\\` to see the options.`\n\nfunction describeParseError(error: unknown, argv: readonly string[]): string {\n const message = describeError(error)\n const code = error instanceof Error && 'code' in error ? error.code : undefined\n return match(code)\n .with('ERR_PARSE_ARGS_UNKNOWN_OPTION', () => describeUnknownOption(message, argv))\n .otherwise(() => createMasker({ secrets: [] }).maskText(message))\n}\n\nconst QUOTED_PATTERN = /'([^']*)'/\nconst OPTION_NAME_PATTERN = /^--?[a-z][a-z-]{0,29}$/\n\nfunction describeUnknownOption(message: string, argv: readonly string[]): string {\n const option = QUOTED_PATTERN.exec(message)?.[1]\n if (option === undefined || !OPTION_NAME_PATTERN.test(option)) return `Unknown option. ${HELP_HINT}`\n\n const hint = hasNamedAgent(argv) ? ' If it belongs to the agent, put it after --.' : ''\n return `Unknown option ${option}. ${HELP_HINT}${hint}`\n}\n\nexport const PASSTHROUGH_MISUSE = `\\`--\\` passes arguments to an agent, e.g. \\`${COMMAND_NAME} claude -- --resume\\``\n\nconst AGENT_NAME_PATTERN = /^[a-z][a-z-]{0,29}$/\n\n/** A positional is only ever echoed when it can be an agent name, never when it may be a pasted key. */\nexport function isAgentName(value: string): boolean {\n return AGENT_NAME_PATTERN.test(value)\n}\n\ntype CommandParts = { name: string; passthrough: string[] | null; values: FlagValues }\ntype LaunchSubcommandParams = { agents: readonly string[]; passthrough: string[] | null; values: FlagValues }\ntype LaunchParts = { name: string | undefined; passthrough: string[] | null; values: FlagValues }\n\nfunction commandFrom(tokens: readonly ArgumentToken[], values: FlagValues): Command {\n const terminatorIndex = tokens.findIndex((token) => token.kind === 'option-terminator')\n const before = terminatorIndex === -1 ? tokens : tokens.slice(0, terminatorIndex)\n const passthrough =\n terminatorIndex === -1 ? null : tokens.slice(terminatorIndex + 1).map((token) => token.value ?? '')\n\n const positionals = before.flatMap((token) => (token.kind === 'positional' ? [token.value ?? ''] : []))\n const [name, ...rest] = positionals\n if (name === LAUNCH_COMMAND) return launchSubcommand({ agents: rest, passthrough, values })\n if (positionals.length > 1) throw new UsageError(describeExtraCommands(positionals))\n\n if (name === undefined || name === SETUP_COMMAND) return setupCommand({ passthrough, values })\n if (name === FORGET_KEY_COMMAND || name === LOGOUT_COMMAND) {\n return commandWithoutAgent({ name, passthrough, values })\n }\n if (name === LOGIN_COMMAND) return loginCommand({ passthrough, values })\n if (name === STATUS_COMMAND) return statusCommand({ passthrough, values })\n if (name === RESTORE_COMMAND) return restoreCommand({ name, passthrough, values })\n if (name === CHANGE_KEY_COMMAND) return changeKeyCommand({ passthrough, values })\n if (name === CHANGE_MODEL_COMMAND) return changeModelCommand({ passthrough, values })\n\n return launchCommand({ name, passthrough, values })\n}\n\nfunction launchSubcommand({ agents, passthrough, values }: LaunchSubcommandParams): Command {\n if (agents.length > 1) throw new UsageError(describeExtraAgents(agents))\n\n return launchCommand({ name: agents[0], passthrough, values })\n}\n\nconst EXTRA_POSITIONALS_HINT = \"Put the agent's own arguments after --, and a key with --key.\"\n\nfunction describeExtraCommands(positionals: readonly string[]): string {\n return `Expected one command, ${describePositionals(positionals)}. ${EXTRA_POSITIONALS_HINT}`\n}\n\nfunction describeExtraAgents(agents: readonly string[]): string {\n return `\\`${LAUNCH_COMMAND}\\` takes one agent, ${describePositionals(agents)}. ${EXTRA_POSITIONALS_HINT}`\n}\n\nfunction describePositionals(positionals: readonly string[]): string {\n if (positionals.every(isAgentName)) return `got: ${positionals.join(' ')}`\n\n return 'got more than one argument'\n}\n\nfunction setupCommand({ passthrough, values }: Pick<CommandParts, 'passthrough' | 'values'>): Command {\n if (passthrough !== null) throw new UsageError(PASSTHROUGH_MISUSE)\n assertNotStatusFlags(values)\n return { kind: 'setup' }\n}\n\nfunction commandWithoutAgent({ name, passthrough, values }: CommandParts): Command {\n if (passthrough !== null) throw new UsageError(PASSTHROUGH_MISUSE)\n\n const flags = Object.keys(values).filter((flag) => flag !== 'help' && flag !== 'version')\n if (flags.length > 0) throw new UsageError(`${name} takes no options (got --${flags[0]}).`)\n return name === LOGOUT_COMMAND ? { kind: 'logout' } : { kind: 'forget-key' }\n}\n\nconst LOGIN_FLAGS = ['key-name', 'yes', 'help', 'version'] as const\n\nfunction loginCommand({ passthrough, values }: Pick<CommandParts, 'passthrough' | 'values'>): Command {\n if (passthrough !== null) throw new UsageError(PASSTHROUGH_MISUSE)\n assertOnlyFlags({ command: LOGIN_COMMAND, allowed: LOGIN_FLAGS, values })\n return { kind: 'login' }\n}\n\ntype AssertOnlyFlagsParams = { command: string; allowed: readonly string[]; values: FlagValues }\n\nfunction assertOnlyFlags({ command, allowed, values }: AssertOnlyFlagsParams): void {\n const unsupported = Object.keys(values).find((flag) => !allowed.includes(flag))\n if (unsupported !== undefined) throw new UsageError(`--${unsupported} does not apply to ${command}.`)\n}\n\nconst STATUS_UNSUPPORTED_FLAGS = [\n 'key',\n 'key-id',\n 'key-name',\n 'model',\n 'scope',\n 'yes',\n 'save-key',\n 'save-model',\n 'install',\n 'dry-run',\n 'no-verify',\n 'backup-dir',\n] as const\n\nfunction statusCommand({ passthrough, values }: Pick<CommandParts, 'passthrough' | 'values'>): Command {\n if (passthrough !== null) throw new UsageError(PASSTHROUGH_MISUSE)\n\n const unsupported = STATUS_UNSUPPORTED_FLAGS.find((flag) => flag in values)\n if (unsupported !== undefined) throw new UsageError(`--${unsupported} does not apply to ${STATUS_COMMAND}.`)\n return { kind: 'status' }\n}\n\nconst STATUS_ONLY_FLAGS = ['verify', 'json'] as const\n\nfunction assertNotStatusFlags(values: FlagValues): void {\n const flag = STATUS_ONLY_FLAGS.find((name) => values[name] === true)\n if (flag !== undefined) throw new UsageError(`--${flag} is for ${STATUS_COMMAND} only.`)\n}\n\nfunction restoreCommand({ passthrough, values }: CommandParts): Command {\n if (passthrough !== null) throw new UsageError(PASSTHROUGH_MISUSE)\n assertRestoreFlags(values)\n return { kind: 'restore' }\n}\n\nconst CHANGE_KEY_FLAGS = [\n 'scope',\n 'harnesses',\n 'harness',\n 'key',\n 'key-id',\n 'key-name',\n 'save-key',\n 'no-verify',\n 'dry-run',\n 'backup-dir',\n 'yes',\n 'help',\n 'version',\n] as const\n\nfunction changeKeyCommand({ passthrough, values }: Pick<CommandParts, 'passthrough' | 'values'>): Command {\n if (passthrough !== null) throw new UsageError(PASSTHROUGH_MISUSE)\n assertOnlyFlags({ command: CHANGE_KEY_COMMAND, allowed: CHANGE_KEY_FLAGS, values })\n return { kind: 'change-key' }\n}\n\nconst CHANGE_MODEL_FLAGS = [\n 'scope',\n 'harnesses',\n 'harness',\n 'model',\n 'save-model',\n 'no-verify',\n 'dry-run',\n 'backup-dir',\n 'yes',\n 'help',\n 'version',\n] as const\n\n/** Setup's `--yes` falls back to the router; here it would silently move every agent off its model. */\nconst YES_WITHOUT_MODEL = `--yes does not choose a model for ${CHANGE_MODEL_COMMAND}. Pass --model.`\n\nfunction changeModelCommand({ passthrough, values }: Pick<CommandParts, 'passthrough' | 'values'>): Command {\n if (passthrough !== null) throw new UsageError(PASSTHROUGH_MISUSE)\n assertOnlyFlags({ command: CHANGE_MODEL_COMMAND, allowed: CHANGE_MODEL_FLAGS, values })\n if (values.yes === true && values.model === undefined) throw new UsageError(YES_WITHOUT_MODEL)\n return { kind: 'change-model' }\n}\n\nconst LAUNCH_UNSUPPORTED_FLAGS = ['harnesses', 'harness', 'scope', 'dry-run', 'backup-dir'] as const\n\nfunction launchCommand({ name, passthrough, values }: LaunchParts): Command {\n assertNotStatusFlags(values)\n const unsupported = LAUNCH_UNSUPPORTED_FLAGS.filter((flag) => flag in values)\n if (unsupported.length > 0) {\n const shown = name !== undefined && isAgentName(name) ? name : '<agent>'\n throw new UsageError(\n `--${unsupported[0]} does not apply to starting an agent. \\`${COMMAND_NAME} ${shown}\\` takes ${LAUNCH_KEY_FLAGS}, --model, --save-key, --save-model, --install, --no-verify and --yes.`,\n )\n }\n return { kind: 'launch', binary: name, passthrough: passthrough ?? [] }\n}\n\nconst RESTORE_UNSUPPORTED_FLAGS = ['key', 'key-id', 'key-name', 'model', 'save-model', 'no-verify', 'install'] as const\n\nfunction assertRestoreFlags(flags: FlagValues): void {\n assertNotStatusFlags(flags)\n const unsupported = RESTORE_UNSUPPORTED_FLAGS.find((name) => flags[name] !== undefined)\n if (unsupported !== undefined) throw new UsageError(`--${unsupported} does not apply to ${RESTORE_COMMAND}.`)\n}\n\nconst HARNESS_ID_SEPARATOR = ','\n\nfunction parseHarnessIds(value: string | undefined): string[] {\n if (value === undefined) return []\n\n const ids = value.split(HARNESS_ID_SEPARATOR).flatMap((id) => readNonBlank(id) ?? [])\n return [...new Set(ids)]\n}\n\nfunction parseKeyFlag(value: string): string {\n const key = readNonBlank(value)\n if (key === undefined) throw new UsageError('--key is empty. Pass a key, or drop --key to be prompted.')\n if (hasLineBreak(key)) throw new UsageError('--key contains a line break. Paste the key on one line.')\n\n return key\n}\n\nconst KEY_ID_CONFLICTS = [\n { flag: 'key', message: '--key-id and --key both name the key to use. Pass one of them.' },\n {\n flag: 'key-name',\n message: '--key-name names a new key, and --key-id rotates an existing one, which keeps its name.',\n },\n { flag: 'dry-run', message: KEY_ID_ON_DRY_RUN },\n] as const\n\nfunction parseKeyIdFlag(values: FlagValues): string | undefined {\n if (values['key-id'] === undefined) return undefined\n const conflict = KEY_ID_CONFLICTS.find(({ flag }) => values[flag] !== undefined)\n if (conflict !== undefined) throw new UsageError(conflict.message)\n\n return parseKeyId(values['key-id'])\n}\n\nfunction parseModelFlag(value: string | undefined): string | undefined {\n const model = readNonBlank(value)\n return model === undefined ? undefined : normalizeModel(model)\n}\n\nfunction parseScope(value: string | undefined): ConfigScope | undefined {\n const scope = readNonBlank(value)\n if (scope === undefined) return undefined\n if (!isConfigScope(scope)) throw new UsageError(`--scope must be one of: ${CONFIG_SCOPES.join(', ')}`)\n\n return scope\n}\n","export function escapePosixSingleQuoted(value: string): string {\n return value.replace(/'/g, `'\\\\''`)\n}\n","// PowerShell also ends a single-quoted string at any of the typographic single quotes.\nexport const POWERSHELL_SINGLE_QUOTES = \"'‘’‚‛\"\n\nconst POWERSHELL_SINGLE_QUOTE = new RegExp(`[${POWERSHELL_SINGLE_QUOTES}]`, 'g')\n\nexport function escapePowerShellSingleQuoted(value: string): string {\n return value.replace(POWERSHELL_SINGLE_QUOTE, (quote) => quote + quote)\n}\n","// Tabs and line breaks pass; a carriage return passes only as part of \\r\\n, since a lone one lets the text\n// after it overwrite the start of its line.\n// oxlint-disable-next-line no-control-regex -- matching control characters is the point\nconst CONTROL_CHARACTER = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]|\\r(?!\\n)/g\nconst HEX_RADIX = 16\nconst ESCAPE_DIGITS = 2\n\n/** Shows each control character as `\\xNN`, so text from a file cannot move the cursor or restyle the terminal. */\nexport function escapeControlCharacters(text: string): string {\n return text.replace(\n CONTROL_CHARACTER,\n (character) => `\\\\x${character.charCodeAt(0).toString(HEX_RADIX).padStart(ESCAPE_DIGITS, '0')}`,\n )\n}\n\nconst LINE_CHARACTER = /[\\n\\r\\t]/g\nconst LINE_CHARACTER_ESCAPES: Readonly<Record<string, string>> = { '\\n': '\\\\n', '\\r': '\\\\r', '\\t': '\\\\t' }\n\nexport function escapeForOneLine(text: string): string {\n return escapeControlCharacters(text.replace(LINE_CHARACTER, (character) => LINE_CHARACTER_ESCAPES[character] ?? ''))\n}\n","export const KEY_PREFIXES = ['nexos-', 'user-', 'team-'] as const\n\nexport type KeyPrefix = (typeof KEY_PREFIXES)[number]\n\nexport function findKeyPrefix(key: string): KeyPrefix | undefined {\n return KEY_PREFIXES.find((prefix) => key.startsWith(prefix))\n}\n\nexport function hasKnownKeyPrefix(key: string): boolean {\n return findKeyPrefix(key) !== undefined\n}\n","import { escapePosixSingleQuoted } from '../../shared/file-formats/shell/escape-posix-single-quoted'\nimport { escapePowerShellSingleQuoted } from '../../shared/file-formats/shell/escape-powershell-single-quoted'\nimport { escapeControlCharacters } from '../../shared/text/escape-control-characters'\nimport { KEY_PREFIXES, findKeyPrefix } from './key-prefix'\n\nexport interface Masker {\n /** Also escapes control characters: every text bound for the terminal passes here, and a config file can hold them. */\n maskText(text: string): string\n registerSecrets(secrets: readonly string[]): void\n}\n\nexport type CreateMaskerParams = { secrets: readonly string[] }\n\nconst MIN_SHAPE_BODY_LENGTH = 16\nconst KEY_PREFIX_ALTERNATIVES = KEY_PREFIXES.map(escapeForRegex).join('|')\nconst KEY_SHAPE_PATTERN = new RegExp(\n `(?<![/\\\\w])(?:${KEY_PREFIX_ALTERNATIVES})[A-Za-z0-9_-]{${MIN_SHAPE_BODY_LENGTH},}(?![/\\\\w])`,\n 'g',\n)\n\nexport function createMasker({ secrets }: CreateMaskerParams): Masker {\n const registeredSecrets = [...secrets]\n let findIdentitySpans = buildIdentityMatching(registeredSecrets)\n\n return {\n maskText: (text) =>\n escapeControlCharacters(\n replaceSpans(text, pickOuterSpans([...findIdentitySpans(text), ...findShapeSpans(text)])),\n ),\n registerSecrets: (newSecrets) => {\n registeredSecrets.push(...newSecrets)\n findIdentitySpans = buildIdentityMatching(registeredSecrets)\n },\n }\n}\n\ntype MaskSpan = { start: number; end: number; mask: string }\n\nfunction buildIdentityMatching(secrets: readonly string[]): (text: string) => MaskSpan[] {\n const masksByForm = new Map<string, string>()\n for (const secret of secrets.filter((secret) => secret.trim() !== '')) {\n const mask = maskKey(secret)\n for (const form of listEscapedForms(secret)) {\n if (!masksByForm.has(form)) masksByForm.set(form, mask)\n }\n }\n if (masksByForm.size === 0) return () => []\n\n const alternatives = [...masksByForm.keys()].sort((first, second) => second.length - first.length)\n const pattern = new RegExp(alternatives.map(buildFormPattern).join('|'), 'g')\n return (text) => [...text.matchAll(pattern)].map((match) => toSpan(match, masksByForm.get(match[0]) ?? match[0]))\n}\n\nfunction findShapeSpans(text: string): MaskSpan[] {\n return [...text.matchAll(KEY_SHAPE_PATTERN)].map((match) => toSpan(match, maskKey(match[0])))\n}\n\nfunction toSpan(match: RegExpExecArray, mask: string): MaskSpan {\n return { start: match.index, end: match.index + match[0].length, mask }\n}\n\n// Leftmost, then longest: a key wins over a registered secret inside it, and a registered key over\n// the part of it that its shape alone matches.\nfunction pickOuterSpans(spans: readonly MaskSpan[]): MaskSpan[] {\n const picked: MaskSpan[] = []\n for (const span of [...spans].sort((first, second) => first.start - second.start || second.end - first.end)) {\n if (span.start >= (picked.at(-1)?.end ?? 0)) picked.push(span)\n }\n return picked\n}\n\nfunction replaceSpans(text: string, spans: readonly MaskSpan[]): string {\n const ends = [0, ...spans.map((span) => span.end)]\n const pieces = spans.map((span, index) => text.slice(ends[index], span.start) + span.mask)\n return pieces.join('') + text.slice(ends.at(-1))\n}\n\nconst MIN_SUBSTRING_FORM_LENGTH = 16\nconst TOKEN_CHARACTER = '[A-Za-z0-9_-]'\n\nfunction buildFormPattern(form: string): string {\n const escaped = escapeForRegex(form)\n if (form.length >= MIN_SUBSTRING_FORM_LENGTH) return escaped\n\n return `(?<!${TOKEN_CHARACTER})${escaped}(?!${TOKEN_CHARACTER})`\n}\n\nconst MIN_BODY_LENGTH_FOR_HINT = 32\nconst HINT_HEAD_LENGTH = 4\nconst HINT_TAIL_LENGTH = 4\n\nfunction maskKey(key: string): string {\n const prefix = findKeyPrefix(key) ?? ''\n const body = key.slice(prefix.length)\n if (body.length < MIN_BODY_LENGTH_FOR_HINT) return `${prefix}…`\n\n return `${prefix}${body.slice(0, HINT_HEAD_LENGTH)}…${body.slice(-HINT_TAIL_LENGTH)}`\n}\n\nfunction listEscapedForms(secret: string): string[] {\n const json = JSON.stringify(secret).slice(1, -1)\n const forms = [\n secret,\n json,\n escapePosixSingleQuoted(secret),\n escapePowerShellSingleQuoted(secret),\n encodeURIComponent(secret),\n ]\n return [...new Set(forms)]\n}\n\nfunction escapeForRegex(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { match } from 'ts-pattern'\nimport { isFile } from '../file-system/is-file'\nimport type { EnvironmentVariables } from './platform-context'\n\nexport type ResolvedExecutable = { path: string; env: EnvironmentVariables }\n\ntype PathLookup = {\n delimiter: string\n executableExtensions: string[]\n normalizeEntry: (entry: string) => string\n accessMode: number\n isPathVariable: (name: string) => boolean\n}\n\nconst PATH_VARIABLE = 'PATH'\nconst WINDOWS_PATH_DELIMITER = ';'\nconst POSIX_PATH_DELIMITER = ':'\nconst WINDOWS_DEFAULT_PATHEXT = '.EXE;.CMD;.BAT'\nconst WINDOWS_PATHEXT_DELIMITER = ';'\nconst QUOTE = '\"'\n\nexport type ResolveExecutableParams = {\n name: string\n env: EnvironmentVariables\n platform: NodeJS.Platform\n cwd: string\n}\n\nexport function resolveExecutable({\n name,\n env,\n platform,\n cwd,\n}: ResolveExecutableParams): ResolvedExecutable | undefined {\n const lookup = resolvePathLookup(platform, env)\n // Windows names it `Path` as often as `PATH`; a second spelling would reach a child unfiltered.\n const pathVariable = Object.keys(env).find(lookup.isPathVariable) ?? PATH_VARIABLE\n const directories = (env[pathVariable] ?? '')\n .split(lookup.delimiter)\n .map(lookup.normalizeEntry)\n .filter((entry) => entry !== '')\n .map((entry) => path.resolve(cwd, entry))\n .filter((directory) => isSafePathEntry(directory, platform))\n const otherVariables = Object.entries(env).filter(([variable]) => !lookup.isPathVariable(variable))\n const filteredEnvironment = {\n ...Object.fromEntries(otherVariables),\n [pathVariable]: directories.join(lookup.delimiter),\n }\n\n const fileNames = listCandidateFileNames(name, lookup.executableExtensions)\n const candidates = path.isAbsolute(name)\n ? fileNames\n : directories.flatMap((directory) => fileNames.map((fileName) => path.join(directory, fileName)))\n const executable = candidates.find((candidate) => isSearchableFile(candidate, lookup.accessMode))\n return executable === undefined ? undefined : { path: executable, env: filteredEnvironment }\n}\n\nexport type HasBinaryParams = ResolveExecutableParams\n\nexport function hasBinary(params: HasBinaryParams): boolean {\n return resolveExecutable(params) !== undefined\n}\n\nfunction resolvePathLookup(platform: NodeJS.Platform, env: EnvironmentVariables): PathLookup {\n return match(platform)\n .with('win32', () => ({\n delimiter: WINDOWS_PATH_DELIMITER,\n executableExtensions: (env.PATHEXT ?? WINDOWS_DEFAULT_PATHEXT)\n .split(WINDOWS_PATHEXT_DELIMITER)\n .filter((extension) => extension !== ''),\n normalizeEntry: (entry: string) => entry.replaceAll(QUOTE, ''),\n // Windows has no execute bit: PATHEXT alone decides what runs.\n accessMode: fs.constants.F_OK,\n isPathVariable: (name: string) => name.toUpperCase() === PATH_VARIABLE,\n }))\n .otherwise(() => ({\n delimiter: POSIX_PATH_DELIMITER,\n executableExtensions: [''],\n normalizeEntry: (entry: string) => entry,\n accessMode: fs.constants.X_OK,\n isPathVariable: (name: string) => name === PATH_VARIABLE,\n }))\n}\n\n// A name that already ends in an extension is tried only as it is: `powershell.exe.EXE` is nothing\n// Windows installs, so only a planted file could match it.\nfunction listCandidateFileNames(name: string, extensions: readonly string[]): string[] {\n const upperName = name.toUpperCase()\n const hasExtension = extensions.some((extension) => extension !== '' && upperName.endsWith(extension.toUpperCase()))\n return hasExtension ? [name] : extensions.map((extension) => name + extension)\n}\n\nfunction isSafePathEntry(directory: string, platform: NodeJS.Platform): boolean {\n // The entry as written catches a .bin that symlinks elsewhere; its real path catches an alias that resolves into one.\n try {\n return !isNodeModulesBin(directory, platform) && !isNodeModulesBin(fs.realpathSync(directory), platform)\n } catch {\n return false\n }\n}\n\nconst CASE_INSENSITIVE_PLATFORMS: NodeJS.Platform[] = ['win32', 'darwin']\n\nfunction isNodeModulesBin(directory: string, platform: NodeJS.Platform): boolean {\n const comparableDirectory = CASE_INSENSITIVE_PLATFORMS.includes(platform) ? directory.toLowerCase() : directory\n const segments = comparableDirectory.split(path.sep)\n return segments.some((segment, index) => segment === 'node_modules' && segments[index + 1] === '.bin')\n}\n\nfunction isSearchableFile(candidate: string, accessMode: number): boolean {\n try {\n fs.accessSync(candidate, accessMode)\n return isFile(candidate)\n } catch {\n return false\n }\n}\n","import fs from 'node:fs'\nimport { isMissingFileError } from './errors/is-missing-file-error'\n\nexport function isFile(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile()\n } catch (error) {\n if (isMissingFileError(error)) return false\n throw error\n }\n}\n","const MISSING_FILE_CODES: readonly unknown[] = ['ENOENT', 'ENOTDIR']\n\nexport function isMissingFileError(error: unknown): boolean {\n return error instanceof Error && 'code' in error && MISSING_FILE_CODES.includes(error.code)\n}\n","import { hasBinary, resolveExecutable, type ResolvedExecutable } from './has-binary'\n\nexport const CONFIG_SCOPES = ['user', 'project'] as const\n\nexport type ConfigScope = (typeof CONFIG_SCOPES)[number]\n\nexport const DEFAULT_SCOPE: ConfigScope = 'user'\n\nexport function isConfigScope(value: string): value is ConfigScope {\n return CONFIG_SCOPES.some((scope) => scope === value)\n}\n\nexport type EnvironmentVariables = Readonly<Record<string, string | undefined>>\n\nexport interface PlatformContext {\n home: string\n cwd: string\n platform: NodeJS.Platform\n env: EnvironmentVariables\n isInteractive: boolean\n scope: ConfigScope\n hostname: string\n userName: string\n hasBinary(name: string): boolean\n resolveBinary(name: string): ResolvedExecutable | undefined\n}\n\nexport type CreatePlatformContextParams = Omit<PlatformContext, 'scope' | 'hasBinary' | 'resolveBinary'>\n\nexport function createPlatformContext(params: CreatePlatformContextParams): PlatformContext {\n return {\n ...params,\n scope: DEFAULT_SCOPE,\n hasBinary: (name) => hasBinary({ name, env: params.env, platform: params.platform, cwd: params.cwd }),\n resolveBinary: (name) => resolveExecutable({ name, env: params.env, platform: params.platform, cwd: params.cwd }),\n }\n}\n","import * as v from 'valibot'\nimport { hasLineBreak } from '../shared/text/has-line-break'\nimport { UsageError } from './errors/usage-error'\n\nexport const KEY_NAME_MAX_LENGTH = 100\n\nexport const KeyNameSchema = v.pipe(\n v.string(),\n v.trim(),\n v.nonEmpty('must not be empty'),\n v.maxLength(KEY_NAME_MAX_LENGTH, `must be at most ${KEY_NAME_MAX_LENGTH} characters`),\n v.check((value) => !hasLineBreak(value), 'must be one line'),\n)\n\nexport function parseKeyName(value: string): string {\n const result = v.safeParse(KeyNameSchema, value)\n if (!result.success) throw new UsageError(`--key-name ${result.issues[0].message}.`)\n return result.output\n}\n","export type ShouldOpenMenuParams = { argv: readonly string[]; isInteractive: boolean }\n\n/** Environment variables never count: Codex users have `$NEXOS_API_KEY` exported in every shell. */\nexport function shouldOpenMenu({ argv, isInteractive }: ShouldOpenMenuParams): boolean {\n return isInteractive && argv.length === 0\n}\n","import { match } from 'ts-pattern'\nimport type { LaunchResult } from '../harnesses/launch/run-launch'\nimport type { TerminalUi } from '../ui/terminal-ui'\nimport { EXIT_CODE, type ExitCode } from './exit-code'\nimport { TAGLINE } from './help'\n\nexport type Closing = { tone: 'outro' | 'cancel'; message: string }\n\nexport type FinishedOutcome = { kind: 'done' | 'failed' | 'backed-out'; closing: Closing | undefined }\n\nexport type CommandOutcome = FinishedOutcome | { kind: 'exited'; result: LaunchResult }\n\nexport const FINISHED_WITH_ERRORS = 'Finished with errors.'\n\nexport const NO_KEY: FinishedOutcome = { kind: 'failed', closing: { tone: 'cancel', message: 'No API key provided.' } }\n\nexport type RunCommandShellParams = {\n ui: TerminalUi\n isInteractive: boolean\n refuse: (ui: TerminalUi) => TerminalUi\n run: (ui: TerminalUi) => Promise<FinishedOutcome>\n}\n\nexport async function runCommandShell({ ui, isInteractive, refuse, run }: RunCommandShellParams): Promise<ExitCode> {\n const shellUi = isInteractive ? ui : refuse(ui)\n shellUi.intro(TAGLINE)\n\n const outcome = await run(shellUi)\n printClosing(outcome.closing, shellUi)\n return exitCodeForOutcome(outcome)\n}\n\nexport function exitCodeForOutcome(outcome: FinishedOutcome): ExitCode {\n return match(outcome.kind)\n .with('done', () => EXIT_CODE.ok)\n .with('failed', () => EXIT_CODE.failed)\n .with('backed-out', () => EXIT_CODE.cancelled)\n .exhaustive()\n}\n\n/** A session that ran several commands fails once any of them did; backing out of one is not a failure. */\nexport function exitCodeForOutcomes(outcomes: readonly FinishedOutcome[]): ExitCode {\n return outcomes.some(({ kind }) => kind === 'failed') ? EXIT_CODE.failed : EXIT_CODE.ok\n}\n\nexport function printClosing(closing: Closing | undefined, ui: TerminalUi): void {\n if (closing === undefined) return\n if (closing.tone === 'cancel') {\n ui.cancel(closing.message)\n return\n }\n\n ui.outro(closing.message)\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport * as v from 'valibot'\nimport { resolvePublicApiHost, type DesiredConfig } from '../../product/public-api/desired-config'\nimport {\n DEFAULT_MODEL,\n ONE_MILLION_CONTEXT_ROUTER,\n normalizeModel,\n} from '../../product/public-api/models/predefined-models'\nimport type { KeyPathUpdate } from '../../shared/file-formats/key-path'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { displayPath } from '../../shared/text/display-path'\nimport { readNonBlank } from '../../shared/text/read-non-blank'\nimport { detectConfigOrBinary } from '../config/detect-config-or-binary'\nimport { isPublicApiUrl } from '../config/is-public-api-url'\nimport { readJsoncFile } from '../config/read-jsonc-file'\nimport type { FileContribution, HarnessInspection, LaunchingHarness } from '../harness'\n\nconst BINARY = 'claude'\n\nexport const claudeCode: LaunchingHarness = {\n kind: 'configurable',\n id: 'claude-code',\n label: 'Claude Code',\n binary: BINARY,\n installPackage: '@anthropic-ai/claude-code',\n protocols: ['anthropic'],\n projectSupport: { kind: 'supported' },\n detect: (ctx) => detectConfigOrBinary({ candidates: listSettingsCandidates(ctx), binary: BINARY, ctx }),\n configPath: (ctx) => resolveSettingsPath(ctx),\n plan: (desired, ctx) => [planSettings(desired, ctx)],\n inspect: (ctx) => inspectSettings(ctx),\n launch: (desired) => ({\n binary: BINARY,\n arguments: ['--settings', SETTINGS_PLACEHOLDER],\n env: {},\n files: [\n {\n name: SHARED_SETTINGS_FILE,\n content: `${JSON.stringify({ [ENV_BLOCK]: launchEnv(desired) }, null, JSON_INDENT)}\\n`,\n placeholder: SETTINGS_PLACEHOLDER,\n },\n ],\n }),\n launchNotes: [\n 'Running /model saves that model to your Claude Code settings.',\n 'This session is kept in your history like any other.',\n ],\n readKey: (ctx) => readPublicApiToken(ctx),\n readSecrets: (ctx) => readCredentials(ctx),\n warnings: (ctx) => warnAboutApiKey(ctx),\n postSetupNotes: [\n 'Restart Claude Code after setup: it reads its settings only when it starts.',\n \"Claude Code ranks its settings, highest first: managed settings, --settings, the project's \" +\n \"settings.local.json, the project's settings.json, then the user's settings.json. A higher one that sets \" +\n 'the same values overrides this file.',\n ],\n}\n\nconst CONFIG_DIRECTORY = '.claude'\nconst SHARED_SETTINGS_FILE = 'settings.json'\nconst LOCAL_SETTINGS_FILE = 'settings.local.json'\nconst SETTINGS_PLACEHOLDER = '{settings}'\nconst JSON_INDENT = 2\n\nfunction resolveSettingsPath(ctx: PlatformContext): string {\n return match(ctx.scope)\n .with('user', () => path.join(ctx.home, CONFIG_DIRECTORY, SHARED_SETTINGS_FILE))\n .with('project', () => path.join(ctx.cwd, CONFIG_DIRECTORY, LOCAL_SETTINGS_FILE))\n .exhaustive()\n}\n\nfunction listSettingsCandidates(ctx: PlatformContext): string[] {\n return match(ctx.scope)\n .with('user', () => [resolveSettingsPath(ctx)])\n .with('project', () => [resolveSettingsPath(ctx), path.join(ctx.cwd, CONFIG_DIRECTORY, SHARED_SETTINGS_FILE)])\n .exhaustive()\n}\n\nconst ENV_BLOCK = 'env'\nconst BASE_URL_VARIABLE = 'ANTHROPIC_BASE_URL'\nconst AUTH_TOKEN_VARIABLE = 'ANTHROPIC_AUTH_TOKEN'\nconst MODEL_VARIABLE = 'ANTHROPIC_MODEL'\nconst API_KEY_VARIABLE = 'ANTHROPIC_API_KEY'\nconst MODEL_SETTING = 'model'\n\n// Claude Code picks these by itself, for subagents, skills and background calls, so each names the chosen model too.\nconst MODEL_ALIAS_VARIABLES = [\n 'ANTHROPIC_DEFAULT_OPUS_MODEL',\n 'ANTHROPIC_DEFAULT_SONNET_MODEL',\n 'ANTHROPIC_DEFAULT_HAIKU_MODEL',\n 'ANTHROPIC_DEFAULT_FABLE_MODEL',\n 'CLAUDE_CODE_SUBAGENT_MODEL',\n]\n\n// Turns off the telemetry, error reports and auto-updates that go to Anthropic rather than the gateway, labels each\n// request (main turn, subagent, compaction) for the router, asks for the hour-long prompt cache that Claude Code\n// grants by default only to a subscription, and keeps MCP tool search on, which Claude Code otherwise turns off\n// behind a gateway.\nconst RECOMMENDED_ENV: Readonly<Record<string, string>> = {\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',\n DISABLE_TELEMETRY: '1',\n DISABLE_ERROR_REPORTING: '1',\n CLAUDE_CODE_GATEWAY_HINT_HEADERS: '1',\n CLAUDE_CODE_PROMPT_CACHE_TTL: '1h',\n CLAUDE_CODE_SUBAGENT_PROMPT_CACHE_TTL: '1h',\n ENABLE_TOOL_SEARCH: 'true',\n}\n\nfunction publicApiEnv(desired: DesiredConfig): Record<string, string> {\n const model = toClaudeCodeModel(desired.model)\n return {\n [BASE_URL_VARIABLE]: desired.anthropicBaseUrl,\n [AUTH_TOKEN_VARIABLE]: desired.apiKey,\n ...Object.fromEntries(MODEL_ALIAS_VARIABLES.map((name) => [name, model])),\n ...RECOMMENDED_ENV,\n }\n}\n\n// ANTHROPIC_MODEL outranks every model setting, so this run starts on the model chosen for it.\nfunction launchEnv(desired: DesiredConfig): Record<string, string> {\n return { ...publicApiEnv(desired), [MODEL_VARIABLE]: toClaudeCodeModel(desired.model) }\n}\n\n// Without the suffix Claude Code assumes a 200k window for a model it does not know, and compacts there.\nfunction toClaudeCodeModel(model: string): string {\n return model === DEFAULT_MODEL ? ONE_MILLION_CONTEXT_ROUTER : model\n}\n\nfunction planSettings(desired: DesiredConfig, ctx: PlatformContext): FileContribution {\n const envUpdates = Object.entries(publicApiEnv(desired)).map(([name, value]): KeyPathUpdate => [\n [ENV_BLOCK, name],\n value,\n ])\n return {\n kind: 'file',\n path: resolveSettingsPath(ctx),\n hasSecret: true,\n edits: () => ({\n format: 'jsonc',\n updates: [\n // /model saves to the model setting, which ANTHROPIC_MODEL would override at every start.\n [[ENV_BLOCK, MODEL_VARIABLE], undefined],\n ...envUpdates,\n [[MODEL_SETTING], toClaudeCodeModel(desired.model)],\n ],\n }),\n }\n}\n\nfunction readPublicApiToken(ctx: PlatformContext): string | undefined {\n const env = readSettingsEnv(ctx)\n if (!isPublicApiUrl(env?.[BASE_URL_VARIABLE], resolvePublicApiHost(ctx.env))) return undefined\n\n return env?.[AUTH_TOKEN_VARIABLE]\n}\n\nfunction readCredentials(ctx: PlatformContext): string[] {\n const env = readSettingsEnv(ctx)\n return [env?.[AUTH_TOKEN_VARIABLE], env?.[API_KEY_VARIABLE]].flatMap((value) => readNonBlank(value) ?? [])\n}\n\nfunction warnAboutApiKey(ctx: PlatformContext): string[] {\n if ((readSettingsEnv(ctx)?.[API_KEY_VARIABLE] ?? '') === '') return []\n\n const settingsPath = displayPath(resolveSettingsPath(ctx), ctx.home)\n return [\n `${settingsPath} also sets ${ENV_BLOCK}.${API_KEY_VARIABLE}, which can conflict with ${AUTH_TOKEN_VARIABLE}. ` +\n 'Consider removing it.',\n ]\n}\n\nconst OptionalTextSchema = v.fallback(v.optional(v.string()), undefined)\n\nconst SettingsSchema = v.looseObject({\n [ENV_BLOCK]: v.fallback(\n v.optional(\n v.looseObject({\n [BASE_URL_VARIABLE]: OptionalTextSchema,\n [AUTH_TOKEN_VARIABLE]: OptionalTextSchema,\n [API_KEY_VARIABLE]: OptionalTextSchema,\n [MODEL_VARIABLE]: OptionalTextSchema,\n }),\n ),\n undefined,\n ),\n [MODEL_SETTING]: OptionalTextSchema,\n})\n\ntype SettingsEnv = NonNullable<v.InferOutput<typeof SettingsSchema>[typeof ENV_BLOCK]>\n\nfunction readSettingsEnv(ctx: PlatformContext): SettingsEnv | undefined {\n const settings = readJsoncFile(resolveSettingsPath(ctx), SettingsSchema)\n return settings.kind === 'valid' ? settings.value[ENV_BLOCK] : undefined\n}\n\nfunction inspectSettings(ctx: PlatformContext): HarnessInspection {\n const settings = readJsoncFile(resolveSettingsPath(ctx), SettingsSchema)\n if (settings.kind === 'absent') return { isConfigured: false, model: undefined, isUnreadable: false }\n if (settings.kind === 'invalid') return { isConfigured: false, model: undefined, isUnreadable: true }\n\n const env = settings.value[ENV_BLOCK]\n const model = settings.value[MODEL_SETTING] ?? env?.[MODEL_VARIABLE]\n return {\n isConfigured: isPublicApiUrl(env?.[BASE_URL_VARIABLE], resolvePublicApiHost(ctx.env)),\n model: model === undefined ? undefined : normalizeModel(model),\n isUnreadable: false,\n }\n}\n","import path from 'node:path'\nimport { escapeForOneLine } from './escape-control-characters'\n\nconst HOME_SHORTHAND = '~'\n\nexport function displayPath(filePath: string, home: string): string {\n if (home === '' || !filePath.startsWith(home + path.sep)) return escapeForOneLine(filePath)\n\n return escapeForOneLine(HOME_SHORTHAND + filePath.slice(home.length))\n}\n\nconst CURRENT_DIRECTORY = '.'\n\nexport function displayRelativePath(filePath: string, directory: string): string {\n return escapeForOneLine(CURRENT_DIRECTORY + path.sep + path.relative(directory, filePath))\n}\n","import { isFile } from './is-file'\n\nexport function findFirstExistingFile(candidates: readonly string[]): string | null {\n return candidates.find((candidate) => isFile(candidate)) ?? null\n}\n","import { findFirstExistingFile } from '../../shared/file-system/find-first-existing-file'\nimport { displayPath } from '../../shared/text/display-path'\nimport type { DetectResult } from '../harness'\n\nexport function detectConfigFile(candidates: readonly string[], home: string): DetectResult {\n const existing = findFirstExistingFile(candidates)\n if (existing === null) {\n const missing = candidates.map((candidate) => displayPath(candidate, home))\n return { isFound: false, detail: `no ${missing.join(' or ')}` }\n }\n\n return { isFound: true, detail: displayPath(existing, home) }\n}\n","import type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { DetectResult } from '../harness'\nimport { detectConfigFile } from './detect-config-file'\n\nexport type DetectConfigOrBinaryParams = {\n candidates: readonly string[]\n binary: string\n ctx: PlatformContext\n}\n\n/**\n * A config file wins; with none, an installed binary still counts at user scope, so an agent setup\n * just installed is configurable. At project scope only a project config counts.\n */\nexport function detectConfigOrBinary({ candidates, binary, ctx }: DetectConfigOrBinaryParams): DetectResult {\n const detected = detectConfigFile(candidates, ctx.home)\n if (detected.isFound || ctx.scope === 'project' || !ctx.hasBinary(binary)) return detected\n\n return { isFound: true, detail: `${binary} found on PATH` }\n}\n","/** A config points at the gateway when its base URL shares the resolved gateway's origin. */\nexport function isPublicApiUrl(url: string | undefined, publicApiHost: string): boolean {\n const parsed = parseUrl(url)\n const publicApi = parseUrl(publicApiHost)\n if (parsed === undefined || publicApi === undefined) return false\n\n return parsed.origin === publicApi.origin\n}\n\nfunction parseUrl(value: string | undefined): URL | undefined {\n if (value === undefined || !URL.canParse(value)) return undefined\n return new URL(value)\n}\n","import * as v from 'valibot'\nimport { ConfigFormatError } from '../../shared/file-formats/config-errors'\nimport { parseJsonc } from '../../shared/file-formats/json/jsonc'\nimport { readFileIfExists } from '../../shared/file-system/read-file-if-exists'\n\nexport type JsoncConfig<T> = { kind: 'absent' } | { kind: 'invalid' } | { kind: 'valid'; value: T }\n\nexport function readJsoncFile<TSchema extends v.GenericSchema>(\n filePath: string,\n schema: TSchema,\n): JsoncConfig<v.InferOutput<TSchema>> {\n return parseJsoncConfig(readFileIfExists(filePath), schema)\n}\n\nexport function parseJsoncConfig<TSchema extends v.GenericSchema>(\n text: string | null,\n schema: TSchema,\n): JsoncConfig<v.InferOutput<TSchema>> {\n if (text === null) return { kind: 'absent' }\n\n try {\n const parsed = v.safeParse(schema, parseJsonc(text))\n return parsed.success ? { kind: 'valid', value: parsed.output } : { kind: 'invalid' }\n } catch (error) {\n if (error instanceof ConfigFormatError) return { kind: 'invalid' }\n throw error\n }\n}\n","export abstract class ConfigFormatError extends Error {}\n\nexport type ConfigSyntaxErrorParams = { line: number; column: number; reason: string }\n\nexport class ConfigSyntaxError extends ConfigFormatError {\n readonly line: number\n readonly column: number\n readonly reason: string\n\n constructor({ line, column, reason }: ConfigSyntaxErrorParams) {\n super(`invalid syntax at line ${line}, column ${column} (${reason}). Fix it, then run again.`)\n this.name = 'ConfigSyntaxError'\n this.line = line\n this.column = column\n this.reason = reason\n }\n}\n\nconst FOUND_TYPE_LABELS = {\n null: 'null',\n array: 'an array',\n date: 'a date',\n string: 'a string',\n number: 'a number',\n boolean: 'a boolean',\n other: 'an unsupported value',\n} as const\n\nexport type FoundType = keyof typeof FOUND_TYPE_LABELS\n\nexport type UnmergeableValueErrorParams = { keyPath: readonly string[]; foundType: FoundType }\n\nexport class UnmergeableValueError extends ConfigFormatError {\n readonly keyPath: readonly string[]\n readonly foundType: FoundType\n\n constructor({ keyPath, foundType }: UnmergeableValueErrorParams) {\n const location = describeLocation(keyPath)\n super(\n `cannot merge into ${location}: it is ${FOUND_TYPE_LABELS[foundType]}, not an object. ` +\n 'Make it an object or remove it, then run again.',\n )\n this.name = 'UnmergeableValueError'\n this.keyPath = keyPath\n this.foundType = foundType\n }\n}\n\nexport type ReservedKeyErrorParams = { keyPath: readonly string[]; key: string }\n\nexport class ReservedKeyError extends ConfigFormatError {\n readonly keyPath: readonly string[]\n readonly key: string\n\n constructor({ keyPath, key }: ReservedKeyErrorParams) {\n super(`cannot write ${describeLocation(keyPath)}: \"${key}\" is a reserved name. Use another name, then run again.`)\n this.name = 'ReservedKeyError'\n this.keyPath = keyPath\n this.key = key\n }\n}\n\nexport type DuplicateKeyErrorParams = { keyPath: readonly string[] }\n\nexport class DuplicateKeyError extends ConfigFormatError {\n readonly keyPath: readonly string[]\n\n constructor({ keyPath }: DuplicateKeyErrorParams) {\n super(\n `cannot edit ${describeLocation(keyPath)}: it appears more than once in the same object. ` +\n 'Keep one, then run again.',\n )\n this.name = 'DuplicateKeyError'\n this.keyPath = keyPath\n }\n}\n\nexport class MergeConflictError extends ConfigFormatError {\n constructor() {\n super('cannot set the values without changing other settings in it. Set them by hand, then run again.')\n this.name = 'MergeConflictError'\n }\n}\n\nfunction describeLocation(keyPath: readonly string[]): string {\n if (keyPath.length === 0) return 'the top level'\n return `\"${keyPath.join('.')}\"`\n}\n","import {\n applyEdits,\n findNodeAtLocation,\n modify,\n parse,\n parseTree,\n printParseErrorCode,\n type FormattingOptions,\n type Node,\n type ParseError,\n type ParseErrorCode,\n type ParseOptions,\n} from 'jsonc-parser'\nimport { ConfigSyntaxError, DuplicateKeyError } from '../config-errors'\nimport { detectLineEnding, type LineEnding } from '../detect-line-ending'\nimport { listCreatedParents, listMissingParents, type KeyOriginal } from '../key-original'\nimport {\n assertMergeable,\n assertTopLevelTable,\n readPath,\n type KeyPath,\n type KeyPathUpdates,\n type Table,\n} from '../key-path'\nimport { splitByteOrderMark } from '../split-byte-order-mark'\n\nconst PARSE_OPTIONS: ParseOptions = { allowTrailingComma: true, disallowComments: false }\n\nexport function parseJsonc(text: string | null): Table {\n const { body } = splitByteOrderMark(text ?? '')\n if (body.trim() === '') return {}\n\n const value = parseJsoncValue(body)\n assertTopLevelTable(value)\n return value\n}\n\nexport function parseJsoncValue(source: string): unknown {\n const errors: ParseError[] = []\n const value: unknown = parse(source, errors, PARSE_OPTIONS)\n const [firstError] = errors\n if (firstError !== undefined) {\n const position = locateOffset(source, firstError.offset)\n throw new ConfigSyntaxError({ ...position, reason: describeErrorCode(firstError.error) })\n }\n return value\n}\n\nconst EMPTY_DOCUMENT = '{}'\n\nexport function renderJsonc(current: string | null, updates: KeyPathUpdates): string {\n const { byteOrderMark, body } = splitByteOrderMark(current ?? '')\n const existing = parseJsonc(body)\n const tree = parseTree(body, [], PARSE_OPTIONS)\n for (const [keyPath] of updates) {\n assertNoDuplicateKey(tree, keyPath)\n assertMergeable(existing, keyPath)\n }\n\n const formattingOptions = detectFormatting(body)\n const edited = updates\n .filter(([keyPath, value]) => value !== undefined || readPath(existing, keyPath) !== undefined)\n .reduce(\n (text, [keyPath, value]) => setValue({ text, keyPath, value, formattingOptions }),\n body.trim() === '' ? EMPTY_DOCUMENT : body,\n )\n return byteOrderMark + matchFinalLineEnding(edited, formattingOptions.eol, isNewOrEndsWithLineEnding(body))\n}\n\nexport function readJsoncOriginals(current: string | null, keyPaths: readonly KeyPath[]): KeyOriginal[] {\n const { body } = splitByteOrderMark(current ?? '')\n const document = parseJsonc(body)\n return keyPaths.map((keyPath) => ({\n keyPath,\n original: readSource(body, keyPath),\n createdParents: listMissingParents(document, keyPath),\n }))\n}\n\nexport function restoreJsonc(current: string, originals: readonly KeyOriginal[]): string {\n const { byteOrderMark, body } = splitByteOrderMark(current)\n const document = parseJsonc(body)\n const tree = parseTree(body, [], PARSE_OPTIONS)\n for (const { keyPath, original } of originals) {\n assertNoDuplicateKey(tree, keyPath)\n if (original !== null) {\n assertMergeable(document, keyPath)\n // Parsed only to throw: a value that exists now is replaced by this text verbatim.\n parseJsoncValue(original)\n }\n }\n\n const formattingOptions = detectFormatting(body)\n const restored = originals.reduce((text, key) => restoreKey({ text, key, formattingOptions }), body)\n const pruned = listCreatedParents(originals).reduce(\n (text, keyPath) => removeEmptyObject({ text, keyPath, formattingOptions }),\n restored,\n )\n return byteOrderMark + pruned\n}\n\ntype TextPosition = { line: number; column: number }\n\nfunction locateOffset(text: string, offset: number): TextPosition {\n const before = text.slice(0, offset)\n const lineStart = before.lastIndexOf('\\n') + 1\n return { line: before.split('\\n').length, column: offset - lineStart + 1 }\n}\n\nconst WORD_BOUNDARY = /(?<=[a-z])(?=[A-Z])/g\n\nfunction describeErrorCode(code: ParseErrorCode): string {\n return printParseErrorCode(code).replace(WORD_BOUNDARY, ' ').toLowerCase()\n}\n\n// `modify` edits the first of two equal keys, while `JSON.parse`, and so the agent, reads the last.\nfunction assertNoDuplicateKey(root: Node | undefined, keyPath: KeyPath): void {\n let node = root\n for (const [index, key] of keyPath.entries()) {\n const values = listPropertyValues(node, key)\n if (values.length > 1) throw new DuplicateKeyError({ keyPath: keyPath.slice(0, index + 1) })\n node = values[0]\n }\n}\n\nfunction listPropertyValues(node: Node | undefined, key: string): Node[] {\n if (node?.type !== 'object') return []\n\n return (node.children ?? []).flatMap((property) => {\n const [keyNode, valueNode] = property.children ?? []\n return keyNode?.value === key && valueNode !== undefined ? [valueNode] : []\n })\n}\n\nconst DEFAULT_INDENT = ' '\nconst DEFAULT_LINE_ENDING: LineEnding = '\\n'\nconst FIRST_INDENTED_KEY = /^([ \\t]+)\"/m\n\ntype DetectedFormatting = FormattingOptions & { eol: LineEnding }\n\nfunction detectFormatting(text: string): DetectedFormatting {\n const indent = FIRST_INDENTED_KEY.exec(text)?.[1] ?? DEFAULT_INDENT\n const isSpaceIndented = !indent.startsWith('\\t')\n return {\n insertSpaces: isSpaceIndented,\n tabSize: isSpaceIndented ? indent.length : 1,\n eol: detectLineEnding(text) ?? DEFAULT_LINE_ENDING,\n }\n}\n\n// A file the user saved without a final newline keeps none, matching TOML; a new or blank file gets one.\nfunction isNewOrEndsWithLineEnding(body: string): boolean {\n return body.trim() === '' || body.endsWith('\\n')\n}\n\nfunction matchFinalLineEnding(text: string, lineEnding: LineEnding, shouldEndWithLineEnding: boolean): string {\n if (shouldEndWithLineEnding) return text.endsWith('\\n') ? text : text + lineEnding\n return text.replace(/\\r?\\n$/, '')\n}\n\nfunction findNode(text: string, keyPath: KeyPath): Node | undefined {\n const root = parseTree(text, [], PARSE_OPTIONS)\n return root === undefined ? undefined : findNodeAtLocation(root, [...keyPath])\n}\n\nfunction readSource(text: string, keyPath: KeyPath): string | null {\n const node = findNode(text, keyPath)\n return node === undefined ? null : text.slice(node.offset, node.offset + node.length)\n}\n\ntype RestoreKeyParams = { text: string; key: KeyOriginal; formattingOptions: FormattingOptions }\n\nfunction restoreKey({ text, key, formattingOptions }: RestoreKeyParams): string {\n const node = findNode(text, key.keyPath)\n if (node === undefined && key.original === null) return text\n if (key.original === null) return setValue({ text, keyPath: key.keyPath, value: undefined, formattingOptions })\n if (node === undefined) {\n const value = parseJsoncValue(key.original)\n return setValue({ text, keyPath: key.keyPath, value, formattingOptions })\n }\n\n return text.slice(0, node.offset) + key.original + text.slice(node.offset + node.length)\n}\n\ntype RemoveEmptyObjectParams = { text: string; keyPath: KeyPath; formattingOptions: FormattingOptions }\n\nfunction removeEmptyObject({ text, keyPath, formattingOptions }: RemoveEmptyObjectParams): string {\n const node = findNode(text, keyPath)\n if (node?.type !== 'object' || (node.children ?? []).length > 0) return text\n\n return setValue({ text, keyPath, value: undefined, formattingOptions })\n}\n\ntype SetValueParams = { text: string; keyPath: KeyPath; value: unknown; formattingOptions: FormattingOptions }\n\nfunction setValue({ text, keyPath, value, formattingOptions }: SetValueParams): string {\n return applyEdits(text, modify(text, [...keyPath], value, { formattingOptions }))\n}\n","export type LineEnding = '\\n' | '\\r\\n'\n\nexport function detectLineEnding(text: string): LineEnding | undefined {\n if (text.includes('\\r\\n')) return '\\r\\n'\n if (text.includes('\\n')) return '\\n'\n return undefined\n}\n","import { match, P } from 'ts-pattern'\nimport * as v from 'valibot'\nimport { ReservedKeyError, UnmergeableValueError, type FoundType } from './config-errors'\n\nexport type KeyPath = readonly [string, ...string[]]\n/** A value of undefined removes the key, so a key that would override ours cannot linger. */\nexport type KeyPathUpdate = readonly [KeyPath, unknown]\nexport type KeyPathUpdates = readonly [KeyPathUpdate, ...KeyPathUpdate[]]\n\nconst TableSchema = v.pipe(\n v.unknown(),\n v.check((value) => !Array.isArray(value) && !(value instanceof Date)),\n v.record(v.string(), v.unknown()),\n)\n\nexport type Table = v.InferOutput<typeof TableSchema>\n\nexport function assertTopLevelTable(value: unknown): asserts value is Table {\n if (!isTable(value)) throw new UnmergeableValueError({ keyPath: [], foundType: describeFoundType(value) })\n}\n\nexport function assertMergeable(document: Table, keyPath: KeyPath): void {\n assertNoReservedKey(keyPath)\n\n const { parents } = splitLeaf(keyPath)\n let table = document\n for (const [index, key] of parents.entries()) {\n if (!Object.hasOwn(table, key)) return\n\n const value = table[key]\n if (!isTable(value)) {\n const keyPathToValue = parents.slice(0, index + 1)\n throw new UnmergeableValueError({ keyPath: keyPathToValue, foundType: describeFoundType(value) })\n }\n table = value\n }\n}\n\nexport function setPath(document: Table, keyPath: KeyPath, value: unknown): void {\n assertMergeable(document, keyPath)\n\n const { parents, leaf } = splitLeaf(keyPath)\n let table = document\n for (const key of parents) table = getOrCreateChildTable(table, key)\n table[leaf] = value\n}\n\nexport function readPath(document: Table, keyPath: KeyPath): unknown {\n let value: unknown = document\n for (const key of keyPath) {\n if (!isTable(value) || !Object.hasOwn(value, key)) return undefined\n value = value[key]\n }\n return value\n}\n\nexport function deletePath(document: Table, keyPath: KeyPath): void {\n const [first, ...rest] = keyPath\n const leaf = rest.pop()\n if (leaf === undefined) {\n delete document[first]\n return\n }\n\n const parent = readPath(document, [first, ...rest])\n if (isTable(parent)) delete parent[leaf]\n}\n\nexport function isEmptyTable(value: unknown): boolean {\n return isTable(value) && Object.keys(value).length === 0\n}\n\nconst RESERVED_KEYS: ReadonlySet<string> = new Set(['__proto__', 'constructor', 'prototype'])\n\nfunction assertNoReservedKey(keyPath: KeyPath): void {\n const reserved = keyPath.find((key) => RESERVED_KEYS.has(key))\n if (reserved !== undefined) throw new ReservedKeyError({ keyPath, key: reserved })\n}\n\nexport type SplitLeafResult = { parents: readonly string[]; leaf: string }\n\nexport function splitLeaf(keyPath: KeyPath): SplitLeafResult {\n const [first, ...rest] = keyPath\n const leaf = rest.pop()\n if (leaf === undefined) return { parents: [], leaf: first }\n return { parents: [first, ...rest], leaf }\n}\n\nfunction isTable(value: unknown): value is Table {\n return v.is(TableSchema, value)\n}\n\nfunction describeFoundType(value: unknown): FoundType {\n return match(value)\n .returnType<FoundType>()\n .with(null, () => 'null')\n .with(P.array(), () => 'array')\n .with(P.instanceOf(Date), () => 'date')\n .with(P.string, () => 'string')\n .with(P.union(P.number, P.bigint), () => 'number')\n .with(P.boolean, () => 'boolean')\n .otherwise(() => 'other')\n}\n\nfunction getOrCreateChildTable(table: Table, key: string): Table {\n const existing = Object.hasOwn(table, key) ? table[key] : undefined\n if (isTable(existing)) return existing\n\n const created: Table = {}\n table[key] = created\n return created\n}\n","import { readPath, type KeyPath, type Table } from './key-path'\n\n/** `original` is the value's source text as the file had it, or `null` when the key was absent. */\nexport type KeyOriginal = { keyPath: KeyPath; original: string | null; createdParents: readonly KeyPath[] }\n\nexport function listMissingParents(document: Table, keyPath: KeyPath): KeyPath[] {\n const parentPaths = listParentPaths(keyPath)\n const firstMissing = parentPaths.findIndex((parentPath) => readPath(document, parentPath) === undefined)\n return firstMissing === -1 ? [] : parentPaths.slice(firstMissing)\n}\n\nfunction listParentPaths([first, ...rest]: KeyPath): KeyPath[] {\n return rest.map((_, index) => [first, ...rest.slice(0, index)])\n}\n\nexport function listCreatedParents(originals: readonly KeyOriginal[]): KeyPath[] {\n const byPath = new Map<string, KeyPath>()\n for (const keyPath of originals.flatMap(({ createdParents }) => createdParents)) {\n byPath.set(JSON.stringify(keyPath), keyPath)\n }\n return [...byPath.values()].sort((first, second) => second.length - first.length)\n}\n","const BYTE_ORDER_MARK = ''\n\nexport type SplitByteOrderMarkResult = { byteOrderMark: string; body: string }\n\nexport function splitByteOrderMark(text: string): SplitByteOrderMarkResult {\n if (!text.startsWith(BYTE_ORDER_MARK)) return { byteOrderMark: '', body: text }\n return { byteOrderMark: BYTE_ORDER_MARK, body: text.slice(BYTE_ORDER_MARK.length) }\n}\n","import fs from 'node:fs'\nimport { isMissingFileError } from './errors/is-missing-file-error'\nimport { Utf16FileError } from './errors/utf16-file-error'\n\nexport function readFileIfExists(filePath: string): string | null {\n const bytes = readBytesIfExists(filePath)\n if (bytes === null) return null\n if (hasUtf16ByteOrderMark(bytes)) throw new Utf16FileError(filePath)\n\n return bytes.toString('utf8')\n}\n\nfunction readBytesIfExists(filePath: string): Buffer | null {\n try {\n return fs.readFileSync(filePath)\n } catch (error) {\n if (isMissingFileError(error)) return null\n throw error\n }\n}\n\nconst BYTE_ORDER_MARK = '\\uFEFF'\nconst UTF16_BYTE_ORDER_MARKS = [\n Buffer.from(BYTE_ORDER_MARK, 'utf16le'),\n Buffer.from(BYTE_ORDER_MARK, 'utf16le').swap16(),\n]\n\nfunction hasUtf16ByteOrderMark(bytes: Buffer): boolean {\n return UTF16_BYTE_ORDER_MARKS.some((byteOrderMark) => bytes.subarray(0, byteOrderMark.length).equals(byteOrderMark))\n}\n","export class Utf16FileError extends Error {\n readonly filePath: string\n\n constructor(filePath: string) {\n super(`${filePath} is saved as UTF-16. Re-save it as UTF-8, then run again.`)\n this.name = 'Utf16FileError'\n this.filePath = filePath\n }\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport * as v from 'valibot'\nimport { resolvePublicApiHost, type DesiredConfig } from '../../product/public-api/desired-config'\nimport { DEFAULT_MODEL } from '../../product/public-api/models/predefined-models'\nimport { MergeConflictError } from '../../shared/file-formats/config-errors'\nimport type { KeyPathUpdate, KeyPathUpdates } from '../../shared/file-formats/key-path'\nimport { isDirectory } from '../../shared/file-system/is-directory'\nimport { listDirectory } from '../../shared/file-system/list-directory'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { displayPath } from '../../shared/text/display-path'\nimport { readNonBlank } from '../../shared/text/read-non-blank'\nimport { isPublicApiUrl } from '../config/is-public-api-url'\nimport { parseJsoncConfig, readJsoncFile } from '../config/read-jsonc-file'\nimport type { ConfigurableHarness, DetectResult, FileContribution, HarnessInspection } from '../harness'\n\nexport const claudeDesktop: ConfigurableHarness = {\n kind: 'configurable',\n id: 'claude-desktop',\n label: 'Claude Desktop',\n protocols: ['anthropic'],\n projectSupport: { kind: 'unsupported', reason: 'it keeps one configuration per user, never one per project' },\n isModelSupported: (model) => isDesktopModel(model),\n detect: (ctx) => detectInstallation(ctx),\n configPath: (ctx) => resolveProfilePath(ctx),\n plan: (desired, ctx) => [planProfile(desired, ctx), planLibraryIndex(ctx), planAppConfig(ctx)],\n inspect: (ctx) => inspectProfile(ctx),\n readKey: (ctx) => readPublicApiKey(ctx),\n readSecrets: (ctx) => readCredentials(ctx),\n postSetupNotes: [\n 'Quit Claude Desktop completely and open it again: it reads this configuration only when it starts.',\n 'On the gateway, Claude Desktop keeps chats and settings apart from your claude.ai ones. ' +\n 'Run nexos-connect restore to switch it back.',\n ],\n}\n\nconst APP_NAME = 'Claude'\nconst GATEWAY_DIRECTORY = `${APP_NAME}-3p`\nconst APP_BUNDLE = `${APP_NAME}.app`\nconst LEGACY_WINDOWS_DIRECTORY = 'AnthropicClaude'\nconst LINUX_BINARY = 'claude-desktop'\n// The package families of the direct download and of the Microsoft Store build.\nconst WINDOWS_PACKAGE_PATTERN = /^(?:AnthropicPBC\\.)?Claude_/\n\n// The app bundle or package shows an install that has never started; the data directory, one that has.\nfunction detectInstallation(ctx: PlatformContext): DetectResult {\n const candidates = listInstallationCandidates(ctx)\n const found = candidates.find((candidate) => isDirectory(candidate))\n if (found !== undefined) return { isFound: true, detail: displayPath(found, ctx.home) }\n if (ctx.hasBinary(LINUX_BINARY)) return { isFound: true, detail: `${LINUX_BINARY} found on PATH` }\n\n return {\n isFound: false,\n detail: `no ${candidates.map((candidate) => displayPath(candidate, ctx.home)).join(' or ')}`,\n }\n}\n\nfunction listInstallationCandidates(ctx: PlatformContext): string[] {\n const gatewayDirectory = resolveDataDirectory(ctx)\n return match(ctx.platform)\n .with('darwin', () => [\n path.join(ctx.home, 'Applications', APP_BUNDLE),\n path.join(resolveMacAppSupport(ctx), APP_NAME),\n gatewayDirectory,\n path.join(path.parse(ctx.home).root, 'Applications', APP_BUNDLE),\n ])\n .with('win32', () => [\n path.join(resolveLocalAppData(ctx), LEGACY_WINDOWS_DIRECTORY),\n ...listWindowsPackages(ctx),\n path.join(resolveRoamingAppData(ctx), APP_NAME),\n gatewayDirectory,\n ])\n .otherwise(() => [path.join(resolveConfigHome(ctx), APP_NAME), gatewayDirectory])\n}\n\nfunction listWindowsPackages(ctx: PlatformContext): string[] {\n const packagesDirectory = path.join(resolveLocalAppData(ctx), 'Packages')\n return listDirectory(packagesDirectory)\n .filter((name) => WINDOWS_PACKAGE_PATTERN.test(name))\n .map((name) => path.join(packagesDirectory, name))\n}\n\n// Gateway mode keeps its own data directory beside the claude.ai one; on Windows under local, not roaming, app data.\nfunction resolveDataDirectory(ctx: PlatformContext): string {\n return match(ctx.platform)\n .with('darwin', () => path.join(resolveMacAppSupport(ctx), GATEWAY_DIRECTORY))\n .with('win32', () => path.join(resolveLocalAppData(ctx), GATEWAY_DIRECTORY))\n .otherwise(() => path.join(resolveConfigHome(ctx), GATEWAY_DIRECTORY))\n}\n\nfunction resolveMacAppSupport(ctx: PlatformContext): string {\n return path.join(ctx.home, 'Library', 'Application Support')\n}\n\nfunction resolveLocalAppData(ctx: PlatformContext): string {\n return readNonBlank(ctx.env.LOCALAPPDATA) ?? path.join(ctx.home, 'AppData', 'Local')\n}\n\nfunction resolveRoamingAppData(ctx: PlatformContext): string {\n return readNonBlank(ctx.env.APPDATA) ?? path.join(ctx.home, 'AppData', 'Roaming')\n}\n\nfunction resolveConfigHome(ctx: PlatformContext): string {\n return readNonBlank(ctx.env.XDG_CONFIG_HOME) ?? path.join(ctx.home, '.config')\n}\n\nconst LIBRARY_DIRECTORY = 'configLibrary'\nconst LIBRARY_INDEX_FILE = '_meta.json'\nconst APP_CONFIG_FILE = 'claude_desktop_config.json'\n// One id for every run, so a rerun rewrites this profile instead of adding one; Claude Desktop takes a lowercase UUID.\nexport const PROFILE_ID = '6e65786f-732d-4169-9e63-6c6f75646465'\n\nfunction resolveLibraryDirectory(ctx: PlatformContext): string {\n return path.join(resolveDataDirectory(ctx), LIBRARY_DIRECTORY)\n}\n\nfunction resolveProfilePath(ctx: PlatformContext): string {\n return path.join(resolveLibraryDirectory(ctx), `${PROFILE_ID}.json`)\n}\n\nfunction resolveLibraryIndexPath(ctx: PlatformContext): string {\n return path.join(resolveLibraryDirectory(ctx), LIBRARY_INDEX_FILE)\n}\n\nfunction resolveAppConfigPath(ctx: PlatformContext): string {\n return path.join(resolveDataDirectory(ctx), APP_CONFIG_FILE)\n}\n\nconst GATEWAY_PROVIDER = 'gateway'\n// A static credential is the only source Claude Desktop then reads, so it never falls back to asking for a sign-in.\nconst STATIC_CREDENTIAL = 'static'\nconst BEARER_SCHEME = 'bearer'\n// Turns on Chat, which gateway mode hides unless asked; keeps MCP tool search on, which Claude Desktop otherwise turns\n// off behind a gateway; and stops the usage events and telemetry that go to Anthropic rather than the gateway.\nconst RECOMMENDED_SETTINGS: Readonly<Record<string, boolean>> = {\n chatTabEnabled: true,\n toolSearchEnabled: true,\n disableNonessentialTelemetry: true,\n}\n\nfunction planProfile(desired: DesiredConfig, ctx: PlatformContext): FileContribution {\n const modelEntries = listModelEntries(desired.model)\n return {\n kind: 'file',\n path: resolveProfilePath(ctx),\n hasSecret: true,\n edits: () => ({\n format: 'jsonc',\n updates: [\n [['inferenceProvider'], GATEWAY_PROVIDER],\n [['inferenceGatewayBaseUrl'], desired.anthropicBaseUrl],\n [['inferenceCredentialKind'], STATIC_CREDENTIAL],\n [['inferenceGatewayApiKey'], desired.apiKey],\n [['inferenceGatewayAuthScheme'], BEARER_SCHEME],\n [['inferenceModels'], modelEntries],\n ...Object.entries(RECOMMENDED_SETTINGS).map(([name, value]): KeyPathUpdate => [[name], value]),\n ],\n }),\n }\n}\n\n// Claude Desktop hands Claude Code a model for a tier only when an entry names that tier; for the rest Claude Code\n// falls back to its own model ids, which the gateway does not serve. Each entry is a row in the model picker.\nconst MODEL_TIERS = ['sonnet', 'opus', 'haiku', 'fable'] as const\n\nfunction listModelEntries(model: string) {\n const name = toDesktopModel(model)\n // Without prefer1m, a model that supports 1M shows twice in the picker, once per context size.\n const contextSettings = model === DEFAULT_MODEL ? { supports1m: true, prefer1m: true } : {}\n return MODEL_TIERS.map((tier) => ({ name, ...contextSettings, anthropicFamilyTier: tier }))\n}\n\n// The gateway serves the router under this name too, and only this one passes Claude Desktop's check.\nconst DESKTOP_ROUTER_MODEL = `anthropic/${DEFAULT_MODEL}`\n// Claude Desktop drops a gateway model whose name does not look like Claude's, leaving its picker empty. It also turns\n// away a few other vendors' names that would pass this check.\nconst CLAUDE_MODEL_MARKERS = ['claude', 'anthropic', 'sonnet', 'opus', 'haiku', 'fable', 'mythos'] as const\n\nfunction isDesktopModel(model: string): boolean {\n if (model === DEFAULT_MODEL) return true\n\n const lowerCaseModel = model.toLowerCase()\n return CLAUDE_MODEL_MARKERS.some((marker) => lowerCaseModel.includes(marker))\n}\n\nfunction toDesktopModel(model: string): string {\n if (!isDesktopModel(model)) {\n throw new Error(\n `Claude Desktop lists only models with Claude-like names, so it cannot use \"${model}\". ` +\n `Set it up on its own with ${DEFAULT_MODEL} or a Claude model: nexos-connect --harnesses claude-desktop.`,\n )\n }\n\n return model === DEFAULT_MODEL ? DESKTOP_ROUTER_MODEL : model\n}\n\nfunction fromDesktopModel(name: string): string {\n return name === DESKTOP_ROUTER_MODEL ? DEFAULT_MODEL : name\n}\n\nconst PROFILE_NAME = 'nexos.ai'\n\n// Claude Desktop applies the profile appliedId names; its settings window offers only the profiles entries lists.\nfunction planLibraryIndex(ctx: PlatformContext): FileContribution {\n return {\n kind: 'file',\n path: resolveLibraryIndexPath(ctx),\n hasSecret: false,\n edits: (current) => ({ format: 'jsonc', updates: listLibraryIndexUpdates(current) }),\n }\n}\n\nconst LibraryIndexSchema = v.looseObject({ entries: v.optional(v.unknown()) })\nconst ProfileEntrySchema = v.looseObject({ id: v.literal(PROFILE_ID) })\n\nfunction listLibraryIndexUpdates(current: string | null): KeyPathUpdates {\n const applied: KeyPathUpdate = [['appliedId'], PROFILE_ID]\n const entries = readLibraryEntries(current)\n if (entries.some((entry) => v.is(ProfileEntrySchema, entry))) return [applied]\n\n return [applied, [['entries'], [...entries, { id: PROFILE_ID, name: PROFILE_NAME }]]]\n}\n\nfunction readLibraryEntries(current: string | null): unknown[] {\n const index = parseJsoncConfig(current, LibraryIndexSchema)\n if (index.kind !== 'valid') return []\n\n const { entries } = index.value\n if (entries === undefined) return []\n if (!Array.isArray(entries)) throw new MergeConflictError()\n\n return entries\n}\n\nconst DEPLOYMENT_MODE_SETTING = 'deploymentMode'\nconst GATEWAY_MODE = '3p'\nconst CLAUDE_AI_MODE = '1p'\n\n// Starts Claude Desktop in gateway mode without first asking to choose, even after a switch back to claude.ai.\nfunction planAppConfig(ctx: PlatformContext): FileContribution {\n return {\n kind: 'file',\n path: resolveAppConfigPath(ctx),\n hasSecret: false,\n edits: () => ({ format: 'jsonc', updates: [[[DEPLOYMENT_MODE_SETTING], GATEWAY_MODE]] }),\n }\n}\n\nconst OptionalTextSchema = v.fallback(v.optional(v.string()), undefined)\n\nconst ProfileSchema = v.looseObject({\n inferenceGatewayBaseUrl: OptionalTextSchema,\n inferenceGatewayApiKey: OptionalTextSchema,\n inferenceModels: v.fallback(v.optional(v.array(v.unknown())), undefined),\n})\n\nconst NOT_CONFIGURED: HarnessInspection = { isConfigured: false, model: undefined, isUnreadable: false }\n\nfunction inspectProfile(ctx: PlatformContext): HarnessInspection {\n const profile = readJsoncFile(resolveProfilePath(ctx), ProfileSchema)\n if (profile.kind === 'absent') return NOT_CONFIGURED\n if (profile.kind === 'invalid') return { ...NOT_CONFIGURED, isUnreadable: true }\n\n const { inferenceGatewayBaseUrl, inferenceModels } = profile.value\n return {\n isConfigured: isPublicApiUrl(inferenceGatewayBaseUrl, resolvePublicApiHost(ctx.env)) && isProfileApplied(ctx),\n model: readDefaultModel(inferenceModels),\n isUnreadable: false,\n }\n}\n\nconst AppliedIndexSchema = v.looseObject({ appliedId: v.literal(PROFILE_ID) })\nconst AppConfigSchema = v.looseObject({ [DEPLOYMENT_MODE_SETTING]: OptionalTextSchema })\n\n// Another profile chosen in the settings window, or a switch back to claude.ai, leaves ours on disk but unused.\nfunction isProfileApplied(ctx: PlatformContext): boolean {\n const index = readJsoncFile(resolveLibraryIndexPath(ctx), AppliedIndexSchema)\n const appConfig = readJsoncFile(resolveAppConfigPath(ctx), AppConfigSchema)\n const isClaudeAiChosen = appConfig.kind === 'valid' && appConfig.value[DEPLOYMENT_MODE_SETTING] === CLAUDE_AI_MODE\n return index.kind === 'valid' && !isClaudeAiChosen\n}\n\nconst ModelNameSchema = v.union([v.string(), v.looseObject({ name: v.string() })])\n\n// The first entry is the model Claude Desktop starts on.\nfunction readDefaultModel(entries: readonly unknown[] | undefined): string | undefined {\n const parsed = v.safeParse(ModelNameSchema, entries?.[0])\n if (!parsed.success) return undefined\n\n return fromDesktopModel(typeof parsed.output === 'string' ? parsed.output : parsed.output.name)\n}\n\nfunction readPublicApiKey(ctx: PlatformContext): string | undefined {\n const profile = readJsoncFile(resolveProfilePath(ctx), ProfileSchema)\n if (profile.kind !== 'valid') return undefined\n if (!isPublicApiUrl(profile.value.inferenceGatewayBaseUrl, resolvePublicApiHost(ctx.env))) return undefined\n\n return readNonBlank(profile.value.inferenceGatewayApiKey)\n}\n\nfunction readCredentials(ctx: PlatformContext): string[] {\n return [readProfileKey(ctx), ...readMcpServerSecrets(ctx)].flatMap((secret) => secret ?? [])\n}\n\nfunction readProfileKey(ctx: PlatformContext): string | undefined {\n const profile = readJsoncFile(resolveProfilePath(ctx), ProfileSchema)\n return profile.kind === 'valid' ? readNonBlank(profile.value.inferenceGatewayApiKey) : undefined\n}\n\nconst AppConfigServersSchema = v.looseObject({\n mcpServers: v.fallback(v.optional(v.record(v.string(), v.unknown())), undefined),\n})\nconst ValuesSchema = v.fallback(v.optional(v.record(v.string(), v.unknown())), undefined)\n// The diff of the app config shows the lines around deploymentMode, which can be an MCP server's environment or headers.\nconst McpServerSecretsSchema = v.looseObject({ env: ValuesSchema, headers: ValuesSchema })\n\nfunction readMcpServerSecrets(ctx: PlatformContext): string[] {\n const appConfig = readJsoncFile(resolveAppConfigPath(ctx), AppConfigServersSchema)\n if (appConfig.kind !== 'valid') return []\n\n return Object.values(appConfig.value.mcpServers ?? {}).flatMap((server) => {\n const parsed = v.safeParse(McpServerSecretsSchema, server)\n if (!parsed.success) return []\n\n const values = [...Object.values(parsed.output.env ?? {}), ...Object.values(parsed.output.headers ?? {})]\n return values.flatMap((value) => (typeof value === 'string' ? (readNonBlank(value) ?? []) : []))\n })\n}\n","import fs from 'node:fs'\nimport { isMissingFileError } from './errors/is-missing-file-error'\n\nexport function isDirectory(directoryPath: string): boolean {\n try {\n return fs.statSync(directoryPath).isDirectory()\n } catch (error) {\n if (isMissingFileError(error)) return false\n throw error\n }\n}\n","import fs from 'node:fs'\nimport { isMissingFileError } from './errors/is-missing-file-error'\n\nexport function listDirectory(directoryPath: string): string[] {\n try {\n return fs.readdirSync(directoryPath)\n } catch (error) {\n if (isMissingFileError(error)) return []\n throw error\n }\n}\n","import path from 'node:path'\nimport { resolvePublicApiHost, type DesiredConfig } from '../../product/public-api/desired-config'\nimport { DEFAULT_MODEL } from '../../product/public-api/models/predefined-models'\nimport { ConfigFormatError } from '../../shared/file-formats/config-errors'\nimport { readPath, type KeyPath, type Table } from '../../shared/file-formats/key-path'\nimport { escapePosixSingleQuoted } from '../../shared/file-formats/shell/escape-posix-single-quoted'\nimport { parseToml, type TomlUpdate } from '../../shared/file-formats/toml'\nimport { readFileIfExists } from '../../shared/file-system/read-file-if-exists'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { detectConfigOrBinary } from '../config/detect-config-or-binary'\nimport { isPublicApiUrl } from '../config/is-public-api-url'\nimport type { FileContribution, HarnessInspection, LaunchingHarness } from '../harness'\n\nconst BINARY = 'codex'\nconst API_KEY_VARIABLE = 'NEXOS_API_KEY'\n// Codex's default, written out to replace a \"chat\" left from an older config: Codex now refuses to start on it.\nconst WIRE_API = 'responses'\n\nexport const codex: LaunchingHarness = {\n kind: 'configurable',\n id: 'codex',\n label: 'OpenAI Codex',\n binary: BINARY,\n installPackage: '@openai/codex',\n protocols: ['openai-responses'],\n projectSupport: { kind: 'unsupported', reason: 'a repo-level config.toml cannot set the provider or its base_url' },\n keyEnvVariable: API_KEY_VARIABLE,\n detect: (ctx) => detectConfigOrBinary({ candidates: [resolveConfigPath(ctx)], binary: BINARY, ctx }),\n configPath: (ctx) => resolveConfigPath(ctx),\n plan: (desired, ctx) => [\n planConfig(desired, ctx),\n { kind: 'env', variables: { [API_KEY_VARIABLE]: desired.apiKey } },\n ],\n inspect: (ctx) => inspectConfig(ctx),\n launch: (desired) => {\n const overrides = [\n `model=${JSON.stringify(desired.model)}`,\n `model_provider=${JSON.stringify(RUN_PROVIDER_ID)}`,\n ...Object.entries(providerFields(desired)).map(\n ([field, value]) => `model_providers.${RUN_PROVIDER_ID}.${field}=${JSON.stringify(value)}`,\n ),\n ...[...PRIVACY_UPDATES, ...listRouterUpdates(desired)].map(\n ([keyPath, value]) => `${keyPath.join('.')}=${JSON.stringify(value)}`,\n ),\n ]\n return {\n binary: BINARY,\n arguments: overrides.flatMap((override) => ['-c', override]),\n env: { [API_KEY_VARIABLE]: desired.apiKey },\n subcommands: SESSION_SUBCOMMANDS,\n }\n },\n launchNotes: [\n 'Running /model saves that model to ~/.codex/config.toml.',\n 'A later plain `codex resume` of this session points at a \"nexos-run\" provider that no longer exists.',\n ],\n postSetupNote: (model) =>\n `If Codex reports \\`Missing environment variable: ${API_KEY_VARIABLE}\\`, try ` +\n `\\`${BINARY} -c '${escapePosixSingleQuoted(`model=${JSON.stringify(model)}`)}'\\`. ` +\n 'This is a reported workaround, not a required launch command or a guaranteed fix.',\n postSetupNotes: [\n `OpenAI Codex requires wire_api = \"${WIRE_API}\": if the gateway does not serve /v1/responses, ` +\n 'Codex fails even though its config is correct.',\n ],\n}\n\nconst CONFIG_DIRECTORY = '.codex'\nconst CONFIG_FILE = 'config.toml'\n\nfunction resolveConfigPath(ctx: PlatformContext): string {\n return path.join(ctx.home, CONFIG_DIRECTORY, CONFIG_FILE)\n}\n\nconst PROVIDER_ID = 'nexos'\nconst RUN_PROVIDER_ID = 'nexos-run'\n// Display only, but never \"OpenAI\": Codex treats a provider of that name as OpenAI itself.\nconst PROVIDER_NAME = 'nexos.ai'\n\n// Codex drops every root-level -c once the subcommand is given one of its own, the gateway's included.\nconst SESSION_SUBCOMMANDS = ['exec', 'e', 'review', 'resume', 'fork']\n\nfunction providerFields(desired: DesiredConfig): Record<string, string> {\n return { name: PROVIDER_NAME, base_url: desired.openaiBaseUrl, env_key: API_KEY_VARIABLE, wire_api: WIRE_API }\n}\n\n// Codex sends usage metrics to OpenAI whatever the provider, and /feedback uploads its logs there.\nconst PRIVACY_UPDATES: readonly TomlUpdate[] = [\n [['analytics', 'enabled'], false],\n [['feedback', 'enabled'], false],\n]\n\nconst WEB_SEARCH_KEY_PATH = ['web_search'] as const\nconst WEB_SEARCH_DISABLED = 'disabled'\n\n// OpenAI's hosted web search goes out with every turn, and the router may hand a turn to a backend without it.\nfunction listRouterUpdates(desired: DesiredConfig): TomlUpdate[] {\n return desired.model === DEFAULT_MODEL ? [[WEB_SEARCH_KEY_PATH, WEB_SEARCH_DISABLED]] : []\n}\n\nfunction planConfig(desired: DesiredConfig, ctx: PlatformContext): FileContribution {\n const updates: TomlUpdate[] = [\n [['model'], desired.model],\n [['model_provider'], PROVIDER_ID],\n ...Object.entries(providerFields(desired)).map(([field, value]): TomlUpdate => [\n ['model_providers', PROVIDER_ID, field],\n value,\n ]),\n ...PRIVACY_UPDATES,\n ...listRouterUpdates(desired),\n ]\n return {\n kind: 'file',\n path: resolveConfigPath(ctx),\n hasSecret: false,\n edits: (current) => ({\n format: 'toml',\n updates: [...updates, ...listLeftoverRemovals({ desired, current })],\n }),\n }\n}\n\ntype LeftoverRemovalsParams = { desired: DesiredConfig; current: string | null }\n\n// Lifts only the \"disabled\" set up for the router: any other web_search is the user's own choice.\nfunction listLeftoverRemovals({ desired, current }: LeftoverRemovalsParams): TomlUpdate[] {\n if (desired.model === DEFAULT_MODEL) return []\n\n const isRouterLeftover = readPath(parseToml(current ?? ''), WEB_SEARCH_KEY_PATH) === WEB_SEARCH_DISABLED\n return isRouterLeftover ? [[WEB_SEARCH_KEY_PATH, undefined]] : []\n}\n\nfunction inspectConfig(ctx: PlatformContext): HarnessInspection {\n const filePath = resolveConfigPath(ctx)\n const text = readFileIfExists(filePath)\n if (text === null) return { isConfigured: false, model: undefined, isUnreadable: false }\n\n let document: Table\n try {\n document = parseToml(text)\n } catch (error) {\n if (!(error instanceof ConfigFormatError)) throw error\n return { isConfigured: false, model: undefined, isUnreadable: true }\n }\n\n const baseUrl = readString(document, ['model_providers', PROVIDER_ID, 'base_url'])\n return {\n isConfigured:\n readString(document, ['model_provider']) === PROVIDER_ID &&\n isPublicApiUrl(baseUrl, resolvePublicApiHost(ctx.env)),\n model: readString(document, ['model']),\n isUnreadable: false,\n }\n}\n\nfunction readString(document: Table, keyPath: KeyPath): string | undefined {\n const value = readPath(document, keyPath)\n return typeof value === 'string' ? value : undefined\n}\n","import { isDeepStrictEqual } from 'node:util'\nimport { getStaticTOMLValue, ParseError, parseTOML, traverseNodes, type AST } from 'toml-eslint-parser'\nimport { match } from 'ts-pattern'\nimport { ConfigSyntaxError, MergeConflictError, ReservedKeyError } from './config-errors'\nimport { detectLineEnding, type LineEnding } from './detect-line-ending'\nimport { listCreatedParents, listMissingParents, type KeyOriginal } from './key-original'\nimport { deletePath, isEmptyTable, readPath, setPath, splitLeaf, type KeyPath, type Table } from './key-path'\nimport { splitByteOrderMark } from './split-byte-order-mark'\n\n/** A value of undefined removes the key, so a key that would override ours cannot linger. */\nexport type TomlUpdate = readonly [KeyPath, string | boolean | undefined]\n\nexport function parseToml(text: string): Table {\n return readTable(parseProgram(splitByteOrderMark(text).body))\n}\n\nexport function renderToml(current: string | null, updates: readonly TomlUpdate[]): string {\n const { byteOrderMark, body } = splitByteOrderMark(current ?? '')\n const expected = readTable(parseProgram(body))\n for (const [keyPath, value] of updates) {\n if (value === undefined) deletePath(expected, keyPath)\n else setPath(expected, keyPath, value)\n }\n\n const lineEnding = detectLineEnding(body) ?? DEFAULT_LINE_ENDING\n const edited = updates.reduce((text, update) => spliceUpdate({ text, lineEnding }, update), body)\n if (!isDeepStrictEqual(readTable(parseOwnEdit(edited)), expected)) {\n throw new MergeConflictError()\n }\n return byteOrderMark + edited\n}\n\nexport function readTomlOriginals(current: string | null, keyPaths: readonly KeyPath[]): KeyOriginal[] {\n const { body } = splitByteOrderMark(current ?? '')\n const program = parseProgram(body)\n const document = readTable(program)\n const entries = listKeyValues(program)\n return keyPaths.map((keyPath) => ({\n keyPath,\n original: readSource(body, entries, keyPath),\n createdParents: listMissingParents(document, keyPath),\n }))\n}\n\nexport function restoreToml(current: string, originals: readonly KeyOriginal[]): string {\n const { byteOrderMark, body } = splitByteOrderMark(current)\n const createdParents = listCreatedParents(originals)\n const expected = readTable(parseProgram(body))\n for (const key of originals) applyOriginal(expected, key)\n for (const keyPath of createdParents) {\n if (isEmptyTable(readPath(expected, keyPath))) deletePath(expected, keyPath)\n }\n\n const lineEnding = detectLineEnding(body) ?? DEFAULT_LINE_ENDING\n const restored = originals.reduce((text, key) => restoreKey({ text, lineEnding }, key), body)\n const pruned = createdParents.reduce((text, keyPath) => removeEmptyTable({ text, lineEnding }, keyPath), restored)\n if (!isDeepStrictEqual(readTable(parseOwnEdit(pruned)), expected)) {\n throw new MergeConflictError()\n }\n return byteOrderMark + pruned\n}\n\nconst PARSER_OPTIONS = { tomlVersion: '1.1' } as const\n\nfunction parseProgram(text: string): AST.TOMLProgram {\n try {\n return parseTOML(text, PARSER_OPTIONS)\n } catch (error) {\n if (!(error instanceof ParseError)) throw error\n throw new ConfigSyntaxError({\n line: error.lineNumber,\n column: error.column + 1,\n reason: error.message,\n })\n }\n}\n\nfunction readTable(program: AST.TOMLProgram): Table {\n assertNoPrototypeKey(program)\n return getStaticTOMLValue(program)\n}\n\n// getStaticTOMLValue assigns keys plainly, so a `__proto__` key would write onto Object.prototype.\nconst PROTOTYPE_KEY = '__proto__'\n\nfunction assertNoPrototypeKey(program: AST.TOMLProgram): void {\n traverseNodes(program, {\n enterNode(node) {\n if (node.type !== 'TOMLKey') return\n\n const keys = node.keys.map(readKeyName)\n const index = keys.indexOf(PROTOTYPE_KEY)\n if (index !== -1) {\n throw new ReservedKeyError({\n keyPath: keys.slice(0, index + 1),\n key: PROTOTYPE_KEY,\n })\n }\n },\n leaveNode() {},\n })\n}\n\nfunction readKeyName(key: AST.TOMLBare | AST.TOMLQuoted): string {\n return key.type === 'TOMLBare' ? key.name : key.value\n}\n\nconst DEFAULT_LINE_ENDING: LineEnding = '\\n'\n\ntype TomlSource = { text: string; lineEnding: LineEnding }\n\nfunction spliceUpdate(source: TomlSource, [keyPath, value]: TomlUpdate): string {\n const program = parseOwnEdit(source.text)\n const entries = listKeyValues(program)\n const current = entries.find((entry) => isSamePath(entry.path, keyPath))\n if (value === undefined) return current === undefined ? source.text : removeKeyValue(source, program, current)\n if (current !== undefined) return replaceValue(source, current.keyValue.value, value)\n\n return insertKeyValue({ source, program, entries, keyPath, valueText: formatValue(value) })\n}\n\ntype InsertKeyValueParams = {\n source: TomlSource\n program: AST.TOMLProgram\n entries: readonly KeyValueEntry[]\n keyPath: KeyPath\n valueText: string\n}\n\nfunction insertKeyValue({ source, program, entries, keyPath, valueText }: InsertKeyValueParams): string {\n const { parents, leaf } = splitLeaf(keyPath)\n const keyValueText = formatKeyValue([leaf], valueText)\n\n return match(findPlacement(program, entries, parents))\n .with({ kind: 'top-level' }, () => insertTopLevel(source, program, keyValueText))\n .with({ kind: 'table' }, ({ table }) => insertLineAfter(source, table.range[1], keyValueText))\n .with({ kind: 'dotted' }, ({ entry }) => {\n const keys = [...parents.slice(entry.tablePath.length), leaf]\n return insertBesideDottedKey(source, entry, formatKeyValue(keys, valueText))\n })\n .with({ kind: 'inline' }, ({ inlineTable, keysInside }) =>\n insertIntoInlineTable(source, inlineTable, nestInInlineTables(keysInside, keyValueText)),\n )\n .with({ kind: 'new-table' }, () => appendTable(source, parents, keyValueText))\n .exhaustive()\n}\n\nfunction parseOwnEdit(text: string): AST.TOMLProgram {\n try {\n return parseProgram(text)\n } catch (error) {\n if (error instanceof ConfigSyntaxError) throw new MergeConflictError()\n throw error\n }\n}\n\ntype TomlPath = readonly (string | number)[]\n\ntype KeyValueEntry = {\n path: TomlPath\n keyValue: AST.TOMLKeyValue\n tablePath: TomlPath\n}\n\nfunction listKeyValues(program: AST.TOMLProgram): KeyValueEntry[] {\n return program.body[0].body.flatMap((node) => {\n if (node.type === 'TOMLTable') {\n return listInBody(node.body, node.resolvedKey)\n }\n return listInBody([node], [])\n })\n}\n\nfunction listInBody(keyValues: readonly AST.TOMLKeyValue[], tablePath: TomlPath): KeyValueEntry[] {\n return keyValues.flatMap((keyValue) => {\n const path = [...tablePath, ...keyValue.key.keys.map(readKeyName)]\n const entry = { path, keyValue, tablePath }\n if (keyValue.value.type !== 'TOMLInlineTable') return [entry]\n return [entry, ...listInBody(keyValue.value.body, path)]\n })\n}\n\nfunction isSamePath(path: TomlPath, other: TomlPath): boolean {\n return path.length === other.length && path.every((key, index) => key === other[index])\n}\n\nfunction replaceValue(source: TomlSource, node: AST.TOMLContentNode, value: string | boolean): string {\n if (node.type === 'TOMLValue' && node.value === value) return source.text\n return replaceRange(source, node.range, formatValue(value))\n}\n\ntype Placement =\n | { kind: 'top-level' }\n | { kind: 'table'; table: AST.TOMLTable }\n | { kind: 'dotted'; entry: KeyValueEntry }\n | {\n kind: 'inline'\n inlineTable: AST.TOMLInlineTable\n keysInside: readonly string[]\n }\n | { kind: 'new-table' }\n\nfunction findPlacement(\n program: AST.TOMLProgram,\n entries: readonly KeyValueEntry[],\n tablePath: readonly string[],\n): Placement {\n if (tablePath.length === 0) return { kind: 'top-level' }\n\n const table = findStandardTable(program, tablePath)\n if (table !== undefined) return { kind: 'table', table }\n\n const dotted = entries.findLast((entry) => isDottedKeyUnder(entry, tablePath))\n if (dotted !== undefined) return { kind: 'dotted', entry: dotted }\n\n for (let length = tablePath.length; length > 0; length--) {\n const prefix = tablePath.slice(0, length)\n const value = entries.find((entry) => isSamePath(entry.path, prefix))?.keyValue.value\n if (value?.type === 'TOMLInlineTable') {\n return {\n kind: 'inline',\n inlineTable: value,\n keysInside: tablePath.slice(length),\n }\n }\n }\n\n return { kind: 'new-table' }\n}\n\nfunction findStandardTable(program: AST.TOMLProgram, tablePath: TomlPath): AST.TOMLTable | undefined {\n return program.body[0].body\n .filter((node) => node.type === 'TOMLTable')\n .find((candidate) => candidate.kind === 'standard' && isSamePath(candidate.resolvedKey, tablePath))\n}\n\nfunction isDottedKeyUnder(entry: KeyValueEntry, tablePath: readonly string[]): boolean {\n return (\n entry.tablePath.length < tablePath.length &&\n entry.path.length > tablePath.length &&\n isSamePath(entry.path.slice(0, tablePath.length), tablePath)\n )\n}\n\nfunction insertTopLevel(source: TomlSource, program: AST.TOMLProgram, keyValueText: string): string {\n const nodes = program.body[0].body\n const lastKeyValue = nodes.findLast((node) => node.type === 'TOMLKeyValue')\n if (lastKeyValue !== undefined) {\n return insertLineAfter(source, lastKeyValue.range[1], keyValueText)\n }\n\n const firstTable = nodes.find((node) => node.type === 'TOMLTable')\n if (firstTable === undefined) return appendLine(source, keyValueText)\n\n const lineStart = source.text.lastIndexOf('\\n', firstTable.range[0] - 1) + 1\n return replaceRange(source, [lineStart, lineStart], keyValueText + source.lineEnding + source.lineEnding)\n}\n\nfunction insertLineAfter(source: TomlSource, offset: number, line: string): string {\n const lineEnd = findLineEnd(source.text, offset)\n return replaceRange(source, [lineEnd, lineEnd], source.lineEnding + line)\n}\n\nfunction findLineEnd(text: string, offset: number): number {\n const newline = text.indexOf('\\n', offset)\n if (newline === -1) return text.length\n return text[newline - 1] === '\\r' ? newline - 1 : newline\n}\n\nfunction appendLine(source: TomlSource, line: string): string {\n const { text, lineEnding } = source\n const separator = text === '' || text.endsWith('\\n') ? '' : lineEnding\n return text + separator + line + lineEnding\n}\n\nfunction insertBesideDottedKey(source: TomlSource, entry: KeyValueEntry, keyValueText: string): string {\n const offset = entry.keyValue.range[1]\n if (entry.keyValue.parent.type !== 'TOMLInlineTable') {\n return insertLineAfter(source, offset, keyValueText)\n }\n return replaceRange(source, [offset, offset], `, ${keyValueText}`)\n}\n\nfunction insertIntoInlineTable(source: TomlSource, inlineTable: AST.TOMLInlineTable, keyValueText: string): string {\n const lastKeyValue = inlineTable.body.at(-1)\n if (lastKeyValue === undefined) {\n return replaceRange(source, inlineTable.range, `{ ${keyValueText} }`)\n }\n\n const offset = lastKeyValue.range[1]\n return replaceRange(source, [offset, offset], `, ${keyValueText}`)\n}\n\nfunction nestInInlineTables(tableKeys: readonly string[], keyValueText: string): string {\n return tableKeys.reduceRight((inner, key) => `${formatKey(key)} = { ${inner} }`, keyValueText)\n}\n\nfunction appendTable(source: TomlSource, tablePath: readonly string[], keyValueText: string): string {\n const { text, lineEnding } = source\n const header = `[${tablePath.map(formatKey).join('.')}]`\n return text + findSeparatorBeforeTable(source) + header + lineEnding + keyValueText + lineEnding\n}\n\nfunction findSeparatorBeforeTable({ text, lineEnding }: TomlSource): string {\n if (text.trim() === '') return ''\n if (text.endsWith('\\n')) return lineEnding\n return lineEnding + lineEnding\n}\n\nfunction replaceRange({ text }: TomlSource, [start, end]: AST.Range, replacement: string): string {\n return text.slice(0, start) + replacement + text.slice(end)\n}\n\nfunction formatKeyValue(keys: readonly string[], valueText: string): string {\n return `${keys.map(formatKey).join('.')} = ${valueText}`\n}\n\nconst BARE_KEY = /^[A-Za-z0-9_-]+$/\n\nfunction formatKey(key: string): string {\n return BARE_KEY.test(key) ? key : formatString(key)\n}\n\nfunction formatValue(value: string | boolean): string {\n return typeof value === 'boolean' ? String(value) : formatString(value)\n}\n\n// JSON's escapes are valid in a TOML basic string, but TOML also requires DEL (U+007F) escaped.\nconst DELETE_CHARACTER = /\\u007f/g\n\nfunction formatString(value: string): string {\n return JSON.stringify(value).replace(DELETE_CHARACTER, '\\\\u007f')\n}\n\nfunction readSource(text: string, entries: readonly KeyValueEntry[], keyPath: KeyPath): string | null {\n const entry = entries.find((candidate) => isSamePath(candidate.path, keyPath))\n if (entry === undefined) return null\n\n const [start, end] = entry.keyValue.value.range\n return text.slice(start, end)\n}\n\nfunction applyOriginal(expected: Table, { keyPath, original }: KeyOriginal): void {\n if (original === null) {\n deletePath(expected, keyPath)\n return\n }\n\n setPath(expected, keyPath, parseTomlValue(original))\n}\n\nconst VALUE_KEY = 'value'\n\nexport function parseTomlValue(source: string): unknown {\n return readTable(parseProgram(`${VALUE_KEY} = ${source}`))[VALUE_KEY]\n}\n\nfunction restoreKey(source: TomlSource, { keyPath, original }: KeyOriginal): string {\n const program = parseOwnEdit(source.text)\n const entries = listKeyValues(program)\n const current = entries.find((entry) => isSamePath(entry.path, keyPath))\n if (original === null) return current === undefined ? source.text : removeKeyValue(source, program, current)\n if (current !== undefined) return replaceRange(source, current.keyValue.value.range, original)\n\n return insertKeyValue({ source, program, entries, keyPath, valueText: original })\n}\n\nfunction removeEmptyTable(source: TomlSource, keyPath: KeyPath): string {\n const program = parseOwnEdit(source.text)\n if (!isEmptyTable(readPath(readTable(program), keyPath))) return source.text\n\n const entry = listKeyValues(program).find((candidate) => isSamePath(candidate.path, keyPath))\n if (entry !== undefined) return removeKeyValue(source, program, entry)\n\n const table = findStandardTable(program, keyPath)\n return table === undefined ? source.text : removeTableHeader(source, table)\n}\n\nfunction removeKeyValue(source: TomlSource, program: AST.TOMLProgram, { keyValue }: KeyValueEntry): string {\n if (keyValue.parent.type === 'TOMLInlineTable') return removeFromInlineTable(source, keyValue.parent, keyValue)\n\n const isLastTopLevel = keyValue.parent.type === 'TOMLTopLevelTable' && countTopLevelKeyValues(program) === 1\n const removed = removeLine(source, keyValue.range)\n if (!isLastTopLevel) return removed.text\n\n return removeLineBreakAt(removed.text, removed.offset)\n}\n\nconst EMPTY_INLINE_TABLE = '{}'\n\nfunction removeFromInlineTable(\n source: TomlSource,\n inlineTable: AST.TOMLInlineTable,\n keyValue: AST.TOMLKeyValue,\n): string {\n const index = inlineTable.body.indexOf(keyValue)\n const previous = inlineTable.body[index - 1]\n if (previous !== undefined) return replaceRange(source, [previous.range[1], keyValue.range[1]], '')\n\n const next = inlineTable.body[index + 1]\n if (next !== undefined) return replaceRange(source, [keyValue.range[0], next.range[0]], '')\n\n return replaceRange(source, inlineTable.range, EMPTY_INLINE_TABLE)\n}\n\nfunction countTopLevelKeyValues(program: AST.TOMLProgram): number {\n return program.body[0].body.filter((node) => node.type === 'TOMLKeyValue').length\n}\n\n// Also drops the blank line appendTable put before the section, so the sections around it keep one between them.\nfunction removeTableHeader(source: TomlSource, table: AST.TOMLTable): string {\n const { text, offset } = removeLine(source, [table.range[0], table.key.range[1]])\n const isFollowedByBlank = offset === text.length || measureLineBreakAt(text, offset) > 0\n if (!isFollowedByBlank) return text\n if (offset === 0) return removeLineBreakAt(text, offset)\n if (!isBlankLineBefore(text, offset)) return text\n\n return text.slice(0, offset - measureLineBreakBefore(text, offset)) + text.slice(offset)\n}\n\ntype RemovedLine = { text: string; offset: number }\n\nfunction removeLine({ text }: TomlSource, [start, end]: AST.Range): RemovedLine {\n const lineStart = text.lastIndexOf('\\n', start - 1) + 1\n const lineEnd = findLineEnd(text, end)\n const lineBreakLength = measureLineBreakAt(text, lineEnd)\n if (lineBreakLength > 0 || lineStart === 0) {\n return { text: text.slice(0, lineStart) + text.slice(lineEnd + lineBreakLength), offset: lineStart }\n }\n\n const offset = lineStart - measureLineBreakBefore(text, lineStart)\n return { text: text.slice(0, offset) + text.slice(lineEnd), offset }\n}\n\nfunction removeLineBreakAt(text: string, offset: number): string {\n return text.slice(0, offset) + text.slice(offset + measureLineBreakAt(text, offset))\n}\n\nconst CRLF = '\\r\\n'\nconst LF = '\\n'\n\nfunction measureLineBreakAt(text: string, offset: number): number {\n if (text.startsWith(CRLF, offset)) return CRLF.length\n if (text.startsWith(LF, offset)) return LF.length\n return 0\n}\n\nfunction measureLineBreakBefore(text: string, offset: number): number {\n if (text.slice(0, offset).endsWith(CRLF)) return CRLF.length\n if (text.slice(0, offset).endsWith(LF)) return LF.length\n return 0\n}\n\nfunction isBlankLineBefore(text: string, offset: number): boolean {\n const lineBreakLength = measureLineBreakBefore(text, offset)\n if (lineBreakLength === 0) return false\n\n const lineStart = offset - lineBreakLength\n return lineStart === 0 || text[lineStart - 1] === LF\n}\n","import type { DesiredConfig } from '../../product/public-api/desired-config'\nimport { findContextWindow } from '../../product/public-api/models/predefined-models'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { DetectResult, LaunchingHarness } from '../harness'\n\nconst BINARY = 'copilot'\nconst TYPE_VARIABLE = 'COPILOT_PROVIDER_TYPE'\nconst BASE_URL_VARIABLE = 'COPILOT_PROVIDER_BASE_URL'\nconst API_KEY_VARIABLE = 'COPILOT_PROVIDER_API_KEY'\n// A custom provider has no default model: without one, Copilot CLI refuses to run.\nconst MODEL_VARIABLE = 'COPILOT_MODEL'\n// Copilot CLI assumes 128K for a model it does not know, and applies this to every model the provider serves.\nconst MAX_PROMPT_TOKENS_VARIABLE = 'COPILOT_PROVIDER_MAX_PROMPT_TOKENS'\n// The provider variables Copilot CLI reads that this run leaves unset: inherited from the shell, each would swap\n// the key, the endpoint or the request shape, and in offline mode the GHES pair replaces the provider outright.\nconst OTHER_PROVIDER_VARIABLES = [\n 'COPILOT_PROVIDER_API_KEY_COMMAND',\n 'COPILOT_PROVIDER_BEARER_TOKEN',\n 'COPILOT_PROVIDER_WIRE_API',\n 'COPILOT_PROVIDER_TRANSPORT',\n 'COPILOT_PROVIDER_AZURE_API_VERSION',\n 'COPILOT_PROVIDER_HEADERS',\n 'COPILOT_PROVIDER_MODEL_ID',\n 'COPILOT_PROVIDER_WIRE_MODEL',\n 'COPILOT_PROVIDER_MAX_OUTPUT_TOKENS',\n 'COPILOT_PROVIDER_GHES_HOST',\n 'COPILOT_PROVIDER_GHES_TOKEN',\n]\nconst PROVIDER_TYPE = 'openai'\n\nexport const copilotCli: LaunchingHarness = {\n kind: 'configurable',\n id: 'copilot-cli',\n label: 'GitHub Copilot CLI',\n binary: BINARY,\n installPackage: '@github/copilot',\n protocols: ['openai-chat'],\n projectSupport: {\n kind: 'unsupported',\n reason: 'it reads COPILOT_PROVIDER_* from the environment, which nothing project-local sets',\n },\n keyEnvVariable: API_KEY_VARIABLE,\n modelEnvVariable: MODEL_VARIABLE,\n detect: (ctx) => detectBinary(ctx),\n plan: (desired) => [{ kind: 'env', variables: providerEnv(desired) }],\n launch: (desired) => ({\n binary: BINARY,\n arguments: [],\n env: { ...providerEnv(desired), ...Object.fromEntries(OTHER_PROVIDER_VARIABLES.map((name) => [name, undefined])) },\n }),\n launchNotes: ['This session is kept in your Copilot CLI history like any other.'],\n postSetupNotes: [\n 'GitHub Copilot CLI starts on the model chosen here; for another, start it with `copilot --model <id>` or run setup again.',\n 'Run `copilot help providers` to see which variables your version supports, in case these names have drifted.',\n ],\n}\n\nfunction providerEnv(desired: DesiredConfig): Record<string, string | undefined> {\n const contextTokens = findContextWindow(desired.model)\n return {\n [TYPE_VARIABLE]: PROVIDER_TYPE,\n [BASE_URL_VARIABLE]: desired.openaiBaseUrl,\n [API_KEY_VARIABLE]: desired.apiKey,\n [MODEL_VARIABLE]: desired.model,\n [MAX_PROMPT_TOKENS_VARIABLE]: contextTokens === undefined ? undefined : String(contextTokens),\n }\n}\n\nfunction detectBinary(ctx: PlatformContext): DetectResult {\n const isFound = ctx.hasBinary(BINARY)\n return { isFound, detail: isFound ? `${BINARY} found on PATH` : `${BINARY} not found on PATH` }\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport * as v from 'valibot'\nimport { resolvePublicApiHost, type DesiredConfig } from '../../product/public-api/desired-config'\nimport { findContextWindow } from '../../product/public-api/models/predefined-models'\nimport { renderJsonc } from '../../shared/file-formats/json/jsonc'\nimport type { KeyPathUpdates } from '../../shared/file-formats/key-path'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { readLiteralKey } from '../../shared/text/read-literal-key'\nimport { detectConfigFile } from '../config/detect-config-file'\nimport { isPublicApiUrl } from '../config/is-public-api-url'\nimport { readJsoncFile } from '../config/read-jsonc-file'\nimport type { DetectResult, FileContribution, HarnessInspection, LaunchingHarness } from '../harness'\nimport { LAUNCH_DIRECTORY_PLACEHOLDER } from '../launch/launch-recipe'\n\nconst BINARY = 'crush'\nconst PROVIDER_ID = 'nexos'\nconst PROVIDER_NAME = 'nexos.ai'\n// \"openai\" means OpenAI itself to Crush, so a custom endpoint is \"openai-compat\".\nconst PROVIDER_TYPE = 'openai-compat'\nexport const CONFIG_SCHEMA_URL = 'https://charm.land/crush.json'\nconst GLOBAL_CONFIG_VARIABLE = 'CRUSH_GLOBAL_CONFIG'\n\nexport const crush: LaunchingHarness = {\n kind: 'configurable',\n id: 'crush',\n label: 'Crush',\n binary: BINARY,\n installPackage: '@charmland/crush',\n protocols: ['openai-chat'],\n projectSupport: { kind: 'supported' },\n detect: (ctx) => detectCrush(ctx),\n configPath: (ctx) => resolveConfigPath(ctx),\n plan: (desired, ctx) => [planConfig(desired, ctx)],\n inspect: (ctx) => inspectConfig(ctx),\n launch: (desired) => ({\n binary: BINARY,\n arguments: [],\n env: { [GLOBAL_CONFIG_VARIABLE]: LAUNCH_DIRECTORY_PLACEHOLDER },\n files: [{ name: USER_FILE, content: renderJsonc(null, listUpdates(desired)) }],\n }),\n launchNotes: [\n 'Crush reads crush.json from a temporary config directory for this run; your own Crush config is untouched.',\n 'This session is kept in your Crush history like any other.',\n ],\n readKey: (ctx) => readProviderKey(ctx),\n readSecrets: (ctx) => readProviderSecrets(ctx),\n postSetupNotes: [\n 'Crush starts on the model setup chose. For another, run its `model large` command.',\n \"Crush ranks its config, highest first: the project's crushrc, the project's .crush.json or crush.json, \" +\n \"the user's crushrc, then the user's crush.json. A higher one that sets the same values overrides this file.\",\n ],\n}\n\n// At project scope only a project config counts: an installed binary alone is not a project setup.\nfunction detectCrush(ctx: PlatformContext): DetectResult {\n const detected = detectConfigFile([resolveConfigPath(ctx)], ctx.home)\n if (detected.isFound || ctx.scope === 'project' || !ctx.hasBinary(BINARY)) return detected\n\n return { isFound: true, detail: `${BINARY} found on PATH` }\n}\n\nconst USER_DIRECTORY = path.join('.config', 'crush')\nconst USER_FILE = 'crush.json'\nconst PROJECT_FILE = '.crush.json'\n\nfunction resolveConfigPath(ctx: PlatformContext): string {\n return match(ctx.scope)\n .with('user', () => path.join(ctx.home, USER_DIRECTORY, USER_FILE))\n .with('project', () => path.join(ctx.cwd, PROJECT_FILE))\n .exhaustive()\n}\n\nfunction planConfig(desired: DesiredConfig, ctx: PlatformContext): FileContribution {\n return {\n kind: 'file',\n path: resolveConfigPath(ctx),\n hasSecret: true,\n edits: () => ({ format: 'jsonc', updates: listUpdates(desired) }),\n }\n}\n\nfunction listUpdates(desired: DesiredConfig): KeyPathUpdates {\n const contextWindow = findContextWindow(desired.model)\n const modelEntry = {\n id: desired.model,\n name: desired.model,\n ...(contextWindow === undefined ? {} : { context_window: contextWindow }),\n }\n // Registering a provider does not switch Crush to it: the model slots name what a turn uses.\n const selection = { provider: PROVIDER_ID, model: desired.model }\n return [\n [['$schema'], CONFIG_SCHEMA_URL],\n [['providers', PROVIDER_ID, 'type'], PROVIDER_TYPE],\n [['providers', PROVIDER_ID, 'name'], PROVIDER_NAME],\n [['providers', PROVIDER_ID, 'base_url'], desired.openaiBaseUrl],\n [['providers', PROVIDER_ID, 'api_key'], desired.apiKey],\n [['providers', PROVIDER_ID, 'models'], [modelEntry]],\n [['models', 'large'], selection],\n [['models', 'small'], selection],\n ]\n}\n\nconst ConfigSchema = v.looseObject({\n providers: v.optional(\n v.looseObject({\n [PROVIDER_ID]: v.optional(v.looseObject({ api_key: v.optional(v.string()), base_url: v.optional(v.string()) })),\n }),\n ),\n models: v.optional(v.looseObject({ large: v.optional(v.looseObject({ model: v.optional(v.string()) })) })),\n})\n\nfunction inspectConfig(ctx: PlatformContext): HarnessInspection {\n const config = readJsoncFile(resolveConfigPath(ctx), ConfigSchema)\n if (config.kind === 'absent') return { isConfigured: false, model: undefined, isUnreadable: false }\n if (config.kind === 'invalid') return { isConfigured: false, model: undefined, isUnreadable: true }\n\n const provider = config.value.providers?.[PROVIDER_ID]\n return {\n isConfigured: isPublicApiUrl(provider?.base_url, resolvePublicApiHost(ctx.env)),\n model: config.value.models?.large?.model,\n isUnreadable: false,\n }\n}\n\nfunction readProviderKey(ctx: PlatformContext): string | undefined {\n const config = readJsoncFile(resolveConfigPath(ctx), ConfigSchema)\n const apiKey = config.kind === 'valid' ? config.value.providers?.[PROVIDER_ID]?.api_key : undefined\n return readLiteralKey(apiKey)\n}\n\nconst ProvidersSchema = v.looseObject({ providers: v.optional(v.record(v.string(), v.unknown())) })\nconst ProviderKeySchema = v.looseObject({ api_key: v.string() })\n\nfunction readProviderSecrets(ctx: PlatformContext): string[] {\n const config = readJsoncFile(resolveConfigPath(ctx), ProvidersSchema)\n if (config.kind !== 'valid') return []\n\n return Object.values(config.value.providers ?? {}).flatMap((provider) => {\n const parsed = v.safeParse(ProviderKeySchema, provider)\n return parsed.success ? (readLiteralKey(parsed.output.api_key) ?? []) : []\n })\n}\n","import { readNonBlank } from './read-non-blank'\n\nconst COMMAND_PREFIX = '!'\nconst VARIABLE_MARKER = '$'\n\n/**\n * Reads a config value that holds a literal secret, or undefined when it holds nothing or a reference the agent\n * resolves at run time (a `$VAR`/`${VAR}` interpolation, or a leading `!command`). A reference must never be read\n * back as the key: offered as an existing key, it would be written into other agents' configs verbatim.\n */\nexport function readLiteralKey(value: string | undefined): string | undefined {\n const key = readNonBlank(value)\n return key === undefined || isConfigSubstitution(key) ? undefined : key\n}\n\nfunction isConfigSubstitution(value: string): boolean {\n return value.startsWith(COMMAND_PREFIX) || value.includes(VARIABLE_MARKER)\n}\n","export type LaunchFile = { name: string; content: string; placeholder?: string }\n\n/**\n * In `arguments` or an `env` value, replaced with the private temporary directory the files are written\n * to. An agent that reads a whole directory — Pi's agent directory, Crush's config directory — needs the\n * directory itself, not the path of one file in it.\n */\nexport const LAUNCH_DIRECTORY_PLACEHOLDER = '{launchDirectory}'\n\nexport interface LaunchRecipe {\n binary: string\n arguments: string[]\n /** Merged over the parent environment; `undefined` deletes an inherited variable. */\n env: Record<string, string | undefined>\n /** Written 0600 in a private temporary directory; a token in `arguments` or `env` becomes its path. */\n files?: readonly LaunchFile[]\n /** Subcommands that read options of their own: a passthrough starting with one gets `arguments` right after it. */\n subcommands?: readonly string[]\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport * as v from 'valibot'\nimport { resolvePublicApiHost, type DesiredConfig } from '../../product/public-api/desired-config'\nimport { findContextWindow } from '../../product/public-api/models/predefined-models'\nimport { renderJsonc } from '../../shared/file-formats/json/jsonc'\nimport type { KeyPathUpdate, KeyPathUpdates } from '../../shared/file-formats/key-path'\nimport { findFirstExistingFile } from '../../shared/file-system/find-first-existing-file'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { readNonBlank } from '../../shared/text/read-non-blank'\nimport { detectConfigOrBinary } from '../config/detect-config-or-binary'\nimport { isPublicApiUrl } from '../config/is-public-api-url'\nimport { parseJsoncConfig, readJsoncFile, type JsoncConfig } from '../config/read-jsonc-file'\nimport type { FileContribution, HarnessInspection, LaunchingHarness } from '../harness'\n\nconst BINARY = 'opencode'\n\nexport const opencode: LaunchingHarness = {\n kind: 'configurable',\n id: 'opencode',\n label: 'OpenCode',\n binary: BINARY,\n installPackage: 'opencode-ai',\n protocols: ['openai-chat'],\n projectSupport: { kind: 'supported' },\n detect: (ctx) => detectConfigOrBinary({ candidates: listConfigCandidates(ctx), binary: BINARY, ctx }),\n configPath: (ctx) => resolveConfigPath(ctx),\n plan: (desired, ctx) => planContributions(desired, ctx),\n inspect: (ctx) => inspectConfig(ctx),\n launch: (desired) => {\n // The run provider names its key through the environment, so the key never reaches argv.\n const config = renderJsonc(null, [\n ...providerUpdates({ providerId: RUN_PROVIDER_ID, apiKey: `{env:${RUN_KEY_VARIABLE}}`, desired }),\n // Leaves no other provider to drift to, OpenCode's own free models included, which send prompts outside nexos.ai.\n [['enabled_providers'], [RUN_PROVIDER_ID]],\n ])\n return {\n binary: BINARY,\n arguments: [],\n env: {\n [CONFIG_CONTENT_VARIABLE]: config,\n [RUN_KEY_VARIABLE]: desired.apiKey,\n [MODELS_FETCH_SWITCH]: SWITCH_ON,\n },\n }\n },\n launchNotes: [\n 'OpenCode adds the \"nexos-run\" model to its recent models, where it shows as unavailable in later sessions.',\n ],\n readKey: (ctx) => readProviderKey(ctx),\n readSecrets: (ctx) => readProviderSecrets(ctx),\n postSetupNotes: [\n 'The key is saved in auth.json, where /connect would save it, so no /connect step is needed. ' +\n \"A project-level setup puts it in the project's opencode.json instead: OpenCode has no project-level auth.json.\",\n ],\n}\n\nconst USER_CONFIG_DIRECTORY = path.join('.config', 'opencode')\nconst JSON_CONFIG_FILE = 'opencode.json'\nconst JSONC_CONFIG_FILE = 'opencode.jsonc'\n\nfunction listConfigCandidates(ctx: PlatformContext): readonly [string, string] {\n const directory = match(ctx.scope)\n .with('user', () => path.join(ctx.home, USER_CONFIG_DIRECTORY))\n .with('project', () => ctx.cwd)\n .exhaustive()\n return [path.join(directory, JSON_CONFIG_FILE), path.join(directory, JSONC_CONFIG_FILE)]\n}\n\nfunction resolveConfigPath(ctx: PlatformContext): string {\n const candidates = listConfigCandidates(ctx)\n return findFirstExistingFile(candidates) ?? candidates[0]\n}\n\nfunction planContributions(desired: DesiredConfig, ctx: PlatformContext): FileContribution[] {\n return match(ctx.scope)\n .with('user', () => [planConfig({ desired, ctx, inlineKey: undefined }), planAuth(desired, ctx)])\n .with('project', () => [planConfig({ desired, ctx, inlineKey: desired.apiKey })])\n .exhaustive()\n}\n\n// An inline key outranks auth.json, so a user-scope config drops the one an earlier setup wrote there.\ntype PlanConfigParams = { desired: DesiredConfig; ctx: PlatformContext; inlineKey: string | undefined }\n\nfunction planConfig({ desired, ctx, inlineKey }: PlanConfigParams): FileContribution {\n return {\n kind: 'file',\n path: resolveConfigPath(ctx),\n hasSecret: inlineKey !== undefined,\n edits: (current) => ({\n format: 'jsonc',\n updates: listUpdates({ desired, inlineKey, config: parseJsoncConfig(current, ConfigSchema) }),\n }),\n }\n}\n\nconst DATA_DIRECTORY_VARIABLE = 'XDG_DATA_HOME'\nconst DEFAULT_DATA_DIRECTORY = path.join('.local', 'share')\nconst AUTH_DIRECTORY = 'opencode'\nconst AUTH_FILE = 'auth.json'\nconst PROVIDER_ID = 'nexos'\nconst AUTH_TYPE = 'api'\n\n// OpenCode takes its data directory from XDG_DATA_HOME on every platform, Windows included.\nfunction resolveAuthPath(ctx: PlatformContext): string {\n const configured = readNonBlank(ctx.env[DATA_DIRECTORY_VARIABLE])\n const dataDirectory =\n configured === undefined ? path.join(ctx.home, DEFAULT_DATA_DIRECTORY) : path.resolve(ctx.cwd, configured)\n return path.join(dataDirectory, AUTH_DIRECTORY, AUTH_FILE)\n}\n\n// OpenCode drops an entry that is not shaped as one of its credential types, so the type goes in with the key.\nfunction planAuth(desired: DesiredConfig, ctx: PlatformContext): FileContribution {\n return {\n kind: 'file',\n path: resolveAuthPath(ctx),\n hasSecret: true,\n edits: () => ({\n format: 'jsonc',\n updates: [\n [[PROVIDER_ID, 'type'], AUTH_TYPE],\n [[PROVIDER_ID, 'key'], desired.apiKey],\n ],\n }),\n }\n}\n\nconst PROVIDER_NAME = 'nexos.ai'\nconst PROVIDER_PACKAGE = '@ai-sdk/openai-compatible'\nconst RUN_PROVIDER_ID = 'nexos-run'\nconst RUN_KEY_VARIABLE = 'NEXOS_API_KEY'\nconst CONFIG_CONTENT_VARIABLE = 'OPENCODE_CONFIG_CONTENT'\n// OpenCode refreshes its catalogue of other providers' models from models.opencode.ai every hour; a run needs none.\nconst MODELS_FETCH_SWITCH = 'OPENCODE_DISABLE_MODELS_FETCH'\nconst SWITCH_ON = '1'\nexport const CONFIG_SCHEMA_URL = 'https://opencode.ai/config.json'\n\ntype ProviderUpdatesParams = { providerId: string; apiKey: string | undefined; desired: DesiredConfig }\n\nfunction providerUpdates({ providerId, apiKey, desired }: ProviderUpdatesParams): KeyPathUpdates {\n return [\n [['provider', providerId, 'npm'], PROVIDER_PACKAGE],\n [['provider', providerId, 'name'], PROVIDER_NAME],\n [['provider', providerId, 'options', 'baseURL'], desired.openaiBaseUrl],\n [['provider', providerId, 'options', 'apiKey'], apiKey],\n [['provider', providerId, 'models', desired.model, 'name'], desired.model],\n ...listLimitUpdates({ providerId, model: desired.model }),\n [['model'], `${providerId}/${desired.model}`],\n ]\n}\n\ntype LimitUpdatesParams = { providerId: string; model: string }\n\n// OpenCode's config takes both limits or neither, and caps output at this anyway.\nconst OUTPUT_TOKENS = 32_000\n\n// With no context limit OpenCode never compacts ahead of time, only once the gateway has refused a prompt.\nfunction listLimitUpdates({ providerId, model }: LimitUpdatesParams): KeyPathUpdate[] {\n const contextTokens = findContextWindow(model)\n if (contextTokens === undefined) return []\n\n return [\n [['provider', providerId, 'models', model, 'limit', 'context'], contextTokens],\n [['provider', providerId, 'models', model, 'limit', 'output'], OUTPUT_TOKENS],\n ]\n}\n\ntype ListUpdatesParams = {\n desired: DesiredConfig\n inlineKey: string | undefined\n config: JsoncConfig<OpenCodeConfig>\n}\n\nfunction listUpdates({ desired, inlineKey, config }: ListUpdatesParams): KeyPathUpdates {\n const updates = providerUpdates({ providerId: PROVIDER_ID, apiKey: inlineKey, desired })\n if (!isMissingSchemaUrl(config)) return updates\n\n return [[['$schema'], CONFIG_SCHEMA_URL], ...updates]\n}\n\nfunction isMissingSchemaUrl(config: JsoncConfig<OpenCodeConfig>): boolean {\n return match(config)\n .with({ kind: 'absent' }, () => true)\n .with({ kind: 'invalid' }, () => false)\n .with({ kind: 'valid' }, ({ value }) => value.$schema === undefined)\n .exhaustive()\n}\n\n// OpenCode prefers an inline key over auth.json, so a setup that predates auth.json still runs with the one it left.\nfunction readProviderKey(ctx: PlatformContext): string | undefined {\n return match(ctx.scope)\n .with('user', () => readInlineKey(ctx) ?? readAuthKey(ctx))\n .with('project', () => readInlineKey(ctx))\n .exhaustive()\n}\n\nfunction readInlineKey(ctx: PlatformContext): string | undefined {\n const config = readJsoncFile(resolveConfigPath(ctx), ConfigSchema)\n const apiKey = config.kind === 'valid' ? config.value.provider?.[PROVIDER_ID]?.options?.apiKey : undefined\n return apiKey === undefined || isSubstitution(apiKey) ? undefined : apiKey\n}\n\nconst SUBSTITUTION_MARKERS = ['{env:', '{file:'] as const\n\nfunction isSubstitution(value: string): boolean {\n return SUBSTITUTION_MARKERS.some((marker) => value.includes(marker))\n}\n\nconst AuthKeySchema = v.looseObject({\n [PROVIDER_ID]: v.fallback(v.optional(v.looseObject({ type: v.literal(AUTH_TYPE), key: v.string() })), undefined),\n})\n\nfunction readAuthKey(ctx: PlatformContext): string | undefined {\n const auth = readJsoncFile(resolveAuthPath(ctx), AuthKeySchema)\n return auth.kind === 'valid' ? readNonBlank(auth.value[PROVIDER_ID]?.key) : undefined\n}\n\nfunction readProviderSecrets(ctx: PlatformContext): string[] {\n const inlineSecrets = readInlineSecrets(ctx)\n return match(ctx.scope)\n .with('user', () => [...inlineSecrets, ...readAuthSecrets(ctx)])\n .with('project', () => inlineSecrets)\n .exhaustive()\n}\n\nconst ProvidersSchema = v.looseObject({\n provider: v.fallback(v.optional(v.record(v.string(), v.unknown())), undefined),\n})\nconst ProviderKeySchema = v.looseObject({ options: v.looseObject({ apiKey: v.string() }) })\n\nfunction readInlineSecrets(ctx: PlatformContext): string[] {\n const config = readJsoncFile(resolveConfigPath(ctx), ProvidersSchema)\n if (config.kind !== 'valid') return []\n\n return Object.values(config.value.provider ?? {}).flatMap((provider) => {\n const parsed = v.safeParse(ProviderKeySchema, provider)\n if (!parsed.success || isSubstitution(parsed.output.options.apiKey)) return []\n return readNonBlank(parsed.output.options.apiKey) ?? []\n })\n}\n\nconst AuthEntriesSchema = v.record(v.string(), v.unknown())\nconst OptionalTextSchema = v.fallback(v.optional(v.string()), undefined)\n// The fields that hold a credential across OpenCode's api, oauth and wellknown entries; the diff shows the lines\n// around ours, which can belong to another provider.\nconst AuthCredentialsSchema = v.looseObject({\n key: OptionalTextSchema,\n access: OptionalTextSchema,\n refresh: OptionalTextSchema,\n token: OptionalTextSchema,\n})\n\nfunction readAuthSecrets(ctx: PlatformContext): string[] {\n const auth = readJsoncFile(resolveAuthPath(ctx), AuthEntriesSchema)\n if (auth.kind !== 'valid') return []\n\n return Object.values(auth.value).flatMap((entry) => {\n const parsed = v.safeParse(AuthCredentialsSchema, entry)\n if (!parsed.success) return []\n\n const { key, access, refresh, token } = parsed.output\n return [key, access, refresh, token].flatMap((value) => readNonBlank(value) ?? [])\n })\n}\n\nconst ConfigSchema = v.looseObject({\n $schema: v.optional(v.unknown()),\n model: v.optional(v.string()),\n provider: v.optional(\n v.looseObject({\n [PROVIDER_ID]: v.optional(\n v.looseObject({\n options: v.optional(v.looseObject({ apiKey: v.optional(v.string()), baseURL: v.optional(v.string()) })),\n }),\n ),\n }),\n ),\n})\n\ntype OpenCodeConfig = v.InferOutput<typeof ConfigSchema>\n\nfunction inspectConfig(ctx: PlatformContext): HarnessInspection {\n const config = readJsoncFile(resolveConfigPath(ctx), ConfigSchema)\n if (config.kind === 'absent') return { isConfigured: false, model: undefined, isUnreadable: false }\n if (config.kind === 'invalid') return { isConfigured: false, model: undefined, isUnreadable: true }\n\n const options = config.value.provider?.[PROVIDER_ID]?.options\n return {\n isConfigured: isPublicApiUrl(options?.baseURL, resolvePublicApiHost(ctx.env)),\n model: readOpenCodeModel(config.value.model),\n isUnreadable: false,\n }\n}\n\nfunction readOpenCodeModel(model: string | undefined): string | undefined {\n if (model === undefined) return undefined\n\n const separatorIndex = model.indexOf('/')\n return separatorIndex === -1 ? model : model.slice(separatorIndex + 1)\n}\n","import path from 'node:path'\nimport * as v from 'valibot'\nimport { resolvePublicApiHost, type DesiredConfig } from '../../product/public-api/desired-config'\nimport { findContextWindow } from '../../product/public-api/models/predefined-models'\nimport { renderJsonc } from '../../shared/file-formats/json/jsonc'\nimport type { KeyPathUpdates } from '../../shared/file-formats/key-path'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { readLiteralKey } from '../../shared/text/read-literal-key'\nimport { readNonBlank } from '../../shared/text/read-non-blank'\nimport { isPublicApiUrl } from '../config/is-public-api-url'\nimport { readJsoncFile } from '../config/read-jsonc-file'\nimport type { DetectResult, FileContribution, HarnessInspection, LaunchingHarness } from '../harness'\nimport { LAUNCH_DIRECTORY_PLACEHOLDER } from '../launch/launch-recipe'\n\nconst BINARY = 'pi'\nconst PROVIDER_ID = 'nexos'\nconst PROVIDER_NAME = 'nexos.ai'\nconst API_TYPE = 'openai-completions'\nconst AGENT_DIRECTORY_VARIABLE = 'PI_CODING_AGENT_DIR'\nconst SESSION_DIRECTORY_VARIABLE = 'PI_CODING_AGENT_SESSION_DIR'\n\nexport const pi: LaunchingHarness = {\n kind: 'configurable',\n id: 'pi',\n label: 'Pi',\n binary: BINARY,\n installPackage: '@earendil-works/pi-coding-agent',\n protocols: ['openai-chat'],\n projectSupport: {\n kind: 'unsupported',\n reason: 'it reads models.json only from its agent directory (~/.pi/agent), never from the project',\n },\n detect: (ctx) => detectBinary(ctx),\n configPath: (ctx) => resolveModelsPath(ctx),\n plan: (desired, ctx) => [planModels(desired, ctx), planSettings(desired, ctx)],\n inspect: (ctx) => inspectConfig(ctx),\n launch: (desired) => ({\n binary: BINARY,\n arguments: ['--provider', PROVIDER_ID, '--model', desired.model],\n env: {\n [AGENT_DIRECTORY_VARIABLE]: LAUNCH_DIRECTORY_PLACEHOLDER,\n [SESSION_DIRECTORY_VARIABLE]: SESSION_DIRECTORY,\n },\n files: [{ name: MODELS_FILE, content: renderJsonc(null, listModelUpdates(desired)) }],\n }),\n launchNotes: [\n 'Pi reads models.json from a temporary agent directory for this run; your ~/.pi/agent files are untouched.',\n 'This session is kept in your Pi history like any other.',\n ],\n readKey: (ctx) => readProviderKey(ctx),\n readSecrets: (ctx) => readProviderSecrets(ctx),\n postSetupNotes: [\n 'Pi starts on the model setup chose. Change it with /model, and press Ctrl+S to make that the default.',\n ],\n}\n\nfunction detectBinary(ctx: PlatformContext): DetectResult {\n const isFound = ctx.hasBinary(BINARY)\n return { isFound, detail: isFound ? `${BINARY} found on PATH` : `${BINARY} not found on PATH` }\n}\n\nconst DEFAULT_AGENT_DIRECTORY = path.join('.pi', 'agent')\n// Pi stores sessions inside the agent directory, so relocating that directory for the run would delete them with it.\nconst SESSION_DIRECTORY = path.join('~', DEFAULT_AGENT_DIRECTORY, 'sessions')\nconst MODELS_FILE = 'models.json'\nconst SETTINGS_FILE = 'settings.json'\nconst HOME_PREFIX = '~'\n\n// Pi reads its agent directory from PI_CODING_AGENT_DIR when set, so a relocated install is configured where it looks.\nfunction resolveAgentDirectory(ctx: PlatformContext): string {\n const configured = readNonBlank(ctx.env.PI_CODING_AGENT_DIR)\n return configured === undefined\n ? path.join(ctx.home, DEFAULT_AGENT_DIRECTORY)\n : resolveConfiguredPath(configured, ctx)\n}\n\n// Pi expands a leading ~ and resolves anything relative against the working directory, so we match that.\nfunction resolveConfiguredPath(configured: string, ctx: PlatformContext): string {\n if (configured === HOME_PREFIX) return ctx.home\n if (configured.startsWith(`${HOME_PREFIX}${path.sep}`)) {\n return path.join(ctx.home, configured.slice(HOME_PREFIX.length + 1))\n }\n\n return path.resolve(ctx.cwd, configured)\n}\n\nfunction resolveModelsPath(ctx: PlatformContext): string {\n return path.join(resolveAgentDirectory(ctx), MODELS_FILE)\n}\n\nfunction resolveSettingsPath(ctx: PlatformContext): string {\n return path.join(resolveAgentDirectory(ctx), SETTINGS_FILE)\n}\n\nfunction planModels(desired: DesiredConfig, ctx: PlatformContext): FileContribution {\n return {\n kind: 'file',\n path: resolveModelsPath(ctx),\n hasSecret: true,\n edits: () => ({ format: 'jsonc', updates: listModelUpdates(desired) }),\n }\n}\n\n// Registering a provider does not switch Pi to it: settings.json names the startup provider and model.\nfunction planSettings(desired: DesiredConfig, ctx: PlatformContext): FileContribution {\n return {\n kind: 'file',\n path: resolveSettingsPath(ctx),\n hasSecret: false,\n edits: () => ({\n format: 'jsonc',\n updates: [\n [['defaultProvider'], PROVIDER_ID],\n [['defaultModel'], desired.model],\n ],\n }),\n }\n}\n\nfunction listModelUpdates(desired: DesiredConfig): KeyPathUpdates {\n const contextWindow = findContextWindow(desired.model)\n const modelEntry = {\n id: desired.model,\n name: desired.model,\n ...(contextWindow === undefined ? {} : { contextWindow }),\n }\n return [\n [['providers', PROVIDER_ID, 'baseUrl'], desired.openaiBaseUrl],\n [['providers', PROVIDER_ID, 'api'], API_TYPE],\n [['providers', PROVIDER_ID, 'apiKey'], desired.apiKey],\n [['providers', PROVIDER_ID, 'name'], PROVIDER_NAME],\n [['providers', PROVIDER_ID, 'models'], [modelEntry]],\n ]\n}\n\nconst ModelsSchema = v.looseObject({\n providers: v.optional(\n v.looseObject({\n [PROVIDER_ID]: v.optional(v.looseObject({ apiKey: v.optional(v.string()), baseUrl: v.optional(v.string()) })),\n }),\n ),\n})\n\nconst SettingsSchema = v.looseObject({\n defaultProvider: v.optional(v.string()),\n defaultModel: v.optional(v.string()),\n})\n\nfunction inspectConfig(ctx: PlatformContext): HarnessInspection {\n const models = readJsoncFile(resolveModelsPath(ctx), ModelsSchema)\n const settings = readJsoncFile(resolveSettingsPath(ctx), SettingsSchema)\n const provider = models.kind === 'valid' ? models.value.providers?.[PROVIDER_ID] : undefined\n return {\n isConfigured: isPublicApiUrl(provider?.baseUrl, resolvePublicApiHost(ctx.env)),\n model: settings.kind === 'valid' ? settings.value.defaultModel : undefined,\n isUnreadable: models.kind === 'invalid' || settings.kind === 'invalid',\n }\n}\n\nfunction readProviderKey(ctx: PlatformContext): string | undefined {\n const models = readJsoncFile(resolveModelsPath(ctx), ModelsSchema)\n const apiKey = models.kind === 'valid' ? models.value.providers?.[PROVIDER_ID]?.apiKey : undefined\n return readLiteralKey(apiKey)\n}\n\nconst ProvidersSchema = v.looseObject({ providers: v.optional(v.record(v.string(), v.unknown())) })\nconst ProviderKeySchema = v.looseObject({ apiKey: v.string() })\n\nfunction readProviderSecrets(ctx: PlatformContext): string[] {\n const models = readJsoncFile(resolveModelsPath(ctx), ProvidersSchema)\n if (models.kind !== 'valid') return []\n\n return Object.values(models.value.providers ?? {}).flatMap((provider) => {\n const parsed = v.safeParse(ProviderKeySchema, provider)\n return parsed.success ? (readLiteralKey(parsed.output.apiKey) ?? []) : []\n })\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport * as v from 'valibot'\nimport { resolvePublicApiHost, type DesiredConfig } from '../../product/public-api/desired-config'\nimport { MergeConflictError } from '../../shared/file-formats/config-errors'\nimport type { KeyPathUpdates } from '../../shared/file-formats/key-path'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { readLiteralKey } from '../../shared/text/read-literal-key'\nimport { detectConfigFile } from '../config/detect-config-file'\nimport { isPublicApiUrl } from '../config/is-public-api-url'\nimport { parseJsoncConfig, readJsoncFile } from '../config/read-jsonc-file'\nimport type { DetectResult, FileContribution, HarnessInspection, LaunchingHarness } from '../harness'\n\nconst BINARY = 'qwen'\nconst KEY_VARIABLE = 'NEXOS_API_KEY'\nconst OPENAI_KEY_VARIABLE = 'OPENAI_API_KEY'\nconst AUTH_TYPE = 'openai'\n\nexport const qwen: LaunchingHarness = {\n kind: 'configurable',\n id: 'qwen-code',\n label: 'Qwen Code',\n binary: BINARY,\n installPackage: '@qwen-code/qwen-code',\n protocols: ['openai-chat'],\n projectSupport: { kind: 'supported' },\n detect: (ctx) => detectQwen(ctx),\n configPath: (ctx) => resolveSettingsPath(ctx),\n plan: (desired, ctx) => [planSettings(desired, ctx)],\n inspect: (ctx) => inspectSettings(ctx),\n launch: (desired) => ({\n binary: BINARY,\n arguments: ['--auth-type', AUTH_TYPE, '--openai-base-url', desired.openaiBaseUrl, '--model', desired.model],\n env: { [OPENAI_KEY_VARIABLE]: desired.apiKey },\n }),\n launchNotes: ['This session is kept in your Qwen Code history like any other.'],\n readKey: (ctx) => readProviderKey(ctx),\n readSecrets: (ctx) => readProviderSecrets(ctx),\n postSetupNotes: [\n 'Qwen Code keeps the key in its settings file, so no /auth step is needed.',\n \"Qwen Code ranks its settings, highest first: the system settings file, the project's .qwen/settings.json, \" +\n \"then the user's ~/.qwen/settings.json. A higher one that sets the same values overrides this file.\",\n ],\n}\n\n// At project scope only a project config counts: an installed binary alone is not a project setup.\nfunction detectQwen(ctx: PlatformContext): DetectResult {\n const detected = detectConfigFile([resolveSettingsPath(ctx)], ctx.home)\n if (detected.isFound || ctx.scope === 'project' || !ctx.hasBinary(BINARY)) return detected\n\n return { isFound: true, detail: `${BINARY} found on PATH` }\n}\n\nconst USER_DIRECTORY = '.qwen'\nconst PROJECT_DIRECTORY = '.qwen'\nconst SETTINGS_FILE = 'settings.json'\n\nfunction resolveSettingsPath(ctx: PlatformContext): string {\n return match(ctx.scope)\n .with('user', () => path.join(ctx.home, USER_DIRECTORY, SETTINGS_FILE))\n .with('project', () => path.join(ctx.cwd, PROJECT_DIRECTORY, SETTINGS_FILE))\n .exhaustive()\n}\n\nfunction planSettings(desired: DesiredConfig, ctx: PlatformContext): FileContribution {\n return {\n kind: 'file',\n path: resolveSettingsPath(ctx),\n hasSecret: true,\n edits: (current) => ({ format: 'jsonc', updates: listUpdates(desired, current) }),\n }\n}\n\n// modelProviders.openai is the user's whole list of OpenAI-compatible models, so ours is merged into it, never\n// written over it.\nfunction listUpdates(desired: DesiredConfig, current: string | null): KeyPathUpdates {\n const provider = {\n id: desired.model,\n name: desired.model,\n baseUrl: desired.openaiBaseUrl,\n envKey: KEY_VARIABLE,\n }\n return [\n [\n ['modelProviders', 'openai'],\n [...listOtherOpenAiProviders(current), provider],\n ],\n [['env', KEY_VARIABLE], desired.apiKey],\n [['security', 'auth', 'selectedType'], AUTH_TYPE],\n [['model', 'name'], desired.model],\n ]\n}\n\nconst ModelProvidersSchema = v.looseObject({\n modelProviders: v.optional(v.looseObject({ openai: v.optional(v.unknown()) })),\n})\n\nconst NexosEntrySchema = v.looseObject({ envKey: v.literal(KEY_VARIABLE), baseUrl: v.optional(v.string()) })\n\nfunction listOtherOpenAiProviders(current: string | null): unknown[] {\n const parsed = parseJsoncConfig(current, ModelProvidersSchema)\n if (parsed.kind !== 'valid') return []\n\n const openai = parsed.value.modelProviders?.openai\n if (openai === undefined) return []\n if (!Array.isArray(openai)) throw new MergeConflictError()\n\n return openai.filter((entry) => !v.is(NexosEntrySchema, entry))\n}\n\nconst SettingsSchema = v.looseObject({\n env: v.optional(v.looseObject({ [KEY_VARIABLE]: v.optional(v.string()) })),\n model: v.optional(v.looseObject({ name: v.optional(v.string()) })),\n modelProviders: v.optional(v.looseObject({ openai: v.optional(v.unknown()) })),\n})\n\nfunction inspectSettings(ctx: PlatformContext): HarnessInspection {\n const settings = readJsoncFile(resolveSettingsPath(ctx), SettingsSchema)\n if (settings.kind === 'absent') return { isConfigured: false, model: undefined, isUnreadable: false }\n if (settings.kind === 'invalid') return { isConfigured: false, model: undefined, isUnreadable: true }\n\n const openai = settings.value.modelProviders?.openai\n const entry = Array.isArray(openai) ? openai.find((candidate) => v.is(NexosEntrySchema, candidate)) : undefined\n const baseUrl = v.is(NexosEntrySchema, entry) ? entry.baseUrl : undefined\n return {\n isConfigured: isPublicApiUrl(baseUrl, resolvePublicApiHost(ctx.env)),\n model: settings.value.model?.name,\n isUnreadable: false,\n }\n}\n\nfunction readProviderKey(ctx: PlatformContext): string | undefined {\n const settings = readJsoncFile(resolveSettingsPath(ctx), SettingsSchema)\n return readLiteralKey(settings.kind === 'valid' ? settings.value.env?.[KEY_VARIABLE] : undefined)\n}\n\n// Qwen keeps every provider's key in this one file, so a diff can print any of them: register the key of every\n// model entry and the auth key, not just ours.\nconst SecretsSchema = v.looseObject({\n env: v.optional(v.record(v.string(), v.unknown())),\n security: v.optional(v.looseObject({ auth: v.optional(v.looseObject({ apiKey: v.optional(v.string()) })) })),\n modelProviders: v.optional(v.record(v.string(), v.unknown())),\n})\n\nconst ProviderEntrySchema = v.looseObject({ envKey: v.string() })\n\nfunction readProviderSecrets(ctx: PlatformContext): string[] {\n const settings = readJsoncFile(resolveSettingsPath(ctx), SecretsSchema)\n if (settings.kind !== 'valid') return []\n\n const { env = {}, security, modelProviders = {} } = settings.value\n const fromEnv = listProviderEnvKeys(modelProviders).flatMap((name) => readEnvSecret(env, name))\n const fromAuth = readOptionalKey(security?.auth?.apiKey)\n return [...fromEnv, ...fromAuth]\n}\n\nfunction listProviderEnvKeys(modelProviders: Record<string, unknown>): string[] {\n return Object.values(modelProviders).flatMap((providers) => {\n if (!Array.isArray(providers)) return []\n return providers.flatMap((entry) => {\n const parsed = v.safeParse(ProviderEntrySchema, entry)\n return parsed.success ? [parsed.output.envKey] : []\n })\n })\n}\n\nfunction readEnvSecret(env: Record<string, unknown>, name: string): string[] {\n const value = env[name]\n return typeof value === 'string' ? readOptionalKey(value) : []\n}\n\nfunction readOptionalKey(value: string | undefined): string[] {\n const key = readLiteralKey(value)\n return key === undefined ? [] : [key]\n}\n","import { claudeCode } from './claude-code/claude-code'\nimport { claudeDesktop } from './claude-desktop/claude-desktop'\nimport { codex } from './codex/codex'\nimport { copilotCli } from './copilot-cli/copilot-cli'\nimport { crush } from './crush/crush'\nimport type { Harness, LaunchingHarness } from './harness'\nimport { opencode } from './opencode/opencode'\nimport { pi } from './pi/pi'\nimport { qwen } from './qwen-code/qwen'\n\nexport const harnesses: readonly Harness[] = [claudeCode, claudeDesktop, codex, opencode, copilotCli, pi, crush, qwen]\n\nexport function findHarness(id: string): Harness | undefined {\n return harnesses.find((harness) => harness.id === id)\n}\n\nexport function findHarnessByBinary(binary: string): Harness | undefined {\n return harnesses.find((harness) => harness.binary === binary)\n}\n\nexport function listLaunchBinaries(): string[] {\n return listLaunchingHarnesses().map((harness) => harness.binary)\n}\n\nexport function listLaunchingHarnesses(): LaunchingHarness[] {\n return harnesses.filter(isLaunchingHarness)\n}\n\nexport function isLaunchingHarness(harness: Harness): harness is LaunchingHarness {\n return harness.kind === 'configurable' && harness.launch !== undefined && harness.binary !== undefined\n}\n","import { listLaunchBinaries } from '../harnesses/registry'\nimport type { TerminalUi } from '../ui/terminal-ui'\nimport { KEY_ENV_VARIABLE } from './environment'\nimport { UsageError } from './errors/usage-error'\nimport { COMMAND_NAME, LAUNCH_COMMAND, LOGIN_COMMAND, SETUP_COMMAND } from './help'\n\ntype Refusal = { question: string; answers: string }\n\nconst MODEL_REFUSAL: Refusal = { question: 'which model to use', answers: '--model' }\nconst KEY_REFUSAL: Refusal = {\n question: 'for the key',\n answers: `--key, set $${KEY_ENV_VARIABLE}, or run \\`${COMMAND_NAME} ${LOGIN_COMMAND}\\` in a terminal and then pass --yes`,\n}\nconst FAILED_CHECK_REFUSAL: Refusal = {\n question: 'what to do after the failed check',\n answers: '--model, or --yes to continue',\n}\nconst OFFERED_KEY_REFUSAL: Refusal = {\n question: 'which key to use',\n answers: `--key, set $${KEY_ENV_VARIABLE}, or pass --yes to use the key already on this machine`,\n}\n\nexport function refusePrompts(ui: TerminalUi): TerminalUi {\n return {\n ...ui,\n selectScope: refuse({ question: 'where to write', answers: '--scope, or --yes for user level' }),\n selectChangeScope: refuse({ question: 'which configs to change', answers: '--scope, or --yes for user level' }),\n selectHarnesses: refuse({\n question: 'which agents to configure',\n answers: '--harnesses, or --yes for the detected agents',\n }),\n selectTargetAgents: refuse({\n question: 'which agents to change',\n answers: '--harnesses, or --yes for every configured agent it can change',\n }),\n askForKey: refuse(KEY_REFUSAL),\n askForNewKey: refuse(KEY_REFUSAL),\n chooseKeySource: async ({ hasStoredKey }) =>\n await refuse(hasStoredKey ? OFFERED_KEY_REFUSAL : { ...KEY_REFUSAL, question: 'how to provide the key' })(),\n chooseOnSavedKeyRejected: refuse({ question: 'what to do about the rejected saved key', answers: '--key' }),\n confirm: refuse({ question: 'for confirmation', answers: '--yes' }),\n chooseSavedModel: refuse({\n question: 'which saved model to use',\n answers: '--model, or --yes for the saved default',\n }),\n selectModel: refuse(MODEL_REFUSAL),\n askForModelId: refuse(MODEL_REFUSAL),\n chooseOnKeyRejected: refuse(FAILED_CHECK_REFUSAL),\n chooseOnFetchFailure: refuse(FAILED_CHECK_REFUSAL),\n chooseOnModelProbeFailure: refuse({\n question: 'what to do after the failed model check',\n answers: '--yes to continue anyway',\n }),\n selectRestoreScope: refuse({ question: 'which configs to restore', answers: '--scope, or --yes for user level' }),\n selectRestoreHarnesses: refuse({\n question: 'which agents to restore',\n answers: '--harnesses, or --yes for every agent it has a record of',\n }),\n askKeyName: refuse({ question: 'for the key name', answers: '--key-name, or --yes for the default' }),\n selectLaunchAgent: refuse({\n question: 'which agent to start',\n answers: `the agent: \\`${COMMAND_NAME} ${LAUNCH_COMMAND} <agent>\\`, where <agent> is one of ${listLaunchBinaries().join(', ')}`,\n }),\n selectMenuItem: refuse({ question: 'what to do', answers: `a command, such as ${COMMAND_NAME} ${SETUP_COMMAND}` }),\n }\n}\n\nconst NEW_KEY_REFUSAL: Refusal = { question: 'for the new key', answers: '--key' }\nconst CHANGE_KEY_CHECK_REFUSAL: Refusal = {\n question: 'what to do after the failed check',\n answers: '--yes to write the key anyway',\n}\n\n/** Only --key answers a change of key, never $NEXOS_API_KEY or a stored key; a failed check has no model to fall back on. */\nexport function refuseChangeKeyPrompts(ui: TerminalUi): TerminalUi {\n return {\n ...refusePrompts(ui),\n askForKey: refuse(NEW_KEY_REFUSAL),\n askForNewKey: refuse(NEW_KEY_REFUSAL),\n chooseKeySource: refuse(NEW_KEY_REFUSAL),\n chooseOnKeyRejected: refuse(CHANGE_KEY_CHECK_REFUSAL),\n chooseOnFetchFailure: refuse(CHANGE_KEY_CHECK_REFUSAL),\n }\n}\n\nfunction refuse({ question, answers }: Refusal): () => Promise<never> {\n return async () => {\n throw new UsageError(`Cannot ask ${question} without a terminal. Pass ${answers}.`)\n }\n}\n","import type { Masker } from '../product/secrets/masker'\nimport type { TerminalUi } from '../ui/terminal-ui'\nimport {\n AUTH_ENV_VARIABLE,\n INTERNAL_API_PROXY_ENV_VARIABLE,\n PUBLIC_API_ENV_VARIABLE,\n type EnvironmentInputs,\n} from './environment'\n\nexport type HostOverrides = Partial<Pick<EnvironmentInputs, 'publicApiHost' | 'authHost' | 'internalApiProxyHost'>>\n\nexport type AnnounceHostOverridesParams = { overrides: HostOverrides; ui: Pick<TerminalUi, 'log'>; masker: Masker }\n\nexport function announceHostOverrides({ overrides, ui, masker }: AnnounceHostOverridesParams): void {\n for (const notice of describeHostOverrides(overrides)) ui.log.warn(masker.maskText(notice))\n}\n\nexport function describeHostOverrides({ publicApiHost, authHost, internalApiProxyHost }: HostOverrides): string[] {\n return [\n publicApiHost === undefined ? [] : [`Using the Gateway at ${publicApiHost} — $${PUBLIC_API_ENV_VARIABLE} is set.`],\n authHost === undefined ? [] : [`Using the sign-in service at ${authHost} — $${AUTH_ENV_VARIABLE} is set.`],\n internalApiProxyHost === undefined\n ? []\n : [`Creating keys at ${internalApiProxyHost} — $${INTERNAL_API_PROXY_ENV_VARIABLE} is set.`],\n ].flat()\n}\n","import type { Harness } from '../harnesses/harness'\nimport { findHarness, harnesses } from '../harnesses/registry'\nimport { UsageError } from './errors/usage-error'\n\nexport function resolveNamedHarnesses(ids: readonly string[]): Harness[] {\n const unknownIds = ids.filter((id) => findHarness(id) === undefined)\n if (unknownIds.length > 0) {\n const noun = unknownIds.length === 1 ? 'id' : 'ids'\n const knownIds = harnesses.map((harness) => harness.id).join(', ')\n throw new UsageError(`Unknown agent ${noun}: ${unknownIds.join(', ')}. Known ids: ${knownIds}.`)\n }\n\n return ids.flatMap((id) => findHarness(id) ?? [])\n}\n","import * as v from 'valibot'\nimport { UsageError } from '../../cli/errors/usage-error'\nimport { KeyNameSchema } from '../../cli/parse-key-name'\nimport type { TerminalUi } from '../../ui/terminal-ui'\n\nconst KEY_NAME_PREFIX = 'nexos-connect'\n\nexport type DefaultKeyNameParams = { hostname: string; now: Date }\n\nexport function defaultKeyName({ hostname, now }: DefaultKeyNameParams): string {\n return `${KEY_NAME_PREFIX} (${hostname}) ${formatUtcTimestamp(now)}`\n}\n\nexport function findKeyNameProblem(value: string): string | undefined {\n const result = v.safeParse(KeyNameSchema, value)\n return result.success ? undefined : `The name ${result.issues[0].message}.`\n}\n\nexport function describeKeyNameTaken(keyName: string): string {\n return `A key named \"${keyName}\" already exists.`\n}\n\nexport type KeyNameRequest = { defaultName: string; takenName: string | undefined }\n\nexport type KeyNameChooser = (request: KeyNameRequest) => Promise<string>\n\nexport type KeyNameChooserParams = {\n keyName: string | undefined\n shouldAssumeYes: boolean\n ui: Pick<TerminalUi, 'askKeyName' | 'log'>\n}\n\nexport function keyNameChooser({ keyName, shouldAssumeYes, ui }: KeyNameChooserParams): KeyNameChooser {\n const ask = askForKeyName(ui)\n if (keyName === undefined) return shouldAssumeYes ? keepDefaultKeyName : ask\n\n return async (request) => {\n if (request.takenName === undefined) return keyName\n if (shouldAssumeYes) throw new UsageError(describeNameToPass(request.takenName))\n return await ask(request)\n }\n}\n\n/** Nobody chose the default, so it may be renamed; a name somebody chose never is. */\nexport async function keepDefaultKeyName({ defaultName, takenName }: KeyNameRequest): Promise<string> {\n if (takenName === undefined) return defaultName\n if (takenName === defaultName) return withConflictSuffix(defaultName)\n throw new UsageError(describeNameToPass(takenName))\n}\n\nconst CONFLICT_SUFFIX = ' -2'\n\nfunction withConflictSuffix(keyName: string): string {\n return `${keyName}${CONFLICT_SUFFIX}`\n}\n\nfunction describeNameToPass(takenName: string): string {\n return `${describeKeyNameTaken(takenName)} Pass --key-name with a different name.`\n}\n\nfunction askForKeyName(ui: KeyNameChooserParams['ui']): KeyNameChooser {\n return async ({ defaultName, takenName }) => {\n if (takenName !== undefined) ui.log.warn(describeKeyNameTaken(takenName))\n const offeredName = takenName === defaultName ? withConflictSuffix(defaultName) : defaultName\n return (await ui.askKeyName({ defaultName: offeredName, findProblem: findKeyNameProblem })).trim()\n }\n}\n\nconst PAD_WIDTH = 2\n\nfunction formatUtcTimestamp(moment: Date): string {\n const pad = (part: number): string => String(part).padStart(PAD_WIDTH, '0')\n const date = `${moment.getUTCFullYear()}-${pad(moment.getUTCMonth() + 1)}-${pad(moment.getUTCDate())}`\n const time = `${pad(moment.getUTCHours())}:${pad(moment.getUTCMinutes())}:${pad(moment.getUTCSeconds())}`\n return `${date} ${time}`\n}\n","import { COMMAND_NAME, LOGIN_COMMAND } from '../../cli/help'\nimport { IdentityError, type IdentityClient } from '../../product/identity/identity-client'\nimport { INVALID_GRANT, type TokenSet } from '../../product/identity/token-schemas'\nimport type { Authorize } from '../../product/internal-api-proxy/proxy-request'\nimport type { UserProfile } from '../../product/internal-api-proxy/user-profile'\nimport type { Session, SessionStore } from '../../product/storage/session/session-store'\nimport { HttpStatusError } from '../../shared/http/request-errors'\n\nconst REFRESH_SKEW_MS = 60_000\n\nconst DEFAULT_TOKEN_LIFETIME_SECONDS = 3_600\n\nexport type ToSessionParams = {\n tokens: TokenSet\n profile: Pick<UserProfile, 'id' | 'email'>\n now: Date\n previous?: Pick<Session, 'keyId' | 'keyName'>\n}\n\nexport class MissingRefreshTokenError extends Error {\n constructor() {\n super('The token response carried no refresh token.')\n this.name = 'MissingRefreshTokenError'\n }\n}\n\nconst MS_PER_SECOND = 1_000\n\nexport function toSession({ tokens, profile, now, previous }: ToSessionParams): Session {\n if (tokens.refreshToken === undefined) throw new MissingRefreshTokenError()\n\n const lifetimeSeconds = tokens.expiresInSeconds ?? DEFAULT_TOKEN_LIFETIME_SECONDS\n return {\n refreshToken: tokens.refreshToken,\n accessToken: tokens.accessToken,\n accessTokenExpiresAt: new Date(now.getTime() + lifetimeSeconds * MS_PER_SECOND).toISOString(),\n email: profile.email,\n userId: profile.id,\n ...(previous?.keyId === undefined ? {} : { keyId: previous.keyId }),\n ...(previous?.keyName === undefined ? {} : { keyName: previous.keyName }),\n }\n}\n\nexport class SessionExpiredError extends Error {\n constructor() {\n super(`Your nexos.ai sign-in has expired — run \\`${COMMAND_NAME} ${LOGIN_COMMAND}\\` again.`)\n this.name = 'SessionExpiredError'\n }\n}\n\nexport type RefreshSessionIfStaleParams = {\n session: Session\n store: SessionStore\n identity: IdentityClient\n now: () => Date\n}\n\nexport async function refreshSessionIfStale(params: RefreshSessionIfStaleParams): Promise<Session> {\n const { session, now } = params\n if (isFresh(session, now())) return session\n\n return await refreshAndStore(params)\n}\n\nconst SESSION_REJECTED_STATUS = 401\n\nexport function isSessionRejected(error: unknown): boolean {\n return error instanceof HttpStatusError && error.status === SESSION_REJECTED_STATUS\n}\n\nexport type AuthorizeWithSessionParams = Omit<RefreshSessionIfStaleParams, 'session'>\n\n/** Callers save the session first: each call reads it from the store, so one call's refresh serves the next. */\nexport function authorizeWithSession(params: AuthorizeWithSessionParams): Authorize {\n return async (send) => {\n const session = await loadSavedSession(params.store)\n return await runWithSession({ ...params, session, task: async (current) => await send(current.accessToken) })\n }\n}\n\nasync function loadSavedSession(store: SessionStore): Promise<Session> {\n const load = await store.load()\n if (load.kind !== 'session') throw new SessionExpiredError()\n\n return load.session\n}\n\ntype RunWithSessionParams<T> = RefreshSessionIfStaleParams & { task: (session: Session) => Promise<T> }\n\n/** A token the clock calls fresh may still be refused, revoked or skewed, so a refusal earns one forced refresh. */\nasync function runWithSession<T>({ task, ...params }: RunWithSessionParams<T>): Promise<T> {\n const session = await refreshSessionIfStale(params)\n try {\n return await task(session)\n } catch (error) {\n if (!isSessionRejected(error)) throw error\n }\n\n const refreshed = await refreshAndStore({ ...params, session })\n try {\n return await task(refreshed)\n } catch (error) {\n if (isSessionRejected(error)) throw new SessionExpiredError()\n throw error\n }\n}\n\nfunction isFresh(session: Session, now: Date): boolean {\n return Date.parse(session.accessTokenExpiresAt) - now.getTime() > REFRESH_SKEW_MS\n}\n\nasync function refreshAndStore(params: RefreshSessionIfStaleParams): Promise<Session> {\n const { session, store, now } = params\n const tokens = await refreshOrExpire(params)\n const refreshed = toSession({\n tokens,\n profile: { id: session.userId, email: session.email },\n now: now(),\n previous: session,\n })\n await store.save(refreshed)\n return refreshed\n}\n\nasync function refreshOrExpire({ session, identity }: RefreshSessionIfStaleParams): Promise<TokenSet> {\n try {\n return await identity.refreshTokens(session.refreshToken)\n } catch (error) {\n if (error instanceof IdentityError && error.oauthError === INVALID_GRANT) throw new SessionExpiredError()\n throw error\n }\n}\n","import { randomBytes as nodeRandomBytes, timingSafeEqual } from 'node:crypto'\nimport http from 'node:http'\nimport { match } from 'ts-pattern'\nimport { formatSeconds } from '../text/format-seconds'\nimport { createPkcePair, type RandomBytes } from './pkce'\n\nconst START_PATH = '/start'\nexport const CONFIRM_PATH = '/confirm'\nexport const CALLBACK_PATH = '/callback'\nconst NONCE_PARAMETER = 'nonce'\nexport const CONFIRM_TOKEN_FIELD = 'token'\nexport const LOOPBACK_HOST = '127.0.0.1'\n\nexport type AuthorizationRequest = { state: string; codeChallenge: string; redirectUri: string }\n\nexport type ConfirmForm = { confirmPath: string; confirmToken: string }\n\nexport interface LocalAuthPages {\n start(form: ConfirmForm): string\n connected(): string\n stale(): string\n denied(description: string | undefined): string\n}\n\nexport type StartLocalAuthServerParams = {\n pages: LocalAuthPages\n buildAuthorizeUrl: (request: AuthorizationRequest) => string\n deadlineMs: number\n signal?: AbortSignal\n randomToken?: () => string\n randomBytes?: RandomBytes\n}\n\nexport type Authorization = { code: string; codeVerifier: string; redirectUri: string }\n\nexport interface LocalAuthServer {\n startUrl: string\n authorization: Promise<Authorization>\n close(): Promise<void>\n}\n\nexport class AuthorizationTimeoutError extends Error {\n readonly deadlineMs: number\n\n constructor(deadlineMs: number) {\n super(`No sign-in arrived within ${formatSeconds(deadlineMs)}.`)\n this.name = 'AuthorizationTimeoutError'\n this.deadlineMs = deadlineMs\n }\n}\n\nexport type AuthorizationDeniedErrorParams = { oauthError: string; description: string | undefined }\n\nexport class AuthorizationDeniedError extends Error {\n readonly oauthError: string\n readonly description: string | undefined\n\n constructor({ oauthError, description }: AuthorizationDeniedErrorParams) {\n super(`The sign-in was refused (${oauthError})${description === undefined ? '' : `: ${description}`}.`)\n this.name = 'AuthorizationDeniedError'\n this.oauthError = oauthError\n this.description = description\n }\n}\n\nconst TOKEN_BYTES = 32\n\nconst defaultRandomToken = (): string => nodeRandomBytes(TOKEN_BYTES).toString('base64url')\n\nexport async function startLocalAuthServer(params: StartLocalAuthServerParams): Promise<LocalAuthServer> {\n const { deadlineMs, signal, randomToken = defaultRandomToken } = params\n const server = http.createServer()\n const origin = await listen(server)\n const lifecycle = watchLifecycle({ server, deadlineMs, signal })\n const nonce = randomToken()\n\n server.on(\n 'request',\n createRequestHandler({\n ...params,\n randomToken,\n nonce,\n redirectUri: `${origin}${CALLBACK_PATH}`,\n conclude: lifecycle.conclude,\n }),\n )\n\n return {\n startUrl: `${origin}${START_PATH}?${NONCE_PARAMETER}=${nonce}`,\n authorization: lifecycle.authorization,\n close: lifecycle.close,\n }\n}\n\nasync function listen(server: http.Server): Promise<string> {\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject)\n server.listen(0, LOOPBACK_HOST, resolve)\n })\n const address = server.address()\n if (address === null || typeof address === 'string') throw new Error('The local sign-in server has no port.')\n return `http://${LOOPBACK_HOST}:${address.port}`\n}\n\ntype Outcome = { kind: 'authorized'; authorization: Authorization } | { kind: 'failed'; error: unknown }\n\ntype WatchLifecycleParams = { server: http.Server; deadlineMs: number; signal: AbortSignal | undefined }\n\ntype Lifecycle = {\n authorization: Promise<Authorization>\n conclude: (outcome: Outcome) => void\n close: () => Promise<void>\n}\n\nfunction watchLifecycle({ server, deadlineMs, signal }: WatchLifecycleParams): Lifecycle {\n let settle: (outcome: Outcome) => void = () => undefined\n const authorization = new Promise<Authorization>((resolve, reject) => {\n settle = (outcome) => (outcome.kind === 'authorized' ? resolve(outcome.authorization) : reject(outcome.error))\n })\n // The deadline or the signal can fire while the caller is still opening the browser; the rejection waits for its await.\n authorization.catch(() => undefined)\n\n let closing: Promise<void> | undefined\n const close = (): Promise<void> => {\n if (closing === undefined) {\n clearTimeout(deadline)\n signal?.removeEventListener('abort', abort)\n closing = closeServer(server)\n }\n return closing\n }\n const conclude = (outcome: Outcome): void => {\n if (closing !== undefined) return\n void close().then(() => settle(outcome))\n }\n const abort = (): void => conclude({ kind: 'failed', error: signal?.reason })\n const deadline = setTimeout(\n () => conclude({ kind: 'failed', error: new AuthorizationTimeoutError(deadlineMs) }),\n deadlineMs,\n )\n deadline.unref()\n if (signal?.aborted === true) abort()\n else signal?.addEventListener('abort', abort, { once: true })\n\n return { authorization, conclude, close }\n}\n\nasync function closeServer(server: http.Server): Promise<void> {\n server.closeAllConnections()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n}\n\ntype Phase =\n | { kind: 'awaiting-start'; nonce: string }\n | { kind: 'awaiting-confirm'; confirmToken: string }\n | { kind: 'awaiting-callback'; state: string; codeVerifier: string }\n | { kind: 'done' }\n\ntype Reply =\n | { kind: 'page'; status: number; html: string }\n | { kind: 'redirect'; location: string }\n | { kind: 'not-found' }\n\ntype Handled = { reply: Reply; outcome?: Outcome }\n\ntype RequestHandlerParams = Omit<StartLocalAuthServerParams, 'deadlineMs' | 'signal'> & {\n randomToken: () => string\n nonce: string\n redirectUri: string\n conclude: (outcome: Outcome) => void\n}\n\nconst LOOPBACK_ORIGIN = `http://${LOOPBACK_HOST}`\nconst HTTP_OK = 200\nconst HTTP_BAD_REQUEST = 400\nconst NOT_FOUND: Handled = { reply: { kind: 'not-found' } }\n\nfunction createRequestHandler(params: RequestHandlerParams): http.RequestListener {\n const { pages, buildAuthorizeUrl, randomToken, randomBytes, redirectUri, conclude } = params\n let phase: Phase = { kind: 'awaiting-start', nonce: params.nonce }\n\n const page = (status: number, html: string): Handled => ({ reply: { kind: 'page', status, html } })\n const stale = (): Handled => page(HTTP_BAD_REQUEST, pages.stale())\n\n const start = (query: URLSearchParams): Handled => {\n if (phase.kind !== 'awaiting-start' || !isSameToken(query.get(NONCE_PARAMETER), phase.nonce)) return stale()\n\n const confirmToken = randomToken()\n phase = { kind: 'awaiting-confirm', confirmToken }\n return page(HTTP_OK, pages.start({ confirmPath: CONFIRM_PATH, confirmToken }))\n }\n\n const confirm = (form: URLSearchParams): Handled => {\n if (phase.kind !== 'awaiting-confirm' || !isSameToken(form.get(CONFIRM_TOKEN_FIELD), phase.confirmToken)) {\n return stale()\n }\n\n const state = randomToken()\n const { codeVerifier, codeChallenge } = createPkcePair(randomBytes)\n phase = { kind: 'awaiting-callback', state, codeVerifier }\n return { reply: { kind: 'redirect', location: buildAuthorizeUrl({ state, codeChallenge, redirectUri }) } }\n }\n\n const callback = (query: URLSearchParams): Handled => {\n if (phase.kind !== 'awaiting-callback' || !isSameToken(query.get('state'), phase.state)) return stale()\n\n const { codeVerifier } = phase\n const oauthError = query.get('error')\n const code = query.get('code')\n if (oauthError !== null) {\n const description = query.get('error_description') ?? undefined\n phase = { kind: 'done' }\n return {\n ...page(HTTP_OK, pages.denied(description)),\n outcome: { kind: 'failed', error: new AuthorizationDeniedError({ oauthError, description }) },\n }\n }\n if (code === null) return stale()\n\n phase = { kind: 'done' }\n return {\n ...page(HTTP_OK, pages.connected()),\n outcome: { kind: 'authorized', authorization: { code, codeVerifier, redirectUri } },\n }\n }\n\n const route = async (request: http.IncomingMessage): Promise<Handled> => {\n const target = request.url ?? '/'\n if (!URL.canParse(target, LOOPBACK_ORIGIN)) return NOT_FOUND\n\n const url = new URL(target, LOOPBACK_ORIGIN)\n return await match({ method: request.method, pathname: url.pathname })\n .with({ method: 'GET', pathname: START_PATH }, () => start(url.searchParams))\n .with({ method: 'POST', pathname: CONFIRM_PATH }, async () => confirm(await readForm(request)))\n .with({ method: 'GET', pathname: CALLBACK_PATH }, () => callback(url.searchParams))\n .otherwise(() => NOT_FOUND)\n }\n\n return (request, response) => {\n route(request)\n .then(({ reply, outcome }) => {\n const onSent = outcome === undefined ? undefined : (): void => conclude(outcome)\n if (onSent !== undefined) response.once('close', onSent)\n send(response, reply, onSent)\n })\n .catch(() => endUnanswered(response))\n }\n}\n\nfunction isSameToken(given: string | null, expected: string): boolean {\n if (given === null) return false\n const givenBytes = Buffer.from(given)\n const expectedBytes = Buffer.from(expected)\n return givenBytes.length === expectedBytes.length && timingSafeEqual(givenBytes, expectedBytes)\n}\n\nconst MAX_FORM_BYTES = 1_024\n\nfunction readForm(request: http.IncomingMessage): Promise<URLSearchParams> {\n return new Promise((resolve) => {\n const chunks: Buffer[] = []\n let size = 0\n request.on('data', (chunk: Buffer) => {\n size += chunk.length\n if (size <= MAX_FORM_BYTES) chunks.push(chunk)\n })\n request.on('end', () => {\n resolve(new URLSearchParams(size <= MAX_FORM_BYTES ? Buffer.concat(chunks).toString('utf8') : ''))\n })\n request.on('error', () => resolve(new URLSearchParams()))\n })\n}\n\nconst RESPONSE_HEADERS = {\n 'cache-control': 'no-store',\n 'referrer-policy': 'no-referrer',\n 'x-content-type-options': 'nosniff',\n 'content-security-policy': \"default-src 'none'; style-src 'unsafe-inline'; frame-ancestors 'none'\",\n}\nconst HTML_CONTENT_TYPE = 'text/html; charset=utf-8'\nconst HTTP_FOUND = 302\nconst HTTP_NOT_FOUND = 404\n\nfunction send(response: http.ServerResponse, reply: Reply, onSent: (() => void) | undefined): void {\n if (reply.kind === 'page') {\n response.writeHead(reply.status, { ...RESPONSE_HEADERS, 'content-type': HTML_CONTENT_TYPE })\n response.end(reply.html, onSent)\n return\n }\n if (reply.kind === 'redirect') {\n response.writeHead(HTTP_FOUND, { ...RESPONSE_HEADERS, location: reply.location })\n response.end()\n return\n }\n response.writeHead(HTTP_NOT_FOUND, RESPONSE_HEADERS)\n response.end()\n}\n\nconst HTTP_INTERNAL_SERVER_ERROR = 500\n\nfunction endUnanswered(response: http.ServerResponse): void {\n if (!response.headersSent) response.writeHead(HTTP_INTERNAL_SERVER_ERROR, RESPONSE_HEADERS)\n response.end()\n}\n","import { createHash, randomBytes as nodeRandomBytes } from 'node:crypto'\n\nexport type PkcePair = { codeVerifier: string; codeChallenge: string }\n\nexport type RandomBytes = (size: number) => Buffer\n\nexport const CODE_VERIFIER_BYTES = 32\n\nexport function createPkcePair(randomBytes: RandomBytes = nodeRandomBytes): PkcePair {\n const codeVerifier = randomBytes(CODE_VERIFIER_BYTES).toString('base64url')\n return { codeVerifier, codeChallenge: computeCodeChallenge(codeVerifier) }\n}\n\nexport function computeCodeChallenge(codeVerifier: string): string {\n return createHash('sha256').update(codeVerifier).digest('base64url')\n}\n","const HTML_ESCAPES: Readonly<Record<string, string>> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n}\n\nexport function escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (character) => HTML_ESCAPES[character] ?? character)\n}\n","import { CONFIRM_TOKEN_FIELD, type ConfirmForm, type LocalAuthPages } from '../../../shared/oauth/local-auth-server'\nimport type { PlatformContext } from '../../../shared/platform/platform-context'\nimport { escapeHtml } from '../../../shared/text/escape-html'\n\nexport type StartPageParams = { hostname: string; userName: string; form: ConfirmForm }\n\nexport function renderStartPage({ hostname, userName, form }: StartPageParams): string {\n return renderLayout(\n 'Sign in to nexos.ai',\n `<h1>Sign in to nexos.ai</h1>\n<p><strong>nexos-connect</strong> on <strong>${escapeHtml(hostname)}</strong> (${escapeHtml(userName)}) is asking to sign in with your nexos.ai account.</p>\n<form method=\"post\" action=\"${escapeHtml(form.confirmPath)}\">\n <input type=\"hidden\" name=\"${CONFIRM_TOKEN_FIELD}\" value=\"${escapeHtml(form.confirmToken)}\">\n <button type=\"submit\">Continue to sign in</button>\n</form>\n<p class=\"note\">Not you? Close this tab.</p>`,\n )\n}\n\nexport function renderConnectedPage(): string {\n return renderLayout(\n 'Signed in to nexos.ai',\n `<h1>Signed in to nexos.ai</h1>\n<p><strong>nexos-connect</strong> is finishing up in your terminal. You can close this tab.</p>`,\n )\n}\n\nexport function renderStalePage(): string {\n return renderLayout(\n 'This sign-in link has already been used',\n `<h1>This sign-in link has already been used</h1>\n<p>Go back to your terminal. If it is still waiting, finish in the tab you opened first; otherwise sign in again from there.</p>`,\n )\n}\n\nexport function renderDeniedPage(description: string | undefined): string {\n const explanation = description === undefined ? '' : `<p>${escapeHtml(description)}</p>\\n`\n return renderLayout(\n 'Sign-in did not finish',\n `<h1>Sign-in did not finish</h1>\n${explanation}<p>Return to your terminal.</p>`,\n )\n}\n\nexport function buildIdentityPages(machine: Pick<PlatformContext, 'hostname' | 'userName'>): LocalAuthPages {\n return {\n start: (form) => renderStartPage({ hostname: machine.hostname, userName: machine.userName, form }),\n connected: renderConnectedPage,\n stale: renderStalePage,\n denied: renderDeniedPage,\n }\n}\n\nconst STYLE = [\n 'body{margin:0;min-height:100vh;display:grid;place-items:center;background:#f4f6f5;color:#15201c;',\n 'font-family:system-ui,-apple-system,\"Segoe UI\",sans-serif;line-height:1.5}',\n 'main{max-width:26rem;margin:1rem;padding:2rem;border-radius:12px;background:#fff;box-shadow:0 8px 30px rgba(0,0,0,.08);text-align:center}',\n 'h1{margin:0 0 1rem;font-size:1.4rem}',\n 'button{font:inherit;padding:.7rem 1.4rem;border:0;border-radius:8px;background:#0b7a5b;color:#fff;cursor:pointer}',\n '.note{margin:1.5rem 0 0;color:#5f6b66;font-size:.9rem}',\n].join('')\n\nfunction renderLayout(title: string, body: string): string {\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${escapeHtml(title)}</title>\n<style>${STYLE}</style>\n</head>\n<body>\n<main>\n${body}\n</main>\n</body>\n</html>\n`\n}\n","import type { SpawnOptions } from 'node:child_process'\nimport { match } from 'ts-pattern'\nimport type { ResolvedExecutable } from './has-binary'\nimport type { PlatformContext } from './platform-context'\n\nconst BROWSER_ENV_VARIABLE = 'BROWSER'\n\nexport interface BrowserChild {\n once(event: 'spawn', listener: () => void): unknown\n once(event: 'error', listener: (error: Error) => void): unknown\n unref(): void\n}\n\nexport type BrowserSpawn = (\n command: string,\n commandArguments: readonly string[],\n options: Pick<SpawnOptions, 'detached' | 'stdio' | 'env'>,\n) => BrowserChild\n\nexport type OpenBrowserParams = { ctx: PlatformContext; url: string; spawn: BrowserSpawn }\n\nexport class BrowserOpenError extends Error {\n readonly command: string\n\n constructor(command: string, cause?: Error) {\n super(`Could not open a browser with ${command}.`, { cause })\n this.name = 'BrowserOpenError'\n this.command = command\n }\n}\n\nexport async function openBrowser({ ctx, url, spawn }: OpenBrowserParams): Promise<void> {\n const platformOpener = choosePlatformOpener(ctx.platform)\n const opener = resolveBrowserVariable(ctx) ?? resolveOpener(ctx, platformOpener)\n if (opener === undefined) throw new BrowserOpenError(platformOpener.command)\n\n const { command, commandArguments, executable } = opener\n const child = spawn(executable.path, [...commandArguments, url], {\n detached: true,\n stdio: 'ignore',\n env: executable.env,\n })\n await new Promise<void>((resolve, reject) => {\n child.once('spawn', resolve)\n child.once('error', (error) => reject(new BrowserOpenError(command, error)))\n })\n child.unref()\n}\n\ntype Opener = { command: string; commandArguments: readonly string[] }\n\ntype ResolvedOpener = Opener & { executable: ResolvedExecutable }\n\nconst WINDOWS_OPENER: Opener = { command: 'rundll32', commandArguments: ['url.dll,FileProtocolHandler'] }\nconst MAC_OPENER: Opener = { command: 'open', commandArguments: [] }\nconst LINUX_OPENER: Opener = { command: 'xdg-open', commandArguments: [] }\n\nfunction choosePlatformOpener(platform: NodeJS.Platform): Opener {\n return match(platform)\n .with('win32', () => WINDOWS_OPENER)\n .with('darwin', () => MAC_OPENER)\n .otherwise(() => LINUX_OPENER)\n}\n\nfunction resolveBrowserVariable(ctx: PlatformContext): ResolvedOpener | undefined {\n const [command, ...commandArguments] = ctx.env[BROWSER_ENV_VARIABLE]?.trim().split(/\\s+/) ?? []\n if (command === undefined || command === '') return undefined\n return resolveOpener(ctx, { command, commandArguments })\n}\n\nfunction resolveOpener(ctx: PlatformContext, opener: Opener): ResolvedOpener | undefined {\n const executable = ctx.resolveBinary(opener.command)\n return executable === undefined ? undefined : { ...opener, executable }\n}\n","import type { IdentityClient } from '../../product/identity/identity-client'\nimport { buildIdentityPages } from '../../product/identity/pages/render-pages'\nimport type { InternalApiProxyClient } from '../../product/internal-api-proxy/internal-api-proxy-client'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Session } from '../../product/storage/session/session-store'\nimport {\n AuthorizationDeniedError,\n AuthorizationTimeoutError,\n LOOPBACK_HOST,\n startLocalAuthServer,\n type LocalAuthServer,\n} from '../../shared/oauth/local-auth-server'\nimport { BrowserOpenError, openBrowser, type BrowserSpawn } from '../../shared/platform/open-browser'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { describeError } from '../../shared/text/describe-error'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { MissingRefreshTokenError, toSession } from './session-refresh'\n\nconst SIGN_IN_DEADLINE_MS = 300_000\n\nconst WAITING_FOR_BROWSER = 'Waiting for the browser… (Esc to cancel sign-in)'\n\nexport const COULD_NOT_OPEN_BROWSER = 'Could not open a browser.'\n\nexport class LoginError extends Error {\n constructor(message: string, cause?: unknown) {\n super(message, { cause })\n this.name = 'LoginError'\n }\n}\n\nexport class LoginUnavailableError extends LoginError {\n constructor(message: string, cause: unknown) {\n super(message, cause)\n this.name = 'LoginUnavailableError'\n }\n}\n\nexport class LoginAbandonedError extends Error {\n constructor() {\n super('Sign-in cancelled.')\n this.name = 'LoginAbandonedError'\n }\n}\n\nexport class LoginTimeoutError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'LoginTimeoutError'\n }\n}\n\nexport type SignInParams = {\n ctx: PlatformContext\n ui: Pick<TerminalUi, 'spinner' | 'dim'>\n identity: IdentityClient\n internalApiProxy: InternalApiProxyClient\n masker: Masker\n spawn: BrowserSpawn\n now: () => Date\n deadlineMs?: number\n}\n\nexport function describeSignInLink(startUrl: string): string {\n return `If your browser did not open, go to ${startUrl}`\n}\n\n// The server starts before the wait so its link can show above the spinner; the wait's signal\n// reaches it through `stopServer`.\nexport async function signIn(params: SignInParams): Promise<Session> {\n const { ui, masker } = params\n const stopServer = new AbortController()\n const server = await listen({ ...params, signal: stopServer.signal })\n try {\n ui.dim(describeSignInLink(server.startUrl))\n const spinner = ui.spinner()\n spinner.start(WAITING_FOR_BROWSER)\n const waited = await spinner.waitForOrBack(async (signal) => {\n signal.addEventListener('abort', () => stopServer.abort(signal.reason), { once: true })\n return await authorize({ ...params, server, signal })\n })\n if (waited.kind === 'back') throw new LoginAbandonedError()\n\n spinner.stop(masker.maskText(`Signed in as ${waited.value.email}.`))\n return waited.value\n } finally {\n await server.close()\n }\n}\n\ntype AuthorizeParams = SignInParams & { server: LocalAuthServer; signal: AbortSignal }\n\nasync function authorize(params: AuthorizeParams): Promise<Session> {\n const { ctx, identity, internalApiProxy, spawn, now, server, signal } = params\n try {\n await openBrowser({ ctx, url: server.startUrl, spawn })\n const tokens = await identity.exchangeCode(await server.authorization, { signal })\n const profile = await internalApiProxy.withAccessToken(tokens.accessToken).readProfile({ signal })\n return toSession({ tokens, profile, now: now() })\n } catch (error) {\n throw toLoginError(error)\n }\n}\n\ntype ListenParams = SignInParams & { signal: AbortSignal }\n\nasync function listen({\n ctx,\n identity,\n signal,\n deadlineMs = SIGN_IN_DEADLINE_MS,\n}: ListenParams): Promise<LocalAuthServer> {\n try {\n return await startLocalAuthServer({\n pages: buildIdentityPages(ctx),\n buildAuthorizeUrl: (request) => identity.buildAuthorizeUrl(request),\n deadlineMs,\n signal,\n })\n } catch (error) {\n throw new LoginUnavailableError(\n `Could not start the local sign-in page on ${LOOPBACK_HOST}: ${describeError(error)}.`,\n error,\n )\n }\n}\n\nconst SIGN_IN_TIMED_OUT = 'Sign-in timed out.'\nconst NO_REFRESH_TOKEN =\n 'nexos.ai signed you in but did not let nexos-connect stay signed in, so it cannot create keys. ' +\n 'Please report this to nexos.ai.'\n\nfunction toLoginError(error: unknown): unknown {\n if (error instanceof BrowserOpenError) return new LoginUnavailableError(COULD_NOT_OPEN_BROWSER, error)\n if (error instanceof AuthorizationDeniedError) {\n return new LoginError(`Sign-in at nexos.ai did not finish: ${error.description ?? error.oauthError}.`, error)\n }\n if (error instanceof AuthorizationTimeoutError) return new LoginTimeoutError(SIGN_IN_TIMED_OUT)\n if (error instanceof MissingRefreshTokenError) return new LoginError(NO_REFRESH_TOKEN, error)\n return error\n}\n","import { IdentityError, type IdentityClient } from '../../product/identity/identity-client'\nimport { ApiKeyNameTakenError, type IssuedApiKey } from '../../product/internal-api-proxy/api-keys'\nimport type { InternalApiProxyClient } from '../../product/internal-api-proxy/internal-api-proxy-client'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Session, SessionStore } from '../../product/storage/session/session-store'\nimport { HttpStatusError, isTransportFailure } from '../../shared/http/request-errors'\nimport type { BrowserSpawn } from '../../shared/platform/open-browser'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport type { SignedInKey } from '../key/key-step'\nimport { defaultKeyName, type KeyNameChooser } from './key-name'\nimport { refreshSessionIfStale } from './session-refresh'\nimport { LoginError, LoginTimeoutError, signIn } from './sign-in'\n\nexport type LoginFlowDeps = {\n ctx: PlatformContext\n ui: Pick<TerminalUi, 'spinner' | 'log' | 'dim'>\n sessionStore: SessionStore\n identity: IdentityClient\n internalApiProxy: InternalApiProxyClient\n masker: Masker\n spawn: BrowserSpawn\n now: () => Date\n}\n\nexport type KeyReference = Pick<Session, 'keyId' | 'keyName'>\n\nexport type SignInAndCreateKeyParams = {\n deps: LoginFlowDeps\n keyName: KeyNameChooser\n previous: KeyReference | undefined\n}\n\n/** Saves the new session, but not the key: whether it replaces the saved one is the caller's to decide. */\nexport async function signInAndCreateKey({ deps, keyName, previous }: SignInAndCreateKeyParams): Promise<SignedInKey> {\n const session = carryKeyReference(await signIn(deps), previous)\n await deps.sessionStore.save(session)\n const naming = await nameKey(deps, keyName)\n return await createKeyForSession(deps, session, naming)\n}\n\n// The reference names the saved key, which signing in leaves as it is, whichever account signs in.\nexport function carryKeyReference(session: Session, previous: KeyReference | undefined): Session {\n if (previous?.keyId === undefined) return session\n\n return {\n ...session,\n keyId: previous.keyId,\n ...(previous.keyName === undefined ? {} : { keyName: previous.keyName }),\n }\n}\n\nexport type ReplaceKeyParams = { deps: LoginFlowDeps; session: Session; keyName: KeyNameChooser }\n\n/** Refreshes before asking for the name, so an expired session never costs the user a typed name. */\nexport async function replaceKey({ deps, session, keyName }: ReplaceKeyParams): Promise<SignedInKey> {\n const fresh = await refreshSessionIfStale({ ...deps, session, store: deps.sessionStore })\n const naming = await nameKey(deps, keyName)\n return await createKeyForSession(deps, fresh, naming)\n}\n\ntype KeyNaming = { chooser: KeyNameChooser; defaultName: string; chosenName: string }\n\nasync function nameKey(deps: LoginFlowDeps, chooser: KeyNameChooser): Promise<KeyNaming> {\n const defaultName = defaultKeyName({ hostname: deps.ctx.hostname, now: deps.now() })\n return { chooser, defaultName, chosenName: await chooser({ defaultName, takenName: undefined }) }\n}\n\nexport function isLoginFailure(error: unknown): error is Error {\n return (\n error instanceof LoginError ||\n error instanceof LoginTimeoutError ||\n error instanceof IdentityError ||\n error instanceof HttpStatusError ||\n isTransportFailure(error)\n )\n}\n\nasync function createKeyForSession(deps: LoginFlowDeps, session: Session, naming: KeyNaming): Promise<SignedInKey> {\n const created = await createApiKey(deps, naming)\n return { key: created.key, keyId: created.keyId, keyName: created.keyName, email: session.email }\n}\n\nasync function createApiKey(deps: LoginFlowDeps, naming: KeyNaming): Promise<IssuedApiKey> {\n try {\n return await deps.internalApiProxy.createApiKey(naming.chosenName)\n } catch (error) {\n if (!(error instanceof ApiKeyNameTakenError)) throw error\n const chosenName = await naming.chooser({ defaultName: naming.defaultName, takenName: error.keyName })\n return await createApiKey(deps, { ...naming, chosenName })\n }\n}\n","import type { Session, SessionStore } from '../../product/storage/session/session-store'\nimport type { CreatedKeyReference } from '../key/key-step'\n\n// The session names the saved key only while sign-in created it, so later questions and logout can name it.\nexport async function rememberSavedKey(\n sessionStore: SessionStore,\n created: CreatedKeyReference | undefined,\n): Promise<void> {\n const load = await sessionStore.load()\n if (load.kind !== 'session') return\n\n const session = withoutKeyReference(load.session)\n await sessionStore.save(\n created === undefined ? session : { ...session, keyId: created.keyId, keyName: created.keyName },\n )\n}\n\nfunction withoutKeyReference({ refreshToken, accessToken, accessTokenExpiresAt, email, userId }: Session): Session {\n return { refreshToken, accessToken, accessTokenExpiresAt, email, userId }\n}\n","import { IdentityError, type IdentityClient, type TokenTypeHint } from '../../product/identity/identity-client'\nimport type { Session } from '../../product/storage/session/session-store'\nimport { isTransportFailure } from '../../shared/http/request-errors'\n\nexport type RevokeSessionParams = { session: Session; identity: IdentityClient }\n\n/** Returns why the first token could not be revoked, or `undefined` once both were. */\nexport async function revokeSession({ session, identity }: RevokeSessionParams): Promise<string | undefined> {\n const tokens: ReadonlyArray<[TokenTypeHint, string]> = [\n ['refresh_token', session.refreshToken],\n ['access_token', session.accessToken],\n ]\n const failures: string[] = []\n for (const [tokenTypeHint, token] of tokens) {\n try {\n await identity.revokeToken(token, tokenTypeHint)\n } catch (error) {\n if (!(error instanceof IdentityError) && !isTransportFailure(error)) throw error\n failures.push(error.message)\n }\n }\n return failures[0]\n}\n","import { COMMAND_NAME, LOGOUT_COMMAND } from '../../cli/help'\nimport { ApiKeyNotFoundError } from '../../product/internal-api-proxy/api-keys'\nimport { API_KEYS_URL } from '../../product/public-api/desired-config'\nimport type { Session } from '../../product/storage/session/session-store'\nimport type { SignedInKey } from '../key/key-step'\nimport { carryKeyReference, type KeyReference, type LoginFlowDeps } from './login-flow'\nimport { signIn } from './sign-in'\n\nexport type KeyNotInAccountErrorParams = { keyId: string; email: string }\n\nexport class KeyNotInAccountError extends Error {\n constructor({ keyId, email }: KeyNotInAccountErrorParams) {\n super(\n `The nexos.ai account ${email} has no personal key with ID ${keyId}. ` +\n `Copy the ID of one of its keys from ${API_KEYS_URL}, or run \\`${COMMAND_NAME} ${LOGOUT_COMMAND}\\` ` +\n 'and try again to sign in with the account that owns the key.',\n )\n this.name = 'KeyNotInAccountError'\n }\n}\n\nexport type SignInAndRotateKeyParams = { deps: LoginFlowDeps; keyId: string; previous: KeyReference | undefined }\n\nexport async function signInAndRotateKey({ deps, keyId, previous }: SignInAndRotateKeyParams): Promise<SignedInKey> {\n const session = carryKeyReference(await signIn(deps), previous)\n await deps.sessionStore.save(session)\n return await rotateKeyForSession({ deps, session, keyId })\n}\n\nexport type RotateKeyForSessionParams = { deps: LoginFlowDeps; session: Session; keyId: string }\n\n// No spinner: it would let Esc cancel the run while the rotation is in flight, leaving its outcome unknown.\nexport async function rotateKeyForSession({ deps, session, keyId }: RotateKeyForSessionParams): Promise<SignedInKey> {\n deps.ui.dim(`Rotating key ${keyId}…`)\n try {\n const rotated = await deps.internalApiProxy.rotateApiKey(keyId)\n return { key: rotated.key, keyId: rotated.keyId, keyName: rotated.keyName, email: session.email }\n } catch (error) {\n if (error instanceof ApiKeyNotFoundError) throw new KeyNotInAccountError({ keyId, email: session.email })\n throw error\n }\n}\n","import type { EnvironmentInputs } from '../../cli/environment'\nimport { AUTH_HOST, createIdentityClient, type IdentityClient } from '../../product/identity/identity-client'\nimport {\n INTERNAL_API_PROXY_HOST,\n createInternalApiProxyClient,\n} from '../../product/internal-api-proxy/internal-api-proxy-client'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { LoginFlowDeps } from './login-flow'\nimport { authorizeWithSession } from './session-refresh'\n\nexport type ResolveIdentityParams = { environment: Pick<EnvironmentInputs, 'authHost'>; fetch: Fetch; masker: Masker }\n\nexport function resolveIdentity({ environment, fetch, masker }: ResolveIdentityParams): IdentityClient {\n return createIdentityClient({ host: environment.authHost ?? AUTH_HOST, fetch, masker })\n}\n\nexport type BuildLoginFlowDepsParams = {\n services: Omit<LoginFlowDeps, 'identity' | 'internalApiProxy'> & { fetch: Fetch }\n environment: Pick<EnvironmentInputs, 'authHost' | 'internalApiProxyHost'>\n}\n\nexport function buildLoginFlowDeps({\n services: { fetch, ...services },\n environment,\n}: BuildLoginFlowDepsParams): LoginFlowDeps {\n const { sessionStore, masker, now } = services\n const identity = resolveIdentity({ environment, fetch, masker })\n const host = environment.internalApiProxyHost ?? INTERNAL_API_PROXY_HOST\n const authorize = authorizeWithSession({ store: sessionStore, identity, now })\n return { ...services, identity, internalApiProxy: createInternalApiProxyClient({ host, fetch, masker, authorize }) }\n}\n","import { FailedRunError } from '../../cli/errors/failed-run-error'\nimport { UsageError } from '../../cli/errors/usage-error'\nimport {\n KeyRotationRefusedError,\n KeyRotationUnconfirmedError,\n NoPublicApiAccessError,\n} from '../../product/internal-api-proxy/api-keys'\nimport type { Session, SessionLoad } from '../../product/storage/session/session-store'\nimport { describeError } from '../../shared/text/describe-error'\nimport type { AccountOption } from '../../ui/prompts/key/account-option'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { CancelledError } from '../../ui/terminal/cancelled-error'\nimport type { AuthDeps, SignedInKey } from '../key/key-step'\nimport { keyNameChooser, type KeyNameChooser } from './key-name'\nimport { isLoginFailure, replaceKey, signInAndCreateKey, type KeyReference, type LoginFlowDeps } from './login-flow'\nimport { rememberSavedKey } from './remember-saved-key'\nimport { revokeSession } from './revoke-session'\nimport { KeyNotInAccountError, rotateKeyForSession, signInAndRotateKey } from './rotate-key'\nimport { SessionExpiredError } from './session-refresh'\nimport { LoginAbandonedError } from './sign-in'\nimport { buildLoginFlowDeps, type BuildLoginFlowDepsParams } from './sign-in-services'\n\nexport const UNREADABLE_SESSION_CLEARED = 'Your saved sign-in could not be read, so you are signed out on this machine.'\n\nexport const SESSION_EXPIRED = 'Your nexos.ai sign-in has expired — sign in again to create a key.'\n\nexport const SESSION_EXPIRED_SIGNING_IN = 'Your nexos.ai sign-in has expired — signing in again.'\n\nexport type KeyNameOptions = { keyName: string | undefined; shouldAssumeYes: boolean }\n\nexport type CreateSessionAuthParams = {\n services: BuildLoginFlowDepsParams['services'] & { ui: Pick<TerminalUi, 'askKeyName'> }\n environment: BuildLoginFlowDepsParams['environment']\n keyNameOptions: KeyNameOptions\n}\n\nexport function createSessionAuth({ services, environment, keyNameOptions }: CreateSessionAuthParams): AuthDeps {\n return createAuthDeps({\n deps: buildLoginFlowDeps({ services, environment }),\n keyName: keyNameChooser({ ...keyNameOptions, ui: services.ui }),\n // Replacing a rejected key asks nothing, so its name is chosen as under `--yes`.\n replacementKeyName: keyNameChooser({ keyName: keyNameOptions.keyName, shouldAssumeYes: true, ui: services.ui }),\n })\n}\n\nexport type CreateAuthDepsParams = {\n deps: LoginFlowDeps\n keyName: KeyNameChooser\n replacementKeyName: KeyNameChooser\n}\n\n/** A session that expired during the run is gone from the keychain, but it still names the saved key. */\ntype AuthState = { hasPublicApiAccess: boolean; isSessionReadable: boolean; expired: KeyReference | undefined }\n\nexport function createAuthDeps({ deps, keyName, replacementKeyName }: CreateAuthDepsParams): AuthDeps {\n const state: AuthState = { hasPublicApiAccess: true, isSessionReadable: true, expired: undefined }\n const attempt = async (create: () => Promise<SignedInKey | undefined>): Promise<SignedInKey | undefined> => {\n if (!isAccountUsable(state)) return undefined\n try {\n return await create()\n } catch (error) {\n if (!(error instanceof NoPublicApiAccessError)) throw error\n state.hasPublicApiAccess = false\n deps.ui.log.error(deps.masker.maskText(error.message))\n return undefined\n }\n }\n\n return {\n account: async () => await readAccount(deps, state),\n createKey: async () => await attempt(async () => await createKey({ deps, keyName, state })),\n replaceKey: async () =>\n await attempt(async () => await replaceKeyFromSession({ deps, keyName: replacementKeyName, state })),\n rotateKey: async (keyId) => await rotateKey({ deps, keyId, state }),\n savedKeyName: async () => (await readSavedKeyReference(deps, state))?.keyName,\n savedKeyId: async () => (await readSavedKeyReference(deps, state))?.keyId,\n rememberSavedKey: async (created) => await rememberSavedKey(deps.sessionStore, created),\n }\n}\n\nfunction isAccountUsable(state: AuthState): boolean {\n return state.hasPublicApiAccess && state.isSessionReadable\n}\n\nexport function describeUnreadableSession(reason: string): string {\n return `Your nexos.ai sign-in could not be read from the system keychain (${reason}), so signing in is off for this run.`\n}\n\nconst NO_SESSION: SessionLoad = { kind: 'none' }\n\nasync function readSession(deps: LoginFlowDeps, state: AuthState): Promise<SessionLoad> {\n if (!state.isSessionReadable) return NO_SESSION\n try {\n return await deps.sessionStore.load()\n } catch (error) {\n state.isSessionReadable = false\n deps.ui.dim(deps.masker.maskText(describeUnreadableSession(describeError(error))))\n return NO_SESSION\n }\n}\n\nasync function loadSession(deps: LoginFlowDeps, state: AuthState): Promise<Session | undefined> {\n const load = await readSession(deps, state)\n return load.kind === 'session' ? load.session : undefined\n}\n\nasync function readAccount(deps: LoginFlowDeps, state: AuthState): Promise<AccountOption | undefined> {\n if (!isAccountUsable(state)) return undefined\n const session = await loadSession(deps, state)\n if (!state.isSessionReadable) return undefined\n return session === undefined ? { kind: 'sign-in' } : { kind: 'session', email: deps.masker.maskText(session.email) }\n}\n\nasync function readSavedKeyReference(deps: LoginFlowDeps, state: AuthState): Promise<KeyReference | undefined> {\n return (await loadSession(deps, state)) ?? state.expired\n}\n\ntype CreateKeyParams = { deps: LoginFlowDeps; keyName: KeyNameChooser; state: AuthState }\n\nasync function createKey({ deps, keyName, state }: CreateKeyParams): Promise<SignedInKey | undefined> {\n const session = await loadSession(deps, state)\n if (!state.isSessionReadable) return undefined\n if (session !== undefined) return await createKeyFromSession({ deps, session, keyName, state })\n try {\n return await signInAndCreateKey({ deps, keyName, previous: state.expired })\n } catch (error) {\n if (error instanceof LoginAbandonedError) return undefined\n if (!isLoginFailure(error)) throw error\n deps.ui.log.warn(deps.masker.maskText(error.message))\n return undefined\n }\n}\n\nasync function replaceKeyFromSession({ deps, keyName, state }: CreateKeyParams): Promise<SignedInKey | undefined> {\n const load = await readSession(deps, state)\n if (load.kind === 'none') return undefined\n if (load.kind === 'corrupt') {\n await deps.sessionStore.clear()\n deps.ui.log.warn(UNREADABLE_SESSION_CLEARED)\n return undefined\n }\n\n return await createKeyFromSession({ deps, session: load.session, keyName, state })\n}\n\ntype CreateKeyFromSessionParams = CreateKeyParams & { session: Session }\n\nasync function createKeyFromSession({\n deps,\n session,\n keyName,\n state,\n}: CreateKeyFromSessionParams): Promise<SignedInKey | undefined> {\n deps.masker.registerSecrets([session.accessToken, session.refreshToken])\n try {\n return await replaceKey({ deps, session, keyName })\n } catch (error) {\n if (!(error instanceof SessionExpiredError)) return giveUpCreatingKey(deps, error)\n await forgetExpiredSession(deps, state, session)\n deps.ui.log.warn(SESSION_EXPIRED)\n return undefined\n }\n}\n\n// Best effort: the session goes either way. A refresh may have stored newer tokens before it expired, so those\n// are the ones revoked.\nasync function forgetExpiredSession(deps: LoginFlowDeps, state: AuthState, session: Session): Promise<void> {\n const latest = (await loadSession(deps, state)) ?? session\n deps.masker.registerSecrets([latest.accessToken, latest.refreshToken])\n await revokeSession({ session: latest, identity: deps.identity })\n await deps.sessionStore.clear()\n state.expired = latest\n}\n\ntype RotateKeyParams = { deps: LoginFlowDeps; keyId: string; state: AuthState }\n\nasync function rotateKey(params: RotateKeyParams): Promise<SignedInKey> {\n try {\n return await rotateKeyOrSignIn(params)\n } catch (error) {\n if (error instanceof LoginAbandonedError) throw new CancelledError()\n if (isOwnRotationFailure(error)) throw new FailedRunError(error.message)\n if (isLoginFailure(error) || error instanceof SessionExpiredError) {\n throw new FailedRunError(`Could not rotate key ${params.keyId}: ${error.message}`)\n }\n throw error\n }\n}\n\nfunction isOwnRotationFailure(error: unknown): error is Error {\n return (\n error instanceof KeyRotationRefusedError ||\n error instanceof KeyRotationUnconfirmedError ||\n error instanceof KeyNotInAccountError\n )\n}\n\nasync function rotateKeyOrSignIn({ deps, keyId, state }: RotateKeyParams): Promise<SignedInKey> {\n const session = await loadSession(deps, state)\n if (!state.isSessionReadable) {\n throw new FailedRunError(`Signing in is off for this run, so key ${keyId} was not rotated.`)\n }\n if (session !== undefined) {\n deps.masker.registerSecrets([session.accessToken, session.refreshToken])\n try {\n return await rotateKeyForSession({ deps, session, keyId })\n } catch (error) {\n if (!(error instanceof SessionExpiredError)) throw error\n await forgetExpiredSession(deps, state, session)\n deps.ui.log.warn(SESSION_EXPIRED_SIGNING_IN)\n }\n }\n\n if (!deps.ctx.isInteractive) throw new UsageError(describeSignInNeededToRotate(keyId))\n return await signInAndRotateKey({ deps, keyId, previous: state.expired })\n}\n\nexport function describeSignInNeededToRotate(keyId: string): string {\n return (\n `Rotating key ${keyId} needs a nexos.ai sign-in, and signing in needs a terminal. ` +\n 'Run this once in a terminal; later runs, CI included, reuse the sign-in.'\n )\n}\n\nfunction giveUpCreatingKey(deps: LoginFlowDeps, error: unknown): undefined {\n const { ui, masker } = deps\n if (isLoginFailure(error)) {\n ui.log.warn(masker.maskText(`Could not create a new key: ${error.message}`))\n return undefined\n }\n throw error\n}\n","import type { ConfigurableHarness } from '../../harnesses/harness'\nimport type { AgentConfig } from '../../harnesses/read-agent-config'\n\nexport type AgentWithConfig = { harness: ConfigurableHarness; current: AgentConfig }\n\nexport function readCurrentValue({ current }: AgentWithConfig, field: 'key' | 'model'): string | undefined {\n return current.kind === 'configured' ? current[field] : undefined\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport type { ConfigScope } from '../../../shared/platform/platform-context'\n\nexport const PROJECT_BACKUP_DIRECTORY = '.nexos-backup'\nexport const USER_BACKUP_DIRECTORY = path.join('.nexos', 'backups')\n\nexport function formatBackupTimestamp(now: Date): string {\n return now.toISOString().replace(/[:.]/g, '-')\n}\n\nexport type ResolveBackupRootParams = {\n scope: ConfigScope\n home: string\n cwd: string\n stamp: string\n backupDirectory: string | undefined\n}\n\nexport type BackupRoot = {\n path: string\n gitIgnoredDirectory: string | null\n}\n\nexport function resolveBackupRoot({ scope, home, cwd, stamp, backupDirectory }: ResolveBackupRootParams): BackupRoot {\n if (backupDirectory !== undefined) {\n return { path: path.join(path.resolve(cwd, backupDirectory), stamp), gitIgnoredDirectory: null }\n }\n return match(scope)\n .returnType<BackupRoot>()\n .with('user', () => ({ path: path.join(home, USER_BACKUP_DIRECTORY, stamp), gitIgnoredDirectory: null }))\n .with('project', () => {\n const directory = path.join(cwd, PROJECT_BACKUP_DIRECTORY)\n return { path: path.join(directory, stamp), gitIgnoredDirectory: directory }\n })\n .exhaustive()\n}\n","export function formatCount(count: number, noun: string): string {\n return `${count} ${noun}${count === 1 ? '' : 's'}`\n}\n","import pc from 'picocolors'\nimport { P, match } from 'ts-pattern'\nimport type { FilePlan } from '../../../flows/configure/configure-result'\nimport type { Masker } from '../../../product/secrets/masker'\nimport type { UserEnvironmentPlan } from '../../../product/storage/windows-environment/user-environment'\nimport type { ConfigScope } from '../../../shared/platform/platform-context'\nimport { displayPath } from '../../../shared/text/display-path'\nimport { formatCount } from '../../../shared/text/format-count'\nimport { countChangedLines, diffLines } from '../../diff/diff-lines'\nimport { renderDiff } from '../../diff/render-diff'\nimport { formatHeading } from '../format-heading'\nimport { formatUserEnvironmentPreview } from '../format-user-environment'\n\nexport type FormatPreviewParams = {\n changes: readonly FilePlan[]\n userEnvironment: UserEnvironmentPlan | null\n models: readonly string[]\n scope: ConfigScope\n hasFailedAgent: boolean\n home: string\n masker: Masker\n}\n\nconst NOTHING_TO_CHANGE = 'Nothing to change — every selected agent is already configured or was skipped.'\nconst NOTHING_TO_CHANGE_AFTER_FAILURE = 'Nothing to change — an agent failed while planning; the report below says why.'\n\nexport function formatPreview({\n changes,\n userEnvironment,\n models,\n scope,\n hasFailedAgent,\n home,\n masker,\n}: FormatPreviewParams): string[] {\n const heading = formatHeading(`Planned changes ${pc.dim(`(${describeScopeAndModel(scope, models, masker)})`)}`)\n const userEnvironmentLines = userEnvironment === null ? [] : formatUserEnvironmentPreview({ userEnvironment, masker })\n if (changes.length === 0 && userEnvironmentLines.length === 0) {\n const note = hasFailedAgent ? NOTHING_TO_CHANGE_AFTER_FAILURE : NOTHING_TO_CHANGE\n return [...heading, ` ${pc.dim(note)}`]\n }\n\n return [...heading, ...changes.flatMap((change) => formatFileDiff({ change, home, masker })), ...userEnvironmentLines]\n}\n\nexport type FormatFileDiffParams = { change: FilePlan; home: string; masker: Masker }\n\nexport function formatFileDiff({ change, home, masker }: FormatFileDiffParams): string[] {\n const diff = diffLines({ before: masker.maskText(change.before ?? ''), after: masker.maskText(change.after) })\n const lineCount = formatCount(countChangedLines(diff), 'line')\n const lineCountNote = change.before === null ? `new file, ${lineCount}` : lineCount\n return ['', ` ${pc.bold(displayPath(change.path, home))} ${pc.dim(`(${lineCountNote})`)}`, ...renderDiff(diff)]\n}\n\nfunction describeScopeAndModel(scope: ConfigScope, models: readonly string[], masker: Masker): string {\n return match(models)\n .with([P.string], ([model]) => `scope: ${scope}, model: ${masker.maskText(model)}`)\n .otherwise(() => `scope: ${scope}`)\n}\n","export type DiffLine = { kind: 'unchanged' | 'added' | 'removed'; text: string }\n\nexport type DiffLinesParams = { before: string; after: string }\n\nexport function diffLines({ before, after }: DiffLinesParams): DiffLine[] {\n const beforeLines = splitTerminatedLines(before)\n const afterLines = splitTerminatedLines(after)\n const table = buildCommonLengthTable({ beforeLines, afterLines })\n\n const diff: DiffLine[] = []\n let beforeIndex = 0\n let afterIndex = 0\n while (beforeIndex < beforeLines.length && afterIndex < afterLines.length) {\n const beforeLine = beforeLines[beforeIndex]!\n const afterLine = afterLines[afterIndex]!\n if (beforeLine === afterLine) {\n diff.push(toDiffLine('unchanged', beforeLine))\n beforeIndex++\n afterIndex++\n } else if (table[beforeIndex + 1]![afterIndex]! >= table[beforeIndex]![afterIndex + 1]!) {\n diff.push(toDiffLine('removed', beforeLine))\n beforeIndex++\n } else {\n diff.push(toDiffLine('added', afterLine))\n afterIndex++\n }\n }\n for (const line of beforeLines.slice(beforeIndex)) diff.push(toDiffLine('removed', line))\n for (const line of afterLines.slice(afterIndex)) diff.push(toDiffLine('added', line))\n return diff\n}\n\nexport function countChangedLines(lines: readonly DiffLine[]): number {\n return lines.filter((line) => line.kind !== 'unchanged').length\n}\n\nconst TERMINATED_LINE_PATTERN = /[^\\n]*\\n|[^\\n]+$/g\nconst LINE_TERMINATOR = '\\n'\n\nfunction splitTerminatedLines(text: string): string[] {\n return text.match(TERMINATED_LINE_PATTERN) ?? []\n}\n\nfunction toDiffLine(kind: DiffLine['kind'], line: string): DiffLine {\n return { kind, text: line.endsWith(LINE_TERMINATOR) ? line.slice(0, -LINE_TERMINATOR.length) : line }\n}\n\ntype BuildCommonLengthTableParams = { beforeLines: readonly string[]; afterLines: readonly string[] }\n\nfunction buildCommonLengthTable({ beforeLines, afterLines }: BuildCommonLengthTableParams): number[][] {\n const table = Array.from({ length: beforeLines.length + 1 }, () =>\n Array.from({ length: afterLines.length + 1 }, () => 0),\n )\n for (let beforeIndex = beforeLines.length - 1; beforeIndex >= 0; beforeIndex--) {\n for (let afterIndex = afterLines.length - 1; afterIndex >= 0; afterIndex--) {\n if (beforeLines[beforeIndex] === afterLines[afterIndex]) {\n table[beforeIndex]![afterIndex] = table[beforeIndex + 1]![afterIndex + 1]! + 1\n } else {\n table[beforeIndex]![afterIndex] = Math.max(\n table[beforeIndex + 1]![afterIndex]!,\n table[beforeIndex]![afterIndex + 1]!,\n )\n }\n }\n }\n return table\n}\n","import pc from 'picocolors'\nimport { match } from 'ts-pattern'\nimport { GLYPHS } from '../glyphs'\nimport type { DiffLine } from './diff-lines'\n\nconst DIFF_CONTEXT_LINES = 2\nconst ADDED_PREFIX = ' + '\nconst REMOVED_PREFIX = ' - '\nconst UNCHANGED_PREFIX = ' '\n\nexport function renderDiff(lines: readonly DiffLine[]): string[] {\n const visibleIndexes = findVisibleIndexes(lines)\n if (visibleIndexes.size === 0) return [pc.dim(`${UNCHANGED_PREFIX}(no change)`)]\n\n const rendered: string[] = []\n let isSkipping = false\n for (const [index, line] of lines.entries()) {\n if (visibleIndexes.has(index)) {\n rendered.push(renderLine(line))\n isSkipping = false\n continue\n }\n if (!isSkipping) rendered.push(pc.dim(`${UNCHANGED_PREFIX}${GLYPHS.elided}`))\n isSkipping = true\n }\n return rendered\n}\n\nfunction findVisibleIndexes(lines: readonly DiffLine[]): Set<number> {\n const visibleIndexes = new Set<number>()\n for (const [index, line] of lines.entries()) {\n if (line.kind === 'unchanged') continue\n const first = Math.max(0, index - DIFF_CONTEXT_LINES)\n const last = Math.min(lines.length - 1, index + DIFF_CONTEXT_LINES)\n for (let visibleIndex = first; visibleIndex <= last; visibleIndex++) visibleIndexes.add(visibleIndex)\n }\n return visibleIndexes\n}\n\nfunction renderLine(line: DiffLine): string {\n return match(line.kind)\n .with('added', () => pc.green(`${ADDED_PREFIX}${line.text}`))\n .with('removed', () => pc.red(`${REMOVED_PREFIX}${line.text}`))\n .with('unchanged', () => pc.dim(`${UNCHANGED_PREFIX}${line.text}`))\n .exhaustive()\n}\n","export const GLYPHS = {\n success: '✓',\n unchanged: '=',\n absent: '·',\n failure: '✗',\n warning: '!',\n next: '→',\n elided: '…',\n} as const\n","import pc from 'picocolors'\n\nexport function formatHeading(text: string): string[] {\n return ['', pc.bold(text)]\n}\n","import pc from 'picocolors'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { UserEnvironmentPlan } from '../../product/storage/windows-environment/user-environment'\nimport { INDENT } from './indent'\n\nexport type FormatUserEnvironmentParams = { userEnvironment: UserEnvironmentPlan; masker: Masker }\n\nconst HEADING = 'Windows user environment'\n\nexport function formatUserEnvironmentPreview({ userEnvironment, masker }: FormatUserEnvironmentParams): string[] {\n const lines = Object.entries(userEnvironment.after).flatMap(([name, value]) => {\n if (userEnvironment.before[name] === value) return []\n if (value === undefined) return [`${INDENT}${pc.red(`- ${name}`)}`]\n\n return [`${INDENT}${pc.green(`+ ${name}=${masker.maskText(value)}`)}`]\n })\n if (lines.length === 0) return []\n\n return ['', ` ${pc.bold(HEADING)}`, ...lines]\n}\n","export const INDENT = ' '\nexport const NESTED_INDENT = ' '\n\nexport type IndentLinesParams = { text: string; indent: string }\n\nexport function indentLines({ text, indent }: IndentLinesParams): string[] {\n const lines = text.endsWith('\\n') ? text.slice(0, -1).split('\\n') : text.split('\\n')\n return lines.map((line) => (line === '' ? '' : indent + line))\n}\n","import pc from 'picocolors'\nimport { P, match } from 'ts-pattern'\nimport {\n OUTCOME_KINDS,\n type EnvPlan,\n type HarnessOutcome,\n type OutcomeKind,\n type PlannedOutcome,\n} from '../../../flows/configure/configure-result'\nimport type { Masker } from '../../../product/secrets/masker'\nimport type { Shell } from '../../../product/storage/env-file/syntax/env-syntax'\nimport { ENV_SYNTAXES } from '../../../product/storage/env-file/syntax/env-syntaxes'\nimport type { UserEnvironmentPlan } from '../../../product/storage/windows-environment/user-environment'\nimport { escapePosixSingleQuoted } from '../../../shared/file-formats/shell/escape-posix-single-quoted'\nimport { escapePowerShellSingleQuoted } from '../../../shared/file-formats/shell/escape-powershell-single-quoted'\nimport { displayPath } from '../../../shared/text/display-path'\nimport { formatList } from '../../format-list'\nimport { GLYPHS } from '../../glyphs'\nimport { formatHeading } from '../format-heading'\nimport { INDENT, NESTED_INDENT, indentLines } from '../indent'\nimport { OUTCOME_STYLE } from '../outcome-style'\n\nexport type ResultMode = { kind: 'dry-run' } | { kind: 'written'; backupRoot: string | null }\n\nexport type RunHint = { binary: string; label: string; model: string }\n\nexport type FormatResultParams = {\n shell: Shell\n outcomes: readonly HarnessOutcome[]\n envFile: EnvPlan | null\n userEnvironment: UserEnvironmentPlan | null\n mode: ResultMode\n home: string\n masker: Masker\n runHints: readonly RunHint[]\n}\n\nexport function formatResult(params: FormatResultParams): string[] {\n const heading = params.mode.kind === 'dry-run' ? 'Result (dry run)' : 'Result'\n return [\n ...formatHeading(heading),\n ...params.outcomes.flatMap((outcome) => formatOutcome(outcome, params)),\n ...formatLoadStep(params),\n ...formatBackups(params),\n ...formatSummary(params.outcomes),\n ...formatRunHints(params),\n ]\n}\n\nfunction formatOutcome(outcome: HarnessOutcome, params: FormatResultParams): string[] {\n const { masker } = params\n const style = OUTCOME_STYLE[outcome.kind]\n const body = match(outcome)\n .with({ kind: P.union('updated', 'unchanged') }, (planned) => formatPlannedOutcome(planned, params))\n .with({ kind: 'not-found' }, ({ detail }) => [`${INDENT}${pc.dim(masker.maskText(detail))}`])\n .with({ kind: 'unsupported' }, ({ harness }) => [`${INDENT}${pc.dim(harness.reason)}`])\n .with({ kind: 'failed' }, ({ error }) => [`${INDENT}${pc.red(masker.maskText(error))}`])\n .exhaustive()\n return ['', ` ${style.colour(`${style.glyph} ${outcome.harness.label} — ${style.label}`)}`, ...body]\n}\n\nfunction formatPlannedOutcome(outcome: PlannedOutcome, { envFile, home, masker }: FormatResultParams): string[] {\n return [\n `${INDENT}${pc.dim(masker.maskText(outcome.detail))}`,\n ...outcome.warnings.map((warning) => `${INDENT}${pc.yellow(`${GLYPHS.warning} ${masker.maskText(warning)}`)}`),\n ...outcome.files.filter((file) => file.isChanged).flatMap((file) => formatResultingFile(file.after, masker)),\n ...(envFile === null ? [] : formatEnvVariables({ outcome, envFile, home, masker })),\n ...formatPostSetupNotes(outcome, masker),\n ]\n}\n\nfunction formatResultingFile(content: string, masker: Masker): string[] {\n return [\n `${INDENT}${pc.dim('resulting file:')}`,\n ...indentLines({ text: masker.maskText(content), indent: NESTED_INDENT }),\n ]\n}\n\ntype FormatEnvVariablesParams = { outcome: PlannedOutcome; envFile: EnvPlan; home: string; masker: Masker }\n\nfunction formatEnvVariables({ outcome, envFile, home, masker }: FormatEnvVariablesParams): string[] {\n const variables = Object.entries(outcome.envVariables).flatMap(([name, value]) =>\n value === undefined ? [] : [[name, value] as const],\n )\n if (variables.length === 0) return []\n\n const syntax = ENV_SYNTAXES[envFile.shell]\n return [\n `${INDENT}${pc.dim(`variables in ${displayPath(envFile.path, home)}:`)}`,\n ...variables.map(([name, value]) => `${NESTED_INDENT}${masker.maskText(syntax.formatAssignment({ name, value }))}`),\n ]\n}\n\nfunction formatPostSetupNotes({ kind, harness, model }: PlannedOutcome, masker: Masker): string[] {\n const notes =\n kind === 'unchanged'\n ? [harness.postSetupNote?.(model)]\n : [...(harness.postSetupNotes ?? []), harness.postSetupNote?.(model)]\n return notes\n .filter((note): note is string => note !== undefined)\n .map((note) => `${INDENT}${pc.cyan(`${GLYPHS.next} ${masker.maskText(note)}`)}`)\n}\n\nfunction formatLoadStep({ outcomes, envFile, userEnvironment, mode }: FormatResultParams): string[] {\n if (mode.kind === 'dry-run') return []\n\n const hasEnvFileChange = envFile !== null && envFile.isChanged\n if (userEnvironment === null && !hasEnvFileChange) return []\n\n const readers = outcomes\n .filter((outcome) => outcome.kind === 'updated' && Object.keys(outcome.envVariables).length > 0)\n .map((outcome) => outcome.harness.label)\n if (readers.length === 0 || envFile === null) return []\n\n const [verb, pronoun] = readers.length === 1 ? ['reads', 'it'] : ['read', 'they']\n const { loadCommand } = ENV_SYNTAXES[envFile.shell]\n if (userEnvironment !== null) {\n return [\n ...formatHeading('One more step'),\n ` ${formatList(readers)} ${verb} the key from the environment. Open a new terminal to pick it up.`,\n ` ${pc.dim('Or load it now for this session:')}`,\n `${INDENT}${pc.bold(loadCommand)}`,\n ]\n }\n\n return [\n ...formatHeading('One more step'),\n ` ${formatList(readers)} ${verb} the key from the environment. Load it with:`,\n `${INDENT}${pc.bold(loadCommand)}`,\n ` ${pc.dim(`Until then ${pronoun} will not see the key.`)}`,\n ...match(envFile.shell)\n .with('powershell', () => [\n ` ${pc.dim('That lasts for this session only. Add the same line to $PROFILE to keep it.')}`,\n ])\n .with('posix', () => [])\n .exhaustive(),\n ]\n}\n\nfunction formatBackups({ mode, home, masker }: FormatResultParams): string[] {\n if (mode.kind === 'dry-run' || mode.backupRoot === null) return []\n\n const backupRoot = masker.maskText(displayPath(mode.backupRoot, home))\n return [...formatHeading('Backups'), ` Originals copied to ${pc.bold(backupRoot)}`]\n}\n\nfunction formatSummary(outcomes: readonly HarnessOutcome[]): string[] {\n const countsByKind = new Map<OutcomeKind, number>()\n for (const { kind } of outcomes) countsByKind.set(kind, (countsByKind.get(kind) ?? 0) + 1)\n\n const counts = OUTCOME_KINDS.map((kind) => `${countsByKind.get(kind) ?? 0} ${OUTCOME_STYLE[kind].label}`)\n return [...formatHeading('Summary'), ` ${counts.join(', ')}`]\n}\n\nfunction formatRunHints({ runHints, mode, shell, masker }: FormatResultParams): string[] {\n if (mode.kind !== 'written' || runHints.length === 0) return []\n\n return ['', \"You're all set up.\", ...runHints.map((runHint) => formatRunHint({ runHint, shell, masker }))]\n}\n\ntype FormatRunHintParams = { runHint: RunHint; shell: Shell; masker: Masker }\n\nfunction formatRunHint({ runHint: { binary, label, model }, shell, masker }: FormatRunHintParams): string {\n const command = binary === 'codex' ? `${binary} ${formatModelOverride(model, shell)}` : binary\n return ` Run ${pc.bold(masker.maskText(command))} to use ${label} with the nexos.ai Gateway.`\n}\n\nfunction formatModelOverride(model: string, shell: Shell): string {\n const quotedValue = JSON.stringify(model)\n const escapedValue = match(shell)\n .with('posix', () => escapePosixSingleQuoted(`model=${quotedValue}`))\n .with('powershell', () => escapePowerShellSingleQuoted(`model=${quotedValue}`))\n .exhaustive()\n return `-c '${escapedValue}'`\n}\n","import type { ConfigurableHarness, Harness, UnsupportedHarness } from '../../harnesses/harness'\nimport type { EnvFileVariables } from '../../product/storage/env-file/render-env-file'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport type { RecordedKey } from '../../product/storage/restore-record/restore-record'\nimport type { ConfigFormat } from '../../shared/file-formats/config-format'\n\nexport type FilePlan = { path: string; before: string | null; after: string; isChanged: boolean }\n\nexport type HarnessFilePlan = FilePlan & {\n hasSecret: boolean\n format: ConfigFormat\n originals: readonly RecordedKey[]\n}\n\nexport type EnvPlan = FilePlan & { shell: Shell }\n\nexport const OUTCOME_KINDS = ['updated', 'unchanged', 'not-found', 'unsupported', 'failed'] as const\n\nexport type OutcomeKind = (typeof OUTCOME_KINDS)[number]\n\nexport type PlannedOutcome = {\n kind: 'updated' | 'unchanged'\n harness: ConfigurableHarness\n model: string\n detail: string\n files: readonly HarnessFilePlan[]\n envVariables: EnvFileVariables\n warnings: readonly string[]\n}\n\nexport type NotFoundOutcome = { kind: 'not-found'; harness: Harness; detail: string }\n\nexport type UnsupportedOutcome = { kind: 'unsupported'; harness: UnsupportedHarness }\n\nexport type FailedOutcome = { kind: 'failed'; harness: Harness; error: string }\n\nexport type HarnessOutcome = PlannedOutcome | NotFoundOutcome | UnsupportedOutcome | FailedOutcome\n\nexport function isPlanned(outcome: HarnessOutcome): outcome is PlannedOutcome {\n return outcome.kind === 'updated' || outcome.kind === 'unchanged'\n}\n\nexport function hasFailedOutcome(outcomes: readonly HarnessOutcome[]): boolean {\n return outcomes.some((outcome) => outcome.kind === 'failed')\n}\n","import { match } from 'ts-pattern'\nimport type { EnvSyntax, Shell } from './env-syntax'\nimport { POSIX_ENV_SYNTAX } from './posix-env-syntax'\nimport { POWERSHELL_ENV_SYNTAX } from './powershell-env-syntax'\n\nexport const ENV_SYNTAXES: Readonly<Record<Shell, EnvSyntax>> = {\n posix: POSIX_ENV_SYNTAX,\n powershell: POWERSHELL_ENV_SYNTAX,\n}\n\nexport function resolveShell(platform: NodeJS.Platform): Shell {\n return match(platform)\n .returnType<Shell>()\n .with('win32', () => 'powershell')\n .otherwise(() => 'posix')\n}\n","import path from 'node:path'\nimport { escapePosixSingleQuoted } from '../../../../shared/file-formats/shell/escape-posix-single-quoted'\nimport { createAssignmentMatcher, ENV_DIRECTORY_NAME, formatHeaderLines, type EnvSyntax } from './env-syntax'\n\nconst POSIX_FILE_NAME = 'env'\nconst POSIX_ASSIGNMENT = /^\\s*(?:export\\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.*)$/\nconst POSIX_LOAD_COMMAND = `source ${path.posix.join('~', ENV_DIRECTORY_NAME, POSIX_FILE_NAME)}`\n\nexport const POSIX_ENV_SYNTAX: EnvSyntax = {\n fileName: POSIX_FILE_NAME,\n defaultLineEnding: '\\n',\n headerLines: formatHeaderLines(`# Load in your shell with: ${POSIX_LOAD_COMMAND}`),\n normalizeName: (name) => name,\n matchAssignment: createAssignmentMatcher(POSIX_ASSIGNMENT),\n formatAssignment: ({ name, value }) => `export ${name}=${quotePosixValue(value)}`,\n parseValue: parsePosixValue,\n loadCommand: POSIX_LOAD_COMMAND,\n}\n\nconst SHELL_SAFE_VALUE = /^[A-Za-z0-9_./:@+-]*$/\n\nfunction quotePosixValue(value: string): string {\n if (SHELL_SAFE_VALUE.test(value)) return value\n return `'${escapePosixSingleQuoted(value)}'`\n}\n\nconst POSIX_WORD_SEGMENT = /'([^']*)'|\"((?:[^\"\\\\$`]|\\\\.)*)\"|\\\\(.)|([^\\s'\"\\\\$`;&|<>()]+)/gy\nconst DOUBLE_QUOTED_ESCAPE = /\\\\([$`\"\\\\])/g\nconst BLANK_OR_COMMENT = /^(?:\\s+(?:#.*)?)?$/\n\nfunction parsePosixValue(rawValue: string): string | undefined {\n const segments = [...rawValue.matchAll(POSIX_WORD_SEGMENT)]\n const wordLength = segments.reduce((length, segment) => length + segment[0].length, 0)\n if (!BLANK_OR_COMMENT.test(rawValue.slice(wordLength))) return undefined\n\n return segments.map(decodePosixSegment).join('')\n}\n\nfunction decodePosixSegment([, singleQuoted, doubleQuoted, escaped, bare]: RegExpExecArray): string {\n if (doubleQuoted !== undefined) return doubleQuoted.replace(DOUBLE_QUOTED_ESCAPE, '$1')\n return singleQuoted ?? escaped ?? bare ?? ''\n}\n","import type { LineEnding } from '../../../../shared/file-formats/detect-line-ending'\n\nexport const SHELLS = ['posix', 'powershell'] as const\n\nexport type Shell = (typeof SHELLS)[number]\n\nexport type Assignment = { name: string; rawValue: string }\n\nexport type EnvVariable = { name: string; value: string }\n\nexport interface EnvSyntax {\n readonly fileName: string\n readonly defaultLineEnding: LineEnding\n readonly headerLines: readonly string[]\n normalizeName(name: string): string\n matchAssignment(line: string): Assignment | undefined\n formatAssignment(variable: EnvVariable): string\n parseValue(rawValue: string): string | undefined\n readonly loadCommand: string\n}\n\nexport const ENV_DIRECTORY_NAME = '.nexos'\n\nexport const ENV_VARIABLE_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/\n\nconst MANAGED_HEADER_LINE = '# nexos.ai Gateway — managed by nexos-connect.'\nconst PRESERVED_HEADER_LINES = [\n '# Hand-added entries are preserved; re-running nexos-connect updates the',\n '# variables it owns and leaves everything else alone.',\n] as const\n\n/** Re-renders recognise a header by these exact lines, so rewording one orphans it in every existing file. */\nexport function formatHeaderLines(loadInstruction: string): readonly string[] {\n return [MANAGED_HEADER_LINE, loadInstruction, ...PRESERVED_HEADER_LINES]\n}\n\nexport function createAssignmentMatcher(pattern: RegExp): EnvSyntax['matchAssignment'] {\n return (line) => {\n const [, name, rawValue] = pattern.exec(line) ?? []\n if (name === undefined || rawValue === undefined) return undefined\n return { name, rawValue }\n }\n}\n","import path from 'node:path'\nimport {\n escapePowerShellSingleQuoted,\n POWERSHELL_SINGLE_QUOTES as SINGLE_QUOTES,\n} from '../../../../shared/file-formats/shell/escape-powershell-single-quoted'\nimport { createAssignmentMatcher, ENV_DIRECTORY_NAME, formatHeaderLines, type EnvSyntax } from './env-syntax'\n\nconst POWERSHELL_FILE_NAME = 'env.ps1'\nconst POWERSHELL_ASSIGNMENT = /^\\s*\\$\\{?[Ee][Nn][Vv]:([A-Za-z_][A-Za-z0-9_]*)\\}?\\s*=\\s*(.*)$/\n\n// `$HOME`, not `~`: PowerShell resolves `~` against the current provider's home, which may not be the user's.\nconst POWERSHELL_LOAD_COMMAND = `. \"${path.win32.join('$HOME', ENV_DIRECTORY_NAME, POWERSHELL_FILE_NAME)}\"`\n\nexport const POWERSHELL_ENV_SYNTAX: EnvSyntax = {\n fileName: POWERSHELL_FILE_NAME,\n defaultLineEnding: '\\r\\n',\n headerLines: formatHeaderLines(`# Load in your PowerShell session with: ${POWERSHELL_LOAD_COMMAND}`),\n normalizeName: (name) => name.toUpperCase(),\n matchAssignment: createAssignmentMatcher(POWERSHELL_ASSIGNMENT),\n // Always quoted: a bare `https://…` is a parse error in PowerShell, and single quotes stop interpolation.\n formatAssignment: ({ name, value }) => `$env:${name} = '${escapePowerShellSingleQuoted(value)}'`,\n parseValue: parsePowerShellValue,\n loadCommand: POWERSHELL_LOAD_COMMAND,\n}\n\nconst TRAILING_COMMENT = String.raw`\\s*(?:#.*)?$`\nconst SINGLE_QUOTED_VALUE = new RegExp(\n `^[${SINGLE_QUOTES}]((?:[^${SINGLE_QUOTES}]|[${SINGLE_QUOTES}]{2})*)[${SINGLE_QUOTES}]${TRAILING_COMMENT}`,\n)\nconst ESCAPED_SINGLE_QUOTE = new RegExp(`[${SINGLE_QUOTES}]([${SINGLE_QUOTES}])`, 'g')\nconst DOUBLE_QUOTED_VALUE = new RegExp(`^\"((?:[^\"$\\`]|\"\")*)\"${TRAILING_COMMENT}`)\nconst ESCAPED_DOUBLE_QUOTE = /\"\"/g\n\nfunction parsePowerShellValue(rawValue: string): string | undefined {\n const [, singleQuoted] = SINGLE_QUOTED_VALUE.exec(rawValue) ?? []\n if (singleQuoted !== undefined) return singleQuoted.replace(ESCAPED_SINGLE_QUOTE, '$1')\n\n const [, doubleQuoted] = DOUBLE_QUOTED_VALUE.exec(rawValue) ?? []\n return doubleQuoted?.replace(ESCAPED_DOUBLE_QUOTE, '\"')\n}\n","import { formatCount } from '../shared/text/format-count'\n\nexport function formatList(items: readonly string[]): string {\n if (items.length <= 1) return items.join('')\n\n return `${items.slice(0, -1).join(', ')} and ${items.at(-1)}`\n}\n\nconst MAX_LISTED_ITEMS = 2\n\nexport type FormatListOrCountParams = { items: readonly string[]; count: number; noun: string }\n\n/** A hint naming more than two agents would wrap its row in an ordinary terminal. */\nexport function formatListOrCount({ items, count, noun }: FormatListOrCountParams): string {\n return items.length <= MAX_LISTED_ITEMS ? formatList(items) : formatCount(count, noun)\n}\n","import pc from 'picocolors'\nimport type { OutcomeKind } from '../../flows/configure/configure-result'\nimport { GLYPHS } from '../glyphs'\n\nexport type StatusStyle = { glyph: string; colour: (text: string) => string; label: string }\n\nexport const OUTCOME_STYLE: Readonly<Record<OutcomeKind, StatusStyle>> = {\n updated: { glyph: GLYPHS.success, colour: pc.green, label: 'updated' },\n unchanged: { glyph: GLYPHS.unchanged, colour: pc.green, label: 'already configured' },\n 'not-found': { glyph: GLYPHS.absent, colour: pc.dim, label: 'not found' },\n unsupported: { glyph: GLYPHS.failure, colour: pc.yellow, label: 'not configurable' },\n failed: { glyph: GLYPHS.failure, colour: pc.red, label: 'failed' },\n}\n","import { match, P } from 'ts-pattern'\nimport * as v from 'valibot'\nimport { UsageError } from '../../cli/errors/usage-error'\nimport { COMMAND_NAME, LOGIN_COMMAND } from '../../cli/help'\nimport { FORGET_KEY_COMMAND } from '../../cli/parse-cli-arguments'\nimport { KEY_ID_ON_DRY_RUN } from '../../cli/parse-key-id'\nimport { API_KEYS_URL } from '../../product/public-api/desired-config'\nimport type { ProbeResult } from '../../product/public-api/probes/probe-result'\nimport { KEY_PREFIXES, hasKnownKeyPrefix } from '../../product/secrets/key-prefix'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Availability } from '../../product/storage/keychain/keychain'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport { describeError } from '../../shared/text/describe-error'\nimport { hasLineBreak } from '../../shared/text/has-line-break'\nimport type { AccountOption } from '../../ui/prompts/key/account-option'\nimport type { ChooseKeySourceParams, CurrentKeyOffer, KeySourceChoice } from '../../ui/prompts/key/choose-key-source'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { CancelledError } from '../../ui/terminal/cancelled-error'\nimport type { ExistingKeys } from './find-existing-keys'\nimport {\n buildKeyOffers,\n buildNewKeyOffers,\n buildStoredKeyOffers,\n listOfferedKeys,\n type BuildStoredKeyOffersParams,\n type CurrentKeys,\n type InUseKeyOffer,\n type KeyOffer,\n type StoredKeyOffer,\n} from './key-offers'\n\nexport type KeySource = 'flag' | 'env' | 'saved' | 'pasted' | 'reused' | 'signed-in'\n\nexport type ResolvedKey = {\n key: string\n source: KeySource\n shouldSave: boolean\n /** Set when sign-in created the key: saving it moves the session's reference to it. */\n createdKey?: CreatedKeyReference\n /** The working key that saving this one replaces, for the line that says it is still active. */\n replacedKeyLabel?: string\n}\n\nexport type CheckOutcome = 'passed' | 'failed' | 'skipped'\n\nexport type KeyStepInput = {\n flagKey: string | undefined\n keyId: string | undefined\n envKey: string | undefined\n shouldSaveKey: boolean\n shouldAssumeYes: boolean\n isDryRun: boolean\n existingKeys(): ExistingKeys\n destination: string\n}\n\nexport type SignedInKey = { key: string; keyId: string; keyName: string; email: string }\n\nexport type CreatedKeyReference = Pick<SignedInKey, 'keyId' | 'keyName'>\n\nexport type AuthDeps = {\n account(): Promise<AccountOption | undefined>\n createKey(): Promise<SignedInKey | undefined>\n replaceKey(): Promise<SignedInKey | undefined>\n rotateKey(keyId: string): Promise<SignedInKey>\n savedKeyName(): Promise<string | undefined>\n savedKeyId(): Promise<string | undefined>\n rememberSavedKey(created: CreatedKeyReference | undefined): Promise<void>\n}\n\nexport type KeyStepDeps = { keystore: Keystore; ui: TerminalUi; masker: Masker; auth?: AuthDeps }\n\nexport type KeyStepRun = { input: KeyStepInput; deps: KeyStepDeps; resolved: ResolvedKey }\n\nexport type KeyChoice = { kind: 'one'; resolved: ResolvedKey } | { kind: 'each-current' }\n\nexport async function resolveKey(input: KeyStepInput, deps: KeyStepDeps): Promise<ResolvedKey> {\n return await resolveFromOffers<NoKeepOffer>({ input, deps, listOffers: buildStoredKeyOffers })\n}\n\nconst SAVE_KEY_ON_KEEP_WARNING =\n '--save-key saved nothing: the agents keep their current keys. Pick or paste a key to save one.'\n\nexport async function resolveKeyChoice(\n input: KeyStepInput,\n currentKeys: CurrentKeys,\n deps: KeyStepDeps,\n): Promise<KeyChoice> {\n const chosen = await resolveFromOffers<KeepOffer>({\n input,\n deps,\n listOffers: (stored) => buildKeyOffers({ currentKeys, ...stored }),\n })\n if ('source' in chosen) return { kind: 'one', resolved: chosen }\n\n if (input.shouldSaveKey) deps.ui.log.warn(SAVE_KEY_ON_KEEP_WARNING)\n return { kind: 'each-current' }\n}\n\n/**\n * Only --key or the picker changes a key: never $NEXOS_API_KEY, which Codex's env file exports, and never a stored\n * key under --yes.\n */\nexport async function resolveNewKey(\n input: KeyStepInput,\n currentKeys: CurrentKeys,\n deps: KeyStepDeps,\n): Promise<ResolvedKey> {\n const supplied = await resolveSuppliedKey({ ...input, envKey: undefined }, deps)\n if (supplied !== undefined) return supplied\n\n const { availability, saved } = await loadStoredKey(deps)\n const offers = buildNewKeyOffers({ currentKeys, saved })\n return await chooseKey<NoKeepOffer>({\n input,\n deps,\n availability,\n saved: savedFrom(saved),\n offers,\n hasStoredKey: false,\n })\n}\n\ntype KeepOffer = Extract<KeyOffer, { kind: 'keep' | 'keep-each' }>\n\ntype NoKeepOffer = never\n\ntype OneKeyOffer = Exclude<KeyOffer, KeepOffer>\n\ntype ResolveFromOffersParams<Kept extends KeepOffer> = {\n input: KeyStepInput\n deps: KeyStepDeps\n listOffers: (stored: BuildStoredKeyOffersParams) => readonly (OneKeyOffer | Kept)[]\n}\n\nasync function resolveFromOffers<Kept extends KeepOffer>({\n input,\n deps,\n listOffers,\n}: ResolveFromOffersParams<Kept>): Promise<ResolvedKey | Kept> {\n const supplied = await resolveSuppliedKey(input, deps)\n if (supplied !== undefined) return supplied\n\n const { availability, saved } = await loadStoredKey(deps)\n const stored = { saved, found: saved === undefined ? input.existingKeys().offered : undefined }\n const assumable = assumeStoredKey(stored)\n if (input.shouldAssumeYes && assumable !== undefined) return assumable\n\n const offers = listOffers(stored)\n const hasStoredKey = assumable !== undefined\n return await chooseKey({ input, deps, availability, saved: savedFrom(saved), offers, hasStoredKey })\n}\n\ntype StoredKey = { availability: Availability; saved: string | undefined }\n\nasync function loadStoredKey(deps: KeyStepDeps): Promise<StoredKey> {\n const availability = await deps.keystore.availability()\n return { availability, saved: availability.kind === 'available' ? await loadSaved(deps) : undefined }\n}\n\nasync function resolveSuppliedKey(input: KeyStepInput, deps: KeyStepDeps): Promise<ResolvedKey | undefined> {\n if (input.shouldSaveKey) {\n const availability = await deps.keystore.availability()\n if (availability.kind === 'unavailable') throw new UsageError(`--save-key can't be used: ${availability.reason}.`)\n }\n if (input.flagKey !== undefined) return await resolveGivenKey({ key: input.flagKey, source: 'flag', input, deps })\n if (input.keyId !== undefined) return await resolveRotatedKey({ keyId: input.keyId, input, deps })\n if (input.envKey !== undefined) return await resolveGivenKey({ key: input.envKey, source: 'env', input, deps })\n return undefined\n}\n\ntype ResolveGivenKeyParams = { key: string; source: 'flag' | 'env'; input: KeyStepInput; deps: KeyStepDeps }\n\nasync function resolveGivenKey({ key, source, input, deps }: ResolveGivenKeyParams): Promise<ResolvedKey> {\n if (!input.shouldSaveKey) return { key, source, shouldSave: false }\n\n const saved = await loadSaved(deps)\n if (saved === undefined || saved === key) return { key, source, shouldSave: true }\n return { key, source, shouldSave: true, replacedKeyLabel: await labelOf(saved, deps) }\n}\n\ntype ResolveRotatedKeyParams = { keyId: string; input: KeyStepInput; deps: KeyStepDeps }\n\nasync function resolveRotatedKey({ keyId, input, deps }: ResolveRotatedKeyParams): Promise<ResolvedKey> {\n const availability = await deps.keystore.availability()\n if (availability.kind === 'unavailable') throw new UsageError(`--key-id can't be used: ${availability.reason}.`)\n const auth = findUsableAuth(input, deps, availability)\n if (auth === undefined) throw new UsageError(KEY_ID_ON_DRY_RUN)\n\n await confirmRotation({ keyId, input, deps })\n const rotated = await auth.rotateKey(keyId)\n deps.ui.log.success(deps.masker.maskText(`Rotated key \"${rotated.keyName}\".`))\n const saved = await findSavedKey({ deps, auth, rotatedKeyId: keyId })\n return await adoptSignedIn({ created: rotated, input, deps, availability, saved })\n}\n\nasync function confirmRotation({ keyId, input, deps }: ResolveRotatedKeyParams): Promise<void> {\n deps.ui.log.warn(`Key ${keyId} will be rotated: its current value stops working at once, wherever it is used.`)\n if (input.shouldAssumeYes) return\n if (!(await deps.ui.confirm(`Rotate key ${keyId}?`, false))) throw new CancelledError()\n}\n\ntype FindSavedKeyParams = { deps: KeyStepDeps; auth: AuthDeps; rotatedKeyId: string }\n\nasync function findSavedKey({ deps, auth, rotatedKeyId }: FindSavedKeyParams): Promise<SavedKey> {\n const saved = await loadSaved(deps)\n if (saved === undefined) return NO_SAVED_KEY\n\n return { kind: (await auth.savedKeyId()) === rotatedKeyId ? 'rotated' : 'working', key: saved }\n}\n\nconst SavedKeySchema = v.pipe(\n v.string(),\n v.trim(),\n v.nonEmpty(),\n v.check((key) => !hasLineBreak(key)),\n)\n\nconst FORGET_KEY_HINT = `${COMMAND_NAME} ${FORGET_KEY_COMMAND}`\nconst LOGIN_HINT = `${COMMAND_NAME} ${LOGIN_COMMAND}`\n\nasync function loadSaved({ keystore, ui, masker }: KeyStepDeps): Promise<string | undefined> {\n let saved: string | undefined\n try {\n saved = await keystore.load()\n } catch (error) {\n ui.dim(\n masker.maskText(\n `Could not read the saved key from your system keychain: ${describeError(error)}. ` +\n `Run \\`${FORGET_KEY_HINT}\\` if this keeps happening.`,\n ),\n )\n return undefined\n }\n if (saved === undefined) return undefined\n\n const parsed = v.safeParse(SavedKeySchema, saved)\n if (!parsed.success) {\n ui.dim(`The saved key is not usable. Run \\`${FORGET_KEY_HINT}\\` and save it again.`)\n return undefined\n }\n masker.registerSecrets([parsed.output])\n return parsed.output\n}\n\nexport type LabelSavedKeyParams = { key: string; keyName: string | undefined; masker: Masker }\n\n/** Register `key` with the masker first: an unprefixed key is masked only once registered. */\nexport function labelSavedKey({ key, keyName, masker }: LabelSavedKeyParams): string {\n return keyName ?? masker.maskText(key)\n}\n\nasync function labelOf(saved: string, deps: KeyStepDeps): Promise<string> {\n return labelSavedKey({ key: saved, keyName: await deps.auth?.savedKeyName(), masker: deps.masker })\n}\n\nfunction assumeStoredKey({ saved, found }: BuildStoredKeyOffersParams): ResolvedKey | undefined {\n if (saved !== undefined) return { key: saved, source: 'saved', shouldSave: false }\n if (found !== undefined) return { key: found, source: 'reused', shouldSave: false }\n return undefined\n}\n\ntype ChooseKeyParams<Kept extends KeepOffer> = SaveContext & {\n offers: readonly (OneKeyOffer | Kept)[]\n initialChoice?: ChooseKeySourceParams['initialChoice']\n hasStoredKey: boolean\n}\n\nasync function chooseKey<Kept extends KeepOffer>(params: ChooseKeyParams<Kept>): Promise<ResolvedKey | Kept> {\n const { input, deps, availability, offers, initialChoice, hasStoredKey } = params\n const auth = findUsableAuth(input, deps, availability)\n const account = await auth?.account()\n if (offers.length === 0 && account === undefined) return await pasteKey(params)\n\n const currentOffers = offers.filter((offer): offer is InUseKeyOffer | Kept => !isStoredKeyOffer(offer))\n const storedOffer = offers.find(isStoredKeyOffer)\n deps.masker.registerSecrets(offers.flatMap(listOfferedKeys))\n const shown = showOffers({ currentOffers, storedOffer, masker: deps.masker })\n const choice = await deps.ui.chooseKeySource({ ...shown, account, initialChoice, hasStoredKey })\n if (choice === 'account' && auth !== undefined) return await createOrPickAgain(auth, params)\n\n const chosen = findChosenOffer<OneKeyOffer | Kept>({ choice, currentOffers, storedOffer })\n if (chosen === undefined) return await pasteKey(params)\n return isOneKeyOffer(chosen) ? await takeOffer({ ...params, offer: chosen }) : chosen\n}\n\nfunction isStoredKeyOffer(offer: KeyOffer): offer is StoredKeyOffer {\n return offer.kind === 'saved' || offer.kind === 'found'\n}\n\ntype ShowOffersParams = {\n currentOffers: readonly (InUseKeyOffer | KeepOffer)[]\n storedOffer: StoredKeyOffer | undefined\n masker: Masker\n}\n\ntype ShownOffers = Pick<ChooseKeySourceParams, 'currentOffers' | 'offer'>\n\nfunction showOffers({ currentOffers, storedOffer, masker }: ShowOffersParams): ShownOffers {\n const offer =\n storedOffer === undefined ? undefined : { kind: storedOffer.kind, maskedKey: masker.maskText(storedOffer.key) }\n return { currentOffers: currentOffers.map((current) => showCurrentOffer(current, masker)), offer }\n}\n\nfunction showCurrentOffer(offer: InUseKeyOffer | KeepOffer, masker: Masker): CurrentKeyOffer {\n return match<InUseKeyOffer | KeepOffer, CurrentKeyOffer>(offer)\n .with({ kind: 'keep-each' }, ({ kind, perAgent }) => ({\n kind,\n perAgent: perAgent.map(({ label, value }) => ({ label, maskedKey: masker.maskText(value) })),\n }))\n .with({ kind: P.union('keep', 'in-use') }, ({ kind, key, labels }) => ({\n kind,\n maskedKey: masker.maskText(key),\n labels,\n }))\n .exhaustive()\n}\n\ntype FindChosenOfferParams<Offer> = {\n choice: KeySourceChoice\n currentOffers: readonly Offer[]\n storedOffer: Offer | undefined\n}\n\nfunction findChosenOffer<Offer>({\n choice,\n currentOffers,\n storedOffer,\n}: FindChosenOfferParams<Offer>): Offer | undefined {\n if (choice === 'offered') return storedOffer\n if (typeof choice === 'object') return currentOffers[choice.index]\n return undefined\n}\n\nfunction isOneKeyOffer(offer: KeyOffer): offer is OneKeyOffer {\n return offer.kind !== 'keep' && offer.kind !== 'keep-each'\n}\n\nasync function createOrPickAgain<Kept extends KeepOffer>(\n auth: AuthDeps,\n params: ChooseKeyParams<Kept>,\n): Promise<ResolvedKey | Kept> {\n const created = await auth.createKey()\n if (created === undefined) return await chooseKey({ ...params, initialChoice: 'account' })\n\n const { input, deps, availability, saved } = params\n return await adoptCreated({ created, input, deps, availability, saved })\n}\n\n/**\n * A rejected key is one the Gateway refused in this run, and a rotated one the key this run rotated: replacing either\n * loses nothing that works.\n */\ntype SavedKey = { kind: 'none' } | { kind: 'working' | 'rejected' | 'rotated'; key: string }\n\nconst NO_SAVED_KEY: SavedKey = { kind: 'none' }\n\nfunction savedFrom(saved: string | undefined): SavedKey {\n return saved === undefined ? NO_SAVED_KEY : { kind: 'working', key: saved }\n}\n\n/** Signing in creates a key at nexos.ai and keeps it in the keychain: a dry run must not, a machine without one cannot. */\nfunction findUsableAuth(input: KeyStepInput, deps: KeyStepDeps, availability: Availability): AuthDeps | undefined {\n return input.isDryRun || availability.kind === 'unavailable' ? undefined : deps.auth\n}\n\nasync function pasteKey({ input, deps, availability, saved }: SaveContext): Promise<ResolvedKey> {\n const key =\n saved.kind === 'none' ? await deps.ui.askForKey({ destination: input.destination }) : await deps.ui.askForNewKey()\n return await finishKey({ input, deps, availability, answer: { kind: 'pasted', key }, saved })\n}\n\ntype TakeOfferParams = SaveContext & { offer: OneKeyOffer }\n\nasync function takeOffer({ input, deps, availability, saved, offer }: TakeOfferParams): Promise<ResolvedKey> {\n if (saved.kind !== 'none' && saved.key === offer.key) return { key: offer.key, source: 'saved', shouldSave: false }\n return await finishKey({ input, deps, availability, answer: { kind: 'reused', key: offer.key }, saved })\n}\n\ntype SaveContext = { input: KeyStepInput; deps: KeyStepDeps; availability: Availability; saved: SavedKey }\n\ntype AdoptSignedInParams = SaveContext & { created: SignedInKey }\n\nasync function adoptCreated(params: AdoptSignedInParams): Promise<ResolvedKey> {\n params.deps.ui.log.success(params.deps.masker.maskText(`Created key \"${params.created.keyName}\".`))\n return await adoptSignedIn(params)\n}\n\nasync function adoptSignedIn({ created, ...context }: AdoptSignedInParams): Promise<ResolvedKey> {\n context.deps.masker.registerSecrets([created.key])\n const decision = await decideSave({ ...context, key: created.key, isSignedIn: true })\n const createdKey = { keyId: created.keyId, keyName: created.keyName }\n const resolved: ResolvedKey = { key: created.key, source: 'signed-in', createdKey, ...decision }\n if (!resolved.shouldSave) return resolved\n\n // nexos.ai shows this key once, so a run that ends before its write — declined, interrupted or\n // crashed — must not take it down with it.\n await saveKey(resolved, context.deps)\n return { ...resolved, shouldSave: false }\n}\n\ntype FinishKeyParams = SaveContext & { answer: KeyAnswer }\n\nasync function finishKey({ answer, ...context }: FinishKeyParams): Promise<ResolvedKey> {\n if (hasLineBreak(answer.key)) throw new UsageError('The pasted key contains a line break. Paste it on one line.')\n\n return {\n key: answer.key,\n source: answer.kind,\n ...(await decideSave({ ...context, key: answer.key, isSignedIn: false })),\n }\n}\n\ntype KeyAnswer = { kind: 'reused' | 'pasted'; key: string }\n\ntype DecideSaveParams = SaveContext & { key: string; isSignedIn: boolean }\n\ntype SaveDecision = Pick<ResolvedKey, 'shouldSave' | 'replacedKeyLabel'>\n\ntype ReplacedKey = { kind: 'working' | 'rejected' | 'rotated'; label: string }\n\nasync function decideSave({ saved, key, ...params }: DecideSaveParams): Promise<SaveDecision> {\n if (saved.kind !== 'none' && saved.key === key) return { shouldSave: false }\n\n const replaced =\n saved.kind === 'none' ? undefined : { kind: saved.kind, label: await labelOf(saved.key, params.deps) }\n const shouldSave = await askToSave({ ...params, replaced })\n if (!shouldSave || replaced?.kind !== 'working') return { shouldSave }\n return { shouldSave, replacedKeyLabel: replaced.label }\n}\n\nexport const SAVE_KEY_QUESTION = 'Save this key in your system keychain for future runs?'\n\nexport function describeReplaceSavedKey(label: string): string {\n return `Replace the saved key \"${label}\" with this one and use it from now on?`\n}\n\ntype AskToSaveParams = Omit<DecideSaveParams, 'saved' | 'key'> & { replaced: ReplacedKey | undefined }\n\n/**\n * A key that works is never replaced without an explicit yes, and `--yes` is not one. A rejected key loses nothing,\n * so replacing it is the default; a rotated one holds a value that no longer works, so it is replaced without asking.\n */\nasync function askToSave({ input, deps, availability, isSignedIn, replaced }: AskToSaveParams): Promise<boolean> {\n if (input.shouldSaveKey) return true\n // A dry run writes nothing, so its answer cannot matter: do not ask.\n if (input.isDryRun) return false\n if (availability.kind === 'unavailable') {\n deps.ui.dim(`${availability.reason} — the key will not be saved.`)\n return false\n }\n if (replaced === undefined) {\n if (isSignedIn) return true\n return !input.shouldAssumeYes && (await deps.ui.confirm(SAVE_KEY_QUESTION, false))\n }\n if (replaced.kind === 'rotated') return true\n if (input.shouldAssumeYes) return replaced.kind === 'rejected'\n\n const question = deps.masker.maskText(describeReplaceSavedKey(replaced.label))\n return await deps.ui.confirm(question, replaced.kind === 'rejected')\n}\n\nexport function isKeyUsable(key: string): boolean {\n return key.trim() !== ''\n}\n\n/** Warns about an unexpected shape and registers the key, so every later message masks it. */\nexport function adoptKey(key: string, { ui, masker }: { ui: TerminalUi; masker: Masker }): void {\n const warning = findKeyShapeWarning(key)\n if (warning !== undefined) ui.log.warn(warning)\n masker.registerSecrets([key])\n}\n\nexport function findKeyShapeWarning(key: string): string | undefined {\n if (hasKnownKeyPrefix(key)) return undefined\n\n const quoted = KEY_PREFIXES.map((prefix) => `\"${prefix}\"`)\n const prefixes = `${quoted.slice(0, -1).join(', ')} or ${quoted.at(-1)}`\n return `That key does not look like a nexos.ai key (expected a ${prefixes} prefix). Continuing anyway.`\n}\n\n/** A key that failed the check is never saved, even when the run continues. */\nexport async function commitSave(resolved: ResolvedKey, check: CheckOutcome, deps: KeyStepDeps): Promise<void> {\n if (!resolved.shouldSave) return\n if (check === 'failed') {\n deps.ui.log.warn('The key failed the check, so it was not saved to your system keychain.')\n return\n }\n\n await saveKey(resolved, deps)\n}\n\nasync function saveKey(resolved: ResolvedKey, { keystore, ui, masker, auth }: KeyStepDeps): Promise<void> {\n try {\n await keystore.save(resolved.key)\n await auth?.rememberSavedKey(resolved.createdKey)\n } catch (error) {\n ui.log.warn(masker.maskText(`Couldn't save the key to your system keychain: ${describeError(error)}`))\n return\n }\n ui.log.success('Saved the key to your system keychain.')\n if (resolved.replacedKeyLabel !== undefined) {\n ui.log.info(masker.maskText(describeKeyStillActive(resolved.replacedKeyLabel)))\n }\n}\n\nexport function describeKeyStillActive(label: string): string {\n return `The previous key \"${label}\" is still active at nexos.ai — delete it at ${API_KEYS_URL} if nothing uses it.`\n}\n\nexport function isSavedKeyRejection(resolved: ResolvedKey, probe: ProbeResult): boolean {\n return resolved.source === 'saved' && probe.kind === 'key-rejected'\n}\n\nexport type ChooseAnotherKeyParams = { input: KeyStepInput; rejected: ResolvedKey; deps: KeyStepDeps }\n\nexport async function chooseAnotherKey({ input, rejected, deps }: ChooseAnotherKeyParams): Promise<ResolvedKey> {\n const availability = await deps.keystore.availability()\n const otherKeys = await findOtherKeys({ input, deps, availability, rejected })\n return await chooseKey<NoKeepOffer>({ input, deps, availability, ...otherKeys, hasStoredKey: false })\n}\n\nexport type ReplaceRejectedKeyParams = {\n input: KeyStepInput\n rejected: ResolvedKey\n probe: ProbeResult\n deps: KeyStepDeps\n}\n\n/** A rejected saved key fails the same way on every retry, so it is replaced rather than retried. */\nexport async function replaceRejectedKey({\n input,\n rejected,\n probe,\n deps,\n}: ReplaceRejectedKeyParams): Promise<ResolvedKey | null> {\n const { keystore, ui, masker } = deps\n const status = probe.status ?? 0\n const availability = await keystore.availability()\n const auth = findUsableAuth(input, deps, availability)\n\n const replacement = await auth?.replaceKey()\n if (replacement !== undefined) {\n ui.log.info(masker.maskText(`The saved key was rejected, so a new key \"${replacement.keyName}\" was created.`))\n const saved: SavedKey = { kind: 'rejected', key: rejected.key }\n return await adoptSignedIn({ created: replacement, input, deps, availability, saved })\n }\n\n if (input.shouldAssumeYes) {\n ui.log.error(`The saved key was rejected (HTTP ${status}).`)\n ui.log.info(`Run \\`${LOGIN_HINT}\\` to create a new key, or pass --key.`)\n return null\n }\n\n ui.log.warn(`The gateway rejected the saved key (HTTP ${status}).`)\n const choice = await ui.chooseOnSavedKeyRejected({ status, account: await auth?.account() })\n if (choice === 'cancel') throw new CancelledError()\n\n await forgetRejectedKey(input, deps)\n const otherKeys = await findOtherKeys({ input, deps, availability, rejected })\n const params = { input, deps, availability, ...otherKeys, hasStoredKey: false }\n if (otherKeys.offers.length > 0) return await chooseKey<NoKeepOffer>({ ...params, initialChoice: choice })\n if (choice === 'paste' || auth === undefined) return await pasteKey(params)\n return await createOrPickAgain<NoKeepOffer>(auth, params)\n}\n\nasync function forgetRejectedKey(input: KeyStepInput, { keystore, ui, masker, auth }: KeyStepDeps): Promise<void> {\n if (input.isDryRun) {\n ui.dim('Dry run — the saved key was not removed.')\n return\n }\n try {\n await keystore.clear()\n await auth?.rememberSavedKey(undefined)\n } catch (error) {\n ui.log.warn(\n masker.maskText(\n `Could not remove the saved key: ${describeError(error)}. It is still saved; run \\`${FORGET_KEY_HINT}\\`.`,\n ),\n )\n }\n}\n\ntype FindOtherKeysParams = {\n input: KeyStepInput\n deps: KeyStepDeps\n availability: Availability\n rejected: ResolvedKey\n}\n\ntype OtherKeys = { saved: SavedKey; offers: StoredKeyOffer[] }\n\nasync function findOtherKeys({ input, deps, availability, rejected }: FindOtherKeysParams): Promise<OtherKeys> {\n const loaded = availability.kind === 'available' ? await loadSaved(deps) : undefined\n const saved = loaded === rejected.key ? undefined : loaded\n const found = saved === undefined ? input.existingKeys().offered : undefined\n return {\n saved: savedFrom(saved),\n offers: buildStoredKeyOffers({ saved, found: found === rejected.key ? undefined : found }),\n }\n}\n","import { match, P } from 'ts-pattern'\nimport {\n groupValuesInUse,\n summarizeCurrentValues,\n type LabelledValue,\n type SummarizeCurrentValuesParams,\n type ValueInUse,\n} from '../../harnesses/summarize-current-values'\n\nexport type CurrentKeys = SummarizeCurrentValuesParams\n\nexport type KeyOffer =\n | { kind: 'keep'; key: string; labels: readonly string[] }\n | { kind: 'keep-each'; perAgent: readonly LabelledValue[] }\n | { kind: 'in-use'; key: string; labels: readonly string[] }\n | { kind: 'saved' | 'found'; key: string }\n\nexport type StoredKeyOffer = Extract<KeyOffer, { kind: 'saved' | 'found' }>\n\nexport type InUseKeyOffer = Extract<KeyOffer, { kind: 'in-use' }>\n\nexport type BuildKeyOffersParams = { currentKeys: CurrentKeys; saved: string | undefined; found: string | undefined }\n\nexport function buildKeyOffers({ currentKeys, saved, found }: BuildKeyOffersParams): KeyOffer[] {\n const current = summarizeCurrentValues(currentKeys)\n const isKept = current.kind === 'keep' || current.kind === 'keep-each'\n const currentOffers = match(current)\n .returnType<KeyOffer[]>()\n .with({ kind: 'keep' }, ({ value, labels }) => [{ kind: 'keep', key: value, labels }])\n .with({ kind: 'keep-each' }, ({ perAgent }) => [{ kind: 'keep-each', perAgent }])\n .with({ kind: 'in-use' }, ({ inUse }) => inUse.map(offerInUse))\n .with({ kind: 'none' }, () => [])\n .exhaustive()\n // Keeping each key applies no single key, so a saved key one target uses still changes the others.\n const shownKeys = new Set(\n currentOffers.flatMap((offer) => (offer.kind === 'keep-each' ? [] : listOfferedKeys(offer))),\n )\n const storedOffers = buildStoredKeyOffers({ saved, found: isKept ? undefined : found })\n return [...currentOffers, ...storedOffers.filter(({ key }) => !shownKeys.has(key))]\n}\n\nexport type BuildStoredKeyOffersParams = Omit<BuildKeyOffersParams, 'currentKeys'>\n\nexport type BuildNewKeyOffersParams = { currentKeys: CurrentKeys; saved: string | undefined }\n\n/** A key changes nothing for a target already on it, so only keys that change some target are offered. */\nexport function buildNewKeyOffers({ currentKeys, saved }: BuildNewKeyOffersParams): (InUseKeyOffer | StoredKeyOffer)[] {\n const targetKeys = new Set(currentKeys.targets.flatMap(({ value }) => value ?? []))\n const otherKeys = currentKeys.inUse.filter(({ value }) => !targetKeys.has(value))\n const inUseOffers = groupValuesInUse(otherKeys).map(offerInUse)\n const shownKeys = new Set(inUseOffers.map(({ key }) => key))\n const isSavedEverywhere = currentKeys.targets.every(({ value }) => value === saved)\n const storedOffers = buildStoredKeyOffers({ saved: isSavedEverywhere ? undefined : saved, found: undefined })\n return [...inUseOffers, ...storedOffers.filter(({ key }) => !shownKeys.has(key))]\n}\n\nexport function buildStoredKeyOffers({ saved, found }: BuildStoredKeyOffersParams): StoredKeyOffer[] {\n if (saved !== undefined) return [{ kind: 'saved', key: saved }]\n if (found !== undefined) return [{ kind: 'found', key: found }]\n return []\n}\n\nexport function listOfferedKeys(offer: KeyOffer): string[] {\n return match(offer)\n .with({ kind: 'keep-each' }, ({ perAgent }) => perAgent.map(({ value }) => value))\n .with({ kind: P.union('keep', 'in-use', 'saved', 'found') }, ({ key }) => [key])\n .exhaustive()\n}\n\nfunction offerInUse({ value, labels }: ValueInUse): InUseKeyOffer {\n return { kind: 'in-use', key: value, labels }\n}\n","export type LabelledValue = { label: string; value: string }\n\nexport type ValueInUse = { value: string; labels: readonly string[] }\n\nexport type CurrentValues =\n | { kind: 'keep'; value: string; labels: readonly string[] }\n | { kind: 'keep-each'; perAgent: readonly LabelledValue[] }\n | { kind: 'in-use'; inUse: readonly ValueInUse[] }\n | { kind: 'none' }\n\nexport type SummarizeCurrentValuesParams = {\n targets: readonly { label: string; value: string | undefined }[]\n inUse: readonly LabelledValue[]\n}\n\nexport function summarizeCurrentValues({ targets, inUse }: SummarizeCurrentValuesParams): CurrentValues {\n const targetValues = targets.flatMap(({ label, value }) => (value === undefined ? [] : [{ label, value }]))\n const [first] = targetValues\n if (first !== undefined && targetValues.length === targets.length) {\n if (targetValues.every(({ value }) => value === first.value)) {\n return { kind: 'keep', value: first.value, labels: targetValues.map(({ label }) => label) }\n }\n return { kind: 'keep-each', perAgent: targetValues }\n }\n\n const grouped = groupValuesInUse(inUse)\n return grouped.length === 0 ? { kind: 'none' } : { kind: 'in-use', inUse: grouped }\n}\n\nexport function groupValuesInUse(inUse: readonly LabelledValue[]): ValueInUse[] {\n const labelsByValue = new Map<string, string[]>()\n for (const { label, value } of inUse) labelsByValue.set(value, [...(labelsByValue.get(value) ?? []), label])\n return [...labelsByValue].map(([value, labels]) => ({ value, labels }))\n}\n","import type { ConfigurableHarness } from './harness'\n\nexport type ModelFit =\n | { kind: 'usable' }\n | { kind: 'partly-usable'; excludedLabels: readonly string[] }\n | { kind: 'unusable'; excludedLabels: readonly string[] }\n\nexport function isModelUsableBy(harness: ConfigurableHarness, model: string): boolean {\n return harness.isModelSupported?.(model) ?? true\n}\n\nexport function assessModelFit(model: string, targets: readonly ConfigurableHarness[]): ModelFit {\n const excludedLabels = targets.filter((harness) => !isModelUsableBy(harness, model)).map(({ label }) => label)\n if (excludedLabels.length === 0) return { kind: 'usable' }\n if (excludedLabels.length === targets.length) return { kind: 'unusable', excludedLabels }\n\n return { kind: 'partly-usable', excludedLabels }\n}\n","import { randomUUID } from 'node:crypto'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport * as v from 'valibot'\nimport { parseJson } from '../../../shared/file-formats/json/parse-json'\nimport { readFileIfExists } from '../../../shared/file-system/read-file-if-exists'\nimport { displayPath } from '../../../shared/text/display-path'\nimport { normalizeModel } from '../../public-api/models/predefined-models'\nimport { ENV_DIRECTORY_NAME } from '../env-file/syntax/env-syntax'\n\nconst PREFERENCES_FILE = 'preferences.json'\n\nexport function resolvePreferencesPath(home: string): string {\n return path.join(home, ENV_DIRECTORY_NAME, PREFERENCES_FILE)\n}\n\nconst ModelIdSchema = v.pipe(v.string(), v.trim(), v.nonEmpty(), v.transform(normalizeModel))\n\nconst PreferencesSchema = v.looseObject({\n defaultModels: v.optional(v.record(v.string(), ModelIdSchema), {}),\n})\n\ntype Preferences = v.InferOutput<typeof PreferencesSchema>\n\n/** Keyed by harness id. */\nexport type DefaultModels = Readonly<Record<string, string>>\n\nexport class PreferencesError extends Error {\n override readonly name = 'PreferencesError'\n}\n\nexport function readDefaultModels(home: string): DefaultModels {\n return readPreferences(home).defaultModels\n}\n\nexport type SaveDefaultModelsParams = { home: string; defaultModels: DefaultModels }\n\nconst JSON_INDENT = 2\n\nexport function saveDefaultModels({ home, defaultModels }: SaveDefaultModelsParams): void {\n const current = readPreferences(home)\n const next: Preferences = { ...current, defaultModels: { ...current.defaultModels, ...defaultModels } }\n writeAtomically(resolvePreferencesPath(home), `${JSON.stringify(next, null, JSON_INDENT)}\\n`)\n}\n\nfunction readPreferences(home: string): Preferences {\n const filePath = resolvePreferencesPath(home)\n const text = readFileIfExists(filePath)\n if (text === null) return { defaultModels: {} }\n\n const parsed = v.safeParse(PreferencesSchema, parseJson(text))\n if (!parsed.success) {\n throw new PreferencesError(\n `${displayPath(filePath, home)} is not a preferences file nexos-connect can read. Fix it or delete it.`,\n )\n }\n return parsed.output\n}\n\n// Two runs may save at once; a rename never leaves the file half-written for the other to read.\nfunction writeAtomically(filePath: string, content: string): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n const temporaryPath = `${filePath}.${randomUUID()}.tmp`\n try {\n fs.writeFileSync(temporaryPath, content)\n fs.renameSync(temporaryPath, filePath)\n } catch (error) {\n fs.rmSync(temporaryPath, { force: true })\n throw error\n }\n}\n","import { match } from 'ts-pattern'\nimport * as v from 'valibot'\nimport { describeError } from '../../text/describe-error'\nimport { displayPath } from '../../text/display-path'\nimport { LinkEscapeError } from './link-escape-error'\nimport { Utf16FileError } from './utf16-file-error'\n\nexport type FileAction = 'read' | 'write'\n\nexport type DescribeFileErrorParams = { error: unknown; action: FileAction; home: string }\n\nexport function describeFileError({ error, action, home }: DescribeFileErrorParams): string {\n if (error instanceof LinkEscapeError) return describeLinkEscape(error, home)\n\n const failure = readFileFailure(error)\n if (failure === undefined) return describeError(error)\n\n return `${displayPath(failure.path, home)}: cannot ${action} it (${failure.reason}). ${failure.nextStep}, then run again.`\n}\n\nfunction describeLinkEscape({ filePath, root, escape }: LinkEscapeError, home: string): string {\n const problem = match(escape)\n .with('outside-root', () => `leads outside ${displayPath(root, home)} through a symbolic link`)\n .with('symbolic-link', () => 'is a symbolic link')\n .exhaustive()\n return (\n `${displayPath(filePath, home)} ${problem}, so it was left as it is. ` +\n 'Replace the link with a regular file or folder, then run again.'\n )\n}\n\ntype FileFailure = { path: string; reason: string; nextStep: string }\n\nconst FileSystemErrorSchema = v.object({ code: v.string(), path: v.string() })\n\nconst PERMISSION_CODES: readonly string[] = ['EACCES', 'EPERM', 'EROFS']\n\nfunction readFileFailure(error: unknown): FileFailure | undefined {\n if (error instanceof Utf16FileError) {\n return { path: error.filePath, reason: 'saved as UTF-16', nextStep: 'Re-save it as UTF-8' }\n }\n if (!v.is(FileSystemErrorSchema, error)) return undefined\n\n const nextStep = PERMISSION_CODES.includes(error.code) ? 'Check its permissions' : 'Check that path'\n return { path: error.path, reason: error.code, nextStep }\n}\n","export type LinkEscape = 'outside-root' | 'symbolic-link'\n\nexport type LinkEscapeErrorParams = { filePath: string; root: string; escape: LinkEscape }\n\nexport class LinkEscapeError extends Error {\n readonly filePath: string\n readonly root: string\n readonly escape: LinkEscape\n\n constructor({ filePath, root, escape }: LinkEscapeErrorParams) {\n super(`${filePath} is a symbolic link, or a link leads it outside ${root}.`)\n this.name = 'LinkEscapeError'\n this.filePath = filePath\n this.root = root\n this.escape = escape\n }\n}\n","import { match, P } from 'ts-pattern'\nimport type { ConfigurableHarness } from '../../../harnesses/harness'\nimport { assessModelFit } from '../../../harnesses/model-fit'\nimport type { ModelInfo } from '../../../product/public-api/model-schema'\nimport { isConversationalModel } from '../../../product/public-api/models/model-capability'\nimport { PREDEFINED_MODELS } from '../../../product/public-api/models/predefined-models'\nimport type { Masker } from '../../../product/secrets/masker'\nimport { formatList, formatListOrCount } from '../../format-list'\n\nexport const BROWSE_VALUE = '\\u0000browse'\nexport const MANUAL_VALUE = '\\u0000manual'\nexport const KEEP_VALUE = '\\u0000keep'\n\nexport type ModelRow = { value: string; label: string; hint?: string }\n\nexport type CatalogueRow = { id: string; modelHint: string; excludedLabels: readonly string[] }\n\nexport type ModelChoices = {\n rows: ModelRow[]\n catalogue: CatalogueRow[]\n hiddenCount: number\n unusableCount: number\n unusableAgentLabels: readonly string[]\n isRouterOffered: boolean\n}\n\nexport type ModelSuggestion = { model: string; hint: string }\n\nexport type AgentModel = { label: string; model: string }\n\nexport type ModelInUse = { model: string; labels: readonly string[] }\n\nexport type CurrentModels =\n | { kind: 'none' }\n | { kind: 'keep'; model: string; labels: readonly string[] }\n | { kind: 'keep-each'; perAgent: readonly AgentModel[] }\n | { kind: 'in-use'; models: readonly ModelInUse[] }\n | { kind: 'current'; models: readonly ModelInUse[] }\n\nexport type BuildModelChoicesParams = {\n models: readonly ModelInfo[]\n isRouterOffered: boolean\n suggestions: readonly ModelSuggestion[]\n targets: readonly ConfigurableHarness[]\n currentModels: CurrentModels\n masker: Masker\n}\n\nexport function buildModelChoices({\n models,\n isRouterOffered,\n suggestions,\n targets,\n currentModels,\n masker,\n}: BuildModelChoicesParams): ModelChoices {\n const conversational = models.filter(isConversationalModel)\n const chatModels = conversational.length > 0 ? conversational : models\n const fitted = fitCatalogue(chatModels, targets)\n\n const offeredModels = new Set(listOfferedCurrentModels(currentModels))\n const routerRows = isRouterOffered ? listRouterRows(offeredModels) : []\n const suggestionRows = fitSuggestions(suggestions, targets)\n .filter(({ model }) => !offeredModels.has(model))\n .map(({ model, hint }) => ({ value: model, label: model, hint }))\n return {\n rows: [\n ...buildCurrentRows({ currentModels, targets, masker }),\n ...routerRows,\n ...suggestionRows,\n buildLastRow(models, fitted),\n ],\n ...fitted,\n hiddenCount: models.length - chatModels.length,\n isRouterOffered,\n }\n}\n\nfunction listOfferedCurrentModels(currentModels: CurrentModels): string[] {\n return match(currentModels)\n .with({ kind: 'keep' }, ({ model }) => [model])\n .with({ kind: P.union('in-use', 'current') }, ({ models }) => models.map(({ model }) => model))\n .with({ kind: P.union('none', 'keep-each') }, () => [])\n .exhaustive()\n}\n\nfunction listRouterRows(offeredModels: ReadonlySet<string>): ModelRow[] {\n return PREDEFINED_MODELS.filter(({ id }) => !offeredModels.has(id)).map(({ id, hint }) => ({\n value: id,\n label: id,\n hint,\n }))\n}\n\ntype BuildCurrentRowsParams = Pick<BuildModelChoicesParams, 'currentModels' | 'targets' | 'masker'>\n\nfunction buildCurrentRows({ currentModels, targets, masker }: BuildCurrentRowsParams): ModelRow[] {\n return match(currentModels)\n .with({ kind: 'none' }, () => [])\n .with({ kind: 'keep' }, ({ model, labels }) => [\n { value: KEEP_VALUE, label: `Keep ${masker.maskText(model)}`, hint: describeInUse(labels) },\n ])\n .with({ kind: 'keep-each' }, ({ perAgent }) => [\n {\n value: KEEP_VALUE,\n label: \"Keep each agent's current model\",\n hint: formatListOrCount({\n items: perAgent.map(({ label, model }) => `${label} ${masker.maskText(model)}`),\n count: new Set(perAgent.map(({ model }) => model)).size,\n noun: 'different model',\n }),\n },\n ])\n .with({ kind: P.union('in-use', 'current') }, ({ models }) => buildUsedModelRows({ models, targets, masker }))\n .exhaustive()\n}\n\ntype BuildUsedModelRowsParams = Pick<BuildModelChoicesParams, 'targets' | 'masker'> & {\n models: readonly ModelInUse[]\n}\n\nfunction buildUsedModelRows({ models, targets, masker }: BuildUsedModelRowsParams): ModelRow[] {\n return fitSuggestions(\n models.map(({ model, labels }) => ({ model, hint: describeInUse(labels) })),\n targets,\n ).map(({ model, hint }) => ({ value: model, label: masker.maskText(model), hint }))\n}\n\nfunction describeInUse(labels: readonly string[]): string {\n return `in use by ${formatList(labels)}`\n}\n\n/** Drops the suggestions no target can use, and lists those only some can use last, saying who cannot. */\nexport function fitSuggestions(\n suggestions: readonly ModelSuggestion[],\n targets: readonly ConfigurableHarness[],\n): ModelSuggestion[] {\n const fitted = suggestions.map((suggestion) => ({ suggestion, fit: assessModelFit(suggestion.model, targets) }))\n const usable = fitted.flatMap(({ suggestion, fit }) => (fit.kind === 'usable' ? [suggestion] : []))\n const partlyUsable = fitted.flatMap(({ suggestion, fit }) =>\n fit.kind === 'partly-usable' ? [appendExclusion(suggestion, fit.excludedLabels)] : [],\n )\n return [...usable, ...partlyUsable]\n}\n\nfunction appendExclusion(suggestion: ModelSuggestion, excludedLabels: readonly string[]): ModelSuggestion {\n return { ...suggestion, hint: `${suggestion.hint} · ${formatExclusion(excludedLabels)}` }\n}\n\nexport function formatExclusion(excludedLabels: readonly string[]): string {\n return `${formatList(excludedLabels)} cannot use it`\n}\n\ntype FittedCatalogue = Pick<ModelChoices, 'catalogue' | 'unusableCount' | 'unusableAgentLabels'>\n\nfunction fitCatalogue(models: readonly ModelInfo[], targets: readonly ConfigurableHarness[]): FittedCatalogue {\n const fitted = models\n .toSorted((first, second) => first.id.localeCompare(second.id))\n .map((model) => ({ model, fit: assessModelFit(model.id, targets) }))\n const toRow = (model: ModelInfo, excludedLabels: readonly string[]): CatalogueRow => ({\n id: model.id,\n modelHint: formatModelHint(model),\n excludedLabels,\n })\n const usable = fitted.flatMap(({ model, fit }) => (fit.kind === 'usable' ? [toRow(model, [])] : []))\n const partlyUsable = fitted.flatMap(({ model, fit }) =>\n fit.kind === 'partly-usable' ? [toRow(model, fit.excludedLabels)] : [],\n )\n const unusable = fitted.flatMap(({ fit }) => (fit.kind === 'unusable' ? [fit.excludedLabels] : []))\n return {\n catalogue: [...usable, ...partlyUsable],\n unusableCount: unusable.length,\n unusableAgentLabels: unusable[0] ?? [],\n }\n}\n\nconst MANUAL_ROW: ModelRow = {\n value: MANUAL_VALUE,\n label: 'Type a model id…',\n hint: 'no model list available',\n}\n\nfunction buildLastRow(models: readonly ModelInfo[], { catalogue, unusableAgentLabels }: FittedCatalogue): ModelRow {\n if (catalogue.length > 0) return buildBrowseRow(catalogue.length)\n if (models.length === 0) return MANUAL_ROW\n\n return { ...MANUAL_ROW, hint: `none listed that ${formatList(unusableAgentLabels)} can use` }\n}\n\nfunction buildBrowseRow(availableCount: number): ModelRow {\n return { value: BROWSE_VALUE, label: 'Choose from available models…', hint: `${availableCount} available` }\n}\n\nexport function formatModelHint(model: ModelInfo): string {\n const context = model.contextLength === null ? null : `${formatContextLength(model.contextLength)} context`\n return [model.developer, context, model.region].filter((part) => part !== null).join(' · ')\n}\n\nconst THOUSAND = 1_000\nconst MILLION = 1_000_000\nconst MILLION_DECIMAL_PLACES = 1\n\nexport function formatContextLength(tokens: number): string {\n if (tokens < THOUSAND) return String(tokens)\n\n const thousands = Math.round(tokens / THOUSAND)\n if (thousands < THOUSAND) return `${thousands}k`\n\n return `${Number((tokens / MILLION).toFixed(MILLION_DECIMAL_PLACES))}M`\n}\n","export const PROTOCOLS = ['anthropic', 'openai-chat', 'openai-responses'] as const\n\nexport type Protocol = (typeof PROTOCOLS)[number]\n\n/** The `endpoints` values that make a model conversational; the Gateway translates between them. */\nexport const CONVERSATIONAL_ENDPOINTS = ['chat_completion', 'messages', 'responses'] as const\n","import type { ModelInfo } from '../model-schema'\nimport { CONVERSATIONAL_ENDPOINTS } from './protocol'\n\n/**\n * Whether the picker should offer a model. `endpoints` lists only the APIs a model serves natively,\n * while the Gateway also serves translated ones, so a model without a chat endpoint is the one to hide.\n */\nexport function isConversationalModel(model: ModelInfo): boolean {\n if (model.endpoints.length === 0) return true\n\n return CONVERSATIONAL_ENDPOINTS.some((endpoint) => model.endpoints.includes(endpoint))\n}\n","import type { Harness } from '../../harnesses/harness'\nimport type { ModelInfo } from '../../product/public-api/model-schema'\nimport { isConversationalModel } from '../../product/public-api/models/model-capability'\nimport { isPredefinedModel } from '../../product/public-api/models/predefined-models'\nimport type { DefaultModels } from '../../product/storage/preferences/preferences'\nimport type { ModelSuggestion } from '../../ui/prompts/model/model-choices'\n\n/** The distinct defaults of the agents being set up or started; a saved router is left to the router rows. */\nexport function findOwnDefaults(defaultModels: DefaultModels, targets: readonly Harness[]): ModelSuggestion[] {\n return groupByModel(defaultModels, targets).filter(({ model }) => !isPredefinedModel(model))\n}\n\nexport type FindBorrowedDefaultsParams = {\n defaultModels: DefaultModels\n targets: readonly Harness[]\n harnesses: readonly Harness[]\n models: readonly ModelInfo[]\n}\n\n/**\n * Other agents' defaults, offered as picker rows. A router already has its row, an own default was\n * just turned down, and a model the list says is not conversational would only fail.\n */\nexport function findBorrowedDefaults(params: FindBorrowedDefaultsParams): ModelSuggestion[] {\n const { defaultModels, targets, models } = params\n const targetIds = new Set(targets.map((harness) => harness.id))\n const ownModels = new Set(targets.flatMap((harness) => defaultModels[harness.id] ?? []))\n const others = params.harnesses.filter((harness) => !targetIds.has(harness.id))\n\n return groupByModel(defaultModels, others).filter(\n ({ model }) => !ownModels.has(model) && !isPredefinedModel(model) && isServed({ model, models }),\n )\n}\n\ntype IsServedParams = { model: string; models: readonly ModelInfo[] }\n\nfunction isServed({ model, models }: IsServedParams): boolean {\n if (models.length === 0) return true\n\n const listed = models.find((candidate) => candidate.id === model)\n return listed !== undefined && isConversationalModel(listed)\n}\n\nfunction groupByModel(defaultModels: DefaultModels, harnesses: readonly Harness[]): ModelSuggestion[] {\n const labelsByModel = new Map<string, string[]>()\n for (const harness of harnesses) {\n const model = defaultModels[harness.id]\n if (model !== undefined) labelsByModel.set(model, [...(labelsByModel.get(model) ?? []), harness.label])\n }\n\n return [...labelsByModel].map(([model, labels]) => ({ model, hint: `default for ${labels.join(', ')}` }))\n}\n","import type { CliOptions } from '../../cli/parse-cli-arguments'\nimport type { ConfigurableHarness } from '../../harnesses/harness'\nimport { isModelUsableBy } from '../../harnesses/model-fit'\nimport { isPredefinedModel } from '../../product/public-api/models/predefined-models'\nimport type { Masker } from '../../product/secrets/masker'\nimport {\n PreferencesError,\n readDefaultModels,\n saveDefaultModels,\n type DefaultModels,\n} from '../../product/storage/preferences/preferences'\nimport { describeFileError, type FileAction } from '../../shared/file-system/errors/describe-file-error'\nimport { fitSuggestions, type CurrentModels } from '../../ui/prompts/model/model-choices'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { findOwnDefaults } from './suggest-defaults'\n\nexport type ModelSource = 'flag' | 'env' | 'default' | 'picked'\n\n/** `isReadable` is false for a file that could not be read: nothing is offered from it or saved over it. */\nexport type ModelPreferences = { defaultModels: DefaultModels; isReadable: boolean }\n\nexport function loadModelPreferences(home: string, ui: TerminalUi): ModelPreferences {\n try {\n return { defaultModels: readDefaultModels(home), isReadable: true }\n } catch (error) {\n ui.log.warn(\n `${describePreferencesError({ error, action: 'read', home })} ` +\n 'Default models are neither offered nor saved until then.',\n )\n return { defaultModels: {}, isReadable: false }\n }\n}\n\nexport type RequestModelParams = {\n flagModel: string | undefined\n envModel: string | undefined\n targets: readonly ConfigurableHarness[]\n preferences: ModelPreferences\n shouldAssumeYes: boolean\n currentModels: CurrentModels\n ui: TerminalUi\n}\n\nexport type RequestedModel = { model: string; source: Exclude<ModelSource, 'picked'> }\n\n/** The model settled before the key check; undefined leaves it to the picker. */\nexport async function requestModel(params: RequestModelParams): Promise<RequestedModel | undefined> {\n const { targets, preferences, ui } = params\n if (params.flagModel !== undefined) return { model: params.flagModel, source: 'flag' }\n if (params.envModel !== undefined) return { model: params.envModel, source: 'env' }\n\n const ownDefaults = fitSuggestions(findOwnDefaults(preferences.defaultModels, targets), targets)\n if (ownDefaults.length === 0) return undefined\n if (params.shouldAssumeYes) {\n const shared = findSharedDefault(preferences.defaultModels, targets)\n return shared === undefined ? undefined : { model: shared, source: 'default' }\n }\n if (shouldOfferDefaultsInPicker(params.currentModels)) return undefined\n\n const chosen = await ui.chooseSavedModel(ownDefaults)\n return chosen === undefined ? undefined : { model: chosen, source: 'default' }\n}\n\n/** A picker that leads with what the agents use now takes the quick prompt's place; the saved defaults join it. */\nexport function shouldOfferDefaultsInPicker({ kind }: CurrentModels): boolean {\n return kind === 'keep' || kind === 'keep-each' || kind === 'current'\n}\n\n/** `--yes` never picks between defaults, nor borrows one for an agent that has none. */\nfunction findSharedDefault(defaultModels: DefaultModels, targets: readonly ConfigurableHarness[]): string | undefined {\n const [first, ...rest] = targets.map((harness) => defaultModels[harness.id])\n if (first === undefined || isPredefinedModel(first)) return undefined\n return rest.every((model) => model === first) ? first : undefined\n}\n\nexport type DecideModelSaveParams = {\n model: string\n source: ModelSource\n targets: readonly ConfigurableHarness[]\n preferences: ModelPreferences\n options: Pick<CliOptions, 'shouldSaveModel' | 'shouldAssumeYes' | 'isDryRun'>\n ui: TerminalUi\n masker: Masker\n}\n\n/** The agents to save the model for. Asked only after a pick, default No; `--save-model` says yes without asking. */\nexport async function decideModelSave(params: DecideModelSaveParams): Promise<ConfigurableHarness[]> {\n const { model, preferences, options, ui, masker } = params\n if (!preferences.isReadable) return []\n if (isPredefinedModel(model)) return []\n\n const changed = params.targets.filter(\n (harness) => preferences.defaultModels[harness.id] !== model && isModelUsableBy(harness, model),\n )\n if (changed.length === 0) return []\n if (options.shouldSaveModel) return changed\n if (params.source !== 'picked' || options.shouldAssumeYes || options.isDryRun) return []\n\n const labels = changed.map((harness) => harness.label).join(', ')\n return (await ui.confirm(masker.maskText(`Make ${model} your default for ${labels}?`), false)) ? changed : []\n}\n\nexport type CommitModelSaveParams = {\n model: string\n harnesses: readonly ConfigurableHarness[]\n home: string\n ui: TerminalUi\n masker: Masker\n}\n\n/** A default is a convenience: failing to save one warns and never fails the run. */\nexport function commitModelSave({ model, harnesses, home, ui, masker }: CommitModelSaveParams): void {\n if (harnesses.length === 0) return\n\n const labels = harnesses.map((harness) => harness.label).join(', ')\n try {\n saveDefaultModels({ home, defaultModels: Object.fromEntries(harnesses.map((harness) => [harness.id, model])) })\n ui.log.success(masker.maskText(`Saved ${model} as the default model for ${labels}.`))\n } catch (error) {\n const reason = describePreferencesError({ error, action: 'write', home })\n ui.log.warn(masker.maskText(`Couldn't save ${model} as the default model: ${reason}`))\n }\n}\n\ntype DescribePreferencesErrorParams = { error: unknown; action: FileAction; home: string }\n\nfunction describePreferencesError({ error, action, home }: DescribePreferencesErrorParams): string {\n return error instanceof PreferencesError ? error.message : describeFileError({ error, action, home })\n}\n","import path from 'node:path'\nimport { backUpBeforeWriting, ENV_FILE_BACKUP_DIRECTORY } from '../../product/storage/backups/back-up-before-writing'\nimport type { BackupRoot } from '../../product/storage/backups/resolve-backup-root'\nimport { writeEnvFile } from '../../product/storage/env-file/write-env-file'\nimport { describeUserEnvironmentWriteFailure } from '../../product/storage/windows-environment/describe-user-environment-failure'\nimport {\n readWrittenNames,\n replanUserEnvironment,\n type UserEnvironment,\n type UserEnvironmentPlan,\n} from '../../product/storage/windows-environment/user-environment'\nimport { describeFileError } from '../../shared/file-system/errors/describe-file-error'\nimport { resolveWriteMode } from '../../shared/file-system/resolve-write-mode'\nimport { writeFileRefusingLinks } from '../../shared/file-system/write-file-refusing-links'\nimport { writeFileWithMode } from '../../shared/file-system/write-file-with-mode'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { renderEnvPlan, type ChangePlan } from './change-plan'\nimport type { EnvPlan, FilePlan, HarnessOutcome } from './configure-result'\nimport { isPlanned } from './configure-result'\nimport { recordEnvOriginals, recordFileOriginals, recordUserEnvironmentOriginals } from './record-originals'\n\nexport type ApplyChangesParams = {\n plan: ChangePlan\n ctx: PlatformContext\n backupRoot: BackupRoot\n userEnvironment: UserEnvironment\n envPath: string\n}\n\nexport type ApplyChangesResult = {\n outcomes: HarnessOutcome[]\n envFile: EnvPlan | null\n userEnvironment: UserEnvironmentPlan | null\n writtenCount: number\n backupRoot: string | null\n}\n\nexport function applyChanges(params: ApplyChangesParams): ApplyChangesResult {\n const agentWrites = params.plan.outcomes.map((outcome) => writeAgentFiles(outcome, params))\n const outcomes = agentWrites.map(({ outcome }) => outcome)\n const envFile = replanEnvFile(params.plan.envFile, outcomes)\n const envWrite = writeSharedEnvFile({ outcomes, envFile, params })\n const userEnvironmentWrite = writeUserEnvironment({ outcomes: envWrite.outcomes, params })\n const writtenFiles = [...agentWrites.flatMap(({ writtenFiles }) => writtenFiles), ...envWrite.writtenFiles]\n return {\n outcomes: userEnvironmentWrite.outcomes,\n envFile,\n userEnvironment: userEnvironmentWrite.written,\n writtenCount: writtenFiles.length,\n backupRoot: writtenFiles.some((file) => file.isBackedUp) ? params.backupRoot.path : null,\n }\n}\n\ntype WrittenFile = { isBackedUp: boolean }\n\ntype AgentWrite = { outcome: HarnessOutcome; writtenFiles: WrittenFile[] }\n\nfunction writeAgentFiles(outcome: HarnessOutcome, params: ApplyChangesParams): AgentWrite {\n if (outcome.kind !== 'updated') return { outcome, writtenFiles: [] }\n\n const writtenFiles: WrittenFile[] = []\n const writeFile = params.ctx.scope === 'project' ? writeFileRefusingLinks : writeFileWithMode\n for (const file of outcome.files.filter((plan) => plan.isChanged)) {\n try {\n const relativePath = path.join(outcome.harness.id, path.basename(file.path))\n const record = (): void => recordFileOriginals({ harnessId: outcome.harness.id, file, ctx: params.ctx })\n const write = (): void =>\n writeFile({\n filePath: file.path,\n content: file.after,\n mode: resolveWriteMode({ filePath: file.path, hasSecret: file.hasSecret, platform: params.ctx.platform }),\n })\n writtenFiles.push(backUpThenWrite({ file, relativePath, record, write, params }))\n } catch (error) {\n const reason = describeFileError({ error, action: 'write', home: params.ctx.home })\n return { outcome: { kind: 'failed', harness: outcome.harness, error: reason }, writtenFiles }\n }\n }\n return { outcome, writtenFiles }\n}\n\nfunction replanEnvFile(envFile: EnvPlan | null, outcomes: readonly HarnessOutcome[]): EnvPlan | null {\n if (envFile === null) return null\n\n return renderEnvPlan({ outcomes, before: envFile.before, envPath: envFile.path, shell: envFile.shell })\n}\n\ntype WriteSharedEnvFileParams = { outcomes: HarnessOutcome[]; envFile: EnvPlan | null; params: ApplyChangesParams }\n\ntype EnvWrite = { outcomes: HarnessOutcome[]; writtenFiles: WrittenFile[] }\n\nfunction writeSharedEnvFile({ outcomes, envFile, params }: WriteSharedEnvFileParams): EnvWrite {\n if (envFile === null || !envFile.isChanged) return { outcomes, writtenFiles: [] }\n\n try {\n const relativePath = path.join(ENV_FILE_BACKUP_DIRECTORY, path.basename(envFile.path))\n const { ctx } = params\n const record = (): void => recordEnvOriginals({ outcomes, envFile, ctx })\n const write = (): void => writeEnvFile({ filePath: envFile.path, content: envFile.after, platform: ctx.platform })\n return { outcomes, writtenFiles: [backUpThenWrite({ file: envFile, relativePath, record, write, params })] }\n } catch (error) {\n const reason = describeFileError({ error, action: 'write', home: params.ctx.home })\n return { outcomes: outcomes.map((outcome) => failIfWritingEnvFile(outcome, reason)), writtenFiles: [] }\n }\n}\n\nfunction failIfWritingEnvFile(outcome: HarnessOutcome, error: string): HarnessOutcome {\n if (outcome.kind !== 'updated' || Object.keys(outcome.envVariables).length === 0) return outcome\n\n return { kind: 'failed', harness: outcome.harness, error }\n}\n\ntype UserEnvironmentWrite = { outcomes: HarnessOutcome[]; written: UserEnvironmentPlan | null }\n\ntype WriteUserEnvironmentParams = { outcomes: readonly HarnessOutcome[]; params: ApplyChangesParams }\n\nfunction writeUserEnvironment({ outcomes, params }: WriteUserEnvironmentParams): UserEnvironmentWrite {\n const { userEnvironment, envPath, ctx } = params\n const plan = replanUserEnvironment({ plan: params.plan.userEnvironment, names: userEnvironmentNames(outcomes) })\n if (plan === null || !plan.isChanged) return { outcomes: [...outcomes], written: null }\n\n try {\n recordUserEnvironmentOriginals({ userEnvironment: plan, ctx })\n userEnvironment.write(plan.after)\n return { outcomes: [...outcomes], written: plan }\n } catch (error) {\n const warning = describeUserEnvironmentWriteFailure({ error, envPath, home: ctx.home })\n return {\n outcomes: outcomes.map((outcome) => addUserEnvironmentWarningTo(outcome, warning)),\n written: replanUserEnvironment({ plan, names: new Set(readWrittenNames(error)) }),\n }\n }\n}\n\nfunction addUserEnvironmentWarningTo(outcome: HarnessOutcome, warning: string): HarnessOutcome {\n if (outcome.kind !== 'updated' || Object.keys(outcome.envVariables).length === 0) return outcome\n\n return { ...outcome, warnings: [...outcome.warnings, warning] }\n}\n\nfunction userEnvironmentNames(outcomes: readonly HarnessOutcome[]): ReadonlySet<string> {\n return new Set(outcomes.flatMap((outcome) => (isPlanned(outcome) ? Object.keys(outcome.envVariables) : [])))\n}\n\ntype BackUpThenWriteParams = {\n file: FilePlan\n relativePath: string\n record: () => void\n write: () => void\n params: ApplyChangesParams\n}\n\nfunction backUpThenWrite({ file, relativePath, record, write, params }: BackUpThenWriteParams): WrittenFile {\n const { ctx, backupRoot } = params\n const backup = backUpBeforeWriting({ filePath: file.path, before: file.before, backupRoot, relativePath, ctx })\n record()\n write()\n return backup\n}\n","import fs from 'node:fs'\nimport { isInsideDirectory } from '../text/is-inside-directory'\nimport { LinkEscapeError } from './errors/link-escape-error'\nimport { resolveRealPath } from './resolve-real-path'\n\nexport type AssertNoLinkEscapeParams = { filePath: string; root: string }\n\n// Refuses rather than follows: a root a repository supplies can ship a link pointing anywhere on the machine.\n// The root is compared by its real path too, since temporary and home folders often sit behind a link.\nexport function assertNoLinkEscape({ filePath, root }: AssertNoLinkEscapeParams): void {\n if (!isInsideDirectory({ filePath: resolveRealPath(filePath), directory: resolveRealPath(root) })) {\n throw new LinkEscapeError({ filePath, root, escape: 'outside-root' })\n }\n if (fs.lstatSync(filePath, { throwIfNoEntry: false })?.isSymbolicLink() === true) {\n throw new LinkEscapeError({ filePath, root, escape: 'symbolic-link' })\n }\n}\n","import path from 'node:path'\n\nexport type IsInsideDirectoryParams = { filePath: string; directory: string }\n\nexport function isInsideDirectory({ filePath, directory }: IsInsideDirectoryParams): boolean {\n const relativePath = path.relative(directory, filePath)\n const [first] = relativePath.split(path.sep)\n return relativePath !== '' && first !== '..' && !path.isAbsolute(relativePath)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { isMissingFileError } from './errors/is-missing-file-error'\n\n// A path not created yet resolves through its deepest existing ancestor, so a link on the way still counts,\n// and so does a dangling one: a write would create its target.\nexport function resolveRealPath(filePath: string): string {\n try {\n return fs.realpathSync(filePath)\n } catch (error) {\n if (!isMissingFileError(error)) throw error\n }\n\n if (fs.lstatSync(filePath, { throwIfNoEntry: false })?.isSymbolicLink() === true) {\n return resolveRealPath(path.resolve(path.dirname(filePath), fs.readlinkSync(filePath)))\n }\n const parent = path.dirname(filePath)\n if (parent === filePath) return filePath\n\n return path.join(resolveRealPath(parent), path.basename(filePath))\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { assertNoLinkEscape } from '../../../shared/file-system/assert-no-link-escape'\nimport { readFileMode } from '../../../shared/file-system/read-file-mode'\nimport { isInsideDirectory } from '../../../shared/text/is-inside-directory'\n\nexport type BackUpFileParams = {\n source: string\n root: string\n relativePath: string\n platform: NodeJS.Platform\n}\n\nconst BACKUP_DIRECTORY_MODE = 0o700\nconst OWNER_PERMISSION_BITS = 0o700\n\nexport function backUpFile({ source, root, relativePath, platform }: BackUpFileParams): void {\n const destination = path.join(root, relativePath)\n // A restore names the folder after a harness id read from its record, which a repository can ship.\n if (!isInsideDirectory({ filePath: destination, directory: root })) {\n throw new Error(`${destination} is outside ${root}, so it cannot be backed up.`)\n }\n assertNoLinkEscape({ filePath: destination, root })\n\n fs.mkdirSync(path.dirname(destination), { recursive: true, mode: BACKUP_DIRECTORY_MODE })\n const sourceMode = readFileMode(source, platform)\n const mode = sourceMode === null ? null : sourceMode & OWNER_PERMISSION_BITS\n // Created owner-only, so the copy is never readable by others, even briefly inside an existing --backup-dir;\n // the chmod puts back owner bits the umask dropped.\n fs.writeFileSync(destination, fs.readFileSync(source), { flag: 'wx', ...(mode === null ? {} : { mode }) })\n if (mode !== null) fs.chmodSync(destination, mode)\n}\n\nconst IGNORE_EVERYTHING = '*\\n'\n\nexport function ignoreBackupsInGit(directory: string): void {\n const ignoreFile = path.join(directory, '.gitignore')\n if (fs.lstatSync(ignoreFile, { throwIfNoEntry: false }) !== undefined) return\n\n fs.mkdirSync(directory, { recursive: true, mode: BACKUP_DIRECTORY_MODE })\n // Exclusive, so a dangling link a repository ships in its place is not followed to create its target.\n fs.writeFileSync(ignoreFile, IGNORE_EVERYTHING, { flag: 'wx' })\n}\n","import fs from 'node:fs'\nimport { isMissingFileError } from './errors/is-missing-file-error'\n\nconst PERMISSION_BITS = 0o777\n\nexport function readFileMode(filePath: string, platform: NodeJS.Platform): number | null {\n if (platform === 'win32') return null\n\n try {\n return fs.statSync(filePath).mode & PERMISSION_BITS\n } catch (error) {\n if (isMissingFileError(error)) return null\n throw error\n }\n}\n","import { assertNoLinkEscape } from '../../../shared/file-system/assert-no-link-escape'\nimport { readFileIfExists } from '../../../shared/file-system/read-file-if-exists'\nimport type { PlatformContext } from '../../../shared/platform/platform-context'\nimport { displayPath } from '../../../shared/text/display-path'\nimport { backUpFile, ignoreBackupsInGit } from './back-up-file'\nimport type { BackupRoot } from './resolve-backup-root'\n\nexport const ENV_FILE_BACKUP_DIRECTORY = '_env'\n\nexport type BackUpBeforeWritingParams = {\n filePath: string\n before: string | null\n backupRoot: BackupRoot\n relativePath: string\n ctx: PlatformContext\n}\n\nexport type BackUpBeforeWritingResult = { isBackedUp: boolean }\n\n/** Throws, copying nothing, when the file no longer holds `before`: the preview did not show what it holds now. */\nexport function backUpBeforeWriting(params: BackUpBeforeWritingParams): BackUpBeforeWritingResult {\n const { filePath, before, backupRoot, ctx } = params\n assertUnchangedSincePreview({ filePath, before, home: ctx.home })\n if (before === null) return { isBackedUp: false }\n\n if (backupRoot.gitIgnoredDirectory !== null) {\n assertNoLinkEscape({ filePath: backupRoot.gitIgnoredDirectory, root: ctx.cwd })\n ignoreBackupsInGit(backupRoot.gitIgnoredDirectory)\n }\n backUpFile({ source: filePath, root: backupRoot.path, relativePath: params.relativePath, platform: ctx.platform })\n return { isBackedUp: true }\n}\n\ntype AssertUnchangedSincePreviewParams = { filePath: string; before: string | null; home: string }\n\nfunction assertUnchangedSincePreview({ filePath, before, home }: AssertUnchangedSincePreviewParams): void {\n if (readFileIfExists(filePath) === before) return\n\n throw new Error(\n `${displayPath(filePath, home)} changed after the preview, so it was left as it is. ` +\n 'Run again to see the new changes.',\n )\n}\n","import { match } from 'ts-pattern'\n\nconst OWNER_ONLY_MODE = 0o600\n\n// chmod on Windows only toggles the read-only bit, so 0600 there would claim a protection the ACL does not give.\nexport function resolveOwnerOnlyMode(platform: NodeJS.Platform): number | null {\n return match(platform)\n .returnType<number | null>()\n .with('win32', () => null)\n .otherwise(() => OWNER_ONLY_MODE)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport type WriteFileWithModeParams = { filePath: string; content: string; mode: number | null }\n\nexport function writeFileWithMode({ filePath, content, mode }: WriteFileWithModeParams): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n if (mode === null) {\n fs.writeFileSync(filePath, content)\n return\n }\n\n // Before the write too, so the key never lands under looser bits; `mode` covers only a new file, through the umask.\n if (fs.existsSync(filePath)) fs.chmodSync(filePath, mode)\n fs.writeFileSync(filePath, content, { mode })\n fs.chmodSync(filePath, mode)\n}\n","import { resolveOwnerOnlyMode } from '../../../shared/file-system/resolve-owner-only-mode'\nimport { writeFileWithMode } from '../../../shared/file-system/write-file-with-mode'\n\nexport type WriteEnvFileParams = { filePath: string; content: string; platform: NodeJS.Platform }\n\nexport function writeEnvFile({ filePath, content, platform }: WriteEnvFileParams): void {\n writeFileWithMode({ filePath, content, mode: resolveOwnerOnlyMode(platform) })\n}\n","import * as v from 'valibot'\nimport { parseJson } from '../../../shared/file-formats/json/parse-json'\nimport type { RunPowerShell } from './powershell-user-environment'\n\nexport type UserEnvironmentValues = Readonly<Record<string, string | undefined>>\n\nexport type UserEnvironmentPlan = {\n before: UserEnvironmentValues\n after: UserEnvironmentValues\n isChanged: boolean\n}\n\nexport interface UserEnvironment {\n read(names: readonly string[]): UserEnvironmentValues\n write(values: UserEnvironmentValues): void\n}\n\nexport class UserEnvironmentError extends Error {\n override readonly name: string = 'UserEnvironmentError'\n}\n\n/** A write stops at the first variable it cannot set, and the ones before it stay set. */\nexport class UserEnvironmentWriteError extends UserEnvironmentError {\n override readonly name: string = 'UserEnvironmentWriteError'\n readonly writtenNames: readonly string[]\n\n constructor(message: string, writtenNames: readonly string[]) {\n super(message)\n this.writtenNames = writtenNames\n }\n}\n\n/** The names a failed write set before it stopped; none for any other failure. */\nexport function readWrittenNames(error: unknown): readonly string[] {\n return error instanceof UserEnvironmentWriteError ? error.writtenNames : []\n}\n\nexport type CreateUserEnvironmentParams = { platform: NodeJS.Platform; runPowerShell: RunPowerShell }\n\nconst NO_OP_USER_ENVIRONMENT: UserEnvironment = {\n read: () => ({}),\n write: () => {},\n}\n\nexport function createUserEnvironment({ platform, runPowerShell }: CreateUserEnvironmentParams): UserEnvironment {\n if (platform !== 'win32') return NO_OP_USER_ENVIRONMENT\n\n return {\n read: (names) => readUserEnvironment({ names, runPowerShell }),\n write: (values) => writeUserEnvironment({ values, runPowerShell }),\n }\n}\n\nexport type PlanUserEnvironmentParams = { values: UserEnvironmentValues; userEnvironment: UserEnvironment }\n\n/** Null when there is nothing to set. A read failure is left to bubble, so the caller warns instead of writing blind. */\nexport function planUserEnvironment({\n values,\n userEnvironment,\n}: PlanUserEnvironmentParams): UserEnvironmentPlan | null {\n const names = Object.keys(values)\n if (names.length === 0) return null\n\n const before = userEnvironment.read(names)\n return { before, after: values, isChanged: names.some((name) => before[name] !== values[name]) }\n}\n\nexport type ReplanUserEnvironmentParams = { plan: UserEnvironmentPlan | null; names: ReadonlySet<string> }\n\n/**\n * Narrows a plan to the variables that survived the run, so an agent whose write failed does not\n * leave its key in the user environment. The originals were read when the plan was made. A name\n * left out is never written, so an empty set writes nothing.\n */\nexport function replanUserEnvironment({ plan, names }: ReplanUserEnvironmentParams): UserEnvironmentPlan | null {\n if (plan === null) return null\n\n const after = Object.fromEntries(Object.entries(plan.after).filter(([name]) => names.has(name)))\n if (Object.keys(after).length === 0) return null\n\n const isChanged = Object.entries(after).some(([name, value]) => plan.before[name] !== value)\n return { before: plan.before, after, isChanged }\n}\n\nconst READ_SCRIPT = [\n \"$ErrorActionPreference = 'Stop'\",\n '$names = ([Console]::In.ReadToEnd() | ConvertFrom-Json).names',\n '$result = [ordered]@{}',\n \"foreach ($name in $names) { $result[$name] = [Environment]::GetEnvironmentVariable($name, 'User') }\",\n '$result | ConvertTo-Json -Compress',\n].join('\\n')\n\nconst WRITE_SCRIPT = [\n \"$ErrorActionPreference = 'Stop'\",\n '$values = ([Console]::In.ReadToEnd() | ConvertFrom-Json).values',\n 'foreach ($property in $values.PSObject.Properties) {',\n \" [Environment]::SetEnvironmentVariable($property.Name, $property.Value, 'User')\",\n ' [Console]::Out.WriteLine($property.Name)',\n '}',\n].join('\\n')\n\nconst REPLY_SCHEMA = v.record(v.string(), v.nullable(v.string()))\n\ntype ReadUserEnvironmentParams = { names: readonly string[]; runPowerShell: RunPowerShell }\n\nfunction readUserEnvironment({ names, runPowerShell }: ReadUserEnvironmentParams): UserEnvironmentValues {\n const result = runPowerShell({ script: READ_SCRIPT, input: JSON.stringify({ names }) })\n if (result.code !== 0) {\n throw new UserEnvironmentError(`the Windows user environment could not be read (PowerShell exited ${result.code})`)\n }\n\n const reply = parseReply(result.stdout)\n return Object.fromEntries(names.map((name) => [name, reply[name] ?? undefined]))\n}\n\nfunction parseReply(stdout: string): Readonly<Record<string, string | null>> {\n const parsed = v.safeParse(REPLY_SCHEMA, parseJson(stdout))\n if (!parsed.success) throw new UserEnvironmentError('the Windows user environment replied with something unexpected')\n return parsed.output\n}\n\ntype WriteUserEnvironmentParams = { values: UserEnvironmentValues; runPowerShell: RunPowerShell }\n\nfunction writeUserEnvironment({ values, runPowerShell }: WriteUserEnvironmentParams): void {\n // `undefined` becomes `null` before stringifying: JSON.stringify would drop the key and turn a\n // removal into a silent no-op.\n const payload = JSON.stringify({\n values: Object.fromEntries(Object.entries(values).map(([name, value]) => [name, value ?? null])),\n })\n const result = runPowerShell({ script: WRITE_SCRIPT, input: payload })\n if (result.code !== 0) {\n throw new UserEnvironmentWriteError(\n `the Windows user environment could not be written (PowerShell exited ${result.code})`,\n listWrittenNames(values, result.stdout),\n )\n }\n}\n\nconst LINE_BREAK = /\\r?\\n/\n\n// The script prints each name once it is set; anything else PowerShell prints is not a name we sent.\nfunction listWrittenNames(values: UserEnvironmentValues, stdout: string): string[] {\n const printed = new Set(stdout.split(LINE_BREAK))\n return Object.keys(values).filter((name) => printed.has(name))\n}\n","import { displayPath } from '../../../shared/text/display-path'\nimport { readWrittenNames } from './user-environment'\n\nexport type DescribeUserEnvironmentFailureParams = { action: 'read' | 'write'; envPath: string; home: string }\n\nexport function describeUserEnvironmentFailure({\n action,\n envPath,\n home,\n}: DescribeUserEnvironmentFailureParams): string {\n const fallback = displayPath(envPath, home)\n if (action === 'read') {\n return `Could not read the Windows user environment, so it was left as it is. The key is still in ${fallback}.`\n }\n\n return (\n `Could not set the key in the Windows user environment, so a new terminal will not see it yet. ` +\n `The key is still in ${fallback} — load it there, or set the variable yourself.`\n )\n}\n\nexport type DescribeUserEnvironmentWriteFailureParams = { error: unknown; envPath: string; home: string }\n\nexport function describeUserEnvironmentWriteFailure({\n error,\n envPath,\n home,\n}: DescribeUserEnvironmentWriteFailureParams): string {\n const writtenNames = readWrittenNames(error)\n if (writtenNames.length === 0) return describeUserEnvironmentFailure({ action: 'write', envPath, home })\n\n return (\n `Only ${writtenNames.join(', ')} reached the Windows user environment before the write failed, so a new ` +\n 'terminal will not see the others. Run again to set them.'\n )\n}\n","import { readFileMode } from './read-file-mode'\nimport { resolveOwnerOnlyMode } from './resolve-owner-only-mode'\n\nexport type ResolveWriteModeParams = { filePath: string; hasSecret: boolean; platform: NodeJS.Platform }\n\n// A file that holds the key is tightened even when it existed looser: agents create their configs at 0644.\nexport function resolveWriteMode({ filePath, hasSecret, platform }: ResolveWriteModeParams): number | null {\n if (hasSecret) return resolveOwnerOnlyMode(platform)\n\n return readFileMode(filePath, platform)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { WriteFileWithModeParams } from './write-file-with-mode'\n\nconst DEFAULT_FILE_MODE = 0o666\nconst SYMBOLIC_LINK_LOOP_CODE = 'ELOOP'\n\n// Windows has no O_NOFOLLOW, so there the link is caught by an lstat just before the open.\nexport function writeFileRefusingLinks({ filePath, content, mode }: WriteFileWithModeParams): void {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n if (fs.constants.O_NOFOLLOW === undefined && fs.lstatSync(filePath, { throwIfNoEntry: false })?.isSymbolicLink()) {\n throw Object.assign(new Error(`${filePath} is a symbolic link, so it was not written.`), {\n code: SYMBOLIC_LINK_LOOP_CODE,\n path: filePath,\n })\n }\n\n const flags = fs.constants.O_WRONLY | fs.constants.O_CREAT | (fs.constants.O_NOFOLLOW ?? 0)\n const descriptor = fs.openSync(filePath, flags, mode ?? DEFAULT_FILE_MODE)\n try {\n // Before the truncate, so the key never lands under looser bits; the open's mode covers only a new file.\n if (mode !== null) fs.fchmodSync(descriptor, mode)\n fs.ftruncateSync(descriptor)\n fs.writeFileSync(descriptor, content)\n } finally {\n fs.closeSync(descriptor)\n }\n}\n","import { isDeepStrictEqual } from 'node:util'\nimport type { DetectedHarness } from '../../harnesses/detected-harness'\nimport type { ConfigurableHarness, Contribution, FileContribution } from '../../harnesses/harness'\nimport type { DesiredByAgent, DesiredConfig } from '../../product/public-api/desired-config'\nimport { NO_ENV_FILE, readEnvFile, type EnvFileRead } from '../../product/storage/env-file/read-env-file'\nimport { renderEnvFile, type EnvFileVariables } from '../../product/storage/env-file/render-env-file'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport type { RecordedKey } from '../../product/storage/restore-record/restore-record'\nimport { describeUserEnvironmentFailure } from '../../product/storage/windows-environment/describe-user-environment-failure'\nimport {\n planUserEnvironment,\n UserEnvironmentError,\n type UserEnvironment,\n type UserEnvironmentPlan,\n} from '../../product/storage/windows-environment/user-environment'\nimport { ConfigFormatError } from '../../shared/file-formats/config-errors'\nimport { readOriginals, renderConfig, type ConfigFormat } from '../../shared/file-formats/config-format'\nimport { assertNoLinkEscape } from '../../shared/file-system/assert-no-link-escape'\nimport { describeFileError } from '../../shared/file-system/errors/describe-file-error'\nimport { readFileIfExists } from '../../shared/file-system/read-file-if-exists'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { displayPath, displayRelativePath } from '../../shared/text/display-path'\nimport {\n isPlanned,\n type EnvPlan,\n type FailedOutcome,\n type FilePlan,\n type HarnessFilePlan,\n type HarnessOutcome,\n type PlannedOutcome,\n} from './configure-result'\n\nexport type PlanChangesParams = {\n selected: readonly DetectedHarness[]\n desiredByAgent: DesiredByAgent\n ctx: PlatformContext\n envPath: string\n shell: Shell\n isDryRun: boolean\n userEnvironment: UserEnvironment\n}\n\nexport type ChangePlan = {\n outcomes: HarnessOutcome[]\n envFile: EnvPlan | null\n userEnvironment: UserEnvironmentPlan | null\n}\n\nexport function planChanges(params: PlanChangesParams): ChangePlan {\n const { envPath, shell } = params\n const drafts = params.selected.map((candidate) => planHarness(candidate, params))\n const envFileRead = drafts.some(hasEnvVariables) ? readEnvFile({ envPath, home: params.ctx.home }) : NO_ENV_FILE\n const userEnvironment = planSetupUserEnvironment({ drafts, params })\n const outcomes = drafts.map((draft) =>\n settleOutcome({ draft, envFileRead, shell, userEnvironment: userEnvironment.plan }),\n )\n return {\n outcomes: addUserEnvironmentWarning({ outcomes, warning: userEnvironment.warning }),\n envFile: planEnvFile({ outcomes, envFileRead, envPath, shell }),\n userEnvironment: userEnvironment.plan,\n }\n}\n\nexport function listChangedFiles({ outcomes, envFile }: ChangePlan): FilePlan[] {\n const changedFiles = outcomes.flatMap((outcome) =>\n outcome.kind === 'updated' ? outcome.files.filter((file) => file.isChanged) : [],\n )\n return envFile?.isChanged === true ? [...changedFiles, envFile] : changedFiles\n}\n\nexport type RenderEnvPlanParams = {\n outcomes: readonly HarnessOutcome[]\n before: string | null\n envPath: string\n shell: Shell\n}\n\nexport function renderEnvPlan({ outcomes, before, envPath, shell }: RenderEnvPlanParams): EnvPlan | null {\n const variables = Object.fromEntries(\n outcomes.flatMap((outcome) => (isPlanned(outcome) ? Object.entries(outcome.envVariables) : [])),\n )\n if (Object.keys(variables).length === 0) return null\n\n const after = renderEnvFile({ current: before, variables, shell })\n return { path: envPath, before, after, isChanged: before !== after, shell }\n}\n\ntype Draft = Exclude<HarnessOutcome, PlannedOutcome> | (Omit<PlannedOutcome, 'kind'> & { kind: 'planned' })\n\nfunction planHarness({ harness, detection }: DetectedHarness, params: PlanChangesParams): Draft {\n if (harness.kind === 'unsupported') return { kind: 'unsupported', harness }\n if (detection.kind === 'failed') return { kind: 'failed', harness, error: detection.detail }\n if (detection.kind === 'not-found') {\n return { kind: 'not-found', harness, detail: `${detection.detail} — skipped, and no config was created` }\n }\n\n const desired = requireDesired(harness, params.desiredByAgent)\n try {\n return planConfigurableHarness({ harness, desired, ctx: params.ctx, isDryRun: params.isDryRun })\n } catch (error) {\n return { kind: 'failed', harness, error: describeFileError({ error, action: 'read', home: params.ctx.home }) }\n }\n}\n\nfunction requireDesired(harness: ConfigurableHarness, desiredByAgent: DesiredByAgent): DesiredConfig {\n const desired = desiredByAgent.get(harness.id)\n if (desired === undefined) throw new Error(`${harness.label} has no desired config.`)\n return desired\n}\n\ntype PlanConfigurableHarnessParams = {\n harness: ConfigurableHarness\n desired: DesiredConfig\n ctx: PlatformContext\n isDryRun: boolean\n}\n\nconst PROJECT_ENV_REFUSAL =\n 'The env file it reads is user-level only, so a project-level run cannot set it up. Run again with --scope user.'\n\nconst ENV_ONLY_DETAIL = 'environment variables only'\n\nfunction planConfigurableHarness({ harness, desired, ctx, isDryRun }: PlanConfigurableHarnessParams): Draft {\n const contributions = harness.plan(desired, ctx)\n if (ctx.scope === 'project' && contributions.some(({ kind }) => kind === 'env')) {\n return { kind: 'failed', harness, error: PROJECT_ENV_REFUSAL }\n }\n if (ctx.scope === 'project') {\n for (const contribution of contributions) {\n if (contribution.kind === 'file') assertNoLinkEscape({ filePath: contribution.path, root: ctx.cwd })\n }\n }\n\n const files = contributions.flatMap((contribution) =>\n contribution.kind === 'file' ? [planFile({ contribution, apiKey: desired.apiKey, home: ctx.home })] : [],\n )\n const repositoryWarnings = files.flatMap((file) => warnAboutRepository(file, ctx, isDryRun))\n return {\n kind: 'planned',\n harness,\n model: desired.model,\n detail: files.length > 0 ? files.map((file) => displayPath(file.path, ctx.home)).join(', ') : ENV_ONLY_DETAIL,\n files,\n envVariables: collectEnvVariables(contributions),\n warnings: [...repositoryWarnings, ...(harness.warnings?.(ctx) ?? [])],\n }\n}\n\ntype PlanFileParams = { contribution: FileContribution; apiKey: string; home: string }\n\nfunction planFile({ contribution, apiKey, home }: PlanFileParams): HarnessFilePlan {\n const before = readFileIfExists(contribution.path)\n const rendered = renderFileContribution({ contribution, before, apiKey, home })\n const isChanged = before !== rendered.after\n return { path: contribution.path, before, ...rendered, isChanged, hasSecret: contribution.hasSecret }\n}\n\ntype RenderFileContributionParams = PlanFileParams & { before: string | null }\n\ntype RenderedFile = { after: string; format: ConfigFormat; originals: RecordedKey[] }\n\nfunction renderFileContribution(params: RenderFileContributionParams): RenderedFile {\n const { contribution, before, apiKey, home } = params\n try {\n const edits = contribution.edits(before)\n const secretKeyPaths = edits.updates.flatMap(([keyPath, value]) => (value === apiKey ? [keyPath] : []))\n const originals = readOriginals(before, edits).map((original) => ({\n ...original,\n holdsSecret: secretKeyPaths.some((keyPath) => isDeepStrictEqual(keyPath, original.keyPath)),\n }))\n return { after: renderConfig(before, edits), format: edits.format, originals }\n } catch (error) {\n if (!(error instanceof ConfigFormatError)) throw error\n throw new Error(`${displayPath(contribution.path, home)}: ${error.message}`, { cause: error })\n }\n}\n\nfunction warnAboutRepository(file: HarnessFilePlan, ctx: PlatformContext, isDryRun: boolean): string[] {\n if (ctx.scope === 'user' || !file.hasSecret) return []\n\n const displayedPath = displayRelativePath(file.path, ctx.cwd)\n const location = isDryRun ? `A real run puts the key in ${displayedPath}` : `${displayedPath} holds the key`\n return [`${location}, inside your repository — make sure it is gitignored before committing.`]\n}\n\nfunction collectEnvVariables(contributions: readonly Contribution[]): EnvFileVariables {\n return Object.fromEntries(\n contributions.flatMap((contribution) =>\n contribution.kind === 'env' ? Object.entries(contribution.variables) : [],\n ),\n )\n}\n\nfunction hasEnvVariables(draft: Draft): boolean {\n return draft.kind === 'planned' && Object.keys(draft.envVariables).length > 0\n}\n\ntype SettleOutcomeParams = {\n draft: Draft\n envFileRead: EnvFileRead\n shell: Shell\n userEnvironment: UserEnvironmentPlan | null\n}\n\nfunction settleOutcome({ draft, envFileRead, shell, userEnvironment }: SettleOutcomeParams): HarnessOutcome {\n if (draft.kind !== 'planned') return draft\n if (envFileRead.kind === 'failed' && hasEnvVariables(draft)) return failWith(draft, envFileRead.error)\n\n const envText = envFileRead.kind === 'read' ? envFileRead.text : null\n const hasOwnEnvChange =\n hasEnvVariables(draft) && renderEnvFile({ current: envText, variables: draft.envVariables, shell }) !== envText\n const hasOwnUserEnvironmentChange =\n userEnvironment !== null &&\n Object.keys(draft.envVariables).some((name) => userEnvironment.before[name] !== userEnvironment.after[name])\n const isChanged = hasOwnEnvChange || hasOwnUserEnvironmentChange || draft.files.some((file) => file.isChanged)\n return { ...draft, kind: isChanged ? 'updated' : 'unchanged' }\n}\n\ntype SetupUserEnvironment = { plan: UserEnvironmentPlan | null; warning: string | null }\n\ntype PlanSetupUserEnvironmentParams = { drafts: readonly Draft[]; params: PlanChangesParams }\n\nfunction planSetupUserEnvironment({ drafts, params }: PlanSetupUserEnvironmentParams): SetupUserEnvironment {\n if (params.ctx.platform !== 'win32') return { plan: null, warning: null }\n\n const values = Object.fromEntries(\n drafts.flatMap((draft) => (draft.kind === 'planned' ? Object.entries(draft.envVariables) : [])),\n )\n if (Object.keys(values).length === 0) return { plan: null, warning: null }\n\n try {\n return { plan: planUserEnvironment({ values, userEnvironment: params.userEnvironment }), warning: null }\n } catch (error) {\n if (!(error instanceof UserEnvironmentError)) throw error\n return {\n plan: null,\n warning: describeUserEnvironmentFailure({ action: 'read', envPath: params.envPath, home: params.ctx.home }),\n }\n }\n}\n\ntype AddUserEnvironmentWarningParams = { outcomes: readonly HarnessOutcome[]; warning: string | null }\n\nfunction addUserEnvironmentWarning({ outcomes, warning }: AddUserEnvironmentWarningParams): HarnessOutcome[] {\n if (warning === null) return [...outcomes]\n\n return outcomes.map((outcome) =>\n isPlanned(outcome) && Object.keys(outcome.envVariables).length > 0\n ? { ...outcome, warnings: [...outcome.warnings, warning] }\n : outcome,\n )\n}\n\nfunction failWith({ harness }: Draft, error: string): FailedOutcome {\n return { kind: 'failed', harness, error }\n}\n\ntype PlanEnvFileParams = {\n outcomes: readonly HarnessOutcome[]\n envFileRead: EnvFileRead\n envPath: string\n shell: Shell\n}\n\nfunction planEnvFile({ outcomes, envFileRead, envPath, shell }: PlanEnvFileParams): EnvPlan | null {\n if (envFileRead.kind === 'failed') return null\n\n return renderEnvPlan({ outcomes, before: envFileRead.text, envPath, shell })\n}\n","import { describeFileError } from '../../../shared/file-system/errors/describe-file-error'\nimport { readFileIfExists } from '../../../shared/file-system/read-file-if-exists'\n\nexport type EnvFileRead = { kind: 'read'; text: string | null } | { kind: 'failed'; error: string }\n\nexport const NO_ENV_FILE: EnvFileRead = { kind: 'read', text: null }\n\nexport type ReadEnvFileParams = { envPath: string; home: string }\n\nexport function readEnvFile({ envPath, home }: ReadEnvFileParams): EnvFileRead {\n try {\n return { kind: 'read', text: readFileIfExists(envPath) }\n } catch (error) {\n return { kind: 'failed', error: describeFileError({ error, action: 'read', home }) }\n }\n}\n","const LINE_BREAK = /\\r?\\n/\n\nexport function splitLines(text: string): string[] {\n return text.split(LINE_BREAK)\n}\n","import { detectLineEnding, type LineEnding } from '../../../shared/file-formats/detect-line-ending'\nimport { splitByteOrderMark } from '../../../shared/file-formats/split-byte-order-mark'\nimport { splitLines } from './split-lines'\nimport { SHELLS, type EnvSyntax, type EnvVariable, type Shell } from './syntax/env-syntax'\nimport { ENV_SYNTAXES } from './syntax/env-syntaxes'\n\n/** Undefined removes the variable's assignments rather than writing one. */\nexport type EnvFileVariables = Readonly<Record<string, string | undefined>>\n\nexport type RenderEnvFileParams = { current: string | null; variables: EnvFileVariables; shell: Shell }\n\nexport function renderEnvFile({ current, variables, shell }: RenderEnvFileParams): string {\n const syntax = ENV_SYNTAXES[shell]\n const { byteOrderMark, body: existing } = splitByteOrderMark(current ?? '')\n const lineEnding = detectLineEnding(existing) ?? syntax.defaultLineEnding\n const removedNames = new Set(\n Object.entries(variables).flatMap(([name, value]) => (value === undefined ? [syntax.normalizeName(name)] : [])),\n )\n\n const bodyLines = splitLines(existing).filter(\n (line) => !isHeaderLine(line) && !isAssignmentOf({ line, names: removedNames, syntax }),\n )\n const { lines, missing } = replaceAssignments({ lines: bodyLines, variables, syntax })\n const body = appendMissing({ lines: trimBlankLines(lines), missing, syntax })\n\n return byteOrderMark + joinLines([...syntax.headerLines, ...body], lineEnding)\n}\n\nexport type RemoveEnvVariablesParams = { current: string; names: readonly string[]; shell: Shell }\n\nexport function removeEnvVariables({ current, names, shell }: RemoveEnvVariablesParams): string {\n const syntax = ENV_SYNTAXES[shell]\n const { byteOrderMark, body: existing } = splitByteOrderMark(current)\n const lineEnding = detectLineEnding(existing) ?? syntax.defaultLineEnding\n const removedNames = new Set(names.map((name) => syntax.normalizeName(name)))\n\n const bodyLines = splitLines(existing).filter(\n (line) => !isHeaderLine(line) && !isAssignmentOf({ line, names: removedNames, syntax }),\n )\n return byteOrderMark + joinLines([...syntax.headerLines, ...trimBlankLines(bodyLines)], lineEnding)\n}\n\nconst HEADER_LINES = SHELLS.flatMap((shell) => ENV_SYNTAXES[shell].headerLines)\n\nfunction isHeaderLine(line: string): boolean {\n return HEADER_LINES.some((headerLine) => line.startsWith(headerLine))\n}\n\ntype ReplaceAssignmentsParams = { lines: readonly string[]; variables: EnvFileVariables; syntax: EnvSyntax }\ntype ReplaceAssignmentsResult = { lines: string[]; missing: EnvVariable[] }\n\nfunction replaceAssignments(params: ReplaceAssignmentsParams): ReplaceAssignmentsResult {\n const { lines, variables, syntax } = params\n const pending = new Map(\n Object.entries(variables).flatMap(([name, value]) =>\n value === undefined ? [] : [[syntax.normalizeName(name), { name, value }] as const],\n ),\n )\n const replacedNames = new Set<string>()\n const kept: string[] = []\n\n for (const line of lines) {\n const name = matchNormalizedName(line, syntax)\n if (name !== undefined && replacedNames.has(name)) continue\n\n const variable = name === undefined ? undefined : pending.get(name)\n if (name === undefined || variable === undefined) {\n kept.push(line)\n continue\n }\n\n kept.push(syntax.formatAssignment(variable))\n pending.delete(name)\n replacedNames.add(name)\n }\n\n return { lines: kept, missing: [...pending.values()] }\n}\n\nfunction matchNormalizedName(line: string, syntax: EnvSyntax): string | undefined {\n const assignment = syntax.matchAssignment(line)\n if (assignment === undefined) return undefined\n return syntax.normalizeName(assignment.name)\n}\n\ntype IsAssignmentOfParams = { line: string; names: ReadonlySet<string>; syntax: EnvSyntax }\n\nfunction isAssignmentOf({ line, names, syntax }: IsAssignmentOfParams): boolean {\n const name = matchNormalizedName(line, syntax)\n return name !== undefined && names.has(name)\n}\n\nfunction trimBlankLines(lines: readonly string[]): readonly string[] {\n const firstIndex = lines.findIndex((line) => !isBlank(line))\n if (firstIndex === -1) return []\n\n const lastIndex = lines.findLastIndex((line) => !isBlank(line))\n return lines.slice(firstIndex, lastIndex + 1)\n}\n\nfunction isBlank(line: string): boolean {\n return line.trim() === ''\n}\n\ntype AppendMissingParams = { lines: readonly string[]; missing: readonly EnvVariable[]; syntax: EnvSyntax }\n\nfunction appendMissing({ lines, missing, syntax }: AppendMissingParams): readonly string[] {\n if (missing.length === 0) return lines\n\n const assignments = [...missing].sort(compareByName).map((variable) => syntax.formatAssignment(variable))\n if (lines.length === 0) return assignments\n return [...lines, '', ...assignments]\n}\n\nfunction compareByName(first: EnvVariable, second: EnvVariable): number {\n if (first.name < second.name) return -1\n if (first.name > second.name) return 1\n return 0\n}\n\nfunction joinLines(lines: readonly string[], lineEnding: LineEnding): string {\n return lines.map((line) => line + lineEnding).join('')\n}\n","import { match } from 'ts-pattern'\nimport { parseJsonc, parseJsoncValue, readJsoncOriginals, renderJsonc, restoreJsonc } from './json/jsonc'\nimport type { KeyOriginal } from './key-original'\nimport type { KeyPathUpdates } from './key-path'\nimport { parseToml, parseTomlValue, readTomlOriginals, renderToml, restoreToml, type TomlUpdate } from './toml'\n\nexport const CONFIG_FORMATS = ['jsonc', 'toml'] as const\n\nexport type ConfigFormat = (typeof CONFIG_FORMATS)[number]\n\nexport type ConfigEdits =\n | { format: 'jsonc'; updates: KeyPathUpdates }\n | { format: 'toml'; updates: readonly TomlUpdate[] }\n\nexport function renderConfig(current: string | null, edits: ConfigEdits): string {\n return match(edits)\n .with({ format: 'jsonc' }, ({ updates }) => renderJsonc(current, updates))\n .with({ format: 'toml' }, ({ updates }) => renderToml(current, updates))\n .exhaustive()\n}\n\nexport function readOriginals(current: string | null, edits: ConfigEdits): KeyOriginal[] {\n const keyPaths = edits.updates.map(([keyPath]) => keyPath)\n return match(edits.format)\n .with('jsonc', () => readJsoncOriginals(current, keyPaths))\n .with('toml', () => readTomlOriginals(current, keyPaths))\n .exhaustive()\n}\n\nexport type RestoreConfigParams = { format: ConfigFormat; current: string; originals: readonly KeyOriginal[] }\n\nexport function restoreConfig({ format, current, originals }: RestoreConfigParams): string {\n return match(format)\n .with('jsonc', () => restoreJsonc(current, originals))\n .with('toml', () => restoreToml(current, originals))\n .exhaustive()\n}\n\nexport function isEmptyConfig(format: ConfigFormat, text: string): boolean {\n const document = match(format)\n .with('jsonc', () => parseJsonc(text))\n .with('toml', () => parseToml(text))\n .exhaustive()\n return Object.keys(document).length === 0\n}\n\nexport function parseValueSource(format: ConfigFormat, source: string): unknown {\n return match(format)\n .with('jsonc', () => parseJsoncValue(source))\n .with('toml', () => parseTomlValue(source))\n .exhaustive()\n}\n","import { splitLines } from './split-lines'\nimport type { Shell } from './syntax/env-syntax'\nimport { ENV_SYNTAXES } from './syntax/env-syntaxes'\n\nexport function parseEnvFile(text: string, shell: Shell): Map<string, string> {\n const syntax = ENV_SYNTAXES[shell]\n const values = new Map<string, string>()\n\n for (const line of splitLines(text)) {\n const assignment = syntax.matchAssignment(line)\n if (assignment === undefined) continue\n\n const name = syntax.normalizeName(assignment.name)\n const value = syntax.parseValue(assignment.rawValue)\n if (value === undefined) values.delete(name)\n else values.set(name, value)\n }\n\n return values\n}\n","import type { FileOrigin, HarnessRecord, RecordedEnvVariable, RecordedFile, RestoreRecord } from './restore-record'\n\nexport function classifyFileOrigin(before: string | null): FileOrigin {\n if (before === null) return 'absent'\n return before.trim() === '' ? 'blank' : 'content'\n}\n\nexport type AddFileOriginalsParams = { record: RestoreRecord; harnessId: string; file: RecordedFile }\n\n/** First touch wins: a key already recorded keeps its original, and only new key paths are added. */\nexport function addFileOriginals({ record, harnessId, file }: AddFileOriginalsParams): RestoreRecord {\n const harness = readHarnessRecord(record, harnessId)\n const existing = harness.files.find((recorded) => isSamePath(recorded.path, file.path))\n const others = harness.files.filter((recorded) => recorded !== existing)\n return withHarnessRecord(record, harnessId, { ...harness, files: [...others, mergeFile(existing, file)] })\n}\n\nexport type AddEnvOriginalsParams = {\n record: RestoreRecord\n harnessId: string\n variables: readonly RecordedEnvVariable[]\n isFileAbsent: boolean\n}\n\nexport function addEnvOriginals({ record, harnessId, variables, isFileAbsent }: AddEnvOriginalsParams): RestoreRecord {\n const harness = readHarnessRecord(record, harnessId)\n const kept = isFileAbsent ? [] : harness.envVariables\n const added = variables.filter((variable) => !kept.some(({ name }) => name === variable.name))\n return withHarnessRecord(record, harnessId, { ...harness, envVariables: [...kept, ...added] })\n}\n\nexport type AddUserEnvironmentOriginalsParams = { record: RestoreRecord; variables: readonly RecordedEnvVariable[] }\n\n/** First touch wins, with no file-absent reset: the user environment has no file to start over from. */\nexport function addUserEnvironmentOriginals({ record, variables }: AddUserEnvironmentOriginalsParams): RestoreRecord {\n const kept = record.userEnvironment\n const added = variables.filter((variable) => !kept.some(({ name }) => name === variable.name))\n return { ...record, userEnvironment: [...kept, ...added] }\n}\n\nconst EMPTY_HARNESS_RECORD: HarnessRecord = { files: [], envVariables: [] }\n\nfunction readHarnessRecord(record: RestoreRecord, harnessId: string): HarnessRecord {\n return record.harnesses[harnessId] ?? EMPTY_HARNESS_RECORD\n}\n\nfunction withHarnessRecord(record: RestoreRecord, harnessId: string, harness: HarnessRecord): RestoreRecord {\n return { ...record, harnesses: { ...record.harnesses, [harnessId]: harness } }\n}\n\n// A file absent now was deleted since it was recorded, so what it held then is no longer anything to restore.\nfunction mergeFile(existing: RecordedFile | undefined, file: RecordedFile): RecordedFile {\n if (existing === undefined || file.origin === 'absent') return file\n\n const added = file.keys.filter((key) => !existing.keys.some(({ keyPath }) => isSamePath(keyPath, key.keyPath)))\n return { ...existing, keys: [...existing.keys, ...added] }\n}\n\nfunction isSamePath(path: readonly string[], other: readonly string[]): boolean {\n return path.length === other.length && path.every((segment, index) => segment === other[index])\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport * as v from 'valibot'\nimport { CONFIG_FORMATS } from '../../../shared/file-formats/config-format'\nimport { parseJson } from '../../../shared/file-formats/json/parse-json'\nimport { readFileIfExists } from '../../../shared/file-system/read-file-if-exists'\nimport { resolveOwnerOnlyMode } from '../../../shared/file-system/resolve-owner-only-mode'\nimport { writeFileWithMode } from '../../../shared/file-system/write-file-with-mode'\nimport type { ConfigScope } from '../../../shared/platform/platform-context'\nimport { displayPath } from '../../../shared/text/display-path'\nimport { ENV_VARIABLE_NAME_PATTERN } from '../env-file/syntax/env-syntax'\n\nexport const FILE_ORIGINS = ['absent', 'blank', 'content'] as const\n\nexport type FileOrigin = (typeof FILE_ORIGINS)[number]\n\nconst RECORD_VERSION = 1\n\nconst SegmentsSchema = v.pipe(v.tupleWithRest([v.string()], v.string()), v.readonly())\n\nconst RecordedKeySchema = v.object({\n keyPath: SegmentsSchema,\n original: v.nullable(v.string()),\n createdParents: v.pipe(v.array(SegmentsSchema), v.readonly()),\n holdsSecret: v.boolean(),\n})\n\nconst RecordedFileSchema = v.object({\n path: SegmentsSchema,\n format: v.picklist(CONFIG_FORMATS),\n origin: v.picklist(FILE_ORIGINS),\n keys: v.pipe(v.array(RecordedKeySchema), v.readonly()),\n})\n\n// A restore writes the name unquoted into the env file, which a shell sources.\nconst RecordedEnvVariableSchema = v.object({\n name: v.pipe(v.string(), v.regex(ENV_VARIABLE_NAME_PATTERN)),\n original: v.nullable(v.string()),\n})\n\nconst HarnessRecordSchema = v.object({\n files: v.pipe(v.array(RecordedFileSchema), v.readonly()),\n envVariables: v.pipe(v.array(RecordedEnvVariableSchema), v.readonly()),\n})\n\n// A restore names a backup folder after the id, so one that could climb out of it is refused.\nconst HARNESS_ID_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n\nconst RestoreRecordSchema = v.object({\n version: v.literal(RECORD_VERSION),\n harnesses: v.record(v.pipe(v.string(), v.regex(HARNESS_ID_PATTERN)), HarnessRecordSchema),\n userEnvironment: v.optional(v.pipe(v.array(RecordedEnvVariableSchema), v.readonly()), []),\n})\n\nexport type RecordedPath = v.InferOutput<typeof SegmentsSchema>\n/** `holdsSecret` marks a key setup wrote the API key into, so whatever it held before may be a key too. */\nexport type RecordedKey = v.InferOutput<typeof RecordedKeySchema>\nexport type RecordedFile = v.InferOutput<typeof RecordedFileSchema>\nexport type RecordedEnvVariable = v.InferOutput<typeof RecordedEnvVariableSchema>\nexport type HarnessRecord = v.InferOutput<typeof HarnessRecordSchema>\nexport type RestoreRecord = v.InferOutput<typeof RestoreRecordSchema>\n\nexport function createEmptyRestoreRecord(): RestoreRecord {\n return { version: RECORD_VERSION, harnesses: {}, userEnvironment: [] }\n}\n\nexport function isRestoreRecordEmpty(record: RestoreRecord): boolean {\n return Object.keys(record.harnesses).length === 0 && record.userEnvironment.length === 0\n}\n\nexport class RestoreRecordError extends Error {\n override readonly name = 'RestoreRecordError'\n}\n\nexport type ReadRestoreRecordParams = { filePath: string; home: string; scope: ConfigScope }\n\nexport function readRestoreRecord({ filePath, home, scope }: ReadRestoreRecordParams): RestoreRecord | null {\n const text = readFileIfExists(filePath)\n if (text === null) return null\n\n const shownPath = displayPath(filePath, home)\n const json = parseJson(text)\n if (isNewerRecord(json)) {\n throw new RestoreRecordError(`${shownPath} was written by a newer nexos-connect. Update it, then run again.`)\n }\n\n const parsed = v.safeParse(RestoreRecordSchema, json)\n if (!parsed.success) {\n throw new RestoreRecordError(\n `${shownPath} is not a restore record nexos-connect can read. Fix it, or move it aside to start a new one, ` +\n 'then run again.',\n )\n }\n // Setup refuses every env variable at project scope, so a project record that lists one was not written by it.\n if (scope === 'project' && hasEnvVariables(parsed.output)) {\n throw new RestoreRecordError(\n `${shownPath} lists environment variables, which nexos-connect never records for a project, so it may have ` +\n 'come with the repository. Delete it, then run again.',\n )\n }\n return parsed.output\n}\n\nconst VersionSchema = v.object({ version: v.number() })\n\nfunction isNewerRecord(json: unknown): boolean {\n const parsed = v.safeParse(VersionSchema, json)\n return parsed.success && parsed.output.version > RECORD_VERSION\n}\n\nfunction hasEnvVariables(record: RestoreRecord): boolean {\n return (\n record.userEnvironment.length > 0 ||\n Object.values(record.harnesses).some((harness) => harness.envVariables.length > 0)\n )\n}\n\nexport type WriteRestoreRecordParams = { filePath: string; record: RestoreRecord; platform: NodeJS.Platform }\n\nconst RECORD_DIRECTORY_MODE = 0o700\nconst JSON_INDENT = 2\n\n/** A record with nothing left to restore is deleted, so a full restore leaves no file behind. */\nexport function writeRestoreRecord({ filePath, record, platform }: WriteRestoreRecordParams): void {\n if (isRestoreRecordEmpty(record)) {\n fs.rmSync(filePath, { force: true })\n return\n }\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: RECORD_DIRECTORY_MODE })\n const content = `${JSON.stringify(record, null, JSON_INDENT)}\\n`\n writeFileWithMode({ filePath, content, mode: resolveOwnerOnlyMode(platform) })\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport type { PlatformContext } from '../../../shared/platform/platform-context'\nimport { isInsideDirectory } from '../../../shared/text/is-inside-directory'\nimport { PROJECT_BACKUP_DIRECTORY } from '../backups/resolve-backup-root'\nimport { ENV_DIRECTORY_NAME } from '../env-file/syntax/env-syntax'\nimport type { RecordedPath } from './restore-record'\n\nexport const RESTORE_RECORD_FILE = 'restore-record.json'\n\nexport type RestoreRecordLocation = { filePath: string; root: string; gitIgnoredDirectory: string | null }\n\nexport function resolveRestoreRecordLocation(ctx: PlatformContext): RestoreRecordLocation {\n return match(ctx.scope)\n .returnType<RestoreRecordLocation>()\n .with('user', () => ({\n filePath: path.join(ctx.home, ENV_DIRECTORY_NAME, RESTORE_RECORD_FILE),\n root: ctx.home,\n gitIgnoredDirectory: null,\n }))\n .with('project', () => {\n const directory = path.join(ctx.cwd, PROJECT_BACKUP_DIRECTORY)\n return { filePath: path.join(directory, RESTORE_RECORD_FILE), root: ctx.cwd, gitIgnoredDirectory: directory }\n })\n .exhaustive()\n}\n\nexport function toRecordedPath(filePath: string, root: string): RecordedPath {\n const [first, ...rest] = path.relative(root, filePath).split(path.sep)\n if (first === undefined || !isInsideDirectory({ filePath, directory: root })) {\n throw new Error(`${filePath} is outside ${root}, so it cannot be recorded for a restore.`)\n }\n return [first, ...rest]\n}\n\n// The record is a plain file, at project scope one a repository could ship, so its paths are not trusted.\nexport function fromRecordedPath(recordedPath: RecordedPath, root: string): string {\n const filePath = path.join(root, ...recordedPath)\n if (!isInsideDirectory({ filePath, directory: root })) {\n throw new Error(\n `${filePath} is outside ${root}, so it cannot be restored. Remove it from the restore record, then run again.`,\n )\n }\n return filePath\n}\n","import { ignoreBackupsInGit } from '../../product/storage/backups/back-up-file'\nimport { parseEnvFile } from '../../product/storage/env-file/parse-env-file'\nimport { ENV_SYNTAXES } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport {\n addEnvOriginals,\n addFileOriginals,\n addUserEnvironmentOriginals,\n classifyFileOrigin,\n} from '../../product/storage/restore-record/add-originals'\nimport {\n createEmptyRestoreRecord,\n readRestoreRecord,\n writeRestoreRecord,\n type RecordedFile,\n type RestoreRecord,\n} from '../../product/storage/restore-record/restore-record'\nimport {\n resolveRestoreRecordLocation,\n toRecordedPath,\n type RestoreRecordLocation,\n} from '../../product/storage/restore-record/restore-record-location'\nimport type { UserEnvironmentPlan } from '../../product/storage/windows-environment/user-environment'\nimport { assertNoLinkEscape } from '../../shared/file-system/assert-no-link-escape'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { EnvPlan, HarnessFilePlan, HarnessOutcome } from './configure-result'\n\nexport type RecordFileOriginalsParams = { harnessId: string; file: HarnessFilePlan; ctx: PlatformContext }\n\nexport function recordFileOriginals({ harnessId, file, ctx }: RecordFileOriginalsParams): void {\n const location = resolveRestoreRecordLocation(ctx)\n const recordedFile: RecordedFile = {\n path: toRecordedPath(file.path, location.root),\n format: file.format,\n origin: classifyFileOrigin(file.before),\n keys: file.originals,\n }\n updateRestoreRecord(location, ctx, (record) => addFileOriginals({ record, harnessId, file: recordedFile }))\n}\n\nexport type RecordEnvOriginalsParams = { outcomes: readonly HarnessOutcome[]; envFile: EnvPlan; ctx: PlatformContext }\n\nexport function recordEnvOriginals({ outcomes, envFile, ctx }: RecordEnvOriginalsParams): void {\n const syntax = ENV_SYNTAXES[envFile.shell]\n const currentValues = parseEnvFile(envFile.before ?? '', envFile.shell)\n const isFileAbsent = envFile.before === null\n\n updateRestoreRecord(resolveRestoreRecordLocation(ctx), ctx, (record) =>\n outcomes.reduce((updated, outcome) => {\n if (outcome.kind !== 'updated') return updated\n\n const variables = Object.keys(outcome.envVariables).map((name) => ({\n name,\n original: currentValues.get(syntax.normalizeName(name)) ?? null,\n }))\n if (variables.length === 0) return updated\n return addEnvOriginals({ record: updated, harnessId: outcome.harness.id, variables, isFileAbsent })\n }, record),\n )\n}\n\nexport type RecordUserEnvironmentOriginalsParams = { userEnvironment: UserEnvironmentPlan; ctx: PlatformContext }\n\n/** A name whose `after` is undefined is recorded too, so a variable this run removes can be put back. */\nexport function recordUserEnvironmentOriginals({ userEnvironment, ctx }: RecordUserEnvironmentOriginalsParams): void {\n const variables = Object.keys(userEnvironment.after).map((name) => ({\n name,\n original: userEnvironment.before[name] ?? null,\n }))\n if (variables.length === 0) return\n\n updateRestoreRecord(resolveRestoreRecordLocation(ctx), ctx, (record) =>\n addUserEnvironmentOriginals({ record, variables }),\n )\n}\n\nfunction updateRestoreRecord(\n location: RestoreRecordLocation,\n ctx: PlatformContext,\n update: (record: RestoreRecord) => RestoreRecord,\n): void {\n if (ctx.scope === 'project') assertNoLinkEscape({ filePath: location.filePath, root: location.root })\n if (location.gitIgnoredDirectory !== null) ignoreBackupsInGit(location.gitIgnoredDirectory)\n\n const record =\n readRestoreRecord({ filePath: location.filePath, home: ctx.home, scope: ctx.scope }) ?? createEmptyRestoreRecord()\n writeRestoreRecord({ filePath: location.filePath, record: update(record), platform: ctx.platform })\n}\n","import { FINISHED_WITH_ERRORS, type FinishedOutcome } from '../../cli/command-outcome'\nimport type { CliOptions } from '../../cli/parse-cli-arguments'\nimport type { DetectedHarness } from '../../harnesses/detected-harness'\nimport type { ConfigurableHarness } from '../../harnesses/harness'\nimport type { DesiredByAgent } from '../../product/public-api/desired-config'\nimport type { Masker } from '../../product/secrets/masker'\nimport { formatBackupTimestamp, resolveBackupRoot } from '../../product/storage/backups/resolve-backup-root'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport type { UserEnvironment } from '../../product/storage/windows-environment/user-environment'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { formatCount } from '../../shared/text/format-count'\nimport { formatPreview } from '../../ui/report/preview/format-preview'\nimport { formatResult, type ResultMode, type RunHint } from '../../ui/report/result/format-result'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { commitSave, type CheckOutcome, type KeyStepDeps, type ResolvedKey } from '../key/key-step'\nimport { commitModelSave } from '../model/model-step'\nimport type { ModelSave } from '../model/pick-probed-model'\nimport { applyChanges, type ApplyChangesResult } from './apply-changes'\nimport { listChangedFiles, planChanges, type ChangePlan } from './change-plan'\nimport { hasFailedOutcome, isPlanned, type FailedOutcome, type HarnessOutcome } from './configure-result'\n\nexport type ConfigureRun = {\n options: Pick<CliOptions, 'isDryRun' | 'shouldAssumeYes' | 'backupDirectory'>\n ctx: PlatformContext\n shell: Shell\n envPath: string\n ui: TerminalUi\n masker: Masker\n now: () => Date\n userEnvironment: UserEnvironment\n}\n\nexport type KeySave = { resolved: ResolvedKey; check: CheckOutcome; deps: KeyStepDeps }\n\nexport type ConfigureAgentsParams = {\n run: ConfigureRun\n selected: readonly DetectedHarness[]\n desiredByAgent: DesiredByAgent\n /** Absent when the agents keep their current keys. */\n keySave: KeySave | undefined\n modelSaves: readonly ModelSave[]\n hasInstallFailure: boolean\n unchangeable: readonly FailedOutcome[]\n}\n\nexport function describeProbeConsequence({ isDryRun }: Pick<CliOptions, 'isDryRun'>): string {\n return isDryRun ? 'the dry run writes nothing either way' : 'the configs are written with this model'\n}\n\nexport const ABORTED: FinishedOutcome = {\n kind: 'backed-out',\n closing: { tone: 'cancel', message: 'Aborted — nothing was written.' },\n}\n\nexport async function reportUnchangeable(\n run: ConfigureRun,\n unchangeable: readonly FailedOutcome[],\n): Promise<FinishedOutcome> {\n return await configureAgents({\n run,\n selected: [],\n desiredByAgent: new Map(),\n keySave: undefined,\n modelSaves: [],\n hasInstallFailure: false,\n unchangeable,\n })\n}\n\nexport async function configureAgents(params: ConfigureAgentsParams): Promise<FinishedOutcome> {\n const { run, selected, desiredByAgent, keySave, modelSaves, hasInstallFailure } = params\n const { options, ctx, ui, masker } = run\n const report = (plan: ChangePlan, mode: ResultMode, outro: string): FinishedOutcome =>\n reportResult({ run, plan, mode, outro, hasInstallFailure })\n const saveKey = async (): Promise<void> => {\n if (keySave !== undefined) await commitSave(keySave.resolved, keySave.check, keySave.deps)\n }\n const saveModels = (outcomes: readonly HarnessOutcome[]): void => {\n for (const { model, harnesses } of modelSaves) {\n commitModelSave({ model, harnesses: listConfigured(harnesses, outcomes), home: ctx.home, ui, masker })\n }\n }\n\n const planned = planChanges({\n selected,\n desiredByAgent,\n ctx,\n envPath: run.envPath,\n shell: run.shell,\n isDryRun: options.isDryRun,\n userEnvironment: run.userEnvironment,\n })\n const plan: ChangePlan = { ...planned, outcomes: [...planned.outcomes, ...params.unchangeable] }\n const changes = listChangedFiles(plan)\n const isPlanFailed = hasFailedOutcome(plan.outcomes)\n ui.print(\n formatPreview({\n changes,\n userEnvironment: plan.userEnvironment,\n models: listDistinctModels(desiredByAgent),\n scope: ctx.scope,\n hasFailedAgent: isPlanFailed,\n home: ctx.home,\n masker,\n }),\n )\n\n if (options.isDryRun) {\n if (keySave?.resolved.shouldSave === true) ui.dim('Dry run — the key was not saved.')\n if (modelSaves.length > 0) ui.dim('Dry run — the default model was not saved.')\n return report(plan, { kind: 'dry-run' }, 'Dry run — nothing was written.')\n }\n if (changes.length === 0 && plan.userEnvironment?.isChanged !== true) {\n await saveKey()\n saveModels(plan.outcomes)\n const outro = isPlanFailed ? FINISHED_WITH_ERRORS : 'Nothing to do — already configured.'\n return report(plan, { kind: 'written', backupRoot: null }, outro)\n }\n if (!options.shouldAssumeYes && !(await ui.confirm('Write these changes? Originals are backed up first.', true))) {\n return ABORTED\n }\n\n await saveKey()\n const applied = writeChanges(run, plan)\n saveModels(applied.outcomes)\n const outro = hasFailedOutcome(applied.outcomes) ? FINISHED_WITH_ERRORS : 'Done.'\n return report(\n { outcomes: applied.outcomes, envFile: applied.envFile, userEnvironment: applied.userEnvironment },\n { kind: 'written', backupRoot: applied.backupRoot },\n outro,\n )\n}\n\n/** A default is saved only for an agent this run configured, not one whose write failed. */\nfunction listConfigured(\n harnesses: readonly ConfigurableHarness[],\n outcomes: readonly HarnessOutcome[],\n): ConfigurableHarness[] {\n const configuredIds = new Set(outcomes.filter(isPlanned).map((outcome) => outcome.harness.id))\n return harnesses.filter((harness) => configuredIds.has(harness.id))\n}\n\nfunction listDistinctModels(desiredByAgent: DesiredByAgent): string[] {\n return [...new Set([...desiredByAgent.values()].map(({ model }) => model))]\n}\n\nfunction writeChanges(run: ConfigureRun, plan: ChangePlan): ApplyChangesResult {\n const { options, ctx, ui } = run\n const backupRoot = resolveBackupRoot({\n scope: ctx.scope,\n home: ctx.home,\n cwd: ctx.cwd,\n stamp: formatBackupTimestamp(run.now()),\n backupDirectory: options.backupDirectory,\n })\n\n const spinner = ui.spinner()\n spinner.start('Backing up originals and writing configs…')\n const applied = applyChanges({ plan, ctx, backupRoot, userEnvironment: run.userEnvironment, envPath: run.envPath })\n spinner.stop(describeWritten(applied))\n return applied\n}\n\nfunction describeWritten(applied: ApplyChangesResult): string {\n if (applied.writtenCount > 0) return `Wrote ${formatCount(applied.writtenCount, 'file')}.`\n if (applied.userEnvironment !== null) return 'Updated the Windows user environment.'\n\n return 'Wrote 0 files.'\n}\n\ntype ReportResultParams = {\n run: ConfigureRun\n plan: ChangePlan\n mode: ResultMode\n outro: string\n hasInstallFailure: boolean\n}\n\nfunction reportResult({ run, plan, mode, outro, hasInstallFailure }: ReportResultParams): FinishedOutcome {\n const { ui, ctx, masker } = run\n ui.print(\n formatResult({\n outcomes: plan.outcomes,\n envFile: plan.envFile,\n userEnvironment: plan.userEnvironment,\n mode,\n shell: run.shell,\n home: ctx.home,\n masker,\n runHints: listRunHints(plan.outcomes, ctx),\n }),\n )\n const isFailed = hasInstallFailure || hasFailedOutcome(plan.outcomes)\n return { kind: isFailed ? 'failed' : 'done', closing: { tone: 'outro', message: outro } }\n}\n\nfunction listRunHints(outcomes: readonly HarnessOutcome[], ctx: PlatformContext): RunHint[] {\n return outcomes\n .filter(isPlanned)\n .flatMap(({ harness: { binary, label }, model }) =>\n binary !== undefined && ctx.hasBinary(binary) ? [{ binary, label, model }] : [],\n )\n}\n","import { match } from 'ts-pattern'\nimport {\n buildDesiredConfig,\n type DesiredByAgent,\n type DesiredConfig,\n type PublicApiUrls,\n} from '../../product/public-api/desired-config'\nimport type { KeyChoice } from '../key/key-step'\nimport type { ModelChoice } from '../model/pick-probed-model'\nimport { readCurrentValue, type AgentWithConfig } from './agent-with-config'\n\nexport type BuildDesiredByAgentParams = {\n targets: readonly AgentWithConfig[]\n keyChoice: KeyChoice\n modelChoice: ModelChoice\n publicApiUrls: PublicApiUrls\n}\n\nexport function buildDesiredByAgent({\n targets,\n keyChoice,\n modelChoice,\n publicApiUrls,\n}: BuildDesiredByAgentParams): DesiredByAgent {\n return new Map(\n targets.map((target): [string, DesiredConfig] => [\n target.harness.id,\n buildDesiredConfig({\n publicApiUrls,\n apiKey: pickKey(target, keyChoice),\n model: pickModel(target, modelChoice),\n }),\n ]),\n )\n}\n\nfunction pickKey(target: AgentWithConfig, keyChoice: KeyChoice): string {\n return match(keyChoice)\n .with({ kind: 'one' }, ({ resolved }) => resolved.key)\n .with({ kind: 'each-current' }, () => requireCurrent(target, 'key'))\n .exhaustive()\n}\n\nfunction pickModel(target: AgentWithConfig, modelChoice: ModelChoice): string {\n return match(modelChoice)\n .with({ kind: 'picked' }, ({ modelByAgent }) => requirePicked(target, modelByAgent))\n .with({ kind: 'each-current' }, () => requireCurrent(target, 'model'))\n .exhaustive()\n}\n\nfunction requirePicked({ harness }: AgentWithConfig, modelByAgent: ReadonlyMap<string, string>): string {\n const model = modelByAgent.get(harness.id)\n if (model === undefined) throw new Error(`No model was picked for ${harness.label}.`)\n return model\n}\n\nfunction requireCurrent(agent: AgentWithConfig, field: 'key' | 'model'): string {\n const value = readCurrentValue(agent, field)\n if (value === undefined) throw new Error(`${agent.harness.label} has no current ${field} to keep.`)\n return value\n}\n","import { match } from 'ts-pattern'\nimport type { ConfigurableHarness } from '../../harnesses/harness'\nimport { readAgentConfig, type ReadAgentConfigParams } from '../../harnesses/read-agent-config'\nimport { harnesses } from '../../harnesses/registry'\nimport {\n groupValuesInUse,\n summarizeCurrentValues,\n type CurrentValues,\n type LabelledValue,\n type SummarizeCurrentValuesParams,\n type ValueInUse,\n} from '../../harnesses/summarize-current-values'\nimport type { CurrentModels, ModelInUse } from '../../ui/prompts/model/model-choices'\nimport type { CurrentKeys } from '../key/key-offers'\nimport type { AgentKey } from '../model/per-key/probe-groups'\nimport { readCurrentValue, type AgentWithConfig } from './agent-with-config'\n\nexport type CurrentConfigs = {\n targets: AgentWithConfig[]\n currentKeys: CurrentKeys\n currentModels: CurrentModels\n keptKeys: AgentKey[]\n}\n\ntype AgentLocation = Omit<ReadAgentConfigParams, 'harness'>\n\nexport type ReadCurrentConfigsParams = AgentLocation & { targets: readonly ConfigurableHarness[] }\n\nexport function readCurrentConfigs({ targets, ...location }: ReadCurrentConfigsParams): CurrentConfigs {\n const targetAgents = readAgents(targets, location)\n const targetIds = new Set(targets.map(({ id }) => id))\n const others = listConfigurable().filter(({ id }) => !targetIds.has(id))\n return summarizeCurrentConfigs({ targets: targetAgents, agents: [...targetAgents, ...readAgents(others, location)] })\n}\n\nexport function readConfigurableAgents(location: AgentLocation): AgentWithConfig[] {\n return readAgents(listConfigurable(), location)\n}\n\nexport type SummarizeCurrentConfigsParams = { targets: readonly AgentWithConfig[]; agents: readonly AgentWithConfig[] }\n\n/** \"In use\" covers every agent configured at the scope, not only the targets. */\nexport function summarizeCurrentConfigs({ targets, agents }: SummarizeCurrentConfigsParams): CurrentConfigs {\n return {\n targets: [...targets],\n currentKeys: listCurrentValues({ targets, agents, field: 'key' }),\n currentModels: describeCurrentModels(\n summarizeCurrentValues(listCurrentValues({ targets, agents, field: 'model' })),\n ),\n keptKeys: targets.flatMap((agent) => {\n const key = readCurrentValue(agent, 'key')\n return key === undefined ? [] : [{ harness: agent.harness, key }]\n }),\n }\n}\n\nexport function listModelsInUse(agents: readonly AgentWithConfig[]): ModelInUse[] {\n return groupValuesInUse(listLabelledValues(agents, 'model')).map(describeModelInUse)\n}\n\ntype ListCurrentValuesParams = SummarizeCurrentConfigsParams & { field: 'key' | 'model' }\n\nfunction listCurrentValues({ targets, agents, field }: ListCurrentValuesParams): SummarizeCurrentValuesParams {\n return {\n targets: targets.map((agent) => ({ label: agent.harness.label, value: readCurrentValue(agent, field) })),\n inUse: listLabelledValues(agents, field),\n }\n}\n\nfunction listLabelledValues(agents: readonly AgentWithConfig[], field: 'key' | 'model'): LabelledValue[] {\n return agents.flatMap((agent) => {\n const value = readCurrentValue(agent, field)\n return value === undefined ? [] : [{ label: agent.harness.label, value }]\n })\n}\n\nfunction describeCurrentModels(current: CurrentValues): CurrentModels {\n return match(current)\n .returnType<CurrentModels>()\n .with({ kind: 'keep' }, ({ value, labels }) => ({ kind: 'keep', model: value, labels }))\n .with({ kind: 'keep-each' }, ({ perAgent }) => ({\n kind: 'keep-each',\n perAgent: perAgent.map(({ label, value }) => ({ label, model: value })),\n }))\n .with({ kind: 'in-use' }, ({ inUse }) => ({ kind: 'in-use', models: inUse.map(describeModelInUse) }))\n .with({ kind: 'none' }, () => ({ kind: 'none' }))\n .exhaustive()\n}\n\nfunction describeModelInUse({ value, labels }: ValueInUse): ModelInUse {\n return { model: value, labels }\n}\n\nfunction listConfigurable(): ConfigurableHarness[] {\n return harnesses.flatMap((harness) => (harness.kind === 'configurable' ? [harness] : []))\n}\n\nfunction readAgents(candidates: readonly ConfigurableHarness[], location: AgentLocation): AgentWithConfig[] {\n return candidates.map((harness) => ({ harness, current: readAgentConfig({ harness, ...location }) }))\n}\n","import { parseEnvFile } from '../product/storage/env-file/parse-env-file'\nimport { readEnvFile } from '../product/storage/env-file/read-env-file'\nimport type { Shell } from '../product/storage/env-file/syntax/env-syntax'\nimport { describeFileError } from '../shared/file-system/errors/describe-file-error'\nimport { readFileIfExists } from '../shared/file-system/read-file-if-exists'\nimport type { PlatformContext } from '../shared/platform/platform-context'\nimport { displayPath } from '../shared/text/display-path'\nimport { readNonBlank } from '../shared/text/read-non-blank'\nimport type { ConfigurableHarness, HarnessInspection } from './harness'\n\nexport type AgentConfig =\n | { kind: 'configured'; key: string | undefined; model: string | undefined }\n | { kind: 'not-configured' }\n | { kind: 'unreadable'; detail: string }\n\nexport type ReadAgentConfigParams = {\n harness: ConfigurableHarness\n ctx: PlatformContext\n envPath: string\n shell: Shell\n}\n\ntype EnvLookup = (variable: string) => string | undefined\n\nexport function readAgentConfig(params: ReadAgentConfigParams): AgentConfig {\n const { harness, ctx } = params\n if (ctx.scope === 'project' && harness.projectSupport.kind === 'unsupported') return { kind: 'not-configured' }\n\n try {\n const variables = memoize(() => readEnvVariables(params))\n const lookup: EnvLookup = (variable) => readNonBlank(variables().get(variable))\n\n const inspection = inspectWith(params, lookup)\n if (inspection.isUnreadable) return { kind: 'unreadable', detail: describeUnreadable(params) }\n if (!inspection.isConfigured) return { kind: 'not-configured' }\n\n return {\n kind: 'configured',\n key: readKeyWith(params, lookup),\n model: readModelWith({ harness, inspection, lookup }),\n }\n } catch (error) {\n return { kind: 'unreadable', detail: describeFileError({ error, action: 'read', home: ctx.home }) }\n }\n}\n\nexport function inspectAgent(params: ReadAgentConfigParams): HarnessInspection {\n const lookup = createTolerantLookup(params)\n const inspection = inspectWith(params, lookup)\n if (!inspection.isConfigured) return inspection\n\n return { ...inspection, model: readModelWith({ harness: params.harness, inspection, lookup }) }\n}\n\nexport function readConfigKey(params: ReadAgentConfigParams): string | undefined {\n return readKeyWith(params, createTolerantLookup(params))\n}\n\nfunction memoize<Value>(compute: () => Value): () => Value {\n let cached: { value: Value } | undefined\n return () => {\n cached ??= { value: compute() }\n return cached.value\n }\n}\n\nfunction readEnvVariables({ envPath, shell }: ReadAgentConfigParams): Map<string, string> {\n const text = readFileIfExists(envPath)\n return text === null ? new Map() : parseEnvFile(text, shell)\n}\n\nfunction inspectWith(params: ReadAgentConfigParams, lookup: EnvLookup): HarnessInspection {\n return params.harness.inspect?.(params.ctx) ?? inspectByKey(readKeyWith(params, lookup))\n}\n\nfunction describeUnreadable({ harness, ctx }: ReadAgentConfigParams): string {\n const configPath = harness.configPath?.(ctx)\n const subject = configPath === undefined ? 'its config' : displayPath(configPath, ctx.home)\n return `${subject} could not be read — fix it, then run again`\n}\n\nfunction inspectByKey(key: string | undefined): HarnessInspection {\n return { isConfigured: key !== undefined, model: undefined, isUnreadable: false }\n}\n\ntype ReadModelWithParams = { harness: ConfigurableHarness; inspection: HarnessInspection; lookup: EnvLookup }\n\nfunction readModelWith({ harness, inspection, lookup }: ReadModelWithParams): string | undefined {\n if (inspection.model !== undefined) return inspection.model\n\n return harness.modelEnvVariable === undefined ? undefined : lookup(harness.modelEnvVariable)\n}\n\nfunction readKeyWith({ harness, ctx }: ReadAgentConfigParams, lookup: EnvLookup): string | undefined {\n const fromConfig = harness.readKey?.(ctx)\n if (fromConfig !== undefined) return fromConfig\n\n return harness.keyEnvVariable === undefined ? undefined : lookup(harness.keyEnvVariable)\n}\n\nfunction createTolerantLookup({ ctx, envPath, shell }: ReadAgentConfigParams): EnvLookup {\n return (variable) => {\n const envRead = readEnvFile({ envPath, home: ctx.home })\n if (envRead.kind === 'failed' || envRead.text === null) return undefined\n return readNonBlank(parseEnvFile(envRead.text, shell).get(variable))\n }\n}\n","import path from 'node:path'\nimport { ENV_DIRECTORY_NAME, type Shell } from './syntax/env-syntax'\nimport { ENV_SYNTAXES } from './syntax/env-syntaxes'\n\nexport function resolveEnvFilePath(home: string, shell: Shell): string {\n return path.join(home, ENV_DIRECTORY_NAME, ENV_SYNTAXES[shell].fileName)\n}\n","import { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport { DEFAULT_SCOPE, type ConfigScope, type PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { readConfigurableAgents } from './read-current-configs'\n\nexport type ResolveChangeScopeParams = {\n requestedScope: ConfigScope | undefined\n shouldAssumeYes: boolean\n baseContext: PlatformContext\n ui: TerminalUi\n}\n\nexport type ChangeScope = { kind: 'chosen'; scope: ConfigScope } | { kind: 'nothing-configured' }\n\nexport async function resolveChangeScope({\n requestedScope,\n shouldAssumeYes,\n baseContext,\n ui,\n}: ResolveChangeScopeParams): Promise<ChangeScope> {\n if (requestedScope !== undefined) return { kind: 'chosen', scope: requestedScope }\n if (shouldAssumeYes) return { kind: 'chosen', scope: DEFAULT_SCOPE }\n\n const user = listConfiguredLabels({ ...baseContext, scope: 'user' })\n const project = listConfiguredLabels({ ...baseContext, scope: 'project' })\n if (user.length === 0 && project.length === 0) return { kind: 'nothing-configured' }\n\n return { kind: 'chosen', scope: await ui.selectChangeScope({ user, project }) }\n}\n\nfunction listConfiguredLabels(ctx: PlatformContext): string[] {\n const shell = resolveShell(ctx.platform)\n return readConfigurableAgents({ ctx, envPath: resolveEnvFilePath(ctx.home, shell), shell }).flatMap(\n ({ harness, current }) => (current.kind === 'not-configured' ? [] : [harness.label]),\n )\n}\n","import { match } from 'ts-pattern'\nimport type { FinishedOutcome } from '../../cli/command-outcome'\nimport { UsageError } from '../../cli/errors/usage-error'\nimport { COMMAND_NAME, SETUP_COMMAND } from '../../cli/help'\nimport type { DetectedHarness } from '../../harnesses/detected-harness'\nimport type { Harness } from '../../harnesses/harness'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { ConfigScope } from '../../shared/platform/platform-context'\nimport type { HarnessChoice } from '../../ui/prompts/select-harnesses'\nimport type { TargetChoices } from '../../ui/prompts/select-target-agents'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { readCurrentValue, type AgentWithConfig } from './agent-with-config'\nimport type { FailedOutcome } from './configure-result'\n\nexport type SelectTargetAgentsParams = {\n agents: readonly AgentWithConfig[]\n namedHarnesses: readonly Harness[]\n scope: ConfigScope\n changing: Changing\n shouldAssumeYes: boolean\n ui: TerminalUi\n masker: Masker\n}\n\ntype Changing = TargetChoices['changing']\n\nexport type SelectTargetAgentsResult =\n | { kind: 'chosen'; targets: AgentWithConfig[]; unchangeable: FailedOutcome[] }\n | { kind: 'none-configured' }\n\n/** The picker shows an agent it cannot change as a disabled row; every other path reports it as failed. */\nexport async function selectTargetAgents(params: SelectTargetAgentsParams): Promise<SelectTargetAgentsResult> {\n const { agents, namedHarnesses, changing, ui, masker } = params\n const listed =\n namedHarnesses.length > 0\n ? namedHarnesses.map((named) => requireConfigured(named, params))\n : agents.filter(({ current }) => current.kind !== 'not-configured')\n if (listed.length === 0) return { kind: 'none-configured' }\n\n const eligible = listed.filter((agent) => findIneligibility(agent, changing) === undefined)\n if (eligible.length === 0 || namedHarnesses.length > 0 || params.shouldAssumeYes) {\n return { kind: 'chosen', targets: eligible, unchangeable: listUnchangeable(listed, changing) }\n }\n\n masker.registerSecrets(listed.flatMap((agent) => readCurrentValue(agent, 'key') ?? []))\n const chosenIds = await ui.selectTargetAgents({\n changing,\n agents: listed.map((agent) => describeTarget(agent, changing, masker)),\n })\n return { kind: 'chosen', targets: eligible.filter(({ harness }) => chosenIds.includes(harness.id)), unchangeable: [] }\n}\n\n/** Without a scope, neither scope has an agent configured. */\nexport function describeNothingConfigured(scope: ConfigScope | undefined): FinishedOutcome {\n const setupHint = `run \\`${COMMAND_NAME} ${SETUP_COMMAND}\\` first`\n const message =\n scope === undefined\n ? `Nothing configured — ${setupHint}.`\n : `Nothing configured at ${scope} scope — ${setupHint}, or pass --scope ${findOtherScope(scope)}.`\n return { kind: 'done', closing: { tone: 'outro', message } }\n}\n\n/** Every target is configured at the scope, so it is found there. */\nexport function toDetected({ harness }: AgentWithConfig): DetectedHarness {\n return { harness, detection: { kind: 'found', detail: 'configured at this scope' } }\n}\n\nfunction requireConfigured(named: Harness, { agents, scope }: SelectTargetAgentsParams): AgentWithConfig {\n const agent = agents.find(({ harness }) => harness.id === named.id)\n if (agent !== undefined && agent.current.kind !== 'not-configured') return agent\n\n throw new UsageError(\n `${named.label} is not configured at ${scope} scope. ` +\n `Run \\`${COMMAND_NAME} ${SETUP_COMMAND} --harnesses ${named.id}\\` first, or pass --scope ${findOtherScope(scope)}.`,\n )\n}\n\nfunction findOtherScope(scope: ConfigScope): ConfigScope {\n return scope === 'user' ? 'project' : 'user'\n}\n\nconst NO_KEY = 'no key — give it one first with change-key'\nconst NO_MODEL = 'no model — give it one first with change-model'\n\n/** Each agent keeps the value not being changed, so it must have one. */\nfunction findIneligibility({ current }: AgentWithConfig, changing: Changing): string | undefined {\n if (current.kind === 'unreadable') return current.detail\n if (current.kind !== 'configured') return undefined\n\n return match(changing)\n .with('key', () => (current.model === undefined ? NO_MODEL : undefined))\n .with('model', () => (current.key === undefined ? NO_KEY : undefined))\n .exhaustive()\n}\n\nfunction listUnchangeable(listed: readonly AgentWithConfig[], changing: Changing): FailedOutcome[] {\n return listed.flatMap((agent) => {\n const ineligibility = findIneligibility(agent, changing)\n return ineligibility === undefined\n ? []\n : [{ kind: 'failed', harness: agent.harness, error: toSentence(ineligibility) }]\n })\n}\n\nfunction toSentence(reason: string): string {\n const capitalized = reason.charAt(0).toUpperCase() + reason.slice(1)\n return capitalized.endsWith('.') ? capitalized : `${capitalized}.`\n}\n\nfunction describeTarget(agent: AgentWithConfig, changing: Changing, masker: Masker): HarnessChoice {\n const ineligibility = findIneligibility(agent, changing)\n return {\n value: agent.harness.id,\n label: agent.harness.label,\n hint: masker.maskText(ineligibility ?? describeCurrent(agent, changing)),\n isDisabled: ineligibility !== undefined,\n }\n}\n\nfunction describeCurrent(agent: AgentWithConfig, changing: Changing): string {\n const value = readCurrentValue(agent, changing)\n return value === undefined ? `no ${changing}` : `now ${value}`\n}\n","import { match } from 'ts-pattern'\nimport type { ConfigurableHarness } from '../../harnesses/harness'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { displayPath, displayRelativePath } from '../../shared/text/display-path'\nimport { formatList } from '../../ui/format-list'\n\nexport type DescribeKeyDestinationParams = {\n configurable: readonly ConfigurableHarness[]\n ctx: PlatformContext\n envPath: string\n}\n\nexport function describeKeyDestination({ configurable, ctx, envPath }: DescribeKeyDestinationParams): string {\n const configReaders = configurable.filter((harness) => harness.keyEnvVariable === undefined)\n const configFiles = configReaders\n .flatMap((harness) => listConfigPath(harness, ctx))\n .map((filePath) => displayScopedPath(filePath, ctx))\n const envReaders = configurable\n .filter((harness) => harness.keyEnvVariable !== undefined)\n .map((harness) => harness.label)\n if (envReaders.length === 0) return `It will be written to ${formatList(configFiles)}.`\n\n const envFile = `${displayPath(envPath, ctx.home)} for ${formatList(envReaders)}`\n if (configFiles.length === 0) return `It will be written to ${envFile}.`\n\n return `It will be written to ${formatList(configFiles)}, and to ${envFile}.`\n}\n\nfunction listConfigPath(harness: ConfigurableHarness, ctx: PlatformContext): string[] {\n if (harness.configPath === undefined) return []\n\n try {\n return [harness.configPath(ctx)]\n } catch {\n return []\n }\n}\n\nfunction displayScopedPath(filePath: string, ctx: PlatformContext): string {\n return match(ctx.scope)\n .with('user', () => displayPath(filePath, ctx.home))\n .with('project', () => displayRelativePath(filePath, ctx.cwd))\n .exhaustive()\n}\n","import * as v from 'valibot'\nimport type { ConfigurableHarness } from '../../harnesses/harness'\nimport { harnesses } from '../../harnesses/registry'\nimport { parseEnvFile } from '../../product/storage/env-file/parse-env-file'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport { readFileIfExists } from '../../shared/file-system/read-file-if-exists'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { hasLineBreak } from '../../shared/text/has-line-break'\nimport { readNonBlank } from '../../shared/text/read-non-blank'\n\nexport type FindExistingKeysParams = { ctx: PlatformContext; envPath: string; shell: Shell }\n\nconst OfferableKeySchema = v.pipe(\n v.string(),\n v.check((key) => !hasLineBreak(key)),\n)\n\nexport type ExistingKeys = { offered: string | undefined; all: string[] }\n\nexport function findExistingKeys({ ctx, envPath, shell }: FindExistingKeysParams): ExistingKeys {\n const userContext: PlatformContext = { ...ctx, scope: 'user' }\n const projectContext: PlatformContext = { ...ctx, scope: 'project' }\n const machineKeys = [...readEnvFileKeys(envPath, shell), ...readHarnessKeys(userContext)]\n const otherSecrets = [\n ...readHarnessKeys(projectContext),\n ...readFromEachHarness((harness) => harness.readSecrets?.(userContext) ?? []),\n ...readFromEachHarness((harness) => harness.readSecrets?.(projectContext) ?? []),\n ]\n const offered = machineKeys.find((key) => v.is(OfferableKeySchema, key))\n return { offered, all: [...machineKeys, ...otherSecrets] }\n}\n\nfunction readEnvFileKeys(envPath: string, shell: Shell): string[] {\n const envText = readSafely(() => readFileIfExists(envPath)) ?? null\n if (envText === null) return []\n\n const variables = parseEnvFile(envText, shell)\n return listKeyEnvVariables().flatMap((name) => readNonBlank(variables.get(name)) ?? [])\n}\n\nfunction listKeyEnvVariables(): string[] {\n const names = harnesses.flatMap((harness) =>\n harness.kind === 'configurable' && harness.keyEnvVariable !== undefined ? [harness.keyEnvVariable] : [],\n )\n return [...new Set(names)]\n}\n\nfunction readHarnessKeys(ctx: PlatformContext): string[] {\n return readFromEachHarness((harness) => {\n const key = readNonBlank(harness.readKey?.(ctx))\n return key === undefined ? [] : [key]\n })\n}\n\nfunction readFromEachHarness(read: (harness: ConfigurableHarness) => readonly string[]): string[] {\n return harnesses.flatMap((harness) =>\n harness.kind === 'configurable' ? (readSafely(() => read(harness)) ?? []) : [],\n )\n}\n\nfunction readSafely<T>(read: () => T): T | undefined {\n try {\n return read()\n } catch {\n return undefined\n }\n}\n","import { match } from 'ts-pattern'\nimport { listModels } from '../../product/public-api/list-models'\nimport type { ModelInfo } from '../../product/public-api/model-schema'\nimport { DEFAULT_MODEL } from '../../product/public-api/models/predefined-models'\nimport { isKeyAccepted, type ProbeResult } from '../../product/public-api/probes/probe-result'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Fetch } from '../../shared/http/send-request'\nimport { formatCount } from '../../shared/text/format-count'\nimport type { KeyCheckFallback } from '../../ui/prompts/key/choose-on-failed-key-check'\nimport { formatProbes } from '../../ui/report/detection/format-probes'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport type { Spinner } from '../../ui/terminal/spinner'\nimport {\n adoptKey,\n chooseAnotherKey,\n isKeyUsable,\n isSavedKeyRejection,\n replaceRejectedKey,\n type CheckOutcome,\n type KeyStepRun,\n type ResolvedKey,\n} from './key-step'\nimport { PROBE_SUMMARIES } from './probe-summaries'\n\nexport type KeyCheck = {\n probes: ProbeResult[]\n models: ModelInfo[]\n decidedModel: string | undefined\n resolvedKey: ResolvedKey\n outcome: CheckOutcome\n isAborted: boolean\n}\n\nexport function skippedKeyCheck(resolvedKey: ResolvedKey): KeyCheck {\n return { probes: [], models: [], decidedModel: undefined, resolvedKey, outcome: 'skipped', isAborted: false }\n}\n\nexport type CheckKeyParams = {\n openaiBaseUrl: string\n requestedModel: string | undefined\n shouldAssumeYes: boolean\n fallback: KeyCheckFallback\n ui: TerminalUi\n masker: Masker\n fetch: Fetch\n resolved: ResolvedKey\n onSavedKeyRejected(rejected: ResolvedKey, probe: ProbeResult): Promise<ResolvedKey | null>\n chooseAnotherKey(rejected: ResolvedKey): Promise<ResolvedKey>\n}\n\nexport type CheckKeyStepParams = Omit<CheckKeyParams, 'resolved' | 'onSavedKeyRejected' | 'chooseAnotherKey'> & {\n keyStep: KeyStepRun\n}\n\n/** A rejected saved key is replaced, and a different key the user picks is adopted, before either is checked. */\nexport async function checkKeyStep({ keyStep, ...params }: CheckKeyStepParams): Promise<KeyCheck> {\n const { input, deps } = keyStep\n const { ui, masker } = params\n return await checkKey({\n ...params,\n resolved: keyStep.resolved,\n onSavedKeyRejected: async (rejected, probe) => {\n const replaced = await replaceRejectedKey({ input, rejected, probe, deps })\n if (replaced === null || !isKeyUsable(replaced.key)) return null\n adoptKey(replaced.key, { ui, masker })\n return replaced\n },\n chooseAnotherKey: async (rejected) => {\n const chosen = await chooseAnotherKey({ input, rejected, deps })\n adoptKey(chosen.key, { ui, masker })\n return chosen\n },\n })\n}\n\nasync function checkKey(params: CheckKeyParams): Promise<KeyCheck> {\n const spinner = params.ui.spinner()\n spinner.start('Checking the key and fetching the model list…')\n return await attemptKeyCheck({ ...params, spinner })\n}\n\ntype AttemptKeyCheckParams = CheckKeyParams & { spinner: Spinner }\n\nasync function attemptKeyCheck(params: AttemptKeyCheckParams): Promise<KeyCheck> {\n const { openaiBaseUrl, masker, fetch, spinner, ui, resolved } = params\n const { probe, models } = await spinner.waitFor((signal) =>\n listModels({ openaiBaseUrl, apiKey: resolved.key, masker, fetch, signal }),\n )\n spinner.stop(summarizeKeyCheck(probe, models.length))\n if (isKeyAccepted(probe)) {\n return {\n probes: [probe],\n models,\n decidedModel: undefined,\n resolvedKey: resolved,\n outcome: 'passed',\n isAborted: false,\n }\n }\n\n if (isSavedKeyRejection(resolved, probe)) {\n const replaced = await params.onSavedKeyRejected(resolved, probe)\n if (replaced === null) {\n return {\n probes: [],\n models: [],\n decidedModel: undefined,\n resolvedKey: resolved,\n outcome: 'failed',\n isAborted: true,\n }\n }\n spinner.start('Checking the new key…')\n return await attemptKeyCheck({ ...params, resolved: replaced })\n }\n\n const continuation = findContinuation(params)\n if (continuation !== undefined) {\n ui.log.warn(continuation)\n return {\n probes: [probe],\n models: [],\n decidedModel: undefined,\n resolvedKey: resolved,\n outcome: 'failed',\n isAborted: false,\n }\n }\n\n ui.print(formatProbes([probe]))\n const choice =\n probe.kind === 'key-rejected'\n ? await ui.chooseOnKeyRejected(params.fallback)\n : await ui.chooseOnFetchFailure(params.fallback)\n return await match(choice)\n .with('other-key', async () => {\n const chosen = await params.chooseAnotherKey(resolved)\n spinner.start('Checking the new key…')\n return await attemptKeyCheck({ ...params, resolved: chosen })\n })\n .with('retry', async () => {\n spinner.start('Checking again…')\n return await attemptKeyCheck(params)\n })\n .with('type-model', async () => ({\n probes: [],\n models: [],\n decidedModel: await ui.askForModelId(),\n resolvedKey: resolved,\n outcome: 'failed' as const,\n isAborted: false,\n }))\n .with('use-router', async () => ({\n probes: [],\n models: [],\n decidedModel: DEFAULT_MODEL,\n resolvedKey: resolved,\n outcome: 'failed' as const,\n isAborted: false,\n }))\n .with('write-unchecked-key', async () => ({\n probes: [],\n models: [],\n decidedModel: undefined,\n resolvedKey: resolved,\n outcome: 'failed' as const,\n isAborted: false,\n }))\n .exhaustive()\n}\n\nfunction summarizeKeyCheck(probe: ProbeResult, modelCount: number): string {\n return match(probe.kind)\n .with('passed', () => `Key verified — ${formatCount(modelCount, 'model')} available.`)\n .with('bad-response', () => 'Key verified, but the model list could not be read.')\n .otherwise((kind) => PROBE_SUMMARIES[kind])\n}\n\nexport const ASSUMED_YES_CONTINUATION = 'Continuing despite the failed check (--yes).'\n\nfunction findContinuation({ shouldAssumeYes, requestedModel, masker }: CheckKeyParams): string | undefined {\n if (shouldAssumeYes) return ASSUMED_YES_CONTINUATION\n if (requestedModel === undefined) return undefined\n\n return masker.maskText(`Continuing despite the failed check — \"${requestedModel}\" was named explicitly.`)\n}\n","import { P, match } from 'ts-pattern'\nimport { parseJsonBody } from '../../shared/file-formats/json/parse-json'\nimport { formatHttpFailure, isTransportFailure } from '../../shared/http/request-errors'\nimport {\n REQUEST_TIMEOUT_MS,\n buildBearerHeaders,\n isSuccessStatus,\n sendRequest,\n type Fetch,\n type HttpResponse,\n} from '../../shared/http/send-request'\nimport { formatCount } from '../../shared/text/format-count'\nimport { trimTrailingSlashes } from '../../shared/text/trim-trailing-slashes'\nimport type { Masker } from '../secrets/masker'\nimport { describePublicApiFailure } from './describe-public-api-failure'\nimport { INVALID_API_KEY_ERROR_CODE } from './error-codes'\nimport { KEY_REJECTED_STATUSES } from './key-rejected-statuses'\nimport { ModelListSchema, OpenAiErrorSchema, type ModelInfo } from './model-schema'\nimport type { ProbeKind, ProbeResult } from './probes/probe-result'\n\nexport type ListModelsResult = {\n probe: ProbeResult\n models: ModelInfo[]\n}\n\nexport type ListModelsParams = {\n openaiBaseUrl: string\n apiKey: string\n masker: Masker\n fetch: Fetch\n signal?: AbortSignal\n}\n\nconst MODELS_PATH = '/models'\n\nexport async function listModels({\n openaiBaseUrl,\n apiKey,\n masker,\n fetch,\n signal,\n}: ListModelsParams): Promise<ListModelsResult> {\n const endpoint = `${trimTrailingSlashes(openaiBaseUrl)}${MODELS_PATH}`\n const probe = (kind: ProbeKind, detail: string, status: number | undefined): ProbeResult => ({\n kind,\n surface: 'gateway',\n endpoint,\n detail,\n ...(status === undefined ? {} : { status }),\n })\n\n try {\n const response = await sendRequest({\n url: endpoint,\n init: { method: 'GET', headers: buildBearerHeaders(apiKey) },\n fetch,\n timeoutMs: REQUEST_TIMEOUT_MS,\n signal,\n })\n const { kind, detail, models, status } = readListing(response, masker)\n return { probe: probe(kind, detail, status), models }\n } catch (error) {\n if (!isTransportFailure(error)) throw error\n return { probe: probe(error.kind, describePublicApiFailure(error, masker), undefined), models: [] }\n }\n}\n\ntype Listing = { kind: ProbeKind; detail: string; models: ModelInfo[]; status: number }\n\nfunction readListing({ status, text }: HttpResponse, masker: Masker): Listing {\n if (!isSuccessStatus(status)) {\n const rejection = parseJsonBody(OpenAiErrorSchema, text)?.error\n const detail = formatHttpFailure(status, rejection?.message ?? text, masker)\n return { kind: classifyRejection(status, rejection?.code ?? undefined), detail, models: [], status }\n }\n\n const models = parseJsonBody(ModelListSchema, text)\n if (models === undefined) {\n const detail = `HTTP ${status} — authenticated, but the model list could not be read`\n return { kind: 'bad-response', detail, models: [], status }\n }\n const detail = `HTTP ${status} — authenticated, ${formatCount(models.length, 'model')} available`\n return { kind: 'passed', detail, models, status }\n}\n\ntype RejectionKind = Extract<ProbeKind, 'key-rejected' | 'bad-status'>\n\nfunction classifyRejection(status: number, errorCode: string | number | undefined): RejectionKind {\n return match({ status, errorCode })\n .returnType<RejectionKind>()\n .with(\n { status: P.union(...KEY_REJECTED_STATUSES) },\n { errorCode: INVALID_API_KEY_ERROR_CODE },\n () => 'key-rejected',\n )\n .otherwise(() => 'bad-status')\n}\n","import { match } from 'ts-pattern'\nimport { describeTransportFailure, type TransportFailure } from '../../shared/http/request-errors'\nimport type { Masker } from '../secrets/masker'\nimport { API_KEYS_URL } from './desired-config'\n\nconst NETWORK_NEXT_STEP = 'check your network or proxy, or rerun with --no-verify'\nconst REDIRECT_NEXT_STEP = 'check for a proxy or captive portal, or rerun with --no-verify'\nconst INVALID_HEADER_DESCRIPTION = `the key holds a character an HTTP header cannot carry, so it was not sent — copy it again from ${API_KEYS_URL}`\n\nexport function describePublicApiFailure(failure: TransportFailure, masker: Masker): string {\n return match(failure)\n .with({ kind: 'unreachable', reason: { kind: 'invalid-header' } }, () => INVALID_HEADER_DESCRIPTION)\n .with(\n { kind: 'unreachable', reason: { kind: 'redirect' } },\n () => `the Gateway ${describeTransportFailure(failure)} — ${REDIRECT_NEXT_STEP}`,\n )\n .otherwise(() => masker.maskText(`${describeTransportFailure(failure)} — ${NETWORK_NEXT_STEP}`))\n}\n","/** `error.code` values the Gateway returns: OpenAI-compatible strings, and its own numeric codes. */\nexport const INVALID_API_KEY_ERROR_CODE = 'invalid_api_key'\nexport const MODEL_NOT_FOUND_ERROR_CODE = 100110\nexport const MODEL_NOT_SUPPORTED_ERROR_CODE = 100800\n","// oxlint-disable-next-line no-magic-numbers -- HTTP statuses, named by the list\nexport const KEY_REJECTED_STATUSES = [401, 403] as const\n","import * as v from 'valibot'\n\nconst OptionalTextSchema = v.fallback(v.optional(v.pipe(v.string(), v.nonEmpty())), undefined)\nconst OptionalCountSchema = v.fallback(v.optional(v.pipe(v.number(), v.finite())), undefined)\nconst EndpointsSchema = v.fallback(v.pipe(v.array(v.unknown()), v.transform(keepStrings)), [])\n\nconst ModelSchema = v.pipe(\n v.object({\n id: v.pipe(v.string(), v.nonEmpty()),\n developer: OptionalTextSchema,\n owned_by: OptionalTextSchema,\n context_length: OptionalCountSchema,\n region: OptionalTextSchema,\n endpoints: EndpointsSchema,\n }),\n v.transform((entry) => ({\n id: entry.id,\n developer: entry.developer ?? entry.owned_by ?? null,\n contextLength: entry.context_length ?? null,\n region: entry.region ?? null,\n endpoints: entry.endpoints,\n })),\n)\n\nexport type ModelInfo = v.InferOutput<typeof ModelSchema>\n\nexport const ModelListSchema = v.pipe(\n v.object({ data: v.array(v.unknown()) }),\n v.transform(({ data }) => keepUsableModels(data)),\n)\n\nexport const OpenAiErrorSchema = v.object({\n error: v.object({\n message: v.string(),\n type: v.optional(v.string()),\n code: v.optional(v.nullable(v.union([v.string(), v.number()]))),\n }),\n})\n\nexport const AnthropicErrorSchema = v.object({\n type: v.literal('error'),\n error: v.object({ type: v.string(), message: v.string() }),\n})\n\nfunction keepStrings(values: unknown[]): string[] {\n return values.filter((value) => typeof value === 'string')\n}\n\nfunction keepUsableModels(entries: unknown[]): ModelInfo[] {\n const modelsById = new Map<string, ModelInfo>()\n for (const entry of entries) {\n const model = v.safeParse(ModelSchema, entry)\n if (model.success && !modelsById.has(model.output.id)) modelsById.set(model.output.id, model.output)\n }\n return [...modelsById.values()]\n}\n","import { match } from 'ts-pattern'\nimport type { Protocol } from '../models/protocol'\n\nexport type ProbeSurface = 'gateway' | Protocol\n\nexport type ProbeKind =\n | 'passed'\n | 'key-rejected'\n | 'model-rejected'\n | 'unreachable'\n | 'timed-out'\n | 'bad-status'\n | 'bad-response'\n\nexport type ProbeResult = {\n kind: ProbeKind\n surface: ProbeSurface\n endpoint: string\n detail: string\n /** The HTTP status, when there was a response; absent for a network failure or a timeout. */\n status?: number\n}\n\nexport function isKeyAccepted(probe: ProbeResult): boolean {\n return match(probe.kind)\n .with('passed', 'bad-response', () => true)\n .with('key-rejected', 'model-rejected', 'unreachable', 'timed-out', 'bad-status', () => false)\n .exhaustive()\n}\n","import pc from 'picocolors'\nimport type { ProbeResult } from '../../../product/public-api/probes/probe-result'\nimport { GLYPHS } from '../../glyphs'\nimport { formatHeading } from '../format-heading'\nimport { INDENT } from '../indent'\n\nexport function formatProbes(results: readonly ProbeResult[]): string[] {\n return [...formatHeading('Key check'), ...results.flatMap(formatProbe)]\n}\n\nconst SURFACE_COLUMN_WIDTH = 16\n\nfunction formatProbe(result: ProbeResult): string[] {\n const colour = result.kind === 'passed' ? pc.dim : pc.yellow\n const glyph = result.kind === 'passed' ? pc.green(GLYPHS.success) : pc.yellow(GLYPHS.warning)\n return [\n ` ${glyph} ${result.surface.padEnd(SURFACE_COLUMN_WIDTH)} ${pc.dim(result.endpoint)}`,\n `${INDENT}${colour(result.detail)}`,\n ]\n}\n","import type { ProbeKind } from '../../product/public-api/probes/probe-result'\n\nexport const PROBE_SUMMARIES: Readonly<Record<ProbeKind, string>> = {\n passed: 'The check passed.',\n 'key-rejected': 'The gateway rejected the key.',\n 'model-rejected': 'The gateway rejected the model.',\n unreachable: 'Could not reach the gateway.',\n 'timed-out': 'The gateway did not answer in time.',\n 'bad-status': 'The gateway answered with an error.',\n 'bad-response': 'The gateway answered, but its reply could not be read.',\n}\n","import { announceHostOverrides } from '../../cli/announce-host-overrides'\nimport { NO_KEY, type FinishedOutcome } from '../../cli/command-outcome'\nimport type { EnvironmentInputs } from '../../cli/environment'\nimport { CHANGE_MODEL_COMMAND, COMMAND_NAME } from '../../cli/help'\nimport type { CliOptions } from '../../cli/parse-cli-arguments'\nimport { resolveNamedHarnesses } from '../../cli/resolve-named-harnesses'\nimport { createSessionAuth } from '../../flows/auth/auth-step'\nimport { readCurrentValue, type AgentWithConfig } from '../../flows/configure/agent-with-config'\nimport { configureAgents, reportUnchangeable, type ConfigureRun } from '../../flows/configure/configure-agents'\nimport { buildDesiredByAgent } from '../../flows/configure/desired-by-agent'\nimport { readConfigurableAgents, summarizeCurrentConfigs } from '../../flows/configure/read-current-configs'\nimport { resolveChangeScope } from '../../flows/configure/resolve-change-scope'\nimport { describeNothingConfigured, selectTargetAgents, toDetected } from '../../flows/configure/select-target-agents'\nimport { describeKeyDestination } from '../../flows/key/describe-key-destination'\nimport { findExistingKeys } from '../../flows/key/find-existing-keys'\nimport { checkKeyStep, skippedKeyCheck, type CheckKeyStepParams, type KeyCheck } from '../../flows/key/key-check'\nimport { adoptKey, isKeyUsable, resolveNewKey, type KeyStepDeps, type KeyStepInput } from '../../flows/key/key-step'\nimport { PUBLIC_API_HOST, buildPublicApiUrls } from '../../product/public-api/desired-config'\nimport { isPredefinedModel } from '../../product/public-api/models/predefined-models'\nimport type { Masker } from '../../product/secrets/masker'\nimport { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport type { SessionStore } from '../../product/storage/session/session-store'\nimport type { UserEnvironment } from '../../product/storage/windows-environment/user-environment'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { BrowserSpawn } from '../../shared/platform/open-browser'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\n\nexport type ChangeKeyParams = {\n options: CliOptions\n baseContext: PlatformContext\n ui: TerminalUi\n fetch: Fetch\n now: () => Date\n masker: Masker\n keystore: Keystore\n sessionStore: SessionStore\n spawn: BrowserSpawn\n userEnvironment: UserEnvironment\n environment: EnvironmentInputs\n}\n\nexport async function changeKey(params: ChangeKeyParams): Promise<FinishedOutcome> {\n const { options, ui, masker, environment } = params\n\n masker.registerSecrets([options.key, environment.key].flatMap((key) => key ?? []))\n const publicApiUrls = buildPublicApiUrls(environment.publicApiHost ?? PUBLIC_API_HOST)\n announceHostOverrides({ overrides: environment, ui, masker })\n const namedHarnesses = resolveNamedHarnesses(options.harnessIds)\n const changeScope = await resolveChangeScope({\n requestedScope: options.scope,\n shouldAssumeYes: options.shouldAssumeYes,\n baseContext: params.baseContext,\n ui,\n })\n if (changeScope.kind === 'nothing-configured') return describeNothingConfigured(undefined)\n\n const { scope } = changeScope\n const ctx: PlatformContext = { ...params.baseContext, scope }\n const shell = resolveShell(ctx.platform)\n const envPath = resolveEnvFilePath(ctx.home, shell)\n // The diff shows the keys this run replaces, so every key on disk is registered before anything prints.\n const existingKeys = findExistingKeys({ ctx, envPath, shell })\n masker.registerSecrets(existingKeys.all)\n\n const agents = readConfigurableAgents({ ctx, envPath, shell })\n const selection = await selectTargetAgents({\n agents,\n namedHarnesses,\n scope,\n changing: 'key',\n shouldAssumeYes: options.shouldAssumeYes,\n ui,\n masker,\n })\n if (selection.kind === 'none-configured') return describeNothingConfigured(scope)\n\n const { targets, unchangeable } = selection\n const { keystore, sessionStore, fetch, spawn, now } = params\n const run: ConfigureRun = { options, ctx, shell, envPath, ui, masker, now, userEnvironment: params.userEnvironment }\n if (targets.length === 0) return await reportUnchangeable(run, unchangeable)\n\n const auth = createSessionAuth({\n services: { ctx, ui, sessionStore, fetch, masker, spawn, now },\n environment,\n keyNameOptions: { keyName: options.keyName, shouldAssumeYes: options.shouldAssumeYes },\n })\n const deps: KeyStepDeps = { keystore, ui, masker, auth }\n const input: KeyStepInput = {\n flagKey: options.key,\n keyId: options.keyId,\n envKey: undefined,\n shouldSaveKey: options.shouldSaveKey,\n shouldAssumeYes: options.shouldAssumeYes,\n isDryRun: options.isDryRun,\n existingKeys: () => existingKeys,\n destination: describeKeyDestination({ configurable: targets.map(({ harness }) => harness), ctx, envPath }),\n }\n const { currentKeys } = summarizeCurrentConfigs({ targets, agents })\n const resolved = await resolveNewKey(input, currentKeys, deps)\n if (!isKeyUsable(resolved.key)) return NO_KEY\n adoptKey(resolved.key, { ui, masker })\n\n const keyCheck = await checkNewKey({\n openaiBaseUrl: publicApiUrls.openaiBaseUrl,\n options,\n ui,\n masker,\n fetch,\n keyStep: { input, deps, resolved },\n })\n if (keyCheck.isAborted) return { kind: 'failed', closing: undefined }\n warnAboutUnlistedModels({ targets, keyCheck, ui, masker })\n\n return await configureAgents({\n run,\n selected: targets.map(toDetected),\n desiredByAgent: buildDesiredByAgent({\n targets,\n keyChoice: { kind: 'one', resolved: keyCheck.resolvedKey },\n modelChoice: { kind: 'each-current' },\n publicApiUrls,\n }),\n keySave: { resolved: keyCheck.resolvedKey, check: keyCheck.outcome, deps },\n modelSaves: [],\n hasInstallFailure: false,\n unchangeable,\n })\n}\n\ntype CheckNewKeyParams = Pick<CheckKeyStepParams, 'openaiBaseUrl' | 'ui' | 'masker' | 'fetch' | 'keyStep'> & {\n options: Pick<CliOptions, 'shouldVerify' | 'shouldAssumeYes'>\n}\n\nasync function checkNewKey({ options, ...params }: CheckNewKeyParams): Promise<KeyCheck> {\n if (!options.shouldVerify) return skippedKeyCheck(params.keyStep.resolved)\n\n return await checkKeyStep({\n ...params,\n requestedModel: undefined,\n shouldAssumeYes: options.shouldAssumeYes,\n fallback: 'write-unchecked-key',\n })\n}\n\ntype WarnAboutUnlistedModelsParams = {\n targets: readonly AgentWithConfig[]\n keyCheck: KeyCheck\n ui: TerminalUi\n masker: Masker\n}\n\n/** Each agent keeps its model unprobed, so a model the new key does not list is only worth a warning. */\nfunction warnAboutUnlistedModels({ targets, keyCheck, ui, masker }: WarnAboutUnlistedModelsParams): void {\n if (!keyCheck.probes.some((probe) => probe.kind === 'passed')) return\n\n const listedIds = new Set(keyCheck.models.map(({ id }) => id))\n for (const agent of targets) {\n const model = readCurrentValue(agent, 'model')\n if (model === undefined || isPredefinedModel(model) || listedIds.has(model)) continue\n const { label } = agent.harness\n ui.log.warn(\n masker.maskText(\n `The new key does not list ${model}, which ${label} uses; ${label} keeps ${model}. ` +\n `If it stops working, run \\`${COMMAND_NAME} ${CHANGE_MODEL_COMMAND}\\`.`,\n ),\n )\n }\n}\n","import { runCommandShell } from '../../cli/command-outcome'\nimport { readEnvironmentInputs } from '../../cli/environment'\nimport type { ExitCode } from '../../cli/exit-code'\nimport { refuseChangeKeyPrompts } from '../../cli/refuse-prompts'\nimport { changeKey, type ChangeKeyParams } from './change-key'\n\nexport type RunChangeKeyParams = Omit<ChangeKeyParams, 'environment'>\n\nexport async function runChangeKey(params: RunChangeKeyParams): Promise<ExitCode> {\n return await runCommandShell({\n ui: params.ui,\n isInteractive: params.baseContext.isInteractive,\n refuse: refuseChangeKeyPrompts,\n run: async (ui) => await changeKey({ ...params, ui, environment: readEnvironmentInputs(params.baseContext.env) }),\n })\n}\n","import { match } from 'ts-pattern'\nimport { DEFAULT_MODEL } from '../../product/public-api/models/predefined-models'\nimport type { Protocol } from '../../product/public-api/models/protocol'\nimport {\n classifyRouterAvailability,\n type RouterAvailability,\n} from '../../product/public-api/models/router-availability'\nimport { probeAnthropic } from '../../product/public-api/probes/probe-anthropic'\nimport { probeOpenAi } from '../../product/public-api/probes/probe-openai'\nimport type { ProbeResult } from '../../product/public-api/probes/probe-result'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { ModelProbeFailureChoice } from '../../ui/prompts/model/choose-on-model-probe-failure'\nimport { formatProbes } from '../../ui/report/detection/format-probes'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { ASSUMED_YES_CONTINUATION } from '../key/key-check'\nimport { PROBE_SUMMARIES } from '../key/probe-summaries'\n\nexport type ProbeModelParams = {\n anthropicBaseUrl: string\n openaiBaseUrl: string\n key: string\n model: string\n protocols: readonly Protocol[]\n /** Probes already run for a protocol in play, reused instead of repeating them. */\n reuse?: Partial<Record<Protocol, ProbeResult>>\n ui: TerminalUi\n masker: Masker\n fetch: Fetch\n}\n\n/** Probes every protocol in play, in parallel and in the order asked, under one spinner. */\nexport async function probeModel(params: ProbeModelParams): Promise<ProbeResult[]> {\n const { model, protocols, ui, masker } = params\n const spinner = ui.spinner()\n spinner.start(masker.maskText(`Checking \"${model}\" against the gateway…`))\n const probes = await spinner.waitFor((signal) =>\n Promise.all(protocols.map((protocol) => probeProtocol({ ...params, protocol, signal }))),\n )\n spinner.stop(summarizeModelProbes(probes))\n return probes\n}\n\ntype ProbeProtocolParams = ProbeModelParams & { protocol: Protocol; signal: AbortSignal }\n\nfunction probeProtocol({\n anthropicBaseUrl,\n openaiBaseUrl,\n key,\n model,\n protocol,\n reuse,\n masker,\n fetch,\n signal,\n}: ProbeProtocolParams): Promise<ProbeResult> {\n const reused = reuse?.[protocol]\n if (reused !== undefined) return Promise.resolve(reused)\n\n return match(protocol)\n .with('anthropic', () => probeAnthropic({ anthropicBaseUrl, apiKey: key, model, masker, fetch, signal }))\n .with('openai-chat', 'openai-responses', (openAiProtocol) =>\n probeOpenAi({ openaiBaseUrl, apiKey: key, model, protocol: openAiProtocol, masker, fetch, signal }),\n )\n .exhaustive()\n}\n\nexport function printProbes(probes: readonly ProbeResult[], ui: TerminalUi): void {\n if (probes.length > 0) ui.print(formatProbes(probes))\n}\n\nexport type RouterProbe = { availability: RouterAvailability; probe: ProbeResult }\n\nexport type ProbeRouterParams = {\n anthropicBaseUrl: string\n key: string\n ui: TerminalUi\n masker: Masker\n fetch: Fetch\n}\n\n/** Silent on purpose: its result only decides which rows the picker offers. */\nexport async function probeRouter({\n anthropicBaseUrl,\n key,\n ui,\n masker,\n fetch,\n}: ProbeRouterParams): Promise<RouterProbe> {\n const probe = await ui\n .spinner()\n .waitQuietly((signal) =>\n probeAnthropic({ anthropicBaseUrl, apiKey: key, model: DEFAULT_MODEL, masker, fetch, signal }),\n )\n return { availability: classifyRouterAvailability(probe), probe }\n}\n\nexport type DecideAfterFailedProbeParams = {\n model: string\n agentLabels: readonly string[]\n shouldAssumeYes: boolean\n consequence: string\n ui: TerminalUi\n masker: Masker\n}\n\nexport async function decideAfterFailedProbe({\n model,\n agentLabels,\n shouldAssumeYes,\n consequence,\n ui,\n masker,\n}: DecideAfterFailedProbeParams): Promise<ModelProbeFailureChoice> {\n if (shouldAssumeYes) {\n ui.log.warn(ASSUMED_YES_CONTINUATION)\n return 'continue'\n }\n\n return await ui.chooseOnModelProbeFailure({ maskedModel: masker.maskText(model), consequence, agentLabels })\n}\n\nfunction summarizeModelProbes(probes: readonly ProbeResult[]): string {\n const failed = probes.find((probe) => probe.kind !== 'passed')\n return failed === undefined ? 'Model verified.' : PROBE_SUMMARIES[failed.kind]\n}\n","import { match } from 'ts-pattern'\nimport type { ProbeResult } from '../probes/probe-result'\n\nexport const ROUTER_AVAILABILITY = ['available', 'unavailable', 'unknown'] as const\n\nexport type RouterAvailability = (typeof ROUTER_AVAILABILITY)[number]\n\nexport function classifyRouterAvailability(probe: ProbeResult): RouterAvailability {\n return match(probe.kind)\n .returnType<RouterAvailability>()\n .with('passed', () => 'available')\n .with('model-rejected', () => 'unavailable')\n .otherwise(() => 'unknown')\n}\n","import { P, match } from 'ts-pattern'\nimport { parseJsonBody } from '../../../shared/file-formats/json/parse-json'\nimport { formatHttpFailure, isTransportFailure } from '../../../shared/http/request-errors'\nimport { REQUEST_TIMEOUT_MS, isSuccessStatus, sendRequest, type Fetch } from '../../../shared/http/send-request'\nimport { trimTrailingSlashes } from '../../../shared/text/trim-trailing-slashes'\nimport type { Masker } from '../../secrets/masker'\nimport { describePublicApiFailure } from '../describe-public-api-failure'\nimport { KEY_REJECTED_STATUSES } from '../key-rejected-statuses'\nimport { AnthropicErrorSchema } from '../model-schema'\nimport type { ProbeKind, ProbeResult } from './probe-result'\n\nexport type ProbeAnthropicParams = {\n anthropicBaseUrl: string\n apiKey: string\n model: string\n masker: Masker\n fetch: Fetch\n signal?: AbortSignal\n}\n\nconst MESSAGES_PATH = '/v1/messages'\nconst ANTHROPIC_VERSION = '2023-06-01'\nconst PING_MAX_TOKENS = 1\nconst PING_TEXT = 'ping'\n\nexport async function probeAnthropic({\n anthropicBaseUrl,\n apiKey,\n model,\n masker,\n fetch,\n signal,\n}: ProbeAnthropicParams): Promise<ProbeResult> {\n const endpoint = `${trimTrailingSlashes(anthropicBaseUrl)}${MESSAGES_PATH}`\n const probe = (kind: ProbeKind, detail: string, status: number | undefined): ProbeResult => ({\n kind,\n surface: 'anthropic',\n endpoint,\n detail,\n ...(status === undefined ? {} : { status }),\n })\n\n try {\n const response = await sendRequest({\n url: endpoint,\n init: {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': ANTHROPIC_VERSION,\n },\n body: JSON.stringify({\n model,\n max_tokens: PING_MAX_TOKENS,\n messages: [{ role: 'user', content: PING_TEXT }],\n }),\n },\n fetch,\n timeoutMs: REQUEST_TIMEOUT_MS,\n signal,\n })\n if (isSuccessStatus(response.status)) {\n return probe('passed', `HTTP ${response.status} — authenticated`, response.status)\n }\n\n const rejection = parseJsonBody(AnthropicErrorSchema, response.text)?.error\n const detail = formatHttpFailure(response.status, rejection?.message ?? response.text, masker)\n return probe(classifyRejection(response.status, rejection?.type), detail, response.status)\n } catch (error) {\n if (!isTransportFailure(error)) throw error\n return probe(error.kind, describePublicApiFailure(error, masker), undefined)\n }\n}\n\nconst MODEL_NOT_FOUND_STATUS = 404\nconst KEY_REJECTED_ERROR_TYPES = ['authentication_error', 'permission_error'] as const\nconst MODEL_NOT_FOUND_ERROR_TYPE = 'not_found_error'\n\ntype RejectionKind = Extract<ProbeKind, 'key-rejected' | 'model-rejected' | 'bad-status'>\n\nfunction classifyRejection(status: number, errorType: string | undefined): RejectionKind {\n return match({ status, errorType })\n .returnType<RejectionKind>()\n .with(\n { status: P.union(...KEY_REJECTED_STATUSES) },\n { errorType: P.union(...KEY_REJECTED_ERROR_TYPES) },\n () => 'key-rejected',\n )\n .with({ status: MODEL_NOT_FOUND_STATUS }, { errorType: MODEL_NOT_FOUND_ERROR_TYPE }, () => 'model-rejected')\n .otherwise(() => 'bad-status')\n}\n","import { P, match } from 'ts-pattern'\nimport { parseJsonBody } from '../../../shared/file-formats/json/parse-json'\nimport { formatHttpFailure, isTransportFailure } from '../../../shared/http/request-errors'\nimport {\n REQUEST_TIMEOUT_MS,\n buildBearerHeaders,\n isSuccessStatus,\n sendRequest,\n type Fetch,\n} from '../../../shared/http/send-request'\nimport { trimTrailingSlashes } from '../../../shared/text/trim-trailing-slashes'\nimport type { Masker } from '../../secrets/masker'\nimport { describePublicApiFailure } from '../describe-public-api-failure'\nimport { INVALID_API_KEY_ERROR_CODE, MODEL_NOT_FOUND_ERROR_CODE, MODEL_NOT_SUPPORTED_ERROR_CODE } from '../error-codes'\nimport { KEY_REJECTED_STATUSES } from '../key-rejected-statuses'\nimport { OpenAiErrorSchema } from '../model-schema'\nimport type { Protocol } from '../models/protocol'\nimport type { ProbeKind, ProbeResult } from './probe-result'\n\nexport type OpenAiProtocol = Extract<Protocol, 'openai-chat' | 'openai-responses'>\n\nexport type ProbeOpenAiParams = {\n openaiBaseUrl: string\n apiKey: string\n model: string\n protocol: OpenAiProtocol\n masker: Masker\n fetch: Fetch\n signal?: AbortSignal\n}\n\nconst CHAT_COMPLETIONS_PATH = '/chat/completions'\nconst RESPONSES_PATH = '/responses'\nconst PING_TEXT = 'ping'\nconst CHAT_MAX_TOKENS = 1\n// The Responses API rejects max_output_tokens: 1 with a generic 400 before the model is considered.\nconst RESPONSES_MAX_OUTPUT_TOKENS = 16\n\nexport async function probeOpenAi({\n openaiBaseUrl,\n apiKey,\n model,\n protocol,\n masker,\n fetch,\n signal,\n}: ProbeOpenAiParams): Promise<ProbeResult> {\n const endpoint = `${trimTrailingSlashes(openaiBaseUrl)}${endpointPath(protocol)}`\n const probe = (kind: ProbeKind, detail: string, status: number | undefined): ProbeResult => ({\n kind,\n surface: protocol,\n endpoint,\n detail,\n ...(status === undefined ? {} : { status }),\n })\n\n try {\n const response = await sendRequest({\n url: endpoint,\n init: {\n method: 'POST',\n headers: { 'content-type': 'application/json', ...buildBearerHeaders(apiKey) },\n body: JSON.stringify(buildBody(protocol, model)),\n },\n fetch,\n timeoutMs: REQUEST_TIMEOUT_MS,\n signal,\n })\n if (isSuccessStatus(response.status)) {\n return probe('passed', `HTTP ${response.status} — authenticated`, response.status)\n }\n\n const rejection = parseJsonBody(OpenAiErrorSchema, response.text)?.error\n const detail = formatHttpFailure(response.status, rejection?.message ?? response.text, masker)\n return probe(classifyRejection(response.status, rejection?.code ?? undefined), detail, response.status)\n } catch (error) {\n if (!isTransportFailure(error)) throw error\n return probe(error.kind, describePublicApiFailure(error, masker), undefined)\n }\n}\n\nfunction endpointPath(protocol: OpenAiProtocol): string {\n return match(protocol)\n .with('openai-chat', () => CHAT_COMPLETIONS_PATH)\n .with('openai-responses', () => RESPONSES_PATH)\n .exhaustive()\n}\n\nfunction buildBody(protocol: OpenAiProtocol, model: string): Record<string, unknown> {\n return match(protocol)\n .with('openai-chat', () => ({\n model,\n max_tokens: CHAT_MAX_TOKENS,\n messages: [{ role: 'user', content: PING_TEXT }],\n }))\n .with('openai-responses', () => ({\n model,\n input: PING_TEXT,\n max_output_tokens: RESPONSES_MAX_OUTPUT_TOKENS,\n }))\n .exhaustive()\n}\n\ntype RejectionKind = Extract<ProbeKind, 'key-rejected' | 'model-rejected' | 'bad-status'>\n\nfunction classifyRejection(status: number, errorCode: string | number | undefined): RejectionKind {\n return match({ status, errorCode })\n .returnType<RejectionKind>()\n .with(\n { status: P.union(...KEY_REJECTED_STATUSES) },\n { errorCode: INVALID_API_KEY_ERROR_CODE },\n () => 'key-rejected',\n )\n .with(\n { errorCode: MODEL_NOT_FOUND_ERROR_CODE },\n { errorCode: MODEL_NOT_SUPPORTED_ERROR_CODE },\n () => 'model-rejected',\n )\n .otherwise(() => 'bad-status')\n}\n","import type { PublicApiUrls } from '../../../product/public-api/desired-config'\nimport { listModels } from '../../../product/public-api/list-models'\nimport type { ModelInfo } from '../../../product/public-api/model-schema'\nimport type { ProbeResult } from '../../../product/public-api/probes/probe-result'\nimport type { Masker } from '../../../product/secrets/masker'\nimport type { Fetch } from '../../../shared/http/send-request'\nimport { formatList } from '../../../ui/format-list'\nimport type { TerminalUi } from '../../../ui/terminal-ui'\nimport { printProbes, probeRouter, type RouterProbe } from '../model-probe'\nimport type { AgentKey } from './probe-groups'\n\n/** `models` is undefined when the key could not list them, so it narrows nothing the other keys share. */\nexport type KeyRead = { models: readonly ModelInfo[] | undefined; router: RouterProbe | undefined }\n\nexport type ReadEachKeyParams = {\n agents: readonly AgentKey[]\n isRouterWanted: boolean\n publicApiUrls: PublicApiUrls\n ui: TerminalUi\n masker: Masker\n fetch: Fetch\n}\n\n/** Never prompts: a key that fails only leaves the picker with fewer rows. */\nexport async function readEachKey(params: ReadEachKeyParams): Promise<Map<string, KeyRead>> {\n const { publicApiUrls, ui, masker, fetch } = params\n const spinner = ui.spinner()\n spinner.start('Fetching the model list…')\n const listings = await spinner.waitFor((signal) =>\n Promise.all(\n listLabelsByKey(params.agents).map(async ({ key, labels }) => {\n const listing = await listModels({\n openaiBaseUrl: publicApiUrls.openaiBaseUrl,\n apiKey: key,\n masker,\n fetch,\n signal,\n })\n const models = listing.probe.kind === 'passed' ? listing.models : undefined\n return { key, labels, probe: listing.probe, models }\n }),\n ),\n )\n const failed = listings.filter(({ models }) => models === undefined)\n spinner.stop(failed.length === 0 ? 'Fetched the model list.' : 'Could not fetch the model list for every key.')\n reportFailedListings({ failed, isEveryKeyFailed: failed.length === listings.length, ui, masker })\n\n const reads = new Map<string, KeyRead>()\n // One key at a time: each router check owns the terminal while it waits.\n for (const { key, models } of listings) {\n const isRouterChecked = params.isRouterWanted && models !== undefined\n const router = isRouterChecked\n ? await probeRouter({ anthropicBaseUrl: publicApiUrls.anthropicBaseUrl, key, ui, masker, fetch })\n : undefined\n reads.set(key, { models, router })\n }\n return reads\n}\n\ntype KeyLabels = { key: string; labels: string[] }\n\nfunction listLabelsByKey(agents: readonly AgentKey[]): KeyLabels[] {\n const labelsByKey = new Map<string, string[]>()\n for (const { harness, key } of agents) labelsByKey.set(key, [...(labelsByKey.get(key) ?? []), harness.label])\n return [...labelsByKey].map(([key, labels]) => ({ key, labels }))\n}\n\ntype ReportFailedListingsParams = {\n failed: readonly { labels: readonly string[]; probe: ProbeResult }[]\n isEveryKeyFailed: boolean\n ui: TerminalUi\n masker: Masker\n}\n\nfunction reportFailedListings({ failed, isEveryKeyFailed, ui, masker }: ReportFailedListingsParams): void {\n if (failed.length === 0) return\n\n printProbes(\n failed.map(({ probe }) => probe),\n ui,\n )\n const labels = failed.flatMap((listing) => listing.labels)\n const consequence = isEveryKeyFailed ? 'type a model id instead' : 'the picker shows only what the other keys list'\n ui.log.warn(masker.maskText(`Could not fetch the model list with the key of ${formatList(labels)} — ${consequence}.`))\n}\n","import { MODEL_ENV_VARIABLE } from '../../cli/environment'\nimport { UsageError } from '../../cli/errors/usage-error'\nimport type { ConfigurableHarness } from '../../harnesses/harness'\nimport type { ModelInfo } from '../../product/public-api/model-schema'\nimport { DEFAULT_MODEL, isPredefinedModel } from '../../product/public-api/models/predefined-models'\nimport type { RouterAvailability } from '../../product/public-api/models/router-availability'\nimport type { Masker } from '../../product/secrets/masker'\nimport {\n buildModelChoices,\n KEEP_VALUE,\n type CurrentModels,\n type ModelSuggestion,\n} from '../../ui/prompts/model/model-choices'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport type { KeyCheck } from '../key/key-check'\n\nexport const UNAVAILABLE_ROUTER_REFUSAL = `${DEFAULT_MODEL} is not available for this key. Pass --model, or set $${MODEL_ENV_VARIABLE}.`\n\nexport type ModelPick = { kind: 'model'; model: string } | { kind: 'keep' }\n\nexport type ChooseModelParams = {\n keyCheck: Pick<KeyCheck, 'models' | 'decidedModel'>\n requestedModel: string | undefined\n routerAvailability: RouterAvailability\n shouldAssumeYes: boolean\n suggestions: readonly ModelSuggestion[]\n targets: readonly ConfigurableHarness[]\n currentModels: CurrentModels\n ui: TerminalUi\n masker: Masker\n}\n\nexport async function chooseModel({\n keyCheck,\n requestedModel,\n routerAvailability,\n shouldAssumeYes,\n suggestions,\n targets,\n currentModels,\n ui,\n masker,\n}: ChooseModelParams): Promise<ModelPick> {\n if (keyCheck.decidedModel !== undefined) return { kind: 'model', model: keyCheck.decidedModel }\n if (requestedModel !== undefined) return { kind: 'model', model: requestedModel }\n\n const isRouterOffered = routerAvailability === 'available'\n if (shouldAssumeYes) {\n if (routerAvailability === 'unavailable') throw new UsageError(UNAVAILABLE_ROUTER_REFUSAL)\n if (!isRouterOffered) {\n ui.log.warn(`Could not confirm that ${DEFAULT_MODEL} is available. Continuing anyway (--yes).`)\n }\n return { kind: 'model', model: DEFAULT_MODEL }\n }\n\n const picked = await ui.selectModel(\n buildModelChoices({ models: keyCheck.models, isRouterOffered, suggestions, targets, currentModels, masker }),\n )\n return picked === KEEP_VALUE ? { kind: 'keep' } : { kind: 'model', model: picked }\n}\n\nexport type FindModelWarningsParams = {\n model: string\n models: readonly ModelInfo[]\n routerAvailability: RouterAvailability\n}\n\nexport function findModelWarnings({ model, models, routerAvailability }: FindModelWarningsParams): string[] {\n if (isPredefinedModel(model)) {\n return routerAvailability === 'unavailable'\n ? [`\"${model}\" is not available for this key. Continuing because you named it.`]\n : []\n }\n if (models.length === 0) return []\n if (models.some((candidate) => candidate.id === model)) return []\n\n return [`\"${model}\" is not in the list this key can see. Continuing — the gateway may still accept it.`]\n}\n","import { match } from 'ts-pattern'\nimport type { PublicApiUrls } from '../../../product/public-api/desired-config'\nimport { DEFAULT_MODEL } from '../../../product/public-api/models/predefined-models'\nimport type { ProbeResult } from '../../../product/public-api/probes/probe-result'\nimport type { Masker } from '../../../product/secrets/masker'\nimport type { Fetch } from '../../../shared/http/send-request'\nimport { formatList } from '../../../ui/format-list'\nimport type { TerminalUi } from '../../../ui/terminal-ui'\nimport { decideAfterFailedProbe, printProbes, probeModel, type RouterProbe } from '../model-probe'\nimport type { ProbeGroup } from './probe-groups'\n\nexport type ProbeEachKeyParams = {\n model: string\n groups: readonly ProbeGroup[]\n earlierProbes: ReadonlyMap<string, readonly ProbeResult[]>\n routerProbes: ReadonlyMap<string, RouterProbe>\n pickOtherModel: (group: ProbeGroup) => Promise<string>\n publicApiUrls: PublicApiUrls\n shouldAssumeYes: boolean\n consequence: string\n ui: TerminalUi\n masker: Masker\n fetch: Fetch\n}\n\nexport type Repick = { group: ProbeGroup; model: string }\n\nexport type ProbeEachKeyResult = { kind: 'probed'; repicks: Repick[] } | { kind: 'declined' }\n\nexport async function probeEachKey(params: ProbeEachKeyParams): Promise<ProbeEachKeyResult> {\n const { groups, earlierProbes, ...shared } = params\n const isNamingAgents = groups.length > 1\n const repicks: Repick[] = []\n for (const group of groups) {\n const outcome = await probeGroup({\n ...shared,\n group,\n agentLabels: isNamingAgents ? group.labels : [],\n earlierProbes: earlierProbes.get(group.key) ?? [],\n })\n if (outcome.kind === 'declined') return { kind: 'declined' }\n if (outcome.repick !== undefined) repicks.push(outcome.repick)\n }\n\n return { kind: 'probed', repicks }\n}\n\ntype ProbeGroupParams = Omit<ProbeEachKeyParams, 'groups' | 'earlierProbes'> & {\n group: ProbeGroup\n agentLabels: readonly string[]\n earlierProbes: readonly ProbeResult[]\n}\n\ntype GroupOutcome = { kind: 'accepted'; repick: Repick | undefined } | { kind: 'declined' }\n\nasync function probeGroup(params: ProbeGroupParams): Promise<GroupOutcome> {\n const { model, group, agentLabels, publicApiUrls, ui, masker } = params\n if (agentLabels.length > 0) ui.log.info(`For ${formatList(agentLabels)}:`)\n\n const reusedRouterProbe = model === DEFAULT_MODEL ? params.routerProbes.get(group.key) : undefined\n const probes = await probeModel({\n ui,\n masker,\n fetch: params.fetch,\n anthropicBaseUrl: publicApiUrls.anthropicBaseUrl,\n openaiBaseUrl: publicApiUrls.openaiBaseUrl,\n model,\n key: group.key,\n protocols: group.protocols,\n ...(reusedRouterProbe === undefined ? {} : { reuse: { anthropic: reusedRouterProbe.probe } }),\n })\n printProbes([...params.earlierProbes, ...probes], ui)\n\n const accepted: GroupOutcome = { kind: 'accepted', repick: undefined }\n if (reusedRouterProbe?.availability === 'unknown') return accepted\n if (probes.every((probe) => probe.kind === 'passed')) return accepted\n\n const next = await decideAfterFailedProbe({\n model,\n agentLabels,\n shouldAssumeYes: params.shouldAssumeYes,\n consequence: params.consequence,\n ui,\n masker,\n })\n return await match(next)\n .returnType<Promise<GroupOutcome>>()\n .with('continue', async () => accepted)\n .with('cancel', async () => ({ kind: 'declined' }))\n .with('other-model', async () => {\n const otherModel = await params.pickOtherModel(group)\n const outcome = await probeGroup({ ...params, model: otherModel, earlierProbes: [] })\n if (outcome.kind === 'declined') return outcome\n return { kind: 'accepted', repick: outcome.repick ?? { group, model: otherModel } }\n })\n .exhaustive()\n}\n","import type { ConfigurableHarness } from '../../../harnesses/harness'\nimport { PROTOCOLS, type Protocol } from '../../../product/public-api/models/protocol'\n\nexport type AgentKey = { harness: ConfigurableHarness; key: string }\n\nexport type ProbeGroup = {\n key: string\n protocols: readonly Protocol[]\n harnessIds: readonly string[]\n labels: readonly string[]\n}\n\nexport function listProbeGroups(agents: readonly AgentKey[]): ProbeGroup[] {\n const agentsByKey = new Map<string, AgentKey[]>()\n for (const agent of agents) {\n agentsByKey.set(agent.key, [...(agentsByKey.get(agent.key) ?? []), agent])\n }\n\n return [...agentsByKey].flatMap(([key, keyAgents]) => {\n const protocols = PROTOCOLS.filter((protocol) =>\n keyAgents.some((agent) => agent.harness.protocols.includes(protocol)),\n )\n if (protocols.length === 0) return []\n\n const harnessIds = keyAgents.map((agent) => agent.harness.id)\n return [{ key, protocols, harnessIds, labels: keyAgents.map((agent) => agent.harness.label) }]\n })\n}\n","import type { ModelInfo } from '../../../product/public-api/model-schema'\n\nexport function listSharedModels(modelLists: readonly (readonly ModelInfo[])[]): ModelInfo[] {\n const [firstList, ...otherLists] = modelLists\n if (firstList === undefined) return []\n\n const otherIdSets = otherLists.map((models) => new Set(models.map((model) => model.id)))\n\n return firstList.filter((model) => otherIdSets.every((ids) => ids.has(model.id)))\n}\n","import type { CliOptions } from '../../cli/parse-cli-arguments'\nimport type { ConfigurableHarness } from '../../harnesses/harness'\nimport { harnesses } from '../../harnesses/registry'\nimport type { PublicApiUrls } from '../../product/public-api/desired-config'\nimport type { ModelInfo } from '../../product/public-api/model-schema'\nimport type { RouterAvailability } from '../../product/public-api/models/router-availability'\nimport type { ProbeResult } from '../../product/public-api/probes/probe-result'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { CurrentModels } from '../../ui/prompts/model/model-choices'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { chooseModel, findModelWarnings, type ModelPick } from './choose-model'\nimport { printProbes } from './model-probe'\nimport { decideModelSave, shouldOfferDefaultsInPicker, type ModelPreferences, type RequestedModel } from './model-step'\nimport { probeEachKey, type Repick } from './per-key/probe-each-key'\nimport { listProbeGroups, type AgentKey } from './per-key/probe-groups'\nimport type { KeyRead } from './per-key/read-each-key'\nimport { listSharedModels } from './per-key/shared-models'\nimport { findBorrowedDefaults, findOwnDefaults } from './suggest-defaults'\n\nexport type ModelChoice = { kind: 'picked'; modelByAgent: ReadonlyMap<string, string> } | { kind: 'each-current' }\n\nexport type ModelSave = { model: string; harnesses: ConfigurableHarness[] }\n\nexport type PickedModel = { kind: 'chosen'; modelChoice: ModelChoice; modelSaves: ModelSave[] } | { kind: 'declined' }\n\nexport type ModelStepParams = {\n currentModels: CurrentModels\n preferences: ModelPreferences\n publicApiUrls: PublicApiUrls\n options: Pick<CliOptions, 'shouldVerify' | 'shouldAssumeYes' | 'shouldSaveModel' | 'isDryRun'>\n /** What still happens when the user continues past a failed model probe. */\n probeConsequence: string\n ui: TerminalUi\n masker: Masker\n fetch: Fetch\n}\n\nexport type PickProbedModelParams = ModelStepParams & {\n agents: readonly AgentKey[]\n reads: ReadonlyMap<string, KeyRead>\n earlierProbes: ReadonlyMap<string, readonly ProbeResult[]>\n decidedModel: string | undefined\n requested: RequestedModel | undefined\n}\n\n/** Probes a newly picked model once per key; a kept model is never probed. */\nexport async function pickProbedModel(params: PickProbedModelParams): Promise<PickedModel> {\n const { agents, reads, options, ui } = params\n const picked = await pickModel(params, {\n targets: agents.map(({ harness }) => harness),\n read: combineReads([...reads.values()]),\n decidedModel: params.decidedModel,\n requestedModel: params.requested?.model,\n currentModels: params.currentModels,\n })\n const earlierProbes = [...params.earlierProbes.values()].flat()\n if (picked.kind === 'keep') {\n printProbes(earlierProbes, ui)\n return { kind: 'chosen', modelChoice: { kind: 'each-current' }, modelSaves: [] }\n }\n\n const { model } = picked\n\n const groups = listProbeGroups(agents)\n if (!options.shouldVerify || groups.length === 0) {\n printProbes(earlierProbes, ui)\n return await acceptModel(params, model, [])\n }\n\n const probed = await probeEachKey({\n model,\n groups,\n earlierProbes: params.earlierProbes,\n routerProbes: new Map([...reads].flatMap(([key, { router }]) => (router === undefined ? [] : [[key, router]]))),\n pickOtherModel: async (group) =>\n requireModel(\n await pickModel(params, {\n targets: agents.flatMap(({ harness }) => (group.harnessIds.includes(harness.id) ? [harness] : [])),\n read: combineReads([reads.get(group.key) ?? { models: undefined, router: undefined }]),\n decidedModel: undefined,\n requestedModel: undefined,\n currentModels: { kind: 'none' },\n }),\n ),\n publicApiUrls: params.publicApiUrls,\n shouldAssumeYes: options.shouldAssumeYes,\n consequence: params.probeConsequence,\n ui,\n masker: params.masker,\n fetch: params.fetch,\n })\n if (probed.kind === 'declined') return probed\n return await acceptModel(params, model, probed.repicks)\n}\n\ntype PickerRead = { models: ModelInfo[]; routerAvailability: RouterAvailability }\n\nfunction combineReads(reads: readonly KeyRead[]): PickerRead {\n return {\n models: listSharedModels(reads.flatMap(({ models }) => (models === undefined ? [] : [models]))),\n routerAvailability: combineRouterAvailability(reads.map(({ router }) => router?.availability ?? 'unknown')),\n }\n}\n\n/** The router rows need every key to have the router. */\nfunction combineRouterAvailability(availabilities: readonly RouterAvailability[]): RouterAvailability {\n if (availabilities.includes('unavailable')) return 'unavailable'\n if (availabilities.length > 0 && availabilities.every((availability) => availability === 'available')) {\n return 'available'\n }\n return 'unknown'\n}\n\ntype PickModelParams = {\n targets: readonly ConfigurableHarness[]\n read: PickerRead\n decidedModel: string | undefined\n requestedModel: string | undefined\n currentModels: CurrentModels\n}\n\nasync function pickModel(params: PickProbedModelParams, pick: PickModelParams): Promise<ModelPick> {\n const { preferences, options, ui, masker } = params\n const { targets, read } = pick\n const { defaultModels } = preferences\n const ownDefaults = shouldOfferDefaultsInPicker(pick.currentModels) ? findOwnDefaults(defaultModels, targets) : []\n const borrowedDefaults = findBorrowedDefaults({ defaultModels, targets, harnesses, models: read.models })\n const picked = await chooseModel({\n keyCheck: { models: read.models, decidedModel: pick.decidedModel },\n requestedModel: pick.requestedModel,\n routerAvailability: read.routerAvailability,\n shouldAssumeYes: options.shouldAssumeYes,\n suggestions: [...ownDefaults, ...borrowedDefaults],\n targets,\n currentModels: pick.currentModels,\n ui,\n masker,\n })\n if (picked.kind === 'keep') return picked\n\n const { models, routerAvailability } = read\n for (const warning of findModelWarnings({ model: picked.model, models, routerAvailability })) {\n ui.log.warn(masker.maskText(warning))\n }\n return picked\n}\n\nfunction requireModel(pick: ModelPick): string {\n if (pick.kind === 'keep') throw new Error('A re-pick offers no keep row, yet it returned keep.')\n return pick.model\n}\n\nasync function acceptModel(\n params: PickProbedModelParams,\n model: string,\n repicks: readonly Repick[],\n): Promise<PickedModel> {\n const { agents, requested, preferences, options, ui, masker } = params\n const agentModels = agents.map(({ harness }) => ({ harness, model: findRepick(repicks, harness.id) ?? model }))\n\n const modelSaves: ModelSave[] = []\n for (const [savedModel, targets] of groupHarnessesByModel(agentModels)) {\n const source = savedModel === model ? (requested?.source ?? 'picked') : 'picked'\n const toSave = await decideModelSave({ model: savedModel, source, targets, preferences, options, ui, masker })\n if (toSave.length > 0) modelSaves.push({ model: savedModel, harnesses: toSave })\n }\n\n const modelByAgent = new Map(agentModels.map(({ harness, model: agentModel }) => [harness.id, agentModel]))\n return { kind: 'chosen', modelChoice: { kind: 'picked', modelByAgent }, modelSaves }\n}\n\nfunction findRepick(repicks: readonly Repick[], harnessId: string): string | undefined {\n return repicks.find(({ group }) => group.harnessIds.includes(harnessId))?.model\n}\n\ntype HarnessModel = { harness: ConfigurableHarness; model: string }\n\nfunction groupHarnessesByModel(agentModels: readonly HarnessModel[]): Map<string, ConfigurableHarness[]> {\n const harnessesByModel = new Map<string, ConfigurableHarness[]>()\n for (const { harness, model } of agentModels) {\n harnessesByModel.set(model, [...(harnessesByModel.get(model) ?? []), harness])\n }\n return harnessesByModel\n}\n","import type { CliOptions } from '../../cli/parse-cli-arguments'\nimport { isPredefinedModel } from '../../product/public-api/models/predefined-models'\nimport { requestModel } from './model-step'\nimport type { AgentKey } from './per-key/probe-groups'\nimport { readEachKey } from './per-key/read-each-key'\nimport { pickProbedModel, type ModelStepParams, type PickedModel } from './pick-probed-model'\n\nexport type ChooseModelForKeptKeysParams = ModelStepParams & {\n agents: readonly AgentKey[]\n envModel: string | undefined\n options: Pick<CliOptions, 'model'>\n}\n\n/** A kept key is never checked: it only lists models and checks the router, quietly, to draw the picker. */\nexport async function chooseModelForKeptKeys(params: ChooseModelForKeptKeysParams): Promise<PickedModel> {\n const { agents, options, ui } = params\n const requested = await requestModel({\n flagModel: options.model,\n envModel: params.envModel,\n targets: agents.map(({ harness }) => harness),\n preferences: params.preferences,\n shouldAssumeYes: options.shouldAssumeYes,\n currentModels: params.currentModels,\n ui,\n })\n const reads = options.shouldVerify\n ? await readEachKey({\n agents,\n isRouterWanted: requested === undefined || isPredefinedModel(requested.model),\n publicApiUrls: params.publicApiUrls,\n ui,\n masker: params.masker,\n fetch: params.fetch,\n })\n : new Map()\n\n return await pickProbedModel({ ...params, reads, earlierProbes: new Map(), decidedModel: undefined, requested })\n}\n","import { announceHostOverrides } from '../../cli/announce-host-overrides'\nimport type { FinishedOutcome } from '../../cli/command-outcome'\nimport type { EnvironmentInputs } from '../../cli/environment'\nimport type { CliOptions } from '../../cli/parse-cli-arguments'\nimport { resolveNamedHarnesses } from '../../cli/resolve-named-harnesses'\nimport {\n ABORTED,\n configureAgents,\n describeProbeConsequence,\n reportUnchangeable,\n type ConfigureRun,\n} from '../../flows/configure/configure-agents'\nimport { buildDesiredByAgent } from '../../flows/configure/desired-by-agent'\nimport {\n listModelsInUse,\n readConfigurableAgents,\n summarizeCurrentConfigs,\n} from '../../flows/configure/read-current-configs'\nimport { resolveChangeScope } from '../../flows/configure/resolve-change-scope'\nimport { describeNothingConfigured, selectTargetAgents, toDetected } from '../../flows/configure/select-target-agents'\nimport { findExistingKeys } from '../../flows/key/find-existing-keys'\nimport { chooseModelForKeptKeys } from '../../flows/model/choose-model-for-kept-keys'\nimport { loadModelPreferences } from '../../flows/model/model-step'\nimport { PUBLIC_API_HOST, buildPublicApiUrls } from '../../product/public-api/desired-config'\nimport type { Masker } from '../../product/secrets/masker'\nimport { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport type { UserEnvironment } from '../../product/storage/windows-environment/user-environment'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\n\nexport type ChangeModelParams = {\n options: CliOptions\n baseContext: PlatformContext\n ui: TerminalUi\n fetch: Fetch\n now: () => Date\n masker: Masker\n userEnvironment: UserEnvironment\n environment: EnvironmentInputs\n}\n\nexport async function changeModel(params: ChangeModelParams): Promise<FinishedOutcome> {\n const { options, ui, masker, environment } = params\n\n const publicApiUrls = buildPublicApiUrls(environment.publicApiHost ?? PUBLIC_API_HOST)\n announceHostOverrides({ overrides: environment, ui, masker })\n const namedHarnesses = resolveNamedHarnesses(options.harnessIds)\n const changeScope = await resolveChangeScope({\n requestedScope: options.scope,\n shouldAssumeYes: options.shouldAssumeYes,\n baseContext: params.baseContext,\n ui,\n })\n if (changeScope.kind === 'nothing-configured') return describeNothingConfigured(undefined)\n\n const { scope } = changeScope\n const ctx: PlatformContext = { ...params.baseContext, scope }\n const shell = resolveShell(ctx.platform)\n const envPath = resolveEnvFilePath(ctx.home, shell)\n // The diff shows the configs this run rewrites, keys included, so every key on disk is registered first.\n masker.registerSecrets(findExistingKeys({ ctx, envPath, shell }).all)\n\n const agents = readConfigurableAgents({ ctx, envPath, shell })\n const selection = await selectTargetAgents({\n agents,\n namedHarnesses,\n scope,\n changing: 'model',\n shouldAssumeYes: options.shouldAssumeYes,\n ui,\n masker,\n })\n if (selection.kind === 'none-configured') return describeNothingConfigured(scope)\n\n const { targets, unchangeable } = selection\n const run: ConfigureRun = {\n options,\n ctx,\n shell,\n envPath,\n ui,\n masker,\n now: params.now,\n userEnvironment: params.userEnvironment,\n }\n if (targets.length === 0) return await reportUnchangeable(run, unchangeable)\n\n const picked = await chooseModelForKeptKeys({\n agents: summarizeCurrentConfigs({ targets, agents }).keptKeys,\n envModel: undefined,\n currentModels: { kind: 'current', models: listModelsInUse(agents) },\n preferences: loadModelPreferences(ctx.home, ui),\n publicApiUrls,\n options,\n probeConsequence: describeProbeConsequence(options),\n ui,\n masker,\n fetch: params.fetch,\n })\n if (picked.kind === 'declined') return ABORTED\n\n return await configureAgents({\n run,\n selected: targets.map(toDetected),\n desiredByAgent: buildDesiredByAgent({\n targets,\n keyChoice: { kind: 'each-current' },\n modelChoice: picked.modelChoice,\n publicApiUrls,\n }),\n keySave: undefined,\n modelSaves: picked.modelSaves,\n hasInstallFailure: false,\n unchangeable,\n })\n}\n","import { runCommandShell } from '../../cli/command-outcome'\nimport { readEnvironmentInputs } from '../../cli/environment'\nimport type { ExitCode } from '../../cli/exit-code'\nimport { refusePrompts } from '../../cli/refuse-prompts'\nimport { changeModel, type ChangeModelParams } from './change-model'\n\nexport type RunChangeModelParams = Omit<ChangeModelParams, 'environment'>\n\nexport async function runChangeModel(params: RunChangeModelParams): Promise<ExitCode> {\n return await runCommandShell({\n ui: params.ui,\n isInteractive: params.baseContext.isInteractive,\n refuse: refusePrompts,\n run: async (ui) => await changeModel({ ...params, ui, environment: readEnvironmentInputs(params.baseContext.env) }),\n })\n}\n","import { match } from 'ts-pattern'\nimport { EXIT_CODE, type ExitCode } from '../../cli/exit-code'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport type { SessionStore } from '../../product/storage/session/session-store'\nimport { describeError } from '../../shared/text/describe-error'\nimport type { TerminalUi } from '../../ui/terminal-ui'\n\nexport type ForgetKeyParams = {\n keystore: Keystore\n sessionStore: SessionStore\n ui: Pick<TerminalUi, 'log'>\n masker: Masker\n}\n\nexport async function forgetKey({ keystore, sessionStore, ui, masker }: ForgetKeyParams): Promise<ExitCode> {\n const availability = await keystore.availability()\n if (availability.kind === 'unavailable') {\n if (availability.hasPossibleEntry) {\n ui.log.error(`${availability.reason} — the saved key and sign-in, if any, were not removed.`)\n return EXIT_CODE.failed\n }\n ui.log.info(`${availability.reason} — nothing to forget.`)\n return EXIT_CODE.ok\n }\n try {\n await registerSessionTokens(sessionStore, masker)\n const hasForgottenKey = await keystore.clear()\n const hasForgottenSession = await sessionStore.clear()\n ui.log.success(describeForgotten({ hasForgottenKey, hasForgottenSession }))\n return EXIT_CODE.ok\n } catch (error) {\n // The saved key is never loaded here, so only masking by shape applies to it.\n ui.log.error(\n masker.maskText(\n `Could not remove the saved key or sign-in: ${describeError(error)}. ` +\n 'Remove the \"nexos-connect\" items from your system keychain by hand.',\n ),\n )\n return EXIT_CODE.failed\n }\n}\n\n// Unlike a key, a sign-in token has no shape the masker could spot unregistered.\nasync function registerSessionTokens(sessionStore: SessionStore, masker: Masker): Promise<void> {\n const load = await sessionStore.load()\n if (load.kind === 'session') masker.registerSecrets([load.session.accessToken, load.session.refreshToken])\n}\n\ntype ForgottenEntries = { hasForgottenKey: boolean; hasForgottenSession: boolean }\n\nfunction describeForgotten({ hasForgottenKey, hasForgottenSession }: ForgottenEntries): string {\n return match([hasForgottenKey, hasForgottenSession])\n .with([true, true], () => 'Removed the saved key and signed you out on this machine.')\n .with([true, false], () => 'Removed the saved key.')\n .with([false, true], () => 'Signed you out on this machine.')\n .with([false, false], () => 'Nothing to forget.')\n .exhaustive()\n}\n","import { match } from 'ts-pattern'\nimport { exitCodeForOutcome, printClosing } from '../../cli/command-outcome'\nimport { readEnvironmentInputs } from '../../cli/environment'\nimport { COMMAND_NAME, TAGLINE } from '../../cli/help'\nimport { refusePrompts } from '../../cli/refuse-prompts'\nimport type { LaunchingHarness } from '../../harnesses/harness'\nimport type { LaunchResult } from '../../harnesses/launch/run-launch'\nimport { listLaunchingHarnesses } from '../../harnesses/registry'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { launch, type LaunchDeps, type LaunchInput } from './launch'\n\nexport type AgentRequest = { kind: 'named'; harness: LaunchingHarness } | { kind: 'ask' }\n\nexport type StartAgentParams = Omit<LaunchInput, 'environment' | 'harness'> & LaunchDeps & { agent: AgentRequest }\n\nexport async function startAgent(params: StartAgentParams): Promise<LaunchResult> {\n const { agent, passthrough, options, ...deps } = params\n const ui = deps.ctx.isInteractive ? deps.ui : refusePrompts(deps.ui)\n ui.intro(describeIntro(agent))\n const harness = await resolveHarness(agent, ui, deps.ctx)\n\n const environment = readEnvironmentInputs(deps.ctx.env)\n const outcome = await launch({ harness, passthrough, options, environment }, { ...deps, ui })\n if (outcome.kind === 'exited') return outcome.result\n\n printClosing(outcome.closing, ui)\n return { code: exitCodeForOutcome(outcome) }\n}\n\nfunction describeIntro(agent: AgentRequest): string {\n return match(agent)\n .with(\n { kind: 'named' },\n ({ harness }) => `${COMMAND_NAME} — starting ${harness.label} through the nexos.ai Gateway`,\n )\n .with({ kind: 'ask' }, () => TAGLINE)\n .exhaustive()\n}\n\nasync function resolveHarness(agent: AgentRequest, ui: TerminalUi, ctx: PlatformContext): Promise<LaunchingHarness> {\n return await match(agent)\n .with({ kind: 'named' }, async ({ harness }) => harness)\n .with({ kind: 'ask' }, async () => await askForHarness(ui, ctx))\n .exhaustive()\n}\n\nexport async function askForHarness(ui: TerminalUi, ctx: PlatformContext): Promise<LaunchingHarness> {\n return await ui.selectLaunchAgent(\n listLaunchingHarnesses().map((harness) => ({ harness, isInstalled: ctx.hasBinary(harness.binary) })),\n )\n}\n","import { UsageError } from '../../cli/errors/usage-error'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\n\nexport type InstallOutcome =\n | { kind: 'installed' }\n | { kind: 'skipped' }\n | { kind: 'declined' }\n | { kind: 'failed'; message: string }\n | { kind: 'not-on-path'; packageName: string }\n\nexport type NpmResult = { kind: 'exited'; code: number } | { kind: 'could-not-start' }\n\nexport type RunNpm = (npmArguments: readonly string[]) => Promise<NpmResult>\n\nexport type InstallHarnessParams = {\n label: string\n binary: string\n packageName: string\n shouldInstall: boolean\n shouldAssumeYes: boolean\n ui: TerminalUi\n ctx: PlatformContext\n runNpm: RunNpm\n}\n\nconst NPM = 'npm'\nconst NPM_INSTALL_ARGUMENTS = ['install', '--global', '--no-audit', '--no-fund'] as const\n\n/**\n * Installs a missing agent with npm, returning how far it got. Consent comes first: npm only runs\n * on `--install` or an explicit yes, and a no-terminal run without either is a usage error.\n */\nexport async function installHarness(params: InstallHarnessParams): Promise<InstallOutcome> {\n const { label, binary, packageName, shouldInstall, shouldAssumeYes, ui, ctx, runNpm } = params\n\n if (!shouldInstall && !shouldAssumeYes && !ctx.isInteractive) {\n throw new UsageError(`Cannot install ${label} without a terminal. Pass --install.`)\n }\n if (!shouldInstall) {\n if (shouldAssumeYes) return { kind: 'skipped' }\n if (!(await ui.confirm(askToInstall({ label, packageName }), false))) return { kind: 'declined' }\n }\n\n if (!ctx.hasBinary(NPM)) return { kind: 'failed', message: describeNpmMissing({ label, packageName }) }\n\n const result = await runNpm([...NPM_INSTALL_ARGUMENTS, packageName])\n if (result.kind === 'could-not-start') {\n return { kind: 'failed', message: describeNpmNotStarted({ label, packageName }) }\n }\n if (result.code !== 0) {\n return { kind: 'failed', message: describeNpmFailure({ label, packageName, exitCode: result.code }) }\n }\n\n if (!ctx.hasBinary(binary)) return { kind: 'not-on-path', packageName }\n return { kind: 'installed' }\n}\n\nexport type InstallTarget = { label: string; binary: string }\n\n/** For a binary that is missing and cannot be installed here. */\nexport function describeMissingBinary({ label, binary }: InstallTarget): string {\n return `${binary} not found on PATH. Install ${label} first.`\n}\n\n/** For a successful install whose binary npm's global bin still does not expose. */\nexport function describeNotOnPath({ label, binary }: InstallTarget): string {\n return `Installed ${label}, but ${binary} is still not on PATH. Check npm's global bin is on PATH (npm prefix -g).`\n}\n\ntype InstallNames = { label: string; packageName: string }\n\nfunction askToInstall({ label, packageName }: InstallNames): string {\n return `${label} isn't on your PATH. Install it now? (npm install -g ${packageName})`\n}\n\nfunction describeNpmMissing({ label, packageName }: InstallNames): string {\n return `Couldn't install ${label}: npm was not found on PATH. Install it yourself: npm install -g ${packageName}.`\n}\n\nfunction describeNpmNotStarted({ label, packageName }: InstallNames): string {\n return `Couldn't install ${label}: npm could not be started. Install it yourself: npm install -g ${packageName}.`\n}\n\ntype NpmFailure = InstallNames & { exitCode: number }\n\nfunction describeNpmFailure({ label, packageName, exitCode }: NpmFailure): string {\n return `Couldn't install ${label} (npm exited ${exitCode}). Install it yourself: npm install -g ${packageName}.`\n}\n","import type { CliOptions } from '../../cli/parse-cli-arguments'\nimport type { ConfigurableHarness } from '../../harnesses/harness'\nimport { isPredefinedModel } from '../../product/public-api/models/predefined-models'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { checkKeyStep, skippedKeyCheck, type KeyCheck } from '../key/key-check'\nimport type { CheckOutcome, KeyStepRun, ResolvedKey } from '../key/key-step'\nimport { probeRouter, type RouterProbe } from './model-probe'\nimport { requestModel } from './model-step'\nimport { pickProbedModel, type ModelChoice, type ModelSave, type ModelStepParams } from './pick-probed-model'\n\nexport type ChooseCheckedModelParams = ModelStepParams & {\n keyStep: KeyStepRun\n configurable: readonly ConfigurableHarness[]\n envModel: string | undefined\n options: Pick<CliOptions, 'model'>\n}\n\nexport type ModelDecision =\n | {\n kind: 'chosen'\n resolvedKey: ResolvedKey\n check: CheckOutcome\n modelChoice: ModelChoice\n /** The models to save as defaults once the run goes ahead, each for its agents. */\n modelSaves: ModelSave[]\n }\n | { kind: 'declined' }\n | { kind: 'aborted' }\n\nexport async function chooseCheckedModel(params: ChooseCheckedModelParams): Promise<ModelDecision> {\n const { keyStep, configurable, publicApiUrls, options, ui, masker } = params\n const publicApiParams = { ui, masker, fetch: params.fetch }\n const requested = await requestModel({\n flagModel: options.model,\n envModel: params.envModel,\n targets: configurable,\n preferences: params.preferences,\n shouldAssumeYes: options.shouldAssumeYes,\n currentModels: params.currentModels,\n ui,\n })\n const requestedModel = requested?.model\n const keyCheck: KeyCheck = options.shouldVerify\n ? await checkKeyStep({\n ...publicApiParams,\n openaiBaseUrl: publicApiUrls.openaiBaseUrl,\n requestedModel,\n shouldAssumeYes: options.shouldAssumeYes,\n fallback: 'pick-model',\n keyStep,\n })\n : skippedKeyCheck(keyStep.resolved)\n if (keyCheck.isAborted) return { kind: 'aborted' }\n\n const routerProbe = await probeRouterIfOffered({\n keyCheck,\n requestedModel,\n anthropicBaseUrl: publicApiUrls.anthropicBaseUrl,\n ui,\n masker,\n fetch: params.fetch,\n })\n const key = keyCheck.resolvedKey.key\n const picked = await pickProbedModel({\n ...params,\n agents: configurable.map((harness) => ({ harness, key })),\n reads: new Map([[key, { models: keyCheck.models, router: routerProbe }]]),\n earlierProbes: new Map([[key, keyCheck.probes]]),\n decidedModel: keyCheck.decidedModel,\n requested,\n })\n if (picked.kind === 'declined') return picked\n\n return { ...picked, resolvedKey: keyCheck.resolvedKey, check: keyCheck.outcome }\n}\n\ntype ProbeRouterIfOfferedParams = {\n keyCheck: KeyCheck\n requestedModel: string | undefined\n anthropicBaseUrl: string\n ui: TerminalUi\n masker: Masker\n fetch: Fetch\n}\n\nasync function probeRouterIfOffered({\n keyCheck,\n requestedModel,\n anthropicBaseUrl,\n ui,\n masker,\n fetch,\n}: ProbeRouterIfOfferedParams): Promise<RouterProbe | undefined> {\n if (keyCheck.outcome !== 'passed') return undefined\n if (requestedModel !== undefined && !isPredefinedModel(requestedModel)) return undefined\n\n return await probeRouter({ anthropicBaseUrl, key: keyCheck.resolvedKey.key, ui, masker, fetch })\n}\n","import { announceHostOverrides } from '../../cli/announce-host-overrides'\nimport { NO_KEY, type CommandOutcome, type FinishedOutcome } from '../../cli/command-outcome'\nimport { parseEnvironmentKey, type EnvironmentInputs } from '../../cli/environment'\nimport { isKeyNamedByFlag, type CliOptions } from '../../cli/parse-cli-arguments'\nimport { createSessionAuth } from '../../flows/auth/auth-step'\nimport {\n describeMissingBinary,\n describeNotOnPath,\n installHarness,\n type RunNpm,\n} from '../../flows/install/install-harness'\nimport { findExistingKeys } from '../../flows/key/find-existing-keys'\nimport {\n adoptKey,\n commitSave,\n isKeyUsable,\n resolveKey,\n type KeyStepDeps,\n type KeyStepInput,\n} from '../../flows/key/key-step'\nimport { chooseCheckedModel } from '../../flows/model/choose-checked-model'\nimport { commitModelSave, loadModelPreferences } from '../../flows/model/model-step'\nimport type { LaunchingHarness, LaunchRecipe } from '../../harnesses/harness'\nimport type { LaunchResult } from '../../harnesses/launch/run-launch'\nimport { PUBLIC_API_HOST, buildDesiredConfig, buildPublicApiUrls } from '../../product/public-api/desired-config'\nimport type { Masker } from '../../product/secrets/masker'\nimport { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport type { SessionStore } from '../../product/storage/session/session-store'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { ResolvedExecutable } from '../../shared/platform/has-binary'\nimport type { BrowserSpawn } from '../../shared/platform/open-browser'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\n\nexport type LaunchOptions = Pick<\n CliOptions,\n | 'key'\n | 'keyId'\n | 'keyName'\n | 'model'\n | 'shouldSaveKey'\n | 'shouldSaveModel'\n | 'shouldInstall'\n | 'shouldVerify'\n | 'shouldAssumeYes'\n>\n\nexport type LaunchInput = {\n harness: LaunchingHarness\n passthrough: readonly string[]\n options: LaunchOptions\n environment: EnvironmentInputs\n}\n\nexport type LaunchDeps = {\n keystore: Keystore\n sessionStore: SessionStore\n ui: TerminalUi\n masker: Masker\n ctx: PlatformContext\n fetch: Fetch\n runLaunch(recipe: LaunchRecipe, passthrough: readonly string[], resolved: ResolvedExecutable): Promise<LaunchResult>\n runNpm: RunNpm\n spawn: BrowserSpawn\n now: () => Date\n}\n\nconst DESTINATION = 'It is passed to the agent for this run and is not written to any agent config.'\nconst FAILED: FinishedOutcome = { kind: 'failed', closing: undefined }\nconst NOT_STARTED: FinishedOutcome = {\n kind: 'backed-out',\n closing: { tone: 'cancel', message: 'Aborted — the agent was not started.' },\n}\n\nexport async function launch(input: LaunchInput, deps: LaunchDeps): Promise<CommandOutcome> {\n const { harness, options, environment } = input\n const { ui, masker, ctx } = deps\n\n // Checked first, so nobody pastes a key for an agent that is not there.\n if (!ctx.hasBinary(harness.binary)) {\n const stopped = await offerInstall({ harness, options, ui, ctx, runNpm: deps.runNpm })\n if (stopped !== null) return stopped\n }\n\n const resolvedHarness = ctx.resolveBinary(harness.binary)\n if (resolvedHarness === undefined) {\n ui.log.error(describeMissingBinary(harness))\n return FAILED\n }\n\n const publicApiUrls = buildPublicApiUrls(environment.publicApiHost ?? PUBLIC_API_HOST)\n announceHostOverrides({ overrides: environment, ui, masker })\n const { keystore, sessionStore, fetch, spawn, now } = deps\n const auth = createSessionAuth({\n services: { ctx, ui, sessionStore, fetch, masker, spawn, now },\n environment,\n keyNameOptions: { keyName: options.keyName, shouldAssumeYes: options.shouldAssumeYes },\n })\n const keyDeps: KeyStepDeps = { keystore, ui, masker, auth }\n const keyInput = aKeyStepInput({ ctx, options, environmentKey: environment.key, masker })\n const resolved = await resolveKey(keyInput, keyDeps)\n if (!isKeyUsable(resolved.key)) return NO_KEY\n adoptKey(resolved.key, { ui, masker })\n\n const decision = await chooseCheckedModel({\n keyStep: { input: keyInput, deps: keyDeps, resolved },\n configurable: [harness],\n currentModels: { kind: 'none' },\n envModel: environment.model,\n preferences: loadModelPreferences(ctx.home, ui),\n publicApiUrls,\n options: { ...options, isDryRun: false },\n probeConsequence: 'the agent starts with this model',\n ui,\n masker,\n fetch: deps.fetch,\n })\n if (decision.kind === 'declined') return NOT_STARTED\n if (decision.kind === 'aborted') return FAILED\n\n const model = decision.modelChoice.kind === 'picked' ? decision.modelChoice.modelByAgent.get(harness.id) : undefined\n if (model === undefined) throw new Error(`No model was chosen for ${harness.label}.`)\n\n await commitSave(decision.resolvedKey, decision.check, keyDeps)\n for (const modelSave of decision.modelSaves) commitModelSave({ ...modelSave, home: ctx.home, ui, masker })\n\n const desired = buildDesiredConfig({ publicApiUrls, apiKey: decision.resolvedKey.key, model })\n const recipe = harness.launch(desired)\n if (harness.launchNotes !== undefined) {\n ui.note(harness.launchNotes.join('\\n'), 'Nothing is written to your config, but')\n }\n return { kind: 'exited', result: await deps.runLaunch(recipe, input.passthrough, resolvedHarness) }\n}\n\ntype OfferInstallParams = {\n harness: LaunchingHarness\n options: LaunchOptions\n ui: TerminalUi\n ctx: PlatformContext\n runNpm: RunNpm\n}\n\n/** Returns the outcome to stop with, or null to carry on with the launch. */\nasync function offerInstall({\n harness,\n options,\n ui,\n ctx,\n runNpm,\n}: OfferInstallParams): Promise<FinishedOutcome | null> {\n if (harness.installPackage === undefined) {\n ui.log.error(describeMissingBinary(harness))\n return FAILED\n }\n\n const outcome = await installHarness({\n label: harness.label,\n binary: harness.binary,\n packageName: harness.installPackage,\n shouldInstall: options.shouldInstall,\n shouldAssumeYes: options.shouldAssumeYes,\n ui,\n ctx,\n runNpm,\n })\n if (outcome.kind === 'installed') return null\n if (outcome.kind === 'declined') return NOT_STARTED\n if (outcome.kind === 'skipped') {\n ui.log.error(describeMissingBinary(harness))\n return FAILED\n }\n if (outcome.kind === 'not-on-path') {\n ui.log.error(describeNotOnPath(harness))\n return FAILED\n }\n\n ui.log.error(outcome.message)\n return FAILED\n}\n\ntype KeyStepInputParams = {\n ctx: PlatformContext\n options: LaunchOptions\n environmentKey: string | undefined\n masker: Masker\n}\n\nfunction aKeyStepInput({ ctx, options, environmentKey, masker }: KeyStepInputParams): KeyStepInput {\n const shell = resolveShell(ctx.platform)\n const existingKeys = findExistingKeys({ ctx, envPath: resolveEnvFilePath(ctx.home, shell), shell })\n masker.registerSecrets(existingKeys.all)\n\n return {\n flagKey: options.key,\n keyId: options.keyId,\n envKey: isKeyNamedByFlag(options) ? undefined : parseEnvironmentKey(environmentKey),\n shouldSaveKey: options.shouldSaveKey,\n shouldAssumeYes: options.shouldAssumeYes,\n isDryRun: false,\n existingKeys: () => existingKeys,\n destination: DESTINATION,\n }\n}\n","import { announceHostOverrides } from '../../cli/announce-host-overrides'\nimport { KEY_ENV_VARIABLE, type EnvironmentInputs } from '../../cli/environment'\nimport { UsageError } from '../../cli/errors/usage-error'\nimport { EXIT_CODE, type ExitCode } from '../../cli/exit-code'\nimport { COMMAND_NAME, LOGIN_COMMAND } from '../../cli/help'\nimport { keyNameChooser } from '../../flows/auth/key-name'\nimport { isLoginFailure, signInAndCreateKey, type LoginFlowDeps } from '../../flows/auth/login-flow'\nimport { rememberSavedKey } from '../../flows/auth/remember-saved-key'\nimport { revokeSession } from '../../flows/auth/revoke-session'\nimport { LoginAbandonedError, LoginTimeoutError, LoginUnavailableError } from '../../flows/auth/sign-in'\nimport { buildLoginFlowDeps } from '../../flows/auth/sign-in-services'\nimport { describeKeyStillActive, labelSavedKey } from '../../flows/key/key-step'\nimport { NoPublicApiAccessError } from '../../product/internal-api-proxy/api-keys'\nimport { API_KEYS_URL } from '../../product/public-api/desired-config'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport type { Session, SessionStore } from '../../product/storage/session/session-store'\nimport { isTransportFailure } from '../../shared/http/request-errors'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { BrowserSpawn } from '../../shared/platform/open-browser'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { CancelledError } from '../../ui/terminal/cancelled-error'\n\nexport type LoginOptions = { shouldAssumeYes: boolean; keyName: string | undefined }\n\nexport type RunLoginParams = {\n options: LoginOptions\n ctx: PlatformContext\n ui: TerminalUi\n keystore: Keystore\n sessionStore: SessionStore\n masker: Masker\n fetch: Fetch\n spawn: BrowserSpawn\n now: () => Date\n environment: EnvironmentInputs\n}\n\nconst CREATE_KEY_BY_HAND = `Create a key at ${API_KEYS_URL} and pass it to \\`${COMMAND_NAME}\\` with --key or $${KEY_ENV_VARIABLE}.`\n\nexport const LOGIN_NEEDS_TERMINAL = `Cannot sign in without a terminal. ${CREATE_KEY_BY_HAND}`\n\nexport function describeKeychainRequirement(reason: string): string {\n return `${reason}, and signing in needs one. ${CREATE_KEY_BY_HAND}`\n}\n\nexport function describeKeyCreated(keyName: string): string {\n return (\n `Created key \"${keyName}\". Run \\`${COMMAND_NAME}\\` to set up your agents with it. ` +\n `To give it a spending limit or an expiry date, go to ${API_KEYS_URL}.`\n )\n}\n\nexport function describeSignInAgain(email: string): string {\n return `You are signed in as ${email}. Sign in again?`\n}\n\nexport function describeSignInAgainReplacing(email: string, label: string): string {\n return `You are signed in as ${email}. Sign in again and replace the saved key \"${label}\"?`\n}\n\nexport function describeReplaceWithNewKey(label: string): string {\n return `Replace the saved key \"${label}\" with a new one from nexos.ai?`\n}\n\n/** Running `login` is the choice to replace the saved key, so it asks once, before the browser, and not under `--yes`. */\nexport async function runLogin(params: RunLoginParams): Promise<ExitCode> {\n const { options, ctx, ui, keystore, sessionStore, masker, environment } = params\n if (!ctx.isInteractive) throw new UsageError(LOGIN_NEEDS_TERMINAL)\n\n const { authHost, internalApiProxyHost } = environment\n announceHostOverrides({ overrides: { authHost, internalApiProxyHost }, ui, masker })\n\n const chooseKeyName = keyNameChooser({ keyName: options.keyName, shouldAssumeYes: options.shouldAssumeYes, ui })\n const availability = await sessionStore.availability()\n if (availability.kind === 'unavailable') throw new UsageError(describeKeychainRequirement(availability.reason))\n\n const previous = await readPreviousSession(params)\n const savedKeyLabel = await readSavedKeyLabel(params, previous)\n if (!options.shouldAssumeYes && !(await confirmLogin({ ui, masker, previous, savedKeyLabel }))) {\n throw new CancelledError()\n }\n\n const deps = toLoginFlowDeps(params)\n try {\n const created = await signInAndCreateKey({ deps, keyName: chooseKeyName, previous })\n await keystore.save(created.key)\n await rememberSavedKey(sessionStore, created)\n if (previous !== undefined) await revokeSession({ ...deps, session: previous })\n ui.log.success(masker.maskText(describeKeyCreated(created.keyName)))\n if (savedKeyLabel !== undefined) ui.log.info(masker.maskText(describeKeyStillActive(savedKeyLabel)))\n return EXIT_CODE.ok\n } catch (error) {\n if (error instanceof LoginAbandonedError) throw new CancelledError()\n const message = describeLoginFailure(error)\n if (message === undefined) throw error\n ui.log.error(masker.maskText(message))\n return EXIT_CODE.failed\n }\n}\n\nasync function readPreviousSession({ sessionStore, ui, masker }: RunLoginParams): Promise<Session | undefined> {\n const load = await sessionStore.load()\n if (load.kind === 'none') return undefined\n if (load.kind === 'corrupt') {\n ui.log.warn(masker.maskText(`Your saved sign-in could not be read (${load.detail}); signing in again replaces it.`))\n return undefined\n }\n masker.registerSecrets([load.session.accessToken, load.session.refreshToken])\n return load.session\n}\n\nasync function readSavedKeyLabel(\n { keystore, masker }: RunLoginParams,\n previous: Session | undefined,\n): Promise<string | undefined> {\n const saved = await keystore.load()\n if (saved === undefined) return undefined\n\n masker.registerSecrets([saved])\n return labelSavedKey({ key: saved, keyName: previous?.keyName, masker })\n}\n\ntype ConfirmLoginParams = {\n ui: TerminalUi\n masker: Masker\n previous: Session | undefined\n savedKeyLabel: string | undefined\n}\n\nasync function confirmLogin({ ui, masker, previous, savedKeyLabel }: ConfirmLoginParams): Promise<boolean> {\n const question = chooseLoginQuestion(previous, savedKeyLabel)\n return question === undefined || (await ui.confirm(masker.maskText(question), false))\n}\n\nfunction chooseLoginQuestion(previous: Session | undefined, savedKeyLabel: string | undefined): string | undefined {\n if (savedKeyLabel === undefined) return previous === undefined ? undefined : describeSignInAgain(previous.email)\n if (previous === undefined) return describeReplaceWithNewKey(savedKeyLabel)\n return describeSignInAgainReplacing(previous.email, savedKeyLabel)\n}\n\nfunction toLoginFlowDeps(params: RunLoginParams): LoginFlowDeps {\n const { ctx, ui, sessionStore, fetch, masker, spawn, now, environment } = params\n return buildLoginFlowDeps({ services: { ctx, ui, sessionStore, fetch, masker, spawn, now }, environment })\n}\n\nconst OR_CREATE_KEY_BY_HAND = `Or create a key at ${API_KEYS_URL} and pass it to \\`${COMMAND_NAME}\\` with --key.`\nconst LOGIN_AGAIN = `Run \\`${COMMAND_NAME} ${LOGIN_COMMAND}\\` again.`\n\nfunction describeLoginFailure(error: unknown): string | undefined {\n if (error instanceof LoginUnavailableError) return `${error.message} ${OR_CREATE_KEY_BY_HAND}`\n if (error instanceof LoginTimeoutError || isTransportFailure(error)) return `${error.message} ${LOGIN_AGAIN}`\n if (error instanceof NoPublicApiAccessError || isLoginFailure(error)) return error.message\n return undefined\n}\n","import { announceHostOverrides } from '../../cli/announce-host-overrides'\nimport type { EnvironmentInputs } from '../../cli/environment'\nimport { EXIT_CODE, type ExitCode } from '../../cli/exit-code'\nimport { COMMAND_NAME } from '../../cli/help'\nimport { FORGET_KEY_COMMAND } from '../../cli/parse-cli-arguments'\nimport { revokeSession } from '../../flows/auth/revoke-session'\nimport { resolveIdentity } from '../../flows/auth/sign-in-services'\nimport { labelSavedKey } from '../../flows/key/key-step'\nimport { API_KEYS_URL } from '../../product/public-api/desired-config'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport type { Session, SessionLoad, SessionStore } from '../../product/storage/session/session-store'\nimport type { Fetch } from '../../shared/http/send-request'\nimport { describeError } from '../../shared/text/describe-error'\nimport type { TerminalUi } from '../../ui/terminal-ui'\n\nexport type RunLogoutParams = {\n ui: Pick<TerminalUi, 'log'>\n keystore: Keystore\n sessionStore: SessionStore\n masker: Masker\n fetch: Fetch\n environment: EnvironmentInputs\n}\n\nexport const NOT_SIGNED_IN = 'Not signed in.'\nexport const SIGNED_OUT = 'Signed out.'\nexport const UNREADABLE_SIGN_IN_CLEARED = `${SIGNED_OUT} The saved sign-in could not be read — check ${API_KEYS_URL} for keys you no longer need.`\n\nexport function describeKeyLeftActive(label: string): string {\n return `Key \"${label}\" is still active at nexos.ai — delete it at ${API_KEYS_URL}.`\n}\n\nexport function describeRevokeFailure(detail: string): string {\n return `Signed out here, but nexos.ai could not be reached to end your sign-in (${detail}); it ends on its own.`\n}\n\nexport function describeUnreadableKeychain(reason: string): string {\n return `Could not read your system keychain (${reason}) — your sign-in, if any, was not removed.`\n}\n\nexport function describeClearFailure(reason: string): string {\n return (\n `Could not clear your system keychain (${reason}), so the saved sign-in or key may still be on this machine. ` +\n `Run \\`${COMMAND_NAME} ${FORGET_KEY_COMMAND}\\` to remove them.`\n )\n}\n\n/** Revokes the session and clears this machine; the key stays active at nexos.ai, so the run points to where to delete it. */\nexport async function runLogout(params: RunLogoutParams): Promise<ExitCode> {\n const { ui, sessionStore, masker, environment } = params\n announceHostOverrides({ overrides: { authHost: environment.authHost }, ui, masker })\n\n const availability = await sessionStore.availability()\n if (availability.kind === 'unavailable') {\n if (!availability.hasPossibleEntry) return notSignedIn(ui)\n\n ui.log.error(`${availability.reason} — your sign-in, if any, was not removed.`)\n return EXIT_CODE.failed\n }\n\n const load = await readSessionLoad(params)\n if (load === undefined) return EXIT_CODE.failed\n if (load.kind === 'none') return notSignedIn(ui)\n if (load.kind === 'corrupt') {\n try {\n await clearLocally(params)\n } catch (error) {\n return reportClearFailure(params, error)\n }\n ui.log.warn(UNREADABLE_SIGN_IN_CLEARED)\n return EXIT_CODE.ok\n }\n\n masker.registerSecrets([load.session.accessToken, load.session.refreshToken])\n return await signOut(params, load.session)\n}\n\nasync function readSessionLoad({ sessionStore, ui, masker }: RunLogoutParams): Promise<SessionLoad | undefined> {\n try {\n return await sessionStore.load()\n } catch (error) {\n ui.log.error(masker.maskText(describeUnreadableKeychain(describeError(error))))\n return undefined\n }\n}\n\nfunction notSignedIn(ui: Pick<TerminalUi, 'log'>): ExitCode {\n ui.log.info(NOT_SIGNED_IN)\n return EXIT_CODE.ok\n}\n\nasync function signOut(params: RunLogoutParams, session: Session): Promise<ExitCode> {\n const { ui, masker, fetch, environment } = params\n const savedKeyLabel = await readSavedKeyLabel(params, session)\n const identity = resolveIdentity({ environment, fetch, masker })\n const revokeFailure = await revokeSession({ session, identity })\n try {\n await clearLocally(params)\n } catch (error) {\n return reportClearFailure(params, error)\n }\n\n const keyNote = savedKeyLabel === undefined ? '' : ` ${describeKeyLeftActive(savedKeyLabel)}`\n if (revokeFailure === undefined) ui.log.success(masker.maskText(`${SIGNED_OUT}${keyNote}`))\n else ui.log.warn(masker.maskText(`${describeRevokeFailure(revokeFailure)}${keyNote}`))\n return EXIT_CODE.ok\n}\n\nasync function readSavedKeyLabel({ keystore, masker }: RunLogoutParams, session: Session): Promise<string | undefined> {\n const saved = await keystore.load()\n if (saved === undefined) return undefined\n\n masker.registerSecrets([saved])\n return labelSavedKey({ key: saved, keyName: session.keyName, masker })\n}\n\nasync function clearLocally({ sessionStore, keystore }: RunLogoutParams): Promise<void> {\n await sessionStore.clear()\n await keystore.clear()\n}\n\nfunction reportClearFailure({ ui, masker }: RunLogoutParams, error: unknown): ExitCode {\n ui.log.error(masker.maskText(describeClearFailure(describeError(error))))\n return EXIT_CODE.failed\n}\n","import { match } from 'ts-pattern'\nimport {\n exitCodeForOutcomes,\n FINISHED_WITH_ERRORS,\n printClosing,\n type CommandOutcome,\n type FinishedOutcome,\n} from '../../cli/command-outcome'\nimport { readEnvironmentInputs, type EnvironmentInputs } from '../../cli/environment'\nimport { classifyFailure } from '../../cli/errors/classify-failure'\nimport { EXIT_CODE } from '../../cli/exit-code'\nimport { TAGLINE } from '../../cli/help'\nimport type { LaunchResult } from '../../harnesses/launch/run-launch'\nimport type { MenuItemId } from '../../ui/prompts/menu/select-menu-item'\nimport { CancelledError } from '../../ui/terminal/cancelled-error'\nimport { changeKey } from '../change-key/change-key'\nimport { changeModel } from '../change-model/change-model'\nimport { launch, type LaunchDeps } from '../launch/launch'\nimport { askForHarness } from '../launch/start-agent'\nimport { restoreAgents } from '../restore/restore-agents'\nimport { setUpAgents, type SetUpAgentsParams } from '../setup/set-up-agents'\nimport { buildMenuItems } from './build-menu-items'\nimport { readMenuState } from './read-menu-state'\n\nexport type RunMenuParams = Omit<SetUpAgentsParams, 'environment'> &\n Pick<LaunchDeps, 'runLaunch'> & { isLastKeyInterrupt: () => boolean }\n\n/** Ends with the code the session exits with, or with the agent's own result once launch started one. */\nexport async function runMenu(params: RunMenuParams): Promise<LaunchResult> {\n const { ui, masker, baseContext } = params\n // Inside the menu the environment never answers a question: Codex users have $NEXOS_API_KEY in every shell.\n const run: MenuRun = {\n ...params,\n environment: { ...readEnvironmentInputs(baseContext.env), key: undefined, model: undefined },\n }\n ui.intro(TAGLINE)\n\n const outcomes: FinishedOutcome[] = []\n for (;;) {\n const state = readMenuState(baseContext)\n masker.registerSecrets(state.configured.flatMap(({ key }) => key ?? []))\n const chosen = await ui.selectMenuItem(buildMenuItems(state, masker))\n if (chosen === 'exit') {\n const code = exitCodeForOutcomes(outcomes)\n ui.outro(code === EXIT_CODE.ok ? 'Done.' : FINISHED_WITH_ERRORS)\n return { code }\n }\n\n const { outcome, shouldEndSession } = await runItem(chosen, run)\n if (outcome.kind === 'exited') return outcome.result\n\n printClosing(outcome.closing, ui)\n outcomes.push(outcome)\n if (shouldEndSession) return { code: exitCodeForOutcomes(outcomes) }\n }\n}\n\ntype MenuRun = RunMenuParams & { environment: EnvironmentInputs }\n\ntype CommandItemId = Exclude<MenuItemId, 'exit'>\n\n/** A command that backed out or threw stopped short of its outcome, so the menu shows again for another try. */\ntype ItemResult = { outcome: CommandOutcome; shouldEndSession: boolean }\n\nconst BACKED_OUT: ItemResult = {\n outcome: { kind: 'backed-out', closing: { tone: 'cancel', message: 'Cancelled — no config was changed.' } },\n shouldEndSession: false,\n}\n\nconst FAILED: ItemResult = { outcome: { kind: 'failed', closing: undefined }, shouldEndSession: false }\n\nasync function runItem(id: CommandItemId, run: MenuRun): Promise<ItemResult> {\n try {\n const outcome = await startItem(id, run)\n return { outcome, shouldEndSession: outcome.kind !== 'backed-out' }\n } catch (error) {\n if (error instanceof CancelledError && !run.isLastKeyInterrupt()) return BACKED_OUT\n\n const failure = classifyFailure(error, run.masker)\n if (failure.kind !== 'usage' && failure.kind !== 'failed') throw error\n run.ui.log.error(failure.message)\n return FAILED\n }\n}\n\nasync function startItem(id: CommandItemId, run: MenuRun): Promise<CommandOutcome> {\n return await match(id)\n .with('setup', async () => await setUpAgents(run))\n .with('launch', async () => await launchAgent(run))\n .with('change-key', async () => await changeKey(run))\n .with('change-model', async () => await changeModel(run))\n .with('restore', async () => await restoreAgents(run))\n .exhaustive()\n}\n\nasync function launchAgent(run: MenuRun): Promise<CommandOutcome> {\n const harness = await askForHarness(run.ui, run.baseContext)\n return await launch(\n { harness, passthrough: [], options: run.options, environment: run.environment },\n { ...run, ctx: run.baseContext },\n )\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport { FINISHED_WITH_ERRORS, type FinishedOutcome } from '../../cli/command-outcome'\nimport type { CliOptions } from '../../cli/parse-cli-arguments'\nimport { resolveNamedHarnesses } from '../../cli/resolve-named-harnesses'\nimport type { Harness } from '../../harnesses/harness'\nimport { findHarness } from '../../harnesses/registry'\nimport type { Masker } from '../../product/secrets/masker'\nimport { formatBackupTimestamp, resolveBackupRoot } from '../../product/storage/backups/resolve-backup-root'\nimport { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport {\n createEmptyRestoreRecord,\n isRestoreRecordEmpty,\n readRestoreRecord,\n RestoreRecordError,\n type RestoreRecord,\n} from '../../product/storage/restore-record/restore-record'\nimport { resolveRestoreRecordLocation } from '../../product/storage/restore-record/restore-record-location'\nimport type { UserEnvironment } from '../../product/storage/windows-environment/user-environment'\nimport { DEFAULT_SCOPE, type ConfigScope, type PlatformContext } from '../../shared/platform/platform-context'\nimport { displayPath, displayRelativePath } from '../../shared/text/display-path'\nimport { escapeForOneLine } from '../../shared/text/escape-control-characters'\nimport { formatCount } from '../../shared/text/format-count'\nimport type { RestoreChoice } from '../../ui/prompts/select-restore-harnesses'\nimport type { RecordedScope } from '../../ui/prompts/select-restore-scope'\nimport { formatRestorePreview } from '../../ui/report/preview/format-restore-preview'\nimport { formatRestoreResult } from '../../ui/report/result/format-restore-result'\nimport type { ResultMode } from '../../ui/report/result/format-result'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { applyRestore } from './apply-restore'\nimport { planRestore, type RestoreCandidate, type RestorePlan } from './restore-plan'\nimport { hasFailedRestore, isPlannedRestore } from './restore-result'\nimport { listRestoreSecrets } from './restore-secrets'\n\nexport type RestoreAgentsParams = {\n options: CliOptions\n baseContext: PlatformContext\n ui: TerminalUi\n now: () => Date\n masker: Masker\n userEnvironment: UserEnvironment\n}\n\nconst DRY_RUN_OUTRO = 'Dry run — nothing was restored.'\n\nexport async function restoreAgents(params: RestoreAgentsParams): Promise<FinishedOutcome> {\n const { options, masker, ui } = params\n\n const namedHarnesses = resolveNamedHarnesses(options.harnessIds)\n const scopeAnswer = await resolveRestoreScope({ options, baseContext: params.baseContext, ui })\n if (scopeAnswer.kind === 'nothing-recorded' && namedHarnesses.length === 0) {\n return { kind: 'done', closing: { tone: 'outro', message: describeNothingRecorded(params.baseContext) } }\n }\n\n const ctx: PlatformContext = { ...params.baseContext, scope: scopeAnswer.scope }\n const recordRead = readRecord(ctx)\n if (recordRead.kind === 'failed') {\n ui.log.error(masker.maskText(recordRead.error))\n return { kind: 'failed', closing: { tone: 'outro', message: FINISHED_WITH_ERRORS } }\n }\n\n const { record } = recordRead\n const hasRecordedHarnesses = Object.keys(record.harnesses).length > 0\n if (namedHarnesses.length === 0 && isRestoreRecordEmpty(record)) {\n const recordPath = displayPath(resolveRestoreRecordLocation(ctx).filePath, ctx.home)\n const message = `Nothing to restore — nexos-connect has not set up any agent at ${ctx.scope} scope (${recordPath}).`\n return { kind: 'done', closing: { tone: 'outro', message } }\n }\n\n const candidates = await selectCandidates({\n namedHarnesses,\n record,\n ctx,\n shouldAssumeYes: options.shouldAssumeYes,\n ui,\n })\n if (candidates.length === 0 && hasRecordedHarnesses) {\n return { kind: 'done', closing: { tone: 'cancel', message: 'No agents selected — nothing to do.' } }\n }\n\n const run: RestoreRun = { ...params, ctx }\n const plan = planSelected({ run, candidates, record })\n if (options.isDryRun) return report({ run, plan, mode: { kind: 'dry-run' }, outro: DRY_RUN_OUTRO })\n\n const hasChanges =\n plan.outcomes.some((outcome) => outcome.kind === 'restored') || plan.userEnvironment?.isChanged === true\n if (hasChanges && !options.shouldAssumeYes && !(await ui.confirm(describeConfirmation(plan), true))) {\n return { kind: 'backed-out', closing: { tone: 'cancel', message: 'Aborted — nothing was restored.' } }\n }\n\n const applied = applySelected(run, plan)\n const outro = hasFailedRestore(applied.outcomes) ? FINISHED_WITH_ERRORS : 'Done.'\n const mode = { kind: 'written', backupRoot: applied.backupRoot } as const\n return report({\n run,\n plan: { outcomes: applied.outcomes, envFile: applied.envFile, userEnvironment: applied.userEnvironment },\n mode,\n outro,\n })\n}\n\ntype RestoreRun = RestoreAgentsParams & { ctx: PlatformContext }\n\ntype ResolveRestoreScopeParams = { options: CliOptions; baseContext: PlatformContext; ui: TerminalUi }\n\n/** `nothing-recorded` carries the default scope, where a named agent still comes out with nothing to restore. */\ntype RestoreScopeAnswer = { kind: 'chosen' | 'nothing-recorded'; scope: ConfigScope }\n\nasync function resolveRestoreScope({\n options,\n baseContext,\n ui,\n}: ResolveRestoreScopeParams): Promise<RestoreScopeAnswer> {\n if (options.scope !== undefined) return { kind: 'chosen', scope: options.scope }\n if (options.shouldAssumeYes) return { kind: 'chosen', scope: DEFAULT_SCOPE }\n\n const user = readRecordedScope({ ...baseContext, scope: 'user' })\n const project = readRecordedScope({ ...baseContext, scope: 'project' })\n if (user.kind === 'empty' && project.kind === 'empty') return { kind: 'nothing-recorded', scope: DEFAULT_SCOPE }\n\n return { kind: 'chosen', scope: await ui.selectRestoreScope({ user, project }) }\n}\n\nconst WINDOWS_USER_ENVIRONMENT_ENTRY = 'the Windows user environment'\n\nfunction readRecordedScope(ctx: PlatformContext): RecordedScope {\n const recordRead = readRecord(ctx)\n if (recordRead.kind === 'failed') return { kind: 'unreadable' }\n if (isRestoreRecordEmpty(recordRead.record)) return { kind: 'empty' }\n\n const { harnesses, userEnvironment } = recordRead.record\n const environmentEntries = userEnvironment.length > 0 ? [WINDOWS_USER_ENVIRONMENT_ENTRY] : []\n return { kind: 'recorded', entries: [...Object.keys(harnesses).map(labelOf), ...environmentEntries] }\n}\n\nfunction describeNothingRecorded(baseContext: PlatformContext): string {\n const userRecord = resolveRestoreRecordLocation({ ...baseContext, scope: 'user' }).filePath\n const projectRecord = resolveRestoreRecordLocation({ ...baseContext, scope: 'project' }).filePath\n return (\n 'Nothing to restore — nexos-connect has not set up any agent at user scope ' +\n `(${displayPath(userRecord, baseContext.home)}) or in this directory ` +\n `(${displayRelativePath(projectRecord, baseContext.cwd)}).`\n )\n}\n\ntype RecordRead = { kind: 'read'; record: RestoreRecord } | { kind: 'failed'; error: string }\n\nfunction readRecord(ctx: PlatformContext): RecordRead {\n try {\n const record = readRestoreRecord({\n filePath: resolveRestoreRecordLocation(ctx).filePath,\n home: ctx.home,\n scope: ctx.scope,\n })\n return { kind: 'read', record: record ?? createEmptyRestoreRecord() }\n } catch (error) {\n if (!(error instanceof RestoreRecordError)) throw error\n return { kind: 'failed', error: error.message }\n }\n}\n\nfunction labelOf(harnessId: string): string {\n return findHarness(harnessId)?.label ?? escapeForOneLine(harnessId)\n}\n\ntype SelectCandidatesParams = {\n namedHarnesses: readonly Harness[]\n record: RestoreRecord\n ctx: PlatformContext\n shouldAssumeYes: boolean\n ui: TerminalUi\n}\n\nasync function selectCandidates(params: SelectCandidatesParams): Promise<RestoreCandidate[]> {\n const { namedHarnesses, record, ctx, ui } = params\n if (namedHarnesses.length > 0) return namedHarnesses.map((harness) => toCandidate(harness.id, record))\n\n const recordedIds = Object.keys(record.harnesses)\n if (recordedIds.length === 0) return []\n if (params.shouldAssumeYes) return recordedIds.map((id) => toCandidate(id, record))\n\n const chosenIds = await ui.selectRestoreHarnesses(recordedIds.map((id) => describeChoice({ id, record, ctx })))\n return chosenIds.map((id) => toCandidate(id, record))\n}\n\nfunction toCandidate(id: string, record: RestoreRecord): RestoreCandidate {\n return { target: { id, label: labelOf(id) }, record: record.harnesses[id] ?? null }\n}\n\ntype DescribeChoiceParams = { id: string; record: RestoreRecord; ctx: PlatformContext }\n\nconst ENV_VARIABLES_HINT = 'environment variables'\n\n// Joined without fromRecordedPath's check: a hint only shows a path, and planning fails a path outside the root.\nfunction describeChoice({ id, record, ctx }: DescribeChoiceParams): RestoreChoice {\n const harness = record.harnesses[id]\n const root = resolveRestoreRecordLocation(ctx).root\n const files = (harness?.files ?? []).map((file) => displayPath(path.join(root, ...file.path), ctx.home))\n const variables = (harness?.envVariables.length ?? 0) > 0 ? [ENV_VARIABLES_HINT] : []\n return { value: id, label: labelOf(id), hint: [...files, ...variables].join(', ') }\n}\n\ntype PlanSelectedParams = { run: RestoreRun; candidates: readonly RestoreCandidate[]; record: RestoreRecord }\n\nfunction planSelected({ run, candidates, record }: PlanSelectedParams): RestorePlan {\n const { ctx, masker, ui } = run\n const shell = resolveShell(ctx.platform)\n const envPath = resolveEnvFilePath(ctx.home, shell)\n masker.registerSecrets(listRestoreSecrets({ record, ctx, envPath, shell }))\n\n const plan = planRestore({ candidates, record, ctx, envPath, shell, userEnvironment: run.userEnvironment })\n const files = plan.outcomes.flatMap((outcome) => (isPlannedRestore(outcome) ? outcome.files : []))\n const hasFailedAgent = plan.outcomes.some((outcome) => outcome.kind === 'failed')\n ui.print(\n formatRestorePreview({\n files,\n envFile: plan.envFile,\n userEnvironment: plan.userEnvironment,\n scope: ctx.scope,\n hasFailedAgent,\n home: ctx.home,\n masker,\n }),\n )\n return plan\n}\n\nconst FILES_CONFIRMATION = 'Restore these files? Current versions are backed up first.'\nconst FILES_AND_USER_ENVIRONMENT_CONFIRMATION =\n 'Restore these files and the Windows user environment? Current files are backed up first; current variables are not.'\nconst USER_ENVIRONMENT_CONFIRMATION = 'Restore the Windows user environment? Its current variables are not backed up.'\n\nfunction describeConfirmation(plan: RestorePlan): string {\n const hasFileChanges =\n plan.envFile?.isChanged === true ||\n plan.outcomes.some((outcome) => isPlannedRestore(outcome) && outcome.files.some((file) => file.isChanged))\n return match({ hasFileChanges, isUserEnvironmentChanged: plan.userEnvironment?.isChanged === true })\n .with({ isUserEnvironmentChanged: false }, () => FILES_CONFIRMATION)\n .with({ hasFileChanges: true }, () => FILES_AND_USER_ENVIRONMENT_CONFIRMATION)\n .otherwise(() => USER_ENVIRONMENT_CONFIRMATION)\n}\n\nfunction applySelected(run: RestoreRun, plan: RestorePlan): ReturnType<typeof applyRestore> {\n const { options, ctx, ui } = run\n const backupRoot = resolveBackupRoot({\n scope: ctx.scope,\n home: ctx.home,\n cwd: ctx.cwd,\n stamp: formatBackupTimestamp(run.now()),\n backupDirectory: options.backupDirectory,\n })\n\n const shell = resolveShell(ctx.platform)\n const envPath = resolveEnvFilePath(ctx.home, shell)\n const spinner = ui.spinner()\n spinner.start('Backing up current versions and restoring…')\n const applied = applyRestore({ plan, ctx, backupRoot, userEnvironment: run.userEnvironment, envPath })\n spinner.stop(`Restored ${formatCount(applied.writtenCount, 'file')}.`)\n return applied\n}\n\ntype ReportParams = { run: RestoreRun; plan: RestorePlan; mode: ResultMode; outro: string }\n\nfunction report({ run, plan, mode, outro }: ReportParams): FinishedOutcome {\n const { ui, ctx, masker } = run\n ui.print(\n formatRestoreResult({\n outcomes: plan.outcomes,\n envFile: plan.envFile,\n userEnvironment: plan.userEnvironment,\n mode,\n home: ctx.home,\n masker,\n }),\n )\n const isFailed = hasFailedRestore(plan.outcomes)\n return { kind: isFailed ? 'failed' : 'done', closing: { tone: 'outro', message: outro } }\n}\n","import pc from 'picocolors'\nimport type {\n RestoreEnvPlan,\n RestoreFilePlan,\n RestoreUserEnvironmentPlan,\n} from '../../../commands/restore/restore-result'\nimport type { Masker } from '../../../product/secrets/masker'\nimport type { ConfigScope } from '../../../shared/platform/platform-context'\nimport { displayPath } from '../../../shared/text/display-path'\nimport { formatHeading } from '../format-heading'\nimport { formatUserEnvironmentPreview } from '../format-user-environment'\nimport { formatFileDiff } from './format-preview'\n\nexport type FormatRestorePreviewParams = {\n files: readonly RestoreFilePlan[]\n envFile: RestoreEnvPlan | null\n userEnvironment: RestoreUserEnvironmentPlan | null\n scope: ConfigScope\n hasFailedAgent: boolean\n home: string\n masker: Masker\n}\n\nconst NOTHING_TO_RESTORE = 'Nothing to change — every selected agent is already as it was.'\nconst NOTHING_TO_RESTORE_AFTER_FAILURE =\n 'Nothing to change — an agent failed while planning; the report below says why.'\n\nexport function formatRestorePreview(params: FormatRestorePreviewParams): string[] {\n const { files, envFile, userEnvironment, scope, hasFailedAgent, home, masker } = params\n const heading = formatHeading(`Planned restore ${pc.dim(`(scope: ${scope})`)}`)\n const changedFiles = files.filter((file) => file.isChanged)\n const changedEnvFile = envFile?.isChanged === true ? [envFile] : []\n const userEnvironmentLines = userEnvironment === null ? [] : formatUserEnvironmentPreview({ userEnvironment, masker })\n if (changedFiles.length === 0 && changedEnvFile.length === 0 && userEnvironmentLines.length === 0) {\n return [...heading, ` ${pc.dim(hasFailedAgent ? NOTHING_TO_RESTORE_AFTER_FAILURE : NOTHING_TO_RESTORE)}`]\n }\n\n return [\n ...heading,\n ...changedFiles.flatMap((file) => formatRestoredFile({ file, home, masker })),\n ...changedEnvFile.flatMap((change) => formatFileDiff({ change, home, masker })),\n ...userEnvironmentLines,\n ]\n}\n\nconst DELETION_NOTE = 'deleted — nexos-connect created it'\n\ntype FormatRestoredFileParams = { file: RestoreFilePlan; home: string; masker: Masker }\n\nfunction formatRestoredFile({ file, home, masker }: FormatRestoredFileParams): string[] {\n if (file.after === null) return ['', ` ${pc.bold(displayPath(file.path, home))} ${pc.dim(`(${DELETION_NOTE})`)}`]\n\n const change = { path: file.path, before: file.before, after: file.after, isChanged: file.isChanged }\n return formatFileDiff({ change, home, masker })\n}\n","import pc from 'picocolors'\nimport { P, match } from 'ts-pattern'\nimport {\n RESTORE_OUTCOME_KINDS,\n type PlannedRestore,\n type RestoreEnvPlan,\n type RestoreFilePlan,\n type RestoreOutcome,\n type RestoreOutcomeKind,\n type RestoreUserEnvironmentPlan,\n} from '../../../commands/restore/restore-result'\nimport type { Masker } from '../../../product/secrets/masker'\nimport { parseEnvFile } from '../../../product/storage/env-file/parse-env-file'\nimport { displayPath } from '../../../shared/text/display-path'\nimport { GLYPHS } from '../../glyphs'\nimport { formatHeading } from '../format-heading'\nimport { INDENT } from '../indent'\nimport type { StatusStyle } from '../outcome-style'\nimport type { ResultMode } from './format-result'\n\nexport type FormatRestoreResultParams = {\n outcomes: readonly RestoreOutcome[]\n envFile: RestoreEnvPlan | null\n userEnvironment: RestoreUserEnvironmentPlan | null\n mode: ResultMode\n home: string\n masker: Masker\n}\n\nexport function formatRestoreResult(params: FormatRestoreResultParams): string[] {\n const heading = params.mode.kind === 'dry-run' ? 'Result (dry run)' : 'Result'\n return [\n ...formatHeading(heading),\n ...params.outcomes.flatMap((outcome) => formatOutcome(outcome, params)),\n ...formatEnvFileStep(params),\n ...formatBackups(params),\n ...formatSummary(params.outcomes),\n ]\n}\n\nconst RESTORE_OUTCOME_STYLE: Readonly<Record<RestoreOutcomeKind, StatusStyle>> = {\n restored: { glyph: GLYPHS.success, colour: pc.green, label: 'restored' },\n unchanged: { glyph: GLYPHS.unchanged, colour: pc.green, label: 'already as it was' },\n 'nothing-to-restore': { glyph: GLYPHS.absent, colour: pc.yellow, label: 'nothing to restore' },\n failed: { glyph: GLYPHS.failure, colour: pc.red, label: 'failed' },\n}\n\nconst NO_RECORD = 'nexos-connect has no record of setting it up at this scope.'\n\nfunction formatOutcome(outcome: RestoreOutcome, { home, masker }: FormatRestoreResultParams): string[] {\n const style = RESTORE_OUTCOME_STYLE[outcome.kind]\n const body = match(outcome)\n .with({ kind: P.union('restored', 'unchanged') }, (planned) => formatPlannedRestore(planned, home, masker))\n .with({ kind: 'nothing-to-restore' }, () => [`${INDENT}${pc.dim(NO_RECORD)}`])\n .with({ kind: 'failed' }, ({ error }) => [`${INDENT}${pc.red(masker.maskText(error))}`])\n .exhaustive()\n return ['', ` ${style.colour(`${style.glyph} ${outcome.target.label} — ${style.label}`)}`, ...body]\n}\n\nfunction formatPlannedRestore(outcome: PlannedRestore, home: string, masker: Masker): string[] {\n const restartNote = `Restart ${outcome.target.label} so it reads the restored config.`\n return [\n ...outcome.files.filter((file) => file.isChanged).map((file) => `${INDENT}${pc.dim(describeFile(file, home))}`),\n ...outcome.warnings.map((warning) => `${INDENT}${pc.yellow(`${GLYPHS.warning} ${masker.maskText(warning)}`)}`),\n ...(outcome.kind === 'restored' ? [`${INDENT}${pc.cyan(`${GLYPHS.next} ${restartNote}`)}`] : []),\n ]\n}\n\nfunction describeFile(file: RestoreFilePlan, home: string): string {\n const action = file.after === null ? 'deleted' : 'put back'\n return `${displayPath(file.path, home)} — ${action}`\n}\n\nfunction formatEnvFileStep({ envFile, userEnvironment, mode, home }: FormatRestoreResultParams): string[] {\n if (mode.kind === 'dry-run') return []\n\n const envFileLines = envFile !== null && envFile.isChanged ? describeEnvFile(envFile, home) : []\n const userEnvironmentLines =\n userEnvironment === null\n ? []\n : [` ${pc.dim('The Windows user environment changed; open a new terminal to pick it up.')}`]\n if (envFileLines.length === 0 && userEnvironmentLines.length === 0) return []\n\n return [...formatHeading('One more step'), ...envFileLines, ...userEnvironmentLines]\n}\n\nfunction describeEnvFile(envFile: RestoreEnvPlan, home: string): string[] {\n const isEmpty = parseEnvFile(envFile.after, envFile.shell).size === 0\n const emptyNote = `${displayPath(envFile.path, home)} no longer sets anything: you can delete it, and the line that loads it.`\n return [\n ...(isEmpty ? [` ${emptyNote}`] : []),\n ` ${pc.dim('Shells open now keep the variables it set; a new shell starts without them.')}`,\n ]\n}\n\nfunction formatBackups({ mode, home, masker }: FormatRestoreResultParams): string[] {\n if (mode.kind === 'dry-run' || mode.backupRoot === null) return []\n\n const backupRoot = masker.maskText(displayPath(mode.backupRoot, home))\n return [...formatHeading('Backups'), ` Current versions copied to ${pc.bold(backupRoot)}`]\n}\n\nfunction formatSummary(outcomes: readonly RestoreOutcome[]): string[] {\n if (outcomes.length === 0) return []\n\n const countsByKind = new Map<RestoreOutcomeKind, number>()\n for (const { kind } of outcomes) countsByKind.set(kind, (countsByKind.get(kind) ?? 0) + 1)\n\n const counts = RESTORE_OUTCOME_KINDS.map(\n (kind) => `${countsByKind.get(kind) ?? 0} ${RESTORE_OUTCOME_STYLE[kind].label}`,\n )\n return [...formatHeading('Summary'), ` ${counts.join(', ')}`]\n}\n","import type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport type { RecordedEnvVariable, RecordedPath } from '../../product/storage/restore-record/restore-record'\nimport type { UserEnvironmentPlan } from '../../product/storage/windows-environment/user-environment'\n\nexport type RestoreTarget = { id: string; label: string }\n\n/** `after` is `null` for a file nexos-connect created, which restore deletes. */\nexport type RestoreFilePlan = {\n path: string\n recordedPath: RecordedPath\n before: string\n after: string | null\n isChanged: boolean\n hasSecret: boolean\n}\n\nexport type RestoreEnvPlan = { path: string; before: string; after: string; isChanged: boolean; shell: Shell }\n\nexport type RestoreUserEnvironmentPlan = UserEnvironmentPlan\n\nexport const RESTORE_OUTCOME_KINDS = ['restored', 'unchanged', 'nothing-to-restore', 'failed'] as const\n\nexport type RestoreOutcomeKind = (typeof RESTORE_OUTCOME_KINDS)[number]\n\nexport type PlannedRestore = {\n kind: 'restored' | 'unchanged'\n target: RestoreTarget\n files: readonly RestoreFilePlan[]\n envVariables: readonly RecordedEnvVariable[]\n warnings: readonly string[]\n}\n\nexport type NothingToRestore = { kind: 'nothing-to-restore'; target: RestoreTarget }\n\nexport type FailedRestore = { kind: 'failed'; target: RestoreTarget; error: string }\n\nexport type RestoreOutcome = PlannedRestore | NothingToRestore | FailedRestore\n\nexport function isPlannedRestore(outcome: RestoreOutcome): outcome is PlannedRestore {\n return outcome.kind === 'restored' || outcome.kind === 'unchanged'\n}\n\n// Only a named agent can come out with nothing to restore, and naming one asks for a restore that cannot happen.\nexport function hasFailedRestore(outcomes: readonly RestoreOutcome[]): boolean {\n return outcomes.some((outcome) => outcome.kind === 'failed' || outcome.kind === 'nothing-to-restore')\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { backUpBeforeWriting, ENV_FILE_BACKUP_DIRECTORY } from '../../product/storage/backups/back-up-before-writing'\nimport type { BackupRoot } from '../../product/storage/backups/resolve-backup-root'\nimport { writeEnvFile } from '../../product/storage/env-file/write-env-file'\nimport { removeHarnessRecords } from '../../product/storage/restore-record/remove-harness-records'\nimport { readRestoreRecord, writeRestoreRecord } from '../../product/storage/restore-record/restore-record'\nimport { resolveRestoreRecordLocation } from '../../product/storage/restore-record/restore-record-location'\nimport { describeUserEnvironmentFailure } from '../../product/storage/windows-environment/describe-user-environment-failure'\nimport {\n replanUserEnvironment,\n type UserEnvironment,\n type UserEnvironmentPlan,\n} from '../../product/storage/windows-environment/user-environment'\nimport { assertNoLinkEscape } from '../../shared/file-system/assert-no-link-escape'\nimport { describeFileError } from '../../shared/file-system/errors/describe-file-error'\nimport { resolveWriteMode } from '../../shared/file-system/resolve-write-mode'\nimport { writeFileRefusingLinks } from '../../shared/file-system/write-file-refusing-links'\nimport { writeFileWithMode } from '../../shared/file-system/write-file-with-mode'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { restoreEnvText } from './restore-env-text'\nimport type { RestorePlan } from './restore-plan'\nimport {\n isPlannedRestore,\n type RestoreEnvPlan,\n type RestoreFilePlan,\n type RestoreOutcome,\n type RestoreTarget,\n type RestoreUserEnvironmentPlan,\n} from './restore-result'\n\nexport type ApplyRestoreParams = {\n plan: RestorePlan\n ctx: PlatformContext\n backupRoot: BackupRoot\n userEnvironment: UserEnvironment\n envPath: string\n}\n\nexport type ApplyRestoreResult = {\n outcomes: RestoreOutcome[]\n envFile: RestoreEnvPlan | null\n userEnvironment: RestoreUserEnvironmentPlan | null\n writtenCount: number\n backupRoot: string | null\n}\n\nexport function applyRestore(params: ApplyRestoreParams): ApplyRestoreResult {\n const agentWrites = params.plan.outcomes.map((outcome) => restoreAgentFiles(outcome, params))\n const outcomes = agentWrites.map(({ outcome }) => outcome)\n const envFile = replanEnvFile(params.plan.envFile, outcomes)\n const envWrite = restoreSharedEnvFile({ outcomes, envFile, params })\n const userEnvironmentWrite = restoreUserEnvironment({ outcomes: envWrite.outcomes, params })\n const writtenFiles = [...agentWrites.flatMap(({ writtenFiles }) => writtenFiles), ...envWrite.writtenFiles]\n return {\n outcomes: forgetRestored(userEnvironmentWrite.outcomes, params.ctx, userEnvironmentWrite.written !== null),\n envFile,\n userEnvironment: userEnvironmentWrite.written,\n writtenCount: writtenFiles.length,\n backupRoot: writtenFiles.some((file) => file.isBackedUp) ? params.backupRoot.path : null,\n }\n}\n\ntype WrittenFile = { isBackedUp: boolean }\n\ntype AgentWrite = { outcome: RestoreOutcome; writtenFiles: WrittenFile[] }\n\nfunction restoreAgentFiles(outcome: RestoreOutcome, params: ApplyRestoreParams): AgentWrite {\n if (outcome.kind !== 'restored') return { outcome, writtenFiles: [] }\n\n const writtenFiles: WrittenFile[] = []\n for (const file of outcome.files.filter((plan) => plan.isChanged)) {\n try {\n writtenFiles.push(restoreFile({ file, target: outcome.target, params }))\n } catch (error) {\n const reason = describeFileError({ error, action: 'write', home: params.ctx.home })\n return { outcome: { kind: 'failed', target: outcome.target, error: reason }, writtenFiles }\n }\n }\n return { outcome, writtenFiles }\n}\n\ntype RestoreFileParams = { file: RestoreFilePlan; target: RestoreTarget; params: ApplyRestoreParams }\n\nfunction restoreFile({ file, target, params }: RestoreFileParams): WrittenFile {\n const { ctx, backupRoot } = params\n const relativePath = path.join(target.id, path.basename(file.path))\n const backup = backUpBeforeWriting({ filePath: file.path, before: file.before, backupRoot, relativePath, ctx })\n if (file.after === null) {\n fs.rmSync(file.path)\n return backup\n }\n\n const writeFile = ctx.scope === 'project' ? writeFileRefusingLinks : writeFileWithMode\n const mode = resolveWriteMode({ filePath: file.path, hasSecret: file.hasSecret, platform: ctx.platform })\n writeFile({ filePath: file.path, content: file.after, mode })\n return backup\n}\n\n// Leaves out the variables of an agent whose files could not be restored, as setup leaves out a failed agent's.\nfunction replanEnvFile(envFile: RestoreEnvPlan | null, outcomes: readonly RestoreOutcome[]): RestoreEnvPlan | null {\n if (envFile === null) return null\n\n const variables = outcomes.flatMap((outcome) => (isPlannedRestore(outcome) ? outcome.envVariables : []))\n const after = restoreEnvText({ current: envFile.before, variables, shell: envFile.shell })\n return { ...envFile, after, isChanged: after !== envFile.before }\n}\n\ntype RestoreSharedEnvFileParams = {\n outcomes: RestoreOutcome[]\n envFile: RestoreEnvPlan | null\n params: ApplyRestoreParams\n}\n\ntype EnvWrite = { outcomes: RestoreOutcome[]; writtenFiles: WrittenFile[] }\n\nfunction restoreSharedEnvFile({ outcomes, envFile, params }: RestoreSharedEnvFileParams): EnvWrite {\n if (envFile === null || !envFile.isChanged) return { outcomes, writtenFiles: [] }\n\n const { ctx, backupRoot } = params\n try {\n const relativePath = path.join(ENV_FILE_BACKUP_DIRECTORY, path.basename(envFile.path))\n const backup = backUpBeforeWriting({\n filePath: envFile.path,\n before: envFile.before,\n backupRoot,\n relativePath,\n ctx,\n })\n writeEnvFile({ filePath: envFile.path, content: envFile.after, platform: ctx.platform })\n return { outcomes, writtenFiles: [backup] }\n } catch (error) {\n const reason = describeFileError({ error, action: 'write', home: ctx.home })\n return { outcomes: outcomes.map((outcome) => failIfRestoringEnvFile(outcome, reason)), writtenFiles: [] }\n }\n}\n\nfunction failIfRestoringEnvFile(outcome: RestoreOutcome, error: string): RestoreOutcome {\n if (!isPlannedRestore(outcome) || outcome.envVariables.length === 0) return outcome\n\n return { kind: 'failed', target: outcome.target, error }\n}\n\ntype UserEnvironmentRestore = { outcomes: RestoreOutcome[]; written: UserEnvironmentPlan | null }\n\ntype RestoreUserEnvironmentParams = { outcomes: readonly RestoreOutcome[]; params: ApplyRestoreParams }\n\nfunction restoreUserEnvironment({ outcomes, params }: RestoreUserEnvironmentParams): UserEnvironmentRestore {\n const { userEnvironment, envPath, ctx } = params\n const names = userEnvironmentNames(outcomes, params.plan.userEnvironment)\n const plan = replanUserEnvironment({ plan: params.plan.userEnvironment, names })\n if (plan === null || !plan.isChanged) return { outcomes: [...outcomes], written: null }\n\n try {\n userEnvironment.write(plan.after)\n return { outcomes: [...outcomes], written: plan }\n } catch {\n const warning = describeUserEnvironmentFailure({ action: 'write', envPath, home: ctx.home })\n return { outcomes: outcomes.map((outcome) => addUserEnvironmentWarningTo(outcome, warning)), written: null }\n }\n}\n\nfunction addUserEnvironmentWarningTo(outcome: RestoreOutcome, warning: string): RestoreOutcome {\n if (!isPlannedRestore(outcome) || outcome.envVariables.length === 0) return outcome\n\n return { ...outcome, warnings: [...outcome.warnings, warning] }\n}\n\n// With no agent in the run, the plan holds only the record's top-level originals, each one due back.\nfunction userEnvironmentNames(\n outcomes: readonly RestoreOutcome[],\n plan: RestoreUserEnvironmentPlan | null,\n): ReadonlySet<string> {\n if (outcomes.length === 0) return new Set(Object.keys(plan?.after ?? {}))\n\n return new Set(\n outcomes.flatMap((outcome) => (isPlannedRestore(outcome) ? outcome.envVariables.map(({ name }) => name) : [])),\n )\n}\n\n// A failed agent keeps its record, so a second restore can finish the job. So does a user-environment\n// write that failed, which would otherwise leave the value it was meant to put back.\nfunction forgetRestored(\n outcomes: readonly RestoreOutcome[],\n ctx: PlatformContext,\n isUserEnvironmentRestored: boolean,\n): RestoreOutcome[] {\n const restoredIds = outcomes.filter(isPlannedRestore).map(({ target }) => target.id)\n if (restoredIds.length === 0 && !isUserEnvironmentRestored) return [...outcomes]\n\n const { filePath, root } = resolveRestoreRecordLocation(ctx)\n try {\n if (ctx.scope === 'project') assertNoLinkEscape({ filePath, root })\n const record = readRestoreRecord({ filePath, home: ctx.home, scope: ctx.scope })\n if (record !== null) {\n writeRestoreRecord({ filePath, record: removeHarnessRecords(record, restoredIds), platform: ctx.platform })\n }\n return [...outcomes]\n } catch (error) {\n const reason = describeFileError({ error, action: 'write', home: ctx.home })\n return outcomes.map((outcome) => failIfPlanned(outcome, reason))\n }\n}\n\nfunction failIfPlanned(outcome: RestoreOutcome, error: string): RestoreOutcome {\n if (!isPlannedRestore(outcome)) return outcome\n\n return { kind: 'failed', target: outcome.target, error }\n}\n","import type { RestoreRecord } from './restore-record'\n\nexport function removeHarnessRecords(record: RestoreRecord, harnessIds: readonly string[]): RestoreRecord {\n const harnesses = Object.fromEntries(Object.entries(record.harnesses).filter(([id]) => !harnessIds.includes(id)))\n return { ...record, harnesses, userEnvironment: pruneUserEnvironment(record, harnesses) }\n}\n\n// A user-environment original belongs to no harness, so it is kept only while some remaining harness\n// still reads the name. Otherwise a full restore would leave the record behind.\nfunction pruneUserEnvironment(\n record: RestoreRecord,\n harnesses: RestoreRecord['harnesses'],\n): RestoreRecord['userEnvironment'] {\n const referencedNames = new Set(\n Object.values(harnesses).flatMap((harness) => harness.envVariables.map(({ name }) => name)),\n )\n return record.userEnvironment.filter(({ name }) => referencedNames.has(name))\n}\n","import { removeEnvVariables, renderEnvFile } from '../../product/storage/env-file/render-env-file'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport type { RecordedEnvVariable } from '../../product/storage/restore-record/restore-record'\n\nexport type RestoreEnvTextParams = { current: string; variables: readonly RecordedEnvVariable[]; shell: Shell }\n\nexport function restoreEnvText({ current, variables, shell }: RestoreEnvTextParams): string {\n const withOriginals = setOriginalsBack({ current, variables, shell })\n const removedNames = variables.filter(({ original }) => original === null).map(({ name }) => name)\n if (removedNames.length === 0) return withOriginals\n\n return removeEnvVariables({ current: withOriginals, names: removedNames, shell })\n}\n\nfunction setOriginalsBack({ current, variables, shell }: RestoreEnvTextParams): string {\n const originals = Object.fromEntries(\n variables.flatMap(({ name, original }) => (original === null ? [] : [[name, original]])),\n )\n if (Object.keys(originals).length === 0) return current\n\n return renderEnvFile({ current, variables: originals, shell })\n}\n","import path from 'node:path'\nimport { match } from 'ts-pattern'\nimport { PROJECT_BACKUP_DIRECTORY, USER_BACKUP_DIRECTORY } from '../../product/storage/backups/resolve-backup-root'\nimport { NO_ENV_FILE, readEnvFile, type EnvFileRead } from '../../product/storage/env-file/read-env-file'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport type {\n HarnessRecord,\n RecordedEnvVariable,\n RecordedFile,\n RestoreRecord,\n} from '../../product/storage/restore-record/restore-record'\nimport {\n fromRecordedPath,\n resolveRestoreRecordLocation,\n} from '../../product/storage/restore-record/restore-record-location'\nimport { describeUserEnvironmentFailure } from '../../product/storage/windows-environment/describe-user-environment-failure'\nimport {\n planUserEnvironment,\n UserEnvironmentError,\n type UserEnvironment,\n} from '../../product/storage/windows-environment/user-environment'\nimport { ConfigFormatError } from '../../shared/file-formats/config-errors'\nimport { isEmptyConfig, restoreConfig } from '../../shared/file-formats/config-format'\nimport { assertNoLinkEscape } from '../../shared/file-system/assert-no-link-escape'\nimport { describeFileError } from '../../shared/file-system/errors/describe-file-error'\nimport { readFileIfExists } from '../../shared/file-system/read-file-if-exists'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { displayPath } from '../../shared/text/display-path'\nimport { restoreEnvText } from './restore-env-text'\nimport {\n isPlannedRestore,\n type RestoreEnvPlan,\n type RestoreFilePlan,\n type RestoreOutcome,\n type RestoreTarget,\n type RestoreUserEnvironmentPlan,\n} from './restore-result'\n\nexport type RestoreCandidate = { target: RestoreTarget; record: HarnessRecord | null }\n\nexport type PlanRestoreParams = {\n candidates: readonly RestoreCandidate[]\n record: RestoreRecord\n ctx: PlatformContext\n envPath: string\n shell: Shell\n userEnvironment: UserEnvironment\n}\n\nexport type RestorePlan = {\n outcomes: RestoreOutcome[]\n envFile: RestoreEnvPlan | null\n userEnvironment: RestoreUserEnvironmentPlan | null\n}\n\nexport function planRestore(params: PlanRestoreParams): RestorePlan {\n const { candidates, ctx, envPath } = params\n const hasEnvVariables = candidates.some(({ record }) => (record?.envVariables.length ?? 0) > 0)\n const envFileRead = hasEnvVariables ? readEnvFile({ envPath, home: ctx.home }) : NO_ENV_FILE\n const namesKept = listNamesRecordedElsewhere(params)\n const userEnvironment = planRestoreUserEnvironment({ candidates, record: params.record, namesKept, params })\n const outcomes = candidates.map((candidate) =>\n planCandidate({ candidate, envFileRead, namesKept, userEnvironment: userEnvironment.plan, params }),\n )\n return {\n outcomes: addUserEnvironmentWarning({ outcomes, warning: userEnvironment.warning }),\n envFile: planEnvFile({ outcomes, envFileRead, params }),\n userEnvironment: userEnvironment.plan,\n }\n}\n\n// A variable another agent still has recorded is still that agent's, so restoring this one must leave it.\nfunction listNamesRecordedElsewhere({ candidates, record }: PlanRestoreParams): ReadonlySet<string> {\n const selectedIds = candidates.map(({ target }) => target.id)\n const others = Object.entries(record.harnesses).filter(([id]) => !selectedIds.includes(id))\n return new Set(others.flatMap(([, harness]) => harness.envVariables.map(({ name }) => name)))\n}\n\ntype RestoreUserEnvironment = { plan: RestoreUserEnvironmentPlan | null; warning: string | null }\n\ntype PlanRestoreUserEnvironmentParams = {\n candidates: readonly RestoreCandidate[]\n record: RestoreRecord\n namesKept: ReadonlySet<string>\n params: PlanRestoreParams\n}\n\nfunction planRestoreUserEnvironment({\n candidates,\n record,\n namesKept,\n params,\n}: PlanRestoreUserEnvironmentParams): RestoreUserEnvironment {\n if (params.ctx.platform !== 'win32') return { plan: null, warning: null }\n\n const originals = new Map(record.userEnvironment.map(({ name, original }) => [name, original]))\n const names = listRestorableNames({ candidates, record })\n const values = Object.fromEntries(\n names.flatMap((name) =>\n !namesKept.has(name) && originals.has(name) ? [[name, originals.get(name) ?? undefined]] : [],\n ),\n )\n if (Object.keys(values).length === 0) return { plan: null, warning: null }\n\n try {\n return { plan: planUserEnvironment({ values, userEnvironment: params.userEnvironment }), warning: null }\n } catch (error) {\n if (!(error instanceof UserEnvironmentError)) throw error\n return {\n plan: null,\n warning: describeUserEnvironmentFailure({ action: 'read', envPath: params.envPath, home: params.ctx.home }),\n }\n }\n}\n\n// A record with no harness holds only the top-level originals: setup changed the user environment and\n// nothing else, so every name it kept is one to put back.\ntype ListRestorableNamesParams = Pick<PlanRestoreUserEnvironmentParams, 'candidates' | 'record'>\n\nfunction listRestorableNames({ candidates, record }: ListRestorableNamesParams): string[] {\n if (candidates.length === 0) return record.userEnvironment.map(({ name }) => name)\n\n return candidates.flatMap(({ record: harness }) => (harness?.envVariables ?? []).map(({ name }) => name))\n}\n\ntype AddUserEnvironmentWarningParams = { outcomes: readonly RestoreOutcome[]; warning: string | null }\n\nfunction addUserEnvironmentWarning({ outcomes, warning }: AddUserEnvironmentWarningParams): RestoreOutcome[] {\n if (warning === null) return [...outcomes]\n\n return outcomes.map((outcome) =>\n isPlannedRestore(outcome) && outcome.envVariables.length > 0\n ? { ...outcome, warnings: [...outcome.warnings, warning] }\n : outcome,\n )\n}\n\ntype PlanCandidateParams = {\n candidate: RestoreCandidate\n envFileRead: EnvFileRead\n namesKept: ReadonlySet<string>\n userEnvironment: RestoreUserEnvironmentPlan | null\n params: PlanRestoreParams\n}\n\nfunction planCandidate({\n candidate,\n envFileRead,\n namesKept,\n userEnvironment,\n params,\n}: PlanCandidateParams): RestoreOutcome {\n const { target, record } = candidate\n if (record === null) return { kind: 'nothing-to-restore', target }\n\n const envVariables = record.envVariables.filter(({ name }) => !namesKept.has(name))\n if (envVariables.length > 0 && envFileRead.kind === 'failed') {\n return { kind: 'failed', target, error: envFileRead.error }\n }\n\n try {\n const { files, warnings } = planRecordedFiles(record.files, params.ctx)\n const hasEnvChange = hasOwnEnvChange({ envFileRead, envVariables, shell: params.shell })\n const hasUserEnvironmentChange =\n userEnvironment !== null &&\n envVariables.some(\n ({ name }) => name in userEnvironment.after && userEnvironment.before[name] !== userEnvironment.after[name],\n )\n const isChanged = hasEnvChange || hasUserEnvironmentChange || files.some((file) => file.isChanged)\n return { kind: isChanged ? 'restored' : 'unchanged', target, files, envVariables, warnings }\n } catch (error) {\n return { kind: 'failed', target, error: describeFileError({ error, action: 'read', home: params.ctx.home }) }\n }\n}\n\ntype HasOwnEnvChangeParams = {\n envFileRead: EnvFileRead\n envVariables: readonly RecordedEnvVariable[]\n shell: Shell\n}\n\nfunction hasOwnEnvChange({ envFileRead, envVariables, shell }: HasOwnEnvChangeParams): boolean {\n if (envFileRead.kind !== 'read' || envFileRead.text === null || envVariables.length === 0) return false\n\n return restoreEnvText({ current: envFileRead.text, variables: envVariables, shell }) !== envFileRead.text\n}\n\ntype PlannedFiles = { files: RestoreFilePlan[]; warnings: string[] }\n\nfunction planRecordedFiles(recordedFiles: readonly RecordedFile[], ctx: PlatformContext): PlannedFiles {\n const results = recordedFiles.map((file) => planRecordedFile(file, ctx))\n return {\n files: results.flatMap((result) => (result.kind === 'planned' ? [result.plan] : [])),\n warnings: results.flatMap((result) => (result.kind === 'missing' ? result.warnings : [])),\n }\n}\n\ntype RecordedFileResult = { kind: 'planned'; plan: RestoreFilePlan } | { kind: 'missing'; warnings: string[] }\n\nfunction planRecordedFile(file: RecordedFile, ctx: PlatformContext): RecordedFileResult {\n const { root } = resolveRestoreRecordLocation(ctx)\n const filePath = fromRecordedPath(file.path, root)\n if (ctx.scope === 'project') assertNoLinkEscape({ filePath, root })\n\n const before = readFileIfExists(filePath)\n if (before === null) {\n return { kind: 'missing', warnings: file.origin === 'content' ? [describeMissingFile(filePath, ctx)] : [] }\n }\n\n const after = restoreFile({ file, before, filePath, home: ctx.home })\n return {\n kind: 'planned',\n plan: {\n path: filePath,\n recordedPath: file.path,\n before,\n after,\n isChanged: before !== after,\n hasSecret: file.keys.some(({ holdsSecret }) => holdsSecret),\n },\n }\n}\n\nfunction describeMissingFile(filePath: string, ctx: PlatformContext): string {\n const backups = match(ctx.scope)\n .with('user', () => path.join(ctx.home, USER_BACKUP_DIRECTORY))\n .with('project', () => path.join(ctx.cwd, PROJECT_BACKUP_DIRECTORY))\n .exhaustive()\n return (\n `${displayPath(filePath, ctx.home)} no longer exists, so it was left as it is. Copies from before each run ` +\n `are under ${displayPath(backups, ctx.home)}, unless --backup-dir put them elsewhere.`\n )\n}\n\ntype RestoreFileParams = { file: RecordedFile; before: string; filePath: string; home: string }\n\nfunction restoreFile({ file, before, filePath, home }: RestoreFileParams): string | null {\n try {\n const restored = restoreConfig({ format: file.format, current: before, originals: file.keys })\n if (file.origin === 'content' || !isEmptyConfig(file.format, restored)) return restored\n\n return file.origin === 'blank' ? '' : null\n } catch (error) {\n if (!(error instanceof ConfigFormatError)) throw error\n throw new Error(`${displayPath(filePath, home)}: ${error.message}`, { cause: error })\n }\n}\n\ntype PlanEnvFileParams = { outcomes: readonly RestoreOutcome[]; envFileRead: EnvFileRead; params: PlanRestoreParams }\n\nfunction planEnvFile({ outcomes, envFileRead, params }: PlanEnvFileParams): RestoreEnvPlan | null {\n const variables = outcomes.flatMap((outcome) => (isPlannedRestore(outcome) ? outcome.envVariables : []))\n if (variables.length === 0 || envFileRead.kind === 'failed' || envFileRead.text === null) return null\n\n const before = envFileRead.text\n const after = restoreEnvText({ current: before, variables, shell: params.shell })\n return { path: params.envPath, before, after, isChanged: before !== after, shell: params.shell }\n}\n","import { findExistingKeys } from '../../flows/key/find-existing-keys'\nimport { harnesses } from '../../harnesses/registry'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport type {\n HarnessRecord,\n RecordedEnvVariable,\n RecordedFile,\n RestoreRecord,\n} from '../../product/storage/restore-record/restore-record'\nimport { ConfigFormatError } from '../../shared/file-formats/config-errors'\nimport { parseValueSource } from '../../shared/file-formats/config-format'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\n\nexport type ListRestoreSecretsParams = { record: RestoreRecord; ctx: PlatformContext; envPath: string; shell: Shell }\n\n/** The keys a restore diff can show: the ones on disk now, and the ones the record puts back. */\nexport function listRestoreSecrets({ record, ctx, envPath, shell }: ListRestoreSecretsParams): string[] {\n const recorded = Object.values(record.harnesses).flatMap((harness) => [\n ...harness.files.flatMap(listFileSecrets),\n ...listEnvSecrets(harness),\n ])\n return [\n ...findExistingKeys({ ctx, envPath, shell }).all,\n ...recorded,\n ...listUserEnvironmentSecrets(record.userEnvironment),\n ]\n}\n\nfunction listFileSecrets(file: RecordedFile): string[] {\n return file.keys.flatMap(({ original, holdsSecret }) => {\n if (!holdsSecret || original === null) return []\n\n const value = readOriginalValue(file, original)\n return typeof value === 'string' ? [value] : []\n })\n}\n\n// An original that no longer parses fails its agent when the restore is planned, which reports it.\nfunction readOriginalValue(file: RecordedFile, original: string): unknown {\n try {\n return parseValueSource(file.format, original)\n } catch (error) {\n if (error instanceof ConfigFormatError) return undefined\n throw error\n }\n}\n\nconst KEY_ENV_VARIABLES = harnesses.flatMap((harness) =>\n harness.kind === 'configurable' && harness.keyEnvVariable !== undefined ? [harness.keyEnvVariable] : [],\n)\n\nfunction listEnvSecrets(harness: HarnessRecord): string[] {\n return harness.envVariables.flatMap(({ name, original }) =>\n KEY_ENV_VARIABLES.includes(name) && original !== null ? [original] : [],\n )\n}\n\nfunction listUserEnvironmentSecrets(variables: readonly RecordedEnvVariable[]): string[] {\n return variables.flatMap(({ name, original }) =>\n KEY_ENV_VARIABLES.includes(name) && original !== null ? [original] : [],\n )\n}\n","import { DEFAULT_SCOPE, type ConfigScope } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\n\nexport type ResolveScopeParams = {\n requestedScope: ConfigScope | undefined\n shouldAssumeYes: boolean\n ui: TerminalUi\n}\n\nexport async function resolveScope({ requestedScope, shouldAssumeYes, ui }: ResolveScopeParams): Promise<ConfigScope> {\n if (requestedScope !== undefined) return requestedScope\n if (shouldAssumeYes) return DEFAULT_SCOPE\n\n return await ui.selectScope()\n}\n","import type { CliOptions } from '../../cli/parse-cli-arguments'\nimport type { ConfigurableHarness, Harness } from '../../harnesses/harness'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { describeNotOnPath, installHarness, type RunNpm } from './install-harness'\n\nexport type InstallMissingHarnessesParams = {\n /** The selected agents detection reported as not found; the installable ones among them are installed. */\n notInstalled: readonly Harness[]\n /** True when the agents came from the picker, where selecting a missing one is the consent to install it. */\n isPickerDriven: boolean\n options: Pick<CliOptions, 'shouldInstall' | 'shouldAssumeYes' | 'isDryRun'>\n ctx: PlatformContext\n ui: TerminalUi\n runNpm: RunNpm\n}\n\nexport type InstallMissingHarnessesResult = {\n installedCount: number\n hasFailure: boolean\n}\n\ntype InstallableHarness = ConfigurableHarness & { binary: string; installPackage: string }\n\nconst NOTHING_INSTALLED: InstallMissingHarnessesResult = { installedCount: 0, hasFailure: false }\n\nexport async function installMissingHarnesses(\n params: InstallMissingHarnessesParams,\n): Promise<InstallMissingHarnessesResult> {\n const { notInstalled, isPickerDriven, options, ctx, ui, runNpm } = params\n if (ctx.scope !== 'user') return NOTHING_INSTALLED\n\n const missing = notInstalled.filter(isInstallable)\n if (missing.length === 0) return NOTHING_INSTALLED\n\n if (options.isDryRun) {\n ui.dim('Dry run — the missing agents were not installed.')\n return NOTHING_INSTALLED\n }\n\n let installedCount = 0\n let hasFailure = false\n\n for (const harness of missing) {\n const outcome = await installHarness({\n label: harness.label,\n binary: harness.binary,\n packageName: harness.installPackage,\n shouldInstall: options.shouldInstall || isPickerDriven,\n shouldAssumeYes: options.shouldAssumeYes,\n ui,\n ctx,\n runNpm,\n })\n if (outcome.kind === 'installed') installedCount += 1\n else if (outcome.kind === 'not-on-path') {\n ui.log.error(describeNotOnPath(harness))\n hasFailure = true\n } else if (outcome.kind === 'failed') {\n ui.log.error(outcome.message)\n hasFailure = true\n }\n }\n\n return { installedCount, hasFailure }\n}\n\nfunction isInstallable(harness: Harness): harness is InstallableHarness {\n return harness.kind === 'configurable' && harness.installPackage !== undefined && harness.binary !== undefined\n}\n","import pc from 'picocolors'\nimport type { DetectedHarness, Detection } from '../../../harnesses/detected-harness'\nimport type { Harness } from '../../../harnesses/harness'\nimport type { Masker } from '../../../product/secrets/masker'\nimport { GLYPHS } from '../../glyphs'\nimport { formatHeading } from '../format-heading'\nimport { INDENT } from '../indent'\nimport type { StatusStyle } from '../outcome-style'\n\nexport function formatDetection(rows: readonly DetectedHarness[], masker: Masker): string[] {\n return [\n ...formatHeading('Where each agent keeps its settings'),\n ...rows.flatMap((row) => formatDetectionRow(row, masker)),\n ]\n}\n\nconst LABEL_COLUMN_WIDTH = 24\n\ntype DetectionStatus = Detection['kind'] | 'not-configurable'\n\nconst DETECTION_STYLE: Readonly<Record<DetectionStatus, StatusStyle>> = {\n found: { glyph: GLYPHS.success, colour: pc.green, label: 'found' },\n 'not-found': { glyph: GLYPHS.absent, colour: pc.dim, label: 'not found' },\n failed: { glyph: GLYPHS.failure, colour: pc.red, label: 'could not check' },\n 'not-configurable': { glyph: GLYPHS.failure, colour: pc.yellow, label: 'not configurable' },\n}\n\nfunction formatDetectionRow({ harness, detection }: DetectedHarness, masker: Masker): string[] {\n const style = DETECTION_STYLE[findDetectionStatus(harness, detection)]\n return [\n ` ${style.colour(style.glyph)} ${harness.label.padEnd(LABEL_COLUMN_WIDTH)} ${style.colour(style.label)}`,\n `${INDENT}${pc.dim(masker.maskText(detection.detail))}`,\n ]\n}\n\nfunction findDetectionStatus(harness: Harness, detection: Detection): DetectionStatus {\n if (harness.kind === 'unsupported' && detection.kind !== 'failed') return 'not-configurable'\n\n return detection.kind\n}\n","import { UsageError } from '../../../cli/errors/usage-error'\nimport type { DetectedHarness, Detection } from '../../../harnesses/detected-harness'\nimport type { Harness } from '../../../harnesses/harness'\nimport { readAgentConfig } from '../../../harnesses/read-agent-config'\nimport { harnesses } from '../../../harnesses/registry'\nimport { resolveEnvFilePath } from '../../../product/storage/env-file/env-file-path'\nimport { resolveShell } from '../../../product/storage/env-file/syntax/env-syntaxes'\nimport { describeFileError } from '../../../shared/file-system/errors/describe-file-error'\nimport type { ConfigScope, PlatformContext } from '../../../shared/platform/platform-context'\nimport type { HarnessChoice } from '../../../ui/prompts/select-harnesses'\nimport type { TerminalUi } from '../../../ui/terminal-ui'\n\nexport type SelectHarnessesParams = {\n namedHarnesses: readonly Harness[]\n ctx: PlatformContext\n shouldAssumeYes: boolean\n ui: TerminalUi\n}\n\nconst CHOICE_GROUPS = ['found', 'configured', 'installable', 'missing', 'ineligible'] as const\n\ntype ChoiceGroup = (typeof CHOICE_GROUPS)[number]\n\nexport async function selectHarnesses({\n namedHarnesses,\n ctx,\n shouldAssumeYes,\n ui,\n}: SelectHarnessesParams): Promise<DetectedHarness[]> {\n if (namedHarnesses.length > 0) return detectHarnesses(namedHarnesses, ctx)\n\n const detected = detectHarnesses(harnesses, ctx)\n if (shouldAssumeYes) return detected.filter((candidate) => isDefaultChoice(candidate, ctx.scope))\n\n const configuredIds = listConfiguredIds(detected, ctx)\n const grouped = detected.map((candidate) => ({\n candidate,\n group: groupHarnessChoice(candidate, ctx.scope, configuredIds),\n }))\n const offered = grouped.toSorted(\n (first, second) => CHOICE_GROUPS.indexOf(first.group) - CHOICE_GROUPS.indexOf(second.group),\n )\n const chosenIds = await ui.selectHarnesses(\n offered.map(({ candidate, group }) => describeHarnessChoice(candidate, ctx.scope, group)),\n )\n return detected.filter(({ harness }) => chosenIds.includes(harness.id))\n}\n\nfunction listConfiguredIds(detected: readonly DetectedHarness[], ctx: PlatformContext): Set<string> {\n const shell = resolveShell(ctx.platform)\n const envPath = resolveEnvFilePath(ctx.home, shell)\n const configured = detected.filter(\n ({ harness, detection }) =>\n harness.kind === 'configurable' &&\n detection.kind === 'found' &&\n readAgentConfig({ harness, ctx, envPath, shell }).kind === 'configured',\n )\n return new Set(configured.map(({ harness }) => harness.id))\n}\n\nfunction groupHarnessChoice(\n candidate: DetectedHarness,\n scope: ConfigScope,\n configuredIds: ReadonlySet<string>,\n): ChoiceGroup {\n if (findIneligibility(candidate.harness, scope) !== undefined) return 'ineligible'\n if (candidate.detection.kind === 'found') return configuredIds.has(candidate.harness.id) ? 'configured' : 'found'\n\n return isInstallFirst(candidate, scope) ? 'installable' : 'missing'\n}\n\nexport type AssertProjectSupportParams = {\n selected: readonly DetectedHarness[]\n scope: ConfigScope\n isScopeNamed: boolean\n}\n\nexport function assertProjectSupport({ selected, scope, isScopeNamed }: AssertProjectSupportParams): void {\n if (scope === 'user') return\n\n const refusals = selected.flatMap(({ harness }) => listProjectRefusal(harness))\n if (refusals.length === 0) return\n\n const nextStep = isScopeNamed ? 'Drop --scope project' : 'Choose the user scope'\n throw new UsageError(`${refusals.join('\\n')}\\n${nextStep}, or drop those agents from --harnesses.`)\n}\n\nfunction listProjectRefusal(harness: Harness): string[] {\n if (harness.kind !== 'configurable' || harness.projectSupport.kind === 'supported') return []\n\n return [`${harness.label}: ${harness.projectSupport.reason}`]\n}\n\nexport function detectHarnesses(candidates: readonly Harness[], ctx: PlatformContext): DetectedHarness[] {\n return candidates.map((harness) => ({ harness, detection: detectAtScope(harness, ctx) }))\n}\n\nfunction detectAtScope(harness: Harness, ctx: PlatformContext): Detection {\n try {\n return detectWithUserFallback(harness, ctx)\n } catch (error) {\n return { kind: 'failed', detail: describeFileError({ error, action: 'read', home: ctx.home }) }\n }\n}\n\nfunction detectWithUserFallback(harness: Harness, ctx: PlatformContext): Detection {\n const atScope = harness.detect(ctx)\n if (atScope.isFound) return { kind: 'found', detail: atScope.detail }\n if (ctx.scope === 'user' || harness.kind === 'unsupported') return { kind: 'not-found', detail: atScope.detail }\n\n const atUserScope = harness.detect({ ...ctx, scope: 'user' })\n if (!atUserScope.isFound) return { kind: 'not-found', detail: atScope.detail }\n\n const detail = `${atScope.detail} — ${harness.label} is set up at user level (${atUserScope.detail})`\n return { kind: 'found', detail }\n}\n\nconst DETECTION_HINTS: Readonly<Record<Detection['kind'], string>> = {\n found: 'found',\n 'not-found': 'not found',\n failed: 'could not check',\n}\n\nconst INSTALL_FIRST_HINT = 'not installed — will be installed first'\nconst CONFIGURED_HINT = 'configured'\n\nfunction describeHarnessChoice(candidate: DetectedHarness, scope: ConfigScope, group: ChoiceGroup): HarnessChoice {\n const ineligibility = findIneligibility(candidate.harness, scope)\n return {\n value: candidate.harness.id,\n label: candidate.harness.label,\n hint: ineligibility ?? describeGroup(candidate, scope, group),\n isDisabled: ineligibility !== undefined,\n }\n}\n\nfunction describeGroup(candidate: DetectedHarness, scope: ConfigScope, group: ChoiceGroup): string {\n if (group === 'configured') return CONFIGURED_HINT\n\n return describeDetection(candidate, scope)\n}\n\nfunction describeDetection(candidate: DetectedHarness, scope: ConfigScope): string {\n if (isInstallFirst(candidate, scope)) return INSTALL_FIRST_HINT\n\n return DETECTION_HINTS[candidate.detection.kind]\n}\n\n// Install runs at user scope only, so the promise holds there and nowhere else.\nfunction isInstallFirst({ harness, detection }: DetectedHarness, scope: ConfigScope): boolean {\n return scope === 'user' && detection.kind === 'not-found' && isInstallable(harness)\n}\n\nfunction isInstallable(harness: Harness): boolean {\n return harness.kind === 'configurable' && harness.installPackage !== undefined && harness.binary !== undefined\n}\n\nfunction isDefaultChoice({ harness, detection }: DetectedHarness, scope: ConfigScope): boolean {\n return findIneligibility(harness, scope) === undefined && detection.kind === 'found'\n}\n\nfunction findIneligibility(harness: Harness, scope: ConfigScope): string | undefined {\n if (harness.kind === 'unsupported') return `not configurable — ${harness.reason}`\n if (scope === 'user' || harness.projectSupport.kind === 'supported') return undefined\n\n return `no project-level config — ${harness.projectSupport.reason}`\n}\n","import { announceHostOverrides } from '../../cli/announce-host-overrides'\nimport { FINISHED_WITH_ERRORS, NO_KEY, type FinishedOutcome } from '../../cli/command-outcome'\nimport { parseEnvironmentKey, type EnvironmentInputs } from '../../cli/environment'\nimport { UsageError } from '../../cli/errors/usage-error'\nimport { isKeyNamedByFlag, type CliOptions } from '../../cli/parse-cli-arguments'\nimport { resolveNamedHarnesses } from '../../cli/resolve-named-harnesses'\nimport { createSessionAuth } from '../../flows/auth/auth-step'\nimport {\n ABORTED,\n configureAgents,\n describeProbeConsequence,\n type KeySave,\n} from '../../flows/configure/configure-agents'\nimport { buildDesiredByAgent } from '../../flows/configure/desired-by-agent'\nimport { readCurrentConfigs, type CurrentConfigs } from '../../flows/configure/read-current-configs'\nimport { resolveScope } from '../../flows/configure/resolve-scope'\nimport type { RunNpm } from '../../flows/install/install-harness'\nimport { installMissingHarnesses } from '../../flows/install/install-missing-harnesses'\nimport { describeKeyDestination } from '../../flows/key/describe-key-destination'\nimport { findExistingKeys } from '../../flows/key/find-existing-keys'\nimport type { CurrentKeys } from '../../flows/key/key-offers'\nimport {\n adoptKey,\n isKeyUsable,\n resolveKeyChoice,\n type CheckOutcome,\n type KeyChoice,\n type KeyStepDeps,\n type KeyStepInput,\n} from '../../flows/key/key-step'\nimport { chooseCheckedModel } from '../../flows/model/choose-checked-model'\nimport { chooseModelForKeptKeys } from '../../flows/model/choose-model-for-kept-keys'\nimport { loadModelPreferences } from '../../flows/model/model-step'\nimport type { ModelChoice, ModelSave } from '../../flows/model/pick-probed-model'\nimport type { DetectedHarness, Detection } from '../../harnesses/detected-harness'\nimport type { ConfigurableHarness, Harness } from '../../harnesses/harness'\nimport { PUBLIC_API_HOST, buildPublicApiUrls, type PublicApiUrls } from '../../product/public-api/desired-config'\nimport type { Masker } from '../../product/secrets/masker'\nimport { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport type { SessionStore } from '../../product/storage/session/session-store'\nimport type { UserEnvironment } from '../../product/storage/windows-environment/user-environment'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { BrowserSpawn } from '../../shared/platform/open-browser'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { formatDetection } from '../../ui/report/detection/format-detection'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { assertProjectSupport, detectHarnesses, selectHarnesses } from './answers/harness-selection'\n\nexport type SetUpAgentsParams = {\n options: CliOptions\n baseContext: PlatformContext\n ui: TerminalUi\n fetch: Fetch\n now: () => Date\n masker: Masker\n keystore: Keystore\n sessionStore: SessionStore\n spawn: BrowserSpawn\n runNpm: RunNpm\n userEnvironment: UserEnvironment\n environment: EnvironmentInputs\n}\n\nconst FAILED: FinishedOutcome = { kind: 'failed', closing: undefined }\n\nexport async function setUpAgents(params: SetUpAgentsParams): Promise<FinishedOutcome> {\n const { options, masker, ui, environment } = params\n\n masker.registerSecrets([options.key, environment.key].flatMap((key) => key ?? []))\n const publicApiUrls = buildPublicApiUrls(environment.publicApiHost ?? PUBLIC_API_HOST)\n announceHostOverrides({ overrides: environment, ui, masker })\n const namedHarnesses = resolveNamedHarnesses(options.harnessIds)\n const scope = await resolveScope({\n requestedScope: options.scope,\n shouldAssumeYes: options.shouldAssumeYes,\n ui,\n })\n const ctx: PlatformContext = { ...params.baseContext, scope }\n if (options.shouldInstall && scope !== 'user') {\n throw new UsageError('--install installs globally; it applies to user scope only.')\n }\n const detected = await selectHarnesses({ namedHarnesses, ctx, shouldAssumeYes: options.shouldAssumeYes, ui })\n assertProjectSupport({ selected: detected, scope, isScopeNamed: options.scope !== undefined })\n const install = await installMissingHarnesses({\n notInstalled: detected.flatMap(({ harness, detection }) => (detection.kind === 'not-found' ? [harness] : [])),\n isPickerDriven: namedHarnesses.length === 0 && !options.shouldAssumeYes,\n options,\n ctx,\n ui,\n runNpm: params.runNpm,\n })\n const selected =\n install.installedCount > 0\n ? detectHarnesses(\n detected.map(({ harness }) => harness),\n ctx,\n )\n : detected\n if (selected.length === 0) {\n const kind = install.hasFailure ? 'failed' : 'done'\n return { kind, closing: { tone: 'cancel', message: 'No agents selected — nothing to do.' } }\n }\n\n warnAboutUnsupported(selected, ui)\n if (!selected.some(({ harness }) => harness.kind === 'configurable')) {\n return { kind: 'done', closing: { tone: 'outro', message: 'Nothing to configure.' } }\n }\n const found = selected.flatMap(listFoundConfigurable)\n if (found.length === 0) return endWithNothingFound({ selected, ui, masker, hasInstallFailure: install.hasFailure })\n\n const shell = resolveShell(ctx.platform)\n const run: SetupRun = { ...params, ctx, shell, envPath: resolveEnvFilePath(ctx.home, shell), publicApiUrls }\n const current = readCurrentConfigs({ targets: found, ctx, envPath: run.envPath, shell })\n const keyStep = await establishKey({ run, configurable: found, currentKeys: current.currentKeys, environment })\n if (keyStep === null) return NO_KEY\n\n const decision = await decideModel({ run, keyStep, current, configurable: found, envModel: environment.model })\n if (decision.kind === 'declined') return ABORTED\n if (decision.kind === 'aborted') return FAILED\n\n const { keyChoice, modelChoice } = decision\n ui.print(formatDetection(selected, masker))\n return await configureAgents({\n run,\n selected,\n desiredByAgent: buildDesiredByAgent({ targets: current.targets, keyChoice, modelChoice, publicApiUrls }),\n keySave: findKeySave(decision, keyStep.deps),\n modelSaves: decision.modelSaves,\n hasInstallFailure: install.hasFailure,\n unchangeable: [],\n })\n}\n\ntype SetupRun = SetUpAgentsParams & {\n ctx: PlatformContext\n shell: Shell\n envPath: string\n publicApiUrls: PublicApiUrls\n}\n\nfunction warnAboutUnsupported(selected: readonly DetectedHarness[], ui: TerminalUi): void {\n for (const { harness } of selected) {\n if (harness.kind === 'unsupported') ui.log.warn(`${harness.label}: not configurable — ${harness.reason}`)\n }\n}\n\nfunction listFoundConfigurable({ harness, detection }: DetectedHarness): ConfigurableHarness[] {\n if (harness.kind !== 'configurable' || detection.kind !== 'found') return []\n\n return [harness]\n}\n\ntype EndWithNothingFoundParams = {\n selected: readonly DetectedHarness[]\n ui: TerminalUi\n masker: Masker\n hasInstallFailure: boolean\n}\n\nfunction endWithNothingFound({ selected, ui, masker, hasInstallFailure }: EndWithNothingFoundParams): FinishedOutcome {\n ui.print(formatDetection(selected, masker))\n const hasFailedCheck = selected.some(({ harness, detection }) => isConfigurableUnchecked(harness, detection))\n if (hasFailedCheck || hasInstallFailure) {\n return { kind: 'failed', closing: { tone: 'outro', message: FINISHED_WITH_ERRORS } }\n }\n\n return {\n kind: 'done',\n closing: { tone: 'outro', message: 'Nothing to configure — none of the selected agents was found.' },\n }\n}\n\nfunction isConfigurableUnchecked(harness: Harness, detection: Detection): boolean {\n return harness.kind === 'configurable' && detection.kind === 'failed'\n}\n\ntype EstablishKeyParams = {\n run: SetupRun\n configurable: readonly ConfigurableHarness[]\n currentKeys: CurrentKeys\n environment: EnvironmentInputs\n}\n\ntype SetupKeyStep = { input: KeyStepInput; deps: KeyStepDeps; choice: KeyChoice }\n\nasync function establishKey({\n run,\n configurable,\n currentKeys,\n environment,\n}: EstablishKeyParams): Promise<SetupKeyStep | null> {\n const { ctx, envPath, shell, ui, masker, options } = run\n // Read eagerly: the diff shows lines this run removes, so every key already on disk must be\n // registered for masking even when the key comes from a flag and no prompt is reached.\n const existingKeys = findExistingKeys({ ctx, envPath, shell })\n masker.registerSecrets(existingKeys.all)\n\n const { keystore, sessionStore, fetch, spawn, now } = run\n const auth = createSessionAuth({\n services: { ctx, ui, sessionStore, fetch, masker, spawn, now },\n environment,\n keyNameOptions: { keyName: options.keyName, shouldAssumeYes: options.shouldAssumeYes },\n })\n const deps: KeyStepDeps = { keystore, ui, masker, auth }\n const input: KeyStepInput = {\n flagKey: options.key,\n keyId: options.keyId,\n envKey: isKeyNamedByFlag(options) ? undefined : parseEnvironmentKey(environment.key),\n shouldSaveKey: options.shouldSaveKey,\n shouldAssumeYes: options.shouldAssumeYes,\n isDryRun: options.isDryRun,\n existingKeys: () => existingKeys,\n destination: describeKeyDestination({ configurable, ctx, envPath }),\n }\n\n const choice = await resolveKeyChoice(input, currentKeys, deps)\n if (choice.kind === 'one') {\n if (!isKeyUsable(choice.resolved.key)) return null\n adoptKey(choice.resolved.key, { ui, masker })\n }\n return { input, deps, choice }\n}\n\ntype ChosenSetupModel = {\n kind: 'chosen'\n keyChoice: KeyChoice\n check: CheckOutcome\n modelChoice: ModelChoice\n modelSaves: ModelSave[]\n}\n\ntype SetupModelDecision = ChosenSetupModel | { kind: 'declined' } | { kind: 'aborted' }\n\ntype DecideModelParams = {\n run: SetupRun\n keyStep: SetupKeyStep\n current: CurrentConfigs\n configurable: readonly ConfigurableHarness[]\n envModel: string | undefined\n}\n\nasync function decideModel({\n run,\n keyStep,\n current,\n configurable,\n envModel,\n}: DecideModelParams): Promise<SetupModelDecision> {\n const { options, ui } = run\n const step = {\n currentModels: current.currentModels,\n envModel,\n preferences: loadModelPreferences(run.ctx.home, ui),\n publicApiUrls: run.publicApiUrls,\n options,\n probeConsequence: describeProbeConsequence(options),\n ui,\n masker: run.masker,\n fetch: run.fetch,\n }\n const { input, deps, choice } = keyStep\n if (choice.kind === 'each-current') {\n const picked = await chooseModelForKeptKeys({ ...step, agents: current.keptKeys })\n if (picked.kind === 'declined') return picked\n return { ...picked, keyChoice: choice, check: 'skipped' }\n }\n\n const decision = await chooseCheckedModel({\n ...step,\n keyStep: { input, deps, resolved: choice.resolved },\n configurable,\n })\n if (decision.kind !== 'chosen') return decision\n const { resolvedKey, ...chosen } = decision\n return { ...chosen, keyChoice: { kind: 'one', resolved: resolvedKey } }\n}\n\nfunction findKeySave({ keyChoice, check }: ChosenSetupModel, deps: KeyStepDeps): KeySave | undefined {\n if (keyChoice.kind === 'each-current') return undefined\n\n return { resolved: keyChoice.resolved, check, deps }\n}\n","import type { Masker } from '../../product/secrets/masker'\nimport { formatCount } from '../../shared/text/format-count'\nimport { formatListOrCount } from '../../ui/format-list'\nimport type { MenuItem } from '../../ui/prompts/menu/select-menu-item'\nimport type { MenuState } from './read-menu-state'\n\nconst RESTORE_ITEM: MenuItem = { id: 'restore', label: 'Restore what nexos-connect changed', hint: undefined }\n\nexport function buildMenuItems({ configured, hasRestoreRecord }: MenuState, masker: Masker): MenuItem[] {\n const changeItems: MenuItem[] = [\n {\n id: 'change-key',\n label: 'Change API key',\n hint: describeValues({ values: configured.map(({ key }) => key), noun: 'key', masker }),\n },\n {\n id: 'change-model',\n label: 'Change model',\n hint: describeValues({ values: configured.map(({ model }) => model), noun: 'model', masker }),\n },\n ]\n return [\n { id: 'setup', label: 'Set up agents', hint: describeConfigured(configured.map(({ label }) => label)) },\n { id: 'launch', label: 'Launch an agent', hint: undefined },\n ...(configured.length > 0 ? changeItems : []),\n ...(hasRestoreRecord ? [RESTORE_ITEM] : []),\n { id: 'exit', label: 'Exit', hint: undefined },\n ]\n}\n\nfunction describeConfigured(labels: readonly string[]): string | undefined {\n const distinct = [...new Set(labels)]\n if (distinct.length === 0) return undefined\n\n return `${formatListOrCount({ items: distinct, count: distinct.length, noun: 'agent' })} configured`\n}\n\ntype DescribeValuesParams = { values: readonly (string | undefined)[]; noun: string; masker: Masker }\n\nfunction describeValues({ values, noun, masker }: DescribeValuesParams): string | undefined {\n const distinct = [...new Set(values.flatMap((value) => value ?? []))]\n const [only] = distinct\n if (only === undefined) return undefined\n\n return distinct.length === 1 ? `now ${masker.maskText(only)}` : formatCount(distinct.length, noun)\n}\n","import { readConfigurableAgents } from '../../flows/configure/read-current-configs'\nimport { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport {\n isRestoreRecordEmpty,\n readRestoreRecord,\n RestoreRecordError,\n} from '../../product/storage/restore-record/restore-record'\nimport { resolveRestoreRecordLocation } from '../../product/storage/restore-record/restore-record-location'\nimport { CONFIG_SCOPES, type PlatformContext } from '../../shared/platform/platform-context'\n\nexport type ConfiguredAgent = { label: string; key: string | undefined; model: string | undefined }\n\nexport type MenuState = { configured: ConfiguredAgent[]; hasRestoreRecord: boolean }\n\nexport function readMenuState(baseContext: PlatformContext): MenuState {\n const contexts = CONFIG_SCOPES.map((scope): PlatformContext => ({ ...baseContext, scope }))\n return {\n configured: contexts.flatMap(readConfiguredAgents),\n hasRestoreRecord: contexts.some(hasRestoreRecord),\n }\n}\n\nfunction readConfiguredAgents(ctx: PlatformContext): ConfiguredAgent[] {\n const shell = resolveShell(ctx.platform)\n const agents = readConfigurableAgents({ ctx, envPath: resolveEnvFilePath(ctx.home, shell), shell })\n return agents.flatMap(({ harness, current }) =>\n current.kind === 'configured' ? [{ label: harness.label, key: current.key, model: current.model }] : [],\n )\n}\n\n/** An unreadable record still offers restore, which then says why it cannot be read. */\nfunction hasRestoreRecord(ctx: PlatformContext): boolean {\n try {\n const filePath = resolveRestoreRecordLocation(ctx).filePath\n const record = readRestoreRecord({ filePath, home: ctx.home, scope: ctx.scope })\n return record !== null && !isRestoreRecordEmpty(record)\n } catch (error) {\n if (error instanceof RestoreRecordError) return true\n throw error\n }\n}\n","import { runCommandShell } from '../../cli/command-outcome'\nimport type { ExitCode } from '../../cli/exit-code'\nimport { refusePrompts } from '../../cli/refuse-prompts'\nimport { restoreAgents, type RestoreAgentsParams } from './restore-agents'\n\nexport async function runRestore(params: RestoreAgentsParams): Promise<ExitCode> {\n return await runCommandShell({\n ui: params.ui,\n isInteractive: params.baseContext.isInteractive,\n refuse: refusePrompts,\n run: async (ui) => await restoreAgents({ ...params, ui }),\n })\n}\n","import { runCommandShell } from '../../cli/command-outcome'\nimport { readEnvironmentInputs } from '../../cli/environment'\nimport type { ExitCode } from '../../cli/exit-code'\nimport { refusePrompts } from '../../cli/refuse-prompts'\nimport { setUpAgents, type SetUpAgentsParams } from './set-up-agents'\n\nexport type RunSetupParams = Omit<SetUpAgentsParams, 'environment'>\n\nexport async function runSetup(params: RunSetupParams): Promise<ExitCode> {\n return await runCommandShell({\n ui: params.ui,\n isInteractive: params.baseContext.isInteractive,\n refuse: refusePrompts,\n run: async (ui) => await setUpAgents({ ...params, ui, environment: readEnvironmentInputs(params.baseContext.env) }),\n })\n}\n","import pc from 'picocolors'\nimport type { HarnessStatus, ScopeState, ScopeStatus, StatusReport } from '../../../commands/status/status-result'\nimport type { Masker } from '../../../product/secrets/masker'\nimport { escapeForOneLine } from '../../../shared/text/escape-control-characters'\nimport { GLYPHS } from '../../glyphs'\nimport { INDENT, NESTED_INDENT } from '../indent'\n\nexport type FormatStatusParams = { report: StatusReport; masker: Masker }\n\nconst TITLE = 'nexos-connect status'\nconst HEADER_LABEL_WIDTH = 11\nconst SCOPE_WIDTH = 9\nconst STATE_WIDTH = 15\n\nconst SCOPE_STATE_COLOUR: Readonly<Record<ScopeState, (text: string) => string>> = {\n configured: pc.green,\n drifted: pc.yellow,\n 'not configured': pc.dim,\n 'not installed': pc.dim,\n unreadable: pc.red,\n}\n\nexport function formatStatus({ report, masker }: FormatStatusParams): string[] {\n return [\n pc.bold(TITLE),\n '',\n ...formatHeader(report, masker),\n ...report.harnesses.flatMap((harness) => formatHarness(harness, masker)),\n ...formatErrors(report.errors, masker),\n ]\n}\n\nfunction formatHeader(report: StatusReport, masker: Masker): string[] {\n return [\n formatHeaderRow('Account', masker.maskText(describeAccount(report.account))),\n formatHeaderRow('Key', describeKey(report.key)),\n formatHeaderRow('Env file', describeEnvFile(report.envFile)),\n formatHeaderRow('Backups', `${report.backups.user} · ${report.backups.project}`),\n formatHeaderRow('Defaults', describeDefaults(report.defaults, masker)),\n ]\n}\n\nfunction formatHeaderRow(label: string, value: string): string {\n return `${label.padEnd(HEADER_LABEL_WIDTH)}${value}`\n}\n\nfunction describeAccount(account: StatusReport['account']): string {\n if (account === null) return 'not signed in'\n if (account.keyName === null) return `${account.email} · no key`\n return `${account.email} · key \"${account.keyName}\"`\n}\n\nfunction describeKey({ isSaved, masked, isValid }: StatusReport['key']): string {\n if (masked === null) return 'none'\n\n const source = isSaved ? 'keychain' : 'found'\n if (isValid === null) return `${source} · ${masked}`\n return `${source} · ${masked} · ${isValid ? 'valid' : 'rejected'}`\n}\n\nfunction describeEnvFile({ path, isPresent }: StatusReport['envFile']): string {\n return `${path} · ${isPresent ? 'present' : 'absent'}`\n}\n\nfunction describeDefaults(defaults: Readonly<Record<string, string>>, masker: Masker): string {\n const entries = Object.entries(defaults)\n if (entries.length === 0) return 'none'\n\n return entries.map(([id, model]) => `${id} ${escapeForOneLine(masker.maskText(model))}`).join(' · ')\n}\n\nfunction formatHarness(harness: HarnessStatus, masker: Masker): string[] {\n return ['', ` ${pc.bold(harness.label)} ${pc.dim(`(${harness.id})`)}`, ...formatHarnessBody(harness, masker)]\n}\n\nfunction formatHarnessBody(harness: HarnessStatus, masker: Masker): string[] {\n if (!harness.isSupported) return [` ${pc.yellow(`unsupported — ${harness.reason ?? ''}`)}`]\n if (harness.scopes === null) return []\n\n return [\n ...formatScopeRow('user', harness.scopes.user, masker),\n ...formatScopeRow('project', harness.scopes.project, masker),\n ` ${'undo'.padEnd(SCOPE_WIDTH)}${harness.isUndoable ? 'yes' : 'no'}`,\n ...harness.warnings.map((warning) => ` ${pc.yellow(`${GLYPHS.warning} ${warning}`)}`),\n ]\n}\n\nfunction formatScopeRow(scopeName: string, status: ScopeStatus, masker: Masker): string[] {\n const colour = SCOPE_STATE_COLOUR[status.state]\n const path = status.path === null ? '' : status.path\n const model = status.model === null ? '' : `${INDENT}model ${escapeForOneLine(masker.maskText(status.model))}`\n const detail = status.detail === null ? [] : [`${NESTED_INDENT}${pc.dim(masker.maskText(status.detail))}`]\n return [` ${scopeName.padEnd(SCOPE_WIDTH)}${colour(status.state.padEnd(STATE_WIDTH))}${path}${model}`, ...detail]\n}\n\nfunction formatErrors(errors: readonly string[], masker: Masker): string[] {\n return errors.flatMap((error) => ['', ` ${pc.red(`${GLYPHS.failure} ${masker.maskText(error)}`)}`])\n}\n","import type { HarnessStatus, ScopeStatus, StatusReport } from '../../../commands/status/status-result'\nimport type { Masker } from '../../../product/secrets/masker'\n\nconst JSON_INDENT = 2\n// JSON.stringify escapes only up to U+001F, and a terminal reads U+009B as the start of a control sequence.\nconst UNESCAPED_CONTROL_CHARACTER = /[\\u007f-\\u009f]/g\nconst HEX_RADIX = 16\nconst UNICODE_ESCAPE_DIGITS = 4\n\nexport function formatStatusJson(report: StatusReport, masker: Masker): string {\n return JSON.stringify(toStatusJson(report, masker), null, JSON_INDENT).replace(\n UNESCAPED_CONTROL_CHARACTER,\n (character) => `\\\\u${character.charCodeAt(0).toString(HEX_RADIX).padStart(UNICODE_ESCAPE_DIGITS, '0')}`,\n )\n}\n\nfunction toStatusJson(report: StatusReport, masker: Masker): unknown {\n return {\n version: report.version,\n account:\n report.account === null\n ? null\n : { email: report.account.email, keyName: maskValue(report.account.keyName, masker) },\n key: { saved: report.key.isSaved, masked: report.key.masked, valid: report.key.isValid },\n envFile: { path: report.envFile.path, present: report.envFile.isPresent },\n backups: report.backups,\n defaults: maskValues(report.defaults, masker),\n harnesses: report.harnesses.map((harness) => toHarnessJson(harness, masker)),\n }\n}\n\nfunction toHarnessJson(harness: HarnessStatus, masker: Masker): unknown {\n return {\n id: harness.id,\n label: harness.label,\n supported: harness.isSupported,\n detected: harness.isDetected,\n undoable: harness.isUndoable,\n status: harness.status,\n reason: harness.reason,\n scopes:\n harness.scopes === null\n ? null\n : { user: toScopeJson(harness.scopes.user, masker), project: toScopeJson(harness.scopes.project, masker) },\n warnings: harness.warnings,\n }\n}\n\nfunction toScopeJson(scope: ScopeStatus, masker: Masker): unknown {\n return {\n state: scope.state,\n path: scope.path,\n model: maskValue(scope.model, masker),\n keyMasked: scope.keyMasked,\n detail: maskValue(scope.detail, masker),\n drifted: scope.isDrifted,\n changedPaths: scope.changedPaths,\n }\n}\n\nfunction maskValues(values: Readonly<Record<string, string>>, masker: Masker): Readonly<Record<string, string>> {\n return Object.fromEntries(Object.entries(values).map(([key, value]) => [key, masker.maskText(value)]))\n}\n\nfunction maskValue(value: string | null, masker: Masker): string | null {\n return value === null ? null : masker.maskText(value)\n}\n","import { match } from 'ts-pattern'\nimport type { ConfigurableHarness, Harness, HarnessInspection } from '../../harnesses/harness'\nimport { inspectAgent, readConfigKey } from '../../harnesses/read-agent-config'\nimport { DEFAULT_MODEL } from '../../product/public-api/models/predefined-models'\nimport type { Masker } from '../../product/secrets/masker'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport { describeFileError } from '../../shared/file-system/errors/describe-file-error'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { detectDrift } from './detect-drift'\nimport { displayScopePath } from './display-scope-path'\nimport { worstScopeState, type HarnessStatus, type ScopeState, type ScopeStatus } from './status-result'\n\nexport type InspectHarnessParams = {\n harness: Harness\n baseContext: PlatformContext\n envPath: string\n shell: Shell\n defaults: Readonly<Record<string, string>>\n undoableIds: ReadonlySet<string>\n masker: Masker\n}\n\nexport function inspectHarness(params: InspectHarnessParams): HarnessStatus {\n const { harness } = params\n if (harness.kind === 'unsupported') {\n return {\n id: harness.id,\n label: harness.label,\n isSupported: false,\n isDetected: isDetected(harness, params.baseContext),\n isUndoable: params.undoableIds.has(harness.id),\n status: 'unsupported',\n reason: harness.reason,\n scopes: null,\n warnings: [],\n }\n }\n\n const user = inspectScope({ ...params, harness, ctx: { ...params.baseContext, scope: 'user' } })\n const project = inspectProjectScope({ ...params, harness, ctx: { ...params.baseContext, scope: 'project' } })\n return {\n id: harness.id,\n label: harness.label,\n isSupported: true,\n isDetected: user.isDetected || project.isDetected,\n isUndoable: params.undoableIds.has(harness.id),\n status: worstScopeState([user.scope.state, project.scope.state]),\n reason: null,\n scopes: { user: user.scope, project: project.scope },\n warnings: listWarnings({ harness, masker: params.masker }, user.ctx, project.ctx),\n }\n}\n\ntype Detection = { kind: 'found' | 'not-found' | 'failed'; detail: string }\n\nfunction isDetected(harness: Harness, ctx: PlatformContext): boolean {\n try {\n return harness.detect({ ...ctx, scope: 'user' }).isFound\n } catch {\n return false\n }\n}\n\ntype InspectScopeParams = InspectHarnessParams & { harness: ConfigurableHarness; ctx: PlatformContext }\n\ntype ScopedInspection = { scope: ScopeStatus; isDetected: boolean; ctx: PlatformContext }\n\nfunction inspectScope(params: InspectScopeParams): ScopedInspection {\n const { harness, ctx } = params\n const detection = detectAt(harness, ctx)\n const { inspection, error } = inspectionFor(params)\n const key = readConfigKey({ harness, ctx, envPath: params.envPath, shell: params.shell })\n\n const scopeCase = match({\n detectionKind: detection.kind,\n isUnreadable: inspection.isUnreadable,\n isConfigured: inspection.isConfigured,\n })\n .with({ detectionKind: 'failed' }, () => unreadableScope(detection.detail))\n .with({ isUnreadable: true }, () => unreadableScope(error))\n .with({ isConfigured: true }, () => {\n try {\n const drift = detectDrift({\n harness,\n ctx,\n envPath: params.envPath,\n shell: params.shell,\n model: params.defaults[harness.id] ?? inspection.model ?? DEFAULT_MODEL,\n })\n return {\n state: drift.isDrifted ? ('drifted' as const) : ('configured' as const),\n changedPaths: drift.changedPaths,\n detail: null,\n }\n } catch (error) {\n return unreadableScope(describeFileError({ error, action: 'read', home: ctx.home }))\n }\n })\n .with({ detectionKind: 'not-found' }, () => notInstalledScope(detection.detail))\n .otherwise(() => ({ state: 'not configured' as const, changedPaths: [], detail: null }))\n\n return {\n scope: {\n ...scopeCase,\n path: displayScopePath(harness.configPath?.(ctx) ?? params.envPath, ctx),\n model: inspection.model ?? null,\n keyMasked: key === undefined ? null : params.masker.maskText(key),\n isDrifted: scopeCase.state === 'drifted',\n },\n isDetected: detection.kind === 'found',\n ctx,\n }\n}\n\nfunction inspectProjectScope(params: InspectScopeParams): ScopedInspection {\n if (params.harness.projectSupport.kind === 'unsupported') {\n return {\n scope: {\n state: 'not installed',\n path: null,\n model: null,\n keyMasked: null,\n isDrifted: false,\n changedPaths: [],\n detail: params.harness.projectSupport.reason,\n },\n isDetected: false,\n ctx: params.ctx,\n }\n }\n\n return inspectScope(params)\n}\n\nfunction detectAt(harness: Harness, ctx: PlatformContext): Detection {\n try {\n const result = harness.detect(ctx)\n return { kind: result.isFound ? 'found' : 'not-found', detail: result.detail }\n } catch (error) {\n return { kind: 'failed', detail: describeFileError({ error, action: 'read', home: ctx.home }) }\n }\n}\n\ntype InspectionResult = { inspection: HarnessInspection; error: string | null }\n\nfunction inspectionFor(params: InspectScopeParams): InspectionResult {\n try {\n return { inspection: inspectAgent(params), error: null }\n } catch (error) {\n return {\n inspection: { isConfigured: false, model: undefined, isUnreadable: true },\n error: describeFileError({ error, action: 'read', home: params.ctx.home }),\n }\n }\n}\n\ntype ScopeCase = { state: ScopeState; changedPaths: readonly string[]; detail: string | null }\n\nfunction unreadableScope(detail: string | null): ScopeCase {\n return { state: 'unreadable', changedPaths: [], detail }\n}\n\nfunction notInstalledScope(detail: string | null): ScopeCase {\n return { state: 'not installed', changedPaths: [], detail }\n}\n\ntype ListWarningsParams = { harness: ConfigurableHarness; masker: Masker }\n\nfunction listWarnings({ harness, masker }: ListWarningsParams, ...contexts: readonly PlatformContext[]): string[] {\n const warnings = contexts.flatMap((ctx) => readWarnings(harness, ctx))\n return [...new Set(warnings.map((warning) => masker.maskText(warning)))]\n}\n\nfunction readWarnings(harness: ConfigurableHarness, ctx: PlatformContext): string[] {\n try {\n return harness.warnings?.(ctx) ?? []\n } catch {\n return []\n }\n}\n","import type { PlatformContext } from '../../shared/platform/platform-context'\nimport { displayPath, displayRelativePath } from '../../shared/text/display-path'\n\nexport function displayScopePath(filePath: string, ctx: PlatformContext): string {\n return ctx.scope === 'user' ? displayPath(filePath, ctx.home) : displayRelativePath(filePath, ctx.cwd)\n}\n","import type { ConfigurableHarness, Contribution, FileContribution } from '../../harnesses/harness'\nimport { readConfigKey } from '../../harnesses/read-agent-config'\nimport { buildDesiredConfig, buildPublicApiUrls, resolvePublicApiHost } from '../../product/public-api/desired-config'\nimport { readEnvFile } from '../../product/storage/env-file/read-env-file'\nimport { renderEnvFile, type EnvFileVariables } from '../../product/storage/env-file/render-env-file'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport { ConfigFormatError } from '../../shared/file-formats/config-errors'\nimport { renderConfig } from '../../shared/file-formats/config-format'\nimport { readFileIfExists } from '../../shared/file-system/read-file-if-exists'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { displayScopePath } from './display-scope-path'\n\nexport type DetectDriftParams = {\n harness: ConfigurableHarness\n ctx: PlatformContext\n envPath: string\n shell: Shell\n model: string\n}\n\nexport type DriftResult = { isDrifted: boolean; changedPaths: readonly string[] }\n\n/** A fresh setup would change the file when re-planning from what is on disk differs from what is there. */\nexport function detectDrift(params: DetectDriftParams): DriftResult {\n const { harness, ctx, envPath, shell, model } = params\n const desired = buildDesiredConfig({\n publicApiUrls: buildPublicApiUrls(resolvePublicApiHost(ctx.env)),\n apiKey: readConfigKey({ harness, ctx, envPath, shell }) ?? '',\n model,\n })\n const contributions = harness.plan(desired, ctx)\n const changedPaths = [\n ...contributions.flatMap((contribution) => (contribution.kind === 'file' ? listFileDrift(contribution, ctx) : [])),\n ...listEnvDrift(collectEnvVariables(contributions), { ctx, envPath, shell }),\n ]\n return { isDrifted: changedPaths.length > 0, changedPaths }\n}\n\n/** The key is read from the config itself, so a config holding another key does not read as drift. */\nfunction listFileDrift(contribution: FileContribution, ctx: PlatformContext): string[] {\n const current = readFileIfExists(contribution.path)\n try {\n return renderConfig(current, contribution.edits(current)) === current\n ? []\n : [displayScopePath(contribution.path, ctx)]\n } catch (error) {\n if (!(error instanceof ConfigFormatError)) throw error\n return [displayScopePath(contribution.path, ctx)]\n }\n}\n\ntype ListEnvDriftParams = { ctx: PlatformContext; envPath: string; shell: Shell }\n\nfunction listEnvDrift(variables: EnvFileVariables, params: ListEnvDriftParams): string[] {\n if (Object.keys(variables).length === 0) return []\n\n const { ctx, envPath, shell } = params\n const envRead = readEnvFile({ envPath, home: ctx.home })\n if (envRead.kind === 'failed') return [displayScopePath(envPath, ctx)]\n\n const after = renderEnvFile({ current: envRead.text, variables, shell })\n return after === envRead.text ? [] : [displayScopePath(envPath, ctx)]\n}\n\nfunction collectEnvVariables(contributions: readonly Contribution[]): EnvFileVariables {\n return Object.fromEntries(\n contributions.flatMap((contribution) =>\n contribution.kind === 'env' ? Object.entries(contribution.variables) : [],\n ),\n )\n}\n","import { EXIT_CODE, type ExitCode } from '../../cli/exit-code'\n\nexport const SCOPE_STATES = ['not installed', 'not configured', 'configured', 'drifted', 'unreadable'] as const\n\nexport type ScopeState = (typeof SCOPE_STATES)[number]\n\nexport type ScopeStatus = {\n state: ScopeState\n path: string | null\n model: string | null\n keyMasked: string | null\n isDrifted: boolean\n changedPaths: readonly string[]\n detail: string | null\n}\n\nexport type HarnessStatus = {\n id: string\n label: string\n isSupported: boolean\n isDetected: boolean\n isUndoable: boolean\n status: ScopeState | 'unsupported'\n reason: string | null\n scopes: { user: ScopeStatus; project: ScopeStatus } | null\n warnings: readonly string[]\n}\n\nexport type AccountStatus = { email: string; keyName: string | null }\n\nexport type StatusReport = {\n version: 1\n account: AccountStatus | null\n key: { isSaved: boolean; masked: string | null; isValid: boolean | null }\n envFile: { path: string; isPresent: boolean }\n backups: { user: string; project: string }\n defaults: Readonly<Record<string, string>>\n harnesses: HarnessStatus[]\n errors: readonly string[]\n}\n\n/** Worst first: the headline state of an agent is the first of these that any of its scopes is in. */\nconst WORST_FIRST: readonly ScopeState[] = ['unreadable', 'drifted', 'configured', 'not configured', 'not installed']\n\nexport function worstScopeState(states: readonly ScopeState[]): ScopeState {\n return WORST_FIRST.find((state) => states.includes(state)) ?? 'not installed'\n}\n\nexport function exitCodeForStatus(report: StatusReport, namedIds: readonly string[]): ExitCode {\n if (report.errors.length > 0) return EXIT_CODE.failed\n if (report.key.isValid === false) return EXIT_CODE.failed\n if (report.harnesses.some(isUnhealthy)) return EXIT_CODE.failed\n\n const isNamedAndUnsetUp = (harness: HarnessStatus): boolean =>\n namedIds.includes(harness.id) && (harness.status === 'not configured' || harness.status === 'not installed')\n return report.harnesses.some(isNamedAndUnsetUp) ? EXIT_CODE.failed : EXIT_CODE.ok\n}\n\nfunction isUnhealthy(harness: HarnessStatus): boolean {\n return harness.status === 'drifted' || harness.status === 'unreadable'\n}\n","import path from 'node:path'\nimport { parseEnvironmentKey, readEnvironmentInputs } from '../../cli/environment'\nimport { COMMAND_NAME, LOGOUT_COMMAND } from '../../cli/help'\nimport { FORGET_KEY_COMMAND } from '../../cli/parse-cli-arguments'\nimport { findExistingKeys } from '../../flows/key/find-existing-keys'\nimport type { Masker } from '../../product/secrets/masker'\nimport { PROJECT_BACKUP_DIRECTORY, USER_BACKUP_DIRECTORY } from '../../product/storage/backups/resolve-backup-root'\nimport { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport { PreferencesError, readDefaultModels } from '../../product/storage/preferences/preferences'\nimport {\n RestoreRecordError,\n readRestoreRecord,\n type RestoreRecord,\n} from '../../product/storage/restore-record/restore-record'\nimport { resolveRestoreRecordLocation } from '../../product/storage/restore-record/restore-record-location'\nimport type { SessionStore } from '../../product/storage/session/session-store'\nimport { readFileIfExists } from '../../shared/file-system/read-file-if-exists'\nimport { CONFIG_SCOPES, type PlatformContext } from '../../shared/platform/platform-context'\nimport { describeError } from '../../shared/text/describe-error'\nimport { displayPath, displayRelativePath } from '../../shared/text/display-path'\nimport { readNonBlank } from '../../shared/text/read-non-blank'\nimport type { AccountStatus } from './status-result'\n\nexport type ReadGlobalStatusParams = {\n ctx: PlatformContext\n keystore: Keystore\n sessionStore: SessionStore\n masker: Masker\n}\n\nexport type GlobalStatus = {\n account: AccountStatus | null\n key: { isSaved: boolean; masked: string | null; isValid: null }\n resolvedKey: string | undefined\n envFile: { path: string; isPresent: boolean }\n backups: { user: string; project: string }\n defaults: Readonly<Record<string, string>>\n undoableIds: ReadonlySet<string>\n errors: string[]\n}\n\nexport async function readGlobalStatus(params: ReadGlobalStatusParams): Promise<GlobalStatus> {\n const { ctx, masker } = params\n const shell = resolveShell(ctx.platform)\n const envPath = resolveEnvFilePath(ctx.home, shell)\n const envKey = parseEnvironmentKey(readEnvironmentInputs(ctx.env).key)\n const existing = findExistingKeys({ ctx, envPath, shell })\n masker.registerSecrets(existing.all)\n\n const errors: string[] = []\n const saved = await loadSavedKey(params.keystore, errors)\n const account = await loadAccount(params.sessionStore, errors)\n const resolvedKey = envKey ?? saved ?? existing.offered\n if (resolvedKey !== undefined) masker.registerSecrets([resolvedKey])\n\n const defaults = readDefaults(ctx.home, errors)\n const undoableIds = readUndoableIds(ctx, errors)\n\n return {\n account,\n key: {\n isSaved: saved !== undefined,\n masked: resolvedKey === undefined ? null : masker.maskText(resolvedKey),\n isValid: null,\n },\n resolvedKey,\n envFile: { path: displayPath(envPath, ctx.home), isPresent: isFilePresent(envPath) },\n backups: {\n user: `${displayPath(path.join(ctx.home, USER_BACKUP_DIRECTORY), ctx.home)}${path.sep}`,\n project: `${displayRelativePath(path.join(ctx.cwd, PROJECT_BACKUP_DIRECTORY), ctx.cwd)}${path.sep}`,\n },\n defaults,\n undoableIds,\n errors,\n }\n}\n\nasync function loadSavedKey(keystore: Keystore, errors: string[]): Promise<string | undefined> {\n const availability = await keystore.availability()\n if (availability.kind !== 'available') return undefined\n\n try {\n return readNonBlank(await keystore.load())\n } catch (error) {\n errors.push(\n `Could not read the saved key from your system keychain: ${describeError(error)}. ` +\n `Run \\`${COMMAND_NAME} ${FORGET_KEY_COMMAND}\\` if this keeps happening.`,\n )\n return undefined\n }\n}\n\nasync function loadAccount(sessionStore: SessionStore, errors: string[]): Promise<AccountStatus | null> {\n const availability = await sessionStore.availability()\n if (availability.kind !== 'available') return null\n\n try {\n const load = await sessionStore.load()\n if (load.kind === 'corrupt') {\n errors.push(`Your saved sign-in could not be read: ${load.detail}. Run \\`${COMMAND_NAME} ${LOGOUT_COMMAND}\\`.`)\n }\n if (load.kind !== 'session') return null\n return { email: load.session.email, keyName: load.session.keyName ?? null }\n } catch (error) {\n errors.push(\n `Could not read your sign-in from the system keychain: ${describeError(error)}. ` +\n `Run \\`${COMMAND_NAME} ${LOGOUT_COMMAND}\\` if this keeps happening.`,\n )\n return null\n }\n}\n\nfunction isFilePresent(filePath: string): boolean {\n try {\n return readFileIfExists(filePath) !== null\n } catch {\n return false\n }\n}\n\nfunction readDefaults(home: string, errors: string[]): Readonly<Record<string, string>> {\n try {\n return readDefaultModels(home)\n } catch (error) {\n if (!(error instanceof PreferencesError)) throw error\n errors.push(error.message)\n return {}\n }\n}\n\nfunction readUndoableIds(ctx: PlatformContext, errors: string[]): ReadonlySet<string> {\n const ids = new Set<string>()\n for (const scope of CONFIG_SCOPES) {\n const record = readRecord({ ...ctx, scope }, errors)\n for (const id of Object.keys(record?.harnesses ?? {})) ids.add(id)\n }\n return ids\n}\n\nfunction readRecord(ctx: PlatformContext, errors: string[]): RestoreRecord | null {\n try {\n const { filePath } = resolveRestoreRecordLocation(ctx)\n return readRestoreRecord({ filePath, home: ctx.home, scope: ctx.scope })\n } catch (error) {\n if (!(error instanceof RestoreRecordError)) throw error\n errors.push(error.message)\n return null\n }\n}\n","import type { ExitCode } from '../../cli/exit-code'\nimport type { CliOptions } from '../../cli/parse-cli-arguments'\nimport { resolveNamedHarnesses } from '../../cli/resolve-named-harnesses'\nimport type { Harness } from '../../harnesses/harness'\nimport { harnesses } from '../../harnesses/registry'\nimport { buildPublicApiUrls, resolvePublicApiHost } from '../../product/public-api/desired-config'\nimport { listModels } from '../../product/public-api/list-models'\nimport { isKeyAccepted } from '../../product/public-api/probes/probe-result'\nimport type { Masker } from '../../product/secrets/masker'\nimport { resolveEnvFilePath } from '../../product/storage/env-file/env-file-path'\nimport type { Shell } from '../../product/storage/env-file/syntax/env-syntax'\nimport { resolveShell } from '../../product/storage/env-file/syntax/env-syntaxes'\nimport type { Keystore } from '../../product/storage/keychain/keystore'\nimport type { SessionStore } from '../../product/storage/session/session-store'\nimport type { Fetch } from '../../shared/http/send-request'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport { formatStatus } from '../../ui/report/result/format-status'\nimport { formatStatusJson } from '../../ui/report/result/format-status-json'\nimport type { TerminalUi } from '../../ui/terminal-ui'\nimport { inspectHarness } from './inspect-harness'\nimport { readGlobalStatus, type GlobalStatus } from './read-global-status'\nimport { exitCodeForStatus, type StatusReport } from './status-result'\n\nexport type RunStatusParams = {\n options: CliOptions\n baseContext: PlatformContext\n ui: TerminalUi\n keystore: Keystore\n sessionStore: SessionStore\n masker: Masker\n fetch: Fetch\n}\n\nexport async function runStatus(params: RunStatusParams): Promise<ExitCode> {\n const { options, baseContext, masker, ui } = params\n const named = resolveNamedHarnesses(options.harnessIds)\n const shell = resolveShell(baseContext.platform)\n const envPath = resolveEnvFilePath(baseContext.home, shell)\n const global = await readGlobalStatus({\n ctx: baseContext,\n keystore: params.keystore,\n sessionStore: params.sessionStore,\n masker,\n })\n\n const report: StatusReport = {\n version: 1,\n account: global.account,\n key: await resolveKeyStatus({ global, options, baseContext, masker, fetch: params.fetch }),\n envFile: global.envFile,\n backups: global.backups,\n defaults: global.defaults,\n harnesses: (named.length > 0 ? named : [...harnesses]).map((harness) =>\n inspectFor({ harness, params, global, envPath, shell }),\n ),\n errors: global.errors,\n }\n\n if (options.isJson) {\n ui.print([formatStatusJson(report, masker)])\n for (const error of global.errors) ui.writeError(masker.maskText(error))\n } else {\n ui.print(formatStatus({ report, masker }))\n }\n\n return exitCodeForStatus(report, options.harnessIds)\n}\n\ntype InspectForParams = {\n harness: Harness\n params: RunStatusParams\n global: GlobalStatus\n envPath: string\n shell: Shell\n}\n\nfunction inspectFor({ harness, params, global, envPath, shell }: InspectForParams) {\n return inspectHarness({\n harness,\n baseContext: params.baseContext,\n envPath,\n shell,\n defaults: global.defaults,\n undoableIds: global.undoableIds,\n masker: params.masker,\n })\n}\n\ntype ResolveKeyStatusParams = {\n global: GlobalStatus\n options: CliOptions\n baseContext: PlatformContext\n masker: Masker\n fetch: Fetch\n}\n\nasync function resolveKeyStatus({\n global,\n options,\n baseContext,\n masker,\n fetch,\n}: ResolveKeyStatusParams): Promise<StatusReport['key']> {\n if (!options.shouldVerifyStatus || global.resolvedKey === undefined) return global.key\n\n const publicApiUrls = buildPublicApiUrls(resolvePublicApiHost(baseContext.env))\n const { probe } = await listModels({\n openaiBaseUrl: publicApiUrls.openaiBaseUrl,\n apiKey: global.resolvedKey,\n masker,\n fetch,\n })\n return { ...global.key, isValid: isKeyAccepted(probe) }\n}\n","import type { ChildProcess, SpawnOptions } from 'node:child_process'\nimport type { PlatformContext } from '../../shared/platform/platform-context'\nimport type { NpmResult, RunNpm } from './install-harness'\n\nexport type NpmSpawn = (command: string, commandArguments: string[], options: SpawnOptions) => ChildProcess\nexport type CreateRunNpmParams = { ctx: PlatformContext; spawn: NpmSpawn }\n\nexport function createRunNpm({ ctx, spawn }: CreateRunNpmParams): RunNpm {\n return (npmArguments) => {\n const executable = ctx.resolveBinary('npm')\n if (executable === undefined) return Promise.resolve({ kind: 'could-not-start' })\n\n return new Promise<NpmResult>((resolve) => {\n const child = spawn(executable.path, [...npmArguments], { stdio: 'inherit', env: executable.env })\n child.once('error', () => resolve({ kind: 'could-not-start' }))\n child.once('exit', (code) => resolve({ kind: 'exited', code: code ?? 1 }))\n })\n }\n}\n","import type { ChildProcess, SpawnOptions } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport type { ResolvedExecutable } from '../../shared/platform/has-binary'\nimport { describeError } from '../../shared/text/describe-error'\nimport { LAUNCH_DIRECTORY_PLACEHOLDER, type LaunchFile, type LaunchRecipe } from './launch-recipe'\n\nexport const LAUNCH_DIRECTORY_PREFIX = 'nexos-connect-'\nconst STALE_DIRECTORY_PATTERN = new RegExp(`^${LAUNCH_DIRECTORY_PREFIX}(\\\\d+)-`)\nconst OWNER_ONLY_MODE = 0o600\n\nexport type LaunchResult = { code: number } | { signal: NodeJS.Signals }\n\nexport interface RunnerDeps {\n spawn(command: string, commandArguments: string[], options: SpawnOptions): ChildProcess\n tmpdir(): string\n pid: number\n /** Undefined where the platform has no uids (Windows). */\n uid: number | undefined\n isAlive(pid: number): boolean\n signals: Pick<NodeJS.EventEmitter, 'on' | 'off'>\n stdin: Pick<NodeJS.ReadStream, 'isTTY' | 'setRawMode' | 'pause'>\n env: NodeJS.ProcessEnv\n onError(message: string): void\n}\n\n/**\n * Temp dirs carry their run's pid, so only a dir whose run is gone is removed: a concurrent\n * session's settings file must outlive this run.\n */\nexport function sweepStaleDirectories(deps: Pick<RunnerDeps, 'tmpdir' | 'uid' | 'isAlive'>): void {\n const root = deps.tmpdir()\n let names: string[]\n try {\n names = fs.readdirSync(root)\n } catch {\n return\n }\n\n for (const name of names) {\n const match = STALE_DIRECTORY_PATTERN.exec(name)\n if (match === null) continue\n\n const directory = path.join(root, name)\n try {\n if (deps.isAlive(Number(match[1]))) continue\n if (deps.uid !== undefined && fs.statSync(directory).uid !== deps.uid) continue\n fs.rmSync(directory, { recursive: true, force: true })\n } catch {\n // Already gone, or not ours to remove.\n }\n }\n}\n\n/**\n * Ctrl-C reaches the whole foreground process group, so SIGINT is ignored here — the agent decides\n * what it means — and this process outlives it to clean up.\n */\nexport type RunLaunchParams = {\n recipe: LaunchRecipe\n passthrough: readonly string[]\n resolved: ResolvedExecutable\n deps: RunnerDeps\n}\n\nconst PATH_VARIABLE = 'PATH'\n\nexport async function runLaunch({ recipe, passthrough, resolved, deps }: RunLaunchParams): Promise<LaunchResult> {\n sweepStaleDirectories(deps)\n\n let directory: string | null = null\n const cleanup = (): void => {\n if (directory === null) return\n fs.rmSync(directory, { recursive: true, force: true })\n directory = null\n }\n deps.signals.on('exit', cleanup)\n\n let commandArguments = recipe.arguments\n let byPlaceholder = new Map<string, string>()\n if (recipe.files !== undefined && recipe.files.length > 0) {\n try {\n directory = fs.mkdtempSync(path.join(deps.tmpdir(), `${LAUNCH_DIRECTORY_PREFIX}${deps.pid}-`))\n byPlaceholder = writeLaunchFiles({ files: recipe.files, directory })\n commandArguments = commandArguments.map((argument) => byPlaceholder.get(argument) ?? argument)\n } catch (error) {\n cleanup()\n deps.signals.off('exit', cleanup)\n deps.onError(\n `Couldn't write the temporary settings file in ${deps.tmpdir()}: ${describeError(error)}. Check $TMPDIR.`,\n )\n return { code: 1 }\n }\n }\n\n const env: NodeJS.ProcessEnv = { ...deps.env, ...resolved.env }\n for (const [name, value] of Object.entries(recipe.env)) {\n if (value === undefined) delete env[name]\n else env[name] = byPlaceholder.get(value) ?? value\n }\n\n // Last, so no recipe entry swaps the PATH the agent was resolved against; under the resolved spelling,\n // since on Windows a second one would reach the agent as well.\n for (const [name, value] of Object.entries(resolved.env)) {\n if (name.toUpperCase() === PATH_VARIABLE) env[name] = value\n }\n\n // Prompts may have left stdin flowing or raw; either would steal the agent's keystrokes.\n if (deps.stdin.isTTY) deps.stdin.setRawMode(false)\n deps.stdin.pause()\n\n return new Promise((resolve) => {\n let child: ChildProcess | undefined\n const ignore = (): void => {}\n // A signal listener is called with no argument, so each forwards the signal it is registered for.\n const forwardTermination = (): void => {\n child?.kill('SIGTERM')\n }\n const forwardHangup = (): void => {\n child?.kill('SIGHUP')\n }\n\n let isSettled = false\n const finish = (result: LaunchResult): void => {\n if (isSettled) return\n isSettled = true\n deps.signals.off('SIGINT', ignore)\n deps.signals.off('SIGTERM', forwardTermination)\n deps.signals.off('SIGHUP', forwardHangup)\n deps.signals.off('exit', cleanup)\n cleanup()\n resolve(result)\n }\n\n try {\n const subcommands = recipe.subcommands ?? []\n const joined = joinArguments({ recipeArguments: commandArguments, subcommands, passthrough })\n child = deps.spawn(resolved.path, joined, { stdio: 'inherit', env })\n } catch (error) {\n deps.onError(`Couldn't start ${recipe.binary}: ${describeError(error)}`)\n finish({ code: 1 })\n return\n }\n\n deps.signals.on('SIGINT', ignore)\n deps.signals.on('SIGTERM', forwardTermination)\n deps.signals.on('SIGHUP', forwardHangup)\n child.once('error', (error) => {\n deps.onError(`Couldn't start ${recipe.binary}: ${error.message}`)\n finish({ code: 1 })\n })\n child.once('exit', (code, signal) => finish(signal !== null ? { signal } : { code: code ?? 1 }))\n })\n}\n\ntype WriteLaunchFilesParams = { files: readonly LaunchFile[]; directory: string }\n\n/** Writes each file 0600 into `directory`, mapping its token — and the directory token — to its path. */\nfunction writeLaunchFiles({ files, directory }: WriteLaunchFilesParams): Map<string, string> {\n const byPlaceholder = new Map<string, string>([[LAUNCH_DIRECTORY_PLACEHOLDER, directory]])\n for (const file of files) {\n const target = path.join(directory, file.name)\n fs.writeFileSync(target, file.content, { mode: OWNER_ONLY_MODE, flag: 'wx' })\n if (file.placeholder !== undefined) byPlaceholder.set(file.placeholder, target)\n }\n\n return byPlaceholder\n}\n\nexport type JoinArgumentsParams = {\n recipeArguments: readonly string[]\n subcommands: readonly string[]\n passthrough: readonly string[]\n}\n\nexport function joinArguments({ recipeArguments, subcommands, passthrough }: JoinArgumentsParams): string[] {\n const [first, ...rest] = passthrough\n if (first !== undefined && subcommands.includes(first)) return [first, ...recipeArguments, ...rest]\n\n return [...recipeArguments, ...passthrough]\n}\n","import { randomUUID } from 'node:crypto'\nimport type { AsyncEntry, EntryOptions } from '@napi-rs/keyring'\nimport { formatSeconds } from '../../../shared/text/format-seconds'\n\n/** The one export the store uses, so the native module is only reached through `importKeyring`. */\nexport interface Keyring {\n AsyncEntry: new (service: string, username: string, options?: EntryOptions) => AsyncEntry\n}\n\nconst KEYCHAIN_ACCOUNTS = ['default', 'session'] as const\n\nexport type KeychainAccount = (typeof KEYCHAIN_ACCOUNTS)[number]\n\nconst SERVICE = 'nexos-connect'\nconst PROBE_ACCOUNT = 'probe'\nconst LINUX_STORE: EntryOptions = { linux: { store: 'secret-service' } }\n\nexport const KEYCHAIN_ENV_VARIABLE = 'NEXOS_KEYCHAIN'\nexport const KEYCHAIN_DISABLED = 'off'\n\n/** Secret Service can hang indefinitely over SSH, in Docker and under WSL. */\nexport const KEYCHAIN_PROBE_TIMEOUT_MS = 2_000\n/** A read or write can wait on a keychain password dialog, so it gets a user-scale budget. */\nexport const KEYCHAIN_INTERACTION_TIMEOUT_MS = 120_000\n\nexport const KEYCHAIN_UNAVAILABLE = {\n disabled: 'The system keychain is disabled',\n wsl: 'WSL has no reachable system keychain',\n noBinding: 'No keychain support for this platform',\n noMacKeychain: 'No default macOS keychain',\n noKeychain: 'No system keychain found',\n timedOut: 'The system keychain did not answer in time',\n} as const\n\nconst REASONS_THAT_MAY_HOLD_A_KEY: ReadonlySet<string> = new Set([\n KEYCHAIN_UNAVAILABLE.disabled,\n KEYCHAIN_UNAVAILABLE.noKeychain,\n KEYCHAIN_UNAVAILABLE.timedOut,\n])\n\nexport type Availability = { kind: 'available' } | { kind: 'unavailable'; reason: string; hasPossibleEntry: boolean }\n\nexport interface KeychainEntry {\n load(): Promise<string | undefined>\n save(value: string): Promise<void>\n /** Whether there was an entry to remove. */\n clear(): Promise<boolean>\n}\n\nexport interface Keychain {\n availability(): Promise<Availability>\n entry(account: KeychainAccount): KeychainEntry\n /**\n * A native call timed out. Its thread is still blocked and holds the event loop open, so the\n * process has to be ended with `process.exit`.\n */\n readonly isHung: boolean\n}\n\nexport interface KeychainDeps {\n importKeyring(): Promise<Keyring>\n platform: NodeJS.Platform\n isWsl(): boolean\n hasMacKeychain(): boolean\n /** False when `$NEXOS_KEYCHAIN=off`, the escape hatch the e2e sandbox uses. */\n isEnabled: boolean\n probeTimeoutMs: number\n interactionTimeoutMs: number\n}\n\nfunction unavailable(reason: string): Availability {\n return { kind: 'unavailable', reason, hasPossibleEntry: REASONS_THAT_MAY_HOLD_A_KEY.has(reason) }\n}\n\nexport function createKeychain(deps: KeychainDeps): Keychain {\n let keyring: Keyring | undefined\n let probed: Promise<Availability> | undefined\n let isHung = false\n\n function nativeEntry(account: string): AsyncEntry {\n if (keyring === undefined) throw new Error('the keychain was used before availability() passed')\n return new keyring.AsyncEntry(SERVICE, account, LINUX_STORE)\n }\n\n // Raced against a timer rather than left to the signal alone: aborting only cancels native work\n // that has not started, and a hung D-Bus call has.\n function withTimeout<T>(operation: (signal: AbortSignal) => Promise<T>, timeoutMs: number): Promise<T> {\n if (isHung) return Promise.reject(new Error(KEYCHAIN_UNAVAILABLE.timedOut))\n\n const controller = new AbortController()\n let timer: NodeJS.Timeout | undefined\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n isHung = true\n controller.abort()\n reject(new Error(`the system keychain did not answer within ${formatSeconds(timeoutMs)}`))\n }, timeoutMs)\n })\n return Promise.race([operation(controller.signal), timeout]).finally(() => clearTimeout(timer))\n }\n\n async function probe(): Promise<Availability> {\n if (!deps.isEnabled) return unavailable(KEYCHAIN_UNAVAILABLE.disabled)\n if (deps.platform === 'linux' && deps.isWsl()) return unavailable(KEYCHAIN_UNAVAILABLE.wsl)\n\n let loaded: Keyring\n try {\n loaded = await deps.importKeyring()\n } catch {\n return unavailable(KEYCHAIN_UNAVAILABLE.noBinding)\n }\n if (deps.platform === 'darwin' && !deps.hasMacKeychain()) return unavailable(KEYCHAIN_UNAVAILABLE.noMacKeychain)\n\n try {\n const token = randomUUID()\n const read = await withTimeout(async (signal) => {\n const probeEntry = new loaded.AsyncEntry(SERVICE, PROBE_ACCOUNT, LINUX_STORE)\n try {\n await probeEntry.setPassword(token, signal)\n return await probeEntry.getPassword(signal)\n } finally {\n // Best effort, and without the aborted signal: a timed-out delete cannot succeed anyway.\n await probeEntry.deleteCredential().catch(() => false)\n }\n }, deps.probeTimeoutMs)\n if (read !== token) return unavailable(KEYCHAIN_UNAVAILABLE.noKeychain)\n\n // Only now is the module safe to use: a failed probe must not leave a usable `keyring`.\n keyring = loaded\n return { kind: 'available' }\n } catch {\n return unavailable(isHung ? KEYCHAIN_UNAVAILABLE.timedOut : KEYCHAIN_UNAVAILABLE.noKeychain)\n }\n }\n\n function entry(account: KeychainAccount): KeychainEntry {\n const timeoutMs = deps.interactionTimeoutMs\n return {\n load: () =>\n withTimeout(async (signal) => (await nativeEntry(account).getPassword(signal)) ?? undefined, timeoutMs),\n save: (value) => withTimeout(async (signal) => nativeEntry(account).setPassword(value, signal), timeoutMs),\n clear: () => withTimeout(async (signal) => nativeEntry(account).deleteCredential(signal), timeoutMs),\n }\n }\n\n return {\n availability: () => (isHung ? Promise.resolve(unavailable(KEYCHAIN_UNAVAILABLE.timedOut)) : (probed ??= probe())),\n entry,\n get isHung() {\n return isHung\n },\n }\n}\n","import type { Availability, Keychain } from './keychain'\n\nexport interface Keystore {\n availability(): Promise<Availability>\n load(): Promise<string | undefined>\n save(key: string): Promise<void>\n clear(): Promise<boolean>\n readonly isHung: boolean\n}\n\nexport function createKeystore(keychain: Keychain): Keystore {\n const entry = keychain.entry('default')\n return {\n availability: () => keychain.availability(),\n load: () => entry.load(),\n save: (key) => entry.save(key),\n clear: () => entry.clear(),\n get isHung() {\n return keychain.isHung\n },\n }\n}\n","import type { ResolvedExecutable } from '../../../shared/platform/has-binary'\n\nexport type MacKeychainProbeParams = {\n resolveBinary: (name: string) => ResolvedExecutable | undefined\n timeoutMs: number\n spawn: (\n command: string,\n commandArguments: string[],\n options: { stdio: 'ignore'; timeout: number; env: ResolvedExecutable['env'] },\n ) => { status: number | null }\n}\n\nexport function isMacKeychainAvailable({ resolveBinary, timeoutMs, spawn }: MacKeychainProbeParams): boolean {\n const executable = resolveBinary('security')\n if (executable === undefined) return false\n\n return (\n spawn(executable.path, ['default-keychain'], {\n stdio: 'ignore',\n timeout: timeoutMs,\n env: executable.env,\n }).status === 0\n )\n}\n","import * as v from 'valibot'\nimport { parseJson } from '../../../shared/file-formats/json/parse-json'\nimport type { Availability, Keychain } from '../keychain/keychain'\n\nconst SessionSchema = v.object({\n refreshToken: v.pipe(v.string(), v.nonEmpty()),\n accessToken: v.pipe(v.string(), v.nonEmpty()),\n accessTokenExpiresAt: v.pipe(v.string(), v.isoTimestamp()),\n email: v.pipe(v.string(), v.nonEmpty()),\n userId: v.pipe(v.string(), v.nonEmpty()),\n keyId: v.optional(v.string()),\n keyName: v.optional(v.string()),\n})\n\nexport type Session = v.InferOutput<typeof SessionSchema>\n\nexport type SessionLoad = { kind: 'session'; session: Session } | { kind: 'none' } | { kind: 'corrupt'; detail: string }\n\nexport interface SessionStore {\n availability(): Promise<Availability>\n load(): Promise<SessionLoad>\n save(session: Session): Promise<void>\n clear(): Promise<boolean>\n}\n\nexport function createSessionStore(keychain: Keychain): SessionStore {\n const entry = keychain.entry('session')\n return {\n availability: () => keychain.availability(),\n load: async () => readSession(await entry.load()),\n save: (session) => entry.save(JSON.stringify(session)),\n clear: () => entry.clear(),\n }\n}\n\nconst NOT_JSON = 'not valid JSON'\n\nfunction readSession(text: string | undefined): SessionLoad {\n if (text === undefined) return { kind: 'none' }\n\n const value = parseJson(text)\n if (value === undefined) return { kind: 'corrupt', detail: NOT_JSON }\n\n const result = v.safeParse(SessionSchema, value)\n if (!result.success) return { kind: 'corrupt', detail: result.issues[0].message }\n return { kind: 'session', session: result.output }\n}\n","import type { EnvironmentVariables } from '../../../shared/platform/platform-context'\n\nexport type PowerShellResult = { code: number; stdout: string }\n\nexport type RunPowerShellInput = { script: string; input: string }\nexport type RunPowerShellParams = RunPowerShellInput & {\n executablePath: string | undefined\n env: EnvironmentVariables\n spawn: (\n command: string,\n commandArguments: string[],\n options: { input: string; encoding: 'utf8'; env: EnvironmentVariables },\n ) => {\n status: number | null\n stdout: string\n }\n}\n\nexport type RunPowerShell = (params: RunPowerShellInput) => PowerShellResult\n\nconst POWERSHELL_ARGUMENTS = ['-NoProfile', '-NonInteractive', '-Command']\n\n// Windows PowerShell 5.1 ships with every supported Windows, and writes the same HKCU\\Environment\n// as PowerShell 7, so it is the one executable we can rely on being there.\nexport function runPowerShell({ script, input, executablePath, env, spawn }: RunPowerShellParams): PowerShellResult {\n if (executablePath === undefined) return { code: 1, stdout: '' }\n\n const result = spawn(executablePath, [...POWERSHELL_ARGUMENTS, script], { input, encoding: 'utf8', env })\n return { code: result.status ?? 1, stdout: result.stdout }\n}\n","import type { EnvironmentVariables } from './platform-context'\n\nexport type ReadUserNameParams = { userInfo: () => { username: string }; env: EnvironmentVariables }\n\nexport const UNKNOWN_USER_NAME = 'unknown'\n\nexport function readUserName({ userInfo, env }: ReadUserNameParams): string {\n try {\n return userInfo().username\n } catch {\n return env.USER ?? env.USERNAME ?? UNKNOWN_USER_NAME\n }\n}\n","import * as clack from '@clack/prompts'\nimport pc from 'picocolors'\nimport type { PromptIo } from './terminal/prompt-io'\n\nexport function intro(message: string, io: PromptIo): void {\n clack.intro(message, { output: io.output })\n}\n\nexport function outro(message: string, io: PromptIo): void {\n clack.outro(message, { output: io.output })\n}\n\nexport function cancel(message: string, io: PromptIo): void {\n clack.cancel(message, { output: io.output })\n}\n\nexport interface Log {\n info(message: string): void\n warn(message: string): void\n error(message: string): void\n success(message: string): void\n}\n\nexport function createLog(io: PromptIo): Log {\n return {\n info: (message) => clack.log.info(message, { output: io.output }),\n warn: (message) => clack.log.warn(message, { output: io.output }),\n error: (message) => clack.log.error(message, { output: io.output }),\n success: (message) => clack.log.success(message, { output: io.output }),\n }\n}\n\nexport function printLines(lines: readonly string[], io: PromptIo): void {\n io.output.write(`${lines.join('\\n')}\\n`)\n}\n\n/** Errors go to the error stream, so a JSON report on stdout stays one parseable object. */\nexport function writeError(message: string, io: PromptIo): void {\n const stream = io.errorOutput ?? io.output\n stream.write(`${message}\\n`)\n}\n\n/** A side remark: worth saying, never worth stopping for. */\nexport function dim(message: string, io: PromptIo): void {\n clack.log.message(pc.dim(message), { output: io.output })\n}\n\nexport function note(message: string, title: string, io: PromptIo): void {\n clack.note(message, title, { output: io.output })\n}\n","import * as clack from '@clack/prompts'\nimport { throwIfCancelled } from '../terminal/cancelled-error'\nimport type { PromptIo } from '../terminal/prompt-io'\n\nexport async function confirm(message: string, shouldDefaultToYes: boolean, io: PromptIo): Promise<boolean> {\n return await throwIfCancelled(clack.confirm({ message, initialValue: shouldDefaultToYes, ...io }))\n}\n","import * as clack from '@clack/prompts'\nimport { API_KEYS_URL } from '../../../product/public-api/desired-config'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\n\nexport type AskForKeyParams = { destination: string }\n\nexport async function askForKey({ destination }: AskForKeyParams, io: PromptIo): Promise<string> {\n clack.note(`Create a key at:\\n ${API_KEYS_URL}\\n\\n${destination}`, 'You need a nexos.ai API key', {\n output: io.output,\n })\n\n const value = await throwIfCancelled(\n clack.password({\n message: 'Paste your nexos.ai API key',\n validate: (value) => ((value ?? '').trim() === '' ? 'Paste a key, or press Ctrl-C to quit.' : undefined),\n ...io,\n }),\n )\n return value.trim()\n}\n","import * as clack from '@clack/prompts'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\n\n/** A paste with no key to fall back on: the user has just declined the one on offer. */\nexport async function askForNewKey(io: PromptIo): Promise<string> {\n const value = await throwIfCancelled(\n clack.password({\n message: 'Paste your nexos.ai API key',\n validate: (value) => ((value ?? '').trim() === '' ? 'A key is required' : undefined),\n ...io,\n }),\n )\n return value.trim()\n}\n","import * as clack from '@clack/prompts'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\n\nexport type AskKeyNameParams = { defaultName: string; findProblem: (name: string) => string | undefined }\n\nexport async function askKeyName({ defaultName, findProblem }: AskKeyNameParams, io: PromptIo): Promise<string> {\n return await throwIfCancelled(\n clack.text({\n message: 'Name for the new API key (leave empty for the default)',\n placeholder: defaultName,\n defaultValue: defaultName,\n validate: (value) => (value === undefined || value === '' ? undefined : findProblem(value)),\n ...io,\n }),\n )\n}\n","import * as clack from '@clack/prompts'\nimport { match } from 'ts-pattern'\nimport { formatList, formatListOrCount } from '../../format-list'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\nimport { describeAccountOption, type AccountOption } from './account-option'\n\nexport type MaskedStoredOffer = { kind: 'saved' | 'found'; maskedKey: string }\n\nexport type MaskedAgentKey = { label: string; maskedKey: string }\n\nexport type CurrentKeyOffer =\n | { kind: 'keep' | 'in-use'; maskedKey: string; labels: readonly string[] }\n | { kind: 'keep-each'; perAgent: readonly MaskedAgentKey[] }\n\nexport type CurrentKeyChoice = { kind: 'current'; index: number }\n\nexport type KeySourceChoice = 'offered' | 'account' | 'paste' | CurrentKeyChoice\n\nexport type ChooseKeySourceParams = {\n currentOffers: readonly CurrentKeyOffer[]\n offer: MaskedStoredOffer | undefined\n account: AccountOption | undefined\n initialChoice: Exclude<KeySourceChoice, CurrentKeyChoice> | undefined\n /** True when --yes would take a key: one saved in the keychain, or found on this machine. Never a keep or in-use row. */\n hasStoredKey: boolean\n}\n\ntype KeySourceRow = { value: KeySourceChoice; label: string; hint?: string }\n\nexport async function chooseKeySource(params: ChooseKeySourceParams, io: PromptIo): Promise<KeySourceChoice> {\n const { currentOffers, offer, account, initialChoice } = params\n const hasOffer = hasKeyOffer(params)\n const rows: KeySourceRow[] = [\n ...currentOffers.map(describeCurrentOffer),\n ...(offer === undefined ? [] : [describeOffer(offer)]),\n ...(account === undefined ? [] : [{ value: 'account' as const, ...describeAccountOption(account) }]),\n { value: 'paste', label: hasOffer ? 'Paste a new key' : 'Paste an API key' },\n ]\n return await throwIfCancelled(\n clack.select<KeySourceChoice>({\n message: hasOffer ? 'Which nexos.ai API key?' : 'How do you want to provide your nexos.ai API key?',\n options: rows,\n ...(initialChoice === undefined ? {} : { initialValue: initialChoice }),\n ...io,\n }),\n )\n}\n\nfunction hasKeyOffer({ currentOffers, offer }: ChooseKeySourceParams): boolean {\n return currentOffers.length > 0 || offer !== undefined\n}\n\nfunction describeCurrentOffer(offer: CurrentKeyOffer, index: number): KeySourceRow {\n const value: CurrentKeyChoice = { kind: 'current', index }\n return match(offer)\n .with({ kind: 'keep' }, ({ maskedKey, labels }) => ({\n value,\n label: `Keep the current key ${maskedKey}`,\n hint: describeUsers(labels),\n }))\n .with({ kind: 'keep-each' }, ({ perAgent }) => ({\n value,\n label: \"Keep each agent's current key\",\n hint: formatListOrCount({\n items: perAgent.map(({ label, maskedKey }) => `${label} ${maskedKey}`),\n count: new Set(perAgent.map(({ maskedKey }) => maskedKey)).size,\n noun: 'different key',\n }),\n }))\n .with({ kind: 'in-use' }, ({ maskedKey, labels }) => ({\n value,\n label: `Use ${maskedKey}`,\n hint: describeUsers(labels),\n }))\n .exhaustive()\n}\n\nfunction describeUsers(labels: readonly string[]): string {\n return `in use by ${formatList(labels)}`\n}\n\nfunction describeOffer({ kind, maskedKey }: MaskedStoredOffer): KeySourceRow {\n return match(kind)\n .with('saved', () => ({\n value: 'offered' as const,\n label: `Use saved key ${maskedKey}`,\n hint: 'from your system keychain',\n }))\n .with('found', () => ({\n value: 'offered' as const,\n label: `Keep the key ${maskedKey}`,\n hint: 'found on this machine',\n }))\n .exhaustive()\n}\n","import { match } from 'ts-pattern'\n\nexport type AccountOption = { kind: 'session'; email: string } | { kind: 'sign-in' }\n\nexport type AccountRow = { label: string; hint: string }\n\nexport function describeAccountOption(account: AccountOption): AccountRow {\n return match(account)\n .with({ kind: 'session' }, ({ email }) => ({\n label: `Create a new key as ${email}`,\n hint: 'you are signed in, no browser',\n }))\n .with({ kind: 'sign-in' }, () => ({\n label: 'Sign in with nexos.ai',\n hint: 'opens your browser, creates a key for this machine',\n }))\n .exhaustive()\n}\n","import * as clack from '@clack/prompts'\nimport { match } from 'ts-pattern'\nimport { DEFAULT_MODEL } from '../../../product/public-api/models/predefined-models'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\n\nexport type KeyCheckFallback = 'pick-model' | 'write-unchecked-key'\n\nexport type FetchFailureChoice = 'retry' | 'type-model' | 'use-router' | 'write-unchecked-key'\n\nexport type KeyRejectedChoice = FetchFailureChoice | 'other-key'\n\nconst RETRY_OPTION: clack.Option<FetchFailureChoice> = {\n value: 'retry',\n label: 'Try again',\n hint: 'send the same request again',\n}\n\nexport async function chooseOnKeyRejected(fallback: KeyCheckFallback, io: PromptIo): Promise<KeyRejectedChoice> {\n return await throwIfCancelled(\n clack.select<KeyRejectedChoice>({\n message: 'The gateway rejected the key. What next?',\n options: [\n { value: 'other-key', label: 'Use a different key' },\n RETRY_OPTION,\n ...listFallbackOptions(fallback, 'the gateway rejected it'),\n ],\n initialValue: 'other-key',\n ...io,\n }),\n )\n}\n\nexport async function chooseOnFetchFailure(fallback: KeyCheckFallback, io: PromptIo): Promise<FetchFailureChoice> {\n return await throwIfCancelled(\n clack.select<FetchFailureChoice>({\n message: match(fallback)\n .with('pick-model', () => 'Could not fetch the model list. What next?')\n .with('write-unchecked-key', () => 'Could not check the key. What next?')\n .exhaustive(),\n options: [RETRY_OPTION, ...listFallbackOptions(fallback, 'without the check')],\n initialValue: 'retry',\n ...io,\n }),\n )\n}\n\nfunction listFallbackOptions(fallback: KeyCheckFallback, writeAnywayHint: string): clack.Option<FetchFailureChoice>[] {\n return match(fallback)\n .with('pick-model', (): clack.Option<FetchFailureChoice>[] => [\n { value: 'type-model', label: 'Type a model id…', hint: 'if you know which one you want' },\n { value: 'use-router', label: `Use ${DEFAULT_MODEL}`, hint: 'the gateway router' },\n ])\n .with('write-unchecked-key', (): clack.Option<FetchFailureChoice>[] => [\n { value: 'write-unchecked-key', label: 'Write the key anyway', hint: writeAnywayHint },\n ])\n .exhaustive()\n}\n","import * as clack from '@clack/prompts'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\nimport { describeAccountOption, type AccountOption } from './account-option'\n\nexport type RejectedKeyChoice = 'account' | 'paste' | 'cancel'\n\nexport type ChooseOnSavedKeyRejectedParams = { status: number; account: AccountOption | undefined }\n\nexport async function chooseOnSavedKeyRejected(\n { status, account }: ChooseOnSavedKeyRejectedParams,\n io: PromptIo,\n): Promise<RejectedKeyChoice> {\n return await throwIfCancelled(\n clack.select<RejectedKeyChoice>({\n message: `The gateway rejected the saved key (HTTP ${status}). What next?`,\n options: [\n ...(account === undefined ? [] : [{ value: 'account' as const, ...describeAccountOption(account) }]),\n { value: 'paste', label: 'Paste a new key' },\n { value: 'cancel', label: 'Cancel' },\n ],\n ...io,\n }),\n )\n}\n","import * as clack from '@clack/prompts'\nimport { withBackKeys } from '../../terminal/back-keys'\nimport type { PromptIo } from '../../terminal/prompt-io'\n\nexport type MenuItemId = 'setup' | 'launch' | 'change-key' | 'change-model' | 'restore' | 'exit'\n\nexport type MenuItem = { id: MenuItemId; label: string; hint: string | undefined }\n\nexport async function selectMenuItem(items: readonly MenuItem[], io: PromptIo): Promise<MenuItemId> {\n const result = await withBackKeys({\n isFieldEmpty: () => false,\n run: async () =>\n await clack.select<MenuItemId>({\n message: 'What would you like to do?',\n options: items.map(toOption),\n ...io,\n }),\n input: io.input,\n })\n return result.kind === 'chosen' ? result.value : 'exit'\n}\n\nfunction toOption({ id, label, hint }: MenuItem): clack.Option<MenuItemId> {\n return hint === undefined ? { value: id, label } : { value: id, label, hint }\n}\n","import type { EventEmitter } from 'node:events'\nimport type { Key } from 'node:readline'\nimport * as clack from '@clack/prompts'\nimport { CancelledError } from './cancelled-error'\n\nconst ESCAPE_KEY = 'escape'\nconst EDITING_BACK_KEYS = ['left', 'backspace', 'delete'] as const\n\nexport function isBackKeystroke(key: Key | undefined, isFieldEmpty: boolean): boolean {\n if (key?.name === ESCAPE_KEY) return true\n return isFieldEmpty && isEditingBackKey(key?.name)\n}\n\nexport type BackKeysResult<T> = { kind: 'chosen'; value: T } | { kind: 'back' }\n\nexport type WithBackKeysParams<T> = {\n isFieldEmpty: () => boolean\n run: () => Promise<T | typeof clack.CANCEL_SYMBOL>\n input: EventEmitter\n}\n\n// Clack reports Esc and Ctrl-C as one cancel symbol, so a keypress listener that runs first tells them apart.\nexport async function withBackKeys<T>({ isFieldEmpty, run, input }: WithBackKeysParams<T>): Promise<BackKeysResult<T>> {\n let isGoingBack = false\n\n const onKeypress = (_character: string | undefined, key: Key): void => {\n const name = key?.name\n if (name === undefined) return\n\n isGoingBack = isBackKeystroke(key, isFieldEmpty())\n\n if (!isEditingBackKey(name)) return\n if (isGoingBack) clack.settings.aliases.set(name, 'cancel')\n else clack.settings.aliases.delete(name)\n }\n\n input.prependListener('keypress', onKeypress)\n try {\n const value = await run()\n if (!clack.isCancel(value)) return { kind: 'chosen', value }\n if (isGoingBack) return { kind: 'back' }\n throw new CancelledError()\n } finally {\n input.removeListener('keypress', onKeypress)\n for (const name of EDITING_BACK_KEYS) clack.settings.aliases.delete(name)\n }\n}\n\nfunction isEditingBackKey(name: string | undefined): boolean {\n return EDITING_BACK_KEYS.some((editingKey) => editingKey === name)\n}\n","import * as clack from '@clack/prompts'\nimport pc from 'picocolors'\nimport { DEFAULT_MODEL } from '../../../product/public-api/models/predefined-models'\nimport { withBackKeys, type BackKeysResult } from '../../terminal/back-keys'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\n\nconst MODEL_ID_MESSAGE = `Model id (leave empty for ${DEFAULT_MODEL})`\nconst BACK_HINT = pc.dim('· Esc back to the model list')\n\n// No `validate`: clack runs it before it applies `defaultValue`, so Enter on an empty field would be refused.\nconst MODEL_ID_PROMPT: clack.TextOptions = {\n message: MODEL_ID_MESSAGE,\n placeholder: DEFAULT_MODEL,\n defaultValue: DEFAULT_MODEL,\n}\n\nconst REQUIRED_MODEL_ID_PROMPT: clack.TextOptions = {\n message: `Model id ${BACK_HINT}`,\n validate: (value) =>\n value === undefined || value.trim() === '' ? 'Type a model id, or press Esc to go back.' : undefined,\n}\n\nexport async function askForModelId(io: PromptIo): Promise<string> {\n const typed = await throwIfCancelled(clack.text({ ...MODEL_ID_PROMPT, ...io }))\n return normalizeModelId(typed)\n}\n\nexport async function askForModelIdWithBack(io: PromptIo): Promise<BackKeysResult<string>> {\n const typed = await withBackKeys({\n isFieldEmpty: () => false,\n run: () => clack.text({ ...MODEL_ID_PROMPT, message: `${MODEL_ID_MESSAGE} ${BACK_HINT}`, ...io }),\n input: io.input,\n })\n if (typed.kind === 'back') return typed\n\n return { kind: 'chosen', value: normalizeModelId(typed.value) }\n}\n\nexport async function askForRequiredModelIdWithBack(io: PromptIo): Promise<BackKeysResult<string>> {\n const typed = await withBackKeys({\n isFieldEmpty: () => false,\n run: () => clack.text({ ...REQUIRED_MODEL_ID_PROMPT, ...io }),\n input: io.input,\n })\n if (typed.kind === 'back') return typed\n\n return { kind: 'chosen', value: typed.value.trim() }\n}\n\nfunction normalizeModelId(typed: string): string {\n const modelId = typed.trim()\n return modelId === '' ? DEFAULT_MODEL : modelId\n}\n","import * as clack from '@clack/prompts'\nimport { formatList } from '../../format-list'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\n\nexport type ModelProbeFailureChoice = 'other-model' | 'continue' | 'cancel'\n\nexport type ChooseOnModelProbeFailureParams = {\n maskedModel: string\n consequence: string\n agentLabels: readonly string[]\n}\n\nexport async function chooseOnModelProbeFailure(\n { maskedModel, consequence, agentLabels }: ChooseOnModelProbeFailureParams,\n io: PromptIo,\n): Promise<ModelProbeFailureChoice> {\n return await throwIfCancelled(\n clack.select<ModelProbeFailureChoice>({\n message: `\"${maskedModel}\" failed the check${describeAgents(agentLabels)}. What next?`,\n options: [\n { value: 'other-model', label: 'Pick another model' },\n { value: 'continue', label: 'Continue anyway', hint: consequence },\n { value: 'cancel', label: 'Cancel' },\n ],\n initialValue: 'other-model',\n ...io,\n }),\n )\n}\n\nfunction describeAgents(agentLabels: readonly string[]): string {\n return agentLabels.length === 0 ? '' : ` for ${formatList(agentLabels)}`\n}\n","import * as clack from '@clack/prompts'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\nimport type { ModelSuggestion } from './model-choices'\n\nconst ANOTHER_MODEL_VALUE = '\\u0000another'\n\n/** Resolves to the default chosen, or to undefined when the user wants the model picker instead. */\nexport async function chooseSavedModel(\n defaults: readonly ModelSuggestion[],\n io: PromptIo,\n): Promise<string | undefined> {\n const chosen = await throwIfCancelled(\n clack.select<string>({\n message: 'Which model should your agents use?',\n options: [\n ...defaults.map(({ model, hint }) => ({ value: model, label: `Use ${model}`, hint })),\n { value: ANOTHER_MODEL_VALUE, label: 'Choose another model…' },\n ],\n ...io,\n }),\n )\n return chosen === ANOTHER_MODEL_VALUE ? undefined : chosen\n}\n","import * as clack from '@clack/prompts'\nimport { formatCount } from '../../../shared/text/format-count'\nimport { formatList } from '../../format-list'\nimport { createLog } from '../../output'\nimport { throwIfCancelled } from '../../terminal/cancelled-error'\nimport type { PromptIo } from '../../terminal/prompt-io'\nimport { askForModelIdWithBack, askForRequiredModelIdWithBack } from './ask-for-model-id'\nimport { browseCatalogue } from './browse-catalogue'\nimport { BROWSE_VALUE, MANUAL_VALUE, type ModelChoices } from './model-choices'\n\nexport async function selectModel(choices: ModelChoices, io: PromptIo): Promise<string> {\n const log = createLog(io)\n const rows: clack.Option<string>[] = choices.rows.map((row) => ({\n value: row.value,\n label: row.label,\n ...(row.hint !== undefined ? { hint: row.hint } : {}),\n }))\n\n let cameBackFrom: string | undefined\n let hasNotedHiddenModels = false\n\n for (;;) {\n const initialValue = cameBackFrom ?? rows[0]?.value\n const chosenRow = await throwIfCancelled(\n clack.select<string>({\n message: 'Which model should your agents use?',\n options: rows,\n ...(initialValue === undefined ? {} : { initialValue }),\n ...io,\n }),\n )\n\n if (chosenRow !== BROWSE_VALUE && chosenRow !== MANUAL_VALUE) return chosenRow\n\n if (chosenRow === MANUAL_VALUE) {\n const typed = choices.isRouterOffered ? await askForModelIdWithBack(io) : await askForRequiredModelIdWithBack(io)\n if (typed.kind === 'chosen') return typed.value\n cameBackFrom = MANUAL_VALUE\n continue\n }\n\n if (!hasNotedHiddenModels) {\n if (choices.hiddenCount > 0) log.info(formatHiddenModelsNote(choices.hiddenCount))\n if (choices.unusableCount > 0) {\n log.info(formatUnusableModelsNote(choices.unusableCount, choices.unusableAgentLabels))\n }\n }\n hasNotedHiddenModels = true\n\n const browsed = await browseCatalogue(choices, io)\n if (browsed.kind === 'chosen') return browsed.value\n cameBackFrom = BROWSE_VALUE\n }\n}\n\nexport function formatHiddenModelsNote(hiddenCount: number): string {\n const subject = hiddenCount === 1 ? 'it is' : 'they are'\n const object = hiddenCount === 1 ? 'a chat model' : 'chat models'\n return `${formatCount(hiddenCount, 'model')} hidden — ${subject} not ${object}.`\n}\n\nexport function formatUnusableModelsNote(unusableCount: number, agentLabels: readonly string[]): string {\n const object = unusableCount === 1 ? 'it' : 'them'\n return `${formatCount(unusableCount, 'model')} hidden — ${formatList(agentLabels)} cannot use ${object}.`\n}\n","import * as clack from '@clack/prompts'\nimport pc from 'picocolors'\nimport { withBackKeys, type BackKeysResult } from '../../terminal/back-keys'\nimport type { PromptIo } from '../../terminal/prompt-io'\nimport { formatExclusion, type CatalogueRow, type ModelChoices } from './model-choices'\n\nconst CATALOGUE_MESSAGE = `Model ${pc.dim('· Esc/← back to the model list')}`\nconst CATALOGUE_VISIBLE_ROWS = 15\nconst NO_MATCH_MESSAGE = 'No model matches the filter.'\n\nexport async function browseCatalogue(choices: ModelChoices, io: PromptIo): Promise<BackKeysResult<string>> {\n const catalogue = choices.catalogue.map(toCatalogueOption)\n const modelHints = new Map(choices.catalogue.map(({ id, modelHint }) => [id, modelHint.toLowerCase()]))\n\n // Clack calls an options function with `this` bound to the prompt, whose `userInput` is the live filter.\n let readFilterText = (): string => ''\n\n return await withBackKeys({\n isFieldEmpty: () => readFilterText() === '',\n run: () =>\n clack.autocomplete<string>({\n message: CATALOGUE_MESSAGE,\n maxItems: CATALOGUE_VISIBLE_ROWS,\n options: function (this: { readonly userInput: string }) {\n readFilterText = () => this.userInput\n return catalogue\n },\n // Clack's own filter also searches the hint, where \"cannot use it\" names agents rather than the model.\n filter: (search, option) => {\n const text = search.toLowerCase()\n return option.value.toLowerCase().includes(text) || (modelHints.get(option.value) ?? '').includes(text)\n },\n validate: (value) => (value === undefined ? NO_MATCH_MESSAGE : undefined),\n ...io,\n }),\n input: io.input,\n })\n}\n\nfunction toCatalogueOption({ id, modelHint, excludedLabels }: CatalogueRow): clack.Option<string> {\n const exclusion = excludedLabels.length > 0 ? formatExclusion(excludedLabels) : ''\n const hint = [modelHint, exclusion].filter((part) => part !== '').join(' · ')\n return { value: id, label: id, ...(hint !== '' ? { hint } : {}) }\n}\n","import * as clack from '@clack/prompts'\nimport type { ConfigScope } from '../../shared/platform/platform-context'\nimport { formatList } from '../format-list'\nimport { throwIfCancelled } from '../terminal/cancelled-error'\nimport type { PromptIo } from '../terminal/prompt-io'\nimport { listEnabledFirst } from './list-enabled-first'\n\nexport type SelectChangeScopeParams = { user: readonly string[]; project: readonly string[] }\n\nexport async function selectChangeScope(\n { user, project }: SelectChangeScopeParams,\n io: PromptIo,\n): Promise<ConfigScope> {\n const rows: clack.Option<ConfigScope>[] = [\n { value: 'user', label: 'User-level', hint: describeConfigured(user), disabled: user.length === 0 },\n {\n value: 'project',\n label: 'Project-level',\n hint: `this directory — ${describeConfigured(project)}`,\n disabled: project.length === 0,\n },\n ]\n return await throwIfCancelled(\n clack.select<ConfigScope>({\n message: 'Which configs should change?',\n options: listEnabledFirst(rows),\n ...io,\n }),\n )\n}\n\nfunction describeConfigured(labels: readonly string[]): string {\n return labels.length === 0 ? 'nothing configured' : formatList(labels)\n}\n","import type * as clack from '@clack/prompts'\n\n/** With no initial value the cursor starts on the first row, so a row it can take must lead. */\nexport function listEnabledFirst<Value>(rows: readonly clack.Option<Value>[]): clack.Option<Value>[] {\n return [...rows.filter((row) => row.disabled !== true), ...rows.filter((row) => row.disabled === true)]\n}\n","import * as clack from '@clack/prompts'\nimport { throwIfCancelled } from '../terminal/cancelled-error'\nimport type { PromptIo } from '../terminal/prompt-io'\n\nexport type HarnessChoice = { value: string; label: string; hint: string; isDisabled: boolean }\n\nexport async function selectHarnesses(choices: readonly HarnessChoice[], io: PromptIo): Promise<string[]> {\n return await throwIfCancelled(\n clack.multiselect<string>({\n message: 'Which agents should use the nexos.ai Gateway?',\n options: choices.map((choice) => ({\n value: choice.value,\n label: choice.label,\n hint: choice.hint,\n disabled: choice.isDisabled,\n })),\n initialValues: [],\n required: true,\n ...io,\n }),\n )\n}\n","import * as clack from '@clack/prompts'\nimport type { LaunchingHarness } from '../../harnesses/harness'\nimport { throwIfCancelled } from '../terminal/cancelled-error'\nimport type { PromptIo } from '../terminal/prompt-io'\n\nexport type LaunchAgentChoice = { harness: LaunchingHarness; isInstalled: boolean }\n\nexport async function selectLaunchAgent(\n choices: readonly LaunchAgentChoice[],\n io: PromptIo,\n): Promise<LaunchingHarness> {\n return await throwIfCancelled(\n clack.select<LaunchingHarness>({\n message: 'Which agent should start?',\n options: choices.map((choice) => ({\n value: choice.harness,\n label: choice.harness.label,\n hint: choice.isInstalled ? 'installed' : 'not installed — asks to install it',\n })),\n ...io,\n }),\n )\n}\n","import * as clack from '@clack/prompts'\nimport { throwIfCancelled } from '../terminal/cancelled-error'\nimport type { PromptIo } from '../terminal/prompt-io'\n\nexport type RestoreChoice = { value: string; label: string; hint: string }\n\nexport async function selectRestoreHarnesses(choices: readonly RestoreChoice[], io: PromptIo): Promise<string[]> {\n return await throwIfCancelled(\n clack.multiselect<string>({\n message: 'Which agents should get their original config back?',\n options: choices.map(({ value, label, hint }) => ({ value, label, hint })),\n initialValues: choices.map(({ value }) => value),\n required: false,\n ...io,\n }),\n )\n}\n","import * as clack from '@clack/prompts'\nimport { match } from 'ts-pattern'\nimport type { ConfigScope } from '../../shared/platform/platform-context'\nimport { formatList } from '../format-list'\nimport { throwIfCancelled } from '../terminal/cancelled-error'\nimport type { PromptIo } from '../terminal/prompt-io'\nimport { listEnabledFirst } from './list-enabled-first'\n\nexport type RecordedScope =\n | { kind: 'recorded'; entries: readonly string[] }\n | { kind: 'empty' }\n | { kind: 'unreadable' }\n\nexport type SelectRestoreScopeParams = { user: RecordedScope; project: RecordedScope }\n\nexport async function selectRestoreScope(\n { user, project }: SelectRestoreScopeParams,\n io: PromptIo,\n): Promise<ConfigScope> {\n const rows: clack.Option<ConfigScope>[] = [\n { value: 'user', label: 'User-level', hint: describeRecordedScope(user), disabled: user.kind === 'empty' },\n {\n value: 'project',\n label: 'Project-level',\n hint: `this directory — ${describeRecordedScope(project)}`,\n disabled: project.kind === 'empty',\n },\n ]\n return await throwIfCancelled(\n clack.select<ConfigScope>({\n message: 'Which configs should get their original setup back?',\n options: listEnabledFirst(rows),\n ...io,\n }),\n )\n}\n\nfunction describeRecordedScope(scope: RecordedScope): string {\n return match(scope)\n .with({ kind: 'recorded' }, ({ entries }) => formatList(entries))\n .with({ kind: 'empty' }, () => 'nothing to restore')\n .with({ kind: 'unreadable' }, () => 'could not read its record')\n .exhaustive()\n}\n","import * as clack from '@clack/prompts'\nimport { DEFAULT_SCOPE, type ConfigScope } from '../../shared/platform/platform-context'\nimport { throwIfCancelled } from '../terminal/cancelled-error'\nimport type { PromptIo } from '../terminal/prompt-io'\n\nexport async function selectScope(io: PromptIo): Promise<ConfigScope> {\n return await throwIfCancelled(\n clack.select<ConfigScope>({\n message: 'Where should the configs be written?',\n options: [\n { value: 'user', label: 'User-level', hint: 'applies everywhere' },\n { value: 'project', label: 'Project-level', hint: 'this directory only' },\n ],\n initialValue: DEFAULT_SCOPE,\n ...io,\n }),\n )\n}\n","import * as clack from '@clack/prompts'\nimport { match } from 'ts-pattern'\nimport { throwIfCancelled } from '../terminal/cancelled-error'\nimport type { PromptIo } from '../terminal/prompt-io'\nimport type { HarnessChoice } from './select-harnesses'\n\nexport type TargetChoices = { changing: 'key' | 'model'; agents: readonly HarnessChoice[] }\n\nexport async function selectTargetAgents({ changing, agents }: TargetChoices, io: PromptIo): Promise<string[]> {\n return await throwIfCancelled(\n clack.multiselect<string>({\n message: match(changing)\n .with('key', () => 'Which agents should get the new key?')\n .with('model', () => 'Which agents should get the new model?')\n .exhaustive(),\n options: agents.map((agent) => ({\n value: agent.value,\n label: agent.label,\n hint: agent.hint,\n disabled: agent.isDisabled,\n })),\n initialValues: agents.filter(({ isDisabled }) => !isDisabled).map(({ value }) => value),\n required: true,\n ...io,\n }),\n )\n}\n","import type { Readable, Writable } from 'node:stream'\nimport * as clack from '@clack/prompts'\nimport pc from 'picocolors'\nimport { GLYPHS } from '../glyphs'\nimport type { BackKeysResult } from './back-keys'\nimport { CancelledError } from './cancelled-error'\nimport type { PromptIo } from './prompt-io'\n\nexport interface Spinner {\n start(message: string): void\n stop(message: string): void\n waitFor<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>\n waitForOrBack<T>(task: (signal: AbortSignal) => Promise<T>): Promise<BackKeysResult<T>>\n /**\n * Waits under the same Ctrl-C handling as `waitFor`, drawing nothing and reporting nothing.\n * It owns the terminal while it runs: never overlap it with `start`, or with another spinner on\n * the same terminal, because whichever finishes first clears raw mode and pauses the stream.\n */\n waitQuietly<T>(task: (signal: AbortSignal) => Promise<T>): Promise<T>\n}\n\n// Not clack's spinner: it reads Ctrl-C from stdin itself and answers by exiting the process with 0.\nexport function createSpinner(io: PromptIo): Spinner {\n const taskController = new AbortController()\n const cancelled = new Promise<never>((_resolve, reject) => {\n taskController.signal.addEventListener('abort', () => reject(taskController.signal.reason), { once: true })\n })\n cancelled.catch(() => {})\n\n let isBackAllowed = false\n let stopSpinning: (() => void) | null = null\n const end = (): void => {\n stopSpinning?.()\n stopSpinning = null\n }\n const cancel = (): void => {\n end()\n taskController.abort(new CancelledError())\n }\n const escape = (): void => {\n end()\n taskController.abort(isBackAllowed ? new BackRequestedError() : new CancelledError())\n }\n const keys: CancelKeys = { cancel, escape }\n\n const waitFor = async <T>(task: (signal: AbortSignal) => Promise<T>): Promise<T> => {\n try {\n return await Promise.race([task(taskController.signal), cancelled])\n } catch (error) {\n end()\n throw error\n }\n }\n\n return {\n start: (message) => {\n end()\n stopSpinning = spin({ io, message, keys })\n },\n stop: (message) => {\n if (stopSpinning === null) return\n\n end()\n io.output.write(`${pc.green(clack.S_STEP_SUBMIT)} ${message}\\n`)\n },\n waitFor,\n waitForOrBack: async (task) => {\n isBackAllowed = true\n try {\n return { kind: 'chosen', value: await waitFor(task) }\n } catch (error) {\n if (error instanceof BackRequestedError) return { kind: 'back' }\n throw error\n } finally {\n isBackAllowed = false\n }\n },\n waitQuietly: async (task) => {\n const stopListening = listenForCancel(io, keys)\n try {\n return await waitFor(task)\n } finally {\n stopListening()\n }\n },\n }\n}\n\nclass BackRequestedError extends Error {}\n\ntype CancelKeys = { cancel: () => void; escape: () => void }\n\ntype SpinParams = { io: PromptIo; message: string; keys: CancelKeys }\n\nfunction spin({ io, message, keys }: SpinParams): () => void {\n io.output.write(`${pc.gray(clack.S_BAR)}\\n`)\n const stopAnimating = isTerminalOutput(io.output) ? animate(io.output, message) : () => {}\n const stopListening = listenForCancel(io, keys)\n\n return () => {\n stopListening()\n stopAnimating()\n }\n}\n\nconst FRAMES = clack.unicode ? ['◒', '◐', '◓', '◑'] : ['•', 'o', 'O', '0']\nconst FRAME_INTERVAL_MS = 80\nconst HIDE_CURSOR = '\\u001b[?25l'\nconst SHOW_CURSOR = '\\u001b[?25h'\nconst CLEAR_LINE = '\\r\\u001b[2K'\nconst FRAME_WIDTH = 4\n\nfunction animate(output: TerminalOutput, message: string): () => void {\n const text = fitToWidth(message, output.columns)\n let frameIndex = 0\n const drawFrame = (): void => {\n output.write(`${CLEAR_LINE}${pc.magenta(FRAMES[frameIndex % FRAMES.length] ?? '')} ${text}`)\n frameIndex += 1\n }\n\n output.write(HIDE_CURSOR)\n drawFrame()\n const timer = setInterval(drawFrame, FRAME_INTERVAL_MS)\n return () => {\n clearInterval(timer)\n output.write(`${CLEAR_LINE}${SHOW_CURSOR}`)\n }\n}\n\nfunction fitToWidth(text: string, columns: number): string {\n const width = columns - FRAME_WIDTH\n if (width <= 0 || text.length <= width) return text\n\n return `${text.slice(0, width - GLYPHS.elided.length)}${GLYPHS.elided}`\n}\n\nconst CTRL_C = '\\u0003'\nconst ESCAPE = '\\u001b'\n\nfunction listenForCancel({ input, onInterrupt }: PromptIo, { cancel, escape }: CancelKeys): () => void {\n const stopInterruptListening = onInterrupt(cancel)\n if (!isTerminalInput(input)) return stopInterruptListening\n\n const onData = (chunk: Buffer | string): void => {\n const keystrokes = String(chunk)\n if (keystrokes.includes(CTRL_C)) cancel()\n else if (keystrokes === ESCAPE) escape()\n }\n input.setRawMode(true)\n input.on('data', onData)\n input.resume()\n return () => {\n stopInterruptListening()\n input.removeListener('data', onData)\n input.setRawMode(false)\n input.pause()\n }\n}\n\ntype TerminalInput = Readable & { setRawMode(isRaw: boolean): unknown }\n\nfunction isTerminalInput(input: Readable): input is TerminalInput {\n return 'isTTY' in input && input.isTTY === true && 'setRawMode' in input && typeof input.setRawMode === 'function'\n}\n\ntype TerminalOutput = Writable & { columns: number }\n\nfunction isTerminalOutput(output: Writable): output is TerminalOutput {\n return 'isTTY' in output && output.isTTY === true && 'columns' in output && typeof output.columns === 'number'\n}\n","import type { LaunchingHarness } from '../harnesses/harness'\nimport type { ConfigScope } from '../shared/platform/platform-context'\nimport { cancel, createLog, dim, intro, note, outro, printLines, writeError, type Log } from './output'\nimport { confirm } from './prompts/confirm'\nimport { askForKey, type AskForKeyParams } from './prompts/key/ask-for-key'\nimport { askForNewKey } from './prompts/key/ask-for-new-key'\nimport { askKeyName, type AskKeyNameParams } from './prompts/key/ask-key-name'\nimport { chooseKeySource, type ChooseKeySourceParams, type KeySourceChoice } from './prompts/key/choose-key-source'\nimport {\n chooseOnFetchFailure,\n chooseOnKeyRejected,\n type KeyCheckFallback,\n type FetchFailureChoice,\n type KeyRejectedChoice,\n} from './prompts/key/choose-on-failed-key-check'\nimport {\n chooseOnSavedKeyRejected,\n type ChooseOnSavedKeyRejectedParams,\n type RejectedKeyChoice,\n} from './prompts/key/choose-on-saved-key-rejected'\nimport { selectMenuItem, type MenuItem, type MenuItemId } from './prompts/menu/select-menu-item'\nimport { askForModelId } from './prompts/model/ask-for-model-id'\nimport {\n chooseOnModelProbeFailure,\n type ChooseOnModelProbeFailureParams,\n type ModelProbeFailureChoice,\n} from './prompts/model/choose-on-model-probe-failure'\nimport { chooseSavedModel } from './prompts/model/choose-saved-model'\nimport type { ModelChoices, ModelSuggestion } from './prompts/model/model-choices'\nimport { selectModel } from './prompts/model/select-model'\nimport { selectChangeScope, type SelectChangeScopeParams } from './prompts/select-change-scope'\nimport { selectHarnesses, type HarnessChoice } from './prompts/select-harnesses'\nimport { selectLaunchAgent, type LaunchAgentChoice } from './prompts/select-launch-agent'\nimport { selectRestoreHarnesses, type RestoreChoice } from './prompts/select-restore-harnesses'\nimport { selectRestoreScope, type SelectRestoreScopeParams } from './prompts/select-restore-scope'\nimport { selectScope } from './prompts/select-scope'\nimport { selectTargetAgents, type TargetChoices } from './prompts/select-target-agents'\nimport type { PromptIo } from './terminal/prompt-io'\nimport { createSpinner, type Spinner } from './terminal/spinner'\n\nexport interface TerminalUi {\n intro(message: string): void\n outro(message: string): void\n cancel(message: string): void\n log: Log\n print(lines: readonly string[]): void\n writeError(message: string): void\n dim(message: string): void\n note(message: string, title: string): void\n spinner(): Spinner\n selectScope(): Promise<ConfigScope>\n selectChangeScope(params: SelectChangeScopeParams): Promise<ConfigScope>\n selectHarnesses(choices: readonly HarnessChoice[]): Promise<string[]>\n selectTargetAgents(choices: TargetChoices): Promise<string[]>\n askForKey(params: AskForKeyParams): Promise<string>\n askForNewKey(): Promise<string>\n chooseKeySource(params: ChooseKeySourceParams): Promise<KeySourceChoice>\n chooseOnSavedKeyRejected(params: ChooseOnSavedKeyRejectedParams): Promise<RejectedKeyChoice>\n confirm(message: string, shouldDefaultToYes: boolean): Promise<boolean>\n askKeyName(params: AskKeyNameParams): Promise<string>\n chooseSavedModel(defaults: readonly ModelSuggestion[]): Promise<string | undefined>\n selectModel(choices: ModelChoices): Promise<string>\n askForModelId(): Promise<string>\n chooseOnKeyRejected(fallback: KeyCheckFallback): Promise<KeyRejectedChoice>\n chooseOnFetchFailure(fallback: KeyCheckFallback): Promise<FetchFailureChoice>\n chooseOnModelProbeFailure(params: ChooseOnModelProbeFailureParams): Promise<ModelProbeFailureChoice>\n selectRestoreScope(params: SelectRestoreScopeParams): Promise<ConfigScope>\n selectRestoreHarnesses(choices: readonly RestoreChoice[]): Promise<string[]>\n selectLaunchAgent(choices: readonly LaunchAgentChoice[]): Promise<LaunchingHarness>\n selectMenuItem(items: readonly MenuItem[]): Promise<MenuItemId>\n}\n\nexport function createTerminalUi(io: PromptIo): TerminalUi {\n return {\n intro: (message) => intro(message, io),\n outro: (message) => outro(message, io),\n cancel: (message) => cancel(message, io),\n log: createLog(io),\n print: (lines) => printLines(lines, io),\n writeError: (message) => writeError(message, io),\n dim: (message) => dim(message, io),\n note: (message, title) => note(message, title, io),\n spinner: () => createSpinner(io),\n selectScope: () => selectScope(io),\n selectChangeScope: (params) => selectChangeScope(params, io),\n selectHarnesses: (choices) => selectHarnesses(choices, io),\n selectTargetAgents: (choices) => selectTargetAgents(choices, io),\n askForKey: (params) => askForKey(params, io),\n askForNewKey: () => askForNewKey(io),\n chooseKeySource: (params) => chooseKeySource(params, io),\n chooseOnSavedKeyRejected: (params) => chooseOnSavedKeyRejected(params, io),\n confirm: (message, shouldDefaultToYes) => confirm(message, shouldDefaultToYes, io),\n askKeyName: (params) => askKeyName(params, io),\n chooseSavedModel: (defaults) => chooseSavedModel(defaults, io),\n selectModel: (choices) => selectModel(choices, io),\n askForModelId: () => askForModelId(io),\n chooseOnKeyRejected: (fallback) => chooseOnKeyRejected(fallback, io),\n chooseOnFetchFailure: (fallback) => chooseOnFetchFailure(fallback, io),\n chooseOnModelProbeFailure: (params) => chooseOnModelProbeFailure(params, io),\n selectRestoreScope: (params) => selectRestoreScope(params, io),\n selectRestoreHarnesses: (choices) => selectRestoreHarnesses(choices, io),\n selectLaunchAgent: (choices) => selectLaunchAgent(choices, io),\n selectMenuItem: (items) => selectMenuItem(items, io),\n }\n}\n","import type { EventEmitter } from 'node:events'\nimport type { Key } from 'node:readline'\n\nconst INTERRUPT_KEY_NAME = 'c'\n\n/**\n * Clack and the spinner cancel on Esc and on Ctrl-C alike; the last keypress tells a Ctrl-C apart. Readline emits\n * Ctrl-C at once, before the cancel lands, while it holds an Esc back until its escape-code timeout.\n */\nexport function trackInterruptKey(input: EventEmitter): () => boolean {\n let isInterrupt = false\n input.on('keypress', (_character: string | undefined, key: Key | undefined) => {\n isInterrupt = key?.ctrl === true && key.name === INTERRUPT_KEY_NAME\n })\n return () => isInterrupt\n}\n"],"mappings":"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","names":["path","pc","v","v","text","masker","fetch","text","v","fetch","masker","path","text","v","v","text","masker","fetch","masker","exchange","text","v","fetch","masker","authorize","send","text","match","masker","match","v","match","text","text","secret","match","fs","match","match","fs","v","match","match","refuse","match","path","match","v","path","path","v","text","match","v","match","text","text","fs","fs","BYTE_ORDER_MARK","text","match","path","settings","path","match","v","fs","fs","fs","fs","readCredentials","match","path","OptionalTextSchema","path","match","text","DEFAULT_LINE_ENDING","readSource","restoreKey","match","path","BINARY","API_KEY_VARIABLE","CONFIG_DIRECTORY","path","text","BINARY","BASE_URL_VARIABLE","API_KEY_VARIABLE","MODEL_VARIABLE","path","match","v","BINARY","PROVIDER_ID","PROVIDER_NAME","PROVIDER_TYPE","resolveConfigPath","planConfig","inspectConfig","path","match","path","match","v","BINARY","resolveConfigPath","inspectConfig","RUN_PROVIDER_ID","readProviderKey","readProviderSecrets","path","match","planConfig","listUpdates","ConfigSchema","PROVIDER_ID","PROVIDER_NAME","CONFIG_SCHEMA_URL","ProvidersSchema","ProviderKeySchema","OptionalTextSchema","path","v","BINARY","PROVIDER_ID","PROVIDER_NAME","detectBinary","planSettings","inspectConfig","readProviderKey","readProviderSecrets","path","resolveSettingsPath","SettingsSchema","settings","ProvidersSchema","ProviderKeySchema","path","match","v","BINARY","AUTH_TYPE","resolveSettingsPath","planSettings","inspectSettings","readProviderKey","readProviderSecrets","USER_DIRECTORY","SETTINGS_FILE","match","path","listUpdates","SettingsSchema","settings","masker","v","MS_PER_SECOND","send","nodeRandomBytes","match","nodeRandomBytes","buildAuthorizeUrl","confirm","match","text","match","masker","listen","sessionStore","fetch","masker","sessionStore","authorize","masker","path","match","pc","P","match","text","match","match","pc","text","pc","text","userEnvironment","masker","pc","userEnvironment","masker","pc","note","match","P","pc","P","match","match","path","path","path","path","match","pc","pc","masker","match","P","pc","note","userEnvironment","match","P","v","match","P","match","P","keystore","masker","match","P","check","randomUUID","fs","path","v","path","JSON_INDENT","text","fs","randomUUID","match","v","match","match","P","masker","match","P","harnesses","masker","harnesses","path","fs","path","fs","path","fs","path","fs","fs","path","fs","fs","path","fs","match","fs","path","v","runPowerShell","userEnvironment","fallback","fs","path","isDeepStrictEqual","LINE_BREAK","text","match","match","text","userEnvironment","isDeepStrictEqual","hasOwnEnvChange","text","record","isSamePath","path","fs","path","v","record","text","hasEnvVariables","JSON_INDENT","fs","path","path","match","match","path","record","userEnvironment","writeUserEnvironment","writtenFiles","path","record","userEnvironment","masker","report","plan","outro","saveKey","harnesses","match","match","match","text","match","path","path","match","masker","NO_KEY","match","match","match","v","match","P","match","match","masker","match","v","OptionalTextSchema","ModelSchema","masker","fetch","text","detail","match","P","match","pc","pc","masker","fetch","match","masker","keystore","sessionStore","fetch","match","match","match","P","match","masker","fetch","classifyRejection","match","P","P","match","PING_TEXT","masker","fetch","classifyRejection","match","P","masker","fetch","match","masker","fetch","masker","match","masker","match","pickModel","masker","masker","match","keystore","sessionStore","masker","match","match","runNpm","masker","fetch","masker","keystore","sessionStore","fetch","runNpm","match","keystore","sessionStore","masker","fetch","sessionStore","masker","fetch","readSavedKeyLabel","keystore","match","path","match","pc","userEnvironment","masker","pc","pc","P","match","formatOutcome","formatBackups","formatSummary","pc","masker","match","P","userEnvironment","fs","path","record","harnesses","replanEnvFile","writtenFiles","path","fs","userEnvironment","userEnvironmentNames","addUserEnvironmentWarningTo","record","path","match","hasEnvVariables","record","userEnvironment","addUserEnvironmentWarning","planEnvFile","restoreFile","match","path","record","masker","record","outro","harnesses","userEnvironment","labelOf","path","match","runNpm","pc","masker","pc","findIneligibility","isInstallable","FAILED","masker","keystore","sessionStore","fetch","check","hasRestoreRecord","masker","record","masker","FAILED","match","pc","pc","report","masker","describeEnvFile","path","JSON_INDENT","HEX_RADIX","report","masker","match","collectEnvVariables","report","match","error","masker","path","masker","path","keystore","sessionStore","record","readRecord","masker","report","fetch","fs","path","OWNER_ONLY_MODE","fs","match","path","PATH_VARIABLE","finish","randomUUID","randomUUID","keychain","v","keychain","readSession","text","clack","pc","intro","outro","cancel","note","clack","confirm","clack","value","clack","value","clack","clack","match","match","match","clack","match","fallback","match","clack","clack","clack","clack","pc","pc","clack","clack","clack","clack","pc","pc","text","log","object","clack","describeConfigured","clack","selectHarnesses","clack","clack","clack","match","match","clack","clack","match","selectTargetAgents","match","clack","pc","cancel","pc","text","intro","outro","cancel","note","selectHarnesses","selectTargetAgents","confirm","fallback","pc","path"]}