/**
* feature `gov-system` —— 系统管理:LLM 实例四元绑定、通道实例
*
* 自 `~/coding/JCAI_PRD/governance/_components/Governance.tsx` 平移:
* DOM 结构、类名(`g-*` + 色调 `t-*`)与文案原样保留,mock 常量换成服务端投影(README 平移规则 1/2/4)。
* 区首页只负责导航,治理动作一律落在下钻详情页的**就地确认带**(影响预览三必答)。
*/
import { Card, Chip, NList, NRow, Note, PageHead, QueryGate, Rows, St } from '@web-shared/gov/primitives.tsx';
import type { Nav } from '@web-shared/gov/gov-route.ts';
import {
useGovChannels,
useGovLlm,
} from '@web-shared/gov/gov-api.ts';
export type HomeProps = { tab: string; nav: Nav };
export function SystemHome({ tab, nav }: HomeProps) {
const llm = useGovLlm();
const channels = useGovChannels();
if (tab === 'chan') {
return (
<>
通道实例声明归属键规则与默认认领岗位。归属解析三级逐级短路:会话线程 → 监听键 → 地址窗口;
歧义或失败一律判无主——宁交人,不错投。
{(channels.data?.channels ?? []).map((ch) => (
{Math.round(ch.addressWindowMs / 3600_000)}h },
{ k: '默认认领岗位', v: ch.fallbackPosition ?? '—' },
]}
right={
{ch.enabled ? '已启用' : '已停用'}
}
onClick={() => nav.push({ k: 'chan', id: ch.id })}
/>
))}
>
);
}
return (
<>
LLM 实例是名称间接层:活动只见自定义模型名,Provider / URL / API-Key / Model 四元在系统侧绑定。
密钥与 endpoint 值只存治理台——不入包、不入活动、不入留痕明文。
{(llm.data?.instances ?? []).map((i) => (
{i.baseUrl} },
{ k: '系统用途', v: i.systemUse ? '是' : '—' },
]}
right={
{i.apiKeyBound ? '密钥已绑定' : '密钥未绑定'}
}
onClick={() => nav.push({ k: 'llm', id: i.id })}
/>
))}
>
);
}
export function LlmPage({ id }: { id: string }) {
const q = useGovLlm();
const i = (q.data?.instances ?? []).find((x) => x.id === id);
if (i === undefined) return 实例不存在。;
return (
<>
{i.model}
{i.apiKeyBound ? '密钥已绑定' : '密钥未绑定'}
{i.systemUse && 系统用途}
>
}
desc="名称间接层:活动只声明自定义模型名,四元绑定在系统侧。换厂商、换端点、换密钥都不动活动一行代码。"
/>
>
);
}
export function ChanPage({ id }: { id: string }) {
const q = useGovChannels();
const ch = (q.data?.channels ?? []).find((x) => x.id === id);
if (ch === undefined) return 通道不存在。;
return (
<>
{ch.address}
{ch.enabled ? '已启用' : '已停用'}
>
}
desc="归属解析三级逐级短路:会话线程 → 监听键 → 地址窗口;歧义或失败一律判无主——宁交人,不错投。"
/>
>
);
}