aboutsummaryrefslogtreecommitdiff
path: root/modules/core/terminal.js
diff options
context:
space:
mode:
Diffstat (limited to 'modules/core/terminal.js')
-rw-r--r--modules/core/terminal.js14
1 files changed, 11 insertions, 3 deletions
diff --git a/modules/core/terminal.js b/modules/core/terminal.js
index 76406b5..16e2c7e 100644
--- a/modules/core/terminal.js
+++ b/modules/core/terminal.js
@@ -196,6 +196,11 @@
return null;
}
async checkAndRun(rawInput) {
+ // v4.6.130: keep the untokenised line for the command itself. _parseArgs turns
+ // quote characters into delimiters and drops them, so `js "abc".toUpperCase()`
+ // reaches the module as `abc.toUpperCase()` and every string literal dies.
+ // Security classification still runs on the tokenised form below.
+ this._currentRaw = rawInput;
const badOp = this.detectComposition(rawInput);
if (badOp) {
this.terminal.print('⚠️ No shell here — `' + badOp + '` is not interpreted. ' +
@@ -278,7 +283,7 @@
return this._dispatch(cmd, args);
}
async _dispatch(cmd, args) {
- return this.terminal.dispatchCommand(cmd, args);
+ return this.terminal.dispatchCommand(cmd, args, this._currentRaw || null);
}
async _tryAIRoute(rawInput) {
// AI routing cooldown guard
@@ -1623,7 +1628,10 @@
}
return trimmed;
}
- async dispatchCommand(cmd, args) {
+ // rawText (v4.6.130): the untokenised command line, when the call came from the
+ // terminal. Commands that need their delimiters (`js`, `node -e`) read it; every
+ // other command keeps using `args` and ignores the extra parameter.
+ async dispatchCommand(cmd, args, rawText) {
if (cmd === 'clear') { this.clearOutput(); return; }
if (cmd === 'expand') { this.toggleExpand(); return; }
if (cmd === 'sysmsg') { this.toggleSystemMessages(args[0]); return; }
@@ -1930,7 +1938,7 @@
if (typeof _m.onCommandStart === 'function') { try { _m.onCommandStart(cmd, args); } catch (_e) {} }
}
}
- try { await mod.commands[cmd](args);
+ try { await mod.commands[cmd](args, rawText);
if (cmd !== 'tutorial' && cmd !== 'course') {
for (const _m of Object.values(this.moduleManager.modules)) {
if (typeof _m.onCommandExecuted === 'function') { try { _m.onCommandExecuted(cmd, args); } catch (_e) {} }