import { getConfig, loadConfig, type AppConfig } from "../config.js"; import { AgentManager, type AgentManagerLimits } from "./manager.js"; import { createDefaultResourceProvisioningOrchestrator, type BuiltInProvisioningConfigInput, type ResourceProvisioningOrchestrator, } from "./provisioning.js"; function toProvisioningConfig(input: Readonly): BuiltInProvisioningConfigInput { return { gitWorktree: { rootDirectory: input.provisioning.gitWorktree.rootDirectory, baseRef: input.provisioning.gitWorktree.baseRef, targetPath: input.provisioning.gitWorktree.targetPath, }, portRange: { basePort: input.provisioning.portRange.basePort, blockSize: input.provisioning.portRange.blockSize, blockCount: input.provisioning.portRange.blockCount, primaryPortOffset: input.provisioning.portRange.primaryPortOffset, lockDirectory: input.provisioning.portRange.lockDirectory, }, }; } export function loadAgentManagerLimitsFromEnv(env: NodeJS.ProcessEnv = process.env): AgentManagerLimits { const config = loadConfig(env); return { maxConcurrentAgents: config.agentManager.maxConcurrentAgents, maxSessionAgents: config.agentManager.maxSessionAgents, maxRecursiveDepth: config.agentManager.maxRecursiveDepth, }; } let managerSingleton: AgentManager | undefined; let provisioningSingleton: ResourceProvisioningOrchestrator | undefined; export function getAgentManager(config: Readonly = getConfig()): AgentManager { if (!managerSingleton) { managerSingleton = new AgentManager({ maxConcurrentAgents: config.agentManager.maxConcurrentAgents, maxSessionAgents: config.agentManager.maxSessionAgents, maxRecursiveDepth: config.agentManager.maxRecursiveDepth, }); } return managerSingleton; } export function loadProvisioningConfigFromEnv( env: NodeJS.ProcessEnv = process.env, ): BuiltInProvisioningConfigInput { return toProvisioningConfig(loadConfig(env)); } export function getResourceProvisioningOrchestrator( config: Readonly = getConfig(), ): ResourceProvisioningOrchestrator { if (!provisioningSingleton) { provisioningSingleton = createDefaultResourceProvisioningOrchestrator( toProvisioningConfig(config), ); } return provisioningSingleton; }