@@ -19,6 +19,7 @@ import { DisposableStore } from '../../../../../base/common/lifecycle.js';
19
19
import { runWithFakedTimers } from '../../../../../base/test/common/timeTravelScheduler.js' ;
20
20
import { timeout } from '../../../../../base/common/async.js' ;
21
21
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js' ;
22
+ import { URI } from '../../../../../base/common/uri.js' ;
22
23
23
24
suite ( 'ChatSelectedTools' , ( ) => {
24
25
@@ -48,6 +49,7 @@ suite('ChatSelectedTools', () => {
48
49
49
50
ensureNoDisposablesAreLeakedInTestSuite ( ) ;
50
51
52
+ const mcpSource : ToolDataSource = { type : 'mcp' , label : 'MCP' , collectionId : '' , definitionId : '' } ;
51
53
test ( 'Can\'t enable/disable MCP tools directly #18161' , ( ) => {
52
54
53
55
return runWithFakedTimers ( { } , async ( ) => {
@@ -58,14 +60,14 @@ suite('ChatSelectedTools', () => {
58
60
displayName : 'Test Tool 1' ,
59
61
canBeReferencedInPrompt : true ,
60
62
toolReferenceName : 't1' ,
61
- source : ToolDataSource . Internal ,
63
+ source : mcpSource ,
62
64
} ;
63
65
64
66
const toolData2 : IToolData = {
65
67
id : 'testTool2' ,
66
68
modelDescription : 'Test Tool 2' ,
67
69
displayName : 'Test Tool 2' ,
68
- source : ToolDataSource . Internal ,
70
+ source : mcpSource ,
69
71
canBeReferencedInPrompt : true ,
70
72
toolReferenceName : 't2' ,
71
73
} ;
@@ -74,13 +76,13 @@ suite('ChatSelectedTools', () => {
74
76
id : 'testTool3' ,
75
77
modelDescription : 'Test Tool 3' ,
76
78
displayName : 'Test Tool 3' ,
77
- source : ToolDataSource . Internal ,
79
+ source : mcpSource ,
78
80
canBeReferencedInPrompt : true ,
79
81
toolReferenceName : 't3' ,
80
82
} ;
81
83
82
84
const toolset = toolsService . createToolSet (
83
- ToolDataSource . Internal ,
85
+ mcpSource ,
84
86
'mcp' , 'mcp'
85
87
) ;
86
88
@@ -112,4 +114,69 @@ suite('ChatSelectedTools', () => {
112
114
assert . strictEqual ( map . get ( toolData3 ) , false ) ;
113
115
} ) ;
114
116
} ) ;
117
+
118
+ test ( 'Can still enable/disable user toolsets #251640' , ( ) => {
119
+ return runWithFakedTimers ( { } , async ( ) => {
120
+ const toolData1 : IToolData = {
121
+ id : 'testTool1' ,
122
+ modelDescription : 'Test Tool 1' ,
123
+ displayName : 'Test Tool 1' ,
124
+ canBeReferencedInPrompt : true ,
125
+ toolReferenceName : 't1' ,
126
+ source : ToolDataSource . Internal ,
127
+ } ;
128
+
129
+ const toolData2 : IToolData = {
130
+ id : 'testTool2' ,
131
+ modelDescription : 'Test Tool 2' ,
132
+ displayName : 'Test Tool 2' ,
133
+ source : mcpSource ,
134
+ canBeReferencedInPrompt : true ,
135
+ toolReferenceName : 't2' ,
136
+ } ;
137
+
138
+ const toolData3 : IToolData = {
139
+ id : 'testTool3' ,
140
+ modelDescription : 'Test Tool 3' ,
141
+ displayName : 'Test Tool 3' ,
142
+ source : ToolDataSource . Internal ,
143
+ canBeReferencedInPrompt : true ,
144
+ toolReferenceName : 't3' ,
145
+ } ;
146
+
147
+ const toolset = toolsService . createToolSet (
148
+ { type : 'user' , label : 'User Toolset' , file : URI . file ( '/userToolset.json' ) } ,
149
+ 'userToolset' , 'userToolset'
150
+ ) ;
151
+
152
+ store . add ( toolsService . registerToolData ( toolData1 ) ) ;
153
+ store . add ( toolsService . registerToolData ( toolData2 ) ) ;
154
+ store . add ( toolsService . registerToolData ( toolData3 ) ) ;
155
+
156
+ store . add ( toolset ) ;
157
+ store . add ( toolset . addTool ( toolData1 ) ) ;
158
+ store . add ( toolset . addTool ( toolData2 ) ) ;
159
+ store . add ( toolset . addTool ( toolData3 ) ) ;
160
+
161
+ assert . strictEqual ( Iterable . length ( toolsService . getTools ( ) ) , 3 ) ;
162
+
163
+ const size = Iterable . length ( toolset . getTools ( ) ) ;
164
+ assert . strictEqual ( size , 3 ) ;
165
+
166
+ await timeout ( 1000 ) ; // UGLY the tools service updates its state sync but emits the event async (750ms) delay. This affects the observable that depends on the event
167
+
168
+ assert . strictEqual ( selectedTools . entriesMap . size , 4 ) ; // 1 toolset, 3 tools
169
+
170
+ // Toolset is checked, tools 2 and 3 are unchecked
171
+ selectedTools . disable ( [ ] , [ toolData2 , toolData3 ] , false ) ;
172
+
173
+ const map = selectedTools . asEnablementMap ( ) ;
174
+ assert . strictEqual ( map . size , 3 ) ; // 3 tools
175
+
176
+ // User toolset is enabled - all tools are enabled
177
+ assert . strictEqual ( map . get ( toolData1 ) , true ) ;
178
+ assert . strictEqual ( map . get ( toolData2 ) , true ) ;
179
+ assert . strictEqual ( map . get ( toolData3 ) , true ) ;
180
+ } ) ;
181
+ } ) ;
115
182
} ) ;
0 commit comments