diff --git a/.project-docs/30-worklog/tasks/20261014-coding-sidebar-text-9fe4278d.md b/.project-docs/30-worklog/tasks/20261014-coding-sidebar-text-9fe4278d.md index 6cc31f1a..ee808982 100644 --- a/.project-docs/30-worklog/tasks/20261014-coding-sidebar-text-9fe4278d.md +++ b/.project-docs/30-worklog/tasks/20261014-coding-sidebar-text-9fe4278d.md @@ -12,18 +12,18 @@ ## Scope -- Read-only comparison of Coding sidebar text with Agents and Canvas, then propose a clearer text hierarchy. Implementation requires the user's later approval. +- Implement the approved Coding sidebar text hierarchy and remove only its bottom Works Square button. Preserve Canvas/Agents navigation and the separate Code welcome gallery entry. ## Intent And Constraints -- User explicitly asks for a proposal first and forbids beginning product changes before approval. Preserve desktop focus, running trial, inputs, projects and conversations. No product edits, runtime update, model calls, merge/push or cleanup. +- User explicitly approved the preceding proposal and additionally requested deletion of the Coding sidebar's bottom Works Square button. This supersedes the earlier source-edit hold and the former footer-placement direction only. Preserve desktop focus, running trial, inputs, projects/conversations, background tasks and other modules; no model calls, cloud writes, merge/push or cleanup. ## Outcome - All three modules share the same bundled Inter/Source Han sans font stack. Agents main navigation and Canvas project entries use14px/600 dark text for normal clickable items; selected/hover states are differentiated primarily by background. - Coding project/create/gallery entries already use14px/600 dark navy. Its conversation titles and new-conversation action are12px/400 auxiliary blue-gray#64758a, with icons#7891af. The group header uses the same auxiliary gray. These styles explain the screenshot's weaker conversation-list hierarchy; no font replacement is needed. - Proposed Coding-only scope: conversation titles and new-conversation action14px/500/#26384d; group heading and collapse action#506176 while remaining a secondary hierarchy; conversation icons one shade darker. Retain existing14px/600 project entries, pale-blue surface, icon tiles, selected/hover backgrounds, layout and interactions. Scope any adjustment to Coding rather than changing global/shared Canvas tokens. -- No product code or running application was changed. Proposal is complete; implementation remains awaiting human approval. +- The initial proposal changed no product/application state. User subsequently approved implementation; the completed source-only result is recorded below. Running application remains unchanged. ## Verification @@ -33,7 +33,7 @@ ## Follow-ups -- On approval, resume the same task and recheck the newest actual source/peer sidebar changes before applying the bounded Coding-only adjustment. Verify normal/selected/hover/disabled typography and layout in headless browser checks, then perform only separately authorized trial delivery. +- Source is ready for a requested trial update/integration. Before delivery, recheck the actual runtime/source and peer changes, preserve all intervening features and guard account/input/running work/focus. No live delivery, merge/push or worktree cleanup was performed in this implementation turn. ## Promotion Candidates @@ -46,3 +46,17 @@ - Official registry had78 owners including this task. Independent coordination review read77 peer records/231Scope, Intent and Promotion sections. All readable; Code-model-onboarding01e8cbed and old child-language6bf94d12 retain unknown placeholder scopes without a concrete dependency. No semantic blocker affects this read-only proposal. - Adjacent Code gallery/footer tasks retain palette/layout; wide Code redesigne4132a1e was explicitly withdrawn and is not reused. Canvas's later a72d49e6 task changes its surface to pale yellow, superseding the older lavender state; no Canvas background proposal is made here. Source comparison uses the declared actual trial436f7ba snapshot and adopts no peer uncommitted product. - Likely approved-edit paths would be CodingProjectConversations.tsx and Coding-scoped selectors in classroom-workspace.css. No shared global color/font change or backend/API alteration is justified. Planning Gate: Passed. + +## Approved Implementation Resume + +- Official check/start/status resumed the exact same feature ownership, branch/worktree/base; registry now planning. Current trial source remains436f7ba, identical to the proposal baseline; all product files are clean. Prior project/design/context is reused. The78-owner registry is unchanged;77 peer scope sets were reviewed in the preceding turn, and the relevant sidebar/gallery/Canvas scopes were reread on resume. No semantic conflict: this explicit user instruction supersedes prior Code footer retention. Canvas's separate footer stays. +- Planning Gate: Passed. Plan: isolate Code-only normal/selected/hover/disabled text rules; remove the Code footer via the shared Sidebar module condition; update existing navigation/layout regression assertions and README; run focused tests/typecheck/scoped lint/production build and headless geometry checks. Commit the bounded source and record actual verification. A live delivery, if undertaken as part of this temporary-app workflow, must bind the then-current actual source and preserve account/input/running work/focus without an unsafe refresh. + +## Completed Approved Source Changes + +- CodingProjectConversations uses14px/500 for new-conversation and normal conversation titles. Code-scoped classroom CSS promotes actions/normal titles to#26384d, group headings and conversation icons to#506176. Existing selected text#304f75, background/border treatments, project14px/600, font stack, action handlers and conversation identity remain. Disabled new-conversation action keeps reduced opacity and no enabled hover background. +- Shared Sidebar renders the bottom community footer for Canvas only. Code chat/settings/plugin workbars no longer contain that bottom Works Square button; the separate Code welcome entry and legacy nonworkspace upper entry remain. A Code-only account-footer padding/border rule preserves the former adjacent-footer reset after removal, without changing Canvas/Agents styling or shifting the account button. +- Updated README and existing navigation/first-chat E2E assertions for removed footer, preserved welcome link and approved typography. Focused Sidebar regressions cover Code footer absence/account presence, Canvas footer retention and the legacy upper entry. Independent source review found no runtime defect or cross-module style leakage; a remaining README footer statement was corrected before completion. +-23/23 related tests across Sidebar project actions, Image Workspace Sidebar and Main-layout peek passed; the peer's5Sidebar tests are included in23, not extra distinct coverage. Typecheck, changed TS/TSX/spec ESLint, diff and production Vite/Main/Preload/utility build passed. CSS is outside ESLint's configured matching files; browser checks provide its verification. The intermediate log redirection failed because the ignored stage directory was not yet present; directory creation and the final build completed successfully. +- Headless QA passed viewport640/1366 × sidebar256/320, with six Code normal/selected/hover/disabled states and Canvas/Agents baseline comparisons (12 module layout combinations, each with baseline/current evidence). Real CodingProjectConversations, AccountMenuTrigger and CommunityLink React SSR use synthetic stores; Sidebar project/Agents markup reproduces real classes/data attributes. Source CSS/bundled fonts are used; no actual app/user data/network access. Long titles truncate correctly; no overflow. Code account button geometry is exactly unchanged, Canvas/Agents computed styles and geometry match436f7ba baseline. Source CSS SHA2561580c7062a3434c1805787efa3270dbb82d9be1546cfd8518abe8a9bae878ddd. Root viewed code-1366-256.png; peer reviewed compact Code and Canvas/Agents PNGs. Evidence: /Users/chillishark/Makelore 麦洛/.trial-runtime/coding-sidebar-text-20261014-9fe4278d/qa/geometry.json. +- Native visible Electron E2E was not launched to preserve desktop focus; updated specs remain future full-native coverage, while the focused units/headless geometry verify this bounded UI change. Runtime Main/Renderer, login, real projects/conversations/inputs and services were not touched. Implementation source is complete; no temporary-app update, main merge/push or cleanup is claimed. diff --git a/README.md b/README.md index 02b1e42a..4d740363 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Code 会话保存的模型被下架后,会提示重新选择可用模型;用 Makelore 是一个面向软件、视觉创作、智能机器人与个人云智能体的 AI 桌面工作台。当前版本为 `2.0.0`,首页展示 Agents、Code、Canvas 三个模块入口,Robot 入口隐藏;云智能体需配套配置 WS/Yuxi 服务。桌面采用左侧问候与标题、右侧三个横向插画卡片竖排的布局,Code 入口中心与“今天,想创作什么?”标题中心对齐,三个入口等高、间距均匀;标题组在桌面向右偏移约 1.5cm,小窗口将标题放在卡片上方;Agents 标语为“打造你想象中的AI助手”。各页左下角账户按钮统一沿用 Code 的白色圆角卡片、头像、字号和右箭头,展开时跟随 Code 侧栏宽度偏好,首页和设置页与 Code 保持相同的左侧与底部边距;展开菜单保持原尺寸,可查看本人词元点数与预占、打开词元点数与充值、个人资料、设置和退出登录;沿用侧栏的账号、钱包和资料规则。设置使用独立页面,不显示编程项目栏、项目标题或工作栏收起按钮;“返回”回到打开设置前的页面(保留查询参数),直接打开设置时回模块首页,未保存设置先保存或还原。每次从首页进入 Code、Agents 或 Canvas 时,默认展开左侧工作栏;进入后沿用各模块现有的手动收起与紧凑布局规则。工作区左上角入口点击后返回模块入口页: - `Makelore Code|AI 编程`:管理本地项目、项目智能体、对话、文件上下文、代码变更和运行时。 - 会话工作台采用浅蓝项目栏,侧栏入口与项目列表采用 Agent 式的彩色图标徽章+文字,选中项目保留浅色反馈;中间对话/作品使用圆角标签,作品预览的后退、前进、刷新与网址输入统一放在标签右侧;只在作品页显示,窄窗口自动换行。右侧智能体咨询使用奶油色标题区。沿用真实项目和会话入口、侧栏伸缩与账户菜单,样式只作用于 Code 会话工作台。可编辑的空对话在输入区上方的可用区域中央显示童趣欢迎语;欢迎区的麦洛标识、星装饰和「作品广场」组成同一个可鼠标或键盘操作的广场入口,保留原有主标题与说明,输入框上方不再显示两句广场邀请。老师介绍以固定宽度浮在右上角,不占用中间布局;欢迎语和底部输入区始终相对项目栏右侧的整个内容区域居中;小窗口的欢迎内容独立滚动;发送首条消息后收起欢迎区。侧栏的「作品广场」固定在底部、紧邻账户按钮上方,保持与上方入口相同的横向对齐;只有点击后才在系统浏览器打开公共广场,不请求、摘取或内嵌展示广场作品。打开广场保留当前项目、对话、草稿和附件,不自动发送消息;老师求助按钮保留临时应用的最新文案「帮我整体看🧠」。 + 会话工作台采用浅蓝项目栏,侧栏入口与项目列表采用 Agent 式的彩色图标徽章+文字,选中项目保留浅色反馈;中间对话/作品使用圆角标签,作品预览的后退、前进、刷新与网址输入统一放在标签右侧;只在作品页显示,窄窗口自动换行。右侧智能体咨询使用奶油色标题区。沿用真实项目和会话入口、侧栏伸缩与账户菜单,样式只作用于 Code 会话工作台。可编辑的空对话在输入区上方的可用区域中央显示童趣欢迎语;欢迎区的麦洛标识、星装饰和「作品广场」组成同一个可鼠标或键盘操作的广场入口,保留原有主标题与说明,输入框上方不再显示两句广场邀请。老师介绍以固定宽度浮在右上角,不占用中间布局;欢迎语和底部输入区始终相对项目栏右侧的整个内容区域居中;小窗口的欢迎内容独立滚动;发送首条消息后收起欢迎区。Code 侧栏底部的「作品广场」入口已移除,欢迎区的广场入口保留;只有点击后才在系统浏览器打开公共广场,不请求、摘取或内嵌展示广场作品。打开广场保留当前项目、对话、草稿和附件,不自动发送消息;老师求助按钮保留临时应用的最新文案「帮我整体看🧠」。 - `Makelore Agents|AI 智能体`:从模块首页进入时先打开“我的智能体”卡片列表,保留此前对话与操作恢复记录;返回首页箭头与侧栏折叠按钮同排,折叠后仍可返回;智能体模块的侧栏只通过按钮点击或键盘激活展开,鼠标经过左侧、收纳按钮或顶栏不会展开,切换模块不沿用旧悬停预览;其他模块仍保留原预览方式。“我的智能体”使用浅紫对话机器人图标,“渠道”使用浅蓝连接节点图标。macOS 原生窗口按钮留出安全空间。首页围绕自己的智能体和创建入口,显示童趣问候“Hi,今天想创造还是想聊聊?”,不再显示更多、收到的分享、活动或归档筛选。卡片恢复原有尺寸与留白,显示名称、可为空的一句话介绍及状态,支持聊天、调整、继续制作和确认删除;删除沿用云端归档机制,移出列表并停用新调用,历史和费用保留。创建先填写名称并选择平台像素头像或上传头像,下一步进入独立配置。顶部名称有编辑图标,头像可点击修改;未设置头像时使用同一张默认像素头像,从创建到配置、改名、保存和重新打开保持一致。基础页为“介绍与提示词”,一句话介绍可留空,完整提示词保留原始文本;模型作为高级设置第一项必选,未选择时不能开始使用,草稿可分步保存,不自动选模型。介绍与提示词采用浅蓝介绍卡和浅紫提示词卡;高级设置按模型、TOOL、SKILL、MCP 服务和知识库纵向呈现,资源选择按钮分别显示「选择TOOL」「选择SKILL」;移除子智能体选择模块,保存其他配置时保留历史子智能体绑定,不再设内部分类切换;不展示 Tool/Skill 解释、资源开放规则提示、云端能力管理、费用上限或运行限制卡片,保存其他配置时保留既有运行限制,费用规则不变。顶层页签切换保留搜索、资源选择、知识表单及未保存输入。配置页移除聊天、自动任务和使用与接入导航,独立聊天仍从卡片进入,微信账号仍在侧栏渠道管理。草稿明确保存(Ctrl/⌘+S);保存只更新草稿,“应用最新修改”使新配置生效,失败重试保持原操作身份;点击“开始使用”完成必要的私有启用后直接打开聊天,不再展示二次确认页;未保存修改、缺少模型、冲突或尚未确认的请求会留在配置页处理,打开聊天不自动发送消息。独立对话沿用奶油底色和浅蓝、浅紫、薄荷色:顶部展示返回、只读头像和名称;有附件时在同一行右侧显示回形针“附件”入口和文件数量,不展示调整、保存/应用状态、客户端/微信来源、费用/版本说明或历史/新对话图标;配置由列表卡片的“调整”进入。空对话展示当前智能体头像与名称,示例只填入草稿;用户消息使用浅紫圆角气泡,助手 Markdown、表格和代码在消息区内滚动。文件或图片从输入框内添加,上传成功后以待发送卡片呈现,可移除本次携带;移除不会删除云端文件,添加不会自动发送。确认失败沿用同一文件和对话重试,发送前需完成或取消添加;支持仅发送附件,使用明确的附件提问。输入框沿用 Code 的浅蓝边框、圆形按钮及一至六行输入规则;Enter 发送、Shift+Enter 换行,保留中文输入法确认。麦克风复用应用级语音输入,识别只追加当前草稿,不自动发送;切换账号、对话或隐藏页面后丢弃过期识别。支持拖入文件、粘贴图片和多文件选择,上传与确认仍由 Main 持有认证并转发;失败重试保留同一批文件身份。输入框的“+”添加文件或图片;右上角“附件”打开右侧面板,按“你上传的”和“助手生成的”分组,支持再次选用已上传附件及保存明确交付的生成文件。生成文件仅取当前对话已保存助手回复中的本地文件链接(含图片与引用式链接),核对实际文件后展示和计数;只读取链接所在的文件夹,不遍历全部工作文件。未交付的脚本、缓存和工具记录不展示、不计数,明确交付的代码照常展示;仅写了路径的旧成果可能暂时隐藏,后续接入 Yuxi 的正式交付记录。没有文件时隐藏入口;打开、关闭面板保留聊天与输入,Escape 关闭并返回入口焦点;最近对话自动恢复、审批、停止和未发送内容的离开保护保留。模型返回的思考按消息独立于正文展示;正文到来后或完成时折叠,可手动展开;无思考或工具内容时不显示过程区。重连事件去重并隔离当前运行与主对话,终态历史未到达时保留已收到的片段并有限补读;服务端返回的最终回答思考可在历史中回看,不进入后续提问。历史回看需要配套 Yuxi API 的思考和工具记录投影;实时过程沿用既有事件流。平台工具和内置做事手册使用 Yuxi 下发的通俗名称与说明;逐条消息的思考、工具输入/结果/失败独立于 Markdown 正文,实时与历史工具卡片共用展示文案,展开可查看原始工具标识。个人上传手册保留作者文案,资源选择仍保存原始标识。头像上传、Main-owned Host API、访问隔离、费用与不可变版本规则保持;介绍留空需要配套 Yuxi DraftCreate/DraftSave 的空字符串契约。 个人智能体聊天在每条提问与回答下方显示云端记录的消息时间;发送时间位于紫色消息气泡外下方并靠右,助手回复时间保持在回答下方:今天显示时分,跨日增加日期,悬停可查看完整日期与秒数;发送时间与回复时间沿用原消息记录,重开对话不改为当前时间。流式回答尚无可靠时间时显示「回复中…」,历史到达后展示原时间;缺失或无效时间显示「时间未记录」。正式对话、草稿试用和上次试用对比使用相同规则,不新增 Yuxi 接口。 @@ -41,7 +41,7 @@ Makelore 是一个面向软件、视觉创作、智能机器人与个人云智 - macOS 窗口按钮:红色关闭当前窗口,全屏时先退出全屏再关闭;黄色最小化,绿色保留原生缩放/全屏行为。关窗后应用和进行中的后台任务继续运行,点击 Dock、托盘或菜单可重新打开窗口;`Cmd+Q` 退出应用。 - 桌面文本右键菜单:主 Renderer 窗口由 Electron Main 提供原生“剪切、复制、粘贴、全选”操作;菜单只在可编辑区域或已有文本选择时出现,普通空白区域不显示,也不向 Renderer 暴露剪贴板 IPC。 - AI 编程核心对话运行时:Electron Main 按需启动一个长驻 Pi Agent Server,同一进程内为每条 Conversation 建立独立的 Runtime、Session、凭证视图、扩展上下文和 JSONL 通道,同时复用 Pi 模块与进程启动成本;Server 异常退出时所有旧通道统一失效,下一次恢复只重启一个 Server。正式包中的 Agent Server 从明确传入的 `resources/pi-runtime` 根定位依赖清单与包入口,不从脚本所在目录或应用 `node_modules` 猜测解析。Renderer 不直接启动或调用 Pi,也不读取其 wire 类型。项目与 Conversation 元数据先从本地读取,选中对话后才按需准备对应逻辑线程;输入框不等待运行时准备完成。同一助手工具批次中,会取得项目写租约的 `bash`、`edit`、`write` 与动态产品工具按顺序执行,避免批次在命令启动前自锁;纯只读工具仍可并行。子 Agent 仍使用独立的短生命周期进程,以保留并发配额、故障和写入边界;macOS 上两类后台进程都使用 Electron 自带的 Helper,不在 Dock 中创建额外应用图标。 -- AI 编程默认入口:进入 Code 后保持在 `/chat`。顶部返回箭头与侧栏收起图标同排,与右侧项目/会话名称对齐;折叠时保留返回和展开入口。macOS 为原生窗口按钮保留安全空间,窄侧栏仍可使用。左侧不再展示麦洛品牌与说明语,“新建项目”置于原品牌区,“我的项目”与列表上移到原新建项目区域;“作品广场”与“新建项目”沿用 Agent 的彩色图标徽章+文字样式,不再使用整行白色块与厚阴影,“作品广场”移至底部、紧邻账户按钮上方;“我的项目”和项目列表紧接新建项目,列表沿用图标与文字布局及浅色选中反馈;从项目菜单进入的配置页及插件资源页复用相同的左侧工作栏,返回与收起按钮、项目和会话列表、底部作品广场与账户的位置保持一致,并沿用当前宽度和收起状态;配置正文、顶部项目名称与配置页自身的返回操作保留。尚未选择本地项目时,页面以麦洛 M 标识和居中引导语建立焦点,下方提供独立的“新增项目”主操作以及可横向浏览、直接进入的已有项目卡片;项目创建和进入仍复用侧栏现有流程。已有项目的新 Conversation 在可编辑 Composer 上方沿用同一品牌引导,第一条消息出现后切换为正常时间线。 +- AI 编程默认入口:进入 Code 后保持在 `/chat`。顶部返回箭头与侧栏收起图标同排,与右侧项目/会话名称对齐;折叠时保留返回和展开入口。macOS 为原生窗口按钮保留安全空间,窄侧栏仍可使用。左侧不再展示麦洛品牌与说明语,“新建项目”置于原品牌区,“我的项目”与列表上移到原新建项目区域;“新建项目”沿用 Agent 的彩色图标徽章+文字样式,不再使用整行白色块与厚阴影;Code 工作栏底部不显示“作品广场”,欢迎页的独立入口保留;“我的项目”和项目列表紧接新建项目,列表沿用图标与文字布局及浅色选中反馈;从项目菜单进入的配置页及插件资源页复用相同的左侧工作栏,返回与收起按钮、项目和会话列表、底部账户的位置保持一致,并沿用当前宽度和收起状态;配置正文、顶部项目名称与配置页自身的返回操作保留。尚未选择本地项目时,页面以麦洛 M 标识和居中引导语建立焦点,下方提供独立的“新增项目”主操作以及可横向浏览、直接进入的已有项目卡片;项目创建和进入仍复用侧栏现有流程。已有项目的新 Conversation 在可编辑 Composer 上方沿用同一品牌引导,第一条消息出现后切换为正常时间线。 - AI 编程历史与配额反馈:Pi 上下文压缩不删除用户可见的 active-branch 历史,压缩摘要保持 Main-private;Renderer 首次渲染最近 120 个节点,向上滚动时按 100 个节点追加更早内容并保持阅读位置。Main 精确识别 `token_point_balance_exhausted` / `词元点数余额不足`,只向 Renderer 投影不可重试的稳定配额错误和安全中文提示,重开会话后仍可见且不暴露上游原始错误或 request id。 - 账号词元点数:左下角账户菜单显示本人永久余额和预占;“词元点数与充值”入口暂时隐藏,充值、充值订单与分页收支记录的既有实现保留。真正新注册赠送 100 点,1 元充值 50 点,永久有效;旧账户不补送,旧会员/订阅/周额度/重置卡入口已移除。家长为孩子充值时登录孩子的账号,页面显示当前昵称和账号,点数进入该账号自己的钱包;无需将孩子身份改为家长。当前有效账号可给本人充值,青少年可查看自己的精确余额;使用他人共享钱包时仅显示可用状态,不显示付款人的余额或记录。Main 持有凭据并转发充值请求;付款结果未知时沿用原请求并核查原订单,只有服务端确认才显示到账。扫码信息缺失时可到网页账户页继续原订单,付款来源也由网页账户页管理,充值不会自动切换共享/个人来源。需配套部署 Works Square 当前账号充值资格更新(本次无需新迁移,原永久点数基础为 0094);本地模拟验收不代表真实支付通过。 - 桌面性能策略:应用窗口使用不透明浅色表面并默认保留硬件合成;仅在显式安全模式或短时间内重复 GPU 进程崩溃时启用软件渲染,并把故障原因保存在用户数据目录。启动关键路径只创建本地应用壳,认证、代理、同步、更新和遥测在首帧后延迟初始化;开发版可通过 `app:performance` 快照观察 GPU、进程、WebContents、事件循环与 Renderer Long Task 聚合指标。 @@ -161,7 +161,7 @@ Pi 正式包必须继续运行 `pnpm run verify:artifact:pi`、`pnpm run smoke:p - 项目设置仅提供默认编程配置的模型选择,不展示项目提示词或项目 Skills 编辑入口;知识文件与插件仍在各自入口管理。默认模型只影响新对话,现有对话独立切换模型与思考选项,已有消息记录不会被改写;保存模型配置保留原有 Agent 元数据。 - 项目智能体只保存自身的精确默认模型;未完成模型选择的智能体保持待配置状态,不从项目级 `defaultModel` 或运行时私有配置回退。 - 一个智能体可以拥有多条互相独立的 Pi Session;智能体和对话元数据分别由 `.makelore/project.json` 与 `.makelore/conversations.json` 保存,稳定的智能体与对话 id 保持本地历史连续。 -- 会话列表直接挂在左侧项目下,不展示中间智能体列;同一项目内不同历史智能体的会话统一列出,支持删除、改名、未读与运行状态。快速切换项目和会话时,迟到的请求与回复保持原归属。 +- 会话列表直接挂在左侧项目下,不展示中间智能体列;“新对话”和对话名称使用 14px 中等字重的深蓝灰,分组标题与对话图标使用较深的辅助灰,选中与悬停沿用浅色背景;同一项目内不同历史智能体的会话统一列出,支持删除、改名、未读与运行状态。快速切换项目和会话时,迟到的请求与回复保持原归属。 - Conversation 历史按需从 Main-owned Snapshot 读取。Session hydration 沿完整 active branch 投影可见历史;公开 SSE 交付 Snapshot、会话元数据变更通知,以及按 Conversation、worker generation 分组的 `patch-batch`。Renderer 整批校验连续 seq 后在一次状态事务中顺序应用,缺口或畸形批次只恢复目标 Conversation,隐藏 Conversation 的流式更新不会提交选中时间线。Main 发出 `lifecycle:sleep` 时页面关闭旧事件流;视图挂载、项目上下文变化、窗口重新可见或获得焦点时,已选 Conversation 会静默重读权威 Snapshot,从而收敛后台已结束的任务,但绝不重放已接受或状态不确定的 mutation。时间线默认挂载最近 120 个节点,接近顶部时按 100 个节点自动追加更早内容并补偿新增高度,保持当前阅读锚点。 - 核心时间线按每条用户消息组织为“用户消息、连续处理过程、结论回复”。Pi 的流式 thinking、工具、压缩、重试、通知和 `subagent.v1` 单个/并行/串行子任务共享一条轻量过程轨道;运行时显示“处理中”和活动指示,完成后按耗时(历史缺少计时时按项目数)收纳为可展开的“已处理”摘要。文字层级按结构化事件类型划分,不按文案关键词猜测:助手在工具调用前后直接对用户说的过程正文与最终结论都使用黑色;thinking、工具输入输出、压缩、子任务和运行状态使用浅灰辅助文字,仍在运行的灰色缩略文字带有低对比度 Shimmer 擦拭高光,结束后停止动画;错误状态保持红色。折叠的 thinking、助手过程正文和工具输出固定展示第一个可见块的首个非空行,横向偏移始终为零;尾部流式更新不会替换未变化的首行预览,展开后仍可查看完整内容。两类流式文字均在原位更新且不做位移动画,助手过程正文也不使用 Shimmer。工具调用用一行摘要持续展示工具名称、最新输入或输出和运行状态,并可按流式批次轻量整行轮动。思考、助手过程正文和工具节点均可展开查看完整详情,工具的累计输出和浏览器附件留在对应的二级展开区而不形成独立气泡。结论回复按安全 Markdown 排版标题、列表、引用、代码和表格;可点击的 HTTP/HTTPS 与本地 HTML 链接统一使用无底色的橙色文字。左键通过 Main-owned 系统入口交给默认浏览器打开;右键可打开系统菜单,网页链接可复制地址,本地链接还可在访达或系统文件夹中显示。同一回复已经给出完整 HTML 路径时,对应的相对查看路径也会解析到该文件。内部 `turn-start`/`turn-end` 只维持事件顺序、不呈现在界面。 - Composer 使用贴底的复合输入面板,支持文字、登录后的语音转写,以及粘贴或选择 PNG/JPEG/WebP/GIF 图片;每条消息最多 16 张图片、最多并行上传 4 张。语音录制通过现有 Main-owned Works Speech Host API 转成文字,并在项目或账号切换时立即停止;当前对话的模型与思考强度组合入口、语音及发送/中止入口保留在底部控制行,模型入口默认使用透明底色。模型与思考强度通过向上展开的分级菜单切换,只列出当前 Provider 或 Makelore 已验证模型档案实际支持的选项;Qwen3.6 Plus 使用混合思考开关,Qwen3.8 Max 暴露低/中/高三档并把产品“高”映射到服务端 `xhigh`。模型仅报告 `off` 时明确显示“不可调”,不伪造未知模型的推理档位。切换完成后静默刷新当前 Snapshot,只有真正恢复 worker 时才显示本地 Agent 重连提示。重复读取 Snapshot 不发布无变化的 worker 状态;Snapshot 与 SSE 批次竞态时,Renderer 会丢弃已覆盖事件并只应用连续的新尾部,避免形成伪重连循环。上下文接近模型限制或发生溢出时由 Pi 自动整理,Composer 不提供手动整理入口;自动整理的进度和结果仍显示在对话过程轨道中。图片在发送前只保留本地预览,点击发送时才经 Main-owned 有界二进制接口上传一次;Main 在落盘前核对 MIME 与最小图片签名,状态与事件只保存 attachment id,时间线按需读取二进制并创建临时 object URL,不保存重复 base64。发送后立即展示图片附件;Pi 实时消息与历史会话恢复都将图片映射到同一附件存储,重复加载复用已有文件。智能体报告 `changed-file.v1` 后,输入框上方会展示当前轮次的文件数与增删行统计,并可展开查看 Main-owned 变更快照中的逐文件差异。 diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index 39b059fa..4fa99834 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -874,7 +874,7 @@ export function Sidebar({ onOpenChange={setProfileDialogOpen} /> - {((workspaceLayout && isProgrammingModule) || isPaintingModule) && ( + {isPaintingModule && (
diff --git a/src/pages/Chat/CodingProjectConversations.tsx b/src/pages/Chat/CodingProjectConversations.tsx index 38b1a152..d312c2e2 100644 --- a/src/pages/Chat/CodingProjectConversations.tsx +++ b/src/pages/Chat/CodingProjectConversations.tsx @@ -73,7 +73,7 @@ export function CodingProjectConversations({ aria-label="新建对话" title="新建对话" disabled={!!busy} - className={`flex shrink-0 items-center gap-1.5 rounded py-2 pr-2 text-xs hover:bg-surface-tertiary ${compact ? "pl-0" : "pl-2"}`} + className={`flex shrink-0 items-center gap-1.5 rounded py-2 pr-2 text-sm font-medium hover:bg-surface-tertiary ${compact ? "pl-0" : "pl-2"}`} onClick={() => void act('new', async () => { const workspace = codingWorkspaceStore.getState(); @@ -103,7 +103,7 @@ export function CodingProjectConversations({ className={`classroom-conversation-row group/session flex items-center rounded-lg ${selected === item.id ? 'bg-[#e7e9e1]' : 'hover:bg-surface-tertiary'}`} > , +})); vi.mock('@/components/layout/ModuleSwitcher', () => ({ ModuleSwitcher: () => null })); vi.mock('@/components/layout/ImageWorkspaceSidebar', () => ({ ImageWorkspaceSidebar: () => null })); vi.mock('@/components/layout/SidebarUpdateButton', () => ({ SidebarUpdateButton: () => null })); @@ -69,8 +71,8 @@ function LocationProbe() { return
{useLocation().pathname}
; } -async function renderSidebar() { - render(); +async function renderSidebar(path = '/chat', workspaceLayout = false) { + render(); await act(async () => undefined); projectConfigState.load.mockClear(); } @@ -95,6 +97,27 @@ describe('Sidebar project actions', () => { projectConfigState.load.mockResolvedValue({ status: 'valid', config: {} }); }); + it('removes the community footer from the Code workspace while retaining its account entry', async () => { + await renderSidebar('/chat', true); + + expect(screen.queryByRole('button', { name: '作品广场' })).not.toBeInTheDocument(); + expect(screen.getByTestId('sidebar').querySelector('.classroom-community-footer')).toBeNull(); + expect(screen.getByRole('button', { name: '打开账户菜单:测试用户' })).toBeVisible(); + }); + + it('retains the community footer in Canvas', async () => { + await renderSidebar('/image-canvas'); + + expect(screen.getByRole('button', { name: '作品广场' }).closest('.classroom-community-footer')).not.toBeNull(); + expect(screen.getByRole('button', { name: '打开账户菜单:测试用户' })).toBeVisible(); + }); + + it('retains the existing upper community entry outside the Code workspace layout', async () => { + await renderSidebar(); + + expect(screen.getByRole('button', { name: '作品广场' }).closest('.classroom-community-footer')).toBeNull(); + }); + it('settings for the current project supersedes an earlier pending project open', async () => { await renderSidebar(); let resolveProjectB!: (value: unknown) => void;