文件最后提交记录最后更新时间
🐛 fix(desktop): focus onboarding auth success state (#14694)11 天前
✨ 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 小时前
💄 style(settings): clean up settings page copy and entries (#15117)1 天前
✨ feat(desktop): screen capture overlay, Quick Chat tray, and upload pipeline improvements (#13818) * feat: add screen capture functionality with overlay support - Implemented ScreenCaptureManager to handle screen capture sessions. - Added ScreenCaptureCtr for IPC methods related to screen capture. - Created overlay.html and ScreenCaptureOverlay component for user interaction. - Integrated window enumeration and capture logic using node-screenshots and get-windows. - Updated menu options to include screen capture actions. - Enhanced RendererUrlManager to support overlay routing. - Introduced drag selection for capturing specific screen areas. - Added necessary types and events for screen capture in electron-client-ipc. Signed-off-by: Innei <tukon479@gmail.com> * ✨ feat(desktop): refine screen capture overlay flow * ✨ feat(desktop): refine screen capture overlay flow * ⚡ feat(desktop): optimize screen capture overlay flow * Delete apps/desktop/mockup/screen-capture-overlay.html * ✨ feat(desktop): open mini toolbar via double Option * 🐛 fix(desktop): separate quick composer hotkey * 💄 fix(desktop): remove stale quick composer accelerator * 🐛 fix(desktop): stabilize double option monitor * 🐛 fix(desktop): read hardware option key state * 🐛 fix(desktop): standardize path imports and improve error handling - Replaced `join` imports with `path` imports for consistency across files. - Enhanced error handling in various modules to include error causes for better debugging. - Updated test files to reflect changes in variable naming and mock implementations. Signed-off-by: Innei <tukon479@gmail.com> * 🔥 chore(hotkey): drop orphan renderer quickComposer i18n entries The `quickComposer` hotkey is registered only on the Electron side (DESKTOP_GLOBAL_SHORTCUT_DEFAULTS + BrowserWindowsCtr.openQuickComposer); the renderer never referenced these i18n keys, so the entries were dead. `desktop.quickComposer` covers the app-level trigger. * ⚡️ perf(screen-capture): parallelize overlay upload with route navigation Overlay submit used to await screenshot upload before router.push, blocking the main window for several seconds when the user was on an unrelated page (e.g. /settings). Now we navigate immediately and run upload in a background IIFE; MessageFromUrl waits on a new `uploadStatus` field before calling sendMessage, so the chat page mount and the upload proceed in parallel. - Add `uploadStatus: 'uploading' | 'ready' | 'failed'` to PendingOverlayDispatch; canConsumePendingOverlayDispatch blocks while `'uploading'`. - Store gains `markDispatchUploadComplete`; on failure it clears screenshotFileNames so the prompt still delivers. - Dispatcher drops stale prev search params on push to prevent MessageFromUrl's message-param effect from double-firing. * ⚡️ perf(screen-capture): pre-upload captures in overlay preview + per-thumbnail status Move uploads from post-submit to preview time, bypassing dataUrl round-trips: - Main process assigns captureId at preview time and ships the PNG bytes as ArrayBuffer to the main renderer via `overlayUploadRequest`. - Main renderer uploads through a dedicated pool (uploadWithProgress, no chatUploadFileList pollution); reports status back to the overlay through `overlayCaptureUploadStatus`. - Overlay thumbnails render a spinner / error badge based on status; the send button stays grey until every capture resolves to `ready`. - Submit now carries only captureIds; MessageFromUrl awaits the pool promises before sendMessage, removing the second upload pass. - Carry overlay-selected modelId/provider into the agent config so the first message actually uses the user-chosen model (fixes the bug where switching the model on the overlay had no effect). * update * ✨ feat(popup): add Quick Chat tray entry backed by Inbox agent Tray menu now exposes a "Quick Chat" action that opens (or focuses) a single-instance popup window at `/popup/agent/inbox`. Each fresh open starts with no active topic; the first message creates one through the normal agent flow. - New `PopupAgentQuickPage` resolves the inbox slug via `builtinAgentSelectors.inboxAgentId` so `activeAgentId` points at the real entity in `agentMap` (fixes the stuck-loading / skeleton state from using the literal `'inbox'` slug). - `BrowserManager.openQuickChatPopup` wraps `createMultiInstanceWindow` with a fixed `topicPopup_quick_inbox` uniqueId so repeat clicks focus rather than spawn. - Wire the action into macOS / Windows / Linux tray menus and add the `tray.quickChat` i18n key. * Add quick chat shortcut and desktop hotkey support * ✨ feat(screen-capture): enhance window enumeration with scale factor support - Updated `enumerateWindows` to accept an optional `displayScaleFactor` parameter for improved window geometry normalization on high-DPI displays. - Refactored `normalizeWindowBounds` to handle scaling based on the provided scale factor, ensuring accurate window dimensions across different platforms. - Adjusted tests in `WindowSourceService.test.ts` to validate the new scaling behavior for both Windows and macOS environments. - Minor adjustments in `ScreenCaptureManager` to accommodate the updated window enumeration logic. --------- Signed-off-by: Innei <tukon479@gmail.com>1 个月前
✨ feat(analytics): track onboarding step events (#15133)1 天前
♻️ refactor(desktop): unify TabBar registration into a cross-platform route-meta layer (#14995) * ♻️ refactor(desktop): unify TabBar registration into a cross-platform route-meta layer Replace the desktop TabBar plugin registry with route-co-located metadata. Previously four parallel registries (the RecentlyViewed plugin registry, routeMetadata.ts, getRouteById icons, and the router config) had to be kept in sync by hand; forgetting to register a page made its tab silently break. Now every route declares its metadata once via `handle.meta`: - New `routeMeta.ts` declaration types + a cross-platform `<RouteMetaBridge>` that resolves the active route's meta and drives `document.title`. - Tab identity moves from semantic ids to normalized URLs (`TabItem`). - Background-tab titles fall back through a guarded snapshot so cold-start store-data gaps never blank or clobber a tab. - Deletes the 11 plugins, the registry, usePluginContext, routeMetadata.ts and cachedData.ts; `<PageTitle>` is removed from the (main) route tree. * ✨ feat(desktop): define route-meta title for task workspace routes * ♻️ refactor(settings): create settingsRouteMeta for dynamic tab titles in settings Signed-off-by: Innei <tukon479@gmail.com> * ♻️ refactor(RouteMetaBridge): enhance dynamic route meta handling and state management Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix: scope route meta to tab url * ♻️ refactor(PopupLayout): remove unused RouteMetaBridge component Signed-off-by: Innei <tukon479@gmail.com> * ♻️ refactor(route-meta): centralize web title updates --------- Signed-off-by: Innei <tukon479@gmail.com>3 天前