import { useState } from "react"; import { adminChannelTest } from "../../../lib/api"; import type { ChannelTestResult } from "../../../lib/types"; import { useAuditStore } from "../../audit"; import { Button, Surface, Tag } from "../../../components/primitives"; /** Structural identity test (design/08: actor metadata × owner whitelist — never a * prompt/LLM judgment). Self-contained so the list page and any adapter detail * page can render it; `defaultPlatform` prefills when known. */ export function ChannelIdentityTest({ defaultPlatform = "", disabled = false, }: { defaultPlatform?: string; disabled?: boolean; }): React.ReactNode { const log = useAuditStore((s) => s.log); const [platform, setPlatform] = useState(defaultPlatform); const [ownerId, setOwnerId] = useState(""); const [group, setGroup] = useState(false); const [verdict, setVerdict] = useState(null); const [testing, setTesting] = useState(false); const [err, setErr] = useState(null); const test = () => { if (!ownerId.trim()) { setErr("邮箱/账号 id 不能为空"); return; } setTesting(true); setErr(null); adminChannelTest({ platform: platform.trim(), accountId: ownerId.trim(), isGroup: group }) .then((v) => { log("channel.identity-test", "ok"); setVerdict(v); }) .catch((e: unknown) => { log("channel.identity-test", "error"); setErr(e instanceof Error ? e.message : "身份测试失败"); }) .finally(() => setTesting(false)); }; return (

身份识别测试(结构性判定 · 绝非提示词)

输入渠道确认的发送者账号 id,后端用 channel 层 actor 元数据 × 主人白名单(configs/users/owner.yaml)判定;判定绝不依赖提示词 / LLM 自我判断。

setPlatform(e.target.value)} placeholder="platform(如 kook,可留空)" className="min-w-0 flex-1 rounded-[var(--mu-radius)] bg-[var(--mu-surface-2)] px-3 py-2 text-sm outline-none focus:ring-1 focus:ring-[var(--mu-accent)]" /> setOwnerId(e.target.value)} placeholder="渠道账号 id(发送者 id)" className="min-w-0 flex-1 rounded-[var(--mu-radius)] bg-[var(--mu-surface-2)] px-3 py-2 text-sm outline-none focus:ring-1 focus:ring-[var(--mu-accent)]" />
{err ? {err} : null} {verdict ? (
角色:{verdict.role} | 主人:{verdict.owner ? "是" : "否"} | 群聊:{verdict.isGroup ? "是" : "否"} | 环境:{verdict.env}
判定:{verdict.verdict}
) : null}
); }