groove-dev 0.27.64 → 0.27.66

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 (40) hide show
  1. package/README.md +1 -1
  2. package/node_modules/@groove-dev/cli/package.json +1 -1
  3. package/node_modules/@groove-dev/daemon/package.json +1 -1
  4. package/node_modules/@groove-dev/daemon/src/api.js +103 -31
  5. package/node_modules/@groove-dev/daemon/src/providers/claude-code.js +0 -1
  6. package/node_modules/@groove-dev/gui/dist/assets/{index-DiiEKVEo.js → index-BvvSZvQz.js} +1735 -1735
  7. package/node_modules/@groove-dev/gui/dist/assets/index-DFp5IOnd.css +1 -0
  8. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  9. package/node_modules/@groove-dev/gui/package.json +1 -1
  10. package/node_modules/@groove-dev/gui/src/components/network/activity-chart.jsx +10 -14
  11. package/node_modules/@groove-dev/gui/src/components/network/compute-header.jsx +67 -200
  12. package/node_modules/@groove-dev/gui/src/components/network/earnings-card.jsx +30 -0
  13. package/node_modules/@groove-dev/gui/src/components/network/fleet-table.jsx +114 -72
  14. package/node_modules/@groove-dev/gui/src/components/network/identity-bar.jsx +94 -0
  15. package/node_modules/@groove-dev/gui/src/components/network/node-card.jsx +88 -0
  16. package/node_modules/@groove-dev/gui/src/components/network/wallet-view.jsx +77 -0
  17. package/node_modules/@groove-dev/gui/src/components/onboarding/setup-wizard.jsx +1 -1
  18. package/node_modules/@groove-dev/gui/src/stores/groove.js +13 -0
  19. package/node_modules/@groove-dev/gui/src/views/network.jsx +59 -18
  20. package/package.json +1 -1
  21. package/packages/cli/package.json +1 -1
  22. package/packages/daemon/package.json +1 -1
  23. package/packages/daemon/src/api.js +103 -31
  24. package/packages/daemon/src/providers/claude-code.js +0 -1
  25. package/packages/gui/dist/assets/{index-DiiEKVEo.js → index-BvvSZvQz.js} +1735 -1735
  26. package/packages/gui/dist/assets/index-DFp5IOnd.css +1 -0
  27. package/packages/gui/dist/index.html +2 -2
  28. package/packages/gui/package.json +1 -1
  29. package/packages/gui/src/components/network/activity-chart.jsx +10 -14
  30. package/packages/gui/src/components/network/compute-header.jsx +67 -200
  31. package/packages/gui/src/components/network/earnings-card.jsx +30 -0
  32. package/packages/gui/src/components/network/fleet-table.jsx +114 -72
  33. package/packages/gui/src/components/network/identity-bar.jsx +94 -0
  34. package/packages/gui/src/components/network/node-card.jsx +88 -0
  35. package/packages/gui/src/components/network/wallet-view.jsx +77 -0
  36. package/packages/gui/src/components/onboarding/setup-wizard.jsx +1 -1
  37. package/packages/gui/src/stores/groove.js +13 -0
  38. package/packages/gui/src/views/network.jsx +59 -18
  39. package/node_modules/@groove-dev/gui/dist/assets/index-B3AqeyS4.css +0 -1
  40. package/packages/gui/dist/assets/index-B3AqeyS4.css +0 -1
package/README.md CHANGED
@@ -216,7 +216,7 @@ Append-only, `0600` permissions, auto-rotates at 5MB. When team auth is added, e
216
216
 
217
217
  | Provider | Auth | Models |
218
218
  |----------|------|--------|
219
- | **Claude Code** | Subscription | Opus 4.7, Opus 4.6, Sonnet 4.6, Haiku 4.5 |
219
+ | **Claude Code** | Subscription | Opus 4.6, Sonnet 4.6, Haiku 4.5 |
220
220
  | **Codex** | API Key | o3, o4-mini, GPT-4.1, GPT-4.1 Mini, GPT-4.1 Nano |
221
221
  | **Gemini CLI** | API Key | 3.1 Pro, 3 Flash, 3.1 Flash Lite, 2.5 Pro, 2.5 Flash |
222
222
  | **Ollama** | Local | Any |
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/cli",
3
- "version": "0.27.64",
3
+ "version": "0.27.66",
4
4
  "description": "GROOVE CLI — manage AI coding agents from your terminal",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/daemon",
3
- "version": "0.27.64",
3
+ "version": "0.27.66",
4
4
  "description": "GROOVE daemon — agent orchestration engine",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -4145,9 +4145,36 @@ Keep responses concise. Help them think, don't lecture them about the system the
4145
4145
 
4146
4146
  // Network node lifecycle (gated)
4147
4147
 
4148
+ let _localHwCache = null;
4149
+ function getLocalHardware() {
4150
+ if (!_localHwCache) {
4151
+ const sys = OllamaProvider.getSystemHardware();
4152
+ const vramGb = sys.gpu?.vram || 0;
4153
+ const ramGb = sys.totalRamGb || 0;
4154
+ const vramMb = vramGb * 1024;
4155
+ const ramMb = ramGb * 1024;
4156
+ const fmtGb = (gb) => gb > 0 ? `${gb} GB` : null;
4157
+ _localHwCache = {
4158
+ device: sys.gpu?.type === 'nvidia' ? 'cuda' : sys.gpu?.type === 'apple-silicon' ? 'metal' : 'cpu',
4159
+ gpu: sys.gpu?.name || null,
4160
+ memory: fmtGb(vramGb) || fmtGb(ramGb),
4161
+ vram: fmtGb(vramGb),
4162
+ ram: fmtGb(ramGb),
4163
+ cpuCores: sys.cores || null,
4164
+ ram_mb: ramMb,
4165
+ vram_mb: vramMb,
4166
+ gpu_model: sys.gpu?.name || null,
4167
+ cpu_cores: sys.cores || 0,
4168
+ bandwidth_mbps: 0,
4169
+ max_context_length: 0,
4170
+ };
4171
+ }
4172
+ return _localHwCache;
4173
+ }
4174
+
4148
4175
  function snapshotNode() {
4149
4176
  const n = daemon.networkNode || {};
4150
- const hw = n.hardware || {};
4177
+ const hw = n.hardware || getLocalHardware();
4151
4178
  return {
4152
4179
  active: !!n.active,
4153
4180
  status: n.status || 'stopped',
@@ -4155,7 +4182,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
4155
4182
  layers: n.layers || null,
4156
4183
  model: n.model || null,
4157
4184
  sessions: n.sessions || 0,
4158
- hardware: n.hardware || null,
4185
+ hardware: hw,
4159
4186
  installed: !!(daemon.config?.networkBeta?.installed),
4160
4187
  ram_mb: Number(hw.ram_mb) || 0,
4161
4188
  vram_mb: Number(hw.vram_mb) || 0,
@@ -4212,6 +4239,12 @@ Keep responses concise. Help them think, don't lecture them about the system the
4212
4239
  cpuCores: caps.cpu_cores || null,
4213
4240
  bandwidthMbps: caps.bandwidth_mbps || null,
4214
4241
  maxContext: caps.max_context_length || null,
4242
+ ram_mb: Number(caps.ram_mb) || 0,
4243
+ vram_mb: Number(caps.vram_mb) || 0,
4244
+ gpu_model: caps.gpu_model || null,
4245
+ cpu_cores: Number(caps.cpu_cores) || 0,
4246
+ bandwidth_mbps: Number(caps.bandwidth_mbps) || 0,
4247
+ max_context_length: Number(caps.max_context_length) || 0,
4215
4248
  };
4216
4249
  }
4217
4250
 
@@ -4282,7 +4315,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
4282
4315
  layers: null,
4283
4316
  model: null,
4284
4317
  sessions: 0,
4285
- hardware: null,
4318
+ hardware: getLocalHardware(),
4286
4319
  startedAt: Date.now(),
4287
4320
  events: [],
4288
4321
  };
@@ -4454,14 +4487,15 @@ Keep responses concise. Help them think, don't lecture them about the system the
4454
4487
  daemon.networkNode.layers = self.layers;
4455
4488
  changed = true;
4456
4489
  }
4457
- if (self.device) {
4458
- daemon.networkNode.hardware = {
4459
- device: self.device,
4460
- memory: daemon.networkNode.hardware?.memory || null,
4461
- gpu: daemon.networkNode.hardware?.gpu || null,
4462
- };
4463
- changed = true;
4464
- }
4490
+ const prev = daemon.networkNode.hardware || getLocalHardware();
4491
+ const enriched = { ...prev };
4492
+ if (self.device) enriched.device = self.device;
4493
+ if (self.gpu_model) { enriched.gpu = self.gpu_model; enriched.gpu_model = self.gpu_model; }
4494
+ if (Number(self.ram_mb) > 0) { enriched.ram_mb = Number(self.ram_mb); }
4495
+ if (Number(self.vram_mb) > 0) { enriched.vram_mb = Number(self.vram_mb); enriched.memory = enriched.vram_mb >= 1024 ? `${(enriched.vram_mb / 1024).toFixed(1)} GB` : `${enriched.vram_mb} MB`; }
4496
+ if (Number(self.cpu_cores) > 0) { enriched.cpu_cores = Number(self.cpu_cores); enriched.cpuCores = Number(self.cpu_cores); }
4497
+ daemon.networkNode.hardware = enriched;
4498
+ changed = true;
4465
4499
  }
4466
4500
  const availModel = Array.isArray(data.models)
4467
4501
  ? data.models.find((m) => m && m.available !== false)
@@ -4474,25 +4508,39 @@ Keep responses concise. Help them think, don't lecture them about the system the
4474
4508
  }
4475
4509
 
4476
4510
  const capStr = (s, max = 200) => (typeof s === 'string' ? s.slice(0, max) : s);
4477
- const safeNodes = (Array.isArray(data.nodes) ? data.nodes : []).map((n) => ({
4478
- node_id: capStr(n.node_id || n.nodeId),
4479
- device: capStr(n.device),
4480
- layers: Array.isArray(n.layers) ? n.layers.slice(0, 2) : n.layers,
4481
- status: capStr(n.status, 50),
4482
- active_sessions: n.active_sessions ?? 0,
4483
- ram_mb: Number(n.ram_mb) || 0,
4484
- vram_mb: Number(n.vram_mb) || 0,
4485
- gpu_model: capStr(n.gpu_model || '', 200),
4486
- cpu_cores: Number(n.cpu_cores) || 0,
4487
- bandwidth_mbps: Number(n.bandwidth_mbps) || 0.0,
4488
- max_context_length: Number(n.max_context_length) || 0,
4489
- load: Number(n.load) || 0.0,
4490
- gpu_utilization_pct: Number(n.gpu_utilization_pct) || 0,
4491
- vram_used_mb: Number(n.vram_used_mb) || 0,
4492
- ram_used_mb: Number(n.ram_used_mb) || 0,
4493
- ram_pct: Number(n.ram_pct) || 0,
4494
- uptime_seconds: Number(n.uptime_seconds) || 0,
4495
- }));
4511
+ const selfId = daemon.networkNode?.nodeId;
4512
+ const localHw = getLocalHardware();
4513
+ const safeNodes = (Array.isArray(data.nodes) ? data.nodes : []).map((n) => {
4514
+ const nid = n.node_id || n.nodeId || '';
4515
+ const isSelf = selfId && nid && (nid === selfId || (nid.length >= 6 && selfId.startsWith(nid.replace(/\.{2,}$/, ''))));
4516
+ const base = {
4517
+ node_id: capStr(nid),
4518
+ device: capStr(n.device),
4519
+ layers: Array.isArray(n.layers) ? n.layers.slice(0, 2) : n.layers,
4520
+ status: capStr(n.status, 50),
4521
+ active_sessions: n.active_sessions ?? 0,
4522
+ ram_mb: Number(n.ram_mb) || 0,
4523
+ vram_mb: Number(n.vram_mb) || 0,
4524
+ gpu_model: capStr(n.gpu_model || '', 200),
4525
+ cpu_cores: Number(n.cpu_cores) || 0,
4526
+ bandwidth_mbps: Number(n.bandwidth_mbps) || 0.0,
4527
+ max_context_length: Number(n.max_context_length) || 0,
4528
+ load: Number(n.load) || 0.0,
4529
+ gpu_utilization_pct: Number(n.gpu_utilization_pct) || 0,
4530
+ vram_used_mb: Number(n.vram_used_mb) || 0,
4531
+ ram_used_mb: Number(n.ram_used_mb) || 0,
4532
+ ram_pct: Number(n.ram_pct) || 0,
4533
+ uptime_seconds: Number(n.uptime_seconds) || 0,
4534
+ };
4535
+ if (isSelf) {
4536
+ if (!base.device) base.device = localHw.device;
4537
+ if (!base.gpu_model) base.gpu_model = localHw.gpu_model || '';
4538
+ if (!base.ram_mb) base.ram_mb = localHw.ram_mb;
4539
+ if (!base.vram_mb) base.vram_mb = localHw.vram_mb;
4540
+ if (!base.cpu_cores) base.cpu_cores = localHw.cpu_cores;
4541
+ }
4542
+ return base;
4543
+ });
4496
4544
 
4497
4545
  return res.json({
4498
4546
  nodes: safeNodes,
@@ -4515,7 +4563,7 @@ Keep responses concise. Help them think, don't lecture them about the system the
4515
4563
  const localCpuCores = sysHw.cores || 0;
4516
4564
  const selfNode = node.active && node.nodeId ? [{
4517
4565
  node_id: node.nodeId,
4518
- device: hw.device || 'auto',
4566
+ device: hw.device || (sysHw.gpu?.type === 'nvidia' ? 'cuda' : sysHw.gpu?.type === 'apple-silicon' ? 'metal' : 'cpu'),
4519
4567
  layers: node.layers || [0, 0],
4520
4568
  status: node.status === 'connected' ? 'active' : node.status,
4521
4569
  active_sessions: node.sessions || 0,
@@ -5178,6 +5226,30 @@ Keep responses concise. Help them think, don't lecture them about the system the
5178
5226
  })();
5179
5227
  });
5180
5228
 
5229
+ // --- Wallet & earnings stubs (Base L2 — wired to real data post-mainnet) ---
5230
+
5231
+ app.get('/api/network/wallet', networkGate, (req, res) => {
5232
+ res.json({ connected: false, address: null, balance: '0.00', token: 'GROOVE', chain: 'base-l2' });
5233
+ });
5234
+
5235
+ app.get('/api/network/earnings', networkGate, (req, res) => {
5236
+ res.json({ today: 0, thisWeek: 0, allTime: 0, history: [], currency: 'GROOVE' });
5237
+ });
5238
+
5239
+ app.post('/api/network/wallet/connect', networkGate, (req, res) => {
5240
+ res.status(501).json({ error: 'Wallet connection not yet available. Coming with mainnet launch.' });
5241
+ });
5242
+
5243
+ app.get('/api/network/node/identity', networkGate, (req, res) => {
5244
+ const node = daemon.networkNode;
5245
+ res.json({
5246
+ nodeId: node?.nodeId || null,
5247
+ address: node?.nodeId || null,
5248
+ startedAt: node?.startedAt || null,
5249
+ uptime: node?.startedAt ? Math.floor((Date.now() - node.startedAt) / 1000) : 0,
5250
+ });
5251
+ });
5252
+
5181
5253
  // Startup hook — called from index.js once the server is up. Non-blocking;
5182
5254
  // updates daemon.networkUpdateAvailable and broadcasts so the GUI can badge.
5183
5255
  daemon.checkNetworkUpdate = async function checkNetworkUpdate() {
@@ -40,7 +40,6 @@ export class ClaudeCodeProvider extends Provider {
40
40
  static managesOwnContext = true; // Claude Code compacts context internally (~25-37% → 2-8%)
41
41
  static models = [
42
42
  { id: 'claude-opus-4-6', name: 'Claude Opus 4.6', tier: 'heavy', contextWindow: 1_000_000 },
43
- { id: 'claude-opus-4-7', name: 'Claude Opus 4.7', tier: 'heavy', contextWindow: 1_000_000 },
44
43
  { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6', tier: 'medium', contextWindow: 200_000 },
45
44
  { id: 'claude-haiku-4-5-20251001', name: 'Claude Haiku 4.5', tier: 'light', contextWindow: 200_000 },
46
45
  ];