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('subtitle')}
+ {t('title')}
+