{"version":3,"file":"context.cjs","names":["PROXY_SERVER_NAME","path","stageMcpResources","fs","loadMajorModesConfig","resolveLayers","layerHookGroups","os","resolveProfile","materializePluginEntries","resolvePluginEntries","resolveMcpAllowlist","applyProfileEnvironment","buildPersonaPrompt","resolveSharedSkills"],"sources":["../../../../src/cli/commands/compat/context.ts"],"sourcesContent":["import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { resolvePluginEntries, resolveSharedSkills } from '@agimon-ai/doompi-config/domains';\nimport type { DomainMcpAllowlist, PluginEntry } from '@agimon-ai/doompi-config/domains';\nimport { layerHookGroups, loadMajorModesConfig, resolveLayers } from '@agimon-ai/doompi-config/majorModes';\nimport { applyProfileEnvironment, buildPersonaPrompt, resolveProfile } from '@agimon-ai/doompi-config/profiles';\nimport type { AgentProfile } from '@agimon-ai/doompi-config/profiles';\nimport { PROXY_SERVER_NAME, resolveMcpAllowlist } from '@agimon-ai/doompi-domain/mcp';\nimport { materializePluginEntries } from '@agimon-ai/doompi-domain/plugins';\nimport { stageMcpResources } from '@agimon-ai/doompi-domain/resources';\n\nimport { projectHarnessEnvironment } from '../../../composition/harnessState';\nimport type { CompatibilityOptions } from './types';\n\ntype JsonObject = Record<string, unknown>;\n\nconst GENERATED_MCP_CONFIG_FILENAME = 'mcp.json';\nconst PROXY_CONFIG_FILENAME = 'mcp-config.yaml';\nconst PERSONA_FILENAME = 'persona.md';\nconst PRIVATE_FILE_MODE = 0o600;\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst CONFIG_OPTION = '--config';\nconst TEMPORARY_DIRECTORY_PREFIX = 'doom-pi-compat-';\nconst ADDITIONAL_DIRS_ENV = 'DOOMPI_ADDITIONAL_DIRS';\nconst CLAUDE_PROJECT_DIR_ENV = 'CLAUDE_PROJECT_DIR';\nconst CODEX_REPO_ROOT_ENV = 'CODEX_REPO_ROOT';\nconst AGY_REPO_ROOT_ENV = 'AGY_REPO_ROOT';\nconst ORIGINAL_REPO_PATH_ENV = 'ORIGINAL_REPO_PATH';\n\nexport interface CompatibilityContext {\n  options: CompatibilityOptions;\n  environment: NodeJS.ProcessEnv;\n  plugins: PluginEntry[];\n  profile?: AgentProfile;\n  personaFile?: string;\n  mcpAllowlist?: DomainMcpAllowlist;\n  mcpConfigPath: string;\n  proxyConfigPath: string;\n  selectedLayers: string[];\n  hookGroups: string[];\n  sharedSkills: boolean;\n  cleanup(): Promise<void>;\n}\n\nfunction resolveProxyConfigPath(config: JsonObject, repoRoot: string): string {\n  const servers = (config.mcpServers ?? {}) as Record<string, JsonObject>;\n  const proxy = servers[PROXY_SERVER_NAME];\n  const args = Array.isArray(proxy?.args) ? proxy.args.map(String) : [];\n  const configIndex = args.indexOf(CONFIG_OPTION);\n  const selected = configIndex === -1 ? undefined : args[configIndex + 1];\n  return selected ? path.resolve(repoRoot, selected) : path.join(repoRoot, PROXY_CONFIG_FILENAME);\n}\n\nasync function writeCompatibilityMcpConfig(\n  repoRoot: string,\n  plugins: PluginEntry[],\n  allowlist: DomainMcpAllowlist | undefined,\n  temporaryDirectory: string,\n): Promise<{ mcpConfigPath: string; proxyConfigPath: string }> {\n  const resources = await stageMcpResources(repoRoot, plugins, {\n    enabled: true,\n    temporaryDirectory,\n    ...(allowlist ? { mcpAllowlist: allowlist } : {}),\n  });\n  const mcpConfigPath = resources.mcpConfigPath ?? path.join(temporaryDirectory, GENERATED_MCP_CONFIG_FILENAME);\n  const config = JSON.parse(await fs.promises.readFile(mcpConfigPath, 'utf8')) as JsonObject;\n  return { mcpConfigPath, proxyConfigPath: resolveProxyConfigPath(config, repoRoot) };\n}\n\n/** Resolves only the resources shared by Pi and compatibility frontends. */\nexport async function buildCompatibilityContext(options: CompatibilityOptions): Promise<CompatibilityContext> {\n  const majorModesConfig = loadMajorModesConfig(options.repoRoot);\n  const selectedLayers = resolveLayers(majorModesConfig, options.majorMode);\n  const hookGroups = layerHookGroups(majorModesConfig, selectedLayers);\n  const temporaryDirectory = await fs.promises.mkdtemp(path.join(os.tmpdir(), TEMPORARY_DIRECTORY_PREFIX));\n  await fs.promises.chmod(temporaryDirectory, PRIVATE_DIRECTORY_MODE);\n\n  try {\n    const profile = options.profile ? resolveProfile(options.repoRoot, options.profile) : undefined;\n    const plugins = await materializePluginEntries(resolvePluginEntries(options.repoRoot, options.domains, []));\n    const mcpAllowlist = resolveMcpAllowlist(options.repoRoot, options.domains);\n    const mcp = await writeCompatibilityMcpConfig(options.repoRoot, plugins, mcpAllowlist, temporaryDirectory);\n    const environment = { ...process.env };\n    environment.NX_DAEMON ??= 'false';\n    const profileEnvironment = applyProfileEnvironment(environment, profile?.env ?? {});\n    const personaPrompt = profile?.persona ? buildPersonaPrompt(profile.personaRoot, profile.persona) : undefined;\n    let personaFile: string | undefined;\n\n    if (personaPrompt) {\n      personaFile = path.join(temporaryDirectory, PERSONA_FILENAME);\n      await fs.promises.writeFile(personaFile, `${personaPrompt}\\n`, { mode: PRIVATE_FILE_MODE });\n    }\n\n    // Projection only, with no state file: Claude, Codex and Antigravity read\n    // an environment and never the store.\n    projectHarnessEnvironment(\n      {\n        root: options.repoRoot,\n        majorMode: options.majorMode,\n        temporaryDirectory,\n        domains: options.domains,\n        layers: selectedLayers,\n        profile: profile?.name,\n        profileEnvironment,\n        hookGroups,\n        mcpConfigPath: mcp.mcpConfigPath,\n        personaFile,\n        additionalDirectories: options.additionalDirectories,\n        hooks: true,\n      },\n      environment,\n    );\n    environment[ADDITIONAL_DIRS_ENV] = options.additionalDirectories.join(path.delimiter);\n    environment[CLAUDE_PROJECT_DIR_ENV] = options.repoRoot;\n    environment[CODEX_REPO_ROOT_ENV] = options.repoRoot;\n    environment[AGY_REPO_ROOT_ENV] = options.repoRoot;\n    environment[ORIGINAL_REPO_PATH_ENV] ||= options.repoRoot;\n\n    return {\n      options,\n      environment,\n      plugins,\n      profile,\n      personaFile,\n      mcpAllowlist,\n      mcpConfigPath: mcp.mcpConfigPath,\n      proxyConfigPath: mcp.proxyConfigPath,\n      selectedLayers,\n      hookGroups,\n      sharedSkills: resolveSharedSkills(options.repoRoot, options.domains),\n      cleanup: () => fs.promises.rm(temporaryDirectory, { recursive: true, force: true }),\n    };\n  } catch (error) {\n    await fs.promises.rm(temporaryDirectory, { recursive: true, force: true });\n    throw error;\n  }\n}\n"],"mappings":"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"}