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.
@@ -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 opts = { encoding: 'utf-8', timeout: 60000, windowsHide: true, ...(cwd && { cwd }), ...(stdin !== undefined && { input: stdin }) };
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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gm-oc",
3
- "version": "2.0.214",
3
+ "version": "2.0.216",
4
4
  "description": "State machine agent with hooks, skills, and automated git enforcement",
5
5
  "author": "AnEntrypoint",
6
6
  "license": "MIT",