@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 +7 -1
- package/dashboard/js/command-center.js +9 -1
- package/dashboard.js +11 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
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);
|
|
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', () => {
|
|
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.
|
|
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"
|