diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index cd716b2e..3726c83e 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -9035,13 +9035,25 @@ "blocked": "阻塞" }, "aiLoopLogSources": { - "eyebrow": "AI Loop source labels", - "title": "LOG grouping and learning route", - "subtitle": "Reads metadata-only tags for the current blocker from the priority work-order so KM, RAG, PlayBook, MCP, Verifier, and AI Agent share one source taxonomy.", + "eyebrow": "P0 visual state", + "title": "Current blocker and repair intake", + "subtitle": "Shows the blocker, SSH diagnosis, and receipt contract first; technical fields are collapsed so the workbench does not read like a long text list.", "loading": "Loading LOG source labels", "empty": "No LOG source labels read back yet.", "blocker": "Current blocker: {value}", "boundary": "Metadata-only labels; no raw log read, no secret display, no writeback, and no runtime apply from this panel.", + "details": "Expand technical fields", + "visual": { + "blocker": "Current blocker", + "diagnosis": "SSH diagnosis", + "receipt": "Receipt contract", + "receiptValue": "{inputs} inputs / {outputs} outputs" + }, + "rootCause": { + "sessionTimeout": "Key accepted, session timeout", + "offerTimeout": "Publickey offer timeout", + "unknown": "Waiting for queue diagnosis" + }, "metrics": { "tags": "Tags", "groups": "Groups", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 6628971e..94bb026f 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -9035,13 +9035,25 @@ "blocked": "阻塞" }, "aiLoopLogSources": { - "eyebrow": "AI Loop 來源貼標", - "title": "LOG 分群與學習路由", - "subtitle": "從 priority work-order 讀回 current blocker 的 metadata-only tags,讓 KM、RAG、PlayBook、MCP、Verifier 與 AI Agent 用同一組來源維度學習。", + "eyebrow": "P0 視覺狀態", + "title": "目前卡點與修復收件", + "subtitle": "先顯示目前真正卡住的 blocker、SSH 診斷與收件契約;技術欄位收在展開區,避免把工作台變成長文字清單。", "loading": "讀取 LOG 來源貼標中", "empty": "尚未讀回 LOG 來源貼標。", "blocker": "Current blocker:{value}", "boundary": "只顯示 metadata-only 標籤;不讀 raw log、不顯示 secret、不觸發寫入或 runtime apply。", + "details": "展開技術欄位", + "visual": { + "blocker": "目前卡點", + "diagnosis": "SSH 診斷", + "receipt": "收件契約", + "receiptValue": "{inputs} inputs / {outputs} outputs" + }, + "rootCause": { + "sessionTimeout": "Key accepted,session timeout", + "offerTimeout": "Publickey offer timeout", + "unknown": "等待 queue 診斷" + }, "metrics": { "tags": "Tags", "groups": "分群鍵", diff --git a/apps/web/src/app/[locale]/awooop/work-items/page.tsx b/apps/web/src/app/[locale]/awooop/work-items/page.tsx index 61a16744..6529dacd 100644 --- a/apps/web/src/app/[locale]/awooop/work-items/page.tsx +++ b/apps/web/src/app/[locale]/awooop/work-items/page.tsx @@ -7863,14 +7863,50 @@ function AiLoopLogSourceTagsPanel({ ids: receiptOutputIds, }, ]; + const rootCause = queueNormalizerFieldIds.some((id) => + id.includes("server_accepts_key_then_session_timeout") + ) + ? t("rootCause.sessionTimeout") + : queueNormalizerFieldIds.some((id) => id.includes("publickey_offer_timeout")) + ? t("rootCause.offerTimeout") + : t("rootCause.unknown"); + const visualCards = [ + { + key: "blocker", + icon: TriangleAlert, + label: t("visual.blocker"), + value: summary?.ai_loop_current_blocker_id ?? "--", + tone: "border-[#f0c6a8] bg-[#fff8f1] text-[#9a4d16]", + }, + { + key: "diagnosis", + icon: SearchCheck, + label: t("visual.diagnosis"), + value: rootCause, + tone: "border-[#c9d8ea] bg-[#eef5ff] text-[#1f5b9b]", + }, + { + key: "receipt", + icon: ClipboardList, + label: t("visual.receipt"), + value: t("visual.receiptValue", { + inputs: + summary?.ai_loop_current_blocker_harbor_recovery_receipt_input_count ?? + receiptInputIds.length, + outputs: + summary?.ai_loop_current_blocker_harbor_recovery_receipt_output_contract_count ?? + receiptOutputIds.length, + }), + tone: "border-[#cbd7bf] bg-[#f4faef] text-[#3d6b24]", + }, + ]; return (
-
-
+
);