{"version":3,"file":"childProcess.mjs","names":[],"sources":["../../src/schemas/childProcess.ts"],"sourcesContent":["import { type Static, Type } from 'typebox';\nimport { Check, Errors } from 'typebox/value';\n\nexport const SUBAGENT_CHILD_ENV = 'PI_SUBAGENT_CHILD';\nexport const SUBAGENT_PARENT_SESSION_ENV = 'PI_SUBAGENT_PARENT_SESSION';\nexport const SUBAGENT_ROOT_SESSION_ENV = 'PI_SUBAGENT_ROOT_SESSION';\nexport const DOOM_CHILD_PROCESS_CONTEXT_ENV = 'DOOM_CHILD_PROCESS_CONTEXT_V1';\n/** Marks a process whose caller already supplied its complete Doom extension set. */\nexport const DOOMPI_EXTENSIONS_PROVIDED_ENV = 'DOOMPI_EXTENSIONS_PROVIDED';\n/** Marks a process that already composed its own extension set from the command line. */\nexport const DOOMPI_COMPOSED_ENV = 'DOOMPI_COMPOSED';\n\nconst COMPOSED_FLAG = '1';\n\n/**\n * True when this process already applied the command line, so a reload does not.\n *\n * Extensions read this to tell a synchronized session from a launcher one, which\n * changes what they can promise the user about a pending selection.\n */\nexport function alreadyComposed(environment: NodeJS.ProcessEnv = process.env): boolean {\n  return environment[DOOMPI_COMPOSED_ENV] === COMPOSED_FLAG;\n}\n\nexport function resolveRootSessionId(\n  currentSessionId: string,\n  environment: Readonly<Record<string, string | undefined>> = process.env,\n): string {\n  const inherited = environment[SUBAGENT_ROOT_SESSION_ENV]?.trim();\n  if (inherited) return inherited;\n  const current = currentSessionId.trim();\n  if (!current) throw new Error('A root session requires a non-empty current session id.');\n  return current;\n}\n\nexport const ChildProcessContextSchema = Type.Object(\n  {\n    parentSessionId: Type.String({ minLength: 1 }),\n    workingDirectory: Type.String({ minLength: 1 }),\n    mode: Type.Optional(Type.String({ minLength: 1 })),\n  },\n  { additionalProperties: false },\n);\nexport type ChildProcessContext = Static<typeof ChildProcessContextSchema>;\n\nexport function encodeChildProcessContext(context: ChildProcessContext): string {\n  return JSON.stringify(context);\n}\n\nexport function decodeChildProcessContext(serialized: string): ChildProcessContext {\n  const parsed: unknown = JSON.parse(serialized);\n  if (!Check(ChildProcessContextSchema, parsed)) {\n    const details = Errors(ChildProcessContextSchema, parsed)\n      .map((error) => error.message)\n      .join('; ');\n    throw new Error(`Invalid child process context: ${details}`);\n  }\n  return parsed;\n}\n\nexport function childProcessContextEnvironment(context: ChildProcessContext): Record<string, string> {\n  return { [DOOM_CHILD_PROCESS_CONTEXT_ENV]: encodeChildProcessContext(context) };\n}\n\nexport function readChildProcessContext(\n  environment: Readonly<Record<string, string | undefined>>,\n): ChildProcessContext | undefined {\n  const serialized = environment[DOOM_CHILD_PROCESS_CONTEXT_ENV]?.trim();\n  return serialized ? decodeChildProcessContext(serialized) : undefined;\n}\n"],"mappings":"iFAGA,MAAa,EAAqB,oBACrB,EAA8B,6BAC9B,EAA4B,2BAC5B,EAAiC,gCAEjC,EAAiC,6BAEjC,EAAsB,kBAUnC,SAAgB,EAAgB,EAAiC,QAAQ,IAAc,CACrF,OAAO,EAAY,KAAyB,GAC9C,CAEA,SAAgB,EACd,EACA,EAA4D,QAAQ,IAC5D,CACR,IAAM,EAAY,EAAY,EAA0B,EAAE,KAAK,EAC/D,GAAI,EAAW,OAAO,EACtB,IAAM,EAAU,EAAiB,KAAK,EACtC,GAAI,CAAC,EAAS,MAAU,MAAM,yDAAyD,EACvF,OAAO,CACT,CAEA,MAAa,EAA4B,EAAK,OAC5C,CACE,gBAAiB,EAAK,OAAO,CAAE,UAAW,CAAE,CAAC,EAC7C,iBAAkB,EAAK,OAAO,CAAE,UAAW,CAAE,CAAC,EAC9C,KAAM,EAAK,SAAS,EAAK,OAAO,CAAE,UAAW,CAAE,CAAC,CAAC,CACnD,EACA,CAAE,qBAAsB,EAAM,CAChC,EAGA,SAAgB,EAA0B,EAAsC,CAC9E,OAAO,KAAK,UAAU,CAAO,CAC/B,CAEA,SAAgB,EAA0B,EAAyC,CACjF,IAAM,EAAkB,KAAK,MAAM,CAAU,EAC7C,GAAI,CAAC,EAAM,EAA2B,CAAM,EAAG,CAC7C,IAAM,EAAU,EAAO,EAA2B,CAAM,CAAC,CACtD,IAAK,GAAU,EAAM,OAAO,CAAC,CAC7B,KAAK,IAAI,EACZ,MAAU,MAAM,kCAAkC,GAAS,CAC7D,CACA,OAAO,CACT,CAEA,SAAgB,EAA+B,EAAsD,CACnG,MAAO,EAAG,GAAiC,EAA0B,CAAO,CAAE,CAChF,CAEA,SAAgB,EACd,EACiC,CACjC,IAAM,EAAa,EAAY,EAA+B,EAAE,KAAK,EACrE,OAAO,EAAa,EAA0B,CAAU,EAAI,IAAA,EAC9D"}