{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/builders/cli/index.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\n\nimport { readHarnessState } from '@agimon-ai/doompi-config/harnessState';\nimport { filterHookDisabledLayers, loadMajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport { resolveSyncLocation } from '@agimon-ai/doompi-core/sync-location';\nimport { BUNDLED_PRECOMPILE_STRATEGY, PRECOMPILE_STATE_VERSION } from '@agimon-ai/doompi-core/sync-state-contract';\n\nimport { compileExtensionSet, extensionSetManifestPath } from '../../compiler';\nimport {\n  createMapResolvers,\n  readSyncState,\n  type SyncState,\n  syncDirectory,\n  writeSyncState,\n} from '../../composition/syncState';\nimport { ownEntry } from './entryResolution';\nimport { PERSONA_ENTRY, resolveExtensionComposition, type ExtensionComposition } from './extensionAssembler';\nimport { compileModeExtension, type ModeBuildSelection } from './runtimeBundle';\n\nconst EXTENSION_CACHE_DIRECTORY = 'cache';\nconst MODE_DIST_DIRECTORY = 'dist';\nconst COMPOSED_PI_ENTRY = 'composedPi';\n\nexport interface SyncedRuntimeBuild {\n  bootstrap: string;\n  bundles: Record<string, string>;\n  bundleManifests: Record<string, string>;\n  state: SyncState;\n  compositions: ExtensionComposition[];\n}\n\nexport interface SyncedRuntimeBuildOptions {\n  /** In-memory state being staged into a not-yet-published generation. */\n  state?: SyncState;\n  /** Generation root for cache and compiled outputs. */\n  directory?: string;\n  /** Starts dependent target builds as soon as composition planning finishes. */\n  onCompositionsResolved?: (compositions: readonly ExtensionComposition[]) => void;\n}\n\nfunction mergedEnvironment(recorded: Record<string, string>, current: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n  const merged: NodeJS.ProcessEnv = { ...recorded };\n  for (const [key, value] of Object.entries(current)) {\n    if (value !== undefined) merged[key] = value;\n  }\n  return merged;\n}\n\nfunction selectionFor(\n  state: SyncState,\n  harness: ReturnType<typeof readHarnessState>,\n  majorMode: string,\n  mute: boolean,\n): ModeBuildSelection {\n  return {\n    majorMode,\n    domains: [...state.selection.domains],\n    profile: state.selection.profile,\n    preset: state.selection.preset,\n    mute,\n    autoStop: false,\n    agents: harness.agents,\n    mcp: harness.mcp,\n  };\n}\n\nfunction compilationStateChanged(previous: SyncState, current: SyncState): boolean {\n  return (\n    previous.inputsHash !== current.inputsHash ||\n    JSON.stringify(previous.selection) !== JSON.stringify(current.selection) ||\n    JSON.stringify(previous.resolved) !== JSON.stringify(current.resolved)\n  );\n}\n\n/** Heavy graph bundling reserved for the private build phase of `doompi sync`. */\nexport async function buildSyncedRuntime(\n  repoRoot: string,\n  environment: NodeJS.ProcessEnv = process.env,\n  homeDirectory: string = environment.HOME ?? os.homedir(),\n  options: SyncedRuntimeBuildOptions = {},\n): Promise<SyncedRuntimeBuild> {\n  const state = options.state ?? readSyncState(repoRoot, homeDirectory);\n  if (!state) throw new Error(`DoomPi is not synchronized at ${repoRoot}. Run doompi sync.`);\n\n  const runtimeEnvironment = mergedEnvironment(state.env, environment);\n  const harness = readHarnessState(runtimeEnvironment);\n  const majorModesConfig = loadMajorModesConfig(repoRoot, homeDirectory);\n  const resolvers = createMapResolvers(state.resolved);\n  const base = {\n    agents: harness.agents,\n    autoStop: false,\n    preset: state.selection.preset,\n    personaEntry: resolvers.packageEntry(PERSONA_ENTRY),\n    majorModesConfig,\n    resolvers,\n  };\n\n  const location = resolveSyncLocation(repoRoot, homeDirectory);\n  const directory = options.directory ?? syncDirectory(repoRoot, homeDirectory);\n  const cacheDirectory = path.join(directory, EXTENSION_CACHE_DIRECTORY);\n  const outputDirectory = path.join(directory, MODE_DIST_DIRECTORY);\n  const bundles: Record<string, string> = {};\n  const bundleManifests: Record<string, string> = {};\n  const compositions: ExtensionComposition[] = [];\n  const builds: {\n    composition: ExtensionComposition;\n    majorMode: string;\n    mute: boolean;\n    options: Parameters<typeof compileModeExtension>[0];\n  }[] = [];\n  for (const [majorMode, definition] of Object.entries(majorModesConfig.majorMode)) {\n    const selectedLayers = filterHookDisabledLayers(majorModesConfig, definition.layers, harness.hooks);\n    for (const mute of [false, true]) {\n      const composition = resolveExtensionComposition({\n        ...base,\n        majorMode,\n        layers: selectedLayers,\n        mute,\n      });\n      compositions.push(composition);\n      const extensionPaths = [...composition.parentActivation];\n      const childExtensionPaths = [...composition.childActivation];\n      const outputName = `${majorMode}${mute ? '.mute' : ''}`;\n      builds.push({\n        composition,\n        majorMode,\n        mute,\n        options: {\n          repoRoot,\n          selection: selectionFor(state, harness, majorMode, mute),\n          extensionPaths,\n          childExtensionPaths,\n          compositionFingerprint: composition.fingerprint,\n          skillPaths: harness.skillDirectories,\n          pluginRoots: harness.pluginDirectories,\n          outputName,\n          cacheDirectory,\n          outputDirectory,\n          sharedCacheDirectory: location.sharedCacheDirectory,\n        },\n      });\n    }\n  }\n  options.onCompositionsResolved?.(compositions);\n  const results = await Promise.allSettled(builds.map(({ options }) => compileModeExtension(options)));\n  for (const [index, result] of results.entries()) {\n    const { composition, majorMode, mute } = builds[index]!;\n    if (result.status === 'fulfilled') {\n      bundles[composition.fingerprint] = result.value.bundle;\n      bundleManifests[composition.fingerprint] = result.value.compilerManifest;\n    } else {\n      const detail = result.reason instanceof Error ? result.reason.message : String(result.reason);\n      process.stderr.write(`[doompi] could not precompile ${majorMode}${mute ? ' (mute)' : ''}: ${detail}\\n`);\n    }\n  }\n\n  if (!bundles[state.compositionFingerprint]) {\n    throw new Error('The synchronized active composition did not produce a bundle. Run doompi sync.');\n  }\n\n  const bootstrapEntries = [ownEntry(COMPOSED_PI_ENTRY)];\n  const bootstrapOptions = { outputDirectory, outputName: 'bootstrap' };\n  const bootstrap = await compileExtensionSet(bootstrapEntries, cacheDirectory, {\n    ...bootstrapOptions,\n    repositoryRoot: repoRoot,\n    sharedCacheDirectory: location.sharedCacheDirectory,\n  });\n  const bootstrapManifest = extensionSetManifestPath(bootstrapEntries, cacheDirectory, bootstrapOptions);\n\n  const nextState: SyncState = {\n    ...state,\n    compiled: undefined,\n    bundles,\n    bootstrap,\n    precompile: {\n      version: PRECOMPILE_STATE_VERSION,\n      strategy: BUNDLED_PRECOMPILE_STRATEGY,\n      bootstrapEntry: bootstrapEntries[0],\n      bootstrapManifest,\n      bundleManifests,\n    },\n  };\n  if (options.state === undefined) {\n    const current = readSyncState(repoRoot, homeDirectory);\n    if (!current) throw new Error(`DoomPi synchronization disappeared while compiling ${repoRoot}`);\n    if (compilationStateChanged(state, current)) {\n      throw new Error(`DoomPi synchronization changed while compiling ${repoRoot}; restart Pi to use the new state.`);\n    }\n    await writeSyncState(repoRoot, nextState, homeDirectory);\n  }\n  return {\n    bootstrap,\n    bundles,\n    bundleManifests,\n    state: nextState,\n    compositions,\n  };\n}\n"],"mappings":"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"}