@agimon-ai/doompi 0.0.1-alpha.109 → 0.0.1-alpha.110
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/README.md +12 -1
- package/dist/builders/cli/extensionAssembler/index.cjs +2 -1
- package/dist/builders/cli/extensionAssembler/index.cjs.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.d.mts.map +1 -1
- package/dist/builders/cli/extensionAssembler/index.mjs +2 -1
- package/dist/builders/cli/extensionAssembler/index.mjs.map +1 -1
- package/dist/extensions/fast.cjs +64 -0
- package/dist/extensions/fast.cjs.map +1 -0
- package/dist/extensions/fast.d.mts +8 -0
- package/dist/extensions/fast.d.mts.map +1 -0
- package/dist/extensions/fast.mjs +58 -0
- package/dist/extensions/fast.mjs.map +1 -0
- package/dist/extensions/server.cjs +10 -0
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +10 -0
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/extensions/terminalChildSession.cjs +5 -0
- package/dist/extensions/terminalChildSession.cjs.map +1 -1
- package/dist/extensions/terminalChildSession.d.mts.map +1 -1
- package/dist/extensions/terminalChildSession.mjs +5 -0
- package/dist/extensions/terminalChildSession.mjs.map +1 -1
- package/dist/src/builders/server/runtime.cjs +14 -4
- package/dist/src/builders/server/runtime.cjs.map +1 -1
- package/dist/src/builders/server/runtime.mjs +14 -4
- package/dist/src/builders/server/runtime.mjs.map +1 -1
- package/dist/src/builders/server/sessionArguments.cjs +1 -0
- package/dist/src/builders/server/sessionArguments.cjs.map +1 -1
- package/dist/src/builders/server/sessionArguments.mjs +1 -0
- package/dist/src/builders/server/sessionArguments.mjs.map +1 -1
- package/dist/src/cli/commands/history-export/help.cjs +3 -9
- package/dist/src/cli/commands/history-export/help.cjs.map +1 -1
- package/dist/src/cli/commands/history-export/help.mjs +3 -9
- package/dist/src/cli/commands/history-export/help.mjs.map +1 -1
- package/dist/src/cli/commands/history-export/index.cjs +3 -64
- package/dist/src/cli/commands/history-export/index.cjs.map +1 -1
- package/dist/src/cli/commands/history-export/index.mjs +3 -62
- package/dist/src/cli/commands/history-export/index.mjs.map +1 -1
- package/dist/src/cli/commands/history-import/help.cjs +3 -11
- package/dist/src/cli/commands/history-import/help.cjs.map +1 -1
- package/dist/src/cli/commands/history-import/help.mjs +3 -11
- package/dist/src/cli/commands/history-import/help.mjs.map +1 -1
- package/dist/src/cli/commands/history-import/index.cjs +3 -66
- package/dist/src/cli/commands/history-import/index.cjs.map +1 -1
- package/dist/src/cli/commands/history-import/index.mjs +3 -63
- package/dist/src/cli/commands/history-import/index.mjs.map +1 -1
- package/package.json +32 -28
package/README.md
CHANGED
|
@@ -51,7 +51,18 @@ releases.
|
|
|
51
51
|
|
|
52
52
|
- Node.js 22.19.0 or newer
|
|
53
53
|
- Release targets: macOS arm64, Linux x64, and Linux arm64
|
|
54
|
-
- Pi 0.
|
|
54
|
+
- Pi 1.0.0 and Pi TUI 1.0.0 for packages that declare them as peer requirements
|
|
55
|
+
|
|
56
|
+
## Pi 1.0 sessions and Codex Fast
|
|
57
|
+
|
|
58
|
+
Headless sessions use fresh `durable-v1` storage. Earlier headless sessions cannot be resumed or
|
|
59
|
+
converted. Their files remain untouched, without migration or backups.
|
|
60
|
+
|
|
61
|
+
Use `/fast on|off` in CLI or server sessions, or the **Fast** switch in the web model picker.
|
|
62
|
+
Fast requests Codex priority service, which may increase cost, independently of thinking effort.
|
|
63
|
+
Fresh top-level sessions default to off. New subagents and child sessions inherit the parent's
|
|
64
|
+
current setting, then persist their own setting across resumes. Other providers never receive
|
|
65
|
+
DoomPi's priority flag.
|
|
55
66
|
|
|
56
67
|
## Try DoomPi without replacing your Pi setup
|
|
57
68
|
|
|
@@ -63,6 +63,7 @@ const OWN_ENTRIES = {
|
|
|
63
63
|
cordisHost: "cordisHost",
|
|
64
64
|
terminalChildSession: "terminalChildSession",
|
|
65
65
|
effort: "effort",
|
|
66
|
+
fast: "fast",
|
|
66
67
|
contextCatalog: "contextCatalog",
|
|
67
68
|
ollamaProvider: "ollamaProvider",
|
|
68
69
|
transitionCoordinator: "transitionCoordinator"
|
|
@@ -290,7 +291,7 @@ function parentActivation(context, distributionPaths, featurePaths) {
|
|
|
290
291
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui)
|
|
291
292
|
];
|
|
292
293
|
if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));
|
|
293
|
-
activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile), resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode), resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill), resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain), resolve.ownEntry(OWN_ENTRIES.effort), resolve.ownEntry(OWN_ENTRIES.agentModel));
|
|
294
|
+
activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile), resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode), resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill), resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain), resolve.ownEntry(OWN_ENTRIES.effort), resolve.ownEntry(OWN_ENTRIES.fast), resolve.ownEntry(OWN_ENTRIES.agentModel));
|
|
294
295
|
if (context.preset === "ollama") activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));
|
|
295
296
|
activation.push(...distributionPaths, ...featurePaths);
|
|
296
297
|
if (context.personaEntry) activation.push(context.personaEntry);
|
|
@@ -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/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/doompi-core/runtimeIdentity';\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
|
+
{"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/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/doompi-core/runtimeIdentity';\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 fast: 'fast',\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 resolve.ownEntry(OWN_ENTRIES.fast),\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.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;qBA8CA;;;;;;;;;qBAUA;qBAEA,iBAAiB;;;;;wBAoBd,qBAAqB,wBAAwB;;wBAoV7C,4BAA4B,SAAS,mBAAmB;;wBAsCxD,mBAAmB,SAAS;;wBAK5B,wBAAwB,SAAS"}
|
|
@@ -62,6 +62,7 @@ const OWN_ENTRIES = {
|
|
|
62
62
|
cordisHost: "cordisHost",
|
|
63
63
|
terminalChildSession: "terminalChildSession",
|
|
64
64
|
effort: "effort",
|
|
65
|
+
fast: "fast",
|
|
65
66
|
contextCatalog: "contextCatalog",
|
|
66
67
|
ollamaProvider: "ollamaProvider",
|
|
67
68
|
transitionCoordinator: "transitionCoordinator"
|
|
@@ -289,7 +290,7 @@ function parentActivation(context, distributionPaths, featurePaths) {
|
|
|
289
290
|
resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui)
|
|
290
291
|
];
|
|
291
292
|
if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));
|
|
292
|
-
activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile), resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode), resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill), resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain), resolve.ownEntry(OWN_ENTRIES.effort), resolve.ownEntry(OWN_ENTRIES.agentModel));
|
|
293
|
+
activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile), resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode), resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill), resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain), resolve.ownEntry(OWN_ENTRIES.effort), resolve.ownEntry(OWN_ENTRIES.fast), resolve.ownEntry(OWN_ENTRIES.agentModel));
|
|
293
294
|
if (context.preset === "ollama") activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));
|
|
294
295
|
activation.push(...distributionPaths, ...featurePaths);
|
|
295
296
|
if (context.personaEntry) activation.push(context.personaEntry);
|
|
@@ -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/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/doompi-core/runtimeIdentity';\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
|
+
{"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/moduleResolution';\nimport { canonicalModulePath, sha256 } from '@agimon-ai/doompi-core/runtimeIdentity';\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 fast: 'fast',\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 resolve.ownEntry(OWN_ENTRIES.fast),\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,64 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
//#region src/extensions/fast.ts
|
|
6
|
+
const FAST_ENTRY = "doompi.fast-mode";
|
|
7
|
+
const CODEX_PROVIDER = "openai-codex";
|
|
8
|
+
const CODEX_API = "openai-codex-responses";
|
|
9
|
+
/** Project Fast intent from the current session's branch, independent of its model. */
|
|
10
|
+
function readSessionFastMode(sessionManager) {
|
|
11
|
+
let enabled = false;
|
|
12
|
+
const sessionId = sessionManager.getSessionId();
|
|
13
|
+
for (const entry of sessionManager.getBranch()) {
|
|
14
|
+
if (entry.type !== "custom" || entry.customType !== FAST_ENTRY) continue;
|
|
15
|
+
const data = entry.data;
|
|
16
|
+
if (data?.sessionId === sessionId) enabled = data.enabled === true;
|
|
17
|
+
}
|
|
18
|
+
return enabled;
|
|
19
|
+
}
|
|
20
|
+
function fastExtension(pi) {
|
|
21
|
+
let enabled = false;
|
|
22
|
+
const restore = (_args, ctx) => {
|
|
23
|
+
enabled = readSessionFastMode(ctx.sessionManager);
|
|
24
|
+
};
|
|
25
|
+
pi.on("session_start", (_event, ctx) => restore("", ctx));
|
|
26
|
+
pi.on("session_tree", (_event, ctx) => restore("", ctx));
|
|
27
|
+
pi.on("before_provider_request", (event, ctx) => {
|
|
28
|
+
if (!enabled || ctx.model?.provider !== CODEX_PROVIDER || ctx.model.api !== CODEX_API) return;
|
|
29
|
+
if (!event.payload || typeof event.payload !== "object" || Array.isArray(event.payload)) throw new Error("Invalid Codex provider payload");
|
|
30
|
+
return {
|
|
31
|
+
...event.payload,
|
|
32
|
+
service_tier: "priority"
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
pi.registerCommand("fast", {
|
|
36
|
+
description: "Opt this session into Codex priority service (may increase cost)",
|
|
37
|
+
getArgumentCompletions: (prefix) => ["on", "off"].filter((value) => value.startsWith(prefix)).map((value) => ({
|
|
38
|
+
value,
|
|
39
|
+
label: value
|
|
40
|
+
})),
|
|
41
|
+
handler: async (args, ctx) => {
|
|
42
|
+
const value = args.trim().toLowerCase();
|
|
43
|
+
if (value !== "on" && value !== "off") {
|
|
44
|
+
ctx.ui.notify("Usage: /fast on|off", "warning");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (value === "on" && (ctx.model?.provider !== CODEX_PROVIDER || ctx.model.api !== CODEX_API)) throw new Error("Fast mode requires an openai-codex model");
|
|
48
|
+
const requested = value === "on";
|
|
49
|
+
pi.appendEntry(FAST_ENTRY, {
|
|
50
|
+
version: 1,
|
|
51
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
52
|
+
enabled: requested
|
|
53
|
+
});
|
|
54
|
+
enabled = requested;
|
|
55
|
+
ctx.ui.notify(`Fast mode ${value} for this session.`, "info");
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
exports.default = fastExtension;
|
|
61
|
+
exports.fastExtension = fastExtension;
|
|
62
|
+
exports.readSessionFastMode = readSessionFastMode;
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=fast.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fast.cjs","names":[],"sources":["../../src/extensions/fast.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nconst FAST_ENTRY = 'doompi.fast-mode';\nconst CODEX_PROVIDER = 'openai-codex';\nconst CODEX_API = 'openai-codex-responses';\n\n/** Project Fast intent from the current session's branch, independent of its model. */\nexport function readSessionFastMode(sessionManager: ExtensionContext['sessionManager']): boolean {\n let enabled = false;\n const sessionId = sessionManager.getSessionId();\n for (const entry of sessionManager.getBranch()) {\n if (entry.type !== 'custom' || entry.customType !== FAST_ENTRY) continue;\n const data = entry.data as { enabled?: unknown; sessionId?: unknown } | undefined;\n if (data?.sessionId === sessionId) enabled = data.enabled === true;\n }\n return enabled;\n}\n\nexport function fastExtension(pi: ExtensionAPI): void {\n let enabled = false;\n const restore = (_args: string, ctx: ExtensionContext): void => {\n enabled = readSessionFastMode(ctx.sessionManager);\n };\n pi.on('session_start', (_event, ctx) => restore('', ctx));\n pi.on('session_tree', (_event, ctx) => restore('', ctx));\n pi.on('before_provider_request', (event, ctx) => {\n if (!enabled || ctx.model?.provider !== CODEX_PROVIDER || ctx.model.api !== CODEX_API) return;\n if (!event.payload || typeof event.payload !== 'object' || Array.isArray(event.payload))\n throw new Error('Invalid Codex provider payload');\n // This hook receives the HTTP body, after Pi maps the serviceTier option.\n return { ...event.payload, service_tier: 'priority' };\n });\n pi.registerCommand('fast', {\n description: 'Opt this session into Codex priority service (may increase cost)',\n getArgumentCompletions: (prefix) =>\n ['on', 'off'].filter((value) => value.startsWith(prefix)).map((value) => ({ value, label: value })),\n handler: async (args, ctx) => {\n const value = args.trim().toLowerCase();\n if (value !== 'on' && value !== 'off') {\n ctx.ui.notify('Usage: /fast on|off', 'warning');\n return;\n }\n if (value === 'on' && (ctx.model?.provider !== CODEX_PROVIDER || ctx.model.api !== CODEX_API))\n throw new Error('Fast mode requires an openai-codex model');\n const requested = value === 'on';\n pi.appendEntry(FAST_ENTRY, { version: 1, sessionId: ctx.sessionManager.getSessionId(), enabled: requested });\n enabled = requested;\n ctx.ui.notify(`Fast mode ${value} for this session.`, 'info');\n },\n });\n}\n\nexport default fastExtension;\n"],"mappings":";;;;;AAEA,MAAM,aAAa;AACnB,MAAM,iBAAiB;AACvB,MAAM,YAAY;;AAGlB,SAAgB,oBAAoB,gBAA6D;CAC/F,IAAI,UAAU;CACd,MAAM,YAAY,eAAe,aAAa;CAC9C,KAAK,MAAM,SAAS,eAAe,UAAU,GAAG;EAC9C,IAAI,MAAM,SAAS,YAAY,MAAM,eAAe,YAAY;EAChE,MAAM,OAAO,MAAM;EACnB,IAAI,MAAM,cAAc,WAAW,UAAU,KAAK,YAAY;CAChE;CACA,OAAO;AACT;AAEA,SAAgB,cAAc,IAAwB;CACpD,IAAI,UAAU;CACd,MAAM,WAAW,OAAe,QAAgC;EAC9D,UAAU,oBAAoB,IAAI,cAAc;CAClD;CACA,GAAG,GAAG,kBAAkB,QAAQ,QAAQ,QAAQ,IAAI,GAAG,CAAC;CACxD,GAAG,GAAG,iBAAiB,QAAQ,QAAQ,QAAQ,IAAI,GAAG,CAAC;CACvD,GAAG,GAAG,4BAA4B,OAAO,QAAQ;EAC/C,IAAI,CAAC,WAAW,IAAI,OAAO,aAAa,kBAAkB,IAAI,MAAM,QAAQ,WAAW;EACvF,IAAI,CAAC,MAAM,WAAW,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,MAAM,OAAO,GACpF,MAAM,IAAI,MAAM,gCAAgC;EAElD,OAAO;GAAE,GAAG,MAAM;GAAS,cAAc;EAAW;CACtD,CAAC;CACD,GAAG,gBAAgB,QAAQ;EACzB,aAAa;EACb,yBAAyB,WACvB,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,UAAU,MAAM,WAAW,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW;GAAE;GAAO,OAAO;EAAM,EAAE;EACpG,SAAS,OAAO,MAAM,QAAQ;GAC5B,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC,YAAY;GACtC,IAAI,UAAU,QAAQ,UAAU,OAAO;IACrC,IAAI,GAAG,OAAO,uBAAuB,SAAS;IAC9C;GACF;GACA,IAAI,UAAU,SAAS,IAAI,OAAO,aAAa,kBAAkB,IAAI,MAAM,QAAQ,YACjF,MAAM,IAAI,MAAM,0CAA0C;GAC5D,MAAM,YAAY,UAAU;GAC5B,GAAG,YAAY,YAAY;IAAE,SAAS;IAAG,WAAW,IAAI,eAAe,aAAa;IAAG,SAAS;GAAU,CAAC;GAC3G,UAAU;GACV,IAAI,GAAG,OAAO,aAAa,MAAM,qBAAqB,MAAM;EAC9D;CACF,CAAC;AACH"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
//#region src/extensions/fast.d.ts
|
|
3
|
+
/** Project Fast intent from the current session's branch, independent of its model. */
|
|
4
|
+
export declare function readSessionFastMode(sessionManager: ExtensionContext['sessionManager']): boolean;
|
|
5
|
+
export declare function fastExtension(pi: ExtensionAPI): void;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { fastExtension as default };
|
|
8
|
+
//# sourceMappingURL=fast.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fast.d.mts","names":[],"sources":["../../src/extensions/fast.ts"],"mappings":";;;wBAOgB,oBAAoB,gBAAgB;wBAWpC,cAAc,IAAI"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
//#region src/extensions/fast.ts
|
|
2
|
+
const FAST_ENTRY = "doompi.fast-mode";
|
|
3
|
+
const CODEX_PROVIDER = "openai-codex";
|
|
4
|
+
const CODEX_API = "openai-codex-responses";
|
|
5
|
+
/** Project Fast intent from the current session's branch, independent of its model. */
|
|
6
|
+
function readSessionFastMode(sessionManager) {
|
|
7
|
+
let enabled = false;
|
|
8
|
+
const sessionId = sessionManager.getSessionId();
|
|
9
|
+
for (const entry of sessionManager.getBranch()) {
|
|
10
|
+
if (entry.type !== "custom" || entry.customType !== FAST_ENTRY) continue;
|
|
11
|
+
const data = entry.data;
|
|
12
|
+
if (data?.sessionId === sessionId) enabled = data.enabled === true;
|
|
13
|
+
}
|
|
14
|
+
return enabled;
|
|
15
|
+
}
|
|
16
|
+
function fastExtension(pi) {
|
|
17
|
+
let enabled = false;
|
|
18
|
+
const restore = (_args, ctx) => {
|
|
19
|
+
enabled = readSessionFastMode(ctx.sessionManager);
|
|
20
|
+
};
|
|
21
|
+
pi.on("session_start", (_event, ctx) => restore("", ctx));
|
|
22
|
+
pi.on("session_tree", (_event, ctx) => restore("", ctx));
|
|
23
|
+
pi.on("before_provider_request", (event, ctx) => {
|
|
24
|
+
if (!enabled || ctx.model?.provider !== CODEX_PROVIDER || ctx.model.api !== CODEX_API) return;
|
|
25
|
+
if (!event.payload || typeof event.payload !== "object" || Array.isArray(event.payload)) throw new Error("Invalid Codex provider payload");
|
|
26
|
+
return {
|
|
27
|
+
...event.payload,
|
|
28
|
+
service_tier: "priority"
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
pi.registerCommand("fast", {
|
|
32
|
+
description: "Opt this session into Codex priority service (may increase cost)",
|
|
33
|
+
getArgumentCompletions: (prefix) => ["on", "off"].filter((value) => value.startsWith(prefix)).map((value) => ({
|
|
34
|
+
value,
|
|
35
|
+
label: value
|
|
36
|
+
})),
|
|
37
|
+
handler: async (args, ctx) => {
|
|
38
|
+
const value = args.trim().toLowerCase();
|
|
39
|
+
if (value !== "on" && value !== "off") {
|
|
40
|
+
ctx.ui.notify("Usage: /fast on|off", "warning");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (value === "on" && (ctx.model?.provider !== CODEX_PROVIDER || ctx.model.api !== CODEX_API)) throw new Error("Fast mode requires an openai-codex model");
|
|
44
|
+
const requested = value === "on";
|
|
45
|
+
pi.appendEntry(FAST_ENTRY, {
|
|
46
|
+
version: 1,
|
|
47
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
48
|
+
enabled: requested
|
|
49
|
+
});
|
|
50
|
+
enabled = requested;
|
|
51
|
+
ctx.ui.notify(`Fast mode ${value} for this session.`, "info");
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { fastExtension as default, fastExtension, readSessionFastMode };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=fast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fast.mjs","names":[],"sources":["../../src/extensions/fast.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nconst FAST_ENTRY = 'doompi.fast-mode';\nconst CODEX_PROVIDER = 'openai-codex';\nconst CODEX_API = 'openai-codex-responses';\n\n/** Project Fast intent from the current session's branch, independent of its model. */\nexport function readSessionFastMode(sessionManager: ExtensionContext['sessionManager']): boolean {\n let enabled = false;\n const sessionId = sessionManager.getSessionId();\n for (const entry of sessionManager.getBranch()) {\n if (entry.type !== 'custom' || entry.customType !== FAST_ENTRY) continue;\n const data = entry.data as { enabled?: unknown; sessionId?: unknown } | undefined;\n if (data?.sessionId === sessionId) enabled = data.enabled === true;\n }\n return enabled;\n}\n\nexport function fastExtension(pi: ExtensionAPI): void {\n let enabled = false;\n const restore = (_args: string, ctx: ExtensionContext): void => {\n enabled = readSessionFastMode(ctx.sessionManager);\n };\n pi.on('session_start', (_event, ctx) => restore('', ctx));\n pi.on('session_tree', (_event, ctx) => restore('', ctx));\n pi.on('before_provider_request', (event, ctx) => {\n if (!enabled || ctx.model?.provider !== CODEX_PROVIDER || ctx.model.api !== CODEX_API) return;\n if (!event.payload || typeof event.payload !== 'object' || Array.isArray(event.payload))\n throw new Error('Invalid Codex provider payload');\n // This hook receives the HTTP body, after Pi maps the serviceTier option.\n return { ...event.payload, service_tier: 'priority' };\n });\n pi.registerCommand('fast', {\n description: 'Opt this session into Codex priority service (may increase cost)',\n getArgumentCompletions: (prefix) =>\n ['on', 'off'].filter((value) => value.startsWith(prefix)).map((value) => ({ value, label: value })),\n handler: async (args, ctx) => {\n const value = args.trim().toLowerCase();\n if (value !== 'on' && value !== 'off') {\n ctx.ui.notify('Usage: /fast on|off', 'warning');\n return;\n }\n if (value === 'on' && (ctx.model?.provider !== CODEX_PROVIDER || ctx.model.api !== CODEX_API))\n throw new Error('Fast mode requires an openai-codex model');\n const requested = value === 'on';\n pi.appendEntry(FAST_ENTRY, { version: 1, sessionId: ctx.sessionManager.getSessionId(), enabled: requested });\n enabled = requested;\n ctx.ui.notify(`Fast mode ${value} for this session.`, 'info');\n },\n });\n}\n\nexport default fastExtension;\n"],"mappings":";AAEA,MAAM,aAAa;AACnB,MAAM,iBAAiB;AACvB,MAAM,YAAY;;AAGlB,SAAgB,oBAAoB,gBAA6D;CAC/F,IAAI,UAAU;CACd,MAAM,YAAY,eAAe,aAAa;CAC9C,KAAK,MAAM,SAAS,eAAe,UAAU,GAAG;EAC9C,IAAI,MAAM,SAAS,YAAY,MAAM,eAAe,YAAY;EAChE,MAAM,OAAO,MAAM;EACnB,IAAI,MAAM,cAAc,WAAW,UAAU,KAAK,YAAY;CAChE;CACA,OAAO;AACT;AAEA,SAAgB,cAAc,IAAwB;CACpD,IAAI,UAAU;CACd,MAAM,WAAW,OAAe,QAAgC;EAC9D,UAAU,oBAAoB,IAAI,cAAc;CAClD;CACA,GAAG,GAAG,kBAAkB,QAAQ,QAAQ,QAAQ,IAAI,GAAG,CAAC;CACxD,GAAG,GAAG,iBAAiB,QAAQ,QAAQ,QAAQ,IAAI,GAAG,CAAC;CACvD,GAAG,GAAG,4BAA4B,OAAO,QAAQ;EAC/C,IAAI,CAAC,WAAW,IAAI,OAAO,aAAa,kBAAkB,IAAI,MAAM,QAAQ,WAAW;EACvF,IAAI,CAAC,MAAM,WAAW,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,MAAM,OAAO,GACpF,MAAM,IAAI,MAAM,gCAAgC;EAElD,OAAO;GAAE,GAAG,MAAM;GAAS,cAAc;EAAW;CACtD,CAAC;CACD,GAAG,gBAAgB,QAAQ;EACzB,aAAa;EACb,yBAAyB,WACvB,CAAC,MAAM,KAAK,CAAC,CAAC,QAAQ,UAAU,MAAM,WAAW,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW;GAAE;GAAO,OAAO;EAAM,EAAE;EACpG,SAAS,OAAO,MAAM,QAAQ;GAC5B,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC,YAAY;GACtC,IAAI,UAAU,QAAQ,UAAU,OAAO;IACrC,IAAI,GAAG,OAAO,uBAAuB,SAAS;IAC9C;GACF;GACA,IAAI,UAAU,SAAS,IAAI,OAAO,aAAa,kBAAkB,IAAI,MAAM,QAAQ,YACjF,MAAM,IAAI,MAAM,0CAA0C;GAC5D,MAAM,YAAY,UAAU;GAC5B,GAAG,YAAY,YAAY;IAAE,SAAS;IAAG,WAAW,IAAI,eAAe,aAAa;IAAG,SAAS;GAAU,CAAC;GAC3G,UAAU;GACV,IAAI,GAAG,OAAO,aAAa,MAAM,qBAAqB,MAAM;EAC9D;CACF,CAAC;AACH"}
|
|
@@ -14,6 +14,16 @@ const doompiServerFacet = (0, _agimon_ai_doompi_core_serverFacet.defineServerPlu
|
|
|
14
14
|
global: ({ host }) => ({ api: host.context.remoteControl ? [_agimon_ai_doompi_core_machineApi.machineApi, _agimon_ai_doompi_core_remoteApi.remoteApi] : [_agimon_ai_doompi_core_machineApi.machineApi] }),
|
|
15
15
|
session: ({ agent, signal: ownerSignal }) => ({
|
|
16
16
|
api: [_agimon_ai_doompi_core_runtimeContextApi.api, _agimon_ai_doompi_core_sessionFilesApi.sessionFilesApi],
|
|
17
|
+
commands: [{
|
|
18
|
+
name: "fast",
|
|
19
|
+
description: "Opt this session into Codex priority service (may increase cost)",
|
|
20
|
+
async execute(args, context) {
|
|
21
|
+
const value = args.trim().toLowerCase();
|
|
22
|
+
if (value !== "on" && value !== "off") throw new Error("Usage: /fast on|off");
|
|
23
|
+
if (!context.session.setFastMode) throw new Error("Fast mode is unavailable in this session");
|
|
24
|
+
await context.session.setFastMode(value === "on");
|
|
25
|
+
}
|
|
26
|
+
}],
|
|
17
27
|
tools: agent ? [require_setupDiagnostics.createSetupDiagnosticsTool(() => agent.context, (signal) => {
|
|
18
28
|
ownerSignal.throwIfAborted();
|
|
19
29
|
agent.assertActive("@agimon-ai/doompi");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["defineServerPlugin","machineApi","remoteApi","api","sessionFilesApi","createSetupDiagnosticsTool"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { machineApi } from '@agimon-ai/doompi-core/machineApi';\nimport { remoteApi } from '@agimon-ai/doompi-core/remoteApi';\nimport { api } from '@agimon-ai/doompi-core/runtimeContextApi';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { sessionFilesApi } from '@agimon-ai/doompi-core/sessionFilesApi';\n\nimport { createSetupDiagnosticsTool } from './setupDiagnostics';\n\nexport const doompiServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi',\n global: ({ host }) => ({ api: host.context.remoteControl ? [machineApi, remoteApi] : [machineApi] }),\n session: ({ agent, signal: ownerSignal }) => ({\n api: [api, sessionFilesApi],\n tools: agent\n ? [\n createSetupDiagnosticsTool(\n () => agent.context,\n (signal) => {\n ownerSignal.throwIfAborted();\n agent.assertActive('@agimon-ai/doompi');\n if (!(agent.context.selection.state?.['minor-mode'] ?? []).includes('help'))\n throw new Error('Help mode is not active.');\n return signal ? AbortSignal.any([signal, ownerSignal]) : ownerSignal;\n },\n ),\n ]\n : [],\n }),\n});\n\nexport default doompiServerFacet;\n"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["defineServerPlugin","machineApi","remoteApi","api","sessionFilesApi","createSetupDiagnosticsTool"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import type { DoomHeadlessExecutionContext } from '@agimon-ai/doompi-core/headless';\nimport { machineApi } from '@agimon-ai/doompi-core/machineApi';\nimport { remoteApi } from '@agimon-ai/doompi-core/remoteApi';\nimport { api } from '@agimon-ai/doompi-core/runtimeContextApi';\nimport { defineServerPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { sessionFilesApi } from '@agimon-ai/doompi-core/sessionFilesApi';\n\nimport { createSetupDiagnosticsTool } from './setupDiagnostics';\n\nexport const doompiServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi',\n global: ({ host }) => ({ api: host.context.remoteControl ? [machineApi, remoteApi] : [machineApi] }),\n session: ({ agent, signal: ownerSignal }) => ({\n api: [api, sessionFilesApi],\n commands: [\n {\n name: 'fast',\n description: 'Opt this session into Codex priority service (may increase cost)',\n async execute(args: string, context: DoomHeadlessExecutionContext) {\n const value = args.trim().toLowerCase();\n if (value !== 'on' && value !== 'off') throw new Error('Usage: /fast on|off');\n if (!context.session.setFastMode) throw new Error('Fast mode is unavailable in this session');\n await context.session.setFastMode(value === 'on');\n },\n },\n ],\n tools: agent\n ? [\n createSetupDiagnosticsTool(\n () => agent.context,\n (signal) => {\n ownerSignal.throwIfAborted();\n agent.assertActive('@agimon-ai/doompi');\n if (!(agent.context.selection.state?.['minor-mode'] ?? []).includes('help'))\n throw new Error('Help mode is not active.');\n return signal ? AbortSignal.any([signal, ownerSignal]) : ownerSignal;\n },\n ),\n ]\n : [],\n }),\n});\n\nexport default doompiServerFacet;\n"],"mappings":";;;;;;;;;;;AASA,MAAa,qBAAA,GAAoBA,mCAAAA,mBAAAA,CAAmB;CAClD,MAAM;CACN,SAAS,EAAE,YAAY,EAAE,KAAK,KAAK,QAAQ,gBAAgB,CAACC,kCAAAA,YAAYC,iCAAAA,SAAS,IAAI,CAACD,kCAAAA,UAAU,EAAE;CAClG,UAAU,EAAE,OAAO,QAAQ,mBAAmB;EAC5C,KAAK,CAACE,yCAAAA,KAAKC,uCAAAA,eAAe;EAC1B,UAAU,CACR;GACE,MAAM;GACN,aAAa;GACb,MAAM,QAAQ,MAAc,SAAuC;IACjE,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC,YAAY;IACtC,IAAI,UAAU,QAAQ,UAAU,OAAO,MAAM,IAAI,MAAM,qBAAqB;IAC5E,IAAI,CAAC,QAAQ,QAAQ,aAAa,MAAM,IAAI,MAAM,0CAA0C;IAC5F,MAAM,QAAQ,QAAQ,YAAY,UAAU,IAAI;GAClD;EACF,CACF;EACA,OAAO,QACH,CACEC,yBAAAA,iCACQ,MAAM,UACX,WAAW;GACV,YAAY,eAAe;GAC3B,MAAM,aAAa,mBAAmB;GACtC,IAAI,EAAE,MAAM,QAAQ,UAAU,QAAQ,iBAAiB,CAAC,EAAA,CAAG,SAAS,MAAM,GACxE,MAAM,IAAI,MAAM,0BAA0B;GAC5C,OAAO,SAAS,YAAY,IAAI,CAAC,QAAQ,WAAW,CAAC,IAAI;EAC3D,CACF,CACF,IACA,CAAC;CACP;AACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBASa,gEAAiB"}
|
|
@@ -10,6 +10,16 @@ const doompiServerFacet = defineServerPlugin({
|
|
|
10
10
|
global: ({ host }) => ({ api: host.context.remoteControl ? [machineApi, remoteApi] : [machineApi] }),
|
|
11
11
|
session: ({ agent, signal: ownerSignal }) => ({
|
|
12
12
|
api: [api, sessionFilesApi],
|
|
13
|
+
commands: [{
|
|
14
|
+
name: "fast",
|
|
15
|
+
description: "Opt this session into Codex priority service (may increase cost)",
|
|
16
|
+
async execute(args, context) {
|
|
17
|
+
const value = args.trim().toLowerCase();
|
|
18
|
+
if (value !== "on" && value !== "off") throw new Error("Usage: /fast on|off");
|
|
19
|
+
if (!context.session.setFastMode) throw new Error("Fast mode is unavailable in this session");
|
|
20
|
+
await context.session.setFastMode(value === "on");
|
|
21
|
+
}
|
|
22
|
+
}],
|
|
13
23
|
tools: agent ? [createSetupDiagnosticsTool(() => agent.context, (signal) => {
|
|
14
24
|
ownerSignal.throwIfAborted();
|
|
15
25
|
agent.assertActive("@agimon-ai/doompi");
|