@yemi33/minions 0.1.759 → 0.1.761

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/CHANGELOG.md CHANGED
@@ -1,11 +1,17 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.759 (2026-04-09)
3
+ ## 0.1.761 (2026-04-10)
4
+
5
+ ### Fixes
6
+ - prevent competing thinking intervals on tab switch
7
+
8
+ ## 0.1.760 (2026-04-10)
4
9
 
5
10
  ### Features
6
11
  - show branch strategy badge on PRD group header
7
12
 
8
13
  ### Fixes
14
+ - prevent completed SSE stream from aborting other tab's LLM process
9
15
  - eliminate global ccSession corruption, clean up streaming state
10
16
  - restore full streaming state (tools + partial text) on tab switch
11
17
  - restored thinking UX matches original exactly (same bubble, layout)
@@ -162,9 +162,10 @@ function ccSwitchTab(id) {
162
162
  var restoreDiv = el.lastElementChild;
163
163
  restoreDiv.id = 'cc-restore-thinking';
164
164
  el.scrollTop = el.scrollHeight;
165
+ // Live update — stops when tab switches away or request completes
165
166
  var restoreInterval = setInterval(function() {
166
167
  var re = document.getElementById('cc-restore-thinking');
167
- if (!re || !tab._sending) { clearInterval(restoreInterval); if (re) re.remove(); return; }
168
+ if (!re || !tab._sending || _ccActiveTabId !== tab.id) { clearInterval(restoreInterval); return; }
168
169
  re.innerHTML = _restoreStreamHtml();
169
170
  if (el.scrollHeight - el.scrollTop - el.clientHeight < 150) el.scrollTop = el.scrollHeight;
170
171
  }, 1000);
@@ -484,6 +485,13 @@ async function _ccDoSend(message, skipUserMsg) {
484
485
  '<button onclick="ccAbort()" style="font-size:9px;padding:2px 8px;background:var(--surface2);border:1px solid var(--border);border-radius:4px;color:var(--red);cursor:pointer;margin-left:4px">Stop</button></div>';
485
486
  }
486
487
  function updateStreamDiv() {
488
+ // Skip DOM updates if user switched to a different tab (restore interval handles that tab)
489
+ if (_ccActiveTabId !== activeTabId) return;
490
+ // Re-acquire streamDiv if it was detached (tab switch and back)
491
+ if (!streamDiv.parentNode) {
492
+ var re = document.getElementById('cc-restore-thinking');
493
+ if (re) { streamDiv = re; } else return;
494
+ }
487
495
  var html = '';
488
496
  if (toolsUsed.length > 0) {
489
497
  html += '<div style="margin-bottom:6px">';
package/dashboard.js CHANGED
@@ -3325,8 +3325,15 @@ What would you like to discuss or change? When you're happy, say "approve" and I
3325
3325
 
3326
3326
  res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' });
3327
3327
  let _ccStreamAbort = null;
3328
+ let _ccStreamEnded = false;
3328
3329
  // Kill LLM process immediately if client disconnects mid-stream
3329
- req.on('close', () => { ccInFlightTabs.delete(tabId); if (_ccStreamAbort) _ccStreamAbort(); });
3330
+ req.on('close', () => {
3331
+ ccInFlightTabs.delete(tabId);
3332
+ if (!_ccStreamEnded && _ccStreamAbort) {
3333
+ console.log(`[CC-stream] Client disconnected for tab ${tabId} — aborting LLM`);
3334
+ _ccStreamAbort();
3335
+ }
3336
+ });
3330
3337
 
3331
3338
  try {
3332
3339
  // Session management — per-tab: use sessionId from request, don't mutate global ccSession
@@ -3367,7 +3374,7 @@ What would you like to discuss or change? When you're happy, say "approve" and I
3367
3374
  // Return null sessionId on resume failure so client clears the stale session
3368
3375
  const errorSessionId = (wasResume && result.code !== 0) ? null : tabSessionId;
3369
3376
  res.write('data: ' + JSON.stringify({ type: 'done', text: `I had trouble processing that ${debugInfo}. ${stderrTail ? 'Detail: ' + stderrTail : ''}\n\n${retryHint}`, actions: [], sessionId: errorSessionId }) + '\n\n');
3370
- res.end();
3377
+ _ccStreamEnded = true; res.end();
3371
3378
  return;
3372
3379
  }
3373
3380
 
@@ -3396,14 +3403,14 @@ What would you like to discuss or change? When you're happy, say "approve" and I
3396
3403
  // Send final result with actions
3397
3404
  const { text: displayText, actions } = parseCCActions(result.text);
3398
3405
  res.write('data: ' + JSON.stringify({ type: 'done', text: displayText, actions, sessionId: responseSessionId, newSession: !wasResume }) + '\n\n');
3399
- res.end();
3406
+ _ccStreamEnded = true; res.end();
3400
3407
  } finally {
3401
3408
  ccInFlightTabs.delete(tabId);
3402
3409
  }
3403
3410
  } catch (e) {
3404
3411
  ccInFlightTabs.delete(tabId);
3405
3412
  try { res.write('data: ' + JSON.stringify({ type: 'error', error: e.message }) + '\n\n'); } catch {}
3406
- try { res.end(); } catch {}
3413
+ _ccStreamEnded = true; try { res.end(); } catch {}
3407
3414
  }
3408
3415
  }
3409
3416
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.759",
3
+ "version": "0.1.761",
4
4
  "description": "Multi-agent AI dev team that runs from ~/.minions/ — five autonomous agents share a single engine, dashboard, and knowledge base",
5
5
  "bin": {
6
6
  "minions": "bin/minions.js"