Commit graph

3371 commits

Author SHA1 Message Date
Paladin173
d8f0f8f97f Fix composer control reorder rebase collision
Reapply footer control ordering on current upstream/master while preserving the required situational chip renderer. Persist composer_control_order with backend validation, keep the settings descriptions reorder-aware, and make primary/situational chip renderers participate in same-group drag ordering.

Verified with: node --check static/boot.js; node --check static/panels.js; git diff --check; ./scripts/test.sh tests/test_issue4598_composer_control_visibility.py
2026-06-30 21:11:54 -05:00
nesquena-hermes
9bd71e9bae Merge #4988 (enihcam prune orphan zero-msg sessions) into stage
# Conflicts:
#	CHANGELOG.md
2026-07-01 00:19:56 +00:00
Frank Song
4643d3520e Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 08:07:51 +08:00
nesquena-hermes
e0f42ca900 Merge #5217 into stage 2026-06-30 23:35:00 +00:00
Frank Song
af7da472d2 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 07:27:27 +08:00
nesquena-hermes
f7ec3c7b39 test(#5217): scope follow-intent ordering assertion to _handleStreamError + strip EOF blank line (Codex gate nits) 2026-06-30 23:18:00 +00:00
nesquena-hermes
373c3e4b63 Merge #4969 into stage 2026-06-30 23:07:53 +00:00
Frank Song
fdeb37bbe2 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 07:02:01 +08:00
nesquena-hermes
338060e910 Merge #5287 into stage-b1 2026-06-30 22:45:08 +00:00
nesquena-hermes
7df031592c Merge #5289 into stage-b1 2026-06-30 22:45:06 +00:00
Frank Song
f874f4027c Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 06:22:02 +08:00
Frank Song
36fcd10db7 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 06:01:53 +08:00
nesquena-hermes
78ca4d43a1 Merge #5005 (futureworld678 Shift+Enter) into stage 2026-06-30 21:51:42 +00:00
Frank Song
4da83ada63 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 05:42:12 +08:00
nesquena-hermes
0b74397fa6 Merge #5120 (rodboev budget limit) into stage 2026-06-30 21:28:51 +00:00
Frank Song
bb95539918 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 05:02:19 +08: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
eb2c4b1e7d fix(#5079): no-redirect opener for OpenAI TTS (block redirect-to-private SSRF + bearer leak)
A public TTS host could 301/302/303-redirect POST /audio/speech to an internal
target (e.g. http://169.254.169.254), and urllib's default redirect handler
would follow it carrying the Authorization bearer — both an SSRF bounce past the
base-url guard and a credential leak. Now uses a no-redirect opener
(_NoRedirectTtsHandler raises on any redirect) via the _tts_open seam. +redirect
rejection regression test. Residual DNS-rebinding TOCTOU (re-resolve at connect)
is a narrower low-severity window noted for follow-up.
2026-06-30 20:37:43 +00:00
nesquena-hermes
6bcb728f08 fix(#5079): block private/link-local/reserved IP targets in OpenAI TTS base_url (SSRF hardening)
The base_url validator accepted any https host; an https URL pointing at an
internal/link-local/loopback/reserved IP (e.g. https://169.254.169.254 cloud
metadata, https://10.x internal) passed the scheme-only check. Now resolves the
host and rejects blocked-target addresses (private/loopback/link-local/reserved/
multicast/unspecified), while still allowing public OpenAI-compatible hosts and
the explicit localhost-over-http dev case. DNS-resolution failure is allowed
(unreachable host can't be an SSRF vector + avoids false-rejecting public hosts
that don't resolve in sandboxed envs). +5 regression vectors.
2026-06-30 20:37:43 +00:00
Frank Song
7f069100cc Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 04:23:09 +08:00
Rod Boev
027ad18834 test(#5231): harden JS source extraction coverage 2026-06-30 16:06:39 -04:00
Frank Song
ab4844f54a Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 04:02:12 +08:00
nesquena-hermes
027699b570 Merge #4881 (rodboev Kanban modal fields) into stage 2026-06-30 19:50:46 +00:00
Rod Boev
e8631b808f fix(#5231): unblock Run dispatcher on the default Kanban board 2026-06-30 15:49:09 -04: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
Frank Song
54cbc35155 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 03:41:54 +08:00
santastabber
4b33458c4b fix(pwa): defer new-chat model hydration 2026-07-01 05:29:34 +10: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
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
5f78e0f100 test(projects): remove dead local from quick-create harness (#4676) 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
Frank Song
5db7e7c304 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 03:21:43 +08: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
Rod Boev
6b9686d5ae fix(#4961): preserve authenticated drafts without starting a session 2026-06-30 14:31:28 -04:00
Frank Song
b913dde912 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 02:22:08 +08: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
Frank Song
2ffb8ab470 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 01:42:44 +08:00
nesquena-hermes
121059b384 Merge #5161 (pr/5144-busy-composer-placeholder-hint) into stage-w5 2026-06-30 17:25:03 +00:00
Frank Song
63a327f470 Merge origin/master into PR #5271
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-07-01 01:22:13 +08: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