@yemi33/minions 0.1.666 → 0.1.668
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 +9 -1
- package/dashboard/js/render-work-items.js +2 -0
- package/dashboard.html +1 -0
- package/engine/cooldown.js +7 -5
- package/engine/queries.js +27 -0
- package/engine/timeout.js +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.668 (2026-04-09)
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
- reduce Bash blocking grace and errored task dedup window (closes #593) (#630)
|
|
7
|
+
|
|
8
|
+
## 0.1.667 (2026-04-09)
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
- show skip reason on work item row when dispatch is blocked (#628)
|
|
4
12
|
|
|
5
13
|
### Fixes
|
|
6
14
|
- write status marker to live output during steering resume gap
|
|
@@ -49,6 +49,7 @@ function wiRow(item) {
|
|
|
49
49
|
'<td>' + priBadge(item.priority) + '</td>' +
|
|
50
50
|
'<td>' + statusBadge(item.status || 'pending') +
|
|
51
51
|
(item._pendingReason && item.status === 'pending' ? ' <span style="font-size:9px;color:var(--muted);margin-left:4px" title="Pending reason: ' + escHtml(item._pendingReason) + '">' + escHtml(item._pendingReason.replace(/_/g, ' ')) + '</span>' : '') +
|
|
52
|
+
(item._skipReason && item.status === 'pending' ? ' <span style="font-size:9px;color:var(--yellow);margin-left:4px" title="Dispatch blocked: ' + escHtml(item._skipReason) + (item._blockedBy ? ' (by ' + escHtml(item._blockedBy) + ')' : '') + '">' + escHtml(item._skipReason.replace(/_/g, ' ')) + (item._blockedBy ? ' <span style="color:var(--muted)">(' + escHtml(item._blockedBy) + ')</span>' : '') + '</span>' : '') +
|
|
52
53
|
(item.status === 'failed' ? ' ' + wiRetryBtn(item) : '') +
|
|
53
54
|
'</td>' +
|
|
54
55
|
'<td>' +
|
|
@@ -439,6 +440,7 @@ function openWorkItemDetail(id) {
|
|
|
439
440
|
if (item.completedAt) html += field('Completed', escHtml(new Date(item.completedAt).toLocaleString()));
|
|
440
441
|
if (item.failReason) html += field('Failure Reason', '<span style="color:var(--red)">' + escHtml(item.failReason) + '</span>');
|
|
441
442
|
if (item._pendingReason && item.status === 'pending') html += field('Pending Reason', escHtml(item._pendingReason.replace(/_/g, ' ')));
|
|
443
|
+
if (item._skipReason && item.status === 'pending') html += field('Dispatch Blocked', '<span style="color:var(--yellow)">' + escHtml(item._skipReason.replace(/_/g, ' ')) + '</span>' + (item._blockedBy ? ' — blocked by <strong>' + escHtml(item._blockedBy) + '</strong>' : ''));
|
|
442
444
|
if (item.depends_on?.length) html += field('Depends On', item.depends_on.map(d => '<code>' + escHtml(d) + '</code>').join(', '));
|
|
443
445
|
if (item.acceptanceCriteria?.length) html += field('Acceptance Criteria', '<ul style="margin:0;padding-left:20px">' + item.acceptanceCriteria.map(c => '<li>' + escHtml(c) + '</li>').join('') + '</ul>');
|
|
444
446
|
if (item.references?.length) html += field('References', item.references.map(r => '<a href="' + escHtml(r.url) + '" target="_blank" style="color:var(--blue)">' + escHtml(r.title || r.url) + '</a>' + (r.type ? ' <span style="color:var(--muted);font-size:10px">(' + escHtml(r.type) + ')</span>' : '')).join('<br>'));
|
package/dashboard.html
CHANGED
|
@@ -2792,6 +2792,7 @@ function wiRow(item) {
|
|
|
2792
2792
|
'<td>' + priBadge(item.priority) + '</td>' +
|
|
2793
2793
|
'<td>' + statusBadge(item.status || 'pending') +
|
|
2794
2794
|
(item._pendingReason ? ' <span style="font-size:9px;color:var(--muted);margin-left:4px" title="Pending reason: ' + escHtml(item._pendingReason) + '">' + escHtml(item._pendingReason.replace(/_/g, ' ')) + '</span>' : '') +
|
|
2795
|
+
(item._skipReason && item.status === 'pending' ? ' <span style="font-size:9px;color:var(--yellow);margin-left:4px" title="Dispatch blocked: ' + escHtml(item._skipReason) + (item._blockedBy ? ' (by ' + escHtml(item._blockedBy) + ')' : '') + '">' + escHtml(item._skipReason.replace(/_/g, ' ')) + (item._blockedBy ? ' <span style="color:var(--muted)">(' + escHtml(item._blockedBy) + ')</span>' : '') + '</span>' : '') +
|
|
2795
2796
|
(item.status === 'failed' ? ' <button class="pr-pager-btn" style="font-size:9px;padding:1px 6px;color:var(--yellow);border-color:var(--yellow);margin-left:4px" onclick="event.stopPropagation();retryWorkItem(\'' + escHtml(item.id) + '\',\'' + escHtml(item._source || '') + '\')">Retry</button>' : '') +
|
|
2796
2797
|
'</td>' +
|
|
2797
2798
|
'<td>' +
|
package/engine/cooldown.js
CHANGED
|
@@ -95,11 +95,13 @@ function isAlreadyDispatched(key) {
|
|
|
95
95
|
// Check pending and active
|
|
96
96
|
const inFlight = [...dispatch.pending, ...(dispatch.active || [])];
|
|
97
97
|
if (inFlight.some(d => d.meta?.dispatchKey === key)) return true;
|
|
98
|
-
// Also check recently completed (
|
|
99
|
-
const
|
|
100
|
-
const recentCompleted = (dispatch.completed || []).filter(d =>
|
|
101
|
-
|
|
102
|
-
|
|
98
|
+
// Also check recently completed — shorter window for errors (15min) vs success (1hr)
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
const recentCompleted = (dispatch.completed || []).filter(d => {
|
|
101
|
+
if (!d.completed_at) return false;
|
|
102
|
+
const windowMs = d.result === 'error' ? 900000 : 3600000; // 15 min for errors, 1 hr for success
|
|
103
|
+
return now - new Date(d.completed_at).getTime() < windowMs;
|
|
104
|
+
});
|
|
103
105
|
return recentCompleted.some(d => d.meta?.dispatchKey === key);
|
|
104
106
|
}
|
|
105
107
|
|
package/engine/queries.js
CHANGED
|
@@ -656,6 +656,33 @@ function getWorkItems(config) {
|
|
|
656
656
|
}
|
|
657
657
|
}
|
|
658
658
|
|
|
659
|
+
// Cross-reference with dispatch pending entries to surface skipReason + blockedBy (#617)
|
|
660
|
+
const pendingByWiId = new Map();
|
|
661
|
+
for (const d of (dispatch.pending || [])) {
|
|
662
|
+
if (d.meta?.item?.id && d.skipReason) {
|
|
663
|
+
pendingByWiId.set(d.meta.item.id, d);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
if (pendingByWiId.size > 0) {
|
|
667
|
+
// Build branch → active agent name map for blockedBy lookup
|
|
668
|
+
const branchToAgent = new Map();
|
|
669
|
+
for (const d of (dispatch.active || [])) {
|
|
670
|
+
if (d.meta?.branch) branchToAgent.set(d.meta.branch, d.agentName || d.agent || '');
|
|
671
|
+
}
|
|
672
|
+
for (const item of allItems) {
|
|
673
|
+
const pendingEntry = pendingByWiId.get(item.id);
|
|
674
|
+
if (!pendingEntry) continue;
|
|
675
|
+
item._skipReason = pendingEntry.skipReason;
|
|
676
|
+
if (pendingEntry.skipReason === 'branch_locked' && pendingEntry.meta?.branch) {
|
|
677
|
+
const blocker = branchToAgent.get(pendingEntry.meta.branch);
|
|
678
|
+
if (blocker) item._blockedBy = blocker;
|
|
679
|
+
} else if (pendingEntry.skipReason === 'agent_busy') {
|
|
680
|
+
const activeEntry = (dispatch.active || []).find(d => d.agent === pendingEntry.agent);
|
|
681
|
+
if (activeEntry) item._blockedBy = activeEntry.agentName || activeEntry.agent || '';
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
659
686
|
// Cross-reference with PRs
|
|
660
687
|
const allPrs = getPullRequests(config);
|
|
661
688
|
for (const item of allItems) {
|
package/engine/timeout.js
CHANGED
|
@@ -187,8 +187,8 @@ function checkTimeouts(config) {
|
|
|
187
187
|
}
|
|
188
188
|
// Bash tool call — may be running a long build/install with no stdout
|
|
189
189
|
if (name === 'Bash') {
|
|
190
|
-
// Use explicit timeout if set, otherwise
|
|
191
|
-
const bashTimeout = input.timeout ||
|
|
190
|
+
// Use explicit timeout if set, otherwise match Claude Code's actual Bash default (120s)
|
|
191
|
+
const bashTimeout = input.timeout || 120000;
|
|
192
192
|
blockingTimeout = Math.max(heartbeatTimeout, bashTimeout + 60000);
|
|
193
193
|
isBlocking = true;
|
|
194
194
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.668",
|
|
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"
|