/** * 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="归属解析三级逐级短路:会话线程 → 监听键 → 地址窗口;歧义或失败一律判无主——宁交人,不错投。" /> ); }