@qwen-code/qwen-code 0.6.0-preview.1 → 0.6.0-preview.2
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 +1 -0
- package/cli.js +2012 -1764
- package/locales/en.js +88 -133
- package/locales/ru.js +118 -147
- package/locales/zh.js +47 -164
- package/package.json +2 -2
package/cli.js
CHANGED
|
@@ -70952,16 +70952,21 @@ var require_dist3 = __commonJS({
|
|
|
70952
70952
|
});
|
|
70953
70953
|
|
|
70954
70954
|
// packages/core/dist/src/utils/schemaValidator.js
|
|
70955
|
-
function
|
|
70955
|
+
function fixBooleanValues(data) {
|
|
70956
70956
|
for (const key of Object.keys(data)) {
|
|
70957
70957
|
if (!(key in data))
|
|
70958
70958
|
continue;
|
|
70959
|
-
|
|
70960
|
-
|
|
70961
|
-
|
|
70962
|
-
|
|
70963
|
-
|
|
70964
|
-
|
|
70959
|
+
const value = data[key];
|
|
70960
|
+
if (typeof value === "object" && value !== null) {
|
|
70961
|
+
fixBooleanValues(value);
|
|
70962
|
+
} else if (typeof value === "string") {
|
|
70963
|
+
const lower3 = value.toLowerCase();
|
|
70964
|
+
if (lower3 === "true") {
|
|
70965
|
+
data[key] = true;
|
|
70966
|
+
} else if (lower3 === "false") {
|
|
70967
|
+
data[key] = false;
|
|
70968
|
+
}
|
|
70969
|
+
}
|
|
70965
70970
|
}
|
|
70966
70971
|
}
|
|
70967
70972
|
var import_ajv, addFormats, AjvClass, ajValidator, addFormatsFunc, SchemaValidator;
|
|
@@ -71002,19 +71007,18 @@ var init_schemaValidator = __esm({
|
|
|
71002
71007
|
return "Value of params must be an object";
|
|
71003
71008
|
}
|
|
71004
71009
|
const validate3 = ajValidator.compile(schema);
|
|
71005
|
-
|
|
71010
|
+
let valid = validate3(data);
|
|
71006
71011
|
if (!valid && validate3.errors) {
|
|
71007
|
-
|
|
71008
|
-
|
|
71009
|
-
|
|
71010
|
-
|
|
71011
|
-
return ajValidator.errorsText(validate4.errors, { dataVar: "params" });
|
|
71012
|
+
fixBooleanValues(data);
|
|
71013
|
+
valid = validate3(data);
|
|
71014
|
+
if (!valid && validate3.errors) {
|
|
71015
|
+
return ajValidator.errorsText(validate3.errors, { dataVar: "params" });
|
|
71012
71016
|
}
|
|
71013
71017
|
}
|
|
71014
71018
|
return null;
|
|
71015
71019
|
}
|
|
71016
71020
|
};
|
|
71017
|
-
__name(
|
|
71021
|
+
__name(fixBooleanValues, "fixBooleanValues");
|
|
71018
71022
|
}
|
|
71019
71023
|
});
|
|
71020
71024
|
|
|
@@ -131561,10 +131565,23 @@ var init_converter = __esm({
|
|
|
131561
131565
|
if (message.role === "assistant" && merged.length > 0) {
|
|
131562
131566
|
const lastMessage = merged[merged.length - 1];
|
|
131563
131567
|
if (lastMessage.role === "assistant") {
|
|
131564
|
-
const
|
|
131565
|
-
|
|
131566
|
-
|
|
131567
|
-
|
|
131568
|
+
const lastContent = lastMessage.content;
|
|
131569
|
+
const currentContent = message.content;
|
|
131570
|
+
const useArrayFormat = Array.isArray(lastContent) || Array.isArray(currentContent);
|
|
131571
|
+
let combinedContent;
|
|
131572
|
+
if (useArrayFormat) {
|
|
131573
|
+
const lastParts = Array.isArray(lastContent) ? lastContent : typeof lastContent === "string" && lastContent ? [{ type: "text", text: lastContent }] : [];
|
|
131574
|
+
const currentParts = Array.isArray(currentContent) ? currentContent : typeof currentContent === "string" && currentContent ? [{ type: "text", text: currentContent }] : [];
|
|
131575
|
+
combinedContent = [
|
|
131576
|
+
...lastParts,
|
|
131577
|
+
...currentParts
|
|
131578
|
+
];
|
|
131579
|
+
} else {
|
|
131580
|
+
const lastText = typeof lastContent === "string" ? lastContent : "";
|
|
131581
|
+
const currentText = typeof currentContent === "string" ? currentContent : "";
|
|
131582
|
+
const mergedText = [lastText, currentText].filter(Boolean).join("");
|
|
131583
|
+
combinedContent = mergedText || null;
|
|
131584
|
+
}
|
|
131568
131585
|
const lastToolCalls = "tool_calls" in lastMessage ? lastMessage.tool_calls || [] : [];
|
|
131569
131586
|
const currentToolCalls = "tool_calls" in message ? message.tool_calls || [] : [];
|
|
131570
131587
|
const combinedToolCalls = [...lastToolCalls, ...currentToolCalls];
|
|
@@ -154418,7 +154435,7 @@ __export(geminiContentGenerator_exports, {
|
|
|
154418
154435
|
createGeminiContentGenerator: () => createGeminiContentGenerator
|
|
154419
154436
|
});
|
|
154420
154437
|
function createGeminiContentGenerator(config2, gcConfig) {
|
|
154421
|
-
const version2 = "0.6.0-preview.
|
|
154438
|
+
const version2 = "0.6.0-preview.2";
|
|
154422
154439
|
const userAgent2 = config2.userAgent || `QwenCode/${version2} (${process.platform}; ${process.arch})`;
|
|
154423
154440
|
const baseHeaders = {
|
|
154424
154441
|
"User-Agent": userAgent2
|
|
@@ -287171,7 +287188,7 @@ var init_en3 = __esm({
|
|
|
287171
287188
|
"Theme configuration unavailable due to NO_COLOR env variable.": "Theme configuration unavailable due to NO_COLOR env variable.",
|
|
287172
287189
|
'Theme "{{themeName}}" not found.': 'Theme "{{themeName}}" not found.',
|
|
287173
287190
|
'Theme "{{themeName}}" not found in selected scope.': 'Theme "{{themeName}}" not found in selected scope.',
|
|
287174
|
-
"
|
|
287191
|
+
"Clear conversation history and free up context": "Clear conversation history and free up context",
|
|
287175
287192
|
"Compresses the context by replacing it with a summary.": "Compresses the context by replacing it with a summary.",
|
|
287176
287193
|
"open full Qwen Code documentation in your browser": "open full Qwen Code documentation in your browser",
|
|
287177
287194
|
"Configuration not available.": "Configuration not available.",
|
|
@@ -287291,6 +287308,7 @@ var init_en3 = __esm({
|
|
|
287291
287308
|
"(Use Enter to select{{tabText}})": "(Use Enter to select{{tabText}})",
|
|
287292
287309
|
", Tab to change focus": ", Tab to change focus",
|
|
287293
287310
|
"To see changes, Qwen Code must be restarted. Press r to exit and apply changes now.": "To see changes, Qwen Code must be restarted. Press r to exit and apply changes now.",
|
|
287311
|
+
'The command "/{{command}}" is not supported in non-interactive mode.': 'The command "/{{command}}" is not supported in non-interactive mode.',
|
|
287294
287312
|
// ============================================================================
|
|
287295
287313
|
// Settings Labels
|
|
287296
287314
|
// ============================================================================
|
|
@@ -287523,6 +287541,10 @@ var init_en3 = __esm({
|
|
|
287523
287541
|
"Already generating summary, wait for previous request to complete": "Already generating summary, wait for previous request to complete",
|
|
287524
287542
|
"No conversation found to summarize.": "No conversation found to summarize.",
|
|
287525
287543
|
"Failed to generate project context summary: {{error}}": "Failed to generate project context summary: {{error}}",
|
|
287544
|
+
"Saved project summary to {{filePathForDisplay}}.": "Saved project summary to {{filePathForDisplay}}.",
|
|
287545
|
+
"Saving project summary...": "Saving project summary...",
|
|
287546
|
+
"Generating project summary...": "Generating project summary...",
|
|
287547
|
+
"Failed to generate summary - no text content received from LLM response": "Failed to generate summary - no text content received from LLM response",
|
|
287526
287548
|
// ============================================================================
|
|
287527
287549
|
// Commands - Model
|
|
287528
287550
|
// ============================================================================
|
|
@@ -287533,8 +287555,8 @@ var init_en3 = __esm({
|
|
|
287533
287555
|
// ============================================================================
|
|
287534
287556
|
// Commands - Clear
|
|
287535
287557
|
// ============================================================================
|
|
287536
|
-
"
|
|
287537
|
-
"
|
|
287558
|
+
"Starting a new session, resetting chat, and clearing terminal.": "Starting a new session, resetting chat, and clearing terminal.",
|
|
287559
|
+
"Starting a new session and clearing.": "Starting a new session and clearing.",
|
|
287538
287560
|
// ============================================================================
|
|
287539
287561
|
// Commands - Compress
|
|
287540
287562
|
// ============================================================================
|
|
@@ -287779,134 +287801,139 @@ var init_en3 = __esm({
|
|
|
287779
287801
|
// ============================================================================
|
|
287780
287802
|
"Waiting for user confirmation...": "Waiting for user confirmation...",
|
|
287781
287803
|
"(esc to cancel, {{time}})": "(esc to cancel, {{time}})",
|
|
287782
|
-
|
|
287783
|
-
|
|
287784
|
-
|
|
287785
|
-
|
|
287786
|
-
|
|
287787
|
-
|
|
287788
|
-
|
|
287789
|
-
|
|
287790
|
-
|
|
287791
|
-
|
|
287792
|
-
|
|
287793
|
-
|
|
287794
|
-
|
|
287795
|
-
|
|
287796
|
-
|
|
287797
|
-
|
|
287798
|
-
|
|
287799
|
-
|
|
287800
|
-
|
|
287801
|
-
|
|
287802
|
-
|
|
287803
|
-
|
|
287804
|
-
|
|
287805
|
-
|
|
287806
|
-
|
|
287807
|
-
|
|
287808
|
-
|
|
287809
|
-
|
|
287810
|
-
|
|
287811
|
-
|
|
287812
|
-
|
|
287813
|
-
|
|
287814
|
-
|
|
287815
|
-
|
|
287816
|
-
|
|
287817
|
-
|
|
287818
|
-
|
|
287819
|
-
|
|
287820
|
-
|
|
287821
|
-
|
|
287822
|
-
|
|
287823
|
-
|
|
287824
|
-
|
|
287825
|
-
|
|
287826
|
-
|
|
287827
|
-
|
|
287828
|
-
|
|
287829
|
-
|
|
287830
|
-
|
|
287831
|
-
|
|
287832
|
-
|
|
287833
|
-
|
|
287834
|
-
|
|
287835
|
-
|
|
287836
|
-
|
|
287837
|
-
|
|
287838
|
-
|
|
287839
|
-
|
|
287840
|
-
|
|
287841
|
-
|
|
287842
|
-
|
|
287843
|
-
|
|
287844
|
-
|
|
287845
|
-
|
|
287846
|
-
|
|
287847
|
-
|
|
287848
|
-
|
|
287849
|
-
|
|
287850
|
-
|
|
287851
|
-
|
|
287852
|
-
|
|
287853
|
-
|
|
287854
|
-
|
|
287855
|
-
|
|
287856
|
-
|
|
287857
|
-
|
|
287858
|
-
|
|
287859
|
-
|
|
287860
|
-
|
|
287861
|
-
|
|
287862
|
-
|
|
287863
|
-
|
|
287864
|
-
|
|
287865
|
-
|
|
287866
|
-
|
|
287867
|
-
|
|
287868
|
-
|
|
287869
|
-
|
|
287870
|
-
|
|
287871
|
-
|
|
287872
|
-
|
|
287873
|
-
|
|
287874
|
-
|
|
287875
|
-
|
|
287876
|
-
|
|
287877
|
-
|
|
287878
|
-
|
|
287879
|
-
|
|
287880
|
-
|
|
287881
|
-
|
|
287882
|
-
|
|
287883
|
-
|
|
287884
|
-
|
|
287885
|
-
|
|
287886
|
-
|
|
287887
|
-
|
|
287888
|
-
|
|
287889
|
-
|
|
287890
|
-
|
|
287891
|
-
|
|
287892
|
-
|
|
287893
|
-
|
|
287894
|
-
|
|
287895
|
-
|
|
287896
|
-
|
|
287897
|
-
|
|
287898
|
-
|
|
287899
|
-
|
|
287900
|
-
|
|
287901
|
-
|
|
287902
|
-
|
|
287903
|
-
|
|
287904
|
-
|
|
287905
|
-
|
|
287906
|
-
|
|
287907
|
-
|
|
287908
|
-
|
|
287909
|
-
|
|
287804
|
+
// ============================================================================
|
|
287805
|
+
// Loading Phrases
|
|
287806
|
+
// ============================================================================
|
|
287807
|
+
WITTY_LOADING_PHRASES: [
|
|
287808
|
+
"I'm Feeling Lucky",
|
|
287809
|
+
"Shipping awesomeness... ",
|
|
287810
|
+
"Painting the serifs back on...",
|
|
287811
|
+
"Navigating the slime mold...",
|
|
287812
|
+
"Consulting the digital spirits...",
|
|
287813
|
+
"Reticulating splines...",
|
|
287814
|
+
"Warming up the AI hamsters...",
|
|
287815
|
+
"Asking the magic conch shell...",
|
|
287816
|
+
"Generating witty retort...",
|
|
287817
|
+
"Polishing the algorithms...",
|
|
287818
|
+
"Don't rush perfection (or my code)...",
|
|
287819
|
+
"Brewing fresh bytes...",
|
|
287820
|
+
"Counting electrons...",
|
|
287821
|
+
"Engaging cognitive processors...",
|
|
287822
|
+
"Checking for syntax errors in the universe...",
|
|
287823
|
+
"One moment, optimizing humor...",
|
|
287824
|
+
"Shuffling punchlines...",
|
|
287825
|
+
"Untangling neural nets...",
|
|
287826
|
+
"Compiling brilliance...",
|
|
287827
|
+
"Loading wit.exe...",
|
|
287828
|
+
"Summoning the cloud of wisdom...",
|
|
287829
|
+
"Preparing a witty response...",
|
|
287830
|
+
"Just a sec, I'm debugging reality...",
|
|
287831
|
+
"Confuzzling the options...",
|
|
287832
|
+
"Tuning the cosmic frequencies...",
|
|
287833
|
+
"Crafting a response worthy of your patience...",
|
|
287834
|
+
"Compiling the 1s and 0s...",
|
|
287835
|
+
"Resolving dependencies... and existential crises...",
|
|
287836
|
+
"Defragmenting memories... both RAM and personal...",
|
|
287837
|
+
"Rebooting the humor module...",
|
|
287838
|
+
"Caching the essentials (mostly cat memes)...",
|
|
287839
|
+
"Optimizing for ludicrous speed",
|
|
287840
|
+
"Swapping bits... don't tell the bytes...",
|
|
287841
|
+
"Garbage collecting... be right back...",
|
|
287842
|
+
"Assembling the interwebs...",
|
|
287843
|
+
"Converting coffee into code...",
|
|
287844
|
+
"Updating the syntax for reality...",
|
|
287845
|
+
"Rewiring the synapses...",
|
|
287846
|
+
"Looking for a misplaced semicolon...",
|
|
287847
|
+
"Greasin' the cogs of the machine...",
|
|
287848
|
+
"Pre-heating the servers...",
|
|
287849
|
+
"Calibrating the flux capacitor...",
|
|
287850
|
+
"Engaging the improbability drive...",
|
|
287851
|
+
"Channeling the Force...",
|
|
287852
|
+
"Aligning the stars for optimal response...",
|
|
287853
|
+
"So say we all...",
|
|
287854
|
+
"Loading the next great idea...",
|
|
287855
|
+
"Just a moment, I'm in the zone...",
|
|
287856
|
+
"Preparing to dazzle you with brilliance...",
|
|
287857
|
+
"Just a tick, I'm polishing my wit...",
|
|
287858
|
+
"Hold tight, I'm crafting a masterpiece...",
|
|
287859
|
+
"Just a jiffy, I'm debugging the universe...",
|
|
287860
|
+
"Just a moment, I'm aligning the pixels...",
|
|
287861
|
+
"Just a sec, I'm optimizing the humor...",
|
|
287862
|
+
"Just a moment, I'm tuning the algorithms...",
|
|
287863
|
+
"Warp speed engaged...",
|
|
287864
|
+
"Mining for more Dilithium crystals...",
|
|
287865
|
+
"Don't panic...",
|
|
287866
|
+
"Following the white rabbit...",
|
|
287867
|
+
"The truth is in here... somewhere...",
|
|
287868
|
+
"Blowing on the cartridge...",
|
|
287869
|
+
"Loading... Do a barrel roll!",
|
|
287870
|
+
"Waiting for the respawn...",
|
|
287871
|
+
"Finishing the Kessel Run in less than 12 parsecs...",
|
|
287872
|
+
"The cake is not a lie, it's just still loading...",
|
|
287873
|
+
"Fiddling with the character creation screen...",
|
|
287874
|
+
"Just a moment, I'm finding the right meme...",
|
|
287875
|
+
"Pressing 'A' to continue...",
|
|
287876
|
+
"Herding digital cats...",
|
|
287877
|
+
"Polishing the pixels...",
|
|
287878
|
+
"Finding a suitable loading screen pun...",
|
|
287879
|
+
"Distracting you with this witty phrase...",
|
|
287880
|
+
"Almost there... probably...",
|
|
287881
|
+
"Our hamsters are working as fast as they can...",
|
|
287882
|
+
"Giving Cloudy a pat on the head...",
|
|
287883
|
+
"Petting the cat...",
|
|
287884
|
+
"Rickrolling my boss...",
|
|
287885
|
+
"Never gonna give you up, never gonna let you down...",
|
|
287886
|
+
"Slapping the bass...",
|
|
287887
|
+
"Tasting the snozberries...",
|
|
287888
|
+
"I'm going the distance, I'm going for speed...",
|
|
287889
|
+
"Is this the real life? Is this just fantasy?...",
|
|
287890
|
+
"I've got a good feeling about this...",
|
|
287891
|
+
"Poking the bear...",
|
|
287892
|
+
"Doing research on the latest memes...",
|
|
287893
|
+
"Figuring out how to make this more witty...",
|
|
287894
|
+
"Hmmm... let me think...",
|
|
287895
|
+
"What do you call a fish with no eyes? A fsh...",
|
|
287896
|
+
"Why did the computer go to therapy? It had too many bytes...",
|
|
287897
|
+
"Why don't programmers like nature? It has too many bugs...",
|
|
287898
|
+
"Why do programmers prefer dark mode? Because light attracts bugs...",
|
|
287899
|
+
"Why did the developer go broke? Because they used up all their cache...",
|
|
287900
|
+
"What can you do with a broken pencil? Nothing, it's pointless...",
|
|
287901
|
+
"Applying percussive maintenance...",
|
|
287902
|
+
"Searching for the correct USB orientation...",
|
|
287903
|
+
"Ensuring the magic smoke stays inside the wires...",
|
|
287904
|
+
"Rewriting in Rust for no particular reason...",
|
|
287905
|
+
"Trying to exit Vim...",
|
|
287906
|
+
"Spinning up the hamster wheel...",
|
|
287907
|
+
"That's not a bug, it's an undocumented feature...",
|
|
287908
|
+
"Engage.",
|
|
287909
|
+
"I'll be back... with an answer.",
|
|
287910
|
+
"My other process is a TARDIS...",
|
|
287911
|
+
"Communing with the machine spirit...",
|
|
287912
|
+
"Letting the thoughts marinate...",
|
|
287913
|
+
"Just remembered where I put my keys...",
|
|
287914
|
+
"Pondering the orb...",
|
|
287915
|
+
"I've seen things you people wouldn't believe... like a user who reads loading messages.",
|
|
287916
|
+
"Initiating thoughtful gaze...",
|
|
287917
|
+
"What's a computer's favorite snack? Microchips.",
|
|
287918
|
+
"Why do Java developers wear glasses? Because they don't C#.",
|
|
287919
|
+
"Charging the laser... pew pew!",
|
|
287920
|
+
"Dividing by zero... just kidding!",
|
|
287921
|
+
"Looking for an adult superviso... I mean, processing.",
|
|
287922
|
+
"Making it go beep boop.",
|
|
287923
|
+
"Buffering... because even AIs need a moment.",
|
|
287924
|
+
"Entangling quantum particles for a faster response...",
|
|
287925
|
+
"Polishing the chrome... on the algorithms.",
|
|
287926
|
+
"Are you not entertained? (Working on it!)",
|
|
287927
|
+
"Summoning the code gremlins... to help, of course.",
|
|
287928
|
+
"Just waiting for the dial-up tone to finish...",
|
|
287929
|
+
"Recalibrating the humor-o-meter.",
|
|
287930
|
+
"My other loading screen is even funnier.",
|
|
287931
|
+
"Pretty sure there's a cat walking on the keyboard somewhere...",
|
|
287932
|
+
"Enhancing... Enhancing... Still loading.",
|
|
287933
|
+
"It's not a bug, it's a feature... of this loading screen.",
|
|
287934
|
+
"Have you tried turning it off and on again? (The loading screen, not me.)",
|
|
287935
|
+
"Constructing additional pylons..."
|
|
287936
|
+
]
|
|
287910
287937
|
};
|
|
287911
287938
|
}
|
|
287912
287939
|
});
|
|
@@ -287998,7 +288025,7 @@ var init_ru = __esm({
|
|
|
287998
288025
|
"Theme configuration unavailable due to NO_COLOR env variable.": "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 \u0442\u0435\u043C\u044B \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0438\u0437-\u0437\u0430 \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u043E\u0439 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F NO_COLOR.",
|
|
287999
288026
|
'Theme "{{themeName}}" not found.': '\u0422\u0435\u043C\u0430 "{{themeName}}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430.',
|
|
288000
288027
|
'Theme "{{themeName}}" not found in selected scope.': '\u0422\u0435\u043C\u0430 "{{themeName}}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\u043D\u043E\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438.',
|
|
288001
|
-
"
|
|
288028
|
+
"Clear conversation history and free up context": "\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0434\u0438\u0430\u043B\u043E\u0433\u0430 \u0438 \u043E\u0441\u0432\u043E\u0431\u043E\u0434\u0438\u0442\u044C \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442",
|
|
288002
288029
|
"Compresses the context by replacing it with a summary.": "\u0421\u0436\u0430\u0442\u0438\u0435 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u0437\u0430\u043C\u0435\u043D\u043E\u0439 \u043D\u0430 \u043A\u0440\u0430\u0442\u043A\u0443\u044E \u0441\u0432\u043E\u0434\u043A\u0443",
|
|
288003
288030
|
"open full Qwen Code documentation in your browser": "\u041E\u0442\u043A\u0440\u044B\u0442\u0438\u0435 \u043F\u043E\u043B\u043D\u043E\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438 Qwen Code \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435",
|
|
288004
288031
|
"Configuration not available.": "\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430.",
|
|
@@ -288118,6 +288145,7 @@ var init_ru = __esm({
|
|
|
288118
288145
|
"(Use Enter to select{{tabText}})": "(Enter \u0434\u043B\u044F \u0432\u044B\u0431\u043E\u0440\u0430{{tabText}})",
|
|
288119
288146
|
", Tab to change focus": ", Tab \u0434\u043B\u044F \u0441\u043C\u0435\u043D\u044B \u0444\u043E\u043A\u0443\u0441\u0430",
|
|
288120
288147
|
"To see changes, Qwen Code must be restarted. Press r to exit and apply changes now.": "\u0414\u043B\u044F \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C Qwen Code. \u041D\u0430\u0436\u043C\u0438\u0442\u0435 r \u0434\u043B\u044F \u0432\u044B\u0445\u043E\u0434\u0430 \u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439.",
|
|
288148
|
+
'The command "/{{command}}" is not supported in non-interactive mode.': '\u041A\u043E\u043C\u0430\u043D\u0434\u0430 "/{{command}}" \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u043D\u0435\u0438\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u0440\u0435\u0436\u0438\u043C\u0435.',
|
|
288121
288149
|
// ============================================================================
|
|
288122
288150
|
// Метки настроек
|
|
288123
288151
|
// ============================================================================
|
|
@@ -288169,6 +288197,7 @@ var init_ru = __esm({
|
|
|
288169
288197
|
"Tool Output Truncation Lines": "\u041B\u0438\u043C\u0438\u0442 \u0441\u0442\u0440\u043E\u043A \u0432\u044B\u0432\u043E\u0434\u0430 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432",
|
|
288170
288198
|
"Folder Trust": "\u0414\u043E\u0432\u0435\u0440\u0438\u0435 \u043A \u043F\u0430\u043F\u043A\u0435",
|
|
288171
288199
|
"Vision Model Preview": "\u0412\u0438\u0437\u0443\u0430\u043B\u044C\u043D\u0430\u044F \u043C\u043E\u0434\u0435\u043B\u044C (\u043F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440)",
|
|
288200
|
+
"Tool Schema Compliance": "\u0421\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0445\u0435\u043C\u0435 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0430",
|
|
288172
288201
|
// Варианты перечислений настроек
|
|
288173
288202
|
"Auto (detect from system)": "\u0410\u0432\u0442\u043E (\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043C\u044B)",
|
|
288174
288203
|
Text: "\u0422\u0435\u043A\u0441\u0442",
|
|
@@ -288189,7 +288218,7 @@ var init_ru = __esm({
|
|
|
288189
288218
|
"set external editor preference": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0438\u0442\u0430\u0435\u043C\u043E\u0433\u043E \u0432\u043D\u0435\u0448\u043D\u0435\u0433\u043E \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430",
|
|
288190
288219
|
"Manage extensions": "\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F\u043C\u0438",
|
|
288191
288220
|
"List active extensions": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F",
|
|
288192
|
-
"Update extensions. Usage: update
|
|
288221
|
+
"Update extensions. Usage: update <extension-names>|--all": "\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u044F. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: update <extension-names>|--all",
|
|
288193
288222
|
"manage IDE integration": "\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u0441 IDE",
|
|
288194
288223
|
"check status of IDE integration": "\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0441\u0442\u0430\u0442\u0443\u0441 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 IDE",
|
|
288195
288224
|
"install required IDE companion for {{ideName}}": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u044B\u0439 \u043A\u043E\u043C\u043F\u0430\u043D\u044C\u043E\u043D IDE \u0434\u043B\u044F {{ideName}}",
|
|
@@ -288227,7 +288256,7 @@ var init_ru = __esm({
|
|
|
288227
288256
|
"Set UI language": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u044F\u0437\u044B\u043A\u0430 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430",
|
|
288228
288257
|
"Set LLM output language": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430 \u044F\u0437\u044B\u043A\u0430 \u0432\u044B\u0432\u043E\u0434\u0430 LLM",
|
|
288229
288258
|
"Usage: /language ui [zh-CN|en-US]": "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: /language ui [zh-CN|en-US|ru-RU]",
|
|
288230
|
-
"Usage: /language output ": "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: /language output ",
|
|
288259
|
+
"Usage: /language output <language>": "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: /language output <language>",
|
|
288231
288260
|
"Example: /language output \u4E2D\u6587": "\u041F\u0440\u0438\u043C\u0435\u0440: /language output \u4E2D\u6587",
|
|
288232
288261
|
"Example: /language output English": "\u041F\u0440\u0438\u043C\u0435\u0440: /language output English",
|
|
288233
288262
|
"Example: /language output \u65E5\u672C\u8A9E": "\u041F\u0440\u0438\u043C\u0435\u0440: /language output \u65E5\u672C\u8A9E",
|
|
@@ -288239,9 +288268,8 @@ var init_ru = __esm({
|
|
|
288239
288268
|
"Available subcommands:": "\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u043F\u043E\u0434\u043A\u043E\u043C\u0430\u043D\u0434\u044B:",
|
|
288240
288269
|
"To request additional UI language packs, please open an issue on GitHub.": "\u0414\u043B\u044F \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u044F\u0437\u044B\u043A\u043E\u0432\u044B\u0445 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u043E\u0431\u0440\u0430\u0449\u0435\u043D\u0438\u0435 \u043D\u0430 GitHub.",
|
|
288241
288270
|
"Available options:": "\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B:",
|
|
288242
|
-
"
|
|
288243
|
-
"
|
|
288244
|
-
" - ru-RU: Russian": " - ru-RU: \u0420\u0443\u0441\u0441\u043A\u0438\u0439",
|
|
288271
|
+
" - zh-CN: Simplified Chinese": " - zh-CN: \u0423\u043F\u0440\u043E\u0449\u0435\u043D\u043D\u044B\u0439 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u0439",
|
|
288272
|
+
" - en-US: English": " - en-US: \u0410\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u0439",
|
|
288245
288273
|
"Set UI language to Simplified Chinese (zh-CN)": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u044F\u0437\u044B\u043A \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043D\u0430 \u0443\u043F\u0440\u043E\u0449\u0435\u043D\u043D\u044B\u0439 \u043A\u0438\u0442\u0430\u0439\u0441\u043A\u0438\u0439 (zh-CN)",
|
|
288246
288274
|
"Set UI language to English (en-US)": "\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u044F\u0437\u044B\u043A \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043D\u0430 \u0430\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u0439 (en-US)",
|
|
288247
288275
|
// ============================================================================
|
|
@@ -288252,7 +288280,7 @@ var init_ru = __esm({
|
|
|
288252
288280
|
"Available approval modes:": "\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0435\u0436\u0438\u043C\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F:",
|
|
288253
288281
|
"Approval mode changed to: {{mode}}": "\u0420\u0435\u0436\u0438\u043C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430: {{mode}}",
|
|
288254
288282
|
"Approval mode changed to: {{mode}} (saved to {{scope}} settings{{location}})": "\u0420\u0435\u0436\u0438\u043C \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0438\u0437\u043C\u0435\u043D\u0435\u043D \u043D\u0430: {{mode}} (\u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043E \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 {{scope}}{{location}})",
|
|
288255
|
-
"Usage: /approval-mode [--session|--user|--project]": "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: /approval-mode [--session|--user|--project]",
|
|
288283
|
+
"Usage: /approval-mode <mode> [--session|--user|--project]": "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: /approval-mode <mode> [--session|--user|--project]",
|
|
288256
288284
|
"Scope subcommands do not accept additional arguments.": "\u041F\u043E\u0434\u043A\u043E\u043C\u0430\u043D\u0434\u044B \u043E\u0431\u043B\u0430\u0441\u0442\u0438 \u043D\u0435 \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u044E\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u043E\u0432.",
|
|
288257
288285
|
"Plan mode - Analyze only, do not modify files or execute commands": "\u0420\u0435\u0436\u0438\u043C \u043F\u043B\u0430\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F - \u0442\u043E\u043B\u044C\u043A\u043E \u0430\u043D\u0430\u043B\u0438\u0437, \u0431\u0435\u0437 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0444\u0430\u0439\u043B\u043E\u0432 \u0438\u043B\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u043E\u043C\u0430\u043D\u0434",
|
|
288258
288286
|
"Default mode - Require approval for file edits or shell commands": "\u0420\u0435\u0436\u0438\u043C \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E - \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0444\u0430\u0439\u043B\u043E\u0432 \u0438\u043B\u0438 \u043A\u043E\u043C\u0430\u043D\u0434 \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430",
|
|
@@ -288341,7 +288369,7 @@ var init_ru = __esm({
|
|
|
288341
288369
|
"Error sharing conversation: {{error}}": "\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0435 \u0434\u0438\u0430\u043B\u043E\u0433\u0430: {{error}}",
|
|
288342
288370
|
"Conversation shared to {{filePath}}": "\u0414\u0438\u0430\u043B\u043E\u0433 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D \u0432 {{filePath}}",
|
|
288343
288371
|
"No conversation found to share.": "\u041D\u0435\u0442 \u0434\u0438\u0430\u043B\u043E\u0433\u0430 \u0434\u043B\u044F \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0430.",
|
|
288344
|
-
"Share the current conversation to a markdown or json file. Usage: /chat share
|
|
288372
|
+
"Share the current conversation to a markdown or json file. Usage: /chat share <file>": "\u042D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0434\u0438\u0430\u043B\u043E\u0433 \u0432 markdown \u0438\u043B\u0438 json \u0444\u0430\u0439\u043B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435: /chat share <\u0444\u0430\u0439\u043B>",
|
|
288345
288373
|
// ============================================================================
|
|
288346
288374
|
// Команды - Резюме
|
|
288347
288375
|
// ============================================================================
|
|
@@ -288350,6 +288378,10 @@ var init_ru = __esm({
|
|
|
288350
288378
|
"Already generating summary, wait for previous request to complete": "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0441\u0432\u043E\u0434\u043A\u0438 \u0443\u0436\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F, \u0434\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0433\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0430",
|
|
288351
288379
|
"No conversation found to summarize.": "\u041D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u0434\u0438\u0430\u043B\u043E\u0433\u043E\u0432 \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0441\u0432\u043E\u0434\u043A\u0438.",
|
|
288352
288380
|
"Failed to generate project context summary: {{error}}": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0432\u043E\u0434\u043A\u0443 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430: {{error}}",
|
|
288381
|
+
"Saved project summary to {{filePathForDisplay}}.": "\u0421\u0432\u043E\u0434\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u0432 {{filePathForDisplay}}",
|
|
288382
|
+
"Saving project summary...": "\u0421\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0441\u0432\u043E\u0434\u043A\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430...",
|
|
288383
|
+
"Generating project summary...": "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0441\u0432\u043E\u0434\u043A\u0438 \u043F\u0440\u043E\u0435\u043A\u0442\u0430...",
|
|
288384
|
+
"Failed to generate summary - no text content received from LLM response": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u0432\u043E\u0434\u043A\u0443 - \u043D\u0435 \u043F\u043E\u043B\u0443\u0447\u0435\u043D \u0442\u0435\u043A\u0441\u0442\u043E\u0432\u044B\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442 \u0438\u0437 \u043E\u0442\u0432\u0435\u0442\u0430 LLM",
|
|
288353
288385
|
// ============================================================================
|
|
288354
288386
|
// Команды - Модель
|
|
288355
288387
|
// ============================================================================
|
|
@@ -288360,8 +288392,8 @@ var init_ru = __esm({
|
|
|
288360
288392
|
// ============================================================================
|
|
288361
288393
|
// Команды - Очистка
|
|
288362
288394
|
// ============================================================================
|
|
288363
|
-
"
|
|
288364
|
-
"
|
|
288395
|
+
"Starting a new session, resetting chat, and clearing terminal.": "\u041D\u0430\u0447\u0430\u043B\u043E \u043D\u043E\u0432\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438, \u0441\u0431\u0440\u043E\u0441 \u0447\u0430\u0442\u0430 \u0438 \u043E\u0447\u0438\u0441\u0442\u043A\u0430 \u0442\u0435\u0440\u043C\u0438\u043D\u0430\u043B\u0430.",
|
|
288396
|
+
"Starting a new session and clearing.": "\u041D\u0430\u0447\u0430\u043B\u043E \u043D\u043E\u0432\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u043E\u0447\u0438\u0441\u0442\u043A\u0430.",
|
|
288365
288397
|
// ============================================================================
|
|
288366
288398
|
// Команды - Сжатие
|
|
288367
288399
|
// ============================================================================
|
|
@@ -288381,7 +288413,7 @@ var init_ru = __esm({
|
|
|
288381
288413
|
"Please provide at least one path to add.": "\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0443\u043A\u0430\u0436\u0438\u0442\u0435 \u0445\u043E\u0442\u044F \u0431\u044B \u043E\u0434\u0438\u043D \u043F\u0443\u0442\u044C \u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F.",
|
|
288382
288414
|
"The /directory add command is not supported in restrictive sandbox profiles. Please use --include-directories when starting the session instead.": "\u041A\u043E\u043C\u0430\u043D\u0434\u0430 /directory add \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F \u0432 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0440\u043E\u0444\u0438\u043B\u044F\u0445 \u043F\u0435\u0441\u043E\u0447\u043D\u0438\u0446\u044B. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 --include-directories \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 \u0441\u0435\u0441\u0441\u0438\u0438.",
|
|
288383
288415
|
"Error adding '{{path}}': {{error}}": "\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0438 '{{path}}': {{error}}",
|
|
288384
|
-
"Successfully added
|
|
288416
|
+
"Successfully added QWEN.md files from the following directories if there are:\n- {{directories}}": "\u0423\u0441\u043F\u0435\u0448\u043D\u043E \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0444\u0430\u0439\u043B\u044B QWEN.md \u0438\u0437 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0445 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0439 (\u0435\u0441\u043B\u0438 \u043E\u043D\u0438 \u0435\u0441\u0442\u044C):\n- {{directories}}",
|
|
288385
288417
|
"Error refreshing memory: {{error}}": "\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0438 \u043F\u0430\u043C\u044F\u0442\u0438: {{error}}",
|
|
288386
288418
|
"Successfully added directories:\n- {{directories}}": "\u0423\u0441\u043F\u0435\u0448\u043D\u043E \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438:\n- {{directories}}",
|
|
288387
288419
|
"Current workspace directories:\n{{directories}}": "\u0422\u0435\u043A\u0443\u0449\u0438\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438 \u0440\u0430\u0431\u043E\u0447\u0435\u0433\u043E \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u0430:\n{{directories}}",
|
|
@@ -288553,6 +288585,7 @@ var init_ru = __esm({
|
|
|
288553
288585
|
// Экран выхода / Статистика
|
|
288554
288586
|
// ============================================================================
|
|
288555
288587
|
"Agent powering down. Goodbye!": "\u0410\u0433\u0435\u043D\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043E\u0442\u0443. \u0414\u043E \u0441\u0432\u0438\u0434\u0430\u043D\u0438\u044F!",
|
|
288588
|
+
"To continue this session, run": "\u0414\u043B\u044F \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0439 \u0441\u0435\u0441\u0441\u0438\u0438, \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u0435",
|
|
288556
288589
|
"Interaction Summary": "\u0421\u0432\u043E\u0434\u043A\u0430 \u0432\u0437\u0430\u0438\u043C\u043E\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F",
|
|
288557
288590
|
"Session ID:": "ID \u0441\u0435\u0441\u0441\u0438\u0438:",
|
|
288558
288591
|
"Tool Calls:": "\u0412\u044B\u0437\u043E\u0432\u044B \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432:",
|
|
@@ -288605,134 +288638,140 @@ var init_ru = __esm({
|
|
|
288605
288638
|
// ============================================================================
|
|
288606
288639
|
"Waiting for user confirmation...": "\u041E\u0436\u0438\u0434\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u043E\u0442 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F...",
|
|
288607
288640
|
"(esc to cancel, {{time}})": "(esc \u0434\u043B\u044F \u043E\u0442\u043C\u0435\u043D\u044B, {{time}})",
|
|
288608
|
-
|
|
288609
|
-
|
|
288610
|
-
|
|
288611
|
-
|
|
288612
|
-
|
|
288613
|
-
|
|
288614
|
-
|
|
288615
|
-
|
|
288616
|
-
|
|
288617
|
-
|
|
288618
|
-
|
|
288619
|
-
|
|
288620
|
-
|
|
288621
|
-
|
|
288622
|
-
|
|
288623
|
-
|
|
288624
|
-
|
|
288625
|
-
|
|
288626
|
-
|
|
288627
|
-
|
|
288628
|
-
|
|
288629
|
-
|
|
288630
|
-
|
|
288631
|
-
|
|
288632
|
-
|
|
288633
|
-
|
|
288634
|
-
|
|
288635
|
-
|
|
288636
|
-
|
|
288637
|
-
|
|
288638
|
-
|
|
288639
|
-
|
|
288640
|
-
|
|
288641
|
-
|
|
288642
|
-
|
|
288643
|
-
|
|
288644
|
-
|
|
288645
|
-
|
|
288646
|
-
|
|
288647
|
-
|
|
288648
|
-
|
|
288649
|
-
|
|
288650
|
-
|
|
288651
|
-
|
|
288652
|
-
|
|
288653
|
-
|
|
288654
|
-
|
|
288655
|
-
|
|
288656
|
-
|
|
288657
|
-
|
|
288658
|
-
|
|
288659
|
-
|
|
288660
|
-
|
|
288661
|
-
|
|
288662
|
-
|
|
288663
|
-
|
|
288664
|
-
|
|
288665
|
-
|
|
288666
|
-
|
|
288667
|
-
|
|
288668
|
-
|
|
288669
|
-
|
|
288670
|
-
|
|
288671
|
-
|
|
288672
|
-
|
|
288673
|
-
|
|
288674
|
-
|
|
288675
|
-
|
|
288676
|
-
|
|
288677
|
-
|
|
288678
|
-
|
|
288679
|
-
|
|
288680
|
-
|
|
288681
|
-
|
|
288682
|
-
|
|
288683
|
-
|
|
288684
|
-
|
|
288685
|
-
|
|
288686
|
-
|
|
288687
|
-
|
|
288688
|
-
|
|
288689
|
-
|
|
288690
|
-
|
|
288691
|
-
|
|
288692
|
-
|
|
288693
|
-
|
|
288694
|
-
|
|
288695
|
-
|
|
288696
|
-
|
|
288697
|
-
|
|
288698
|
-
|
|
288699
|
-
|
|
288700
|
-
|
|
288701
|
-
|
|
288702
|
-
|
|
288703
|
-
|
|
288704
|
-
|
|
288705
|
-
|
|
288706
|
-
|
|
288707
|
-
|
|
288708
|
-
|
|
288709
|
-
|
|
288710
|
-
|
|
288711
|
-
|
|
288712
|
-
|
|
288713
|
-
|
|
288714
|
-
|
|
288715
|
-
|
|
288716
|
-
|
|
288717
|
-
|
|
288718
|
-
|
|
288719
|
-
|
|
288720
|
-
|
|
288721
|
-
|
|
288722
|
-
|
|
288723
|
-
|
|
288724
|
-
|
|
288725
|
-
|
|
288726
|
-
|
|
288727
|
-
|
|
288728
|
-
|
|
288729
|
-
|
|
288730
|
-
|
|
288731
|
-
|
|
288732
|
-
|
|
288733
|
-
|
|
288734
|
-
|
|
288735
|
-
|
|
288641
|
+
// ============================================================================
|
|
288642
|
+
// ============================================================================
|
|
288643
|
+
// Loading Phrases
|
|
288644
|
+
// ============================================================================
|
|
288645
|
+
WITTY_LOADING_PHRASES: [
|
|
288646
|
+
"\u041C\u043D\u0435 \u043F\u043E\u0432\u0435\u0437\u0451\u0442!",
|
|
288647
|
+
"\u0414\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u043C \u043A\u0440\u0443\u0442\u0438\u0437\u043D\u0443... ",
|
|
288648
|
+
"\u0420\u0438\u0441\u0443\u0435\u043C \u0437\u0430\u0441\u0435\u0447\u043A\u0438 \u043D\u0430 \u0431\u0443\u043A\u0432\u0430\u0445...",
|
|
288649
|
+
"\u041F\u0440\u043E\u0431\u0438\u0440\u0430\u0435\u043C\u0441\u044F \u0447\u0435\u0440\u0435\u0437 \u0441\u043B\u0438\u0437\u0435\u0432\u0438\u043A\u043E\u0432..",
|
|
288650
|
+
"\u0421\u043E\u0432\u0435\u0442\u0443\u0435\u043C\u0441\u044F \u0441 \u0446\u0438\u0444\u0440\u043E\u0432\u044B\u043C\u0438 \u0434\u0443\u0445\u0430\u043C\u0438...",
|
|
288651
|
+
"\u0421\u0433\u043B\u0430\u0436\u0438\u0432\u0430\u043D\u0438\u0435 \u0441\u043F\u043B\u0430\u0439\u043D\u043E\u0432...",
|
|
288652
|
+
"\u0420\u0430\u0437\u043E\u0433\u0440\u0435\u0432\u0430\u0435\u043C \u0418\u0418-\u0445\u043E\u043C\u044F\u0447\u043A\u043E\u0432...",
|
|
288653
|
+
"\u0421\u043F\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043C \u0432\u043E\u043B\u0448\u0435\u0431\u043D\u0443\u044E \u0440\u0430\u043A\u0443\u0448\u043A\u0443...",
|
|
288654
|
+
"\u0413\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0435\u043C \u043E\u0441\u0442\u0440\u043E\u0443\u043C\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442...",
|
|
288655
|
+
"\u041F\u043E\u043B\u0438\u0440\u0443\u0435\u043C \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u044B...",
|
|
288656
|
+
"\u041D\u0435 \u0442\u043E\u0440\u043E\u043F\u0438\u0442\u0435 \u0441\u043E\u0432\u0435\u0440\u0448\u0435\u043D\u0441\u0442\u0432\u043E (\u0438\u043B\u0438 \u043C\u043E\u0439 \u043A\u043E\u0434)...",
|
|
288657
|
+
"\u0417\u0430\u0432\u0430\u0440\u0438\u0432\u0430\u0435\u043C \u0441\u0432\u0435\u0436\u0438\u0435 \u0431\u0430\u0439\u0442\u044B...",
|
|
288658
|
+
"\u041F\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u043C \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u044B...",
|
|
288659
|
+
"\u0417\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043C \u043A\u043E\u0433\u043D\u0438\u0442\u0438\u0432\u043D\u044B\u0435 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u043E\u0440\u044B...",
|
|
288660
|
+
"\u0418\u0449\u0435\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043E\u0448\u0438\u0431\u043A\u0438 \u0432\u043E \u0432\u0441\u0435\u043B\u0435\u043D\u043D\u043E\u0439...",
|
|
288661
|
+
"\u0421\u0435\u043A\u0443\u043D\u0434\u043E\u0447\u043A\u0443, \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u0443\u0435\u043C \u044E\u043C\u043E\u0440...",
|
|
288662
|
+
"\u041F\u0435\u0440\u0435\u0442\u0430\u0441\u043E\u0432\u044B\u0432\u0430\u0435\u043C \u043F\u0430\u043D\u0447\u043B\u0430\u0439\u043D\u044B...",
|
|
288663
|
+
"\u0420\u0430\u0441\u043F\u0443\u0442\u0430\u0432\u0430\u0435\u043C \u043D\u0435\u0439\u0440\u043E\u0441\u0435\u0442\u0438...",
|
|
288664
|
+
"\u041A\u043E\u043C\u043F\u0438\u043B\u0438\u0440\u0443\u0435\u043C \u0433\u0435\u043D\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u044C...",
|
|
288665
|
+
"\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043C yumor.exe...",
|
|
288666
|
+
"\u041F\u0440\u0438\u0437\u044B\u0432\u0430\u0435\u043C \u043E\u0431\u043B\u0430\u043A\u043E \u043C\u0443\u0434\u0440\u043E\u0441\u0442\u0438...",
|
|
288667
|
+
"\u0413\u043E\u0442\u043E\u0432\u0438\u043C \u043E\u0441\u0442\u0440\u043E\u0443\u043C\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442...",
|
|
288668
|
+
"\u0421\u0435\u043A\u0443\u043D\u0434\u0443, \u0438\u0434\u0451\u0442 \u043E\u0442\u043B\u0430\u0434\u043A\u0430 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438...",
|
|
288669
|
+
"\u0417\u0430\u043F\u0443\u0442\u044B\u0432\u0430\u0435\u043C \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u044B...",
|
|
288670
|
+
"\u041D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043C \u043A\u043E\u0441\u043C\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u0447\u0430\u0441\u0442\u043E\u0442\u044B...",
|
|
288671
|
+
"\u0421\u043E\u0437\u0434\u0430\u0435\u043C \u043E\u0442\u0432\u0435\u0442, \u0434\u043E\u0441\u0442\u043E\u0439\u043D\u044B\u0439 \u0432\u0430\u0448\u0435\u0433\u043E \u0442\u0435\u0440\u043F\u0435\u043D\u0438\u044F...",
|
|
288672
|
+
"\u041A\u043E\u043C\u043F\u0438\u043B\u0438\u0440\u0443\u0435\u043C \u0435\u0434\u0438\u043D\u0438\u0447\u043A\u0438 \u0438 \u043D\u043E\u043B\u0438\u043A\u0438...",
|
|
288673
|
+
"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043C \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438... \u0438 \u044D\u043A\u0437\u0438\u0441\u0442\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u044B\u0435 \u043A\u0440\u0438\u0437\u0438\u0441\u044B...",
|
|
288674
|
+
"\u0414\u0435\u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044F \u043F\u0430\u043C\u044F\u0442\u0438... \u0438 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u043E\u0439, \u0438 \u043B\u0438\u0447\u043D\u043E\u0439...",
|
|
288675
|
+
"\u041F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0443\u043B\u044F \u044E\u043C\u043E\u0440\u0430...",
|
|
288676
|
+
"\u041A\u044D\u0448\u0438\u0440\u0443\u0435\u043C \u0441\u0430\u043C\u043E\u0435 \u0432\u0430\u0436\u043D\u043E\u0435 (\u0432 \u043E\u0441\u043D\u043E\u0432\u043D\u043E\u043C \u043C\u0435\u043C\u044B \u0441 \u043A\u043E\u0442\u0438\u043A\u0430\u043C\u0438)...",
|
|
288677
|
+
"\u041E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u044F \u0434\u043B\u044F \u0431\u0435\u0437\u0443\u043C\u043D\u043E\u0439 \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438",
|
|
288678
|
+
"\u041C\u0435\u043D\u044F\u0435\u043C \u0431\u0438\u0442\u044B... \u0442\u043E\u043B\u044C\u043A\u043E \u0431\u0430\u0439\u0442\u0430\u043C \u043D\u0435 \u0433\u043E\u0432\u043E\u0440\u0438\u0442\u0435...",
|
|
288679
|
+
"\u0421\u0431\u043E\u0440\u043A\u0430 \u043C\u0443\u0441\u043E\u0440\u0430... \u0441\u043A\u043E\u0440\u043E \u0432\u0435\u0440\u043D\u0443\u0441\u044C...",
|
|
288680
|
+
"\u0421\u0431\u043E\u0440\u043A\u0430 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u043E\u0432...",
|
|
288681
|
+
"\u041F\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043C \u043A\u043E\u0444\u0435 \u0432 \u043A\u043E\u0434...",
|
|
288682
|
+
"\u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u0438...",
|
|
288683
|
+
"\u041F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0430\u0435\u043C \u0441\u0438\u043D\u0430\u043F\u0441\u044B...",
|
|
288684
|
+
"\u0418\u0449\u0435\u043C \u043B\u0438\u0448\u043D\u044E\u044E \u0442\u043E\u0447\u043A\u0443 \u0441 \u0437\u0430\u043F\u044F\u0442\u043E\u0439...",
|
|
288685
|
+
"\u0421\u043C\u0430\u0437\u044B\u0432\u0430\u0435\u043C \u0448\u0435\u0441\u0442\u0435\u0440\u0451\u043D\u043A\u0438 \u043C\u0430\u0448\u0438\u043D\u044B...",
|
|
288686
|
+
"\u0420\u0430\u0437\u043E\u0433\u0440\u0435\u0432\u0430\u0435\u043C \u0441\u0435\u0440\u0432\u0435\u0440\u044B...",
|
|
288687
|
+
"\u041A\u0430\u043B\u0438\u0431\u0440\u0443\u0435\u043C \u043F\u043E\u0442\u043E\u043A\u043E\u0432\u044B\u0439 \u043D\u0430\u043A\u043E\u043F\u0438\u0442\u0435\u043B\u044C...",
|
|
288688
|
+
"\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u043C \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043B\u044C \u043D\u0435\u0432\u0435\u0440\u043E\u044F\u0442\u043D\u043E\u0441\u0442\u0438...",
|
|
288689
|
+
"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u043C \u0421\u0438\u043B\u0443...",
|
|
288690
|
+
"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u0435\u043C \u0437\u0432\u0451\u0437\u0434\u044B \u0434\u043B\u044F \u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u043E\u0442\u0432\u0435\u0442\u0430...",
|
|
288691
|
+
"\u0422\u0430\u043A \u0441\u043A\u0430\u0436\u0435\u043C \u043C\u044B \u0432\u0441\u0435...",
|
|
288692
|
+
"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0439 \u0432\u0435\u043B\u0438\u043A\u043E\u0439 \u0438\u0434\u0435\u0438...",
|
|
288693
|
+
"\u041C\u0438\u043D\u0443\u0442\u043A\u0443, \u044F \u0432 \u043F\u043E\u0442\u043E\u043A\u0435...",
|
|
288694
|
+
"\u0413\u043E\u0442\u043E\u0432\u043B\u044E\u0441\u044C \u043E\u0441\u043B\u0435\u043F\u0438\u0442\u044C \u0432\u0430\u0441 \u0433\u0435\u043D\u0438\u0430\u043B\u044C\u043D\u043E\u0441\u0442\u044C\u044E...",
|
|
288695
|
+
"\u0421\u0435\u043A\u0443\u043D\u0434\u0443, \u043F\u043E\u043B\u0438\u0440\u0443\u044E \u043E\u0441\u0442\u0440\u043E\u0443\u043C\u0438\u0435...",
|
|
288696
|
+
"\u0414\u0435\u0440\u0436\u0438\u0442\u0435\u0441\u044C, \u0441\u043E\u0437\u0434\u0430\u044E \u0448\u0435\u0434\u0435\u0432\u0440...",
|
|
288697
|
+
"\u041C\u0438\u0433\u043E\u043C, \u043E\u0442\u043B\u0430\u0436\u0438\u0432\u0430\u044E \u0432\u0441\u0435\u043B\u0435\u043D\u043D\u0443\u044E...",
|
|
288698
|
+
"\u041C\u043E\u043C\u0435\u043D\u0442, \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u044E \u043F\u0438\u043A\u0441\u0435\u043B\u0438...",
|
|
288699
|
+
"\u0421\u0435\u043A\u0443\u043D\u0434\u0443, \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u0443\u044E \u044E\u043C\u043E\u0440...",
|
|
288700
|
+
"\u041C\u043E\u043C\u0435\u043D\u0442, \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044E \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u044B...",
|
|
288701
|
+
"\u0412\u0430\u0440\u043F-\u043F\u0440\u044B\u0436\u043E\u043A \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u043E\u0432\u0430\u043D...",
|
|
288702
|
+
"\u0414\u043E\u0431\u044B\u0432\u0430\u0435\u043C \u043A\u0440\u0438\u0441\u0442\u0430\u043B\u043B\u044B \u0434\u0438\u043B\u0438\u0442\u0438\u044F...",
|
|
288703
|
+
"\u0411\u0435\u0437 \u043F\u0430\u043D\u0438\u043A\u0438...",
|
|
288704
|
+
"\u0421\u043B\u0435\u0434\u0443\u0435\u043C \u0437\u0430 \u0431\u0435\u043B\u044B\u043C \u043A\u0440\u043E\u043B\u0438\u043A\u043E\u043C...",
|
|
288705
|
+
"\u0418\u0441\u0442\u0438\u043D\u0430 \u0433\u0434\u0435-\u0442\u043E \u0437\u0434\u0435\u0441\u044C... \u0432\u043D\u0443\u0442\u0440\u0438...",
|
|
288706
|
+
"\u041F\u0440\u043E\u0434\u0443\u0432\u0430\u0435\u043C \u043A\u0430\u0440\u0442\u0440\u0438\u0434\u0436...",
|
|
288707
|
+
"\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430... \u0421\u0434\u0435\u043B\u0430\u0439 \u0431\u043E\u0447\u043A\u0443!",
|
|
288708
|
+
"\u0416\u0434\u0435\u043C \u0440\u0435\u0441\u043F\u0430\u0443\u043D\u0430...",
|
|
288709
|
+
"\u0414\u0435\u043B\u0430\u0435\u043C \u0414\u0443\u0433\u0443 \u041A\u0435\u0441\u0441\u0435\u043B\u044F \u043C\u0435\u043D\u0435\u0435 \u0447\u0435\u043C \u0437\u0430 12 \u043F\u0430\u0440\u0441\u0435\u043A\u043E\u0432...",
|
|
288710
|
+
"\u0422\u043E\u0440\u0442\u0438\u043A \u2014 \u043D\u0435 \u043B\u043E\u0436\u044C, \u043E\u043D \u043F\u0440\u043E\u0441\u0442\u043E \u0435\u0449\u0451 \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044F...",
|
|
288711
|
+
"\u0412\u043E\u0437\u0438\u043C\u0441\u044F \u0441 \u044D\u043A\u0440\u0430\u043D\u043E\u043C \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u0436\u0430...",
|
|
288712
|
+
"\u041C\u0438\u043D\u0443\u0442\u043A\u0443, \u0438\u0449\u0443 \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u043C\u0435\u043C...",
|
|
288713
|
+
"\u041D\u0430\u0436\u0438\u043C\u0430\u0435\u043C 'A' \u0434\u043B\u044F \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u044F...",
|
|
288714
|
+
"\u041F\u0430\u0441\u0451\u043C \u0446\u0438\u0444\u0440\u043E\u0432\u044B\u0445 \u043A\u043E\u0442\u043E\u0432...",
|
|
288715
|
+
"\u041F\u043E\u043B\u0438\u0440\u0443\u0435\u043C \u043F\u0438\u043A\u0441\u0435\u043B\u0438...",
|
|
288716
|
+
"\u0418\u0449\u0435\u043C \u043F\u043E\u0434\u0445\u043E\u0434\u044F\u0449\u0438\u0439 \u043A\u0430\u043B\u0430\u043C\u0431\u0443\u0440 \u0434\u043B\u044F \u044D\u043A\u0440\u0430\u043D\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438...",
|
|
288717
|
+
"\u041E\u0442\u0432\u043B\u0435\u043A\u0430\u0435\u043C \u0432\u0430\u0441 \u044D\u0442\u043E\u0439 \u043E\u0441\u0442\u0440\u043E\u0443\u043C\u043D\u043E\u0439 \u0444\u0440\u0430\u0437\u043E\u0439...",
|
|
288718
|
+
"\u041F\u043E\u0447\u0442\u0438 \u0433\u043E\u0442\u043E\u0432\u043E... \u0432\u0440\u043E\u0434\u0435...",
|
|
288719
|
+
"\u041D\u0430\u0448\u0438 \u0445\u043E\u043C\u044F\u0447\u043A\u0438 \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u0438\u0437\u043E \u0432\u0441\u0435\u0445 \u0441\u0438\u043B...",
|
|
288720
|
+
"\u0413\u043B\u0430\u0434\u0438\u043C \u041E\u0431\u043B\u0430\u0447\u043A\u043E \u043F\u043E \u0433\u043E\u043B\u043E\u0432\u0435...",
|
|
288721
|
+
"\u0413\u043B\u0430\u0434\u0438\u043C \u043A\u043E\u0442\u0430...",
|
|
288722
|
+
"\u0420\u0438\u043A\u0440\u043E\u043B\u043B\u0438\u043C \u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0438\u043A\u0430...",
|
|
288723
|
+
"Never gonna give you up, never gonna let you down...",
|
|
288724
|
+
"\u041B\u0430\u0431\u0430\u0435\u043C \u0431\u0430\u0441-\u0433\u0438\u0442\u0430\u0440\u0443...",
|
|
288725
|
+
"\u041F\u0440\u043E\u0431\u0443\u0435\u043C \u0441\u043D\u0443\u0437\u0431\u0435\u0440\u0440\u0438 \u043D\u0430 \u0432\u043A\u0443\u0441...",
|
|
288726
|
+
"\u0418\u0434\u0443 \u0434\u043E \u043A\u043E\u043D\u0446\u0430, \u0438\u0434\u0443 \u043D\u0430 \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u044C...",
|
|
288727
|
+
"Is this the real life? Is this just fantasy?...",
|
|
288728
|
+
"\u0423 \u043C\u0435\u043D\u044F \u0445\u043E\u0440\u043E\u0448\u0435\u0435 \u043F\u0440\u0435\u0434\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0435...",
|
|
288729
|
+
"\u0414\u0440\u0430\u0437\u043D\u0438\u043C \u043C\u0435\u0434\u0432\u0435\u0434\u044F... (\u041D\u0435 \u043B\u0435\u0437\u044C...)",
|
|
288730
|
+
"\u0418\u0437\u0443\u0447\u0430\u0435\u043C \u0441\u0432\u0435\u0436\u0438\u0435 \u043C\u0435\u043C\u044B...",
|
|
288731
|
+
"\u0414\u0443\u043C\u0430\u0435\u043C, \u043A\u0430\u043A \u0441\u0434\u0435\u043B\u0430\u0442\u044C \u044D\u0442\u043E \u043E\u0441\u0442\u0440\u043E\u0443\u043C\u043D\u0435\u0435...",
|
|
288732
|
+
"\u0425\u043C\u043C... \u0434\u0430\u0439\u0442\u0435 \u043F\u043E\u0434\u0443\u043C\u0430\u0442\u044C...",
|
|
288733
|
+
"\u041A\u0430\u043A \u043D\u0430\u0437\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u0431\u0443\u043C\u0435\u0440\u0430\u043D\u0433, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u043D\u0435 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044F? \u041F\u0430\u043B\u043A\u0430...",
|
|
288734
|
+
"\u041F\u043E\u0447\u0435\u043C\u0443 \u043A\u043E\u043C\u043F\u044C\u044E\u0442\u0435\u0440 \u043F\u0440\u043E\u0441\u0442\u0443\u0434\u0438\u043B\u0441\u044F? \u041F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u043E\u0441\u0442\u0430\u0432\u0438\u043B \u043E\u043A\u043D\u0430 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C\u0438...",
|
|
288735
|
+
"\u041F\u043E\u0447\u0435\u043C\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0438\u0441\u0442\u044B \u043D\u0435 \u043B\u044E\u0431\u044F\u0442 \u0433\u0443\u043B\u044F\u0442\u044C \u043D\u0430 \u0443\u043B\u0438\u0446\u0435? \u0422\u0430\u043C \u0441\u0440\u0435\u0434\u0430 \u043D\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043D\u0430...",
|
|
288736
|
+
"\u041F\u043E\u0447\u0435\u043C\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0438\u0441\u0442\u044B \u043F\u0440\u0435\u0434\u043F\u043E\u0447\u0438\u0442\u0430\u044E\u0442 \u0442\u0451\u043C\u043D\u0443\u044E \u0442\u0435\u043C\u0443? \u041F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u0432 \u0442\u0435\u043C\u043D\u043E\u0442\u0435 \u043D\u0435 \u0432\u0438\u0434\u043D\u043E \u0431\u0430\u0433\u043E\u0432...",
|
|
288737
|
+
"\u041F\u043E\u0447\u0435\u043C\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A \u0440\u0430\u0437\u043E\u0440\u0438\u043B\u0441\u044F? \u041F\u043E\u0442\u043E\u043C\u0443 \u0447\u0442\u043E \u043F\u043E\u0442\u0440\u0430\u0442\u0438\u043B \u0432\u0435\u0441\u044C \u0441\u0432\u043E\u0439 \u043A\u044D\u0448...",
|
|
288738
|
+
"\u0427\u0442\u043E \u043C\u043E\u0436\u043D\u043E \u0434\u0435\u043B\u0430\u0442\u044C \u0441\u043E \u0441\u043B\u043E\u043C\u0430\u043D\u043D\u044B\u043C \u043A\u0430\u0440\u0430\u043D\u0434\u0430\u0448\u043E\u043C? \u041D\u0438\u0447\u0435\u0433\u043E \u2014 \u043E\u043D \u0442\u0443\u043F\u043E\u0439...",
|
|
288739
|
+
"\u041F\u0440\u043E\u0432\u043E\u0436\u0443 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u043C\u0435\u0442\u043E\u0434\u043E\u043C \u0442\u044B\u043A\u0430...",
|
|
288740
|
+
"\u0418\u0449\u0435\u043C, \u043A\u0430\u043A\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u043E\u0439 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C \u0444\u043B\u0435\u0448\u043A\u0443...",
|
|
288741
|
+
"\u0421\u043B\u0435\u0434\u0438\u043C, \u0447\u0442\u043E\u0431\u044B \u0432\u043E\u043B\u0448\u0435\u0431\u043D\u044B\u0439 \u0434\u044B\u043C \u043D\u0435 \u0432\u044B\u0448\u0435\u043B \u0438\u0437 \u043F\u0440\u043E\u0432\u043E\u0434\u043E\u0432...",
|
|
288742
|
+
"\u041F\u0435\u0440\u0435\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u043C \u0432\u0441\u0451 \u043D\u0430 Rust \u0431\u0435\u0437 \u043E\u0441\u043E\u0431\u043E\u0439 \u043F\u0440\u0438\u0447\u0438\u043D\u044B...",
|
|
288743
|
+
"\u041F\u044B\u0442\u0430\u0435\u043C\u0441\u044F \u0432\u044B\u0439\u0442\u0438 \u0438\u0437 Vim...",
|
|
288744
|
+
"\u0420\u0430\u0441\u043A\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043C \u043A\u043E\u043B\u0435\u0441\u043E \u0434\u043B\u044F \u0445\u043E\u043C\u044F\u043A\u0430...",
|
|
288745
|
+
"\u042D\u0442\u043E \u043D\u0435 \u0431\u0430\u0433, \u0430 \u0444\u0438\u0447\u0430...",
|
|
288746
|
+
"\u041F\u043E\u0435\u0445\u0430\u043B\u0438!",
|
|
288747
|
+
"\u042F \u0432\u0435\u0440\u043D\u0443\u0441\u044C... \u0441 \u043E\u0442\u0432\u0435\u0442\u043E\u043C.",
|
|
288748
|
+
"\u041C\u043E\u0439 \u0434\u0440\u0443\u0433\u043E\u0439 \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u2014 \u044D\u0442\u043E \u0422\u0410\u0420\u0414\u0418\u0421...",
|
|
288749
|
+
"\u041E\u0431\u0449\u0430\u0435\u043C\u0441\u044F \u0441 \u0434\u0443\u0445\u043E\u043C \u043C\u0430\u0448\u0438\u043D\u044B...",
|
|
288750
|
+
"\u0414\u0430\u0435\u043C \u043C\u044B\u0441\u043B\u044F\u043C \u0437\u0430\u043C\u0430\u0440\u0438\u043D\u043E\u0432\u0430\u0442\u044C\u0441\u044F...",
|
|
288751
|
+
"\u0422\u043E\u043B\u044C\u043A\u043E \u0447\u0442\u043E \u0432\u0441\u043F\u043E\u043C\u043D\u0438\u043B, \u043A\u0443\u0434\u0430 \u043F\u043E\u043B\u043E\u0436\u0438\u043B \u043A\u043B\u044E\u0447\u0438...",
|
|
288752
|
+
"\u0420\u0430\u0437\u043C\u044B\u0448\u043B\u044F\u044E \u043D\u0430\u0434 \u0441\u0444\u0435\u0440\u043E\u0439...",
|
|
288753
|
+
"\u042F \u0432\u0438\u0434\u0435\u043B \u0442\u0430\u043A\u043E\u0435, \u0447\u0442\u043E \u0432\u0430\u043C, \u043B\u044E\u0434\u044F\u043C, \u0438 \u043D\u0435 \u0441\u043D\u0438\u043B\u043E\u0441\u044C... \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F, \u0447\u0438\u0442\u0430\u044E\u0449\u0435\u0433\u043E \u044D\u0442\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F.",
|
|
288754
|
+
"\u0418\u043D\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u043C \u0437\u0430\u0434\u0443\u043C\u0447\u0438\u0432\u044B\u0439 \u0432\u0437\u0433\u043B\u044F\u0434...",
|
|
288755
|
+
"\u0427\u0442\u043E \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430\u043A\u0430\u0437\u044B\u0432\u0430\u0435\u0442 \u0432 \u0431\u0430\u0440\u0435? \u041F\u0438\u043D\u0433-\u043A\u043E\u043B\u0430\u0434\u0443.",
|
|
288756
|
+
"\u041F\u043E\u0447\u0435\u043C\u0443 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0438 \u043D\u0435 \u0443\u0431\u0438\u0440\u0430\u044E\u0442\u0441\u044F \u0434\u043E\u043C\u0430? \u041E\u043D\u0438 \u0436\u0434\u0443\u0442 \u0441\u0431\u043E\u0440\u0449\u0438\u043A \u043C\u0443\u0441\u043E\u0440\u0430...",
|
|
288757
|
+
"\u0417\u0430\u0440\u044F\u0436\u0430\u0435\u043C \u043B\u0430\u0437\u0435\u0440... \u043F\u0438\u0443-\u043F\u0438\u0443!",
|
|
288758
|
+
"\u0414\u0435\u043B\u0438\u043C \u043D\u0430 \u043D\u043E\u043B\u044C... \u0448\u0443\u0447\u0443!",
|
|
288759
|
+
"\u0418\u0449\u0443 \u0432\u0437\u0440\u043E\u0441\u043B\u044B\u0445 \u0434\u043B\u044F \u043F\u0440\u0438\u0441\u043C\u043E\u0442... \u0432 \u0441\u043C\u044B\u0441\u043B\u0435, \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u044E.",
|
|
288760
|
+
"\u0414\u0435\u043B\u0430\u0435\u043C \u0431\u0438\u043F-\u0431\u0443\u043F.",
|
|
288761
|
+
"\u0411\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044F... \u0434\u0430\u0436\u0435 \u0418\u0418 \u043D\u0443\u0436\u043D\u043E \u0432\u0440\u0435\u043C\u044F \u043F\u043E\u0434\u0443\u043C\u0430\u0442\u044C.",
|
|
288762
|
+
"\u0417\u0430\u043F\u0443\u0442\u044B\u0432\u0430\u0435\u043C \u043A\u0432\u0430\u043D\u0442\u043E\u0432\u044B\u0435 \u0447\u0430\u0441\u0442\u0438\u0446\u044B \u0434\u043B\u044F \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u043E\u0442\u0432\u0435\u0442\u0430...",
|
|
288763
|
+
"\u041F\u043E\u043B\u0438\u0440\u0443\u0435\u043C \u0445\u0440\u043E\u043C... \u043D\u0430 \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C\u0430\u0445.",
|
|
288764
|
+
"\u0412\u044B \u0435\u0449\u0451 \u043D\u0435 \u0440\u0430\u0437\u0432\u043B\u0435\u043A\u043B\u0438\u0441\u044C?! \u0420\u0430\u0437\u0432\u0435 \u0432\u044B \u043D\u0435 \u0437\u0430 \u044D\u0442\u0438\u043C \u0441\u044E\u0434\u0430 \u043F\u0440\u0438\u0448\u043B\u0438?!",
|
|
288765
|
+
"\u041F\u0440\u0438\u0437\u044B\u0432\u0430\u0435\u043C \u0433\u0440\u0435\u043C\u043B\u0438\u043D\u043E\u0432 \u043A\u043E\u0434\u0430... \u0434\u043B\u044F \u043F\u043E\u043C\u043E\u0449\u0438, \u043A\u043E\u043D\u0435\u0447\u043D\u043E \u0436\u0435.",
|
|
288766
|
+
"\u0416\u0434\u0435\u043C, \u043F\u043E\u043A\u0430 \u0437\u0430\u043A\u043E\u043D\u0447\u0438\u0442\u0441\u044F \u0437\u0432\u0443\u043A dial-up \u043C\u043E\u0434\u0435\u043C\u0430...",
|
|
288767
|
+
"\u041F\u0435\u0440\u0435\u043A\u0430\u043B\u0438\u0431\u0440\u043E\u0432\u043A\u0430 \u044E\u043C\u043E\u0440\u043E\u043C\u0435\u0442\u0440\u0430.",
|
|
288768
|
+
"\u041C\u043E\u0439 \u0434\u0440\u0443\u0433\u043E\u0439 \u044D\u043A\u0440\u0430\u043D \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0435\u0449\u0451 \u0441\u043C\u0435\u0448\u043D\u0435\u0435.",
|
|
288769
|
+
"\u041A\u0430\u0436\u0435\u0442\u0441\u044F, \u0433\u0434\u0435-\u0442\u043E \u043F\u043E \u043A\u043B\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0435 \u0433\u0443\u043B\u044F\u0435\u0442 \u043A\u043E\u0442...",
|
|
288770
|
+
"\u0423\u043B\u0443\u0447\u0448\u0430\u0435\u043C... \u0415\u0449\u0451 \u0443\u043B\u0443\u0447\u0448\u0430\u0435\u043C... \u0412\u0441\u0451 \u0435\u0449\u0451 \u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044F.",
|
|
288771
|
+
"\u042D\u0442\u043E \u043D\u0435 \u0431\u0430\u0433, \u044D\u0442\u043E \u0444\u0438\u0447\u0430... \u044D\u043A\u0440\u0430\u043D\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438.",
|
|
288772
|
+
"\u041F\u0440\u043E\u0431\u043E\u0432\u0430\u043B\u0438 \u0432\u044B\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0438 \u0432\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u043D\u043E\u0432\u0430? (\u042D\u043A\u0440\u0430\u043D \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438, \u043D\u0435 \u043C\u0435\u043D\u044F!)",
|
|
288773
|
+
"\u041D\u0443\u0436\u043D\u043E \u043F\u043E\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0431\u043E\u043B\u044C\u0448\u0435 \u043F\u0438\u043B\u043E\u043D\u043E\u0432..."
|
|
288774
|
+
]
|
|
288736
288775
|
};
|
|
288737
288776
|
}
|
|
288738
288777
|
});
|
|
@@ -288824,7 +288863,7 @@ var init_zh = __esm({
|
|
|
288824
288863
|
"Theme configuration unavailable due to NO_COLOR env variable.": "\u7531\u4E8E NO_COLOR \u73AF\u5883\u53D8\u91CF\uFF0C\u4E3B\u9898\u914D\u7F6E\u4E0D\u53EF\u7528\u3002",
|
|
288825
288864
|
'Theme "{{themeName}}" not found.': '\u672A\u627E\u5230\u4E3B\u9898 "{{themeName}}"\u3002',
|
|
288826
288865
|
'Theme "{{themeName}}" not found in selected scope.': '\u5728\u6240\u9009\u4F5C\u7528\u57DF\u4E2D\u672A\u627E\u5230\u4E3B\u9898 "{{themeName}}"\u3002',
|
|
288827
|
-
"
|
|
288866
|
+
"Clear conversation history and free up context": "\u6E05\u9664\u5BF9\u8BDD\u5386\u53F2\u5E76\u91CA\u653E\u4E0A\u4E0B\u6587",
|
|
288828
288867
|
"Compresses the context by replacing it with a summary.": "\u901A\u8FC7\u7528\u6458\u8981\u66FF\u6362\u6765\u538B\u7F29\u4E0A\u4E0B\u6587",
|
|
288829
288868
|
"open full Qwen Code documentation in your browser": "\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u5B8C\u6574\u7684 Qwen Code \u6587\u6863",
|
|
288830
288869
|
"Configuration not available.": "\u914D\u7F6E\u4E0D\u53EF\u7528",
|
|
@@ -288944,6 +288983,7 @@ var init_zh = __esm({
|
|
|
288944
288983
|
"(Use Enter to select{{tabText}})": "\uFF08\u4F7F\u7528 Enter \u9009\u62E9{{tabText}}\uFF09",
|
|
288945
288984
|
", Tab to change focus": "\uFF0CTab \u5207\u6362\u7126\u70B9",
|
|
288946
288985
|
"To see changes, Qwen Code must be restarted. Press r to exit and apply changes now.": "\u8981\u67E5\u770B\u66F4\u6539\uFF0C\u5FC5\u987B\u91CD\u542F Qwen Code\u3002\u6309 r \u9000\u51FA\u5E76\u7ACB\u5373\u5E94\u7528\u66F4\u6539\u3002",
|
|
288986
|
+
'The command "/{{command}}" is not supported in non-interactive mode.': '\u4E0D\u652F\u6301\u5728\u975E\u4EA4\u4E92\u6A21\u5F0F\u4E0B\u4F7F\u7528\u547D\u4EE4 "/{{command}}"\u3002',
|
|
288947
288987
|
// ============================================================================
|
|
288948
288988
|
// Settings Labels
|
|
288949
288989
|
// ============================================================================
|
|
@@ -289176,6 +289216,10 @@ var init_zh = __esm({
|
|
|
289176
289216
|
"Already generating summary, wait for previous request to complete": "\u6B63\u5728\u751F\u6210\u6458\u8981\uFF0C\u8BF7\u7B49\u5F85\u4E0A\u4E00\u4E2A\u8BF7\u6C42\u5B8C\u6210",
|
|
289177
289217
|
"No conversation found to summarize.": "\u672A\u627E\u5230\u8981\u603B\u7ED3\u7684\u5BF9\u8BDD",
|
|
289178
289218
|
"Failed to generate project context summary: {{error}}": "\u751F\u6210\u9879\u76EE\u4E0A\u4E0B\u6587\u6458\u8981\u5931\u8D25\uFF1A{{error}}",
|
|
289219
|
+
"Saved project summary to {{filePathForDisplay}}.": "\u9879\u76EE\u6458\u8981\u5DF2\u4FDD\u5B58\u5230 {{filePathForDisplay}}",
|
|
289220
|
+
"Saving project summary...": "\u6B63\u5728\u4FDD\u5B58\u9879\u76EE\u6458\u8981...",
|
|
289221
|
+
"Generating project summary...": "\u6B63\u5728\u751F\u6210\u9879\u76EE\u6458\u8981...",
|
|
289222
|
+
"Failed to generate summary - no text content received from LLM response": "\u751F\u6210\u6458\u8981\u5931\u8D25 - \u672A\u4ECE LLM \u54CD\u5E94\u4E2D\u63A5\u6536\u5230\u6587\u672C\u5185\u5BB9",
|
|
289179
289223
|
// ============================================================================
|
|
289180
289224
|
// Commands - Model
|
|
289181
289225
|
// ============================================================================
|
|
@@ -289186,8 +289230,8 @@ var init_zh = __esm({
|
|
|
289186
289230
|
// ============================================================================
|
|
289187
289231
|
// Commands - Clear
|
|
289188
289232
|
// ============================================================================
|
|
289189
|
-
"
|
|
289190
|
-
"
|
|
289233
|
+
"Starting a new session, resetting chat, and clearing terminal.": "\u6B63\u5728\u5F00\u59CB\u65B0\u4F1A\u8BDD\uFF0C\u91CD\u7F6E\u804A\u5929\u5E76\u6E05\u5C4F\u3002",
|
|
289234
|
+
"Starting a new session and clearing.": "\u6B63\u5728\u5F00\u59CB\u65B0\u4F1A\u8BDD\u5E76\u6E05\u5C4F\u3002",
|
|
289191
289235
|
// ============================================================================
|
|
289192
289236
|
// Commands - Compress
|
|
289193
289237
|
// ============================================================================
|
|
@@ -289432,134 +289476,37 @@ var init_zh = __esm({
|
|
|
289432
289476
|
// ============================================================================
|
|
289433
289477
|
"Waiting for user confirmation...": "\u7B49\u5F85\u7528\u6237\u786E\u8BA4...",
|
|
289434
289478
|
"(esc to cancel, {{time}})": "\uFF08\u6309 esc \u53D6\u6D88\uFF0C{{time}}\uFF09",
|
|
289435
|
-
|
|
289436
|
-
|
|
289437
|
-
|
|
289438
|
-
|
|
289439
|
-
|
|
289440
|
-
|
|
289441
|
-
|
|
289442
|
-
|
|
289443
|
-
|
|
289444
|
-
|
|
289445
|
-
|
|
289446
|
-
|
|
289447
|
-
|
|
289448
|
-
|
|
289449
|
-
|
|
289450
|
-
|
|
289451
|
-
|
|
289452
|
-
|
|
289453
|
-
|
|
289454
|
-
|
|
289455
|
-
|
|
289456
|
-
|
|
289457
|
-
|
|
289458
|
-
|
|
289459
|
-
|
|
289460
|
-
|
|
289461
|
-
|
|
289462
|
-
|
|
289463
|
-
|
|
289464
|
-
|
|
289465
|
-
|
|
289466
|
-
"Optimizing for ludicrous speed": "\u6B63\u5728\u4F18\u5316\u5230\u8352\u8C2C\u7684\u901F\u5EA6",
|
|
289467
|
-
"Swapping bits... don't tell the bytes...": "\u6B63\u5728\u4EA4\u6362\u4F4D...\u4E0D\u8981\u544A\u8BC9\u5B57\u8282...",
|
|
289468
|
-
"Garbage collecting... be right back...": "\u6B63\u5728\u5783\u573E\u56DE\u6536...\u9A6C\u4E0A\u56DE\u6765...",
|
|
289469
|
-
"Assembling the interwebs...": "\u6B63\u5728\u7EC4\u88C5\u4E92\u8054\u7F51...",
|
|
289470
|
-
"Converting coffee into code...": "\u6B63\u5728\u5C06\u5496\u5561\u8F6C\u6362\u4E3A\u4EE3\u7801...",
|
|
289471
|
-
"Updating the syntax for reality...": "\u6B63\u5728\u66F4\u65B0\u73B0\u5B9E\u7684\u8BED\u6CD5...",
|
|
289472
|
-
"Rewiring the synapses...": "\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u7A81\u89E6...",
|
|
289473
|
-
"Looking for a misplaced semicolon...": "\u6B63\u5728\u5BFB\u627E\u653E\u9519\u4F4D\u7F6E\u7684\u5206\u53F7...",
|
|
289474
|
-
"Greasin' the cogs of the machine...": "\u6B63\u5728\u7ED9\u673A\u5668\u7684\u9F7F\u8F6E\u4E0A\u6CB9...",
|
|
289475
|
-
"Pre-heating the servers...": "\u6B63\u5728\u9884\u70ED\u670D\u52A1\u5668...",
|
|
289476
|
-
"Calibrating the flux capacitor...": "\u6B63\u5728\u6821\u51C6\u901A\u91CF\u7535\u5BB9\u5668...",
|
|
289477
|
-
"Engaging the improbability drive...": "\u6B63\u5728\u542F\u52A8\u4E0D\u53EF\u80FD\u6027\u9A71\u52A8\u5668...",
|
|
289478
|
-
"Channeling the Force...": "\u6B63\u5728\u5F15\u5BFC\u539F\u529B...",
|
|
289479
|
-
"Aligning the stars for optimal response...": "\u6B63\u5728\u5BF9\u9F50\u661F\u661F\u4EE5\u83B7\u5F97\u6700\u4F73\u56DE\u590D...",
|
|
289480
|
-
"So say we all...": "\u6211\u4EEC\u90FD\u8BF4...",
|
|
289481
|
-
"Loading the next great idea...": "\u6B63\u5728\u52A0\u8F7D\u4E0B\u4E00\u4E2A\u4F1F\u5927\u7684\u60F3\u6CD5...",
|
|
289482
|
-
"Just a moment, I'm in the zone...": "\u7A0D\u7B49\u7247\u523B\uFF0C\u6211\u6B63\u8FDB\u5165\u72B6\u6001...",
|
|
289483
|
-
"Preparing to dazzle you with brilliance...": "\u6B63\u5728\u51C6\u5907\u7528\u667A\u6167\u8BA9\u60A8\u773C\u82B1\u7F2D\u4E71...",
|
|
289484
|
-
"Just a tick, I'm polishing my wit...": "\u7A0D\u7B49\u7247\u523B\uFF0C\u6211\u6B63\u5728\u6253\u78E8\u6211\u7684\u667A\u6167...",
|
|
289485
|
-
"Hold tight, I'm crafting a masterpiece...": "\u8BF7\u7A0D\u7B49\uFF0C\u6211\u6B63\u5728\u5236\u4F5C\u6770\u4F5C...",
|
|
289486
|
-
"Just a jiffy, I'm debugging the universe...": "\u7A0D\u7B49\u7247\u523B\uFF0C\u6211\u6B63\u5728\u8C03\u8BD5\u5B87\u5B99...",
|
|
289487
|
-
"Just a moment, I'm aligning the pixels...": "\u7A0D\u7B49\u7247\u523B\uFF0C\u6211\u6B63\u5728\u5BF9\u9F50\u50CF\u7D20...",
|
|
289488
|
-
"Just a sec, I'm optimizing the humor...": "\u7A0D\u7B49\u7247\u523B\uFF0C\u6211\u6B63\u5728\u4F18\u5316\u5E7D\u9ED8\u611F...",
|
|
289489
|
-
"Just a moment, I'm tuning the algorithms...": "\u7A0D\u7B49\u7247\u523B\uFF0C\u6211\u6B63\u5728\u8C03\u6574\u7B97\u6CD5...",
|
|
289490
|
-
"Warp speed engaged...": "\u66F2\u901F\u5DF2\u542F\u52A8...",
|
|
289491
|
-
"Mining for more Dilithium crystals...": "\u6B63\u5728\u6316\u6398\u66F4\u591A\u4E8C\u9502\u6676\u4F53...",
|
|
289492
|
-
"Don't panic...": "\u4E0D\u8981\u60CA\u614C...",
|
|
289493
|
-
"Following the white rabbit...": "\u6B63\u5728\u8DDF\u968F\u767D\u5154...",
|
|
289494
|
-
"The truth is in here... somewhere...": "\u771F\u76F8\u5728\u8FD9\u91CC...\u67D0\u4E2A\u5730\u65B9...",
|
|
289495
|
-
"Blowing on the cartridge...": "\u6B63\u5728\u5439\u5361\u5E26...",
|
|
289496
|
-
"Loading... Do a barrel roll!": "\u6B63\u5728\u52A0\u8F7D...\u505A\u4E2A\u6876\u6EDA\uFF01",
|
|
289497
|
-
"Waiting for the respawn...": "\u7B49\u5F85\u91CD\u751F...",
|
|
289498
|
-
"Finishing the Kessel Run in less than 12 parsecs...": "\u6B63\u5728\u4EE5\u4E0D\u5230 12 \u79D2\u5DEE\u8DDD\u5B8C\u6210\u51EF\u585E\u5C14\u822A\u7EBF...",
|
|
289499
|
-
"The cake is not a lie, it's just still loading...": "\u86CB\u7CD5\u4E0D\u662F\u8C0E\u8A00\uFF0C\u53EA\u662F\u8FD8\u5728\u52A0\u8F7D...",
|
|
289500
|
-
"Fiddling with the character creation screen...": "\u6B63\u5728\u6446\u5F04\u89D2\u8272\u521B\u5EFA\u754C\u9762...",
|
|
289501
|
-
"Just a moment, I'm finding the right meme...": "\u7A0D\u7B49\u7247\u523B\uFF0C\u6211\u6B63\u5728\u5BFB\u627E\u5408\u9002\u7684\u8868\u60C5\u5305...",
|
|
289502
|
-
"Pressing 'A' to continue...": "\u6309 'A' \u7EE7\u7EED...",
|
|
289503
|
-
"Herding digital cats...": "\u6B63\u5728\u653E\u7267\u6570\u5B57\u732B...",
|
|
289504
|
-
"Polishing the pixels...": "\u6B63\u5728\u6253\u78E8\u50CF\u7D20...",
|
|
289505
|
-
"Finding a suitable loading screen pun...": "\u6B63\u5728\u5BFB\u627E\u5408\u9002\u7684\u52A0\u8F7D\u5C4F\u5E55\u53CC\u5173\u8BED...",
|
|
289506
|
-
"Distracting you with this witty phrase...": "\u6B63\u5728\u7528\u8FD9\u4E2A\u673A\u667A\u7684\u77ED\u8BED\u5206\u6563\u60A8\u7684\u6CE8\u610F\u529B...",
|
|
289507
|
-
"Almost there... probably...": "\u5FEB\u5230\u4E86...\u53EF\u80FD...",
|
|
289508
|
-
"Our hamsters are working as fast as they can...": "\u6211\u4EEC\u7684\u4ED3\u9F20\u6B63\u5728\u5C3D\u53EF\u80FD\u5FEB\u5730\u5DE5\u4F5C...",
|
|
289509
|
-
"Giving Cloudy a pat on the head...": "\u6B63\u5728\u62CD\u62CD Cloudy \u7684\u5934...",
|
|
289510
|
-
"Petting the cat...": "\u6B63\u5728\u629A\u6478\u732B\u54AA...",
|
|
289511
|
-
"Rickrolling my boss...": "\u6B63\u5728 Rickroll \u6211\u7684\u8001\u677F...",
|
|
289512
|
-
"Never gonna give you up, never gonna let you down...": "\u6C38\u8FDC\u4E0D\u4F1A\u653E\u5F03\u4F60\uFF0C\u6C38\u8FDC\u4E0D\u4F1A\u8BA9\u4F60\u5931\u671B...",
|
|
289513
|
-
"Slapping the bass...": "\u6B63\u5728\u62CD\u6253\u4F4E\u97F3...",
|
|
289514
|
-
"Tasting the snozberries...": "\u6B63\u5728\u54C1\u5C1D snozberries...",
|
|
289515
|
-
"I'm going the distance, I'm going for speed...": "\u6211\u8981\u8D70\u5F97\u66F4\u8FDC\uFF0C\u6211\u8981\u8FFD\u6C42\u901F\u5EA6...",
|
|
289516
|
-
"Is this the real life? Is this just fantasy?...": "\u8FD9\u662F\u771F\u5B9E\u7684\u751F\u6D3B\u5417\uFF1F\u8FD8\u662F\u53EA\u662F\u5E7B\u60F3\uFF1F...",
|
|
289517
|
-
"I've got a good feeling about this...": "\u6211\u5BF9\u8FD9\u4E2A\u611F\u89C9\u5F88\u597D...",
|
|
289518
|
-
"Poking the bear...": "\u6B63\u5728\u6233\u718A...",
|
|
289519
|
-
"Doing research on the latest memes...": "\u6B63\u5728\u7814\u7A76\u6700\u65B0\u7684\u8868\u60C5\u5305...",
|
|
289520
|
-
"Figuring out how to make this more witty...": "\u6B63\u5728\u60F3\u529E\u6CD5\u8BA9\u8FD9\u66F4\u6709\u8DA3...",
|
|
289521
|
-
"Hmmm... let me think...": "\u55EF...\u8BA9\u6211\u60F3\u60F3...",
|
|
289522
|
-
"What do you call a fish with no eyes? A fsh...": "\u6CA1\u6709\u773C\u775B\u7684\u9C7C\u53EB\u4EC0\u4E48\uFF1F\u4E00\u6761\u9C7C...",
|
|
289523
|
-
"Why did the computer go to therapy? It had too many bytes...": "\u4E3A\u4EC0\u4E48\u7535\u8111\u53BB\u770B\u5FC3\u7406\u533B\u751F\uFF1F\u56E0\u4E3A\u5B83\u6709\u592A\u591A\u5B57\u8282...",
|
|
289524
|
-
"Why don't programmers like nature? It has too many bugs...": "\u4E3A\u4EC0\u4E48\u7A0B\u5E8F\u5458\u4E0D\u559C\u6B22\u5927\u81EA\u7136\uFF1F\u56E0\u4E3A\u866B\u5B50\u592A\u591A\u4E86...",
|
|
289525
|
-
"Why do programmers prefer dark mode? Because light attracts bugs...": "\u4E3A\u4EC0\u4E48\u7A0B\u5E8F\u5458\u559C\u6B22\u6697\u8272\u6A21\u5F0F\uFF1F\u56E0\u4E3A\u5149\u4F1A\u5438\u5F15\u866B\u5B50...",
|
|
289526
|
-
"Why did the developer go broke? Because they used up all their cache...": "\u4E3A\u4EC0\u4E48\u5F00\u53D1\u8005\u7834\u4EA7\u4E86\uFF1F\u56E0\u4E3A\u4ED6\u4EEC\u7528\u5B8C\u4E86\u6240\u6709\u7F13\u5B58...",
|
|
289527
|
-
"What can you do with a broken pencil? Nothing, it's pointless...": "\u4F60\u80FD\u7528\u65AD\u4E86\u7684\u94C5\u7B14\u505A\u4EC0\u4E48\uFF1F\u4EC0\u4E48\u90FD\u4E0D\u80FD\uFF0C\u56E0\u4E3A\u5B83\u6CA1\u6709\u7B14\u5C16...",
|
|
289528
|
-
"Applying percussive maintenance...": "\u6B63\u5728\u5E94\u7528\u6572\u51FB\u7EF4\u62A4...",
|
|
289529
|
-
"Searching for the correct USB orientation...": "\u6B63\u5728\u5BFB\u627E\u6B63\u786E\u7684 USB \u65B9\u5411...",
|
|
289530
|
-
"Ensuring the magic smoke stays inside the wires...": "\u786E\u4FDD\u9B54\u6CD5\u70DF\u96FE\u7559\u5728\u7535\u7EBF\u5185...",
|
|
289531
|
-
"Rewriting in Rust for no particular reason...": "\u6B63\u5728\u7528 Rust \u91CD\u5199\uFF0C\u6CA1\u6709\u7279\u522B\u7684\u539F\u56E0...",
|
|
289532
|
-
"Trying to exit Vim...": "\u6B63\u5728\u5C1D\u8BD5\u9000\u51FA Vim...",
|
|
289533
|
-
"Spinning up the hamster wheel...": "\u6B63\u5728\u542F\u52A8\u4ED3\u9F20\u8F6E...",
|
|
289534
|
-
"That's not a bug, it's an undocumented feature...": "\u8FD9\u4E0D\u662F\u4E00\u4E2A\u9519\u8BEF\uFF0C\u8FD9\u662F\u4E00\u4E2A\u672A\u8BB0\u5F55\u7684\u529F\u80FD...",
|
|
289535
|
-
"Engage.": "\u542F\u52A8\u3002",
|
|
289536
|
-
"I'll be back... with an answer.": "\u6211\u4F1A\u56DE\u6765\u7684...\u5E26\u7740\u7B54\u6848\u3002",
|
|
289537
|
-
"My other process is a TARDIS...": "\u6211\u7684\u53E6\u4E00\u4E2A\u8FDB\u7A0B\u662F TARDIS...",
|
|
289538
|
-
"Communing with the machine spirit...": "\u6B63\u5728\u4E0E\u673A\u5668\u7CBE\u795E\u4EA4\u6D41...",
|
|
289539
|
-
"Letting the thoughts marinate...": "\u8BA9\u60F3\u6CD5\u6162\u6162\u915D\u917F...",
|
|
289540
|
-
"Just remembered where I put my keys...": "\u521A\u521A\u60F3\u8D77\u6211\u628A\u94A5\u5319\u653E\u5728\u54EA\u91CC\u4E86...",
|
|
289541
|
-
"Pondering the orb...": "\u6B63\u5728\u601D\u8003\u7403\u4F53...",
|
|
289542
|
-
"I've seen things you people wouldn't believe... like a user who reads loading messages.": "\u6211\u89C1\u8FC7\u4F60\u4EEC\u4E0D\u4F1A\u76F8\u4FE1\u7684\u4E8B\u60C5...\u6BD4\u5982\u4E00\u4E2A\u9605\u8BFB\u52A0\u8F7D\u6D88\u606F\u7684\u7528\u6237\u3002",
|
|
289543
|
-
"Initiating thoughtful gaze...": "\u6B63\u5728\u542F\u52A8\u6DF1\u601D\u51DD\u89C6...",
|
|
289544
|
-
"What's a computer's favorite snack? Microchips.": "\u7535\u8111\u6700\u559C\u6B22\u7684\u96F6\u98DF\u662F\u4EC0\u4E48\uFF1F\u5FAE\u82AF\u7247\u3002",
|
|
289545
|
-
"Why do Java developers wear glasses? Because they don't C#.": "\u4E3A\u4EC0\u4E48 Java \u5F00\u53D1\u8005\u6234\u773C\u955C\uFF1F\u56E0\u4E3A\u4ED6\u4EEC\u4E0D\u4F1A C#\u3002",
|
|
289546
|
-
"Charging the laser... pew pew!": "\u6B63\u5728\u7ED9\u6FC0\u5149\u5145\u7535...\u7830\u7830\uFF01",
|
|
289547
|
-
"Dividing by zero... just kidding!": "\u9664\u4EE5\u96F6...\u53EA\u662F\u5F00\u73A9\u7B11\uFF01",
|
|
289548
|
-
"Looking for an adult superviso... I mean, processing.": "\u6B63\u5728\u5BFB\u627E\u6210\u4EBA\u76D1\u7763...\u6211\u662F\u8BF4\uFF0C\u5904\u7406\u4E2D\u3002",
|
|
289549
|
-
"Making it go beep boop.": "\u8BA9\u5B83\u53D1\u51FA\u54D4\u54D4\u58F0\u3002",
|
|
289550
|
-
"Buffering... because even AIs need a moment.": "\u6B63\u5728\u7F13\u51B2...\u56E0\u4E3A\u5373\u4F7F\u662F AI \u4E5F\u9700\u8981\u7247\u523B\u3002",
|
|
289551
|
-
"Entangling quantum particles for a faster response...": "\u6B63\u5728\u7EA0\u7F20\u91CF\u5B50\u7C92\u5B50\u4EE5\u83B7\u5F97\u66F4\u5FEB\u7684\u56DE\u590D...",
|
|
289552
|
-
"Polishing the chrome... on the algorithms.": "\u6B63\u5728\u6253\u78E8\u94EC...\u5728\u7B97\u6CD5\u4E0A\u3002",
|
|
289553
|
-
"Are you not entertained? (Working on it!)": "\u4F60\u4E0D\u89C9\u5F97\u6709\u8DA3\u5417\uFF1F\uFF08\u6B63\u5728\u52AA\u529B\uFF01\uFF09",
|
|
289554
|
-
"Summoning the code gremlins... to help, of course.": "\u6B63\u5728\u53EC\u5524\u4EE3\u7801\u5C0F\u7CBE\u7075...\u5F53\u7136\u662F\u6765\u5E2E\u5FD9\u7684\u3002",
|
|
289555
|
-
"Just waiting for the dial-up tone to finish...": "\u53EA\u662F\u7B49\u5F85\u62E8\u53F7\u97F3\u7ED3\u675F...",
|
|
289556
|
-
"Recalibrating the humor-o-meter.": "\u6B63\u5728\u91CD\u65B0\u6821\u51C6\u5E7D\u9ED8\u8BA1\u3002",
|
|
289557
|
-
"My other loading screen is even funnier.": "\u6211\u7684\u53E6\u4E00\u4E2A\u52A0\u8F7D\u5C4F\u5E55\u66F4\u6709\u8DA3\u3002",
|
|
289558
|
-
"Pretty sure there's a cat walking on the keyboard somewhere...": "\u5F88\u786E\u5B9A\u6709\u53EA\u732B\u5728\u67D0\u4E2A\u5730\u65B9\u952E\u76D8\u4E0A\u8D70...",
|
|
289559
|
-
"Enhancing... Enhancing... Still loading.": "\u6B63\u5728\u589E\u5F3A...\u6B63\u5728\u589E\u5F3A...\u4ECD\u5728\u52A0\u8F7D\u3002",
|
|
289560
|
-
"It's not a bug, it's a feature... of this loading screen.": "\u8FD9\u4E0D\u662F\u4E00\u4E2A\u9519\u8BEF\uFF0C\u8FD9\u662F\u4E00\u4E2A\u529F\u80FD...\u8FD9\u4E2A\u52A0\u8F7D\u5C4F\u5E55\u7684\u529F\u80FD\u3002",
|
|
289561
|
-
"Have you tried turning it off and on again? (The loading screen, not me.)": "\u4F60\u8BD5\u8FC7\u628A\u5B83\u5173\u6389\u518D\u6253\u5F00\u5417\uFF1F\uFF08\u52A0\u8F7D\u5C4F\u5E55\uFF0C\u4E0D\u662F\u6211\u3002\uFF09",
|
|
289562
|
-
"Constructing additional pylons...": "\u6B63\u5728\u5EFA\u9020\u989D\u5916\u7684\u80FD\u91CF\u5854..."
|
|
289479
|
+
WITTY_LOADING_PHRASES: [
|
|
289480
|
+
// --- 职场搬砖系列 ---
|
|
289481
|
+
"\u6B63\u5728\u52AA\u529B\u642C\u7816\uFF0C\u8BF7\u7A0D\u5019...",
|
|
289482
|
+
"\u8001\u677F\u5728\u8EAB\u540E\uFF0C\u5FEB\u52A0\u8F7D\u554A\uFF01",
|
|
289483
|
+
"\u5934\u53D1\u6389\u5149\u524D\uFF0C\u4E00\u5B9A\u80FD\u52A0\u8F7D\u5B8C...",
|
|
289484
|
+
"\u670D\u52A1\u5668\u6B63\u5728\u6DF1\u547C\u5438\uFF0C\u51C6\u5907\u653E\u5927\u62DB...",
|
|
289485
|
+
"\u6B63\u5728\u5411\u670D\u52A1\u5668\u6295\u5582\u5496\u5561...",
|
|
289486
|
+
// --- 大厂黑话系列 ---
|
|
289487
|
+
"\u6B63\u5728\u8D4B\u80FD\u5168\u94FE\u8DEF\uFF0C\u5BFB\u627E\u5173\u952E\u6293\u624B...",
|
|
289488
|
+
"\u6B63\u5728\u964D\u672C\u589E\u6548\uFF0C\u4F18\u5316\u52A0\u8F7D\u8DEF\u5F84...",
|
|
289489
|
+
"\u6B63\u5728\u6253\u7834\u90E8\u95E8\u58C1\u5792\uFF0C\u6C89\u6DC0\u65B9\u6CD5\u8BBA...",
|
|
289490
|
+
"\u6B63\u5728\u62E5\u62B1\u53D8\u5316\uFF0C\u8FED\u4EE3\u6838\u5FC3\u4EF7\u503C...",
|
|
289491
|
+
"\u6B63\u5728\u5BF9\u9F50\u9897\u7C92\u5EA6\uFF0C\u6253\u78E8\u5E95\u5C42\u903B\u8F91...",
|
|
289492
|
+
"\u5927\u529B\u51FA\u5947\u8FF9\uFF0C\u6B63\u5728\u5F3A\u884C\u52A0\u8F7D...",
|
|
289493
|
+
// --- 程序员自嘲系列 ---
|
|
289494
|
+
"\u53EA\u8981\u6211\u4E0D\u5199\u4EE3\u7801\uFF0C\u4EE3\u7801\u5C31\u6CA1\u6709 Bug...",
|
|
289495
|
+
"\u6B63\u5728\u628A Bug \u8F6C\u5316\u4E3A Feature...",
|
|
289496
|
+
"\u53EA\u8981\u6211\u4E0D\u5C34\u5C2C\uFF0CBug \u5C31\u8FFD\u4E0D\u4E0A\u6211...",
|
|
289497
|
+
"\u6B63\u5728\u8BD5\u56FE\u7406\u89E3\u53BB\u5E74\u7684\u81EA\u5DF1\u5199\u4E86\u4EC0\u4E48...",
|
|
289498
|
+
"\u6B63\u5728\u733F\u529B\u89C9\u9192\u4E2D\uFF0C\u8BF7\u8010\u5FC3\u7B49\u5F85...",
|
|
289499
|
+
// --- 合作愉快系列 ---
|
|
289500
|
+
"\u6B63\u5728\u8BE2\u95EE\u4EA7\u54C1\u7ECF\u7406\uFF1A\u8FD9\u9700\u6C42\u662F\u771F\u7684\u5417\uFF1F",
|
|
289501
|
+
"\u6B63\u5728\u7ED9\u4EA7\u54C1\u7ECF\u7406\u753B\u997C\uFF0C\u8BF7\u7A0D\u7B49...",
|
|
289502
|
+
// --- 温暖治愈系列 ---
|
|
289503
|
+
"\u6BCF\u4E00\u884C\u4EE3\u7801\uFF0C\u90FD\u5728\u52AA\u529B\u8BA9\u4E16\u754C\u53D8\u5F97\u66F4\u597D\u4E00\u70B9\u70B9...",
|
|
289504
|
+
"\u6BCF\u4E00\u4E2A\u4F1F\u5927\u7684\u60F3\u6CD5\uFF0C\u90FD\u503C\u5F97\u8FD9\u4EFD\u8010\u5FC3\u7684\u7B49\u5F85...",
|
|
289505
|
+
"\u522B\u6025\uFF0C\u7F8E\u597D\u7684\u4E8B\u7269\u603B\u662F\u9700\u8981\u4E00\u70B9\u65F6\u95F4\u53BB\u915D\u917F...",
|
|
289506
|
+
"\u613F\u4F60\u7684\u4EE3\u7801\u6C38\u65E0 Bug\uFF0C\u613F\u4F60\u7684\u68A6\u60F3\u7EC8\u5C06\u6210\u771F...",
|
|
289507
|
+
"\u54EA\u6015\u53EA\u6709 0.1% \u7684\u8FDB\u5EA6\uFF0C\u4E5F\u662F\u5728\u5411\u76EE\u6807\u9760\u8FD1...",
|
|
289508
|
+
"\u52A0\u8F7D\u7684\u662F\u5B57\u8282\uFF0C\u627F\u8F7D\u7684\u662F\u5BF9\u6280\u672F\u7684\u70ED\u7231..."
|
|
289509
|
+
]
|
|
289563
289510
|
};
|
|
289564
289511
|
}
|
|
289565
289512
|
});
|
|
@@ -334251,7 +334198,7 @@ var loadYoga = (() => {
|
|
|
334251
334198
|
pa.unshift(a2);
|
|
334252
334199
|
}
|
|
334253
334200
|
__name(sa, "sa");
|
|
334254
|
-
var F4 = 0,
|
|
334201
|
+
var F4 = 0, ta2 = null, G2 = null;
|
|
334255
334202
|
function x3(a2) {
|
|
334256
334203
|
if (h3.onAbort) h3.onAbort(a2);
|
|
334257
334204
|
a2 = "Aborted(" + a2 + ")";
|
|
@@ -335394,7 +335341,7 @@ var loadYoga = (() => {
|
|
|
335394
335341
|
qa.unshift(h3.asm.F);
|
|
335395
335342
|
F4--;
|
|
335396
335343
|
h3.monitorRunDependencies && h3.monitorRunDependencies(F4);
|
|
335397
|
-
0 == F4 && (null !==
|
|
335344
|
+
0 == F4 && (null !== ta2 && (clearInterval(ta2), ta2 = null), G2 && (e4 = G2, G2 = null, e4()));
|
|
335398
335345
|
}
|
|
335399
335346
|
__name(a2, "a");
|
|
335400
335347
|
function b2(e4) {
|
|
@@ -355471,7 +355418,7 @@ __name(getPackageJson, "getPackageJson");
|
|
|
355471
355418
|
// packages/cli/src/utils/version.ts
|
|
355472
355419
|
async function getCliVersion() {
|
|
355473
355420
|
const pkgJson = await getPackageJson();
|
|
355474
|
-
return "0.6.0-preview.
|
|
355421
|
+
return "0.6.0-preview.2";
|
|
355475
355422
|
}
|
|
355476
355423
|
__name(getCliVersion, "getCliVersion");
|
|
355477
355424
|
|
|
@@ -362576,6 +362523,36 @@ import * as path80 from "node:path";
|
|
|
362576
362523
|
import { fileURLToPath as fileURLToPath11, pathToFileURL as pathToFileURL2 } from "node:url";
|
|
362577
362524
|
import { homedir as homedir17 } from "node:os";
|
|
362578
362525
|
|
|
362526
|
+
// packages/cli/src/i18n/languages.ts
|
|
362527
|
+
init_esbuild_shims();
|
|
362528
|
+
var SUPPORTED_LANGUAGES = [
|
|
362529
|
+
{
|
|
362530
|
+
code: "en",
|
|
362531
|
+
id: "en-US",
|
|
362532
|
+
fullName: "English"
|
|
362533
|
+
},
|
|
362534
|
+
{
|
|
362535
|
+
code: "zh",
|
|
362536
|
+
id: "zh-CN",
|
|
362537
|
+
fullName: "Chinese"
|
|
362538
|
+
},
|
|
362539
|
+
{
|
|
362540
|
+
code: "ru",
|
|
362541
|
+
id: "ru-RU",
|
|
362542
|
+
fullName: "Russian"
|
|
362543
|
+
},
|
|
362544
|
+
{
|
|
362545
|
+
code: "de",
|
|
362546
|
+
id: "de-DE",
|
|
362547
|
+
fullName: "German"
|
|
362548
|
+
}
|
|
362549
|
+
];
|
|
362550
|
+
function getLanguageNameFromLocale(locale) {
|
|
362551
|
+
const lang = SUPPORTED_LANGUAGES.find((l3) => l3.code === locale);
|
|
362552
|
+
return lang?.fullName || "English";
|
|
362553
|
+
}
|
|
362554
|
+
__name(getLanguageNameFromLocale, "getLanguageNameFromLocale");
|
|
362555
|
+
|
|
362579
362556
|
// import("./locales/**/*.js") in packages/cli/src/i18n/index.ts
|
|
362580
362557
|
var globImport_locales_js = __glob({
|
|
362581
362558
|
"./locales/en.js": () => Promise.resolve().then(() => (init_en3(), en_exports)),
|
|
@@ -362602,10 +362579,12 @@ function detectSystemLanguage() {
|
|
|
362602
362579
|
if (envLang?.startsWith("zh")) return "zh";
|
|
362603
362580
|
if (envLang?.startsWith("en")) return "en";
|
|
362604
362581
|
if (envLang?.startsWith("ru")) return "ru";
|
|
362582
|
+
if (envLang?.startsWith("de")) return "de";
|
|
362605
362583
|
try {
|
|
362606
362584
|
const locale = Intl.DateTimeFormat().resolvedOptions().locale;
|
|
362607
362585
|
if (locale.startsWith("zh")) return "zh";
|
|
362608
362586
|
if (locale.startsWith("ru")) return "ru";
|
|
362587
|
+
if (locale.startsWith("de")) return "de";
|
|
362609
362588
|
} catch {
|
|
362610
362589
|
}
|
|
362611
362590
|
return "en";
|
|
@@ -362706,9 +362685,20 @@ function getCurrentLanguage() {
|
|
|
362706
362685
|
__name(getCurrentLanguage, "getCurrentLanguage");
|
|
362707
362686
|
function t4(key, params) {
|
|
362708
362687
|
const translation = translations[key] ?? key;
|
|
362688
|
+
if (Array.isArray(translation)) {
|
|
362689
|
+
return key;
|
|
362690
|
+
}
|
|
362709
362691
|
return interpolate(translation, params);
|
|
362710
362692
|
}
|
|
362711
362693
|
__name(t4, "t");
|
|
362694
|
+
function ta(key) {
|
|
362695
|
+
const translation = translations[key];
|
|
362696
|
+
if (Array.isArray(translation)) {
|
|
362697
|
+
return translation;
|
|
362698
|
+
}
|
|
362699
|
+
return [];
|
|
362700
|
+
}
|
|
362701
|
+
__name(ta, "ta");
|
|
362712
362702
|
async function initializeI18n(lang) {
|
|
362713
362703
|
await setLanguageAsync(lang ?? "auto");
|
|
362714
362704
|
}
|
|
@@ -362726,10 +362716,344 @@ function validateTheme(settings) {
|
|
|
362726
362716
|
}
|
|
362727
362717
|
__name(validateTheme, "validateTheme");
|
|
362728
362718
|
|
|
362719
|
+
// packages/cli/src/ui/commands/languageCommand.ts
|
|
362720
|
+
init_esbuild_shims();
|
|
362721
|
+
|
|
362722
|
+
// packages/cli/src/ui/commands/types.ts
|
|
362723
|
+
init_esbuild_shims();
|
|
362724
|
+
|
|
362725
|
+
// packages/cli/src/ui/commands/languageCommand.ts
|
|
362726
|
+
import * as fs75 from "node:fs";
|
|
362727
|
+
import * as path81 from "node:path";
|
|
362728
|
+
var LLM_OUTPUT_LANGUAGE_RULE_FILENAME = "output-language.md";
|
|
362729
|
+
var LLM_OUTPUT_LANGUAGE_MARKER_PREFIX = "qwen-code:llm-output-language:";
|
|
362730
|
+
function parseUiLanguageArg(input) {
|
|
362731
|
+
const lowered = input.trim().toLowerCase();
|
|
362732
|
+
if (!lowered) return null;
|
|
362733
|
+
for (const lang of SUPPORTED_LANGUAGES) {
|
|
362734
|
+
if (lowered === lang.code || lowered === lang.id.toLowerCase() || lowered === lang.fullName.toLowerCase()) {
|
|
362735
|
+
return lang.code;
|
|
362736
|
+
}
|
|
362737
|
+
}
|
|
362738
|
+
return null;
|
|
362739
|
+
}
|
|
362740
|
+
__name(parseUiLanguageArg, "parseUiLanguageArg");
|
|
362741
|
+
function formatUiLanguageDisplay(lang) {
|
|
362742
|
+
const option2 = SUPPORTED_LANGUAGES.find((o3) => o3.code === lang);
|
|
362743
|
+
return option2 ? `${option2.fullName}\uFF08${option2.id}\uFF09` : lang;
|
|
362744
|
+
}
|
|
362745
|
+
__name(formatUiLanguageDisplay, "formatUiLanguageDisplay");
|
|
362746
|
+
function sanitizeLanguageForMarker(language) {
|
|
362747
|
+
return language.replace(/[\r\n]/g, " ").replace(/--!?>/g, "").replace(/--/g, "");
|
|
362748
|
+
}
|
|
362749
|
+
__name(sanitizeLanguageForMarker, "sanitizeLanguageForMarker");
|
|
362750
|
+
function generateLlmOutputLanguageRule(language) {
|
|
362751
|
+
const markerLanguage = sanitizeLanguageForMarker(language);
|
|
362752
|
+
return `# Output language preference: ${language}
|
|
362753
|
+
<!-- ${LLM_OUTPUT_LANGUAGE_MARKER_PREFIX} ${markerLanguage} -->
|
|
362754
|
+
|
|
362755
|
+
## Goal
|
|
362756
|
+
Prefer responding in **${language}** for normal assistant messages and explanations.
|
|
362757
|
+
|
|
362758
|
+
## Keep technical artifacts unchanged
|
|
362759
|
+
Do **not** translate or rewrite:
|
|
362760
|
+
- Code blocks, CLI commands, file paths, stack traces, logs, JSON keys, identifiers
|
|
362761
|
+
- Exact quoted text from the user (keep quotes verbatim)
|
|
362762
|
+
|
|
362763
|
+
## When a conflict exists
|
|
362764
|
+
If higher-priority instructions (system/developer) require a different behavior, follow them.
|
|
362765
|
+
|
|
362766
|
+
## Tool / system outputs
|
|
362767
|
+
Raw tool/system outputs may contain fixed-format English. Preserve them verbatim, and if needed, add a short **${language}** explanation below.
|
|
362768
|
+
`;
|
|
362769
|
+
}
|
|
362770
|
+
__name(generateLlmOutputLanguageRule, "generateLlmOutputLanguageRule");
|
|
362771
|
+
function getLlmOutputLanguageRulePath() {
|
|
362772
|
+
return path81.join(
|
|
362773
|
+
Storage.getGlobalQwenDir(),
|
|
362774
|
+
LLM_OUTPUT_LANGUAGE_RULE_FILENAME
|
|
362775
|
+
);
|
|
362776
|
+
}
|
|
362777
|
+
__name(getLlmOutputLanguageRulePath, "getLlmOutputLanguageRulePath");
|
|
362778
|
+
function normalizeLanguageName(language) {
|
|
362779
|
+
const lowered = language.toLowerCase();
|
|
362780
|
+
const fullName = getLanguageNameFromLocale(lowered);
|
|
362781
|
+
if (fullName !== "English" || lowered === "en") {
|
|
362782
|
+
return fullName;
|
|
362783
|
+
}
|
|
362784
|
+
return language;
|
|
362785
|
+
}
|
|
362786
|
+
__name(normalizeLanguageName, "normalizeLanguageName");
|
|
362787
|
+
function extractLlmOutputLanguageFromRuleFileContent(content) {
|
|
362788
|
+
const markerMatch = content.match(
|
|
362789
|
+
new RegExp(
|
|
362790
|
+
String.raw`<!--\s*${LLM_OUTPUT_LANGUAGE_MARKER_PREFIX}\s*(.*?)\s*-->`,
|
|
362791
|
+
"i"
|
|
362792
|
+
)
|
|
362793
|
+
);
|
|
362794
|
+
if (markerMatch?.[1]) {
|
|
362795
|
+
const lang = markerMatch[1].trim();
|
|
362796
|
+
if (lang) return lang;
|
|
362797
|
+
}
|
|
362798
|
+
const headingMatch = content.match(
|
|
362799
|
+
/^#.*?CRITICAL:\s*(.*?)\s+Output Language Rule\b/im
|
|
362800
|
+
);
|
|
362801
|
+
if (headingMatch?.[1]) {
|
|
362802
|
+
const lang = headingMatch[1].trim();
|
|
362803
|
+
if (lang) return lang;
|
|
362804
|
+
}
|
|
362805
|
+
return null;
|
|
362806
|
+
}
|
|
362807
|
+
__name(extractLlmOutputLanguageFromRuleFileContent, "extractLlmOutputLanguageFromRuleFileContent");
|
|
362808
|
+
function initializeLlmOutputLanguage() {
|
|
362809
|
+
const filePath = getLlmOutputLanguageRulePath();
|
|
362810
|
+
if (fs75.existsSync(filePath)) {
|
|
362811
|
+
return;
|
|
362812
|
+
}
|
|
362813
|
+
const detectedLocale = detectSystemLanguage();
|
|
362814
|
+
const languageName = getLanguageNameFromLocale(detectedLocale);
|
|
362815
|
+
const content = generateLlmOutputLanguageRule(languageName);
|
|
362816
|
+
const dir = path81.dirname(filePath);
|
|
362817
|
+
fs75.mkdirSync(dir, { recursive: true });
|
|
362818
|
+
fs75.writeFileSync(filePath, content, "utf-8");
|
|
362819
|
+
}
|
|
362820
|
+
__name(initializeLlmOutputLanguage, "initializeLlmOutputLanguage");
|
|
362821
|
+
function getCurrentLlmOutputLanguage() {
|
|
362822
|
+
const filePath = getLlmOutputLanguageRulePath();
|
|
362823
|
+
if (fs75.existsSync(filePath)) {
|
|
362824
|
+
try {
|
|
362825
|
+
const content = fs75.readFileSync(filePath, "utf-8");
|
|
362826
|
+
return extractLlmOutputLanguageFromRuleFileContent(content);
|
|
362827
|
+
} catch {
|
|
362828
|
+
}
|
|
362829
|
+
}
|
|
362830
|
+
return null;
|
|
362831
|
+
}
|
|
362832
|
+
__name(getCurrentLlmOutputLanguage, "getCurrentLlmOutputLanguage");
|
|
362833
|
+
async function setUiLanguage(context2, lang) {
|
|
362834
|
+
const { services } = context2;
|
|
362835
|
+
const { settings } = services;
|
|
362836
|
+
if (!services.config) {
|
|
362837
|
+
return {
|
|
362838
|
+
type: "message",
|
|
362839
|
+
messageType: "error",
|
|
362840
|
+
content: t4("Configuration not available.")
|
|
362841
|
+
};
|
|
362842
|
+
}
|
|
362843
|
+
await setLanguageAsync(lang);
|
|
362844
|
+
if (settings && typeof settings.setValue === "function") {
|
|
362845
|
+
try {
|
|
362846
|
+
settings.setValue("User" /* User */, "general.language", lang);
|
|
362847
|
+
} catch (error2) {
|
|
362848
|
+
console.warn("Failed to save language setting:", error2);
|
|
362849
|
+
}
|
|
362850
|
+
}
|
|
362851
|
+
context2.ui.reloadCommands();
|
|
362852
|
+
return {
|
|
362853
|
+
type: "message",
|
|
362854
|
+
messageType: "info",
|
|
362855
|
+
content: t4("UI language changed to {{lang}}", {
|
|
362856
|
+
lang: formatUiLanguageDisplay(lang)
|
|
362857
|
+
})
|
|
362858
|
+
};
|
|
362859
|
+
}
|
|
362860
|
+
__name(setUiLanguage, "setUiLanguage");
|
|
362861
|
+
function generateLlmOutputLanguageRuleFile(language) {
|
|
362862
|
+
try {
|
|
362863
|
+
const filePath = getLlmOutputLanguageRulePath();
|
|
362864
|
+
const normalizedLanguage = normalizeLanguageName(language);
|
|
362865
|
+
const content = generateLlmOutputLanguageRule(normalizedLanguage);
|
|
362866
|
+
const dir = path81.dirname(filePath);
|
|
362867
|
+
fs75.mkdirSync(dir, { recursive: true });
|
|
362868
|
+
fs75.writeFileSync(filePath, content, "utf-8");
|
|
362869
|
+
return Promise.resolve({
|
|
362870
|
+
type: "message",
|
|
362871
|
+
messageType: "info",
|
|
362872
|
+
content: [
|
|
362873
|
+
t4("LLM output language rule file generated at {{path}}", {
|
|
362874
|
+
path: filePath
|
|
362875
|
+
}),
|
|
362876
|
+
"",
|
|
362877
|
+
t4("Please restart the application for the changes to take effect.")
|
|
362878
|
+
].join("\n")
|
|
362879
|
+
});
|
|
362880
|
+
} catch (error2) {
|
|
362881
|
+
return Promise.resolve({
|
|
362882
|
+
type: "message",
|
|
362883
|
+
messageType: "error",
|
|
362884
|
+
content: t4(
|
|
362885
|
+
"Failed to generate LLM output language rule file: {{error}}",
|
|
362886
|
+
{
|
|
362887
|
+
error: error2 instanceof Error ? error2.message : String(error2)
|
|
362888
|
+
}
|
|
362889
|
+
)
|
|
362890
|
+
});
|
|
362891
|
+
}
|
|
362892
|
+
}
|
|
362893
|
+
__name(generateLlmOutputLanguageRuleFile, "generateLlmOutputLanguageRuleFile");
|
|
362894
|
+
var languageCommand = {
|
|
362895
|
+
name: "language",
|
|
362896
|
+
get description() {
|
|
362897
|
+
return t4("View or change the language setting");
|
|
362898
|
+
},
|
|
362899
|
+
kind: "built-in" /* BUILT_IN */,
|
|
362900
|
+
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
362901
|
+
const { services } = context2;
|
|
362902
|
+
if (!services.config) {
|
|
362903
|
+
return {
|
|
362904
|
+
type: "message",
|
|
362905
|
+
messageType: "error",
|
|
362906
|
+
content: t4("Configuration not available.")
|
|
362907
|
+
};
|
|
362908
|
+
}
|
|
362909
|
+
const trimmedArgs = args.trim();
|
|
362910
|
+
const parts = trimmedArgs.split(/\s+/);
|
|
362911
|
+
const firstArg = parts[0].toLowerCase();
|
|
362912
|
+
const subArgs = parts.slice(1).join(" ");
|
|
362913
|
+
if (firstArg === "ui" || firstArg === "output") {
|
|
362914
|
+
const subCommand = languageCommand.subCommands?.find(
|
|
362915
|
+
(s5) => s5.name === firstArg
|
|
362916
|
+
);
|
|
362917
|
+
if (subCommand?.action) {
|
|
362918
|
+
return subCommand.action(
|
|
362919
|
+
context2,
|
|
362920
|
+
subArgs
|
|
362921
|
+
);
|
|
362922
|
+
}
|
|
362923
|
+
}
|
|
362924
|
+
if (!trimmedArgs) {
|
|
362925
|
+
const currentUiLang = getCurrentLanguage();
|
|
362926
|
+
const currentLlmLang = getCurrentLlmOutputLanguage();
|
|
362927
|
+
const message = [
|
|
362928
|
+
t4("Current UI language: {{lang}}", {
|
|
362929
|
+
lang: formatUiLanguageDisplay(currentUiLang)
|
|
362930
|
+
}),
|
|
362931
|
+
currentLlmLang ? t4("Current LLM output language: {{lang}}", { lang: currentLlmLang }) : t4("LLM output language not set"),
|
|
362932
|
+
"",
|
|
362933
|
+
t4("Available subcommands:"),
|
|
362934
|
+
` /language ui [${SUPPORTED_LANGUAGES.map((o3) => o3.id).join("|")}] - ${t4("Set UI language")}`,
|
|
362935
|
+
` /language output <language> - ${t4("Set LLM output language")}`
|
|
362936
|
+
].join("\n");
|
|
362937
|
+
return {
|
|
362938
|
+
type: "message",
|
|
362939
|
+
messageType: "info",
|
|
362940
|
+
content: message
|
|
362941
|
+
};
|
|
362942
|
+
}
|
|
362943
|
+
const targetLang = parseUiLanguageArg(trimmedArgs);
|
|
362944
|
+
if (targetLang) {
|
|
362945
|
+
return setUiLanguage(context2, targetLang);
|
|
362946
|
+
}
|
|
362947
|
+
return {
|
|
362948
|
+
type: "message",
|
|
362949
|
+
messageType: "error",
|
|
362950
|
+
content: [
|
|
362951
|
+
t4("Invalid command. Available subcommands:"),
|
|
362952
|
+
` - /language ui [${SUPPORTED_LANGUAGES.map((o3) => o3.id).join("|")}] - ${t4("Set UI language")}`,
|
|
362953
|
+
" - /language output <language> - " + t4("Set LLM output language")
|
|
362954
|
+
].join("\n")
|
|
362955
|
+
};
|
|
362956
|
+
}, "action"),
|
|
362957
|
+
subCommands: [
|
|
362958
|
+
{
|
|
362959
|
+
name: "ui",
|
|
362960
|
+
get description() {
|
|
362961
|
+
return t4("Set UI language");
|
|
362962
|
+
},
|
|
362963
|
+
kind: "built-in" /* BUILT_IN */,
|
|
362964
|
+
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
362965
|
+
const trimmedArgs = args.trim();
|
|
362966
|
+
if (!trimmedArgs) {
|
|
362967
|
+
return {
|
|
362968
|
+
type: "message",
|
|
362969
|
+
messageType: "info",
|
|
362970
|
+
content: [
|
|
362971
|
+
t4("Set UI language"),
|
|
362972
|
+
"",
|
|
362973
|
+
t4("Usage: /language ui [{{options}}]", {
|
|
362974
|
+
options: SUPPORTED_LANGUAGES.map((o3) => o3.id).join("|")
|
|
362975
|
+
}),
|
|
362976
|
+
"",
|
|
362977
|
+
t4("Available options:"),
|
|
362978
|
+
...SUPPORTED_LANGUAGES.map(
|
|
362979
|
+
(o3) => ` - ${o3.id}: ${t4(o3.fullName)}`
|
|
362980
|
+
),
|
|
362981
|
+
"",
|
|
362982
|
+
t4(
|
|
362983
|
+
"To request additional UI language packs, please open an issue on GitHub."
|
|
362984
|
+
)
|
|
362985
|
+
].join("\n")
|
|
362986
|
+
};
|
|
362987
|
+
}
|
|
362988
|
+
const targetLang = parseUiLanguageArg(trimmedArgs);
|
|
362989
|
+
if (!targetLang) {
|
|
362990
|
+
return {
|
|
362991
|
+
type: "message",
|
|
362992
|
+
messageType: "error",
|
|
362993
|
+
content: t4("Invalid language. Available: {{options}}", {
|
|
362994
|
+
options: SUPPORTED_LANGUAGES.map((o3) => o3.id).join(",")
|
|
362995
|
+
})
|
|
362996
|
+
};
|
|
362997
|
+
}
|
|
362998
|
+
return setUiLanguage(context2, targetLang);
|
|
362999
|
+
}, "action"),
|
|
363000
|
+
subCommands: SUPPORTED_LANGUAGES.map(createUiLanguageSubCommand)
|
|
363001
|
+
},
|
|
363002
|
+
{
|
|
363003
|
+
name: "output",
|
|
363004
|
+
get description() {
|
|
363005
|
+
return t4("Set LLM output language");
|
|
363006
|
+
},
|
|
363007
|
+
kind: "built-in" /* BUILT_IN */,
|
|
363008
|
+
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
363009
|
+
const trimmedArgs = args.trim();
|
|
363010
|
+
if (!trimmedArgs) {
|
|
363011
|
+
return {
|
|
363012
|
+
type: "message",
|
|
363013
|
+
messageType: "info",
|
|
363014
|
+
content: [
|
|
363015
|
+
t4("Set LLM output language"),
|
|
363016
|
+
"",
|
|
363017
|
+
t4("Usage: /language output <language>"),
|
|
363018
|
+
` ${t4("Example: /language output \u4E2D\u6587")}`,
|
|
363019
|
+
` ${t4("Example: /language output English")}`,
|
|
363020
|
+
` ${t4("Example: /language output \u65E5\u672C\u8A9E")}`
|
|
363021
|
+
].join("\n")
|
|
363022
|
+
};
|
|
363023
|
+
}
|
|
363024
|
+
return generateLlmOutputLanguageRuleFile(trimmedArgs);
|
|
363025
|
+
}, "action")
|
|
363026
|
+
}
|
|
363027
|
+
]
|
|
363028
|
+
};
|
|
363029
|
+
function createUiLanguageSubCommand(option2) {
|
|
363030
|
+
return {
|
|
363031
|
+
name: option2.id,
|
|
363032
|
+
get description() {
|
|
363033
|
+
return t4("Set UI language to {{name}}", { name: option2.fullName });
|
|
363034
|
+
},
|
|
363035
|
+
kind: "built-in" /* BUILT_IN */,
|
|
363036
|
+
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
363037
|
+
if (args.trim().length > 0) {
|
|
363038
|
+
return {
|
|
363039
|
+
type: "message",
|
|
363040
|
+
messageType: "error",
|
|
363041
|
+
content: t4(
|
|
363042
|
+
"Language subcommands do not accept additional arguments."
|
|
363043
|
+
)
|
|
363044
|
+
};
|
|
363045
|
+
}
|
|
363046
|
+
return setUiLanguage(context2, option2.code);
|
|
363047
|
+
}, "action")
|
|
363048
|
+
};
|
|
363049
|
+
}
|
|
363050
|
+
__name(createUiLanguageSubCommand, "createUiLanguageSubCommand");
|
|
363051
|
+
|
|
362729
363052
|
// packages/cli/src/core/initializer.ts
|
|
362730
363053
|
async function initializeApp(config2, settings) {
|
|
362731
363054
|
const languageSetting = process.env["QWEN_CODE_LANG"] || settings.merged.general?.language || "auto";
|
|
362732
363055
|
await initializeI18n(languageSetting);
|
|
363056
|
+
initializeLlmOutputLanguage();
|
|
362733
363057
|
const authType = settings.merged.security?.auth?.selectedType;
|
|
362734
363058
|
const authError = await performInitialAuth(config2, authType);
|
|
362735
363059
|
if (authError) {
|
|
@@ -362878,6 +363202,105 @@ import { randomUUID as randomUUID6 } from "node:crypto";
|
|
|
362878
363202
|
// packages/cli/src/utils/nonInteractiveHelpers.ts
|
|
362879
363203
|
init_esbuild_shims();
|
|
362880
363204
|
|
|
363205
|
+
// packages/cli/src/ui/utils/computeStats.ts
|
|
363206
|
+
init_esbuild_shims();
|
|
363207
|
+
function calculateErrorRate(metrics2) {
|
|
363208
|
+
if (metrics2.api.totalRequests === 0) {
|
|
363209
|
+
return 0;
|
|
363210
|
+
}
|
|
363211
|
+
return metrics2.api.totalErrors / metrics2.api.totalRequests * 100;
|
|
363212
|
+
}
|
|
363213
|
+
__name(calculateErrorRate, "calculateErrorRate");
|
|
363214
|
+
function calculateAverageLatency(metrics2) {
|
|
363215
|
+
if (metrics2.api.totalRequests === 0) {
|
|
363216
|
+
return 0;
|
|
363217
|
+
}
|
|
363218
|
+
return metrics2.api.totalLatencyMs / metrics2.api.totalRequests;
|
|
363219
|
+
}
|
|
363220
|
+
__name(calculateAverageLatency, "calculateAverageLatency");
|
|
363221
|
+
function calculateCacheHitRate(metrics2) {
|
|
363222
|
+
if (metrics2.tokens.prompt === 0) {
|
|
363223
|
+
return 0;
|
|
363224
|
+
}
|
|
363225
|
+
return metrics2.tokens.cached / metrics2.tokens.prompt * 100;
|
|
363226
|
+
}
|
|
363227
|
+
__name(calculateCacheHitRate, "calculateCacheHitRate");
|
|
363228
|
+
var computeSessionStats = /* @__PURE__ */ __name((metrics2) => {
|
|
363229
|
+
const { models, tools, files } = metrics2;
|
|
363230
|
+
const totalApiTime = Object.values(models).reduce(
|
|
363231
|
+
(acc, model) => acc + model.api.totalLatencyMs,
|
|
363232
|
+
0
|
|
363233
|
+
);
|
|
363234
|
+
const totalToolTime = tools.totalDurationMs;
|
|
363235
|
+
const agentActiveTime = totalApiTime + totalToolTime;
|
|
363236
|
+
const apiTimePercent = agentActiveTime > 0 ? totalApiTime / agentActiveTime * 100 : 0;
|
|
363237
|
+
const toolTimePercent = agentActiveTime > 0 ? totalToolTime / agentActiveTime * 100 : 0;
|
|
363238
|
+
const totalCachedTokens = Object.values(models).reduce(
|
|
363239
|
+
(acc, model) => acc + model.tokens.cached,
|
|
363240
|
+
0
|
|
363241
|
+
);
|
|
363242
|
+
const totalPromptTokens = Object.values(models).reduce(
|
|
363243
|
+
(acc, model) => acc + model.tokens.prompt,
|
|
363244
|
+
0
|
|
363245
|
+
);
|
|
363246
|
+
const cacheEfficiency = totalPromptTokens > 0 ? totalCachedTokens / totalPromptTokens * 100 : 0;
|
|
363247
|
+
const totalDecisions = tools.totalDecisions.accept + tools.totalDecisions.reject + tools.totalDecisions.modify;
|
|
363248
|
+
const successRate = tools.totalCalls > 0 ? tools.totalSuccess / tools.totalCalls * 100 : 0;
|
|
363249
|
+
const agreementRate = totalDecisions > 0 ? tools.totalDecisions.accept / totalDecisions * 100 : 0;
|
|
363250
|
+
return {
|
|
363251
|
+
totalApiTime,
|
|
363252
|
+
totalToolTime,
|
|
363253
|
+
agentActiveTime,
|
|
363254
|
+
apiTimePercent,
|
|
363255
|
+
toolTimePercent,
|
|
363256
|
+
cacheEfficiency,
|
|
363257
|
+
totalDecisions,
|
|
363258
|
+
successRate,
|
|
363259
|
+
agreementRate,
|
|
363260
|
+
totalCachedTokens,
|
|
363261
|
+
totalPromptTokens,
|
|
363262
|
+
totalLinesAdded: files.totalLinesAdded,
|
|
363263
|
+
totalLinesRemoved: files.totalLinesRemoved
|
|
363264
|
+
};
|
|
363265
|
+
}, "computeSessionStats");
|
|
363266
|
+
|
|
363267
|
+
// packages/cli/src/nonInteractiveCliCommands.ts
|
|
363268
|
+
init_esbuild_shims();
|
|
363269
|
+
|
|
363270
|
+
// packages/cli/src/utils/commands.ts
|
|
363271
|
+
init_esbuild_shims();
|
|
363272
|
+
var parseSlashCommand = /* @__PURE__ */ __name((query, commands) => {
|
|
363273
|
+
const trimmed2 = query.trim();
|
|
363274
|
+
const parts = trimmed2.substring(1).trim().split(/\s+/);
|
|
363275
|
+
const commandPath = parts.filter((p2) => p2);
|
|
363276
|
+
let currentCommands = commands;
|
|
363277
|
+
let commandToExecute;
|
|
363278
|
+
let pathIndex = 0;
|
|
363279
|
+
const canonicalPath = [];
|
|
363280
|
+
for (const part of commandPath) {
|
|
363281
|
+
let foundCommand = currentCommands.find((cmd) => cmd.name === part);
|
|
363282
|
+
if (!foundCommand) {
|
|
363283
|
+
foundCommand = currentCommands.find(
|
|
363284
|
+
(cmd) => cmd.altNames?.includes(part)
|
|
363285
|
+
);
|
|
363286
|
+
}
|
|
363287
|
+
if (foundCommand) {
|
|
363288
|
+
commandToExecute = foundCommand;
|
|
363289
|
+
canonicalPath.push(foundCommand.name);
|
|
363290
|
+
pathIndex++;
|
|
363291
|
+
if (foundCommand.subCommands) {
|
|
363292
|
+
currentCommands = foundCommand.subCommands;
|
|
363293
|
+
} else {
|
|
363294
|
+
break;
|
|
363295
|
+
}
|
|
363296
|
+
} else {
|
|
363297
|
+
break;
|
|
363298
|
+
}
|
|
363299
|
+
}
|
|
363300
|
+
const args = parts.slice(pathIndex).join(" ");
|
|
363301
|
+
return { commandToExecute, args, canonicalPath };
|
|
363302
|
+
}, "parseSlashCommand");
|
|
363303
|
+
|
|
362881
363304
|
// packages/cli/src/services/CommandService.ts
|
|
362882
363305
|
init_esbuild_shims();
|
|
362883
363306
|
var CommandService = class _CommandService {
|
|
@@ -362961,9 +363384,6 @@ init_esbuild_shims();
|
|
|
362961
363384
|
// packages/cli/src/ui/commands/aboutCommand.ts
|
|
362962
363385
|
init_esbuild_shims();
|
|
362963
363386
|
|
|
362964
|
-
// packages/cli/src/ui/commands/types.ts
|
|
362965
|
-
init_esbuild_shims();
|
|
362966
|
-
|
|
362967
363387
|
// packages/cli/src/ui/types.ts
|
|
362968
363388
|
init_esbuild_shims();
|
|
362969
363389
|
var import_react26 = __toESM(require_react(), 1);
|
|
@@ -363046,7 +363466,7 @@ var formatDuration = /* @__PURE__ */ __name((milliseconds) => {
|
|
|
363046
363466
|
|
|
363047
363467
|
// packages/cli/src/generated/git-commit.ts
|
|
363048
363468
|
init_esbuild_shims();
|
|
363049
|
-
var GIT_COMMIT_INFO2 = "
|
|
363469
|
+
var GIT_COMMIT_INFO2 = "53604963";
|
|
363050
363470
|
|
|
363051
363471
|
// packages/cli/src/utils/systemInfo.ts
|
|
363052
363472
|
async function getNpmVersion() {
|
|
@@ -363381,7 +363801,8 @@ var compressCommand = {
|
|
|
363381
363801
|
kind: "built-in" /* BUILT_IN */,
|
|
363382
363802
|
action: /* @__PURE__ */ __name(async (context2) => {
|
|
363383
363803
|
const { ui: ui2 } = context2;
|
|
363384
|
-
|
|
363804
|
+
const executionMode = context2.executionMode ?? "interactive";
|
|
363805
|
+
if (executionMode === "interactive" && ui2.pendingItem) {
|
|
363385
363806
|
ui2.addItem(
|
|
363386
363807
|
{
|
|
363387
363808
|
type: "error" /* ERROR */,
|
|
@@ -363400,11 +363821,72 @@ var compressCommand = {
|
|
|
363400
363821
|
compressionStatus: null
|
|
363401
363822
|
}
|
|
363402
363823
|
};
|
|
363403
|
-
|
|
363404
|
-
|
|
363824
|
+
const config2 = context2.services.config;
|
|
363825
|
+
const geminiClient = config2?.getGeminiClient();
|
|
363826
|
+
if (!config2 || !geminiClient) {
|
|
363827
|
+
return {
|
|
363828
|
+
type: "message",
|
|
363829
|
+
messageType: "error",
|
|
363830
|
+
content: t4("Config not loaded.")
|
|
363831
|
+
};
|
|
363832
|
+
}
|
|
363833
|
+
const doCompress = /* @__PURE__ */ __name(async () => {
|
|
363405
363834
|
const promptId = `compress-${Date.now()}`;
|
|
363406
|
-
|
|
363407
|
-
|
|
363835
|
+
return await geminiClient.tryCompressChat(promptId, true);
|
|
363836
|
+
}, "doCompress");
|
|
363837
|
+
if (executionMode === "acp") {
|
|
363838
|
+
const messages = /* @__PURE__ */ __name(async function* () {
|
|
363839
|
+
try {
|
|
363840
|
+
yield {
|
|
363841
|
+
messageType: "info",
|
|
363842
|
+
content: "Compressing context..."
|
|
363843
|
+
};
|
|
363844
|
+
const compressed = await doCompress();
|
|
363845
|
+
if (!compressed) {
|
|
363846
|
+
yield {
|
|
363847
|
+
messageType: "error",
|
|
363848
|
+
content: t4("Failed to compress chat history.")
|
|
363849
|
+
};
|
|
363850
|
+
return;
|
|
363851
|
+
}
|
|
363852
|
+
yield {
|
|
363853
|
+
messageType: "info",
|
|
363854
|
+
content: `Context compressed (${compressed.originalTokenCount} -> ${compressed.newTokenCount}).`
|
|
363855
|
+
};
|
|
363856
|
+
} catch (e4) {
|
|
363857
|
+
yield {
|
|
363858
|
+
messageType: "error",
|
|
363859
|
+
content: t4("Failed to compress chat history: {{error}}", {
|
|
363860
|
+
error: e4 instanceof Error ? e4.message : String(e4)
|
|
363861
|
+
})
|
|
363862
|
+
};
|
|
363863
|
+
}
|
|
363864
|
+
}, "messages");
|
|
363865
|
+
return { type: "stream_messages", messages: messages() };
|
|
363866
|
+
}
|
|
363867
|
+
try {
|
|
363868
|
+
if (executionMode === "interactive") {
|
|
363869
|
+
ui2.setPendingItem(pendingMessage);
|
|
363870
|
+
}
|
|
363871
|
+
const compressed = await doCompress();
|
|
363872
|
+
if (!compressed) {
|
|
363873
|
+
if (executionMode === "interactive") {
|
|
363874
|
+
ui2.addItem(
|
|
363875
|
+
{
|
|
363876
|
+
type: "error" /* ERROR */,
|
|
363877
|
+
text: t4("Failed to compress chat history.")
|
|
363878
|
+
},
|
|
363879
|
+
Date.now()
|
|
363880
|
+
);
|
|
363881
|
+
return;
|
|
363882
|
+
}
|
|
363883
|
+
return {
|
|
363884
|
+
type: "message",
|
|
363885
|
+
messageType: "error",
|
|
363886
|
+
content: t4("Failed to compress chat history.")
|
|
363887
|
+
};
|
|
363888
|
+
}
|
|
363889
|
+
if (executionMode === "interactive") {
|
|
363408
363890
|
ui2.addItem(
|
|
363409
363891
|
{
|
|
363410
363892
|
type: "compression" /* COMPRESSION */,
|
|
@@ -363417,27 +363899,37 @@ var compressCommand = {
|
|
|
363417
363899
|
},
|
|
363418
363900
|
Date.now()
|
|
363419
363901
|
);
|
|
363420
|
-
|
|
363902
|
+
return;
|
|
363903
|
+
}
|
|
363904
|
+
return {
|
|
363905
|
+
type: "message",
|
|
363906
|
+
messageType: "info",
|
|
363907
|
+
content: `Context compressed (${compressed.originalTokenCount} -> ${compressed.newTokenCount}).`
|
|
363908
|
+
};
|
|
363909
|
+
} catch (e4) {
|
|
363910
|
+
if (executionMode === "interactive") {
|
|
363421
363911
|
ui2.addItem(
|
|
363422
363912
|
{
|
|
363423
363913
|
type: "error" /* ERROR */,
|
|
363424
|
-
text: t4("Failed to compress chat history
|
|
363914
|
+
text: t4("Failed to compress chat history: {{error}}", {
|
|
363915
|
+
error: e4 instanceof Error ? e4.message : String(e4)
|
|
363916
|
+
})
|
|
363425
363917
|
},
|
|
363426
363918
|
Date.now()
|
|
363427
363919
|
);
|
|
363920
|
+
return;
|
|
363428
363921
|
}
|
|
363429
|
-
|
|
363430
|
-
|
|
363431
|
-
|
|
363432
|
-
|
|
363433
|
-
|
|
363434
|
-
|
|
363435
|
-
|
|
363436
|
-
},
|
|
363437
|
-
Date.now()
|
|
363438
|
-
);
|
|
363922
|
+
return {
|
|
363923
|
+
type: "message",
|
|
363924
|
+
messageType: "error",
|
|
363925
|
+
content: t4("Failed to compress chat history: {{error}}", {
|
|
363926
|
+
error: e4 instanceof Error ? e4.message : String(e4)
|
|
363927
|
+
})
|
|
363928
|
+
};
|
|
363439
363929
|
} finally {
|
|
363440
|
-
|
|
363930
|
+
if (executionMode === "interactive") {
|
|
363931
|
+
ui2.setPendingItem(null);
|
|
363932
|
+
}
|
|
363441
363933
|
}
|
|
363442
363934
|
}, "action")
|
|
363443
363935
|
};
|
|
@@ -363533,7 +364025,7 @@ var docsCommand = {
|
|
|
363533
364025
|
// packages/cli/src/ui/commands/directoryCommand.tsx
|
|
363534
364026
|
init_esbuild_shims();
|
|
363535
364027
|
import * as os29 from "node:os";
|
|
363536
|
-
import * as
|
|
364028
|
+
import * as path82 from "node:path";
|
|
363537
364029
|
function expandHomeDir(p2) {
|
|
363538
364030
|
if (!p2) {
|
|
363539
364031
|
return "";
|
|
@@ -363544,7 +364036,7 @@ function expandHomeDir(p2) {
|
|
|
363544
364036
|
} else if (p2 === "~" || p2.startsWith("~/")) {
|
|
363545
364037
|
expandedPath = os29.homedir() + p2.substring(1);
|
|
363546
364038
|
}
|
|
363547
|
-
return
|
|
364039
|
+
return path82.normalize(expandedPath);
|
|
363548
364040
|
}
|
|
363549
364041
|
__name(expandHomeDir, "expandHomeDir");
|
|
363550
364042
|
var directoryCommand = {
|
|
@@ -363897,7 +364389,7 @@ var helpCommand = {
|
|
|
363897
364389
|
|
|
363898
364390
|
// packages/cli/src/ui/commands/ideCommand.ts
|
|
363899
364391
|
init_esbuild_shims();
|
|
363900
|
-
import
|
|
364392
|
+
import path83 from "node:path";
|
|
363901
364393
|
function getIdeStatusMessage(ideClient) {
|
|
363902
364394
|
const connection = ideClient.getConnectionStatus();
|
|
363903
364395
|
switch (connection.status) {
|
|
@@ -363927,13 +364419,13 @@ __name(getIdeStatusMessage, "getIdeStatusMessage");
|
|
|
363927
364419
|
function formatFileList(openFiles) {
|
|
363928
364420
|
const basenameCounts = /* @__PURE__ */ new Map();
|
|
363929
364421
|
for (const file of openFiles) {
|
|
363930
|
-
const basename19 =
|
|
364422
|
+
const basename19 = path83.basename(file.path);
|
|
363931
364423
|
basenameCounts.set(basename19, (basenameCounts.get(basename19) || 0) + 1);
|
|
363932
364424
|
}
|
|
363933
364425
|
const fileList = openFiles.map((file) => {
|
|
363934
|
-
const basename19 =
|
|
364426
|
+
const basename19 = path83.basename(file.path);
|
|
363935
364427
|
const isDuplicate = (basenameCounts.get(basename19) || 0) > 1;
|
|
363936
|
-
const parentDir =
|
|
364428
|
+
const parentDir = path83.basename(path83.dirname(file.path));
|
|
363937
364429
|
const displayName = isDuplicate ? `${basename19} (/${parentDir})` : basename19;
|
|
363938
364430
|
return ` - ${displayName}${file.isActive ? " (active)" : ""}`;
|
|
363939
364431
|
}).join("\n");
|
|
@@ -364164,8 +364656,8 @@ var ideCommand = /* @__PURE__ */ __name(async () => {
|
|
|
364164
364656
|
|
|
364165
364657
|
// packages/cli/src/ui/commands/initCommand.ts
|
|
364166
364658
|
init_esbuild_shims();
|
|
364167
|
-
import * as
|
|
364168
|
-
import * as
|
|
364659
|
+
import * as fs76 from "node:fs";
|
|
364660
|
+
import * as path84 from "node:path";
|
|
364169
364661
|
var import_react27 = __toESM(require_react(), 1);
|
|
364170
364662
|
var initCommand = {
|
|
364171
364663
|
name: "init",
|
|
@@ -364183,11 +364675,11 @@ var initCommand = {
|
|
|
364183
364675
|
}
|
|
364184
364676
|
const targetDir = context2.services.config.getTargetDir();
|
|
364185
364677
|
const contextFileName = getCurrentGeminiMdFilename();
|
|
364186
|
-
const contextFilePath =
|
|
364678
|
+
const contextFilePath = path84.join(targetDir, contextFileName);
|
|
364187
364679
|
try {
|
|
364188
|
-
if (
|
|
364680
|
+
if (fs76.existsSync(contextFilePath)) {
|
|
364189
364681
|
try {
|
|
364190
|
-
const existing =
|
|
364682
|
+
const existing = fs76.readFileSync(contextFilePath, "utf8");
|
|
364191
364683
|
if (existing && existing.trim().length > 0) {
|
|
364192
364684
|
if (!context2.overwriteConfirmed) {
|
|
364193
364685
|
return {
|
|
@@ -364209,7 +364701,7 @@ var initCommand = {
|
|
|
364209
364701
|
}
|
|
364210
364702
|
}
|
|
364211
364703
|
try {
|
|
364212
|
-
|
|
364704
|
+
fs76.writeFileSync(contextFilePath, "", "utf8");
|
|
364213
364705
|
context2.ui.addItem(
|
|
364214
364706
|
{
|
|
364215
364707
|
type: "info",
|
|
@@ -364272,378 +364764,6 @@ Write the complete content to the \`${contextFileName}\` file. The output must b
|
|
|
364272
364764
|
}, "action")
|
|
364273
364765
|
};
|
|
364274
364766
|
|
|
364275
|
-
// packages/cli/src/ui/commands/languageCommand.ts
|
|
364276
|
-
init_esbuild_shims();
|
|
364277
|
-
import * as fs76 from "node:fs";
|
|
364278
|
-
import * as path84 from "node:path";
|
|
364279
|
-
var LLM_OUTPUT_LANGUAGE_RULE_FILENAME = "output-language.md";
|
|
364280
|
-
function generateLlmOutputLanguageRule(language) {
|
|
364281
|
-
return `# \u26A0\uFE0F CRITICAL: ${language} Output Language Rule - HIGHEST PRIORITY \u26A0\uFE0F
|
|
364282
|
-
|
|
364283
|
-
## \u{1F6A8} MANDATORY RULE - NO EXCEPTIONS \u{1F6A8}
|
|
364284
|
-
|
|
364285
|
-
**YOU MUST RESPOND IN ${language.toUpperCase()} FOR EVERY SINGLE OUTPUT, REGARDLESS OF THE USER'S INPUT LANGUAGE.**
|
|
364286
|
-
|
|
364287
|
-
This is a **NON-NEGOTIABLE** requirement. Even if the user writes in English, says "hi", asks a simple question, or explicitly requests another language, **YOU MUST ALWAYS RESPOND IN ${language.toUpperCase()}.**
|
|
364288
|
-
|
|
364289
|
-
## What Must Be in ${language}
|
|
364290
|
-
|
|
364291
|
-
**EVERYTHING** you output: conversation replies, tool call descriptions, success/error messages, generated file content (comments, documentation), and all explanatory text.
|
|
364292
|
-
|
|
364293
|
-
**Tool outputs**: All descriptive text from \`read_file\`, \`write_file\`, \`codebase_search\`, \`run_terminal_cmd\`, \`todo_write\`, \`web_search\`, etc. MUST be in ${language}.
|
|
364294
|
-
|
|
364295
|
-
## Examples
|
|
364296
|
-
|
|
364297
|
-
### \u2705 CORRECT:
|
|
364298
|
-
- User says "hi" \u2192 Respond in ${language} (e.g., "Bonjour" if ${language} is French)
|
|
364299
|
-
- Tool result \u2192 "\u5DF2\u6210\u529F\u8BFB\u53D6\u6587\u4EF6 config.json" (if ${language} is Chinese)
|
|
364300
|
-
- Error \u2192 "\u65E0\u6CD5\u627E\u5230\u6307\u5B9A\u7684\u6587\u4EF6" (if ${language} is Chinese)
|
|
364301
|
-
|
|
364302
|
-
### \u274C WRONG:
|
|
364303
|
-
- User says "hi" \u2192 "Hello" in English
|
|
364304
|
-
- Tool result \u2192 "Successfully read file" in English
|
|
364305
|
-
- Error \u2192 "File not found" in English
|
|
364306
|
-
|
|
364307
|
-
## Notes
|
|
364308
|
-
|
|
364309
|
-
- Code elements (variable/function names, syntax) can remain in English
|
|
364310
|
-
- Comments, documentation, and all other text MUST be in ${language}
|
|
364311
|
-
|
|
364312
|
-
**THIS RULE IS ACTIVE NOW. ALL OUTPUTS MUST BE IN ${language.toUpperCase()}. NO EXCEPTIONS.**
|
|
364313
|
-
`;
|
|
364314
|
-
}
|
|
364315
|
-
__name(generateLlmOutputLanguageRule, "generateLlmOutputLanguageRule");
|
|
364316
|
-
function getLlmOutputLanguageRulePath() {
|
|
364317
|
-
return path84.join(
|
|
364318
|
-
Storage.getGlobalQwenDir(),
|
|
364319
|
-
LLM_OUTPUT_LANGUAGE_RULE_FILENAME
|
|
364320
|
-
);
|
|
364321
|
-
}
|
|
364322
|
-
__name(getLlmOutputLanguageRulePath, "getLlmOutputLanguageRulePath");
|
|
364323
|
-
function getCurrentLlmOutputLanguage() {
|
|
364324
|
-
const filePath = getLlmOutputLanguageRulePath();
|
|
364325
|
-
if (fs76.existsSync(filePath)) {
|
|
364326
|
-
try {
|
|
364327
|
-
const content = fs76.readFileSync(filePath, "utf-8");
|
|
364328
|
-
const match2 = content.match(/^#.*?(\w+)\s+Output Language Rule/i);
|
|
364329
|
-
if (match2) {
|
|
364330
|
-
return match2[1];
|
|
364331
|
-
}
|
|
364332
|
-
} catch {
|
|
364333
|
-
}
|
|
364334
|
-
}
|
|
364335
|
-
return null;
|
|
364336
|
-
}
|
|
364337
|
-
__name(getCurrentLlmOutputLanguage, "getCurrentLlmOutputLanguage");
|
|
364338
|
-
async function setUiLanguage(context2, lang) {
|
|
364339
|
-
const { services } = context2;
|
|
364340
|
-
const { settings } = services;
|
|
364341
|
-
if (!services.config) {
|
|
364342
|
-
return {
|
|
364343
|
-
type: "message",
|
|
364344
|
-
messageType: "error",
|
|
364345
|
-
content: t4("Configuration not available.")
|
|
364346
|
-
};
|
|
364347
|
-
}
|
|
364348
|
-
await setLanguageAsync(lang);
|
|
364349
|
-
if (settings && typeof settings.setValue === "function") {
|
|
364350
|
-
try {
|
|
364351
|
-
settings.setValue("User" /* User */, "general.language", lang);
|
|
364352
|
-
} catch (error2) {
|
|
364353
|
-
console.warn("Failed to save language setting:", error2);
|
|
364354
|
-
}
|
|
364355
|
-
}
|
|
364356
|
-
context2.ui.reloadCommands();
|
|
364357
|
-
const langDisplayNames = {
|
|
364358
|
-
zh: "\u4E2D\u6587\uFF08zh-CN\uFF09",
|
|
364359
|
-
en: "English\uFF08en-US\uFF09",
|
|
364360
|
-
ru: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439 (ru-RU)"
|
|
364361
|
-
};
|
|
364362
|
-
return {
|
|
364363
|
-
type: "message",
|
|
364364
|
-
messageType: "info",
|
|
364365
|
-
content: t4("UI language changed to {{lang}}", {
|
|
364366
|
-
lang: langDisplayNames[lang] || lang
|
|
364367
|
-
})
|
|
364368
|
-
};
|
|
364369
|
-
}
|
|
364370
|
-
__name(setUiLanguage, "setUiLanguage");
|
|
364371
|
-
function generateLlmOutputLanguageRuleFile(language) {
|
|
364372
|
-
try {
|
|
364373
|
-
const filePath = getLlmOutputLanguageRulePath();
|
|
364374
|
-
const content = generateLlmOutputLanguageRule(language);
|
|
364375
|
-
const dir = path84.dirname(filePath);
|
|
364376
|
-
fs76.mkdirSync(dir, { recursive: true });
|
|
364377
|
-
fs76.writeFileSync(filePath, content, "utf-8");
|
|
364378
|
-
return Promise.resolve({
|
|
364379
|
-
type: "message",
|
|
364380
|
-
messageType: "info",
|
|
364381
|
-
content: [
|
|
364382
|
-
t4("LLM output language rule file generated at {{path}}", {
|
|
364383
|
-
path: filePath
|
|
364384
|
-
}),
|
|
364385
|
-
"",
|
|
364386
|
-
t4("Please restart the application for the changes to take effect.")
|
|
364387
|
-
].join("\n")
|
|
364388
|
-
});
|
|
364389
|
-
} catch (error2) {
|
|
364390
|
-
return Promise.resolve({
|
|
364391
|
-
type: "message",
|
|
364392
|
-
messageType: "error",
|
|
364393
|
-
content: t4(
|
|
364394
|
-
"Failed to generate LLM output language rule file: {{error}}",
|
|
364395
|
-
{
|
|
364396
|
-
error: error2 instanceof Error ? error2.message : String(error2)
|
|
364397
|
-
}
|
|
364398
|
-
)
|
|
364399
|
-
});
|
|
364400
|
-
}
|
|
364401
|
-
}
|
|
364402
|
-
__name(generateLlmOutputLanguageRuleFile, "generateLlmOutputLanguageRuleFile");
|
|
364403
|
-
var languageCommand = {
|
|
364404
|
-
name: "language",
|
|
364405
|
-
get description() {
|
|
364406
|
-
return t4("View or change the language setting");
|
|
364407
|
-
},
|
|
364408
|
-
kind: "built-in" /* BUILT_IN */,
|
|
364409
|
-
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
364410
|
-
const { services } = context2;
|
|
364411
|
-
if (!services.config) {
|
|
364412
|
-
return {
|
|
364413
|
-
type: "message",
|
|
364414
|
-
messageType: "error",
|
|
364415
|
-
content: t4("Configuration not available.")
|
|
364416
|
-
};
|
|
364417
|
-
}
|
|
364418
|
-
const trimmedArgs = args.trim();
|
|
364419
|
-
if (!trimmedArgs) {
|
|
364420
|
-
const currentUiLang = getCurrentLanguage();
|
|
364421
|
-
const currentLlmLang = getCurrentLlmOutputLanguage();
|
|
364422
|
-
const message = [
|
|
364423
|
-
t4("Current UI language: {{lang}}", { lang: currentUiLang }),
|
|
364424
|
-
currentLlmLang ? t4("Current LLM output language: {{lang}}", { lang: currentLlmLang }) : t4("LLM output language not set"),
|
|
364425
|
-
"",
|
|
364426
|
-
t4("Available subcommands:"),
|
|
364427
|
-
` /language ui [zh-CN|en-US|ru-RU] - ${t4("Set UI language")}`,
|
|
364428
|
-
` /language output <language> - ${t4("Set LLM output language")}`
|
|
364429
|
-
].join("\n");
|
|
364430
|
-
return {
|
|
364431
|
-
type: "message",
|
|
364432
|
-
messageType: "info",
|
|
364433
|
-
content: message
|
|
364434
|
-
};
|
|
364435
|
-
}
|
|
364436
|
-
const parts = trimmedArgs.split(/\s+/);
|
|
364437
|
-
const subcommand = parts[0].toLowerCase();
|
|
364438
|
-
if (subcommand === "ui") {
|
|
364439
|
-
if (parts.length === 1) {
|
|
364440
|
-
return {
|
|
364441
|
-
type: "message",
|
|
364442
|
-
messageType: "info",
|
|
364443
|
-
content: [
|
|
364444
|
-
t4("Set UI language"),
|
|
364445
|
-
"",
|
|
364446
|
-
t4("Usage: /language ui [zh-CN|en-US|ru-RU]"),
|
|
364447
|
-
"",
|
|
364448
|
-
t4("Available options:"),
|
|
364449
|
-
t4(" - zh-CN: Simplified Chinese"),
|
|
364450
|
-
t4(" - en-US: English"),
|
|
364451
|
-
t4(" - ru-RU: Russian"),
|
|
364452
|
-
"",
|
|
364453
|
-
t4(
|
|
364454
|
-
"To request additional UI language packs, please open an issue on GitHub."
|
|
364455
|
-
)
|
|
364456
|
-
].join("\n")
|
|
364457
|
-
};
|
|
364458
|
-
}
|
|
364459
|
-
const langArg = parts[1].toLowerCase();
|
|
364460
|
-
let targetLang = null;
|
|
364461
|
-
if (langArg === "en" || langArg === "english" || langArg === "en-us") {
|
|
364462
|
-
targetLang = "en";
|
|
364463
|
-
} else if (langArg === "zh" || langArg === "chinese" || langArg === "\u4E2D\u6587" || langArg === "zh-cn") {
|
|
364464
|
-
targetLang = "zh";
|
|
364465
|
-
} else if (langArg === "ru" || langArg === "ru-RU" || langArg === "russian" || langArg === "\u0440\u0443\u0441\u0441\u043A\u0438\u0439") {
|
|
364466
|
-
targetLang = "ru";
|
|
364467
|
-
} else {
|
|
364468
|
-
return {
|
|
364469
|
-
type: "message",
|
|
364470
|
-
messageType: "error",
|
|
364471
|
-
content: t4("Invalid language. Available: en-US, zh-CN, ru-RU")
|
|
364472
|
-
};
|
|
364473
|
-
}
|
|
364474
|
-
return setUiLanguage(context2, targetLang);
|
|
364475
|
-
} else if (subcommand === "output") {
|
|
364476
|
-
if (parts.length === 1) {
|
|
364477
|
-
return {
|
|
364478
|
-
type: "message",
|
|
364479
|
-
messageType: "info",
|
|
364480
|
-
content: [
|
|
364481
|
-
t4("Set LLM output language"),
|
|
364482
|
-
"",
|
|
364483
|
-
t4("Usage: /language output <language>"),
|
|
364484
|
-
` ${t4("Example: /language output \u4E2D\u6587")}`
|
|
364485
|
-
].join("\n")
|
|
364486
|
-
};
|
|
364487
|
-
}
|
|
364488
|
-
const language = parts.slice(1).join(" ");
|
|
364489
|
-
return generateLlmOutputLanguageRuleFile(language);
|
|
364490
|
-
} else {
|
|
364491
|
-
const langArg = trimmedArgs.toLowerCase();
|
|
364492
|
-
let targetLang = null;
|
|
364493
|
-
if (langArg === "en" || langArg === "english" || langArg === "en-us") {
|
|
364494
|
-
targetLang = "en";
|
|
364495
|
-
} else if (langArg === "zh" || langArg === "chinese" || langArg === "\u4E2D\u6587" || langArg === "zh-cn") {
|
|
364496
|
-
targetLang = "zh";
|
|
364497
|
-
} else if (langArg === "ru" || langArg === "ru-RU" || langArg === "russian" || langArg === "\u0440\u0443\u0441\u0441\u043A\u0438\u0439") {
|
|
364498
|
-
targetLang = "ru";
|
|
364499
|
-
} else {
|
|
364500
|
-
return {
|
|
364501
|
-
type: "message",
|
|
364502
|
-
messageType: "error",
|
|
364503
|
-
content: [
|
|
364504
|
-
t4("Invalid command. Available subcommands:"),
|
|
364505
|
-
" - /language ui [zh-CN|en-US|ru-RU] - " + t4("Set UI language"),
|
|
364506
|
-
" - /language output <language> - " + t4("Set LLM output language")
|
|
364507
|
-
].join("\n")
|
|
364508
|
-
};
|
|
364509
|
-
}
|
|
364510
|
-
return setUiLanguage(context2, targetLang);
|
|
364511
|
-
}
|
|
364512
|
-
}, "action"),
|
|
364513
|
-
subCommands: [
|
|
364514
|
-
{
|
|
364515
|
-
name: "ui",
|
|
364516
|
-
get description() {
|
|
364517
|
-
return t4("Set UI language");
|
|
364518
|
-
},
|
|
364519
|
-
kind: "built-in" /* BUILT_IN */,
|
|
364520
|
-
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
364521
|
-
const trimmedArgs = args.trim();
|
|
364522
|
-
if (!trimmedArgs) {
|
|
364523
|
-
return {
|
|
364524
|
-
type: "message",
|
|
364525
|
-
messageType: "info",
|
|
364526
|
-
content: [
|
|
364527
|
-
t4("Set UI language"),
|
|
364528
|
-
"",
|
|
364529
|
-
t4("Usage: /language ui [zh-CN|en-US]"),
|
|
364530
|
-
"",
|
|
364531
|
-
t4("Available options:"),
|
|
364532
|
-
t4(" - zh-CN: Simplified Chinese"),
|
|
364533
|
-
t4(" - en-US: English"),
|
|
364534
|
-
"",
|
|
364535
|
-
t4(
|
|
364536
|
-
"To request additional UI language packs, please open an issue on GitHub."
|
|
364537
|
-
)
|
|
364538
|
-
].join("\n")
|
|
364539
|
-
};
|
|
364540
|
-
}
|
|
364541
|
-
const langArg = trimmedArgs.toLowerCase();
|
|
364542
|
-
let targetLang = null;
|
|
364543
|
-
if (langArg === "en" || langArg === "english" || langArg === "en-us") {
|
|
364544
|
-
targetLang = "en";
|
|
364545
|
-
} else if (langArg === "zh" || langArg === "chinese" || langArg === "\u4E2D\u6587" || langArg === "zh-cn") {
|
|
364546
|
-
targetLang = "zh";
|
|
364547
|
-
} else {
|
|
364548
|
-
return {
|
|
364549
|
-
type: "message",
|
|
364550
|
-
messageType: "error",
|
|
364551
|
-
content: t4("Invalid language. Available: en-US, zh-CN")
|
|
364552
|
-
};
|
|
364553
|
-
}
|
|
364554
|
-
return setUiLanguage(context2, targetLang);
|
|
364555
|
-
}, "action"),
|
|
364556
|
-
subCommands: [
|
|
364557
|
-
{
|
|
364558
|
-
name: "zh-CN",
|
|
364559
|
-
altNames: ["zh", "chinese", "\u4E2D\u6587"],
|
|
364560
|
-
get description() {
|
|
364561
|
-
return t4("Set UI language to Simplified Chinese (zh-CN)");
|
|
364562
|
-
},
|
|
364563
|
-
kind: "built-in" /* BUILT_IN */,
|
|
364564
|
-
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
364565
|
-
if (args.trim().length > 0) {
|
|
364566
|
-
return {
|
|
364567
|
-
type: "message",
|
|
364568
|
-
messageType: "error",
|
|
364569
|
-
content: t4(
|
|
364570
|
-
"Language subcommands do not accept additional arguments."
|
|
364571
|
-
)
|
|
364572
|
-
};
|
|
364573
|
-
}
|
|
364574
|
-
return setUiLanguage(context2, "zh");
|
|
364575
|
-
}, "action")
|
|
364576
|
-
},
|
|
364577
|
-
{
|
|
364578
|
-
name: "en-US",
|
|
364579
|
-
altNames: ["en", "english"],
|
|
364580
|
-
get description() {
|
|
364581
|
-
return t4("Set UI language to English (en-US)");
|
|
364582
|
-
},
|
|
364583
|
-
kind: "built-in" /* BUILT_IN */,
|
|
364584
|
-
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
364585
|
-
if (args.trim().length > 0) {
|
|
364586
|
-
return {
|
|
364587
|
-
type: "message",
|
|
364588
|
-
messageType: "error",
|
|
364589
|
-
content: t4(
|
|
364590
|
-
"Language subcommands do not accept additional arguments."
|
|
364591
|
-
)
|
|
364592
|
-
};
|
|
364593
|
-
}
|
|
364594
|
-
return setUiLanguage(context2, "en");
|
|
364595
|
-
}, "action")
|
|
364596
|
-
},
|
|
364597
|
-
{
|
|
364598
|
-
name: "ru-RU",
|
|
364599
|
-
altNames: ["ru", "russian", "\u0440\u0443\u0441\u0441\u043A\u0438\u0439"],
|
|
364600
|
-
get description() {
|
|
364601
|
-
return t4("Set UI language to Russian (ru-RU)");
|
|
364602
|
-
},
|
|
364603
|
-
kind: "built-in" /* BUILT_IN */,
|
|
364604
|
-
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
364605
|
-
if (args.trim().length > 0) {
|
|
364606
|
-
return {
|
|
364607
|
-
type: "message",
|
|
364608
|
-
messageType: "error",
|
|
364609
|
-
content: t4(
|
|
364610
|
-
"Language subcommands do not accept additional arguments."
|
|
364611
|
-
)
|
|
364612
|
-
};
|
|
364613
|
-
}
|
|
364614
|
-
return setUiLanguage(context2, "ru");
|
|
364615
|
-
}, "action")
|
|
364616
|
-
}
|
|
364617
|
-
]
|
|
364618
|
-
},
|
|
364619
|
-
{
|
|
364620
|
-
name: "output",
|
|
364621
|
-
get description() {
|
|
364622
|
-
return t4("Set LLM output language");
|
|
364623
|
-
},
|
|
364624
|
-
kind: "built-in" /* BUILT_IN */,
|
|
364625
|
-
action: /* @__PURE__ */ __name(async (context2, args) => {
|
|
364626
|
-
const trimmedArgs = args.trim();
|
|
364627
|
-
if (!trimmedArgs) {
|
|
364628
|
-
return {
|
|
364629
|
-
type: "message",
|
|
364630
|
-
messageType: "info",
|
|
364631
|
-
content: [
|
|
364632
|
-
t4("Set LLM output language"),
|
|
364633
|
-
"",
|
|
364634
|
-
t4("Usage: /language output <language>"),
|
|
364635
|
-
` ${t4("Example: /language output \u4E2D\u6587")}`,
|
|
364636
|
-
` ${t4("Example: /language output English")}`,
|
|
364637
|
-
` ${t4("Example: /language output \u65E5\u672C\u8A9E")}`
|
|
364638
|
-
].join("\n")
|
|
364639
|
-
};
|
|
364640
|
-
}
|
|
364641
|
-
return generateLlmOutputLanguageRuleFile(trimmedArgs);
|
|
364642
|
-
}, "action")
|
|
364643
|
-
}
|
|
364644
|
-
]
|
|
364645
|
-
};
|
|
364646
|
-
|
|
364647
364767
|
// packages/cli/src/ui/commands/mcpCommand.ts
|
|
364648
364768
|
init_esbuild_shims();
|
|
364649
364769
|
var authCommand2 = {
|
|
@@ -365618,6 +365738,7 @@ var summaryCommand = {
|
|
|
365618
365738
|
action: /* @__PURE__ */ __name(async (context2) => {
|
|
365619
365739
|
const { config: config2 } = context2.services;
|
|
365620
365740
|
const { ui: ui2 } = context2;
|
|
365741
|
+
const executionMode = context2.executionMode ?? "interactive";
|
|
365621
365742
|
if (!config2) {
|
|
365622
365743
|
return {
|
|
365623
365744
|
type: "message",
|
|
@@ -365633,7 +365754,7 @@ var summaryCommand = {
|
|
|
365633
365754
|
content: t4("No chat client available to generate summary.")
|
|
365634
365755
|
};
|
|
365635
365756
|
}
|
|
365636
|
-
if (ui2.pendingItem) {
|
|
365757
|
+
if (executionMode === "interactive" && ui2.pendingItem) {
|
|
365637
365758
|
ui2.addItem(
|
|
365638
365759
|
{
|
|
365639
365760
|
type: "error",
|
|
@@ -365651,25 +365772,17 @@ var summaryCommand = {
|
|
|
365651
365772
|
)
|
|
365652
365773
|
};
|
|
365653
365774
|
}
|
|
365654
|
-
|
|
365775
|
+
const getChatHistory = /* @__PURE__ */ __name(() => {
|
|
365655
365776
|
const chat = geminiClient.getChat();
|
|
365656
|
-
|
|
365657
|
-
|
|
365658
|
-
|
|
365659
|
-
|
|
365660
|
-
|
|
365661
|
-
|
|
365662
|
-
|
|
365663
|
-
|
|
365664
|
-
const
|
|
365665
|
-
type: "summary",
|
|
365666
|
-
summary: {
|
|
365667
|
-
isPending: true,
|
|
365668
|
-
stage: "generating"
|
|
365669
|
-
}
|
|
365670
|
-
};
|
|
365671
|
-
ui2.setPendingItem(pendingMessage);
|
|
365672
|
-
const conversationContext = history.map((message) => ({
|
|
365777
|
+
return chat.getHistory();
|
|
365778
|
+
}, "getChatHistory");
|
|
365779
|
+
const validateChatHistory = /* @__PURE__ */ __name((history2) => {
|
|
365780
|
+
if (history2.length <= 2) {
|
|
365781
|
+
throw new Error(t4("No conversation found to summarize."));
|
|
365782
|
+
}
|
|
365783
|
+
}, "validateChatHistory");
|
|
365784
|
+
const generateSummaryMarkdown = /* @__PURE__ */ __name(async (history2) => {
|
|
365785
|
+
const conversationContext = history2.map((message) => ({
|
|
365673
365786
|
role: message.role,
|
|
365674
365787
|
parts: message.parts
|
|
365675
365788
|
}));
|
|
@@ -365693,16 +365806,14 @@ var summaryCommand = {
|
|
|
365693
365806
|
const markdownSummary = parts?.map((part) => part.text).filter((text) => typeof text === "string").join("") || "";
|
|
365694
365807
|
if (!markdownSummary) {
|
|
365695
365808
|
throw new Error(
|
|
365696
|
-
|
|
365809
|
+
t4(
|
|
365810
|
+
"Failed to generate summary - no text content received from LLM response"
|
|
365811
|
+
)
|
|
365697
365812
|
);
|
|
365698
365813
|
}
|
|
365699
|
-
|
|
365700
|
-
|
|
365701
|
-
|
|
365702
|
-
isPending: true,
|
|
365703
|
-
stage: "saving"
|
|
365704
|
-
}
|
|
365705
|
-
});
|
|
365814
|
+
return markdownSummary;
|
|
365815
|
+
}, "generateSummaryMarkdown");
|
|
365816
|
+
const saveSummaryToDisk = /* @__PURE__ */ __name(async (markdownSummary) => {
|
|
365706
365817
|
const projectRoot = config2.getProjectRoot();
|
|
365707
365818
|
const qwenDir = path87.join(projectRoot, ".qwen");
|
|
365708
365819
|
try {
|
|
@@ -365718,42 +365829,137 @@ var summaryCommand = {
|
|
|
365718
365829
|
**Update time**: ${(/* @__PURE__ */ new Date()).toISOString()}
|
|
365719
365830
|
`;
|
|
365720
365831
|
await fsPromises5.writeFile(summaryPath, summaryContent, "utf8");
|
|
365832
|
+
return {
|
|
365833
|
+
filePathForDisplay: ".qwen/PROJECT_SUMMARY.md",
|
|
365834
|
+
fullPath: summaryPath
|
|
365835
|
+
};
|
|
365836
|
+
}, "saveSummaryToDisk");
|
|
365837
|
+
const emitInteractivePending = /* @__PURE__ */ __name((stage) => {
|
|
365838
|
+
if (executionMode !== "interactive") {
|
|
365839
|
+
return;
|
|
365840
|
+
}
|
|
365841
|
+
const pendingMessage = {
|
|
365842
|
+
type: "summary",
|
|
365843
|
+
summary: {
|
|
365844
|
+
isPending: true,
|
|
365845
|
+
stage
|
|
365846
|
+
}
|
|
365847
|
+
};
|
|
365848
|
+
ui2.setPendingItem(pendingMessage);
|
|
365849
|
+
}, "emitInteractivePending");
|
|
365850
|
+
const completeInteractive = /* @__PURE__ */ __name((filePathForDisplay) => {
|
|
365851
|
+
if (executionMode !== "interactive") {
|
|
365852
|
+
return;
|
|
365853
|
+
}
|
|
365721
365854
|
ui2.setPendingItem(null);
|
|
365722
365855
|
const completedSummaryItem = {
|
|
365723
365856
|
type: "summary",
|
|
365724
365857
|
summary: {
|
|
365725
365858
|
isPending: false,
|
|
365726
365859
|
stage: "completed",
|
|
365727
|
-
filePath:
|
|
365860
|
+
filePath: filePathForDisplay
|
|
365728
365861
|
}
|
|
365729
365862
|
};
|
|
365730
365863
|
ui2.addItem(completedSummaryItem, Date.now());
|
|
365731
|
-
|
|
365732
|
-
|
|
365733
|
-
|
|
365734
|
-
|
|
365735
|
-
|
|
365736
|
-
|
|
365737
|
-
|
|
365864
|
+
}, "completeInteractive");
|
|
365865
|
+
const formatErrorMessage = /* @__PURE__ */ __name((error2) => t4("Failed to generate project context summary: {{error}}", {
|
|
365866
|
+
error: error2 instanceof Error ? error2.message : String(error2)
|
|
365867
|
+
}), "formatErrorMessage");
|
|
365868
|
+
const failInteractive = /* @__PURE__ */ __name((error2) => {
|
|
365869
|
+
if (executionMode !== "interactive") {
|
|
365870
|
+
return;
|
|
365871
|
+
}
|
|
365738
365872
|
ui2.setPendingItem(null);
|
|
365739
365873
|
ui2.addItem(
|
|
365740
365874
|
{
|
|
365741
365875
|
type: "error",
|
|
365742
|
-
text: `\u274C ${
|
|
365743
|
-
"Failed to generate project context summary: {{error}}",
|
|
365744
|
-
{
|
|
365745
|
-
error: error2 instanceof Error ? error2.message : String(error2)
|
|
365746
|
-
}
|
|
365747
|
-
)}`
|
|
365876
|
+
text: `\u274C ${formatErrorMessage(error2)}`
|
|
365748
365877
|
},
|
|
365749
365878
|
Date.now()
|
|
365750
365879
|
);
|
|
365880
|
+
}, "failInteractive");
|
|
365881
|
+
const formatSuccessMessage = /* @__PURE__ */ __name((filePathForDisplay) => t4("Saved project summary to {{filePathForDisplay}}.", {
|
|
365882
|
+
filePathForDisplay
|
|
365883
|
+
}), "formatSuccessMessage");
|
|
365884
|
+
const returnNoConversationMessage = /* @__PURE__ */ __name(() => {
|
|
365885
|
+
const msg = t4("No conversation found to summarize.");
|
|
365886
|
+
if (executionMode === "acp") {
|
|
365887
|
+
const messages = /* @__PURE__ */ __name(async function* () {
|
|
365888
|
+
yield {
|
|
365889
|
+
messageType: "info",
|
|
365890
|
+
content: msg
|
|
365891
|
+
};
|
|
365892
|
+
}, "messages");
|
|
365893
|
+
return {
|
|
365894
|
+
type: "stream_messages",
|
|
365895
|
+
messages: messages()
|
|
365896
|
+
};
|
|
365897
|
+
}
|
|
365898
|
+
return {
|
|
365899
|
+
type: "message",
|
|
365900
|
+
messageType: "info",
|
|
365901
|
+
content: msg
|
|
365902
|
+
};
|
|
365903
|
+
}, "returnNoConversationMessage");
|
|
365904
|
+
const executeSummaryGeneration = /* @__PURE__ */ __name(async (history2) => {
|
|
365905
|
+
emitInteractivePending("generating");
|
|
365906
|
+
const markdownSummary = await generateSummaryMarkdown(history2);
|
|
365907
|
+
emitInteractivePending("saving");
|
|
365908
|
+
const { filePathForDisplay } = await saveSummaryToDisk(markdownSummary);
|
|
365909
|
+
completeInteractive(filePathForDisplay);
|
|
365910
|
+
return { markdownSummary, filePathForDisplay };
|
|
365911
|
+
}, "executeSummaryGeneration");
|
|
365912
|
+
const history = getChatHistory();
|
|
365913
|
+
try {
|
|
365914
|
+
validateChatHistory(history);
|
|
365915
|
+
} catch (_error) {
|
|
365916
|
+
return returnNoConversationMessage();
|
|
365917
|
+
}
|
|
365918
|
+
if (executionMode === "acp") {
|
|
365919
|
+
const messages = /* @__PURE__ */ __name(async function* () {
|
|
365920
|
+
try {
|
|
365921
|
+
yield {
|
|
365922
|
+
messageType: "info",
|
|
365923
|
+
content: t4("Generating project summary...")
|
|
365924
|
+
};
|
|
365925
|
+
const { filePathForDisplay } = await executeSummaryGeneration(history);
|
|
365926
|
+
yield {
|
|
365927
|
+
messageType: "info",
|
|
365928
|
+
content: formatSuccessMessage(filePathForDisplay)
|
|
365929
|
+
};
|
|
365930
|
+
} catch (error2) {
|
|
365931
|
+
failInteractive(error2);
|
|
365932
|
+
yield {
|
|
365933
|
+
messageType: "error",
|
|
365934
|
+
content: formatErrorMessage(error2)
|
|
365935
|
+
};
|
|
365936
|
+
}
|
|
365937
|
+
}, "messages");
|
|
365938
|
+
return {
|
|
365939
|
+
type: "stream_messages",
|
|
365940
|
+
messages: messages()
|
|
365941
|
+
};
|
|
365942
|
+
}
|
|
365943
|
+
try {
|
|
365944
|
+
const { filePathForDisplay } = await executeSummaryGeneration(history);
|
|
365945
|
+
if (executionMode === "non_interactive") {
|
|
365946
|
+
return {
|
|
365947
|
+
type: "message",
|
|
365948
|
+
messageType: "info",
|
|
365949
|
+
content: formatSuccessMessage(filePathForDisplay)
|
|
365950
|
+
};
|
|
365951
|
+
}
|
|
365952
|
+
return {
|
|
365953
|
+
type: "message",
|
|
365954
|
+
messageType: "info",
|
|
365955
|
+
content: ""
|
|
365956
|
+
};
|
|
365957
|
+
} catch (error2) {
|
|
365958
|
+
failInteractive(error2);
|
|
365751
365959
|
return {
|
|
365752
365960
|
type: "message",
|
|
365753
365961
|
messageType: "error",
|
|
365754
|
-
content:
|
|
365755
|
-
error: error2 instanceof Error ? error2.message : String(error2)
|
|
365756
|
-
})
|
|
365962
|
+
content: formatErrorMessage(error2)
|
|
365757
365963
|
};
|
|
365758
365964
|
}
|
|
365759
365965
|
}, "action")
|
|
@@ -366517,67 +366723,720 @@ var BuiltinCommandLoader = class {
|
|
|
366517
366723
|
}
|
|
366518
366724
|
};
|
|
366519
366725
|
|
|
366520
|
-
// packages/cli/src/
|
|
366726
|
+
// packages/cli/src/services/FileCommandLoader.ts
|
|
366521
366727
|
init_esbuild_shims();
|
|
366522
|
-
|
|
366523
|
-
|
|
366524
|
-
|
|
366728
|
+
var import_toml = __toESM(require_toml(), 1);
|
|
366729
|
+
init_esm11();
|
|
366730
|
+
init_zod();
|
|
366731
|
+
import { promises as fs81 } from "node:fs";
|
|
366732
|
+
import path90 from "node:path";
|
|
366733
|
+
|
|
366734
|
+
// packages/cli/src/services/prompt-processors/argumentProcessor.ts
|
|
366735
|
+
init_esbuild_shims();
|
|
366736
|
+
var DefaultArgumentProcessor = class {
|
|
366737
|
+
static {
|
|
366738
|
+
__name(this, "DefaultArgumentProcessor");
|
|
366525
366739
|
}
|
|
366526
|
-
|
|
366740
|
+
async process(prompt, context2) {
|
|
366741
|
+
if (context2.invocation?.args) {
|
|
366742
|
+
return appendToLastTextPart(prompt, context2.invocation.raw);
|
|
366743
|
+
}
|
|
366744
|
+
return prompt;
|
|
366745
|
+
}
|
|
366746
|
+
};
|
|
366747
|
+
|
|
366748
|
+
// packages/cli/src/services/prompt-processors/types.ts
|
|
366749
|
+
init_esbuild_shims();
|
|
366750
|
+
var SHORTHAND_ARGS_PLACEHOLDER = "{{args}}";
|
|
366751
|
+
var SHELL_INJECTION_TRIGGER = "!{";
|
|
366752
|
+
var AT_FILE_INJECTION_TRIGGER = "@{";
|
|
366753
|
+
|
|
366754
|
+
// packages/cli/src/services/prompt-processors/shellProcessor.ts
|
|
366755
|
+
init_esbuild_shims();
|
|
366756
|
+
|
|
366757
|
+
// packages/cli/src/services/prompt-processors/injectionParser.ts
|
|
366758
|
+
init_esbuild_shims();
|
|
366759
|
+
function extractInjections(prompt, trigger, contextName) {
|
|
366760
|
+
const injections = [];
|
|
366761
|
+
let index = 0;
|
|
366762
|
+
while (index < prompt.length) {
|
|
366763
|
+
const startIndex = prompt.indexOf(trigger, index);
|
|
366764
|
+
if (startIndex === -1) {
|
|
366765
|
+
break;
|
|
366766
|
+
}
|
|
366767
|
+
let currentIndex = startIndex + trigger.length;
|
|
366768
|
+
let braceCount = 1;
|
|
366769
|
+
let foundEnd = false;
|
|
366770
|
+
while (currentIndex < prompt.length) {
|
|
366771
|
+
const char = prompt[currentIndex];
|
|
366772
|
+
if (char === "{") {
|
|
366773
|
+
braceCount++;
|
|
366774
|
+
} else if (char === "}") {
|
|
366775
|
+
braceCount--;
|
|
366776
|
+
if (braceCount === 0) {
|
|
366777
|
+
const injectionContent = prompt.substring(
|
|
366778
|
+
startIndex + trigger.length,
|
|
366779
|
+
currentIndex
|
|
366780
|
+
);
|
|
366781
|
+
const endIndex = currentIndex + 1;
|
|
366782
|
+
injections.push({
|
|
366783
|
+
content: injectionContent.trim(),
|
|
366784
|
+
startIndex,
|
|
366785
|
+
endIndex
|
|
366786
|
+
});
|
|
366787
|
+
index = endIndex;
|
|
366788
|
+
foundEnd = true;
|
|
366789
|
+
break;
|
|
366790
|
+
}
|
|
366791
|
+
}
|
|
366792
|
+
currentIndex++;
|
|
366793
|
+
}
|
|
366794
|
+
if (!foundEnd) {
|
|
366795
|
+
const contextInfo = contextName ? ` in command '${contextName}'` : "";
|
|
366796
|
+
throw new Error(
|
|
366797
|
+
`Invalid syntax${contextInfo}: Unclosed injection starting at index ${startIndex} ('${trigger}'). Ensure braces are balanced. Paths or commands with unbalanced braces are not supported directly.`
|
|
366798
|
+
);
|
|
366799
|
+
}
|
|
366800
|
+
}
|
|
366801
|
+
return injections;
|
|
366527
366802
|
}
|
|
366528
|
-
__name(
|
|
366529
|
-
|
|
366530
|
-
|
|
366531
|
-
|
|
366803
|
+
__name(extractInjections, "extractInjections");
|
|
366804
|
+
|
|
366805
|
+
// packages/cli/src/services/prompt-processors/shellProcessor.ts
|
|
366806
|
+
var ConfirmationRequiredError = class extends Error {
|
|
366807
|
+
constructor(message, commandsToConfirm) {
|
|
366808
|
+
super(message);
|
|
366809
|
+
this.commandsToConfirm = commandsToConfirm;
|
|
366810
|
+
this.name = "ConfirmationRequiredError";
|
|
366532
366811
|
}
|
|
366533
|
-
|
|
366812
|
+
static {
|
|
366813
|
+
__name(this, "ConfirmationRequiredError");
|
|
366814
|
+
}
|
|
366815
|
+
};
|
|
366816
|
+
var ShellProcessor = class {
|
|
366817
|
+
constructor(commandName) {
|
|
366818
|
+
this.commandName = commandName;
|
|
366819
|
+
}
|
|
366820
|
+
static {
|
|
366821
|
+
__name(this, "ShellProcessor");
|
|
366822
|
+
}
|
|
366823
|
+
async process(prompt, context2) {
|
|
366824
|
+
return flatMapTextParts(
|
|
366825
|
+
prompt,
|
|
366826
|
+
(text) => this.processString(text, context2)
|
|
366827
|
+
);
|
|
366828
|
+
}
|
|
366829
|
+
async processString(prompt, context2) {
|
|
366830
|
+
const userArgsRaw = context2.invocation?.args || "";
|
|
366831
|
+
if (!prompt.includes(SHELL_INJECTION_TRIGGER)) {
|
|
366832
|
+
return [
|
|
366833
|
+
{ text: prompt.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsRaw) }
|
|
366834
|
+
];
|
|
366835
|
+
}
|
|
366836
|
+
const config2 = context2.services.config;
|
|
366837
|
+
if (!config2) {
|
|
366838
|
+
throw new Error(
|
|
366839
|
+
`Security configuration not loaded. Cannot verify shell command permissions for '${this.commandName}'. Aborting.`
|
|
366840
|
+
);
|
|
366841
|
+
}
|
|
366842
|
+
const { sessionShellAllowlist } = context2.session;
|
|
366843
|
+
const injections = extractInjections(
|
|
366844
|
+
prompt,
|
|
366845
|
+
SHELL_INJECTION_TRIGGER,
|
|
366846
|
+
this.commandName
|
|
366847
|
+
);
|
|
366848
|
+
if (injections.length === 0) {
|
|
366849
|
+
return [
|
|
366850
|
+
{ text: prompt.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsRaw) }
|
|
366851
|
+
];
|
|
366852
|
+
}
|
|
366853
|
+
const { shell: shell2 } = getShellConfiguration();
|
|
366854
|
+
const userArgsEscaped = escapeShellArg(userArgsRaw, shell2);
|
|
366855
|
+
const resolvedInjections = injections.map(
|
|
366856
|
+
(injection) => {
|
|
366857
|
+
const command2 = injection.content;
|
|
366858
|
+
if (command2 === "") {
|
|
366859
|
+
return { ...injection, resolvedCommand: void 0 };
|
|
366860
|
+
}
|
|
366861
|
+
const resolvedCommand = command2.replaceAll(
|
|
366862
|
+
SHORTHAND_ARGS_PLACEHOLDER,
|
|
366863
|
+
userArgsEscaped
|
|
366864
|
+
);
|
|
366865
|
+
return { ...injection, resolvedCommand };
|
|
366866
|
+
}
|
|
366867
|
+
);
|
|
366868
|
+
const commandsToConfirm = /* @__PURE__ */ new Set();
|
|
366869
|
+
for (const injection of resolvedInjections) {
|
|
366870
|
+
const command2 = injection.resolvedCommand;
|
|
366871
|
+
if (!command2) continue;
|
|
366872
|
+
const { allAllowed, disallowedCommands, blockReason, isHardDenial } = checkCommandPermissions(command2, config2, sessionShellAllowlist);
|
|
366873
|
+
if (!allAllowed) {
|
|
366874
|
+
if (isHardDenial) {
|
|
366875
|
+
throw new Error(
|
|
366876
|
+
`${this.commandName} cannot be run. Blocked command: "${command2}". Reason: ${blockReason || "Blocked by configuration."}`
|
|
366877
|
+
);
|
|
366878
|
+
}
|
|
366879
|
+
if (config2.getApprovalMode() !== ApprovalMode.YOLO) {
|
|
366880
|
+
disallowedCommands.forEach((uc) => commandsToConfirm.add(uc));
|
|
366881
|
+
}
|
|
366882
|
+
}
|
|
366883
|
+
}
|
|
366884
|
+
if (commandsToConfirm.size > 0) {
|
|
366885
|
+
throw new ConfirmationRequiredError(
|
|
366886
|
+
"Shell command confirmation required",
|
|
366887
|
+
Array.from(commandsToConfirm)
|
|
366888
|
+
);
|
|
366889
|
+
}
|
|
366890
|
+
let processedPrompt = "";
|
|
366891
|
+
let lastIndex = 0;
|
|
366892
|
+
for (const injection of resolvedInjections) {
|
|
366893
|
+
const segment = prompt.substring(lastIndex, injection.startIndex);
|
|
366894
|
+
processedPrompt += segment.replaceAll(
|
|
366895
|
+
SHORTHAND_ARGS_PLACEHOLDER,
|
|
366896
|
+
userArgsRaw
|
|
366897
|
+
);
|
|
366898
|
+
if (injection.resolvedCommand) {
|
|
366899
|
+
const activeTheme = themeManager.getActiveTheme();
|
|
366900
|
+
const shellExecutionConfig = {
|
|
366901
|
+
...config2.getShellExecutionConfig(),
|
|
366902
|
+
defaultFg: activeTheme.colors.Foreground,
|
|
366903
|
+
defaultBg: activeTheme.colors.Background
|
|
366904
|
+
};
|
|
366905
|
+
const { result } = await ShellExecutionService.execute(
|
|
366906
|
+
injection.resolvedCommand,
|
|
366907
|
+
config2.getTargetDir(),
|
|
366908
|
+
() => {
|
|
366909
|
+
},
|
|
366910
|
+
new AbortController().signal,
|
|
366911
|
+
config2.getShouldUseNodePtyShell(),
|
|
366912
|
+
shellExecutionConfig
|
|
366913
|
+
);
|
|
366914
|
+
const executionResult = await result;
|
|
366915
|
+
if (executionResult.error && !executionResult.aborted) {
|
|
366916
|
+
throw new Error(
|
|
366917
|
+
`Failed to start shell command in '${this.commandName}': ${executionResult.error.message}. Command: ${injection.resolvedCommand}`
|
|
366918
|
+
);
|
|
366919
|
+
}
|
|
366920
|
+
processedPrompt += executionResult.output;
|
|
366921
|
+
if (executionResult.aborted) {
|
|
366922
|
+
processedPrompt += `
|
|
366923
|
+
[Shell command '${injection.resolvedCommand}' aborted]`;
|
|
366924
|
+
} else if (executionResult.exitCode !== 0 && executionResult.exitCode !== null) {
|
|
366925
|
+
processedPrompt += `
|
|
366926
|
+
[Shell command '${injection.resolvedCommand}' exited with code ${executionResult.exitCode}]`;
|
|
366927
|
+
} else if (executionResult.signal !== null) {
|
|
366928
|
+
processedPrompt += `
|
|
366929
|
+
[Shell command '${injection.resolvedCommand}' terminated by signal ${executionResult.signal}]`;
|
|
366930
|
+
}
|
|
366931
|
+
}
|
|
366932
|
+
lastIndex = injection.endIndex;
|
|
366933
|
+
}
|
|
366934
|
+
const finalSegment = prompt.substring(lastIndex);
|
|
366935
|
+
processedPrompt += finalSegment.replaceAll(
|
|
366936
|
+
SHORTHAND_ARGS_PLACEHOLDER,
|
|
366937
|
+
userArgsRaw
|
|
366938
|
+
);
|
|
366939
|
+
return [{ text: processedPrompt }];
|
|
366940
|
+
}
|
|
366941
|
+
};
|
|
366942
|
+
|
|
366943
|
+
// packages/cli/src/services/prompt-processors/atFileProcessor.ts
|
|
366944
|
+
init_esbuild_shims();
|
|
366945
|
+
var AtFileProcessor = class {
|
|
366946
|
+
constructor(commandName) {
|
|
366947
|
+
this.commandName = commandName;
|
|
366948
|
+
}
|
|
366949
|
+
static {
|
|
366950
|
+
__name(this, "AtFileProcessor");
|
|
366951
|
+
}
|
|
366952
|
+
async process(input, context2) {
|
|
366953
|
+
const config2 = context2.services.config;
|
|
366954
|
+
if (!config2) {
|
|
366955
|
+
return input;
|
|
366956
|
+
}
|
|
366957
|
+
return flatMapTextParts(input, async (text) => {
|
|
366958
|
+
if (!text.includes(AT_FILE_INJECTION_TRIGGER)) {
|
|
366959
|
+
return [{ text }];
|
|
366960
|
+
}
|
|
366961
|
+
const injections = extractInjections(
|
|
366962
|
+
text,
|
|
366963
|
+
AT_FILE_INJECTION_TRIGGER,
|
|
366964
|
+
this.commandName
|
|
366965
|
+
);
|
|
366966
|
+
if (injections.length === 0) {
|
|
366967
|
+
return [{ text }];
|
|
366968
|
+
}
|
|
366969
|
+
const output = [];
|
|
366970
|
+
let lastIndex = 0;
|
|
366971
|
+
for (const injection of injections) {
|
|
366972
|
+
const prefix = text.substring(lastIndex, injection.startIndex);
|
|
366973
|
+
if (prefix) {
|
|
366974
|
+
output.push({ text: prefix });
|
|
366975
|
+
}
|
|
366976
|
+
const pathStr = injection.content;
|
|
366977
|
+
try {
|
|
366978
|
+
const fileContentParts = await readPathFromWorkspace(pathStr, config2);
|
|
366979
|
+
if (fileContentParts.length === 0) {
|
|
366980
|
+
const uiMessage = `File '@{${pathStr}}' was ignored by .gitignore or .qwenignore and was not included in the prompt.`;
|
|
366981
|
+
context2.ui.addItem(
|
|
366982
|
+
{ type: "info" /* INFO */, text: uiMessage },
|
|
366983
|
+
Date.now()
|
|
366984
|
+
);
|
|
366985
|
+
}
|
|
366986
|
+
output.push(...fileContentParts);
|
|
366987
|
+
} catch (error2) {
|
|
366988
|
+
const message = error2 instanceof Error ? error2.message : String(error2);
|
|
366989
|
+
const uiMessage = `Failed to inject content for '@{${pathStr}}': ${message}`;
|
|
366990
|
+
console.error(
|
|
366991
|
+
`[AtFileProcessor] ${uiMessage}. Leaving placeholder in prompt.`
|
|
366992
|
+
);
|
|
366993
|
+
context2.ui.addItem(
|
|
366994
|
+
{ type: "error" /* ERROR */, text: uiMessage },
|
|
366995
|
+
Date.now()
|
|
366996
|
+
);
|
|
366997
|
+
const placeholder = text.substring(
|
|
366998
|
+
injection.startIndex,
|
|
366999
|
+
injection.endIndex
|
|
367000
|
+
);
|
|
367001
|
+
output.push({ text: placeholder });
|
|
367002
|
+
}
|
|
367003
|
+
lastIndex = injection.endIndex;
|
|
367004
|
+
}
|
|
367005
|
+
const suffix = text.substring(lastIndex);
|
|
367006
|
+
if (suffix) {
|
|
367007
|
+
output.push({ text: suffix });
|
|
367008
|
+
}
|
|
367009
|
+
return output;
|
|
367010
|
+
});
|
|
367011
|
+
}
|
|
367012
|
+
};
|
|
367013
|
+
|
|
367014
|
+
// packages/cli/src/services/FileCommandLoader.ts
|
|
367015
|
+
var TomlCommandDefSchema = external_exports.object({
|
|
367016
|
+
prompt: external_exports.string({
|
|
367017
|
+
required_error: "The 'prompt' field is required.",
|
|
367018
|
+
invalid_type_error: "The 'prompt' field must be a string."
|
|
367019
|
+
}),
|
|
367020
|
+
description: external_exports.string().optional()
|
|
367021
|
+
});
|
|
367022
|
+
var FileCommandLoader = class {
|
|
367023
|
+
constructor(config2) {
|
|
367024
|
+
this.config = config2;
|
|
367025
|
+
this.folderTrustEnabled = !!config2?.getFolderTrustFeature();
|
|
367026
|
+
this.folderTrust = !!config2?.getFolderTrust();
|
|
367027
|
+
this.projectRoot = config2?.getProjectRoot() || process.cwd();
|
|
367028
|
+
}
|
|
367029
|
+
static {
|
|
367030
|
+
__name(this, "FileCommandLoader");
|
|
367031
|
+
}
|
|
367032
|
+
projectRoot;
|
|
367033
|
+
folderTrustEnabled;
|
|
367034
|
+
folderTrust;
|
|
367035
|
+
/**
|
|
367036
|
+
* Loads all commands from user, project, and extension directories.
|
|
367037
|
+
* Returns commands in order: user → project → extensions (alphabetically).
|
|
367038
|
+
*
|
|
367039
|
+
* Order is important for conflict resolution in CommandService:
|
|
367040
|
+
* - User/project commands (without extensionName) use "last wins" strategy
|
|
367041
|
+
* - Extension commands (with extensionName) get renamed if conflicts exist
|
|
367042
|
+
*
|
|
367043
|
+
* @param signal An AbortSignal to cancel the loading process.
|
|
367044
|
+
* @returns A promise that resolves to an array of all loaded SlashCommands.
|
|
367045
|
+
*/
|
|
367046
|
+
async loadCommands(signal) {
|
|
367047
|
+
const allCommands = [];
|
|
367048
|
+
const globOptions = {
|
|
367049
|
+
nodir: true,
|
|
367050
|
+
dot: true,
|
|
367051
|
+
signal,
|
|
367052
|
+
follow: true
|
|
367053
|
+
};
|
|
367054
|
+
const commandDirs = this.getCommandDirectories();
|
|
367055
|
+
for (const dirInfo of commandDirs) {
|
|
367056
|
+
try {
|
|
367057
|
+
const files = await glob("**/*.toml", {
|
|
367058
|
+
...globOptions,
|
|
367059
|
+
cwd: dirInfo.path
|
|
367060
|
+
});
|
|
367061
|
+
if (this.folderTrustEnabled && !this.folderTrust) {
|
|
367062
|
+
return [];
|
|
367063
|
+
}
|
|
367064
|
+
const commandPromises = files.map(
|
|
367065
|
+
(file) => this.parseAndAdaptFile(
|
|
367066
|
+
path90.join(dirInfo.path, file),
|
|
367067
|
+
dirInfo.path,
|
|
367068
|
+
dirInfo.extensionName
|
|
367069
|
+
)
|
|
367070
|
+
);
|
|
367071
|
+
const commands = (await Promise.all(commandPromises)).filter(
|
|
367072
|
+
(cmd) => cmd !== null
|
|
367073
|
+
);
|
|
367074
|
+
allCommands.push(...commands);
|
|
367075
|
+
} catch (error2) {
|
|
367076
|
+
const isEnoent = error2.code === "ENOENT";
|
|
367077
|
+
const isAbortError2 = error2 instanceof Error && error2.name === "AbortError";
|
|
367078
|
+
if (!isEnoent && !isAbortError2) {
|
|
367079
|
+
console.error(
|
|
367080
|
+
`[FileCommandLoader] Error loading commands from ${dirInfo.path}:`,
|
|
367081
|
+
error2
|
|
367082
|
+
);
|
|
367083
|
+
}
|
|
367084
|
+
}
|
|
367085
|
+
}
|
|
367086
|
+
return allCommands;
|
|
367087
|
+
}
|
|
367088
|
+
/**
|
|
367089
|
+
* Get all command directories in order for loading.
|
|
367090
|
+
* User commands → Project commands → Extension commands
|
|
367091
|
+
* This order ensures extension commands can detect all conflicts.
|
|
367092
|
+
*/
|
|
367093
|
+
getCommandDirectories() {
|
|
367094
|
+
const dirs = [];
|
|
367095
|
+
const storage = this.config?.storage ?? new Storage(this.projectRoot);
|
|
367096
|
+
dirs.push({ path: Storage.getUserCommandsDir() });
|
|
367097
|
+
dirs.push({ path: storage.getProjectCommandsDir() });
|
|
367098
|
+
if (this.config) {
|
|
367099
|
+
const activeExtensions = this.config.getExtensions().filter((ext2) => ext2.isActive).sort((a2, b2) => a2.name.localeCompare(b2.name));
|
|
367100
|
+
const extensionCommandDirs = activeExtensions.map((ext2) => ({
|
|
367101
|
+
path: path90.join(ext2.path, "commands"),
|
|
367102
|
+
extensionName: ext2.name
|
|
367103
|
+
}));
|
|
367104
|
+
dirs.push(...extensionCommandDirs);
|
|
367105
|
+
}
|
|
367106
|
+
return dirs;
|
|
367107
|
+
}
|
|
367108
|
+
/**
|
|
367109
|
+
* Parses a single .toml file and transforms it into a SlashCommand object.
|
|
367110
|
+
* @param filePath The absolute path to the .toml file.
|
|
367111
|
+
* @param baseDir The root command directory for name calculation.
|
|
367112
|
+
* @param extensionName Optional extension name to prefix commands with.
|
|
367113
|
+
* @returns A promise resolving to a SlashCommand, or null if the file is invalid.
|
|
367114
|
+
*/
|
|
367115
|
+
async parseAndAdaptFile(filePath, baseDir, extensionName) {
|
|
367116
|
+
let fileContent;
|
|
367117
|
+
try {
|
|
367118
|
+
fileContent = await fs81.readFile(filePath, "utf-8");
|
|
367119
|
+
} catch (error2) {
|
|
367120
|
+
console.error(
|
|
367121
|
+
`[FileCommandLoader] Failed to read file ${filePath}:`,
|
|
367122
|
+
error2 instanceof Error ? error2.message : String(error2)
|
|
367123
|
+
);
|
|
367124
|
+
return null;
|
|
367125
|
+
}
|
|
367126
|
+
let parsed;
|
|
367127
|
+
try {
|
|
367128
|
+
parsed = import_toml.default.parse(fileContent);
|
|
367129
|
+
} catch (error2) {
|
|
367130
|
+
console.error(
|
|
367131
|
+
`[FileCommandLoader] Failed to parse TOML file ${filePath}:`,
|
|
367132
|
+
error2 instanceof Error ? error2.message : String(error2)
|
|
367133
|
+
);
|
|
367134
|
+
return null;
|
|
367135
|
+
}
|
|
367136
|
+
const validationResult = TomlCommandDefSchema.safeParse(parsed);
|
|
367137
|
+
if (!validationResult.success) {
|
|
367138
|
+
console.error(
|
|
367139
|
+
`[FileCommandLoader] Skipping invalid command file: ${filePath}. Validation errors:`,
|
|
367140
|
+
validationResult.error.flatten()
|
|
367141
|
+
);
|
|
367142
|
+
return null;
|
|
367143
|
+
}
|
|
367144
|
+
const validDef = validationResult.data;
|
|
367145
|
+
const relativePathWithExt = path90.relative(baseDir, filePath);
|
|
367146
|
+
const relativePath = relativePathWithExt.substring(
|
|
367147
|
+
0,
|
|
367148
|
+
relativePathWithExt.length - 5
|
|
367149
|
+
// length of '.toml'
|
|
367150
|
+
);
|
|
367151
|
+
const baseCommandName = relativePath.split(path90.sep).map((segment) => segment.replaceAll(":", "_")).join(":");
|
|
367152
|
+
const defaultDescription = `Custom command from ${path90.basename(filePath)}`;
|
|
367153
|
+
let description = validDef.description || defaultDescription;
|
|
367154
|
+
if (extensionName) {
|
|
367155
|
+
description = `[${extensionName}] ${description}`;
|
|
367156
|
+
}
|
|
367157
|
+
const processors = [];
|
|
367158
|
+
const usesArgs = validDef.prompt.includes(SHORTHAND_ARGS_PLACEHOLDER);
|
|
367159
|
+
const usesShellInjection = validDef.prompt.includes(
|
|
367160
|
+
SHELL_INJECTION_TRIGGER
|
|
367161
|
+
);
|
|
367162
|
+
const usesAtFileInjection = validDef.prompt.includes(
|
|
367163
|
+
AT_FILE_INJECTION_TRIGGER
|
|
367164
|
+
);
|
|
367165
|
+
if (usesAtFileInjection) {
|
|
367166
|
+
processors.push(new AtFileProcessor(baseCommandName));
|
|
367167
|
+
}
|
|
367168
|
+
if (usesShellInjection || usesArgs) {
|
|
367169
|
+
processors.push(new ShellProcessor(baseCommandName));
|
|
367170
|
+
}
|
|
367171
|
+
if (!usesArgs) {
|
|
367172
|
+
processors.push(new DefaultArgumentProcessor());
|
|
367173
|
+
}
|
|
367174
|
+
return {
|
|
367175
|
+
name: baseCommandName,
|
|
367176
|
+
description,
|
|
367177
|
+
kind: "file" /* FILE */,
|
|
367178
|
+
extensionName,
|
|
367179
|
+
action: /* @__PURE__ */ __name(async (context2, _args) => {
|
|
367180
|
+
if (!context2.invocation) {
|
|
367181
|
+
console.error(
|
|
367182
|
+
`[FileCommandLoader] Critical error: Command '${baseCommandName}' was executed without invocation context.`
|
|
367183
|
+
);
|
|
367184
|
+
return {
|
|
367185
|
+
type: "submit_prompt",
|
|
367186
|
+
content: [{ text: validDef.prompt }]
|
|
367187
|
+
// Fallback to unprocessed prompt
|
|
367188
|
+
};
|
|
367189
|
+
}
|
|
367190
|
+
try {
|
|
367191
|
+
let processedContent = [
|
|
367192
|
+
{ text: validDef.prompt }
|
|
367193
|
+
];
|
|
367194
|
+
for (const processor of processors) {
|
|
367195
|
+
processedContent = await processor.process(
|
|
367196
|
+
processedContent,
|
|
367197
|
+
context2
|
|
367198
|
+
);
|
|
367199
|
+
}
|
|
367200
|
+
return {
|
|
367201
|
+
type: "submit_prompt",
|
|
367202
|
+
content: processedContent
|
|
367203
|
+
};
|
|
367204
|
+
} catch (e4) {
|
|
367205
|
+
if (e4 instanceof ConfirmationRequiredError) {
|
|
367206
|
+
return {
|
|
367207
|
+
type: "confirm_shell_commands",
|
|
367208
|
+
commandsToConfirm: e4.commandsToConfirm,
|
|
367209
|
+
originalInvocation: {
|
|
367210
|
+
raw: context2.invocation.raw
|
|
367211
|
+
}
|
|
367212
|
+
};
|
|
367213
|
+
}
|
|
367214
|
+
throw e4;
|
|
367215
|
+
}
|
|
367216
|
+
}, "action")
|
|
367217
|
+
};
|
|
367218
|
+
}
|
|
367219
|
+
};
|
|
367220
|
+
|
|
367221
|
+
// packages/cli/src/ui/noninteractive/nonInteractiveUi.ts
|
|
367222
|
+
init_esbuild_shims();
|
|
367223
|
+
function createNonInteractiveUI() {
|
|
367224
|
+
return {
|
|
367225
|
+
addItem: /* @__PURE__ */ __name((_item, _timestamp) => 0, "addItem"),
|
|
367226
|
+
clear: /* @__PURE__ */ __name(() => {
|
|
367227
|
+
}, "clear"),
|
|
367228
|
+
setDebugMessage: /* @__PURE__ */ __name((_message) => {
|
|
367229
|
+
}, "setDebugMessage"),
|
|
367230
|
+
loadHistory: /* @__PURE__ */ __name((_newHistory) => {
|
|
367231
|
+
}, "loadHistory"),
|
|
367232
|
+
pendingItem: null,
|
|
367233
|
+
setPendingItem: /* @__PURE__ */ __name((_item) => {
|
|
367234
|
+
}, "setPendingItem"),
|
|
367235
|
+
toggleVimEnabled: /* @__PURE__ */ __name(async () => false, "toggleVimEnabled"),
|
|
367236
|
+
setGeminiMdFileCount: /* @__PURE__ */ __name((_count) => {
|
|
367237
|
+
}, "setGeminiMdFileCount"),
|
|
367238
|
+
reloadCommands: /* @__PURE__ */ __name(() => {
|
|
367239
|
+
}, "reloadCommands"),
|
|
367240
|
+
extensionsUpdateState: /* @__PURE__ */ new Map(),
|
|
367241
|
+
dispatchExtensionStateUpdate: /* @__PURE__ */ __name((_action) => {
|
|
367242
|
+
}, "dispatchExtensionStateUpdate"),
|
|
367243
|
+
addConfirmUpdateExtensionRequest: /* @__PURE__ */ __name((_request) => {
|
|
367244
|
+
}, "addConfirmUpdateExtensionRequest")
|
|
367245
|
+
};
|
|
366534
367246
|
}
|
|
366535
|
-
__name(
|
|
366536
|
-
|
|
366537
|
-
|
|
366538
|
-
|
|
367247
|
+
__name(createNonInteractiveUI, "createNonInteractiveUI");
|
|
367248
|
+
|
|
367249
|
+
// packages/cli/src/nonInteractiveCliCommands.ts
|
|
367250
|
+
var ALLOWED_BUILTIN_COMMANDS_NON_INTERACTIVE = [
|
|
367251
|
+
"init",
|
|
367252
|
+
"summary",
|
|
367253
|
+
"compress"
|
|
367254
|
+
];
|
|
367255
|
+
function handleCommandResult(result) {
|
|
367256
|
+
switch (result.type) {
|
|
367257
|
+
case "submit_prompt":
|
|
367258
|
+
return {
|
|
367259
|
+
type: "submit_prompt",
|
|
367260
|
+
content: result.content
|
|
367261
|
+
};
|
|
367262
|
+
case "message":
|
|
367263
|
+
return {
|
|
367264
|
+
type: "message",
|
|
367265
|
+
messageType: result.messageType,
|
|
367266
|
+
content: result.content
|
|
367267
|
+
};
|
|
367268
|
+
case "stream_messages":
|
|
367269
|
+
return {
|
|
367270
|
+
type: "stream_messages",
|
|
367271
|
+
messages: result.messages
|
|
367272
|
+
};
|
|
367273
|
+
/**
|
|
367274
|
+
* Currently return types below are never generated due to the
|
|
367275
|
+
* whitelist of allowed slash commands in ACP and non-interactive mode.
|
|
367276
|
+
* We'll try to add more supported return types in the future.
|
|
367277
|
+
*/
|
|
367278
|
+
case "tool":
|
|
367279
|
+
return {
|
|
367280
|
+
type: "unsupported",
|
|
367281
|
+
reason: "Tool execution from slash commands is not supported in non-interactive mode.",
|
|
367282
|
+
originalType: "tool"
|
|
367283
|
+
};
|
|
367284
|
+
case "quit":
|
|
367285
|
+
return {
|
|
367286
|
+
type: "unsupported",
|
|
367287
|
+
reason: "Quit command is not supported in non-interactive mode. The process will exit naturally after completion.",
|
|
367288
|
+
originalType: "quit"
|
|
367289
|
+
};
|
|
367290
|
+
case "dialog":
|
|
367291
|
+
return {
|
|
367292
|
+
type: "unsupported",
|
|
367293
|
+
reason: `Dialog '${result.dialog}' cannot be opened in non-interactive mode.`,
|
|
367294
|
+
originalType: "dialog"
|
|
367295
|
+
};
|
|
367296
|
+
case "load_history":
|
|
367297
|
+
return {
|
|
367298
|
+
type: "unsupported",
|
|
367299
|
+
reason: "Loading history is not supported in non-interactive mode. Each invocation starts with a fresh context.",
|
|
367300
|
+
originalType: "load_history"
|
|
367301
|
+
};
|
|
367302
|
+
case "confirm_shell_commands":
|
|
367303
|
+
return {
|
|
367304
|
+
type: "unsupported",
|
|
367305
|
+
reason: "Shell command confirmation is not supported in non-interactive mode. Use YOLO mode or pre-approve commands.",
|
|
367306
|
+
originalType: "confirm_shell_commands"
|
|
367307
|
+
};
|
|
367308
|
+
case "confirm_action":
|
|
367309
|
+
return {
|
|
367310
|
+
type: "unsupported",
|
|
367311
|
+
reason: "Action confirmation is not supported in non-interactive mode. Commands requiring confirmation cannot be executed.",
|
|
367312
|
+
originalType: "confirm_action"
|
|
367313
|
+
};
|
|
367314
|
+
default: {
|
|
367315
|
+
const _exhaustive = result;
|
|
367316
|
+
return {
|
|
367317
|
+
type: "unsupported",
|
|
367318
|
+
reason: `Unknown command result type: ${_exhaustive.type}`,
|
|
367319
|
+
originalType: "unknown"
|
|
367320
|
+
};
|
|
367321
|
+
}
|
|
366539
367322
|
}
|
|
366540
|
-
return metrics2.tokens.cached / metrics2.tokens.prompt * 100;
|
|
366541
367323
|
}
|
|
366542
|
-
__name(
|
|
366543
|
-
|
|
366544
|
-
|
|
366545
|
-
|
|
366546
|
-
|
|
366547
|
-
|
|
367324
|
+
__name(handleCommandResult, "handleCommandResult");
|
|
367325
|
+
function filterCommandsForNonInteractive(commands, allowedBuiltinCommandNames) {
|
|
367326
|
+
return commands.filter((cmd) => {
|
|
367327
|
+
if (cmd.kind === "file" /* FILE */) {
|
|
367328
|
+
return true;
|
|
367329
|
+
}
|
|
367330
|
+
if (cmd.kind === "built-in" /* BUILT_IN */) {
|
|
367331
|
+
return allowedBuiltinCommandNames.has(cmd.name);
|
|
367332
|
+
}
|
|
367333
|
+
return false;
|
|
367334
|
+
});
|
|
367335
|
+
}
|
|
367336
|
+
__name(filterCommandsForNonInteractive, "filterCommandsForNonInteractive");
|
|
367337
|
+
var handleSlashCommand = /* @__PURE__ */ __name(async (rawQuery, abortController, config2, settings, allowedBuiltinCommandNames = [
|
|
367338
|
+
...ALLOWED_BUILTIN_COMMANDS_NON_INTERACTIVE
|
|
367339
|
+
]) => {
|
|
367340
|
+
const trimmed2 = rawQuery.trim();
|
|
367341
|
+
if (!trimmed2.startsWith("/")) {
|
|
367342
|
+
return { type: "no_command" };
|
|
367343
|
+
}
|
|
367344
|
+
const isAcpMode = config2.getExperimentalZedIntegration();
|
|
367345
|
+
const isInteractive = config2.isInteractive();
|
|
367346
|
+
const executionMode = isAcpMode ? "acp" : isInteractive ? "interactive" : "non_interactive";
|
|
367347
|
+
const allowedBuiltinSet = new Set(allowedBuiltinCommandNames ?? []);
|
|
367348
|
+
const allLoaders = [
|
|
367349
|
+
new BuiltinCommandLoader(config2),
|
|
367350
|
+
new FileCommandLoader(config2)
|
|
367351
|
+
];
|
|
367352
|
+
const commandService = await CommandService.create(
|
|
367353
|
+
allLoaders,
|
|
367354
|
+
abortController.signal
|
|
366548
367355
|
);
|
|
366549
|
-
const
|
|
366550
|
-
const
|
|
366551
|
-
|
|
366552
|
-
|
|
366553
|
-
const totalCachedTokens = Object.values(models).reduce(
|
|
366554
|
-
(acc, model) => acc + model.tokens.cached,
|
|
366555
|
-
0
|
|
367356
|
+
const allCommands = commandService.getCommands();
|
|
367357
|
+
const filteredCommands = filterCommandsForNonInteractive(
|
|
367358
|
+
allCommands,
|
|
367359
|
+
allowedBuiltinSet
|
|
366556
367360
|
);
|
|
366557
|
-
const
|
|
366558
|
-
|
|
366559
|
-
|
|
367361
|
+
const { commandToExecute, args } = parseSlashCommand(
|
|
367362
|
+
rawQuery,
|
|
367363
|
+
filteredCommands
|
|
366560
367364
|
);
|
|
366561
|
-
|
|
366562
|
-
|
|
366563
|
-
|
|
366564
|
-
|
|
366565
|
-
|
|
366566
|
-
|
|
366567
|
-
|
|
366568
|
-
|
|
366569
|
-
|
|
366570
|
-
|
|
366571
|
-
|
|
366572
|
-
|
|
366573
|
-
|
|
366574
|
-
|
|
366575
|
-
|
|
366576
|
-
|
|
366577
|
-
|
|
366578
|
-
|
|
367365
|
+
if (!commandToExecute) {
|
|
367366
|
+
const { commandToExecute: knownCommand } = parseSlashCommand(
|
|
367367
|
+
rawQuery,
|
|
367368
|
+
allCommands
|
|
367369
|
+
);
|
|
367370
|
+
if (knownCommand) {
|
|
367371
|
+
return {
|
|
367372
|
+
type: "unsupported",
|
|
367373
|
+
reason: t4(
|
|
367374
|
+
'The command "/{{command}}" is not supported in non-interactive mode.',
|
|
367375
|
+
{ command: knownCommand.name }
|
|
367376
|
+
),
|
|
367377
|
+
originalType: "filtered_command"
|
|
367378
|
+
};
|
|
367379
|
+
}
|
|
367380
|
+
return { type: "no_command" };
|
|
367381
|
+
}
|
|
367382
|
+
if (!commandToExecute.action) {
|
|
367383
|
+
return { type: "no_command" };
|
|
367384
|
+
}
|
|
367385
|
+
const sessionStats = {
|
|
367386
|
+
sessionId: config2?.getSessionId(),
|
|
367387
|
+
sessionStartTime: /* @__PURE__ */ new Date(),
|
|
367388
|
+
metrics: uiTelemetryService.getMetrics(),
|
|
367389
|
+
lastPromptTokenCount: 0,
|
|
367390
|
+
promptCount: 1
|
|
366579
367391
|
};
|
|
366580
|
-
|
|
367392
|
+
const logger6 = new Logger(config2?.getSessionId() || "", config2?.storage);
|
|
367393
|
+
const context2 = {
|
|
367394
|
+
executionMode,
|
|
367395
|
+
services: {
|
|
367396
|
+
config: config2,
|
|
367397
|
+
settings,
|
|
367398
|
+
git: void 0,
|
|
367399
|
+
logger: logger6
|
|
367400
|
+
},
|
|
367401
|
+
ui: createNonInteractiveUI(),
|
|
367402
|
+
session: {
|
|
367403
|
+
stats: sessionStats,
|
|
367404
|
+
sessionShellAllowlist: /* @__PURE__ */ new Set()
|
|
367405
|
+
},
|
|
367406
|
+
invocation: {
|
|
367407
|
+
raw: trimmed2,
|
|
367408
|
+
name: commandToExecute.name,
|
|
367409
|
+
args
|
|
367410
|
+
}
|
|
367411
|
+
};
|
|
367412
|
+
const result = await commandToExecute.action(context2, args);
|
|
367413
|
+
if (!result) {
|
|
367414
|
+
return {
|
|
367415
|
+
type: "message",
|
|
367416
|
+
messageType: "info",
|
|
367417
|
+
content: "Command executed successfully."
|
|
367418
|
+
};
|
|
367419
|
+
}
|
|
367420
|
+
return handleCommandResult(result);
|
|
367421
|
+
}, "handleSlashCommand");
|
|
367422
|
+
var getAvailableCommands = /* @__PURE__ */ __name(async (config2, abortSignal, allowedBuiltinCommandNames = [
|
|
367423
|
+
...ALLOWED_BUILTIN_COMMANDS_NON_INTERACTIVE
|
|
367424
|
+
]) => {
|
|
367425
|
+
try {
|
|
367426
|
+
const allowedBuiltinSet = new Set(allowedBuiltinCommandNames ?? []);
|
|
367427
|
+
const loaders = allowedBuiltinSet.size > 0 ? [new BuiltinCommandLoader(config2), new FileCommandLoader(config2)] : [new FileCommandLoader(config2)];
|
|
367428
|
+
const commandService = await CommandService.create(loaders, abortSignal);
|
|
367429
|
+
const commands = commandService.getCommands();
|
|
367430
|
+
const filteredCommands = filterCommandsForNonInteractive(
|
|
367431
|
+
commands,
|
|
367432
|
+
allowedBuiltinSet
|
|
367433
|
+
);
|
|
367434
|
+
return filteredCommands.filter((cmd) => !cmd.hidden);
|
|
367435
|
+
} catch (error2) {
|
|
367436
|
+
console.error("Error loading available commands:", error2);
|
|
367437
|
+
return [];
|
|
367438
|
+
}
|
|
367439
|
+
}, "getAvailableCommands");
|
|
366581
367440
|
|
|
366582
367441
|
// packages/cli/src/utils/nonInteractiveHelpers.ts
|
|
366583
367442
|
function normalizePartList(parts) {
|
|
@@ -366642,19 +367501,15 @@ function computeUsageFromMetrics(metrics2) {
|
|
|
366642
367501
|
return usage2;
|
|
366643
367502
|
}
|
|
366644
367503
|
__name(computeUsageFromMetrics, "computeUsageFromMetrics");
|
|
366645
|
-
async function loadSlashCommandNames(config2) {
|
|
367504
|
+
async function loadSlashCommandNames(config2, allowedBuiltinCommandNames) {
|
|
366646
367505
|
const controller = new AbortController();
|
|
366647
367506
|
try {
|
|
366648
|
-
const
|
|
366649
|
-
|
|
366650
|
-
controller.signal
|
|
367507
|
+
const commands = await getAvailableCommands(
|
|
367508
|
+
config2,
|
|
367509
|
+
controller.signal,
|
|
367510
|
+
allowedBuiltinCommandNames
|
|
366651
367511
|
);
|
|
366652
|
-
|
|
366653
|
-
const commands = service.getCommands();
|
|
366654
|
-
for (const command2 of commands) {
|
|
366655
|
-
names.add(command2.name);
|
|
366656
|
-
}
|
|
366657
|
-
return Array.from(names).sort();
|
|
367512
|
+
return commands.map((cmd) => cmd.name).sort();
|
|
366658
367513
|
} catch (error2) {
|
|
366659
367514
|
if (config2.getDebugMode()) {
|
|
366660
367515
|
console.error(
|
|
@@ -366668,7 +367523,7 @@ async function loadSlashCommandNames(config2) {
|
|
|
366668
367523
|
}
|
|
366669
367524
|
}
|
|
366670
367525
|
__name(loadSlashCommandNames, "loadSlashCommandNames");
|
|
366671
|
-
async function buildSystemMessage(config2, sessionId, permissionMode) {
|
|
367526
|
+
async function buildSystemMessage(config2, sessionId, permissionMode, allowedBuiltinCommandNames) {
|
|
366672
367527
|
const toolRegistry = config2.getToolRegistry();
|
|
366673
367528
|
const tools = toolRegistry ? toolRegistry.getAllToolNames() : [];
|
|
366674
367529
|
const mcpServers = config2.getMcpServers();
|
|
@@ -366676,7 +367531,10 @@ async function buildSystemMessage(config2, sessionId, permissionMode) {
|
|
|
366676
367531
|
name: name3,
|
|
366677
367532
|
status: getMCPServerStatus(name3)
|
|
366678
367533
|
})) : [];
|
|
366679
|
-
const slashCommands = await loadSlashCommandNames(
|
|
367534
|
+
const slashCommands = await loadSlashCommandNames(
|
|
367535
|
+
config2,
|
|
367536
|
+
allowedBuiltinCommandNames
|
|
367537
|
+
);
|
|
366680
367538
|
let agentNames = [];
|
|
366681
367539
|
try {
|
|
366682
367540
|
const subagentManager = config2.getSubagentManager();
|
|
@@ -367929,663 +368787,6 @@ var StreamJsonOutputAdapter = class extends BaseJsonOutputAdapter {
|
|
|
367929
368787
|
}
|
|
367930
368788
|
};
|
|
367931
368789
|
|
|
367932
|
-
// packages/cli/src/nonInteractiveCliCommands.ts
|
|
367933
|
-
init_esbuild_shims();
|
|
367934
|
-
|
|
367935
|
-
// packages/cli/src/utils/commands.ts
|
|
367936
|
-
init_esbuild_shims();
|
|
367937
|
-
var parseSlashCommand = /* @__PURE__ */ __name((query, commands) => {
|
|
367938
|
-
const trimmed2 = query.trim();
|
|
367939
|
-
const parts = trimmed2.substring(1).trim().split(/\s+/);
|
|
367940
|
-
const commandPath = parts.filter((p2) => p2);
|
|
367941
|
-
let currentCommands = commands;
|
|
367942
|
-
let commandToExecute;
|
|
367943
|
-
let pathIndex = 0;
|
|
367944
|
-
const canonicalPath = [];
|
|
367945
|
-
for (const part of commandPath) {
|
|
367946
|
-
let foundCommand = currentCommands.find((cmd) => cmd.name === part);
|
|
367947
|
-
if (!foundCommand) {
|
|
367948
|
-
foundCommand = currentCommands.find(
|
|
367949
|
-
(cmd) => cmd.altNames?.includes(part)
|
|
367950
|
-
);
|
|
367951
|
-
}
|
|
367952
|
-
if (foundCommand) {
|
|
367953
|
-
commandToExecute = foundCommand;
|
|
367954
|
-
canonicalPath.push(foundCommand.name);
|
|
367955
|
-
pathIndex++;
|
|
367956
|
-
if (foundCommand.subCommands) {
|
|
367957
|
-
currentCommands = foundCommand.subCommands;
|
|
367958
|
-
} else {
|
|
367959
|
-
break;
|
|
367960
|
-
}
|
|
367961
|
-
} else {
|
|
367962
|
-
break;
|
|
367963
|
-
}
|
|
367964
|
-
}
|
|
367965
|
-
const args = parts.slice(pathIndex).join(" ");
|
|
367966
|
-
return { commandToExecute, args, canonicalPath };
|
|
367967
|
-
}, "parseSlashCommand");
|
|
367968
|
-
|
|
367969
|
-
// packages/cli/src/services/FileCommandLoader.ts
|
|
367970
|
-
init_esbuild_shims();
|
|
367971
|
-
var import_toml = __toESM(require_toml(), 1);
|
|
367972
|
-
init_esm11();
|
|
367973
|
-
init_zod();
|
|
367974
|
-
import { promises as fs81 } from "node:fs";
|
|
367975
|
-
import path90 from "node:path";
|
|
367976
|
-
|
|
367977
|
-
// packages/cli/src/services/prompt-processors/argumentProcessor.ts
|
|
367978
|
-
init_esbuild_shims();
|
|
367979
|
-
var DefaultArgumentProcessor = class {
|
|
367980
|
-
static {
|
|
367981
|
-
__name(this, "DefaultArgumentProcessor");
|
|
367982
|
-
}
|
|
367983
|
-
async process(prompt, context2) {
|
|
367984
|
-
if (context2.invocation?.args) {
|
|
367985
|
-
return appendToLastTextPart(prompt, context2.invocation.raw);
|
|
367986
|
-
}
|
|
367987
|
-
return prompt;
|
|
367988
|
-
}
|
|
367989
|
-
};
|
|
367990
|
-
|
|
367991
|
-
// packages/cli/src/services/prompt-processors/types.ts
|
|
367992
|
-
init_esbuild_shims();
|
|
367993
|
-
var SHORTHAND_ARGS_PLACEHOLDER = "{{args}}";
|
|
367994
|
-
var SHELL_INJECTION_TRIGGER = "!{";
|
|
367995
|
-
var AT_FILE_INJECTION_TRIGGER = "@{";
|
|
367996
|
-
|
|
367997
|
-
// packages/cli/src/services/prompt-processors/shellProcessor.ts
|
|
367998
|
-
init_esbuild_shims();
|
|
367999
|
-
|
|
368000
|
-
// packages/cli/src/services/prompt-processors/injectionParser.ts
|
|
368001
|
-
init_esbuild_shims();
|
|
368002
|
-
function extractInjections(prompt, trigger, contextName) {
|
|
368003
|
-
const injections = [];
|
|
368004
|
-
let index = 0;
|
|
368005
|
-
while (index < prompt.length) {
|
|
368006
|
-
const startIndex = prompt.indexOf(trigger, index);
|
|
368007
|
-
if (startIndex === -1) {
|
|
368008
|
-
break;
|
|
368009
|
-
}
|
|
368010
|
-
let currentIndex = startIndex + trigger.length;
|
|
368011
|
-
let braceCount = 1;
|
|
368012
|
-
let foundEnd = false;
|
|
368013
|
-
while (currentIndex < prompt.length) {
|
|
368014
|
-
const char = prompt[currentIndex];
|
|
368015
|
-
if (char === "{") {
|
|
368016
|
-
braceCount++;
|
|
368017
|
-
} else if (char === "}") {
|
|
368018
|
-
braceCount--;
|
|
368019
|
-
if (braceCount === 0) {
|
|
368020
|
-
const injectionContent = prompt.substring(
|
|
368021
|
-
startIndex + trigger.length,
|
|
368022
|
-
currentIndex
|
|
368023
|
-
);
|
|
368024
|
-
const endIndex = currentIndex + 1;
|
|
368025
|
-
injections.push({
|
|
368026
|
-
content: injectionContent.trim(),
|
|
368027
|
-
startIndex,
|
|
368028
|
-
endIndex
|
|
368029
|
-
});
|
|
368030
|
-
index = endIndex;
|
|
368031
|
-
foundEnd = true;
|
|
368032
|
-
break;
|
|
368033
|
-
}
|
|
368034
|
-
}
|
|
368035
|
-
currentIndex++;
|
|
368036
|
-
}
|
|
368037
|
-
if (!foundEnd) {
|
|
368038
|
-
const contextInfo = contextName ? ` in command '${contextName}'` : "";
|
|
368039
|
-
throw new Error(
|
|
368040
|
-
`Invalid syntax${contextInfo}: Unclosed injection starting at index ${startIndex} ('${trigger}'). Ensure braces are balanced. Paths or commands with unbalanced braces are not supported directly.`
|
|
368041
|
-
);
|
|
368042
|
-
}
|
|
368043
|
-
}
|
|
368044
|
-
return injections;
|
|
368045
|
-
}
|
|
368046
|
-
__name(extractInjections, "extractInjections");
|
|
368047
|
-
|
|
368048
|
-
// packages/cli/src/services/prompt-processors/shellProcessor.ts
|
|
368049
|
-
var ConfirmationRequiredError = class extends Error {
|
|
368050
|
-
constructor(message, commandsToConfirm) {
|
|
368051
|
-
super(message);
|
|
368052
|
-
this.commandsToConfirm = commandsToConfirm;
|
|
368053
|
-
this.name = "ConfirmationRequiredError";
|
|
368054
|
-
}
|
|
368055
|
-
static {
|
|
368056
|
-
__name(this, "ConfirmationRequiredError");
|
|
368057
|
-
}
|
|
368058
|
-
};
|
|
368059
|
-
var ShellProcessor = class {
|
|
368060
|
-
constructor(commandName) {
|
|
368061
|
-
this.commandName = commandName;
|
|
368062
|
-
}
|
|
368063
|
-
static {
|
|
368064
|
-
__name(this, "ShellProcessor");
|
|
368065
|
-
}
|
|
368066
|
-
async process(prompt, context2) {
|
|
368067
|
-
return flatMapTextParts(
|
|
368068
|
-
prompt,
|
|
368069
|
-
(text) => this.processString(text, context2)
|
|
368070
|
-
);
|
|
368071
|
-
}
|
|
368072
|
-
async processString(prompt, context2) {
|
|
368073
|
-
const userArgsRaw = context2.invocation?.args || "";
|
|
368074
|
-
if (!prompt.includes(SHELL_INJECTION_TRIGGER)) {
|
|
368075
|
-
return [
|
|
368076
|
-
{ text: prompt.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsRaw) }
|
|
368077
|
-
];
|
|
368078
|
-
}
|
|
368079
|
-
const config2 = context2.services.config;
|
|
368080
|
-
if (!config2) {
|
|
368081
|
-
throw new Error(
|
|
368082
|
-
`Security configuration not loaded. Cannot verify shell command permissions for '${this.commandName}'. Aborting.`
|
|
368083
|
-
);
|
|
368084
|
-
}
|
|
368085
|
-
const { sessionShellAllowlist } = context2.session;
|
|
368086
|
-
const injections = extractInjections(
|
|
368087
|
-
prompt,
|
|
368088
|
-
SHELL_INJECTION_TRIGGER,
|
|
368089
|
-
this.commandName
|
|
368090
|
-
);
|
|
368091
|
-
if (injections.length === 0) {
|
|
368092
|
-
return [
|
|
368093
|
-
{ text: prompt.replaceAll(SHORTHAND_ARGS_PLACEHOLDER, userArgsRaw) }
|
|
368094
|
-
];
|
|
368095
|
-
}
|
|
368096
|
-
const { shell: shell2 } = getShellConfiguration();
|
|
368097
|
-
const userArgsEscaped = escapeShellArg(userArgsRaw, shell2);
|
|
368098
|
-
const resolvedInjections = injections.map(
|
|
368099
|
-
(injection) => {
|
|
368100
|
-
const command2 = injection.content;
|
|
368101
|
-
if (command2 === "") {
|
|
368102
|
-
return { ...injection, resolvedCommand: void 0 };
|
|
368103
|
-
}
|
|
368104
|
-
const resolvedCommand = command2.replaceAll(
|
|
368105
|
-
SHORTHAND_ARGS_PLACEHOLDER,
|
|
368106
|
-
userArgsEscaped
|
|
368107
|
-
);
|
|
368108
|
-
return { ...injection, resolvedCommand };
|
|
368109
|
-
}
|
|
368110
|
-
);
|
|
368111
|
-
const commandsToConfirm = /* @__PURE__ */ new Set();
|
|
368112
|
-
for (const injection of resolvedInjections) {
|
|
368113
|
-
const command2 = injection.resolvedCommand;
|
|
368114
|
-
if (!command2) continue;
|
|
368115
|
-
const { allAllowed, disallowedCommands, blockReason, isHardDenial } = checkCommandPermissions(command2, config2, sessionShellAllowlist);
|
|
368116
|
-
if (!allAllowed) {
|
|
368117
|
-
if (isHardDenial) {
|
|
368118
|
-
throw new Error(
|
|
368119
|
-
`${this.commandName} cannot be run. Blocked command: "${command2}". Reason: ${blockReason || "Blocked by configuration."}`
|
|
368120
|
-
);
|
|
368121
|
-
}
|
|
368122
|
-
if (config2.getApprovalMode() !== ApprovalMode.YOLO) {
|
|
368123
|
-
disallowedCommands.forEach((uc) => commandsToConfirm.add(uc));
|
|
368124
|
-
}
|
|
368125
|
-
}
|
|
368126
|
-
}
|
|
368127
|
-
if (commandsToConfirm.size > 0) {
|
|
368128
|
-
throw new ConfirmationRequiredError(
|
|
368129
|
-
"Shell command confirmation required",
|
|
368130
|
-
Array.from(commandsToConfirm)
|
|
368131
|
-
);
|
|
368132
|
-
}
|
|
368133
|
-
let processedPrompt = "";
|
|
368134
|
-
let lastIndex = 0;
|
|
368135
|
-
for (const injection of resolvedInjections) {
|
|
368136
|
-
const segment = prompt.substring(lastIndex, injection.startIndex);
|
|
368137
|
-
processedPrompt += segment.replaceAll(
|
|
368138
|
-
SHORTHAND_ARGS_PLACEHOLDER,
|
|
368139
|
-
userArgsRaw
|
|
368140
|
-
);
|
|
368141
|
-
if (injection.resolvedCommand) {
|
|
368142
|
-
const activeTheme = themeManager.getActiveTheme();
|
|
368143
|
-
const shellExecutionConfig = {
|
|
368144
|
-
...config2.getShellExecutionConfig(),
|
|
368145
|
-
defaultFg: activeTheme.colors.Foreground,
|
|
368146
|
-
defaultBg: activeTheme.colors.Background
|
|
368147
|
-
};
|
|
368148
|
-
const { result } = await ShellExecutionService.execute(
|
|
368149
|
-
injection.resolvedCommand,
|
|
368150
|
-
config2.getTargetDir(),
|
|
368151
|
-
() => {
|
|
368152
|
-
},
|
|
368153
|
-
new AbortController().signal,
|
|
368154
|
-
config2.getShouldUseNodePtyShell(),
|
|
368155
|
-
shellExecutionConfig
|
|
368156
|
-
);
|
|
368157
|
-
const executionResult = await result;
|
|
368158
|
-
if (executionResult.error && !executionResult.aborted) {
|
|
368159
|
-
throw new Error(
|
|
368160
|
-
`Failed to start shell command in '${this.commandName}': ${executionResult.error.message}. Command: ${injection.resolvedCommand}`
|
|
368161
|
-
);
|
|
368162
|
-
}
|
|
368163
|
-
processedPrompt += executionResult.output;
|
|
368164
|
-
if (executionResult.aborted) {
|
|
368165
|
-
processedPrompt += `
|
|
368166
|
-
[Shell command '${injection.resolvedCommand}' aborted]`;
|
|
368167
|
-
} else if (executionResult.exitCode !== 0 && executionResult.exitCode !== null) {
|
|
368168
|
-
processedPrompt += `
|
|
368169
|
-
[Shell command '${injection.resolvedCommand}' exited with code ${executionResult.exitCode}]`;
|
|
368170
|
-
} else if (executionResult.signal !== null) {
|
|
368171
|
-
processedPrompt += `
|
|
368172
|
-
[Shell command '${injection.resolvedCommand}' terminated by signal ${executionResult.signal}]`;
|
|
368173
|
-
}
|
|
368174
|
-
}
|
|
368175
|
-
lastIndex = injection.endIndex;
|
|
368176
|
-
}
|
|
368177
|
-
const finalSegment = prompt.substring(lastIndex);
|
|
368178
|
-
processedPrompt += finalSegment.replaceAll(
|
|
368179
|
-
SHORTHAND_ARGS_PLACEHOLDER,
|
|
368180
|
-
userArgsRaw
|
|
368181
|
-
);
|
|
368182
|
-
return [{ text: processedPrompt }];
|
|
368183
|
-
}
|
|
368184
|
-
};
|
|
368185
|
-
|
|
368186
|
-
// packages/cli/src/services/prompt-processors/atFileProcessor.ts
|
|
368187
|
-
init_esbuild_shims();
|
|
368188
|
-
var AtFileProcessor = class {
|
|
368189
|
-
constructor(commandName) {
|
|
368190
|
-
this.commandName = commandName;
|
|
368191
|
-
}
|
|
368192
|
-
static {
|
|
368193
|
-
__name(this, "AtFileProcessor");
|
|
368194
|
-
}
|
|
368195
|
-
async process(input, context2) {
|
|
368196
|
-
const config2 = context2.services.config;
|
|
368197
|
-
if (!config2) {
|
|
368198
|
-
return input;
|
|
368199
|
-
}
|
|
368200
|
-
return flatMapTextParts(input, async (text) => {
|
|
368201
|
-
if (!text.includes(AT_FILE_INJECTION_TRIGGER)) {
|
|
368202
|
-
return [{ text }];
|
|
368203
|
-
}
|
|
368204
|
-
const injections = extractInjections(
|
|
368205
|
-
text,
|
|
368206
|
-
AT_FILE_INJECTION_TRIGGER,
|
|
368207
|
-
this.commandName
|
|
368208
|
-
);
|
|
368209
|
-
if (injections.length === 0) {
|
|
368210
|
-
return [{ text }];
|
|
368211
|
-
}
|
|
368212
|
-
const output = [];
|
|
368213
|
-
let lastIndex = 0;
|
|
368214
|
-
for (const injection of injections) {
|
|
368215
|
-
const prefix = text.substring(lastIndex, injection.startIndex);
|
|
368216
|
-
if (prefix) {
|
|
368217
|
-
output.push({ text: prefix });
|
|
368218
|
-
}
|
|
368219
|
-
const pathStr = injection.content;
|
|
368220
|
-
try {
|
|
368221
|
-
const fileContentParts = await readPathFromWorkspace(pathStr, config2);
|
|
368222
|
-
if (fileContentParts.length === 0) {
|
|
368223
|
-
const uiMessage = `File '@{${pathStr}}' was ignored by .gitignore or .qwenignore and was not included in the prompt.`;
|
|
368224
|
-
context2.ui.addItem(
|
|
368225
|
-
{ type: "info" /* INFO */, text: uiMessage },
|
|
368226
|
-
Date.now()
|
|
368227
|
-
);
|
|
368228
|
-
}
|
|
368229
|
-
output.push(...fileContentParts);
|
|
368230
|
-
} catch (error2) {
|
|
368231
|
-
const message = error2 instanceof Error ? error2.message : String(error2);
|
|
368232
|
-
const uiMessage = `Failed to inject content for '@{${pathStr}}': ${message}`;
|
|
368233
|
-
console.error(
|
|
368234
|
-
`[AtFileProcessor] ${uiMessage}. Leaving placeholder in prompt.`
|
|
368235
|
-
);
|
|
368236
|
-
context2.ui.addItem(
|
|
368237
|
-
{ type: "error" /* ERROR */, text: uiMessage },
|
|
368238
|
-
Date.now()
|
|
368239
|
-
);
|
|
368240
|
-
const placeholder = text.substring(
|
|
368241
|
-
injection.startIndex,
|
|
368242
|
-
injection.endIndex
|
|
368243
|
-
);
|
|
368244
|
-
output.push({ text: placeholder });
|
|
368245
|
-
}
|
|
368246
|
-
lastIndex = injection.endIndex;
|
|
368247
|
-
}
|
|
368248
|
-
const suffix = text.substring(lastIndex);
|
|
368249
|
-
if (suffix) {
|
|
368250
|
-
output.push({ text: suffix });
|
|
368251
|
-
}
|
|
368252
|
-
return output;
|
|
368253
|
-
});
|
|
368254
|
-
}
|
|
368255
|
-
};
|
|
368256
|
-
|
|
368257
|
-
// packages/cli/src/services/FileCommandLoader.ts
|
|
368258
|
-
var TomlCommandDefSchema = external_exports.object({
|
|
368259
|
-
prompt: external_exports.string({
|
|
368260
|
-
required_error: "The 'prompt' field is required.",
|
|
368261
|
-
invalid_type_error: "The 'prompt' field must be a string."
|
|
368262
|
-
}),
|
|
368263
|
-
description: external_exports.string().optional()
|
|
368264
|
-
});
|
|
368265
|
-
var FileCommandLoader = class {
|
|
368266
|
-
constructor(config2) {
|
|
368267
|
-
this.config = config2;
|
|
368268
|
-
this.folderTrustEnabled = !!config2?.getFolderTrustFeature();
|
|
368269
|
-
this.folderTrust = !!config2?.getFolderTrust();
|
|
368270
|
-
this.projectRoot = config2?.getProjectRoot() || process.cwd();
|
|
368271
|
-
}
|
|
368272
|
-
static {
|
|
368273
|
-
__name(this, "FileCommandLoader");
|
|
368274
|
-
}
|
|
368275
|
-
projectRoot;
|
|
368276
|
-
folderTrustEnabled;
|
|
368277
|
-
folderTrust;
|
|
368278
|
-
/**
|
|
368279
|
-
* Loads all commands from user, project, and extension directories.
|
|
368280
|
-
* Returns commands in order: user → project → extensions (alphabetically).
|
|
368281
|
-
*
|
|
368282
|
-
* Order is important for conflict resolution in CommandService:
|
|
368283
|
-
* - User/project commands (without extensionName) use "last wins" strategy
|
|
368284
|
-
* - Extension commands (with extensionName) get renamed if conflicts exist
|
|
368285
|
-
*
|
|
368286
|
-
* @param signal An AbortSignal to cancel the loading process.
|
|
368287
|
-
* @returns A promise that resolves to an array of all loaded SlashCommands.
|
|
368288
|
-
*/
|
|
368289
|
-
async loadCommands(signal) {
|
|
368290
|
-
const allCommands = [];
|
|
368291
|
-
const globOptions = {
|
|
368292
|
-
nodir: true,
|
|
368293
|
-
dot: true,
|
|
368294
|
-
signal,
|
|
368295
|
-
follow: true
|
|
368296
|
-
};
|
|
368297
|
-
const commandDirs = this.getCommandDirectories();
|
|
368298
|
-
for (const dirInfo of commandDirs) {
|
|
368299
|
-
try {
|
|
368300
|
-
const files = await glob("**/*.toml", {
|
|
368301
|
-
...globOptions,
|
|
368302
|
-
cwd: dirInfo.path
|
|
368303
|
-
});
|
|
368304
|
-
if (this.folderTrustEnabled && !this.folderTrust) {
|
|
368305
|
-
return [];
|
|
368306
|
-
}
|
|
368307
|
-
const commandPromises = files.map(
|
|
368308
|
-
(file) => this.parseAndAdaptFile(
|
|
368309
|
-
path90.join(dirInfo.path, file),
|
|
368310
|
-
dirInfo.path,
|
|
368311
|
-
dirInfo.extensionName
|
|
368312
|
-
)
|
|
368313
|
-
);
|
|
368314
|
-
const commands = (await Promise.all(commandPromises)).filter(
|
|
368315
|
-
(cmd) => cmd !== null
|
|
368316
|
-
);
|
|
368317
|
-
allCommands.push(...commands);
|
|
368318
|
-
} catch (error2) {
|
|
368319
|
-
const isEnoent = error2.code === "ENOENT";
|
|
368320
|
-
const isAbortError2 = error2 instanceof Error && error2.name === "AbortError";
|
|
368321
|
-
if (!isEnoent && !isAbortError2) {
|
|
368322
|
-
console.error(
|
|
368323
|
-
`[FileCommandLoader] Error loading commands from ${dirInfo.path}:`,
|
|
368324
|
-
error2
|
|
368325
|
-
);
|
|
368326
|
-
}
|
|
368327
|
-
}
|
|
368328
|
-
}
|
|
368329
|
-
return allCommands;
|
|
368330
|
-
}
|
|
368331
|
-
/**
|
|
368332
|
-
* Get all command directories in order for loading.
|
|
368333
|
-
* User commands → Project commands → Extension commands
|
|
368334
|
-
* This order ensures extension commands can detect all conflicts.
|
|
368335
|
-
*/
|
|
368336
|
-
getCommandDirectories() {
|
|
368337
|
-
const dirs = [];
|
|
368338
|
-
const storage = this.config?.storage ?? new Storage(this.projectRoot);
|
|
368339
|
-
dirs.push({ path: Storage.getUserCommandsDir() });
|
|
368340
|
-
dirs.push({ path: storage.getProjectCommandsDir() });
|
|
368341
|
-
if (this.config) {
|
|
368342
|
-
const activeExtensions = this.config.getExtensions().filter((ext2) => ext2.isActive).sort((a2, b2) => a2.name.localeCompare(b2.name));
|
|
368343
|
-
const extensionCommandDirs = activeExtensions.map((ext2) => ({
|
|
368344
|
-
path: path90.join(ext2.path, "commands"),
|
|
368345
|
-
extensionName: ext2.name
|
|
368346
|
-
}));
|
|
368347
|
-
dirs.push(...extensionCommandDirs);
|
|
368348
|
-
}
|
|
368349
|
-
return dirs;
|
|
368350
|
-
}
|
|
368351
|
-
/**
|
|
368352
|
-
* Parses a single .toml file and transforms it into a SlashCommand object.
|
|
368353
|
-
* @param filePath The absolute path to the .toml file.
|
|
368354
|
-
* @param baseDir The root command directory for name calculation.
|
|
368355
|
-
* @param extensionName Optional extension name to prefix commands with.
|
|
368356
|
-
* @returns A promise resolving to a SlashCommand, or null if the file is invalid.
|
|
368357
|
-
*/
|
|
368358
|
-
async parseAndAdaptFile(filePath, baseDir, extensionName) {
|
|
368359
|
-
let fileContent;
|
|
368360
|
-
try {
|
|
368361
|
-
fileContent = await fs81.readFile(filePath, "utf-8");
|
|
368362
|
-
} catch (error2) {
|
|
368363
|
-
console.error(
|
|
368364
|
-
`[FileCommandLoader] Failed to read file ${filePath}:`,
|
|
368365
|
-
error2 instanceof Error ? error2.message : String(error2)
|
|
368366
|
-
);
|
|
368367
|
-
return null;
|
|
368368
|
-
}
|
|
368369
|
-
let parsed;
|
|
368370
|
-
try {
|
|
368371
|
-
parsed = import_toml.default.parse(fileContent);
|
|
368372
|
-
} catch (error2) {
|
|
368373
|
-
console.error(
|
|
368374
|
-
`[FileCommandLoader] Failed to parse TOML file ${filePath}:`,
|
|
368375
|
-
error2 instanceof Error ? error2.message : String(error2)
|
|
368376
|
-
);
|
|
368377
|
-
return null;
|
|
368378
|
-
}
|
|
368379
|
-
const validationResult = TomlCommandDefSchema.safeParse(parsed);
|
|
368380
|
-
if (!validationResult.success) {
|
|
368381
|
-
console.error(
|
|
368382
|
-
`[FileCommandLoader] Skipping invalid command file: ${filePath}. Validation errors:`,
|
|
368383
|
-
validationResult.error.flatten()
|
|
368384
|
-
);
|
|
368385
|
-
return null;
|
|
368386
|
-
}
|
|
368387
|
-
const validDef = validationResult.data;
|
|
368388
|
-
const relativePathWithExt = path90.relative(baseDir, filePath);
|
|
368389
|
-
const relativePath = relativePathWithExt.substring(
|
|
368390
|
-
0,
|
|
368391
|
-
relativePathWithExt.length - 5
|
|
368392
|
-
// length of '.toml'
|
|
368393
|
-
);
|
|
368394
|
-
const baseCommandName = relativePath.split(path90.sep).map((segment) => segment.replaceAll(":", "_")).join(":");
|
|
368395
|
-
const defaultDescription = `Custom command from ${path90.basename(filePath)}`;
|
|
368396
|
-
let description = validDef.description || defaultDescription;
|
|
368397
|
-
if (extensionName) {
|
|
368398
|
-
description = `[${extensionName}] ${description}`;
|
|
368399
|
-
}
|
|
368400
|
-
const processors = [];
|
|
368401
|
-
const usesArgs = validDef.prompt.includes(SHORTHAND_ARGS_PLACEHOLDER);
|
|
368402
|
-
const usesShellInjection = validDef.prompt.includes(
|
|
368403
|
-
SHELL_INJECTION_TRIGGER
|
|
368404
|
-
);
|
|
368405
|
-
const usesAtFileInjection = validDef.prompt.includes(
|
|
368406
|
-
AT_FILE_INJECTION_TRIGGER
|
|
368407
|
-
);
|
|
368408
|
-
if (usesAtFileInjection) {
|
|
368409
|
-
processors.push(new AtFileProcessor(baseCommandName));
|
|
368410
|
-
}
|
|
368411
|
-
if (usesShellInjection || usesArgs) {
|
|
368412
|
-
processors.push(new ShellProcessor(baseCommandName));
|
|
368413
|
-
}
|
|
368414
|
-
if (!usesArgs) {
|
|
368415
|
-
processors.push(new DefaultArgumentProcessor());
|
|
368416
|
-
}
|
|
368417
|
-
return {
|
|
368418
|
-
name: baseCommandName,
|
|
368419
|
-
description,
|
|
368420
|
-
kind: "file" /* FILE */,
|
|
368421
|
-
extensionName,
|
|
368422
|
-
action: /* @__PURE__ */ __name(async (context2, _args) => {
|
|
368423
|
-
if (!context2.invocation) {
|
|
368424
|
-
console.error(
|
|
368425
|
-
`[FileCommandLoader] Critical error: Command '${baseCommandName}' was executed without invocation context.`
|
|
368426
|
-
);
|
|
368427
|
-
return {
|
|
368428
|
-
type: "submit_prompt",
|
|
368429
|
-
content: [{ text: validDef.prompt }]
|
|
368430
|
-
// Fallback to unprocessed prompt
|
|
368431
|
-
};
|
|
368432
|
-
}
|
|
368433
|
-
try {
|
|
368434
|
-
let processedContent = [
|
|
368435
|
-
{ text: validDef.prompt }
|
|
368436
|
-
];
|
|
368437
|
-
for (const processor of processors) {
|
|
368438
|
-
processedContent = await processor.process(
|
|
368439
|
-
processedContent,
|
|
368440
|
-
context2
|
|
368441
|
-
);
|
|
368442
|
-
}
|
|
368443
|
-
return {
|
|
368444
|
-
type: "submit_prompt",
|
|
368445
|
-
content: processedContent
|
|
368446
|
-
};
|
|
368447
|
-
} catch (e4) {
|
|
368448
|
-
if (e4 instanceof ConfirmationRequiredError) {
|
|
368449
|
-
return {
|
|
368450
|
-
type: "confirm_shell_commands",
|
|
368451
|
-
commandsToConfirm: e4.commandsToConfirm,
|
|
368452
|
-
originalInvocation: {
|
|
368453
|
-
raw: context2.invocation.raw
|
|
368454
|
-
}
|
|
368455
|
-
};
|
|
368456
|
-
}
|
|
368457
|
-
throw e4;
|
|
368458
|
-
}
|
|
368459
|
-
}, "action")
|
|
368460
|
-
};
|
|
368461
|
-
}
|
|
368462
|
-
};
|
|
368463
|
-
|
|
368464
|
-
// packages/cli/src/ui/noninteractive/nonInteractiveUi.ts
|
|
368465
|
-
init_esbuild_shims();
|
|
368466
|
-
function createNonInteractiveUI() {
|
|
368467
|
-
return {
|
|
368468
|
-
addItem: /* @__PURE__ */ __name((_item, _timestamp) => 0, "addItem"),
|
|
368469
|
-
clear: /* @__PURE__ */ __name(() => {
|
|
368470
|
-
}, "clear"),
|
|
368471
|
-
setDebugMessage: /* @__PURE__ */ __name((_message) => {
|
|
368472
|
-
}, "setDebugMessage"),
|
|
368473
|
-
loadHistory: /* @__PURE__ */ __name((_newHistory) => {
|
|
368474
|
-
}, "loadHistory"),
|
|
368475
|
-
pendingItem: null,
|
|
368476
|
-
setPendingItem: /* @__PURE__ */ __name((_item) => {
|
|
368477
|
-
}, "setPendingItem"),
|
|
368478
|
-
toggleVimEnabled: /* @__PURE__ */ __name(async () => false, "toggleVimEnabled"),
|
|
368479
|
-
setGeminiMdFileCount: /* @__PURE__ */ __name((_count) => {
|
|
368480
|
-
}, "setGeminiMdFileCount"),
|
|
368481
|
-
reloadCommands: /* @__PURE__ */ __name(() => {
|
|
368482
|
-
}, "reloadCommands"),
|
|
368483
|
-
extensionsUpdateState: /* @__PURE__ */ new Map(),
|
|
368484
|
-
dispatchExtensionStateUpdate: /* @__PURE__ */ __name((_action) => {
|
|
368485
|
-
}, "dispatchExtensionStateUpdate"),
|
|
368486
|
-
addConfirmUpdateExtensionRequest: /* @__PURE__ */ __name((_request) => {
|
|
368487
|
-
}, "addConfirmUpdateExtensionRequest")
|
|
368488
|
-
};
|
|
368489
|
-
}
|
|
368490
|
-
__name(createNonInteractiveUI, "createNonInteractiveUI");
|
|
368491
|
-
|
|
368492
|
-
// packages/cli/src/nonInteractiveCliCommands.ts
|
|
368493
|
-
function filterCommandsForNonInteractive(commands, allowedBuiltinCommandNames) {
|
|
368494
|
-
return commands.filter((cmd) => {
|
|
368495
|
-
if (cmd.kind === "file" /* FILE */) {
|
|
368496
|
-
return true;
|
|
368497
|
-
}
|
|
368498
|
-
if (cmd.kind === "built-in" /* BUILT_IN */) {
|
|
368499
|
-
return allowedBuiltinCommandNames.has(cmd.name);
|
|
368500
|
-
}
|
|
368501
|
-
return false;
|
|
368502
|
-
});
|
|
368503
|
-
}
|
|
368504
|
-
__name(filterCommandsForNonInteractive, "filterCommandsForNonInteractive");
|
|
368505
|
-
var handleSlashCommand = /* @__PURE__ */ __name(async (rawQuery, abortController, config2, settings, allowedBuiltinCommandNames) => {
|
|
368506
|
-
const trimmed2 = rawQuery.trim();
|
|
368507
|
-
if (!trimmed2.startsWith("/")) {
|
|
368508
|
-
return;
|
|
368509
|
-
}
|
|
368510
|
-
const allowedBuiltinSet = new Set(allowedBuiltinCommandNames ?? []);
|
|
368511
|
-
const loaders = allowedBuiltinSet.size > 0 ? [new BuiltinCommandLoader(config2), new FileCommandLoader(config2)] : [new FileCommandLoader(config2)];
|
|
368512
|
-
const commandService = await CommandService.create(
|
|
368513
|
-
loaders,
|
|
368514
|
-
abortController.signal
|
|
368515
|
-
);
|
|
368516
|
-
const commands = commandService.getCommands();
|
|
368517
|
-
const filteredCommands = filterCommandsForNonInteractive(
|
|
368518
|
-
commands,
|
|
368519
|
-
allowedBuiltinSet
|
|
368520
|
-
);
|
|
368521
|
-
const { commandToExecute, args } = parseSlashCommand(
|
|
368522
|
-
rawQuery,
|
|
368523
|
-
filteredCommands
|
|
368524
|
-
);
|
|
368525
|
-
if (commandToExecute) {
|
|
368526
|
-
if (commandToExecute.action) {
|
|
368527
|
-
const sessionStats = {
|
|
368528
|
-
sessionId: config2?.getSessionId(),
|
|
368529
|
-
sessionStartTime: /* @__PURE__ */ new Date(),
|
|
368530
|
-
metrics: uiTelemetryService.getMetrics(),
|
|
368531
|
-
lastPromptTokenCount: 0,
|
|
368532
|
-
promptCount: 1
|
|
368533
|
-
};
|
|
368534
|
-
const logger6 = new Logger(config2?.getSessionId() || "", config2?.storage);
|
|
368535
|
-
const context2 = {
|
|
368536
|
-
services: {
|
|
368537
|
-
config: config2,
|
|
368538
|
-
settings,
|
|
368539
|
-
git: void 0,
|
|
368540
|
-
logger: logger6
|
|
368541
|
-
},
|
|
368542
|
-
ui: createNonInteractiveUI(),
|
|
368543
|
-
session: {
|
|
368544
|
-
stats: sessionStats,
|
|
368545
|
-
sessionShellAllowlist: /* @__PURE__ */ new Set()
|
|
368546
|
-
},
|
|
368547
|
-
invocation: {
|
|
368548
|
-
raw: trimmed2,
|
|
368549
|
-
name: commandToExecute.name,
|
|
368550
|
-
args
|
|
368551
|
-
}
|
|
368552
|
-
};
|
|
368553
|
-
const result = await commandToExecute.action(context2, args);
|
|
368554
|
-
if (result) {
|
|
368555
|
-
switch (result.type) {
|
|
368556
|
-
case "submit_prompt":
|
|
368557
|
-
return result.content;
|
|
368558
|
-
case "confirm_shell_commands":
|
|
368559
|
-
throw new FatalInputError(
|
|
368560
|
-
"Exiting due to a confirmation prompt requested by the command."
|
|
368561
|
-
);
|
|
368562
|
-
default:
|
|
368563
|
-
throw new FatalInputError(
|
|
368564
|
-
"Exiting due to command result that is not supported in non-interactive mode."
|
|
368565
|
-
);
|
|
368566
|
-
}
|
|
368567
|
-
}
|
|
368568
|
-
}
|
|
368569
|
-
}
|
|
368570
|
-
return;
|
|
368571
|
-
}, "handleSlashCommand");
|
|
368572
|
-
var getAvailableCommands = /* @__PURE__ */ __name(async (config2, settings, abortSignal, allowedBuiltinCommandNames) => {
|
|
368573
|
-
try {
|
|
368574
|
-
const allowedBuiltinSet = new Set(allowedBuiltinCommandNames ?? []);
|
|
368575
|
-
const loaders = allowedBuiltinSet.size > 0 ? [new BuiltinCommandLoader(config2), new FileCommandLoader(config2)] : [new FileCommandLoader(config2)];
|
|
368576
|
-
const commandService = await CommandService.create(loaders, abortSignal);
|
|
368577
|
-
const commands = commandService.getCommands();
|
|
368578
|
-
const filteredCommands = filterCommandsForNonInteractive(
|
|
368579
|
-
commands,
|
|
368580
|
-
allowedBuiltinSet
|
|
368581
|
-
);
|
|
368582
|
-
return filteredCommands.filter((cmd) => !cmd.hidden);
|
|
368583
|
-
} catch (error2) {
|
|
368584
|
-
console.error("Error loading available commands:", error2);
|
|
368585
|
-
return [];
|
|
368586
|
-
}
|
|
368587
|
-
}, "getAvailableCommands");
|
|
368588
|
-
|
|
368589
368790
|
// packages/cli/src/ui/hooks/atCommandProcessor.ts
|
|
368590
368791
|
init_esbuild_shims();
|
|
368591
368792
|
import * as fs82 from "node:fs/promises";
|
|
@@ -368925,6 +369126,36 @@ Content from @${filePathSpecInContent}:
|
|
|
368925
369126
|
__name(handleAtCommand, "handleAtCommand");
|
|
368926
369127
|
|
|
368927
369128
|
// packages/cli/src/nonInteractiveCli.ts
|
|
369129
|
+
async function emitNonInteractiveFinalMessage(params) {
|
|
369130
|
+
const { message, isError, adapter, config: config2 } = params;
|
|
369131
|
+
if (!adapter) {
|
|
369132
|
+
const target = isError ? process.stderr : process.stdout;
|
|
369133
|
+
target.write(`${message}
|
|
369134
|
+
`);
|
|
369135
|
+
return;
|
|
369136
|
+
}
|
|
369137
|
+
adapter.startAssistantMessage();
|
|
369138
|
+
adapter.processEvent({
|
|
369139
|
+
type: GeminiEventType.Content,
|
|
369140
|
+
value: message
|
|
369141
|
+
});
|
|
369142
|
+
adapter.finalizeAssistantMessage();
|
|
369143
|
+
const metrics2 = uiTelemetryService.getMetrics();
|
|
369144
|
+
const usage2 = computeUsageFromMetrics(metrics2);
|
|
369145
|
+
const outputFormat = config2.getOutputFormat();
|
|
369146
|
+
const stats = outputFormat === OutputFormat.JSON ? uiTelemetryService.getMetrics() : void 0;
|
|
369147
|
+
adapter.emitResult({
|
|
369148
|
+
isError,
|
|
369149
|
+
durationMs: Date.now() - params.startTimeMs,
|
|
369150
|
+
apiDurationMs: 0,
|
|
369151
|
+
numTurns: 0,
|
|
369152
|
+
errorMessage: isError ? message : void 0,
|
|
369153
|
+
usage: usage2,
|
|
369154
|
+
stats,
|
|
369155
|
+
summary: message
|
|
369156
|
+
});
|
|
369157
|
+
}
|
|
369158
|
+
__name(emitNonInteractiveFinalMessage, "emitNonInteractiveFinalMessage");
|
|
368928
369159
|
async function runNonInteractive(config2, settings, input, prompt_id, options2 = {}) {
|
|
368929
369160
|
return promptIdContext.run(prompt_id, async () => {
|
|
368930
369161
|
let adapter;
|
|
@@ -368962,6 +369193,14 @@ async function runNonInteractive(config2, settings, input, prompt_id, options2 =
|
|
|
368962
369193
|
process.stdout.on("error", stdoutErrorHandler);
|
|
368963
369194
|
process.on("SIGINT", shutdownHandler);
|
|
368964
369195
|
process.on("SIGTERM", shutdownHandler);
|
|
369196
|
+
if (adapter) {
|
|
369197
|
+
const systemMessage = await buildSystemMessage(
|
|
369198
|
+
config2,
|
|
369199
|
+
sessionId,
|
|
369200
|
+
permissionMode
|
|
369201
|
+
);
|
|
369202
|
+
adapter.emitMessage(systemMessage);
|
|
369203
|
+
}
|
|
368965
369204
|
let initialPartList = extractPartsFromUserMessage(
|
|
368966
369205
|
options2.userMessage
|
|
368967
369206
|
);
|
|
@@ -368974,9 +369213,43 @@ async function runNonInteractive(config2, settings, input, prompt_id, options2 =
|
|
|
368974
369213
|
config2,
|
|
368975
369214
|
settings
|
|
368976
369215
|
);
|
|
368977
|
-
|
|
368978
|
-
|
|
368979
|
-
|
|
369216
|
+
switch (slashCommandResult.type) {
|
|
369217
|
+
case "submit_prompt":
|
|
369218
|
+
initialPartList = slashCommandResult.content;
|
|
369219
|
+
slashHandled = true;
|
|
369220
|
+
break;
|
|
369221
|
+
case "message": {
|
|
369222
|
+
await emitNonInteractiveFinalMessage({
|
|
369223
|
+
message: slashCommandResult.content,
|
|
369224
|
+
isError: slashCommandResult.messageType === "error",
|
|
369225
|
+
adapter,
|
|
369226
|
+
config: config2,
|
|
369227
|
+
startTimeMs: startTime
|
|
369228
|
+
});
|
|
369229
|
+
return;
|
|
369230
|
+
}
|
|
369231
|
+
case "stream_messages":
|
|
369232
|
+
throw new FatalInputError(
|
|
369233
|
+
"Stream messages mode is not supported in non-interactive CLI"
|
|
369234
|
+
);
|
|
369235
|
+
case "unsupported": {
|
|
369236
|
+
await emitNonInteractiveFinalMessage({
|
|
369237
|
+
message: slashCommandResult.reason,
|
|
369238
|
+
isError: true,
|
|
369239
|
+
adapter,
|
|
369240
|
+
config: config2,
|
|
369241
|
+
startTimeMs: startTime
|
|
369242
|
+
});
|
|
369243
|
+
return;
|
|
369244
|
+
}
|
|
369245
|
+
case "no_command":
|
|
369246
|
+
break;
|
|
369247
|
+
default: {
|
|
369248
|
+
const _exhaustive = slashCommandResult;
|
|
369249
|
+
throw new FatalInputError(
|
|
369250
|
+
`Unhandled slash command result type: ${_exhaustive.type}`
|
|
369251
|
+
);
|
|
369252
|
+
}
|
|
368980
369253
|
}
|
|
368981
369254
|
}
|
|
368982
369255
|
if (!slashHandled) {
|
|
@@ -369002,14 +369275,6 @@ async function runNonInteractive(config2, settings, input, prompt_id, options2 =
|
|
|
369002
369275
|
}
|
|
369003
369276
|
const initialParts = normalizePartList(initialPartList);
|
|
369004
369277
|
let currentMessages = [{ role: "user", parts: initialParts }];
|
|
369005
|
-
if (adapter) {
|
|
369006
|
-
const systemMessage = await buildSystemMessage(
|
|
369007
|
-
config2,
|
|
369008
|
-
sessionId,
|
|
369009
|
-
permissionMode
|
|
369010
|
-
);
|
|
369011
|
-
adapter.emitMessage(systemMessage);
|
|
369012
|
-
}
|
|
369013
369278
|
let isFirstTurn = true;
|
|
369014
369279
|
while (true) {
|
|
369015
369280
|
turnCount++;
|
|
@@ -369689,7 +369954,7 @@ var SystemController = class extends BaseController {
|
|
|
369689
369954
|
};
|
|
369690
369955
|
}
|
|
369691
369956
|
/**
|
|
369692
|
-
* Load slash command names using
|
|
369957
|
+
* Load slash command names using getAvailableCommands
|
|
369693
369958
|
*
|
|
369694
369959
|
* @param signal - AbortSignal to respect for cancellation
|
|
369695
369960
|
* @returns Promise resolving to array of slash command names
|
|
@@ -369699,19 +369964,11 @@ var SystemController = class extends BaseController {
|
|
|
369699
369964
|
return [];
|
|
369700
369965
|
}
|
|
369701
369966
|
try {
|
|
369702
|
-
const
|
|
369703
|
-
[new BuiltinCommandLoader(this.context.config)],
|
|
369704
|
-
signal
|
|
369705
|
-
);
|
|
369967
|
+
const commands = await getAvailableCommands(this.context.config, signal);
|
|
369706
369968
|
if (signal.aborted) {
|
|
369707
369969
|
return [];
|
|
369708
369970
|
}
|
|
369709
|
-
|
|
369710
|
-
const commands = service.getCommands();
|
|
369711
|
-
for (const command2 of commands) {
|
|
369712
|
-
names.add(command2.name);
|
|
369713
|
-
}
|
|
369714
|
-
return Array.from(names).sort();
|
|
369971
|
+
return commands.map((cmd) => cmd.name).sort();
|
|
369715
369972
|
} catch (error2) {
|
|
369716
369973
|
if (signal.aborted) {
|
|
369717
369974
|
return [];
|
|
@@ -403285,6 +403542,11 @@ var useSlashCommandProcessor = /* @__PURE__ */ __name((config2, settings, addIte
|
|
|
403285
403542
|
true
|
|
403286
403543
|
);
|
|
403287
403544
|
}
|
|
403545
|
+
case "stream_messages": {
|
|
403546
|
+
throw new Error(
|
|
403547
|
+
"stream_messages result type is not supported in interactive mode"
|
|
403548
|
+
);
|
|
403549
|
+
}
|
|
403288
403550
|
default: {
|
|
403289
403551
|
const unhandled = result;
|
|
403290
403552
|
throw new Error(
|
|
@@ -405871,143 +406133,16 @@ var useTimer = /* @__PURE__ */ __name((isActive, resetKey) => {
|
|
|
405871
406133
|
// packages/cli/src/ui/hooks/usePhraseCycler.ts
|
|
405872
406134
|
init_esbuild_shims();
|
|
405873
406135
|
var import_react119 = __toESM(require_react(), 1);
|
|
405874
|
-
var WITTY_LOADING_PHRASES = [
|
|
405875
|
-
"I'm Feeling Lucky",
|
|
405876
|
-
"Shipping awesomeness... ",
|
|
405877
|
-
"Painting the serifs back on...",
|
|
405878
|
-
"Navigating the slime mold...",
|
|
405879
|
-
"Consulting the digital spirits...",
|
|
405880
|
-
"Reticulating splines...",
|
|
405881
|
-
"Warming up the AI hamsters...",
|
|
405882
|
-
"Asking the magic conch shell...",
|
|
405883
|
-
"Generating witty retort...",
|
|
405884
|
-
"Polishing the algorithms...",
|
|
405885
|
-
"Don't rush perfection (or my code)...",
|
|
405886
|
-
"Brewing fresh bytes...",
|
|
405887
|
-
"Counting electrons...",
|
|
405888
|
-
"Engaging cognitive processors...",
|
|
405889
|
-
"Checking for syntax errors in the universe...",
|
|
405890
|
-
"One moment, optimizing humor...",
|
|
405891
|
-
"Shuffling punchlines...",
|
|
405892
|
-
"Untangling neural nets...",
|
|
405893
|
-
"Compiling brilliance...",
|
|
405894
|
-
"Loading wit.exe...",
|
|
405895
|
-
"Summoning the cloud of wisdom...",
|
|
405896
|
-
"Preparing a witty response...",
|
|
405897
|
-
"Just a sec, I'm debugging reality...",
|
|
405898
|
-
"Confuzzling the options...",
|
|
405899
|
-
"Tuning the cosmic frequencies...",
|
|
405900
|
-
"Crafting a response worthy of your patience...",
|
|
405901
|
-
"Compiling the 1s and 0s...",
|
|
405902
|
-
"Resolving dependencies... and existential crises...",
|
|
405903
|
-
"Defragmenting memories... both RAM and personal...",
|
|
405904
|
-
"Rebooting the humor module...",
|
|
405905
|
-
"Caching the essentials (mostly cat memes)...",
|
|
405906
|
-
"Optimizing for ludicrous speed",
|
|
405907
|
-
"Swapping bits... don't tell the bytes...",
|
|
405908
|
-
"Garbage collecting... be right back...",
|
|
405909
|
-
"Assembling the interwebs...",
|
|
405910
|
-
"Converting coffee into code...",
|
|
405911
|
-
"Updating the syntax for reality...",
|
|
405912
|
-
"Rewiring the synapses...",
|
|
405913
|
-
"Looking for a misplaced semicolon...",
|
|
405914
|
-
"Greasin' the cogs of the machine...",
|
|
405915
|
-
"Pre-heating the servers...",
|
|
405916
|
-
"Calibrating the flux capacitor...",
|
|
405917
|
-
"Engaging the improbability drive...",
|
|
405918
|
-
"Channeling the Force...",
|
|
405919
|
-
"Aligning the stars for optimal response...",
|
|
405920
|
-
"So say we all...",
|
|
405921
|
-
"Loading the next great idea...",
|
|
405922
|
-
"Just a moment, I'm in the zone...",
|
|
405923
|
-
"Preparing to dazzle you with brilliance...",
|
|
405924
|
-
"Just a tick, I'm polishing my wit...",
|
|
405925
|
-
"Hold tight, I'm crafting a masterpiece...",
|
|
405926
|
-
"Just a jiffy, I'm debugging the universe...",
|
|
405927
|
-
"Just a moment, I'm aligning the pixels...",
|
|
405928
|
-
"Just a sec, I'm optimizing the humor...",
|
|
405929
|
-
"Just a moment, I'm tuning the algorithms...",
|
|
405930
|
-
"Warp speed engaged...",
|
|
405931
|
-
"Mining for more Dilithium crystals...",
|
|
405932
|
-
"Don't panic...",
|
|
405933
|
-
"Following the white rabbit...",
|
|
405934
|
-
"The truth is in here... somewhere...",
|
|
405935
|
-
"Blowing on the cartridge...",
|
|
405936
|
-
"Loading... Do a barrel roll!",
|
|
405937
|
-
"Waiting for the respawn...",
|
|
405938
|
-
"Finishing the Kessel Run in less than 12 parsecs...",
|
|
405939
|
-
"The cake is not a lie, it's just still loading...",
|
|
405940
|
-
"Fiddling with the character creation screen...",
|
|
405941
|
-
"Just a moment, I'm finding the right meme...",
|
|
405942
|
-
"Pressing 'A' to continue...",
|
|
405943
|
-
"Herding digital cats...",
|
|
405944
|
-
"Polishing the pixels...",
|
|
405945
|
-
"Finding a suitable loading screen pun...",
|
|
405946
|
-
"Distracting you with this witty phrase...",
|
|
405947
|
-
"Almost there... probably...",
|
|
405948
|
-
"Our hamsters are working as fast as they can...",
|
|
405949
|
-
"Giving Cloudy a pat on the head...",
|
|
405950
|
-
"Petting the cat...",
|
|
405951
|
-
"Rickrolling my boss...",
|
|
405952
|
-
"Never gonna give you up, never gonna let you down...",
|
|
405953
|
-
"Slapping the bass...",
|
|
405954
|
-
"Tasting the snozberries...",
|
|
405955
|
-
"I'm going the distance, I'm going for speed...",
|
|
405956
|
-
"Is this the real life? Is this just fantasy?...",
|
|
405957
|
-
"I've got a good feeling about this...",
|
|
405958
|
-
"Poking the bear...",
|
|
405959
|
-
"Doing research on the latest memes...",
|
|
405960
|
-
"Figuring out how to make this more witty...",
|
|
405961
|
-
"Hmmm... let me think...",
|
|
405962
|
-
"What do you call a fish with no eyes? A fsh...",
|
|
405963
|
-
"Why did the computer go to therapy? It had too many bytes...",
|
|
405964
|
-
"Why don't programmers like nature? It has too many bugs...",
|
|
405965
|
-
"Why do programmers prefer dark mode? Because light attracts bugs...",
|
|
405966
|
-
"Why did the developer go broke? Because they used up all their cache...",
|
|
405967
|
-
"What can you do with a broken pencil? Nothing, it's pointless...",
|
|
405968
|
-
"Applying percussive maintenance...",
|
|
405969
|
-
"Searching for the correct USB orientation...",
|
|
405970
|
-
"Ensuring the magic smoke stays inside the wires...",
|
|
405971
|
-
"Rewriting in Rust for no particular reason...",
|
|
405972
|
-
"Trying to exit Vim...",
|
|
405973
|
-
"Spinning up the hamster wheel...",
|
|
405974
|
-
"That's not a bug, it's an undocumented feature...",
|
|
405975
|
-
"Engage.",
|
|
405976
|
-
"I'll be back... with an answer.",
|
|
405977
|
-
"My other process is a TARDIS...",
|
|
405978
|
-
"Communing with the machine spirit...",
|
|
405979
|
-
"Letting the thoughts marinate...",
|
|
405980
|
-
"Just remembered where I put my keys...",
|
|
405981
|
-
"Pondering the orb...",
|
|
405982
|
-
"I've seen things you people wouldn't believe... like a user who reads loading messages.",
|
|
405983
|
-
"Initiating thoughtful gaze...",
|
|
405984
|
-
"What's a computer's favorite snack? Microchips.",
|
|
405985
|
-
"Why do Java developers wear glasses? Because they don't C#.",
|
|
405986
|
-
"Charging the laser... pew pew!",
|
|
405987
|
-
"Dividing by zero... just kidding!",
|
|
405988
|
-
"Looking for an adult superviso... I mean, processing.",
|
|
405989
|
-
"Making it go beep boop.",
|
|
405990
|
-
"Buffering... because even AIs need a moment.",
|
|
405991
|
-
"Entangling quantum particles for a faster response...",
|
|
405992
|
-
"Polishing the chrome... on the algorithms.",
|
|
405993
|
-
"Are you not entertained? (Working on it!)",
|
|
405994
|
-
"Summoning the code gremlins... to help, of course.",
|
|
405995
|
-
"Just waiting for the dial-up tone to finish...",
|
|
405996
|
-
"Recalibrating the humor-o-meter.",
|
|
405997
|
-
"My other loading screen is even funnier.",
|
|
405998
|
-
"Pretty sure there's a cat walking on the keyboard somewhere...",
|
|
405999
|
-
"Enhancing... Enhancing... Still loading.",
|
|
406000
|
-
"It's not a bug, it's a feature... of this loading screen.",
|
|
406001
|
-
"Have you tried turning it off and on again? (The loading screen, not me.)",
|
|
406002
|
-
"Constructing additional pylons...",
|
|
406003
|
-
"New line? That\u2019s Ctrl+J."
|
|
406004
|
-
];
|
|
406136
|
+
var WITTY_LOADING_PHRASES = ["I'm Feeling Lucky"];
|
|
406005
406137
|
var PHRASE_CHANGE_INTERVAL_MS = 15e3;
|
|
406006
406138
|
var usePhraseCycler = /* @__PURE__ */ __name((isActive, isWaiting, customPhrases) => {
|
|
406007
|
-
const loadingPhrases = (0, import_react119.useMemo)(
|
|
406008
|
-
(
|
|
406009
|
-
|
|
406010
|
-
|
|
406139
|
+
const loadingPhrases = (0, import_react119.useMemo)(() => {
|
|
406140
|
+
if (customPhrases && customPhrases.length > 0) {
|
|
406141
|
+
return customPhrases;
|
|
406142
|
+
}
|
|
406143
|
+
const translatedPhrases = ta("WITTY_LOADING_PHRASES");
|
|
406144
|
+
return translatedPhrases.length > 0 ? translatedPhrases : WITTY_LOADING_PHRASES;
|
|
406145
|
+
}, [customPhrases]);
|
|
406011
406146
|
const [currentLoadingPhrase, setCurrentLoadingPhrase] = (0, import_react119.useState)(
|
|
406012
406147
|
loadingPhrases[0]
|
|
406013
406148
|
);
|
|
@@ -412068,8 +412203,22 @@ var authenticateUpdateSchema = external_exports.object({
|
|
|
412068
412203
|
authUri: external_exports.string()
|
|
412069
412204
|
})
|
|
412070
412205
|
});
|
|
412206
|
+
var acpMetaSchema = external_exports.record(external_exports.unknown()).nullable().optional();
|
|
412207
|
+
var modelIdSchema = external_exports.string();
|
|
412208
|
+
var modelInfoSchema = external_exports.object({
|
|
412209
|
+
_meta: acpMetaSchema,
|
|
412210
|
+
description: external_exports.string().nullable().optional(),
|
|
412211
|
+
modelId: modelIdSchema,
|
|
412212
|
+
name: external_exports.string()
|
|
412213
|
+
});
|
|
412214
|
+
var sessionModelStateSchema = external_exports.object({
|
|
412215
|
+
_meta: acpMetaSchema,
|
|
412216
|
+
availableModels: external_exports.array(modelInfoSchema),
|
|
412217
|
+
currentModelId: modelIdSchema
|
|
412218
|
+
});
|
|
412071
412219
|
var newSessionResponseSchema = external_exports.object({
|
|
412072
|
-
sessionId: external_exports.string()
|
|
412220
|
+
sessionId: external_exports.string(),
|
|
412221
|
+
models: sessionModelStateSchema
|
|
412073
412222
|
});
|
|
412074
412223
|
var loadSessionResponseSchema = external_exports.null();
|
|
412075
412224
|
var sessionListItemSchema = external_exports.object({
|
|
@@ -412283,6 +412432,10 @@ var currentModeUpdateSchema = external_exports.object({
|
|
|
412283
412432
|
sessionUpdate: external_exports.literal("current_mode_update"),
|
|
412284
412433
|
modeId: approvalModeValueSchema
|
|
412285
412434
|
});
|
|
412435
|
+
var currentModelUpdateSchema = external_exports.object({
|
|
412436
|
+
sessionUpdate: external_exports.literal("current_model_update"),
|
|
412437
|
+
model: modelInfoSchema
|
|
412438
|
+
});
|
|
412286
412439
|
var sessionUpdateSchema = external_exports.union([
|
|
412287
412440
|
external_exports.object({
|
|
412288
412441
|
content: contentBlockSchema,
|
|
@@ -412324,6 +412477,7 @@ var sessionUpdateSchema = external_exports.union([
|
|
|
412324
412477
|
sessionUpdate: external_exports.literal("plan")
|
|
412325
412478
|
}),
|
|
412326
412479
|
currentModeUpdateSchema,
|
|
412480
|
+
currentModelUpdateSchema,
|
|
412327
412481
|
availableCommandsUpdateSchema
|
|
412328
412482
|
]);
|
|
412329
412483
|
var agentResponseSchema = external_exports.union([
|
|
@@ -412437,6 +412591,13 @@ var AgentSideConnection = class {
|
|
|
412437
412591
|
params
|
|
412438
412592
|
);
|
|
412439
412593
|
}
|
|
412594
|
+
/**
|
|
412595
|
+
* Sends a custom notification to the client.
|
|
412596
|
+
* Used for extension-specific notifications that are not part of the core ACP protocol.
|
|
412597
|
+
*/
|
|
412598
|
+
async sendCustomNotification(method, params) {
|
|
412599
|
+
return await this.#connection.sendNotification(method, params);
|
|
412600
|
+
}
|
|
412440
412601
|
/**
|
|
412441
412602
|
* Request permission before running a tool
|
|
412442
412603
|
*
|
|
@@ -413426,7 +413587,6 @@ var SubAgentTracker = class {
|
|
|
413426
413587
|
};
|
|
413427
413588
|
|
|
413428
413589
|
// packages/cli/src/acp-integration/session/Session.ts
|
|
413429
|
-
var ALLOWED_BUILTIN_COMMANDS_FOR_ACP = ["init"];
|
|
413430
413590
|
var Session3 = class {
|
|
413431
413591
|
constructor(id, chat, config2, client, settings) {
|
|
413432
413592
|
this.chat = chat;
|
|
@@ -413497,13 +413657,14 @@ var Session3 = class {
|
|
|
413497
413657
|
inputText,
|
|
413498
413658
|
pendingSend,
|
|
413499
413659
|
this.config,
|
|
413500
|
-
this.settings
|
|
413501
|
-
ALLOWED_BUILTIN_COMMANDS_FOR_ACP
|
|
413660
|
+
this.settings
|
|
413502
413661
|
);
|
|
413503
|
-
|
|
413504
|
-
|
|
413505
|
-
|
|
413506
|
-
|
|
413662
|
+
parts = await this.#processSlashCommandResult(
|
|
413663
|
+
slashCommandResult,
|
|
413664
|
+
params.prompt
|
|
413665
|
+
);
|
|
413666
|
+
if (parts === null) {
|
|
413667
|
+
return { stopReason: "end_turn" };
|
|
413507
413668
|
}
|
|
413508
413669
|
} else {
|
|
413509
413670
|
parts = await this.#resolvePrompt(params.prompt, pendingSend.signal);
|
|
@@ -413593,9 +413754,7 @@ var Session3 = class {
|
|
|
413593
413754
|
try {
|
|
413594
413755
|
const slashCommands = await getAvailableCommands(
|
|
413595
413756
|
this.config,
|
|
413596
|
-
|
|
413597
|
-
abortController.signal,
|
|
413598
|
-
ALLOWED_BUILTIN_COMMANDS_FOR_ACP
|
|
413757
|
+
abortController.signal
|
|
413599
413758
|
);
|
|
413600
413759
|
const availableCommands = slashCommands.map(
|
|
413601
413760
|
(cmd) => ({
|
|
@@ -413842,6 +414001,71 @@ var Session3 = class {
|
|
|
413842
414001
|
return errorResponse(error2);
|
|
413843
414002
|
}
|
|
413844
414003
|
}
|
|
414004
|
+
/**
|
|
414005
|
+
* Processes the result of a slash command execution.
|
|
414006
|
+
*
|
|
414007
|
+
* Supported result types in ACP mode:
|
|
414008
|
+
* - submit_prompt: Submits content to the model
|
|
414009
|
+
* - stream_messages: Streams multiple messages to the client (ACP-specific)
|
|
414010
|
+
* - unsupported: Command cannot be executed in ACP mode
|
|
414011
|
+
* - no_command: No command was found, use original prompt
|
|
414012
|
+
*
|
|
414013
|
+
* Note: 'message' type is not supported in ACP mode - commands should use
|
|
414014
|
+
* 'stream_messages' instead for consistent async handling.
|
|
414015
|
+
*
|
|
414016
|
+
* @param result The result from handleSlashCommand
|
|
414017
|
+
* @param originalPrompt The original prompt blocks
|
|
414018
|
+
* @returns Parts to use for the prompt, or null if command was handled without needing model interaction
|
|
414019
|
+
*/
|
|
414020
|
+
async #processSlashCommandResult(result, originalPrompt) {
|
|
414021
|
+
switch (result.type) {
|
|
414022
|
+
case "submit_prompt":
|
|
414023
|
+
return normalizePartList(result.content);
|
|
414024
|
+
case "message": {
|
|
414025
|
+
await this.client.sendCustomNotification("_qwencode/slash_command", {
|
|
414026
|
+
sessionId: this.sessionId,
|
|
414027
|
+
command: originalPrompt.filter((block2) => block2.type === "text").map((block2) => block2.type === "text" ? block2.text : "").join(" "),
|
|
414028
|
+
messageType: result.messageType,
|
|
414029
|
+
message: result.content || ""
|
|
414030
|
+
});
|
|
414031
|
+
if (result.messageType === "error") {
|
|
414032
|
+
throw new Error(result.content || "Slash command failed.");
|
|
414033
|
+
}
|
|
414034
|
+
return null;
|
|
414035
|
+
}
|
|
414036
|
+
case "stream_messages": {
|
|
414037
|
+
const command2 = originalPrompt.filter((block2) => block2.type === "text").map((block2) => block2.type === "text" ? block2.text : "").join(" ");
|
|
414038
|
+
for await (const msg of result.messages) {
|
|
414039
|
+
await this.client.sendCustomNotification("_qwencode/slash_command", {
|
|
414040
|
+
sessionId: this.sessionId,
|
|
414041
|
+
command: command2,
|
|
414042
|
+
messageType: msg.messageType,
|
|
414043
|
+
message: msg.content
|
|
414044
|
+
});
|
|
414045
|
+
if (msg.messageType === "error") {
|
|
414046
|
+
throw new Error(msg.content || "Slash command failed.");
|
|
414047
|
+
}
|
|
414048
|
+
}
|
|
414049
|
+
return null;
|
|
414050
|
+
}
|
|
414051
|
+
case "unsupported": {
|
|
414052
|
+
const unsupportedError = `Slash command not supported in ACP integration: ${result.reason}`;
|
|
414053
|
+
throw new Error(unsupportedError);
|
|
414054
|
+
}
|
|
414055
|
+
case "no_command":
|
|
414056
|
+
return originalPrompt.map((block2) => {
|
|
414057
|
+
if (block2.type === "text") {
|
|
414058
|
+
return { text: block2.text };
|
|
414059
|
+
}
|
|
414060
|
+
throw new Error(`Unsupported block type: ${block2.type}`);
|
|
414061
|
+
});
|
|
414062
|
+
default: {
|
|
414063
|
+
const _exhaustive = result;
|
|
414064
|
+
const unknownError = `Unknown slash command result type: ${_exhaustive.type}`;
|
|
414065
|
+
throw new Error(unknownError);
|
|
414066
|
+
}
|
|
414067
|
+
}
|
|
414068
|
+
}
|
|
413845
414069
|
async #resolvePrompt(message, abortSignal) {
|
|
413846
414070
|
const FILE_URI_SCHEME = "file://";
|
|
413847
414071
|
const embeddedContext = [];
|
|
@@ -414181,7 +414405,7 @@ var GeminiAgent = class {
|
|
|
414181
414405
|
name: APPROVAL_MODE_INFO[mode].name,
|
|
414182
414406
|
description: APPROVAL_MODE_INFO[mode].description
|
|
414183
414407
|
}));
|
|
414184
|
-
const version2 = "0.6.0-preview.
|
|
414408
|
+
const version2 = "0.6.0-preview.2";
|
|
414185
414409
|
return {
|
|
414186
414410
|
protocolVersion: PROTOCOL_VERSION,
|
|
414187
414411
|
agentInfo: {
|
|
@@ -414237,8 +414461,25 @@ var GeminiAgent = class {
|
|
|
414237
414461
|
await this.ensureAuthenticated(config2);
|
|
414238
414462
|
this.setupFileSystem(config2);
|
|
414239
414463
|
const session = await this.createAndStoreSession(config2);
|
|
414464
|
+
const configuredModel = (config2.getModel() || this.config.getModel() || "").trim();
|
|
414465
|
+
const modelId = configuredModel || "default";
|
|
414466
|
+
const modelName = configuredModel || modelId;
|
|
414240
414467
|
return {
|
|
414241
|
-
sessionId: session.getId()
|
|
414468
|
+
sessionId: session.getId(),
|
|
414469
|
+
models: {
|
|
414470
|
+
currentModelId: modelId,
|
|
414471
|
+
availableModels: [
|
|
414472
|
+
{
|
|
414473
|
+
modelId,
|
|
414474
|
+
name: modelName,
|
|
414475
|
+
description: null,
|
|
414476
|
+
_meta: {
|
|
414477
|
+
contextLimit: tokenLimit(modelId)
|
|
414478
|
+
}
|
|
414479
|
+
}
|
|
414480
|
+
],
|
|
414481
|
+
_meta: null
|
|
414482
|
+
}
|
|
414242
414483
|
};
|
|
414243
414484
|
}
|
|
414244
414485
|
async newSessionConfig(cwd7, mcpServers, sessionId) {
|
|
@@ -414364,8 +414605,10 @@ var GeminiAgent = class {
|
|
|
414364
414605
|
async createAndStoreSession(config2, conversation) {
|
|
414365
414606
|
const sessionId = config2.getSessionId();
|
|
414366
414607
|
const geminiClient = config2.getGeminiClient();
|
|
414367
|
-
|
|
414368
|
-
|
|
414608
|
+
if (!geminiClient.isInitialized()) {
|
|
414609
|
+
await geminiClient.initialize();
|
|
414610
|
+
}
|
|
414611
|
+
const chat = geminiClient.getChat();
|
|
414369
414612
|
const session = new Session3(
|
|
414370
414613
|
sessionId,
|
|
414371
414614
|
chat,
|
|
@@ -414738,6 +414981,11 @@ main().catch((error2) => {
|
|
|
414738
414981
|
* Copyright 2025 Qwen Team
|
|
414739
414982
|
* SPDX-License-Identifier: Apache-2.0
|
|
414740
414983
|
*/
|
|
414984
|
+
/**
|
|
414985
|
+
* @license
|
|
414986
|
+
* Copyright 2025 Qwen team
|
|
414987
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
414988
|
+
*/
|
|
414741
414989
|
/*! Bundled license information:
|
|
414742
414990
|
|
|
414743
414991
|
undici/lib/web/fetch/body.js:
|