fix: preserve oneliner suggested action context
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-05 06:36:29 +08:00
parent f320ec1b44
commit 88ccc62c71
3 changed files with 16 additions and 1 deletions

View File

@@ -4,6 +4,12 @@
## 2026-04-05 ## 2026-04-05
### OneLiner 对话里的直接执行建议保留完整上下文
- OneLiner 助手消息里的 `suggested_actions` 现在不再只是渲染成一个裸 `data-action` 标签。
- 前端会把每条建议对应的 `executor_key / platform / payload / session_id` 一起带上,所以“直接分析账号 / 直接同步跟踪池 / 直接创建 AI 视频”这类建议从对话里点下去时,会真正走当前 live 执行器。
- 这让 OneLiner 对话、运行卡、结果卡三条链的“直接执行”行为终于统一,不会再出现运行卡能跑、对话建议却丢上下文的断层。
### 主 Agent 可直接执行分析账号、加入跟踪、创建 Agent ### 主 Agent 可直接执行分析账号、加入跟踪、创建 Agent
- `OneLiner / 主 Agent` 的动作执行器现在新增了三条真实动作: - `OneLiner / 主 Agent` 的动作执行器现在新增了三条真实动作:

View File

@@ -1385,7 +1385,12 @@ function renderOneLinerMessagesHtml() {
` : ""} ` : ""}
${actions.length ? ` ${actions.length ? `
<div class="task-meta" style="margin-top:10px;"> <div class="task-meta" style="margin-top:10px;">
${actions.map((item) => `<span class="tag clickable-tag" data-action="${escapeHtml(item.key)}">${escapeHtml(item.label)}</span>`).join("")} ${actions.map((item) => actionTag(
item.label || item.executor_label || item.key || "执行动作",
item.key || "",
buildOnelinerActionAttrs(item),
{ disabledReason: item.disabled_reason || "" }
)).join("")}
</div> </div>
` : ""} ` : ""}
${message.role === "assistant" && (executionCard.intent_label || executionCard.platform_label || executionCard.primary_action?.label || safeArray(executionCard.evidence).length) ? ` ${message.role === "assistant" && (executionCard.intent_label || executionCard.platform_label || executionCard.primary_action?.label || safeArray(executionCard.evidence).length) ? `

View File

@@ -1134,6 +1134,10 @@ test("main agent execution cards can jump to oneliner and platform profile histo
const runtime = extractBetween(APP, "function renderOneLinerRunsHtml()", "function renderOneLinerMessagesHtml()"); const runtime = extractBetween(APP, "function renderOneLinerRunsHtml()", "function renderOneLinerMessagesHtml()");
const execution = extractBetween(APP, "function renderOneLinerExecutionPayloadHtml(payload)", "function parseOneLinerActionPayloadValue(value)"); const execution = extractBetween(APP, "function renderOneLinerExecutionPayloadHtml(payload)", "function parseOneLinerActionPayloadValue(value)");
assert.match(messages, /const buildOnelinerActionAttrs = \(item\) =>/); assert.match(messages, /const buildOnelinerActionAttrs = \(item\) =>/);
assert.match(messages, /actions\.map\(\(item\) => actionTag\(/);
assert.match(messages, /item\.label \|\| item\.executor_label \|\| item\.key \|\| "执行动作"/);
assert.match(messages, /buildOnelinerActionAttrs\(item\)/);
assert.doesNotMatch(messages, /actions\.map\(\(item\) => `<span class="tag clickable-tag" data-action="\$\{escapeHtml\(item\.key\)\}">\$\{escapeHtml\(item\.label\)\}<\/span>`\)/);
assert.match(messages, /data-action="open-oneliner-profile-history"/); assert.match(messages, /data-action="open-oneliner-profile-history"/);
assert.match(messages, /data-action="open-platform-agent-profile-history"/); assert.match(messages, /data-action="open-platform-agent-profile-history"/);
assert.match(messages, /data-version-id="\$\{escapeHtml\(profileVersion\.version_id \|\| ""\)\}"/); assert.match(messages, /data-version-id="\$\{escapeHtml\(profileVersion\.version_id \|\| ""\)\}"/);