fix(ui): show ssh repair receipt contract in work items
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 31s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled
AWOOOI Harbor 110 Local Repair / workflow-shape (push) Successful in 0s
AWOOOI Harbor 110 Local Repair / harbor-110-local-repair (push) Failing after 4m21s

This commit is contained in:
Your Name
2026-07-01 16:13:32 +08:00
parent ba44c4cff1
commit 54ac3cd550
3 changed files with 67 additions and 0 deletions

View File

@@ -9047,6 +9047,10 @@
"groups": "Groups", "groups": "Groups",
"contract": "Contract" "contract": "Contract"
}, },
"receipt": {
"inputs": "Receipt inputs",
"outputs": "Receipt outputs"
},
"tagLabels": { "tagLabels": {
"projectId": "Project", "projectId": "Project",
"product": "Product", "product": "Product",

View File

@@ -9047,6 +9047,10 @@
"groups": "分群鍵", "groups": "分群鍵",
"contract": "Contract" "contract": "Contract"
}, },
"receipt": {
"inputs": "Receipt inputs",
"outputs": "Receipt outputs"
},
"tagLabels": { "tagLabels": {
"projectId": "專案", "projectId": "專案",
"product": "產品", "product": "產品",

View File

@@ -1031,6 +1031,10 @@ type PriorityWorkOrderResponse = {
ai_loop_current_blocker_id?: string | null; ai_loop_current_blocker_id?: string | null;
ai_loop_current_blocker_log_source_tag_count?: number | null; ai_loop_current_blocker_log_source_tag_count?: number | null;
ai_loop_current_blocker_log_source_tag_keys?: string[] | null; ai_loop_current_blocker_log_source_tag_keys?: string[] | null;
ai_loop_current_blocker_harbor_recovery_receipt_input_count?: number | null;
ai_loop_current_blocker_harbor_recovery_receipt_input_ids?: string[] | null;
ai_loop_current_blocker_harbor_recovery_receipt_output_contract_count?: number | null;
ai_loop_current_blocker_harbor_recovery_receipt_output_ids?: string[] | null;
ai_loop_log_source_grouping_key_count?: number | null; ai_loop_log_source_grouping_key_count?: number | null;
ai_loop_log_source_grouping_keys?: string[] | null; ai_loop_log_source_grouping_keys?: string[] | null;
ai_loop_log_source_tagging_contract_count?: number | null; ai_loop_log_source_tagging_contract_count?: number | null;
@@ -1039,6 +1043,8 @@ type PriorityWorkOrderResponse = {
evidence?: { evidence?: {
ai_loop_current_blocker_log_source_tags?: AiLoopLogSourceTag[] | null; ai_loop_current_blocker_log_source_tags?: AiLoopLogSourceTag[] | null;
ai_loop_log_source_tagging_contract?: AiLoopLogSourceContract[] | null; ai_loop_log_source_tagging_contract?: AiLoopLogSourceContract[] | null;
ai_loop_current_blocker_harbor_recovery_receipt_input_ids?: string[] | null;
ai_loop_current_blocker_harbor_recovery_receipt_output_ids?: string[] | null;
} | null; } | null;
}>; }>;
}; };
@@ -7784,6 +7790,14 @@ function AiLoopLogSourceTagsPanel({
const contracts = evidence?.ai_loop_log_source_tagging_contract ?? []; const contracts = evidence?.ai_loop_log_source_tagging_contract ?? [];
const groupingKeys = priority?.summary?.ai_loop_log_source_grouping_keys ?? []; const groupingKeys = priority?.summary?.ai_loop_log_source_grouping_keys ?? [];
const summary = priority?.summary; const summary = priority?.summary;
const receiptInputIds =
summary?.ai_loop_current_blocker_harbor_recovery_receipt_input_ids ??
evidence?.ai_loop_current_blocker_harbor_recovery_receipt_input_ids ??
[];
const receiptOutputIds =
summary?.ai_loop_current_blocker_harbor_recovery_receipt_output_ids ??
evidence?.ai_loop_current_blocker_harbor_recovery_receipt_output_ids ??
[];
const labelMap: Record<string, string> = { const labelMap: Record<string, string> = {
project_id: t("tagLabels.projectId"), project_id: t("tagLabels.projectId"),
product: t("tagLabels.product"), product: t("tagLabels.product"),
@@ -7816,6 +7830,24 @@ function AiLoopLogSourceTagsPanel({
value: summary?.ai_loop_log_source_tagging_contract_count ?? contracts.length, value: summary?.ai_loop_log_source_tagging_contract_count ?? contracts.length,
}, },
]; ];
const receiptMetrics = [
{
key: "inputs",
label: t("receipt.inputs"),
value:
summary?.ai_loop_current_blocker_harbor_recovery_receipt_input_count ??
receiptInputIds.length,
ids: receiptInputIds,
},
{
key: "outputs",
label: t("receipt.outputs"),
value:
summary?.ai_loop_current_blocker_harbor_recovery_receipt_output_contract_count ??
receiptOutputIds.length,
ids: receiptOutputIds,
},
];
return ( return (
<section <section
@@ -7861,6 +7893,33 @@ function AiLoopLogSourceTagsPanel({
value: summary?.ai_loop_current_blocker_id ?? "--", value: summary?.ai_loop_current_blocker_id ?? "--",
})} })}
</div> </div>
<div className="mt-3 grid gap-2">
{receiptMetrics.map((metric) => (
<div
key={metric.key}
className="border border-[#d8d3c7] bg-white px-3 py-2"
>
<div className="flex items-center justify-between gap-3">
<span className="text-[11px] font-semibold text-[#77736a]">
{metric.label}
</span>
<span className="font-mono text-sm font-semibold text-[#141413]">
{loading ? "--" : metric.value}
</span>
</div>
<div className="mt-2 flex flex-wrap gap-1.5">
{metric.ids.slice(0, 6).map((id) => (
<span
key={id}
className="border border-[#d8d3c7] bg-[#faf9f3] px-2 py-0.5 font-mono text-[10px] text-[#5f5b52]"
>
{id}
</span>
))}
</div>
</div>
))}
</div>
</div> </div>
<div className="bg-white p-4"> <div className="bg-white p-4">