文件最后提交记录最后更新时间
✨ feat(review-panel): group review changes by submodule (#15148) * 🐛 fix(claude-code): show task subject in TaskUpdate inspector & header A TaskUpdate that only sets `subject` (no status flip) was falling through to the aggregate `Todos: x/y` chip and burying the per-call signal. Surface the new subject like the status branch already does: "Task updated: <subject>". Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ✨ feat(review-panel): group changes by submodule with per-group collapse Surface dirty submodules as their own groups in the agent Review panel so users working in a parent repo with submodules see each repo's changes clustered together (mirrors WebStorm's per-repo commit grouping). Both Unstaged and Branch modes apply the same grouping — submodules with internal working-tree changes (unstaged) or branch diffs against their own origin/HEAD (branch) surface as separate groups, each tagged with its own branch label and file/diff totals. Backend (`GitCtr`): - `getGitWorkingTreePatches` and `getGitBranchDiff` extracted into private recursive helpers that detect submodules via `git submodule status`, partition pointer-bump entries out of the parent's flat patches, and recurse one level for each dirty submodule's own patches + branch info. - Nested submodules are not traversed (phase 1); revert routes through each group's absolute path so submodule files revert inside the submodule. Renderer: - New `GroupHeader` and `FileRow` subcomponents split out of `Review`. `GroupHeader` is sticky with a chevron + name + file count + diff totals + branch; clicking collapses the group's rows. A hover-revealed `ActionIcon` on the right expands/collapses all file diffs in that group (`e.stopPropagation` keeps it from also collapsing the surrounding header). - Fixed `block-size: 32px` on the header so toggling the fold button on/off doesn't jitter the sticky height. - Single-repo working trees keep the previous flat layout when no submodule groups exist. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ✨ feat(review-panel): scan all submodules in branch mode Previously branch mode only surfaced a submodule group when the parent's diff against base ref contained a `Subproject commit` pointer bump for it. This missed the common case where the user has committed work in a submodule on a feature branch but the parent's pointer hasn't yet moved relative to its base — the submodule's own branch differences stayed invisible in the Review panel. `collectBranchDiff` now recurses into every registered submodule (single level, in parallel) and keeps a group when EITHER its pointer differs in the parent OR its own branch diverges from its own origin/HEAD. Clean-on- both-axes submodules are dropped so the panel stays quiet for repos where the submodule isn't actively being worked on. Submodule count is small in practice (single digits), so the extra per-submodule fetch + diff in parallel is an acceptable cost. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ✨ feat(agent-documents): hide .tool-results archive from user-facing lists Auto-created tool-result archive folder and its children are now filtered out of getAgentDocuments. Agents still discover them via the tool-oriented listDocuments paths. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 style(review-panel): drop "file not found in project index" toast Reveal-in-tree now silently no-ops when the path isn't indexed (e.g. submodule files) instead of nagging the user with a warning toast. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * 🐛 fix(review-panel): keep submodule groups visible on pointer-only bumps `isEmpty` was derived solely from `totalEntryCount`, which counts file patches across groups. A pointer-only submodule bump (parent patch filtered out, submodule group present but internally clean) produced `totalEntryCount === 0`, so the panel rendered the global empty state and silently skipped the submoduleClean group rendering — even though git was dirty. Now `isEmpty` also requires zero submodule groups, so pointer-only bumps keep their GroupHeader + "submodule clean" line. The fold-all button visibility switches to `totalEntryCount > 0` so it stays hidden when there's nothing foldable. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>13 小时前
✨ feat(cc): render Linear MCP tool calls with branded inspector (#14864) * ✨ feat(cc): render Linear MCP tool calls with branded inspector CC emits Linear MCP tools as `mcp__claude_ai_Linear__<verb>_<noun>` — the default inspector and the collapsed summary surface those raw names, which read as `Mcp__claude_ai_ Linear__get_issue` after title-casing. Adds a generic Linear MCP inspector that: - Shows the monochrome Linear logomark + "Linear" product prefix - Renders the action as a single pill split into action / value halves (e.g. `Get issue | id: LOBE-8743`) - Detects `parentId` and surfaces it with a CornerLeftUp icon, either in the chip's value half (when parent is the primary arg) or as a secondary badge after the chip (mirrors the parent visual used by AgentTask UI) - Hard-caps chip text at 60 chars so long comment bodies / search queries don't push the row off-screen Also humanizes the collapsed-workflow summary via a `formatLinearMcpShortLabel` helper exported from `@lobechat/builtin-tool-claude-code/client`, so the bundle row reads "Linear · Get issue" instead of the raw tool name. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ✨ feat(cc): render WebSearch and WebFetch tool calls with custom inspector CC's web tools were falling through to the generic tool UI because `ClaudeCodeApiName` and the render/inspector registries hadn't been extended. Adds dedicated inspector (query/url chip) and result card (text for search, markdown for fetched pages) for both. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 🐛 fix(cc): isolate Linear MCP label helper to avoid antd-style mock break `Group.test.tsx` mocks `antd-style` with only `createStaticStyles`. The previous wiring imported `formatLinearMcpShortLabel` through the `@lobechat/builtin-tool-claude-code/client` barrel, which transitively loads `LinearMcp.tsx` → `@lobechat/shared-tool-ui/styles` → `keyframes`, crashing the mock. Splits the pure label utilities (LINEAR_MCP_PREFIX, parseToolName, staticLabelFor, formatLinearMcpShortLabel, LINEAR_MCP_TOOL_NAMES) into `linearMcpLabels.ts` with no React/antd-style imports, exposes it as `@lobechat/builtin-tool-claude-code/client/labels`, and switches the consumer in `toolDisplayNames.ts` to that subpath. The inspector component keeps importing the same helpers locally. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * 💄 ui(hetero): land manual workflow expand at full level Heterogeneous agent workflows often run 40+ tool calls. When the user collapsed the workflow and clicked the header to re-expand, it landed at the height-capped `semi` state and hid most of the chain. Now we infer a "fully expanded experience" from `defaultWorkflowExpandLevel` — any phase opting into `full` routes the manual expand straight to `full` instead of the legacy `semi` cap. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>7 天前