{"version":3,"file":"options.mjs","names":[],"sources":["../../../src/cli/server/options.ts"],"sourcesContent":["import type { ServeOptions } from '../../builders/server/types';\nexport type { ServeOptions } from '../../builders/server/types';\nexport {\n  resolveSessionIdentity,\n  relaunchAgentArgs,\n  type SessionIdentity,\n} from '../../builders/server/sessionArguments';\nconst TOKEN_FILE_OPTION = '--auth-token-file';\nconst WEB_OPTION = '--web';\nconst NAME_OPTION = '--name';\nconst SESSION_ID_OPTION = '--session-id';\nconst AGENT_SEPARATOR = '--';\nconst DEFAULT_WEB_PORT = 7433;\nconst DEFAULT_SESSION_NAME = 'untitled';\n\nexport const SERVE_USAGE = `doompi-server ${TOKEN_FILE_OPTION} <file> [--no-session] [${NAME_OPTION} <name>] [${SESSION_ID_OPTION} <id>] [${WEB_OPTION} [port]] [${AGENT_SEPARATOR} <agent arguments>]`;\n\n/**\n * Parses the server's own arguments, leaving the agent's untouched.\n *\n * The token is read from a file rather than a flag because command arguments are visible to other local processes.\n */\nexport function parseServeOptions(argv: readonly string[]): ServeOptions {\n  let noSession = false;\n  let tokenFile: string | undefined;\n  let webPort = DEFAULT_WEB_PORT;\n  let sessionName: string | undefined;\n  let sessionId: string | undefined;\n  const agentArgs: string[] = [];\n\n  for (let index = 0; index < argv.length; index += 1) {\n    const argument = argv[index];\n    if (argument === '--no-session') {\n      noSession = true;\n      continue;\n    }\n    if (argument === AGENT_SEPARATOR) {\n      agentArgs.push(...argv.slice(index + 1));\n      break;\n    }\n    if (argument === WEB_OPTION) {\n      // The port is optional, so only consume the next token when it reads as\n      // one; otherwise it belongs to whatever flag follows.\n      const value = argv[index + 1];\n      if (value !== undefined && /^\\d+$/u.test(value)) {\n        const parsed = Number.parseInt(value, 10);\n        if (parsed < 1 || parsed > 65535) throw new Error(`${WEB_OPTION} expects a port number, received \"${value}\".`);\n        webPort = parsed;\n        index += 1;\n      } else {\n        webPort = DEFAULT_WEB_PORT;\n      }\n      continue;\n    }\n    if (argument === TOKEN_FILE_OPTION || argument === NAME_OPTION || argument === SESSION_ID_OPTION) {\n      const value = argv[index + 1];\n      if (value === undefined || value.startsWith('-')) throw new Error(`${argument} requires a value.`);\n      if (argument === TOKEN_FILE_OPTION) tokenFile = value;\n      else if (argument === NAME_OPTION) sessionName = value;\n      else {\n        if (value.includes('/')) throw new Error(`${SESSION_ID_OPTION} must not contain \"/\".`);\n        sessionId = value;\n      }\n      index += 1;\n      continue;\n    }\n    throw new Error(`Unknown option ${argument}. Usage: ${SERVE_USAGE}`);\n  }\n\n  if (!tokenFile) throw new Error(`${TOKEN_FILE_OPTION} is required. Usage: ${SERVE_USAGE}`);\n  return {\n    ...(noSession ? { noSession: true } : {}),\n    tokenFile,\n    agentArgs,\n    webPort,\n    sessionName: sessionName ?? DEFAULT_SESSION_NAME,\n    sessionId,\n  };\n}\n"],"mappings":";;AAOA,MAAM,oBAAoB;AAC1B,MAAM,aAAa;AACnB,MAAM,cAAc;AACpB,MAAM,oBAAoB;AAC1B,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AACzB,MAAM,uBAAuB;AAE7B,MAAa,cAAc,iBAAiB,kBAAkB,0BAA0B,YAAY,YAAY,kBAAkB,UAAU,WAAW,YAAY,gBAAgB;;;;;;AAOnL,SAAgB,kBAAkB,MAAuC;CACvE,IAAI,YAAY;CAChB,IAAI;CACJ,IAAI,UAAU;CACd,IAAI;CACJ,IAAI;CACJ,MAAM,YAAsB,CAAC;CAE7B,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,WAAW,KAAK;EACtB,IAAI,aAAa,gBAAgB;GAC/B,YAAY;GACZ;EACF;EACA,IAAI,aAAa,iBAAiB;GAChC,UAAU,KAAK,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC;GACvC;EACF;EACA,IAAI,aAAa,YAAY;GAG3B,MAAM,QAAQ,KAAK,QAAQ;GAC3B,IAAI,UAAU,KAAA,KAAa,SAAS,KAAK,KAAK,GAAG;IAC/C,MAAM,SAAS,OAAO,SAAS,OAAO,EAAE;IACxC,IAAI,SAAS,KAAK,SAAS,OAAO,MAAM,IAAI,MAAM,GAAG,WAAW,oCAAoC,MAAM,GAAG;IAC7G,UAAU;IACV,SAAS;GACX,OACE,UAAU;GAEZ;EACF;EACA,IAAI,aAAa,qBAAqB,aAAa,eAAe,aAAa,mBAAmB;GAChG,MAAM,QAAQ,KAAK,QAAQ;GAC3B,IAAI,UAAU,KAAA,KAAa,MAAM,WAAW,GAAG,GAAG,MAAM,IAAI,MAAM,GAAG,SAAS,mBAAmB;GACjG,IAAI,aAAa,mBAAmB,YAAY;QAC3C,IAAI,aAAa,aAAa,cAAc;QAC5C;IACH,IAAI,MAAM,SAAS,GAAG,GAAG,MAAM,IAAI,MAAM,GAAG,kBAAkB,uBAAuB;IACrF,YAAY;GACd;GACA,SAAS;GACT;EACF;EACA,MAAM,IAAI,MAAM,kBAAkB,SAAS,WAAW,aAAa;CACrE;CAEA,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,GAAG,kBAAkB,uBAAuB,aAAa;CACzF,OAAO;EACL,GAAI,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;EACvC;EACA;EACA;EACA,aAAa,eAAe;EAC5B;CACF;AACF"}