groove-dev 0.26.11 → 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.
@@ -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-DnYXpxao.js"></script>
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" />
@@ -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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "groove-dev",
3
- "version": "0.26.11",
3
+ "version": "0.26.12",
4
4
  "description": "Open-source agent orchestration layer — the AI company OS. Local model agent engine (GGUF/Ollama/llama-server), HuggingFace model browser, 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, any local model.",
5
5
  "license": "FSL-1.1-Apache-2.0",
6
6
  "author": "Groove Dev <hello@groovedev.ai> (https://groovedev.ai)",