@yemi33/minions 0.1.312 → 0.1.314
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 +8 -0
- package/dashboard/js/command-center.js +14 -7
- package/dashboard/js/render-prs.js +1 -1
- package/engine/ado.js +13 -0
- package/engine/github.js +13 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -72,13 +72,20 @@ function ccRestoreMessages() {
|
|
|
72
72
|
} catch {}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
let _ccSaveDebounce = null;
|
|
75
76
|
function ccSaveState() {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
77
|
+
// Trim in-memory array to prevent unbounded growth
|
|
78
|
+
if (_ccMessages.length > 100) _ccMessages = _ccMessages.slice(-100);
|
|
79
|
+
// Debounce localStorage writes — no need to serialize on every message during streaming
|
|
80
|
+
if (_ccSaveDebounce) return;
|
|
81
|
+
_ccSaveDebounce = setTimeout(() => {
|
|
82
|
+
_ccSaveDebounce = null;
|
|
83
|
+
try {
|
|
84
|
+
if (_ccSessionId) localStorage.setItem('cc-session-id', _ccSessionId);
|
|
85
|
+
const toSave = _ccMessages.slice(-30);
|
|
86
|
+
localStorage.setItem('cc-messages', JSON.stringify(toSave));
|
|
87
|
+
} catch { /* localStorage might be full */ }
|
|
88
|
+
}, 500);
|
|
82
89
|
}
|
|
83
90
|
|
|
84
91
|
function ccUpdateSessionIndicator() {
|
|
@@ -104,7 +111,7 @@ function ccAddMessage(role, html, skipSave) {
|
|
|
104
111
|
(isUser ? 'background:var(--blue);color:#fff;align-self:flex-end' : 'background:var(--surface2);color:var(--text);align-self:flex-start;border:1px solid var(--border);position:relative');
|
|
105
112
|
div.innerHTML = (isAssistant && !html.includes('color:var(--red)') && !html.includes('cc-queued-pill') ? llmCopyBtn() : '') + html;
|
|
106
113
|
el.appendChild(div);
|
|
107
|
-
el.scrollTop = el.scrollHeight;
|
|
114
|
+
requestAnimationFrame(() => { el.scrollTop = el.scrollHeight; });
|
|
108
115
|
if (!skipSave) {
|
|
109
116
|
_ccMessages.push({ role, html });
|
|
110
117
|
ccSaveState();
|
|
@@ -24,7 +24,7 @@ function prRow(pr) {
|
|
|
24
24
|
'<td><span class="pr-agent">' + escHtml(pr.agent || '—') + '</span></td>' +
|
|
25
25
|
'<td><span class="pr-branch">' + escHtml(pr.branch || '—') + '</span></td>' +
|
|
26
26
|
'<td><span class="pr-badge ' + reviewClass + '">' + escHtml(reviewLabel) + '</span></td>' +
|
|
27
|
-
'<td>' + (sq.reviewer && sq.status !== 'waiting' ? '<span class="pr-agent" title="' + escHtml(sq.note || '') + '">' + escHtml(sq.reviewer) + '</span>' : sq.reviewer && sq.status === 'waiting' ? '<span class="pr-agent" style="color:var(--muted)" title="Vote pending confirmation">' + escHtml(sq.reviewer) + '…</span>' : '<span style="color:var(--muted);font-size:11px">—</span>') + '</td>' +
|
|
27
|
+
'<td>' + (sq.reviewer && sq.status !== 'waiting' ? '<span class="pr-agent" title="' + escHtml(sq.note || '') + '">' + escHtml(sq.reviewer) + '</span>' : sq.reviewer && sq.status === 'waiting' ? '<span class="pr-agent" style="color:var(--muted)" title="Vote pending confirmation">' + escHtml(sq.reviewer) + '…</span>' : pr.reviewedBy && pr.reviewedBy.length ? '<span class="pr-agent">' + escHtml(pr.reviewedBy.join(', ')) + '</span>' : '<span style="color:var(--muted);font-size:11px">—</span>') + '</td>' +
|
|
28
28
|
'<td><span class="pr-badge ' + buildClass + '">' + escHtml(buildLabel) + '</span></td>' +
|
|
29
29
|
'<td><span class="pr-badge ' + statusClass + '">' + escHtml(statusLabel) + '</span></td>' +
|
|
30
30
|
'<td><span class="pr-date">' + escHtml(pr.created || '—') + '</span></td>' +
|
package/engine/ado.js
CHANGED
|
@@ -151,6 +151,19 @@ async function pollPrStatus(config) {
|
|
|
151
151
|
else newReviewStatus = 'pending';
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
+
// Store human reviewer names who approved or requested changes
|
|
155
|
+
const reviewedBy = reviewers
|
|
156
|
+
.filter(r => r.vote >= 5 || r.vote === -10)
|
|
157
|
+
.map(r => r.displayName)
|
|
158
|
+
.filter(Boolean);
|
|
159
|
+
// Fallback: if PR was merged and no decisive votes, use completedBy
|
|
160
|
+
if (!reviewedBy.length && newStatus === 'merged' && prData.closedBy?.displayName) {
|
|
161
|
+
reviewedBy.push(prData.closedBy.displayName);
|
|
162
|
+
}
|
|
163
|
+
if (JSON.stringify(pr.reviewedBy || []) !== JSON.stringify(reviewedBy)) {
|
|
164
|
+
pr.reviewedBy = reviewedBy; updated = true;
|
|
165
|
+
}
|
|
166
|
+
|
|
154
167
|
if (pr.reviewStatus !== newReviewStatus) {
|
|
155
168
|
log('info', `PR ${pr.id} reviewStatus: ${pr.reviewStatus} → ${newReviewStatus}`);
|
|
156
169
|
pr.reviewStatus = newReviewStatus;
|
package/engine/github.js
CHANGED
|
@@ -154,6 +154,19 @@ async function pollPrStatus(config) {
|
|
|
154
154
|
}
|
|
155
155
|
const states = [...latestByUser.values()];
|
|
156
156
|
|
|
157
|
+
// Store human reviewer names who approved or requested changes
|
|
158
|
+
const reviewedBy = [...latestByUser.entries()]
|
|
159
|
+
.filter(([, state]) => state === 'APPROVED' || state === 'CHANGES_REQUESTED')
|
|
160
|
+
.map(([user]) => user)
|
|
161
|
+
.filter(Boolean);
|
|
162
|
+
// Fallback: if PR was merged and no decisive reviews, use merged_by
|
|
163
|
+
if (!reviewedBy.length && prData.merged && prData.merged_by?.login) {
|
|
164
|
+
reviewedBy.push(prData.merged_by.login);
|
|
165
|
+
}
|
|
166
|
+
if (JSON.stringify(pr.reviewedBy || []) !== JSON.stringify(reviewedBy)) {
|
|
167
|
+
pr.reviewedBy = reviewedBy; updated = true;
|
|
168
|
+
}
|
|
169
|
+
|
|
157
170
|
let newReviewStatus = pr.reviewStatus || 'pending';
|
|
158
171
|
if (states.some(s => s === 'CHANGES_REQUESTED')) newReviewStatus = 'changes-requested';
|
|
159
172
|
else if (states.some(s => s === 'APPROVED')) newReviewStatus = 'approved';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.314",
|
|
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"
|