{"version":3,"file":"run-S6Hkmn-h.cjs","names":["process","isCIEnvironment","x","isCIEnvironment","process","createSpinner","pairAgent","path","process","hostname","getMachineId","styleText","isRichOutput","writeCredentials","getCredentialsPath","PairingCanceledError","AgentPermission","toPermissionFlag","KUBB_CONFIG_FILENAME","isCIEnvironment","canUseTTY","prompts","getConfigs","Diagnostics","readCredentials","Hookable","logLevelMap","cliReporter","plainWriter","connectAgent","InvalidAgentTokenError","clearCredentials","defaultStudioUrl","trackRun","toError"],"sources":["../../../internals/utils/src/copyToClipboard.ts","../../../internals/utils/src/openInBrowser.ts","../src/runners/studio/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { x } from 'tinyexec'\nimport { isCIEnvironment } from './isCIEnvironment.ts'\n\nconst COMMANDS: Partial<Record<NodeJS.Platform, [string, ...Array<string>]>> = {\n  darwin: ['pbcopy'],\n  win32: ['clip.exe'],\n  linux: ['xclip', '-selection', 'clipboard'],\n}\n\n/**\n * Copies text to the system clipboard with the platform's own tool. Resolves `false` in CI, on a\n * platform without a known tool, or when the tool is missing or fails.\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n  // Wayland sessions have no X selection for xclip to serve, so they use `wl-copy`.\n  const command = process.platform === 'linux' && process.env.WAYLAND_DISPLAY ? (['wl-copy'] as const) : COMMANDS[process.platform]\n  if (!command || isCIEnvironment()) return false\n\n  const [name, ...args] = command\n  // stdout and stderr are ignored: xclip and wl-copy stay alive to serve the selection and would hold open pipes until the timeout.\n  const run = x(name, args, { timeout: 2_000, nodeOptions: { stdio: ['pipe', 'ignore', 'ignore'] } })\n  // A missing tool closes stdin before the write lands; the rejection below reports it.\n  run.process?.stdin?.once('error', () => {})\n  run.process?.stdin?.end(text)\n\n  return run.then(\n    ({ exitCode }) => exitCode === 0,\n    () => false,\n  )\n}\n","import process from 'node:process'\nimport { x } from 'tinyexec'\nimport { isCIEnvironment } from './isCIEnvironment.ts'\n\nconst ignore = () => {}\n\n/**\n * Opens a URL or local file in the default browser, unless running in CI.\n */\nexport function openInBrowser(target: string): void {\n  if (isCIEnvironment()) return\n\n  if (process.platform === 'win32') {\n    x('cmd', ['/c', 'start', '', target]).then(ignore, ignore)\n    return\n  }\n  x(process.platform === 'darwin' ? 'open' : 'xdg-open', [target]).then(ignore, ignore)\n}\n","import { hostname } from 'node:os'\nimport { toPermissionFlag } from '../../ui/text.ts'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as prompts from '@clack/prompts'\nimport { KUBB_CONFIG_FILENAME } from '@internals/shared'\nimport { copyToClipboard, isCIEnvironment, openInBrowser, toError } from '@internals/utils'\nimport type { CLIOptions, Config } from '@kubb/core'\nimport { cliReporter, Diagnostics, Hookable, type KubbHooks, logLevel as logLevelMap } from '@kubb/core'\nimport { connectAgent, defaultStudioUrl, InvalidAgentTokenError, pairAgent, PairingCanceledError } from '@kubb/studio'\nimport { AgentPermission } from '@kubb/studio/protocol'\nimport { trackRun } from '../../Telemetry.ts'\nimport { plainWriter } from '../../loggers/plainWriter.ts'\nimport setupReporters from '../../loggers/reporters.ts'\nimport { logIntro, logOutro, logTip } from '../../ui/intro.ts'\nimport { logBlock, logStep } from '../../ui/log.ts'\nimport { createSpinner } from '../../ui/spinner.ts'\nimport { canUseTTY, isRichOutput } from '../../utils/env.ts'\nimport { getConfigs } from '../../config.ts'\nimport { clearCredentials, type Credentials, getCredentialsPath, getMachineId, readCredentials, writeCredentials } from './credentials.ts'\nimport { version } from '../../../package.json'\n\nexport type StudioOptions = {\n  /**\n   * Current `@kubb/cli` version, reported to Studio and used for the telemetry payload.\n   */\n  version: string\n  configPath?: string\n  /**\n   * Base URL of the Studio instance, for a self-hosted deployment. Resolved before it reaches here,\n   * since stored credentials are bound to it.\n   */\n  studioUrl: string\n  /**\n   * What Studio may do in this project. Each flag grants outright; the rest are asked once per\n   * project through {@link resolvePermissions}.\n   */\n  permission: Record<AgentPermission, boolean>\n  /**\n   * Whether to open the approval page in a browser during pairing.\n   */\n  autoOpen: boolean\n  logLevel?: CLIOptions['logLevel']\n}\n\nexport type SnapshotOptions = Pick<StudioOptions, 'configPath' | 'studioUrl' | 'logLevel'> & {\n  /**\n   * Organization CI API key. Falls back to `KUBB_TOKEN`.\n   */\n  token?: string\n  /**\n   * Stable identity for the CI agent. Falls back to CI auto-detection.\n   */\n  id?: string\n  /** Identity of another CI agent to also compare with. Falls back to CI auto-detection. */\n  baseId?: string\n  /**\n   * Package name for the generated tarball. Falls back to the nearest package.json.\n   */\n  name?: string\n  /**\n   * Package version for the generated tarball. Falls back to the nearest package.json.\n   */\n  packageVersion?: string\n  /**\n   * Print the result as one JSON object instead of a summary.\n   */\n  json?: boolean\n}\n\n/** The flags a `kubb studio` subcommand parsed; each one is optional since a subcommand declares only the flags it uses. */\nexport type StudioValues = {\n  config?: string\n  url?: string\n  allowRead?: boolean\n  allowReadAst?: boolean\n  allowWrite?: boolean\n  allowConfigEdit?: boolean\n  allowInstall?: boolean\n  allowUpdate?: boolean\n  allowRemove?: boolean\n  allowSaveInput?: boolean\n  allowExec?: boolean\n  open?: boolean\n  logLevel?: CLIOptions['logLevel']\n}\n\ntype LoginOptions = {\n  /**\n   * Aborting this cancels an in-flight pairing request or poll and rejects with\n   * {@link PairingCanceledError}. Wired to `kubb studio`'s shutdown signal, so Ctrl+C during\n   * pairing cancels it instead of leaving the poll running.\n   */\n  signal?: AbortSignal\n  /**\n   * Credentials from before this login. When the fresh pairing resolves to the same agent on the\n   * same Studio, its saved project permissions carry forward instead of being asked again.\n   * Left out for an explicitly requested `kubb studio login`, which always starts clean.\n   */\n  previousCredentials?: Credentials | null\n}\n\n/**\n * Pairs this machine with Studio and stores the resulting token.\n *\n * The CLI holds a code and the browser approves it, rather than the user copying a token out of\n * the UI. The token comes back over the CLI's own HTTPS POST, so it never lands in a URL, a\n * server log, or a `Referer` header.\n */\nexport async function login({ studioUrl, autoOpen }: StudioOptions, { signal, previousCredentials }: LoginOptions = {}): Promise<Credentials> {\n  const spinner = createSpinner()\n  // A retry notice stays on screen a while before the countdown takes the line back.\n  let retryUntil = 0\n  // The spinner only starts once a code is shown.\n  let waiting = false\n  let countdown: NodeJS.Timeout | undefined\n\n  try {\n    const { token, agent } = await pairAgent({\n      studioUrl,\n      type: 'cli',\n      name: path.basename(process.cwd()),\n      hostname: hostname(),\n      machineId: await getMachineId(),\n      signal,\n      onCode: (session) => {\n        logStep(\n          [\n            'Pair this machine',\n            `${styleText('dim', 'Open')}   ${styleText('cyan', session.verification_uri)}`,\n            `${styleText('dim', 'Code')}   ${styleText('bold', session.user_code)}`,\n          ].join('\\n'),\n        )\n\n        if (autoOpen) {\n          openInBrowser(session.verification_uri_complete)\n        }\n\n        // Same fallback as the poll in `@kubb/studio`, so the countdown ends when polling does.\n        const deadline = Date.now() + (session.expires_in > 0 ? session.expires_in : 600) * 1000\n        let copied = false\n        const waitingText = () =>\n          `Waiting for approval  ${styleText('dim', `expires in ${formatCountdown(deadline - Date.now())}${copied ? ' · code copied' : ''} · ctrl+c to cancel`)}`\n        clearInterval(countdown)\n        spinner.start(waitingText())\n        waiting = true\n        // Plain output prints every message, so only an animated spinner ticks.\n        if (isRichOutput()) countdown = setInterval(() => Date.now() > retryUntil && spinner.message(waitingText()), 1000)\n        // Not awaited: the code shows at once, and the spinner picks up the copy when it lands.\n        void copyToClipboard(session.user_code).then((done) => {\n          copied = done\n        })\n      },\n      onRetry: (error) => {\n        retryUntil = Date.now() + 5000\n        spinner.message(`Could not reach Kubb Studio, retrying: ${error.message}`)\n      },\n    })\n    clearInterval(countdown)\n    spinner.stop(`Paired as ${agent.name}${agent.organizationSlug ? ` · org ${agent.organizationSlug}` : ''}`)\n\n    const keepsIdentity = previousCredentials?.studioUrl === studioUrl && previousCredentials.agentId === agent.id\n    const credentials: Credentials = {\n      studioUrl,\n      token,\n      agentId: agent.id,\n      agentSlug: agent.slug,\n      ...(agent.organizationSlug ? { organizationSlug: agent.organizationSlug } : {}),\n      ...(keepsIdentity && previousCredentials?.projects ? { projects: previousCredentials.projects } : {}),\n    }\n    await writeCredentials(credentials)\n\n    console.log(`Credentials stored in ${getCredentialsPath()}`)\n\n    return credentials\n  } catch (error) {\n    clearInterval(countdown)\n    if (waiting) {\n      spinner.stop(error instanceof PairingCanceledError ? 'Pairing canceled' : 'Pairing failed')\n    }\n    throw error\n  }\n}\n\n/** Time left on a pairing code as `m:ss`, never below `0:00`. */\nexport function formatCountdown(ms: number): string {\n  const seconds = Math.max(0, Math.ceil(ms / 1000))\n\n  return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, '0')}`\n}\n\n/**\n * What each permission is asked as, in the order the list shows them.\n */\nconst PERMISSIONS: ReadonlyArray<{\n  key: AgentPermission\n  /**\n   * Short label for status output and the connect summary.\n   */\n  label: string\n  title: (configPath: string) => string\n  hint: string\n}> = [\n  { key: AgentPermission.READ, label: 'read source', title: () => 'Read generated files', hint: 'show code in the browser' },\n  { key: AgentPermission.READ_AST, label: 'read spec', title: () => 'Read the parsed spec', hint: 'browse schemas and operations' },\n  { key: AgentPermission.WRITE, label: 'write files', title: () => 'Write files to disk', hint: 'generate from the browser' },\n  { key: AgentPermission.CONFIG_EDIT, label: 'edit config', title: (configPath) => `Change ${configPath}`, hint: 'edit plugin options' },\n  { key: AgentPermission.INSTALL, label: 'add plugins', title: () => 'Install extensions from the registry', hint: 'kubb add from the browser' },\n  { key: AgentPermission.UPDATE, label: 'update plugins', title: () => 'Update installed extensions', hint: 'kubb update from the browser' },\n  { key: AgentPermission.REMOVE, label: 'remove plugins', title: () => 'Remove extensions', hint: 'kubb remove from the browser' },\n  {\n    key: AgentPermission.SAVE_INPUT,\n    label: 'save input',\n    title: (configPath) => `Save the spec from Studio as the input in ${configPath}`,\n    hint: 'keep a pasted spec, URL, or git file',\n  },\n  { key: AgentPermission.EXEC, label: 'run tools', title: () => 'Run the formatter, linter, and postGenerate', hint: 'after each generation' },\n]\n\n/**\n * Two permissions per row, each marked granted or not, with the flags that grant the missing ones\n * after the last row. For `kubb studio status`.\n */\nexport function formatPermissionRows(granted: Partial<Record<AgentPermission, boolean>>): Array<string> {\n  const width = Math.max(...PERMISSIONS.map(({ label }) => label.length))\n  const cells = PERMISSIONS.map(({ key, label }) => `${granted[key] ? styleText('green', '✓') : styleText('red', '✖')} ${label.padEnd(width)}`)\n  const rows = Array.from({ length: Math.ceil(cells.length / 2) }, (_, index) => cells.slice(index * 2, index * 2 + 2).join('  '))\n  const flags = PERMISSIONS.filter(({ key }) => !granted[key])\n    .map(({ key }) => toPermissionFlag(key))\n    .join(' ')\n\n  return flags ? [...rows.slice(0, -1), `${rows.at(-1)}   ${styleText('dim', flags)}`] : rows\n}\n\n/**\n * Resolves Studio permissions for the current project.\n * Flags win, saved answers are reused, and the rest are asked in one list whose answers are stored\n * in `~/.kubb/credentials.json`.\n */\nexport async function resolvePermissions(\n  options: StudioOptions,\n  credentials: Credentials,\n  configPath: string = KUBB_CONFIG_FILENAME,\n  { edit = false }: { edit?: boolean } = {},\n): Promise<Record<AgentPermission, boolean>> {\n  const project = process.cwd()\n  const remembered = credentials.projects?.[project]\n  const granted = Object.fromEntries(PERMISSIONS.map(({ key }) => [key, options.permission[key] || remembered?.[key] === true])) as Record<\n    AgentPermission,\n    boolean\n  >\n  // `edit` asks again for every permission no flag grants, with the saved ones checked.\n  const pending = PERMISSIONS.filter(({ key }) => !options.permission[key] && (edit || typeof remembered?.[key] !== 'boolean'))\n\n  if (!pending.length || isCIEnvironment() || !canUseTTY()) return granted\n\n  prompts.updateSettings({ withGuide: true })\n  const selected = await prompts.multiselect({\n    message: 'What may Kubb Studio do in this project?',\n    options: pending.map(({ key, title, hint }) => ({ value: key, label: title(configPath), hint })),\n    ...(edit ? { initialValues: pending.filter(({ key }) => remembered?.[key] === true).map(({ key }) => key) } : {}),\n    required: false,\n  })\n  // A canceled list grants nothing and saves nothing, so the next run asks again.\n  if (prompts.isCancel(selected)) {\n    if (edit) throw new Error('Canceled. Permissions are unchanged.')\n    return granted\n  }\n\n  const answers = Object.fromEntries(pending.map(({ key }) => [key, selected.includes(key)]))\n  await writeCredentials({\n    ...credentials,\n    projects: { ...credentials.projects, [project]: { ...remembered, ...answers } },\n  })\n\n  return { ...granted, ...answers }\n}\n\n/**\n * Loads the project's Kubb config the same way `kubb generate` does, one entry per `defineConfig(...)` entry.\n */\nexport async function loadConfigs(options: Pick<StudioOptions, 'configPath' | 'logLevel'>): Promise<{ configPath: string; configs: Array<Config> }> {\n  const { configPath, configs } = await getConfigs({ configPath: options.configPath, logLevel: options.logLevel })\n\n  if (!configs.length) {\n    throw new Diagnostics.Error({\n      code: Diagnostics.code.unknown,\n      severity: 'error',\n      message: 'Config not defined, create a kubb.config.ts or pass it with --config',\n    })\n  }\n\n  // `getConfigs` resolves this to an absolute path. Relativized here, once, so the permission\n  // prompt and the path Studio receives over the wire both show the project-relative form instead\n  // of leaking the local filesystem layout.\n  return { configPath: path.relative(process.cwd(), configPath) || configPath, configs }\n}\n\nexport type PreparedConnection = {\n  configPath: string\n  credentials: Credentials\n  permissions: StudioOptions['permission']\n}\n\n/** Validates the project and resolves pairing and permissions before starting its worker. */\nexport async function prepareConnection(options: StudioOptions, signal?: AbortSignal): Promise<PreparedConnection> {\n  const { configPath } = await loadConfigs(options)\n  const stored = await readCredentials()\n  const credentials = await (async () => {\n    if (stored?.studioUrl === options.studioUrl) return stored\n    if (isCIEnvironment()) {\n      throw new Diagnostics.Error({\n        code: Diagnostics.code.unknown,\n        severity: 'error',\n        message: `Not paired with ${options.studioUrl}. In CI, run \\`kubb studio snapshot\\` instead, or run \\`kubb studio login\\` on a machine with a browser.`,\n      })\n    }\n    return login(options, { signal })\n  })()\n  const permissions = await resolvePermissions(options, credentials, configPath)\n  return { configPath, credentials, permissions }\n}\n\nexport type WorkerState = 'starting' | 'connected' | 'reconnecting' | 'authentication required' | 'stopped'\n\n/** Runs the same project connection in the foreground or in a background worker. */\nexport async function connect(\n  options: StudioOptions,\n  context: {\n    prepared?: PreparedConnection\n    signal?: AbortSignal\n    onState?: (state: WorkerState) => void | Promise<void>\n  } = {},\n): Promise<void> {\n  const shutdown = new AbortController()\n  const signal = context.signal ?? shutdown.signal\n  const stop = () => shutdown.abort()\n  const events = process as unknown as NodeJS.EventEmitter\n  if (!context.signal) {\n    events.once('SIGINT', stop)\n    events.once('SIGTERM', stop)\n  }\n  let unwatch: (() => void) | undefined\n  try {\n    if (!context.prepared) {\n      const { getWorkerStatus } = await import('./background.ts')\n      const worker = await getWorkerStatus()\n      if (worker.running)\n        throw new Diagnostics.Error({\n          code: Diagnostics.code.unknown,\n          severity: 'error',\n          message: 'This project is running in the background. Run `kubb studio stop` first.',\n        })\n    }\n    const prepared = context.prepared ?? (await prepareConnection(options, signal))\n    let { credentials, permissions } = prepared\n    const { configPath } = prepared\n    let hinted = false\n    // Set by a fresh pairing until it connects, so a token rejected right after approval fails the run instead of looping.\n    let pairedAgain = false\n\n    // The background worker writes to a log file, so it gets the plain logger rather than the\n    // animated one. The logger also covers the `studio:*` events and each generation run.\n    const hooks = new Hookable<KubbHooks>()\n    setupReporters(hooks, {\n      logLevel: logLevelMap[options.logLevel ?? 'info'],\n      reporters: [cliReporter],\n      ...(context.onState ? { writer: plainWriter } : {}),\n    })\n    // `b` hands the session to the background worker; only a foreground run in a terminal listens.\n    const listens = !context.onState && process.stdin.isTTY === true && canUseTTY()\n    let background = false\n    hooks.hook('studio:connected', async () => {\n      pairedAgain = false\n      await context.onState?.('connected')\n      if (listens && !unwatch) {\n        unwatch = watchKeys({\n          onBackground: () => {\n            background = true\n            stop()\n          },\n          onStop: stop,\n        })\n      }\n      if (hinted || context.onState || options.logLevel === 'silent') return\n      hinted = true\n      logBlock([\n        `${styleText('dim', 'Project')}  ${path.basename(process.cwd())}   ${styleText(\n          'dim',\n          PERMISSIONS.filter(({ key }) => permissions[key])\n            .map(({ label }) => label)\n            .join(' · ') || 'no permissions',\n        )}`,\n        styleText('dim', listens ? 'Press b to keep running in the background, Ctrl+C to disconnect' : 'Press Ctrl+C to disconnect'),\n      ])\n      logTip()\n    })\n    hooks.hook('studio:reconnecting', () => context.onState?.('reconnecting'))\n\n    for (;;) {\n      try {\n        await connectAgent({\n          token: credentials.token,\n          studioUrl: options.studioUrl,\n          configPath,\n          version: options.version,\n          root: process.cwd(),\n          permissions,\n          loadConfigs: async () => (await loadConfigs(options)).configs,\n          hooks,\n          signal,\n        })\n        break\n      } catch (error) {\n        if (!(error instanceof InvalidAgentTokenError)) throw error\n        await context.onState?.('authentication required')\n        await clearCredentials()\n        if (pairedAgain) throw new Error(`${error.message} Studio rejected the newly approved token too. Run \\`kubb studio login\\` and try again.`)\n        if (context.onState || isCIEnvironment() || !canUseTTY()) throw new Error(`${error.message} Run \\`kubb studio login\\` to pair again.`)\n\n        // The pairing prompts need stdin back.\n        unwatch?.()\n        unwatch = undefined\n        console.log(styleText('yellow', `${error.message} Pairing again...`))\n        credentials = await login(options, { signal, previousCredentials: credentials })\n        pairedAgain = true\n        permissions = await resolvePermissions(options, credentials, configPath)\n      }\n    }\n    // Stops the \"Ready for jobs\" spinner, which would otherwise keep drawing under the closing line.\n    await hooks.callHook('kubb:lifecycle:end')\n    unwatch?.()\n    if (background) {\n      const { startWorker } = await import('./background.ts')\n      await startWorker(options)\n      if (options.logLevel !== 'silent') logOutro('Running in the background · kubb studio stop')\n      return\n    }\n    if (!context.onState && signal.aborted && options.logLevel !== 'silent') logOutro('Disconnected')\n  } catch (error) {\n    if (!(error instanceof PairingCanceledError)) throw error\n  } finally {\n    unwatch?.()\n    events.off('SIGINT', stop)\n    events.off('SIGTERM', stop)\n  }\n}\n\n/**\n * Listens for single keys on a TTY stdin. Raw mode turns Ctrl+C into a key instead of SIGINT, so it\n * is handled here too. Returns the function that restores the terminal, safe to call twice.\n */\nexport function watchKeys({ onBackground, onStop }: { onBackground: () => void; onStop: () => void }): () => void {\n  const stdin = process.stdin\n  const onData = (data: Buffer) => {\n    const key = data.toString()\n    if (key === 'b' || key === 'B') onBackground()\n    if (key === '\\u0003') onStop()\n  }\n  // A clack spinner reads stdin too and exits the process on Ctrl+C, before the session can close\n  // its socket, so its Ctrl+C alias is lifted while these keys are read.\n  const cancelAlias = prompts.settings.aliases.get('\\u0003')\n  prompts.settings.aliases.delete('\\u0003')\n  stdin.setRawMode(true)\n  stdin.on('data', onData)\n  stdin.resume()\n  let restored = false\n\n  return () => {\n    if (restored) return\n    restored = true\n    if (cancelAlias) prompts.settings.aliases.set('\\u0003', cancelAlias)\n    stdin.off('data', onData)\n    stdin.setRawMode(false)\n    stdin.pause()\n  }\n}\n\n/**\n * Runs a Studio command from its parsed flags: builds the {@link StudioOptions}, prints the intro,\n * and reports the run to telemetry. A failure is printed and sets the exit code instead of throwing.\n */\nexport async function runStudio(\n  values: StudioValues,\n  action: (options: StudioOptions) => Promise<unknown>,\n  { block = false, json = false }: { block?: boolean; json?: boolean } = {},\n): Promise<void> {\n  const options: StudioOptions = {\n    version,\n    configPath: values.config,\n    studioUrl: values.url ?? defaultStudioUrl,\n    permission: Object.fromEntries(Object.values(AgentPermission).map((key) => [key, values[key] ?? false])) as Record<AgentPermission, boolean>,\n    autoOpen: values.open ?? true,\n    logLevel: values.logLevel,\n  }\n  const report = trackRun({ command: 'studio', hrStart: process.hrtime() })\n\n  try {\n    if (options.logLevel !== 'silent' && !json) {\n      logIntro({\n        warning: styleText('yellow', 'This feature is still under development, use with caution'),\n        block,\n      })\n    }\n\n    await action(options)\n\n    await report({ status: 'success' })\n  } catch (error) {\n    await report({ status: 'failed' })\n    console.error(toError(error).message)\n    process.exitCode = 1\n  }\n}\n"],"mappings":"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"}