warn on cd in shell mode. done robustly based on lessons from shell tool. logs to console.warn for now, and does not restore (but see comment on how to restore) (#438)

This commit is contained in:
Olcan 2025-05-19 14:51:54 -07:00 committed by GitHub
parent e1e59bf0cd
commit 96387aba83
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 21 additions and 2 deletions

View File

@ -10,7 +10,10 @@ import { Config } from '@gemini-code/server';
import { type PartListUnion } from '@google/genai';
import { getCommandFromQuery } from '../utils/commandUtils.js';
import { UseHistoryManagerReturn } from './useHistoryManager.js';
import crypto from 'crypto';
import path from 'path';
import os from 'os';
import fs from 'fs';
/**
* Hook to process shell commands (e.g., !ls, $pwd).
* Executes the command in the target directory and adds output/errors to history.
@ -35,7 +38,14 @@ export const useShellCommandProcessor = (
if (symbol !== '!' && symbol !== '$') {
return false;
}
const commandToExecute = rawQuery.trim().slice(1).trimStart();
let commandToExecute = rawQuery.trim().slice(1).trimStart();
// wrap command to write pwd to temporary file
const pwdFileName = `shell_pwd_${crypto.randomBytes(6).toString('hex')}.tmp`;
const pwdFilePath = path.join(os.tmpdir(), pwdFileName);
if (!commandToExecute.endsWith('&')) commandToExecute += ';';
// note here we could also restore a previous pwd with `cd {cwd}; { ... }`
commandToExecute = `{ ${commandToExecute} }; pwd >${pwdFilePath}`;
const userMessageTimestamp = Date.now();
addItemToHistory(
@ -76,6 +86,15 @@ export const useShellCommandProcessor = (
userMessageTimestamp,
);
}
if (fs.existsSync(pwdFilePath)) {
const pwd = fs.readFileSync(pwdFilePath, 'utf8').trim();
if (pwd !== targetDir) {
console.warn(
`shell mode is stateless; \`cd ${pwd}\` will not apply to next command`,
);
}
fs.unlinkSync(pwdFilePath);
}
resolve();
});
});