@yemi33/minions 0.1.262 → 0.1.264
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 +7 -1
- package/dashboard/js/command-center.js +14 -14
- package/engine/lifecycle.js +3 -3
- package/engine/shared.js +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.264 (2026-04-03)
|
|
4
|
+
|
|
5
|
+
### Fixes
|
|
6
|
+
- clean up remaining evaluate references in comments and log messages
|
|
7
|
+
|
|
8
|
+
## 0.1.263 (2026-04-03)
|
|
4
9
|
|
|
5
10
|
### Features
|
|
6
11
|
- real-time token streaming for CC via partial JSON extraction
|
|
7
12
|
|
|
8
13
|
### Fixes
|
|
14
|
+
- all CC messages go through ccAddMessage — no more duplicated styling
|
|
9
15
|
- streaming CC done event includes copy button matching ccAddMessage
|
|
10
16
|
- streaming CC message bubble matches ccAddMessage styling
|
|
11
17
|
- CC stream clears ccInFlight on client disconnect + defensive thinking.remove
|
|
@@ -190,14 +190,13 @@ async function _ccDoSend(message, skipUserMsg) {
|
|
|
190
190
|
return;
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
-
//
|
|
193
|
+
// Use a temporary streaming div for live updates, then replace with ccAddMessage on completion
|
|
194
194
|
clearInterval(ccTimer);
|
|
195
195
|
try { thinking.remove(); } catch { /* may already be removed */ }
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
streamDiv
|
|
200
|
-
document.getElementById('cc-messages').appendChild(streamDiv);
|
|
196
|
+
// Add a temporary placeholder via ccAddMessage so it gets proper styling
|
|
197
|
+
ccAddMessage('assistant', '<span style="color:var(--muted);font-size:11px">Thinking...</span>', true);
|
|
198
|
+
const msgs = document.getElementById('cc-messages');
|
|
199
|
+
const streamDiv = msgs.lastElementChild; // the message we just added
|
|
201
200
|
let streamedText = '';
|
|
202
201
|
|
|
203
202
|
const reader = res.body.getReader();
|
|
@@ -215,23 +214,24 @@ async function _ccDoSend(message, skipUserMsg) {
|
|
|
215
214
|
try {
|
|
216
215
|
const evt = JSON.parse(line.slice(6));
|
|
217
216
|
if (evt.type === 'chunk') {
|
|
218
|
-
streamedText = evt.text;
|
|
217
|
+
streamedText = evt.text;
|
|
219
218
|
streamDiv.innerHTML = renderMd(streamedText);
|
|
220
|
-
const msgs = document.getElementById('cc-messages');
|
|
221
219
|
if (msgs.scrollHeight - msgs.scrollTop - msgs.clientHeight < 150) msgs.scrollTop = msgs.scrollHeight;
|
|
222
220
|
} else if (evt.type === 'done') {
|
|
223
|
-
//
|
|
221
|
+
// Replace streaming div with a proper ccAddMessage
|
|
222
|
+
streamDiv.remove();
|
|
223
|
+
_ccMessages.pop(); // remove the placeholder we pushed
|
|
224
224
|
const ccElapsed = Math.round((Date.now() - ccStartTime) / 1000);
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
'<div style="font-size:9px;color:var(--muted);margin-top:6px;display:flex;justify-content:flex-end;padding-right:30px">' + ccElapsed + 's</div>';
|
|
228
|
-
_ccMessages.push({ role: 'assistant', html: streamDiv.innerHTML });
|
|
225
|
+
const rendered = renderMd(evt.text || streamedText || '');
|
|
226
|
+
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>');
|
|
229
227
|
if (evt.sessionId) { _ccSessionId = evt.sessionId; ccSaveState(); ccUpdateSessionIndicator(); }
|
|
230
228
|
if (evt.actions && evt.actions.length > 0) {
|
|
231
229
|
for (const action of evt.actions) { await ccExecuteAction(action); }
|
|
232
230
|
}
|
|
233
231
|
} else if (evt.type === 'error') {
|
|
234
|
-
streamDiv.
|
|
232
|
+
streamDiv.remove();
|
|
233
|
+
_ccMessages.pop();
|
|
234
|
+
ccAddMessage('assistant', '<span style="color:var(--red)">' + escHtml(evt.error) + '</span>');
|
|
235
235
|
}
|
|
236
236
|
} catch { /* incomplete JSON */ }
|
|
237
237
|
}
|
package/engine/lifecycle.js
CHANGED
|
@@ -1075,7 +1075,7 @@ function resolveWiPath(meta) {
|
|
|
1075
1075
|
}
|
|
1076
1076
|
|
|
1077
1077
|
/**
|
|
1078
|
-
* Parse structured eval verdict from
|
|
1078
|
+
* Parse structured eval verdict from review agent output.
|
|
1079
1079
|
* Looks for a JSON block with { pass, build, tests, criteria_met, criteria_failed, feedback }.
|
|
1080
1080
|
* Returns parsed object or null if not found.
|
|
1081
1081
|
*/
|
|
@@ -1256,7 +1256,7 @@ function runPostCompletionHooks(dispatchItem, agentId, code, stdout, config) {
|
|
|
1256
1256
|
|
|
1257
1257
|
if (isSuccess && meta?.item?.id && !skipDoneStatus) updateWorkItemStatus(meta, 'done', '');
|
|
1258
1258
|
|
|
1259
|
-
// Auto-dispatch
|
|
1259
|
+
// Auto-dispatch review work item after implement or fix completes successfully
|
|
1260
1260
|
if (isSuccess && !skipDoneStatus && (type === 'implement' || (type === 'fix' && meta?.item?._evalParentId)) && meta?.item?.id) {
|
|
1261
1261
|
const evalLoop = config.engine?.evalLoop ?? shared.ENGINE_DEFAULTS.evalLoop;
|
|
1262
1262
|
if (evalLoop) {
|
|
@@ -1269,7 +1269,7 @@ function runPostCompletionHooks(dispatchItem, agentId, code, stdout, config) {
|
|
|
1269
1269
|
// Dedup: skip if a review item already exists for this parent
|
|
1270
1270
|
const existing = items.find(i => i._evalParentId === evalTargetId && i.type === 'review' && i.status === 'pending');
|
|
1271
1271
|
if (existing) {
|
|
1272
|
-
log('info', `Eval loop:
|
|
1272
|
+
log('info', `Eval loop: review item ${existing.id} already exists for ${evalTargetId}, skipping`);
|
|
1273
1273
|
return items;
|
|
1274
1274
|
}
|
|
1275
1275
|
const parentItem = items.find(i => i.id === evalTargetId);
|
package/engine/shared.js
CHANGED
|
@@ -356,8 +356,8 @@ const ENGINE_DEFAULTS = {
|
|
|
356
356
|
autoApprovePlans: false, // auto-approve PRDs without waiting for human approval
|
|
357
357
|
autoReview: true, // auto-dispatch review agents for new PRs (disable for manual review workflow)
|
|
358
358
|
meetingRoundTimeout: 600000, // 10min per meeting round before auto-advance
|
|
359
|
-
evalLoop: true, // enable
|
|
360
|
-
evalMaxIterations: 3, // max
|
|
359
|
+
evalLoop: true, // enable review→fix loop after implementation completes
|
|
360
|
+
evalMaxIterations: 3, // max review→fix cycles before escalating to human
|
|
361
361
|
evalMaxCost: null, // USD ceiling per work item across all eval iterations; null = no limit (gather baseline data first)
|
|
362
362
|
};
|
|
363
363
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yemi33/minions",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.264",
|
|
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"
|