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.
- package/CLAUDE.md +0 -7
- package/node_modules/@groove-dev/daemon/src/api.js +21 -15
- package/node_modules/@groove-dev/gui/dist/assets/{index-DZxQV2hQ.js → index-B6DQvtWt.js} +1 -1
- package/node_modules/@groove-dev/gui/dist/index.html +1 -1
- package/node_modules/@groove-dev/gui/src/stores/groove.js +17 -3
- package/package.json +1 -1
- package/packages/daemon/src/api.js +21 -15
- package/packages/gui/dist/assets/{index-DZxQV2hQ.js → index-B6DQvtWt.js} +1 -1
- package/packages/gui/dist/index.html +1 -1
- package/packages/gui/src/stores/groove.js +17 -3
|
@@ -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-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.
|
|
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
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
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
|
}
|