agentgui 1.0.602 → 1.0.604

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentgui",
3
- "version": "1.0.602",
3
+ "version": "1.0.604",
4
4
  "description": "Multi-agent ACP client with real-time communication",
5
5
  "type": "module",
6
6
  "main": "server.js",
@@ -765,10 +765,15 @@ class AgentGUIClient {
765
765
  this._serverProcessingEstimate = 0.7 * this._serverProcessingEstimate + 0.3 * serverTime;
766
766
  }
767
767
 
768
- // Always subscribe to the session so blocks are not lost regardless of which conversation is active
768
+ // Subscribe to the session so blocks are not lost, but skip conversation
769
+ // re-subscribe when resumed=true to prevent infinite loop (server sends
770
+ // streaming_start on subscribe when activeExecutions exists, which would
771
+ // trigger another subscribe here, looping forever)
769
772
  if (this.wsManager.isConnected) {
770
773
  this.wsManager.subscribeToSession(data.sessionId);
771
- this.wsManager.sendMessage({ type: 'subscribe', conversationId: data.conversationId });
774
+ if (!data.resumed) {
775
+ this.wsManager.sendMessage({ type: 'subscribe', conversationId: data.conversationId });
776
+ }
772
777
  }
773
778
 
774
779
  // If this streaming event is for a different conversation than what we are viewing,
@@ -751,6 +751,8 @@ class StreamingRenderer {
751
751
  if (block.id) details.dataset.toolUseId = block.id;
752
752
  details.classList.add(this._getBlockTypeClass('tool_use'));
753
753
  details.classList.add(this._getToolColorClass(toolName));
754
+ const normalizedForOpen = toolName.replace(/^mcp__.*?__/, '');
755
+ if (normalizedForOpen === 'TodoWrite') details.open = true;
754
756
  const summary = document.createElement('summary');
755
757
  summary.className = 'folded-tool-bar';
756
758
  const displayName = this.getToolUseDisplayName(toolName);
@@ -1228,17 +1230,8 @@ class StreamingRenderer {
1228
1230
  const content = block.content || '';
1229
1231
  const toolName = block.tool_name || block.name || '';
1230
1232
 
1231
- // Special handling for TodoWrite: render directly without success wrapper
1232
- // Detect by tool name OR by content structure (todos array)
1233
- if ((toolName.includes('TodoWrite') || (typeof content === 'object' && Array.isArray(content?.todos))) && typeof content === 'object' && content.todos && Array.isArray(content.todos)) {
1234
- const statusIcons = { completed: '✅', in_progress: '⚙', pending: '☐' };
1235
- const completedCount = content.todos.filter(t => t.status === 'completed').length;
1236
- const totalCount = content.todos.length;
1237
- const items = content.todos.map(t => `<div class="todo-item"><span class="todo-status">${statusIcons[t.status] || '&#9744;'}</span><span class="todo-text">${this.escapeHtml(t.content || '')}</span></div>`).join('');
1238
- const div = document.createElement('div');
1239
- div.className = 'block-tool-result';
1240
- div.innerHTML = `<details class="folded-tool" open><summary class="folded-tool-bar" style="cursor:pointer;padding:0.5rem;background:var(--color-bg-secondary);border-radius:0.25rem;user-select:none"><span style="font-weight:600;font-size:0.9rem">📋 Tasks</span><span style="margin-left:0.5rem;font-size:0.8rem;color:var(--color-text-secondary)">${completedCount}/${totalCount} complete</span></summary><div class="folded-tool-body tool-param-todos" style="padding:0.75rem">${items}</div></details>`;
1241
- return div;
1233
+ if (toolName.includes('TodoWrite') || (typeof content === 'object' && Array.isArray(content?.todos))) {
1234
+ return null;
1242
1235
  }
1243
1236
 
1244
1237
  const contentStr = typeof content === 'string' ? content : JSON.stringify(content, null, 2);