Skip to content

1#859

Closed
weifashi wants to merge 976 commits intoslopus:mainfrom
hitosea:next
Closed

1#859
weifashi wants to merge 976 commits intoslopus:mainfrom
hitosea:next

Conversation

@weifashi
Copy link

No description provided.

kuaifan and others added 30 commits March 4, 2026 16:35
隐藏非活跃会话时,"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>
kuaifan and others added 17 commits March 23, 2026 14:23
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.
kuaifan added 5 commits March 25, 2026 00:20
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.
@kuaifan kuaifan force-pushed the next branch 4 times, most recently from 65fc3c2 to 55cc471 Compare March 25, 2026 23:12
- 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)
@hitosea hitosea closed this by deleting the head repository Mar 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants