feat: carry oneliner config version into agent runs
Some checks failed
StoryForge CI / Baseline checks (push) Has been cancelled
StoryForge CI / Backend tests (push) Has been cancelled
StoryForge CI / Web tests (push) Has been cancelled

This commit is contained in:
kris
2026-03-31 04:03:05 +08:00
parent c14e573152
commit bbceada4f1
5 changed files with 129 additions and 7 deletions

View File

@@ -1130,6 +1130,7 @@ function renderOneLinerRunsHtml() {
? "orange"
: "";
const canRetryCurrentRun = ["blocked", "failed", "cancelled"].includes(currentRun.run_status);
const currentRunConfigVersion = currentRun.governance?.oneliner_profile_version || currentRun.governance?.oneliner_profile?.current_version || {};
return `
<div class="task-item compact" style="margin-bottom:10px;">
<h4>近期运行概况</h4>
@@ -1172,6 +1173,7 @@ function renderOneLinerRunsHtml() {
<span>当前运行</span>
<strong>${escapeHtml(runStatusLabel)}</strong>
<span>${escapeHtml(currentRun.platform_scope === "all_platforms" ? "全平台" : "单平台")}</span>
${currentRunConfigVersion.version_no ? `<span>${escapeHtml(`配置 v${formatNumber(currentRunConfigVersion.version_no || 0)}`)}</span>` : ""}
<strong>${escapeHtml(recommendedAction?.label || "继续这个任务")}</strong>
</div>
<div class="mobile-only mobile-flow-focus-card">
@@ -1199,6 +1201,7 @@ function renderOneLinerRunsHtml() {
<span class="tag ${statusTone}">${escapeHtml(runStatusLabel)}</span>
${currentRun.platform_label ? `<span class="tag">${escapeHtml(currentRun.platform_label)}</span>` : ""}
<span class="tag">${escapeHtml(onelinerIntentLabel(currentRun.intent_key))}</span>
${currentRunConfigVersion.version_no ? `<span class="tag blue">配置 v${escapeHtml(formatNumber(currentRunConfigVersion.version_no || 0))}</span>` : ""}
${currentRun.source_screen ? `<span class="tag">${escapeHtml(currentRun.source_screen)}</span>` : ""}
</div>
</div>
@@ -1215,9 +1218,20 @@ function renderOneLinerRunsHtml() {
<span class="tag blue">${escapeHtml(currentRun.source_action_key || "manual-handoff")}</span>
<span class="tag">${escapeHtml(currentRun.platform_scope === "all_platforms" ? "全平台" : "单平台")}</span>
${currentRun.delivery_mode ? `<span class="tag">${escapeHtml(currentRun.delivery_mode)}</span>` : ""}
${currentRunConfigVersion.version_no ? `<span class="tag">配置版本 ${escapeHtml(formatNumber(currentRunConfigVersion.version_no || 0))}</span>` : ""}
${previewAction?.action ? `<span class="tag clickable-tag" data-action="${escapeHtml(previewAction.action)}" ${previewLandingAttrs}>${escapeHtml(`预计落点 · ${previewAction.label || "对应页面"}`)}</span>` : ""}
</div>
</div>
${currentRunConfigVersion.version_no ? `
<div class="task-item compact" style="margin-top:10px;">
<h4>本轮主配置版本</h4>
<p>${escapeHtml(currentRunConfigVersion.summary || currentRunConfigVersion.title || `OneLiner 配置 v${formatNumber(currentRunConfigVersion.version_no || 0)}`)}</p>
<div class="task-meta">
<span class="tag blue">配置 v${escapeHtml(formatNumber(currentRunConfigVersion.version_no || 0))}</span>
<span class="tag clickable-tag" data-action="open-oneliner-profile-history">查看配置历史</span>
</div>
</div>
` : ""}
${!hasResultPayload && previewAction?.summary ? `<div class="panel-subtitle" style="margin-top:8px;">${escapeHtml(previewAction.summary)}</div>` : ""}
${planSteps.length ? `
<div class="list" style="margin-top:10px;">
@@ -1304,6 +1318,7 @@ function renderOneLinerMessagesHtml() {
const plan = message.plan || {};
const executionCard = result.execution_card || {};
const activeAdminOverrideNotice = executionCard.active_admin_override_notice || null;
const profileVersion = executionCard.oneliner_profile_version || {};
const actions = safeArray(plan.suggested_actions);
const secondaryActions = safeArray(executionCard.secondary_actions);
return `
@@ -1331,9 +1346,13 @@ function renderOneLinerMessagesHtml() {
${executionCard.platform_label ? `<span class="tag blue">${escapeHtml(executionCard.platform_label)}</span>` : ""}
${executionCard.platform_agent_name ? `<span class="tag">${escapeHtml(executionCard.platform_agent_name)}</span>` : ""}
${executionCard.assistant_name ? `<span class="tag green">${escapeHtml(executionCard.assistant_name)}</span>` : ""}
${profileVersion.version_no ? `<span class="tag">配置 v${escapeHtml(formatNumber(profileVersion.version_no || 0))}</span>` : ""}
${executionCard.readiness_label ? `<span class="tag ${executionCard.readiness_score >= 75 ? "green" : executionCard.readiness_score >= 50 ? "blue" : "orange"}">${escapeHtml(executionCard.readiness_label)} ${escapeHtml(formatNumber(executionCard.readiness_score || 0))}</span>` : ""}
${executionCard.primary_action?.key ? `<span class="tag clickable-tag" data-action="${escapeHtml(executionCard.primary_action.key)}">${escapeHtml(executionCard.primary_action.label || "执行下一步")}</span>` : ""}
</div>
${profileVersion.version_no ? `
<div class="panel-subtitle" style="margin-top:8px;">${escapeHtml(profileVersion.summary || profileVersion.title || `当前按 OneLiner 配置 v${formatNumber(profileVersion.version_no || 0)} 执行。`)}</div>
` : ""}
${activeAdminOverrideNotice?.title ? `
<div class="task-item compact" style="margin-top:10px; border-color:rgba(245, 158, 11, 0.28); background:linear-gradient(180deg, rgba(255, 250, 240, 0.98) 0%, rgba(255, 255, 255, 0.98) 100%);">
<h4>管理员覆盖生效中</h4>
@@ -1425,6 +1444,7 @@ function renderOneLinerUi() {
<span class="tag blue">${escapeHtml(profile?.display_name || "OneLiner")}</span>
<span class="tag">${escapeHtml(getSelectedProject()?.name || "未选项目")}</span>
<span class="tag">${escapeHtml(profile?.default_platform ? platformLabel(profile.default_platform) : "未设默认平台")}</span>
${profile?.current_version?.version_no ? `<span class="tag">配置 v${escapeHtml(formatNumber(profile.current_version.version_no || 0))}</span>` : ""}
<span class="tag green">${escapeHtml(formatNumber(safeArray(appState.platformAgents).length))} 个平台 Agent</span>
</div>
<div class="helper-text">${escapeHtml(profile?.long_term_goal || "当前没有设置长期目标。你可以先在这里说目标,后续再逐步产品化。")}</div>
@@ -1948,6 +1968,7 @@ function renderOneLinerExecutionPayloadHtml(payload) {
? payload.result_sections
: {};
const resultCards = safeArray(resultSections.cards).slice(0, 4);
const configVersion = payload.execution_card?.oneliner_profile_version || payload.context?.oneliner_profile?.current_version || {};
const landingAttrs = buildMainAgentLandingAttrs({
runId: landingRunId,
screen: landingScreen,
@@ -1961,10 +1982,21 @@ function renderOneLinerExecutionPayloadHtml(payload) {
<div class="task-meta">
${payload.platform ? `<span class="tag blue">${escapeHtml(platformLabel(payload.platform))}</span>` : ""}
<span class="tag">${escapeHtml(payload.platform_scope === "all_platforms" ? "全平台" : "单平台")}</span>
${configVersion.version_no ? `<span class="tag">配置 v${escapeHtml(formatNumber(configVersion.version_no || 0))}</span>` : ""}
<span class="tag green">已收口</span>
${payload.recommended_action?.action ? `<span class="tag clickable-tag" data-action="${escapeHtml(payload.recommended_action.action)}" data-main-agent-run-id="${escapeHtml(landingRunId)}" data-main-agent-screen="${escapeHtml(landingScreen)}" data-main-agent-title="${escapeHtml(landingTitle)}" data-main-agent-summary="${escapeHtml(landingSummary)}" ${landingAttrs}>${escapeHtml(payload.recommended_action.label || "回到对应页面")}</span>` : ""}
</div>
</div>
${configVersion.version_no ? `
<div class="task-item compact" style="margin-top:12px;">
<h4>本轮使用的主配置</h4>
<p>${escapeHtml(configVersion.summary || configVersion.title || `OneLiner 主配置版本 v${formatNumber(configVersion.version_no || 0)}`)}</p>
<div class="task-meta">
<span class="tag blue">配置 v${escapeHtml(formatNumber(configVersion.version_no || 0))}</span>
<span class="tag clickable-tag" data-action="open-oneliner-profile-history">查看配置历史</span>
</div>
</div>
` : ""}
${resultCards.length ? `
<div class="task-item compact" style="margin-top:12px;">
<h4>${escapeHtml(resultSections.workstream_label || "执行结果分组")}</h4>

View File

@@ -572,10 +572,15 @@ test("oneliner meta and action handlers expose governance entry points", () => {
const meta = extractBetween(APP, "function renderOneLinerUi()", "function openOneLinerPanel()");
const messages = extractBetween(APP, "function renderOneLinerMessagesHtml()", "function renderOneLinerUi()");
const actions = extractBetween(APP, "document.addEventListener(\"click\", async (event) => {", "document.addEventListener(\"submit\", async (event) => {");
const runs = extractBetween(APP, "function renderOneLinerRunsHtml()", "function renderOneLinerMessagesHtml()");
assert.match(meta, /open-user-global-policy/);
assert.match(meta, /配置 v/);
assert.match(meta, /renderOneLinerRunsHtml\(\)/);
assert.match(meta, /policyScopeTagLabel/);
assert.match(messages, /active_admin_override_notice/);
assert.match(messages, /oneliner_profile_version/);
assert.match(runs, /oneliner_profile_version/);
assert.match(runs, /open-oneliner-profile-history/);
assert.match(actions, /name === "open-user-global-policy"/);
assert.match(actions, /name === "open-system-main-policy"/);
assert.match(actions, /name === "handoff-to-main-agent"/);