fix(agent): publish queue safe next action
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Successful in 37s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled

This commit is contained in:
Your Name
2026-07-01 18:25:30 +08:00
parent 3c187aa8a5
commit d873a3258c
9 changed files with 628 additions and 3 deletions

View File

@@ -1037,6 +1037,9 @@ type PriorityWorkOrderResponse = {
ai_loop_current_blocker_harbor_recovery_receipt_output_ids?: string[] | null;
ai_loop_current_blocker_queue_readback_normalizer_contract_count?: number | null;
ai_loop_current_blocker_queue_readback_normalizer_field_ids?: string[] | null;
ai_loop_current_blocker_safe_next_action_id?: string | null;
ai_loop_current_blocker_safe_next_action_stage?: string | null;
ai_loop_current_blocker_safe_next_action_requires_local_console?: boolean | null;
ai_loop_log_source_grouping_key_count?: number | null;
ai_loop_log_source_grouping_keys?: string[] | null;
ai_loop_log_source_tagging_contract_count?: number | null;
@@ -1048,6 +1051,12 @@ type PriorityWorkOrderResponse = {
ai_loop_current_blocker_harbor_recovery_receipt_input_ids?: string[] | null;
ai_loop_current_blocker_harbor_recovery_receipt_output_ids?: string[] | null;
ai_loop_current_blocker_queue_readback_normalizer_field_ids?: string[] | null;
ai_loop_current_blocker_safe_next_action_id?: string | null;
ai_loop_current_blocker_safe_next_action_stage?: string | null;
ai_loop_current_blocker_safe_next_action?: string | null;
ai_loop_current_blocker_safe_next_action_command?: string | null;
ai_loop_current_blocker_safe_next_action_post_verifier?: string | null;
ai_loop_current_blocker_safe_next_action_requires_local_console?: boolean | null;
} | null;
}>;
};
@@ -7805,6 +7814,20 @@ function AiLoopLogSourceTagsPanel({
summary?.ai_loop_current_blocker_queue_readback_normalizer_field_ids ??
evidence?.ai_loop_current_blocker_queue_readback_normalizer_field_ids ??
[];
const safeNextActionId =
summary?.ai_loop_current_blocker_safe_next_action_id ??
evidence?.ai_loop_current_blocker_safe_next_action_id ??
"";
const safeNextActionStage =
summary?.ai_loop_current_blocker_safe_next_action_stage ??
evidence?.ai_loop_current_blocker_safe_next_action_stage ??
"";
const safeNextActionCommand =
evidence?.ai_loop_current_blocker_safe_next_action_command ?? "";
const safeNextRequiresLocalConsole =
summary?.ai_loop_current_blocker_safe_next_action_requires_local_console ??
evidence?.ai_loop_current_blocker_safe_next_action_requires_local_console ??
false;
const labelMap: Record<string, string> = {
project_id: t("tagLabels.projectId"),
product: t("tagLabels.product"),
@@ -7899,6 +7922,17 @@ function AiLoopLogSourceTagsPanel({
}),
tone: "border-[#cbd7bf] bg-[#f4faef] text-[#3d6b24]",
},
{
key: "safe-next-action",
icon: ArrowRight,
label: t("safeNextAction"),
value: safeNextActionId || "--",
detail: t("safeNextStage", {
stage: safeNextActionStage || "--",
local: String(Boolean(safeNextRequiresLocalConsole)),
}),
tone: "border-[#c9d8ea] bg-[#eef5ff] text-[#1f5b9b]",
},
];
return (
@@ -7921,7 +7955,7 @@ function AiLoopLogSourceTagsPanel({
<p className="mt-3 text-xs leading-5 text-[#77736a]">
{t("subtitle")}
</p>
<div className="mt-4 grid gap-3 lg:grid-cols-3">
<div className="mt-4 grid gap-3 md:grid-cols-2 xl:grid-cols-4">
{visualCards.map((card) => {
const Icon = card.icon;
return (
@@ -7941,6 +7975,11 @@ function AiLoopLogSourceTagsPanel({
<div className="mt-3 break-words font-mono text-sm font-semibold leading-5 text-[#141413]">
{loading ? "--" : card.value}
</div>
{"detail" in card ? (
<div className="mt-2 break-words font-mono text-[11px] leading-5 text-[#5f5b52]">
{loading ? "--" : card.detail}
</div>
) : null}
</div>
);
})}
@@ -7963,6 +8002,11 @@ function AiLoopLogSourceTagsPanel({
);
})}
</div>
{safeNextActionCommand ? (
<div className="mt-3 border border-[#c9d8ea] bg-[#eef5ff] px-3 py-2 font-mono text-[11px] leading-5 text-[#1f5b9b]">
{t("safeNextCommand", { command: safeNextActionCommand })}
</div>
) : null}
<div className="mt-3 grid gap-2">
{receiptMetrics.map((metric) => (
<div