metheus-governance-mcp-cli 0.2.216 → 0.2.217

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/cli.mjs CHANGED
@@ -2797,7 +2797,7 @@ function shouldBypassRunnerStartupLoopForContractFollowup({
2797
2797
  return false;
2798
2798
  }
2799
2799
  const executionContractType = String(parsed.executionContractType || "").trim().toLowerCase();
2800
- if (executionContractType !== "delegation") {
2800
+ if (!executionContractType) {
2801
2801
  return false;
2802
2802
  }
2803
2803
  const senderBotSelector = normalizeTelegramMentionUsername(
@@ -1285,19 +1285,6 @@ export async function resolveHumanIntentContext({
1285
1285
  runnerHumanIntentPromises.set(cacheKey, promise);
1286
1286
  }
1287
1287
  let humanIntent = await runnerHumanIntentPromises.get(cacheKey);
1288
- if (!isCompleteHumanIntentContract(humanIntent)) {
1289
- humanIntent = await analyzeHumanConversationIntentWithContractResolver({
1290
- text: parsed.body,
1291
- managedMentions,
1292
- peerMap,
1293
- deps,
1294
- executionPlan,
1295
- contractGuardrail: {
1296
- require_complete_contract: true,
1297
- reason: "Return a complete human intent contract for this managed-bot conversation.",
1298
- },
1299
- });
1300
- }
1301
1288
  if (!isCompleteHumanIntentContract(humanIntent)) {
1302
1289
  return {
1303
1290
  currentBotSelector,
@@ -1325,42 +1312,60 @@ function buildDirectHumanResponseContract({
1325
1312
  }) {
1326
1313
  const humanIntent = safeObject(humanIntentContext?.humanIntent);
1327
1314
  const conversation = safeObject(conversationContext);
1328
- const intentMode = String(conversation.intentMode || humanIntent.intentMode || "").trim();
1329
- const allowBotToBot = conversation.allowBotToBot === true || humanIntent.allowBotToBot === true;
1330
- const allowedResponderSelectors = uniqueOrdered(
1331
- ensureArray(conversation.allowedResponderSelectors || humanIntent.allowedResponderSelectors)
1315
+ const preferConversationContract = Boolean(
1316
+ String(conversation.intentMode || "").trim()
1317
+ || ensureArray(conversation.initialResponderSelectors).length
1318
+ || ensureArray(conversation.allowedResponderSelectors).length
1319
+ || String(conversation.leadBotUsername || "").trim()
1320
+ || String(conversation.summaryBotUsername || "").trim()
1321
+ || String(conversation.replyExpectation || "").trim(),
1322
+ );
1323
+ const source = preferConversationContract ? conversation : humanIntent;
1324
+ const secondary = preferConversationContract ? humanIntent : conversation;
1325
+ const normalizedAllowedResponderSelectors = uniqueOrdered(
1326
+ ensureArray(source.allowedResponderSelectors)
1332
1327
  .map((item) => normalizeMentionSelector(item))
1333
1328
  .filter(Boolean),
1334
1329
  );
1335
- const initialResponderSelectors = uniqueOrdered(
1336
- ensureArray(conversation.initialResponderSelectors || humanIntent.initialResponderSelectors)
1330
+ const normalizedInitialResponderSelectors = uniqueOrdered(
1331
+ ensureArray(source.initialResponderSelectors)
1337
1332
  .map((item) => normalizeMentionSelector(item))
1338
1333
  .filter(Boolean),
1339
1334
  );
1340
- const leadBotSelector = normalizeMentionSelector(conversation.leadBotUsername || humanIntent.leadBotSelector);
1341
- const summaryBotSelector = normalizeMentionSelector(conversation.summaryBotUsername || humanIntent.summaryBotSelector);
1335
+ const intentMode = String(source.intentMode || secondary.intentMode || "").trim();
1336
+ const allowBotToBot = source.allowBotToBot === true
1337
+ || (source.allowBotToBot !== false && secondary.allowBotToBot === true);
1338
+ const leadBotSelector = normalizeMentionSelector(
1339
+ source.leadBotUsername || source.leadBotSelector || secondary.leadBotUsername || secondary.leadBotSelector,
1340
+ );
1341
+ const summaryBotSelector = normalizeMentionSelector(
1342
+ source.summaryBotUsername || source.summaryBotSelector || secondary.summaryBotUsername || secondary.summaryBotSelector,
1343
+ );
1342
1344
  const replyExpectation = normalizeReplyExpectation(
1343
- conversation.replyExpectation || humanIntent.replyExpectation,
1345
+ source.replyExpectation || secondary.replyExpectation,
1344
1346
  "",
1345
1347
  );
1346
1348
  const intentType = normalizeHumanIntentType(
1347
- conversation.intentType || humanIntent.intentType,
1349
+ source.intentType || secondary.intentType,
1348
1350
  "",
1349
1351
  );
1350
1352
  const allowedContractTypes = uniqueOrdered(
1351
- ensureArray(conversation.allowedContractTypes || humanIntent.allowedContractTypes)
1353
+ ensureArray(source.allowedContractTypes || secondary.allowedContractTypes)
1352
1354
  .map((item) => String(item || "").trim().toLowerCase())
1353
1355
  .filter(Boolean),
1354
1356
  );
1355
- const requiresActionableContract = conversation.requiresActionableContract === true
1356
- || conversation.require_actionable_contract === true
1357
- || humanIntent.requiresActionableContract === true
1358
- || humanIntent.require_actionable_contract === true;
1357
+ const requiresActionableContract = source.requiresActionableContract === true
1358
+ || source.require_actionable_contract === true
1359
+ || (
1360
+ source.requiresActionableContract !== false
1361
+ && source.require_actionable_contract !== false
1362
+ && (secondary.requiresActionableContract === true || secondary.require_actionable_contract === true)
1363
+ );
1359
1364
  return {
1360
1365
  intentMode,
1361
1366
  allowBotToBot,
1362
- allowedResponderSelectors,
1363
- initialResponderSelectors,
1367
+ allowedResponderSelectors: normalizedAllowedResponderSelectors,
1368
+ initialResponderSelectors: normalizedInitialResponderSelectors,
1364
1369
  leadBotSelector,
1365
1370
  summaryBotSelector,
1366
1371
  replyExpectation,
@@ -1378,17 +1383,23 @@ function mergeDirectHumanResponseContract({
1378
1383
  }) {
1379
1384
  const base = safeObject(baseContract);
1380
1385
  const response = safeObject(responseContract);
1381
- const execution = safeObject(executionContract);
1382
- const assignmentTargets = uniqueOrdered(
1383
- ensureArray(execution.assignments)
1384
- .map((item) => normalizeMentionSelector(safeObject(item).targetBot || safeObject(item).target_bot))
1385
- .filter(Boolean),
1386
- );
1387
- const nextResponders = uniqueOrdered(
1388
- ensureArray(execution.nextResponders || execution.next_responders || execution.responders)
1389
- .map((item) => normalizeMentionSelector(item))
1390
- .filter(Boolean),
1391
- );
1386
+ void executionContract;
1387
+ void currentBotSelector;
1388
+ const hasExplicitArray = (obj, keys) => keys.some((key) => Object.prototype.hasOwnProperty.call(obj, key));
1389
+ const explicitAllowedResponderSelectors = hasExplicitArray(response, ["human_allowed_responders", "allowed_responders"])
1390
+ ? uniqueOrdered(
1391
+ ensureArray(response.human_allowed_responders || response.allowed_responders)
1392
+ .map((item) => normalizeMentionSelector(item))
1393
+ .filter(Boolean),
1394
+ )
1395
+ : null;
1396
+ const explicitInitialResponderSelectors = hasExplicitArray(response, ["human_initial_responders", "initial_responders"])
1397
+ ? uniqueOrdered(
1398
+ ensureArray(response.human_initial_responders || response.initial_responders)
1399
+ .map((item) => normalizeMentionSelector(item))
1400
+ .filter(Boolean),
1401
+ )
1402
+ : null;
1392
1403
  const intentMode = String(
1393
1404
  response.human_intent_mode
1394
1405
  || response.intent_mode
@@ -1412,21 +1423,18 @@ function mergeDirectHumanResponseContract({
1412
1423
  : response.allow_bot_to_bot === true || response.allowBotToBot === true
1413
1424
  ? true
1414
1425
  : base.allowBotToBot === true;
1415
- const allowedResponderSelectors = uniqueOrdered([
1416
- ...ensureArray(base.allowedResponderSelectors),
1417
- ...ensureArray(response.human_allowed_responders || response.allowed_responders)
1418
- .map((item) => normalizeMentionSelector(item))
1419
- .filter(Boolean),
1420
- ...assignmentTargets,
1421
- ...nextResponders,
1422
- normalizeMentionSelector(execution.summaryBot || execution.summary_bot),
1423
- ].filter(Boolean));
1424
- const initialResponderSelectors = uniqueOrdered([
1425
- ...ensureArray(base.initialResponderSelectors),
1426
- ...ensureArray(response.human_initial_responders || response.initial_responders)
1427
- .map((item) => normalizeMentionSelector(item))
1428
- .filter(Boolean),
1429
- ].filter(Boolean));
1426
+ const allowedResponderSelectors = explicitAllowedResponderSelectors
1427
+ ?? uniqueOrdered(
1428
+ ensureArray(base.allowedResponderSelectors)
1429
+ .map((item) => normalizeMentionSelector(item))
1430
+ .filter(Boolean),
1431
+ );
1432
+ const initialResponderSelectors = explicitInitialResponderSelectors
1433
+ ?? uniqueOrdered(
1434
+ ensureArray(base.initialResponderSelectors)
1435
+ .map((item) => normalizeMentionSelector(item))
1436
+ .filter(Boolean),
1437
+ );
1430
1438
  const leadBotSelector = normalizeMentionSelector(
1431
1439
  response.human_lead_bot
1432
1440
  || response.lead_bot
@@ -1436,8 +1444,6 @@ function mergeDirectHumanResponseContract({
1436
1444
  const summaryBotSelector = normalizeMentionSelector(
1437
1445
  response.human_summary_bot
1438
1446
  || response.summary_bot
1439
- || execution.summaryBot
1440
- || execution.summary_bot
1441
1447
  || base.summaryBotSelector
1442
1448
  || "",
1443
1449
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metheus-governance-mcp-cli",
3
- "version": "0.2.216",
3
+ "version": "0.2.217",
4
4
  "description": "Metheus Governance MCP CLI (setup + stdio proxy)",
5
5
  "type": "module",
6
6
  "files": [