groove-dev 0.27.174 → 0.27.175
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/innerchat/Screenshot_2026-06-09_at_12.09.42_PM.png +0 -0
- package/node_modules/@groove-dev/cli/package.json +1 -1
- package/node_modules/@groove-dev/daemon/package.json +1 -1
- package/node_modules/@groove-dev/gui/dist/assets/{index-DZY-EWPs.js → index-BMaxZVeX.js} +222 -217
- package/node_modules/@groove-dev/gui/dist/index.html +1 -1
- package/node_modules/@groove-dev/gui/package.json +1 -1
- package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +4 -4
- package/node_modules/@groove-dev/gui/src/components/fleet/fleet-pane.jsx +16 -3
- package/node_modules/@groove-dev/gui/src/stores/slices/agents-slice.js +2 -0
- package/node_modules/@groove-dev/gui/src/stores/slices/ui-slice.js +0 -9
- package/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/daemon/package.json +1 -1
- package/packages/gui/dist/assets/{index-DZY-EWPs.js → index-BMaxZVeX.js} +222 -217
- package/packages/gui/dist/index.html +1 -1
- package/packages/gui/package.json +1 -1
- package/packages/gui/src/components/agents/agent-feed.jsx +4 -4
- package/packages/gui/src/components/fleet/fleet-pane.jsx +16 -3
- package/packages/gui/src/stores/slices/agents-slice.js +2 -0
- package/packages/gui/src/stores/slices/ui-slice.js +0 -9
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
8
8
|
<title>Groove GUI</title>
|
|
9
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/assets/index-BMaxZVeX.js"></script>
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/vendor-26L3JoZv.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/reactflow-DoBZjiHE.js">
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/codemirror-BYKpdS2W.js">
|
|
@@ -601,7 +601,7 @@ function SnippetTag({ snippet, onRemove }) {
|
|
|
601
601
|
|
|
602
602
|
// ── Main Feed ────────────────────────────────────────────────
|
|
603
603
|
|
|
604
|
-
export function AgentFeed({ agent }) {
|
|
604
|
+
export function AgentFeed({ agent, readOnly = false }) {
|
|
605
605
|
const rawChatHistory = useGrooveStore((s) => s.chatHistory[agent.id]) || EMPTY;
|
|
606
606
|
const rawActivityLog = useGrooveStore((s) => s.activityLog[agent.id]) || EMPTY;
|
|
607
607
|
const instructAgent = useGrooveStore((s) => s.instructAgent);
|
|
@@ -903,8 +903,8 @@ export function AgentFeed({ agent }) {
|
|
|
903
903
|
</AnimatePresence>
|
|
904
904
|
</div>
|
|
905
905
|
|
|
906
|
-
{/* Input area */}
|
|
907
|
-
<div className="bg-surface-1/50 flex-shrink-0">
|
|
906
|
+
{/* Input area — hidden in readOnly (fleet single-pane) mode, chat is in the right detail panel */}
|
|
907
|
+
{readOnly ? null : <div className="bg-surface-1/50 flex-shrink-0">
|
|
908
908
|
{/* Drag handle */}
|
|
909
909
|
<div
|
|
910
910
|
ref={dragRef}
|
|
@@ -1115,7 +1115,7 @@ export function AgentFeed({ agent }) {
|
|
|
1115
1115
|
</div>
|
|
1116
1116
|
</div>
|
|
1117
1117
|
</div>
|
|
1118
|
-
</div>
|
|
1118
|
+
</div>}
|
|
1119
1119
|
</div>
|
|
1120
1120
|
);
|
|
1121
1121
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// FSL-1.1-Apache-2.0 — see LICENSE
|
|
2
2
|
import { useEffect, useRef, useState } from 'react';
|
|
3
|
-
import { X } from 'lucide-react';
|
|
3
|
+
import { X, PanelRight } from 'lucide-react';
|
|
4
4
|
import { useGrooveStore } from '../../stores/groove';
|
|
5
5
|
import { cn } from '../../lib/cn';
|
|
6
6
|
import { Badge } from '../ui/badge';
|
|
@@ -27,7 +27,7 @@ const STATUS_LABEL = {
|
|
|
27
27
|
rotating: 'Rotating',
|
|
28
28
|
};
|
|
29
29
|
|
|
30
|
-
export function FleetPane({ agentId, paneIndex }) {
|
|
30
|
+
export function FleetPane({ agentId, paneIndex, readOnly = false }) {
|
|
31
31
|
const effectiveId = agentId || null;
|
|
32
32
|
const lastIdRef = useRef(effectiveId);
|
|
33
33
|
if (effectiveId) lastIdRef.current = effectiveId;
|
|
@@ -36,6 +36,9 @@ export function FleetPane({ agentId, paneIndex }) {
|
|
|
36
36
|
const liveAgent = useGrooveStore((s) => resolvedId ? s.agents.find((a) => a.id === resolvedId) : null);
|
|
37
37
|
const fleetSelectAgent = useGrooveStore((s) => s.fleetSelectAgent);
|
|
38
38
|
const fleetMarkRead = useGrooveStore((s) => s.fleetMarkRead);
|
|
39
|
+
const openDetail = useGrooveStore((s) => s.openDetail);
|
|
40
|
+
const detailPanel = useGrooveStore((s) => s.detailPanel);
|
|
41
|
+
const isPanelOpen = detailPanel?.type === 'agent' && detailPanel?.agentId === resolvedId;
|
|
39
42
|
|
|
40
43
|
const lastAgentRef = useRef(liveAgent);
|
|
41
44
|
const [gone, setGone] = useState(false);
|
|
@@ -92,6 +95,16 @@ export function FleetPane({ agentId, paneIndex }) {
|
|
|
92
95
|
)}>
|
|
93
96
|
{ctxPct}%
|
|
94
97
|
</span>
|
|
98
|
+
<button
|
|
99
|
+
onClick={() => openDetail({ type: 'agent', agentId: resolvedId })}
|
|
100
|
+
className={cn(
|
|
101
|
+
'p-1 rounded-md transition-colors cursor-pointer',
|
|
102
|
+
isPanelOpen ? 'text-accent' : 'text-text-3 hover:text-text-0 hover:bg-surface-3',
|
|
103
|
+
)}
|
|
104
|
+
title="Open agent panel"
|
|
105
|
+
>
|
|
106
|
+
<PanelRight size={14} />
|
|
107
|
+
</button>
|
|
95
108
|
<button
|
|
96
109
|
onClick={() => fleetSelectAgent(null, paneIndex)}
|
|
97
110
|
className="p-1 rounded-md text-text-3 hover:text-text-0 hover:bg-surface-3 transition-colors cursor-pointer"
|
|
@@ -103,7 +116,7 @@ export function FleetPane({ agentId, paneIndex }) {
|
|
|
103
116
|
|
|
104
117
|
{/* Agent feed */}
|
|
105
118
|
<div className="flex-1 min-h-0">
|
|
106
|
-
<AgentFeed agent={agent} />
|
|
119
|
+
<AgentFeed agent={agent} readOnly={readOnly} />
|
|
107
120
|
</div>
|
|
108
121
|
</div>
|
|
109
122
|
);
|
|
@@ -38,6 +38,8 @@ export const createAgentsSlice = (set, get) => ({
|
|
|
38
38
|
// ── Agent Actions ─────────────────────────────────────────
|
|
39
39
|
|
|
40
40
|
selectAgent(id) {
|
|
41
|
+
// In fleet view, selection is managed by fleetSelectAgent — don't override detail panel here
|
|
42
|
+
if (get().activeView === 'fleet') return;
|
|
41
43
|
const tid = get().activeTeamId;
|
|
42
44
|
const match = get().agents.find((a) => a.id === id);
|
|
43
45
|
if (tid && match && match.teamId && match.teamId !== tid) return;
|
|
@@ -120,15 +120,6 @@ export const createUiSlice = (set, get) => ({
|
|
|
120
120
|
if (pane === 1 && agentId === null) {
|
|
121
121
|
updates.fleetSplitMode = false;
|
|
122
122
|
}
|
|
123
|
-
const primaryId = agentId || selected[0];
|
|
124
|
-
if (primaryId) {
|
|
125
|
-
const tid = get().activeTeamId;
|
|
126
|
-
const panel = { type: 'agent', agentId: primaryId };
|
|
127
|
-
updates.detailPanel = panel;
|
|
128
|
-
updates.teamDetailPanels = { ...get().teamDetailPanels, [tid]: panel };
|
|
129
|
-
} else {
|
|
130
|
-
updates.detailPanel = null;
|
|
131
|
-
}
|
|
132
123
|
set(updates);
|
|
133
124
|
},
|
|
134
125
|
fleetToggleSplit() {
|