diff --git a/.scratch/embedded-browser/PRD.md b/.scratch/embedded-browser/PRD.md index 5f7fecdc..7f56993e 100644 --- a/.scratch/embedded-browser/PRD.md +++ b/.scratch/embedded-browser/PRD.md @@ -51,6 +51,8 @@ PiGUI 目前对 dev server 零认知(project registry 只有 `{id, path, display ### 5. 元素标识与载荷形状(定义在 `packages/core`) +> 修订提示(2026-10-10):本节「不新增结构化附件」「落到 composer 草稿」与 `formatBrowserAnnotationPrompt` 已被标注 v2 取代,见 `.scratch/browser-annotation-v2/PRD.md` 决策 4 与 ADR-0029「修订:标注 v2」。 + ```ts type BrowserAnnotationElement = { index: number; // 标记序号,与截图上的数字一致 diff --git a/CONTEXT.md b/CONTEXT.md index 5aafbc4c..975b5bd2 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -268,6 +268,10 @@ _Avoid_: Panel, tab, view, plugin, widget Pace 自带的 Surface:Changes、Files、Terminal、Browser。它们与将来扩展注册的 Surface 走同一套注册表与 Rail,只是 provider 为 `builtin`。Files 是只读的 checkout 目录树加文件预览(ADR-0035)。 _Avoid_: Core panel, native panel, first-party plugin +**Browser Comment**: +用户在 Browser Surface 的标注模式里对页面一个元素或一块区域写下的评论,保存才成立(标注 v2,ADR-0029「修订:标注 v2」)。由主进程按 Session 持有——不属于 tab 或文档,带保存时的 URL、视口与局部截图;同 URL 的新文档会重新显示它的标记,找不到元素时标为 stale。它在 composer 附件抽屉里以 `#n` 芯片列出,随下一条消息作为评论块与截图发给 Pi,发送成功即被消费。 +_Avoid_: Annotation(仅指页上标记的实现层叫法), marker, note, design comment + **Session Projection**: Pace 自己保存的查询模型,用来支撑 Session 列表、Analyze、状态索引、成本聚合、checkout 生命周期、恢复入口和 UI 快速渲染。它是从 Pi Session State、Session Trajectory 和 Pace checkout 管理事件同步出来的投影,不是 Pi 会话内容的权威来源。渲染层每个 Session 只保留一份,由一个 module 拥有并作为唯一写者(ADR-0044)。 _Avoid_: Runtime truth, independent chat state, source of record diff --git a/apps/desktop/src/pages/design-components.tsx b/apps/desktop/src/pages/design-components.tsx index 378d4ce8..dfdb4d03 100644 --- a/apps/desktop/src/pages/design-components.tsx +++ b/apps/desktop/src/pages/design-components.tsx @@ -2801,7 +2801,7 @@ function ComposerAttachmentDrawerGallery() { /> - +
diff --git a/docs/self-built-ui.md b/docs/self-built-ui.md index f70a34fb..6eae8a77 100644 --- a/docs/self-built-ui.md +++ b/docs/self-built-ui.md @@ -40,7 +40,7 @@ | composer-attachments | `shared/ui/composer-attachments/` | Composer「Add to prompt」菜单 + 附件抽屉(#98,2026-08-14 原型探索 Shelf 胜出):footer 左侧 Plus;一级仅 Add files / Use skill / Chat commands / Use plugin,技能与插件通过 Astryx CommandPalette 搜索,技能保留 SDK 说明,插件只规范展示名称、保留原插入标识;图片 Thumbnail、文本 Token;文本附件内联进 prompt,图片走 Gateway `images` 通道;抽屉还承载 Browser comments 芯片(stale 显示 warning),comments 作为 appendix 拼进 prompt 文本、截图排在附件图之后;决策记录 `.scratch/composer-attachments/PRD.md` | | session-dock | `shared/ui/session-dock/` | 会话页右栏的 surface 宿主(Rail 形态,2026-09-02 从 Dock/Rail/Ambient 三原型中选定,见 ADR-0028):面板本体 + 贴面板右缘的 44px 图标 rail,面板收起时 rail 随之消失。开合是成对运动(2026-09-06 修订):分栏 pane(`.pigui-session-dock-pane`,agent-workspace 里)在 `data-motion` 期间对 width 做 transition——这是全项目唯一刻意动画的布局属性,因为只有布局变化才能让分隔线和 Chat 列跟着 dock 边缘走;dock 本体只淡出淡入,不再自带 translate(否则位移叠加、内容比分隔线先跑掉);进 250ms / 出 180ms,拖拽调宽时无 transition,减动效关闭;Terminal/Browser 持有活的 pty / WebContentsView,关闭后不能一直挂着,所以退出动画结束后再卸 DOM。Rail 指针切换 surface 时内容区轻淡入,键盘切换不动画。静止态不写任何 `transform`/`will-change`:那会让 dock 或 surface 变成独立 stacking context,surface 第一行的 `z-index: 51` 就压不过 fixed 的 header chrome 拖拽区,标题带里的 tab 会点不到(2026-09-06 实测)。开合期间通过 `SessionDockMotionContext` 向 surface 广播「正在动画」,Browser 据此让原生视图让位。**宿主不写表头**(2026-09-05 ADR-0028 修订,[#184](https://github.com/BubblePtr/pace/issues/184)):rail 图标高亮已经命名了当前 surface、tooltip 里又是同一句,表头是第三遍,而且把每个 surface 自己的第一行挤成了第二条 40px 带;现在面板顶部那条 40px 带**就是 Surface 的第一行(状态 + 动作)**,`aside` 的可访问名改用 `aria-label`。rail 用 Astryx `ToggleButtonGroup`(vertical/single),宽度(默认 560 / 最小 340 / 上限 = 可分配宽度 - Chat 最小宽 400,2026-09-02 从原先的 58vw 改来,见 ADR-0028 修订)交给 agent-workspace 里既有的 Astryx `useResizable`;上限随分栏容器的 `ResizeObserver` 实时重算,窗口缩小到容不下时主动把 size clamp 回新上限;`surface-registry.ts` 只存元数据(id/title/icon/hint/multiInstance/flushContent——hint 只剩 rail tooltip 一个消费者,flush 的 surface 去掉内容内边距、自己管 inset),surface 内容由页面注入,注册表因此不依赖 Session 状态。已注册 Changes / Files / Terminal / Browser——Terminal 是首个 multiInstance surface(单 rail 图标 + 第一行实例条,ADR-0028);四者均 flush(第一行与内容贴面板缘);Files 已由 ADR-0035 解冻为只读 checkout 浏览器。Changes 的页面组合始终为 Diff / 大纲双栏,各自独立滚动且填满可用高度,文件标题在 Diff 列内吸顶,空态直接复用 Astryx `EmptyState`,与 Terminal / Browser 一致,不新增自建原语(#243)。rail 徽标(`badges`)由页面层的 `useSessionChanges` 供给 Changes 文件数(#141),与第一行的文件统计同源;Terminal 徽标是 `SessionTerminalPanel`(`widgets/session-dock/`)上报给页面的实例数;干净树、非 Git、加载中与读取失败都不显示数字 | | session-surface-bar | `shared/ui/session-dock/surface-bar.tsx` | Surface 第一行的两个共享原语(#184,ADR-0028 2026-09-05 修订)。`SessionSurfaceBar`:`h-10` 容器,与 Chat 标题同基线;`px-2` 是 flush surface 的统一内缩——这里打头的都是自带 ~8px 内边距的控件,图标因此落在与下方内容同一条 16px 列上;左槽状态、右槽动作(动作槽即使暂时空着也保留,Changes 将来的 checkout / commit / push 落在那里,ADR-0008)。`SessionSurfaceTabs`:多实例 surface 的实例条,每个 tab 自带关闭按钮、末尾一枚新建按钮、`exited` 态、`role=tablist`/`aria-selected`;Terminal 是首个消费者,Browser 多实例([#185](https://github.com/BubblePtr/pace/issues/185))复用同一个而不是再画一套。Astryx 都不等价:`Toolbar` 的高度来自 `--size-element-*` 加自身 block padding,钉不到 40px,而且它的 roving tabindex 会和实例条自己的方向键模型嵌套打架;`Tab` 渲染成单个 `