@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 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 r` or the `doom-runner` CLI. Platform-specific RMUX binaries are selected
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. Use `SPC p p` for
434
- normal planning, `SPC p d` for debug planning, `SPC p f` for the Fable flow, and `SPC p e` to exit.
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. Use `SPC g g` for status, `SPC g s` to start, `SPC g e` to end, and `SPC g p` for
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 manage, `SPC w r` to recover a failed run, and `SPC w e` to give the agent
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 a` toggles autonomous capture; only its exact-active
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={cacheOptimizer:`cacheOptimizer`,cordisFinalizer:`cordisFinalizer`,cordisHost:`cordisHost`,effort:`effort`,modeCatalog:`modeCatalog`,ollamaProvider:`ollamaProvider`,transitionCoordinator:`transitionCoordinator`},a={autostop:`@agimon-ai/doompi-autostop/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.ownEntry(i.cacheOptimizer),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.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:3,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:3,...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=3,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;
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 = 3;
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;cAsCA;;;;;;;;;cAUA;cAEA,iBAAiB;;;;;iBAoBd,qBAAqB,wBAAwB;;iBAyU7C,4BAA4B,SAAS,mBAAmB;;iBAsCxD,mBAAmB,SAAS;;iBAK5B,wBAAwB,SAAS"}
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 = 3;
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;cAsCA;;;;;;;;;cAUA;cAEA,iBAAiB;;;;;iBAoBd,qBAAqB,wBAAwB;;iBAyU7C,4BAA4B,SAAS,mBAAmB;;iBAsCxD,mBAAmB,SAAS;;iBAK5B,wBAAwB,SAAS"}
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=3,h=2,g=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`]),_={cacheOptimizer:`cacheOptimizer`,cordisFinalizer:`cordisFinalizer`,cordisHost:`cordisHost`,effort:`effort`,modeCatalog:`modeCatalog`,ollamaProvider:`ollamaProvider`,transitionCoordinator:`transitionCoordinator`},v={autostop:`@agimon-ai/doompi-autostop/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.ownEntry(_.cacheOptimizer),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.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:3,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:3,...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};
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.32",
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-config": "0.0.1-alpha.32",
306
- "@agimon-ai/doompi-autostop": "0.0.1-alpha.10",
307
- "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.32",
308
- "@agimon-ai/doompi-major-mode": "0.0.1-alpha.10",
309
- "@agimon-ai/doompi-domain": "0.0.1-alpha.10",
310
- "@agimon-ai/doompi-profile": "0.0.1-alpha.10",
311
- "@agimon-ai/doompi-skill": "0.0.1-alpha.10",
312
- "@agimon-ai/doompi-telemetry": "0.0.1-alpha.32",
313
- "@agimon-ai/doompi-ui": "0.0.1-alpha.32",
314
- "@agimon-ai/doompi-notification": "0.0.1-alpha.10"
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.32"
324
+ "@agimon-ai/doompi-runner": "0.0.1-alpha.34"
325
325
  },
326
326
  "peerDependencies": {
327
327
  "@earendil-works/pi-tui": "0.84.2"