chore: show dm policy + allowlist preview

This commit is contained in:
Peter Steinberger
2026-01-08 11:25:17 +01:00
parent 8803787e48
commit 390b102563
2 changed files with 43 additions and 2 deletions

View File

@@ -36,7 +36,8 @@ import {
webAuthExists, webAuthExists,
} from "../../web/session.js"; } from "../../web/session.js";
import { formatAge } from "../../infra/provider-summary.js"; import { formatAge } from "../../infra/provider-summary.js";
import type { ClawdbotConfig } from "../../config/config.js"; import { normalizeE164 } from "../../utils.js";
import { readConfigFileSnapshot, type ClawdbotConfig } from "../../config/config.js";
export type ProvidersStatusOptions = { export type ProvidersStatusOptions = {
json?: boolean; json?: boolean;
@@ -70,6 +71,12 @@ export function formatGatewayProvidersStatusLines(
if (typeof account.mode === "string" && account.mode.length > 0) { if (typeof account.mode === "string" && account.mode.length > 0) {
bits.push(`mode:${account.mode}`); bits.push(`mode:${account.mode}`);
} }
if (typeof account.dmPolicy === "string" && account.dmPolicy.length > 0) {
bits.push(`dm:${account.dmPolicy}`);
}
if (Array.isArray(account.allowFrom) && account.allowFrom.length > 0) {
bits.push(`allow:${account.allowFrom.slice(0, 2).join(",")}`);
}
if (typeof account.tokenSource === "string" && account.tokenSource) { if (typeof account.tokenSource === "string" && account.tokenSource) {
bits.push(`token:${account.tokenSource}`); bits.push(`token:${account.tokenSource}`);
} }
@@ -136,9 +143,17 @@ export function formatGatewayProvidersStatusLines(
async function formatConfigProvidersStatusLines( async function formatConfigProvidersStatusLines(
cfg: ClawdbotConfig, cfg: ClawdbotConfig,
meta: { path?: string; mode?: "local" | "remote" },
): Promise<string[]> { ): Promise<string[]> {
const lines: string[] = []; const lines: string[] = [];
lines.push(theme.warn("Gateway not reachable; showing config-only status.")); lines.push(theme.warn("Gateway not reachable; showing config-only status."));
if (meta.path) {
lines.push(`Config: ${meta.path}`);
}
if (meta.mode) {
lines.push(`Mode: ${meta.mode}`);
}
if (meta.path || meta.mode) lines.push("");
const accountLines = ( const accountLines = (
provider: ChatProvider, provider: ChatProvider,
@@ -184,12 +199,19 @@ async function formatConfigProvidersStatusLines(
const accounts = { const accounts = {
whatsapp: listWhatsAppAccountIds(cfg).map((accountId) => { whatsapp: listWhatsAppAccountIds(cfg).map((accountId) => {
const account = resolveWhatsAppAccount({ cfg, accountId }); const account = resolveWhatsAppAccount({ cfg, accountId });
const dmPolicy = account.dmPolicy ?? cfg.whatsapp?.dmPolicy ?? "pairing";
const allowFrom = (account.allowFrom ?? cfg.whatsapp?.allowFrom ?? [])
.map(normalizeE164)
.filter(Boolean)
.slice(0, 2);
return { return {
accountId: account.accountId, accountId: account.accountId,
name: account.name, name: account.name,
enabled: account.enabled, enabled: account.enabled,
configured: true, configured: true,
linked: undefined, linked: undefined,
dmPolicy,
allowFrom,
}; };
}), }),
telegram: listTelegramAccountIds(cfg).map((accountId) => { telegram: listTelegramAccountIds(cfg).map((accountId) => {
@@ -305,6 +327,15 @@ export async function providersStatusCommand(
runtime.error(`Gateway not reachable: ${String(err)}`); runtime.error(`Gateway not reachable: ${String(err)}`);
const cfg = await requireValidConfig(runtime); const cfg = await requireValidConfig(runtime);
if (!cfg) return; if (!cfg) return;
runtime.log((await formatConfigProvidersStatusLines(cfg)).join("\n")); const snapshot = await readConfigFileSnapshot();
const mode = cfg.gateway?.mode === "remote" ? "remote" : "local";
runtime.log(
(
await formatConfigProvidersStatusLines(cfg, {
path: snapshot.path,
mode,
})
).join("\n"),
);
} }
} }

View File

@@ -63,6 +63,16 @@ export async function buildProviderSummary(
const details: string[] = []; const details: string[] = [];
if (!account.enabled) details.push("disabled"); if (!account.enabled) details.push("disabled");
if (account.selfChatMode) details.push("self-chat"); if (account.selfChatMode) details.push("self-chat");
const dmPolicy =
account.dmPolicy ?? effective.whatsapp?.dmPolicy ?? "pairing";
details.push(`dm:${dmPolicy}`);
const allowFrom = (account.allowFrom ?? effective.whatsapp?.allowFrom ?? [])
.map(normalizeE164)
.filter(Boolean)
.slice(0, 2);
if (allowFrom.length > 0) {
details.push(`allow:${allowFrom.join(",")}`);
}
lines.push( lines.push(
accountLine( accountLine(
formatAccountLabel({ formatAccountLabel({