@@ -598,7 +598,7 @@ class UI {
598598 const officialCodes = new Set ( officialSelected ) ;
599599 const externalManager = new ExternalModuleManager ( ) ;
600600 const registryModules = await externalManager . listAvailable ( ) ;
601- const officialRegistryCodes = new Set ( registryModules . map ( ( m ) => m . code ) ) ;
601+ const officialRegistryCodes = new Set ( [ 'core' , 'bmm' , ... registryModules . map ( ( m ) => m . code ) ] ) ;
602602 const installedNonOfficial = [ ...installedModuleIds ] . filter ( ( id ) => ! officialRegistryCodes . has ( id ) ) ;
603603
604604 // Phase 2: Community modules (category drill-down)
@@ -630,27 +630,46 @@ class UI {
630630 * @returns {Array } Selected official module codes
631631 */
632632 async _selectOfficialModules ( installedModuleIds = new Set ( ) ) {
633+ // Built-in modules (core, bmm) come from local source, not the registry
634+ const { OfficialModules } = require ( './modules/official-modules' ) ;
635+ const builtInModules = ( await new OfficialModules ( ) . listAvailable ( ) ) . modules || [ ] ;
636+
637+ // External modules come from the registry (with fallback)
633638 const externalManager = new ExternalModuleManager ( ) ;
634639 const registryModules = await externalManager . listAvailable ( ) ;
635640
636641 const allOptions = [ ] ;
637642 const initialValues = [ ] ;
638643 const lockedValues = [ 'core' ] ;
639644
640- const buildModuleEntry = async ( mod ) => {
641- const isInstalled = installedModuleIds . has ( mod . code ) ;
642- const version = await getMarketplaceVersion ( mod . code ) ;
643- const label = version ? `${ mod . name } (v${ version } )` : mod . name ;
645+ const buildModuleEntry = async ( code , name , description , isDefault ) => {
646+ const isInstalled = installedModuleIds . has ( code ) ;
647+ const version = await getMarketplaceVersion ( code ) ;
648+ const label = version ? `${ name } (v${ version } )` : name ;
644649 return {
645650 label,
646- value : mod . code ,
647- hint : mod . description ,
648- selected : isInstalled ,
651+ value : code ,
652+ hint : description ,
653+ selected : isInstalled || isDefault ,
649654 } ;
650655 } ;
651656
657+ // Add built-in modules first (always available regardless of network)
658+ const builtInCodes = new Set ( ) ;
659+ for ( const mod of builtInModules ) {
660+ const code = mod . id ;
661+ builtInCodes . add ( code ) ;
662+ const entry = await buildModuleEntry ( code , mod . name , mod . description , mod . defaultSelected ) ;
663+ allOptions . push ( { label : entry . label , value : entry . value , hint : entry . hint } ) ;
664+ if ( entry . selected ) {
665+ initialValues . push ( code ) ;
666+ }
667+ }
668+
669+ // Add external registry modules (skip built-in duplicates)
652670 for ( const mod of registryModules ) {
653- const entry = await buildModuleEntry ( mod ) ;
671+ if ( mod . builtIn || builtInCodes . has ( mod . code ) ) continue ;
672+ const entry = await buildModuleEntry ( mod . code , mod . name , mod . description , mod . defaultSelected ) ;
654673 allOptions . push ( { label : entry . label , value : entry . value , hint : entry . hint } ) ;
655674 if ( entry . selected ) {
656675 initialValues . push ( mod . code ) ;
@@ -1122,12 +1141,26 @@ class UI {
11221141 * @returns {Array } Default module codes
11231142 */
11241143 async getDefaultModules ( installedModuleIds = new Set ( ) ) {
1125- const externalManager = new ExternalModuleManager ( ) ;
1126- const registryModules = await externalManager . listAvailable ( ) ;
1144+ // Built-in modules with default_selected come from local source
1145+ const { OfficialModules } = require ( './modules/official-modules' ) ;
1146+ const builtInModules = ( await new OfficialModules ( ) . listAvailable ( ) ) . modules || [ ] ;
11271147
11281148 const defaultModules = [ ] ;
1149+ const seen = new Set ( ) ;
1150+
1151+ for ( const mod of builtInModules ) {
1152+ if ( mod . defaultSelected || installedModuleIds . has ( mod . id ) ) {
1153+ defaultModules . push ( mod . id ) ;
1154+ seen . add ( mod . id ) ;
1155+ }
1156+ }
1157+
1158+ // Add external registry defaults
1159+ const externalManager = new ExternalModuleManager ( ) ;
1160+ const registryModules = await externalManager . listAvailable ( ) ;
11291161
11301162 for ( const mod of registryModules ) {
1163+ if ( mod . builtIn || seen . has ( mod . code ) ) continue ;
11311164 if ( mod . defaultSelected || installedModuleIds . has ( mod . code ) ) {
11321165 defaultModules . push ( mod . code ) ;
11331166 }
0 commit comments