@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 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);
@@ -1075,7 +1075,7 @@ function resolveWiPath(meta) {
1075
1075
  }
1076
1076
 
1077
1077
  /**
1078
- * Parse structured eval verdict from evaluate agent output.
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 evaluate work item after implement or fix completes successfully
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: evaluate item ${existing.id} already exists for ${evalTargetId}, skipping`);
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 try to extract partial text from incomplete line buffer (real-time streaming)
166
- // Claude CLI writes large JSON objects incrementally — extract "text":"..." as it grows
167
- try {
168
- const textMatch = lineBuf.match(/"text"\s*:\s*"((?:[^"\\]|\\.)*)$/);
169
- if (textMatch && textMatch[1].length > 20 && textMatch[1] !== lastTextSent) {
170
- // Unescape basic JSON escapes for display
171
- const partial = textMatch[1].replace(/\\n/g, '\n').replace(/\\"/g, '"').replace(/\\\\/g, '\\');
172
- if (partial.length > lastTextSent.length) {
173
- onChunk(partial);
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
- } catch { /* best-effort partial extraction */ }
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 evaluate→fix loop after implementation completes
360
- evalMaxIterations: 3, // max evaluate→fix cycles before escalating to human
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.263",
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"