@@ -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,38 @@ describe("feishu tool account routing", () => {
205236 expect ( lastClientAppId ( ) ) . toBe ( "app-b" ) ;
206237 } ) ;
207238
239+ test ( "perm tool rejects a disabled contextual account when another account enables it" , 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 : "a" } ) ;
249+ const result = await tool . execute ( "call" , { action : "unknown_action" } ) ;
250+
251+ expect ( createFeishuClientMock ) . not . toHaveBeenCalled ( ) ;
252+ expect ( result . details . error ) . toBe ( 'Feishu Perm tools are disabled for account "a"' ) ;
253+ } ) ;
254+
255+ test ( "perm tool rejects an explicit disabled account override" , async ( ) => {
256+ const { api, resolveTool } = createToolFactoryHarness (
257+ createConfig ( {
258+ toolsA : { perm : false } ,
259+ toolsB : { perm : true } ,
260+ } ) ,
261+ ) ;
262+ registerFeishuPermTools ( api ) ;
263+
264+ const tool = resolveTool ( "feishu_perm" , { agentAccountId : "b" } ) ;
265+ const result = await tool . execute ( "call" , { action : "unknown_action" , accountId : "a" } ) ;
266+
267+ expect ( createFeishuClientMock ) . not . toHaveBeenCalled ( ) ;
268+ expect ( result . details . error ) . toBe ( 'Feishu Perm tools are disabled for account "a"' ) ;
269+ } ) ;
270+
208271 test ( "bitable tool registers when only second account enables it and routes to agentAccountId" , async ( ) => {
209272 const { api, resolveTool } = createToolFactoryHarness (
210273 createConfig ( {
@@ -386,6 +449,22 @@ describe("feishu tool account routing", () => {
386449 expect ( lastClientAppId ( ) ) . toBe ( "app-a" ) ;
387450 } ) ;
388451
452+ test ( "wiki tool rejects an explicit disabled account override" , async ( ) => {
453+ const { api, resolveTool } = createToolFactoryHarness (
454+ createConfig ( {
455+ toolsA : { wiki : false } ,
456+ toolsB : { wiki : true } ,
457+ } ) ,
458+ ) ;
459+ registerFeishuWikiTools ( api ) ;
460+
461+ const tool = resolveTool ( "feishu_wiki" , { agentAccountId : "b" } ) ;
462+ const result = await tool . execute ( "call" , { action : "search" , accountId : "a" } ) ;
463+
464+ expect ( createFeishuClientMock ) . not . toHaveBeenCalled ( ) ;
465+ expect ( result . details . error ) . toBe ( 'Feishu Wiki tools are disabled for account "a"' ) ;
466+ } ) ;
467+
389468 test ( "does not silently fall back when the contextual account is real but uses non-env SecretRefs" , async ( ) => {
390469 const { api, resolveTool } = createToolFactoryHarness ( {
391470 channels : {
0 commit comments