@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.
@@ -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;CA6G7B"}
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 (cancellationToken?.isCancellationRequested) {
111
- return JSON.stringify({ error: 'Operation cancelled by user' });
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
- const searchPromise = new Promise(async (resolve, reject) => {
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
- // Use one more than our actual maximum. this way we can determine if we have more results than our maximum and warn the user
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
- cancellationToken?.onCancellationRequested(() => {
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 (expectedSearchId !== undefined && !searchCompleted) {
167
- this.searchService.cancel(expectedSearchId);
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.15+28d45f428",
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.15+28d45f428",
19
- "@theia/ai-chat-ui": "1.74.0-next.15+28d45f428",
20
- "@theia/ai-core": "1.74.0-next.15+28d45f428",
21
- "@theia/ai-mcp": "1.74.0-next.15+28d45f428",
22
- "@theia/ai-terminal": "1.74.0-next.15+28d45f428",
23
- "@theia/core": "1.74.0-next.15+28d45f428",
24
- "@theia/debug": "1.74.0-next.15+28d45f428",
25
- "@theia/editor": "1.74.0-next.15+28d45f428",
26
- "@theia/file-search": "1.74.0-next.15+28d45f428",
27
- "@theia/filesystem": "1.74.0-next.15+28d45f428",
28
- "@theia/markers": "1.74.0-next.15+28d45f428",
29
- "@theia/monaco": "1.74.0-next.15+28d45f428",
30
- "@theia/navigator": "1.74.0-next.15+28d45f428",
31
- "@theia/preferences": "1.74.0-next.15+28d45f428",
32
- "@theia/scm": "1.74.0-next.15+28d45f428",
33
- "@theia/search-in-workspace": "1.74.0-next.15+28d45f428",
34
- "@theia/task": "1.74.0-next.15+28d45f428",
35
- "@theia/terminal": "1.74.0-next.15+28d45f428",
36
- "@theia/workspace": "1.74.0-next.15+28d45f428",
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.15+28d45f428",
49
- "@theia/test": "1.74.0-next.15+28d45f428"
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": "28d45f4284702e106aa784d69bc3d3418243a05a"
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
- if (cancellationToken?.isCancellationRequested) {
132
- return JSON.stringify({ error: 'Operation cancelled by user' });
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
- const searchPromise = new Promise<SearchInWorkspaceResult[]>(async (resolve, reject) => {
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
- // Use one more than our actual maximum. this way we can determine if we have more results than our maximum and warn the user
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
- cancellationToken?.onCancellationRequested(() => {
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 (expectedSearchId !== undefined && !searchCompleted) {
196
- this.searchService.cancel(expectedSearchId);
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
  }