diff --git a/apps/web/src/app/styles/app.css b/apps/web/src/app/styles/app.css
index 4a367b2..c527146 100644
--- a/apps/web/src/app/styles/app.css
+++ b/apps/web/src/app/styles/app.css
@@ -2958,3 +2958,23 @@
.proto-root .jc-empty.t-muted .r1 { background: radial-gradient(circle, var(--line-soft), transparent 72%); }
.proto-root .jc-empty.t-muted .r2 { background: var(--line-soft); }
.proto-root .jc-empty.t-muted .jc-empty-ico { color: var(--ink-3); }
+
+/* ── 助理栏的「不在岗」态(补充,非原型)──────────────────────────────
+ 审批 / 消息 / 纪要 / 汇报四面的助理栏:对话流按 OS 4.1 只长在任务上,
+ 这四面用不到它。章不打彩色渐变 —— 亮着像在待命,灰着才说得清「这儿不说话」。 */
+.proto-root .jc-tch-mark.t-idle { background: var(--line-soft); color: var(--ink-3); box-shadow: none; }
+
+/* ── 助理栏题头的抗压(补充,非原型)────────────────────────────────
+ 题头一行摆四件:章 · 任务助理 · Agent · 说明句。对话区被压到 ~210px 时,
+ 说明句只剩 29px 宽,被省略号截成「汇…」—— 一个字都读不出来,等于白占地方。
+ 让它在挤的时候**换到第二行**,拿整行说完;右对齐也一并取消(自己一行就不用靠边)。
+
+ 按**自己这一栏的宽度**判断,不按视口 —— 对话区宽度还受收起状态影响,
+ 视口断点管不住它。容器上下文落在 `.jc-tch`(内层壳)而不是 `.session-chat`:
+ 后者带着拖拽调宽的柄(负偏移),不给它加 containment。 */
+.proto-root .jc-tch { container-type: inline-size; }
+
+@container (max-width: 300px) {
+ .proto-root .jc-tch-head { flex-wrap: wrap; row-gap: 2px; }
+ .proto-root .jc-tch-desc { flex: 1 0 100%; text-align: left; white-space: normal; }
+}
diff --git a/apps/web/src/features/desk-approval/internal/ApprovalDesk.tsx b/apps/web/src/features/desk-approval/internal/ApprovalDesk.tsx
index a99499b..7ddf2ea 100644
--- a/apps/web/src/features/desk-approval/internal/ApprovalDesk.tsx
+++ b/apps/web/src/features/desk-approval/internal/ApprovalDesk.tsx
@@ -12,7 +12,7 @@ import { decideApprovalRoute, listApprovalsForMeRoute } from '@contracts';
import { Ico } from '@web-shared/Ico.tsx';
import ScrollArea from '@web-shared/ScrollArea.tsx';
import { call } from '@web-shared/typed-fetch.ts';
-import { Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
+import { AssistantAside, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
const STATE_CHIP = {
pending: { tone: 'todo' as const, label: '待审批', pulse: true },
@@ -188,6 +188,13 @@ export function ApprovalDesk() {
)}
)}
+
+
);
}
diff --git a/apps/web/src/features/desk-message/internal/MessageDesk.tsx b/apps/web/src/features/desk-message/internal/MessageDesk.tsx
index cd88920..3d7d13f 100644
--- a/apps/web/src/features/desk-message/internal/MessageDesk.tsx
+++ b/apps/web/src/features/desk-message/internal/MessageDesk.tsx
@@ -13,7 +13,7 @@ import { answerMessageRoute, listMessagesRoute, markMessageReadRoute } from '@co
import { Ico } from '@web-shared/Ico.tsx';
import ScrollArea from '@web-shared/ScrollArea.tsx';
import { call } from '@web-shared/typed-fetch.ts';
-import { Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
+import { AssistantAside, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
const KIND_META: Readonly> = {
notice: { icon: 'bell', grad: ['#7f3bf5', '#5b21cf'], kicker: '系统 · 通知' },
@@ -151,6 +151,13 @@ export function MessageDesk() {
)}
)}
+
+
);
}
diff --git a/apps/web/src/features/desk-minute/internal/MinuteDesk.tsx b/apps/web/src/features/desk-minute/internal/MinuteDesk.tsx
index f3a3c3f..15dbdeb 100644
--- a/apps/web/src/features/desk-minute/internal/MinuteDesk.tsx
+++ b/apps/web/src/features/desk-minute/internal/MinuteDesk.tsx
@@ -12,7 +12,7 @@ import { appendResolutionRoute, createMinuteRoute, listMinutesRoute, registerRes
import { Ico } from '@web-shared/Ico.tsx';
import ScrollArea from '@web-shared/ScrollArea.tsx';
import { call } from '@web-shared/typed-fetch.ts';
-import { Avatar, AvatarStack, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
+import { AssistantAside, Avatar, AvatarStack, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
export function MinuteDesk() {
const queryClient = useQueryClient();
@@ -269,6 +269,13 @@ export function MinuteDesk() {
)}
+
+
);
}
diff --git a/apps/web/src/features/desk-report/internal/ReportDesk.tsx b/apps/web/src/features/desk-report/internal/ReportDesk.tsx
index 10dbd97..4f443e9 100644
--- a/apps/web/src/features/desk-report/internal/ReportDesk.tsx
+++ b/apps/web/src/features/desk-report/internal/ReportDesk.tsx
@@ -12,7 +12,7 @@ import { REPORT_PERIOD_LABEL, draftReportRoute, submitReportRoute } from '@contr
import { Ico } from '@web-shared/Ico.tsx';
import ScrollArea from '@web-shared/ScrollArea.tsx';
import { call } from '@web-shared/typed-fetch.ts';
-import { Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
+import { AssistantAside, Chip, DocPanel, Hero, EmptyState, ListEmpty, NoteBand, Section, SidebarHead } from '@web-shared/desk/module-kit.tsx';
const PERIODS: ReadonlyArray<{ k: ReportPeriodName; ico: string }> = [
{ k: 'day', ico: 'calendar-days' },
@@ -191,6 +191,13 @@ export function ReportDesk() {
)}
+
+
);
}
diff --git a/apps/web/src/shared/desk/module-kit.tsx b/apps/web/src/shared/desk/module-kit.tsx
index 144414d..9731e9d 100644
--- a/apps/web/src/shared/desk/module-kit.tsx
+++ b/apps/web/src/shared/desk/module-kit.tsx
@@ -229,3 +229,47 @@ export function EmptyState({
);
}
+
+/**
+ * 助理栏 —— 审批 / 消息 / 纪要 / 汇报四面右侧那一栏。
+ *
+ * `.workspace` 是**三列**网格(侧栏 · 工作区 · 助理栏)。这四个模块原来只渲染两栏,
+ * 右边就空出一条 234px 的白带 —— 不是空态,是**什么都没有**,看着像坏了。
+ *
+ * 那一栏摆什么?按 OS 4.1,「对话流」是**工作台-任务**的交互结构、是回环输入的唯一入口;
+ * 这四个要素各有自己的形态:审批是通过/驳回附依据、消息是就地答、纪要靠人记、
+ * 汇报是确认即提交 —— 都不经对话流。所以这里不摆一个能打字的输入框(那是许诺聊得起来),
+ * 只如实说明这一栏是什么、这一面该怎么用、想说话该去哪儿。
+ *
+ * 色调用 `muted`:通路不在这儿,灰着就不许诺。
+ */
+export function AssistantAside({
+ ico,
+ title,
+ desc,
+ note,
+}: {
+ ico: string;
+ title: string;
+ desc: string;
+ /** 题头右侧那半句 —— 一句话说清这一栏在本面的角色 */
+ note: string;
+}) {
+ return (
+
+
+
+
+
+
+ 任务助理
+ Agent
+ {note}
+
+
+
+
+
+
+ );
+}
diff --git a/packages/ui-kit/src/Ico.tsx b/packages/ui-kit/src/Ico.tsx
index b26b8c2..f11eac5 100644
--- a/packages/ui-kit/src/Ico.tsx
+++ b/packages/ui-kit/src/Ico.tsx
@@ -75,6 +75,9 @@ export function Ico({ name, s = 18 }: { name: string; s?: number }) {
"shield-check": (<>>),
scan: (<>>),
"file-check": (<>>),
+ gavel: (<>>),
+ "pencil-line": (<>>),
+ "chart-column": (<>>),
"trending-up": (<>>),
ban: (<>>),
key: (<>>),