@agimon-ai/doompi 0.0.1-alpha.79 → 0.0.1-alpha.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builders/cli/extensionAssembler/index.cjs +4 -0
- package/dist/builders/cli/extensionAssembler/index.cjs.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.d.cts.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.d.mts.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.mjs +4 -0
- package/dist/builders/cli/extensionAssembler/index.mjs.map +1 -1
- package/dist/builders/server/mcpBundle.cjs +103 -0
- package/dist/builders/server/mcpBundle.cjs.map +1 -0
- package/dist/builders/server/mcpBundle.mjs +99 -0
- package/dist/builders/server/mcpBundle.mjs.map +1 -0
- package/dist/builders/server/runtime.cjs +129 -13
- package/dist/builders/server/runtime.cjs.map +1 -1
- package/dist/builders/server/runtime.mjs +130 -14
- package/dist/builders/server/runtime.mjs.map +1 -1
- package/dist/cli/commands/sync/index.cjs +27 -4
- package/dist/cli/commands/sync/index.cjs.map +1 -1
- package/dist/cli/commands/sync/index.d.cts.map +1 -1
- package/dist/cli/commands/sync/index.d.mts.map +1 -1
- package/dist/cli/commands/sync/index.mjs +28 -5
- package/dist/cli/commands/sync/index.mjs.map +1 -1
- package/dist/composition/syncDrift/index.cjs +47 -1
- package/dist/composition/syncDrift/index.cjs.map +1 -1
- package/dist/composition/syncDrift/index.d.cts +1 -1
- package/dist/composition/syncDrift/index.d.cts.map +1 -1
- package/dist/composition/syncDrift/index.d.mts +1 -1
- package/dist/composition/syncDrift/index.d.mts.map +1 -1
- package/dist/composition/syncDrift/index.mjs +47 -3
- package/dist/composition/syncDrift/index.mjs.map +1 -1
- package/dist/composition/syncState/index.cjs +32 -0
- package/dist/composition/syncState/index.cjs.map +1 -1
- package/dist/composition/syncState/index.d.cts +10 -0
- package/dist/composition/syncState/index.d.cts.map +1 -1
- package/dist/composition/syncState/index.d.mts +10 -0
- package/dist/composition/syncState/index.d.mts.map +1 -1
- package/dist/composition/syncState/index.mjs +32 -1
- package/dist/composition/syncState/index.mjs.map +1 -1
- package/dist/sync-state.cjs +1 -0
- package/dist/sync-state.d.cts +2 -2
- package/dist/sync-state.d.mts +2 -2
- package/dist/sync-state.mjs +2 -2
- package/package.json +17 -16
|
@@ -53,6 +53,7 @@ const FIXED_CORE_PACKAGES = /* @__PURE__ */ new Set([
|
|
|
53
53
|
"@agimon-ai/doompi-minor-mode",
|
|
54
54
|
"@agimon-ai/doompi-notification",
|
|
55
55
|
"@agimon-ai/doompi-profile",
|
|
56
|
+
"@agimon-ai/doompi-session",
|
|
56
57
|
"@agimon-ai/doompi-skill",
|
|
57
58
|
"@agimon-ai/doompi-ui"
|
|
58
59
|
]);
|
|
@@ -75,6 +76,7 @@ const CORE_PACKAGE_ENTRIES = {
|
|
|
75
76
|
minorMode: "@agimon-ai/doompi-minor-mode/extensions/pi",
|
|
76
77
|
notification: "@agimon-ai/doompi-notification/extensions/pi",
|
|
77
78
|
profile: "@agimon-ai/doompi-profile/extensions/pi",
|
|
79
|
+
session: "@agimon-ai/doompi-session/extensions/pi",
|
|
78
80
|
skill: "@agimon-ai/doompi-skill/extensions/pi",
|
|
79
81
|
ui: "@agimon-ai/doompi-ui/extensions/pi"
|
|
80
82
|
};
|
|
@@ -283,6 +285,7 @@ function parentActivation(context, distributionPaths, featurePaths) {
|
|
|
283
285
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.minorMode),
|
|
284
286
|
resolve.ownEntry(OWN_ENTRIES.contextCatalog),
|
|
285
287
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),
|
|
288
|
+
resolve.packageEntry(CORE_PACKAGE_ENTRIES.session),
|
|
286
289
|
resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),
|
|
287
290
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui)
|
|
288
291
|
];
|
|
@@ -302,6 +305,7 @@ function childActivation(context, distributionPaths, featurePaths) {
|
|
|
302
305
|
resolve.ownEntry(OWN_ENTRIES.cordisHost),
|
|
303
306
|
resolve.ownEntry(OWN_ENTRIES.terminalChildSession),
|
|
304
307
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),
|
|
308
|
+
resolve.packageEntry(CORE_PACKAGE_ENTRIES.session),
|
|
305
309
|
...distributionPaths,
|
|
306
310
|
...featurePaths
|
|
307
311
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["extensionPackageName","resolvePackageEntry","resolveOptionalPackageEntry","resolvePackageEntries","resolveOptionalPackageEntries","resolveLocalPackageName","consumerPackageEntry","consumerPackageEntries","canonicalModulePath","isLocalPackageSpecifier","sha256"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import {\n isLocalPackageSpecifier,\n type LayerResolvers,\n type MajorModesConfig,\n} from '@agimon-ai/doompi-config/majorModes';\nimport type { PackageAttribution } from '@agimon-ai/doompi-config/types';\nimport {\n consumerPackageEntries,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntries as resolveOptionalPackageEntries,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntries as resolvePackageEntries,\n packageEntry as resolvePackageEntry,\n} from '@agimon-ai/doompi-core/module-resolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/doompi-core/runtime-identity';\nimport { extensionPackageName } from '@agimon-ai/doompi-ui/extensionName';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages through its standard Pi manifest. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n agents: boolean;\n autoStop: boolean;\n mute?: boolean;\n preset?: string;\n personaEntry?: string;\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to DoomPi composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by launch, sync, bundles, and replay. */\nexport interface ExtensionComposition {\n readonly version: number;\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Actual Pi factory activation order, not CLI argument construction order. */\n readonly parentActivation: readonly string[];\n /** Actual Pi factory activation order inherited by detached children. */\n readonly childActivation: readonly string[];\n readonly fingerprint: string;\n}\n\n/**\n * Which layer of which major mode admitted each package.\n *\n * The composition already holds this join while it resolves package names to\n * entry paths, then drops it, so a session cannot afterwards say why a tool is\n * present. Reducing it here keeps the selection type private and costs one pass\n * over an array the caller already has.\n *\n * Only `package` entries appear. A bare `extension` selector is a path rather\n * than a package name, so it has nothing a registered tool could be joined on.\n *\n * Keyed by manifest name first, because that is what a registered tool resolves\n * to. The selector is kept as an alias: a layer may name a package as\n * `@agimon-ai/doompi-team` when published or `./layers/team/doompi-team` in a\n * checkout, and both have to find the same layer.\n */\nexport function packageAttribution(composition: ExtensionComposition): Record<string, PackageAttribution> {\n const attribution: Record<string, PackageAttribution> = {};\n const mode = composition.majorMode?.name;\n if (mode === undefined) return attribution;\n for (const selection of composition.selections) {\n if (selection.entryKind !== 'package') continue;\n if (selection.outcome !== 'resolved') continue;\n // First layer wins, matching activation order: the earlier layer is the one\n // whose copy of a duplicated package actually loaded.\n const value: PackageAttribution = { kind: 'major', mode, layer: selection.layer };\n const manifest = selection.path === undefined ? undefined : extensionPackageName(selection.path);\n if (manifest !== undefined && attribution[manifest] === undefined) attribution[manifest] = value;\n if (attribution[selection.selector] === undefined) attribution[selection.selector] = value;\n }\n return attribution;\n}\nexport const COMPOSITION_FINGERPRINT_VERSION = 4;\nexport const STANDARD_PI_EXTENSION_CONTRACT_VERSION = 2;\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/doompi',\n '@agimon-ai/doompi-autostop',\n '@agimon-ai/doompi-cache',\n '@agimon-ai/doompi-config',\n '@agimon-ai/doompi-domain',\n '@agimon-ai/doompi-major-mode',\n '@agimon-ai/doompi-minor-mode',\n '@agimon-ai/doompi-notification',\n '@agimon-ai/doompi-profile',\n '@agimon-ai/doompi-skill',\n '@agimon-ai/doompi-ui',\n]);\n\nconst OWN_ENTRIES = {\n agentModel: 'agentModel',\n cordisFinalizer: 'cordisFinalizer',\n cordisHost: 'cordisHost',\n terminalChildSession: 'terminalChildSession',\n effort: 'effort',\n contextCatalog: 'contextCatalog',\n ollamaProvider: 'ollamaProvider',\n transitionCoordinator: 'transitionCoordinator',\n} as const;\n\nconst CORE_PACKAGE_ENTRIES = {\n autostop: '@agimon-ai/doompi-autostop/extensions/pi',\n cache: '@agimon-ai/doompi-cache/extensions/pi',\n config: '@agimon-ai/doompi-config/extensions/pi',\n domain: '@agimon-ai/doompi-domain/extensions/pi',\n majorMode: '@agimon-ai/doompi-major-mode/extensions/pi',\n minorMode: '@agimon-ai/doompi-minor-mode/extensions/pi',\n notification: '@agimon-ai/doompi-notification/extensions/pi',\n profile: '@agimon-ai/doompi-profile/extensions/pi',\n skill: '@agimon-ai/doompi-skill/extensions/pi',\n ui: '@agimon-ai/doompi-ui/extensions/pi',\n} as const;\n\nexport const OLLAMA_PRESET = 'ollama';\n\n/**\n * Always available so /profile can pick a persona later, and the one entry a\n * detached child shares with its parent: children get the persona without the\n * command, because they have no transition coordinator to run a switch through.\n *\n * An explicit subpath rather than the bare package name, so it resolves to\n * exactly this file rather than to whatever pi.extensions lists.\n */\nexport const PERSONA_ENTRY = '@agimon-ai/doompi-profile/extensions/persona';\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => resolvePackageEntries(specifier, import.meta.url),\n optionalPackageEntries: (specifier) => resolveOptionalPackageEntries(specifier, import.meta.url),\n localEntry,\n localEntries,\n localPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure.\n */\nexport function createLayerResolvers(consumerRoot?: string): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n const fallbackEntries = (name: string): string[] | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntries(name, import.meta.url) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = fallbackEntries(name) ?? consumerPackageEntries(name, consumerRoot);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => fallbackEntries(name) ?? consumerPackageEntries(name, consumerRoot),\n localEntry,\n localEntries,\n localPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new Error(\n `Layer \"${layer}\" cannot select fixed DoomPi host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Pi extensions.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a directory whose package.json declares pi.extensions.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Pi extensions.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(config.default, DEFAULT_SELECTION_LAYER, DEFAULT_SELECTION_LAYER_INDEX, resolvers);\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\nfunction parentActivation(\n context: ExtensionContext,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const activation = [\n resolve.ownEntry(OWN_ENTRIES.cordisHost),\n resolve.ownEntry(OWN_ENTRIES.terminalChildSession),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.minorMode),\n resolve.ownEntry(OWN_ENTRIES.contextCatalog),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui),\n ];\n if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));\n activation.push(\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain),\n resolve.ownEntry(OWN_ENTRIES.effort),\n // Child sessions are deliberately left out: a subagent thread has no model\n // chip to keep current, so journaling its switches would cost entries no\n // surface reads.\n resolve.ownEntry(OWN_ENTRIES.agentModel),\n );\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n activation.push(...distributionPaths, ...featurePaths);\n if (context.personaEntry) activation.push(context.personaEntry);\n if (context.autoStop) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.autostop));\n activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.cache));\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction childActivation(\n context: ExtensionContext,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const activation = [\n resolve.ownEntry(OWN_ENTRIES.cordisHost),\n resolve.ownEntry(OWN_ENTRIES.terminalChildSession),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n ...distributionPaths,\n ...featurePaths,\n ];\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n if (context.personaEntry) activation.push(context.personaEntry);\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction compositionFingerprint(composition: Omit<ExtensionComposition, 'fingerprint'>): string {\n return sha256(\n JSON.stringify(\n canonicalValue({\n ...composition,\n contract: {\n composition: COMPOSITION_FINGERPRINT_VERSION,\n standardPiExtension: STANDARD_PI_EXTENSION_CONTRACT_VERSION,\n fixedCorePackages: [...FIXED_CORE_PACKAGES],\n },\n parentCanonicalActivation: composition.parentActivation.map(canonicalModulePath),\n childCanonicalActivation: composition.childActivation.map(canonicalModulePath),\n }),\n ),\n );\n}\n\n/** Resolve one deterministic parent/child composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(context.majorModesConfig, resolvers);\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const withoutFingerprint: Omit<ExtensionComposition, 'fingerprint'> = {\n version: COMPOSITION_FINGERPRINT_VERSION,\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n parentActivation: parentActivation(context, distributionPaths, featurePaths),\n childActivation: childActivation(context, distributionPaths, featurePaths),\n };\n return { ...withoutFingerprint, fingerprint: compositionFingerprint(withoutFingerprint) };\n}\n\n/** Assemble parent entries in actual Pi factory activation order. */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).parentActivation];\n}\n\n/** Assemble detached-child entries in actual Pi factory activation order. */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).childActivation];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["extensionPackageName","resolvePackageEntry","resolveOptionalPackageEntry","resolvePackageEntries","resolveOptionalPackageEntries","resolveLocalPackageName","consumerPackageEntry","consumerPackageEntries","canonicalModulePath","isLocalPackageSpecifier","sha256"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import {\n isLocalPackageSpecifier,\n type LayerResolvers,\n type MajorModesConfig,\n} from '@agimon-ai/doompi-config/majorModes';\nimport type { PackageAttribution } from '@agimon-ai/doompi-config/types';\nimport {\n consumerPackageEntries,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntries as resolveOptionalPackageEntries,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntries as resolvePackageEntries,\n packageEntry as resolvePackageEntry,\n} from '@agimon-ai/doompi-core/module-resolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/doompi-core/runtime-identity';\nimport { extensionPackageName } from '@agimon-ai/doompi-ui/extensionName';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages through its standard Pi manifest. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n agents: boolean;\n autoStop: boolean;\n mute?: boolean;\n preset?: string;\n personaEntry?: string;\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to DoomPi composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by launch, sync, bundles, and replay. */\nexport interface ExtensionComposition {\n readonly version: number;\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Actual Pi factory activation order, not CLI argument construction order. */\n readonly parentActivation: readonly string[];\n /** Actual Pi factory activation order inherited by detached children. */\n readonly childActivation: readonly string[];\n readonly fingerprint: string;\n}\n\n/**\n * Which layer of which major mode admitted each package.\n *\n * The composition already holds this join while it resolves package names to\n * entry paths, then drops it, so a session cannot afterwards say why a tool is\n * present. Reducing it here keeps the selection type private and costs one pass\n * over an array the caller already has.\n *\n * Only `package` entries appear. A bare `extension` selector is a path rather\n * than a package name, so it has nothing a registered tool could be joined on.\n *\n * Keyed by manifest name first, because that is what a registered tool resolves\n * to. The selector is kept as an alias: a layer may name a package as\n * `@agimon-ai/doompi-team` when published or `./layers/team/doompi-team` in a\n * checkout, and both have to find the same layer.\n */\nexport function packageAttribution(composition: ExtensionComposition): Record<string, PackageAttribution> {\n const attribution: Record<string, PackageAttribution> = {};\n const mode = composition.majorMode?.name;\n if (mode === undefined) return attribution;\n for (const selection of composition.selections) {\n if (selection.entryKind !== 'package') continue;\n if (selection.outcome !== 'resolved') continue;\n // First layer wins, matching activation order: the earlier layer is the one\n // whose copy of a duplicated package actually loaded.\n const value: PackageAttribution = { kind: 'major', mode, layer: selection.layer };\n const manifest = selection.path === undefined ? undefined : extensionPackageName(selection.path);\n if (manifest !== undefined && attribution[manifest] === undefined) attribution[manifest] = value;\n if (attribution[selection.selector] === undefined) attribution[selection.selector] = value;\n }\n return attribution;\n}\nexport const COMPOSITION_FINGERPRINT_VERSION = 4;\nexport const STANDARD_PI_EXTENSION_CONTRACT_VERSION = 2;\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/doompi',\n '@agimon-ai/doompi-autostop',\n '@agimon-ai/doompi-cache',\n '@agimon-ai/doompi-config',\n '@agimon-ai/doompi-domain',\n '@agimon-ai/doompi-major-mode',\n '@agimon-ai/doompi-minor-mode',\n '@agimon-ai/doompi-notification',\n '@agimon-ai/doompi-profile',\n '@agimon-ai/doompi-session',\n '@agimon-ai/doompi-skill',\n '@agimon-ai/doompi-ui',\n]);\n\nconst OWN_ENTRIES = {\n agentModel: 'agentModel',\n cordisFinalizer: 'cordisFinalizer',\n cordisHost: 'cordisHost',\n terminalChildSession: 'terminalChildSession',\n effort: 'effort',\n contextCatalog: 'contextCatalog',\n ollamaProvider: 'ollamaProvider',\n transitionCoordinator: 'transitionCoordinator',\n} as const;\n\nconst CORE_PACKAGE_ENTRIES = {\n autostop: '@agimon-ai/doompi-autostop/extensions/pi',\n cache: '@agimon-ai/doompi-cache/extensions/pi',\n config: '@agimon-ai/doompi-config/extensions/pi',\n domain: '@agimon-ai/doompi-domain/extensions/pi',\n majorMode: '@agimon-ai/doompi-major-mode/extensions/pi',\n minorMode: '@agimon-ai/doompi-minor-mode/extensions/pi',\n notification: '@agimon-ai/doompi-notification/extensions/pi',\n profile: '@agimon-ai/doompi-profile/extensions/pi',\n session: '@agimon-ai/doompi-session/extensions/pi',\n skill: '@agimon-ai/doompi-skill/extensions/pi',\n ui: '@agimon-ai/doompi-ui/extensions/pi',\n} as const;\n\nexport const OLLAMA_PRESET = 'ollama';\n\n/**\n * Always available so /profile can pick a persona later, and the one entry a\n * detached child shares with its parent: children get the persona without the\n * command, because they have no transition coordinator to run a switch through.\n *\n * An explicit subpath rather than the bare package name, so it resolves to\n * exactly this file rather than to whatever pi.extensions lists.\n */\nexport const PERSONA_ENTRY = '@agimon-ai/doompi-profile/extensions/persona';\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => resolvePackageEntries(specifier, import.meta.url),\n optionalPackageEntries: (specifier) => resolveOptionalPackageEntries(specifier, import.meta.url),\n localEntry,\n localEntries,\n localPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure.\n */\nexport function createLayerResolvers(consumerRoot?: string): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n const fallbackEntries = (name: string): string[] | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntries(name, import.meta.url) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = fallbackEntries(name) ?? consumerPackageEntries(name, consumerRoot);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => fallbackEntries(name) ?? consumerPackageEntries(name, consumerRoot),\n localEntry,\n localEntries,\n localPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new Error(\n `Layer \"${layer}\" cannot select fixed DoomPi host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Pi extensions.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a directory whose package.json declares pi.extensions.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Pi extensions.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(config.default, DEFAULT_SELECTION_LAYER, DEFAULT_SELECTION_LAYER_INDEX, resolvers);\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\nfunction parentActivation(\n context: ExtensionContext,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const activation = [\n resolve.ownEntry(OWN_ENTRIES.cordisHost),\n resolve.ownEntry(OWN_ENTRIES.terminalChildSession),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.minorMode),\n resolve.ownEntry(OWN_ENTRIES.contextCatalog),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.session),\n resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui),\n ];\n if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));\n activation.push(\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain),\n resolve.ownEntry(OWN_ENTRIES.effort),\n // Child sessions are deliberately left out: a subagent thread has no model\n // chip to keep current, so journaling its switches would cost entries no\n // surface reads.\n resolve.ownEntry(OWN_ENTRIES.agentModel),\n );\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n activation.push(...distributionPaths, ...featurePaths);\n if (context.personaEntry) activation.push(context.personaEntry);\n if (context.autoStop) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.autostop));\n activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.cache));\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction childActivation(\n context: ExtensionContext,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const activation = [\n resolve.ownEntry(OWN_ENTRIES.cordisHost),\n resolve.ownEntry(OWN_ENTRIES.terminalChildSession),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.session),\n ...distributionPaths,\n ...featurePaths,\n ];\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n if (context.personaEntry) activation.push(context.personaEntry);\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction compositionFingerprint(composition: Omit<ExtensionComposition, 'fingerprint'>): string {\n return sha256(\n JSON.stringify(\n canonicalValue({\n ...composition,\n contract: {\n composition: COMPOSITION_FINGERPRINT_VERSION,\n standardPiExtension: STANDARD_PI_EXTENSION_CONTRACT_VERSION,\n fixedCorePackages: [...FIXED_CORE_PACKAGES],\n },\n parentCanonicalActivation: composition.parentActivation.map(canonicalModulePath),\n childCanonicalActivation: composition.childActivation.map(canonicalModulePath),\n }),\n ),\n );\n}\n\n/** Resolve one deterministic parent/child composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(context.majorModesConfig, resolvers);\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const withoutFingerprint: Omit<ExtensionComposition, 'fingerprint'> = {\n version: COMPOSITION_FINGERPRINT_VERSION,\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n parentActivation: parentActivation(context, distributionPaths, featurePaths),\n childActivation: childActivation(context, distributionPaths, featurePaths),\n };\n return { ...withoutFingerprint, fingerprint: compositionFingerprint(withoutFingerprint) };\n}\n\n/** Assemble parent entries in actual Pi factory activation order. */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).parentActivation];\n}\n\n/** Assemble detached-child entries in actual Pi factory activation order. */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).childActivation];\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"mappings":";;;iBAuBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;iBAGxB;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;YAGF;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;iBAGH;WACN;WACA;WACA;WACA;;;iBAIM;WACN;WACA;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;WACA;;;;;;;;;;;;;;;;;;wBAmBK,mBAAmB,aAAa,uBAAuB,eAAe;qBAgBzE;qBACA;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"mappings":";;;iBAuBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;iBAGxB;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;YAGF;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;iBAGH;WACN;WACA;WACA;WACA;;;iBAIM;WACN;WACA;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;WACA;;;;;;;;;;;;;;;;;;wBAmBK,mBAAmB,aAAa,uBAAuB,eAAe;qBAgBzE;qBACA;qBA6CA;;;;;;;;;qBAUA;qBAEA,iBAAiB;;;;;wBAoBd,qBAAqB,wBAAwB;;wBAmV7C,4BAA4B,SAAS,mBAAmB;;wBAsCxD,mBAAmB,SAAS;;wBAK5B,wBAAwB,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"mappings":";;;iBAuBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;iBAGxB;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;YAGF;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;iBAGH;WACN;WACA;WACA;WACA;;;iBAIM;WACN;WACA;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;WACA;;;;;;;;;;;;;;;;;;wBAmBK,mBAAmB,aAAa,uBAAuB,eAAe;qBAgBzE;qBACA;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"mappings":";;;iBAuBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;iBAGxB;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;YAGF;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;iBAGH;WACN;WACA;WACA;WACA;;;iBAIM;WACN;WACA;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;WACA;;;;;;;;;;;;;;;;;;wBAmBK,mBAAmB,aAAa,uBAAuB,eAAe;qBAgBzE;qBACA;qBA6CA;;;;;;;;;qBAUA;qBAEA,iBAAiB;;;;;wBAoBd,qBAAqB,wBAAwB;;wBAmV7C,4BAA4B,SAAS,mBAAmB;;wBAsCxD,mBAAmB,SAAS;;wBAK5B,wBAAwB,SAAS"}
|
|
@@ -52,6 +52,7 @@ const FIXED_CORE_PACKAGES = /* @__PURE__ */ new Set([
|
|
|
52
52
|
"@agimon-ai/doompi-minor-mode",
|
|
53
53
|
"@agimon-ai/doompi-notification",
|
|
54
54
|
"@agimon-ai/doompi-profile",
|
|
55
|
+
"@agimon-ai/doompi-session",
|
|
55
56
|
"@agimon-ai/doompi-skill",
|
|
56
57
|
"@agimon-ai/doompi-ui"
|
|
57
58
|
]);
|
|
@@ -74,6 +75,7 @@ const CORE_PACKAGE_ENTRIES = {
|
|
|
74
75
|
minorMode: "@agimon-ai/doompi-minor-mode/extensions/pi",
|
|
75
76
|
notification: "@agimon-ai/doompi-notification/extensions/pi",
|
|
76
77
|
profile: "@agimon-ai/doompi-profile/extensions/pi",
|
|
78
|
+
session: "@agimon-ai/doompi-session/extensions/pi",
|
|
77
79
|
skill: "@agimon-ai/doompi-skill/extensions/pi",
|
|
78
80
|
ui: "@agimon-ai/doompi-ui/extensions/pi"
|
|
79
81
|
};
|
|
@@ -282,6 +284,7 @@ function parentActivation(context, distributionPaths, featurePaths) {
|
|
|
282
284
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.minorMode),
|
|
283
285
|
resolve.ownEntry(OWN_ENTRIES.contextCatalog),
|
|
284
286
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),
|
|
287
|
+
resolve.packageEntry(CORE_PACKAGE_ENTRIES.session),
|
|
285
288
|
resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),
|
|
286
289
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui)
|
|
287
290
|
];
|
|
@@ -301,6 +304,7 @@ function childActivation(context, distributionPaths, featurePaths) {
|
|
|
301
304
|
resolve.ownEntry(OWN_ENTRIES.cordisHost),
|
|
302
305
|
resolve.ownEntry(OWN_ENTRIES.terminalChildSession),
|
|
303
306
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),
|
|
307
|
+
resolve.packageEntry(CORE_PACKAGE_ENTRIES.session),
|
|
304
308
|
...distributionPaths,
|
|
305
309
|
...featurePaths
|
|
306
310
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolvePackageEntries","resolveOptionalPackageEntries","resolveLocalPackageName"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import {\n isLocalPackageSpecifier,\n type LayerResolvers,\n type MajorModesConfig,\n} from '@agimon-ai/doompi-config/majorModes';\nimport type { PackageAttribution } from '@agimon-ai/doompi-config/types';\nimport {\n consumerPackageEntries,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntries as resolveOptionalPackageEntries,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntries as resolvePackageEntries,\n packageEntry as resolvePackageEntry,\n} from '@agimon-ai/doompi-core/module-resolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/doompi-core/runtime-identity';\nimport { extensionPackageName } from '@agimon-ai/doompi-ui/extensionName';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages through its standard Pi manifest. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n agents: boolean;\n autoStop: boolean;\n mute?: boolean;\n preset?: string;\n personaEntry?: string;\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to DoomPi composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by launch, sync, bundles, and replay. */\nexport interface ExtensionComposition {\n readonly version: number;\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Actual Pi factory activation order, not CLI argument construction order. */\n readonly parentActivation: readonly string[];\n /** Actual Pi factory activation order inherited by detached children. */\n readonly childActivation: readonly string[];\n readonly fingerprint: string;\n}\n\n/**\n * Which layer of which major mode admitted each package.\n *\n * The composition already holds this join while it resolves package names to\n * entry paths, then drops it, so a session cannot afterwards say why a tool is\n * present. Reducing it here keeps the selection type private and costs one pass\n * over an array the caller already has.\n *\n * Only `package` entries appear. A bare `extension` selector is a path rather\n * than a package name, so it has nothing a registered tool could be joined on.\n *\n * Keyed by manifest name first, because that is what a registered tool resolves\n * to. The selector is kept as an alias: a layer may name a package as\n * `@agimon-ai/doompi-team` when published or `./layers/team/doompi-team` in a\n * checkout, and both have to find the same layer.\n */\nexport function packageAttribution(composition: ExtensionComposition): Record<string, PackageAttribution> {\n const attribution: Record<string, PackageAttribution> = {};\n const mode = composition.majorMode?.name;\n if (mode === undefined) return attribution;\n for (const selection of composition.selections) {\n if (selection.entryKind !== 'package') continue;\n if (selection.outcome !== 'resolved') continue;\n // First layer wins, matching activation order: the earlier layer is the one\n // whose copy of a duplicated package actually loaded.\n const value: PackageAttribution = { kind: 'major', mode, layer: selection.layer };\n const manifest = selection.path === undefined ? undefined : extensionPackageName(selection.path);\n if (manifest !== undefined && attribution[manifest] === undefined) attribution[manifest] = value;\n if (attribution[selection.selector] === undefined) attribution[selection.selector] = value;\n }\n return attribution;\n}\nexport const COMPOSITION_FINGERPRINT_VERSION = 4;\nexport const STANDARD_PI_EXTENSION_CONTRACT_VERSION = 2;\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/doompi',\n '@agimon-ai/doompi-autostop',\n '@agimon-ai/doompi-cache',\n '@agimon-ai/doompi-config',\n '@agimon-ai/doompi-domain',\n '@agimon-ai/doompi-major-mode',\n '@agimon-ai/doompi-minor-mode',\n '@agimon-ai/doompi-notification',\n '@agimon-ai/doompi-profile',\n '@agimon-ai/doompi-skill',\n '@agimon-ai/doompi-ui',\n]);\n\nconst OWN_ENTRIES = {\n agentModel: 'agentModel',\n cordisFinalizer: 'cordisFinalizer',\n cordisHost: 'cordisHost',\n terminalChildSession: 'terminalChildSession',\n effort: 'effort',\n contextCatalog: 'contextCatalog',\n ollamaProvider: 'ollamaProvider',\n transitionCoordinator: 'transitionCoordinator',\n} as const;\n\nconst CORE_PACKAGE_ENTRIES = {\n autostop: '@agimon-ai/doompi-autostop/extensions/pi',\n cache: '@agimon-ai/doompi-cache/extensions/pi',\n config: '@agimon-ai/doompi-config/extensions/pi',\n domain: '@agimon-ai/doompi-domain/extensions/pi',\n majorMode: '@agimon-ai/doompi-major-mode/extensions/pi',\n minorMode: '@agimon-ai/doompi-minor-mode/extensions/pi',\n notification: '@agimon-ai/doompi-notification/extensions/pi',\n profile: '@agimon-ai/doompi-profile/extensions/pi',\n skill: '@agimon-ai/doompi-skill/extensions/pi',\n ui: '@agimon-ai/doompi-ui/extensions/pi',\n} as const;\n\nexport const OLLAMA_PRESET = 'ollama';\n\n/**\n * Always available so /profile can pick a persona later, and the one entry a\n * detached child shares with its parent: children get the persona without the\n * command, because they have no transition coordinator to run a switch through.\n *\n * An explicit subpath rather than the bare package name, so it resolves to\n * exactly this file rather than to whatever pi.extensions lists.\n */\nexport const PERSONA_ENTRY = '@agimon-ai/doompi-profile/extensions/persona';\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => resolvePackageEntries(specifier, import.meta.url),\n optionalPackageEntries: (specifier) => resolveOptionalPackageEntries(specifier, import.meta.url),\n localEntry,\n localEntries,\n localPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure.\n */\nexport function createLayerResolvers(consumerRoot?: string): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n const fallbackEntries = (name: string): string[] | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntries(name, import.meta.url) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = fallbackEntries(name) ?? consumerPackageEntries(name, consumerRoot);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => fallbackEntries(name) ?? consumerPackageEntries(name, consumerRoot),\n localEntry,\n localEntries,\n localPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new Error(\n `Layer \"${layer}\" cannot select fixed DoomPi host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Pi extensions.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a directory whose package.json declares pi.extensions.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Pi extensions.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(config.default, DEFAULT_SELECTION_LAYER, DEFAULT_SELECTION_LAYER_INDEX, resolvers);\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\nfunction parentActivation(\n context: ExtensionContext,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const activation = [\n resolve.ownEntry(OWN_ENTRIES.cordisHost),\n resolve.ownEntry(OWN_ENTRIES.terminalChildSession),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.minorMode),\n resolve.ownEntry(OWN_ENTRIES.contextCatalog),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui),\n ];\n if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));\n activation.push(\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain),\n resolve.ownEntry(OWN_ENTRIES.effort),\n // Child sessions are deliberately left out: a subagent thread has no model\n // chip to keep current, so journaling its switches would cost entries no\n // surface reads.\n resolve.ownEntry(OWN_ENTRIES.agentModel),\n );\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n activation.push(...distributionPaths, ...featurePaths);\n if (context.personaEntry) activation.push(context.personaEntry);\n if (context.autoStop) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.autostop));\n activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.cache));\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction childActivation(\n context: ExtensionContext,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const activation = [\n resolve.ownEntry(OWN_ENTRIES.cordisHost),\n resolve.ownEntry(OWN_ENTRIES.terminalChildSession),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n ...distributionPaths,\n ...featurePaths,\n ];\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n if (context.personaEntry) activation.push(context.personaEntry);\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction compositionFingerprint(composition: Omit<ExtensionComposition, 'fingerprint'>): string {\n return sha256(\n JSON.stringify(\n canonicalValue({\n ...composition,\n contract: {\n composition: COMPOSITION_FINGERPRINT_VERSION,\n standardPiExtension: STANDARD_PI_EXTENSION_CONTRACT_VERSION,\n fixedCorePackages: [...FIXED_CORE_PACKAGES],\n },\n parentCanonicalActivation: composition.parentActivation.map(canonicalModulePath),\n childCanonicalActivation: composition.childActivation.map(canonicalModulePath),\n }),\n ),\n );\n}\n\n/** Resolve one deterministic parent/child composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(context.majorModesConfig, resolvers);\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const withoutFingerprint: Omit<ExtensionComposition, 'fingerprint'> = {\n version: COMPOSITION_FINGERPRINT_VERSION,\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n parentActivation: parentActivation(context, distributionPaths, featurePaths),\n childActivation: childActivation(context, distributionPaths, featurePaths),\n };\n return { ...withoutFingerprint, fingerprint: compositionFingerprint(withoutFingerprint) };\n}\n\n/** Assemble parent entries in actual Pi factory activation order. */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).parentActivation];\n}\n\n/** Assemble detached-child entries in actual Pi factory activation order. */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).childActivation];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolvePackageEntries","resolveOptionalPackageEntries","resolveLocalPackageName"],"sources":["../../../../src/builders/cli/extensionAssembler/index.ts"],"sourcesContent":["import {\n isLocalPackageSpecifier,\n type LayerResolvers,\n type MajorModesConfig,\n} from '@agimon-ai/doompi-config/majorModes';\nimport type { PackageAttribution } from '@agimon-ai/doompi-config/types';\nimport {\n consumerPackageEntries,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntries as resolveOptionalPackageEntries,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntries as resolvePackageEntries,\n packageEntry as resolvePackageEntry,\n} from '@agimon-ai/doompi-core/module-resolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/doompi-core/runtime-identity';\nimport { extensionPackageName } from '@agimon-ai/doompi-ui/extensionName';\n\nimport { ownEntry } from '../entryResolution';\n\nexport interface ExtensionLayerResolvers extends LayerResolvers {\n /** Resolves a path authored under packages through its standard Pi manifest. */\n localPackageEntries?: (specifier: string, baseDirectory: string) => string[] | undefined;\n /** Canonical manifest name for a path that represents a package directory. */\n localPackageName?: (specifier: string, baseDirectory: string) => string | undefined;\n}\n\nexport interface ExtensionContext {\n agents: boolean;\n autoStop: boolean;\n mute?: boolean;\n preset?: string;\n personaEntry?: string;\n /** Named mode whose occurrence is part of composition identity. */\n majorMode?: string;\n /** Ordered layer occurrences selected by the active major mode. */\n layers: string[];\n majorModesConfig: MajorModesConfig;\n /** Resolver override used by synchronized replay. */\n resolvers?: ExtensionLayerResolvers;\n}\n\nexport type SelectedEntryKind = 'extension' | 'package';\ntype ExtensionResolutionOutcome = 'resolved' | 'missing-optional';\n\n/**\n * One resolver-derived extension occurrence.\n *\n * This remains private to DoomPi composition. It is not package metadata and\n * deliberately retains authored duplicates even though activation paths are\n * deduplicated later.\n */\ninterface ResolvedExtensionSelection {\n readonly layer: string;\n readonly layerIndex: number;\n readonly entryKind: SelectedEntryKind;\n readonly entryIndex: number;\n readonly manifestIndex: number;\n readonly selector: string;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n readonly optional: boolean;\n readonly outcome: ExtensionResolutionOutcome;\n readonly path?: string;\n readonly canonicalPath?: string;\n readonly diagnostic?: string;\n readonly config?: Record<string, unknown>;\n}\n\nexport interface CompositionLayerOccurrence {\n readonly name: string;\n readonly index: number;\n readonly sourceFile?: string;\n readonly baseDirectory: string;\n}\n\n/** Internal normalized composition shared by launch, sync, bundles, and replay. */\nexport interface ExtensionComposition {\n readonly version: number;\n readonly majorMode?: {\n readonly name: string;\n readonly sourceFile?: string;\n readonly baseDirectory?: string;\n };\n readonly layers: readonly CompositionLayerOccurrence[];\n readonly selections: readonly ResolvedExtensionSelection[];\n /** Actual Pi factory activation order, not CLI argument construction order. */\n readonly parentActivation: readonly string[];\n /** Actual Pi factory activation order inherited by detached children. */\n readonly childActivation: readonly string[];\n readonly fingerprint: string;\n}\n\n/**\n * Which layer of which major mode admitted each package.\n *\n * The composition already holds this join while it resolves package names to\n * entry paths, then drops it, so a session cannot afterwards say why a tool is\n * present. Reducing it here keeps the selection type private and costs one pass\n * over an array the caller already has.\n *\n * Only `package` entries appear. A bare `extension` selector is a path rather\n * than a package name, so it has nothing a registered tool could be joined on.\n *\n * Keyed by manifest name first, because that is what a registered tool resolves\n * to. The selector is kept as an alias: a layer may name a package as\n * `@agimon-ai/doompi-team` when published or `./layers/team/doompi-team` in a\n * checkout, and both have to find the same layer.\n */\nexport function packageAttribution(composition: ExtensionComposition): Record<string, PackageAttribution> {\n const attribution: Record<string, PackageAttribution> = {};\n const mode = composition.majorMode?.name;\n if (mode === undefined) return attribution;\n for (const selection of composition.selections) {\n if (selection.entryKind !== 'package') continue;\n if (selection.outcome !== 'resolved') continue;\n // First layer wins, matching activation order: the earlier layer is the one\n // whose copy of a duplicated package actually loaded.\n const value: PackageAttribution = { kind: 'major', mode, layer: selection.layer };\n const manifest = selection.path === undefined ? undefined : extensionPackageName(selection.path);\n if (manifest !== undefined && attribution[manifest] === undefined) attribution[manifest] = value;\n if (attribution[selection.selector] === undefined) attribution[selection.selector] = value;\n }\n return attribution;\n}\nexport const COMPOSITION_FINGERPRINT_VERSION = 4;\nexport const STANDARD_PI_EXTENSION_CONTRACT_VERSION = 2;\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/doompi',\n '@agimon-ai/doompi-autostop',\n '@agimon-ai/doompi-cache',\n '@agimon-ai/doompi-config',\n '@agimon-ai/doompi-domain',\n '@agimon-ai/doompi-major-mode',\n '@agimon-ai/doompi-minor-mode',\n '@agimon-ai/doompi-notification',\n '@agimon-ai/doompi-profile',\n '@agimon-ai/doompi-session',\n '@agimon-ai/doompi-skill',\n '@agimon-ai/doompi-ui',\n]);\n\nconst OWN_ENTRIES = {\n agentModel: 'agentModel',\n cordisFinalizer: 'cordisFinalizer',\n cordisHost: 'cordisHost',\n terminalChildSession: 'terminalChildSession',\n effort: 'effort',\n contextCatalog: 'contextCatalog',\n ollamaProvider: 'ollamaProvider',\n transitionCoordinator: 'transitionCoordinator',\n} as const;\n\nconst CORE_PACKAGE_ENTRIES = {\n autostop: '@agimon-ai/doompi-autostop/extensions/pi',\n cache: '@agimon-ai/doompi-cache/extensions/pi',\n config: '@agimon-ai/doompi-config/extensions/pi',\n domain: '@agimon-ai/doompi-domain/extensions/pi',\n majorMode: '@agimon-ai/doompi-major-mode/extensions/pi',\n minorMode: '@agimon-ai/doompi-minor-mode/extensions/pi',\n notification: '@agimon-ai/doompi-notification/extensions/pi',\n profile: '@agimon-ai/doompi-profile/extensions/pi',\n session: '@agimon-ai/doompi-session/extensions/pi',\n skill: '@agimon-ai/doompi-skill/extensions/pi',\n ui: '@agimon-ai/doompi-ui/extensions/pi',\n} as const;\n\nexport const OLLAMA_PRESET = 'ollama';\n\n/**\n * Always available so /profile can pick a persona later, and the one entry a\n * detached child shares with its parent: children get the persona without the\n * command, because they have no transition coordinator to run a switch through.\n *\n * An explicit subpath rather than the bare package name, so it resolves to\n * exactly this file rather than to whatever pi.extensions lists.\n */\nexport const PERSONA_ENTRY = '@agimon-ai/doompi-profile/extensions/persona';\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: (specifier) => resolvePackageEntry(specifier, import.meta.url),\n optionalPackageEntry: (specifier) => resolveOptionalPackageEntry(specifier, import.meta.url),\n packageEntries: (specifier) => resolvePackageEntries(specifier, import.meta.url),\n optionalPackageEntries: (specifier) => resolveOptionalPackageEntries(specifier, import.meta.url),\n localEntry,\n localEntries,\n localPackageEntries,\n localPackageName: resolveLocalPackageName,\n};\n\nfunction missingConsumerPackage(name: string, consumerRoot: string): Error {\n return new Error(`Cannot resolve configured package \"${name}\" from ${consumerRoot}.`);\n}\n\n/**\n * Resolves configured packages only from the consumer, while fixed core entries\n * may fall back to the host package's private dependency closure.\n */\nexport function createLayerResolvers(consumerRoot?: string): ExtensionLayerResolvers {\n if (!consumerRoot) return LAYER_RESOLVERS;\n // Fixed host packages must match the executable, even when home contains an older installation.\n const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name, import.meta.url) : undefined;\n const fallbackEntries = (name: string): string[] | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntries(name, import.meta.url) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = fallbackEntries(name) ?? consumerPackageEntries(name, consumerRoot);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => fallbackEntry(name) ?? consumerPackageEntry(name, consumerRoot),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => fallbackEntries(name) ?? consumerPackageEntries(name, consumerRoot),\n localEntry,\n localEntries,\n localPackageEntries,\n localPackageName: resolveLocalPackageName,\n };\n}\n\nfunction packageName(specifier: string): string {\n const segments = specifier.split('/');\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : (segments[0] ?? specifier);\n}\n\nfunction assertFeaturePackage(specifier: string, layer: string): void {\n const selectedPackage = packageName(specifier);\n if (FIXED_CORE_PACKAGES.has(selectedPackage)) {\n throw new Error(\n `Layer \"${layer}\" cannot select fixed DoomPi host package \"${selectedPackage}\" as a feature extension.`,\n );\n }\n}\n\nfunction resolveLocalExtensionEntries(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n const single = resolvers.localEntry(specifier, baseDirectory);\n return single ? [single] : undefined;\n}\n\nfunction resolveLocalPackageSelections(\n resolvers: ExtensionLayerResolvers,\n specifier: string,\n baseDirectory: string,\n): string[] | undefined {\n const resolved = resolvers.localPackageEntries?.(specifier, baseDirectory);\n if (resolved !== undefined) return resolved;\n return resolveLocalExtensionEntries(resolvers, specifier, baseDirectory);\n}\n\ninterface SelectionIdentity {\n layer: string;\n layerIndex: number;\n entryKind: SelectedEntryKind;\n entryIndex: number;\n selector: string;\n sourceFile?: string;\n baseDirectory: string;\n optional: boolean;\n config?: Record<string, unknown>;\n}\n\nfunction resolvedSelection(\n identity: SelectionIdentity,\n manifestIndex: number,\n resolvedPath: string,\n): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex,\n outcome: 'resolved',\n path: resolvedPath,\n canonicalPath: canonicalModulePath(resolvedPath),\n };\n}\n\nfunction missingOptionalSelection(identity: SelectionIdentity, diagnostic: string): ResolvedExtensionSelection {\n return {\n ...identity,\n manifestIndex: 0,\n outcome: 'missing-optional',\n diagnostic,\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction resolveDefinitionSelections(\n definition: MajorModesConfig['layers'][string],\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n const resolvedSelections: ResolvedExtensionSelection[] = [];\n const extensionEntries = definition.extensions ?? [];\n for (const [entryIndex, selector] of extensionEntries.entries()) {\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'extension',\n entryIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional: false,\n };\n if (!isLocalPackageSpecifier(selector)) {\n resolvedSelections.push(resolvedSelection(identity, 0, resolvers.ownEntry(selector)));\n continue;\n }\n const resolved = resolveLocalExtensionEntries(resolvers, selector, definition.baseDirectory);\n if (!resolved?.length) {\n throw new Error(\n `Layer \"${layer}\" extension \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at a Pi extension file or directory.',\n );\n }\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n const packageOffset = extensionEntries.length;\n for (const [packageIndex, configured] of (definition.packages ?? []).entries()) {\n const selector = typeof configured === 'string' ? configured : configured.name;\n const optional = typeof configured === 'string' ? false : configured.optional === true;\n const configValue = typeof configured === 'string' ? undefined : configured.config;\n const identity: SelectionIdentity = {\n layer,\n layerIndex,\n entryKind: 'package',\n entryIndex: packageOffset + packageIndex,\n selector,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n optional,\n ...(configValue === undefined ? {} : { config: configValue }),\n };\n\n let resolved: string[] | undefined;\n try {\n if (isLocalPackageSpecifier(selector)) {\n const manifestName = resolvers.localPackageName?.(selector, definition.baseDirectory);\n if (manifestName) assertFeaturePackage(manifestName, layer);\n resolved = resolveLocalPackageSelections(resolvers, selector, definition.baseDirectory);\n } else {\n assertFeaturePackage(selector, layer);\n if (optional) {\n resolved = resolvers.optionalPackageEntries?.(selector);\n if (resolved === undefined && !resolvers.optionalPackageEntries) {\n const single = resolvers.optionalPackageEntry(selector);\n resolved = single ? [single] : undefined;\n }\n } else {\n resolved = resolvers.packageEntries?.(selector) ?? [resolvers.packageEntry(selector)];\n }\n }\n } catch (error) {\n if (optional) {\n resolvedSelections.push(missingOptionalSelection(identity, errorMessage(error)));\n continue;\n }\n throw error;\n }\n\n if (!resolved?.length) {\n if (optional) {\n resolvedSelections.push(\n missingOptionalSelection(\n identity,\n `Optional package \"${selector}\" is unavailable or declares no Pi extensions.`,\n ),\n );\n continue;\n }\n if (isLocalPackageSpecifier(selector)) {\n throw new Error(\n `Layer \"${layer}\" package \"${selector}\" does not resolve under ${definition.baseDirectory}. ` +\n 'Point it at an extension file, or a directory whose package.json declares pi.extensions.',\n );\n }\n throw new Error(`Layer \"${layer}\" package \"${selector}\" declares no Pi extensions.`);\n }\n\n resolved.forEach((resolvedPath, manifestIndex) => {\n resolvedSelections.push(resolvedSelection(identity, manifestIndex, resolvedPath));\n });\n }\n\n return resolvedSelections;\n}\n\nfunction resolveLayerSelections(\n config: MajorModesConfig,\n layer: string,\n layerIndex: number,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n const definition = config.layers[layer];\n if (!definition) throw new Error(`Unknown layer: ${layer}`);\n return resolveDefinitionSelections(definition, layer, layerIndex, resolvers);\n}\n\nfunction resolveDefaultSelections(\n config: MajorModesConfig,\n resolvers: ExtensionLayerResolvers,\n): ResolvedExtensionSelection[] {\n if (!config.default) return [];\n return resolveDefinitionSelections(config.default, DEFAULT_SELECTION_LAYER, DEFAULT_SELECTION_LAYER_INDEX, resolvers);\n}\n\nfunction resolveSelectedExtensions(context: ExtensionContext): ResolvedExtensionSelection[] {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n return context.layers.flatMap((layer, layerIndex) =>\n resolveLayerSelections(context.majorModesConfig, layer, layerIndex, resolvers),\n );\n}\n\nfunction deduplicatePaths(paths: readonly string[]): string[] {\n const seen = new Set<string>();\n const selected: string[] = [];\n for (const entry of paths) {\n const identity = canonicalModulePath(entry);\n if (seen.has(identity)) continue;\n seen.add(identity);\n selected.push(entry);\n }\n return selected;\n}\n\nfunction selectedFeaturePaths(selections: readonly ResolvedExtensionSelection[]): string[] {\n return deduplicatePaths(\n selections.flatMap((entry) => (entry.outcome === 'resolved' && entry.path ? [entry.path] : [])),\n );\n}\n\nfunction parentActivation(\n context: ExtensionContext,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const activation = [\n resolve.ownEntry(OWN_ENTRIES.cordisHost),\n resolve.ownEntry(OWN_ENTRIES.terminalChildSession),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.minorMode),\n resolve.ownEntry(OWN_ENTRIES.contextCatalog),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.session),\n resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui),\n ];\n if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));\n activation.push(\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain),\n resolve.ownEntry(OWN_ENTRIES.effort),\n // Child sessions are deliberately left out: a subagent thread has no model\n // chip to keep current, so journaling its switches would cost entries no\n // surface reads.\n resolve.ownEntry(OWN_ENTRIES.agentModel),\n );\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n activation.push(...distributionPaths, ...featurePaths);\n if (context.personaEntry) activation.push(context.personaEntry);\n if (context.autoStop) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.autostop));\n activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.cache));\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction childActivation(\n context: ExtensionContext,\n distributionPaths: readonly string[],\n featurePaths: readonly string[],\n): string[] {\n const resolve = context.resolvers ?? LAYER_RESOLVERS;\n const activation = [\n resolve.ownEntry(OWN_ENTRIES.cordisHost),\n resolve.ownEntry(OWN_ENTRIES.terminalChildSession),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.session),\n ...distributionPaths,\n ...featurePaths,\n ];\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n if (context.personaEntry) activation.push(context.personaEntry);\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction compositionFingerprint(composition: Omit<ExtensionComposition, 'fingerprint'>): string {\n return sha256(\n JSON.stringify(\n canonicalValue({\n ...composition,\n contract: {\n composition: COMPOSITION_FINGERPRINT_VERSION,\n standardPiExtension: STANDARD_PI_EXTENSION_CONTRACT_VERSION,\n fixedCorePackages: [...FIXED_CORE_PACKAGES],\n },\n parentCanonicalActivation: composition.parentActivation.map(canonicalModulePath),\n childCanonicalActivation: composition.childActivation.map(canonicalModulePath),\n }),\n ),\n );\n}\n\n/** Resolve one deterministic parent/child composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(context.majorModesConfig, resolvers);\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const withoutFingerprint: Omit<ExtensionComposition, 'fingerprint'> = {\n version: COMPOSITION_FINGERPRINT_VERSION,\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n parentActivation: parentActivation(context, distributionPaths, featurePaths),\n childActivation: childActivation(context, distributionPaths, featurePaths),\n };\n return { ...withoutFingerprint, fingerprint: compositionFingerprint(withoutFingerprint) };\n}\n\n/** Assemble parent entries in actual Pi factory activation order. */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).parentActivation];\n}\n\n/** Assemble detached-child entries in actual Pi factory activation order. */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).childActivation];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_index = require("../../compiler/index.cjs");
|
|
3
|
+
let node_fs = require("node:fs");
|
|
4
|
+
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
5
|
+
let node_path = require("node:path");
|
|
6
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
7
|
+
let _agimon_ai_doompi_core_runtime_json = require("@agimon-ai/doompi-core/runtime-json");
|
|
8
|
+
let node_crypto = require("node:crypto");
|
|
9
|
+
node_crypto = require_runtime.__toESM(node_crypto, 1);
|
|
10
|
+
let _agimon_ai_doompi_core_mcp_facet = require("@agimon-ai/doompi-core/mcp-facet");
|
|
11
|
+
//#region src/builders/server/mcpBundle.ts
|
|
12
|
+
function packageRootOf(entry) {
|
|
13
|
+
let directory = node_path.default.dirname(node_fs.default.realpathSync(entry));
|
|
14
|
+
for (;;) {
|
|
15
|
+
if (node_fs.default.existsSync(node_path.default.join(directory, "package.json"))) return directory;
|
|
16
|
+
const parent = node_path.default.dirname(directory);
|
|
17
|
+
if (parent === directory) throw new Error(`No package manifest owns ${entry}`);
|
|
18
|
+
directory = parent;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function packagePath(packageDir, field, value) {
|
|
22
|
+
if (typeof value !== "string" || !value.startsWith("./") || value.includes("..")) throw new Error(`doompiMcp ${field} in ${packageDir} must be a package-relative ./path with no '..'.`);
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
function declaredMcpPlugin(packageDir, manifest) {
|
|
26
|
+
const value = manifest.doompiMcp;
|
|
27
|
+
if (value === void 0) return void 0;
|
|
28
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error(`doompiMcp manifest in ${packageDir} must be an object.`);
|
|
29
|
+
const declaration = value;
|
|
30
|
+
if (!Array.isArray(declaration.scopes) || declaration.scopes.length !== 1 || declaration.scopes[0] !== "session") throw new Error(`doompiMcp scopes in ${packageDir} must be exactly ['session'].`);
|
|
31
|
+
const packageName = manifest.name;
|
|
32
|
+
if (typeof packageName !== "string" || packageName === "") throw new Error(`Package in ${packageDir} has no name.`);
|
|
33
|
+
return {
|
|
34
|
+
packageName,
|
|
35
|
+
packageDir,
|
|
36
|
+
entry: packagePath(packageDir, "entry", declaration.entry),
|
|
37
|
+
dist: packagePath(packageDir, "dist", declaration.dist)
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Stages explicit package MCP entries into a generation-owned descriptor. */
|
|
41
|
+
async function syncMcpBundle(input) {
|
|
42
|
+
const descriptorPath = node_path.default.join(input.outputDirectory, _agimon_ai_doompi_core_mcp_facet.DOOM_MCP_BUNDLE_FILE);
|
|
43
|
+
if (node_fs.default.existsSync(descriptorPath)) throw new Error("An MCP bundle generation cannot be overwritten");
|
|
44
|
+
const packages = /* @__PURE__ */ new Map();
|
|
45
|
+
for (const composition of input.compositions) {
|
|
46
|
+
const majorMode = composition.majorMode?.name;
|
|
47
|
+
if (!majorMode) throw new Error("An MCP bundle composition needs its major mode");
|
|
48
|
+
for (const root of new Set(composition.parentActivation.map(packageRootOf))) {
|
|
49
|
+
const declaration = declaredMcpPlugin(root, JSON.parse(node_fs.default.readFileSync(node_path.default.join(root, "package.json"), "utf8")));
|
|
50
|
+
if (declaration === void 0) continue;
|
|
51
|
+
const previous = packages.get(declaration.packageName);
|
|
52
|
+
if (previous && previous.declaration.packageDir !== root) throw new Error(`Ambiguous MCP bundle package: ${declaration.packageName}`);
|
|
53
|
+
const candidate = previous ?? {
|
|
54
|
+
declaration,
|
|
55
|
+
owners: []
|
|
56
|
+
};
|
|
57
|
+
const layers = composition.selections.filter((selection) => selection.outcome === "resolved" && selection.path && packageRootOf(selection.path) === root).map((selection) => selection.layer);
|
|
58
|
+
for (const layer of new Set(layers.length > 0 ? layers : ["default"])) if (!candidate.owners.some((owner) => owner.majorMode === majorMode && owner.layer === layer)) candidate.owners.push({
|
|
59
|
+
majorMode,
|
|
60
|
+
layer
|
|
61
|
+
});
|
|
62
|
+
packages.set(declaration.packageName, candidate);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
node_fs.default.mkdirSync(input.outputDirectory, { recursive: true });
|
|
66
|
+
const entries = [];
|
|
67
|
+
const compilerManifests = {};
|
|
68
|
+
for (const [index, { declaration, owners }] of [...packages.values()].entries()) {
|
|
69
|
+
const builtEntry = node_fs.default.realpathSync(node_path.default.resolve(declaration.packageDir, declaration.dist));
|
|
70
|
+
const relative = node_path.default.relative(declaration.packageDir, builtEntry);
|
|
71
|
+
if (relative === ".." || relative.startsWith(`..${node_path.default.sep}`) || node_path.default.isAbsolute(relative)) throw new Error(`MCP entry escapes package: ${declaration.packageName}`);
|
|
72
|
+
const compileOptions = {
|
|
73
|
+
repositoryRoot: input.repositoryRoot,
|
|
74
|
+
sharedCacheDirectory: input.sharedCacheDirectory,
|
|
75
|
+
outputDirectory: node_path.default.join(input.outputDirectory, "modules", String(index)),
|
|
76
|
+
outputName: "plugin"
|
|
77
|
+
};
|
|
78
|
+
const module = await require_index.compileExtensionModule(builtEntry, input.cacheDirectory, compileOptions);
|
|
79
|
+
compilerManifests[declaration.packageName] = require_index.extensionModuleManifestPath(builtEntry, input.cacheDirectory, compileOptions);
|
|
80
|
+
entries.push({
|
|
81
|
+
packageName: declaration.packageName,
|
|
82
|
+
entry: declaration.entry,
|
|
83
|
+
module: `./${node_path.default.relative(input.outputDirectory, module).split(node_path.default.sep).join("/")}`,
|
|
84
|
+
sha256: node_crypto.default.createHash("sha256").update(node_fs.default.readFileSync(module)).digest("hex"),
|
|
85
|
+
owners
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const descriptor = (0, _agimon_ai_doompi_core_mcp_facet.parseDoomMcpBundle)({
|
|
89
|
+
version: _agimon_ai_doompi_core_mcp_facet.DOOM_MCP_BUNDLE_VERSION,
|
|
90
|
+
generation: input.generation,
|
|
91
|
+
fingerprint: input.fingerprint,
|
|
92
|
+
entries
|
|
93
|
+
});
|
|
94
|
+
(0, _agimon_ai_doompi_core_runtime_json.writeFileAtomic)(descriptorPath, `${JSON.stringify(descriptor, null, 2)}\n`);
|
|
95
|
+
return {
|
|
96
|
+
descriptor,
|
|
97
|
+
compilerManifests
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//#endregion
|
|
101
|
+
exports.syncMcpBundle = syncMcpBundle;
|
|
102
|
+
|
|
103
|
+
//# sourceMappingURL=mcpBundle.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpBundle.cjs","names":["path","fs","DOOM_MCP_BUNDLE_FILE","compileExtensionModule","extensionModuleManifestPath","crypto","parseDoomMcpBundle","DOOM_MCP_BUNDLE_VERSION"],"sources":["../../../src/builders/server/mcpBundle.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport {\n DOOM_MCP_BUNDLE_FILE,\n DOOM_MCP_BUNDLE_VERSION,\n type DoomMcpBundle,\n type DoomMcpBundleEntry,\n parseDoomMcpBundle,\n} from '@agimon-ai/doompi-core/mcp-facet';\nimport { writeFileAtomic } from '@agimon-ai/doompi-core/runtime-json';\nimport type { DoomServerBundleOwner } from '@agimon-ai/doompi-core/server-facet';\n\nimport { compileExtensionModule, extensionModuleManifestPath } from '../../compiler';\nimport type { ExtensionComposition } from '../cli/extensionAssembler';\n\ninterface DeclaredMcpPlugin {\n readonly packageName: string;\n readonly packageDir: string;\n readonly entry: string;\n readonly dist: string;\n}\n\nexport interface McpBundleSyncInput {\n readonly generation: string;\n readonly fingerprint: string;\n readonly repositoryRoot: string;\n readonly compositions: readonly ExtensionComposition[];\n readonly outputDirectory: string;\n readonly cacheDirectory: string;\n readonly sharedCacheDirectory?: string;\n}\n\nexport interface McpBundleSyncResult {\n readonly descriptor: DoomMcpBundle;\n readonly compilerManifests: Record<string, string>;\n}\n\nfunction packageRootOf(entry: string): string {\n let directory = path.dirname(fs.realpathSync(entry));\n for (;;) {\n if (fs.existsSync(path.join(directory, 'package.json'))) return directory;\n const parent = path.dirname(directory);\n if (parent === directory) throw new Error(`No package manifest owns ${entry}`);\n directory = parent;\n }\n}\n\nfunction packagePath(packageDir: string, field: string, value: unknown): string {\n if (typeof value !== 'string' || !value.startsWith('./') || value.includes('..'))\n throw new Error(`doompiMcp ${field} in ${packageDir} must be a package-relative ./path with no '..'.`);\n return value;\n}\n\nfunction declaredMcpPlugin(packageDir: string, manifest: Record<string, unknown>): DeclaredMcpPlugin | undefined {\n const value = manifest.doompiMcp;\n if (value === undefined) return undefined;\n if (typeof value !== 'object' || value === null || Array.isArray(value))\n throw new Error(`doompiMcp manifest in ${packageDir} must be an object.`);\n const declaration = value as Record<string, unknown>;\n if (!Array.isArray(declaration.scopes) || declaration.scopes.length !== 1 || declaration.scopes[0] !== 'session')\n throw new Error(`doompiMcp scopes in ${packageDir} must be exactly ['session'].`);\n const packageName = manifest.name;\n if (typeof packageName !== 'string' || packageName === '') throw new Error(`Package in ${packageDir} has no name.`);\n return {\n packageName,\n packageDir,\n entry: packagePath(packageDir, 'entry', declaration.entry),\n dist: packagePath(packageDir, 'dist', declaration.dist),\n };\n}\n\n/** Stages explicit package MCP entries into a generation-owned descriptor. */\nexport async function syncMcpBundle(input: McpBundleSyncInput): Promise<McpBundleSyncResult> {\n const descriptorPath = path.join(input.outputDirectory, DOOM_MCP_BUNDLE_FILE);\n if (fs.existsSync(descriptorPath)) throw new Error('An MCP bundle generation cannot be overwritten');\n const packages = new Map<string, { declaration: DeclaredMcpPlugin; owners: DoomServerBundleOwner[] }>();\n for (const composition of input.compositions) {\n const majorMode = composition.majorMode?.name;\n if (!majorMode) throw new Error('An MCP bundle composition needs its major mode');\n for (const root of new Set(composition.parentActivation.map(packageRootOf))) {\n const manifest = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')) as Record<string, unknown>;\n const declaration = declaredMcpPlugin(root, manifest);\n if (declaration === undefined) continue;\n const previous = packages.get(declaration.packageName);\n if (previous && previous.declaration.packageDir !== root)\n throw new Error(`Ambiguous MCP bundle package: ${declaration.packageName}`);\n const candidate = previous ?? { declaration, owners: [] };\n const layers = composition.selections\n .filter(\n (selection) => selection.outcome === 'resolved' && selection.path && packageRootOf(selection.path) === root,\n )\n .map((selection) => selection.layer);\n for (const layer of new Set(layers.length > 0 ? layers : ['default'])) {\n if (!candidate.owners.some((owner) => owner.majorMode === majorMode && owner.layer === layer))\n candidate.owners.push({ majorMode, layer });\n }\n packages.set(declaration.packageName, candidate);\n }\n }\n fs.mkdirSync(input.outputDirectory, { recursive: true });\n const entries: DoomMcpBundleEntry[] = [];\n const compilerManifests: Record<string, string> = {};\n for (const [index, { declaration, owners }] of [...packages.values()].entries()) {\n const builtEntry = fs.realpathSync(path.resolve(declaration.packageDir, declaration.dist));\n const relative = path.relative(declaration.packageDir, builtEntry);\n if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))\n throw new Error(`MCP entry escapes package: ${declaration.packageName}`);\n const compileOptions = {\n repositoryRoot: input.repositoryRoot,\n sharedCacheDirectory: input.sharedCacheDirectory,\n outputDirectory: path.join(input.outputDirectory, 'modules', String(index)),\n outputName: 'plugin',\n };\n const module = await compileExtensionModule(builtEntry, input.cacheDirectory, compileOptions);\n compilerManifests[declaration.packageName] = extensionModuleManifestPath(\n builtEntry,\n input.cacheDirectory,\n compileOptions,\n );\n entries.push({\n packageName: declaration.packageName,\n entry: declaration.entry,\n module: `./${path.relative(input.outputDirectory, module).split(path.sep).join('/')}`,\n sha256: crypto.createHash('sha256').update(fs.readFileSync(module)).digest('hex'),\n owners,\n });\n }\n const descriptor = parseDoomMcpBundle({\n version: DOOM_MCP_BUNDLE_VERSION,\n generation: input.generation,\n fingerprint: input.fingerprint,\n entries,\n });\n writeFileAtomic(descriptorPath, `${JSON.stringify(descriptor, null, 2)}\\n`);\n return { descriptor, compilerManifests };\n}\n"],"mappings":"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"}
|