**Layout refactor (Phase 1):** - UnifiedTopBar replacing Header.tsx — chat title editing, project folder, commit/push split button, Git branch+dirty badge, terminal/file-tree toggles - PanelZone renders FileTree, GitPanel, PreviewPanel side-by-side on the right - Independent panel toggle states in PanelContext - ResizeHandle unified across all panels - Removed old RightPanel, Header, DocPreview components **Git backend (Phase 2):** - src/lib/git/service.ts — execFile-based Git operations with timeout + injection safety - API routes: status, branches, checkout, log, commit, push, commit-detail, worktrees, derive - Worktree derive creates DB session inheriting source session settings **Git frontend (Phase 3):** - GitPanel with 4 collapsible sections: Status, Branches, History, Worktrees - CommitDialog with commit vs commit-and-push modes - GitBranchSelector with inline error, worktree-occupied branches disabled - GitWorktreeSection with switch-to/derive actions, current/dirty indicators - useGitStatus polled in AppShell, derived into context (no redundant setState) **Terminal (Phase 4):** - electron/terminal-manager.ts — child_process.spawn fallback (PTY upgrade documented) - IPC handlers + TerminalDrawer/TerminalInstance components **Polish (Phase 5):** - Push inline feedback with 4s auto-dismiss - Branch detection fix, commit diff exit-code handling - Removed redundant git state: currentBranch/gitDirtyCount now derived, not setState - useTerminal isElectron uses lazy initializer instead of effect - i18n keys (en + zh), user tutorial docs, handover document Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1.5 KiB
1.5 KiB
QQ Bridge Channel Integration
Status: IN PROGRESS
Scope
Add QQ as a new bridge channel. First version: private chat text + image inbound only. No group/channel, no Markdown, no active messages, no stream preview.
Implementation Steps
Phase 1: Foundation
types.ts: Addqq: 2000to PLATFORM_LIMITSqq-api.ts: QQ HTTP/WS protocol helpers (token, gateway, heartbeat, send)qq-adapter.ts: Full adapter (lifecycle, WS, event parsing, auth, image download)adapters/index.ts: Registerimport './qq-adapter'
Phase 2: Settings & API
src/app/api/settings/qq/route.ts: GET/PUT QQ settingssrc/app/api/settings/qq/verify/route.ts: Verify token + gatewaysrc/app/api/bridge/settings/route.ts: Add QQ keys
Phase 3: UI
QqBridgeSection.tsx: Settings UI componentBridgeLayout.tsx: Add QQ sidebar itemBridgeSection.tsx: Add QQ channel togglei18n/en.ts+i18n/zh.ts: QQ translations
Phase 4: replyToMessageId Threading
bridge-manager.ts: Threadmsg.messageIdthrough all reply paths (deliver, deliverResponse, command replies, error replies, permission broker)
Key Decisions
- No
getPreviewCapabilities()— QQ passive reply window is tight - No
channel_offsets— WS-based, not polling - Permission: text
/permfallback only, no buttons msg_seqgeneration in qq-api.ts (auto-increment per reply)- Image: download attachments, convert to FileAttachment, 20MB limit