nexus-agents 9.0.2 → 9.1.0
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/dist/{chunk-3OBOVCFZ.js → chunk-AI4DWDDD.js} +2 -2
- package/dist/{chunk-3OBOVCFZ.js.map → chunk-AI4DWDDD.js.map} +1 -1
- package/dist/{chunk-FSM6ZCVF.js → chunk-BQPQIOEB.js} +2 -2
- package/dist/{chunk-L25VW7RC.js → chunk-IHSX3WQN.js} +3 -3
- package/dist/{chunk-SFILA57C.js → chunk-JHLMYOPG.js} +11 -9
- package/dist/{chunk-SFILA57C.js.map → chunk-JHLMYOPG.js.map} +1 -1
- package/dist/{chunk-EF5FB4QM.js → chunk-RJDZOOPA.js} +2 -2
- package/dist/{chunk-GZHDEMLN.js → chunk-V5CYHQ7H.js} +170 -88
- package/dist/chunk-V5CYHQ7H.js.map +1 -0
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +7 -7
- package/dist/{consensus-vote-THWFSBC7.js → consensus-vote-4NUYMBIC.js} +4 -4
- package/dist/{consensus-vote-types-D2RbRYve.d.ts → consensus-vote-types-B001FCSw.d.ts} +10 -1
- package/dist/{improvement-review-FQRJMLHU.js → improvement-review-J2DWPLWX.js} +4 -4
- package/dist/index.d.ts +5 -3
- package/dist/index.js +6 -6
- package/dist/{setup-data-dir-XCHPJFBD.js → setup-data-dir-CSNTWHYS.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-GZHDEMLN.js.map +0 -1
- /package/dist/{chunk-FSM6ZCVF.js.map → chunk-BQPQIOEB.js.map} +0 -0
- /package/dist/{chunk-L25VW7RC.js.map → chunk-IHSX3WQN.js.map} +0 -0
- /package/dist/{chunk-EF5FB4QM.js.map → chunk-RJDZOOPA.js.map} +0 -0
- /package/dist/{consensus-vote-THWFSBC7.js.map → consensus-vote-4NUYMBIC.js.map} +0 -0
- /package/dist/{improvement-review-FQRJMLHU.js.map → improvement-review-J2DWPLWX.js.map} +0 -0
- /package/dist/{setup-data-dir-XCHPJFBD.js.map → setup-data-dir-CSNTWHYS.js.map} +0 -0
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
getCurrentRequestContext,
|
|
6
6
|
runWithRequestContext,
|
|
7
7
|
serverCallerInfo
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-BQPQIOEB.js";
|
|
9
9
|
import {
|
|
10
10
|
DEFAULT_EXECUTION_MODE
|
|
11
11
|
} from "./chunk-ECJ52NSK.js";
|
|
@@ -2343,4 +2343,4 @@ export {
|
|
|
2343
2343
|
DEFAULT_CONSENSUS_CONFIG,
|
|
2344
2344
|
ConsensusMetricsSchema
|
|
2345
2345
|
};
|
|
2346
|
-
//# sourceMappingURL=chunk-
|
|
2346
|
+
//# sourceMappingURL=chunk-RJDZOOPA.js.map
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
toolSuccess,
|
|
22
22
|
withProgressHeartbeat,
|
|
23
23
|
wrapToolWithTimeout
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-RJDZOOPA.js";
|
|
25
25
|
import {
|
|
26
26
|
getToolMemory
|
|
27
27
|
} from "./chunk-WNVJQ5SC.js";
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
} from "./chunk-EZNIYU5T.js";
|
|
31
31
|
import {
|
|
32
32
|
VERSION
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-BQPQIOEB.js";
|
|
34
34
|
import {
|
|
35
35
|
isGatewayModelAdapter
|
|
36
36
|
} from "./chunk-T5IBXFFY.js";
|
|
@@ -95,6 +95,7 @@ import {
|
|
|
95
95
|
getPipelineEventBus,
|
|
96
96
|
getRandomProvider,
|
|
97
97
|
getTimeProvider,
|
|
98
|
+
hasGatewaySlotCatalog,
|
|
98
99
|
isAuthFailureText,
|
|
99
100
|
isCallerAbortError,
|
|
100
101
|
isCliName,
|
|
@@ -112,6 +113,7 @@ import {
|
|
|
112
113
|
readVoteRecords,
|
|
113
114
|
recordUsageEvent,
|
|
114
115
|
registerPersistentOutcomeStoreFactory,
|
|
116
|
+
resolveGatewayDefault,
|
|
115
117
|
resolveInsideRoot,
|
|
116
118
|
resolveModelIdentitySync,
|
|
117
119
|
resolveVoteRecordsPath,
|
|
@@ -185,85 +187,6 @@ function getDefaultErrorPolicy(strategy) {
|
|
|
185
187
|
return "reduce_denominator";
|
|
186
188
|
}
|
|
187
189
|
|
|
188
|
-
// src/cli/voter-model-overrides.ts
|
|
189
|
-
function voterModelOverrideEnvKey(role) {
|
|
190
|
-
return `NEXUS_VOTER_MODEL_${role.toUpperCase()}`;
|
|
191
|
-
}
|
|
192
|
-
function resolveVoterModelOverrides(roles, gatewayAdapters, logger12) {
|
|
193
|
-
const overrides = /* @__PURE__ */ new Map();
|
|
194
|
-
if (gatewayAdapters.length === 0) return overrides;
|
|
195
|
-
const byId = /* @__PURE__ */ new Map();
|
|
196
|
-
for (const adapter of gatewayAdapters) byId.set(adapter.modelId, adapter);
|
|
197
|
-
for (const role of roles) {
|
|
198
|
-
const envKey = voterModelOverrideEnvKey(role);
|
|
199
|
-
const raw = process.env[envKey];
|
|
200
|
-
if (raw === void 0 || raw.trim() === "") continue;
|
|
201
|
-
const requested = raw.trim();
|
|
202
|
-
const adapter = byId.get(requested) ?? gatewayAdapters.find((a) => a.modelId.toLowerCase() === requested.toLowerCase());
|
|
203
|
-
if (adapter === void 0) {
|
|
204
|
-
logger12.warn(
|
|
205
|
-
`Voter model override ${envKey}="${requested}" is not a discovered gateway model \u2014 falling back to round-robin for role "${role}".`,
|
|
206
|
-
{ role, requested, available: [...byId.keys()] }
|
|
207
|
-
);
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
overrides.set(role, adapter);
|
|
211
|
-
}
|
|
212
|
-
if (overrides.size > 0) {
|
|
213
|
-
logger12.info("Applied per-role voter model overrides (#4055)", {
|
|
214
|
-
overrides: Object.fromEntries([...overrides].map(([r, a]) => [r, a.modelId]))
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
return overrides;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// src/cli/voter-cli-access.ts
|
|
221
|
-
var VOTER_ACCESS_MODE = "read-only-analysis";
|
|
222
|
-
function clisServingVoterSeats(clis, declarationsFor = (cli) => createCliAdapter({ cli })) {
|
|
223
|
-
const serving = [];
|
|
224
|
-
const refused = [];
|
|
225
|
-
for (const cli of clis) {
|
|
226
|
-
const enforces = adapterEnforces(declarationsFor(cli), { accessMode: VOTER_ACCESS_MODE });
|
|
227
|
-
(enforces ? serving : refused).push(cli);
|
|
228
|
-
}
|
|
229
|
-
return { serving, refused };
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// src/cli/voter-fallback.ts
|
|
233
|
-
function bareCliName(id) {
|
|
234
|
-
return id.startsWith("cli-") ? id.slice("cli-".length) : id;
|
|
235
|
-
}
|
|
236
|
-
function classifyFallbackReason(message) {
|
|
237
|
-
if (isDurableCapacityText(message)) return "capacity";
|
|
238
|
-
if (isRateLimitText(message)) return "rate-limit";
|
|
239
|
-
if (classifyExtractedError(message, "unknown").code === "NOT_AUTHENTICATED") return "auth";
|
|
240
|
-
if (UNVERIFIABLE_STDERR_RE.test(message)) return "sandbox";
|
|
241
|
-
if (isTimeoutText(message)) return "timeout";
|
|
242
|
-
return "unknown";
|
|
243
|
-
}
|
|
244
|
-
function detectedModel(adapter) {
|
|
245
|
-
const id = adapter.modelId;
|
|
246
|
-
return typeof id === "string" && id !== "" && id !== UNRESOLVED_MODEL_ID ? id : void 0;
|
|
247
|
-
}
|
|
248
|
-
function assignedCliOf(key) {
|
|
249
|
-
return typeof key === "string" && key !== "" ? bareCliName(key) : void 0;
|
|
250
|
-
}
|
|
251
|
-
function crossCliFallback(assigned, assignedKey, error) {
|
|
252
|
-
const fromModel = detectedModel(assigned);
|
|
253
|
-
return {
|
|
254
|
-
fromCli: assignedCliOf(assignedKey) ?? "unknown",
|
|
255
|
-
...fromModel !== void 0 ? { fromModel } : {},
|
|
256
|
-
reason: classifyFallbackReason(error)
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
function inFamilyFallback(cli, fromModel) {
|
|
260
|
-
return { fromCli: bareCliName(cli), fromModel, reason: "capacity" };
|
|
261
|
-
}
|
|
262
|
-
function withAssignedCli(result, assignedKey) {
|
|
263
|
-
const assignedCli = assignedCliOf(assignedKey);
|
|
264
|
-
return assignedCli === void 0 ? result : { ...result, assignedCli };
|
|
265
|
-
}
|
|
266
|
-
|
|
267
190
|
// src/cli/voter-attempt-events.ts
|
|
268
191
|
import { randomUUID } from "node:crypto";
|
|
269
192
|
function resolveAttemptCollector(context) {
|
|
@@ -382,6 +305,134 @@ function preserveVoterAttemptTelemetry(from, onto) {
|
|
|
382
305
|
return initial === void 0 ? onto : withVoterAttemptTelemetry(onto, () => from.attemptTelemetry ?? initial);
|
|
383
306
|
}
|
|
384
307
|
|
|
308
|
+
// src/cli/voter-model-overrides.ts
|
|
309
|
+
function voterModelOverrideEnvKey(role) {
|
|
310
|
+
return `NEXUS_VOTER_MODEL_${role.toUpperCase()}`;
|
|
311
|
+
}
|
|
312
|
+
function resolveVoterModelOverrides(roles, gatewayAdapters, logger12) {
|
|
313
|
+
const overrides = /* @__PURE__ */ new Map();
|
|
314
|
+
if (gatewayAdapters.length === 0) return overrides;
|
|
315
|
+
const byId = /* @__PURE__ */ new Map();
|
|
316
|
+
for (const adapter of gatewayAdapters) byId.set(adapter.modelId, adapter);
|
|
317
|
+
for (const role of roles) {
|
|
318
|
+
const envKey = voterModelOverrideEnvKey(role);
|
|
319
|
+
const raw = process.env[envKey];
|
|
320
|
+
if (raw === void 0 || raw.trim() === "") continue;
|
|
321
|
+
const requested = raw.trim();
|
|
322
|
+
const adapter = byId.get(requested) ?? gatewayAdapters.find((a) => a.modelId.toLowerCase() === requested.toLowerCase());
|
|
323
|
+
if (adapter === void 0) {
|
|
324
|
+
logger12.warn(
|
|
325
|
+
`Voter model override ${envKey}="${requested}" is not a discovered gateway model \u2014 falling back to round-robin for role "${role}".`,
|
|
326
|
+
{ role, requested, available: [...byId.keys()] }
|
|
327
|
+
);
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
overrides.set(role, adapter);
|
|
331
|
+
}
|
|
332
|
+
if (overrides.size > 0) {
|
|
333
|
+
logger12.info("Applied per-role voter model overrides (#4055)", {
|
|
334
|
+
overrides: Object.fromEntries([...overrides].map(([r, a]) => [r, a.modelId]))
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return overrides;
|
|
338
|
+
}
|
|
339
|
+
function ignoredRolePinReason(requested, options) {
|
|
340
|
+
const gateway = options.gatewayAdapters ?? [];
|
|
341
|
+
if (gateway.length === 0) {
|
|
342
|
+
return hasGatewaySlotCatalog() ? "gateway model dealing is inactive for this panel" : "no gateway active";
|
|
343
|
+
}
|
|
344
|
+
if (options.adapter !== void 0) return "an explicit adapter overrides gateway dealing";
|
|
345
|
+
if (options.roleAdapters !== void 0) return "the roster was assigned before this call";
|
|
346
|
+
if (gateway.length === 1) return "single-model gateway: role pins have no effect";
|
|
347
|
+
if (!gateway.some((a) => a.modelId.toLowerCase() === requested.toLowerCase())) {
|
|
348
|
+
return "not in the gateway catalog; the seat was dealt instead";
|
|
349
|
+
}
|
|
350
|
+
return void 0;
|
|
351
|
+
}
|
|
352
|
+
function ignoredCustomPin(gateway) {
|
|
353
|
+
const requested = process.env["NEXUS_CUSTOM_MODEL"]?.trim();
|
|
354
|
+
if (requested === void 0 || requested === "") return void 0;
|
|
355
|
+
if (gateway.length > 0) {
|
|
356
|
+
if (gateway.some((a) => a.modelId === requested)) return void 0;
|
|
357
|
+
} else {
|
|
358
|
+
const resolved = resolveGatewayDefault();
|
|
359
|
+
if (resolved.kind === "inactive" || resolved.kind === "resolved" && resolved.via === "override") {
|
|
360
|
+
return void 0;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return `NEXUS_CUSTOM_MODEL="${requested}" ignored: not in the gateway catalog`;
|
|
364
|
+
}
|
|
365
|
+
function captureModelPinWarnings(options) {
|
|
366
|
+
const ignored = /* @__PURE__ */ new Map();
|
|
367
|
+
const custom = ignoredCustomPin(options.gatewayAdapters ?? []);
|
|
368
|
+
for (const role of options.roles) {
|
|
369
|
+
const key = voterModelOverrideEnvKey(role);
|
|
370
|
+
const requested = process.env[key]?.trim();
|
|
371
|
+
let roleWarning;
|
|
372
|
+
if (requested !== void 0 && requested !== "") {
|
|
373
|
+
const reason = ignoredRolePinReason(requested, options);
|
|
374
|
+
if (reason !== void 0) roleWarning = `${key}="${requested}" ignored: ${reason}`;
|
|
375
|
+
}
|
|
376
|
+
const warning = [roleWarning, custom].filter((w) => w !== void 0).join("; ");
|
|
377
|
+
if (warning !== "") ignored.set(role, warning);
|
|
378
|
+
}
|
|
379
|
+
return (vote) => {
|
|
380
|
+
const warning = ignored.get(vote.role);
|
|
381
|
+
if (warning === void 0) return vote;
|
|
382
|
+
return preserveVoterAttemptTelemetry(vote, {
|
|
383
|
+
...vote,
|
|
384
|
+
modelPinWarning: `${warning}; role "${vote.role}" assigned model "${vote.pinnedModel ?? "unresolved"}".`
|
|
385
|
+
});
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// src/cli/voter-cli-access.ts
|
|
390
|
+
var VOTER_ACCESS_MODE = "read-only-analysis";
|
|
391
|
+
function clisServingVoterSeats(clis, declarationsFor = (cli) => createCliAdapter({ cli })) {
|
|
392
|
+
const serving = [];
|
|
393
|
+
const refused = [];
|
|
394
|
+
for (const cli of clis) {
|
|
395
|
+
const enforces = adapterEnforces(declarationsFor(cli), { accessMode: VOTER_ACCESS_MODE });
|
|
396
|
+
(enforces ? serving : refused).push(cli);
|
|
397
|
+
}
|
|
398
|
+
return { serving, refused };
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// src/cli/voter-fallback.ts
|
|
402
|
+
function bareCliName(id) {
|
|
403
|
+
return id.startsWith("cli-") ? id.slice("cli-".length) : id;
|
|
404
|
+
}
|
|
405
|
+
function classifyFallbackReason(message) {
|
|
406
|
+
if (isDurableCapacityText(message)) return "capacity";
|
|
407
|
+
if (isRateLimitText(message)) return "rate-limit";
|
|
408
|
+
if (classifyExtractedError(message, "unknown").code === "NOT_AUTHENTICATED") return "auth";
|
|
409
|
+
if (UNVERIFIABLE_STDERR_RE.test(message)) return "sandbox";
|
|
410
|
+
if (isTimeoutText(message)) return "timeout";
|
|
411
|
+
return "unknown";
|
|
412
|
+
}
|
|
413
|
+
function detectedModel(adapter) {
|
|
414
|
+
const id = adapter.modelId;
|
|
415
|
+
return typeof id === "string" && id !== "" && id !== UNRESOLVED_MODEL_ID ? id : void 0;
|
|
416
|
+
}
|
|
417
|
+
function assignedCliOf(key) {
|
|
418
|
+
return typeof key === "string" && key !== "" ? bareCliName(key) : void 0;
|
|
419
|
+
}
|
|
420
|
+
function crossCliFallback(assigned, assignedKey, error) {
|
|
421
|
+
const fromModel = detectedModel(assigned);
|
|
422
|
+
return {
|
|
423
|
+
fromCli: assignedCliOf(assignedKey) ?? "unknown",
|
|
424
|
+
...fromModel !== void 0 ? { fromModel } : {},
|
|
425
|
+
reason: classifyFallbackReason(error)
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
function inFamilyFallback(cli, fromModel) {
|
|
429
|
+
return { fromCli: bareCliName(cli), fromModel, reason: "capacity" };
|
|
430
|
+
}
|
|
431
|
+
function withAssignedCli(result, assignedKey) {
|
|
432
|
+
const assignedCli = assignedCliOf(assignedKey);
|
|
433
|
+
return assignedCli === void 0 ? result : { ...result, assignedCli };
|
|
434
|
+
}
|
|
435
|
+
|
|
385
436
|
// src/cli/voter-cancel.ts
|
|
386
437
|
var SEAT_CANCELLED_MESSAGE = "cancelled while this voter was in flight";
|
|
387
438
|
function isCancelled(signal) {
|
|
@@ -2305,6 +2356,7 @@ async function collectRealVotes(options) {
|
|
|
2305
2356
|
if ("simulated" in adapterResult)
|
|
2306
2357
|
return createSimulatedVotes(roles, proposal, "No adapter available");
|
|
2307
2358
|
const roleAdapters = await assignPanelSeats(adapterResult.adapter, options, logger12);
|
|
2359
|
+
const discloseModelPins = captureModelPinWarnings(options);
|
|
2308
2360
|
warnIfCodexConcurrencyExceeded(roleAdapters, logger12);
|
|
2309
2361
|
const workspace = resolvePanelWorkspace(options.workspace);
|
|
2310
2362
|
const { nonRetryableRoles, onError } = createVoterRetryState();
|
|
@@ -2335,7 +2387,7 @@ async function collectRealVotes(options) {
|
|
|
2335
2387
|
options.erroredRoleBackoffMs ?? DEFAULT_ERRORED_ROLE_BACKOFF_MS
|
|
2336
2388
|
);
|
|
2337
2389
|
reportVoteIndependence(results, logger12);
|
|
2338
|
-
return results;
|
|
2390
|
+
return results.map(discloseModelPins);
|
|
2339
2391
|
}
|
|
2340
2392
|
|
|
2341
2393
|
// src/cli/vote-artifact.ts
|
|
@@ -5948,6 +6000,15 @@ function panelDiversityOf(votes) {
|
|
|
5948
6000
|
fallbacks: seatFallbacks(votes).length
|
|
5949
6001
|
};
|
|
5950
6002
|
}
|
|
6003
|
+
function assignedPanelDiversityOf(votes) {
|
|
6004
|
+
const models = votes.map((v) => v.pinnedModel).filter((m) => m !== void 0 && m !== "" && m !== UNRESOLVED_MODEL_ID);
|
|
6005
|
+
if (models.length === 0) return {};
|
|
6006
|
+
const families = models.map(vendorFamilyOf).filter((family) => family !== "unknown");
|
|
6007
|
+
return {
|
|
6008
|
+
assignedDistinctModels: countDistinctModels(models),
|
|
6009
|
+
assignedDistinctFamilies: new Set(families).size
|
|
6010
|
+
};
|
|
6011
|
+
}
|
|
5951
6012
|
var MIN_PANEL_FOR_DIVERSITY_WARNING = 3;
|
|
5952
6013
|
function singleModelPanelWarning(votes) {
|
|
5953
6014
|
if (votes.length < MIN_PANEL_FOR_DIVERSITY_WARNING) return void 0;
|
|
@@ -6170,7 +6231,8 @@ function toAgentVoteSummary(result) {
|
|
|
6170
6231
|
// #6246: and for what a recovered seat was retried from.
|
|
6171
6232
|
...result.retriedFrom !== void 0 ? { retriedFrom: result.retriedFrom } : {},
|
|
6172
6233
|
// #6606: the per-seat model was only in `costSummary.perVoter`.
|
|
6173
|
-
...modelUsedOf(result)
|
|
6234
|
+
...modelUsedOf(result),
|
|
6235
|
+
...assignedModelOf(result)
|
|
6174
6236
|
};
|
|
6175
6237
|
}
|
|
6176
6238
|
var MODEL_USED_MAX_CHARS = 100;
|
|
@@ -6181,6 +6243,13 @@ function modelUsedOf(result) {
|
|
|
6181
6243
|
modelUsed: model.length <= MODEL_USED_MAX_CHARS ? model : `${model.slice(0, MODEL_USED_MAX_CHARS - 1)}\u2026`
|
|
6182
6244
|
};
|
|
6183
6245
|
}
|
|
6246
|
+
function assignedModelOf(result) {
|
|
6247
|
+
const model = result.pinnedModel;
|
|
6248
|
+
if (model === void 0 || model === "" || model === UNRESOLVED_MODEL_ID) return {};
|
|
6249
|
+
return {
|
|
6250
|
+
assignedModel: model.length <= MODEL_USED_MAX_CHARS ? model : `${model.slice(0, MODEL_USED_MAX_CHARS - 1)}\u2026`
|
|
6251
|
+
};
|
|
6252
|
+
}
|
|
6184
6253
|
function panelDegradationWarning(errorCount, total) {
|
|
6185
6254
|
if (errorCount <= 0 || errorCount >= total) return void 0;
|
|
6186
6255
|
return `Panel degraded: ${String(errorCount)} of ${String(total)} voters errored; decision rests on ${String(total - errorCount)} voter(s).`;
|
|
@@ -6189,9 +6258,11 @@ function appendPanelWarning(response, text) {
|
|
|
6189
6258
|
if (text === void 0) return;
|
|
6190
6259
|
response.panelWarning = response.panelWarning === void 0 ? text : `${response.panelWarning} ${text}`;
|
|
6191
6260
|
}
|
|
6192
|
-
function unverifiableSeatsWarning(unverifiableCount, total) {
|
|
6261
|
+
function unverifiableSeatsWarning(unverifiableCount, total, artifactPath) {
|
|
6193
6262
|
if (unverifiableCount <= 0) return void 0;
|
|
6194
|
-
|
|
6263
|
+
const warning = `${String(unverifiableCount)} of ${String(total)} seat(s) could not read the artifact and are recorded as unverifiable (counted as abstain in voteCounts; any decision they returned was discarded).`;
|
|
6264
|
+
if (artifactPath !== void 0) return warning;
|
|
6265
|
+
return `${warning} No artifactPath was supplied: voters only see the proposal text; pass artifactPath (or inline the artifact) so they can inspect it.`;
|
|
6195
6266
|
}
|
|
6196
6267
|
var degradedPanelCount = 0;
|
|
6197
6268
|
function applyAbsoluteQuorumTelemetry(response, input, decision, degradeReason) {
|
|
@@ -6246,6 +6317,7 @@ function buildResponse(input, result, costSummary, voteRecord) {
|
|
|
6246
6317
|
...disclosedWorkspace(result),
|
|
6247
6318
|
// #6115: always present — a panel nobody answered is explicit zeros.
|
|
6248
6319
|
panelDiversity: panelDiversityOf(result.votes),
|
|
6320
|
+
...assignedPanelDiversityOf(result.votes),
|
|
6249
6321
|
// #3991: surface the authentic-vote-record persistence outcome so a skipped
|
|
6250
6322
|
// or failed persist is visible to the MCP caller (was WARN-only).
|
|
6251
6323
|
voteRecordPersisted: voteRecord?.persisted ?? false
|
|
@@ -6284,9 +6356,14 @@ function applyOptionalResponseFields(response, input, result, errorCount, costSu
|
|
|
6284
6356
|
if (panelWarning !== void 0) {
|
|
6285
6357
|
response.panelWarning = panelWarning;
|
|
6286
6358
|
}
|
|
6359
|
+
for (const vote of result.votes) appendPanelWarning(response, vote.modelPinWarning);
|
|
6287
6360
|
appendPanelWarning(
|
|
6288
6361
|
response,
|
|
6289
|
-
unverifiableSeatsWarning(
|
|
6362
|
+
unverifiableSeatsWarning(
|
|
6363
|
+
response.voteCounts.unverifiable,
|
|
6364
|
+
result.votes.length,
|
|
6365
|
+
input.artifactPath
|
|
6366
|
+
)
|
|
6290
6367
|
);
|
|
6291
6368
|
appendPanelWarning(response, singleModelPanelWarning(result.votes));
|
|
6292
6369
|
appendPanelWarning(response, singleFamilyPanelWarning(result.votes));
|
|
@@ -9344,6 +9421,7 @@ var CONSENSUS_VOTE_OUTPUT_SCHEMA = {
|
|
|
9344
9421
|
reason: z15.enum(["rate-limit", "capacity", "auth", "timeout", "sandbox", "unknown"])
|
|
9345
9422
|
}).optional(),
|
|
9346
9423
|
modelUsed: z15.string().max(100).optional(),
|
|
9424
|
+
assignedModel: z15.string().max(100).optional(),
|
|
9347
9425
|
rejectionCategories: z15.array(
|
|
9348
9426
|
z15.enum([
|
|
9349
9427
|
"YAGNI",
|
|
@@ -9412,6 +9490,10 @@ var CONSENSUS_VOTE_OUTPUT_SCHEMA = {
|
|
|
9412
9490
|
unresolvedSeats: z15.number().int().nonnegative().optional(),
|
|
9413
9491
|
fallbacks: z15.number().int().nonnegative()
|
|
9414
9492
|
}).optional(),
|
|
9493
|
+
// Assigned roster includes errored and abstaining seats. Absent when no
|
|
9494
|
+
// assignment resolved, including a zero-seat roster.
|
|
9495
|
+
assignedDistinctModels: z15.number().int().nonnegative().optional(),
|
|
9496
|
+
assignedDistinctFamilies: z15.number().int().nonnegative().optional(),
|
|
9415
9497
|
// #3855: per-decision cost rollup. Same omission as panelWarning (#4032) — it
|
|
9416
9498
|
// is present on the response whenever cost recording succeeds (common in `api`
|
|
9417
9499
|
// billing mode). Shared schema lives with the type (single source of truth).
|
|
@@ -9434,7 +9516,7 @@ var CONSENSUS_VOTE_OUTPUT_SCHEMA = {
|
|
|
9434
9516
|
}).optional()
|
|
9435
9517
|
};
|
|
9436
9518
|
var CONSENSUS_VOTE_TOOL_SCHEMA = ConsensusVoteInputSchema.shape;
|
|
9437
|
-
var CONSENSUS_VOTE_DESCRIPTION = "Execute multi-model consensus voting on a proposal. Uses 7 roles by default (architect, security, devex, ai_ml, pm, catfish, scope_steward) or 3 with quickMode (architect, security, scope_steward), voting with configurable strategies. higher_order does NOT decide the verdict by correlation-aware aggregation (#4701): approve/reject is a simple tally of the panel, so correlated voters each carry full independent weight. The Bayesian correlation analysis is computed and feeds contrarian escalation only. Choose it for the escalation behaviour, not for a weighted verdict. Supports async dispatch (dispatch: 'async') \u2014 returns a jobId to poll via get_job_result. Pass ratifies=<subject> to bind an authority-ladder ratification vote into its authentic record, and ratifiesPr={pr, headSha} to bind a governor-path PR ratification to the head the panel saw (#5130); the result carries voteRecordId for the caller-commits append. If your proposal asks voters to choose among named alternatives, you MUST pass them in `options` (#4472) \u2014 the threshold is then measured over WHICH option won, and the record carries the per-option tally plus selection coverage. WITHOUT `options` the tally is approve/reject/abstain only, so every voter who engages returns `approve` and a 6-1 split on which option persists as 7-0, 100% (#4452).";
|
|
9519
|
+
var CONSENSUS_VOTE_DESCRIPTION = "Execute multi-model consensus voting on a proposal. Uses 7 roles by default (architect, security, devex, ai_ml, pm, catfish, scope_steward) or 3 with quickMode (architect, security, scope_steward), voting with configurable strategies. higher_order does NOT decide the verdict by correlation-aware aggregation (#4701): approve/reject is a simple tally of the panel, so correlated voters each carry full independent weight. The Bayesian correlation analysis is computed and feeds contrarian escalation only. Choose it for the escalation behaviour, not for a weighted verdict. Supports async dispatch (dispatch: 'async') \u2014 returns a jobId to poll via get_job_result. Pass ratifies=<subject> to bind an authority-ladder ratification vote into its authentic record, and ratifiesPr={pr, headSha} to bind a governor-path PR ratification to the head the panel saw (#5130); the result carries voteRecordId for the caller-commits append. If your proposal asks voters to choose among named alternatives, you MUST pass them in `options` (#4472) \u2014 the threshold is then measured over WHICH option won, and the record carries the per-option tally plus selection coverage. WITHOUT `options` the tally is approve/reject/abstain only, so every voter who engages returns `approve` and a 6-1 split on which option persists as 7-0, 100% (#4452). The response separates responding panelDiversity from optional assignedDistinctModels and assignedDistinctFamilies, and votes[].assignedModel shows each resolved assignment, including errored or abstaining seats. Assignment counts are omitted when unmeasured. panelWarning names ignored model pins and includes an artifactPath hint when unverifiable seats had no supplied artifact.";
|
|
9438
9520
|
function registerConsensusVoteTool(server, deps) {
|
|
9439
9521
|
const logger12 = deps.logger ?? createLogger({ tool: "consensus_vote" });
|
|
9440
9522
|
const notifier = deps.notifier ?? createMcpNotifier(server);
|
|
@@ -9577,4 +9659,4 @@ export {
|
|
|
9577
9659
|
CONSENSUS_VOTE_TOOL_SCHEMA,
|
|
9578
9660
|
registerConsensusVoteTool
|
|
9579
9661
|
};
|
|
9580
|
-
//# sourceMappingURL=chunk-
|
|
9662
|
+
//# sourceMappingURL=chunk-V5CYHQ7H.js.map
|