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.
@@ -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
- entries.map((entry) => ({
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
- async function resolveTelegramServerBindingDetails(envConfig, flags, deps) {
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metheus-governance-mcp-cli",
3
- "version": "0.2.78",
3
+ "version": "0.2.79",
4
4
  "description": "Metheus Governance MCP CLI (setup + stdio proxy)",
5
5
  "type": "module",
6
6
  "files": [