groove-dev 0.27.128 → 0.27.130

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 (27) 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 +21 -0
  4. package/node_modules/@groove-dev/daemon/src/model-lab.js +46 -0
  5. package/node_modules/@groove-dev/gui/dist/assets/{index-DXIaW0aK.js → index-6zTBb9ik.js} +1749 -1749
  6. package/node_modules/@groove-dev/gui/dist/assets/index-Ch9Mlf9w.css +1 -0
  7. package/node_modules/@groove-dev/gui/dist/index.html +2 -2
  8. package/node_modules/@groove-dev/gui/package.json +1 -1
  9. package/node_modules/@groove-dev/gui/src/components/lab/runtime-config.jsx +193 -3
  10. package/node_modules/@groove-dev/gui/src/components/ui/combobox.jsx +118 -0
  11. package/node_modules/@groove-dev/gui/src/stores/groove.js +54 -1
  12. package/node_modules/@groove-dev/gui/src/views/model-lab.jsx +25 -21
  13. package/package.json +1 -1
  14. package/packages/cli/package.json +1 -1
  15. package/packages/daemon/package.json +1 -1
  16. package/packages/daemon/src/api.js +21 -0
  17. package/packages/daemon/src/model-lab.js +46 -0
  18. package/packages/gui/dist/assets/{index-DXIaW0aK.js → index-6zTBb9ik.js} +1749 -1749
  19. package/packages/gui/dist/assets/index-Ch9Mlf9w.css +1 -0
  20. package/packages/gui/dist/index.html +2 -2
  21. package/packages/gui/package.json +1 -1
  22. package/packages/gui/src/components/lab/runtime-config.jsx +193 -3
  23. package/packages/gui/src/components/ui/combobox.jsx +118 -0
  24. package/packages/gui/src/stores/groove.js +54 -1
  25. package/packages/gui/src/views/model-lab.jsx +25 -21
  26. package/node_modules/@groove-dev/gui/dist/assets/index-CY-CITov.css +0 -1
  27. package/packages/gui/dist/assets/index-CY-CITov.css +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@groove-dev/cli",
3
- "version": "0.27.128",
3
+ "version": "0.27.130",
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.128",
3
+ "version": "0.27.130",
4
4
  "description": "GROOVE daemon — agent orchestration engine",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "type": "module",
@@ -6669,6 +6669,27 @@ Keep responses concise. Help them think, don't lecture them about the system the
6669
6669
  }
6670
6670
  });
6671
6671
 
6672
+ app.get('/api/lab/local-models', (req, res) => {
6673
+ try {
6674
+ res.json(daemon.modelLab.listLocalModels());
6675
+ } catch (err) {
6676
+ res.status(500).json({ error: err.message });
6677
+ }
6678
+ });
6679
+
6680
+ app.post('/api/lab/launch-local', async (req, res) => {
6681
+ try {
6682
+ const { modelId } = req.body;
6683
+ if (!modelId || typeof modelId !== 'string') {
6684
+ return res.status(400).json({ error: 'modelId is required' });
6685
+ }
6686
+ const result = await daemon.modelLab.launchLocalModel(modelId);
6687
+ res.json(result);
6688
+ } catch (err) {
6689
+ res.status(400).json({ error: err.message });
6690
+ }
6691
+ });
6692
+
6672
6693
  app.post('/api/lab/inference', async (req, res) => {
6673
6694
  try {
6674
6695
  const params = validateLabInferenceParams(req.body);
@@ -442,6 +442,52 @@ export class ModelLab {
442
442
  this._saveSession(session);
443
443
  }
444
444
 
445
+ // ─── Launch Local GGUF ───────────────────────────────────────
446
+
447
+ async launchLocalModel(modelId) {
448
+ const mm = this.daemon.modelManager;
449
+ const ls = this.daemon.llamaServer;
450
+ if (!mm || !ls) throw new Error('Local model serving not available');
451
+
452
+ const model = mm.getModel(modelId);
453
+ if (!model) throw new Error('Model not found in local store');
454
+
455
+ const modelPath = mm.getModelPath(modelId);
456
+ if (!modelPath) throw new Error('Model file not found on disk');
457
+
458
+ const endpoint = await ls.ensureServer(modelPath);
459
+ if (!endpoint) throw new Error('Failed to start inference server');
460
+
461
+ const existing = [...this.runtimes.values()].find(
462
+ (r) => r._localModelId === modelId,
463
+ );
464
+ if (existing) {
465
+ existing.endpoint = endpoint;
466
+ existing.models = [{ id: model.filename, name: model.filename, size: model.sizeBytes }];
467
+ this._saveRuntimes();
468
+ this.daemon.broadcast({ type: 'lab:runtime:updated', data: existing });
469
+ return { runtime: existing, model: model.filename };
470
+ }
471
+
472
+ const label = model.filename.replace(/\.gguf$/i, '');
473
+ const runtime = await this.addRuntime({
474
+ name: `${label} (local)`,
475
+ type: 'llama-cpp',
476
+ endpoint,
477
+ models: [{ id: model.filename, name: model.filename, size: model.sizeBytes }],
478
+ });
479
+ runtime._localModelId = modelId;
480
+ this._saveRuntimes();
481
+
482
+ return { runtime, model: model.filename };
483
+ }
484
+
485
+ listLocalModels() {
486
+ const mm = this.daemon.modelManager;
487
+ if (!mm) return [];
488
+ return mm.getInstalled().filter((m) => m.exists);
489
+ }
490
+
445
491
  // ─── Auto-detect Ollama ─────────────────────────────────────
446
492
 
447
493
  async autoDetectOllama() {