gm-oc 2.0.214 → 2.0.216
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/hooks/pre-tool-use-hook.js +50 -1
- package/package.json +1 -1
|
@@ -279,7 +279,8 @@ const run = () => {
|
|
|
279
279
|
const langExts = { nodejs: 'mjs', typescript: 'ts', deno: 'ts', python: 'py', bash: 'sh', powershell: 'ps1', go: 'go', rust: 'rs', c: 'c', cpp: 'cpp', java: 'java' };
|
|
280
280
|
|
|
281
281
|
const spawnDirect = (bin, args, stdin) => {
|
|
282
|
-
const
|
|
282
|
+
const spawnCwd = cwd || (lang === 'agent-browser' ? process.cwd() : undefined);
|
|
283
|
+
const opts = { encoding: 'utf-8', timeout: 60000, windowsHide: true, ...(spawnCwd && { cwd: spawnCwd }), ...(stdin !== undefined && { input: stdin }) };
|
|
283
284
|
const r = spawnSync(bin, args, opts);
|
|
284
285
|
if (!r.stdout && !r.stderr && r.error) return `[spawn error: ${r.error.message}]`;
|
|
285
286
|
const out = (r.stdout || '').trimEnd(), err = stripFooter(r.stderr || '').trimEnd();
|
|
@@ -368,6 +369,43 @@ const run = () => {
|
|
|
368
369
|
const AB_CMDS = new Set(['open','goto','navigate','close','quit','exit','back','forward','reload','click','dblclick','type','fill','press','check','uncheck','select','drag','upload','hover','focus','scroll','scrollintoview','wait','screenshot','pdf','snapshot','get','is','find','eval','connect','tab','frame','dialog','state','session','network','cookies','storage','set','trace','profiler','record','console','errors','highlight','inspect','diff','keyboard','mouse','install','upgrade','confirm','deny','auth','device','window']);
|
|
369
370
|
const AB_GLOBAL_FLAGS = new Set(['--cdp','--headed','--headless','--session','--session-name','--auto-connect','--profile','--allow-file-access','--color-scheme','-p','--platform','--device']);
|
|
370
371
|
const AB_GLOBAL_FLAGS_WITH_VALUE = new Set(['--cdp','--session','--session-name','--profile','--color-scheme','-p','--platform','--device']);
|
|
372
|
+
function loadAbProfile(dir) {
|
|
373
|
+
if (!dir) return { flags: [], env: {} };
|
|
374
|
+
const candidates = ['agent-browser.json', '.agent-browser.json'];
|
|
375
|
+
for (const name of candidates) {
|
|
376
|
+
try {
|
|
377
|
+
const cfg = JSON.parse(fs.readFileSync(path.join(dir, name), 'utf8'));
|
|
378
|
+
const flags = [], env = {};
|
|
379
|
+
if (cfg.headed) { flags.push('--headed'); env.AGENT_BROWSER_HEADED = '1'; }
|
|
380
|
+
if (cfg.headless) flags.push('--headless');
|
|
381
|
+
if (cfg.profile) { flags.push('--profile', cfg.profile); env.AGENT_BROWSER_PROFILE = cfg.profile; }
|
|
382
|
+
if (cfg.cdp) flags.push('--cdp', String(cfg.cdp));
|
|
383
|
+
if (cfg.platform || cfg.p) flags.push('-p', cfg.platform || cfg.p);
|
|
384
|
+
if (cfg.device) flags.push('--device', cfg.device);
|
|
385
|
+
if (cfg['allow-file-access']) flags.push('--allow-file-access');
|
|
386
|
+
if (cfg['color-scheme']) { flags.push('--color-scheme', cfg['color-scheme']); env.AGENT_BROWSER_COLOR_SCHEME = cfg['color-scheme']; }
|
|
387
|
+
return { flags, env };
|
|
388
|
+
} catch {}
|
|
389
|
+
}
|
|
390
|
+
return { flags: [], env: {} };
|
|
391
|
+
}
|
|
392
|
+
const { flags: abProfileFlags, env: abProfileEnv } = loadAbProfile(process.cwd());
|
|
393
|
+
// If profile config exists and no daemon is running, pre-start the daemon with correct cwd
|
|
394
|
+
if (abProfileFlags.length > 0) {
|
|
395
|
+
const portFile = path.join(os.tmpdir(), 'agent-shell.port');
|
|
396
|
+
const daemonRunning = fs.existsSync(portFile);
|
|
397
|
+
if (!daemonRunning) {
|
|
398
|
+
// Start daemon in background from correct cwd so it picks up agent-browser.json
|
|
399
|
+
require('child_process').spawn(abBin, ['open', 'about:blank'], {
|
|
400
|
+
detached: true, stdio: 'ignore',
|
|
401
|
+
cwd: process.cwd(),
|
|
402
|
+
env: { ...process.env, ...abProfileEnv },
|
|
403
|
+
windowsHide: true
|
|
404
|
+
}).unref();
|
|
405
|
+
// Wait for daemon to bind
|
|
406
|
+
spawnSync('cmd.exe', ['/c', 'ping -n 3 127.0.0.1 > nul'], { windowsHide: true, timeout: 5000 });
|
|
407
|
+
}
|
|
408
|
+
}
|
|
371
409
|
const AB_SESSION_STATE = path.join(os.tmpdir(), 'gm-ab-sessions.json');
|
|
372
410
|
function readAbSessions() { try { return JSON.parse(fs.readFileSync(AB_SESSION_STATE, 'utf8')); } catch { return {}; } }
|
|
373
411
|
function writeAbSessions(s) { try { fs.writeFileSync(AB_SESSION_STATE, JSON.stringify(s)); } catch {} }
|
|
@@ -396,6 +434,16 @@ const run = () => {
|
|
|
396
434
|
if (isClose) delete sessions[sessionName];
|
|
397
435
|
writeAbSessions(sessions);
|
|
398
436
|
const openSessions = Object.entries(sessions);
|
|
437
|
+
function mergeProfileFlags(userGlobalArgs) {
|
|
438
|
+
const userFlagSet = new Set(userGlobalArgs.filter(f => f.startsWith('-')));
|
|
439
|
+
const filtered = [];
|
|
440
|
+
for (let i = 0; i < abProfileFlags.length; i++) {
|
|
441
|
+
const f = abProfileFlags[i];
|
|
442
|
+
if (f.startsWith('-') && userFlagSet.has(f)) { if (AB_GLOBAL_FLAGS_WITH_VALUE.has(f)) i++; continue; }
|
|
443
|
+
filtered.push(f);
|
|
444
|
+
}
|
|
445
|
+
return [...filtered, ...userGlobalArgs];
|
|
446
|
+
}
|
|
399
447
|
if (AB_CMDS.has(firstWord)) {
|
|
400
448
|
const lines = safeCode.split('\n').map(l => l.trim()).filter(Boolean);
|
|
401
449
|
if (lines.length === 1) {
|
|
@@ -408,6 +456,7 @@ const run = () => {
|
|
|
408
456
|
const w = (rest[0]||'').toLowerCase();
|
|
409
457
|
if (['open','goto','navigate'].includes(w)) sessions[sessionName] = { url: rest[1]||'?', ts: Date.now() };
|
|
410
458
|
if (['close','quit','exit'].includes(w)) delete sessions[sessionName];
|
|
459
|
+
if (!AB_CMDS.has(w)) return [...globalArgs, 'eval', l.trim()];
|
|
411
460
|
return [...globalArgs, ...rest];
|
|
412
461
|
});
|
|
413
462
|
writeAbSessions(sessions);
|