@agimon-ai/doompi 0.0.1-alpha.32 → 0.0.1-alpha.34
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 +9 -8
- package/dist/src/services/extensionAssembler.cjs +1 -1
- package/dist/src/services/extensionAssembler.cjs.map +1 -1
- package/dist/src/services/extensionAssembler.d.cts +1 -1
- package/dist/src/services/extensionAssembler.d.cts.map +1 -1
- package/dist/src/services/extensionAssembler.d.mts +1 -1
- package/dist/src/services/extensionAssembler.d.mts.map +1 -1
- package/dist/src/services/extensionAssembler.mjs +1 -1
- package/dist/src/services/extensionAssembler.mjs.map +1 -1
- package/package.json +13 -13
- package/dist/pi-cache-optimizer-DcFaM4WB.mjs +0 -47
- package/dist/pi-cache-optimizer-DcFaM4WB.mjs.map +0 -1
- package/dist/src/extensions/entries/cacheOptimizer.mjs +0 -2
- package/dist/src/extensions/entries/cacheOptimizer.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -368,7 +368,7 @@ generated mode gets it. Short commands still return inline; commands that pass t
|
|
|
368
368
|
threshold of 60 seconds by default move into the background with durable logs. Use
|
|
369
369
|
`background: true` for an immediate detached run or `interactive: true` when the command needs
|
|
370
370
|
terminal input. Runner IDs and complete raw logs remain available to the current session through
|
|
371
|
-
Runner Space at `SPC r
|
|
371
|
+
Runner Space at `SPC r l` or the `doom-runner` CLI. Platform-specific RMUX binaries are selected
|
|
372
372
|
automatically; non-interactive commands use a supervised subprocess fallback when RMUX is absent,
|
|
373
373
|
while interactive commands require RMUX. Conservatively recognized single commands use the matching
|
|
374
374
|
RTK stdin filter after completion. Compound commands, pipelines, incompatible formats, and
|
|
@@ -430,8 +430,9 @@ configured.
|
|
|
430
430
|
|
|
431
431
|
A promise to "only plan" is not a permission boundary. [`@agimon-ai/doompi-plan`][pkg-doompi-plan]
|
|
432
432
|
removes Pi's `edit` and `write` tools while the agent explores, persists the plan, and hands it back
|
|
433
|
-
for approval. It does not sandbox Bash, external tools, or the operating system.
|
|
434
|
-
normal planning
|
|
433
|
+
for approval. It does not sandbox Bash, external tools, or the operating system. `SPC p e` enters
|
|
434
|
+
normal planning and leaves it again once on; `SPC p d` is debug planning and `SPC p f` the Fable
|
|
435
|
+
flow.
|
|
435
436
|
Turn it on when the approach should be settled before the files move.
|
|
436
437
|
|
|
437
438
|
#### Loop mode
|
|
@@ -444,16 +445,16 @@ session.
|
|
|
444
445
|
#### Goal mode
|
|
445
446
|
|
|
446
447
|
[`@agimon-ai/doompi-goal`][pkg-doompi-goal] pins one objective to the session until it completes or
|
|
447
|
-
you end it.
|
|
448
|
-
history. Finished goals stop contributing active instructions and tools but remain in history when
|
|
448
|
+
you end it. `SPC g e` starts a goal and ends it once one is held; `SPC g g` shows status and
|
|
449
|
+
`SPC g l` lists repository history. Finished goals stop contributing active instructions and tools but remain in history when
|
|
449
450
|
you want to restart one.
|
|
450
451
|
|
|
451
452
|
#### Workflow mode
|
|
452
453
|
|
|
453
454
|
[`@agimon-ai/doompi-workflow`][pkg-doompi-workflow] runs GitHub Actions-style job graphs with
|
|
454
455
|
dependencies, timeouts, artifacts, and a separate DoomPi session for each step. Use `SPC w w` to
|
|
455
|
-
launch, `SPC w l` to
|
|
456
|
-
workflow tools or take them back. It is for work that needs hard job boundaries and explicit
|
|
456
|
+
launch, `SPC w l` to list the repository's workflows, `SPC w r` to inspect this session's runs,
|
|
457
|
+
`SPC w c` to recover a failed run, and `SPC w e` to give the agent workflow tools or take them back. It is for work that needs hard job boundaries and explicit
|
|
457
458
|
handoffs rather than one long conversation.
|
|
458
459
|
|
|
459
460
|
#### Voice mode
|
|
@@ -461,7 +462,7 @@ handoffs rather than one long conversation.
|
|
|
461
462
|
[`@agimon-ai/doompi-voice`][pkg-doompi-voice] captures PCM audio through the local platform helper
|
|
462
463
|
and can transcribe it locally. Transcript text, session state, and model requests may still cross
|
|
463
464
|
process or provider boundaries according to the configured engines. `SPC v v` is one-shot manual
|
|
464
|
-
dictation and never enables Voice tools. `SPC v
|
|
465
|
+
dictation and never enables Voice tools. `SPC v e` enters autonomous capture and exits it again; only its exact-active
|
|
465
466
|
TUI session receives the two Voice façades plus the standalone `narrate` tool.
|
|
466
467
|
|
|
467
468
|
While `narrate` is available, the primary agent calls it before every user-facing final
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../adapters/modules/moduleResolution.cjs"),t=require("../adapters/runtimeIdentity.cjs");let n=require("@agimon-ai/doompi-config/majorModes");const r=new Set([`@agimon-ai/doompi`,`@agimon-ai/doompi-autostop`,`@agimon-ai/doompi-config`,`@agimon-ai/doompi-domain`,`@agimon-ai/doompi-major-mode`,`@agimon-ai/doompi-notification`,`@agimon-ai/doompi-profile`,`@agimon-ai/doompi-skill`,`@agimon-ai/doompi-ui`]),i={
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../adapters/modules/moduleResolution.cjs"),t=require("../adapters/runtimeIdentity.cjs");let n=require("@agimon-ai/doompi-config/majorModes");const r=new Set([`@agimon-ai/doompi`,`@agimon-ai/doompi-autostop`,`@agimon-ai/doompi-cache`,`@agimon-ai/doompi-config`,`@agimon-ai/doompi-domain`,`@agimon-ai/doompi-major-mode`,`@agimon-ai/doompi-notification`,`@agimon-ai/doompi-profile`,`@agimon-ai/doompi-skill`,`@agimon-ai/doompi-ui`]),i={cordisFinalizer:`cordisFinalizer`,cordisHost:`cordisHost`,effort:`effort`,modeCatalog:`modeCatalog`,ollamaProvider:`ollamaProvider`,transitionCoordinator:`transitionCoordinator`},a={autostop:`@agimon-ai/doompi-autostop/extensions/pi`,cache:`@agimon-ai/doompi-cache/extensions/pi`,config:`@agimon-ai/doompi-config/extensions/pi`,domain:`@agimon-ai/doompi-domain/extensions/pi`,majorMode:`@agimon-ai/doompi-major-mode/extensions/pi`,notification:`@agimon-ai/doompi-notification/extensions/pi`,profile:`@agimon-ai/doompi-profile/extensions/pi`,skill:`@agimon-ai/doompi-skill/extensions/pi`,ui:`@agimon-ai/doompi-ui/extensions/pi`},o={ownEntry:e.ownEntry,packageEntry:e.packageEntry,optionalPackageEntry:e.optionalPackageEntry,packageEntries:e.packageEntries,optionalPackageEntries:e.optionalPackageEntries,localEntry:e.localEntry,localEntries:e.localEntries,localPackageEntries:e.localPackageEntries,localPackageName:e.localPackageName};function s(e,t){return Error(`Cannot resolve configured package "${e}" from ${t}.`)}function c(t){if(!t)return o;let n=t=>r.has(l(t))?e.optionalPackageEntry(t):void 0,i=t=>r.has(l(t))?e.optionalPackageEntries(t):void 0;return{ownEntry:e.ownEntry,packageEntry:r=>{let i=e.consumerPackageEntry(r,t)??n(r);if(!i)throw s(r,t);return i},optionalPackageEntry:r=>e.consumerPackageEntry(r,t)??n(r),packageEntries:n=>{let r=e.consumerPackageEntries(n,t)??i(n);if(!r)throw s(n,t);return r},optionalPackageEntries:n=>e.consumerPackageEntries(n,t)??i(n),localEntry:e.localEntry,localEntries:e.localEntries,localPackageEntries:e.localPackageEntries,localPackageName:e.localPackageName}}function l(e){let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]??e}function u(e,t){let n=l(e);if(r.has(n))throw Error(`Layer "${t}" cannot select fixed DoomPi host package "${n}" as a feature extension.`)}function d(e,t,n){let r=e.localEntries?.(t,n);if(r!==void 0)return r;let i=e.localEntry(t,n);return i?[i]:void 0}function f(e,t,n){let r=e.localPackageEntries?.(t,n);return r===void 0?d(e,t,n):r}function p(e,n,r){return{...e,manifestIndex:n,outcome:`resolved`,path:r,canonicalPath:t.canonicalModulePath(r)}}function m(e,t){return{...e,manifestIndex:0,outcome:`missing-optional`,diagnostic:t}}function h(e){return e instanceof Error?e.message:String(e)}function g(e,t,r,i){let a=[],o=e.extensions??[];for(let[s,c]of o.entries()){let o={layer:t,layerIndex:r,entryKind:`extension`,entryIndex:s,selector:c,...e.filePath?{sourceFile:e.filePath}:{},baseDirectory:e.baseDirectory,optional:!1};if(!(0,n.isLocalPackageSpecifier)(c)){a.push(p(o,0,i.ownEntry(c)));continue}let l=d(i,c,e.baseDirectory);if(!l?.length)throw Error(`Layer "${t}" extension "${c}" does not resolve under ${e.baseDirectory}. Point it at a Pi extension file or directory.`);l.forEach((e,t)=>{a.push(p(o,t,e))})}let s=o.length;for(let[o,c]of(e.packages??[]).entries()){let l=typeof c==`string`?c:c.name,d=typeof c!=`string`&&c.optional===!0,g=typeof c==`string`?void 0:c.config,_={layer:t,layerIndex:r,entryKind:`package`,entryIndex:s+o,selector:l,...e.filePath?{sourceFile:e.filePath}:{},baseDirectory:e.baseDirectory,optional:d,...g===void 0?{}:{config:g}},v;try{if((0,n.isLocalPackageSpecifier)(l)){let n=i.localPackageName?.(l,e.baseDirectory);n&&u(n,t),v=f(i,l,e.baseDirectory)}else if(u(l,t),d){if(v=i.optionalPackageEntries?.(l),v===void 0&&!i.optionalPackageEntries){let e=i.optionalPackageEntry(l);v=e?[e]:void 0}}else v=i.packageEntries?.(l)??[i.packageEntry(l)]}catch(e){if(d){a.push(m(_,h(e)));continue}throw e}if(!v?.length){if(d){a.push(m(_,`Optional package "${l}" is unavailable or declares no Pi extensions.`));continue}throw(0,n.isLocalPackageSpecifier)(l)?Error(`Layer "${t}" package "${l}" does not resolve under ${e.baseDirectory}. Point it at an extension file, or a directory whose package.json declares pi.extensions.`):Error(`Layer "${t}" package "${l}" declares no Pi extensions.`)}v.forEach((e,t)=>{a.push(p(_,t,e))})}return a}function _(e,t,n,r){let i=e.layers[t];if(!i)throw Error(`Unknown layer: ${t}`);return g(i,t,n,r)}function v(e,t){return e.default?g(e.default,`default`,-1,t):[]}function y(e){let t=e.resolvers??o;return e.layers.flatMap((n,r)=>_(e.majorModesConfig,n,r,t))}function b(e){let n=new Set,r=[];for(let i of e){let e=t.canonicalModulePath(i);n.has(e)||(n.add(e),r.push(i))}return r}function x(e){return b(e.flatMap(e=>e.outcome===`resolved`&&e.path?[e.path]:[]))}function S(e,t,n){let r=e.resolvers??o,s=[r.ownEntry(i.cordisHost),r.ownEntry(i.modeCatalog),r.packageEntry(a.config),r.ownEntry(i.transitionCoordinator),r.packageEntry(a.ui)];return e.mute||s.push(r.packageEntry(a.notification)),s.push(r.packageEntry(a.profile),r.packageEntry(a.majorMode),r.packageEntry(a.skill),r.packageEntry(a.domain),r.ownEntry(i.effort)),e.preset===`ollama`&&s.push(r.ownEntry(i.ollamaProvider)),s.push(...t,...n),e.personaEntry&&s.push(e.personaEntry),e.autoStop&&s.push(r.packageEntry(a.autostop)),s.push(r.packageEntry(a.cache)),s.push(r.ownEntry(i.cordisFinalizer)),b(s)}function C(e,t,n){let r=e.resolvers??o,s=[r.ownEntry(i.cordisHost),r.packageEntry(a.config),...t,...n];return e.preset===`ollama`&&s.push(r.ownEntry(i.ollamaProvider)),e.personaEntry&&s.push(e.personaEntry),s.push(r.ownEntry(i.cordisFinalizer)),b(s)}function w(e){return Array.isArray(e)?e.map(w):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,w(t)]))}function T(e){return t.sha256(JSON.stringify(w({...e,contract:{composition:4,standardPiExtension:2,fixedCorePackages:[...r]},parentCanonicalActivation:e.parentActivation.map(t.canonicalModulePath),childCanonicalActivation:e.childActivation.map(t.canonicalModulePath)})))}function E(e){let t=e.resolvers??o,n=v(e.majorModesConfig,t),r=y(e),i=[...n,...r],a=x(n),s=x(r),c=e.layers.map((t,n)=>{let r=e.majorModesConfig.layers[t];if(!r)throw Error(`Unknown layer: ${t}`);return{name:t,index:n,...r.filePath?{sourceFile:r.filePath}:{},baseDirectory:r.baseDirectory}}),l=e.majorMode?e.majorModesConfig.majorModeSources?.[e.majorMode]:void 0,u={version:4,...e.majorMode?{majorMode:{name:e.majorMode,...l?.filePath?{sourceFile:l.filePath}:{},...l?.baseDirectory?{baseDirectory:l.baseDirectory}:{}}}:{},layers:c,selections:i,parentActivation:S(e,a,s),childActivation:C(e,a,s)};return{...u,fingerprint:T(u)}}function D(e){return[...E(e).parentActivation]}function O(e){return[...E(e).childActivation]}exports.COMPOSITION_FINGERPRINT_VERSION=4,exports.LAYER_RESOLVERS=o,exports.OLLAMA_PRESET=`ollama`,exports.PERSONA_ENTRY=`@agimon-ai/doompi-profile/extensions/persona`,exports.STANDARD_PI_EXTENSION_CONTRACT_VERSION=2,exports.assembleChildExtensions=O,exports.assembleExtensions=D,exports.createLayerResolvers=c,exports.resolveExtensionComposition=E;
|
|
2
2
|
//# sourceMappingURL=extensionAssembler.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensionAssembler.cjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolvePackageEntries","resolveOptionalPackageEntries","resolveLocalPackageName","consumerPackageEntry","consumerPackageEntries","canonicalModulePath","isLocalPackageSpecifier","sha256"],"sources":["../../../src/services/extensionAssembler.ts"],"sourcesContent":["import {\n isLocalPackageSpecifier,\n type LayerResolvers,\n type MajorModesConfig,\n} from '@agimon-ai/doompi-config/majorModes';\nimport {\n consumerPackageEntries,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n ownEntry,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntries as resolveOptionalPackageEntries,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntries as resolvePackageEntries,\n packageEntry as resolvePackageEntry,\n} from '../adapters/modules/moduleResolution';\nimport { canonicalModulePath, sha256 } from '../adapters/runtimeIdentity';\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\nexport const COMPOSITION_FINGERPRINT_VERSION = 3;\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-config',\n '@agimon-ai/doompi-domain',\n '@agimon-ai/doompi-major-mode',\n '@agimon-ai/doompi-notification',\n '@agimon-ai/doompi-profile',\n '@agimon-ai/doompi-skill',\n '@agimon-ai/doompi-ui',\n]);\n\nconst OWN_ENTRIES = {\n cacheOptimizer: 'cacheOptimizer',\n cordisFinalizer: 'cordisFinalizer',\n cordisHost: 'cordisHost',\n effort: 'effort',\n modeCatalog: 'modeCatalog',\n ollamaProvider: 'ollamaProvider',\n transitionCoordinator: 'transitionCoordinator',\n} as const;\n\nconst CORE_PACKAGE_ENTRIES = {\n autostop: '@agimon-ai/doompi-autostop/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 notification: '@agimon-ai/doompi-notification/extensions/pi',\n profile: '@agimon-ai/doompi-profile/extensions/pi',\n skill: '@agimon-ai/doompi-skill/extensions/pi',\n ui: '@agimon-ai/doompi-ui/extensions/pi',\n} as const;\n\nexport const OLLAMA_PRESET = 'ollama';\n\n/**\n * Always available so /profile can pick a persona later, and the one entry a\n * detached child shares with its parent: children get the persona without the\n * command, because they have no transition coordinator to run a switch through.\n *\n * An explicit subpath rather than the bare package name, so it resolves to\n * exactly this file rather than to whatever pi.extensions lists.\n */\nexport const PERSONA_ENTRY = '@agimon-ai/doompi-profile/extensions/persona';\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: resolvePackageEntry,\n optionalPackageEntry: resolveOptionalPackageEntry,\n packageEntries: resolvePackageEntries,\n optionalPackageEntries: resolveOptionalPackageEntries,\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 const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name) : undefined;\n const fallbackEntries = (name: string): string[] | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntries(name) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = consumerPackageEntry(name, consumerRoot) ?? fallbackEntry(name);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = consumerPackageEntries(name, consumerRoot) ?? fallbackEntries(name);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => consumerPackageEntry(name, consumerRoot) ?? fallbackEntry(name),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => consumerPackageEntries(name, consumerRoot) ?? fallbackEntries(name),\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.modeCatalog),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui),\n ];\n if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));\n activation.push(\n resolve.ownEntry(OWN_ENTRIES.cacheOptimizer),\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 );\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.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.packageEntry(CORE_PACKAGE_ENTRIES.config),\n ...distributionPaths,\n ...featurePaths,\n ];\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n if (context.personaEntry) activation.push(context.personaEntry);\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction compositionFingerprint(composition: Omit<ExtensionComposition, 'fingerprint'>): string {\n return sha256(\n JSON.stringify(\n canonicalValue({\n ...composition,\n contract: {\n composition: COMPOSITION_FINGERPRINT_VERSION,\n standardPiExtension: STANDARD_PI_EXTENSION_CONTRACT_VERSION,\n fixedCorePackages: [...FIXED_CORE_PACKAGES],\n },\n parentCanonicalActivation: composition.parentActivation.map(canonicalModulePath),\n childCanonicalActivation: composition.childActivation.map(canonicalModulePath),\n }),\n ),\n );\n}\n\n/** Resolve one deterministic parent/child composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(context.majorModesConfig, resolvers);\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const withoutFingerprint: Omit<ExtensionComposition, 'fingerprint'> = {\n version: COMPOSITION_FINGERPRINT_VERSION,\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n parentActivation: parentActivation(context, distributionPaths, featurePaths),\n childActivation: childActivation(context, distributionPaths, featurePaths),\n };\n return { ...withoutFingerprint, fingerprint: compositionFingerprint(withoutFingerprint) };\n}\n\n/** Assemble parent entries in actual Pi factory activation order. */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).parentActivation];\n}\n\n/** Assemble detached-child entries in actual Pi factory activation order. */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).childActivation];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extensionAssembler.cjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolvePackageEntries","resolveOptionalPackageEntries","resolveLocalPackageName","consumerPackageEntry","consumerPackageEntries","canonicalModulePath","isLocalPackageSpecifier","sha256"],"sources":["../../../src/services/extensionAssembler.ts"],"sourcesContent":["import {\n isLocalPackageSpecifier,\n type LayerResolvers,\n type MajorModesConfig,\n} from '@agimon-ai/doompi-config/majorModes';\nimport {\n consumerPackageEntries,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n ownEntry,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntries as resolveOptionalPackageEntries,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntries as resolvePackageEntries,\n packageEntry as resolvePackageEntry,\n} from '../adapters/modules/moduleResolution';\nimport { canonicalModulePath, sha256 } from '../adapters/runtimeIdentity';\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\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-notification',\n '@agimon-ai/doompi-profile',\n '@agimon-ai/doompi-skill',\n '@agimon-ai/doompi-ui',\n]);\n\nconst OWN_ENTRIES = {\n cordisFinalizer: 'cordisFinalizer',\n cordisHost: 'cordisHost',\n effort: 'effort',\n modeCatalog: 'modeCatalog',\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 notification: '@agimon-ai/doompi-notification/extensions/pi',\n profile: '@agimon-ai/doompi-profile/extensions/pi',\n skill: '@agimon-ai/doompi-skill/extensions/pi',\n ui: '@agimon-ai/doompi-ui/extensions/pi',\n} as const;\n\nexport const OLLAMA_PRESET = 'ollama';\n\n/**\n * Always available so /profile can pick a persona later, and the one entry a\n * detached child shares with its parent: children get the persona without the\n * command, because they have no transition coordinator to run a switch through.\n *\n * An explicit subpath rather than the bare package name, so it resolves to\n * exactly this file rather than to whatever pi.extensions lists.\n */\nexport const PERSONA_ENTRY = '@agimon-ai/doompi-profile/extensions/persona';\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: resolvePackageEntry,\n optionalPackageEntry: resolveOptionalPackageEntry,\n packageEntries: resolvePackageEntries,\n optionalPackageEntries: resolveOptionalPackageEntries,\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 const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name) : undefined;\n const fallbackEntries = (name: string): string[] | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntries(name) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = consumerPackageEntry(name, consumerRoot) ?? fallbackEntry(name);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = consumerPackageEntries(name, consumerRoot) ?? fallbackEntries(name);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => consumerPackageEntry(name, consumerRoot) ?? fallbackEntry(name),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => consumerPackageEntries(name, consumerRoot) ?? fallbackEntries(name),\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.modeCatalog),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui),\n ];\n if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));\n activation.push(\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain),\n resolve.ownEntry(OWN_ENTRIES.effort),\n );\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.packageEntry(CORE_PACKAGE_ENTRIES.config),\n ...distributionPaths,\n ...featurePaths,\n ];\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n if (context.personaEntry) activation.push(context.personaEntry);\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction compositionFingerprint(composition: Omit<ExtensionComposition, 'fingerprint'>): string {\n return sha256(\n JSON.stringify(\n canonicalValue({\n ...composition,\n contract: {\n composition: COMPOSITION_FINGERPRINT_VERSION,\n standardPiExtension: STANDARD_PI_EXTENSION_CONTRACT_VERSION,\n fixedCorePackages: [...FIXED_CORE_PACKAGES],\n },\n parentCanonicalActivation: composition.parentActivation.map(canonicalModulePath),\n childCanonicalActivation: composition.childActivation.map(canonicalModulePath),\n }),\n ),\n );\n}\n\n/** Resolve one deterministic parent/child composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(context.majorModesConfig, resolvers);\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const withoutFingerprint: Omit<ExtensionComposition, 'fingerprint'> = {\n version: COMPOSITION_FINGERPRINT_VERSION,\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n parentActivation: parentActivation(context, distributionPaths, featurePaths),\n childActivation: childActivation(context, distributionPaths, featurePaths),\n };\n return { ...withoutFingerprint, fingerprint: compositionFingerprint(withoutFingerprint) };\n}\n\n/** Assemble parent entries in actual Pi factory activation order. */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).parentActivation];\n}\n\n/** Assemble detached-child entries in actual Pi factory activation order. */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).childActivation];\n}\n"],"mappings":"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"}
|
|
@@ -67,7 +67,7 @@ interface ExtensionComposition {
|
|
|
67
67
|
readonly childActivation: readonly string[];
|
|
68
68
|
readonly fingerprint: string;
|
|
69
69
|
}
|
|
70
|
-
declare const COMPOSITION_FINGERPRINT_VERSION =
|
|
70
|
+
declare const COMPOSITION_FINGERPRINT_VERSION = 4;
|
|
71
71
|
declare const STANDARD_PI_EXTENSION_CONTRACT_VERSION = 2;
|
|
72
72
|
declare const OLLAMA_PRESET = "ollama";
|
|
73
73
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensionAssembler.d.cts","names":[],"sources":["../../../src/services/extensionAssembler.ts"],"mappings":";;UAoBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;UAGxB;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;KAGF;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;UAGH;WACN;WACA;WACA;WACA;;;UAIM;WACN;WACA;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;WACA;;cAGE;cACA;
|
|
1
|
+
{"version":3,"file":"extensionAssembler.d.cts","names":[],"sources":["../../../src/services/extensionAssembler.ts"],"mappings":";;UAoBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;UAGxB;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;KAGF;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;UAGH;WACN;WACA;WACA;WACA;;;UAIM;WACN;WACA;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;WACA;;cAGE;cACA;cAuCA;;;;;;;;;cAUA;cAEA,iBAAiB;;;;;iBAoBd,qBAAqB,wBAAwB;;iBAyU7C,4BAA4B,SAAS,mBAAmB;;iBAsCxD,mBAAmB,SAAS;;iBAK5B,wBAAwB,SAAS"}
|
|
@@ -67,7 +67,7 @@ interface ExtensionComposition {
|
|
|
67
67
|
readonly childActivation: readonly string[];
|
|
68
68
|
readonly fingerprint: string;
|
|
69
69
|
}
|
|
70
|
-
declare const COMPOSITION_FINGERPRINT_VERSION =
|
|
70
|
+
declare const COMPOSITION_FINGERPRINT_VERSION = 4;
|
|
71
71
|
declare const STANDARD_PI_EXTENSION_CONTRACT_VERSION = 2;
|
|
72
72
|
declare const OLLAMA_PRESET = "ollama";
|
|
73
73
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensionAssembler.d.mts","names":[],"sources":["../../../src/services/extensionAssembler.ts"],"mappings":";;UAoBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;UAGxB;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;KAGF;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;UAGH;WACN;WACA;WACA;WACA;;;UAIM;WACN;WACA;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;WACA;;cAGE;cACA;
|
|
1
|
+
{"version":3,"file":"extensionAssembler.d.mts","names":[],"sources":["../../../src/services/extensionAssembler.ts"],"mappings":";;UAoBiB,gCAAgC;;EAE/C,uBAAuB,mBAAmB;;EAE1C,oBAAoB,mBAAmB;;UAGxB;EACf;EACA;EACA;EACA;EACA;;EAEA;;EAEA;EACA,kBAAkB;;EAElB,YAAY;;KAGF;KACP;;;;;;;;UASK;WACC;WACA;WACA,WAAW;WACX;WACA;WACA;WACA;WACA;WACA;WACA,SAAS;WACT;WACA;WACA;WACA,SAAS;;UAGH;WACN;WACA;WACA;WACA;;;UAIM;WACN;WACA;aACE;aACA;aACA;;WAEF,iBAAiB;WACjB,qBAAqB;;WAErB;;WAEA;WACA;;cAGE;cACA;cAuCA;;;;;;;;;cAUA;cAEA,iBAAiB;;;;;iBAoBd,qBAAqB,wBAAwB;;iBAyU7C,4BAA4B,SAAS,mBAAmB;;iBAsCxD,mBAAmB,SAAS;;iBAK5B,wBAAwB,SAAS"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{consumerPackageEntries as e,consumerPackageEntry as t,localEntries as n,localEntry as r,localPackageEntries as i,localPackageName as a,optionalPackageEntries as o,optionalPackageEntry as s,ownEntry as c,packageEntries as l,packageEntry as u}from"../adapters/modules/moduleResolution.mjs";import{canonicalModulePath as d,sha256 as f}from"../adapters/runtimeIdentity.mjs";import{isLocalPackageSpecifier as p}from"@agimon-ai/doompi-config/majorModes";const m=
|
|
1
|
+
import{consumerPackageEntries as e,consumerPackageEntry as t,localEntries as n,localEntry as r,localPackageEntries as i,localPackageName as a,optionalPackageEntries as o,optionalPackageEntry as s,ownEntry as c,packageEntries as l,packageEntry as u}from"../adapters/modules/moduleResolution.mjs";import{canonicalModulePath as d,sha256 as f}from"../adapters/runtimeIdentity.mjs";import{isLocalPackageSpecifier as p}from"@agimon-ai/doompi-config/majorModes";const m=4,h=2,g=new Set([`@agimon-ai/doompi`,`@agimon-ai/doompi-autostop`,`@agimon-ai/doompi-cache`,`@agimon-ai/doompi-config`,`@agimon-ai/doompi-domain`,`@agimon-ai/doompi-major-mode`,`@agimon-ai/doompi-notification`,`@agimon-ai/doompi-profile`,`@agimon-ai/doompi-skill`,`@agimon-ai/doompi-ui`]),_={cordisFinalizer:`cordisFinalizer`,cordisHost:`cordisHost`,effort:`effort`,modeCatalog:`modeCatalog`,ollamaProvider:`ollamaProvider`,transitionCoordinator:`transitionCoordinator`},v={autostop:`@agimon-ai/doompi-autostop/extensions/pi`,cache:`@agimon-ai/doompi-cache/extensions/pi`,config:`@agimon-ai/doompi-config/extensions/pi`,domain:`@agimon-ai/doompi-domain/extensions/pi`,majorMode:`@agimon-ai/doompi-major-mode/extensions/pi`,notification:`@agimon-ai/doompi-notification/extensions/pi`,profile:`@agimon-ai/doompi-profile/extensions/pi`,skill:`@agimon-ai/doompi-skill/extensions/pi`,ui:`@agimon-ai/doompi-ui/extensions/pi`},y=`ollama`,b=`@agimon-ai/doompi-profile/extensions/persona`,x={ownEntry:c,packageEntry:u,optionalPackageEntry:s,packageEntries:l,optionalPackageEntries:o,localEntry:r,localEntries:n,localPackageEntries:i,localPackageName:a};function S(e,t){return Error(`Cannot resolve configured package "${e}" from ${t}.`)}function C(l){if(!l)return x;let u=e=>g.has(w(e))?s(e):void 0,d=e=>g.has(w(e))?o(e):void 0;return{ownEntry:c,packageEntry:e=>{let n=t(e,l)??u(e);if(!n)throw S(e,l);return n},optionalPackageEntry:e=>t(e,l)??u(e),packageEntries:t=>{let n=e(t,l)??d(t);if(!n)throw S(t,l);return n},optionalPackageEntries:t=>e(t,l)??d(t),localEntry:r,localEntries:n,localPackageEntries:i,localPackageName:a}}function w(e){let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]??e}function T(e,t){let n=w(e);if(g.has(n))throw Error(`Layer "${t}" cannot select fixed DoomPi host package "${n}" as a feature extension.`)}function E(e,t,n){let r=e.localEntries?.(t,n);if(r!==void 0)return r;let i=e.localEntry(t,n);return i?[i]:void 0}function D(e,t,n){let r=e.localPackageEntries?.(t,n);return r===void 0?E(e,t,n):r}function O(e,t,n){return{...e,manifestIndex:t,outcome:`resolved`,path:n,canonicalPath:d(n)}}function k(e,t){return{...e,manifestIndex:0,outcome:`missing-optional`,diagnostic:t}}function A(e){return e instanceof Error?e.message:String(e)}function j(e,t,n,r){let i=[],a=e.extensions??[];for(let[o,s]of a.entries()){let a={layer:t,layerIndex:n,entryKind:`extension`,entryIndex:o,selector:s,...e.filePath?{sourceFile:e.filePath}:{},baseDirectory:e.baseDirectory,optional:!1};if(!p(s)){i.push(O(a,0,r.ownEntry(s)));continue}let c=E(r,s,e.baseDirectory);if(!c?.length)throw Error(`Layer "${t}" extension "${s}" does not resolve under ${e.baseDirectory}. Point it at a Pi extension file or directory.`);c.forEach((e,t)=>{i.push(O(a,t,e))})}let o=a.length;for(let[a,s]of(e.packages??[]).entries()){let c=typeof s==`string`?s:s.name,l=typeof s!=`string`&&s.optional===!0,u=typeof s==`string`?void 0:s.config,d={layer:t,layerIndex:n,entryKind:`package`,entryIndex:o+a,selector:c,...e.filePath?{sourceFile:e.filePath}:{},baseDirectory:e.baseDirectory,optional:l,...u===void 0?{}:{config:u}},f;try{if(p(c)){let n=r.localPackageName?.(c,e.baseDirectory);n&&T(n,t),f=D(r,c,e.baseDirectory)}else if(T(c,t),l){if(f=r.optionalPackageEntries?.(c),f===void 0&&!r.optionalPackageEntries){let e=r.optionalPackageEntry(c);f=e?[e]:void 0}}else f=r.packageEntries?.(c)??[r.packageEntry(c)]}catch(e){if(l){i.push(k(d,A(e)));continue}throw e}if(!f?.length){if(l){i.push(k(d,`Optional package "${c}" is unavailable or declares no Pi extensions.`));continue}throw p(c)?Error(`Layer "${t}" package "${c}" does not resolve under ${e.baseDirectory}. Point it at an extension file, or a directory whose package.json declares pi.extensions.`):Error(`Layer "${t}" package "${c}" declares no Pi extensions.`)}f.forEach((e,t)=>{i.push(O(d,t,e))})}return i}function M(e,t,n,r){let i=e.layers[t];if(!i)throw Error(`Unknown layer: ${t}`);return j(i,t,n,r)}function N(e,t){return e.default?j(e.default,`default`,-1,t):[]}function P(e){let t=e.resolvers??x;return e.layers.flatMap((n,r)=>M(e.majorModesConfig,n,r,t))}function F(e){let t=new Set,n=[];for(let r of e){let e=d(r);t.has(e)||(t.add(e),n.push(r))}return n}function I(e){return F(e.flatMap(e=>e.outcome===`resolved`&&e.path?[e.path]:[]))}function L(e,t,n){let r=e.resolvers??x,i=[r.ownEntry(_.cordisHost),r.ownEntry(_.modeCatalog),r.packageEntry(v.config),r.ownEntry(_.transitionCoordinator),r.packageEntry(v.ui)];return e.mute||i.push(r.packageEntry(v.notification)),i.push(r.packageEntry(v.profile),r.packageEntry(v.majorMode),r.packageEntry(v.skill),r.packageEntry(v.domain),r.ownEntry(_.effort)),e.preset===`ollama`&&i.push(r.ownEntry(_.ollamaProvider)),i.push(...t,...n),e.personaEntry&&i.push(e.personaEntry),e.autoStop&&i.push(r.packageEntry(v.autostop)),i.push(r.packageEntry(v.cache)),i.push(r.ownEntry(_.cordisFinalizer)),F(i)}function R(e,t,n){let r=e.resolvers??x,i=[r.ownEntry(_.cordisHost),r.packageEntry(v.config),...t,...n];return e.preset===`ollama`&&i.push(r.ownEntry(_.ollamaProvider)),e.personaEntry&&i.push(e.personaEntry),i.push(r.ownEntry(_.cordisFinalizer)),F(i)}function z(e){return Array.isArray(e)?e.map(z):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,z(t)]))}function B(e){return f(JSON.stringify(z({...e,contract:{composition:4,standardPiExtension:2,fixedCorePackages:[...g]},parentCanonicalActivation:e.parentActivation.map(d),childCanonicalActivation:e.childActivation.map(d)})))}function V(e){let t=e.resolvers??x,n=N(e.majorModesConfig,t),r=P(e),i=[...n,...r],a=I(n),o=I(r),s=e.layers.map((t,n)=>{let r=e.majorModesConfig.layers[t];if(!r)throw Error(`Unknown layer: ${t}`);return{name:t,index:n,...r.filePath?{sourceFile:r.filePath}:{},baseDirectory:r.baseDirectory}}),c=e.majorMode?e.majorModesConfig.majorModeSources?.[e.majorMode]:void 0,l={version:4,...e.majorMode?{majorMode:{name:e.majorMode,...c?.filePath?{sourceFile:c.filePath}:{},...c?.baseDirectory?{baseDirectory:c.baseDirectory}:{}}}:{},layers:s,selections:i,parentActivation:L(e,a,o),childActivation:R(e,a,o)};return{...l,fingerprint:B(l)}}function H(e){return[...V(e).parentActivation]}function U(e){return[...V(e).childActivation]}export{m as COMPOSITION_FINGERPRINT_VERSION,x as LAYER_RESOLVERS,y as OLLAMA_PRESET,b as PERSONA_ENTRY,h as STANDARD_PI_EXTENSION_CONTRACT_VERSION,U as assembleChildExtensions,H as assembleExtensions,C as createLayerResolvers,V as resolveExtensionComposition};
|
|
2
2
|
//# sourceMappingURL=extensionAssembler.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensionAssembler.mjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolvePackageEntries","resolveOptionalPackageEntries","resolveLocalPackageName"],"sources":["../../../src/services/extensionAssembler.ts"],"sourcesContent":["import {\n isLocalPackageSpecifier,\n type LayerResolvers,\n type MajorModesConfig,\n} from '@agimon-ai/doompi-config/majorModes';\nimport {\n consumerPackageEntries,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n ownEntry,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntries as resolveOptionalPackageEntries,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntries as resolvePackageEntries,\n packageEntry as resolvePackageEntry,\n} from '../adapters/modules/moduleResolution';\nimport { canonicalModulePath, sha256 } from '../adapters/runtimeIdentity';\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\nexport const COMPOSITION_FINGERPRINT_VERSION = 3;\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-config',\n '@agimon-ai/doompi-domain',\n '@agimon-ai/doompi-major-mode',\n '@agimon-ai/doompi-notification',\n '@agimon-ai/doompi-profile',\n '@agimon-ai/doompi-skill',\n '@agimon-ai/doompi-ui',\n]);\n\nconst OWN_ENTRIES = {\n cacheOptimizer: 'cacheOptimizer',\n cordisFinalizer: 'cordisFinalizer',\n cordisHost: 'cordisHost',\n effort: 'effort',\n modeCatalog: 'modeCatalog',\n ollamaProvider: 'ollamaProvider',\n transitionCoordinator: 'transitionCoordinator',\n} as const;\n\nconst CORE_PACKAGE_ENTRIES = {\n autostop: '@agimon-ai/doompi-autostop/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 notification: '@agimon-ai/doompi-notification/extensions/pi',\n profile: '@agimon-ai/doompi-profile/extensions/pi',\n skill: '@agimon-ai/doompi-skill/extensions/pi',\n ui: '@agimon-ai/doompi-ui/extensions/pi',\n} as const;\n\nexport const OLLAMA_PRESET = 'ollama';\n\n/**\n * Always available so /profile can pick a persona later, and the one entry a\n * detached child shares with its parent: children get the persona without the\n * command, because they have no transition coordinator to run a switch through.\n *\n * An explicit subpath rather than the bare package name, so it resolves to\n * exactly this file rather than to whatever pi.extensions lists.\n */\nexport const PERSONA_ENTRY = '@agimon-ai/doompi-profile/extensions/persona';\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: resolvePackageEntry,\n optionalPackageEntry: resolveOptionalPackageEntry,\n packageEntries: resolvePackageEntries,\n optionalPackageEntries: resolveOptionalPackageEntries,\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 const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name) : undefined;\n const fallbackEntries = (name: string): string[] | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntries(name) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = consumerPackageEntry(name, consumerRoot) ?? fallbackEntry(name);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = consumerPackageEntries(name, consumerRoot) ?? fallbackEntries(name);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => consumerPackageEntry(name, consumerRoot) ?? fallbackEntry(name),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => consumerPackageEntries(name, consumerRoot) ?? fallbackEntries(name),\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.modeCatalog),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui),\n ];\n if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));\n activation.push(\n resolve.ownEntry(OWN_ENTRIES.cacheOptimizer),\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 );\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.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.packageEntry(CORE_PACKAGE_ENTRIES.config),\n ...distributionPaths,\n ...featurePaths,\n ];\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n if (context.personaEntry) activation.push(context.personaEntry);\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction compositionFingerprint(composition: Omit<ExtensionComposition, 'fingerprint'>): string {\n return sha256(\n JSON.stringify(\n canonicalValue({\n ...composition,\n contract: {\n composition: COMPOSITION_FINGERPRINT_VERSION,\n standardPiExtension: STANDARD_PI_EXTENSION_CONTRACT_VERSION,\n fixedCorePackages: [...FIXED_CORE_PACKAGES],\n },\n parentCanonicalActivation: composition.parentActivation.map(canonicalModulePath),\n childCanonicalActivation: composition.childActivation.map(canonicalModulePath),\n }),\n ),\n );\n}\n\n/** Resolve one deterministic parent/child composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(context.majorModesConfig, resolvers);\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const withoutFingerprint: Omit<ExtensionComposition, 'fingerprint'> = {\n version: COMPOSITION_FINGERPRINT_VERSION,\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n parentActivation: parentActivation(context, distributionPaths, featurePaths),\n childActivation: childActivation(context, distributionPaths, featurePaths),\n };\n return { ...withoutFingerprint, fingerprint: compositionFingerprint(withoutFingerprint) };\n}\n\n/** Assemble parent entries in actual Pi factory activation order. */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).parentActivation];\n}\n\n/** Assemble detached-child entries in actual Pi factory activation order. */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).childActivation];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extensionAssembler.mjs","names":["resolvePackageEntry","resolveOptionalPackageEntry","resolvePackageEntries","resolveOptionalPackageEntries","resolveLocalPackageName"],"sources":["../../../src/services/extensionAssembler.ts"],"sourcesContent":["import {\n isLocalPackageSpecifier,\n type LayerResolvers,\n type MajorModesConfig,\n} from '@agimon-ai/doompi-config/majorModes';\nimport {\n consumerPackageEntries,\n consumerPackageEntry,\n localEntries,\n localEntry,\n localPackageEntries,\n ownEntry,\n localPackageName as resolveLocalPackageName,\n optionalPackageEntries as resolveOptionalPackageEntries,\n optionalPackageEntry as resolveOptionalPackageEntry,\n packageEntries as resolvePackageEntries,\n packageEntry as resolvePackageEntry,\n} from '../adapters/modules/moduleResolution';\nimport { canonicalModulePath, sha256 } from '../adapters/runtimeIdentity';\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\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-notification',\n '@agimon-ai/doompi-profile',\n '@agimon-ai/doompi-skill',\n '@agimon-ai/doompi-ui',\n]);\n\nconst OWN_ENTRIES = {\n cordisFinalizer: 'cordisFinalizer',\n cordisHost: 'cordisHost',\n effort: 'effort',\n modeCatalog: 'modeCatalog',\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 notification: '@agimon-ai/doompi-notification/extensions/pi',\n profile: '@agimon-ai/doompi-profile/extensions/pi',\n skill: '@agimon-ai/doompi-skill/extensions/pi',\n ui: '@agimon-ai/doompi-ui/extensions/pi',\n} as const;\n\nexport const OLLAMA_PRESET = 'ollama';\n\n/**\n * Always available so /profile can pick a persona later, and the one entry a\n * detached child shares with its parent: children get the persona without the\n * command, because they have no transition coordinator to run a switch through.\n *\n * An explicit subpath rather than the bare package name, so it resolves to\n * exactly this file rather than to whatever pi.extensions lists.\n */\nexport const PERSONA_ENTRY = '@agimon-ai/doompi-profile/extensions/persona';\n\nexport const LAYER_RESOLVERS: ExtensionLayerResolvers = {\n ownEntry,\n packageEntry: resolvePackageEntry,\n optionalPackageEntry: resolveOptionalPackageEntry,\n packageEntries: resolvePackageEntries,\n optionalPackageEntries: resolveOptionalPackageEntries,\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 const fallbackEntry = (name: string): string | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntry(name) : undefined;\n const fallbackEntries = (name: string): string[] | undefined =>\n FIXED_CORE_PACKAGES.has(packageName(name)) ? resolveOptionalPackageEntries(name) : undefined;\n const requiredEntry = (name: string): string => {\n const entry = consumerPackageEntry(name, consumerRoot) ?? fallbackEntry(name);\n if (!entry) throw missingConsumerPackage(name, consumerRoot);\n return entry;\n };\n const requiredEntries = (name: string): string[] => {\n const entries = consumerPackageEntries(name, consumerRoot) ?? fallbackEntries(name);\n if (!entries) throw missingConsumerPackage(name, consumerRoot);\n return entries;\n };\n return {\n ownEntry,\n packageEntry: requiredEntry,\n optionalPackageEntry: (name) => consumerPackageEntry(name, consumerRoot) ?? fallbackEntry(name),\n packageEntries: requiredEntries,\n optionalPackageEntries: (name) => consumerPackageEntries(name, consumerRoot) ?? fallbackEntries(name),\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.modeCatalog),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.config),\n resolve.ownEntry(OWN_ENTRIES.transitionCoordinator),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.ui),\n ];\n if (!context.mute) activation.push(resolve.packageEntry(CORE_PACKAGE_ENTRIES.notification));\n activation.push(\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.profile),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.majorMode),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.skill),\n resolve.packageEntry(CORE_PACKAGE_ENTRIES.domain),\n resolve.ownEntry(OWN_ENTRIES.effort),\n );\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.packageEntry(CORE_PACKAGE_ENTRIES.config),\n ...distributionPaths,\n ...featurePaths,\n ];\n if (context.preset === OLLAMA_PRESET) activation.push(resolve.ownEntry(OWN_ENTRIES.ollamaProvider));\n if (context.personaEntry) activation.push(context.personaEntry);\n activation.push(resolve.ownEntry(OWN_ENTRIES.cordisFinalizer));\n return deduplicatePaths(activation);\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalValue);\n if (value === null || typeof value !== 'object') return value;\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, canonicalValue(entry)]),\n );\n}\n\nfunction compositionFingerprint(composition: Omit<ExtensionComposition, 'fingerprint'>): string {\n return sha256(\n JSON.stringify(\n canonicalValue({\n ...composition,\n contract: {\n composition: COMPOSITION_FINGERPRINT_VERSION,\n standardPiExtension: STANDARD_PI_EXTENSION_CONTRACT_VERSION,\n fixedCorePackages: [...FIXED_CORE_PACKAGES],\n },\n parentCanonicalActivation: composition.parentActivation.map(canonicalModulePath),\n childCanonicalActivation: composition.childActivation.map(canonicalModulePath),\n }),\n ),\n );\n}\n\n/** Resolve one deterministic parent/child composition from authored layer occurrences. */\nexport function resolveExtensionComposition(context: ExtensionContext): ExtensionComposition {\n const resolvers = context.resolvers ?? LAYER_RESOLVERS;\n const defaultSelections = resolveDefaultSelections(context.majorModesConfig, resolvers);\n const layerSelections = resolveSelectedExtensions(context);\n const selections = [...defaultSelections, ...layerSelections];\n const distributionPaths = selectedFeaturePaths(defaultSelections);\n const featurePaths = selectedFeaturePaths(layerSelections);\n const layers = context.layers.map((name, index): CompositionLayerOccurrence => {\n const definition = context.majorModesConfig.layers[name];\n if (!definition) throw new Error(`Unknown layer: ${name}`);\n return {\n name,\n index,\n ...(definition.filePath ? { sourceFile: definition.filePath } : {}),\n baseDirectory: definition.baseDirectory,\n };\n });\n const modeSource = context.majorMode ? context.majorModesConfig.majorModeSources?.[context.majorMode] : undefined;\n const withoutFingerprint: Omit<ExtensionComposition, 'fingerprint'> = {\n version: COMPOSITION_FINGERPRINT_VERSION,\n ...(context.majorMode\n ? {\n majorMode: {\n name: context.majorMode,\n ...(modeSource?.filePath ? { sourceFile: modeSource.filePath } : {}),\n ...(modeSource?.baseDirectory ? { baseDirectory: modeSource.baseDirectory } : {}),\n },\n }\n : {}),\n layers,\n selections,\n parentActivation: parentActivation(context, distributionPaths, featurePaths),\n childActivation: childActivation(context, distributionPaths, featurePaths),\n };\n return { ...withoutFingerprint, fingerprint: compositionFingerprint(withoutFingerprint) };\n}\n\n/** Assemble parent entries in actual Pi factory activation order. */\nexport function assembleExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).parentActivation];\n}\n\n/** Assemble detached-child entries in actual Pi factory activation order. */\nexport function assembleChildExtensions(context: ExtensionContext): string[] {\n return [...resolveExtensionComposition(context).childActivation];\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.34",
|
|
4
4
|
"description": "Opinionated, composable Pi distribution for scoped agent tools, skills, MCP servers, and developer workflows.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -297,21 +297,21 @@
|
|
|
297
297
|
"cross-spawn": "7.0.6",
|
|
298
298
|
"gpt-tokenizer": "4.0.0",
|
|
299
299
|
"minimatch": "10.2.6",
|
|
300
|
-
"pi-cache-optimizer": "2.8.3",
|
|
301
300
|
"protobufjs": "8.7.2",
|
|
302
301
|
"rolldown": "1.2.5",
|
|
303
302
|
"typebox": "1.3.16",
|
|
304
303
|
"yaml": "2.9.0",
|
|
305
|
-
"@agimon-ai/doompi-
|
|
306
|
-
"@agimon-ai/doompi-
|
|
307
|
-
"@agimon-ai/doompi-
|
|
308
|
-
"@agimon-ai/doompi-
|
|
309
|
-
"@agimon-ai/doompi-
|
|
310
|
-
"@agimon-ai/doompi-profile": "0.0.1-alpha.
|
|
311
|
-
"@agimon-ai/doompi-
|
|
312
|
-
"@agimon-ai/doompi-
|
|
313
|
-
"@agimon-ai/doompi-ui": "0.0.1-alpha.
|
|
314
|
-
"@agimon-ai/doompi-
|
|
304
|
+
"@agimon-ai/doompi-autostop": "0.0.1-alpha.12",
|
|
305
|
+
"@agimon-ai/doompi-cache": "0.0.1-alpha.1",
|
|
306
|
+
"@agimon-ai/doompi-config": "0.0.1-alpha.34",
|
|
307
|
+
"@agimon-ai/doompi-domain": "0.0.1-alpha.12",
|
|
308
|
+
"@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.34",
|
|
309
|
+
"@agimon-ai/doompi-profile": "0.0.1-alpha.12",
|
|
310
|
+
"@agimon-ai/doompi-major-mode": "0.0.1-alpha.12",
|
|
311
|
+
"@agimon-ai/doompi-skill": "0.0.1-alpha.12",
|
|
312
|
+
"@agimon-ai/doompi-ui": "0.0.1-alpha.34",
|
|
313
|
+
"@agimon-ai/doompi-telemetry": "0.0.1-alpha.34",
|
|
314
|
+
"@agimon-ai/doompi-notification": "0.0.1-alpha.12"
|
|
315
315
|
},
|
|
316
316
|
"devDependencies": {
|
|
317
317
|
"@earendil-works/pi-ai": "0.84.2",
|
|
@@ -321,7 +321,7 @@
|
|
|
321
321
|
"@vitest/coverage-v8": "4.1.11",
|
|
322
322
|
"typescript": "7.0.2",
|
|
323
323
|
"vitest": "4.1.11",
|
|
324
|
-
"@agimon-ai/doompi-runner": "0.0.1-alpha.
|
|
324
|
+
"@agimon-ai/doompi-runner": "0.0.1-alpha.34"
|
|
325
325
|
},
|
|
326
326
|
"peerDependencies": {
|
|
327
327
|
"@earendil-works/pi-tui": "0.84.2"
|