metheus-governance-mcp-cli 0.2.79 → 0.2.81
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/README.md +4 -3
- package/lib/bot-commands.mjs +86 -9
- package/lib/local-ai-adapters.mjs +3 -0
- package/lib/selftest-bot-commands.mjs +12 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -226,12 +226,13 @@ metheus-governance-mcp-cli bot verify --provider telegram --bot-key main
|
|
|
226
226
|
Behavior:
|
|
227
227
|
|
|
228
228
|
- `bot setup` asks for `Telegram / Slack / KakaoTalk` first, then prompts with numbered actions.
|
|
229
|
-
- `bot add` without flags now uses the shortest practical guided flow: provider -> token -> verify -> optional save-anyway only when verify fails -> optional username fallback only when verify cannot discover it -> optional default bot.
|
|
229
|
+
- `bot add` without flags now uses the shortest practical guided flow: provider -> token -> verify -> optional save-anyway only when verify fails -> optional username fallback only when verify cannot discover it -> optional AI model selection when the resolved defaults leave it blank -> optional default bot.
|
|
230
230
|
- In the normal Telegram path, `bot add` does not ask for a local bot key, a server bot UUID, or an approval / worker / review / monitor choice.
|
|
231
231
|
- For Telegram, the local env key is auto-generated from the matched server bot name or verified username, so you do not have to invent a separate local nickname first.
|
|
232
232
|
- For Telegram, the CLI tries to match the verified bot identity against the server `me/bots` list first. If the server exposes one logical bot name with multiple roles such as `approval`, `worker`, `review`, and `monitor`, the CLI does not ask you to choose one UUID. It binds by server bot name and keeps the local role/AI fields empty so runtime can use the server bot role for each route.
|
|
233
233
|
- When the Telegram username matches exactly one server bot role, the CLI still auto-fills the local `role_profile` and blank AI defaults from your local `bot-runner.json` `role_profiles` mapping.
|
|
234
234
|
- `bot edit` without flags now uses the same sequential flow every time: provider -> bot entry -> username/token review -> grouped server-role review when needed -> AI field choices -> default choice -> save.
|
|
235
|
+
- when the CLI asks for `AI model`, it now shows client-specific model choices first and still allows manual entry when you need a custom model name.
|
|
235
236
|
- if one server bot name maps to multiple server roles, `bot edit` keeps the Telegram env entry bound to the server identity and lets you review the local `role_profiles` for each detected role instead of forcing one role/profile UUID choice up front.
|
|
236
237
|
- In the normal Telegram edit path, the CLI keeps or re-resolves the server bot binding automatically. It no longer asks you to pick `approval / worker / review / monitor` or a server bot UUID first.
|
|
237
238
|
- `bot set-default` without flags starts a guided numbered flow: provider -> bot entry -> confirm default change.
|
|
@@ -258,8 +259,8 @@ Non-interactive examples:
|
|
|
258
259
|
```bash
|
|
259
260
|
metheus-governance-mcp-cli bot global --provider telegram --non-interactive true --api-base-url http://127.0.0.1:8999/telegram --auto-clear-webhook false --allowed-updates message,edited_message,channel_post
|
|
260
261
|
metheus-governance-mcp-cli bot add --provider telegram --non-interactive true --server-bot-id <server_bot_uuid> --token <telegram_bot_token> --default true
|
|
261
|
-
metheus-governance-mcp-cli bot add --provider telegram --non-interactive true --server-bot-id <server_bot_uuid> --token <telegram_bot_token> --ai-client
|
|
262
|
-
metheus-governance-mcp-cli bot edit --provider telegram --bot-key ryoai_bot --non-interactive true --ai-client claude --ai-model
|
|
262
|
+
metheus-governance-mcp-cli bot add --provider telegram --non-interactive true --server-bot-id <server_bot_uuid> --token <telegram_bot_token> --ai-client gpt --ai-model "GPT-5.4" --ai-permission-mode read_only --ai-reasoning-effort low
|
|
263
|
+
metheus-governance-mcp-cli bot edit --provider telegram --bot-key ryoai_bot --non-interactive true --ai-client claude --ai-model "Sonnet 4.6r" --ai-permission-mode danger_full_access --ai-reasoning-effort high
|
|
263
264
|
metheus-governance-mcp-cli bot set-default --provider telegram --bot-key main --non-interactive true
|
|
264
265
|
metheus-governance-mcp-cli bot migrate --provider telegram --bot-key main --server-bot-id <server_bot_uuid> --bot-name <telegram_username> --role-profile monitor --ai-client codex --ai-permission-mode read_only --ai-reasoning-effort low --non-interactive true
|
|
265
266
|
metheus-governance-mcp-cli bot remove --provider telegram --bot-key main --non-interactive true
|
package/lib/bot-commands.mjs
CHANGED
|
@@ -624,12 +624,21 @@ function telegramEntryDisplayName(entry) {
|
|
|
624
624
|
return String(current.key || "").trim() || "(unnamed)";
|
|
625
625
|
}
|
|
626
626
|
|
|
627
|
+
function displayLocalAIClientName(clientName) {
|
|
628
|
+
const normalized = String(clientName || "").trim().toLowerCase();
|
|
629
|
+
if (normalized === "codex" || normalized === "gpt") return "GPT";
|
|
630
|
+
if (normalized === "claude") return "Claude";
|
|
631
|
+
if (normalized === "gemini") return "Gemini";
|
|
632
|
+
if (normalized === "sample") return "Sample";
|
|
633
|
+
return String(clientName || "").trim();
|
|
634
|
+
}
|
|
635
|
+
|
|
627
636
|
function telegramEntryDisplayDescription(entry) {
|
|
628
637
|
const current = safeObject(entry);
|
|
629
638
|
const detail = [
|
|
630
639
|
current.key ? `key:${current.key}` : "",
|
|
631
640
|
current.serverBotID ? `server:${current.serverBotID}` : "",
|
|
632
|
-
current.client ? `AI:${current.client}` : "",
|
|
641
|
+
current.client ? `AI:${displayLocalAIClientName(current.client)}` : "",
|
|
633
642
|
].filter(Boolean);
|
|
634
643
|
return detail.join(" ");
|
|
635
644
|
}
|
|
@@ -832,7 +841,7 @@ async function editTelegramBotGuided(ui, parsed, selected, current, flags, deps)
|
|
|
832
841
|
defaultValue: current.model ? "keep" : "change",
|
|
833
842
|
});
|
|
834
843
|
if (modelAction === "change") {
|
|
835
|
-
current.model = await
|
|
844
|
+
current.model = await promptAIModel(ui, deps, current.client, current.model);
|
|
836
845
|
} else if (modelAction === "clear") {
|
|
837
846
|
current.model = "";
|
|
838
847
|
}
|
|
@@ -936,7 +945,7 @@ function renderBotListPayload(provider, state, deps) {
|
|
|
936
945
|
function formatRoleProfileOutputLine(profile) {
|
|
937
946
|
const current = safeObject(profile);
|
|
938
947
|
return [
|
|
939
|
-
current.client ? `client=${current.client}` : "client=(blank)",
|
|
948
|
+
current.client ? `client=${displayLocalAIClientName(current.client)}` : "client=(blank)",
|
|
940
949
|
current.model ? `model=${current.model}` : "model=(blank)",
|
|
941
950
|
current.permissionMode ? `permission=${current.permissionMode}` : "permission=(blank)",
|
|
942
951
|
current.reasoningEffort ? `reasoning=${current.reasoningEffort}` : "reasoning=(blank)",
|
|
@@ -1084,7 +1093,7 @@ function printBotShow(provider, state, entry, deps, extras = {}) {
|
|
|
1084
1093
|
process.stdout.write(` username: ${selectedEntry.username ? `@${selectedEntry.username}` : "-"}\n`);
|
|
1085
1094
|
process.stdout.write(` token: ${selectedEntry.token ? maskSecret(selectedEntry.token) : "(not configured)"}\n`);
|
|
1086
1095
|
process.stdout.write(` role_profile: ${selectedEntry.roleProfile || "-"}\n`);
|
|
1087
|
-
process.stdout.write(` ai_client: ${selectedEntry.client
|
|
1096
|
+
process.stdout.write(` ai_client: ${selectedEntry.client ? displayLocalAIClientName(selectedEntry.client) : "-"}\n`);
|
|
1088
1097
|
process.stdout.write(` ai_model: ${selectedEntry.model || "-"}\n`);
|
|
1089
1098
|
process.stdout.write(` permission_mode: ${selectedEntry.permissionMode || "-"}\n`);
|
|
1090
1099
|
process.stdout.write(` reasoning_effort: ${selectedEntry.reasoningEffort || "-"}\n`);
|
|
@@ -1442,13 +1451,70 @@ async function promptAIClient(ui, deps, defaultValue = "") {
|
|
|
1442
1451
|
const clients = ensureArray(deps.supportedLocalAIClients || []);
|
|
1443
1452
|
const options = [
|
|
1444
1453
|
{ value: "", label: "(blank)", description: "leave AI client empty" },
|
|
1445
|
-
...clients.map((client) => ({ value: client, label: client })),
|
|
1454
|
+
...clients.map((client) => ({ value: client, label: displayLocalAIClientName(client) || client })),
|
|
1446
1455
|
];
|
|
1447
1456
|
const selectedIndex = Math.max(0, options.findIndex((item) => item.value === String(defaultValue || "").trim()));
|
|
1448
1457
|
const selected = await promptChoice(ui, "Select AI client", options, { defaultIndex: selectedIndex });
|
|
1449
1458
|
return String(selected?.value || "").trim();
|
|
1450
1459
|
}
|
|
1451
1460
|
|
|
1461
|
+
function suggestedAIModelsForClient(clientName) {
|
|
1462
|
+
const normalizedClient = String(clientName || "").trim().toLowerCase();
|
|
1463
|
+
if (normalizedClient === "codex") {
|
|
1464
|
+
return [
|
|
1465
|
+
{ value: "GPT-5.4", label: "GPT-5.4", description: "recommended GPT model" },
|
|
1466
|
+
{ value: "GPT-5.3-CODEX", label: "GPT-5.3-CODEX", description: "stable GPT codex-style model" },
|
|
1467
|
+
{ value: "GPT-5.3-CODEX-Spark", label: "GPT-5.3-CODEX-Spark", description: "faster GPT codex-style model" },
|
|
1468
|
+
];
|
|
1469
|
+
}
|
|
1470
|
+
if (normalizedClient === "claude") {
|
|
1471
|
+
return [
|
|
1472
|
+
{ value: "Sonnet 4.6r", label: "Sonnet 4.6r", description: "recommended Claude Sonnet model" },
|
|
1473
|
+
{ value: "Haiku 4.5", label: "Haiku 4.5", description: "faster Claude Haiku model" },
|
|
1474
|
+
{ value: "Opus 4.6", label: "Opus 4.6", description: "highest-capability Claude model" },
|
|
1475
|
+
];
|
|
1476
|
+
}
|
|
1477
|
+
if (normalizedClient === "gemini") {
|
|
1478
|
+
return [
|
|
1479
|
+
{ value: "Gemini 3.1 Pro", label: "Gemini 3.1 Pro", description: "recommended Gemini model" },
|
|
1480
|
+
];
|
|
1481
|
+
}
|
|
1482
|
+
if (normalizedClient === "sample") {
|
|
1483
|
+
return [
|
|
1484
|
+
{ value: "sample", label: "sample", description: "sample adapter model placeholder" },
|
|
1485
|
+
];
|
|
1486
|
+
}
|
|
1487
|
+
return [];
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
async function promptAIModel(ui, deps, clientName, defaultValue = "", title = "Select AI model") {
|
|
1491
|
+
const normalizedClient = requireDependency(deps, "normalizeLocalAIClientName")(clientName || "", "");
|
|
1492
|
+
const currentValue = String(defaultValue || "").trim();
|
|
1493
|
+
const suggestions = suggestedAIModelsForClient(normalizedClient);
|
|
1494
|
+
const options = [
|
|
1495
|
+
{ value: "", label: "(blank)", description: "leave AI model empty" },
|
|
1496
|
+
];
|
|
1497
|
+
if (currentValue && !suggestions.some((item) => item.value === currentValue)) {
|
|
1498
|
+
options.push({
|
|
1499
|
+
value: currentValue,
|
|
1500
|
+
label: currentValue,
|
|
1501
|
+
description: "current saved model",
|
|
1502
|
+
});
|
|
1503
|
+
}
|
|
1504
|
+
options.push(...suggestions);
|
|
1505
|
+
options.push({
|
|
1506
|
+
value: "__manual__",
|
|
1507
|
+
label: "Manual entry",
|
|
1508
|
+
description: "type the model name yourself",
|
|
1509
|
+
});
|
|
1510
|
+
const selectedIndex = Math.max(0, options.findIndex((item) => item.value === currentValue));
|
|
1511
|
+
const selected = await promptChoice(ui, title, options, { defaultIndex: selectedIndex >= 0 ? selectedIndex : 0 });
|
|
1512
|
+
if (String(selected?.value || "") === "__manual__") {
|
|
1513
|
+
return String(await promptRequiredLine(ui, "AI model", currentValue)).trim();
|
|
1514
|
+
}
|
|
1515
|
+
return String(selected?.value || "").trim();
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1452
1518
|
async function promptPermissionMode(ui, defaultValue = "") {
|
|
1453
1519
|
const options = [
|
|
1454
1520
|
{ value: "", label: "(blank)", description: "leave permission mode empty" },
|
|
@@ -1553,7 +1619,7 @@ function currentRoleProfileState(roleName, deps) {
|
|
|
1553
1619
|
function formatRoleProfileSummary(profile) {
|
|
1554
1620
|
const current = safeObject(profile);
|
|
1555
1621
|
return [
|
|
1556
|
-
current.client ? `client:${current.client}` : "client:(blank)",
|
|
1622
|
+
current.client ? `client:${displayLocalAIClientName(current.client)}` : "client:(blank)",
|
|
1557
1623
|
current.model ? `model:${current.model}` : "model:(blank)",
|
|
1558
1624
|
current.permissionMode ? `permission:${current.permissionMode}` : "permission:(blank)",
|
|
1559
1625
|
current.reasoningEffort ? `reasoning:${current.reasoningEffort}` : "reasoning:(blank)",
|
|
@@ -1632,7 +1698,7 @@ async function promptRoleExecutionProfile(ui, roleName, deps) {
|
|
|
1632
1698
|
await promptAIClient(ui, deps, current.client),
|
|
1633
1699
|
"",
|
|
1634
1700
|
);
|
|
1635
|
-
current.model = await
|
|
1701
|
+
current.model = await promptAIModel(ui, deps, current.client, current.model, `Select AI model for role "${current.role}"`);
|
|
1636
1702
|
current.permissionMode = requireDependency(deps, "normalizeLocalAIPermissionMode")(
|
|
1637
1703
|
await promptPermissionMode(ui, current.permissionMode),
|
|
1638
1704
|
"",
|
|
@@ -2086,8 +2152,8 @@ async function addTelegramBot(ui, flags, deps) {
|
|
|
2086
2152
|
: (autoUseServerRoleRouting
|
|
2087
2153
|
? getAIModelFlag(flags)
|
|
2088
2154
|
: (autoApplyRoleDefaults
|
|
2089
|
-
? firstNonEmptyString([getAIModelFlag(flags), roleProfileDefaults.model])
|
|
2090
|
-
: await
|
|
2155
|
+
? await promptAIModel(ui, deps, client, firstNonEmptyString([getAIModelFlag(flags), roleProfileDefaults.model]))
|
|
2156
|
+
: await promptAIModel(ui, deps, client, firstNonEmptyString([getAIModelFlag(flags), roleProfileDefaults.model]))));
|
|
2091
2157
|
const permissionMode = requireDependency(deps, "normalizeLocalAIPermissionMode")(
|
|
2092
2158
|
nonInteractive
|
|
2093
2159
|
? firstNonEmptyString([getAIPermissionModeFlag(flags), roleProfileDefaults.permissionMode])
|
|
@@ -2109,6 +2175,17 @@ async function addTelegramBot(ui, flags, deps) {
|
|
|
2109
2175
|
"",
|
|
2110
2176
|
);
|
|
2111
2177
|
|
|
2178
|
+
if (serverGroupMatched) {
|
|
2179
|
+
await maybePromptGroupedServerRoleProfiles(
|
|
2180
|
+
ui,
|
|
2181
|
+
{
|
|
2182
|
+
name: String(serverBot.name || username || botKey).trim(),
|
|
2183
|
+
roles: preferredRoleSort(serverBot.roles),
|
|
2184
|
+
},
|
|
2185
|
+
deps,
|
|
2186
|
+
);
|
|
2187
|
+
}
|
|
2188
|
+
|
|
2112
2189
|
const nextParsed = upsertTelegramEntry(parsed, {
|
|
2113
2190
|
key: botKey,
|
|
2114
2191
|
serverBotID: String(getServerBotIDFlag(flags) || serverBot.botID || "").trim(),
|
|
@@ -358,6 +358,9 @@ function runSampleAdapter(payload) {
|
|
|
358
358
|
|
|
359
359
|
export function normalizeLocalAIClientName(rawValue, fallback = DEFAULT_LOCAL_AI_CLIENT) {
|
|
360
360
|
const value = String(rawValue || "").trim().toLowerCase();
|
|
361
|
+
if (["gpt", "openai-gpt", "openai"].includes(value)) {
|
|
362
|
+
return "codex";
|
|
363
|
+
}
|
|
361
364
|
if (SUPPORTED_LOCAL_AI_CLIENTS.includes(value)) {
|
|
362
365
|
return value;
|
|
363
366
|
}
|
|
@@ -364,14 +364,14 @@ export async function runSelftestBotCommands(push, deps) {
|
|
|
364
364
|
"3", // select role to edit: worker
|
|
365
365
|
"2", // worker: edit settings
|
|
366
366
|
"3", // worker AI client: claude
|
|
367
|
-
"worker
|
|
367
|
+
"2", // worker AI model: Sonnet 4.6r
|
|
368
368
|
"4", // worker permission: danger_full_access
|
|
369
369
|
"4", // worker reasoning: high
|
|
370
370
|
"y", // edit another role
|
|
371
371
|
"3", // select role to edit: approval
|
|
372
372
|
"2", // approval: edit settings
|
|
373
373
|
"4", // approval AI client: gemini
|
|
374
|
-
"
|
|
374
|
+
"2", // approval AI model: Gemini 3.1 Pro
|
|
375
375
|
"4", // approval permission: danger_full_access
|
|
376
376
|
"4", // approval reasoning: high
|
|
377
377
|
"n", // stop editing roles
|
|
@@ -388,13 +388,13 @@ export async function runSelftestBotCommands(push, deps) {
|
|
|
388
388
|
const groupedRunnerConfigPath = path.join(tempHome, ".metheus", "bot-runner.json");
|
|
389
389
|
const groupedRunnerConfig = readJSON(fs.readFileSync(groupedRunnerConfigPath, "utf8"));
|
|
390
390
|
push(
|
|
391
|
-
|
|
391
|
+
"bot_edit_grouped_server_roles_updates_role_profiles",
|
|
392
392
|
String(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).worker).client || "") === "claude"
|
|
393
|
-
&& String(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).worker).model || "") === "
|
|
393
|
+
&& String(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).worker).model || "") === "Sonnet 4.6r"
|
|
394
394
|
&& String(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).worker).permission_mode || "") === "danger_full_access"
|
|
395
395
|
&& String(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).worker).reasoning_effort || "") === "high"
|
|
396
396
|
&& String(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).approval).client || "") === "gemini"
|
|
397
|
-
&& String(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).approval).model || "") === "
|
|
397
|
+
&& String(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).approval).model || "") === "Gemini 3.1 Pro",
|
|
398
398
|
`worker=${JSON.stringify(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).worker))} approval=${JSON.stringify(safeObject(safeObject(groupedRunnerConfig.role_profiles || {}).approval))}`,
|
|
399
399
|
);
|
|
400
400
|
|
|
@@ -503,7 +503,7 @@ export async function runSelftestBotCommands(push, deps) {
|
|
|
503
503
|
"2", // change AI client
|
|
504
504
|
"4", // gemini
|
|
505
505
|
"2", // change AI model
|
|
506
|
-
"
|
|
506
|
+
"2", // gemini model: Gemini 3.1 Pro
|
|
507
507
|
"2", // change permission mode
|
|
508
508
|
"3", // workspace_write
|
|
509
509
|
"2", // change reasoning effort
|
|
@@ -522,7 +522,7 @@ export async function runSelftestBotCommands(push, deps) {
|
|
|
522
522
|
push(
|
|
523
523
|
"bot_edit_guided_prompts_update_ai_binding_fields",
|
|
524
524
|
String(guidedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_CLIENT || "") === "gemini"
|
|
525
|
-
&& String(guidedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "") === "
|
|
525
|
+
&& String(guidedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "") === "Gemini 3.1 Pro"
|
|
526
526
|
&& String(guidedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_PERMISSION_MODE || "") === "workspace_write"
|
|
527
527
|
&& String(guidedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_REASONING_EFFORT || "") === "medium",
|
|
528
528
|
`client=${String(guidedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_CLIENT || "")} model=${String(guidedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "")}`,
|
|
@@ -537,7 +537,7 @@ export async function runSelftestBotCommands(push, deps) {
|
|
|
537
537
|
"--non-interactive", "true",
|
|
538
538
|
"--token", "selftest-edited-token",
|
|
539
539
|
"--client", "claude",
|
|
540
|
-
"--model", "
|
|
540
|
+
"--model", "Sonnet 4.6r",
|
|
541
541
|
"--permission-mode", "workspace_write",
|
|
542
542
|
"--reasoning-effort", "medium",
|
|
543
543
|
],
|
|
@@ -548,7 +548,7 @@ export async function runSelftestBotCommands(push, deps) {
|
|
|
548
548
|
"bot_edit_updates_ai_binding_fields",
|
|
549
549
|
String(editedState.TELEGRAM_BOT_MONITORSELFTESTBOT_TOKEN || "") === "selftest-edited-token"
|
|
550
550
|
&& String(editedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_CLIENT || "") === "claude"
|
|
551
|
-
&& String(editedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "") === "
|
|
551
|
+
&& String(editedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "") === "Sonnet 4.6r"
|
|
552
552
|
&& String(editedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_PERMISSION_MODE || "") === "workspace_write"
|
|
553
553
|
&& String(editedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_REASONING_EFFORT || "") === "medium",
|
|
554
554
|
`client=${String(editedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_CLIENT || "")} model=${String(editedState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "")}`,
|
|
@@ -683,8 +683,8 @@ export async function runSelftestBotCommands(push, deps) {
|
|
|
683
683
|
"--timeout-seconds", "5",
|
|
684
684
|
"--server-bot-id", mock.bots[0].id,
|
|
685
685
|
"--token", "selftest-main-token",
|
|
686
|
-
"--ai-client", "
|
|
687
|
-
"--ai-model", "
|
|
686
|
+
"--ai-client", "gpt",
|
|
687
|
+
"--ai-model", "GPT-5.4",
|
|
688
688
|
"--ai-permission-mode", "read_only",
|
|
689
689
|
"--ai-reasoning-effort", "low",
|
|
690
690
|
"--verify", "true",
|
|
@@ -697,7 +697,7 @@ export async function runSelftestBotCommands(push, deps) {
|
|
|
697
697
|
String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_SERVER_BOT_ID || "") === mock.bots[0].id
|
|
698
698
|
&& String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_USERNAME || "") === ""
|
|
699
699
|
&& String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_CLIENT || "") === "codex"
|
|
700
|
-
&& String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "") === "
|
|
700
|
+
&& String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "") === "GPT-5.4"
|
|
701
701
|
&& String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_PERMISSION_MODE || "") === "read_only"
|
|
702
702
|
&& String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_REASONING_EFFORT || "") === "low",
|
|
703
703
|
`client=${String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_CLIENT || "")} model=${String(aliasAddState.TELEGRAM_BOT_MONITORSELFTESTBOT_AI_MODEL || "")}`,
|