{"version":3,"file":"index.cjs","names":["createLayerResolvers","resolveExtensionComposition","path","resolveSyncLocation","compileExtensionSet","extensionSetManifestPath"],"sources":["../../../../src/builders/cli/runtimeBundle/index.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { writeFileAtomic } from '@agimon-ai/doompi-core/runtime-json';\nimport { resolveSyncLocation } from '@agimon-ai/doompi-core/sync-location';\n\nimport { compileExtensionSet, extensionSetManifestPath } from '../../../compiler';\nimport type { HarnessOptions } from '../../../composition/types/harness';\nimport { createLayerResolvers, type ExtensionComposition, resolveExtensionComposition } from '../extensionAssembler';\nimport type { HarnessContext } from '../harnessContext';\n\nconst EXTENSION_CACHE_DIRECTORY = 'cache';\nconst MODE_DIST_DIRECTORY = 'dist';\nconst MODE_BUILD_MANIFEST_VERSION = 4;\n\nexport interface RuntimeExtensionPlan {\n  /** Actual Pi factory activation order. */\n  extensions: string[];\n  /** Actual detached-child factory activation order. */\n  childExtensions: string[];\n  fingerprint: string;\n  composition: ExtensionComposition;\n}\n\nexport interface RuntimeBundleBuild extends RuntimeExtensionPlan {\n  bundle: string;\n  manifest: string;\n}\n\nexport interface ModeBuildSelection {\n  majorMode: string;\n  domains: string[];\n  profile?: string;\n  preset: string;\n  mute: boolean;\n  autoStop: boolean;\n  agents: boolean;\n  mcp: boolean;\n}\n\nexport interface ModeBuildManifest {\n  version: number;\n  artifact: string;\n  compositionFingerprint: string;\n  selection: ModeBuildSelection;\n  /** Original source entries in the order their factories activate. */\n  extensionPaths: string[];\n  /** Original source entries inherited by detached child agents. */\n  childExtensionPaths: string[];\n  resources: {\n    /** Exact SKILL.md paths; never derived from the bundled artifact path. */\n    skillPaths: string[];\n    pluginRoots: string[];\n  };\n}\n\nexport interface ModeExtensionBuildOptions {\n  repoRoot: string;\n  selection: ModeBuildSelection;\n  extensionPaths: readonly string[];\n  childExtensionPaths?: readonly string[];\n  skillPaths?: readonly string[];\n  pluginRoots?: readonly string[];\n  /** Canonical identity returned by resolveExtensionComposition(). */\n  compositionFingerprint: string;\n  outputName?: string;\n  cacheDirectory?: string;\n  outputDirectory?: string;\n  sharedCacheDirectory?: string;\n}\n\n/** Resolves the parent and detached-child extension lists for one launch. */\nexport function createRuntimeExtensionPlan(context: HarnessContext): RuntimeExtensionPlan {\n  const common = {\n    agents: context.options.agents,\n    preset: context.options.preset,\n    personaEntry: context.personaEntry,\n    layers: context.selectedLayers,\n    majorModesConfig: context.majorModesConfig,\n    resolvers: createLayerResolvers(context.options.repoRoot),\n  };\n  const composition = resolveExtensionComposition({\n    ...common,\n    majorMode: context.options.majorMode,\n    autoStop: context.options.autoStop,\n    mute: context.options.mute,\n  });\n  return {\n    extensions: [...composition.parentActivation],\n    childExtensions: [...composition.childActivation],\n    fingerprint: composition.fingerprint,\n    composition,\n  };\n}\n\nfunction modeSelection(options: HarnessOptions): ModeBuildSelection {\n  return {\n    majorMode: options.majorMode,\n    domains: [...options.domains],\n    profile: options.profile,\n    preset: options.preset,\n    mute: options.mute,\n    autoStop: options.autoStop,\n    agents: options.agents,\n    mcp: options.mcp,\n  };\n}\n\nfunction modeOutputName(selection: ModeBuildSelection): string {\n  return [selection.majorMode, selection.mute ? 'mute' : undefined, selection.autoStop ? 'auto-stop' : undefined]\n    .filter((value): value is string => Boolean(value))\n    .join('.');\n}\n\nfunction manifestPathFor(bundle: string): string {\n  return bundle.replace(/\\.mjs$/, '.manifest.json');\n}\n\n/**\n * Emits one named mode extension and its original-path resource manifest.\n *\n * Extension code lives in dist while compiler fingerprints remain in cache.\n * Skill loading never follows the bundle's import.meta.url: Pi receives the\n * exact original SKILL.md paths recorded here and in harness state.\n */\nexport async function compileModeExtension(options: ModeExtensionBuildOptions): Promise<{\n  bundle: string;\n  manifest: string;\n  compilerManifest: string;\n}> {\n  const extensionPaths = options.extensionPaths.map((entry) => path.resolve(entry));\n  const selection = { ...options.selection, domains: [...options.selection.domains] };\n  const location = resolveSyncLocation(options.repoRoot);\n  const cacheDirectory = options.cacheDirectory ?? path.join(location.directory, EXTENSION_CACHE_DIRECTORY);\n  const outputDirectory = options.outputDirectory ?? path.join(location.directory, MODE_DIST_DIRECTORY);\n  const childExtensionPaths = (options.childExtensionPaths ?? []).map((entry) => path.resolve(entry));\n  const resources = {\n    skillPaths: (options.skillPaths ?? []).map((entry) => path.resolve(entry)),\n    pluginRoots: (options.pluginRoots ?? []).map((entry) => path.resolve(entry)),\n  };\n  const outputBaseName = options.outputName ?? modeOutputName(selection);\n  const outputName = `${outputBaseName}.${options.compositionFingerprint.slice(0, 12)}`;\n  const bundle = await compileExtensionSet(extensionPaths, cacheDirectory, {\n    outputDirectory,\n    outputName,\n    repositoryRoot: options.repoRoot,\n    sharedCacheDirectory: options.sharedCacheDirectory ?? location.sharedCacheDirectory,\n  });\n  const compilerManifest = extensionSetManifestPath(extensionPaths, cacheDirectory, {\n    outputDirectory,\n    outputName,\n  });\n  const manifest = manifestPathFor(bundle);\n  const contents: ModeBuildManifest = {\n    version: MODE_BUILD_MANIFEST_VERSION,\n    artifact: bundle,\n    compositionFingerprint: options.compositionFingerprint,\n    selection,\n    extensionPaths,\n    childExtensionPaths,\n    resources,\n  };\n  writeFileAtomic(manifest, `${JSON.stringify(contents, null, 2)}\\n`);\n  return { bundle, manifest, compilerManifest };\n}\n\n/** Compiles the exact Pi load order used by the selected launch matrix. */\nexport async function buildRuntimeBundle(\n  context: HarnessContext,\n  plan: RuntimeExtensionPlan = createRuntimeExtensionPlan(context),\n  location = resolveSyncLocation(context.options.repoRoot),\n): Promise<RuntimeBundleBuild> {\n  const built = await compileModeExtension({\n    repoRoot: context.options.repoRoot,\n    cacheDirectory: path.join(location.directory, EXTENSION_CACHE_DIRECTORY),\n    outputDirectory: path.join(location.directory, MODE_DIST_DIRECTORY),\n    sharedCacheDirectory: location.sharedCacheDirectory,\n    selection: modeSelection(context.options),\n    extensionPaths: plan.extensions,\n    childExtensionPaths: plan.childExtensions,\n    compositionFingerprint: plan.fingerprint,\n    skillPaths: context.resources.skillDirectories,\n    pluginRoots: context.plugins.map((plugin) => plugin.directory),\n  });\n  return { ...plan, ...built };\n}\n"],"mappings":"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"}