feat: align capability empty states with live collector

This commit is contained in:
kris
2026-03-30 16:50:37 +08:00
parent 5dae80c4ac
commit 3f7aa2514d
2 changed files with 58 additions and 6 deletions

View File

@@ -3875,10 +3875,17 @@ function renderOneLinerActionRegistryPanel() {
<div class="panel-head">
<div>
<h3>OneLiner 动作注册表</h3>
<div class="panel-subtitle">当前后端还没返回动作注册表,先沿用默认动作。</div>
<div class="panel-subtitle">当前项目还没有单独动作配置OneLiner 会继续沿用系统默认动作。</div>
</div>
</div>
<div class="task-item">
<h4>当前沿用系统默认动作</h4>
<p>你可以等真实使用场景稳定后,再回来给当前项目单独开关、改名或补充动作说明。</p>
<div class="task-meta">
<span class="tag blue">系统默认仍可执行</span>
<span class="tag">当前项目未单独覆盖</span>
</div>
</div>
<div class="task-item"><h4>暂未接入</h4><p>等 <code>/v2/oneliner/action-registry</code> 可用后,这里会显示动作开关、描述和租户级配置。</p></div>
</div>
`;
}
@@ -3923,8 +3930,20 @@ function renderTenantQuotaPanel() {
if (!quota && !usage) {
return `
<div class="panel pad">
<div class="panel-head"><div><h3>租户额度与审计</h3><div class="panel-subtitle">当前后端还没接入 quota / usage。</div></div></div>
<div class="task-item"><h4>暂未接入</h4><p>等 live collector 同步 `/v2/tenant/quota``/v2/tenant/usage` 后,这里会展示本周期预算、动作配额和最近计量记录。</p></div>
<div class="panel-head">
<div>
<h3>租户额度与审计</h3>
<div class="panel-subtitle">当前项目还没有额度配置,会先按默认不限额模式运行。</div>
</div>
</div>
<div class="task-item">
<h4>当前项目还没有额度配置</h4>
<p>先给这个项目补预算、动作配额和存储上限,再逐步收紧风险控制。</p>
<div class="task-meta">
<span class="tag clickable-tag" data-action="open-tenant-quota">创建额度策略</span>
<span class="tag blue">默认不限额</span>
</div>
</div>
</div>
`;
}
@@ -4236,8 +4255,24 @@ function renderPlatformAgentPanel() {
if (!items.length) {
return `
<div class="panel pad">
<div class="panel-head"><div><h3>平台 Agent</h3><div class="panel-subtitle">当前后端还没接入平台 Agent 控制面。</div></div></div>
<div class="task-item"><h4>暂未接入</h4><p>等 live collector 同步 `/v2/platform-agents` 后,这里会切成真实视图。</p></div>
<div class="panel-head">
<div>
<h3>平台 Agent</h3>
<div class="panel-subtitle">当前项目还没有平台 Agent 配置,先从最常用的平台补起。</div>
</div>
</div>
<div class="three-col">
${ACTIVE_PLATFORMS.map((platformItem) => `
<div class="entity-card pad">
<div class="cell-title">${escapeHtml(platformItem.label)} Agent</div>
<div class="cell-desc">当前还没有单独配置,主 Agent 会先沿用系统默认平台方法论。</div>
<div class="entity-meta">
<span class="tag blue">未单独配置</span>
<span class="tag clickable-tag" data-action="open-platform-agent-profile" data-platform="${escapeHtml(platformItem.value)}">开始配置</span>
</div>
</div>
`).join("")}
</div>
</div>
`;
}

View File

@@ -254,6 +254,23 @@ test("discovery, production, and admin screens use page tabs for heavy content",
assert.match(strategy, /renderPolicyAuditFeed\(/);
});
test("governance and quota panels use real empty-state language instead of backend-sync placeholders", () => {
const actionRegistry = extractBetween(APP, "function renderOneLinerActionRegistryPanel()", "function renderTenantQuotaPanel()");
const tenantQuota = extractBetween(APP, "function renderTenantQuotaPanel()", "function policyScopeTagLabel(");
const platformAgents = extractBetween(APP, "function renderPlatformAgentPanel()", "function renderTrackingScreen()");
assert.doesNotMatch(actionRegistry, /等 <code>\/v2\/oneliner\/action-registry<\/code> 可用后/);
assert.match(actionRegistry, /当前项目还没有单独动作配置/);
assert.doesNotMatch(tenantQuota, /等 live collector 同步 `\/v2\/tenant\/quota` 和 `\/v2\/tenant\/usage` 后/);
assert.match(tenantQuota, /当前项目还没有额度配置/);
assert.match(tenantQuota, /data-action="open-tenant-quota"/);
assert.doesNotMatch(platformAgents, /等 live collector 同步 `\/v2\/platform-agents` 后/);
assert.match(platformAgents, /当前项目还没有平台 Agent 配置/);
assert.match(platformAgents, /open-platform-agent-profile/);
});
test("discovery and production screens expose compact mobile flow summaries", () => {
const discovery = extractBetween(APP, "function renderDiscoveryScreen()", "function renderTrackingScreen()");
const production = extractBetween(APP, "function renderProductionScreen()", "function renderReviewScreen()");