@yemi33/minions 0.1.910 → 0.1.912

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,8 +1,9 @@
1
1
  # Changelog
2
2
 
3
- ## 0.1.910 (2026-04-13)
3
+ ## 0.1.912 (2026-04-13)
4
4
 
5
5
  ### Features
6
+ - audit and harden log buffering implementation (#971)
6
7
  - replace magic string 'active' with PR_STATUS.ACTIVE in lifecycle.js (#969)
7
8
  - fix dashboard plan-pause nested lock violation (#968)
8
9
  - add missing branch_name to central dispatch vars (#967)
@@ -15,12 +16,16 @@
15
16
  - add red dot notification on CC tab when response completes (#934) (#946)
16
17
 
17
18
  ### Fixes
19
+ - CC queued messages sent to wrong tab after tab switch
18
20
  - pass sysPromptPath instead of steerPromptPath as system prompt in steering resume (#962)
19
21
  - PRD item display dispatched/in-progress status conflation (closes #950) (#955)
20
22
  - remove KB watchdog — checkpoint never written, restore never worked
21
23
  - make KB sweep endpoint async with status polling (#933)
22
24
  - prohibit agents from self-merging their own PRs
23
25
 
26
+ ### Other
27
+ - [E2E] Architecture meeting Tier 1+2: 6 correctness bugs + 2 nested lock violations + log buffering (#972)
28
+
24
29
  ## 0.1.901 (2026-04-12)
25
30
 
26
31
  ### Fixes
@@ -368,6 +368,7 @@ async function ccSend() {
368
368
  input.value = '';
369
369
 
370
370
  var tab = _ccActiveTab();
371
+ var originTabId = _ccActiveTabId;
371
372
  if (!tab) return;
372
373
  if (!tab._queue) tab._queue = [];
373
374
 
@@ -377,16 +378,16 @@ async function ccSend() {
377
378
  _renderQueueIndicator();
378
379
  return;
379
380
  }
380
- var wasAborted = await _ccDoSend(message);
381
+ var wasAborted = await _ccDoSend(message, false, originTabId);
381
382
 
382
- // Flush queued messages one at a time, pausing after abort to let server release ccInFlight
383
+ // Flush queued messages to the ORIGINAL tab, even if user switched tabs
383
384
  while (tab._queue && tab._queue.length > 0) {
384
385
  if (wasAborted) {
385
386
  await new Promise(function(r) { setTimeout(r, 1500); });
386
387
  }
387
388
  var next = tab._queue.shift();
388
389
  _renderQueueIndicator();
389
- wasAborted = await _ccDoSend(next);
390
+ wasAborted = await _ccDoSend(next, false, originTabId);
390
391
  }
391
392
  }
392
393
 
@@ -407,29 +408,30 @@ function _renderQueueIndicator() {
407
408
  if (msgs.scrollHeight - msgs.scrollTop - msgs.clientHeight < 150) msgs.scrollTop = msgs.scrollHeight;
408
409
  }
409
410
 
410
- async function _ccDoSend(message, skipUserMsg) {
411
+ async function _ccDoSend(message, skipUserMsg, forceTabId) {
411
412
  // Client-side /pin and /unpin — no LLM round-trip needed
412
413
  var pinMatch = message.match(/^\/(pin|unpin)\s+(.+)/i);
413
414
  if (pinMatch) {
414
- if (!skipUserMsg) ccAddMessage('user', escHtml(message));
415
+ if (!skipUserMsg) ccAddMessage('user', escHtml(message), false, forceTabId);
415
416
  var pinAction = pinMatch[1].toLowerCase();
416
417
  var pinQuery = pinMatch[2].toLowerCase().trim();
417
418
  var found = _ccFindPinTarget(pinQuery);
418
419
  if (found) {
419
420
  var wasPinned = isPinned(found.key);
420
- if (pinAction === 'pin' && !wasPinned) { togglePin(found.key); ccAddMessage('assistant', 'Pinned <strong>' + escHtml(found.label) + '</strong> to top'); }
421
- else if (pinAction === 'unpin' && wasPinned) { togglePin(found.key); ccAddMessage('assistant', 'Unpinned <strong>' + escHtml(found.label) + '</strong>'); }
422
- else { ccAddMessage('assistant', '<strong>' + escHtml(found.label) + '</strong> is already ' + (wasPinned ? 'pinned' : 'unpinned')); }
421
+ if (pinAction === 'pin' && !wasPinned) { togglePin(found.key); ccAddMessage('assistant', 'Pinned <strong>' + escHtml(found.label) + '</strong> to top', false, forceTabId); }
422
+ else if (pinAction === 'unpin' && wasPinned) { togglePin(found.key); ccAddMessage('assistant', 'Unpinned <strong>' + escHtml(found.label) + '</strong>', false, forceTabId); }
423
+ else { ccAddMessage('assistant', '<strong>' + escHtml(found.label) + '</strong> is already ' + (wasPinned ? 'pinned' : 'unpinned'), false, forceTabId); }
423
424
  showToast('cmd-toast', pinAction === 'pin' ? 'Pinned to top' : 'Unpinned', true);
424
425
  renderInbox(inboxData); renderKnowledgeBase();
425
426
  } else {
426
- ccAddMessage('assistant', 'No inbox or KB item matching "' + escHtml(pinQuery) + '"');
427
+ ccAddMessage('assistant', 'No inbox or KB item matching "' + escHtml(pinQuery) + '"', false, forceTabId);
427
428
  }
428
429
  return;
429
430
  }
430
431
 
431
- var activeTab = _ccActiveTab();
432
- var activeTabId = _ccActiveTabId;
432
+ // Use forced tab ID (from queue flush) or fall back to current active tab
433
+ var activeTabId = forceTabId || _ccActiveTabId;
434
+ var activeTab = _ccTabs.find(function(t) { return t.id === activeTabId; }) || _ccActiveTab();
433
435
  if (!activeTab) return;
434
436
  activeTab._sending = true;
435
437
  activeTab._sendStartedAt = Date.now();
package/engine/shared.js CHANGED
@@ -8,7 +8,7 @@ const path = require('path');
8
8
 
9
9
  const MINIONS_DIR = process.env.MINIONS_TEST_DIR || path.resolve(__dirname, '..');
10
10
  const PR_LINKS_PATH = path.join(MINIONS_DIR, 'engine', 'pr-links.json');
11
- const LOG_PATH = path.join(__dirname, 'log.json');
11
+ const LOG_PATH = path.join(MINIONS_DIR, 'engine', 'log.json');
12
12
 
13
13
  // ── Timestamps & Logging ────────────────────────────────────────────────────
14
14
  // Extracted from engine.js so engine/* modules can import directly without
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.910",
3
+ "version": "0.1.912",
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"