@@ -652,13 +652,14 @@ describe("qa bundled plugin dir", () => {
652652 ) ;
653653 } ) ;
654654
655- it ( "creates a scoped bundled plugin tree for the allowed plugins only " , async ( ) => {
655+ it ( "creates a scoped bundled plugin tree for allowed plugins plus always-allowed runtime facades " , async ( ) => {
656656 const repoRoot = await mkdtemp ( path . join ( os . tmpdir ( ) , "qa-bundled-scope-" ) ) ;
657657 cleanups . push ( async ( ) => {
658658 await rm ( repoRoot , { recursive : true , force : true } ) ;
659659 } ) ;
660660 await mkdir ( path . join ( repoRoot , "dist" , "extensions" , "qa-channel" ) , { recursive : true } ) ;
661661 await mkdir ( path . join ( repoRoot , "dist" , "extensions" , "memory-core" ) , { recursive : true } ) ;
662+ await mkdir ( path . join ( repoRoot , "dist" , "extensions" , "speech-core" ) , { recursive : true } ) ;
662663 await mkdir ( path . join ( repoRoot , "dist" , "extensions" , "unused-plugin" ) , { recursive : true } ) ;
663664 await writeFile ( path . join ( repoRoot , "dist" , "shared-chunk-abc123.js" ) , "export {};\n" , "utf8" ) ;
664665 const tempRoot = await mkdtemp ( path . join ( os . tmpdir ( ) , "qa-bundled-target-" ) ) ;
@@ -672,7 +673,11 @@ describe("qa bundled plugin dir", () => {
672673 allowedPluginIds : [ "qa-channel" , "memory-core" ] ,
673674 } ) ;
674675
675- expect ( ( await readdir ( bundledPluginsDir ) ) . toSorted ( ) ) . toEqual ( [ "memory-core" , "qa-channel" ] ) ;
676+ expect ( ( await readdir ( bundledPluginsDir ) ) . toSorted ( ) ) . toEqual ( [
677+ "memory-core" ,
678+ "qa-channel" ,
679+ "speech-core" ,
680+ ] ) ;
676681 expect ( bundledPluginsDir ) . toBe (
677682 path . join (
678683 repoRoot ,
@@ -688,6 +693,7 @@ describe("qa bundled plugin dir", () => {
688693 ) ;
689694 expect ( ( await lstat ( path . join ( bundledPluginsDir , "qa-channel" ) ) ) . isDirectory ( ) ) . toBe ( true ) ;
690695 expect ( ( await lstat ( path . join ( bundledPluginsDir , "memory-core" ) ) ) . isDirectory ( ) ) . toBe ( true ) ;
696+ expect ( ( await lstat ( path . join ( bundledPluginsDir , "speech-core" ) ) ) . isDirectory ( ) ) . toBe ( true ) ;
691697 await expect (
692698 lstat (
693699 path . join (
@@ -854,4 +860,37 @@ describe("qa bundled plugin dir", () => {
854860 } ) ,
855861 ) . resolves . toBe ( "2026.4.8" ) ;
856862 } ) ;
863+
864+ it ( "includes always-allowed runtime facade plugins when raising the QA runtime host version" , async ( ) => {
865+ const repoRoot = await mkdtemp ( path . join ( os . tmpdir ( ) , "qa-runtime-version-runtime-facade-" ) ) ;
866+ cleanups . push ( async ( ) => {
867+ await rm ( repoRoot , { recursive : true , force : true } ) ;
868+ } ) ;
869+ await writeFile (
870+ path . join ( repoRoot , "package.json" ) ,
871+ JSON . stringify ( { version : "2026.4.7-1" } ) ,
872+ "utf8" ,
873+ ) ;
874+ const bundledRoot = path . join ( repoRoot , "extensions" ) ;
875+ await mkdir ( path . join ( bundledRoot , "qa-channel" ) , { recursive : true } ) ;
876+ await writeFile (
877+ path . join ( bundledRoot , "qa-channel" , "package.json" ) ,
878+ JSON . stringify ( { openclaw : { install : { minHostVersion : ">=2026.4.8" } } } ) ,
879+ "utf8" ,
880+ ) ;
881+ await mkdir ( path . join ( bundledRoot , "speech-core" ) , { recursive : true } ) ;
882+ await writeFile (
883+ path . join ( bundledRoot , "speech-core" , "package.json" ) ,
884+ JSON . stringify ( { openclaw : { install : { minHostVersion : ">=2026.4.9" } } } ) ,
885+ "utf8" ,
886+ ) ;
887+
888+ await expect (
889+ __testing . resolveQaRuntimeHostVersion ( {
890+ repoRoot,
891+ bundledPluginsSourceRoot : bundledRoot ,
892+ allowedPluginIds : [ "qa-channel" ] ,
893+ } ) ,
894+ ) . resolves . toBe ( "2026.4.9" ) ;
895+ } ) ;
857896} ) ;
0 commit comments