@vybestack/llxprt-code-core 0.1.13 → 0.1.14
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 +24 -0
- package/dist/src/code_assist/codeAssist.d.ts +2 -1
- package/dist/src/code_assist/codeAssist.js +4 -3
- package/dist/src/code_assist/codeAssist.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +9 -2
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +94 -2
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +5 -6
- package/dist/src/code_assist/server.js +7 -70
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +6 -1
- package/dist/src/code_assist/setup.js +4 -1
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +4 -1
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/code_assist/types.d.ts +2 -2
- package/dist/src/config/config.d.ts +25 -3
- package/dist/src/config/config.js +47 -10
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +1 -26
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +1 -1
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/core/client.d.ts +6 -2
- package/dist/src/core/client.js +41 -18
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +78 -24
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +1 -1
- package/dist/src/core/contentGenerator.js +1 -1
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.js +14 -1
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +80 -0
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +4 -3
- package/dist/src/core/geminiChat.js +8 -11
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiRequest.js +2 -37
- package/dist/src/core/geminiRequest.js.map +1 -1
- package/dist/src/core/logger.js +6 -0
- package/dist/src/core/logger.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.test.js +5 -5
- package/dist/src/core/prompts.js +42 -18
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +121 -4
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +7 -2
- package/dist/src/core/turn.js +9 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +129 -0
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/ide/ide-client.d.ts +28 -0
- package/dist/src/ide/ide-client.js +79 -0
- package/dist/src/ide/ide-client.js.map +1 -0
- package/dist/src/ide/ideContext.d.ts +174 -0
- package/dist/src/{services → ide}/ideContext.js +28 -25
- package/dist/src/ide/ideContext.js.map +1 -0
- package/dist/src/{services → ide}/ideContext.test.js +39 -39
- package/dist/src/ide/ideContext.test.js.map +1 -0
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.js +4 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.d.ts +23 -0
- package/dist/src/mcp/google-auth-provider.js +63 -0
- package/dist/src/mcp/google-auth-provider.js.map +1 -0
- package/dist/src/mcp/google-auth-provider.test.js +54 -0
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -0
- package/dist/src/providers/anthropic/AnthropicProvider.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.d.ts +2 -0
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js +36 -0
- package/dist/src/providers/gemini/GeminiProvider.integration.test.js.map +1 -1
- package/dist/src/providers/gemini/GeminiProvider.js +57 -10
- package/dist/src/providers/gemini/GeminiProvider.js.map +1 -1
- package/dist/src/providers/openai/OpenAIProvider.js +10 -7
- package/dist/src/providers/openai/OpenAIProvider.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.d.ts +4 -4
- package/dist/src/services/fileDiscoveryService.js +8 -8
- package/dist/src/services/gitService.js +1 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +1 -1
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.d.ts +48 -5
- package/dist/src/services/loopDetectionService.js +127 -41
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +50 -123
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +17 -2
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/constants.d.ts +16 -15
- package/dist/src/telemetry/constants.js +16 -15
- package/dist/src/telemetry/constants.js.map +1 -1
- package/dist/src/telemetry/file-exporters.d.ts +28 -0
- package/dist/src/telemetry/file-exporters.js +62 -0
- package/dist/src/telemetry/file-exporters.js.map +1 -0
- package/dist/src/telemetry/loggers.d.ts +2 -1
- package/dist/src/telemetry/loggers.js +18 -3
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/sdk.js +22 -7
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/types.d.ts +9 -2
- package/dist/src/telemetry/types.js +13 -1
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/tools/ToolFormatter.js +19 -1
- package/dist/src/tools/ToolFormatter.js.map +1 -1
- package/dist/src/tools/edit.js +10 -4
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +12 -0
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/grep.test.js +1 -1
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/ls.d.ts +5 -2
- package/dist/src/tools/ls.js +39 -10
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +5 -1
- package/dist/src/tools/mcp-client.js +416 -29
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +46 -6
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.js +1 -1
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +34 -0
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +1 -1
- package/dist/src/tools/read-file.test.js +98 -69
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.d.ts +5 -2
- package/dist/src/tools/read-many-files.js +61 -16
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +5 -2
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +15 -26
- package/dist/src/tools/shell.js +137 -358
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +73 -318
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +13 -1
- package/dist/src/tools/tool-registry.js +45 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +3 -3
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.d.ts +2 -0
- package/dist/src/utils/bfsFileSearch.js +4 -1
- package/dist/src/utils/bfsFileSearch.js.map +1 -1
- package/dist/src/utils/bfsFileSearch.test.js +108 -105
- package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
- package/dist/src/utils/editCorrector.js +4 -4
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +1 -1
- package/dist/src/utils/editor.js +16 -10
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +128 -28
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/errorReporting.d.ts +1 -1
- package/dist/src/utils/errorReporting.js +2 -2
- package/dist/src/utils/errorReporting.js.map +1 -1
- package/dist/src/utils/errorReporting.test.js +44 -38
- package/dist/src/utils/errorReporting.test.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +4 -4
- package/dist/src/utils/fileUtils.js +31 -15
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +37 -37
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/getFolderStructure.d.ts +3 -2
- package/dist/src/utils/getFolderStructure.js +27 -28
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/getFolderStructure.test.js +169 -185
- package/dist/src/utils/getFolderStructure.test.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +4 -7
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.test.js +71 -62
- package/dist/src/utils/gitIgnoreParser.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +2 -1
- package/dist/src/utils/memoryDiscovery.js +11 -5
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +160 -371
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/partUtils.d.ts +14 -0
- package/dist/src/utils/partUtils.js +65 -0
- package/dist/src/utils/partUtils.js.map +1 -0
- package/dist/src/utils/partUtils.test.d.ts +6 -0
- package/dist/src/utils/partUtils.test.js +130 -0
- package/dist/src/utils/partUtils.test.js.map +1 -0
- package/dist/src/utils/paths.d.ts +11 -0
- package/dist/src/utils/paths.js +17 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.js +1 -1
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/schemaValidator.js +5 -2
- package/dist/src/utils/schemaValidator.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +44 -0
- package/dist/src/utils/shell-utils.js +243 -0
- package/dist/src/utils/shell-utils.js.map +1 -0
- package/dist/src/utils/shell-utils.test.d.ts +6 -0
- package/dist/src/utils/shell-utils.test.js +450 -0
- package/dist/src/utils/shell-utils.test.js.map +1 -0
- package/dist/src/utils/summarizer.js +1 -30
- package/dist/src/utils/summarizer.js.map +1 -1
- package/dist/src/utils/systemEncoding.d.ts +40 -0
- package/dist/src/utils/systemEncoding.js +149 -0
- package/dist/src/utils/systemEncoding.js.map +1 -0
- package/dist/src/utils/systemEncoding.test.d.ts +6 -0
- package/dist/src/utils/systemEncoding.test.js +368 -0
- package/dist/src/utils/systemEncoding.test.js.map +1 -0
- package/dist/src/utils/user_account.test.js +1 -1
- package/dist/src/utils/user_account.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -1
- package/dist/src/core/geminiRequest.test.js +0 -72
- package/dist/src/core/geminiRequest.test.js.map +0 -1
- package/dist/src/services/ideContext.d.ts +0 -126
- package/dist/src/services/ideContext.js.map +0 -1
- package/dist/src/services/ideContext.test.js.map +0 -1
- /package/dist/src/{services → ide}/ideContext.test.d.ts +0 -0
- /package/dist/src/{core/geminiRequest.test.d.ts → mcp/google-auth-provider.test.d.ts} +0 -0
package/dist/src/tools/shell.js
CHANGED
|
@@ -7,166 +7,48 @@ import fs from 'fs';
|
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import os from 'os';
|
|
9
9
|
import crypto from 'crypto';
|
|
10
|
-
import { BaseTool,
|
|
10
|
+
import { BaseTool, Icon, } from './tools.js';
|
|
11
11
|
import { SchemaValidator } from '../utils/schemaValidator.js';
|
|
12
12
|
import { getErrorMessage } from '../utils/errors.js';
|
|
13
13
|
import { Type } from '@google/genai';
|
|
14
14
|
import stripAnsi from 'strip-ansi';
|
|
15
|
-
import {
|
|
15
|
+
import { getCommandRoots, isCommandAllowed, stripShellWrapper, } from '../utils/shell-utils.js';
|
|
16
16
|
import { summarizeToolOutput } from '../utils/summarizer.js';
|
|
17
|
-
const OUTPUT_UPDATE_INTERVAL_MS = 1000;
|
|
18
17
|
export class ShellTool extends BaseTool {
|
|
19
18
|
config;
|
|
20
|
-
static Name = '
|
|
21
|
-
whitelist = new Set();
|
|
19
|
+
static Name = 'shell_tool';
|
|
22
20
|
constructor(config) {
|
|
23
|
-
super(ShellTool.Name, '
|
|
24
|
-
|
|
25
|
-
The following information is returned:
|
|
26
|
-
|
|
27
|
-
Command: Executed command.
|
|
28
|
-
Directory: Directory (relative to project root) where command was executed, or \`(root)\`.
|
|
29
|
-
Stdout: Output on stdout stream. Can be \`(empty)\` or partial on error and for any unwaited background processes.
|
|
30
|
-
Stderr: Output on stderr stream. Can be \`(empty)\` or partial on error and for any unwaited background processes.
|
|
31
|
-
Error: Error or \`(none)\` if no error was reported for the subprocess.
|
|
32
|
-
Exit Code: Exit code or \`(none)\` if terminated by signal.
|
|
33
|
-
Signal: Signal number or \`(none)\` if no signal was received.
|
|
34
|
-
Background PIDs: List of background processes started or \`(none)\`.
|
|
35
|
-
Process Group PGID: Process group started or \`(none)\``, Icon.Terminal, {
|
|
36
|
-
type: Type.OBJECT,
|
|
21
|
+
super(ShellTool.Name, 'RunShellCommand', 'Execute a shell command within a secure sandboxed environment', Icon.Terminal, {
|
|
37
22
|
properties: {
|
|
38
23
|
command: {
|
|
24
|
+
description: 'The shell command to execute',
|
|
39
25
|
type: Type.STRING,
|
|
40
|
-
description: 'Exact bash command to execute as `bash -c <command>`',
|
|
41
26
|
},
|
|
42
27
|
description: {
|
|
28
|
+
description: 'Optional description of what this command does, used for confirmation prompts',
|
|
43
29
|
type: Type.STRING,
|
|
44
|
-
description: 'Brief description of the command for the user. Be specific and concise. Ideally a single sentence. Can be up to 3 sentences for clarity. No line breaks.',
|
|
45
|
-
},
|
|
46
|
-
directory: {
|
|
47
|
-
type: Type.STRING,
|
|
48
|
-
description: '(OPTIONAL) Directory to run the command in, if not the project root directory. Must be relative to the project root directory and must already exist.',
|
|
49
30
|
},
|
|
50
31
|
},
|
|
51
32
|
required: ['command'],
|
|
52
|
-
|
|
53
|
-
true);
|
|
33
|
+
type: Type.OBJECT,
|
|
34
|
+
}, true);
|
|
54
35
|
this.config = config;
|
|
55
36
|
}
|
|
56
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Gets a user-friendly description of the shell command to execute.
|
|
39
|
+
*
|
|
40
|
+
* @param params The shell tool parameters
|
|
41
|
+
* @returns A formatted description of the command
|
|
42
|
+
*/
|
|
43
|
+
formatCommand(params) {
|
|
57
44
|
let description = `${params.command}`;
|
|
58
|
-
// append optional [in directory]
|
|
59
|
-
// note description is needed even if validation fails due to absolute path
|
|
60
|
-
if (params.directory) {
|
|
61
|
-
description += ` [in ${params.directory}]`;
|
|
62
|
-
}
|
|
63
|
-
// append optional (description), replacing any line breaks with spaces
|
|
64
45
|
if (params.description) {
|
|
65
46
|
description += ` (${params.description.replace(/\n/g, ' ')})`;
|
|
66
47
|
}
|
|
67
48
|
return description;
|
|
68
49
|
}
|
|
69
|
-
/**
|
|
70
|
-
* Extracts the root command from a given shell command string.
|
|
71
|
-
* This is used to identify the base command for permission checks.
|
|
72
|
-
*
|
|
73
|
-
* @param command The shell command string to parse
|
|
74
|
-
* @returns The root command name, or undefined if it cannot be determined
|
|
75
|
-
* @example getCommandRoot("ls -la /tmp") returns "ls"
|
|
76
|
-
* @example getCommandRoot("git status && npm test") returns "git"
|
|
77
|
-
*/
|
|
78
|
-
getCommandRoot(command) {
|
|
79
|
-
return command
|
|
80
|
-
.trim() // remove leading and trailing whitespace
|
|
81
|
-
.replace(/[{}()]/g, '') // remove all grouping operators
|
|
82
|
-
.split(/[\s;&|]+/)[0] // split on any whitespace or separator or chaining operators and take first part
|
|
83
|
-
?.split(/[/\\]/) // split on any path separators (or return undefined if previous line was undefined)
|
|
84
|
-
.pop(); // take last part and return command root (or undefined if previous line was empty)
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Determines whether a given shell command is allowed to execute based on
|
|
88
|
-
* the tool's configuration including allowlists and blocklists.
|
|
89
|
-
*
|
|
90
|
-
* @param command The shell command string to validate
|
|
91
|
-
* @returns An object with 'allowed' boolean and optional 'reason' string if not allowed
|
|
92
|
-
*/
|
|
93
|
-
isCommandAllowed(command) {
|
|
94
|
-
// 0. Disallow command substitution
|
|
95
|
-
if (command.includes('$(') || command.includes('`')) {
|
|
96
|
-
return {
|
|
97
|
-
allowed: false,
|
|
98
|
-
reason: 'Command substitution using $() or backticks is not allowed for security reasons',
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
const SHELL_TOOL_NAMES = [ShellTool.name, ShellTool.Name];
|
|
102
|
-
const normalize = (cmd) => cmd.trim().replace(/\s+/g, ' ');
|
|
103
|
-
/**
|
|
104
|
-
* Checks if a command string starts with a given prefix, ensuring it's a
|
|
105
|
-
* whole word match (i.e., followed by a space or it's an exact match).
|
|
106
|
-
* e.g., `isPrefixedBy('npm install', 'npm')` -> true
|
|
107
|
-
* e.g., `isPrefixedBy('npm', 'npm')` -> true
|
|
108
|
-
* e.g., `isPrefixedBy('npminstall', 'npm')` -> false
|
|
109
|
-
*/
|
|
110
|
-
const isPrefixedBy = (cmd, prefix) => {
|
|
111
|
-
if (!cmd.startsWith(prefix)) {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
return cmd.length === prefix.length || cmd[prefix.length] === ' ';
|
|
115
|
-
};
|
|
116
|
-
/**
|
|
117
|
-
* Extracts and normalizes shell commands from a list of tool strings.
|
|
118
|
-
* e.g., 'ShellTool("ls -l")' becomes 'ls -l'
|
|
119
|
-
*/
|
|
120
|
-
const extractCommands = (tools) => tools.flatMap((tool) => {
|
|
121
|
-
for (const toolName of SHELL_TOOL_NAMES) {
|
|
122
|
-
if (tool.startsWith(`${toolName}(`) && tool.endsWith(')')) {
|
|
123
|
-
return [normalize(tool.slice(toolName.length + 1, -1))];
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return [];
|
|
127
|
-
});
|
|
128
|
-
const coreTools = this.config.getCoreTools() || [];
|
|
129
|
-
const excludeTools = this.config.getExcludeTools() || [];
|
|
130
|
-
// 1. Check if the shell tool is globally disabled.
|
|
131
|
-
if (SHELL_TOOL_NAMES.some((name) => excludeTools.includes(name))) {
|
|
132
|
-
return {
|
|
133
|
-
allowed: false,
|
|
134
|
-
reason: 'Shell tool is globally disabled in configuration',
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
const blockedCommands = new Set(extractCommands(excludeTools));
|
|
138
|
-
const allowedCommands = new Set(extractCommands(coreTools));
|
|
139
|
-
const hasSpecificAllowedCommands = allowedCommands.size > 0;
|
|
140
|
-
const isWildcardAllowed = SHELL_TOOL_NAMES.some((name) => coreTools.includes(name));
|
|
141
|
-
const commandsToValidate = command.split(/&&|\|\||\||;/).map(normalize);
|
|
142
|
-
const blockedCommandsArr = [...blockedCommands];
|
|
143
|
-
for (const cmd of commandsToValidate) {
|
|
144
|
-
// 2. Check if the command is on the blocklist.
|
|
145
|
-
const isBlocked = blockedCommandsArr.some((blocked) => isPrefixedBy(cmd, blocked));
|
|
146
|
-
if (isBlocked) {
|
|
147
|
-
return {
|
|
148
|
-
allowed: false,
|
|
149
|
-
reason: `Command '${cmd}' is blocked by configuration`,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
// 3. If in strict allow-list mode, check if the command is permitted.
|
|
153
|
-
const isStrictAllowlist = hasSpecificAllowedCommands && !isWildcardAllowed;
|
|
154
|
-
const allowedCommandsArr = [...allowedCommands];
|
|
155
|
-
if (isStrictAllowlist) {
|
|
156
|
-
const isAllowed = allowedCommandsArr.some((allowed) => isPrefixedBy(cmd, allowed));
|
|
157
|
-
if (!isAllowed) {
|
|
158
|
-
return {
|
|
159
|
-
allowed: false,
|
|
160
|
-
reason: `Command '${cmd}' is not in the allowed commands list`,
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
// 4. If all checks pass, the command is allowed.
|
|
166
|
-
return { allowed: true };
|
|
167
|
-
}
|
|
168
50
|
validateToolParams(params) {
|
|
169
|
-
const commandCheck =
|
|
51
|
+
const commandCheck = isCommandAllowed(params.command, this.config);
|
|
170
52
|
if (!commandCheck.allowed) {
|
|
171
53
|
if (!commandCheck.reason) {
|
|
172
54
|
console.error('Unexpected: isCommandAllowed returned false without a reason');
|
|
@@ -181,255 +63,152 @@ Process Group PGID: Process group started or \`(none)\``, Icon.Terminal, {
|
|
|
181
63
|
if (!params.command.trim()) {
|
|
182
64
|
return 'Command cannot be empty.';
|
|
183
65
|
}
|
|
184
|
-
if (!this.getCommandRoot(params.command)) {
|
|
185
|
-
return 'Could not identify command root to obtain permission from user.';
|
|
186
|
-
}
|
|
187
|
-
if (params.directory) {
|
|
188
|
-
if (path.isAbsolute(params.directory)) {
|
|
189
|
-
return 'Directory cannot be absolute. Must be relative to the project root directory.';
|
|
190
|
-
}
|
|
191
|
-
const directory = path.resolve(this.config.getTargetDir(), params.directory);
|
|
192
|
-
if (!fs.existsSync(directory)) {
|
|
193
|
-
return 'Directory must exist.';
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
66
|
return null;
|
|
197
67
|
}
|
|
198
|
-
async shouldConfirmExecute(params
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
if (this.whitelist.has(rootCommand)) {
|
|
204
|
-
return false; // already approved and whitelisted
|
|
205
|
-
}
|
|
206
|
-
const confirmationDetails = {
|
|
68
|
+
async shouldConfirmExecute(params) {
|
|
69
|
+
const commandRoots = getCommandRoots(params.command);
|
|
70
|
+
const uniqueRoots = [...new Set(commandRoots)];
|
|
71
|
+
const rootCommand = uniqueRoots.length === 1 ? uniqueRoots[0] : uniqueRoots.join(', ');
|
|
72
|
+
return {
|
|
207
73
|
type: 'exec',
|
|
208
|
-
title:
|
|
209
|
-
command: params
|
|
74
|
+
title: `Execute shell command`,
|
|
75
|
+
command: this.formatCommand(params),
|
|
210
76
|
rootCommand,
|
|
211
|
-
onConfirm: async (
|
|
212
|
-
|
|
213
|
-
this.whitelist.add(rootCommand);
|
|
214
|
-
}
|
|
77
|
+
onConfirm: async () => {
|
|
78
|
+
// This will be handled by the calling code
|
|
215
79
|
},
|
|
216
80
|
};
|
|
217
|
-
return confirmationDetails;
|
|
218
81
|
}
|
|
219
|
-
async execute(params,
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const isWindows = os.platform() === 'win32';
|
|
237
|
-
const tempFileName = `shell_pgrep_${crypto
|
|
238
|
-
.randomBytes(6)
|
|
239
|
-
.toString('hex')}.tmp`;
|
|
240
|
-
const tempFilePath = path.join(os.tmpdir(), tempFileName);
|
|
241
|
-
// pgrep is not available on Windows, so we can't get background PIDs
|
|
242
|
-
const command = isWindows
|
|
243
|
-
? params.command
|
|
244
|
-
: (() => {
|
|
245
|
-
// wrap command to append subprocess pids (via pgrep) to temporary file
|
|
246
|
-
let command = params.command.trim();
|
|
247
|
-
if (!command.endsWith('&'))
|
|
248
|
-
command += ';';
|
|
249
|
-
return `{ ${command} }; __code=$?; pgrep -g 0 >${tempFilePath} 2>&1; exit $__code;`;
|
|
250
|
-
})();
|
|
251
|
-
// spawn command in specified directory (or project root if not specified)
|
|
252
|
-
const shell = isWindows
|
|
253
|
-
? spawn('cmd.exe', ['/c', command], {
|
|
254
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
255
|
-
// detached: true, // ensure subprocess starts its own process group (esp. in Linux)
|
|
256
|
-
cwd: path.resolve(this.config.getTargetDir(), params.directory || ''),
|
|
257
|
-
})
|
|
258
|
-
: spawn('bash', ['-c', command], {
|
|
259
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
260
|
-
detached: true, // ensure subprocess starts its own process group (esp. in Linux)
|
|
261
|
-
cwd: path.resolve(this.config.getTargetDir(), params.directory || ''),
|
|
262
|
-
});
|
|
263
|
-
let exited = false;
|
|
264
|
-
let stdout = '';
|
|
265
|
-
let output = '';
|
|
266
|
-
let lastUpdateTime = Date.now();
|
|
267
|
-
const appendOutput = (str) => {
|
|
268
|
-
output += str;
|
|
269
|
-
if (updateOutput &&
|
|
270
|
-
Date.now() - lastUpdateTime > OUTPUT_UPDATE_INTERVAL_MS) {
|
|
271
|
-
updateOutput(output);
|
|
272
|
-
lastUpdateTime = Date.now();
|
|
273
|
-
}
|
|
274
|
-
};
|
|
275
|
-
shell.stdout.on('data', (data) => {
|
|
276
|
-
// continue to consume post-exit for background processes
|
|
277
|
-
// removing listeners can overflow OS buffer and block subprocesses
|
|
278
|
-
// destroying (e.g. shell.stdout.destroy()) can terminate subprocesses via SIGPIPE
|
|
279
|
-
if (!exited) {
|
|
280
|
-
const str = stripAnsi(data.toString());
|
|
281
|
-
stdout += str;
|
|
282
|
-
appendOutput(str);
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
let stderr = '';
|
|
286
|
-
shell.stderr.on('data', (data) => {
|
|
287
|
-
if (!exited) {
|
|
288
|
-
const str = stripAnsi(data.toString());
|
|
289
|
-
stderr += str;
|
|
290
|
-
appendOutput(str);
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
let error = null;
|
|
294
|
-
shell.on('error', (err) => {
|
|
295
|
-
error = err;
|
|
296
|
-
// remove wrapper from user's command in error message
|
|
297
|
-
error.message = error.message.replace(command, params.command);
|
|
298
|
-
});
|
|
299
|
-
let code = null;
|
|
300
|
-
let processSignal = null;
|
|
301
|
-
const exitHandler = (_code, _signal) => {
|
|
302
|
-
exited = true;
|
|
303
|
-
code = _code;
|
|
304
|
-
processSignal = _signal;
|
|
305
|
-
};
|
|
306
|
-
shell.on('exit', exitHandler);
|
|
307
|
-
const abortHandler = async () => {
|
|
308
|
-
if (shell.pid && !exited) {
|
|
309
|
-
if (os.platform() === 'win32') {
|
|
310
|
-
// For Windows, use taskkill to kill the process tree
|
|
311
|
-
spawn('taskkill', ['/pid', shell.pid.toString(), '/f', '/t']);
|
|
82
|
+
async execute(params, signal) {
|
|
83
|
+
try {
|
|
84
|
+
const isWindows = os.platform() === 'win32';
|
|
85
|
+
const shell = isWindows ? 'cmd.exe' : 'bash';
|
|
86
|
+
const shellArgs = isWindows
|
|
87
|
+
? ['/c', params.command]
|
|
88
|
+
: ['-c', params.command];
|
|
89
|
+
const { execaCommandSync } = await import('execa');
|
|
90
|
+
let cleanedCommand = stripShellWrapper(params.command);
|
|
91
|
+
if (!isWindows) {
|
|
92
|
+
// On non-windows, wrap the command to capture the final working directory.
|
|
93
|
+
const pwdFileName = `shell_pwd_${crypto.randomBytes(6).toString('hex')}.tmp`;
|
|
94
|
+
const pwdFilePath = path.join(os.tmpdir(), pwdFileName);
|
|
95
|
+
// Ensure command ends with a separator before adding our own.
|
|
96
|
+
cleanedCommand = cleanedCommand.trim();
|
|
97
|
+
if (!cleanedCommand.endsWith(';') && !cleanedCommand.endsWith('&')) {
|
|
98
|
+
cleanedCommand += ';';
|
|
312
99
|
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
100
|
+
cleanedCommand = `{ ${cleanedCommand} }; __code=$?; pwd > "${pwdFilePath}"; exit $__code`;
|
|
101
|
+
try {
|
|
102
|
+
const result = execaCommandSync(`${shell} ${shellArgs.map((arg) => `'${arg}'`).join(' ')} '${cleanedCommand}'`, {
|
|
103
|
+
cwd: this.config.getTargetDir(),
|
|
104
|
+
env: {
|
|
105
|
+
...process.env,
|
|
106
|
+
GEMINI_CLI: '1',
|
|
107
|
+
},
|
|
108
|
+
timeout: 1000 * 60 * 15, // 15 minutes
|
|
109
|
+
all: true,
|
|
110
|
+
shell: false,
|
|
111
|
+
});
|
|
112
|
+
// Read the captured PWD
|
|
113
|
+
let finalPwd = this.config.getTargetDir();
|
|
114
|
+
if (fs.existsSync(pwdFilePath)) {
|
|
325
115
|
try {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
116
|
+
finalPwd = fs.readFileSync(pwdFilePath, 'utf8').trim();
|
|
117
|
+
}
|
|
118
|
+
catch (readError) {
|
|
119
|
+
console.debug('Failed to read PWD file:', readError);
|
|
329
120
|
}
|
|
330
|
-
|
|
331
|
-
|
|
121
|
+
finally {
|
|
122
|
+
// Clean up the temporary file
|
|
123
|
+
try {
|
|
124
|
+
fs.unlinkSync(pwdFilePath);
|
|
125
|
+
}
|
|
126
|
+
catch (unlinkError) {
|
|
127
|
+
console.debug('Failed to unlink PWD file:', unlinkError);
|
|
128
|
+
}
|
|
332
129
|
}
|
|
333
130
|
}
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
const pgrepLines = fs
|
|
350
|
-
.readFileSync(tempFilePath, 'utf8')
|
|
351
|
-
.split('\n')
|
|
352
|
-
.filter(Boolean);
|
|
353
|
-
for (const line of pgrepLines) {
|
|
354
|
-
if (!/^\d+$/.test(line)) {
|
|
355
|
-
console.error(`pgrep: ${line}`);
|
|
131
|
+
const allOutput = stripAnsi(result.all || '');
|
|
132
|
+
let response = allOutput;
|
|
133
|
+
// Add warning if directory changed
|
|
134
|
+
if (finalPwd !== this.config.getTargetDir()) {
|
|
135
|
+
response = `WARNING: shell mode is stateless; the directory change to '${finalPwd}' will not persist.\n\n${response}`;
|
|
136
|
+
}
|
|
137
|
+
// Check if summarization is enabled for this tool
|
|
138
|
+
const summarizerConfig = this.config.getSummarizeToolOutputConfig();
|
|
139
|
+
const toolSummarizeConfig = summarizerConfig
|
|
140
|
+
? summarizerConfig[this.name]
|
|
141
|
+
: undefined;
|
|
142
|
+
let llmContent = response;
|
|
143
|
+
if (toolSummarizeConfig) {
|
|
144
|
+
const tokenBudget = toolSummarizeConfig.tokenBudget;
|
|
145
|
+
llmContent = await summarizeToolOutput(response, this.config.getGeminiClient(), signal, tokenBudget);
|
|
356
146
|
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
147
|
+
return {
|
|
148
|
+
summary: `Executed command: ${params.command}`,
|
|
149
|
+
returnDisplay: response,
|
|
150
|
+
llmContent,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
// Clean up PWD file on error
|
|
155
|
+
if (fs.existsSync(pwdFilePath)) {
|
|
156
|
+
try {
|
|
157
|
+
fs.unlinkSync(pwdFilePath);
|
|
158
|
+
}
|
|
159
|
+
catch (unlinkError) {
|
|
160
|
+
console.debug('Failed to unlink PWD file:', unlinkError);
|
|
161
|
+
}
|
|
361
162
|
}
|
|
163
|
+
throw error; // Re-throw to be caught by outer try-catch
|
|
362
164
|
}
|
|
363
|
-
fs.unlinkSync(tempFilePath);
|
|
364
165
|
}
|
|
365
166
|
else {
|
|
366
|
-
|
|
367
|
-
|
|
167
|
+
// Windows path
|
|
168
|
+
const result = execaCommandSync(`${shell} ${shellArgs.map((arg) => `"${arg}"`).join(' ')} "${cleanedCommand}"`, {
|
|
169
|
+
cwd: this.config.getTargetDir(),
|
|
170
|
+
env: {
|
|
171
|
+
...process.env,
|
|
172
|
+
GEMINI_CLI: '1',
|
|
173
|
+
},
|
|
174
|
+
timeout: 1000 * 60 * 15, // 15 minutes
|
|
175
|
+
all: true,
|
|
176
|
+
shell: false,
|
|
177
|
+
});
|
|
178
|
+
const allOutput = stripAnsi(result.all || '');
|
|
179
|
+
// Check if summarization is enabled for this tool
|
|
180
|
+
const summarizerConfig = this.config.getSummarizeToolOutputConfig();
|
|
181
|
+
const toolSummarizeConfig = summarizerConfig
|
|
182
|
+
? summarizerConfig[this.name]
|
|
183
|
+
: undefined;
|
|
184
|
+
let llmContent = allOutput;
|
|
185
|
+
if (toolSummarizeConfig) {
|
|
186
|
+
const tokenBudget = toolSummarizeConfig.tokenBudget;
|
|
187
|
+
llmContent = await summarizeToolOutput(allOutput, this.config.getGeminiClient(), signal, tokenBudget);
|
|
368
188
|
}
|
|
189
|
+
return {
|
|
190
|
+
summary: `Executed command: ${params.command}`,
|
|
191
|
+
returnDisplay: allOutput,
|
|
192
|
+
llmContent,
|
|
193
|
+
};
|
|
369
194
|
}
|
|
370
195
|
}
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
if (
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
else {
|
|
382
|
-
llmContent = [
|
|
383
|
-
`Command: ${params.command}`,
|
|
384
|
-
`Directory: ${params.directory || '(root)'}`,
|
|
385
|
-
`Stdout: ${stdout || '(empty)'}`,
|
|
386
|
-
`Stderr: ${stderr || '(empty)'}`,
|
|
387
|
-
`Error: ${error ?? '(none)'}`,
|
|
388
|
-
`Exit Code: ${code ?? '(none)'}`,
|
|
389
|
-
`Signal: ${processSignal ?? '(none)'}`,
|
|
390
|
-
`Background PIDs: ${backgroundPIDs.length ? backgroundPIDs.join(', ') : '(none)'}`,
|
|
391
|
-
`Process Group PGID: ${shell.pid ?? '(none)'}`,
|
|
392
|
-
].join('\n');
|
|
393
|
-
}
|
|
394
|
-
let returnDisplayMessage = '';
|
|
395
|
-
if (this.config.getDebugMode()) {
|
|
396
|
-
returnDisplayMessage = llmContent;
|
|
397
|
-
}
|
|
398
|
-
else {
|
|
399
|
-
if (output.trim()) {
|
|
400
|
-
returnDisplayMessage = output;
|
|
401
|
-
}
|
|
402
|
-
else {
|
|
403
|
-
// Output is empty, let's provide a reason if the command failed or was cancelled
|
|
404
|
-
if (abortSignal.aborted) {
|
|
405
|
-
returnDisplayMessage = 'Command cancelled by user.';
|
|
406
|
-
}
|
|
407
|
-
else if (processSignal) {
|
|
408
|
-
returnDisplayMessage = `Command terminated by signal: ${processSignal}`;
|
|
196
|
+
catch (error) {
|
|
197
|
+
let errorMessage = getErrorMessage(error);
|
|
198
|
+
// Check if error has execa-specific properties
|
|
199
|
+
if (error && typeof error === 'object' && 'all' in error) {
|
|
200
|
+
const execaError = error;
|
|
201
|
+
if (execaError.all) {
|
|
202
|
+
const allOutput = stripAnsi(execaError.all);
|
|
203
|
+
errorMessage += `\nOutput:\n${allOutput}`;
|
|
409
204
|
}
|
|
410
|
-
else if (error) {
|
|
411
|
-
// If error is not null, it's an Error object (or other truthy value)
|
|
412
|
-
returnDisplayMessage = `Command failed: ${getErrorMessage(error)}`;
|
|
413
|
-
}
|
|
414
|
-
else if (code !== null && code !== 0) {
|
|
415
|
-
returnDisplayMessage = `Command exited with code: ${code}`;
|
|
416
|
-
}
|
|
417
|
-
// If output is empty and command succeeded (code 0, no error/signal/abort),
|
|
418
|
-
// returnDisplayMessage will remain empty, which is fine.
|
|
419
205
|
}
|
|
420
|
-
}
|
|
421
|
-
const summarizeConfig = this.config.getSummarizeToolOutputConfig();
|
|
422
|
-
if (summarizeConfig && summarizeConfig[this.name]) {
|
|
423
|
-
const summary = await summarizeToolOutput(llmContent, this.config.getGeminiClient(), abortSignal, summarizeConfig[this.name].tokenBudget);
|
|
424
206
|
return {
|
|
425
|
-
|
|
426
|
-
|
|
207
|
+
summary: `Command failed: ${params.command}`,
|
|
208
|
+
llmContent: errorMessage,
|
|
209
|
+
returnDisplay: errorMessage,
|
|
427
210
|
};
|
|
428
211
|
}
|
|
429
|
-
return {
|
|
430
|
-
llmContent,
|
|
431
|
-
returnDisplay: returnDisplayMessage,
|
|
432
|
-
};
|
|
433
212
|
}
|
|
434
213
|
}
|
|
435
214
|
//# sourceMappingURL=shell.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/tools/shell.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EACL,QAAQ,EAGR,IAAI,GACL,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAc7D,MAAM,OAAO,SAAU,SAAQ,QAAqC;IAG9C;IAFpB,MAAM,CAAU,IAAI,GAAG,YAAY,CAAC;IAEpC,YAAoB,MAAc;QAChC,KAAK,CACH,SAAS,CAAC,IAAI,EACd,iBAAiB,EACjB,+DAA+D,EAC/D,IAAI,CAAC,QAAQ,EACb;YACE,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,WAAW,EAAE,8BAA8B;oBAC3C,IAAI,EAAE,IAAI,CAAC,MAAM;iBAClB;gBACD,WAAW,EAAE;oBACX,WAAW,EACT,+EAA+E;oBACjF,IAAI,EAAE,IAAI,CAAC,MAAM;iBAClB;aACF;YACD,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,IAAI,EAAE,IAAI,CAAC,MAAM;SAClB,EACD,IAAI,CACL,CAAC;QAtBgB,WAAM,GAAN,MAAM,CAAQ;IAuBlC,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,MAAuB;QACnC,IAAI,WAAW,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,WAAW,IAAI,KAAK,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC;QAChE,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,kBAAkB,CAAC,MAAuB;QACxC,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CACX,8DAA8D,CAC/D,CAAC;gBACF,OAAO,2BAA2B,MAAM,CAAC,OAAO,EAAE,CAAC;YACrD,CAAC;YACD,OAAO,YAAY,CAAC,MAAM,CAAC;QAC7B,CAAC;QAED,MAAM,sBAAsB,GAAG,eAAe,CAAC,QAAQ,CACrD,IAAI,CAAC,eAA0C,EAC/C,MAAM,CACP,CAAC;QAEF,IAAI,sBAAsB,KAAK,IAAI,EAAE,CAAC;YACpC,OAAO,sCAAsC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3B,OAAO,0BAA0B,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,MAAuB;QAEvB,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAC/C,MAAM,WAAW,GACf,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErE,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YACnC,WAAW;YACX,SAAS,EAAE,KAAK,IAAI,EAAE;gBACpB,2CAA2C;YAC7C,CAAC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CACX,MAAuB,EACvB,MAAmB;QAEnB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC;YAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7C,MAAM,SAAS,GAAG,SAAS;gBACzB,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;gBACxB,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAE3B,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnD,IAAI,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,2EAA2E;gBAC3E,MAAM,WAAW,GAAG,aAAa,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;gBACxD,8DAA8D;gBAC9D,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;gBACvC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnE,cAAc,IAAI,GAAG,CAAC;gBACxB,CAAC;gBACD,cAAc,GAAG,KAAK,cAAc,yBAAyB,WAAW,iBAAiB,CAAC;gBAE1F,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,gBAAgB,CAC7B,GAAG,KAAK,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,cAAc,GAAG,EAC9E;wBACE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;wBAC/B,GAAG,EAAE;4BACH,GAAG,OAAO,CAAC,GAAG;4BACd,UAAU,EAAE,GAAG;yBAChB;wBACD,OAAO,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,aAAa;wBACtC,GAAG,EAAE,IAAI;wBACT,KAAK,EAAE,KAAK;qBACb,CACF,CAAC;oBAEF,wBAAwB;oBACxB,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;oBAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC/B,IAAI,CAAC;4BACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;wBACzD,CAAC;wBAAC,OAAO,SAAS,EAAE,CAAC;4BACnB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;wBACvD,CAAC;gCAAS,CAAC;4BACT,8BAA8B;4BAC9B,IAAI,CAAC;gCACH,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;4BAC7B,CAAC;4BAAC,OAAO,WAAW,EAAE,CAAC;gCACrB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,WAAW,CAAC,CAAC;4BAC3D,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;oBAC9C,IAAI,QAAQ,GAAG,SAAS,CAAC;oBAEzB,mCAAmC;oBACnC,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;wBAC5C,QAAQ,GAAG,8DAA8D,QAAQ,0BAA0B,QAAQ,EAAE,CAAC;oBACxH,CAAC;oBAED,kDAAkD;oBAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;oBACpE,MAAM,mBAAmB,GAAG,gBAAgB;wBAC1C,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC7B,CAAC,CAAC,SAAS,CAAC;oBACd,IAAI,UAAU,GAAG,QAAQ,CAAC;oBAE1B,IAAI,mBAAmB,EAAE,CAAC;wBACxB,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC;wBACpD,UAAU,GAAG,MAAM,mBAAmB,CACpC,QAAQ,EACR,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAC7B,MAAM,EACN,WAAW,CACZ,CAAC;oBACJ,CAAC;oBAED,OAAO;wBACL,OAAO,EAAE,qBAAqB,MAAM,CAAC,OAAO,EAAE;wBAC9C,aAAa,EAAE,QAAQ;wBACvB,UAAU;qBACX,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,6BAA6B;oBAC7B,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC/B,IAAI,CAAC;4BACH,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;wBAC7B,CAAC;wBAAC,OAAO,WAAW,EAAE,CAAC;4BACrB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,WAAW,CAAC,CAAC;wBAC3D,CAAC;oBACH,CAAC;oBACD,MAAM,KAAK,CAAC,CAAC,2CAA2C;gBAC1D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,MAAM,MAAM,GAAG,gBAAgB,CAC7B,GAAG,KAAK,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,cAAc,GAAG,EAC9E;oBACE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;oBAC/B,GAAG,EAAE;wBACH,GAAG,OAAO,CAAC,GAAG;wBACd,UAAU,EAAE,GAAG;qBAChB;oBACD,OAAO,EAAE,IAAI,GAAG,EAAE,GAAG,EAAE,EAAE,aAAa;oBACtC,GAAG,EAAE,IAAI;oBACT,KAAK,EAAE,KAAK;iBACb,CACF,CAAC;gBAEF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBAC9C,kDAAkD;gBAClD,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;gBACpE,MAAM,mBAAmB,GAAG,gBAAgB;oBAC1C,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC7B,CAAC,CAAC,SAAS,CAAC;gBACd,IAAI,UAAU,GAAG,SAAS,CAAC;gBAE3B,IAAI,mBAAmB,EAAE,CAAC;oBACxB,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC;oBACpD,UAAU,GAAG,MAAM,mBAAmB,CACpC,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAC7B,MAAM,EACN,WAAW,CACZ,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,qBAAqB,MAAM,CAAC,OAAO,EAAE;oBAC9C,aAAa,EAAE,SAAS;oBACxB,UAAU;iBACX,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAC1C,+CAA+C;YAC/C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;gBACzD,MAAM,UAAU,GAAG,KAAyB,CAAC;gBAC7C,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;oBACnB,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;oBAC5C,YAAY,IAAI,cAAc,SAAS,EAAE,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,mBAAmB,MAAM,CAAC,OAAO,EAAE;gBAC5C,UAAU,EAAE,YAAY;gBACxB,aAAa,EAAE,YAAY;aAC5B,CAAC;QACJ,CAAC;IACH,CAAC"}
|