@yemi33/minions 0.1.745 → 0.1.747

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,10 +1,14 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.745 (2026-04-09)
3
+ ## 0.1.747 (2026-04-09)
4
4
 
5
5
  ### Features
6
6
  - CC multi-tab conversations with session resume
7
7
 
8
+ ### Fixes
9
+ - clear stale sessionId on resume failure, folder-style tab UI
10
+ - CC tabs use per-tab sessions, not shared global session
11
+
8
12
  ## 0.1.744 (2026-04-09)
9
13
 
10
14
  ### Features
@@ -113,10 +113,7 @@ function ccNewTab(skipServerReset) {
113
113
  var tab = { id: tabId, title: 'New chat', sessionId: null, messages: [] };
114
114
  _ccTabs.push(tab);
115
115
  _ccActiveTabId = tabId;
116
- // Reset server session for new tab
117
- if (!skipServerReset) {
118
- fetch('/api/command-center/new-session', { method: 'POST' }).catch(function() {});
119
- }
116
+ // New tab starts with null sessionId — server creates fresh session on first message
120
117
  // Abort any in-flight request
121
118
  ccAbort();
122
119
  _ccSending = false;
@@ -462,7 +459,7 @@ async function _ccDoSend(message, skipUserMsg) {
462
459
  // Stream response via SSE — shows text as it arrives
463
460
  var res = await fetch('/api/command-center/stream', {
464
461
  method: 'POST', headers: { 'Content-Type': 'application/json' },
465
- body: JSON.stringify({ message: message, tabId: activeTabId }),
462
+ body: JSON.stringify({ message: message, tabId: activeTabId, sessionId: activeTab.sessionId || null }),
466
463
  signal: _ccAbortController ? _ccAbortController.signal : AbortSignal.timeout(960000)
467
464
  });
468
465
 
@@ -503,9 +500,9 @@ async function _ccDoSend(message, skipUserMsg) {
503
500
  var ccElapsed = Math.round((Date.now() - ccStartTime) / 1000);
504
501
  var rendered = renderMd(evt.text || streamedText || '');
505
502
  ccAddMessage('assistant', rendered + '<div style="font-size:9px;color:var(--muted);margin-top:6px;display:flex;justify-content:flex-end;padding-right:30px">' + ccElapsed + 's</div>');
506
- if (evt.sessionId) {
503
+ if (evt.sessionId !== undefined) {
507
504
  var currentTab = _ccActiveTab();
508
- if (currentTab) { currentTab.sessionId = evt.sessionId; }
505
+ if (currentTab) { currentTab.sessionId = evt.sessionId || null; }
509
506
  ccSaveState(); ccUpdateSessionIndicator();
510
507
  }
511
508
  if (evt.actions && evt.actions.length > 0) {
@@ -533,9 +530,9 @@ async function _ccDoSend(message, skipUserMsg) {
533
530
  var ccElapsed2 = Math.round((Date.now() - ccStartTime) / 1000);
534
531
  var rendered2 = renderMd(revt.text || streamedText || '');
535
532
  ccAddMessage('assistant', rendered2 + '<div style="font-size:9px;color:var(--muted);margin-top:6px;display:flex;justify-content:flex-end;padding-right:30px">' + ccElapsed2 + 's</div>');
536
- if (revt.sessionId) {
533
+ if (revt.sessionId !== undefined) {
537
534
  var currentTab2 = _ccActiveTab();
538
- if (currentTab2) { currentTab2.sessionId = revt.sessionId; }
535
+ if (currentTab2) { currentTab2.sessionId = revt.sessionId || null; }
539
536
  ccSaveState(); ccUpdateSessionIndicator();
540
537
  }
541
538
  if (revt.actions && revt.actions.length > 0) {
@@ -621,9 +621,10 @@
621
621
  @keyframes notifPulse { 0%,100% { opacity: 1; } 50% { opacity: 0.5; } }
622
622
 
623
623
  /* Command Center tab bar */
624
- .cc-tab { padding: 2px 8px; font-size: 10px; border: 1px solid var(--border); border-radius: 4px; background: var(--surface2); color: var(--muted); cursor: pointer; white-space: nowrap; max-width: 120px; overflow: hidden; text-overflow: ellipsis; display: inline-flex; align-items: center; gap: 2px; flex-shrink: 0; }
625
- .cc-tab.active { color: var(--blue); border-color: var(--blue); background: rgba(56,139,253,0.1); }
626
- .cc-tab-close { margin-left: 4px; opacity: 0.5; cursor: pointer; font-size: 12px; line-height: 1; }
624
+ .cc-tab { padding: 4px 10px; font-size: 10px; border: 1px solid var(--border); border-bottom: none; border-radius: 6px 6px 0 0; background: var(--surface2); color: var(--muted); cursor: pointer; white-space: nowrap; max-width: 140px; overflow: hidden; text-overflow: ellipsis; display: inline-flex; align-items: center; gap: 2px; flex-shrink: 0; margin-bottom: -1px; position: relative; }
625
+ .cc-tab.active { color: var(--text); background: var(--bg); border-color: var(--border); z-index: 1; font-weight: 600; }
626
+ .cc-tab-close { margin-left: 4px; opacity: 0; cursor: pointer; font-size: 12px; line-height: 1; }
627
+ .cc-tab:hover .cc-tab-close { opacity: 0.5; }
627
628
  .cc-tab-close:hover { opacity: 1; color: var(--red); }
628
629
 
629
630
  /* Command Center resize handle */
package/dashboard.js CHANGED
@@ -3333,12 +3333,16 @@ What would you like to discuss or change? When you're happy, say "approve" and I
3333
3333
  req.on('close', () => { ccInFlight = false; ccInFlightSince = 0; if (_ccStreamAbort) _ccStreamAbort(); });
3334
3334
 
3335
3335
  try {
3336
- // Session management — same as non-streaming path
3337
- if (body.sessionId && body.sessionId !== ccSession.sessionId) {
3336
+ // Session management — per-tab: use sessionId from request if provided
3337
+ const tabSessionId = body.sessionId || null;
3338
+ if (tabSessionId) {
3339
+ // Resume the tab's specific session
3340
+ ccSession = { sessionId: tabSessionId, createdAt: ccSession.createdAt, lastActiveAt: Date.now(), turnCount: ccSession.turnCount || 0, _promptHash: _ccPromptHash };
3341
+ } else if (!ccSessionValid()) {
3338
3342
  ccSession = { sessionId: null, createdAt: null, lastActiveAt: null, turnCount: 0 };
3339
3343
  }
3340
- const wasResume = !!(ccSessionValid() && ccSession.sessionId);
3341
- const sessionId = wasResume ? ccSession.sessionId : null;
3344
+ const wasResume = !!tabSessionId || !!(ccSessionValid() && ccSession.sessionId);
3345
+ const sessionId = tabSessionId || (wasResume ? ccSession.sessionId : null);
3342
3346
  const preamble = wasResume ? '' : buildCCStatePreamble();
3343
3347
  const prompt = (preamble ? preamble + '\n\n---\n\n' : '') + body.message;
3344
3348
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.745",
3
+ "version": "0.1.747",
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"