@agimon-ai/doompi 0.0.1-alpha.48 → 0.0.1-alpha.49

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.
Files changed (40) hide show
  1. package/dist/src/adapters/composer.cjs +1 -1
  2. package/dist/src/adapters/composer.cjs.map +1 -1
  3. package/dist/src/adapters/composer.d.cts.map +1 -1
  4. package/dist/src/adapters/composer.d.mts.map +1 -1
  5. package/dist/src/adapters/composer.mjs +1 -1
  6. package/dist/src/adapters/composer.mjs.map +1 -1
  7. package/dist/src/adapters/config/harnessState.d.mts +2 -2
  8. package/dist/src/adapters/piExtensionDispatcher.cjs +1 -1
  9. package/dist/src/adapters/piExtensionDispatcher.cjs.map +1 -1
  10. package/dist/src/adapters/piExtensionDispatcher.mjs +1 -1
  11. package/dist/src/adapters/piExtensionDispatcher.mjs.map +1 -1
  12. package/dist/src/commands/syncCommand.cjs +7 -6
  13. package/dist/src/commands/syncCommand.cjs.map +1 -1
  14. package/dist/src/commands/syncCommand.d.cts.map +1 -1
  15. package/dist/src/commands/syncCommand.d.mts.map +1 -1
  16. package/dist/src/commands/syncCommand.mjs +7 -6
  17. package/dist/src/commands/syncCommand.mjs.map +1 -1
  18. package/dist/src/extensions/entries/modeCatalog.cjs +1 -1
  19. package/dist/src/extensions/entries/modeCatalog.cjs.map +1 -1
  20. package/dist/src/extensions/entries/modeCatalog.d.cts.map +1 -1
  21. package/dist/src/extensions/entries/modeCatalog.d.mts.map +1 -1
  22. package/dist/src/extensions/entries/modeCatalog.mjs +1 -1
  23. package/dist/src/extensions/entries/modeCatalog.mjs.map +1 -1
  24. package/dist/src/services/contextCatalog.cjs +2 -0
  25. package/dist/src/services/contextCatalog.cjs.map +1 -0
  26. package/dist/src/services/contextCatalog.mjs +2 -0
  27. package/dist/src/services/contextCatalog.mjs.map +1 -0
  28. package/dist/src/services/contextProjection.cjs +2 -0
  29. package/dist/src/services/contextProjection.cjs.map +1 -0
  30. package/dist/src/services/contextProjection.mjs +2 -0
  31. package/dist/src/services/contextProjection.mjs.map +1 -0
  32. package/dist/src/services/extensionAssembler.cjs +1 -1
  33. package/dist/src/services/extensionAssembler.cjs.map +1 -1
  34. package/dist/src/services/extensionAssembler.d.cts +19 -1
  35. package/dist/src/services/extensionAssembler.d.cts.map +1 -1
  36. package/dist/src/services/extensionAssembler.d.mts +19 -1
  37. package/dist/src/services/extensionAssembler.d.mts.map +1 -1
  38. package/dist/src/services/extensionAssembler.mjs +1 -1
  39. package/dist/src/services/extensionAssembler.mjs.map +1 -1
  40. package/package.json +13 -13
@@ -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=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};
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";import{extensionPackageName as m}from"@agimon-ai/doompi-ui/extensionName";function h(e){let t={},n=e.majorMode?.name;if(n===void 0)return t;for(let r of e.selections){if(r.entryKind!==`package`||r.outcome!==`resolved`)continue;let e={kind:`major`,mode:n,layer:r.layer},i=r.path===void 0?void 0:m(r.path);i!==void 0&&t[i]===void 0&&(t[i]=e),t[r.selector]===void 0&&(t[r.selector]=e)}return t}const g=4,_=2,v=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`]),y={cordisFinalizer:`cordisFinalizer`,cordisHost:`cordisHost`,effort:`effort`,modeCatalog:`modeCatalog`,ollamaProvider:`ollamaProvider`,transitionCoordinator:`transitionCoordinator`},b={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`},x=`ollama`,S=`@agimon-ai/doompi-profile/extensions/persona`,C={ownEntry:c,packageEntry:u,optionalPackageEntry:s,packageEntries:l,optionalPackageEntries:o,localEntry:r,localEntries:n,localPackageEntries:i,localPackageName:a};function w(e,t){return Error(`Cannot resolve configured package "${e}" from ${t}.`)}function T(l){if(!l)return C;let u=e=>v.has(E(e))?s(e):void 0,d=e=>v.has(E(e))?o(e):void 0;return{ownEntry:c,packageEntry:e=>{let n=t(e,l)??u(e);if(!n)throw w(e,l);return n},optionalPackageEntry:e=>t(e,l)??u(e),packageEntries:t=>{let n=e(t,l)??d(t);if(!n)throw w(t,l);return n},optionalPackageEntries:t=>e(t,l)??d(t),localEntry:r,localEntries:n,localPackageEntries:i,localPackageName:a}}function E(e){let t=e.split(`/`);return e.startsWith(`@`)?t.slice(0,2).join(`/`):t[0]??e}function D(e,t){let n=E(e);if(v.has(n))throw Error(`Layer "${t}" cannot select fixed DoomPi host package "${n}" as a feature extension.`)}function O(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 k(e,t,n){let r=e.localPackageEntries?.(t,n);return r===void 0?O(e,t,n):r}function A(e,t,n){return{...e,manifestIndex:t,outcome:`resolved`,path:n,canonicalPath:d(n)}}function j(e,t){return{...e,manifestIndex:0,outcome:`missing-optional`,diagnostic:t}}function M(e){return e instanceof Error?e.message:String(e)}function N(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(A(a,0,r.ownEntry(s)));continue}let c=O(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(A(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&&D(n,t),f=k(r,c,e.baseDirectory)}else if(D(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(j(d,M(e)));continue}throw e}if(!f?.length){if(l){i.push(j(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(A(d,t,e))})}return i}function P(e,t,n,r){let i=e.layers[t];if(!i)throw Error(`Unknown layer: ${t}`);return N(i,t,n,r)}function F(e,t){return e.default?N(e.default,`default`,-1,t):[]}function I(e){let t=e.resolvers??C;return e.layers.flatMap((n,r)=>P(e.majorModesConfig,n,r,t))}function L(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 R(e){return L(e.flatMap(e=>e.outcome===`resolved`&&e.path?[e.path]:[]))}function z(e,t,n){let r=e.resolvers??C,i=[r.ownEntry(y.cordisHost),r.ownEntry(y.modeCatalog),r.packageEntry(b.config),r.ownEntry(y.transitionCoordinator),r.packageEntry(b.ui)];return e.mute||i.push(r.packageEntry(b.notification)),i.push(r.packageEntry(b.profile),r.packageEntry(b.majorMode),r.packageEntry(b.skill),r.packageEntry(b.domain),r.ownEntry(y.effort)),e.preset===`ollama`&&i.push(r.ownEntry(y.ollamaProvider)),i.push(...t,...n),e.personaEntry&&i.push(e.personaEntry),e.autoStop&&i.push(r.packageEntry(b.autostop)),i.push(r.packageEntry(b.cache)),i.push(r.ownEntry(y.cordisFinalizer)),L(i)}function B(e,t,n){let r=e.resolvers??C,i=[r.ownEntry(y.cordisHost),r.packageEntry(b.config),...t,...n];return e.preset===`ollama`&&i.push(r.ownEntry(y.ollamaProvider)),e.personaEntry&&i.push(e.personaEntry),i.push(r.ownEntry(y.cordisFinalizer)),L(i)}function V(e){return Array.isArray(e)?e.map(V):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,V(t)]))}function H(e){return f(JSON.stringify(V({...e,contract:{composition:4,standardPiExtension:2,fixedCorePackages:[...v]},parentCanonicalActivation:e.parentActivation.map(d),childCanonicalActivation:e.childActivation.map(d)})))}function U(e){let t=e.resolvers??C,n=F(e.majorModesConfig,t),r=I(e),i=[...n,...r],a=R(n),o=R(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:z(e,a,o),childActivation:B(e,a,o)};return{...l,fingerprint:H(l)}}function W(e){return[...U(e).parentActivation]}function G(e){return[...U(e).childActivation]}export{g as COMPOSITION_FINGERPRINT_VERSION,C as LAYER_RESOLVERS,x as OLLAMA_PRESET,S as PERSONA_ENTRY,_ as STANDARD_PI_EXTENSION_CONTRACT_VERSION,G as assembleChildExtensions,W as assembleExtensions,T as createLayerResolvers,h as packageAttribution,U 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 = 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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"}
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 type { PackageAttribution } from '@agimon-ai/doompi-config/types';\nimport { extensionPackageName } from '@agimon-ai/doompi-ui/extensionName';\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\n/**\n * Which layer of which major mode admitted each package.\n *\n * The composition already holds this join while it resolves package names to\n * entry paths, then drops it, so a session cannot afterwards say why a tool is\n * present. Reducing it here keeps the selection type private and costs one pass\n * over an array the caller already has.\n *\n * Only `package` entries appear. A bare `extension` selector is a path rather\n * than a package name, so it has nothing a registered tool could be joined on.\n *\n * Keyed by manifest name first, because that is what a registered tool resolves\n * to. The selector is kept as an alias: a layer may name a package as\n * `@agimon-ai/doompi-team` when published or `./layers/team/doompi-team` in a\n * checkout, and both have to find the same layer.\n */\nexport function packageAttribution(composition: ExtensionComposition): Record<string, PackageAttribution> {\n const attribution: Record<string, PackageAttribution> = {};\n const mode = composition.majorMode?.name;\n if (mode === undefined) return attribution;\n for (const selection of composition.selections) {\n if (selection.entryKind !== 'package') continue;\n if (selection.outcome !== 'resolved') continue;\n // First layer wins, matching activation order: the earlier layer is the one\n // whose copy of a duplicated package actually loaded.\n const value: PackageAttribution = { kind: 'major', mode, layer: selection.layer };\n const manifest = selection.path === undefined ? undefined : extensionPackageName(selection.path);\n if (manifest !== undefined && attribution[manifest] === undefined) attribution[manifest] = value;\n if (attribution[selection.selector] === undefined) attribution[selection.selector] = value;\n }\n return attribution;\n}\nexport const COMPOSITION_FINGERPRINT_VERSION = 4;\nexport const STANDARD_PI_EXTENSION_CONTRACT_VERSION = 2;\n\nconst DEFAULT_SELECTION_LAYER = 'default';\nconst DEFAULT_SELECTION_LAYER_INDEX = -1;\n\nconst FIXED_CORE_PACKAGES = new Set([\n '@agimon-ai/doompi',\n '@agimon-ai/doompi-autostop',\n '@agimon-ai/doompi-cache',\n '@agimon-ai/doompi-config',\n '@agimon-ai/doompi-domain',\n '@agimon-ai/doompi-major-mode',\n '@agimon-ai/doompi-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.48",
3
+ "version": "0.0.1-alpha.49",
4
4
  "description": "Opinionated, composable Pi distribution for scoped agent tools, skills, MCP servers, and developer workflows.",
5
5
  "keywords": [
6
6
  "ai",
@@ -309,17 +309,17 @@
309
309
  "rolldown": "1.2.6",
310
310
  "typebox": "1.3.19",
311
311
  "yaml": "2.9.0",
312
- "@agimon-ai/doompi-cache": "0.0.1-alpha.14",
313
- "@agimon-ai/doompi-autostop": "0.0.1-alpha.25",
314
- "@agimon-ai/doompi-domain": "0.0.1-alpha.26",
315
- "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.47",
316
- "@agimon-ai/doompi-config": "0.0.1-alpha.47",
317
- "@agimon-ai/doompi-major-mode": "0.0.1-alpha.26",
318
- "@agimon-ai/doompi-notification": "0.0.1-alpha.25",
319
- "@agimon-ai/doompi-profile": "0.0.1-alpha.26",
320
- "@agimon-ai/doompi-telemetry": "0.0.1-alpha.47",
321
- "@agimon-ai/doompi-skill": "0.0.1-alpha.26",
322
- "@agimon-ai/doompi-ui": "0.0.1-alpha.48"
312
+ "@agimon-ai/doompi-autostop": "0.0.1-alpha.26",
313
+ "@agimon-ai/doompi-config": "0.0.1-alpha.48",
314
+ "@agimon-ai/doompi-domain": "0.0.1-alpha.27",
315
+ "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.48",
316
+ "@agimon-ai/doompi-notification": "0.0.1-alpha.26",
317
+ "@agimon-ai/doompi-major-mode": "0.0.1-alpha.27",
318
+ "@agimon-ai/doompi-profile": "0.0.1-alpha.27",
319
+ "@agimon-ai/doompi-skill": "0.0.1-alpha.27",
320
+ "@agimon-ai/doompi-ui": "0.0.1-alpha.49",
321
+ "@agimon-ai/doompi-telemetry": "0.0.1-alpha.48",
322
+ "@agimon-ai/doompi-cache": "0.0.1-alpha.15"
323
323
  },
324
324
  "devDependencies": {
325
325
  "@earendil-works/pi-ai": "0.84.4",
@@ -329,7 +329,7 @@
329
329
  "@vitest/coverage-v8": "4.1.11",
330
330
  "typescript": "7.0.2",
331
331
  "vitest": "4.1.11",
332
- "@agimon-ai/doompi-runner": "0.0.1-alpha.48"
332
+ "@agimon-ai/doompi-runner": "0.0.1-alpha.49"
333
333
  },
334
334
  "peerDependencies": {
335
335
  "@earendil-works/pi-tui": "0.84.4"