@yemi33/minions 0.1.928 → 0.1.930
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 +4 -3
- package/dashboard/js/render-inbox.js +2 -1
- package/dashboard/js/settings.js +4 -0
- package/dashboard/styles.css +3 -2
- package/engine/shared.js +2 -0
- package/engine.js +45 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.930 (2026-04-14)
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
|
+
- add adoPollEnabled/ghPollEnabled engine settings
|
|
6
7
|
- doc-chat abort kills LLM process + queued messages auto-process
|
|
7
8
|
- add /api/work-items/reopen endpoint and reopen-work-item CC action (#982)
|
|
8
9
|
- CC tab unread dot + reopened badge on work items
|
|
@@ -20,6 +21,8 @@
|
|
|
20
21
|
- add red dot notification on CC tab when response completes (#934) (#946)
|
|
21
22
|
|
|
22
23
|
### Fixes
|
|
24
|
+
- show doc-chat badges on Notes and KB items (#1016)
|
|
25
|
+
- steering kill on no-session re-queues dispatch instead of erroring (#1015)
|
|
23
26
|
- inject cached ADO token into spawned agents (#998) (#1012)
|
|
24
27
|
- qaAbort race + skip kill on completed doc-chat
|
|
25
28
|
- doc-chat Stop button actually works — release server guard on disconnect
|
|
@@ -38,8 +41,6 @@
|
|
|
38
41
|
- plan completion incorrectly overrides awaiting-approval status (#970) (#978)
|
|
39
42
|
- CC queued messages sent to wrong tab after tab switch
|
|
40
43
|
- pass sysPromptPath instead of steerPromptPath as system prompt in steering resume (#962)
|
|
41
|
-
- PRD item display dispatched/in-progress status conflation (closes #950) (#955)
|
|
42
|
-
- remove KB watchdog — checkpoint never written, restore never worked
|
|
43
44
|
|
|
44
45
|
### Other
|
|
45
46
|
- test(preflight): add unit tests for findClaudeBinary, runPreflight, printPreflight, checkOrExit (#953)
|
|
@@ -86,8 +86,9 @@ function renderNotes(notes) {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
if (!content || !content.trim()) { el.innerHTML = '<p class="empty">No team notes yet.</p>'; return; }
|
|
89
|
-
el.innerHTML = '<div class="notes-preview" onclick="openNotesModal()" title="Click to expand">' + renderMd(content) + '</div>';
|
|
89
|
+
el.innerHTML = '<div class="notes-preview" data-file="notes.md" onclick="openNotesModal()" title="Click to expand">' + renderMd(content) + '</div>';
|
|
90
90
|
el.querySelector('.notes-preview')._rawContent = content;
|
|
91
|
+
restoreNotifBadges();
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
function openNotesModal() {
|
package/dashboard/js/settings.js
CHANGED
|
@@ -48,6 +48,8 @@ async function openSettings() {
|
|
|
48
48
|
settingsToggle('Auto-decompose', 'set-autoDecompose', e.autoDecompose !== false, 'Large implement items are auto-split into sub-tasks') +
|
|
49
49
|
settingsToggle('Allow Temp Agents', 'set-allowTempAgents', !!e.allowTempAgents, 'Spawn ephemeral agents when all permanent agents are busy') +
|
|
50
50
|
settingsToggle('Auto-archive Plans', 'set-autoArchive', !!e.autoArchive, 'Automatically archive plans after verify completes (off = manual archive via dashboard)') +
|
|
51
|
+
settingsToggle('ADO Polling', 'set-adoPollEnabled', e.adoPollEnabled !== false, 'Poll ADO PR status, comments, and reconciliation on each tick cycle') +
|
|
52
|
+
settingsToggle('GitHub Polling', 'set-ghPollEnabled', e.ghPollEnabled !== false, 'Poll GitHub PR status, comments, and reconciliation on each tick cycle') +
|
|
51
53
|
'</div>' +
|
|
52
54
|
'<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:16px">' +
|
|
53
55
|
settingsField('Eval Max Iterations', 'set-evalMaxIterations', e.evalMaxIterations || 3, '', 'Max review→fix cycles before escalating (1-10)') +
|
|
@@ -208,6 +210,8 @@ async function saveSettings() {
|
|
|
208
210
|
autoDecompose: document.getElementById('set-autoDecompose').checked,
|
|
209
211
|
allowTempAgents: document.getElementById('set-allowTempAgents').checked,
|
|
210
212
|
autoArchive: document.getElementById('set-autoArchive').checked,
|
|
213
|
+
adoPollEnabled: document.getElementById('set-adoPollEnabled').checked,
|
|
214
|
+
ghPollEnabled: document.getElementById('set-ghPollEnabled').checked,
|
|
211
215
|
evalMaxIterations: document.getElementById('set-evalMaxIterations').value,
|
|
212
216
|
evalMaxCost: document.getElementById('set-evalMaxCost').value || null,
|
|
213
217
|
maxBuildFixAttempts: document.getElementById('set-maxBuildFixAttempts').value,
|
package/dashboard/styles.css
CHANGED
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
.kb-tab:hover { color: var(--text); border-color: var(--text); }
|
|
151
151
|
.kb-tab.active { color: var(--blue); border-color: var(--blue); background: rgba(88,166,255,0.08); }
|
|
152
152
|
.kb-tab .badge { background: var(--border); color: var(--text); font-size: var(--text-xs); padding: 0 5px; border-radius: var(--radius-lg); margin-left: var(--space-2); }
|
|
153
|
-
.kb-list { max-height: 400px; overflow-y: auto; }
|
|
153
|
+
.kb-list { max-height: 400px; overflow-y: auto; padding: var(--space-3) var(--space-4) 0 0; }
|
|
154
154
|
.kb-item { display: flex; align-items: flex-start; gap: var(--space-5); padding: var(--space-4) 0; border-bottom: 1px solid var(--border); cursor: pointer; transition: background var(--transition-fast); }
|
|
155
155
|
.kb-item:hover { background: var(--surface2); }
|
|
156
156
|
.kb-item:last-child { border-bottom: none; }
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
.agent-emoji { font-size: var(--text-stat); margin-right: var(--space-2); }
|
|
165
165
|
.click-hint { font-size: var(--text-sm); color: var(--border); margin-top: var(--space-3); }
|
|
166
166
|
|
|
167
|
-
.inbox-list { display: flex; flex-direction: column; gap: var(--space-4); max-height: 320px; overflow-y: auto; }
|
|
167
|
+
.inbox-list { display: flex; flex-direction: column; gap: var(--space-4); max-height: 320px; overflow-y: auto; padding: var(--space-3) var(--space-4) 0 0; }
|
|
168
168
|
|
|
169
169
|
/* PRD Progress */
|
|
170
170
|
.prd-progress-bar { width: 100%; height: 20px; background: var(--bg); border-radius: var(--radius-xl); overflow: hidden; display: flex; margin-bottom: var(--space-6); border: 1px solid var(--border); }
|
|
@@ -226,6 +226,7 @@
|
|
|
226
226
|
|
|
227
227
|
.notes-preview { max-height: 400px; overflow-y: auto; font-size: var(--text-md); line-height: 1.6; color: var(--muted); font-family: 'Segoe UI', system-ui, sans-serif; white-space: normal; word-wrap: break-word; background: var(--surface2); border: 1px solid var(--border); border-radius: var(--radius-md); padding: var(--space-6) var(--space-7); cursor: pointer; transition: border-color var(--transition-base); }
|
|
228
228
|
.notes-preview:hover { border-color: var(--blue); }
|
|
229
|
+
.notes-preview > .notif-badge { top: var(--space-2); right: var(--space-4); }
|
|
229
230
|
.inbox-item { background: var(--surface2); border: 1px solid var(--border); border-left: 3px solid var(--purple); border-radius: var(--radius-sm); padding: var(--space-5) var(--space-6); cursor: pointer; }
|
|
230
231
|
.inbox-item:hover { border-color: var(--blue); border-left-color: var(--blue); }
|
|
231
232
|
.item-pinned { border-left-color: var(--yellow); background: rgba(210, 153, 34, 0.05); }
|
package/engine/shared.js
CHANGED
|
@@ -547,6 +547,8 @@ const ENGINE_DEFAULTS = {
|
|
|
547
547
|
lockRetryBackoffMs: 500, // base backoff between lock retries (doubles each attempt: 500ms, 1s, 2s, ...)
|
|
548
548
|
maxBuildFixAttempts: 3, // max consecutive auto-fix dispatch cycles per PR before escalation to human
|
|
549
549
|
buildFixGracePeriod: 600000, // 10min — wait for CI to run after build fix before re-dispatching
|
|
550
|
+
adoPollEnabled: true, // poll ADO PR status, comments, and reconciliation on each tick cycle
|
|
551
|
+
ghPollEnabled: true, // poll GitHub PR status, comments, and reconciliation on each tick cycle
|
|
550
552
|
autoCompletePrs: false, // auto-merge PRs when builds green + review approved (opt-in)
|
|
551
553
|
prMergeMethod: 'squash', // merge method: squash, merge, rebase
|
|
552
554
|
ignoredCommentAuthors: [], // comments from these authors are auto-closed and never trigger fixes
|
package/engine.js
CHANGED
|
@@ -1110,6 +1110,34 @@ async function spawnAgent(dispatchItem, config) {
|
|
|
1110
1110
|
return;
|
|
1111
1111
|
}
|
|
1112
1112
|
|
|
1113
|
+
// Check if this was a no-session steering kill (#1014) — re-queue for retry instead of erroring.
|
|
1114
|
+
// timeout.js sets _steeringNoSession when it kills an agent that hasn't established a sessionId.
|
|
1115
|
+
// The steering message is already saved to inbox, so re-queuing lets the engine retry and the
|
|
1116
|
+
// agent picks up the message on the next dispatch.
|
|
1117
|
+
if (procInfo?._steeringNoSession) {
|
|
1118
|
+
log('info', `Steering no-session: re-queue ${agentId} (${id}) — dispatch moved back to pending`);
|
|
1119
|
+
activeProcesses.delete(id);
|
|
1120
|
+
realActivityMap.delete(id);
|
|
1121
|
+
// Move dispatch item from active back to pending so engine retries
|
|
1122
|
+
mutateDispatch((dp) => {
|
|
1123
|
+
const idx = dp.active.findIndex(d => d.id === id);
|
|
1124
|
+
if (idx >= 0) {
|
|
1125
|
+
const item = dp.active.splice(idx, 1)[0];
|
|
1126
|
+
delete item.started_at;
|
|
1127
|
+
delete item.workerState;
|
|
1128
|
+
delete item.workerStateAt;
|
|
1129
|
+
delete item.workerStateDetail;
|
|
1130
|
+
dp.pending.push(item);
|
|
1131
|
+
}
|
|
1132
|
+
return dp;
|
|
1133
|
+
});
|
|
1134
|
+
// Cleanup temp files
|
|
1135
|
+
try { fs.unlinkSync(sysPromptPath); } catch { /* cleanup */ }
|
|
1136
|
+
try { fs.unlinkSync(promptPath); } catch { /* cleanup */ }
|
|
1137
|
+
try { fs.unlinkSync(promptPath.replace(/prompt-/, 'pid-').replace(/\.md$/, '.pid')); } catch { /* cleanup */ }
|
|
1138
|
+
return;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1113
1141
|
activeProcesses.delete(id);
|
|
1114
1142
|
realActivityMap.delete(id); // Clean up real activity tracking
|
|
1115
1143
|
|
|
@@ -3092,12 +3120,19 @@ async function tickInner() {
|
|
|
3092
3120
|
safe('runCleanup', () => runCleanup(config));
|
|
3093
3121
|
}
|
|
3094
3122
|
|
|
3123
|
+
const adoPollEnabled = config.engine?.adoPollEnabled ?? DEFAULTS.adoPollEnabled;
|
|
3124
|
+
const ghPollEnabled = config.engine?.ghPollEnabled ?? DEFAULTS.ghPollEnabled;
|
|
3125
|
+
|
|
3095
3126
|
// 2.6. Poll PR status: build, review, merge (every 6 ticks = ~3 minutes)
|
|
3096
3127
|
// Awaited so PR state is consistent before discoverWork reads it
|
|
3097
3128
|
// Also re-polls early if previous tick had ADO auth failures (stale build status recovery)
|
|
3098
3129
|
if (tickCount % 6 === 0 || needsAdoPollRetry()) {
|
|
3099
|
-
|
|
3100
|
-
|
|
3130
|
+
if (adoPollEnabled) {
|
|
3131
|
+
try { await pollPrStatus(config); } catch (err) { log('warn', `ADO PR status poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
|
|
3132
|
+
}
|
|
3133
|
+
if (ghPollEnabled) {
|
|
3134
|
+
try { await ghPollPrStatus(config); } catch (err) { log('warn', `GitHub PR status poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
|
|
3135
|
+
}
|
|
3101
3136
|
try { await processPendingRebases(config); } catch (err) { log('warn', `Pending rebase processing error: ${err?.message || err}`); }
|
|
3102
3137
|
// Sync PR status back to PRD items (missing → done when active PR exists)
|
|
3103
3138
|
try { syncPrdFromPrs(config); } catch (err) { log('warn', `PRD sync error: ${err?.message || err}`); }
|
|
@@ -3119,10 +3154,14 @@ async function tickInner() {
|
|
|
3119
3154
|
|
|
3120
3155
|
// 2.7. Poll PR threads for human comments (every 12 ticks = ~6 minutes)
|
|
3121
3156
|
if (tickCount % 12 === 0) {
|
|
3122
|
-
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
3157
|
+
if (adoPollEnabled) {
|
|
3158
|
+
try { await pollPrHumanComments(config); } catch (err) { log('warn', `ADO PR comment poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
|
|
3159
|
+
try { await reconcilePrs(config); } catch (err) { log('warn', `ADO PR reconciliation error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
|
|
3160
|
+
}
|
|
3161
|
+
if (ghPollEnabled) {
|
|
3162
|
+
try { await ghPollPrHumanComments(config); } catch (err) { log('warn', `GitHub PR comment poll error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
|
|
3163
|
+
try { await ghReconcilePrs(config); } catch (err) { log('warn', `GitHub PR reconciliation error: ${err?.message || err}${err?.stack ? ' | ' + err.stack.split('\n')[1]?.trim() : ''}`); }
|
|
3164
|
+
}
|
|
3126
3165
|
}
|
|
3127
3166
|
|
|
3128
3167
|
// 2.9. Stalled dispatch detection — auto-retry failed items blocking the graph (every 20 ticks = ~10 min)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.930",
|
|
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"
|