[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"doc-\u002Fzh-Hans\u002Fxihe\u002Fdev-guide\u002FDEV-015-session-views\u002F":3},"\u003Ch1 id=\"dev-015%3A-session-%E8%A7%86%E5%9B%BE%E5%B1%82%E8%AE%BE%E8%AE%A1\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#dev-015%3A-session-%E8%A7%86%E5%9B%BE%E5%B1%82%E8%AE%BE%E8%AE%A1\">#\u003C\u002Fa> DEV-015: Session 视图层设计\u003C\u002Fh1>\n\u003Cblockquote>\n\u003Cp>本文档描述 PLAN-029-XH-unified-session-architecture 的视图层实现：路由、\u003Ccode>ChatPanel\u003C\u002Fcode> 嵌入、chat ↔ workspace 切换。它面向前端开发者，假设读者已阅读 RFC-001 与 ADR-001。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2 id=\"1.-%E8%B7%AF%E7%94%B1%E8%AE%BE%E8%AE%A1\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#1.-%E8%B7%AF%E7%94%B1%E8%AE%BE%E8%AE%A1\">#\u003C\u002Fa> 1. 路由设计\u003C\u002Fh2>\n\u003Ch3 id=\"1.1.-%E8%B7%AF%E7%94%B1%E8%A1%A8\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#1.1.-%E8%B7%AF%E7%94%B1%E8%A1%A8\">#\u003C\u002Fa> 1.1. 路由表\u003C\u002Fh3>\n\u003Cpre data-lang=\"typescript\" class=\"shiki github-light\" style=\"background-color:#fff;color:#24292e\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">\u002F\u002F packages\u002Fui\u002Fsrc\u002Frouter\u002Findex.ts\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">  path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">'\u002Fchat'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">  component\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: AppLayout,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">  children\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">    { path: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">''\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">, redirect: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">'\u002Fchat\u002Fdefault'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\"> },\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">    { path: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">'new'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">, redirect: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">'\u002Fchat\u002Fdefault'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\"> },\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">    { path: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">':sessionId'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">, name: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">'chat'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">, component: ChatView },\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">  ],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">},\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">  path\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">'\u002Fworkspace\u002F:sessionId?'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">  name\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">'workspace'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">  component\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: AppLayout,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6F42C1\">  children\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">: [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">    { path: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">''\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">, name: \u003C\u002Fspan>\u003Cspan style=\"color:#032F62\">'workspace-session'\u003C\u002Fspan>\u003Cspan style=\"color:#24292E\">, component: WorkspaceView },\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">  ],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#24292E\">},\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3 id=\"1.2.-%E8%AE%BE%E8%AE%A1%E5%86%B3%E7%AD%96\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#1.2.-%E8%AE%BE%E8%AE%A1%E5%86%B3%E7%AD%96\">#\u003C\u002Fa> 1.2. 设计决策\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>保持 \u003Ccode>\u002Fchat\u002F:sessionId\u003C\u002Fcode> 与 \u003Ccode>\u002Fworkspace\u002F:sessionId\u003C\u002Fcode> 并存，不统一为 \u003Ccode>\u002Fsession\u002F:id\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>\u003Ccode>\u002Fworkspace\u002F:sessionId?\u003C\u002Fcode> 使用可选参数，兼容旧入口 \u003Ccode>\u002Fworkspace\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>两个路由共用 \u003Ccode>AppLayout\u003C\u002Fcode>，侧边栏与全局状态保持一致。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"1.3.-%E9%BB%98%E8%AE%A4%E9%A6%96%E9%A1%B5\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#1.3.-%E9%BB%98%E8%AE%A4%E9%A6%96%E9%A1%B5\">#\u003C\u002Fa> 1.3. 默认首页\u003C\u002Fh3>\n\u003Cp>\u003Ccode>\u002F\u003C\u002Fcode> 仍然重定向到 \u003Ccode>\u002Fchat\u003C\u002Fcode>，chat 仍是用户最常入口。workspace 适合从 chat 切换进入。\u003C\u002Fp>\n\u003Ch2 id=\"2.-%E7%BB%84%E4%BB%B6%E5%88%86%E5%B1%82\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#2.-%E7%BB%84%E4%BB%B6%E5%88%86%E5%B1%82\">#\u003C\u002Fa> 2. 组件分层\u003C\u002Fh2>\n\u003Ch3 id=\"2.1.-chatpanel.vue%EF%BC%88%E5%8F%AF%E5%B5%8C%E5%85%A5%E7%9A%84%E5%AF%B9%E8%AF%9D%E9%9D%A2%E6%9D%BF%EF%BC%89\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#2.1.-chatpanel.vue%EF%BC%88%E5%8F%AF%E5%B5%8C%E5%85%A5%E7%9A%84%E5%AF%B9%E8%AF%9D%E9%9D%A2%E6%9D%BF%EF%BC%89\">#\u003C\u002Fa> 2.1. ChatPanel.vue（可嵌入的对话面板）\u003C\u002Fh3>\n\u003Cp>\u003Ccode>packages\u002Fui\u002Fsrc\u002Fcomponents\u002Fchat\u002FChatPanel.vue\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>职责：提供消息列表 + 输入框 + SSE 流式消息。\u003C\u002Fli>\n\u003Cli>接收 \u003Ccode>sessionId\u003C\u002Fcode> prop，内部读取 \u003Ccode>useChatStore\u003C\u002Fcode> \u002F \u003Ccode>useAgentStore\u003C\u002Fcode> \u002F \u003Ccode>useSessionStore\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>不包含全屏布局头、不包含导航按钮。\u003C\u002Fli>\n\u003Cli>上传附件时同时调用 \u003Ccode>sessionStore.addAttachment(...)\u003C\u002Fcode>，把附件提升到 Session 层。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"2.2.-chatview.vue%EF%BC%88%E5%85%A8%E5%B1%8F%E5%AF%B9%E8%AF%9D%E8%A7%86%E5%9B%BE%EF%BC%89\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#2.2.-chatview.vue%EF%BC%88%E5%85%A8%E5%B1%8F%E5%AF%B9%E8%AF%9D%E8%A7%86%E5%9B%BE%EF%BC%89\">#\u003C\u002Fa> 2.2. ChatView.vue（全屏对话视图）\u003C\u002Fh3>\n\u003Cp>\u003Ccode>packages\u002Fui\u002Fsrc\u002Fcomponents\u002Fchat\u002FChatView.vue\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>职责：全屏 chat 页面。\u003C\u002Fli>\n\u003Cli>包含顶部标题栏（Session 标题、Agent 状态）。\u003C\u002Fli>\n\u003Cli>内部嵌入 \u003Ccode>ChatPanel :session-id=&quot;currentSessionId&quot;\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>负责从路由参数或 \u003Ccode>currentSessionId\u003C\u002Fcode> 解析当前 Session，无 Session 时自动创建。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"2.3.-workspaceview.vue%EF%BC%88%E6%96%87%E4%BB%B6%E7%BC%96%E8%BE%91-%2B-%E5%86%85%E5%B5%8C%E5%AF%B9%E8%AF%9D%EF%BC%89\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#2.3.-workspaceview.vue%EF%BC%88%E6%96%87%E4%BB%B6%E7%BC%96%E8%BE%91-%2B-%E5%86%85%E5%B5%8C%E5%AF%B9%E8%AF%9D%EF%BC%89\">#\u003C\u002Fa> 2.3. WorkspaceView.vue（文件编辑 + 内嵌对话）\u003C\u002Fh3>\n\u003Cp>\u003Ccode>packages\u002Fui\u002Fsrc\u002Fcomponents\u002Fworkspace\u002FWorkspaceView.vue\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>职责：workspace 主页面。\u003C\u002Fli>\n\u003Cli>左侧：文件树；中间：代码编辑器；右侧：嵌入 \u003Ccode>ChatPanel\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>从路由参数或 \u003Ccode>currentSessionId\u003C\u002Fcode> 解析当前 Session，无 Session 时自动创建。\u003C\u002Fli>\n\u003Cli>当 \u003Ccode>activeFilePath\u003C\u002Fcode> 变化时，调用 \u003Ccode>workspaceStore.syncActiveFileToSession()\u003C\u002Fcode> 把文件上下文回写 Session 层。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"2.4.-workspacetoolbar.vue%EF%BC%88workspace-%E5%B7%A5%E5%85%B7%E6%A0%8F%EF%BC%89\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#2.4.-workspacetoolbar.vue%EF%BC%88workspace-%E5%B7%A5%E5%85%B7%E6%A0%8F%EF%BC%89\">#\u003C\u002Fa> 2.4. WorkspaceToolbar.vue（workspace 工具栏）\u003C\u002Fh3>\n\u003Cp>\u003Ccode>packages\u002Fui\u002Fsrc\u002Fcomponents\u002Fworkspace\u002FWorkspaceToolbar.vue\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>新增 Session 下拉选择器：切换当前 Session 并路由到 \u003Ccode>\u002Fworkspace\u002F:sessionId\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>新增「切换回 chat」按钮：跳转到 \u003Ccode>\u002Fchat\u002F:currentSessionId\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>保留刷新、上传按钮。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"2.5.-sidebar.vue%EF%BC%88%E4%BE%A7%E8%BE%B9%E6%A0%8F%EF%BC%89\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#2.5.-sidebar.vue%EF%BC%88%E4%BE%A7%E8%BE%B9%E6%A0%8F%EF%BC%89\">#\u003C\u002Fa> 2.5. Sidebar.vue（侧边栏）\u003C\u002Fh3>\n\u003Cp>\u003Ccode>packages\u002Fui\u002Fsrc\u002Fcomponents\u002Fsidebar\u002FSidebar.vue\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>「New Chat」按钮：创建新 Session 并跳转 \u003Ccode>\u002Fchat\u002F:sessionId\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>Session 列表：点击后跳转 \u003Ccode>\u002Fchat\u002F:sessionId\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>「Workspace」按钮：跳转 \u003Ccode>\u002Fworkspace\u002F:currentSessionId\u003C\u002Fcode>；若无当前 Session，先创建。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"3.-chatpanel-%E5%B5%8C%E5%85%A5%E7%BB%86%E8%8A%82\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#3.-chatpanel-%E5%B5%8C%E5%85%A5%E7%BB%86%E8%8A%82\">#\u003C\u002Fa> 3. ChatPanel 嵌入细节\u003C\u002Fh2>\n\u003Ch3 id=\"3.1.-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%8A%BD%E5%8F%96-chatpanel\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#3.1.-%E4%B8%BA%E4%BB%80%E4%B9%88%E6%8A%BD%E5%8F%96-chatpanel\">#\u003C\u002Fa> 3.1. 为什么抽取 ChatPanel\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ccode>ChatView.vue\u003C\u002Fcode> 包含全屏标题栏和布局逻辑，不适合直接嵌入 workspace。\u003C\u002Fli>\n\u003Cli>\u003Ccode>ChatPanel.vue\u003C\u002Fcode> 只保留消息列表、输入框、SSEStream，占用空间小，可嵌入右侧面板。\u003C\u002Fli>\n\u003Cli>避免代码重复：ChatView 和 WorkspaceView 共用同一套消息流逻辑。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"3.2.-%E5%B5%8C%E5%85%A5%E5%B8%83%E5%B1%80\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#3.2.-%E5%B5%8C%E5%85%A5%E5%B8%83%E5%B1%80\">#\u003C\u002Fa> 3.2. 嵌入布局\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-vue\">&lt;!-- WorkspaceView.vue --&gt;\n&lt;div class=&quot;flex h-full&quot;&gt;\n  &lt;div class=&quot;w-60 shrink-0 border-r&quot;&gt;&lt;FileTreePanel \u002F&gt;&lt;\u002Fdiv&gt;\n  &lt;div class=&quot;flex-1 flex flex-col&quot;&gt;&lt;WorkspaceToolbar \u002F&gt;&lt;FileEditor \u002F&gt;&lt;\u002Fdiv&gt;\n  &lt;div class=&quot;w-96 border-l flex flex-col shrink-0&quot;&gt;\n    &lt;ChatPanel :session-id=&quot;sessionId&quot; \u002F&gt;\n  &lt;\u002Fdiv&gt;\n&lt;\u002Fdiv&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>当前右侧面板宽度固定为 \u003Ccode>w-96\u003C\u002Fcode>（384px）。后续可扩展为可拖拽调整宽度。\u003C\u002Fp>\n\u003Ch2 id=\"4.-chat-%E2%86%94-workspace-%E5%88%87%E6%8D%A2\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#4.-chat-%E2%86%94-workspace-%E5%88%87%E6%8D%A2\">#\u003C\u002Fa> 4. Chat ↔ Workspace 切换\u003C\u002Fh2>\n\u003Ch3 id=\"4.1.-%E5%90%8C%E4%B8%80-session-%E5%88%87%E6%8D%A2\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#4.1.-%E5%90%8C%E4%B8%80-session-%E5%88%87%E6%8D%A2\">#\u003C\u002Fa> 4.1. 同一 Session 切换\u003C\u002Fh3>\n\u003Cp>所有切换入口都基于 \u003Ccode>sessionStore.currentSessionId\u003C\u002Fcode>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>从 chat 切换到 workspace：点击 Sidebar 的 Workspace 按钮或 WorkspaceToolbar 的返回按钮。\u003C\u002Fli>\n\u003Cli>从 workspace 切换回 chat：点击 WorkspaceToolbar 的「当前 Session 标题」按钮。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"4.2.-%E7%8A%B6%E6%80%81%E5%90%8C%E6%AD%A5%E4%BF%9D%E8%AF%81\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#4.2.-%E7%8A%B6%E6%80%81%E5%90%8C%E6%AD%A5%E4%BF%9D%E8%AF%81\">#\u003C\u002Fa> 4.2. 状态同步保证\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Session 元数据：\u003Ccode>currentSessionId\u003C\u002Fcode>、\u003Ccode>title\u003C\u002Fcode>、\u003Ccode>context\u003C\u002Fcode> 由 \u003Ccode>useSessionStore\u003C\u002Fcode> 统一维护。\u003C\u002Fli>\n\u003Cli>消息历史：\u003Ccode>ChatPanel\u003C\u002Fcode> 始终通过 \u003Ccode>chatStore.getMessages(sessionId)\u003C\u002Fcode> 读取，跨视图一致。\u003C\u002Fli>\n\u003Cli>附件：\u003Ccode>sessionStore.currentSessionAttachments\u003C\u002Fcode> 在两个视图中共享。\u003C\u002Fli>\n\u003Cli>文件上下文：\u003Ccode>workspaceStore.syncActiveFileToSession()\u003C\u002Fcode> 把 workspace 状态写回 Session 层，chat 中可读取。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"5.-%E8%A7%86%E5%9B%BE%E5%B1%82%E6%95%B0%E6%8D%AE%E6%B5%81\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#5.-%E8%A7%86%E5%9B%BE%E5%B1%82%E6%95%B0%E6%8D%AE%E6%B5%81\">#\u003C\u002Fa> 5. 视图层数据流\u003C\u002Fh2>\n\u003Cdiv data-component=\"Mermaid\" data-code=\"%25%25%7Binit%3A%20%7B'theme'%3A%20'neutral'%7D%7D%25%25%0AsequenceDiagram%0A%20%20participant%20User%0A%20%20participant%20Router%0A%20%20participant%20ChatView%0A%20%20participant%20WorkspaceView%0A%20%20participant%20ChatPanel%0A%20%20participant%20SessionStore%20as%20useSessionStore%0A%20%20participant%20ChatStore%20as%20useChatStore%0A%0A%20%20User-%3E%3ERouter%3A%20%2Fchat%2F%3Aid%0A%20%20Router-%3E%3EChatView%3A%20render%0A%20%20ChatView-%3E%3ESessionStore%3A%20selectSession(id)%0A%20%20ChatView-%3E%3EChatPanel%3A%20%3AsessionId%3D%22id%22%0A%20%20ChatPanel-%3E%3EChatStore%3A%20getMessages(id)%0A%0A%20%20User-%3E%3ERouter%3A%20%2Fworkspace%2F%3Aid%0A%20%20Router-%3E%3EWorkspaceView%3A%20render%0A%20%20WorkspaceView-%3E%3ESessionStore%3A%20selectSession(id)%0A%20%20WorkspaceView-%3E%3EChatPanel%3A%20%3AsessionId%3D%22id%22%0A%20%20ChatPanel-%3E%3EChatStore%3A%20getMessages(id)%0A\">\u003C\u002Fdiv>\u003Ch2 id=\"6.-%E5%BC%80%E5%8F%91%E7%BA%A6%E5%AE%9A\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#6.-%E5%BC%80%E5%8F%91%E7%BA%A6%E5%AE%9A\">#\u003C\u002Fa> 6. 开发约定\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>新增视图组件时，优先从 \u003Ccode>useSessionStore\u003C\u002Fcode> 读取 Session 元数据，不要直接操作 \u003Ccode>useChatStore\u003C\u002Fcode> 的 Session 相关状态。\u003C\u002Fli>\n\u003Cli>\u003Ccode>ChatPanel\u003C\u002Fcode> 是唯一的内嵌对话组件，不要直接在其他地方嵌入 \u003Ccode>ChatView\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli>附件写入入口统一在 \u003Ccode>ChatPanel.handleSend\u003C\u002Fcode>；workspace 对附件只读。\u003C\u002Fli>\n\u003Cli>文件上下文写入入口统一在 \u003Ccode>useWorkspaceStore.syncActiveFileToSession\u003C\u002Fcode>。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"7.-%E5%90%8E%E7%BB%AD%E5%8F%AF%E6%89%A9%E5%B1%95%E7%82%B9\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#7.-%E5%90%8E%E7%BB%AD%E5%8F%AF%E6%89%A9%E5%B1%95%E7%82%B9\">#\u003C\u002Fa> 7. 后续可扩展点\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>扩展\u003C\u002Fth>\n\u003Cth>说明\u003C\u002Fth>\n\u003Cth>承接\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>右侧面板可拖拽宽度\u003C\u002Ftd>\n\u003Ctd>提升 workspace 布局灵活性\u003C\u002Ftd>\n\u003Ctd>后续 UI 改进\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>统一路由 \u003Ccode>\u002Fsession\u002F:id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>长期评估，当前保持双路由\u003C\u002Ftd>\n\u003Ctd>未来 PLAN\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>workspace 文件拖拽到 chat\u003C\u002Ftd>\n\u003Ctd>需要附件后端支持\u003C\u002Ftd>\n\u003Ctd>PLAN-031\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>多 Session 并列\u003C\u002Ftd>\n\u003Ctd>同时打开多个 workspace\u002Fchat\u003C\u002Ftd>\n\u003Ctd>未来设计\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"8.-%E5%8F%82%E8%80%83\" tabindex=\"-1\">\u003Ca class=\"header-anchor\" href=\"#8.-%E5%8F%82%E8%80%83\">#\u003C\u002Fa> 8. 参考\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"http:\u002F\u002FRFC-001-session-domain-model.md\">RFC-001-session-domain-model.md\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"http:\u002F\u002FADR-001-session-store-boundary.md\">ADR-001-session-store-boundary.md\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>PLAN-029-XH-unified-session-architecture\u003C\u002Fli>\n\u003C\u002Ful>\n",1786290226271]