{"version":3,"sources":["../src/docker/mergeServerYaml.ts"],"sourcesContent":["// Upsert flat `key: value` lines into server.yaml without clobbering unrelated\n// keys. The docker entrypoint used to rewrite the whole file on every boot,\n// which wiped operator-added settings (claude_flags, feature_flags, …) that\n// survived on the Fly volume. This merge keeps those lines and only touches\n// the keys the container must own (api_key, public_url, browse_root).\n//\n// Same encoding rules as src/auth.ts setConfigValue: one line per key, atomic\n// tmp+rename, mode 0600. Compiled by tsup to dist/merge-server-yaml.cjs.\nimport { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n/**\n * Upsert each key in `values` into the flat server.yaml at `filePath`.\n * Existing unrelated keys are preserved. Missing file → created.\n */\nexport function mergeServerYaml(filePath: string, values: Record<string, string>): void {\n  mkdirSync(dirname(filePath), { recursive: true });\n\n  let content = \"\";\n  try {\n    content = readFileSync(filePath, \"utf-8\");\n  } catch (err) {\n    if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n  }\n\n  let updated = content;\n  for (const [key, value] of Object.entries(values)) {\n    if (!/^[a-z_][a-z0-9_]*$/i.test(key)) {\n      throw new Error(`refusing to write invalid server.yaml key: ${key}`);\n    }\n    // Values must stay on one line — newlines would break the regex readers.\n    if (/[\\r\\n]/.test(value)) {\n      throw new Error(`refusing to write multi-line value for server.yaml key: ${key}`);\n    }\n    const lineRe = new RegExp(`^${key}:\\\\s*.*$\\\\n?`, \"m\");\n    const line = `${key}: ${value}`;\n    if (lineRe.test(updated)) {\n      updated = updated.replace(lineRe, `${line}\\n`);\n    } else if (updated.length === 0 || updated.endsWith(\"\\n\")) {\n      updated = `${updated}${line}\\n`;\n    } else {\n      updated = `${updated}\\n${line}\\n`;\n    }\n  }\n\n  const tmpFile = `${filePath}.tmp`;\n  writeFileSync(tmpFile, updated, { encoding: \"utf-8\", mode: 0o600 });\n  chmodSync(tmpFile, 0o600);\n  renameSync(tmpFile, filePath);\n}\n\nfunction main(): void {\n  const filePath = process.env.SERVER_YAML_PATH;\n  if (!filePath) {\n    console.error(\"[entrypoint] merge-server-yaml: SERVER_YAML_PATH is not set\");\n    process.exit(1);\n  }\n\n  const values: Record<string, string> = {};\n  for (const arg of process.argv.slice(2)) {\n    const eq = arg.indexOf(\"=\");\n    if (eq <= 0) {\n      console.error(`[entrypoint] merge-server-yaml: expected key=value, got: ${arg}`);\n      process.exit(1);\n    }\n    values[arg.slice(0, eq)] = arg.slice(eq + 1);\n  }\n  if (Object.keys(values).length === 0) {\n    console.error(\"[entrypoint] merge-server-yaml: no key=value arguments provided\");\n    process.exit(1);\n  }\n\n  try {\n    mergeServerYaml(filePath, values);\n  } catch (err) {\n    console.error(`[entrypoint] ${(err as Error).message}`);\n    process.exit(1);\n  }\n}\n\nif (require.main === module) {\n  main();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,qBAA8E;AAC9E,uBAAwB;AAMjB,SAAS,gBAAgB,UAAkB,QAAsC;AACtF,oCAAU,0BAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAEhD,MAAI,UAAU;AACd,MAAI;AACF,kBAAU,6BAAa,UAAU,OAAO;AAAA,EAC1C,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,OAAM;AAAA,EAC9D;AAEA,MAAI,UAAU;AACd,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,CAAC,sBAAsB,KAAK,GAAG,GAAG;AACpC,YAAM,IAAI,MAAM,8CAA8C,GAAG,EAAE;AAAA,IACrE;AAEA,QAAI,SAAS,KAAK,KAAK,GAAG;AACxB,YAAM,IAAI,MAAM,2DAA2D,GAAG,EAAE;AAAA,IAClF;AACA,UAAM,SAAS,IAAI,OAAO,IAAI,GAAG,gBAAgB,GAAG;AACpD,UAAM,OAAO,GAAG,GAAG,KAAK,KAAK;AAC7B,QAAI,OAAO,KAAK,OAAO,GAAG;AACxB,gBAAU,QAAQ,QAAQ,QAAQ,GAAG,IAAI;AAAA,CAAI;AAAA,IAC/C,WAAW,QAAQ,WAAW,KAAK,QAAQ,SAAS,IAAI,GAAG;AACzD,gBAAU,GAAG,OAAO,GAAG,IAAI;AAAA;AAAA,IAC7B,OAAO;AACL,gBAAU,GAAG,OAAO;AAAA,EAAK,IAAI;AAAA;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,UAAU,GAAG,QAAQ;AAC3B,oCAAc,SAAS,SAAS,EAAE,UAAU,SAAS,MAAM,IAAM,CAAC;AAClE,gCAAU,SAAS,GAAK;AACxB,iCAAW,SAAS,QAAQ;AAC9B;AAEA,SAAS,OAAa;AACpB,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,CAAC,UAAU;AACb,YAAQ,MAAM,6DAA6D;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAiC,CAAC;AACxC,aAAW,OAAO,QAAQ,KAAK,MAAM,CAAC,GAAG;AACvC,UAAM,KAAK,IAAI,QAAQ,GAAG;AAC1B,QAAI,MAAM,GAAG;AACX,cAAQ,MAAM,4DAA4D,GAAG,EAAE;AAC/E,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,IAAI,MAAM,KAAK,CAAC;AAAA,EAC7C;AACA,MAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC,YAAQ,MAAM,iEAAiE;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,oBAAgB,UAAU,MAAM;AAAA,EAClC,SAAS,KAAK;AACZ,YAAQ,MAAM,gBAAiB,IAAc,OAAO,EAAE;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,IAAI,QAAQ,SAAS,QAAQ;AAC3B,OAAK;AACP;","names":[]}