审批 / 消息 / 纪要 / 汇报补上助理栏 —— 那不是空态,是整栏没渲染

`.workspace` 是**三列**网格(侧栏 · 工作区 · 助理栏 440px)。这四个模块只渲染了
两栏,右边就空出一条 **234px 的白带** —— 里面什么都没有,不是「空态没写好」,
是这一栏根本没画。实测四面皆然。

那一栏该摆什么,按 OS 4.1 定:「对话流 / 视图区」是**工作台-任务**的交互结构、
是回环输入的唯一入口。这四个要素各有自己的形态 —— 审批是通过/驳回附依据、
消息是就地答(MessageDesk 自己那条 NoteBand 早写着「不开放任务对话流」)、
纪要靠人记、汇报是确认即提交 —— 都不经对话流。

所以**不摆能打字的输入框**:那是在许诺聊得起来。只如实说这一栏是什么、
这一面该怎么用、想说话该去哪儿。共用件 `AssistantAside`,色调 `muted`
(通路不在这儿,灰着就不许诺),章也不打彩色渐变 —— 亮着像在待命。
四句文案各说各的事,不是同一句复制四遍:

  审批 拍板不用先商量 —— 看依据就够了,想先问一句就去那一单的任务里说
  消息 这儿不用聊     —— 就地答完即可,作答只及卡面,不用跑进别人的任务
  纪要 会得你自己开   —— 你写下来最准,写完登记起单责任才落到人
  汇报 不用你写一个字 —— 按任务日志自动聚合,要数字好看得回任务里干活

顺带治了题头被截:一行摆四件(章 · 任务助理 · Agent · 说明句),对话区压到
212px 时说明句只剩 29px,被省略号截成「汇…」,一个字都读不出来。改为按**本栏宽度**
容器查询,挤了就让说明句换到第二行拿整行说完。任务面的「盯着这单推进 · 有事随时说」
以前也是截的,这下一并读全了。容器上下文落在 `.jc-tch` 不是 `.session-chat` ——
后者带拖拽调宽的负偏移柄,不给它加 containment。

补 3 个缺失图标(gavel / pencil-line / chart-column)—— 不补就是空 SVG,这坑踩过。

typecheck ✓ lint ✓ depcruise 374 模块 ✓ api:check ✓ 490 测试 ✓

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-28 11:27:52 +08:00
co-authored by Claude Opus 5
parent 22aa44c775
commit 9802550ae8
7 changed files with 99 additions and 4 deletions
@@ -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() {
)}
</DocPanel>
)}
<AssistantAside
ico="gavel"
note="审批不经对话"
title="拍板不用先商量"
desc="通过还是驳回,看依据就够了 —— 驳回时把原因写进意见,发起人就知道该改哪儿。想先问一句再拍,去那一单的任务里说。"
/>
</div>
);
}
@@ -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<Record<string, { icon: string; grad: readonly [string, string]; kicker: string }>> = {
notice: { icon: 'bell', grad: ['#7f3bf5', '#5b21cf'], kicker: '系统 · 通知' },
@@ -151,6 +151,13 @@ export function MessageDesk() {
)}
</DocPanel>
)}
<AssistantAside
ico="at-sign"
note="消息就地答"
title="这儿不用聊"
desc="别人请你补的信息,在左边那条消息上直接答完就行 —— 作答只及卡面,不用跑进别人的任务。助理只在你自己的任务里说话。"
/>
</div>
);
}
@@ -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() {
</Section>
</DocPanel>
)}
<AssistantAside
ico="pencil-line"
note="纪要靠你记"
title="会得你自己开"
desc="会上定了什么,你写下来最准 —— 写完把该办的事登记起单,责任才落到人。助理在任务里帮你把事推下去,不代你开会。"
/>
</div>
);
}
@@ -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() {
</div>
</DocPanel>
)}
<AssistantAside
ico="chart-column"
note="汇报自动聚"
title="不用你写一个字"
desc="日报周报按你的任务日志自动聚合,你看一眼、确认即提交。要让数字变好看,得回任务里把活干完 —— 助理在那边等你。"
/>
</div>
);
}