@yemi33/minions 0.1.595 → 0.1.597

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.597 (2026-04-08)
4
+
5
+ ### Features
6
+ - per-type max-turns configurable from settings page
7
+
8
+ ### Fixes
9
+ - filter test categories from LLM Call Performance tile
10
+
3
11
  ## 0.1.595 (2026-04-08)
4
12
 
5
13
  ### Features
@@ -102,7 +102,7 @@ function renderLlmPerf(metrics) {
102
102
  return;
103
103
  }
104
104
  let html = '<table class="pr-table"><thead><tr><th>Call Type</th><th>Calls</th><th>Total Time</th><th>Avg Time</th><th>Cost</th></tr></thead><tbody>';
105
- const entries = Object.entries(engine).sort((a, b) => (b[1].calls || 0) - (a[1].calls || 0));
105
+ const entries = Object.entries(engine).filter(([k]) => !k.startsWith('test')).sort((a, b) => (b[1].calls || 0) - (a[1].calls || 0));
106
106
  for (const [type, m] of entries) {
107
107
  const calls = m.calls || 0;
108
108
  const totalMs = m.totalDurationMs || 0;
@@ -55,6 +55,20 @@ async function openSettings() {
55
55
  settingsField('Version Check Interval', 'set-versionCheckInterval', e.versionCheckInterval || 3600000, 'ms', 'How often to check npm for updates (default: 1 hour)') +
56
56
  '</div>' +
57
57
 
58
+ '<h3 style="font-size:13px;color:var(--blue);margin-bottom:8px">Max Turns by Task Type</h3>' +
59
+ '<div style="font-size:10px;color:var(--muted);margin-bottom:6px">How many tool-use turns each task type gets before forced stop. Blank = built-in default.</div>' +
60
+ '<div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-bottom:16px">' +
61
+ settingsField('Explore', 'set-mt-explore', (e.maxTurnsByType || {}).explore || '', '', 'Default: 30') +
62
+ settingsField('Ask', 'set-mt-ask', (e.maxTurnsByType || {}).ask || '', '', 'Default: 20') +
63
+ settingsField('Review', 'set-mt-review', (e.maxTurnsByType || {}).review || '', '', 'Default: 30') +
64
+ settingsField('Implement', 'set-mt-implement', (e.maxTurnsByType || {}).implement || '', '', 'Default: 75') +
65
+ settingsField('Fix', 'set-mt-fix', (e.maxTurnsByType || {}).fix || '', '', 'Default: 75') +
66
+ settingsField('Test', 'set-mt-test', (e.maxTurnsByType || {}).test || '', '', 'Default: 50') +
67
+ settingsField('Verify', 'set-mt-verify', (e.maxTurnsByType || {}).verify || '', '', 'Default: 100') +
68
+ settingsField('Plan', 'set-mt-plan', (e.maxTurnsByType || {}).plan || '', '', 'Default: 30') +
69
+ settingsField('Decompose', 'set-mt-decompose', (e.maxTurnsByType || {}).decompose || '', '', 'Default: 15') +
70
+ '</div>' +
71
+
58
72
  '<h3 style="font-size:13px;color:var(--blue);margin-bottom:8px">Command Center / Doc Chat</h3>' +
59
73
  '<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:16px">' +
60
74
  '<div>' +
@@ -197,6 +211,15 @@ async function saveSettings() {
197
211
  versionCheckInterval: document.getElementById('set-versionCheckInterval').value,
198
212
  ccModel: document.getElementById('set-ccModel').value,
199
213
  ccEffort: document.getElementById('set-ccEffort').value || null,
214
+ maxTurnsByType: (function() {
215
+ var mbt = {};
216
+ var types = ['explore', 'ask', 'review', 'implement', 'fix', 'test', 'verify', 'plan', 'decompose'];
217
+ for (var i = 0; i < types.length; i++) {
218
+ var v = document.getElementById('set-mt-' + types[i])?.value?.trim();
219
+ if (v) mbt[types[i]] = Number(v);
220
+ }
221
+ return mbt;
222
+ })(),
200
223
  };
201
224
 
202
225
  const claudePayload = {
package/dashboard.js CHANGED
@@ -3470,6 +3470,15 @@ What would you like to discuss or change? When you're happy, say "approve" and I
3470
3470
  const valid = [null, 'low', 'medium', 'high'];
3471
3471
  config.engine.ccEffort = valid.includes(e.ccEffort) ? e.ccEffort : null;
3472
3472
  }
3473
+ // Per-type max turns
3474
+ if (e.maxTurnsByType !== undefined && typeof e.maxTurnsByType === 'object') {
3475
+ const mbt = {};
3476
+ for (const [type, val] of Object.entries(e.maxTurnsByType)) {
3477
+ const n = Number(val);
3478
+ if (n && n >= 5 && n <= 500) mbt[type] = n;
3479
+ }
3480
+ config.engine.maxTurnsByType = mbt;
3481
+ }
3473
3482
  // Boolean fields
3474
3483
  for (const key of ['autoApprovePlans', 'evalLoop', 'autoDecompose', 'allowTempAgents']) {
3475
3484
  if (e[key] !== undefined) config.engine[key] = !!e[key];
package/engine.js CHANGED
@@ -155,9 +155,11 @@ const _MAX_TURNS_BY_TYPE = {
155
155
  [WORK_TYPE.TEST]: 50, [WORK_TYPE.VERIFY]: 100, [WORK_TYPE.DOCS]: 30,
156
156
  };
157
157
  function _maxTurnsForType(type, engineConfig) {
158
- // Per-type defaults apply unless user explicitly set a custom maxTurns (different from engine default)
159
- const userOverride = engineConfig.maxTurns && engineConfig.maxTurns !== DEFAULTS.maxTurns ? engineConfig.maxTurns : null;
160
- return userOverride || _MAX_TURNS_BY_TYPE[type] || DEFAULTS.maxTurns;
158
+ // Priority: per-type config override global config override built-in per-type default global default
159
+ const perType = engineConfig.maxTurnsByType || {};
160
+ if (perType[type]) return perType[type];
161
+ const globalOverride = engineConfig.maxTurns && engineConfig.maxTurns !== DEFAULTS.maxTurns ? engineConfig.maxTurns : null;
162
+ return globalOverride || _MAX_TURNS_BY_TYPE[type] || DEFAULTS.maxTurns;
161
163
  }
162
164
 
163
165
  // Resolve dependency plan item IDs to their PR branches
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.595",
3
+ "version": "0.1.597",
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"