@theia/ai-ide 1.74.0-next.15 → 1.74.0-next.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/browser/workspace-search-provider.d.ts.map +1 -1
- package/lib/browser/workspace-search-provider.js +28 -20
- package/lib/browser/workspace-search-provider.js.map +1 -1
- package/lib/browser/workspace-search-provider.spec.js +68 -0
- package/lib/browser/workspace-search-provider.spec.js.map +1 -1
- package/package.json +23 -23
- package/src/browser/workspace-search-provider.spec.ts +101 -0
- package/src/browser/workspace-search-provider.ts +34 -23
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-search-provider.d.ts","sourceRoot":"","sources":["../../src/browser/workspace-search-provider.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAyB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAE1F,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAA8B,MAAM,oEAAoE,CAAC;AAG1I,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,qBACa,uBAAwB,YAAW,YAAY;IAGxD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IAG3D,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,sBAAsB,CAAC;IAG1D,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAGxD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAE5C,OAAO,IAAI,WAAW;YA6CR,oBAAoB;YA6BpB,YAAY;
|
|
1
|
+
{"version":3,"file":"workspace-search-provider.d.ts","sourceRoot":"","sources":["../../src/browser/workspace-search-provider.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAyB,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uDAAuD,CAAC;AAE1F,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAA8B,MAAM,oEAAoE,CAAC;AAG1I,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAI/D,qBACa,uBAAwB,YAAW,YAAY;IAGxD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,wBAAwB,CAAC;IAG3D,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,sBAAsB,CAAC;IAG1D,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAGxD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAE5C,OAAO,IAAI,WAAW;YA6CR,oBAAoB;YA6BpB,YAAY;CAwH7B"}
|
|
@@ -98,6 +98,9 @@ let WorkspaceSearchProvider = class WorkspaceSearchProvider {
|
|
|
98
98
|
async handleSearch(argString, cancellationToken) {
|
|
99
99
|
try {
|
|
100
100
|
const args = JSON.parse(argString);
|
|
101
|
+
if (cancellationToken?.isCancellationRequested) {
|
|
102
|
+
return JSON.stringify({ error: 'Operation cancelled by user' });
|
|
103
|
+
}
|
|
101
104
|
const results = [];
|
|
102
105
|
let expectedSearchId;
|
|
103
106
|
let searchCompleted = false;
|
|
@@ -107,10 +110,24 @@ let WorkspaceSearchProvider = class WorkspaceSearchProvider {
|
|
|
107
110
|
searchCompleted = true;
|
|
108
111
|
}
|
|
109
112
|
});
|
|
110
|
-
if
|
|
111
|
-
|
|
113
|
+
// Use one more than our actual maximum. this way we can determine if we have more results than our maximum and warn the user
|
|
114
|
+
const maxResultsForTheiaAPI = this.preferenceService.get(workspace_preferences_1.SEARCH_IN_WORKSPACE_MAX_RESULTS_PREF, 30) + 1;
|
|
115
|
+
const options = {
|
|
116
|
+
useRegExp: args.useRegExp,
|
|
117
|
+
matchCase: false,
|
|
118
|
+
matchWholeWord: false,
|
|
119
|
+
maxResults: maxResultsForTheiaAPI,
|
|
120
|
+
};
|
|
121
|
+
// The model may supply fileExtensions as a single string instead of an array; normalize to an array so that `.map` never throws.
|
|
122
|
+
const fileExtensions = args.fileExtensions === undefined ? undefined
|
|
123
|
+
: Array.isArray(args.fileExtensions) ? args.fileExtensions
|
|
124
|
+
: [args.fileExtensions];
|
|
125
|
+
if (fileExtensions && fileExtensions.length > 0) {
|
|
126
|
+
options.include = fileExtensions.map(ext => `**/*.${ext}`);
|
|
112
127
|
}
|
|
113
|
-
|
|
128
|
+
// Resolve the search roots before starting the search so that any error is reported through the outer try/catch.
|
|
129
|
+
const rootUris = await this.determineSearchRoots(args.subDirectoryPath);
|
|
130
|
+
const searchPromise = new Promise((resolve, reject) => {
|
|
114
131
|
const callbacks = {
|
|
115
132
|
onResult: (id, result) => {
|
|
116
133
|
if (expectedSearchId !== undefined && id !== expectedSearchId) {
|
|
@@ -137,24 +154,13 @@ let WorkspaceSearchProvider = class WorkspaceSearchProvider {
|
|
|
137
154
|
}
|
|
138
155
|
}
|
|
139
156
|
};
|
|
140
|
-
|
|
141
|
-
const maxResultsForTheiaAPI = this.preferenceService.get(workspace_preferences_1.SEARCH_IN_WORKSPACE_MAX_RESULTS_PREF, 30) + 1;
|
|
142
|
-
const options = {
|
|
143
|
-
useRegExp: args.useRegExp,
|
|
144
|
-
matchCase: false,
|
|
145
|
-
matchWholeWord: false,
|
|
146
|
-
maxResults: maxResultsForTheiaAPI,
|
|
147
|
-
};
|
|
148
|
-
if (args.fileExtensions && args.fileExtensions.length > 0) {
|
|
149
|
-
options.include = args.fileExtensions.map(ext => `**/*.${ext}`);
|
|
150
|
-
}
|
|
151
|
-
await this.determineSearchRoots(args.subDirectoryPath)
|
|
152
|
-
.then(rootUris => this.searchService.searchWithCallback(args.query, rootUris, callbacks, options))
|
|
157
|
+
this.searchService.searchWithCallback(args.query, rootUris, callbacks, options)
|
|
153
158
|
.then(id => {
|
|
154
159
|
expectedSearchId = id;
|
|
155
|
-
|
|
160
|
+
// Handle cancellation that was requested before the search id became available.
|
|
161
|
+
if (cancellationToken?.isCancellationRequested && !searchCompleted) {
|
|
156
162
|
this.searchService.cancel(id);
|
|
157
|
-
}
|
|
163
|
+
}
|
|
158
164
|
})
|
|
159
165
|
.catch(err => {
|
|
160
166
|
searchCompleted = true;
|
|
@@ -163,8 +169,10 @@ let WorkspaceSearchProvider = class WorkspaceSearchProvider {
|
|
|
163
169
|
});
|
|
164
170
|
const timeoutPromise = new Promise((_, reject) => {
|
|
165
171
|
setTimeout(() => {
|
|
166
|
-
if (
|
|
167
|
-
|
|
172
|
+
if (!searchCompleted) {
|
|
173
|
+
if (expectedSearchId !== undefined) {
|
|
174
|
+
this.searchService.cancel(expectedSearchId);
|
|
175
|
+
}
|
|
168
176
|
searchCompleted = true;
|
|
169
177
|
reject(new Error('Search timed out after 30 seconds'));
|
|
170
178
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-search-provider.js","sourceRoot":"","sources":["../../src/browser/workspace-search-provider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workspace-search-provider.js","sourceRoot":"","sources":["../../src/browser/workspace-search-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
// *****************************************************************************
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
const chai_1 = require("chai");
|
|
19
|
+
const sinon = require("sinon");
|
|
19
20
|
const core_1 = require("@theia/core");
|
|
20
21
|
const workspace_search_provider_1 = require("./workspace-search-provider");
|
|
21
22
|
const inversify_1 = require("@theia/core/shared/inversify");
|
|
@@ -77,5 +78,72 @@ describe('Workspace Search Provider Cancellation Tests', () => {
|
|
|
77
78
|
const jsonResponse = JSON.parse(result);
|
|
78
79
|
(0, chai_1.expect)(jsonResponse.error).to.equal('Operation cancelled by user');
|
|
79
80
|
});
|
|
81
|
+
it('should normalize a string fileExtensions argument into an include array without hanging', async () => {
|
|
82
|
+
let capturedOptions;
|
|
83
|
+
// Rebind the search service so it records the options and immediately completes the search.
|
|
84
|
+
container.rebind(search_in_workspace_service_1.SearchInWorkspaceService).toConstantValue({
|
|
85
|
+
searchWithCallback: async (query, rootUris, callbacks, options) => {
|
|
86
|
+
capturedOptions = options;
|
|
87
|
+
callbacks.onDone?.(1);
|
|
88
|
+
return 1;
|
|
89
|
+
},
|
|
90
|
+
cancel: () => { }
|
|
91
|
+
});
|
|
92
|
+
const searchProvider = container.get(workspace_search_provider_1.WorkspaceSearchProvider);
|
|
93
|
+
const handler = searchProvider.getTool().handler;
|
|
94
|
+
// The model may emit fileExtensions as a bare string instead of an array.
|
|
95
|
+
const result = await handler(JSON.stringify({ query: 'deleteSession', useRegExp: false, fileExtensions: 'spec.ts' }), mockCtx);
|
|
96
|
+
const jsonResponse = JSON.parse(result);
|
|
97
|
+
(0, chai_1.expect)(jsonResponse.error).to.equal(undefined);
|
|
98
|
+
(0, chai_1.expect)(capturedOptions?.include).to.deep.equal(['**/*.spec.ts']);
|
|
99
|
+
});
|
|
100
|
+
it('should time out instead of hanging when the search never reports completion', async () => {
|
|
101
|
+
// Reproduces the original hang: the backend returns a search id but onDone is never called,
|
|
102
|
+
// and previously the search could also never report an id at all.
|
|
103
|
+
container.rebind(search_in_workspace_service_1.SearchInWorkspaceService).toConstantValue({
|
|
104
|
+
searchWithCallback: () => new Promise(() => { }),
|
|
105
|
+
cancel: () => { }
|
|
106
|
+
});
|
|
107
|
+
const searchProvider = container.get(workspace_search_provider_1.WorkspaceSearchProvider);
|
|
108
|
+
const handler = searchProvider.getTool().handler;
|
|
109
|
+
const clock = sinon.useFakeTimers();
|
|
110
|
+
try {
|
|
111
|
+
const resultPromise = handler(JSON.stringify({ query: 'deleteSession', useRegExp: false }), mockCtx);
|
|
112
|
+
await clock.tickAsync(30000);
|
|
113
|
+
const jsonResponse = JSON.parse(await resultPromise);
|
|
114
|
+
(0, chai_1.expect)(jsonResponse.error).to.equal('Search timed out after 30 seconds');
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
clock.restore();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
it('should return an error (not hang) when search setup fails', async () => {
|
|
121
|
+
// An empty workspace makes determineSearchRoots throw; the error must surface as a result.
|
|
122
|
+
container.rebind(workspace_functions_1.WorkspaceFunctionScope).toConstantValue({
|
|
123
|
+
getRootMapping: () => new Map()
|
|
124
|
+
});
|
|
125
|
+
const searchProvider = container.get(workspace_search_provider_1.WorkspaceSearchProvider);
|
|
126
|
+
const handler = searchProvider.getTool().handler;
|
|
127
|
+
const result = await handler(JSON.stringify({ query: 'deleteSession', useRegExp: false }), mockCtx);
|
|
128
|
+
const jsonResponse = JSON.parse(result);
|
|
129
|
+
(0, chai_1.expect)(jsonResponse.error).to.equal('No workspace has been opened yet');
|
|
130
|
+
});
|
|
131
|
+
it('should accept an array fileExtensions argument', async () => {
|
|
132
|
+
let capturedOptions;
|
|
133
|
+
container.rebind(search_in_workspace_service_1.SearchInWorkspaceService).toConstantValue({
|
|
134
|
+
searchWithCallback: async (query, rootUris, callbacks, options) => {
|
|
135
|
+
capturedOptions = options;
|
|
136
|
+
callbacks.onDone?.(1);
|
|
137
|
+
return 1;
|
|
138
|
+
},
|
|
139
|
+
cancel: () => { }
|
|
140
|
+
});
|
|
141
|
+
const searchProvider = container.get(workspace_search_provider_1.WorkspaceSearchProvider);
|
|
142
|
+
const handler = searchProvider.getTool().handler;
|
|
143
|
+
const result = await handler(JSON.stringify({ query: 'deleteSession', useRegExp: false, fileExtensions: ['ts', 'js'] }), mockCtx);
|
|
144
|
+
const jsonResponse = JSON.parse(result);
|
|
145
|
+
(0, chai_1.expect)(jsonResponse.error).to.equal(undefined);
|
|
146
|
+
(0, chai_1.expect)(capturedOptions?.include).to.deep.equal(['**/*.ts', '**/*.js']);
|
|
147
|
+
});
|
|
80
148
|
});
|
|
81
149
|
//# sourceMappingURL=workspace-search-provider.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-search-provider.spec.js","sourceRoot":"","sources":["../../src/browser/workspace-search-provider.spec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace-search-provider.spec.js","sourceRoot":"","sources":["../../src/browser/workspace-search-provider.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-ide",
|
|
3
|
-
"version": "1.74.0-next.
|
|
3
|
+
"version": "1.74.0-next.17+3351cf136",
|
|
4
4
|
"description": "AI IDE Agents Extension",
|
|
5
5
|
"license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -15,25 +15,25 @@
|
|
|
15
15
|
"theia-extension"
|
|
16
16
|
],
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@theia/ai-chat": "1.74.0-next.
|
|
19
|
-
"@theia/ai-chat-ui": "1.74.0-next.
|
|
20
|
-
"@theia/ai-core": "1.74.0-next.
|
|
21
|
-
"@theia/ai-mcp": "1.74.0-next.
|
|
22
|
-
"@theia/ai-terminal": "1.74.0-next.
|
|
23
|
-
"@theia/core": "1.74.0-next.
|
|
24
|
-
"@theia/debug": "1.74.0-next.
|
|
25
|
-
"@theia/editor": "1.74.0-next.
|
|
26
|
-
"@theia/file-search": "1.74.0-next.
|
|
27
|
-
"@theia/filesystem": "1.74.0-next.
|
|
28
|
-
"@theia/markers": "1.74.0-next.
|
|
29
|
-
"@theia/monaco": "1.74.0-next.
|
|
30
|
-
"@theia/navigator": "1.74.0-next.
|
|
31
|
-
"@theia/preferences": "1.74.0-next.
|
|
32
|
-
"@theia/scm": "1.74.0-next.
|
|
33
|
-
"@theia/search-in-workspace": "1.74.0-next.
|
|
34
|
-
"@theia/task": "1.74.0-next.
|
|
35
|
-
"@theia/terminal": "1.74.0-next.
|
|
36
|
-
"@theia/workspace": "1.74.0-next.
|
|
18
|
+
"@theia/ai-chat": "1.74.0-next.17+3351cf136",
|
|
19
|
+
"@theia/ai-chat-ui": "1.74.0-next.17+3351cf136",
|
|
20
|
+
"@theia/ai-core": "1.74.0-next.17+3351cf136",
|
|
21
|
+
"@theia/ai-mcp": "1.74.0-next.17+3351cf136",
|
|
22
|
+
"@theia/ai-terminal": "1.74.0-next.17+3351cf136",
|
|
23
|
+
"@theia/core": "1.74.0-next.17+3351cf136",
|
|
24
|
+
"@theia/debug": "1.74.0-next.17+3351cf136",
|
|
25
|
+
"@theia/editor": "1.74.0-next.17+3351cf136",
|
|
26
|
+
"@theia/file-search": "1.74.0-next.17+3351cf136",
|
|
27
|
+
"@theia/filesystem": "1.74.0-next.17+3351cf136",
|
|
28
|
+
"@theia/markers": "1.74.0-next.17+3351cf136",
|
|
29
|
+
"@theia/monaco": "1.74.0-next.17+3351cf136",
|
|
30
|
+
"@theia/navigator": "1.74.0-next.17+3351cf136",
|
|
31
|
+
"@theia/preferences": "1.74.0-next.17+3351cf136",
|
|
32
|
+
"@theia/scm": "1.74.0-next.17+3351cf136",
|
|
33
|
+
"@theia/search-in-workspace": "1.74.0-next.17+3351cf136",
|
|
34
|
+
"@theia/task": "1.74.0-next.17+3351cf136",
|
|
35
|
+
"@theia/terminal": "1.74.0-next.17+3351cf136",
|
|
36
|
+
"@theia/workspace": "1.74.0-next.17+3351cf136",
|
|
37
37
|
"date-fns": "^4.1.0",
|
|
38
38
|
"ignore": "^6.0.2",
|
|
39
39
|
"js-yaml": "^4.2.0",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@theia/cli": "1.74.0-next.
|
|
49
|
-
"@theia/test": "1.74.0-next.
|
|
48
|
+
"@theia/cli": "1.74.0-next.17+3351cf136",
|
|
49
|
+
"@theia/test": "1.74.0-next.17+3351cf136"
|
|
50
50
|
},
|
|
51
51
|
"theiaExtensions": [
|
|
52
52
|
{
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
"nyc": {
|
|
71
71
|
"extends": "../../configs/nyc.json"
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "3351cf1363eb15fad7088cfc9e6857377baf0acc"
|
|
74
74
|
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { expect } from 'chai';
|
|
18
|
+
import * as sinon from 'sinon';
|
|
18
19
|
import { CancellationTokenSource, PreferenceService } from '@theia/core';
|
|
19
20
|
import { WorkspaceSearchProvider } from './workspace-search-provider';
|
|
20
21
|
import { ToolInvocationContext } from '@theia/ai-core';
|
|
@@ -100,4 +101,104 @@ describe('Workspace Search Provider Cancellation Tests', () => {
|
|
|
100
101
|
expect(jsonResponse.error).to.equal('Operation cancelled by user');
|
|
101
102
|
});
|
|
102
103
|
|
|
104
|
+
it('should normalize a string fileExtensions argument into an include array without hanging', async () => {
|
|
105
|
+
let capturedOptions: SearchInWorkspaceOptions | undefined;
|
|
106
|
+
// Rebind the search service so it records the options and immediately completes the search.
|
|
107
|
+
container.rebind(SearchInWorkspaceService).toConstantValue({
|
|
108
|
+
searchWithCallback: async (
|
|
109
|
+
query: string,
|
|
110
|
+
rootUris: string[],
|
|
111
|
+
callbacks: SearchInWorkspaceCallbacks,
|
|
112
|
+
options: SearchInWorkspaceOptions
|
|
113
|
+
) => {
|
|
114
|
+
capturedOptions = options;
|
|
115
|
+
callbacks.onDone?.(1);
|
|
116
|
+
return 1;
|
|
117
|
+
},
|
|
118
|
+
cancel: () => { }
|
|
119
|
+
} as unknown as SearchInWorkspaceService);
|
|
120
|
+
|
|
121
|
+
const searchProvider = container.get(WorkspaceSearchProvider);
|
|
122
|
+
const handler = searchProvider.getTool().handler;
|
|
123
|
+
// The model may emit fileExtensions as a bare string instead of an array.
|
|
124
|
+
const result = await handler(
|
|
125
|
+
JSON.stringify({ query: 'deleteSession', useRegExp: false, fileExtensions: 'spec.ts' }),
|
|
126
|
+
mockCtx
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const jsonResponse = JSON.parse(result as string);
|
|
130
|
+
expect(jsonResponse.error).to.equal(undefined);
|
|
131
|
+
expect(capturedOptions?.include).to.deep.equal(['**/*.spec.ts']);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it('should time out instead of hanging when the search never reports completion', async () => {
|
|
135
|
+
// Reproduces the original hang: the backend returns a search id but onDone is never called,
|
|
136
|
+
// and previously the search could also never report an id at all.
|
|
137
|
+
container.rebind(SearchInWorkspaceService).toConstantValue({
|
|
138
|
+
searchWithCallback: () => new Promise<number>(() => { /* never resolves: no id, no onDone */ }),
|
|
139
|
+
cancel: () => { }
|
|
140
|
+
} as unknown as SearchInWorkspaceService);
|
|
141
|
+
|
|
142
|
+
const searchProvider = container.get(WorkspaceSearchProvider);
|
|
143
|
+
const handler = searchProvider.getTool().handler;
|
|
144
|
+
|
|
145
|
+
const clock = sinon.useFakeTimers();
|
|
146
|
+
try {
|
|
147
|
+
const resultPromise = handler(
|
|
148
|
+
JSON.stringify({ query: 'deleteSession', useRegExp: false }),
|
|
149
|
+
mockCtx
|
|
150
|
+
);
|
|
151
|
+
await clock.tickAsync(30000);
|
|
152
|
+
const jsonResponse = JSON.parse(await resultPromise as string);
|
|
153
|
+
expect(jsonResponse.error).to.equal('Search timed out after 30 seconds');
|
|
154
|
+
} finally {
|
|
155
|
+
clock.restore();
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('should return an error (not hang) when search setup fails', async () => {
|
|
160
|
+
// An empty workspace makes determineSearchRoots throw; the error must surface as a result.
|
|
161
|
+
container.rebind(WorkspaceFunctionScope).toConstantValue({
|
|
162
|
+
getRootMapping: () => new Map()
|
|
163
|
+
} as unknown as WorkspaceFunctionScope);
|
|
164
|
+
|
|
165
|
+
const searchProvider = container.get(WorkspaceSearchProvider);
|
|
166
|
+
const handler = searchProvider.getTool().handler;
|
|
167
|
+
const result = await handler(
|
|
168
|
+
JSON.stringify({ query: 'deleteSession', useRegExp: false }),
|
|
169
|
+
mockCtx
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
const jsonResponse = JSON.parse(result as string);
|
|
173
|
+
expect(jsonResponse.error).to.equal('No workspace has been opened yet');
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('should accept an array fileExtensions argument', async () => {
|
|
177
|
+
let capturedOptions: SearchInWorkspaceOptions | undefined;
|
|
178
|
+
container.rebind(SearchInWorkspaceService).toConstantValue({
|
|
179
|
+
searchWithCallback: async (
|
|
180
|
+
query: string,
|
|
181
|
+
rootUris: string[],
|
|
182
|
+
callbacks: SearchInWorkspaceCallbacks,
|
|
183
|
+
options: SearchInWorkspaceOptions
|
|
184
|
+
) => {
|
|
185
|
+
capturedOptions = options;
|
|
186
|
+
callbacks.onDone?.(1);
|
|
187
|
+
return 1;
|
|
188
|
+
},
|
|
189
|
+
cancel: () => { }
|
|
190
|
+
} as unknown as SearchInWorkspaceService);
|
|
191
|
+
|
|
192
|
+
const searchProvider = container.get(WorkspaceSearchProvider);
|
|
193
|
+
const handler = searchProvider.getTool().handler;
|
|
194
|
+
const result = await handler(
|
|
195
|
+
JSON.stringify({ query: 'deleteSession', useRegExp: false, fileExtensions: ['ts', 'js'] }),
|
|
196
|
+
mockCtx
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const jsonResponse = JSON.parse(result as string);
|
|
200
|
+
expect(jsonResponse.error).to.equal(undefined);
|
|
201
|
+
expect(capturedOptions?.include).to.deep.equal(['**/*.ts', '**/*.js']);
|
|
202
|
+
});
|
|
203
|
+
|
|
103
204
|
});
|
|
@@ -117,7 +117,12 @@ export class WorkspaceSearchProvider implements ToolProvider {
|
|
|
117
117
|
|
|
118
118
|
private async handleSearch(argString: string, cancellationToken?: CancellationToken): Promise<string> {
|
|
119
119
|
try {
|
|
120
|
-
const args: { query: string, useRegExp: boolean, fileExtensions?: string[], subDirectoryPath?: string } = JSON.parse(argString);
|
|
120
|
+
const args: { query: string, useRegExp: boolean, fileExtensions?: string[] | string, subDirectoryPath?: string } = JSON.parse(argString);
|
|
121
|
+
|
|
122
|
+
if (cancellationToken?.isCancellationRequested) {
|
|
123
|
+
return JSON.stringify({ error: 'Operation cancelled by user' });
|
|
124
|
+
}
|
|
125
|
+
|
|
121
126
|
const results: SearchInWorkspaceResult[] = [];
|
|
122
127
|
let expectedSearchId: number | undefined;
|
|
123
128
|
let searchCompleted = false;
|
|
@@ -128,11 +133,28 @@ export class WorkspaceSearchProvider implements ToolProvider {
|
|
|
128
133
|
searchCompleted = true;
|
|
129
134
|
}
|
|
130
135
|
});
|
|
131
|
-
|
|
132
|
-
|
|
136
|
+
|
|
137
|
+
// Use one more than our actual maximum. this way we can determine if we have more results than our maximum and warn the user
|
|
138
|
+
const maxResultsForTheiaAPI = this.preferenceService.get<number>(SEARCH_IN_WORKSPACE_MAX_RESULTS_PREF, 30) + 1;
|
|
139
|
+
const options: SearchInWorkspaceOptions = {
|
|
140
|
+
useRegExp: args.useRegExp,
|
|
141
|
+
matchCase: false,
|
|
142
|
+
matchWholeWord: false,
|
|
143
|
+
maxResults: maxResultsForTheiaAPI,
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// The model may supply fileExtensions as a single string instead of an array; normalize to an array so that `.map` never throws.
|
|
147
|
+
const fileExtensions = args.fileExtensions === undefined ? undefined
|
|
148
|
+
: Array.isArray(args.fileExtensions) ? args.fileExtensions
|
|
149
|
+
: [args.fileExtensions];
|
|
150
|
+
if (fileExtensions && fileExtensions.length > 0) {
|
|
151
|
+
options.include = fileExtensions.map(ext => `**/*.${ext}`);
|
|
133
152
|
}
|
|
134
153
|
|
|
135
|
-
|
|
154
|
+
// Resolve the search roots before starting the search so that any error is reported through the outer try/catch.
|
|
155
|
+
const rootUris = await this.determineSearchRoots(args.subDirectoryPath);
|
|
156
|
+
|
|
157
|
+
const searchPromise = new Promise<SearchInWorkspaceResult[]>((resolve, reject) => {
|
|
136
158
|
const callbacks: SearchInWorkspaceCallbacks = {
|
|
137
159
|
onResult: (id, result) => {
|
|
138
160
|
if (expectedSearchId !== undefined && id !== expectedSearchId) {
|
|
@@ -163,26 +185,13 @@ export class WorkspaceSearchProvider implements ToolProvider {
|
|
|
163
185
|
}
|
|
164
186
|
};
|
|
165
187
|
|
|
166
|
-
|
|
167
|
-
const maxResultsForTheiaAPI = this.preferenceService.get<number>(SEARCH_IN_WORKSPACE_MAX_RESULTS_PREF, 30) + 1;
|
|
168
|
-
const options: SearchInWorkspaceOptions = {
|
|
169
|
-
useRegExp: args.useRegExp,
|
|
170
|
-
matchCase: false,
|
|
171
|
-
matchWholeWord: false,
|
|
172
|
-
maxResults: maxResultsForTheiaAPI,
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
if (args.fileExtensions && args.fileExtensions.length > 0) {
|
|
176
|
-
options.include = args.fileExtensions.map(ext => `**/*.${ext}`);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
await this.determineSearchRoots(args.subDirectoryPath)
|
|
180
|
-
.then(rootUris => this.searchService.searchWithCallback(args.query, rootUris, callbacks, options))
|
|
188
|
+
this.searchService.searchWithCallback(args.query, rootUris, callbacks, options)
|
|
181
189
|
.then(id => {
|
|
182
190
|
expectedSearchId = id;
|
|
183
|
-
|
|
191
|
+
// Handle cancellation that was requested before the search id became available.
|
|
192
|
+
if (cancellationToken?.isCancellationRequested && !searchCompleted) {
|
|
184
193
|
this.searchService.cancel(id);
|
|
185
|
-
}
|
|
194
|
+
}
|
|
186
195
|
})
|
|
187
196
|
.catch(err => {
|
|
188
197
|
searchCompleted = true;
|
|
@@ -192,8 +201,10 @@ export class WorkspaceSearchProvider implements ToolProvider {
|
|
|
192
201
|
|
|
193
202
|
const timeoutPromise = new Promise<SearchInWorkspaceResult[]>((_, reject) => {
|
|
194
203
|
setTimeout(() => {
|
|
195
|
-
if (
|
|
196
|
-
|
|
204
|
+
if (!searchCompleted) {
|
|
205
|
+
if (expectedSearchId !== undefined) {
|
|
206
|
+
this.searchService.cancel(expectedSearchId);
|
|
207
|
+
}
|
|
197
208
|
searchCompleted = true;
|
|
198
209
|
reject(new Error('Search timed out after 30 seconds'));
|
|
199
210
|
}
|