@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 +7 -0
- package/dashboard/js/command-center.js +5 -32
- package/dashboard/js/settings.js +2 -2
- package/dashboard.js +2 -46
- package/docs/deprecated.json +0 -32
- package/engine/ado.js +2 -1
- package/engine/copilot-models.json +1 -1
- package/engine/shared.js +1 -1
- package/engine.js +2 -2
- package/package.json +1 -1
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">✗ ' + label + ': ' + escHtml(result.error) +
|
|
1043
|
+
return '<li class="cc-action-feedback-row cc-action-feedback-error">✗ ' + 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">⚠ ' + label + ': ' + escHtml(result.warning) +
|
|
1046
|
+
return '<li class="cc-action-feedback-row cc-action-feedback-warning">⚠ ' + 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">✓ ' + label + duplicate +
|
|
1050
|
+
return '<li class="cc-action-feedback-row cc-action-feedback-ok">✓ ' + 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 = '✗ ' + escHtml(action.type) + ' failed: ' + escHtml(action._serverError)
|
|
1154
|
-
_ccActionContextSuffix(action._serverContext);
|
|
1128
|
+
status.innerHTML = '✗ ' + 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 = '✓ ' + 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)) {
|
package/dashboard/js/settings.js
CHANGED
|
@@ -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 ??
|
|
118
|
-
settingsField('PR Comments Poll Frequency', 'set-prPollCommentsEvery', e.prPollCommentsEvery ??
|
|
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 =
|
|
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 =
|
|
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
|
|
package/docs/deprecated.json
CHANGED
|
@@ -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
|
-
|
|
516
|
+
targetUrl = failedStatus?.targetUrl || '';
|
|
516
517
|
const buildIdMatch = targetUrl.match(/buildId=(\d+)/);
|
|
517
518
|
if (buildIdMatch) buildId = buildIdMatch[1];
|
|
518
519
|
}
|
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', '
|
|
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
|
|
4430
|
+
Number(config.engine?.prPollStatusEvery) || ENGINE_DEFAULTS.prPollStatusEvery
|
|
4431
4431
|
);
|
|
4432
4432
|
const prPollCommentsEvery = Math.max(
|
|
4433
4433
|
1,
|
|
4434
|
-
Number(config.engine?.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.
|
|
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"
|