groove-dev 0.22.6 → 0.22.7

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.
@@ -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-DZxQV2hQ.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-B6DQvtWt.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">
@@ -451,8 +451,9 @@ export const useGrooveStore = create((set, get) => ({
451
451
 
452
452
  async launchRecommendedTeam() {
453
453
  try {
454
+ set({ recommendedTeam: null }); // Dismiss modal immediately
455
+ get().addToast('info', 'Launching team...');
454
456
  const result = await api.post('/recommended-team/launch');
455
- set({ recommendedTeam: null });
456
457
  get().addToast('success', `Launched ${result.launched} agents`, result.phase2Pending ? `${result.phase2Pending} QC agents queued` : undefined);
457
458
  // Clean up stale files
458
459
  api.post('/cleanup').catch(() => {});
@@ -535,8 +536,22 @@ export const useGrooveStore = create((set, get) => ({
535
536
  async instructAgent(id, message) {
536
537
  const agent = get().agents.find((a) => a.id === id);
537
538
  const isAlive = agent && (agent.status === 'running' || agent.status === 'starting');
539
+
540
+ // Running agent: use query (non-destructive) instead of killing it
541
+ if (isAlive) {
542
+ get().addChatMessage(id, 'user', message, false);
543
+ try {
544
+ const data = await api.post(`/agents/${id}/query`, { message });
545
+ get().addChatMessage(id, 'agent', data.response);
546
+ return data;
547
+ } catch (err) {
548
+ get().addChatMessage(id, 'system', `failed: ${err.message}`);
549
+ throw err;
550
+ }
551
+ }
552
+
553
+ // Completed/stopped agent: resume with full context
538
554
  get().addChatMessage(id, 'user', message, false);
539
- get().addChatMessage(id, 'system', isAlive ? 'sending instruction...' : 'continuing conversation...');
540
555
  try {
541
556
  const newAgent = await api.post(`/agents/${id}/instruct`, { message });
542
557
  // Carry history to new agent ID
@@ -549,7 +564,6 @@ export const useGrooveStore = create((set, get) => ({
549
564
  if (get().chatHistory[id]?.length) persistJSON('groove:chatHistory', get().chatHistory);
550
565
  if (get().activityLog[id]?.length) persistJSON('groove:activityLog', get().activityLog);
551
566
  get().selectAgent(newAgent.id);
552
- get().addChatMessage(newAgent.id, 'system', 'agent resumed with context');
553
567
  return newAgent;
554
568
  } catch (err) {
555
569
  get().addChatMessage(id, 'system', `failed: ${err.message}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groove-dev",
3
- "version": "0.22.6",
3
+ "version": "0.22.7",
4
4
  "description": "Open-source agent orchestration layer — the AI company OS. MCP integrations (Slack, Gmail, Stripe, 15+), agent scheduling (cron), business roles (CMO, CFO, EA). GUI dashboard, multi-agent coordination, zero cold-start, infinite sessions. Works with Claude Code, Codex, Gemini CLI, Ollama.",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "author": "Groove Dev <hello@groovedev.ai> (https://groovedev.ai)",
@@ -1485,21 +1485,27 @@ Keep responses concise. Help them think, don't lecture them about the system the
1485
1485
 
1486
1486
  // Spawn phase 1 agents immediately
1487
1487
  const spawned = [];
1488
+ const failed = [];
1488
1489
  const phase1Ids = [];
1489
1490
  for (const config of phase1) {
1490
- const validated = validateAgentConfig({
1491
- role: config.role,
1492
- scope: config.scope || [],
1493
- prompt: config.prompt || '',
1494
- provider: config.provider || 'claude-code',
1495
- model: config.model || 'auto',
1496
- permission: config.permission || 'auto',
1497
- workingDir: config.workingDir || defaultDir,
1498
- name: config.name || undefined,
1499
- });
1500
- const agent = await daemon.processes.spawn(validated);
1501
- spawned.push({ id: agent.id, name: agent.name, role: agent.role });
1502
- phase1Ids.push(agent.id);
1491
+ try {
1492
+ const validated = validateAgentConfig({
1493
+ role: config.role,
1494
+ scope: config.scope || [],
1495
+ prompt: config.prompt || '',
1496
+ provider: config.provider || 'claude-code',
1497
+ model: config.model || 'auto',
1498
+ permission: config.permission || 'auto',
1499
+ workingDir: config.workingDir || defaultDir,
1500
+ name: config.name || undefined,
1501
+ });
1502
+ const agent = await daemon.processes.spawn(validated);
1503
+ spawned.push({ id: agent.id, name: agent.name, role: agent.role });
1504
+ phase1Ids.push(agent.id);
1505
+ } catch (err) {
1506
+ failed.push({ role: config.role, error: err.message });
1507
+ console.log(`[Groove] Failed to spawn ${config.role}: ${err.message}`);
1508
+ }
1503
1509
  }
1504
1510
 
1505
1511
  // If there are phase 2 agents, register them for auto-spawn on phase 1 completion
@@ -1518,10 +1524,10 @@ Keep responses concise. Help them think, don't lecture them about the system the
1518
1524
  }
1519
1525
 
1520
1526
  daemon.audit.log('team.launch', {
1521
- phase1: spawned.length, phase2Pending: phase2.length,
1527
+ phase1: spawned.length, phase2Pending: phase2.length, failed: failed.length,
1522
1528
  agents: spawned.map((a) => a.role),
1523
1529
  });
1524
- res.json({ launched: spawned.length, phase2Pending: phase2.length, agents: spawned });
1530
+ res.json({ launched: spawned.length, phase2Pending: phase2.length, agents: spawned, failed });
1525
1531
  } catch (err) {
1526
1532
  res.status(500).json({ error: err.message });
1527
1533
  }