@@ -119,6 +119,21 @@ describe("feishu tool account routing", () => {
119119 expect ( lastClientAppId ( ) ) . toBe ( "app-b" ) ;
120120 } ) ;
121121
122+ test ( "wiki tool implicit fallback selects an account with wiki enabled" , async ( ) => {
123+ const { api, resolveTool } = createToolFactoryHarness (
124+ createConfig ( {
125+ toolsA : { drive : true , wiki : false } ,
126+ toolsB : { wiki : true } ,
127+ } ) ,
128+ ) ;
129+ registerFeishuWikiTools ( api ) ;
130+
131+ const tool = resolveTool ( "feishu_wiki" ) ;
132+ await tool . execute ( "call" , { action : "search" } ) ;
133+
134+ expect ( lastClientAppId ( ) ) . toBe ( "app-b" ) ;
135+ } ) ;
136+
122137 test ( "wiki tool prefers the active contextual account over configured defaultAccount" , async ( ) => {
123138 const { api, resolveTool } = createToolFactoryHarness (
124139 createConfig ( {
@@ -190,6 +205,22 @@ describe("feishu tool account routing", () => {
190205 expect ( lastClientAppId ( ) ) . toBe ( "app-b" ) ;
191206 } ) ;
192207
208+ test ( "drive tool rejects a disabled contextual account when another account enables it" , async ( ) => {
209+ const { api, resolveTool } = createToolFactoryHarness (
210+ createConfig ( {
211+ toolsA : { drive : false } ,
212+ toolsB : { drive : true } ,
213+ } ) ,
214+ ) ;
215+ registerFeishuDriveTools ( api ) ;
216+
217+ const tool = resolveTool ( "feishu_drive" , { agentAccountId : "a" } ) ;
218+ const result = await tool . execute ( "call" , { action : "unknown_action" } ) ;
219+
220+ expect ( createFeishuClientMock ) . not . toHaveBeenCalled ( ) ;
221+ expect ( result . details . error ) . toBe ( 'Feishu Drive tools are disabled for account "a"' ) ;
222+ } ) ;
223+
193224 test ( "perm tool registers when only second account enables it and routes to agentAccountId" , async ( ) => {
194225 const { api, resolveTool } = createToolFactoryHarness (
195226 createConfig ( {
@@ -205,6 +236,22 @@ describe("feishu tool account routing", () => {
205236 expect ( lastClientAppId ( ) ) . toBe ( "app-b" ) ;
206237 } ) ;
207238
239+ test ( "perm tool rejects an explicit disabled account override" , async ( ) => {
240+ const { api, resolveTool } = createToolFactoryHarness (
241+ createConfig ( {
242+ toolsA : { perm : false } ,
243+ toolsB : { perm : true } ,
244+ } ) ,
245+ ) ;
246+ registerFeishuPermTools ( api ) ;
247+
248+ const tool = resolveTool ( "feishu_perm" , { agentAccountId : "b" } ) ;
249+ const result = await tool . execute ( "call" , { action : "unknown_action" , accountId : "a" } ) ;
250+
251+ expect ( createFeishuClientMock ) . not . toHaveBeenCalled ( ) ;
252+ expect ( result . details . error ) . toBe ( 'Feishu Perm tools are disabled for account "a"' ) ;
253+ } ) ;
254+
208255 test ( "bitable tool registers when only second account enables it and routes to agentAccountId" , async ( ) => {
209256 const { api, resolveTool } = createToolFactoryHarness (
210257 createConfig ( {
@@ -386,6 +433,22 @@ describe("feishu tool account routing", () => {
386433 expect ( lastClientAppId ( ) ) . toBe ( "app-a" ) ;
387434 } ) ;
388435
436+ test ( "wiki tool rejects an explicit disabled account override" , async ( ) => {
437+ const { api, resolveTool } = createToolFactoryHarness (
438+ createConfig ( {
439+ toolsA : { wiki : false } ,
440+ toolsB : { wiki : true } ,
441+ } ) ,
442+ ) ;
443+ registerFeishuWikiTools ( api ) ;
444+
445+ const tool = resolveTool ( "feishu_wiki" , { agentAccountId : "b" } ) ;
446+ const result = await tool . execute ( "call" , { action : "search" , accountId : "a" } ) ;
447+
448+ expect ( createFeishuClientMock ) . not . toHaveBeenCalled ( ) ;
449+ expect ( result . details . error ) . toBe ( 'Feishu Wiki tools are disabled for account "a"' ) ;
450+ } ) ;
451+
389452 test ( "does not silently fall back when the contextual account is real but uses non-env SecretRefs" , async ( ) => {
390453 const { api, resolveTool } = createToolFactoryHarness ( {
391454 channels : {
0 commit comments