Co-authored-by: paisley <8197966+su8su@users.noreply.github.com> Co-authored-by: zuolingxuan <zuolingxuan@bytedance.com>
8.9 KiB
8.9 KiB
Refactor Summary
Scope
This branch captures local refactors focused on frontend UX polish, IPC call consolidation, transport abstraction, and channel page responsiveness.
Key Changes
1. Frontend IPC consolidation
- Replaced scattered direct
window.electron.ipcRenderer.invoke(...)calls with unifiedinvokeIpc(...)usage. - Added lint guard to prevent new direct renderer IPC invokes outside the API layer.
- Introduced a centralized API client with:
- error normalization (
AppError) - unified
app:requestsupport + compatibility fallback - retry helper for timeout/network errors
- error normalization (
2. Transport abstraction (extensible protocol layer)
- Added transport routing abstraction inside
src/lib/api-client.ts:ipc,ws,http- rule-based channel routing
- transport registration/unregistration
- failure backoff and fallback behavior
- Added default transport initialization in app entry.
- Added gateway-specific transport adapters for WS/HTTP.
3. HTTP path moved to Electron main-process proxy
- Added
gateway:httpProxyIPC handler in main process to avoid renderer-side CORS issues. - Preload allowlist updated for
gateway:httpProxy. - Gateway HTTP transport now uses IPC proxy instead of browser
fetchdirect-to-gateway.
4. Settings improvements (Developer-focused transport control)
- Added persisted setting
gatewayTransportPreference. - Added runtime application of transport preference in app bootstrap.
- Added UI option (Developer section) to choose routing strategy:
- WS First / HTTP First / WS Only / HTTP Only / IPC Only
- Added i18n strings for EN/ZH/JA.
5. Channel page performance optimization
fetchChannelsnow supports options:probe(manual refresh can force probe)silent(background refresh without full-page loading lock)
- Channel status event refresh now debounced (300ms) to reduce refresh storms.
- Initial loading spinner only shown when no existing data.
- Manual refresh uses local spinner state and non-blocking update.
6. UX and component enhancements
- Added shared feedback state component for consistent empty/loading/error states.
- Added telemetry helpers and quick-action/dashboard refinements.
- Setup/settings/providers/chat/skills/cron pages received targeted UX and reliability fixes.
7. IPC main handler compatibility improvements
- Expanded
app:requestcoverage for provider/update/settings/cron/usage actions. - Unsupported app requests now return structured error response instead of throwing, reducing noisy handler exceptions.
8. Tests
- Added unit tests for API client behavior and feedback state rendering.
- Added transport fallback/backoff coverage in API client tests.
Files Added
src/lib/api-client.tssrc/lib/telemetry.tssrc/components/common/FeedbackState.tsxtests/unit/api-client.test.tstests/unit/feedback-state.test.tsxrefactor.md
Notes
- Navigation order in sidebar is kept aligned with
mainordering. - This commit snapshots current local refactor state for follow-up cleanup/cherry-pick work.
Incremental Updates (2026-03-08)
9. Channel i18n fixes
- Added missing
channelslocale keys in EN/ZH/JA to prevent raw key fallback:configured,configuredDesc,configuredBadge,deleteConfirm
- Fixed confirm dialog namespace usage on Channels page:
common:actions.confirm,common:actions.delete,common:actions.cancel
10. Channel save/delete behavior aligned to reload-first strategy
- Added Gateway reload capability in
GatewayManager:reload()(SIGUSR1 on macOS/Linux, restart fallback on failure/unsupported platforms)debouncedReload()for coalesced config-change reloads
- Wired channel config operations to reload pipeline:
channel:saveConfigchannel:deleteConfigchannel:setEnabled
- Removed redundant renderer-side forced restart call after WhatsApp configuration.
11. OpenClaw config compatibility for graceful reload
- Ensured
commands.restart = trueis persisted in OpenClaw config write paths:electron/utils/channel-config.tselectron/utils/openclaw-auth.ts
- Added sanitize fallback that auto-enables
commands.restartbefore Gateway start.
12. Channels page data consistency fixes
- Unified configured state derivation so the following sections share one source:
- stats cards
- configured channels list
- available channel configured badge
- Fixed post-delete refresh by explicitly refetching both:
- configured channel types
- channel status list
13. Channels UX resilience during Gateway restart/reconnect
- Added delayed gateway warning display to reduce transient false alarms.
- Added "running snapshot" rendering strategy:
- keep previous channels/configured view during
starting/reconnectingwhen live response is temporarily empty - avoids UI flashing to zero counts / empty configured state
- keep previous channels/configured view during
- Added automatic refresh once Gateway transitions back to
running.
14. Channel enable/disable UX rollback
- Rolled back renderer-side channel enable/disable controls due to multi-channel state mixing risk.
- Removed channel-card toggle entry point and setup-dialog enable switch.
- Restored stable channel configuration flow (save/delete + refresh consistency).
15. Cron i18n completion and consistency
- Replaced remaining hardcoded Cron UI strings with i18n keys:
- dialog actions (
Cancel,Saving...) - card actions (
Edit,Delete) - trigger failure message
- confirm dialog namespace usage (
common:actions.*)
- dialog actions (
- Refactored cron schedule display parser to return localized strings instead of hardcoded English.
- Added new locale keys in EN/ZH/JA:
toast.failedTriggerschedule.everySeconds/everyMinutes/everyHours/everyDays/onceAt/weeklyAt/monthlyAtDay/dailyAt/unknown
16. Gateway log noise reduction
- Added stderr classification downgrade for expected loopback websocket transient logs:
[ws] handshake timeout ... remote=127.0.0.1[ws] closed before connect ... remote=127.0.0.1
- These lines now log at debug level instead of warn during reload/reconnect windows.
17. External gateway shutdown compatibility
- Added capability cache for externally managed Gateway shutdown RPC.
- If
shutdownis unsupported (unknown method: shutdown), mark it unsupported and skip future shutdown RPC attempts to avoid repeated warnings.
18. Chat history sidebar grouping (ChatGPT-style buckets)
- Updated chat session history display in sidebar to time buckets:
- Today / Yesterday / Within 1 Week / Within 2 Weeks / Within 1 Month / Older than 1 Month
- Added
historyBucketslocale keys in EN/ZH/JA (chatnamespace). - Fixed i18n namespace usage for bucket labels in sidebar:
- explicitly resolves via
chat:historyBuckets.*to avoid raw key fallback.
- explicitly resolves via
- Removed forced uppercase rendering for bucket headers to preserve localized casing.
- Grouping now applies to all sessions (including
:main) for consistent bucket visibility and behavior.
19. refactor_clawx_1 × main merge outcome (main-first baseline)
- Performed a dedicated merge line with
origin/mainas the conflict-resolution baseline for high-risk files. - Resolved wide conflict surface in gateway/store/page layers by prioritizing compile-safe
mainimplementations, then selectively re-applying compatible refactor behavior. - Merge result focus:
- keep app runnable and type-safe first
- avoid partial hybrid states that mix incompatible host-api/ipc patterns in a single module
- retain low-risk UX/flow improvements only when behavior parity is clear
20. Post-merge compile recovery
- Fixed merge-induced breakages causing
tsc/build failures:- malformed blocks in settings/channels/chat/store files
- duplicated variable declarations in
electron/gateway/manager.ts - mismatched transport helper usage introduced by partial conflict picks
- Re-aligned broken modules to
origin/mainwhere necessary to restore a stable build baseline. - Current status after cleanup:
pnpm run typecheckpasses- app-side Vite/Electron compile succeeds; packaging step may still fail under restricted proxy/network environments (non-code issue)
21. IPC event compatibility fix after merge
- Fixed runtime error
Invalid IPC channel: gateway:channel-statusby restoring preload allowlist compatibility with renderer subscriptions. - Reconciled
electron/preload/index.tsevent channel whitelist with active gateway event usage:gateway:status-changedgateway:messagegateway:notificationgateway:channel-statusgateway:chat-messagegateway:exitgateway:error
22. Transport strategy consolidation (no user toggle)
- Removed manual transport selection UI from Settings/Developer to reduce operator complexity and avoid invalid combinations.
- Kept transport abstraction in code, but locked runtime policy to a single fixed chain:
WS first -> HTTP fallback -> IPC fallback
- Applied this as bootstrap default in app initialization rather than user preference switching.