groove-dev 0.26.10 → 0.26.12
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/gui/dist/assets/{index-UCdYAYEi.js → index-DXZbQ5ga.js} +125 -125
- package/node_modules/@groove-dev/gui/dist/index.html +1 -1
- package/node_modules/@groove-dev/gui/src/components/agents/agent-chat.jsx +2 -1
- package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +2 -1
- package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +2 -2
- package/node_modules/@groove-dev/gui/src/stores/groove.js +17 -0
- package/node_modules/@groove-dev/gui/src/views/models.jsx +3 -0
- package/package.json +1 -1
- package/packages/gui/dist/assets/{index-UCdYAYEi.js → index-DXZbQ5ga.js} +125 -125
- package/packages/gui/dist/index.html +1 -1
- package/packages/gui/src/components/agents/agent-chat.jsx +2 -1
- package/packages/gui/src/components/agents/agent-feed.jsx +2 -1
- package/packages/gui/src/components/agents/spawn-wizard.jsx +2 -2
- package/packages/gui/src/stores/groove.js +17 -0
- package/packages/gui/src/views/models.jsx +3 -0
|
@@ -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-DXZbQ5ga.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">
|
|
@@ -105,6 +105,7 @@ export function AgentChat({ agent }) {
|
|
|
105
105
|
const activityLog = useGrooveStore((s) => s.activityLog[agent.id]) || EMPTY;
|
|
106
106
|
const instructAgent = useGrooveStore((s) => s.instructAgent);
|
|
107
107
|
const queryAgent = useGrooveStore((s) => s.queryAgent);
|
|
108
|
+
const isThinking = useGrooveStore((s) => s.thinkingAgents?.has(agent.id));
|
|
108
109
|
|
|
109
110
|
const [input, setInput] = useState('');
|
|
110
111
|
const [sending, setSending] = useState(false);
|
|
@@ -188,7 +189,7 @@ export function AgentChat({ agent }) {
|
|
|
188
189
|
if (msg.from === 'system') return <SystemMessage key={msg.key || i} msg={msg} />;
|
|
189
190
|
return <AgentMessage key={msg.key || i} msg={msg} agent={agent} />;
|
|
190
191
|
})}
|
|
191
|
-
{sending && <TypingIndicator name={agent.name} />}
|
|
192
|
+
{(sending || isThinking) && <TypingIndicator name={agent.name} />}
|
|
192
193
|
</div>
|
|
193
194
|
|
|
194
195
|
{/* ── Input area ──────────────────────────────────── */}
|
|
@@ -470,6 +470,7 @@ export function AgentFeed({ agent }) {
|
|
|
470
470
|
const activityLog = useGrooveStore((s) => s.activityLog[agent.id]) || EMPTY;
|
|
471
471
|
const instructAgent = useGrooveStore((s) => s.instructAgent);
|
|
472
472
|
const queryAgent = useGrooveStore((s) => s.queryAgent);
|
|
473
|
+
const isThinking = useGrooveStore((s) => s.thinkingAgents?.has(agent.id));
|
|
473
474
|
|
|
474
475
|
const [input, setInput] = useState('');
|
|
475
476
|
const [mode, setMode] = useState('instruct'); // instruct | query
|
|
@@ -626,7 +627,7 @@ export function AgentFeed({ agent }) {
|
|
|
626
627
|
if (item.from === 'system') return <SystemMessage key={`msg-${i}`} msg={item} />;
|
|
627
628
|
return <AgentMessage key={`msg-${i}`} msg={item} agent={agent} />;
|
|
628
629
|
})}
|
|
629
|
-
{sending && (
|
|
630
|
+
{(sending || isThinking) && (
|
|
630
631
|
<div className="flex items-center gap-2 ml-7 py-2">
|
|
631
632
|
<div className="w-5 h-5 rounded-md bg-accent/12 flex items-center justify-center">
|
|
632
633
|
<Code2 size={10} className="text-accent" />
|
|
@@ -157,9 +157,9 @@ export function SpawnWizard() {
|
|
|
157
157
|
{/* Custom role */}
|
|
158
158
|
<div className="mt-3">
|
|
159
159
|
<Input
|
|
160
|
-
placeholder="or type a custom role..."
|
|
160
|
+
placeholder="or type a custom role (e.g. chat-agent)..."
|
|
161
161
|
value={customRole}
|
|
162
|
-
onChange={(e) => { setCustomRole(e.target.value); setRole(''); }}
|
|
162
|
+
onChange={(e) => { setCustomRole(e.target.value.replace(/\s+/g, '-').replace(/[^a-zA-Z0-9_-]/g, '').slice(0, 50)); setRole(''); }}
|
|
163
163
|
className="text-xs"
|
|
164
164
|
/>
|
|
165
165
|
</div>
|
|
@@ -135,6 +135,15 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
135
135
|
case 'agent:output': {
|
|
136
136
|
const { agentId, data } = msg;
|
|
137
137
|
|
|
138
|
+
// Clear thinking indicator when agent responds
|
|
139
|
+
if (get().thinkingAgents.has(agentId)) {
|
|
140
|
+
set((s) => {
|
|
141
|
+
const next = new Set(s.thinkingAgents);
|
|
142
|
+
next.delete(agentId);
|
|
143
|
+
return { thinkingAgents: next };
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
138
147
|
// Separate text content from tool calls
|
|
139
148
|
let chatText = '';
|
|
140
149
|
let activityText = '';
|
|
@@ -596,6 +605,9 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
596
605
|
});
|
|
597
606
|
},
|
|
598
607
|
|
|
608
|
+
// Track which agents are thinking (sent a message, waiting for response)
|
|
609
|
+
thinkingAgents: new Set(),
|
|
610
|
+
|
|
599
611
|
async instructAgent(id, message) {
|
|
600
612
|
const agent = get().agents.find((a) => a.id === id);
|
|
601
613
|
const isAlive = agent && (agent.status === 'running' || agent.status === 'starting');
|
|
@@ -605,6 +617,11 @@ export const useGrooveStore = create((set, get) => ({
|
|
|
605
617
|
get().addChatMessage(id, 'user', message, false);
|
|
606
618
|
try {
|
|
607
619
|
const data = await api.post(`/agents/${id}/query`, { message });
|
|
620
|
+
// Agent loop agents: response comes via WebSocket, show thinking indicator
|
|
621
|
+
if (data.status === 'pending' || data.response === 'Message sent to agent') {
|
|
622
|
+
set((s) => ({ thinkingAgents: new Set([...s.thinkingAgents, id]) }));
|
|
623
|
+
return data;
|
|
624
|
+
}
|
|
608
625
|
get().addChatMessage(id, 'agent', data.response);
|
|
609
626
|
return data;
|
|
610
627
|
} catch (err) {
|
|
@@ -286,8 +286,11 @@ export default function ModelsView() {
|
|
|
286
286
|
try {
|
|
287
287
|
await api.post('/providers/ollama/pull', { model: modelId });
|
|
288
288
|
toast.success(`${modelId} ready to use`);
|
|
289
|
+
// Refresh all model lists so UI reflects the new install
|
|
289
290
|
fetchInstalled();
|
|
290
291
|
fetchOllamaModels();
|
|
292
|
+
// Also optimistically mark it installed immediately
|
|
293
|
+
setOllamaModels((prev) => [...prev, modelId]);
|
|
291
294
|
} catch (err) {
|
|
292
295
|
toast.error(`Pull failed: ${err.message}`);
|
|
293
296
|
}
|