@yemi33/minions 0.1.1829 → 0.1.1831

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,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.1831 (2026-05-09)
4
+
5
+ ### Features
6
+ - aggressively delete tech debt — drop adoPoll* aliases and permissionMode preflight warning (#2285)
7
+ - hoist targetUrl in fetchAdoBuildErrorLog to avoid ReferenceError (#2284)
8
+ - revert CC action-result Context: suffix (#2283)
9
+
3
10
  ## 0.1.1829 (2026-05-09)
4
11
 
5
12
  ### Fixes
@@ -1039,16 +1039,15 @@ function _ccActionResultLine(action, result) {
1039
1039
  var type = _ccActionResultType(action, result);
1040
1040
  var subject = _ccActionResultSubject(action, result);
1041
1041
  var label = escHtml(type) + (subject ? ' <strong>' + escHtml(subject) + '</strong>' : '');
1042
- var contextSuffix = result && result.actionContext ? _ccActionContextSuffix(result.actionContext) : '';
1043
1042
  if (result && result.error) {
1044
- return '<li class="cc-action-feedback-row cc-action-feedback-error">&#10007; ' + label + ': ' + escHtml(result.error) + contextSuffix + '</li>';
1043
+ return '<li class="cc-action-feedback-row cc-action-feedback-error">&#10007; ' + label + ': ' + escHtml(result.error) + '</li>';
1045
1044
  }
1046
1045
  if (result && result.warning) {
1047
- return '<li class="cc-action-feedback-row cc-action-feedback-warning">&#9888; ' + label + ': ' + escHtml(result.warning) + contextSuffix + '</li>';
1046
+ return '<li class="cc-action-feedback-row cc-action-feedback-warning">&#9888; ' + label + ': ' + escHtml(result.warning) + '</li>';
1048
1047
  }
1049
1048
  if (result && result.ok) {
1050
1049
  var duplicate = result.duplicate ? ' <span style="color:var(--orange)">already exists</span>' : '';
1051
- return '<li class="cc-action-feedback-row cc-action-feedback-ok">&#10003; ' + label + duplicate + contextSuffix + '</li>';
1050
+ return '<li class="cc-action-feedback-row cc-action-feedback-ok">&#10003; ' + label + duplicate + '</li>';
1052
1051
  }
1053
1052
  return '';
1054
1053
  }
@@ -1098,28 +1097,6 @@ function _ccRunServerActionSideEffects(action) {
1098
1097
  refresh();
1099
1098
  }
1100
1099
 
1101
- var CC_ACTION_CONTEXT_STALE_MS = 2 * 60 * 1000;
1102
- function _ccActionContextIsStale(ctx, nowMs) {
1103
- if (!ctx || !ctx.requestedAt) return false;
1104
- var ts = Date.parse(ctx.requestedAt);
1105
- if (!Number.isFinite(ts)) return false;
1106
- var now = Number.isFinite(nowMs) ? nowMs : Date.now();
1107
- return now - ts > CC_ACTION_CONTEXT_STALE_MS;
1108
- }
1109
-
1110
- function _ccActionContextSuffix(ctx, nowMs) {
1111
- if (!ctx || typeof ctx !== 'object') return '';
1112
- var parts = [];
1113
- if (ctx.title) parts.push('action "' + escHtml(ctx.title) + '"');
1114
- if (ctx.request) parts.push('request "' + escHtml(ctx.request) + '"');
1115
- if (ctx.requestedAt) parts.push('started ' + escHtml(ctx.requestedAt));
1116
- if (parts.length === 0) return '';
1117
- var stale = _ccActionContextIsStale(ctx, nowMs)
1118
- ? ' <strong style="color:var(--orange)">possibly stale</strong>'
1119
- : '';
1120
- return '<div style="font-size:10px;color:var(--muted);margin-top:2px">Context: ' + parts.join(' | ') + stale + '</div>';
1121
- }
1122
-
1123
1100
  // Tag actions that the server already executed so ccExecuteAction skips the API call
1124
1101
  function _tagServerExecuted(actions, actionResults) {
1125
1102
  if (!actionResults || !Array.isArray(actionResults)) return;
@@ -1130,12 +1107,10 @@ function _tagServerExecuted(actions, actionResults) {
1130
1107
  if (r.id) actions[i]._serverId = r.id;
1131
1108
  if (r.warning) actions[i]._serverWarning = r.warning;
1132
1109
  if (r.duplicate) actions[i]._serverDuplicate = true;
1133
- if (r.actionContext) actions[i]._serverContext = r.actionContext;
1134
1110
  if (r.reusedFromAction !== undefined) actions[i]._serverHidden = true;
1135
1111
  } else if (r && r.error) {
1136
1112
  actions[i]._serverExecuted = true;
1137
1113
  actions[i]._serverError = r.error;
1138
- if (r.actionContext) actions[i]._serverContext = r.actionContext;
1139
1114
  }
1140
1115
  // clientExecuted: false means server didn't handle it — frontend must execute
1141
1116
  }
@@ -1150,8 +1125,7 @@ async function ccExecuteAction(action, targetTabId, opts) {
1150
1125
  if (action._serverExecuted) {
1151
1126
  if (action._serverHidden) return;
1152
1127
  if (action._serverError) {
1153
- status.innerHTML = '&#10007; ' + escHtml(action.type) + ' failed: ' + escHtml(action._serverError) +
1154
- _ccActionContextSuffix(action._serverContext);
1128
+ status.innerHTML = '&#10007; ' + escHtml(action.type) + ' failed: ' + escHtml(action._serverError);
1155
1129
  status.style.color = 'var(--red)';
1156
1130
  } else {
1157
1131
  var label = action._serverId ? escHtml(action._serverId) : escHtml(action.title || action.type);
@@ -1159,8 +1133,7 @@ async function ccExecuteAction(action, targetTabId, opts) {
1159
1133
  var successLabel = serverActionType === 'dispatch' ? 'Dispatched' : serverActionType;
1160
1134
  status.innerHTML = '&#10003; ' + escHtml(successLabel) + ': <strong>' + label + '</strong>' +
1161
1135
  (action._serverDuplicate ? '<div style="font-size:10px;color:var(--orange);margin-top:2px">Already existed from a previous request; no duplicate work item was created.</div>' : '') +
1162
- (action._serverWarning ? '<div style="font-size:10px;color:var(--muted);margin-top:2px">' + escHtml(action._serverWarning) + '</div>' : '') +
1163
- _ccActionContextSuffix(action._serverContext);
1136
+ (action._serverWarning ? '<div style="font-size:10px;color:var(--muted);margin-top:2px">' + escHtml(action._serverWarning) + '</div>' : '');
1164
1137
  status.style.color = 'var(--green)';
1165
1138
  }
1166
1139
  if (opts && opts.originMessageId && _ccAppendHtmlToMessage(targetTabId || _ccActiveTabId, opts.originMessageId, status.outerHTML)) {
@@ -114,8 +114,8 @@ async function openSettings() {
114
114
  settingsToggle('Auto-fix Human Comments', 'set-autoFixHumanComments', e.autoFixHumanComments !== false, 'Shared dispatch gate: fix agent for actionable human PR comments; also requires that PR provider polling is enabled') +
115
115
  '</div>' +
116
116
  '<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px">' +
117
- settingsField('PR Status Poll Frequency', 'set-prPollStatusEvery', e.prPollStatusEvery ?? e.adoPollStatusEvery ?? 12, 'ticks', 'Poll PR build/review/merge status every N ticks for both ADO and GitHub (~12 min at default tick rate)') +
118
- settingsField('PR Comments Poll Frequency', 'set-prPollCommentsEvery', e.prPollCommentsEvery ?? e.adoPollCommentsEvery ?? 12, 'ticks', 'Poll PR human comments every N ticks for both ADO and GitHub (~12 min at default tick rate)') +
117
+ settingsField('PR Status Poll Frequency', 'set-prPollStatusEvery', e.prPollStatusEvery ?? 12, 'ticks', 'Poll PR build/review/merge status every N ticks for both ADO and GitHub (~12 min at default tick rate)') +
118
+ settingsField('PR Comments Poll Frequency', 'set-prPollCommentsEvery', e.prPollCommentsEvery ?? 12, 'ticks', 'Poll PR human comments every N ticks for both ADO and GitHub (~12 min at default tick rate)') +
119
119
  '</div>' +
120
120
  '</div>' +
121
121
 
package/dashboard.js CHANGED
@@ -2281,34 +2281,6 @@ function _actionsWithIntentFallback(actions, opts = {}) {
2281
2281
  return [action];
2282
2282
  }
2283
2283
 
2284
- function _ccActionContextValue(action) {
2285
- if (!action || typeof action !== 'object') return '';
2286
- const candidates = [action.title, action.id, action.file, action.target, action.pr, action.endpoint];
2287
- for (const value of candidates) {
2288
- const cleaned = _ccCleanIntentString(value, 160);
2289
- if (cleaned) return cleaned;
2290
- }
2291
- return '';
2292
- }
2293
-
2294
- function _annotateCCActionResults(actions, actionResults, opts = {}) {
2295
- if (!Array.isArray(actionResults)) return actionResults;
2296
- const requestedAt = _ccCleanIntentString(opts.requestedAt || new Date().toISOString(), 80);
2297
- const request = _ccCleanIntentString(opts.message, 180);
2298
- return actionResults.map((result, idx) => {
2299
- if (!result || typeof result !== 'object') return result;
2300
- const action = Array.isArray(actions) ? normalizeCCAction(actions[idx]) : null;
2301
- const context = {
2302
- type: _ccCleanIntentString(result.type || action?.type || 'action', 80) || 'action',
2303
- };
2304
- const title = _ccActionContextValue(action);
2305
- if (title) context.title = title;
2306
- if (request) context.request = request;
2307
- if (requestedAt) context.requestedAt = requestedAt;
2308
- return { ...result, actionContext: context };
2309
- });
2310
- }
2311
-
2312
2284
  function parseCCActions(text) {
2313
2285
  let actions = [];
2314
2286
  let displayText = stripCCActionsForDisplay(text);
@@ -7312,7 +7284,6 @@ What would you like to discuss or change? When you're happy, say "approve" and I
7312
7284
  try {
7313
7285
  const body = await readBody(req);
7314
7286
  if (!body.message) return jsonReply(res, 400, { error: 'message required' });
7315
- const actionRequestedAt = new Date().toISOString();
7316
7287
 
7317
7288
  // Per-tab concurrency guard
7318
7289
  tabId = body.tabId || 'default';
@@ -7368,11 +7339,7 @@ What would you like to discuss or change? When you're happy, say "approve" and I
7368
7339
  { message: body.message, intentMetadata: body.intentMetadata, source: 'command-center', answerText: parsed.text, toolUses }
7369
7340
  );
7370
7341
  if (parsed.actions.length > 0) {
7371
- parsed.actionResults = _annotateCCActionResults(
7372
- parsed.actions,
7373
- await executeCCActions(parsed.actions),
7374
- { message: body.message, requestedAt: actionRequestedAt }
7375
- );
7342
+ parsed.actionResults = await executeCCActions(parsed.actions);
7376
7343
  parsed.actionResultsAt = new Date().toISOString();
7377
7344
  }
7378
7345
  // Mirror only user-facing text to Teams; never send the internal action block.
@@ -7477,7 +7444,6 @@ What would you like to discuss or change? When you're happy, say "approve" and I
7477
7444
  const body = await readBody(req);
7478
7445
  if (!body.message && !body.reconnect) { res.statusCode = 400; res.end('message required'); return; }
7479
7446
  tabId = body.tabId || 'default';
7480
- const actionRequestedAt = new Date().toISOString();
7481
7447
  if (body.reconnect) {
7482
7448
  const live = _getCcLiveStream(tabId);
7483
7449
  if (!live) { res.statusCode = 409; res.end('No live command-center response to reconnect'); return; }
@@ -7707,11 +7673,7 @@ What would you like to discuss or change? When you're happy, say "approve" and I
7707
7673
  let actionResults;
7708
7674
  let actionResultsAt;
7709
7675
  if (actions.length > 0) {
7710
- actionResults = _annotateCCActionResults(
7711
- actions,
7712
- await executeCCActions(actions),
7713
- { message: body.message, requestedAt: actionRequestedAt }
7714
- );
7676
+ actionResults = await executeCCActions(actions);
7715
7677
  actionResultsAt = new Date().toISOString();
7716
7678
  }
7717
7679
  const donePayload = { type: 'done', text: displayText, actions, actionResults, actionResultsAt, sessionId: responseSessionId, newSession: !wasResume };
@@ -8018,8 +7980,6 @@ What would you like to discuss or change? When you're happy, say "approve" and I
8018
7980
  const config = queries.getConfig();
8019
7981
  const routing = safeRead(path.join(MINIONS_DIR, 'routing.md')) || '';
8020
7982
  const engine = { ...shared.ENGINE_DEFAULTS, ...(config.engine || {}) };
8021
- if (engine.prPollStatusEvery === undefined && engine.adoPollStatusEvery !== undefined) engine.prPollStatusEvery = engine.adoPollStatusEvery;
8022
- if (engine.prPollCommentsEvery === undefined && engine.adoPollCommentsEvery !== undefined) engine.prPollCommentsEvery = engine.adoPollCommentsEvery;
8023
7983
  return jsonReply(res, 200, {
8024
7984
  engine,
8025
7985
  claude: settingsClaudeConfig(config),
@@ -8071,8 +8031,6 @@ What would you like to discuss or change? When you're happy, say "approve" and I
8071
8031
  if (body.engine) {
8072
8032
  const e = body.engine;
8073
8033
  const D = shared.ENGINE_DEFAULTS;
8074
- if (e.prPollStatusEvery === undefined && e.adoPollStatusEvery !== undefined) e.prPollStatusEvery = e.adoPollStatusEvery;
8075
- if (e.prPollCommentsEvery === undefined && e.adoPollCommentsEvery !== undefined) e.prPollCommentsEvery = e.adoPollCommentsEvery;
8076
8034
  // Numeric fields: { key: [min, max?] }
8077
8035
  const numericFields = {
8078
8036
  tickInterval: [10000], maxConcurrent: [1, 50], inboxConsolidateThreshold: [1],
@@ -8095,8 +8053,6 @@ What would you like to discuss or change? When you're happy, say "approve" and I
8095
8053
  _setEngineConfig(key, val);
8096
8054
  }
8097
8055
  }
8098
- _deleteEngineConfig('adoPollStatusEvery');
8099
- _deleteEngineConfig('adoPollCommentsEvery');
8100
8056
  // String fields
8101
8057
  if (e.worktreeRoot !== undefined) _setEngineConfig('worktreeRoot', String(e.worktreeRoot || D.worktreeRoot));
8102
8058
 
@@ -1,36 +1,4 @@
1
1
  [
2
- {
3
- "id": "evaluate-work-type",
4
- "summary": "evaluate work type removed — eval loop uses review exclusively",
5
- "deprecated": "2026-04-02",
6
- "reason": "Consolidated into review + evalLoop config. No separate evaluate dispatch.",
7
- "locations": ["routing.md: evaluate row removed", "CLAUDE.md: evaluate references removed"],
8
- "cleanup": "Already cleaned — routing.md and CLAUDE.md updated 2026-04-02"
9
- },
10
- {
11
- "id": "autoReview-flag",
12
- "summary": "autoReview ENGINE_DEFAULT consolidated into evalLoop",
13
- "deprecated": "2026-04-15",
14
- "reason": "Redundant with evalLoop; evalLoop is the single gate for the review+fix cycle",
15
- "locations": ["engine/shared.js ENGINE_DEFAULTS.autoReview", "engine.js discoverFromPrs autoReview variable"],
16
- "cleanup": "Removed from ENGINE_DEFAULTS, removed autoReview variable from engine.js, replaced with reviewEnabled = evalLoopEnabled && pollEnabled"
17
- },
18
- {
19
- "id": "ado-poll-frequency-keys",
20
- "summary": "adoPollStatusEvery and adoPollCommentsEvery renamed to prPollStatusEvery and prPollCommentsEvery",
21
- "deprecated": "2026-04-16",
22
- "reason": "These cadence settings gate both ADO and GitHub PR polling, so the ADO-prefixed names are misleading.",
23
- "locations": ["engine.js read-side fallback from config.engine.adoPollStatusEvery/adoPollCommentsEvery", "dashboard.js handleSettingsRead/handleSettingsUpdate alias fallback for old keys"],
24
- "cleanup": "Remove the adoPoll* alias fallback reads after existing configs have been migrated to prPollStatusEvery/prPollCommentsEvery."
25
- },
26
- {
27
- "id": "config-claude-permission-mode",
28
- "summary": "config.claude.permissionMode ignored; runtime adapters own permission bypass flags",
29
- "deprecated": "2026-05-04",
30
- "reason": "Claude and Copilot require different non-interactive bypass flags, so a shared Claude config field was misleading and no longer controls spawns.",
31
- "locations": ["dashboard.js settings update strips config.claude.permissionMode", "dashboard/js/settings.js no longer renders a Permission Mode selector"],
32
- "cleanup": "After old configs have been rewritten through settings, remove the deprecated-field preflight warning entry for permissionMode."
33
- },
34
2
  {
35
3
  "id": "project-local-minions-state",
36
4
  "summary": "Project-local .minions directories are migrated to central projects/<name>/ state and removed",
package/engine/ado.js CHANGED
@@ -511,8 +511,9 @@ async function fetchAdoBuildErrorLog(orgBase, project, failedStatus, token, pr,
511
511
  try {
512
512
  // Use pre-resolved buildId if available (from builds API query), else parse from targetUrl
513
513
  let buildId = failedStatus?._buildId || null;
514
+ let targetUrl = '';
514
515
  if (!buildId) {
515
- const targetUrl = failedStatus?.targetUrl || '';
516
+ targetUrl = failedStatus?.targetUrl || '';
516
517
  const buildIdMatch = targetUrl.match(/buildId=(\d+)/);
517
518
  if (buildIdMatch) buildId = buildIdMatch[1];
518
519
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "runtime": "copilot",
3
3
  "models": null,
4
- "cachedAt": "2026-05-09T23:39:05.707Z"
4
+ "cachedAt": "2026-05-09T23:56:38.102Z"
5
5
  }
package/engine/shared.js CHANGED
@@ -1143,7 +1143,7 @@ const ENGINE_DEFAULTS = {
1143
1143
  // Backward-compat: keep `engine.claude.*` field family deprecation tracker. Listed here so preflight
1144
1144
  // knows which subkeys to flag as deprecated. Do not consume `claude.*` in new code — use the runtime
1145
1145
  // adapter system (engine/runtimes/) and the resolveAgent*/resolveCc* helpers instead.
1146
- _deprecatedConfigClaudeFields: ['binary', 'outputFormat', 'allowedTools', 'permissionMode', 'maxTurns', 'effort', 'budgetCap'],
1146
+ _deprecatedConfigClaudeFields: ['binary', 'outputFormat', 'allowedTools', 'maxTurns', 'effort', 'budgetCap'],
1147
1147
  // Teams integration — config.teams shape: { enabled, appId, appPassword, certPath, privateKeyPath, tenantId, notifyEvents, ccMirror, inboxPollInterval }
1148
1148
  // Auth modes: (1) appId + appPassword (client secret), or (2) appId + certPath + privateKeyPath + tenantId (certificate)
1149
1149
  teams: {
package/engine.js CHANGED
@@ -4427,11 +4427,11 @@ async function tickInner() {
4427
4427
  const ghPollEnabled = config.engine?.ghPollEnabled ?? ENGINE_DEFAULTS.ghPollEnabled;
4428
4428
  const prPollStatusEvery = Math.max(
4429
4429
  1,
4430
- Number(config.engine?.prPollStatusEvery ?? config.engine?.adoPollStatusEvery) || ENGINE_DEFAULTS.prPollStatusEvery
4430
+ Number(config.engine?.prPollStatusEvery) || ENGINE_DEFAULTS.prPollStatusEvery
4431
4431
  );
4432
4432
  const prPollCommentsEvery = Math.max(
4433
4433
  1,
4434
- Number(config.engine?.prPollCommentsEvery ?? config.engine?.adoPollCommentsEvery) || ENGINE_DEFAULTS.prPollCommentsEvery
4434
+ Number(config.engine?.prPollCommentsEvery) || ENGINE_DEFAULTS.prPollCommentsEvery
4435
4435
  );
4436
4436
 
4437
4437
  // 2.6. Poll PR status: build, review, merge (every prPollStatusEvery tick-equivalents, default ~12 minutes)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yemi33/minions",
3
- "version": "0.1.1829",
3
+ "version": "0.1.1831",
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"