@vybestack/llxprt-code-core 0.1.20 → 0.1.22
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/README.md +31 -0
- package/dist/src/auth/types.d.ts +4 -4
- package/dist/src/code_assist/codeAssist.d.ts +1 -1
- package/dist/src/code_assist/codeAssist.js +5 -2
- package/dist/src/code_assist/codeAssist.js.map +1 -1
- package/dist/src/code_assist/converter.d.ts +2 -1
- package/dist/src/code_assist/converter.js +6 -4
- package/dist/src/code_assist/converter.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +1 -0
- package/dist/src/code_assist/oauth2.js +32 -15
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +1 -2
- package/dist/src/code_assist/server.js +10 -5
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.js +2 -1
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/config/config.d.ts +0 -3
- package/dist/src/config/config.js +8 -10
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/core/client.js +11 -2
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +1 -1
- package/dist/src/core/coreToolScheduler.js +9 -5
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/geminiChat.js +45 -4
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/logger.d.ts +22 -1
- package/dist/src/core/logger.js +103 -17
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/ide/constants.d.ts +6 -0
- package/dist/src/ide/constants.js +7 -0
- package/dist/src/ide/constants.js.map +1 -0
- package/dist/src/ide/ide-client.d.ts +10 -10
- package/dist/src/ide/ide-client.js +69 -58
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-installer.js +5 -4
- package/dist/src/ide/ide-installer.js.map +1 -1
- package/dist/src/ide/process-utils.d.ts +14 -0
- package/dist/src/ide/process-utils.js +57 -0
- package/dist/src/ide/process-utils.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.js +176 -58
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +3 -1
- package/dist/src/mcp/oauth-utils.js +52 -22
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/providers/anthropic/AnthropicProvider.js +164 -115
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.js +6 -3
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.js +227 -53
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +24 -0
- package/dist/src/services/shellExecutionService.js +43 -52
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +2 -2
- package/dist/src/telemetry/index.js +2 -2
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +14 -0
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +8 -1
- package/dist/src/telemetry/types.js +12 -0
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/tools.d.ts +21 -6
- package/dist/src/test-utils/tools.js +77 -12
- package/dist/src/test-utils/tools.js.map +1 -1
- package/dist/src/tools/edit.d.ts +1 -1
- package/dist/src/tools/edit.js +45 -19
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/mcp-client.js +46 -31
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +19 -0
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/shell.js +25 -8
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +1 -0
- package/dist/src/tools/tool-error.js +1 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tools.d.ts +53 -75
- package/dist/src/tools/tools.js +111 -110
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-search-invocation.d.ts +51 -0
- package/dist/src/tools/web-search-invocation.js +132 -0
- package/dist/src/tools/web-search-invocation.js.map +1 -0
- package/dist/src/tools/web-search.d.ts +6 -36
- package/dist/src/tools/web-search.js +6 -129
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +17 -10
- package/dist/src/tools/write-file.js +125 -127
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/utils/filesearch/crawler.d.ts +15 -0
- package/dist/src/utils/filesearch/crawler.js +50 -0
- package/dist/src/utils/filesearch/crawler.js.map +1 -0
- package/dist/src/utils/filesearch/fileSearch.d.ts +9 -53
- package/dist/src/utils/filesearch/fileSearch.js +62 -117
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.d.ts +7 -0
- package/dist/src/utils/filesearch/ignore.js +25 -0
- package/dist/src/utils/filesearch/ignore.js.map +1 -1
- package/dist/src/utils/memoryImportProcessor.js +2 -6
- package/dist/src/utils/memoryImportProcessor.js.map +1 -1
- package/dist/src/utils/paths.d.ts +7 -0
- package/dist/src/utils/paths.js +15 -0
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +39 -0
- package/dist/src/utils/shell-utils.js +72 -2
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/workspaceContext.d.ts +22 -7
- package/dist/src/utils/workspaceContext.js +81 -55
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BaseToolInvocation } from './tools.js';
|
|
7
|
+
import { getErrorMessage } from '../utils/errors.js';
|
|
8
|
+
import { getResponseText } from '../utils/generateContentResponseUtilities.js';
|
|
9
|
+
/**
|
|
10
|
+
* Tool invocation for performing web searches using Google Search via the Gemini API.
|
|
11
|
+
*/
|
|
12
|
+
export class WebSearchToolInvocation extends BaseToolInvocation {
|
|
13
|
+
config;
|
|
14
|
+
constructor(config, params) {
|
|
15
|
+
super(params);
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
getDescription() {
|
|
19
|
+
return `Searching the web for: "${this.params.query}"`;
|
|
20
|
+
}
|
|
21
|
+
async execute(signal) {
|
|
22
|
+
// Additional safety check - ensure query exists and is not just "undefined" string
|
|
23
|
+
if (!this.params.query ||
|
|
24
|
+
this.params.query.trim() === '' ||
|
|
25
|
+
this.params.query === 'undefined') {
|
|
26
|
+
return {
|
|
27
|
+
llmContent: `Error: Web search requires a valid search query. Please provide a specific search query.`,
|
|
28
|
+
returnDisplay: `Error: No valid search query provided.`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
// Get the content generator config to access the provider manager
|
|
33
|
+
const contentGenConfig = this.config.getContentGeneratorConfig();
|
|
34
|
+
// Get the serverToolsProvider from the provider manager
|
|
35
|
+
if (!contentGenConfig?.providerManager) {
|
|
36
|
+
return {
|
|
37
|
+
llmContent: `Web search requires a provider. Please use --provider gemini with authentication.`,
|
|
38
|
+
returnDisplay: 'Web search requires a provider.',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// Use serverToolsProvider for web search
|
|
42
|
+
const serverToolsProvider = contentGenConfig.providerManager.getServerToolsProvider();
|
|
43
|
+
if (!serverToolsProvider) {
|
|
44
|
+
return {
|
|
45
|
+
llmContent: `Web search requires Gemini provider to be configured. Please ensure Gemini is available with authentication.`,
|
|
46
|
+
returnDisplay: 'Web search requires Gemini provider.',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Check if the provider supports web_search
|
|
50
|
+
const serverTools = serverToolsProvider.getServerTools();
|
|
51
|
+
if (!serverTools.includes('web_search')) {
|
|
52
|
+
return {
|
|
53
|
+
llmContent: `Web search is not available. The server tools provider does not support web search.`,
|
|
54
|
+
returnDisplay: `Web search not available.`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
// Invoke the server tool with validated query
|
|
58
|
+
// Double-check query is not undefined before sending
|
|
59
|
+
const searchQuery = this.params.query?.trim() || '';
|
|
60
|
+
if (!searchQuery) {
|
|
61
|
+
return {
|
|
62
|
+
llmContent: `Error: Cannot perform web search without a query.`,
|
|
63
|
+
returnDisplay: `Error: Empty search query.`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const response = await serverToolsProvider.invokeServerTool('web_search', { query: searchQuery }, { signal });
|
|
67
|
+
// Cast response to the expected type
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
69
|
+
const geminiResponse = response;
|
|
70
|
+
const responseText = getResponseText(geminiResponse);
|
|
71
|
+
const groundingMetadata = geminiResponse?.candidates?.[0]?.groundingMetadata;
|
|
72
|
+
const sources = groundingMetadata?.groundingChunks;
|
|
73
|
+
const groundingSupports = groundingMetadata?.groundingSupports;
|
|
74
|
+
if (!responseText || !responseText.trim()) {
|
|
75
|
+
return {
|
|
76
|
+
llmContent: `No search results or information found for query: "${this.params.query}"`,
|
|
77
|
+
returnDisplay: 'No information found.',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
let modifiedResponseText = responseText;
|
|
81
|
+
const sourceListFormatted = [];
|
|
82
|
+
if (sources && sources.length > 0) {
|
|
83
|
+
sources.forEach((source, index) => {
|
|
84
|
+
const title = source.web?.title || 'Untitled';
|
|
85
|
+
const uri = source.web?.uri || 'No URI';
|
|
86
|
+
sourceListFormatted.push(`[${index + 1}] ${title} (${uri})`);
|
|
87
|
+
});
|
|
88
|
+
if (groundingSupports && groundingSupports.length > 0) {
|
|
89
|
+
const insertions = [];
|
|
90
|
+
groundingSupports.forEach((support) => {
|
|
91
|
+
if (support.segment && support.groundingChunkIndices) {
|
|
92
|
+
const citationMarker = support.groundingChunkIndices
|
|
93
|
+
.map((chunkIndex) => `[${chunkIndex + 1}]`)
|
|
94
|
+
.join('');
|
|
95
|
+
insertions.push({
|
|
96
|
+
index: support.segment.endIndex,
|
|
97
|
+
marker: citationMarker,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
// Sort insertions by index in descending order to avoid shifting subsequent indices
|
|
102
|
+
insertions.sort((a, b) => b.index - a.index);
|
|
103
|
+
const responseChars = modifiedResponseText.split(''); // Use new variable
|
|
104
|
+
insertions.forEach((insertion) => {
|
|
105
|
+
// Fixed arrow function syntax
|
|
106
|
+
responseChars.splice(insertion.index, 0, insertion.marker);
|
|
107
|
+
});
|
|
108
|
+
modifiedResponseText = responseChars.join(''); // Assign back to modifiedResponseText
|
|
109
|
+
}
|
|
110
|
+
if (sourceListFormatted.length > 0) {
|
|
111
|
+
modifiedResponseText +=
|
|
112
|
+
'\n\nSources:\n' + sourceListFormatted.join('\n'); // Fixed string concatenation
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
llmContent: `Web search results for "${this.params.query}":\n\n${modifiedResponseText}`,
|
|
117
|
+
returnDisplay: `Search results for "${this.params.query}" returned.`,
|
|
118
|
+
sources,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const queryDisplay = this.params.query || 'undefined';
|
|
123
|
+
const errorMessage = `Error during web search for query "${queryDisplay}": ${getErrorMessage(error)}`;
|
|
124
|
+
console.error(errorMessage, error);
|
|
125
|
+
return {
|
|
126
|
+
llmContent: `Error: ${errorMessage}`,
|
|
127
|
+
returnDisplay: `Error performing web search.`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=web-search-invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search-invocation.js","sourceRoot":"","sources":["../../../src/tools/web-search-invocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,47 +3,17 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import { BaseTool, ToolResult } from './tools.js';
|
|
6
|
+
import { BaseDeclarativeTool, ToolInvocation } from './tools.js';
|
|
8
7
|
import { Config } from '../config/config.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
title?: string;
|
|
12
|
-
}
|
|
13
|
-
interface GroundingChunkItem {
|
|
14
|
-
web?: GroundingChunkWeb;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Parameters for the WebSearchTool.
|
|
18
|
-
*/
|
|
19
|
-
export interface WebSearchToolParams {
|
|
20
|
-
/**
|
|
21
|
-
* The search query.
|
|
22
|
-
*/
|
|
23
|
-
query: string;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Extends ToolResult to include sources for web search.
|
|
27
|
-
*/
|
|
28
|
-
export interface WebSearchToolResult extends ToolResult {
|
|
29
|
-
sources?: GroundingMetadata extends {
|
|
30
|
-
groundingChunks: GroundingChunkItem[];
|
|
31
|
-
} ? GroundingMetadata['groundingChunks'] : GroundingChunkItem[];
|
|
32
|
-
}
|
|
8
|
+
import { WebSearchToolParams, WebSearchToolResult } from './web-search-invocation.js';
|
|
9
|
+
export { WebSearchToolParams, WebSearchToolResult, } from './web-search-invocation.js';
|
|
33
10
|
/**
|
|
34
11
|
* A tool to perform web searches using Google Search via the Gemini API.
|
|
35
12
|
*/
|
|
36
|
-
export declare class WebSearchTool extends
|
|
13
|
+
export declare class WebSearchTool extends BaseDeclarativeTool<WebSearchToolParams, WebSearchToolResult> {
|
|
37
14
|
private readonly config;
|
|
38
15
|
static readonly Name: string;
|
|
39
16
|
constructor(config: Config);
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
* @param params The parameters to validate
|
|
43
|
-
* @returns An error message string if validation fails, null if valid
|
|
44
|
-
*/
|
|
45
|
-
validateParams(params: WebSearchToolParams): string | null;
|
|
46
|
-
getDescription(params: WebSearchToolParams): string;
|
|
47
|
-
execute(params: WebSearchToolParams, signal: AbortSignal): Promise<WebSearchToolResult>;
|
|
17
|
+
protected validateToolParams(params: WebSearchToolParams): string | null;
|
|
18
|
+
protected createInvocation(params: WebSearchToolParams): ToolInvocation<WebSearchToolParams, WebSearchToolResult>;
|
|
48
19
|
}
|
|
49
|
-
export {};
|
|
@@ -3,14 +3,13 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { BaseDeclarativeTool, Kind } from './tools.js';
|
|
7
7
|
import { SchemaValidator } from '../utils/schemaValidator.js';
|
|
8
|
-
import {
|
|
9
|
-
import { getResponseText } from '../utils/generateContentResponseUtilities.js';
|
|
8
|
+
import { WebSearchToolInvocation, } from './web-search-invocation.js';
|
|
10
9
|
/**
|
|
11
10
|
* A tool to perform web searches using Google Search via the Gemini API.
|
|
12
11
|
*/
|
|
13
|
-
export class WebSearchTool extends
|
|
12
|
+
export class WebSearchTool extends BaseDeclarativeTool {
|
|
14
13
|
config;
|
|
15
14
|
static Name = 'google_web_search';
|
|
16
15
|
constructor(config) {
|
|
@@ -26,12 +25,7 @@ export class WebSearchTool extends BaseTool {
|
|
|
26
25
|
});
|
|
27
26
|
this.config = config;
|
|
28
27
|
}
|
|
29
|
-
|
|
30
|
-
* Validates the parameters for the WebSearchTool.
|
|
31
|
-
* @param params The parameters to validate
|
|
32
|
-
* @returns An error message string if validation fails, null if valid
|
|
33
|
-
*/
|
|
34
|
-
validateParams(params) {
|
|
28
|
+
validateToolParams(params) {
|
|
35
29
|
const errors = SchemaValidator.validate(this.schema.parametersJsonSchema, params);
|
|
36
30
|
if (errors) {
|
|
37
31
|
return errors;
|
|
@@ -41,125 +35,8 @@ export class WebSearchTool extends BaseTool {
|
|
|
41
35
|
}
|
|
42
36
|
return null;
|
|
43
37
|
}
|
|
44
|
-
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
async execute(params, signal) {
|
|
48
|
-
const validationError = this.validateToolParams(params);
|
|
49
|
-
if (validationError) {
|
|
50
|
-
return {
|
|
51
|
-
llmContent: `Error: Invalid parameters provided. Reason: ${validationError}`,
|
|
52
|
-
returnDisplay: validationError,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
// Additional safety check - ensure query exists and is not just "undefined" string
|
|
56
|
-
if (!params.query ||
|
|
57
|
-
params.query.trim() === '' ||
|
|
58
|
-
params.query === 'undefined') {
|
|
59
|
-
return {
|
|
60
|
-
llmContent: `Error: Web search requires a valid search query. Please provide a specific search query.`,
|
|
61
|
-
returnDisplay: `Error: No valid search query provided.`,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
// Get the content generator config to access the provider manager
|
|
66
|
-
const contentGenConfig = this.config.getContentGeneratorConfig();
|
|
67
|
-
// Get the serverToolsProvider from the provider manager
|
|
68
|
-
if (!contentGenConfig?.providerManager) {
|
|
69
|
-
return {
|
|
70
|
-
llmContent: `Web search requires a provider. Please use --provider gemini with authentication.`,
|
|
71
|
-
returnDisplay: 'Web search requires a provider.',
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
// Use serverToolsProvider for web search
|
|
75
|
-
const serverToolsProvider = contentGenConfig.providerManager.getServerToolsProvider();
|
|
76
|
-
if (!serverToolsProvider) {
|
|
77
|
-
return {
|
|
78
|
-
llmContent: `Web search requires Gemini provider to be configured. Please ensure Gemini is available with authentication.`,
|
|
79
|
-
returnDisplay: 'Web search requires Gemini provider.',
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
// Check if the provider supports web_search
|
|
83
|
-
const serverTools = serverToolsProvider.getServerTools();
|
|
84
|
-
if (!serverTools.includes('web_search')) {
|
|
85
|
-
return {
|
|
86
|
-
llmContent: `Web search is not available. The server tools provider does not support web search.`,
|
|
87
|
-
returnDisplay: `Web search not available.`,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
// Invoke the server tool with validated query
|
|
91
|
-
// Double-check query is not undefined before sending
|
|
92
|
-
const searchQuery = params.query?.trim() || '';
|
|
93
|
-
if (!searchQuery) {
|
|
94
|
-
return {
|
|
95
|
-
llmContent: `Error: Cannot perform web search without a query.`,
|
|
96
|
-
returnDisplay: `Error: Empty search query.`,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
const response = await serverToolsProvider.invokeServerTool('web_search', { query: searchQuery }, { signal });
|
|
100
|
-
// Cast response to the expected type
|
|
101
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
102
|
-
const geminiResponse = response;
|
|
103
|
-
const responseText = getResponseText(geminiResponse);
|
|
104
|
-
const groundingMetadata = geminiResponse?.candidates?.[0]?.groundingMetadata;
|
|
105
|
-
const sources = groundingMetadata?.groundingChunks;
|
|
106
|
-
const groundingSupports = groundingMetadata?.groundingSupports;
|
|
107
|
-
if (!responseText || !responseText.trim()) {
|
|
108
|
-
return {
|
|
109
|
-
llmContent: `No search results or information found for query: "${params.query}"`,
|
|
110
|
-
returnDisplay: 'No information found.',
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
let modifiedResponseText = responseText;
|
|
114
|
-
const sourceListFormatted = [];
|
|
115
|
-
if (sources && sources.length > 0) {
|
|
116
|
-
sources.forEach((source, index) => {
|
|
117
|
-
const title = source.web?.title || 'Untitled';
|
|
118
|
-
const uri = source.web?.uri || 'No URI';
|
|
119
|
-
sourceListFormatted.push(`[${index + 1}] ${title} (${uri})`);
|
|
120
|
-
});
|
|
121
|
-
if (groundingSupports && groundingSupports.length > 0) {
|
|
122
|
-
const insertions = [];
|
|
123
|
-
groundingSupports.forEach((support) => {
|
|
124
|
-
if (support.segment && support.groundingChunkIndices) {
|
|
125
|
-
const citationMarker = support.groundingChunkIndices
|
|
126
|
-
.map((chunkIndex) => `[${chunkIndex + 1}]`)
|
|
127
|
-
.join('');
|
|
128
|
-
insertions.push({
|
|
129
|
-
index: support.segment.endIndex,
|
|
130
|
-
marker: citationMarker,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
// Sort insertions by index in descending order to avoid shifting subsequent indices
|
|
135
|
-
insertions.sort((a, b) => b.index - a.index);
|
|
136
|
-
const responseChars = modifiedResponseText.split(''); // Use new variable
|
|
137
|
-
insertions.forEach((insertion) => {
|
|
138
|
-
// Fixed arrow function syntax
|
|
139
|
-
responseChars.splice(insertion.index, 0, insertion.marker);
|
|
140
|
-
});
|
|
141
|
-
modifiedResponseText = responseChars.join(''); // Assign back to modifiedResponseText
|
|
142
|
-
}
|
|
143
|
-
if (sourceListFormatted.length > 0) {
|
|
144
|
-
modifiedResponseText +=
|
|
145
|
-
'\n\nSources:\n' + sourceListFormatted.join('\n'); // Fixed string concatenation
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
149
|
-
llmContent: `Web search results for "${params.query}":\n\n${modifiedResponseText}`,
|
|
150
|
-
returnDisplay: `Search results for "${params.query}" returned.`,
|
|
151
|
-
sources,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
catch (error) {
|
|
155
|
-
const queryDisplay = params.query || 'undefined';
|
|
156
|
-
const errorMessage = `Error during web search for query "${queryDisplay}": ${getErrorMessage(error)}`;
|
|
157
|
-
console.error(errorMessage, error);
|
|
158
|
-
return {
|
|
159
|
-
llmContent: `Error: ${errorMessage}`,
|
|
160
|
-
returnDisplay: `Error performing web search.`,
|
|
161
|
-
};
|
|
162
|
-
}
|
|
38
|
+
createInvocation(params) {
|
|
39
|
+
return new WebSearchToolInvocation(this.config, params);
|
|
163
40
|
}
|
|
164
41
|
}
|
|
165
42
|
//# sourceMappingURL=web-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"web-search.js","sourceRoot":"","sources":["../../../src/tools/web-search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAkB,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EACL,uBAAuB,GAGxB,MAAM,4BAA4B,CAAC;AAQpC;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,mBAGlC;IAG8B;IAF7B,MAAM,CAAU,IAAI,GAAW,mBAAmB,CAAC;IAEnD,YAA6B,MAAc;QACzC,KAAK,CACH,aAAa,CAAC,IAAI,EAClB,cAAc,EACd,uKAAuK,EACvK,IAAI,CAAC,MAAM,EACX;YACE,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kDAAkD;iBAChE;aACF;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB,CACF,CAAC;QAhByB,WAAM,GAAN,MAAM,CAAQ;IAiB3C,CAAC;IAEkB,kBAAkB,CACnC,MAA2B;QAE3B,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CACrC,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAChC,MAAM,CACP,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAChD,OAAO,wCAAwC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAES,gBAAgB,CACxB,MAA2B;QAE3B,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { Config } from '../config/config.js';
|
|
7
|
-
import {
|
|
7
|
+
import { BaseDeclarativeTool, ToolResult, ToolInvocation } from './tools.js';
|
|
8
8
|
import { ModifiableDeclarativeTool, ModifyContext } from './modifiable-tool.js';
|
|
9
9
|
/**
|
|
10
10
|
* Parameters for the WriteFile tool
|
|
@@ -27,21 +27,28 @@ export interface WriteFileToolParams {
|
|
|
27
27
|
*/
|
|
28
28
|
ai_proposed_content?: string;
|
|
29
29
|
}
|
|
30
|
+
interface GetCorrectedFileContentResult {
|
|
31
|
+
originalContent: string;
|
|
32
|
+
correctedContent: string;
|
|
33
|
+
fileExists: boolean;
|
|
34
|
+
error?: {
|
|
35
|
+
message: string;
|
|
36
|
+
code?: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Gets corrected file content using AI correction services
|
|
41
|
+
*/
|
|
42
|
+
export declare function getCorrectedFileContent(filePath: string, proposedContent: string, config: Config, abortSignal: AbortSignal): Promise<GetCorrectedFileContentResult>;
|
|
30
43
|
/**
|
|
31
44
|
* Implementation of the WriteFile tool logic
|
|
32
45
|
*/
|
|
33
|
-
export declare class WriteFileTool extends
|
|
46
|
+
export declare class WriteFileTool extends BaseDeclarativeTool<WriteFileToolParams, ToolResult> implements ModifiableDeclarativeTool<WriteFileToolParams> {
|
|
34
47
|
private readonly config;
|
|
35
48
|
static readonly Name: string;
|
|
36
49
|
constructor(config: Config);
|
|
37
|
-
toolLocations(params: WriteFileToolParams): ToolLocation[];
|
|
38
50
|
validateToolParams(params: WriteFileToolParams): string | null;
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Handles the confirmation prompt for the WriteFile tool.
|
|
42
|
-
*/
|
|
43
|
-
shouldConfirmExecute(params: WriteFileToolParams, abortSignal: AbortSignal): Promise<ToolCallConfirmationDetails | false>;
|
|
44
|
-
execute(params: WriteFileToolParams, abortSignal: AbortSignal): Promise<ToolResult>;
|
|
45
|
-
private _getCorrectedFileContent;
|
|
51
|
+
protected createInvocation(params: WriteFileToolParams): ToolInvocation<WriteFileToolParams, ToolResult>;
|
|
46
52
|
getModifyContext(abortSignal: AbortSignal): ModifyContext<WriteFileToolParams>;
|
|
47
53
|
}
|
|
54
|
+
export {};
|