feat: reopen platform agent detail after mutations
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-04-04 08:49:57 +08:00
parent fe9a6c7cc1
commit 4ef0b3e805
3 changed files with 31 additions and 0 deletions

View File

@@ -4,6 +4,12 @@
## 2026-04-04
### 平台 Agent 变更后自动回到详情工作区
- `平台 Agent 配置保存 / 配置回滚 / 记忆保存 / 技能保存 / 技能验收 / 技能回滚` 这些动作成功后,不再只停在通用成功提示。
- 前端现在会在动作完成后自动重开对应的平台 Agent 详情工作区,让用户立刻看到最新记忆、技能、最近执行和配置版本,不用自己再点回去确认结果。
- 这条行为已经补进前端回归,锁住平台 Agent 相关变更必须能顺着同一个详情视图继续做下一步。
### 主 Agent 完成态保留精确对象上下文
- 主 Agent run 在创建时会把 `target_account_id / tracked_account_id / job_id / review_id / source_id / assistant_id` 这类对象上下文固化进执行计划,不再只记一个泛化的来源页面。

View File

@@ -9533,6 +9533,12 @@ async function openSystemPlatformPolicyHistoryAction(platform, preferredVersionI
});
}
function reopenPlatformAgentDetailSoon(platform) {
setTimeout(() => {
void openPlatformAgentDetailAction(platform);
}, 0);
}
function openPlatformAgentProfileAction(platform) {
const project = requireSelectedProject();
const agents = safeArray(appState.platformAgents);
@@ -9572,6 +9578,7 @@ function openPlatformAgentProfileAction(platform) {
appState.platformAgents = safeArray(appState.platformAgents).filter((item) => item.platform !== platform).concat(saved).sort((a, b) => String(a.platform).localeCompare(String(b.platform)));
rememberAction("平台 Agent 已保存", `已更新 ${platformLabel(platform)} Agent当前版本 ${saved.current_version?.version_no || 1}`, "green", saved);
renderAll();
reopenPlatformAgentDetailSoon(platform);
}
});
}
@@ -9609,6 +9616,7 @@ async function openPlatformAgentProfileHistoryAction(platform, preferredVersionI
appState.platformAgents = safeArray(appState.platformAgents).filter((item) => item.platform !== normalizedPlatform).concat(saved).sort((a, b) => String(a.platform).localeCompare(String(b.platform)));
rememberAction(`${platformLabel(normalizedPlatform)} Agent 已回滚`, `已回滚到版本 ${saved.current_version?.version_no || "所选版本"}`, "green", saved);
renderAll();
reopenPlatformAgentDetailSoon(normalizedPlatform);
}
});
}
@@ -9647,6 +9655,7 @@ function openPlatformAgentMemoryAction(platform) {
rememberAction("平台记忆已保存", `已把这条方法沉淀到 ${platformLabel(platform)} Agent 记忆中。`, "green", saved);
await loadAgentControlSurfaces(project.id);
renderAll();
reopenPlatformAgentDetailSoon(platform);
}
});
}
@@ -9685,6 +9694,7 @@ function openPlatformAgentSkillAction(platform) {
rememberAction("平台技能已保存", `已把方法固化到 ${platformLabel(platform)} Agent 技能中。`, "green", saved);
await loadAgentControlSurfaces(project.id);
renderAll();
reopenPlatformAgentDetailSoon(platform);
}
});
}
@@ -9860,6 +9870,7 @@ function openPlatformSkillReviewAction(platform, skillId, accepted) {
);
await loadAgentControlSurfaces(project.id);
renderAll();
reopenPlatformAgentDetailSoon(normalizedPlatform);
}
});
}
@@ -9897,6 +9908,7 @@ function openPlatformSkillRollbackAction(platform, skillId, versionId) {
rememberAction("技能已回滚", `已回滚到版本 ${payload.rollback_from_version?.version_no || "指定版本"}`, "green", payload);
await loadAgentControlSurfaces(project.id);
renderAll();
reopenPlatformAgentDetailSoon(normalizedPlatform);
}
});
}

View File

@@ -790,21 +790,34 @@ test("main agent runtime and platform recent execution preserve structured follo
test("platform agent profiles expose history, rollback, and execution version context", () => {
const actions = extractBetween(APP, "document.addEventListener(\"click\", async (event) => {", "document.addEventListener(\"submit\", async (event) => {");
const reopenHelper = extractBetween(APP, "function reopenPlatformAgentDetailSoon(platform) {", "function openPlatformAgentProfileAction(platform) {");
const profileEditor = extractBetween(APP, "function openPlatformAgentProfileAction(platform)", "async function openPlatformAgentProfileHistoryAction(platform, preferredVersionId = \"\")");
const profileHistory = extractBetween(APP, "async function openPlatformAgentProfileHistoryAction(platform, preferredVersionId = \"\")", "function openPlatformAgentMemoryAction(platform)");
const memoryEditor = extractBetween(APP, "function openPlatformAgentMemoryAction(platform)", "function openPlatformAgentSkillAction(platform)");
const skillEditor = extractBetween(APP, "function openPlatformAgentSkillAction(platform)", "async function openPlatformAgentDetailAction(platform)");
const panel = extractBetween(APP, "function renderPlatformAgentPanel()", "function renderAdminOpsPanel()");
const detail = extractBetween(APP, "async function openPlatformAgentDetailAction(platform)", "function openPlatformSkillReviewAction(platform, skillId, accepted)");
const skillReview = extractBetween(APP, "function openPlatformSkillReviewAction(platform, skillId, accepted)", "function openPlatformSkillRollbackAction(platform, skillId, versionId)");
const skillRollback = extractBetween(APP, "function openPlatformSkillRollbackAction(platform, skillId, versionId)", "function openActionRegistryEditAction(actionKey)");
const execution = extractBetween(APP, "function renderOneLinerExecutionPayloadHtml(payload)", "function parseOneLinerActionPayloadValue(value)");
assert.match(reopenHelper, /setTimeout/);
assert.match(reopenHelper, /openPlatformAgentDetailAction/);
assert.match(profileEditor, /renderPolicyVersionSummary\(current,/);
assert.match(profileEditor, /name: "reason"/);
assert.match(profileEditor, /saved\.current_version\?\.version_no/);
assert.match(profileEditor, /reopenPlatformAgentDetailSoon\(platform\)/);
assert.match(profileHistory, /\/v2\/platform-agents\/\$\{encodeURIComponent\(normalizedPlatform\)\}\/profile\/versions/);
assert.match(profileHistory, /\/v2\/platform-agents\/\$\{encodeURIComponent\(normalizedPlatform\)\}\/profile\/audits/);
assert.match(profileHistory, /\/v2\/platform-agents\/\$\{encodeURIComponent\(normalizedPlatform\)\}\/profile\/rollback/);
assert.match(profileHistory, /renderPolicyVersionsHtml/);
assert.match(profileHistory, /renderPolicyAuditsHtml/);
assert.match(profileHistory, /reopenPlatformAgentDetailSoon\(normalizedPlatform\)/);
assert.match(memoryEditor, /reopenPlatformAgentDetailSoon\(platform\)/);
assert.match(skillEditor, /reopenPlatformAgentDetailSoon\(platform\)/);
assert.match(skillReview, /reopenPlatformAgentDetailSoon\(normalizedPlatform\)/);
assert.match(skillRollback, /reopenPlatformAgentDetailSoon\(normalizedPlatform\)/);
assert.match(panel, /open-platform-agent-profile-history/);
assert.match(detail, /open-platform-agent-profile-history/);