Closed
Conversation
隐藏非活跃会话时,"Shared with me" 区域不再被整体过滤掉。 共享会话中的非活跃会话仍会被隐藏,且当无活跃共享会话时不显示空标题。 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Server: add POST/GET/DELETE /v1/connect/dootask endpoints with encrypted storage - Client: sync profile to server on login, delete on disconnect - Client: restore profile from server on startup if missing locally - Client: refresh DooTask token on app foreground (throttled to 1h) Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Support macOS LaunchAgent (user-level) and Linux systemd user service for daemon auto-start on login. No sudo required. - `happy daemon enable` installs and starts the service - `happy daemon disable` stops and removes the service - `install`/`uninstall` kept as aliases for backward compatibility - Pre-flight check: requires `happy auth login` before enabling Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
The reducer skipped applying answers from completedRequests when permission.date was already set by tool results. Since tool results never carry answers, this caused them to show as "-" after reopening. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Replace Socket.IO RPC with POST /v1/sessions/spawn for session creation, unifying the API style with message sending. Server proxies the request to the daemon via invokeUserRpc, keeping E2E encryption intact. - Server: new POST /v1/sessions/spawn route with machine ownership check - App: new machineSpawnHTTP method on ApiSocket (35s client timeout) - App: machineSpawnNewSession now calls HTTP instead of Socket RPC Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Add "shared by me" section to user profile page, complementing the existing "shared with me" section. Users can now see both directions of sharing with a friend. - Add GET /v1/sessions/shared-by-me?withUserId=X server endpoint - Add fetchSessionsSharedByMe() client API function - Display two separate ItemGroups on user profile: "shared with you" and "you shared" (hidden when empty) - Add translations for all 10 languages Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…ing git button Add a Pressable between the left icon group and right icon group that captures taps on the empty middle area and focuses the text input. Previously, GitStatusButton's flex:1 made its hit area extend across the entire empty space. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Move GitHub link from ItemGroup to icon in profile card top-right corner - Move destructive actions (remove friend, cancel request) to header right ellipsis menu with ActionSheet on iOS and ActionMenuModal on Android/Web, preparing for future menu items - Fix hooks ordering to ensure all hooks run before early returns Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Load cached data from MMKV immediately on mount, then silently refresh from the API and update the cache. This avoids a blank state when revisiting a friend's profile. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Extract data loading into reusable callback, add RefreshControl to ItemList so users can pull down to refresh profile and shared sessions. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Unify repeatKey for friend notifications (friend_request/friend_accepted → friend_{uid}) so acceptance replaces the request feed item
- Remove 24h cooldown from friend acceptance notification so it always creates a feed item
- Clean up feed items on reject/cancel in friendRemove (server-side deleteMany)
- Remove stale feed items client-side on relationship-updated with status=none
- Remove feed items client-side after removeFriend action on user profile
- Fix pull-to-refresh to do a full feed reload (replaceFeedItems) instead of incremental merge, matching fresh app launch behavior
Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
When head is null (initial load or full refresh), the second fetch could return the same items as the first, causing duplicate React keys. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
applyFriends was merge-only — cancelled/rejected relationships stayed in the local friends map forever because entries were never removed. Now it replaces the entire map with server data, so cancelled requests and rejected friend entries are properly cleaned up. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
refreshFriends now also invalidates feedSync so that feed items (friend_request → friend_accepted replacement) update immediately after accepting/rejecting/cancelling friend requests. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…fetch When a feed item arrived via new-feed-post socket event and then the same item arrived via fetchFeed, applyFeedItems would: 1. Remove the existing item by repeatKey (splice from updatedItems) 2. Skip re-adding because existingMap still had the old entry Fix: sync existingMap when removing by repeatKey so the item can be properly re-added. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
useChangelog used component-level useState, so markAsRead in the UpdateBanner didn't update the useInboxHasContent hook instance, leaving the tab bar dot visible until app restart. Switched to useSyncExternalStore with a shared module-level snapshot so all instances react immediately when changelog is marked as read. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
- Add native update (App Store / Play Store) to inbox dot trigger - Remove misleading comment about feed items (never checked) - Clean up unused useFeedItems import Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Always render cardBottom row with fixed minHeight so the card height stays stable while assignee names load from a separate API call. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Some conversations have malformed TodoWrite tool input where todos is not an array, causing "e.todos.filter is not a function" error when opening the conversation. Add Array.isArray() checks in the reducer (to reject non-array data at the source) and in ActiveSessionsGroup (as a defensive UI guard). Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…n jitter Ionicons, Octicons, MaterialCommunityIcons, and AntDesign fonts were lazily loaded on first render, causing text to re-layout when navigating to pages that use these icon sets for the first time. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…on arrives late On the /new page, the first message could be emitted before the CLI's session-scoped socket connects, causing the message to be saved but never delivered in real-time. Add DeliveryStats to eventRouter.emit so callers can detect when no session-scoped connection received the update, and schedule a background replay (polling up to 15s) for seq=1 messages that were missed. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…revent list jitter updatedAt changes frequently as sessions receive messages or state updates, causing the session list order to shuffle between requests. createdAt is stable and provides a consistent, predictable sort order. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
…ansient not-git errors Extract pure decision functions into gitStatusRefreshPolicy for testability. When a confirmed git project transiently reports "not a git repository", preserve the previous status and retry once before clearing. Automatically refresh git status when a session recovers from offline to online. Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
When tool results are trimmed before sending to the app, the full output is now persisted in a per-session JSON store (toolOutputStore). Trimmed payloads include a `_outputTrimmed` marker with a `_callId` reference, allowing the app to fetch the complete result via the `getToolOutput` RPC when the user opens the tool detail view. CLI changes: - Add toolOutputStore for persisting full tool output records - Add loadableToolOutput helper (createLoadableToolOutput, summarizeBashToolOutput) - Update trimToolUseResult to store and tag trimmed outputs - Register getToolOutput RPC handler in registerCommonHandlers - Use summarizeBashToolOutput in Codex/Gemini runners and backfill App changes: - Add ToolOutputDetail component that auto-fetches full output on mount - Add toolOutputContent module for formatting loaded results (command, text, structured) - Update ToolFullView to use ToolOutputDetail instead of raw SmartDataView Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
sdkToLogConverter 和 apiSession 现在同时接受 camelCase 和 snake_case 的 tool_use_result 字段,确保不同 SDK 版本的消息格式都能正确传递 trimmed tool output 数据。 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
将 ToolOutputDetail 的加载和错误卡片样式提取到 toolOutputLoadingCard 模块, 优化错误状态下的 summary 渲染为自定义 key-value 布局,添加背景色和圆角等 视觉增强。 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Replace simple truthy check with hasResultContent() helper that properly handles empty strings, empty arrays, empty objects, and null/undefined, preventing false positive "has result" display for tools that return empty-ish values. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ear deadlock After /clear, the CLI returns without ever triggering thinking=true, leaving awaitingTurnStart permanently stuck as true. This caused all subsequent messages to be queued as pending, and using "Send Now" would abort the newly dispatched message. Fix by clearing awaitingTurnStart when a thinking=false heartbeat arrives, and treating the awaitingTurnStart→cleared transition as turnEnded so pending messages are auto-dispatched. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…erminal and machine-status Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
JSON.stringify(new Error(...)) returns {} because Error properties are
non-enumerable. Handle Error instances explicitly in logToFile to output
the message and stack trace.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…context support - Add ClaudeModelFamily/ClaudeReasoningEffort types with parse/build helpers in happy-wire - Support 1M context variants (claude-opus-4-6[1m], claude-sonnet-4-6[1m]) - Remove deprecated claude-opus-4-5 and claude-sonnet-4-5 models - Add Claude family + reasoning effort picker in AgentInput, extract generic renderRadioOptions - Pass reasoningEffort through EnhancedMode and --effort CLI flag in happy-cli - Sync model & effort into session metadata via claudeRemoteLauncher - Guard against [1m] model variant being overwritten in apiSession - Parse Claude composite model modes in orchestrator runOneShot
…age dispatch
Remove the dedicated /send-now REST endpoint and its tests. The client
now pins the target pending message (so it sorts first) and aborts the
current turn — the server's existing auto-dispatch picks it up.
Also:
- Signal thinking=false immediately on session reset in claudeRemote
to clear awaitingTurnStart without waiting for the next heartbeat
- Fix pinnedAt ordering to use { sort: "desc", nulls: "last" } so
un-pinned messages don't sort above pinned ones
- Add missing await on dispatchNextPendingIfPossible in rpcHandler
… restore The /clear handler reset nextResumeFile but left storedSessionIdForResume intact, so a previously aborted session could still be resumed via findCodexResumeFile() when the next backend was created.
ACP init can be slow; notify server immediately so the session shows "thinking" state instead of appearing idle.
Wait briefly so the AI's final response arrives at the app before the next pending message is dispatched.
Add copySessionModeSettings() to propagate permissionMode, modelMode, and fastMode from the original session to the duplicated one. Integrate at all three duplicate call sites (SessionView, info, recent). Also add refreshSessions() before copySessionMetadata in SessionView to ensure the new session is available.
… run detail Use ActionMenuModal with an ellipsis icon instead of the inline cancel text button in the header, providing a consistent action pattern.
…or tool output Display providers list in orchestrator context machine info. Map queued status to running for status badges since queued is a transient state that should appear active visually.
Pre-fill the input box in the new session with the selected duplicate message content, so the user can review and send it immediately.
Includes WebSocket first-turn stall fix, realtime session context improvements, Linux sandbox reliability, and plugin management overhaul.
Extract isDebug() utility that only recognizes DEBUG=1 or DEBUG=true, preventing Coder platform's DEBUG=release from triggering verbose logs.
…pen/close Add race condition protection to voice session lifecycle: - Synchronous voiceSessionStarting flag blocks concurrent starts - AbortController lets stop signal in-progress starts to clean up - Session version counter prevents stale callbacks (onConnect, mode changes) from superseded sessions from updating UI state Fixes: status bar flash after closing during connect, and no-audio after repeated open/close cycles.
Previously, when Claude Code exited with a non-zero code, the frontend only saw "Process exited unexpectedly" with no detail. Now stderr is always captured and included in both the log and the error message sent to the frontend, making root-cause diagnosis possible without DEBUG mode.
When modelMode is "default", the app couldn't determine whether the CLI was using 200K or 1M context. Now the CLI extracts the actual model ID (including [1m] suffix) from system/init and writes it to session metadata, allowing the app to look up the correct context window size. Also extracts normalizeModelId() as shared helper for stripping date and -fast suffixes from model IDs.
Show the layers icon in session header only when the session has orchestrator runs (any status, not just running). Adds totalRunCount to activity API responses and ephemeral events so the client can track this in real time without requiring a session switch.
65fc3c2 to
55cc471
Compare
- Tag push (v*): parallel build APK + AAB + IPA → GitHub Release - Manual dispatch: build IPA → submit to App Store - Uses eas build --local (no EAS cloud quota) - Gradle init script disables lintVital for CI (third-party lint bugs) - Config plugin increases JVM memory when CI=true (7GB runner limit)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.