@yemi33/minions 0.1.263 → 0.1.265
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 +3 -0
- package/dashboard.js +3 -0
- package/engine/lifecycle.js +3 -3
- package/engine/llm.js +15 -12
- package/engine/shared.js +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.1.265 (2026-04-03)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
- CC streaming shows tool use activity during multi-turn responses
|
|
7
|
+
|
|
8
|
+
### Fixes
|
|
9
|
+
- clean up remaining evaluate references in comments and log messages
|
|
10
|
+
|
|
3
11
|
## 0.1.263 (2026-04-03)
|
|
4
12
|
|
|
5
13
|
### Features
|
|
@@ -217,6 +217,9 @@ async function _ccDoSend(message, skipUserMsg) {
|
|
|
217
217
|
streamedText = evt.text;
|
|
218
218
|
streamDiv.innerHTML = renderMd(streamedText);
|
|
219
219
|
if (msgs.scrollHeight - msgs.scrollTop - msgs.clientHeight < 150) msgs.scrollTop = msgs.scrollHeight;
|
|
220
|
+
} else if (evt.type === 'tool') {
|
|
221
|
+
streamDiv.innerHTML = '<span style="color:var(--blue);font-size:11px">\uD83D\uDD27 Using ' + escHtml(evt.name) + '...</span>';
|
|
222
|
+
if (msgs.scrollHeight - msgs.scrollTop - msgs.clientHeight < 150) msgs.scrollTop = msgs.scrollHeight;
|
|
220
223
|
} else if (evt.type === 'done') {
|
|
221
224
|
// Replace streaming div with a proper ccAddMessage
|
|
222
225
|
streamDiv.remove();
|
package/dashboard.js
CHANGED
|
@@ -3013,6 +3013,9 @@ What would you like to discuss or change? When you're happy, say "approve" and I
|
|
|
3013
3013
|
sessionId,
|
|
3014
3014
|
onChunk: (text) => {
|
|
3015
3015
|
try { res.write('data: ' + JSON.stringify({ type: 'chunk', text }) + '\n\n'); } catch {}
|
|
3016
|
+
},
|
|
3017
|
+
onToolUse: (name, input) => {
|
|
3018
|
+
try { res.write('data: ' + JSON.stringify({ type: 'tool', name, input: typeof input === 'string' ? input.slice(0, 200) : JSON.stringify(input).slice(0, 200) }) + '\n\n'); } catch {}
|
|
3016
3019
|
}
|
|
3017
3020
|
});
|
|
3018
3021
|
trackUsage('command-center', result.usage);
|
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/llm.js
CHANGED
|
@@ -113,7 +113,7 @@ function isResumeSessionStillValid(result) {
|
|
|
113
113
|
* Returns the same result object as callLLM when the process completes.
|
|
114
114
|
* onChunk(text) is called for each assistant text block as it arrives.
|
|
115
115
|
*/
|
|
116
|
-
function callLLMStreaming(promptText, sysPromptText, { timeout = 120000, label = 'llm', model = 'sonnet', maxTurns = 1, allowedTools = '', sessionId = null, onChunk = () => {} } = {}) {
|
|
116
|
+
function callLLMStreaming(promptText, sysPromptText, { timeout = 120000, label = 'llm', model = 'sonnet', maxTurns = 1, allowedTools = '', sessionId = null, onChunk = () => {}, onToolUse = null } = {}) {
|
|
117
117
|
return new Promise((resolve) => {
|
|
118
118
|
const id = uid();
|
|
119
119
|
const tmpDir = path.join(ENGINE_DIR, 'tmp');
|
|
@@ -162,18 +162,21 @@ function callLLMStreaming(promptText, sysPromptText, { timeout = 120000, label =
|
|
|
162
162
|
}
|
|
163
163
|
} catch { /* incomplete JSON or non-JSON line */ }
|
|
164
164
|
}
|
|
165
|
-
// Also
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
165
|
+
// Also emit tool_use events so the frontend can show "Using tool: Read..."
|
|
166
|
+
for (const line of lines) {
|
|
167
|
+
const trimmed = line.trim();
|
|
168
|
+
if (!trimmed || !trimmed.startsWith('{')) continue;
|
|
169
|
+
try {
|
|
170
|
+
const obj = JSON.parse(trimmed);
|
|
171
|
+
if (obj.type === 'assistant' && obj.message?.content) {
|
|
172
|
+
for (const block of obj.message.content) {
|
|
173
|
+
if (block.type === 'tool_use' && block.name && onToolUse) {
|
|
174
|
+
onToolUse(block.name, block.input);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
174
177
|
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
178
|
+
} catch {}
|
|
179
|
+
}
|
|
177
180
|
});
|
|
178
181
|
proc.stderr.on('data', d => { stderr += d.toString(); });
|
|
179
182
|
|
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.265",
|
|
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"
|