{"version":3,"file":"terminal-child-session.mjs","names":[],"sources":["../../src/extensions/terminalChildSession.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { DOOM_CHILD_SESSION_SERVICE } from '@agimon-ai/doompi-core/child';\nimport {\n  connectDoomCordisHost,\n  DOOM_CORDIS_SESSION_SERVICE,\n  type DoomCordisSessionService,\n} from '@agimon-ai/doompi-core/cordis-host';\nimport { createTerminalPiChildSessionServiceProvider } from '@agimon-ai/doompi-core/terminal-pi-child-session-service';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { Provider } from '@earendil-works/pi-ai';\nimport { getAgentDir, ModelRuntime, type ExtensionAPI, type ModelRegistry } from '@earendil-works/pi-coding-agent';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi/terminal-child-session';\n\n/**\n * Collect the providers registered in this process by Pi extensions.\n *\n * The child ModelRuntime is built from auth.json and models.json, so it only\n * knows providers that exist on disk. A custom provider contributed through\n * `pi.registerProvider()` lives solely in the host registry, and its stream\n * closures cannot be reconstructed from a file. Reading the live registry per\n * spawn keeps late registrations visible.\n */\nfunction registeredProviders(registry: ModelRegistry): readonly Provider[] {\n  const providers: Provider[] = [];\n  for (const id of registry.getRegisteredProviderIds()) {\n    const provider = registry.getRegisteredNativeProvider(id) ?? registry.getProvider(id);\n    if (provider !== undefined) providers.push(provider);\n  }\n  return providers;\n}\n\nfunction terminalChildSessionPlugin(cordis: Context, models: ModelRuntime, sessionsRoot: string): void {\n  cordis.inject([DOOM_CORDIS_SESSION_SERVICE], (sessionContext) => {\n    const session = sessionContext.get(DOOM_CORDIS_SESSION_SERVICE) as DoomCordisSessionService;\n    const extensionContext = session.context;\n    const childSessions = createTerminalPiChildSessionServiceProvider({\n      cwd: extensionContext.cwd,\n      sessionsRoot,\n      models,\n      providers: () => registeredProviders(extensionContext.modelRegistry),\n      defaultModel: () => extensionContext.model,\n    });\n    sessionContext.provide(DOOM_CHILD_SESSION_SERVICE, childSessions.get());\n    sessionContext.effect(() => () => childSessions.close(), `${PACKAGE_SOURCE}/lifetime`);\n  });\n}\n\n/** Bind terminal Pi child ownership inside the core Cordis composition, before feature packages consume it. */\nexport async function terminalChildSessionExtension(pi: ExtensionAPI): Promise<void> {\n  const agentDir = getAgentDir();\n  const models = await ModelRuntime.create({\n    authPath: path.join(agentDir, 'auth.json'),\n    modelsPath: path.join(agentDir, 'models.json'),\n    refreshOnCreate: false,\n  });\n  const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE);\n  const sessionsRoot = path.join(agentDir, 'sessions');\n  const fiber = connection.root.plugin((cordis) => terminalChildSessionPlugin(cordis, models, sessionsRoot));\n  let disposal: Promise<void> | undefined;\n  pi.on(\n    'session_shutdown',\n    () =>\n      (disposal ??= (async () => {\n        try {\n          await fiber.dispose();\n        } finally {\n          await connection.dispose();\n        }\n      })()),\n  );\n  try {\n    await fiber;\n  } catch (error) {\n    await fiber.dispose();\n    await connection.dispose();\n    throw error;\n  }\n}\n\nexport default terminalChildSessionExtension;\n"],"mappings":";;;;;;AAaA,MAAM,iBAAiB;;;;;;;;;;AAWvB,SAAS,oBAAoB,UAA8C;CACzE,MAAM,YAAwB,CAAC;CAC/B,KAAK,MAAM,MAAM,SAAS,yBAAyB,GAAG;EACpD,MAAM,WAAW,SAAS,4BAA4B,EAAE,KAAK,SAAS,YAAY,EAAE;EACpF,IAAI,aAAa,KAAA,GAAW,UAAU,KAAK,QAAQ;CACrD;CACA,OAAO;AACT;AAEA,SAAS,2BAA2B,QAAiB,QAAsB,cAA4B;CACrG,OAAO,OAAO,CAAC,2BAA2B,IAAI,mBAAmB;EAE/D,MAAM,mBADU,eAAe,IAAI,2BACJ,CAAC,CAAC;EACjC,MAAM,gBAAgB,4CAA4C;GAChE,KAAK,iBAAiB;GACtB;GACA;GACA,iBAAiB,oBAAoB,iBAAiB,aAAa;GACnE,oBAAoB,iBAAiB;EACvC,CAAC;EACD,eAAe,QAAQ,4BAA4B,cAAc,IAAI,CAAC;EACtE,eAAe,mBAAmB,cAAc,MAAM,GAAG,GAAG,eAAe,UAAU;CACvF,CAAC;AACH;;AAGA,eAAsB,8BAA8B,IAAiC;CACnF,MAAM,WAAW,YAAY;CAC7B,MAAM,SAAS,MAAM,aAAa,OAAO;EACvC,UAAU,KAAK,KAAK,UAAU,WAAW;EACzC,YAAY,KAAK,KAAK,UAAU,aAAa;EAC7C,iBAAiB;CACnB,CAAC;CACD,MAAM,aAAa,MAAM,sBAAsB,IAAI,cAAc;CACjE,MAAM,eAAe,KAAK,KAAK,UAAU,UAAU;CACnD,MAAM,QAAQ,WAAW,KAAK,QAAQ,WAAW,2BAA2B,QAAQ,QAAQ,YAAY,CAAC;CACzG,IAAI;CACJ,GAAG,GACD,0BAEG,cAAc,YAAY;EACzB,IAAI;GACF,MAAM,MAAM,QAAQ;EACtB,UAAU;GACR,MAAM,WAAW,QAAQ;EAC3B;CACF,EAAA,CAAG,CACP;CACA,IAAI;EACF,MAAM;CACR,SAAS,OAAO;EACd,MAAM,MAAM,QAAQ;EACpB,MAAM,WAAW,QAAQ;EACzB,MAAM;CACR;AACF"}