groove-dev 0.25.19 → 0.25.21
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/daemon/src/process.js +19 -2
- package/node_modules/@groove-dev/gui/dist/assets/{index-Ca4wKXQ9.js → index-B1FkEzF0.js} +124 -124
- package/node_modules/@groove-dev/gui/dist/index.html +1 -1
- package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +9 -12
- package/node_modules/@groove-dev/gui/src/stores/groove.js +6 -2
- package/package.json +1 -1
- package/packages/daemon/src/process.js +19 -2
- package/packages/gui/dist/assets/{index-Ca4wKXQ9.js → index-B1FkEzF0.js} +124 -124
- package/packages/gui/dist/index.html +1 -1
- package/packages/gui/src/components/agents/spawn-wizard.jsx +9 -12
- package/packages/gui/src/stores/groove.js +6 -2
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
7
7
|
<title>Groove GUI</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-B1FkEzF0.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/vendor-C0HXlhrU.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/reactflow-BQPfi37R.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/codemirror-BBL3i_JW.js">
|
|
@@ -3,7 +3,7 @@ import { useState, useEffect } from 'react';
|
|
|
3
3
|
import { useGrooveStore } from '../../stores/groove';
|
|
4
4
|
import { Sheet, SheetContent } from '../ui/sheet';
|
|
5
5
|
import { Button } from '../ui/button';
|
|
6
|
-
import { Input
|
|
6
|
+
import { Input } from '../ui/input';
|
|
7
7
|
import { Badge } from '../ui/badge';
|
|
8
8
|
import { cn } from '../../lib/cn';
|
|
9
9
|
import { roleColor } from '../../lib/status';
|
|
@@ -190,8 +190,10 @@ export function SpawnWizard() {
|
|
|
190
190
|
className="w-full h-8 px-3 pr-8 text-sm rounded-md bg-surface-1 border border-border text-text-0 font-sans appearance-none cursor-pointer focus:outline-none focus:ring-1 focus:ring-accent"
|
|
191
191
|
>
|
|
192
192
|
<option value="">Auto</option>
|
|
193
|
-
{
|
|
194
|
-
<option key={p.id} value={p.id}
|
|
193
|
+
{providers.map((p) => (
|
|
194
|
+
<option key={p.id} value={p.id} disabled={!p.installed}>
|
|
195
|
+
{p.name}{!p.installed ? ' (not installed)' : ''}
|
|
196
|
+
</option>
|
|
195
197
|
))}
|
|
196
198
|
</select>
|
|
197
199
|
<ChevronDown size={14} className="absolute right-2 top-1/2 -translate-y-1/2 text-text-3 pointer-events-none" />
|
|
@@ -220,10 +222,12 @@ export function SpawnWizard() {
|
|
|
220
222
|
{/* Provider status hints */}
|
|
221
223
|
{provider && selectedProvider && (
|
|
222
224
|
<div className="text-2xs text-text-3 font-sans flex items-center gap-2">
|
|
223
|
-
{selectedProvider.
|
|
224
|
-
<Badge variant="success">
|
|
225
|
+
{selectedProvider.authType === 'local' ? (
|
|
226
|
+
<Badge variant="success">Local</Badge>
|
|
225
227
|
) : selectedProvider.authType === 'subscription' ? (
|
|
226
228
|
<Badge variant="accent">Subscription</Badge>
|
|
229
|
+
) : selectedProvider.hasKey ? (
|
|
230
|
+
<Badge variant="success">API key set</Badge>
|
|
227
231
|
) : (
|
|
228
232
|
<Badge variant="warning">No API key — set with: groove set-key {provider} YOUR_KEY</Badge>
|
|
229
233
|
)}
|
|
@@ -324,13 +328,6 @@ export function SpawnWizard() {
|
|
|
324
328
|
</DialogContent>
|
|
325
329
|
</Dialog>
|
|
326
330
|
|
|
327
|
-
<Textarea
|
|
328
|
-
label="Prompt (optional)"
|
|
329
|
-
value={prompt}
|
|
330
|
-
onChange={(e) => setPrompt(e.target.value)}
|
|
331
|
-
placeholder="What should this agent work on?"
|
|
332
|
-
rows={3}
|
|
333
|
-
/>
|
|
334
331
|
</div>
|
|
335
332
|
)}
|
|
336
333
|
</div>
|
|
@@ -197,13 +197,17 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
197
197
|
case 'agent:exit': {
|
|
198
198
|
const agent = get().agents.find((a) => a.id === msg.agentId);
|
|
199
199
|
const name = agent?.name || msg.agentId;
|
|
200
|
-
// Exit 143 = SIGTERM (kill), exit 137 = SIGKILL — treat as intentional kill
|
|
201
200
|
const isKill = msg.status === 'killed' || msg.code === 143 || msg.code === 137;
|
|
202
201
|
const text = msg.status === 'completed' ? `${name} completed`
|
|
203
202
|
: isKill ? `${name} stopped`
|
|
204
203
|
: `${name} crashed (exit ${msg.code})`;
|
|
205
204
|
const type = msg.status === 'completed' ? 'success' : isKill ? 'info' : 'warning';
|
|
206
|
-
get().addToast(type, text);
|
|
205
|
+
get().addToast(type, text, msg.error ? msg.error.slice(0, 200) : undefined);
|
|
206
|
+
|
|
207
|
+
// Log crash error to agent chat so user can see what happened
|
|
208
|
+
if (msg.error && msg.agentId) {
|
|
209
|
+
get().addChatMessage(msg.agentId, 'system', `Crashed: ${msg.error}`);
|
|
210
|
+
}
|
|
207
211
|
// Check for recommended team when planner completes
|
|
208
212
|
if (agent?.role === 'planner' && msg.status === 'completed') {
|
|
209
213
|
setTimeout(() => get().checkRecommendedTeam(), 1000);
|