Commit Graph

2276 Commits

Author SHA1 Message Date
nesquena-hermes 78ca4d43a1 Merge #5005 (futureworld678 Shift+Enter) into stage 2026-06-30 21:51:42 +00:00
nesquena-hermes 0b74397fa6 Merge #5120 (rodboev budget limit) into stage 2026-06-30 21:28:51 +00:00
nesquena-hermes f579ed83dc fix(#5002): repaint sidebar after quick-create newSession (Codex: newSession doesn't render; callers must) 2026-06-30 21:12:14 +00:00
nesquena-hermes ee7f6b584d fix(#5002): hydrate _projectQuickCreate at boot + rebuild sidebar on toggle change
Codex gate findings: (1) the opt-in flag was only set when Settings opened, so an
enabled setting didn't take effect on a fresh load — now hydrated from /api/settings
at boot (mirrors _largeTextPasteAsAttachment, default-false); (2) toggling the
checkbox now rebuilds the sidebar so the + buttons appear/disappear immediately.
2026-06-30 21:06:35 +00:00
nesquena-hermes 8a5172275d Merge #5002 (per-project quick-create, opt-in) into stage 2026-06-30 20:56:05 +00:00
nesquena-hermes ba401d3784 Merge #5079 (OpenAI TTS + SSRF hardening) into stage 2026-06-30 20:39:04 +00:00
nesquena-hermes 027699b570 Merge #4881 (rodboev Kanban modal fields) into stage 2026-06-30 19:50:46 +00:00
nesquena-hermes b098e5c658 feat(#4676): gate per-project quick-create buttons behind opt-in setting
Add a default-OFF 'project_quick_create_buttons' setting that gates the
per-project '+' quick-create buttons on sidebar project chips. The chip
render site only calls _attachProjectQuickCreateButton when the new
window._projectQuickCreate runtime flag is enabled, so the buttons do
not appear unless the user opts in via Settings.

Mirrors the large_text_paste_as_attachment opt-in plumbing (defaults,
allowlist, settings collect/restore/save, window hydration at both sites,
checkbox row, i18n across all locales).
2026-06-30 19:49:07 +00:00
Rod Boev 66fc8722c1 fix(#4676): expose quick-create button purpose to screen readers 2026-06-30 19:28:28 +00:00
Rod Boev 80dbbc1e93 fix(#4676): swallow duplicate quick-create inflight rejections 2026-06-30 19:28:27 +00:00
Rod Boev 0ea9e72a9a docs(#4676): clarify quick-create rollback ownership 2026-06-30 19:28:27 +00:00
Rod Boev a109f86946 Keep project quick-create filter changes in sync with session creation outcomes 2026-06-30 19:28:27 +00:00
Rod Boev 08c4004271 Preserve touch quick-create clicks while blocking chip long-press leakage 2026-06-30 19:28:27 +00:00
Rod Boev a9871bbd9f Harden project quick-create against eval-arg drift and touch long-press leakage 2026-06-30 19:28:27 +00:00
Rod Boev 11882aab2a feat(projects): add per-project new conversation shortcuts (#4676) 2026-06-30 19:28:27 +00:00
nesquena-hermes d954d4c861 Merge #4871 (rodboev Mermaid toolbar) into stage 2026-06-30 19:27:15 +00:00
nesquena-hermes 492fdfb84a Merge #4574 (rodboev mobile titlebar) into stage 2026-06-30 19:10:38 +00:00
nesquena-hermes 61cc0d167b Merge #5019 (disco32r mobile touch targets) into stage 2026-06-30 18:54:36 +00:00
nesquena-hermes c7767f9295 Merge #5211 (search-ranking) into stage-pq1 2026-06-30 18:06:11 +00:00
nesquena-hermes 1f00e4de8c Merge #5168 (pet-handoff) into stage-pq1 2026-06-30 18:06:09 +00:00
Lester b1c11939aa Add Shift+Enter send key option 2026-06-30 18:04:29 +00:00
nesquena-hermes 121059b384 Merge #5161 (pr/5144-busy-composer-placeholder-hint) into stage-w5 2026-06-30 17:25:03 +00:00
sheldon-im 944d57eedc Improve latest assistant response landmark 2026-06-30 17:13:45 +00:00
allenliang2022 4ef9d7c5cb fix(webui): render a server-initiated turn that finished during an SSE gap on a visible tab
A visible tab can permanently miss a server-initiated turn (self-wake /
cron / restart hook) when its per-session SSE is momentarily down at the
emit instant. server_turn_started is a fire-and-forget broadcast with no
replay buffer; if the turn also finishes before the tab reconnects, the
on-subscribe self-heal finds no live run in ACTIVE_RUNS and replays
nothing, so the transcript stays stale until a hard refresh.

Extend the self-heal: the (re)subscribing tab reports its last-known
message_count (?known_count); when there is no live run to replay, the
handler compares the persisted count and, if the server is ahead, emits a
lightweight session-updated frame. The frontend syncs incrementally via
the #5189 keepStaleUntilLoaded swap-in-place loadSession path (no
clear+refetch, so the #5177/#5189 blank-gap jump is not reintroduced).
Idle-only and pane-scoped; emits only when the server is strictly ahead.
2026-06-30 17:13:45 +00:00
Maude Bot 5263b9acf7 feat: add Webhooks sidebar filter parity
Co-authored-by: Kilian Tyler <kilian@kil.dev>
2026-06-30 17:06:31 +00:00
allenliang2022 0a1cf564c7 fix(chat): make keep-settled-worklog-open genuinely transient (#5260 gate-cert)
The RED gate-cert (Codex-verified) found the keep-open was NOT the one-frame
transient the PR claimed: _disarmKeepSettledWorklogOpen() only cleared the token
with no follow-up render, so the just-settled worklog stayed force-open and could
be cached into _sessionHtmlCache and persist across session restores.

Two coordinated fixes:

1. Don't cache the forced-open DOM. Add _isKeepSettledWorklogOpenArmed() and gate
   the _sessionHtmlCache.set() population on a typeof-safe !_keepOpenArmed local, so
   the armed settle render is never cached. The typeof guard also keeps standalone
   renderMessages() node harnesses (which don't define the helper) working.

2. Collapse pass after disarm for BOTH pin states. The STREAM_DONE handler disarms,
   then runs _renderMessagesWithScrollSnapshot() UNCONDITIONALLY (a scroll-preserving
   re-render that collapses the worklog back to its copied live/user disclosure
   state), and only THEN scrollToBottom() for followers to re-settle at the tail.
   The second RED gate-cert caught that gating the collapse pass to the non-following
   path left a pinned follower forced-open, because scrollToBottom() only settles
   scroll position and does NOT re-render. Running the collapse render before the
   follower re-settle fixes both pin states. The same-frame JS restore absorbs the
   collapse height change instead of leaving it to native scroll-anchoring (which
   mobile suppresses mid-render), so there is no jump, and this unarmed render is
   the one that populates the cache.

Net: keep-open is genuinely one settle render for pinned AND unpinned readers —
neither persists nor caches — and a user-collapsed worklog is preserved. Verified
e2e on an isolated debug instance for both pin states (worklog open-while-armed ->
collapsed-after-pass; pinned follower stays pinned at tail). Regression tests lock
the cache-skip and the collapse-before-scrollToBottom ordering; the scrollToBottom
adjacency keeps the #1360 done-follow test green.
2026-06-30 17:06:31 +00:00
allenliang2022 b041789056 docs(chat): note one-frame flash-open for unpinned user-collapsed worklog
Maintainer review on #5260 flagged that dropping the pin gate means an unpinned
reader who manually collapsed the live worklog now gets a one-frame flash-open at
the settle render before it re-collapses. Document the mechanism in-tree at the
call site (disclosure state preserved + keep-open disarms after the render, so
the next re-render honors the collapsed state) so a future reader doesn't mistake
the single-frame override for a lost preference. Doc-only; no behavior change.
2026-06-30 17:06:31 +00:00
allenliang2022 d9622bf9b0 fix(chat): keep just-settled worklog open for unpinned readers too (mobile 往回大跳)
The STREAM_DONE keep-open exception (#4970 round 6/7) was scoped to PINNED
followers only, on the assumption that unpinned readers 'preserve their viewport
normally'. That holds on desktop (overflow-anchor:none + JS snapshot restore) but
NOT on mobile.

Repro (isolated debug instance + CDP touch emulation, faithful to a real phone):
a reader who scrolls UP to read inside the just-settled turn is UNPINNED. At
STREAM_DONE the live worklog/thinking cards collapse into a compact summary,
shrinking the transcript by hundreds of px ABOVE their viewport. On mobile the
CSS resting value is overflow-anchor:auto, but _fixMobileScrollJank() flips an
inline overflow-anchor:none over the settle render — so native scroll-anchoring
is suppressed during exactly the frame the unpinned reader needs it to absorb the
above-viewport shrink. The content then leaps to the top of the latest turn (the
'往回大跳' report). Single-variable measurement: collapse-with-auto shifts the
reader 0px; collapse-with-none shifts -248px.

Fix: keep the just-settled worklog open for BOTH pin states (still one-shot
scoped to the turn that just settled, so historical worklogs still collapse
compact). This removes the shrink entirely, fixing the jump for every
device/anchor-mode instead of fighting the anchor engine. The #4856 guard and the
mobile overflow-anchor:auto CSS are untouched, so Boev's Android DOM-wipe fix and
akrhin's #MOBILESCROLL fix both stay intact.

- Rename _shouldKeepSettledWorklogOpenForPinnedFollow ->
  _shouldKeepSettledWorklogOpenForStreamSettle (drops the _scrollPinned /
  _messageUserUnpinned gate; keeps the one-shot stream-id token).
- Update the #4970 behavioral regression test to assert keep-open is TRUE for the
  armed turn under BOTH pin states, FALSE for historical turns and after disarm.
2026-06-30 17:06:31 +00:00
nesquena-hermes 62310be565 Merge #5244 (fix/subagent-sidebar-stacking) into stage-w2 2026-06-30 16:35:58 +00:00
nesquena-hermes 4a7159a2ee Merge #5253 (franksong2702/fix-live-worklog-manual-scroll) into stage-w2 2026-06-30 16:35:56 +00:00
nesquena-hermes 3a12ac6bb8 Merge #5264 (fix/large-text-paste-toggle-upstream) into stage-w2 2026-06-30 16:35:55 +00:00
nesquena-hermes 6c5e488579 Merge #5266 (fix/hidden-tab-multipane-attach-bool) into stage-w2 2026-06-30 16:35:53 +00:00
nesquena-hermes 21233f2df8 Merge #5257 (franksong2702/fix-transparent-live-snapshot) into stage-w1 2026-06-30 16:19:52 +00:00
nesquena-hermes 9dc56a7284 Merge #5254 (pr/5250-settings-search-menu-clip) into stage-w1 2026-06-30 16:19:50 +00:00
nesquena-hermes 90180bd56c Merge #5256 (franksong2702/fix-session-menu-delete-delay) into stage-w1 2026-06-30 16:19:49 +00:00
Rod Boev a13b8b996c Keep done-settle unread metadata aligned with compacted counts 2026-06-30 08:50:25 -04:00
Rod Boev 85fac54831 fix(#5273): sync active viewed count on done settle 2026-06-30 08:31:01 -04:00
allenliang2022 eabbe9a821 fix(webui): hidden-tab poll keeps retrying when attach defers in multi-pane (#5172 follow-up)
#5172 (render server-initiated turns in a hidden tab, shipped v0.51.743 via
#5218) has a non-blocking multi-pane edge flagged in review: when a
server-initiated turn arrives for a session that is NOT the active pane, the
hidden-tab status poll called _attachServerInitiatedStream() and could not tell
whether the attach actually happened. _attachServerInitiatedStream returned
undefined in all paths, so the poll had no signal — a stop-on-call would cancel
polling while the turn was never rendered, leaving it invisible until the next
user interaction.

Fix: _attachServerInitiatedStream now returns a bool — true when this tab is
responsible for rendering the stream (attached, or already attached to the same
sid/streamId), false when the attach was not consummated (sid not the current
pane, invalid input, or a thrown error). _startHiddenActiveStreamPoll captures
the bool and only calls _stopHiddenActiveStreamPoll() when true; on false it
keeps polling and re-tries on a later tick (e.g. once the user switches the pane
back to sid, or the turn finishes and status returns active_stream_id=null).

Tests in tests/test_hidden_tab_server_initiated_turn.py: assert all return paths
are explicit bool (no bare return), the non-current-pane path returns false, and
the poll gates _stopHiddenActiveStreamPoll on the attach result.
2026-06-30 16:56:45 +08:00
Frank Song 6ac5b9dbee Fix transparent live anchor scene replay
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-06-30 12:27:02 +08:00
Frank Song 2c8f30de35 Merge origin/master into PR 5253
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-06-30 12:26:58 +08:00
Frank Song 44d881eede Merge origin/master into PR #5256
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-06-30 12:26:28 +08:00
Stacey2911 6b0d8eaadf fix(webui): make large text paste-as-attachment toggleable via settings
Add a user setting 'large_text_paste_as_attachment' (default: on) that lets
users paste large text inline instead of having it auto-converted to .md file
attachments. The toggle lives in Control Center → Chat tab and persists via
settings.json, following the established upstream pattern for boolean settings.
2026-06-30 14:25:53 +10:00
Rod Boev eb3c5a26bd Clarify terminal marker replacement semantics 2026-06-30 03:33:55 +00:00
Rod Boev 494d137082 fix(chat): scope transcript preserve to the current terminal tail (#5224) 2026-06-30 03:33:55 +00:00
Rod Boev fd35d8c9ab fix(chat): narrow transcript preservation to stale-prefix restores (#5224) 2026-06-30 03:33:55 +00:00
Rod Boev c17f222427 fix(chat): preserve visible transcript on terminal stream failure (#5224) 2026-06-30 03:33:55 +00:00
Frank Song bb6487a70a fix(sidebar): remove menu-deleted sessions optimistically 2026-06-30 10:56:48 +08:00
Frank Song 71a458784a fix(chat): guard live worklog manual scroll intent
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-06-30 10:52:11 +08:00
Frank Song 448e28f442 fix(chat): preserve manual live worklog scroll snapshots 2026-06-30 10:28:36 +08:00
Rod Boev 761ffc5d96 fix(#5250): let settings search results escape the menu clip 2026-06-29 22:23:00 -04:00