feat: route main agent results back into workbench
This commit is contained in:
@@ -977,6 +977,7 @@ function renderOneLinerRunsHtml() {
|
||||
const runEvents = safeArray(currentRun.events).slice(-3);
|
||||
const planSteps = safeArray(currentRun.plan?.steps).slice(0, 4);
|
||||
const resultPayload = currentRun.result && typeof currentRun.result === "object" ? currentRun.result : null;
|
||||
const recommendedAction = resultPayload?.recommended_action || null;
|
||||
const hasResultPayload = Boolean(resultPayload && Object.keys(resultPayload).length);
|
||||
const runStatusLabel = {
|
||||
needs_confirmation: "待确认",
|
||||
@@ -1043,7 +1044,9 @@ function renderOneLinerRunsHtml() {
|
||||
<span class="tag ${statusTone}">${escapeHtml(currentRun.status_summary || "主 Agent 正在推进中")}</span>
|
||||
`}
|
||||
${hasResultPayload ? `<span class="tag clickable-tag" data-action="open-oneliner-run-result" data-run-id="${escapeHtml(currentRun.id)}">查看结果</span>` : ""}
|
||||
${recommendedAction?.action ? `<span class="tag clickable-tag" data-action="${escapeHtml(recommendedAction.action)}">${escapeHtml(recommendedAction.label || "回到对应页面")}</span>` : ""}
|
||||
</div>
|
||||
${recommendedAction?.summary ? `<div class="panel-subtitle" style="margin-top:8px;">${escapeHtml(recommendedAction.summary)}</div>` : ""}
|
||||
${hasResultPayload ? `
|
||||
<div class="task-item compact" style="margin-top:10px;">
|
||||
<h4>执行结果</h4>
|
||||
@@ -1737,8 +1740,15 @@ function renderOneLinerExecutionPayloadHtml(payload) {
|
||||
${payload.platform ? `<span class="tag blue">${escapeHtml(platformLabel(payload.platform))}</span>` : ""}
|
||||
<span class="tag">${escapeHtml(payload.platform_scope === "all_platforms" ? "全平台" : "单平台")}</span>
|
||||
<span class="tag green">已收口</span>
|
||||
${payload.recommended_action?.action ? `<span class="tag clickable-tag" data-action="${escapeHtml(payload.recommended_action.action)}">${escapeHtml(payload.recommended_action.label || "回到对应页面")}</span>` : ""}
|
||||
</div>
|
||||
</div>
|
||||
${payload.recommended_action?.summary ? `
|
||||
<div class="task-item compact" style="margin-top:12px;">
|
||||
<h4>建议回跳</h4>
|
||||
<p>${escapeHtml(payload.recommended_action.summary)}</p>
|
||||
</div>
|
||||
` : ""}
|
||||
${safeArray(payload.next_steps).length ? `
|
||||
<div class="list" style="margin-top:12px;">
|
||||
${safeArray(payload.next_steps).slice(0, 4).map((step, index) => `
|
||||
@@ -6174,6 +6184,9 @@ function extractGeneratedCopy(payload) {
|
||||
|
||||
function renderLastActionCard() {
|
||||
if (!appState.lastAction) return "";
|
||||
const payload = appState.lastAction.payload || {};
|
||||
const recommendedAction = payload?.result?.recommended_action || payload?.recommended_action || null;
|
||||
const runId = payload?.id || payload?.run_id || "";
|
||||
return `
|
||||
<div class="panel pad">
|
||||
<div class="panel-head">
|
||||
@@ -6186,6 +6199,12 @@ function renderLastActionCard() {
|
||||
<div class="task-item">
|
||||
<h4>${escapeHtml(appState.lastAction.title)}</h4>
|
||||
<p>${escapeHtml(appState.lastAction.summary)}</p>
|
||||
${(runId || recommendedAction?.action) ? `
|
||||
<div class="task-meta" style="margin-top:10px;">
|
||||
${runId ? `<span class="tag clickable-tag" data-action="open-oneliner-run-result" data-run-id="${escapeHtml(runId)}">查看结果</span>` : ""}
|
||||
${recommendedAction?.action ? `<span class="tag clickable-tag" data-action="${escapeHtml(recommendedAction.action)}">${escapeHtml(recommendedAction.label || "回到对应页面")}</span>` : ""}
|
||||
</div>
|
||||
` : ""}
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
@@ -136,6 +136,7 @@ test("oneliner panel includes a dedicated runtime header for agent runs", () =>
|
||||
assert.match(runtime, /当前计划/);
|
||||
assert.match(runtime, /renderOneLinerExecutionPayloadHtml\(currentRun\.result\)/);
|
||||
assert.match(runtime, /open-oneliner-run-result/);
|
||||
assert.match(runtime, /recommended_action/);
|
||||
});
|
||||
|
||||
test("oneliner meta and action handlers expose governance entry points", () => {
|
||||
@@ -229,3 +230,12 @@ test("user governance UI exposes personal history and rollback entrypoints", ()
|
||||
assert.match(actions, /name === "open-user-global-policy-history"/);
|
||||
assert.match(actions, /name === "open-user-platform-policy-history"/);
|
||||
});
|
||||
|
||||
test("main agent result rendering offers a direct route back into the recommended screen", () => {
|
||||
const execution = extractBetween(APP, "function renderOneLinerExecutionPayloadHtml(payload)", "function parseOneLinerActionPayloadValue(value)");
|
||||
const lastAction = extractBetween(APP, "function renderLastActionCard()", "function getJobRecoveryCategory(job)");
|
||||
assert.match(execution, /recommended_action/);
|
||||
assert.match(execution, /data-action="\$\{escapeHtml\(payload\.recommended_action\.action\)\}"/);
|
||||
assert.match(lastAction, /open-oneliner-run-result/);
|
||||
assert.match(lastAction, /recommended_action/);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user