groove-dev 0.27.91 → 0.27.93

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.
Files changed (70) hide show
  1. package/node_modules/@groove-dev/cli/package.json +1 -1
  2. package/node_modules/@groove-dev/daemon/package.json +1 -1
  3. package/node_modules/@groove-dev/daemon/src/api.js +228 -3
  4. package/node_modules/@groove-dev/daemon/src/introducer.js +42 -0
  5. package/node_modules/@groove-dev/daemon/src/process.js +5 -1
  6. package/node_modules/@groove-dev/daemon/src/providers/base.js +4 -0
  7. package/node_modules/@groove-dev/daemon/src/providers/claude-code.js +8 -0
  8. package/node_modules/@groove-dev/daemon/src/providers/codex.js +33 -4
  9. package/node_modules/@groove-dev/daemon/src/providers/gemini.js +14 -1
  10. package/node_modules/@groove-dev/daemon/src/providers/grok.js +8 -1
  11. package/node_modules/@groove-dev/daemon/src/providers/local.js +8 -1
  12. package/node_modules/@groove-dev/daemon/src/tunnel-manager.js +74 -5
  13. package/node_modules/@groove-dev/daemon/src/validate.js +22 -1
  14. package/node_modules/@groove-dev/gui/dist/assets/{codemirror-BBL3i_JW.js → codemirror-CFF1Lrnz.js} +10 -10
  15. package/node_modules/@groove-dev/gui/dist/assets/index-Bo6AeNmM.css +1 -0
  16. package/node_modules/@groove-dev/gui/dist/assets/index-VB4_k5Pz.js +8653 -0
  17. package/node_modules/@groove-dev/gui/dist/index.html +3 -3
  18. package/node_modules/@groove-dev/gui/package.json +1 -1
  19. package/node_modules/@groove-dev/gui/src/components/agents/agent-chat.jsx +26 -44
  20. package/node_modules/@groove-dev/gui/src/components/agents/agent-file-tree.jsx +29 -28
  21. package/node_modules/@groove-dev/gui/src/components/agents/workspace-mode.jsx +53 -143
  22. package/node_modules/@groove-dev/gui/src/components/chat/chat-header.jsx +3 -30
  23. package/node_modules/@groove-dev/gui/src/components/chat/chat-input.jsx +163 -153
  24. package/node_modules/@groove-dev/gui/src/components/chat/chat-view.jsx +15 -5
  25. package/node_modules/@groove-dev/gui/src/components/chat/conversation-list.jsx +26 -17
  26. package/node_modules/@groove-dev/gui/src/components/editor/code-editor.jsx +32 -26
  27. package/node_modules/@groove-dev/gui/src/components/settings/quick-connect.jsx +5 -1
  28. package/node_modules/@groove-dev/gui/src/components/settings/remote-server-card.jsx +9 -5
  29. package/node_modules/@groove-dev/gui/src/components/settings/ssh-wizard.jsx +5 -1
  30. package/node_modules/@groove-dev/gui/src/components/ui/slider.jsx +50 -0
  31. package/node_modules/@groove-dev/gui/src/stores/groove.js +151 -12
  32. package/node_modules/@groove-dev/gui/src/views/agents.jsx +720 -38
  33. package/package.json +1 -1
  34. package/packages/cli/package.json +1 -1
  35. package/packages/daemon/package.json +1 -1
  36. package/packages/daemon/src/api.js +228 -3
  37. package/packages/daemon/src/introducer.js +42 -0
  38. package/packages/daemon/src/process.js +5 -1
  39. package/packages/daemon/src/providers/base.js +4 -0
  40. package/packages/daemon/src/providers/claude-code.js +8 -0
  41. package/packages/daemon/src/providers/codex.js +33 -4
  42. package/packages/daemon/src/providers/gemini.js +14 -1
  43. package/packages/daemon/src/providers/grok.js +8 -1
  44. package/packages/daemon/src/providers/local.js +8 -1
  45. package/packages/daemon/src/tunnel-manager.js +74 -5
  46. package/packages/daemon/src/validate.js +22 -1
  47. package/packages/gui/dist/assets/{codemirror-BBL3i_JW.js → codemirror-CFF1Lrnz.js} +10 -10
  48. package/packages/gui/dist/assets/index-Bo6AeNmM.css +1 -0
  49. package/packages/gui/dist/assets/index-VB4_k5Pz.js +8653 -0
  50. package/packages/gui/dist/index.html +3 -3
  51. package/packages/gui/package.json +1 -1
  52. package/packages/gui/src/components/agents/agent-chat.jsx +26 -44
  53. package/packages/gui/src/components/agents/agent-file-tree.jsx +29 -28
  54. package/packages/gui/src/components/agents/workspace-mode.jsx +53 -143
  55. package/packages/gui/src/components/chat/chat-header.jsx +3 -30
  56. package/packages/gui/src/components/chat/chat-input.jsx +163 -153
  57. package/packages/gui/src/components/chat/chat-view.jsx +15 -5
  58. package/packages/gui/src/components/chat/conversation-list.jsx +26 -17
  59. package/packages/gui/src/components/editor/code-editor.jsx +32 -26
  60. package/packages/gui/src/components/settings/quick-connect.jsx +5 -1
  61. package/packages/gui/src/components/settings/remote-server-card.jsx +9 -5
  62. package/packages/gui/src/components/settings/ssh-wizard.jsx +5 -1
  63. package/packages/gui/src/components/ui/slider.jsx +50 -0
  64. package/packages/gui/src/stores/groove.js +151 -12
  65. package/packages/gui/src/views/agents.jsx +720 -38
  66. package/workspace.png +0 -0
  67. package/node_modules/@groove-dev/gui/dist/assets/index-D4vJ_1ET.css +0 -1
  68. package/node_modules/@groove-dev/gui/dist/assets/index-MLIZRMj1.js +0 -8642
  69. package/packages/gui/dist/assets/index-D4vJ_1ET.css +0 -1
  70. package/packages/gui/dist/assets/index-MLIZRMj1.js +0 -8642
@@ -293,6 +293,7 @@ export class TunnelManager {
293
293
  '-o', 'ServerAliveCountMax=3',
294
294
  '-o', 'ExitOnForwardFailure=yes',
295
295
  '-o', 'StrictHostKeyChecking=accept-new',
296
+ '-o', 'GSSAPIAuthentication=no',
296
297
  ...keyArgs,
297
298
  target,
298
299
  ];
@@ -306,7 +307,8 @@ export class TunnelManager {
306
307
  tunnel.stderr.on('data', (chunk) => { stderrBuf += chunk.toString(); });
307
308
 
308
309
  let tunnelUp = false;
309
- for (let elapsed = 0; elapsed < 8000; elapsed += 500) {
310
+ this.daemon.broadcast({ type: 'tunnel.status', data: { id, step: 'forwarding' } });
311
+ for (let elapsed = 0; elapsed < 20000; elapsed += 500) {
310
312
  await new Promise((r) => setTimeout(r, 500));
311
313
  if (tunnel.exitCode !== null) {
312
314
  throw new Error(`Tunnel failed to start: ${stderrBuf.trim() || 'unknown error'}`);
@@ -317,7 +319,7 @@ export class TunnelManager {
317
319
 
318
320
  if (!tunnelUp) {
319
321
  try { process.kill(tunnel.pid); } catch { /* ignore */ }
320
- throw new Error('Tunnel started but port forward not active');
322
+ throw new Error(`SSH tunnel started but port forward not active${stderrBuf.trim() ? ': ' + stderrBuf.trim() : ''}`);
321
323
  }
322
324
 
323
325
  tunnel.unref();
@@ -332,6 +334,8 @@ export class TunnelManager {
332
334
  failCount: 0,
333
335
  });
334
336
 
337
+ await this._checkAndUpgradeRunning(id, config, localPort);
338
+
335
339
  const url = `http://localhost:${localPort}?instance=${encodeURIComponent(config.name)}`;
336
340
 
337
341
  this.daemon.audit.log('tunnel.connect', { id, name: config.name, host: config.host, localPort });
@@ -371,11 +375,74 @@ export class TunnelManager {
371
375
  }
372
376
  }
373
377
 
378
+ async _checkAndUpgradeRunning(id, config, localPort) {
379
+ const localVer = getLocalVersion();
380
+ if (localVer === '0.0.0') return;
381
+
382
+ try {
383
+ const resp = await fetch(`http://localhost:${localPort}/api/status`, {
384
+ signal: AbortSignal.timeout(5000),
385
+ });
386
+ if (!resp.ok) return;
387
+ const status = await resp.json();
388
+ const remoteVersion = status.version;
389
+ if (!remoteVersion || remoteVersion === localVer) return;
390
+
391
+ this.daemon.broadcast({ type: 'tunnel.status', data: { id, step: 'upgrading', from: remoteVersion, to: localVer } });
392
+
393
+ const target = `${config.user}@${config.host}`;
394
+ const keyArgs = config.sshKeyPath ? ['-i', config.sshKeyPath] : [];
395
+ const sshBase = [...keyArgs, '-p', String(config.port || 22), '-o', 'ConnectTimeout=10', '-o', 'BatchMode=yes', target];
396
+ const pkg = `groove-dev@${localVer}`;
397
+ const installCmd = config.user === 'root' ? `npm i -g ${pkg}` : `sudo npm i -g ${pkg}`;
398
+
399
+ execFileSync('ssh', [...sshBase, `bash -lc '${installCmd}'`], {
400
+ encoding: 'utf8',
401
+ timeout: 120000,
402
+ stdio: ['pipe', 'pipe', 'pipe'],
403
+ });
404
+
405
+ try {
406
+ execFileSync('ssh', [...sshBase, `bash -lc 'groove stop'`], {
407
+ encoding: 'utf8',
408
+ timeout: 10000,
409
+ stdio: ['pipe', 'pipe', 'pipe'],
410
+ });
411
+ } catch { /* ignore */ }
412
+
413
+ await new Promise(r => setTimeout(r, 1000));
414
+
415
+ try {
416
+ execFileSync('ssh', [...sshBase, `bash -lc 'groove start -d'`], {
417
+ encoding: 'utf8',
418
+ timeout: 30000,
419
+ stdio: ['pipe', 'pipe', 'pipe'],
420
+ });
421
+ } catch { /* ignore */ }
422
+
423
+ await new Promise(r => setTimeout(r, 5000));
424
+
425
+ for (let i = 0; i < 3; i++) {
426
+ try {
427
+ const check = await fetch(`http://localhost:${localPort}/api/health`, {
428
+ signal: AbortSignal.timeout(3000),
429
+ });
430
+ if (check.ok) return;
431
+ } catch { /* ignore */ }
432
+ await new Promise(r => setTimeout(r, 2000));
433
+ }
434
+
435
+ this.daemon.audit.log('tunnel.upgrade-slow', { id, from: remoteVersion, to: localVer });
436
+ } catch { /* non-fatal — tunnel is still usable at old version */ }
437
+ }
438
+
374
439
  async _remoteUpgrade(id, config) {
375
440
  const target = `${config.user}@${config.host}`;
376
441
  const keyArgs = config.sshKeyPath ? ['-i', config.sshKeyPath] : [];
377
442
  const sshBase = [...keyArgs, '-p', String(config.port || 22), '-o', 'ConnectTimeout=10', '-o', 'BatchMode=yes', target];
378
- const installCmd = config.user === 'root' ? 'npm i -g groove-dev' : 'sudo npm i -g groove-dev';
443
+ const localVer = getLocalVersion();
444
+ const pkg = localVer !== '0.0.0' ? `groove-dev@${localVer}` : 'groove-dev';
445
+ const installCmd = config.user === 'root' ? `npm i -g ${pkg}` : `sudo npm i -g ${pkg}`;
379
446
 
380
447
  try {
381
448
  execFileSync('ssh', [...sshBase, `bash -lc '${installCmd}'`], {
@@ -478,9 +545,11 @@ export class TunnelManager {
478
545
  }
479
546
 
480
547
  // Step 2: Install groove-dev globally (use sudo if not root)
548
+ const localVer = getLocalVersion();
549
+ const pkg = localVer !== '0.0.0' ? `groove-dev@${localVer}` : 'groove-dev';
481
550
  const installCmd = config.user === 'root'
482
- ? 'npm i -g groove-dev'
483
- : 'sudo npm i -g groove-dev';
551
+ ? `npm i -g ${pkg}`
552
+ : `sudo npm i -g ${pkg}`;
484
553
 
485
554
  try {
486
555
  execFileSync('ssh', [
@@ -93,6 +93,25 @@ export function validateAgentConfig(config) {
93
93
  const reasoningEffort = config.reasoning_effort !== undefined && config.reasoning_effort !== null
94
94
  ? validateReasoningEffort(config.reasoning_effort) : undefined;
95
95
 
96
+ // Numeric tuning params (0-100 for effort/verbosity, 0.0-1.0 for temperature)
97
+ let numericReasoningEffort = undefined;
98
+ if (config.reasoningEffort !== undefined && config.reasoningEffort !== null) {
99
+ const n = Number(config.reasoningEffort);
100
+ if (!isNaN(n) && n >= 0 && n <= 100) numericReasoningEffort = Math.round(n);
101
+ }
102
+
103
+ let temperature = undefined;
104
+ if (config.temperature !== undefined && config.temperature !== null) {
105
+ const t = Number(config.temperature);
106
+ if (!isNaN(t) && t >= 0 && t <= 1) temperature = t;
107
+ }
108
+
109
+ let verbosity = undefined;
110
+ if (config.verbosity !== undefined && config.verbosity !== null) {
111
+ const v = Number(config.verbosity);
112
+ if (!isNaN(v) && v >= 0 && v <= 100) verbosity = Math.round(v);
113
+ }
114
+
96
115
  // Return sanitized config (only known fields)
97
116
  return {
98
117
  role: config.role,
@@ -109,7 +128,9 @@ export function validateAgentConfig(config) {
109
128
  integrationApproval,
110
129
  repos,
111
130
  personality,
112
- reasoningEffort,
131
+ reasoningEffort: numericReasoningEffort ?? reasoningEffort,
132
+ temperature,
133
+ verbosity,
113
134
  };
114
135
  }
115
136