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.
- package/node_modules/@groove-dev/cli/package.json +1 -1
- package/node_modules/@groove-dev/daemon/package.json +1 -1
- package/node_modules/@groove-dev/daemon/src/api.js +228 -3
- package/node_modules/@groove-dev/daemon/src/introducer.js +42 -0
- package/node_modules/@groove-dev/daemon/src/process.js +5 -1
- package/node_modules/@groove-dev/daemon/src/providers/base.js +4 -0
- package/node_modules/@groove-dev/daemon/src/providers/claude-code.js +8 -0
- package/node_modules/@groove-dev/daemon/src/providers/codex.js +33 -4
- package/node_modules/@groove-dev/daemon/src/providers/gemini.js +14 -1
- package/node_modules/@groove-dev/daemon/src/providers/grok.js +8 -1
- package/node_modules/@groove-dev/daemon/src/providers/local.js +8 -1
- package/node_modules/@groove-dev/daemon/src/tunnel-manager.js +74 -5
- package/node_modules/@groove-dev/daemon/src/validate.js +22 -1
- package/node_modules/@groove-dev/gui/dist/assets/{codemirror-BBL3i_JW.js → codemirror-CFF1Lrnz.js} +10 -10
- package/node_modules/@groove-dev/gui/dist/assets/index-Bo6AeNmM.css +1 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-VB4_k5Pz.js +8653 -0
- package/node_modules/@groove-dev/gui/dist/index.html +3 -3
- package/node_modules/@groove-dev/gui/package.json +1 -1
- package/node_modules/@groove-dev/gui/src/components/agents/agent-chat.jsx +26 -44
- package/node_modules/@groove-dev/gui/src/components/agents/agent-file-tree.jsx +29 -28
- package/node_modules/@groove-dev/gui/src/components/agents/workspace-mode.jsx +53 -143
- package/node_modules/@groove-dev/gui/src/components/chat/chat-header.jsx +3 -30
- package/node_modules/@groove-dev/gui/src/components/chat/chat-input.jsx +163 -153
- package/node_modules/@groove-dev/gui/src/components/chat/chat-view.jsx +15 -5
- package/node_modules/@groove-dev/gui/src/components/chat/conversation-list.jsx +26 -17
- package/node_modules/@groove-dev/gui/src/components/editor/code-editor.jsx +32 -26
- package/node_modules/@groove-dev/gui/src/components/settings/quick-connect.jsx +5 -1
- package/node_modules/@groove-dev/gui/src/components/settings/remote-server-card.jsx +9 -5
- package/node_modules/@groove-dev/gui/src/components/settings/ssh-wizard.jsx +5 -1
- package/node_modules/@groove-dev/gui/src/components/ui/slider.jsx +50 -0
- package/node_modules/@groove-dev/gui/src/stores/groove.js +151 -12
- package/node_modules/@groove-dev/gui/src/views/agents.jsx +720 -38
- package/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/daemon/src/api.js +228 -3
- package/packages/daemon/src/introducer.js +42 -0
- package/packages/daemon/src/process.js +5 -1
- package/packages/daemon/src/providers/base.js +4 -0
- package/packages/daemon/src/providers/claude-code.js +8 -0
- package/packages/daemon/src/providers/codex.js +33 -4
- package/packages/daemon/src/providers/gemini.js +14 -1
- package/packages/daemon/src/providers/grok.js +8 -1
- package/packages/daemon/src/providers/local.js +8 -1
- package/packages/daemon/src/tunnel-manager.js +74 -5
- package/packages/daemon/src/validate.js +22 -1
- package/packages/gui/dist/assets/{codemirror-BBL3i_JW.js → codemirror-CFF1Lrnz.js} +10 -10
- package/packages/gui/dist/assets/index-Bo6AeNmM.css +1 -0
- package/packages/gui/dist/assets/index-VB4_k5Pz.js +8653 -0
- package/packages/gui/dist/index.html +3 -3
- package/packages/gui/package.json +1 -1
- package/packages/gui/src/components/agents/agent-chat.jsx +26 -44
- package/packages/gui/src/components/agents/agent-file-tree.jsx +29 -28
- package/packages/gui/src/components/agents/workspace-mode.jsx +53 -143
- package/packages/gui/src/components/chat/chat-header.jsx +3 -30
- package/packages/gui/src/components/chat/chat-input.jsx +163 -153
- package/packages/gui/src/components/chat/chat-view.jsx +15 -5
- package/packages/gui/src/components/chat/conversation-list.jsx +26 -17
- package/packages/gui/src/components/editor/code-editor.jsx +32 -26
- package/packages/gui/src/components/settings/quick-connect.jsx +5 -1
- package/packages/gui/src/components/settings/remote-server-card.jsx +9 -5
- package/packages/gui/src/components/settings/ssh-wizard.jsx +5 -1
- package/packages/gui/src/components/ui/slider.jsx +50 -0
- package/packages/gui/src/stores/groove.js +151 -12
- package/packages/gui/src/views/agents.jsx +720 -38
- package/workspace.png +0 -0
- package/node_modules/@groove-dev/gui/dist/assets/index-D4vJ_1ET.css +0 -1
- package/node_modules/@groove-dev/gui/dist/assets/index-MLIZRMj1.js +0 -8642
- package/packages/gui/dist/assets/index-D4vJ_1ET.css +0 -1
- 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
|
-
|
|
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(
|
|
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
|
|
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
|
-
?
|
|
483
|
-
:
|
|
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
|
|