open-claude-ui
v2 · Claude Desktop 2.0 逆向手册

第二章:新增特性深度逆向

2. 新增

2.1 独立多窗口架构

通过 Electron IPC 管道 DESKTOP_WINDOW_POP_OUT_CHAT,主渲染进程可将当前激活会话剥离为独立的 BrowserWindow,且子窗口独立承载一套原生的 Find-in-Page(页面搜索)实例,彻底解决了复杂长任务对照排查的痛点。

// 主进程多窗口调度逻辑 (从 app.asar 逆向提取)
ipcMain.handle('DESKTOP_WINDOW_POP_OUT_CHAT', async (event, { sessionId, bounds }) => {
  const popoutWindow = new BrowserWindow({
    width: bounds?.width || 900,
    height: bounds?.height || 700,
    titleBarStyle: 'hiddenInset',
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      sandbox: true,
      contextIsolation: true
    }
  });
  popoutWindow.loadURL(`claude://session/${sessionId}?mode=popout`);
  return popoutWindow.id;
});

2.2 离线可视化组件

完全摒弃外部 CDN 加载,随 ASAR 捆绑:

  • npm_mermaid@11.17.2_dist_mermaid.min.js
  • npm_chart.js@4.5.0_dist_chart.umd.js
  • npm_gridjs@5.0.2_dist_gridjs.umd.js

规范了数据表格失活行规范:

.cds-root [data-cds=DataTable] tr[data-dimmed] {
  --cds-row-dimmed-opacity: .5;
  --cds-text-primary: var(--cds-undimmed-text-muted);
}
/* 行内交互表单控件强制恢复 100% 亮度 */
.cds-root [data-cds=DataTable] tr[data-dimmed] :is(button,input,select,textarea) {
  --cds-row-dimmed-opacity: 1;
  --cds-text-primary: var(--cds-undimmed-text-primary);
}
  • 为什么 Anthropic 要这样改:在企业内网高安全级别机房中,外部 CDN 一律被防火墙拦截。将图表容器原生化并在样式层规范失活态,确保了金融、军工及涉密开发场景的 100% 可用性。

2.3 离线消息重试机制

  • 1.x 基准:网络中断时消息直接转为红色报错文字,一旦刷新浏览器或 Electron 页面,整条精心编写的 Prompt 彻底消失;
  • 2.0 迭代:在 Composer 内部建立 ChatComposerQueuedMessages 容器,直接与 IndexedDB 事务绑定。
interface QueuedMessage {
  id: string;
  sessionId: string;
  content: string;
  attachments: AttachmentRef[];
  failedAt: number;
  retryCount: number;
}
  • 为什么 Anthropic 要这样改:开发者的工程提示词往往包含几百行上下文描述、文件路径和堆栈日志,价值极高。将暂存态上升为一等公民组件,杜绝了“崩溃吞文字”的恶性体验。

2.4 推理算力调节器

在 index.chunk-BWk6pVUt.js 中提取出数据模型:

interface EffortOption {
  id: "low" | "medium" | "high" | "xhigh" | "max";
  name: string;
  description: string;
  recommended?: boolean;
  badge?: { message: "Default"; variant: "neutral" | "accent" | "warning" };
  tooltip?: { content: string };
}
  • 为什么 Anthropic 要这样改:
    • 推理成本精细化管理:具备深度思考能力的大模型(如 Sonnet 3.7 / 4.6 / 5)在单次复杂工程思考中可能会燃烧数万 Token。如果只有开关,用户写简单文档时会被过度思考拖慢响应时间并浪费额度;遇到极难 Bug 时又思考不足。
    • 企业配额安全防线:在 max 档位中,界面会显式弹出高危警示(“May use excessive tokens resulting in long response times”),并在企业管理端支持通过策略将 maxEffort 强制锁死在 medium,规避员工意外耗尽企业 API 预算。

2.5 现代 CSS 动效系统

1. Modern CSS sibling-index() 原生级联交错渐入

官方直接落地了现代 CSS 的原生选择器计数函数:

.cds-root .cds-chip-in {
  animation: cds-chip-in var(--cds-dur-base) var(--cds-ease-out) backwards;
  animation-delay: calc(var(--cds-chip-in-base-delay, 50ms) + min(sibling-index() - 1, 8) * 30ms);
}

@keyframes cds-chip-in {
  0% { opacity: 0; filter: blur(2px); transform: scale(.8); }
  100% { opacity: 1; filter: blur(0); transform: scale(1); }
}

2. View Transitions API 原生页面转场 (cds-attachments)

当用户在消息流中删除或移除附件时,触发原生视图转场:

:root:active-view-transition-type(cds-attachments)::view-transition-old(.cds-attachment):only-child {
  animation: .13s cubic-bezier(.55, .055, .675, .19) forwards cds-attachment-out;
}

@keyframes cds-attachment-out {
  to { opacity: 0; transform: scale(.5); }
}

3. Scroll-Driven 滚动驱动渐变透明遮罩系统

滚动视口边缘不再使用纯色伪元素遮挡,而是直接绑定 CSS 滚动时间轴:

@keyframes cds-scroll-fade-top {
  0% { --cds-scroll-fade-top-raw: 0px; }
  to { --cds-scroll-fade-top-raw: var(--cds-scroll-fade-size); }
}
  • 效果:长会话触顶时,顶部渐变遮罩变量自动衰减为 0px(硬边缘);一旦滚离顶部,自动展开为 28px 羽化半透明渐变,平滑隐去上滑文字。

2.6 首页卡片微光浮空

在 2.0 首页(新建会话 / 启动卡片区)中,官方为 Prompt 建议卡片注入了极具质感的底部环境微光悬浮交互:

/* 提取自 MainWindowPage-CGx8l8Ts.js 编译产物 */
.starter-card {
  transition: transform 150ms cubic-bezier(0.165, 0.84, 0.44, 1);
}

.starter-card:hover {
  transform: scaleY(1.015) scaleX(1.005);
}

.starter-card:after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background-image: radial-gradient(at bottom, hsla(var(--bg-000) / 20%), hsla(var(--bg-000) / 0%));
  opacity: 0;
  transition: opacity 150ms ease-out;
}

.starter-card:hover:after {
  opacity: 1;
}
  • 视觉机理:当鼠标悬停时,卡片执行极轻微的三维透视抬升(Y 轴放大 1.5%,X 轴微扩 0.5%),同时底层伪元素渐现一抹由底部向上漫射的半透明高光微光。

2.7 极细发丝边与相对色彩

在 MainWindowPage-BD9CWQ83.css 中提取到的底层边框规则:

.border-0\.5 {
  border-width: 0.5px;
}

:root {
  /* 基于底色动态推导高拟真漫反射投影 */
  --cds-elevation-subtle: 0 1px 2px 0 color-mix(in srgb, var(--cds-surface-0) 80%, black 20%);
  --cds-elevation-card: 0 4px 12px -2px color-mix(in srgb, var(--cds-surface-0) 90%, black 10%);
}
  • 工程优势:彻底告别静态透明度硬编码,不论用户处于浅色还是深色主题,阴影与发丝边框均根据当前背景色相实时生成精准的漫反射衰减。

2.8 触控负边距补偿

在输入框底部操作区(ChatComposerChin),官方设计了一套尺寸补偿算法:

.cds-root [data-cds=ChatComposerChin] [data-touch-size] {
  --cmp-chin-touch-grow: calc((var(--cds-h-control) - var(--cmp-chin-row-h, var(--cds-h-control))) / 2);
  min-height: var(--cmp-chin-row-h, var(--cds-h-control));
}

.cds-root [data-cds=ChatComposerChin] [data-touch-size] :is([data-cds=ButtonGroup],[data-cds=SplitDropdownButton]):not([data-size]),
.cds-root [data-cds=ChatComposerChin] [data-touch-size] :is([data-cds=Button],[data-cds=ModelSelector],[data-cds=ModelSelectorEffort]):not([data-size]):not(:is([data-cds=ButtonGroup],[data-cds=SplitDropdownButton]) *) {
  margin-block: calc(var(--cmp-chin-touch-grow, 0px) * -1);
}
  • 为什么 Anthropic 要引入触控负边距补偿算法:
    • 设计痛点:桌面端开发者极度渴望高信息密度(High Information Density),希望输入框底栏紧凑精致,行高压缩在 28px 以内;
    • 无障碍危机:在触控屏设备(如微软 Surface Pro、触控显示器)或手势笔操作时,低于 44×44px 的按钮极易发生误触,违反 WCAG 2.1 AA 标准;
    • 数学解法:通过 --cmp-chin-touch-grow 算出控件标准命中尺寸与视觉矮行高的差值,使用 margin-block: calc(... * -1) 将按钮的不可见点击判定区域(Hit-box)向外扩张,既保证了视觉矮行高,又在物理层面提供了充足的触控命中区。

2.9 企业托管配置迁移

废弃键名 (Deprecated - 不再生效)2.0 正式生效键名 (Breaking Replacement)作用范围与策略影响
isDxtEnabledisDesktopExtensionEnabled控制是否允许安装与运行桌面扩展 (DXT)
isDxtSignatureRequiredisDesktopExtensionSignatureRequired是否强制要求桌面扩展具备合规数字签名
isDxtDirectoryEnabledisDesktopExtensionDirectoryEnabled是否允许企业员工访问与安装扩展目录
enduserAttributionendUserAttribution (严格驼峰)审计日志与遥测中的最终用户身份归因识别
trustBootstrapLocalExectrustBootstrapDelivery信任引导与本地可执行文件安全分发控制
inferenceGatewayHeadersinferenceCustomHeaders企业自定义推理网关路由与鉴权头部注入

🚨 高危警报 (Enterprise Risk Alert):
逆向检查表明,Claude 2.0 完全移除了旧键名的兼容回退逻辑!若企业仅配置了旧键名,客户端将静默被判定为“未托管客户端 (Unmanaged)”,导致扩展禁用策略击穿。
同时,因持久化 Token 结构重构,升级后所有 OAuth MCP 连接器必须重新授权一次。


On this page