Prechádzať zdrojové kódy

refactor(codex): 聊天页不再展示工作空间路径

按用户要求,聊天页所有位置不再展示工作空间路径:删除工具栏的工作目录状态块(含复制按钮)、空态的工作目录卡片、产物栏面包屑的绝对路径悬浮提示、建会话提示里的路径、输入区的工作目录提示分支;顺带移除无人使用的 activeCwdSource。工作目录仍由代码决定(会话 cwd → 案件工作空间 → 客户端默认),只是不再渲染到界面。

验证:pnpm type:check 89 条基线 / 本包 0 报错;pnpm build exit=0。
cc 2 týždňov pred
rodič
commit
be3bf755d1

+ 14 - 0
.workbuddy/memory/2026-09-24.md

@@ -228,3 +228,17 @@ markdown/代码块的关键词高亮透传、工具栏两个按钮,删除 4 
   产出 `codexAnalysis-*.{js,css}`。
 - **未推送**:用户本轮只说「合并」,没说推送;`origin/dev_3` 停在 `4bf2ad0`,落后 4 个提交。
   上游跟踪已建好(`dev_3...origin/dev_3`),要推就是一句 `git push`。
+
+## 聊天页不再展示工作空间路径
+
+用户要求「聊天页面上所有地方都不展示工作空间路径」。清理了 5 处:
+- 工具栏:整块「工作目录」状态(路径 + 复制按钮)删除,含 `cwd` 计算属性、`onCopyCwd`、`__path/__icon` 样式;
+- 空态:整个工作目录卡片(来源徽标 + 路径 + 提示)删除,连同 `cwdSource/cwdSourceLabel/caseName`;
+- 产物栏:面包屑的 `:title="root"` 悬浮提示去掉(悬停会露出绝对路径);
+- 侧栏:建会话成功提示 `已创建会话(路径)` → `已创建会话`;
+- 输入区:提示语去掉「未设置工作目录」分支。
+
+保留(非展示):store 的 `activeCwd` 仍作为 threadStart/报告导出元数据使用;
+composer 的 `cwd` prop 仅用于「切会话清空草稿」的 watch,不渲染。
+顺带删了无人使用的 `activeCwdSource` getter。
+验证:`pnpm type:check` 89 基线 / 本包 0 报错;`pnpm build` exit=0。

+ 1 - 1
ai-electron/frontend/src/codex/components/codexArtifactPanel.vue

@@ -23,7 +23,7 @@
     </div>
 
     <!-- 面包屑:只在进到子目录后出现 -->
-    <div v-if="root" class="codex-artifact__crumb" :title="root">
+    <div v-if="root" class="codex-artifact__crumb">
       <button v-if="relative" class="codex-btn" type="button" @click="onUp">
         <Icon icon="mdi:arrow-up" :size="13" />
         上一级

+ 0 - 23
ai-electron/frontend/src/codex/components/codexChatToolbar.vue

@@ -14,13 +14,6 @@
       <span v-if="version" class="codex-topbar__meta">v{{ version }}</span>
     </div>
 
-    <!-- 工作目录 -->
-    <div v-if="cwd" class="codex-topbar__status" :title="cwd">
-      <Icon icon="mdi:folder-outline" :size="14" class="codex-topbar__icon" />
-      <span class="codex-topbar__meta codex-topbar__path">{{ cwd }}</span>
-      <button class="codex-btn" type="button" @click="onCopyCwd">复制</button>
-    </div>
-
     <div class="codex-topbar__actions">
       <span v-if="runBadge" class="codex-badge" :class="runBadge.tone" :title="runBadge.title">
         {{ runBadge.text }}
@@ -79,7 +72,6 @@
   import { useMessage } from '@/core/hooks/web/useMessage';
   import { useCodexChatStore } from '../store/codexChatStore';
   import type { CodexReportFormat } from '../types/codexTypes';
-  import { copyCodexText } from '../utils/codexFormat';
 
   const emit = defineEmits<{
     (e: 'create'): void;
@@ -97,7 +89,6 @@
   const busy = ref(false);
 
   const sessionTitle = computed(() => store.activeSession?.title || '');
-  const cwd = computed(() => store.activeCwd);
   const version = computed(() => store.runtime?.version || '');
   const hasMessages = computed(() => store.hasMessages);
   const runningCount = computed(() => store.runningCount);
@@ -181,11 +172,6 @@
     }
   }
 
-  async function onCopyCwd() {
-    const ok = await copyCodexText(cwd.value);
-    showMessage(ok ? '已复制工作目录' : '复制失败', ok ? 'success' : 'warning');
-  }
-
   function onExportClick(info: { key: string | number }) {
     emit('export', String(info.key) as CodexReportFormat);
   }
@@ -198,14 +184,5 @@
       color: var(--codex-text-2);
     }
 
-    &__path {
-      display: inline-block;
-      max-width: 220px;
-      overflow: hidden;
-      white-space: nowrap;
-      text-overflow: ellipsis;
-      direction: rtl;
-      text-align: left;
-    }
   }
 </style>

+ 1 - 1
ai-electron/frontend/src/codex/components/codexComposer.vue

@@ -30,7 +30,7 @@
           />
 
           <span class="codex-composer__hint">
-            Enter 发送 · Shift + Enter 换行{{ cwd ? '' : ' · 未设置工作目录' }}
+            Enter 发送 · Shift + Enter 换行
           </span>
 
           <span class="codex-composer__spacer"></span>

+ 1 - 1
ai-electron/frontend/src/codex/components/codexSessionSidebar.vue

@@ -125,7 +125,7 @@
     try {
       const meta = await store.createSession();
       emit('create');
-      showMessage(`已创建会话(${meta.cwd})`, 'success');
+      showMessage('已创建会话', 'success');
     } catch (error: any) {
       showMessage(error?.message || '创建会话失败', 'error');
     } finally {

+ 0 - 6
ai-electron/frontend/src/codex/store/codexChatStore.ts

@@ -260,12 +260,6 @@ export const useCodexChatStore = defineStore('codex-chat', {
       if (session?.cwd) return session.cwd;
       return state.caseWorkspace || state.defaultCwd;
     },
-    /** 当前工作目录的来源(UI 只读展示,让用户知道「为什么会用这个目录」) */
-    activeCwdSource(state): 'session' | 'case' | 'default' {
-      const session = state.sessions.find((item) => item.threadId === state.activeThreadId);
-      if (session?.cwd) return 'session';
-      return state.caseWorkspace ? 'case' : 'default';
-    },
     /** 最新一轮回合的文件变更(产物栏「本轮变更」用) */
     artifactChanges(state): CodexArtifactChange[] {
       const threadId = state.activeThreadId;

+ 1 - 90
ai-electron/frontend/src/codex/views/codexAnalysis/codexAnalysis.vue

@@ -48,21 +48,6 @@
                   </a-button>
                 </div>
 
-                <!-- 工作目录:**由代码决定**(案件工作空间 / 客户端默认目录),界面只读展示,不可修改 -->
-                <div class="codex-workspace">
-                  <div class="codex-workspace__head">
-                    <Icon icon="mdi:folder-outline" :size="14" />
-                    <span>工作目录</span>
-                    <span class="codex-workspace__source" :class="`is-${cwdSource}`">{{ cwdSourceLabel }}</span>
-                  </div>
-                  <div class="codex-workspace__path" :title="store.activeCwd || '未设置'">
-                    {{ store.activeCwd || '未设置(将使用客户端默认目录)' }}
-                  </div>
-                  <span class="codex-workspace__tip">
-                    目录由当前案件的工作空间自动决定,无需手动选择;新建会话后生效。
-                  </span>
-                </div>
-
                 <ol class="codex-empty__list">
                   <li v-for="(item, idx) in EXAMPLES" :key="item" class="codex-empty__item">
                     <span class="codex-empty__index">{{ idx + 1 }}</span>
@@ -171,20 +156,7 @@
   const composerDisabled = computed(() => !store.bridgeAvailable || !store.ready);
 
   const reportTitle = computed(() => store.activeSession?.title || 'Codex 会话');
-  const caseName = computed(() => String(userStore.getCaseInfo?.name || ''));
-
-  /** 当前工作目录来源:让用户一眼看出「为什么用的是这个目录」 */
-  const cwdSource = computed(() => store.activeCwdSource);
-  const cwdSourceLabel = computed(() => {
-    switch (cwdSource.value) {
-      case 'session':
-        return '当前会话';
-      case 'case':
-        return caseName.value ? `案件工作空间 · ${caseName.value}` : '案件工作空间';
-      default:
-        return '客户端默认';
-    }
-  });
+
 
   const gateHint = computed(() => {
     if (store.runtimeError) return store.runtimeError;
@@ -369,65 +341,4 @@
     }
   }
 
-  /* 工作目录卡片 */
-  .codex-workspace {
-    display: flex;
-    align-items: center;
-    flex-wrap: wrap;
-    gap: var(--codex-sp-2);
-    margin: 0 0 var(--codex-sp-4);
-    padding: var(--codex-sp-1) var(--codex-sp-3);
-    background: var(--codex-bg-subtle);
-    border: 1px solid var(--codex-border);
-    border-radius: var(--codex-radius);
-
-    &__head {
-      display: flex;
-      align-items: center;
-      gap: 6px;
-      flex: 0 0 auto;
-      font-size: 12px;
-      font-weight: 600;
-      color: var(--codex-text-2);
-    }
-
-    /* 目录来源徽标:案件工作空间 / 手动指定 / 客户端默认 */
-    &__source {
-      padding: 0 6px;
-      font-size: 10.5px;
-      font-weight: 400;
-      line-height: 16px;
-      color: var(--codex-text-2);
-      background: var(--codex-bg-hover);
-      border-radius: 8px;
-
-      &.is-case {
-        color: var(--codex-primary);
-        background: var(--codex-primary-soft);
-      }
-
-      &.is-default {
-        color: var(--codex-warning);
-        background: fade(@warning-color, 12%);
-      }
-    }
-
-    &__path {
-      flex: 1 1 200px;
-      min-width: 0;
-      overflow: hidden;
-      font-size: 12px;
-      color: var(--codex-text);
-      white-space: nowrap;
-      text-overflow: ellipsis;
-      direction: rtl;
-      text-align: left;
-    }
-
-    &__tip {
-      flex: 0 0 auto;
-      font-size: 11px;
-      color: var(--codex-text-3);
-    }
-  }
 </style>