metheus-governance-mcp-cli 0.2.78 → 0.2.79
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/lib/bot-commands.mjs +94 -38
- package/package.json +1 -1
package/lib/bot-commands.mjs
CHANGED
|
@@ -1123,19 +1123,16 @@ function printBotShow(provider, state, entry, deps, extras = {}) {
|
|
|
1123
1123
|
process.stdout.write(` token: ${token ? maskSecret(token) : "(not configured)"}\n`);
|
|
1124
1124
|
}
|
|
1125
1125
|
|
|
1126
|
-
async function chooseTelegramEntry(ui, parsedEnv, deps, title = "Select Telegram bot entry") {
|
|
1126
|
+
async function chooseTelegramEntry(ui, parsedEnv, deps, title = "Select Telegram bot entry", flags = {}) {
|
|
1127
1127
|
const entries = telegramEntriesForDisplay(parsedEnv, deps);
|
|
1128
1128
|
if (!entries.length) {
|
|
1129
1129
|
throw new Error("no Telegram bot entries are configured");
|
|
1130
1130
|
}
|
|
1131
|
+
const displayRows = await buildTelegramEntrySelectionRows(entries, flags, deps);
|
|
1131
1132
|
const selected = await promptChoice(
|
|
1132
1133
|
ui,
|
|
1133
1134
|
title,
|
|
1134
|
-
|
|
1135
|
-
value: entry.key,
|
|
1136
|
-
label: `${telegramEntryDisplayName(entry)}${entry.isDefault ? " [default]" : ""}`,
|
|
1137
|
-
description: telegramEntryDisplayDescription(entry),
|
|
1138
|
-
})),
|
|
1135
|
+
displayRows,
|
|
1139
1136
|
{ defaultIndex: 0 },
|
|
1140
1137
|
);
|
|
1141
1138
|
return entries.find((entry) => entry.key === selected.value) || entries[0];
|
|
@@ -1164,7 +1161,7 @@ async function resolveTelegramEntryForShow(ui, parsedEnv, flags, deps) {
|
|
|
1164
1161
|
if (nonInteractive) {
|
|
1165
1162
|
throw new Error("Telegram bot selector is required when multiple entries exist; pass --bot-key, --bot-id, or --bot-name");
|
|
1166
1163
|
}
|
|
1167
|
-
return chooseTelegramEntry(ui, parsedEnv, deps, "Select Telegram bot entry");
|
|
1164
|
+
return chooseTelegramEntry(ui, parsedEnv, deps, "Select Telegram bot entry", flags);
|
|
1168
1165
|
}
|
|
1169
1166
|
|
|
1170
1167
|
async function chooseServerBot(ui, provider, baseURL, timeoutSeconds, deps, options = {}) {
|
|
@@ -1725,34 +1722,11 @@ async function maybePromptGroupedServerRoleProfiles(ui, serverBot, deps) {
|
|
|
1725
1722
|
return true;
|
|
1726
1723
|
}
|
|
1727
1724
|
|
|
1728
|
-
|
|
1725
|
+
function resolveTelegramServerBindingDetailsFromBots(envConfig, bots, deps) {
|
|
1729
1726
|
const current = safeObject(envConfig);
|
|
1730
1727
|
if (!String(current.serverBotID || "").trim() && !String(current.botUsername || "").trim() && !String(current.botKey || "").trim()) {
|
|
1731
1728
|
return null;
|
|
1732
1729
|
}
|
|
1733
|
-
const lookup = await requireDependency(deps, "listServerBots")({
|
|
1734
|
-
provider: "telegram",
|
|
1735
|
-
baseURL: flags["base-url"] || deps.defaultSiteURL,
|
|
1736
|
-
timeoutSeconds: intFromRaw(flags["timeout-seconds"], 15) || 15,
|
|
1737
|
-
});
|
|
1738
|
-
if (!lookup?.ok) {
|
|
1739
|
-
return {
|
|
1740
|
-
ok: false,
|
|
1741
|
-
mode: "lookup_error",
|
|
1742
|
-
matchedBy: "",
|
|
1743
|
-
name: "",
|
|
1744
|
-
role: "",
|
|
1745
|
-
roles: [],
|
|
1746
|
-
effectiveRoleProfile: null,
|
|
1747
|
-
effectiveRoleProfiles: {},
|
|
1748
|
-
detail: `server bot lookup unavailable: ${lookup?.error || "unknown error"}`,
|
|
1749
|
-
};
|
|
1750
|
-
}
|
|
1751
|
-
const bots = ensureArray(lookup.bots).map((bot) => ({
|
|
1752
|
-
id: String(bot?.id || "").trim(),
|
|
1753
|
-
role: String(bot?.role || bot?.bot_role || "").trim(),
|
|
1754
|
-
name: String(bot?.name || "").trim(),
|
|
1755
|
-
})).filter((bot) => bot.id);
|
|
1756
1730
|
const resolveGroupedPayload = (matches, matchedBy) => {
|
|
1757
1731
|
const roles = preferredRoleSort(summarizeServerBotRoles(matches));
|
|
1758
1732
|
return {
|
|
@@ -1837,6 +1811,88 @@ async function resolveTelegramServerBindingDetails(envConfig, flags, deps) {
|
|
|
1837
1811
|
};
|
|
1838
1812
|
}
|
|
1839
1813
|
|
|
1814
|
+
async function resolveTelegramServerBindingDetails(envConfig, flags, deps) {
|
|
1815
|
+
const lookup = await requireDependency(deps, "listServerBots")({
|
|
1816
|
+
provider: "telegram",
|
|
1817
|
+
baseURL: flags["base-url"] || deps.defaultSiteURL,
|
|
1818
|
+
timeoutSeconds: intFromRaw(flags["timeout-seconds"], 15) || 15,
|
|
1819
|
+
});
|
|
1820
|
+
if (!lookup?.ok) {
|
|
1821
|
+
return {
|
|
1822
|
+
ok: false,
|
|
1823
|
+
mode: "lookup_error",
|
|
1824
|
+
matchedBy: "",
|
|
1825
|
+
name: "",
|
|
1826
|
+
role: "",
|
|
1827
|
+
roles: [],
|
|
1828
|
+
effectiveRoleProfile: null,
|
|
1829
|
+
effectiveRoleProfiles: {},
|
|
1830
|
+
detail: `server bot lookup unavailable: ${lookup?.error || "unknown error"}`,
|
|
1831
|
+
};
|
|
1832
|
+
}
|
|
1833
|
+
const bots = ensureArray(lookup.bots).map((bot) => ({
|
|
1834
|
+
id: String(bot?.id || "").trim(),
|
|
1835
|
+
role: String(bot?.role || bot?.bot_role || "").trim(),
|
|
1836
|
+
name: String(bot?.name || "").trim(),
|
|
1837
|
+
})).filter((bot) => bot.id);
|
|
1838
|
+
return resolveTelegramServerBindingDetailsFromBots(envConfig, bots, deps);
|
|
1839
|
+
}
|
|
1840
|
+
|
|
1841
|
+
async function buildTelegramEntrySelectionRows(entries, flags, deps) {
|
|
1842
|
+
const listServerBots = requireDependency(deps, "listServerBots");
|
|
1843
|
+
let bots = [];
|
|
1844
|
+
try {
|
|
1845
|
+
const lookup = await listServerBots({
|
|
1846
|
+
provider: "telegram",
|
|
1847
|
+
baseURL: flags["base-url"] || deps.defaultSiteURL,
|
|
1848
|
+
timeoutSeconds: intFromRaw(flags["timeout-seconds"], 15) || 15,
|
|
1849
|
+
});
|
|
1850
|
+
bots = ensureArray(lookup?.bots).map((bot) => ({
|
|
1851
|
+
id: String(bot?.id || "").trim(),
|
|
1852
|
+
role: String(bot?.role || bot?.bot_role || "").trim(),
|
|
1853
|
+
name: String(bot?.name || "").trim(),
|
|
1854
|
+
})).filter((bot) => bot.id);
|
|
1855
|
+
} catch {
|
|
1856
|
+
bots = [];
|
|
1857
|
+
}
|
|
1858
|
+
return ensureArray(entries).map((entry) => {
|
|
1859
|
+
const current = safeObject(entry);
|
|
1860
|
+
const binding = bots.length
|
|
1861
|
+
? resolveTelegramServerBindingDetailsFromBots(
|
|
1862
|
+
{
|
|
1863
|
+
serverBotID: current.serverBotID,
|
|
1864
|
+
botUsername: current.username,
|
|
1865
|
+
botKey: current.key,
|
|
1866
|
+
roleProfile: current.roleProfile,
|
|
1867
|
+
},
|
|
1868
|
+
bots,
|
|
1869
|
+
deps,
|
|
1870
|
+
)
|
|
1871
|
+
: null;
|
|
1872
|
+
const serverName = String(binding?.name || "").trim();
|
|
1873
|
+
const singleRole = String(binding?.role || "").trim();
|
|
1874
|
+
const groupedRoles = ensureArray(binding?.roles).filter(Boolean);
|
|
1875
|
+
let label = telegramEntryDisplayName(entry);
|
|
1876
|
+
if (serverName && singleRole) {
|
|
1877
|
+
label = `${serverName} [${singleRole}]`;
|
|
1878
|
+
} else if (serverName && groupedRoles.length) {
|
|
1879
|
+
label = `${serverName} [${groupedRoles.join(", ")}]`;
|
|
1880
|
+
} else if (serverName) {
|
|
1881
|
+
label = serverName;
|
|
1882
|
+
}
|
|
1883
|
+
const descriptionParts = [
|
|
1884
|
+
current.key ? `local:${current.key}` : "",
|
|
1885
|
+
current.serverBotID ? `server:${current.serverBotID}` : "",
|
|
1886
|
+
current.client ? `AI:${current.client}` : "",
|
|
1887
|
+
].filter(Boolean);
|
|
1888
|
+
return {
|
|
1889
|
+
value: current.key,
|
|
1890
|
+
label: `${label}${current.isDefault ? " [default]" : ""}`,
|
|
1891
|
+
description: descriptionParts.join(" "),
|
|
1892
|
+
};
|
|
1893
|
+
});
|
|
1894
|
+
}
|
|
1895
|
+
|
|
1840
1896
|
function buildTemporaryTelegramEnvConfig({ token, apiBaseURL }) {
|
|
1841
1897
|
return {
|
|
1842
1898
|
ok: true,
|
|
@@ -2125,7 +2181,7 @@ async function editTelegramGlobalSettings(ui, flags, deps) {
|
|
|
2125
2181
|
process.stdout.write("No Telegram bot entries exist yet.\n");
|
|
2126
2182
|
return;
|
|
2127
2183
|
}
|
|
2128
|
-
const selected = await chooseTelegramEntry(ui, parsed, deps, "Select default Telegram bot");
|
|
2184
|
+
const selected = await chooseTelegramEntry(ui, parsed, deps, "Select default Telegram bot", flags);
|
|
2129
2185
|
parsed.TELEGRAM_DEFAULT_BOT_KEY = selected.key;
|
|
2130
2186
|
}
|
|
2131
2187
|
const filePath = writeProviderEnvState("telegram", parsed, deps);
|
|
@@ -2138,7 +2194,7 @@ async function editTelegramBot(ui, flags, deps) {
|
|
|
2138
2194
|
const nonInteractive = boolFromRaw(flags["non-interactive"] ?? flags.yes, false);
|
|
2139
2195
|
const selected = nonInteractive
|
|
2140
2196
|
? findTelegramEntryByFlags(parsed, flags, deps)
|
|
2141
|
-
: await chooseTelegramEntry(ui, parsed, deps);
|
|
2197
|
+
: await chooseTelegramEntry(ui, parsed, deps, "Select Telegram bot entry", flags);
|
|
2142
2198
|
if (!selected) {
|
|
2143
2199
|
throw new Error("Telegram bot selector is required for non-interactive edit");
|
|
2144
2200
|
}
|
|
@@ -2178,10 +2234,10 @@ async function editTelegramBot(ui, flags, deps) {
|
|
|
2178
2234
|
await editTelegramBotGuided(ui, parsed, selected, current, flags, deps);
|
|
2179
2235
|
}
|
|
2180
2236
|
|
|
2181
|
-
async function removeTelegramBot(ui, deps) {
|
|
2237
|
+
async function removeTelegramBot(ui, flags, deps) {
|
|
2182
2238
|
const state = loadProviderEnvState("telegram", deps);
|
|
2183
2239
|
const parsed = { ...state.parsed };
|
|
2184
|
-
const selected = await chooseTelegramEntry(ui, parsed, deps, "Select Telegram bot entry to remove");
|
|
2240
|
+
const selected = await chooseTelegramEntry(ui, parsed, deps, "Select Telegram bot entry to remove", flags);
|
|
2185
2241
|
if (!selected) return;
|
|
2186
2242
|
if (!await promptConfirmChoice(ui, `Remove Telegram bot "${selected.key}"?`, {
|
|
2187
2243
|
confirmLabel: "Remove bot",
|
|
@@ -2216,7 +2272,7 @@ async function verifyProviderEntry(ui, provider, flags, deps) {
|
|
|
2216
2272
|
botName: requestedBotName,
|
|
2217
2273
|
};
|
|
2218
2274
|
} else {
|
|
2219
|
-
const selected = await chooseTelegramEntry(ui, state.parsed, deps, "Select Telegram bot entry to verify");
|
|
2275
|
+
const selected = await chooseTelegramEntry(ui, state.parsed, deps, "Select Telegram bot entry to verify", flags);
|
|
2220
2276
|
selectors = {
|
|
2221
2277
|
botKey: selected.key,
|
|
2222
2278
|
botID: selected.serverBotID,
|
|
@@ -2556,7 +2612,7 @@ async function runBotRemove(ui, flags, deps) {
|
|
|
2556
2612
|
process.stdout.write(`Removed Telegram bot "${selected.key}" from ${filePath}\n`);
|
|
2557
2613
|
return;
|
|
2558
2614
|
}
|
|
2559
|
-
await removeTelegramBot(ui, deps);
|
|
2615
|
+
await removeTelegramBot(ui, flags, deps);
|
|
2560
2616
|
return;
|
|
2561
2617
|
}
|
|
2562
2618
|
await removeTokenOnlyProvider(ui, provider, flags, deps);
|
|
@@ -2583,7 +2639,7 @@ async function runBotSetDefault(ui, flags, deps) {
|
|
|
2583
2639
|
const nonInteractive = boolFromRaw(flags["non-interactive"] ?? flags.yes, false);
|
|
2584
2640
|
const selected = nonInteractive
|
|
2585
2641
|
? findTelegramEntryByFlags(parsed, flags, deps)
|
|
2586
|
-
: await chooseTelegramEntry(ui, parsed, deps, "Select default Telegram bot");
|
|
2642
|
+
: await chooseTelegramEntry(ui, parsed, deps, "Select default Telegram bot", flags);
|
|
2587
2643
|
if (!selected) {
|
|
2588
2644
|
throw new Error("Telegram bot selector is required for set-default");
|
|
2589
2645
|
}
|