Commit Graph
1724 Commits
Author SHA1 Message Date
AnanovoandGitHub b8a13b044a feat(web): show unavailable Agents on demand (#1798)
* feat(web): add unavailable Agent visibility toggle

* feat(web): show unavailable Agents on demand

* chore: retrigger PR checks

* fix(web): keep unavailable Agent disclosure order
2026-11-01 20:08:37 +08:00
weishu 697f4930ee feat(android): question card like iOS
AskUserQuestion / request_user_input get their own card instead of the
generic tool card with an approval banner: one question per page,
outlined option rows with a Recommended badge, a collapsed other/note
field and a single primary action. Settled questions collapse to an
answer summary that opens the inspector. Wire answers and the sign-in
URL confirmation are unchanged.
2026-11-01 16:54:49 +08:00
weishu 5e9694f6fc fix(android): keep the session list entry refresh silent
The list screen is composed as soon as a predictive back gesture starts
previewing it, so the entry refresh flashed the pull-to-refresh spinner
on every back swipe. Only user-initiated refreshes show the indicator.
2026-11-01 16:39:27 +08:00
weishu 2ac959d51a feat(ios): compact queued-message card above the composer
Replace the full-width queued bar with a floating card stacked on the
composer, following the Codex/Claude Code/Cursor convention: one-line
rows with icon actions (bolt to steer, retry, cancel), tap a row to
edit, long-press for the full menu, and animated insert/remove.
2026-11-01 16:31:36 +08:00
weishu f69c9961fd feat(ios): refine the chat composer
- Collapse the empty, unfocused composer to one row; anything in flight
  (focus, draft, chips, schedule, recording, scratchlist) expands it
  without dropping focus.
- Bare 20 pt tool symbols with color-only states; only send/stop is a
  filled 32 pt circle. Both scale with Dynamic Type.
- Fix the schedule menu reading as active: Menu tinted its relative
  `.secondary` style.
- Stop uses the accent instead of alarm red.
- Liquid Glass card on iOS 26 (damped so text behind the short pill
  stays out of the placeholder); hairline edge on earlier systems.
- ⌘↩ sends from a hardware keyboard, gated like the Send button.
2026-11-01 16:24:47 +08:00
weishu 3b6f6d151b feat(android): refresh the session list like iOS
- Second section is Recent with compact headers; swipe to pin/unpin and
  archive or delete; Mark as Read in the long-press sheet
- 30dp agent icon with a presence badge (pulsing while running); no dimmed
  rows, row spinners or unread dot (semibold title + accent time)
- Transient connection status under the title after 2s; a failed refresh
  shows "Offline · updated …" with Retry
2026-11-01 16:00:56 +08:00
weishu 832c5922f2 feat(web): align session rows and connection banners with native apps
- Agent icon spans both lines with a presence badge (pulsing while a turn
  or background work runs); no dimmed rows or row spinners
- Unread is a semibold title plus accent time instead of a dot; pending
  requests are amber hand/bubble symbols, keeping one dot per row
- Reconnecting/syncing banners appear after 2s; reconnecting is neutral,
  amber stays for offline
2026-11-01 16:00:56 +08:00
weishu e940439ecf feat(ios): quieter home connection status
- Transient SSE states appear only after 2s, as the iOS 26 nav subtitle
  (a gray line with a spinner where no title is shown), so the list
  never shifts on routine reconnects
- Only a failed list refresh is amber: "Offline · updated …" with Retry
2026-11-01 15:48:18 +08:00
weishu 6ed83eda3c fix: show unread for running sessions
Running sessions previously suppressed the ordinary unread dot, hiding
answers the user had not seen. Unread is now
manualUnread || contentRevision > readRevision on web, iOS and Android.

Web rows draw the running/background spinner beside the unread dot, and
unread outranks background status. Because session patches arrive before
the message they count, a chat following its visible tail hides its own
ordinary dot until the rendered acknowledgement lands (display-only; web
and iPad split view).
2026-11-01 15:39:46 +08:00
weishu 85a3cfb40f fix(ios): return the session list to an inline title
The large title only cost vertical space once the second section was
renamed to Recent; the inline title shares the toolbar row.
2026-11-01 15:35:20 +08:00
weishu 1ab77530fd fix(ios): mark unread rows without a second dot
- Unread is a semibold title plus an accent timestamp, so the presence
  badge stays the row's only dot and timestamps share one column
- Compact section header insets and default min header height
- README: the session list uses a large collapsing title
2026-11-01 15:33:39 +08:00
weishu cf592b8483 feat(ios): refresh the session list layout
- Large collapsing title; rename the second section to Recent
- Swipe actions: pin/mark read (leading), archive or delete/reopen (trailing)
- Two-line agent icon with a presence badge (pulses while running) instead
  of dimming disconnected rows and per-row spinners
- Larger timestamps, compact section headers, glass-friendly filter icon
- Drop the pixel-level row presentation tests
2026-11-01 15:18:09 +08:00
AnanovoandGitHub ecf40d8851 feat(web): fork active and archived sessions from the session list (#2258)
* feat(web): fork active and archived sessions from the session list

* fix(codex): preserve fork titles during history replay

* fix(web): limit list forks to supported Codex sessions
2026-11-01 14:52:42 +08:00
weishu ba2b5c5651 Release version 0.33.5 2026-11-01 13:19:38 +08:00
weishu c94a968b81 fix(android): observe platform IME state in home search tests 2026-11-01 12:56:13 +08:00
weishu b0d01c5307 Release version 0.33.4 2026-11-01 12:26:43 +08:00
weishu 5a45b1cd2f fix(ios): recover inactive sessions during attachment uploads 2026-11-01 12:26:32 +08:00
weishu f4d8faebea feat(ios): support agent-displayed video, audio and files 2026-11-01 12:26:32 +08:00
weishu 59dcddf32b fix(codex): support queued async user questions 2026-11-01 10:34:36 +08:00
AnanovoandGitHub 46bae9b0f1 fix(codex): fork archived sessions without reopening the source (#2231)
* fix(codex): fork archived sessions without reopening the source

* fix(codex): reconcile interrupted archived fork recovery

* fix(codex): release rejected forks and serialize source startup

* fix(codex): fence unconfirmed resume startup across retries

* test(codex): validate durable resume recovery and serialize archive

* fix(codex): block local resume of pending archived fork sources

* fix(hub): coalesce concurrent resume requests to preserve idempotent startup

* fix(hub): bypass startup coalescing for PTY sessions
2026-11-01 09:55:01 +08:00
AnanovoandGitHub 639f71b6a6 test(android): name the IME phases and upload instrumentation reports (#2256)
* test(android): name the IME phases and upload instrumentation reports

* test(android): report Compose's IME inset height on failure

* test(android): import the WindowInsets.ime extension used by the diagnostic
2026-11-01 09:54:30 +08:00
Junmo KimandGitHub be41e854e0 feat(codex,opencode): show compaction summaries and token counts (#2249)
* fix(chat): render available compaction facts

* feat(opencode): unify native compaction summary cards

* fix(opencode): report actual compaction application lifecycle

* feat(codex): render native compaction checkpoints and metrics

* fix(chat): render compaction summaries and token facts in native clients

* fix(opencode): preserve transcript priming across read failures

* fix(opencode): recover snapshot-only replies after attachment
2026-11-01 09:54:10 +08:00
9c6639c3c3 feat(hub): title untitled sessions with their first prompt (#2252)
New sessions showed the working directory name until the first turn
finished and a generated or native title arrived. The Hub now records
the first non-command user prompt as metadata.promptTitle, with
whitespace collapsed and capped at 80 characters, and the web shows it
after name and summary but before the path fallback.

The prompt title is Hub-owned and kept outside summary, so the existing
"only while untitled" title sources (native ai-title, change_title, the
remote prompt fallback and automatic suggestions) still apply and
replace it. It is published as a versioned metadata patch, so it does
not race the thinking patch sent while the prompt is accepted.

via [HAPI](https://hapi.run)

Co-authored-by: HAPI <noreply@hapi.run>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 09:53:35 +08:00
AnanovoandGitHub 3e628cad5d fix(test): make shared launch path assertions cross-platform (#2255) 2026-11-01 09:53:23 +08:00
weishu 5ef4304a4a fix: synchronize read state across web and native clients
Track readable content revisions and durable read cursors in the hub. Acknowledge only rendered foreground tails, persist offline read operations, and preserve newer manual unread choices across devices.

Migrate existing history to a read baseline and cover pagination receipts with shared native conformance fixtures.
2026-11-01 09:52:51 +08:00
weishuandGitHub ee4ac238cb feat(ios): move hub controls into Settings and new session beside search (#2257) 2026-11-01 09:11:39 +08:00
SSU-WEI HUANGandGitHub f8e55fb930 feat(agy): reuse a persistent headless stream process (#2248) 2026-10-30 19:11:26 +08:00
013ace8e88 fix(cli): show resolved versions in Claude model labels (#2245)
Co-authored-by: Kiyoshi Guo <kiyoshi.guo@bytedance.com>
2026-10-30 14:37:59 +08:00
SSU-WEI HUANGandGitHub 5fcd4a067a fix(agy): separate model and effort selection (#2244)
* fix(agy): separate model families and reasoning effort

* fix(agy): report startup before model discovery
2026-10-30 07:36:13 +08:00
AnanovoandGitHub 75aa3d929a fix(web): preserve completed status summaries during follow-up sends (#2241) 2026-10-30 07:17:44 +08:00
AnanovoandGitHub 8ee8c6f662 fix(hub): release SQLite statements before close (#2240)
* fix(hub): finalize cached SQLite statements before close

* test(hub): close SQLite fixtures before teardown
2026-10-30 07:17:29 +08:00
SSU-WEI HUANGandGitHub a7022370d0 fix(web): keep subagent parent when trimming the message window (#2243)
* fix(web): keep subagent parent when trimming the message window (#2242)

Tail mode trims to the newest 400 raw messages. When a long subagent run
fills that window, its Agent tool call falls outside it and the tracer
hides every sidechain row, leaving a single visible message. Keep the
dropped Agent/Task tool call whose sidechain rows survive, and derive
the older-page cursor from the contiguous window so the gap still loads.

* test(web): cover subagent parent pinning across repeated trims
2026-10-30 07:16:10 +08:00
weishu 1c861b2f0e feat(android): redesign home toolbar search and filters 2026-10-30 07:15:39 +08:00
weishu d9acc0c31e Release version 0.33.3 2026-10-29 22:29:49 +08:00
3f8686e623 feat(claude): offer the four current Claude models, drop the 1M presets (#2153)
* fix(claude): drop the obsolete 1M model presets

The opus, sonnet and fable aliases now resolve to models with a native 1M
window (Opus 5.5, Sonnet 5.5, Fable 5.1), so Claude Code documents the
"[1m]" suffix as having no effect on them and its own /model picker no
longer lists 1M rows. Remove Sonnet 1M / Opus 1M / Fable 1M from the
shared, Android and iOS catalogs.

Sessions stored with a "[1m]" value keep working: the composer keeps
the current model selectable, and the context-budget fallback treats any
"[1m]" model and the remaining aliases as 1M, so local-mode sessions on
plain opus/sonnet no longer show a 200k budget.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(cli): seed a 1M turn-1 context window for bare Claude aliases

With the 1M presets gone, a session on plain fable/opus/sonnet must not
seed 200k before its first result: those aliases now resolve to models
with a native 1M window. Seed 1M when the selected model is a preset
alias; an explicit full id still seeds conservatively until its result
arrives.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(claude): offer the four current Claude models as presets

The Claude presets now mirror the aliases Claude Code's /model lists, in
its order: Opus, Fable, Sonnet, Haiku. Each alias resolves to the newest
model of its family, and all four have a native 1M window, so neither
1M variants nor pinned older versions are offered. Haiku was missing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* feat(claude): read the effective context window from get_context_usage

The 1M seed for the aliases is wrong for users who disable 1M
(CLAUDE_CODE_DISABLE_1M_CONTEXT) or cap it with autoCompactWindow. In
remote mode, ask Claude via the get_context_usage control request after
each system/init and use its maxTokens, which is what /context shows.
A result's raw contextWindow no longer overwrites that value. Older CLIs
that reject the request keep the existing seed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: weishu <twsxtd@gmail.com>
2026-10-29 22:28:59 +08:00
Junmo KimandGitHub 97224c9dd7 fix(runner): recover sessions after host reboot (#2169)
* fix(runner): recover sessions after host reboot

* fix(runner): settle startup when process generation changes

* test(runner): wait for Hub RPC readiness before resume
2026-10-29 22:13:56 +08:00
JeeandGitHub 13fec3e157 fix(web): show session mentions without waiting for remote file search (#2170)
* fix(web): show session mentions without waiting for remote file search

* fix(web): preserve selected files during mention refresh

* test(runner): avoid fixture PID collision with test process
2026-10-29 22:13:38 +08:00
557ed3c99f perf(codex): reduce history replay during thread recovery (#2214)
* perf(codex): reduce history replay during thread recovery

* fix(codex): restore live child subscriptions during bounded replay

---------

Co-authored-by: gaodq <gaodq@koal.com>
2026-10-29 22:13:11 +08:00
AnanovoandGitHub 0f76485ad9 feat(web): support local Markdown images in conversation messages (#2215)
* fix(web): resolve relative Markdown assets in file previews

* fix(web): harden standalone Markdown asset resolution

* fix(web): preserve Markdown URI and image policies

* fix(web): route Markdown file links through app history

* fix(web): preserve session reference navigation in previews

* feat(web): support local Markdown images in conversation messages

* fix(cli): bound session file reads

* fix(cli): avoid blocking bounded reads on FIFOs

* test(cli): run FIFO regression with Bun

* fix(hub): preserve legacy session file RPC calls

* test(web): update markdown preview fixture context

* fix(cli): reject symlinked session files outside workspace
2026-10-29 22:12:57 +08:00
AnanovoandGitHub f29be07bb9 fix(codex,web): preserve late command result identity and timing (#2239) 2026-10-29 22:12:27 +08:00
weishu 9384ce031b feat(cli): add Codex-aware auto peer delivery
Default peer CLI and MCP messages to auto, steering eligible Codex turns and queueing otherwise. Preserve explicit delivery modes and uncertain-send safety, and clarify steer guidance for important time-sensitive findings.
2026-10-29 22:02:43 +08:00
AnanovoandGitHub f48a6696cf fix(web): reveal directory tails and support touch scrolling (#2237) 2026-10-29 21:22:31 +08:00
weishu 01cdec1179 feat(android): share files and text to sessions 2026-10-29 21:17:19 +08:00
weishu 730dfcb22e Release version 0.33.2 2026-10-29 13:24:52 +08:00
weishu 4b3f92ea84 fix(android): keep session ordering timestamps consistently Long 2026-10-29 13:01:38 +08:00
AnanovoandGitHub bb51684339 fix(web): hide reorder handles for single composer attachments (#2235) 2026-10-29 12:49:12 +08:00
weishu 01dabad204 fix(sessions): stabilize ordering by latest user input
Persist and backfill the last user-message timestamp, and use it for deterministic session ordering across web and native clients while preserving manual pins.

Remove the fixed-order setting and guard ordering against transcript echoes, replayed messages, and stale REST/SSE updates. Add regression coverage and regenerate the SSE fixture.
2026-10-29 12:47:52 +08:00
weishu 5fd1179d2d fix(hub): repair v24 migration test fixture 2026-10-29 11:20:01 +08:00
6ccde08548 feat(android): render settings pickers as expressive choice dialogs (#2227)
* feat(android): anchor the Material type scale on the shared reading tokens

MaterialTheme was built with only a colorScheme, leaving HapiTypography's
body/code/caption tokens an island that never influenced Material
typography. Derive the app-wide Material type scale from those tokens so
Material widgets and direct token consumers share one type system: the
body token drives bodyLarge (the chat reading size) and the caption token
drives bodySmall (the metadata size), while every other slot keeps its
Material platform default so existing MaterialTheme.typography call sites
stay pixel-identical. Only size and leading come from the tokens; weight,
tracking and family stay Material's. HapiTheme now accepts a typography
argument (defaulting to the shared scale) and passes it through, and the
monospace code token stays a direct-consumer token because Material has
no code slot.

Co-Authored-By: Claude Code <noreply@anthropic.com>
via [HAPI](https://hapi.run)
Co-Authored-By: HAPI <noreply@hapi.run>

* feat(android): render settings pickers as expressive choice dialogs

The theme and language pickers were the last bare AlertDialog + radio-row
surfaces in the app: plain stacked radio buttons with no visual anchor for
what each option means, and two focus targets per row (the row and the
RadioButton each carried their own click handler). Give small exclusive
pickers a shared expressive form: each option renders as a full-width
choice card whose selected state is a secondaryContainer fill plus a
trailing check, and options can carry a fixed preview swatch.

The theme modes show two-tone palette chips — follow-system spans the
light and dark palettes, OLED is outlined pure black, dark uses the dark
canvas rather than black so the two stay distinguishable at a glance.
Swatch colors are fixed values depicting the mode they name, not derived
from the active scheme, mirroring how the web color-theme cards hardcode
their previews: a "light" chip must stay light even inside a dark dialog.

Rows keep radio semantics through Modifier.selectable with Role.RadioButton
inside a selectableGroup, so TalkBack still announces the standard
"selected, n of m" picker phrasing while each option becomes a single
focus target. Tapping an option still applies it immediately. Language
options skip the swatch slot; the component stays generic over the value.

Co-Authored-By: Claude Code <noreply@anthropic.com>
via [HAPI](https://hapi.run)
Co-Authored-By: HAPI <noreply@hapi.run>

---------

Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: HAPI <noreply@hapi.run>
2026-10-29 10:57:55 +08:00
2a75984b75 feat(cli): add peer delivery modes for CLI and MCP (#2197)
* feat(cli): select queue or steer for peer messages

* fix(peer): respect per-agent steering availability

---------

Co-authored-by: NightWatcher <hitszzzf@gmail.com>
Co-authored-by: weishu <twsxtd@gmail.com>
2026-10-29 10:55:58 +08:00