From fc28a1f4a6889f52006a22142ff090cb009d7985 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 3 Jul 2026 01:21:39 +0800 Subject: [PATCH] feat(iwooos): segment security workbench --- apps/web/messages/en.json | 24 ++++ apps/web/messages/zh-TW.json | 24 ++++ apps/web/src/app/[locale]/iwooos/page.tsx | 149 ++++++++++++++++++++++ docs/LOGBOOK.md | 16 +++ 4 files changed, 213 insertions(+) diff --git a/apps/web/messages/en.json b/apps/web/messages/en.json index bba8d8481..ec066075e 100644 --- a/apps/web/messages/en.json +++ b/apps/web/messages/en.json @@ -13447,6 +13447,30 @@ "state": "受控 apply / break-glass", "detail": "低中高風險走 selector、dry-run、rollback、verifier;事故級仍鎖。" }, + "workspace": { + "eyebrow": "IwoooS 工作台", + "title": "分段查看,不再一頁到底", + "subtitle": "預設只顯示指揮總覽;runtime、證據鏈與完整 ledger 依任務切換。", + "ariaLabel": "IwoooS 工作台分段", + "views": { + "overview": { + "label": "指揮總覽", + "detail": "卡點、進度、runtime readback" + }, + "runtime": { + "label": "受控執行", + "detail": "Wazuh、AI SOC、dry-run 與 postcheck" + }, + "evidence": { + "label": "證據鏈", + "detail": "KM、owner packet、review 前置" + }, + "ledger": { + "label": "完整 Ledger", + "detail": "所有治理軌道與歷史明細" + } + } + }, "managerCockpit": { "eyebrow": "管理者控制台", "title": "現在真正要處理什麼", diff --git a/apps/web/messages/zh-TW.json b/apps/web/messages/zh-TW.json index 002ae4bca..4aa6842c9 100644 --- a/apps/web/messages/zh-TW.json +++ b/apps/web/messages/zh-TW.json @@ -13447,6 +13447,30 @@ "state": "受控 apply / break-glass", "detail": "低中高風險走 selector、dry-run、rollback、verifier;事故級仍鎖。" }, + "workspace": { + "eyebrow": "IwoooS 工作台", + "title": "分段查看,不再一頁到底", + "subtitle": "預設只顯示指揮總覽;runtime、證據鏈與完整 ledger 依任務切換。", + "ariaLabel": "IwoooS 工作台分段", + "views": { + "overview": { + "label": "指揮總覽", + "detail": "卡點、進度、runtime readback" + }, + "runtime": { + "label": "受控執行", + "detail": "Wazuh、AI SOC、dry-run 與 postcheck" + }, + "evidence": { + "label": "證據鏈", + "detail": "KM、owner packet、review 前置" + }, + "ledger": { + "label": "完整 Ledger", + "detail": "所有治理軌道與歷史明細" + } + } + }, "managerCockpit": { "eyebrow": "管理者控制台", "title": "現在真正要處理什麼", diff --git a/apps/web/src/app/[locale]/iwooos/page.tsx b/apps/web/src/app/[locale]/iwooos/page.tsx index 28dc06e1b..7beabc5e9 100644 --- a/apps/web/src/app/[locale]/iwooos/page.tsx +++ b/apps/web/src/app/[locale]/iwooos/page.tsx @@ -168,6 +168,7 @@ type VisualDashboardGate = { type VisualExperienceMode = 'attackPath' | 'assetHeat' | 'responseFlow' type IwoooSCommandMapMode = 'unlock' | 'scope' | 'hosts' | 'sourceControl' | 'awooop' | 'boundary' +type IwoooSWorkspaceView = 'overview' | 'runtime' | 'evidence' | 'ledger' type VisualExperienceTab = { key: VisualExperienceMode @@ -6462,6 +6463,105 @@ function ToneDot({ tone }: { tone: 'steady' | 'warn' | 'locked' }) { ) } +const iwooosWorkspaceViews: Array<{ + key: IwoooSWorkspaceView + icon: typeof ShieldCheck + tone: 'steady' | 'warn' | 'locked' +}> = [ + { key: 'overview', icon: Radar, tone: 'steady' }, + { key: 'runtime', icon: Workflow, tone: 'warn' }, + { key: 'evidence', icon: FileCheck2, tone: 'warn' }, + { key: 'ledger', icon: ClipboardList, tone: 'locked' }, +] + +function IwoooSWorkspaceSwitcher({ + active, + onChange, +}: { + active: IwoooSWorkspaceView + onChange: (value: IwoooSWorkspaceView) => void +}) { + const t = useTranslations('iwooos.workspace') + + return ( +
+
+
+
+ + {t('eyebrow')} +
+

{t('title')}

+

+ {t('subtitle')} +

+
+
+ {iwooosWorkspaceViews.map(view => { + const Icon = view.icon + const selected = active === view.key + return ( + + ) + })} +
+
+
+ ) +} + +function IwoooSWorkspacePanel({ + active, + children, +}: { + active: boolean + children: ReactNode +}) { + if (!active) return null + return
{children}
+} + function MetricCard({ item }: { item: PostureMetric }) { const t = useTranslations('iwooos.metrics') return ( @@ -24146,6 +24246,7 @@ function HostOwnerDecisionRecordHumanRecordOwnerReviewPreparationChecklistCard({ export default function IwoooSPage({ params }: { params: { locale: string } }) { const t = useTranslations('iwooos') const ia = useTranslations('iwooos.informationArchitecture') + const [workspaceView, setWorkspaceView] = useState('overview') return ( @@ -24178,7 +24279,54 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -25388,6 +25536,7 @@ export default function IwoooSPage({ params }: { params: { locale: string } }) { + ) diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index bfa8da0f1..aa2bb3dc9 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,19 @@ +## 2026-07-03 — 01:24 IwoooS 首屏分段工作台 + +**完成內容**: +- `/zh-TW/iwooos` 新增 `指揮總覽 / 受控執行 / 證據鏈 / 完整 Ledger` segmented workspace,預設只 render 指揮總覽,避免 25k 行治理軌道一次全部攤開。 +- `runtime` 視圖集中 Wazuh、AI SOC、dry-run、postcheck 與 runtime readback;`evidence` 視圖集中 KM / owner packet / review preflight;`ledger` 才顯示完整歷史治理明細。 +- 手機首屏已把 workspace switcher 移到 manager cockpit 前,使用者不用滑過長文字才知道可分段操作。 + +**驗證**: +- `python3.11 -m json.tool apps/web/messages/zh-TW.json`、`python3.11 -m json.tool apps/web/messages/en.json`:通過。 +- `pnpm --dir apps/web typecheck`:通過。 +- `pnpm --dir apps/web audit:ui-density`:通過;`/iwooos` 控制項由 29 增至 32,仍列第一優先,下一刀需拆 ledger 模組化降 source density。 +- Local Chrome smoke:desktop tab 切換通過;mobile HTTP 200、switcher y=428 進第一 viewport、四個 tab 可見、console error `0`。 + +**仍維持**: +- 未讀 secret / token / `.env` / raw sessions / SQLite / auth;未使用 GitHub / gh;未 production DB schema / data destructive write;未重啟主機 / VM / Docker / K3s / DB / firewall。 + ## 2026-07-03 — 01:05 Gitea all-project repo / dev-main / bundle backup closure **完成內容**: