groove-dev 0.19.3 → 0.19.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.19.4 — Ollama server lifecycle, UI state fix (2026-04-08)
4
+
5
+ - **Server detection** — checks if Ollama server is running (not just binary installed), shows "Start Ollama Server" button with auto-start via brew services or ollama serve
6
+ - **Three-state install flow** — not installed → installed but server down → ready with models
7
+ - **UI state fix** — closing/reopening Ollama dropdown no longer reverts to install screen; provider list refreshes on state change
8
+ - **New API endpoints** — `POST /api/providers/ollama/serve` (auto-start server), `/check` now returns `serverRunning` flag
9
+
3
10
  ## v0.19.3 — Ollama setup experience: hardware detection, model catalog, one-click pull (2026-04-08)
4
11
 
5
12
  - **Ollama model catalog** — 22 models across Code and General categories with RAM requirements and download sizes
@@ -24,7 +24,7 @@ import { federationPair, federationUnpair, federationList, federationStatus } fr
24
24
  program
25
25
  .name('groove')
26
26
  .description('Agent orchestration layer for AI coding tools')
27
- .version('0.19.3');
27
+ .version('0.19.4');
28
28
 
29
29
  program
30
30
  .command('start')
@@ -170,12 +170,28 @@ export function createApi(app, daemon) {
170
170
  }
171
171
  });
172
172
 
173
- app.post('/api/providers/ollama/check', (req, res) => {
173
+ app.post('/api/providers/ollama/check', async (req, res) => {
174
174
  const installed = OllamaProvider.isInstalled();
175
+ const serverRunning = installed ? await OllamaProvider.isServerRunning() : false;
175
176
  const install = OllamaProvider.installCommand();
176
177
  const hardware = OllamaProvider.getSystemHardware();
177
178
  const requirements = OllamaProvider.hardwareRequirements();
178
- res.json({ installed, install, hardware, requirements });
179
+ res.json({ installed, serverRunning, install, hardware, requirements });
180
+ });
181
+
182
+ app.post('/api/providers/ollama/serve', async (req, res) => {
183
+ if (!OllamaProvider.isInstalled()) return res.status(400).json({ error: 'Ollama is not installed' });
184
+ const already = await OllamaProvider.isServerRunning();
185
+ if (already) return res.json({ ok: true, alreadyRunning: true });
186
+ const result = OllamaProvider.startServer();
187
+ if (result.started) {
188
+ // Wait a moment for server to come up
189
+ await new Promise((r) => setTimeout(r, 2000));
190
+ const running = await OllamaProvider.isServerRunning();
191
+ res.json({ ok: running, method: result.method });
192
+ } else {
193
+ res.status(500).json({ error: 'Could not start server', command: result.command });
194
+ }
179
195
  });
180
196
 
181
197
  // --- Credentials ---
@@ -71,6 +71,43 @@ export class OllamaProvider extends Provider {
71
71
  return { command: 'Download from https://ollama.ai/download', platform: 'other' };
72
72
  }
73
73
 
74
+ static async isServerRunning() {
75
+ try {
76
+ const controller = new AbortController();
77
+ const timeout = setTimeout(() => controller.abort(), 3000);
78
+ const res = await fetch('http://localhost:11434/', { signal: controller.signal });
79
+ clearTimeout(timeout);
80
+ return res.ok;
81
+ } catch {
82
+ return false;
83
+ }
84
+ }
85
+
86
+ static startServer() {
87
+ const platform = process.platform;
88
+ if (platform === 'darwin') {
89
+ // Try brew services first, fall back to ollama serve
90
+ try {
91
+ execSync('brew services start ollama', { stdio: 'ignore', timeout: 10000 });
92
+ return { started: true, method: 'brew services' };
93
+ } catch {
94
+ try {
95
+ execFile('ollama', ['serve'], { stdio: 'ignore', detached: true }).unref();
96
+ return { started: true, method: 'ollama serve' };
97
+ } catch {
98
+ return { started: false, command: 'ollama serve' };
99
+ }
100
+ }
101
+ }
102
+ // Linux / other
103
+ try {
104
+ execFile('ollama', ['serve'], { stdio: 'ignore', detached: true }).unref();
105
+ return { started: true, method: 'ollama serve' };
106
+ } catch {
107
+ return { started: false, command: 'ollama serve' };
108
+ }
109
+ }
110
+
74
111
  static hardwareRequirements() {
75
112
  return {
76
113
  minRAM: 4,
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "projectName": "gui",
3
- "scannedAt": "2026-04-09T05:29:41.298Z",
3
+ "scannedAt": "2026-04-09T05:52:27.246Z",
4
4
  "stats": {
5
- "totalFiles": 84,
5
+ "totalFiles": 85,
6
6
  "totalDirs": 14,
7
7
  "treeDepth": 4
8
8
  },
@@ -66,7 +66,7 @@
66
66
  "path": "src/components/agents",
67
67
  "depth": 3,
68
68
  "dirs": 0,
69
- "files": 14,
69
+ "files": 15,
70
70
  "children": []
71
71
  },
72
72
  {
@@ -1 +1 @@
1
- 48859
1
+ 55857
@@ -16,7 +16,7 @@
16
16
  "status": "stopped",
17
17
  "pid": null,
18
18
  "spawnedAt": "2026-04-09T02:46:11.349Z",
19
- "lastActivity": "2026-04-09T05:10:09.157Z",
19
+ "lastActivity": "2026-04-09T05:32:30.003Z",
20
20
  "tokensUsed": 41952,
21
21
  "contextUsage": 0.020954,
22
22
  "sessionId": "b870e8f8-84b1-4ad2-a0d3-fef8035466c0",
@@ -6151,6 +6151,342 @@
6151
6151
  "agents": 1,
6152
6152
  "running": 0,
6153
6153
  "cacheHitRate": 0.8360697165954649
6154
+ },
6155
+ {
6156
+ "t": 1775713091296,
6157
+ "tokens": 3005468,
6158
+ "costUsd": 0.42406725000000006,
6159
+ "agents": 1,
6160
+ "running": 0,
6161
+ "cacheHitRate": 0.8360697165954649
6162
+ },
6163
+ {
6164
+ "t": 1775713121297,
6165
+ "tokens": 3005468,
6166
+ "costUsd": 0.42406725000000006,
6167
+ "agents": 1,
6168
+ "running": 0,
6169
+ "cacheHitRate": 0.8360697165954649
6170
+ },
6171
+ {
6172
+ "t": 1775713151299,
6173
+ "tokens": 3005468,
6174
+ "costUsd": 0.42406725000000006,
6175
+ "agents": 1,
6176
+ "running": 0,
6177
+ "cacheHitRate": 0.8360697165954649
6178
+ },
6179
+ {
6180
+ "t": 1775713181300,
6181
+ "tokens": 3005468,
6182
+ "costUsd": 0.42406725000000006,
6183
+ "agents": 1,
6184
+ "running": 0,
6185
+ "cacheHitRate": 0.8360697165954649
6186
+ },
6187
+ {
6188
+ "t": 1775713211302,
6189
+ "tokens": 3005468,
6190
+ "costUsd": 0.42406725000000006,
6191
+ "agents": 1,
6192
+ "running": 0,
6193
+ "cacheHitRate": 0.8360697165954649
6194
+ },
6195
+ {
6196
+ "t": 1775713241302,
6197
+ "tokens": 3005468,
6198
+ "costUsd": 0.42406725000000006,
6199
+ "agents": 1,
6200
+ "running": 0,
6201
+ "cacheHitRate": 0.8360697165954649
6202
+ },
6203
+ {
6204
+ "t": 1775713271304,
6205
+ "tokens": 3005468,
6206
+ "costUsd": 0.42406725000000006,
6207
+ "agents": 1,
6208
+ "running": 0,
6209
+ "cacheHitRate": 0.8360697165954649
6210
+ },
6211
+ {
6212
+ "t": 1775713301306,
6213
+ "tokens": 3005468,
6214
+ "costUsd": 0.42406725000000006,
6215
+ "agents": 1,
6216
+ "running": 0,
6217
+ "cacheHitRate": 0.8360697165954649
6218
+ },
6219
+ {
6220
+ "t": 1775713331307,
6221
+ "tokens": 3005468,
6222
+ "costUsd": 0.42406725000000006,
6223
+ "agents": 1,
6224
+ "running": 0,
6225
+ "cacheHitRate": 0.8360697165954649
6226
+ },
6227
+ {
6228
+ "t": 1775713361307,
6229
+ "tokens": 3005468,
6230
+ "costUsd": 0.42406725000000006,
6231
+ "agents": 1,
6232
+ "running": 0,
6233
+ "cacheHitRate": 0.8360697165954649
6234
+ },
6235
+ {
6236
+ "t": 1775713391308,
6237
+ "tokens": 3005468,
6238
+ "costUsd": 0.42406725000000006,
6239
+ "agents": 1,
6240
+ "running": 0,
6241
+ "cacheHitRate": 0.8360697165954649
6242
+ },
6243
+ {
6244
+ "t": 1775713421307,
6245
+ "tokens": 3005468,
6246
+ "costUsd": 0.42406725000000006,
6247
+ "agents": 1,
6248
+ "running": 0,
6249
+ "cacheHitRate": 0.8360697165954649
6250
+ },
6251
+ {
6252
+ "t": 1775713451308,
6253
+ "tokens": 3005468,
6254
+ "costUsd": 0.42406725000000006,
6255
+ "agents": 1,
6256
+ "running": 0,
6257
+ "cacheHitRate": 0.8360697165954649
6258
+ },
6259
+ {
6260
+ "t": 1775713481308,
6261
+ "tokens": 3005468,
6262
+ "costUsd": 0.42406725000000006,
6263
+ "agents": 1,
6264
+ "running": 0,
6265
+ "cacheHitRate": 0.8360697165954649
6266
+ },
6267
+ {
6268
+ "t": 1775713511309,
6269
+ "tokens": 3005468,
6270
+ "costUsd": 0.42406725000000006,
6271
+ "agents": 1,
6272
+ "running": 0,
6273
+ "cacheHitRate": 0.8360697165954649
6274
+ },
6275
+ {
6276
+ "t": 1775713541310,
6277
+ "tokens": 3005468,
6278
+ "costUsd": 0.42406725000000006,
6279
+ "agents": 1,
6280
+ "running": 0,
6281
+ "cacheHitRate": 0.8360697165954649
6282
+ },
6283
+ {
6284
+ "t": 1775713571311,
6285
+ "tokens": 3005468,
6286
+ "costUsd": 0.42406725000000006,
6287
+ "agents": 1,
6288
+ "running": 0,
6289
+ "cacheHitRate": 0.8360697165954649
6290
+ },
6291
+ {
6292
+ "t": 1775713601312,
6293
+ "tokens": 3005468,
6294
+ "costUsd": 0.42406725000000006,
6295
+ "agents": 1,
6296
+ "running": 0,
6297
+ "cacheHitRate": 0.8360697165954649
6298
+ },
6299
+ {
6300
+ "t": 1775713631312,
6301
+ "tokens": 3005468,
6302
+ "costUsd": 0.42406725000000006,
6303
+ "agents": 1,
6304
+ "running": 0,
6305
+ "cacheHitRate": 0.8360697165954649
6306
+ },
6307
+ {
6308
+ "t": 1775713661313,
6309
+ "tokens": 3005468,
6310
+ "costUsd": 0.42406725000000006,
6311
+ "agents": 1,
6312
+ "running": 0,
6313
+ "cacheHitRate": 0.8360697165954649
6314
+ },
6315
+ {
6316
+ "t": 1775713691313,
6317
+ "tokens": 3005468,
6318
+ "costUsd": 0.42406725000000006,
6319
+ "agents": 1,
6320
+ "running": 0,
6321
+ "cacheHitRate": 0.8360697165954649
6322
+ },
6323
+ {
6324
+ "t": 1775713721314,
6325
+ "tokens": 3005468,
6326
+ "costUsd": 0.42406725000000006,
6327
+ "agents": 1,
6328
+ "running": 0,
6329
+ "cacheHitRate": 0.8360697165954649
6330
+ },
6331
+ {
6332
+ "t": 1775713751314,
6333
+ "tokens": 3005468,
6334
+ "costUsd": 0.42406725000000006,
6335
+ "agents": 1,
6336
+ "running": 0,
6337
+ "cacheHitRate": 0.8360697165954649
6338
+ },
6339
+ {
6340
+ "t": 1775713781314,
6341
+ "tokens": 3005468,
6342
+ "costUsd": 0.42406725000000006,
6343
+ "agents": 1,
6344
+ "running": 0,
6345
+ "cacheHitRate": 0.8360697165954649
6346
+ },
6347
+ {
6348
+ "t": 1775713811316,
6349
+ "tokens": 3005468,
6350
+ "costUsd": 0.42406725000000006,
6351
+ "agents": 1,
6352
+ "running": 0,
6353
+ "cacheHitRate": 0.8360697165954649
6354
+ },
6355
+ {
6356
+ "t": 1775713841317,
6357
+ "tokens": 3005468,
6358
+ "costUsd": 0.42406725000000006,
6359
+ "agents": 1,
6360
+ "running": 0,
6361
+ "cacheHitRate": 0.8360697165954649
6362
+ },
6363
+ {
6364
+ "t": 1775713871316,
6365
+ "tokens": 3005468,
6366
+ "costUsd": 0.42406725000000006,
6367
+ "agents": 1,
6368
+ "running": 0,
6369
+ "cacheHitRate": 0.8360697165954649
6370
+ },
6371
+ {
6372
+ "t": 1775713901318,
6373
+ "tokens": 3005468,
6374
+ "costUsd": 0.42406725000000006,
6375
+ "agents": 1,
6376
+ "running": 0,
6377
+ "cacheHitRate": 0.8360697165954649
6378
+ },
6379
+ {
6380
+ "t": 1775713947242,
6381
+ "tokens": 3005468,
6382
+ "costUsd": 0.42406725000000006,
6383
+ "agents": 1,
6384
+ "running": 0,
6385
+ "cacheHitRate": 0.8360697165954649
6386
+ },
6387
+ {
6388
+ "t": 1775713977242,
6389
+ "tokens": 3005468,
6390
+ "costUsd": 0.42406725000000006,
6391
+ "agents": 1,
6392
+ "running": 0,
6393
+ "cacheHitRate": 0.8360697165954649
6394
+ },
6395
+ {
6396
+ "t": 1775714007241,
6397
+ "tokens": 3005468,
6398
+ "costUsd": 0.42406725000000006,
6399
+ "agents": 1,
6400
+ "running": 0,
6401
+ "cacheHitRate": 0.8360697165954649
6402
+ },
6403
+ {
6404
+ "t": 1775714037242,
6405
+ "tokens": 3005468,
6406
+ "costUsd": 0.42406725000000006,
6407
+ "agents": 1,
6408
+ "running": 0,
6409
+ "cacheHitRate": 0.8360697165954649
6410
+ },
6411
+ {
6412
+ "t": 1775714067241,
6413
+ "tokens": 3005468,
6414
+ "costUsd": 0.42406725000000006,
6415
+ "agents": 1,
6416
+ "running": 0,
6417
+ "cacheHitRate": 0.8360697165954649
6418
+ },
6419
+ {
6420
+ "t": 1775714097242,
6421
+ "tokens": 3005468,
6422
+ "costUsd": 0.42406725000000006,
6423
+ "agents": 1,
6424
+ "running": 0,
6425
+ "cacheHitRate": 0.8360697165954649
6426
+ },
6427
+ {
6428
+ "t": 1775714127241,
6429
+ "tokens": 3005468,
6430
+ "costUsd": 0.42406725000000006,
6431
+ "agents": 1,
6432
+ "running": 0,
6433
+ "cacheHitRate": 0.8360697165954649
6434
+ },
6435
+ {
6436
+ "t": 1775714157240,
6437
+ "tokens": 3005468,
6438
+ "costUsd": 0.42406725000000006,
6439
+ "agents": 1,
6440
+ "running": 0,
6441
+ "cacheHitRate": 0.8360697165954649
6442
+ },
6443
+ {
6444
+ "t": 1775714187240,
6445
+ "tokens": 3005468,
6446
+ "costUsd": 0.42406725000000006,
6447
+ "agents": 1,
6448
+ "running": 0,
6449
+ "cacheHitRate": 0.8360697165954649
6450
+ },
6451
+ {
6452
+ "t": 1775714217241,
6453
+ "tokens": 3005468,
6454
+ "costUsd": 0.42406725000000006,
6455
+ "agents": 1,
6456
+ "running": 0,
6457
+ "cacheHitRate": 0.8360697165954649
6458
+ },
6459
+ {
6460
+ "t": 1775714247240,
6461
+ "tokens": 3005468,
6462
+ "costUsd": 0.42406725000000006,
6463
+ "agents": 1,
6464
+ "running": 0,
6465
+ "cacheHitRate": 0.8360697165954649
6466
+ },
6467
+ {
6468
+ "t": 1775714277241,
6469
+ "tokens": 3005468,
6470
+ "costUsd": 0.42406725000000006,
6471
+ "agents": 1,
6472
+ "running": 0,
6473
+ "cacheHitRate": 0.8360697165954649
6474
+ },
6475
+ {
6476
+ "t": 1775714307240,
6477
+ "tokens": 3005468,
6478
+ "costUsd": 0.42406725000000006,
6479
+ "agents": 1,
6480
+ "running": 0,
6481
+ "cacheHitRate": 0.8360697165954649
6482
+ },
6483
+ {
6484
+ "t": 1775714337241,
6485
+ "tokens": 3005468,
6486
+ "costUsd": 0.42406725000000006,
6487
+ "agents": 1,
6488
+ "running": 0,
6489
+ "cacheHitRate": 0.8360697165954649
6154
6490
  }
6155
6491
  ],
6156
6492
  "events": [
@@ -6,4 +6,4 @@
6
6
  |----|------|------|----------|-----------|-------|--------|
7
7
  | 15f1e784 | planner-1 | planner | claude-code | /Users/rok/Desktop/groove/packages/gui | - | stopped |
8
8
 
9
- *Updated: 2026-04-09T05:32:30.004Z*
9
+ *Updated: 2026-04-09T05:52:27.188Z*