diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index dd4f1329..dd728341 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -318,6 +318,32 @@ "km": "KM 健康" } }, + "homeProductMap": { + "eyebrow": "AWOOOI Operations Map", + "title": "AI Automation Management Console", + "subtitle": "A unified operations map for intake, AI decisions, evidence, approvals, execution, verification, and KM learning, built to show ownership, blockers, and evidence sources at a glance.", + "currentGate": "Current claim state", + "flowTitle": "Incident lifecycle", + "moduleTitle": "Product modules and data sources", + "modules": { + "awooop": { + "module": "AwoooP Run Timeline", + "owns": "Intake, deduplication, workflow stages, Telegram callbacks, and historical evidence." + }, + "routing": { + "module": "AI Router / Agent Roles", + "owns": "GCP-A, GCP-B, host 111, Gemini fallback, and Hermes/OpenClaw/ElephantAlpha role routing." + }, + "execution": { + "module": "PlayBook / MCP / Ansible", + "owns": "Tool investigation, dry-runs, check-mode, apply gates, and repair evidence." + }, + "learning": { + "module": "KM / Governance", + "owns": "Stale KM, owner review, SLOs, postmortem learning, and rule updates." + } + } + }, "automationDelivery": { "eyebrow": "AI 自動化管理產品面", "title": "目前完成項與待推進項", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index dd4f1329..6c07c6de 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -318,6 +318,32 @@ "km": "KM 健康" } }, + "homeProductMap": { + "eyebrow": "AWOOOI Operations Map", + "title": "AI 自動化管理介面", + "subtitle": "統一呈現事件從接收、判斷、證據、審批、執行到驗證與學習的狀態,讓營運團隊快速掌握責任、阻塞與證據來源。", + "currentGate": "目前可宣稱狀態", + "flowTitle": "事件生命週期", + "moduleTitle": "產品模組與資料來源", + "modules": { + "awooop": { + "module": "AwoooP Run Timeline", + "owns": "收件、去重、處理階段、Telegram callback、歷史證據" + }, + "routing": { + "module": "AI Router / Agent 分工", + "owns": "GCP-A、GCP-B、111、Gemini fallback 與 Hermes/OpenClaw/ElephantAlpha 分工" + }, + "execution": { + "module": "PlayBook / MCP / Ansible", + "owns": "工具調查、dry-run、check-mode、apply gate 與修復證據" + }, + "learning": { + "module": "KM / Governance", + "owns": "stale KM、owner review、SLO、事後學習與規則更新" + } + } + }, "automationDelivery": { "eyebrow": "AI 自動化管理產品面", "title": "目前完成項與待推進項", diff --git a/apps/web/src/app/[locale]/page.tsx b/apps/web/src/app/[locale]/page.tsx index 16f5e206..80a94162 100644 --- a/apps/web/src/app/[locale]/page.tsx +++ b/apps/web/src/app/[locale]/page.tsx @@ -1879,6 +1879,60 @@ export default function Home({ params }: { params: { locale: string } }) { }), }, ] + const productModuleRows: Array<{ + key: string + module: string + owns: string + evidence: string + href: string + tone: HomepageWorkTone + }> = [ + { + key: 'awooop', + module: tDashboard('homeProductMap.modules.awooop.module'), + owns: tDashboard('homeProductMap.modules.awooop.owns'), + evidence: tDashboard('automationDiagrams.workspace.liveEvidence.intake.metric', { + runs: formatAutomationNumber(automationBrief.runsList?.total, runsListLoaded), + linked: formatAutomationNumber(recurrenceSummary?.linked_run_total, eventRecurrenceLoaded), + }), + href: `/${locale}/awooop/runs?project_id=awoooi`, + tone: 'live', + }, + { + key: 'routing', + module: tDashboard('homeProductMap.modules.routing.module'), + owns: tDashboard('homeProductMap.modules.routing.owns'), + evidence: tDashboard('automationDiagrams.workspace.values.aiRoute', { + lane: aiRouteLaneMode, + provider: aiRouteSelectedProvider, + }), + href: `/${locale}/awooop/work-items?project_id=awoooi`, + tone: hasAiRouteStatus ? 'live' : 'watching', + }, + { + key: 'execution', + module: tDashboard('homeProductMap.modules.execution.module'), + owns: tDashboard('homeProductMap.modules.execution.owns'), + evidence: tDashboard('automationDiagrams.workspace.values.ansible', { + checkMode: formatAutomationNumber(executionBackend?.ansible_check_mode_total, automationQualityLoaded), + pending: formatAutomationNumber(executionBackend?.ansible_pending_check_mode_total, automationQualityLoaded), + blocker: ansibleRuntimeBlockerLabel, + }), + href: `/${locale}/automation`, + tone: ansibleRuntime?.can_run_check_mode ? 'live' : automationQualityAvailable ? 'blocked' : 'watching', + }, + { + key: 'learning', + module: tDashboard('homeProductMap.modules.learning.module'), + owns: tDashboard('homeProductMap.modules.learning.owns'), + evidence: tDashboard('automationDiagrams.workspace.liveEvidence.verify.metric', { + stale: formatAutomationNumber(kmStaleDisplayCount, kmGovernanceLoaded), + ratio: staleRatioLabel, + }), + href: `/${locale}/knowledge-base`, + tone: typeof kmStaleDisplayCount === 'number' && kmStaleDisplayCount > 0 ? 'progress' : hasKmStaleCandidates ? 'live' : 'watching', + }, + ] return ( @@ -1894,14 +1948,173 @@ export default function Home({ params }: { params: { locale: string } }) {
+
+
+
+
+ {tDashboard('homeProductMap.eyebrow')} +
+

+ {tDashboard('homeProductMap.title')} +

+

+ {tDashboard('homeProductMap.subtitle')} +

+
+
+
+ {tDashboard('homeProductMap.currentGate')} +
+
+ {automationDeliveryHeadline} +
+
+ {automationDeliveryClaimDetail} +
+
+
+ +
+
+
+

+ {tDashboard('homeProductMap.flowTitle')} +

+ + {tDashboard('automationDelivery.openRuns')} + +
+ +
+ +
+
+

+ {tDashboard('homeProductMap.moduleTitle')} +

+ + {tDashboard('automationDiagrams.openTopology')} + +
+
+ {productModuleRows.map((row) => { + const tone = automationWorkToneStyle[row.tone] + return ( + +
+
{row.module}
+
{row.owns}
+
+
+
+ {row.evidence} +
+
+
+ ) + })} +
+
+
+
+