Commit graph

1828 commits

Author SHA1 Message Date
nesquena-hermes
76d6cc7f74 #5142: office-doc preview + safe docx editing (#540), rebased on master; optional deps 2026-07-02 01:15:57 +00:00
nesquena-hermes
6af9cc3244 chore(changelog): #4682 cross-profile cron visibility 2026-07-02 01:08:12 +00:00
nesquena-hermes
b709ae6fc2 #5228: require browser provenance on all proxy methods (close GET/POST asymmetry from gate); CHANGELOG 2026-07-02 00:23:10 +00:00
nesquena-hermes
01520b8076 chore(changelog): Phase-1 batch — #5153 MoA fail-closed, #5309 ctl.sh .env, #5310 push-to-talk 2026-07-01 23:37:33 +00:00
nesquena-hermes
c49f451402 docs(changelog): manual title regen honors aux timeout (#5374) 2026-07-01 22:58:01 +00:00
nesquena-hermes
cd576cdb25 docs(changelog): MoA picker + Copilot catalog fixes (#5301) 2026-07-01 22:42:36 +00:00
nesquena-hermes
c191141615 fix #5368 2026-07-01 21:35:11 +00:00
nesquena-hermes
bc954131de docs(changelog): restore #4765/#5313/#5335 entries dropped in merge conflicts (shipped v0.51.801/803/804) 2026-07-01 19:51:36 +00:00
nesquena-hermes
ab38ffe25f Fix profile skills-stats thundering herd at cold startup (#5364)
The two-tier mtime cache from #4783 fixed the per-request SKILL.md rescan
but left two concurrency holes that only bite at container cold start,
when the frontend fires several profile-data requests at once and the
caches are empty:

1. `_get_profile_skills_stats()` had no lock, so concurrent misses on the
   same profile each ran `os.walk(followlinks=True)` + parsed every
   SKILL.md simultaneously.
2. `_build_profile_rows_fast()` ran outside `_LIST_PROFILES_CACHE_LOCK`
   in `list_profiles_api()`, so every concurrent request rebuilt all rows
   (each walking every profile's skill tree) at once.

With ThreadingHTTPServer (one OS thread per request) and Docker overlay2,
this stacked thousands of concurrent stat() calls and stalled workers
57-70s (per the report's thread dumps).

Fix:
- Add a per-profile compute lock (registry guarded by a meta-lock) and
  use double-checked locking in `_get_profile_skills_stats()`: concurrent
  misses on one profile collapse to a single compute, while independent
  profiles still compute in parallel.
- Single-flight the row build in `list_profiles_api()` by holding
  `_LIST_PROFILES_CACHE_LOCK` across the build + cache write. Lock order
  is strictly list-lock -> per-profile skills-lock, so no deadlock.

The report's third suggestion (debounce the mtime probe) is deliberately
NOT taken: the every-call cheap probe is the #4783 out-of-band
change-detection contract (test_issue4783 asserts it MUST run on every
call). Serializing the misses removes the herd without weakening that
contract, since only the expensive compute is guarded, not the probe.

Adds tests/test_issue5364_skills_stats_thundering_herd.py proving the
herd collapses (single compute / single build under a concurrent burst),
independent profiles still parallelize, and the every-call probe contract
is preserved. All existing #4783 contract tests still pass.

Co-authored-by: claw-io <claw-io@users.noreply.github.com>
2026-07-01 19:42:11 +00:00
nesquena-hermes
91521ea186 docs(changelog): align reconciliation dedup key with workspace-prefix stripping (#5339) 2026-07-01 19:08:50 +00:00
nesquena-hermes
92a46aacc4 docs(changelog): crash visibility hardening (#4633) 2026-07-01 18:41:35 +00:00
nesquena-hermes
f967d432fe docs(changelog): drop verification-stop synthetic nudge from transcript (#5334) 2026-07-01 18:36:58 +00:00
nesquena-hermes
8bf2cc2461 docs(changelog): subagent sessions no longer vanish from sidebar (#5308) 2026-07-01 18:13:47 +00:00
nesquena-hermes
c1552d70c1 docs(changelog): suppress mobile overflow-anchor double-compensation scroll jump (#5338) 2026-07-01 17:46:03 +00:00
nesquena-hermes
504d9c1f4a docs(changelog): stop live-streaming message flicker on light themes (#5328) 2026-07-01 17:34:57 +00:00
nesquena-hermes
e88564cf4f docs(changelog): fix false clarify-unavailable toast + interrupt provenance (#5345) 2026-07-01 17:17:52 +00:00
Anthony Ruiz
20260e2c29 fix(webui): keep handled clarify 404s out of warn logs 2026-07-01 17:17:11 +00:00
nesquena-hermes
6716f03f4d fix(webui): stop false clarify-unavailable toast; add interrupt provenance (#5345)
/api/clarify/pending always returns HTTP 200 when present (returns
{"pending": null} for an unknown session — it never 404s). The front-end
clarify poller warned "Clarify endpoint unavailable. Please restart
server." on ANY caught error whose message merely contained "404" or
"not found", so an unrelated stale-session 404 ("Session not found", e.g.
an old-profile session polling briefly after a profile switch) or a
transient error produced a misleading missing-endpoint toast that pointed
operators at the wrong layer.

Clarify polling now branches on the structured HTTP status that api()
attaches to the thrown Error (err.status):
- 404 "Session not found" -> handled as a stale-session poll (stop + hide
  card silently), no toast;
- restart-server warning fires only on a genuine route-not-found 404 whose
  body is NOT session-scoped;
- poll failures are logged with path, status, polling session id, and
  current session id for diagnosis.

Interrupt provenance: cancelStream()/cancelSessionStream() now log a
'[stream] cancel requested' line with the trigger reason
(composer-stop / slash-stop / slash-interrupt / busy-interrupt /
sidebar-stop). Passive UI lifecycle events (session switch, tab hide, page
unload) already tear down only the local SSE transport via
closeLiveStream() and never call /api/chat/cancel — only explicit
Stop/interrupt paths interrupt the backend agent/tool run. This is
confirmed by test_clarify_pending_never_404s locking the handler shape.

Supersedes #5343 (which handled only the profile-switch sub-case and kept
the broad message-scrape). Adds tests/test_issue5345_*.py (9 tests).

Co-authored-by: claw-io <claw-io@users.noreply.github.com>
Co-authored-by: ruizanthony <ruizanthony@users.noreply.github.com>
2026-07-01 17:17:11 +00:00
nesquena-hermes
7d58c1e8e1 docs(changelog): prune index-only ghost sessions (#5331) 2026-07-01 17:12:20 +00:00
nesquena-hermes
cda6483153 docs(changelog): view-only delegated subagent session transcript recovery (#5307) 2026-07-01 09:13:34 +00:00
nesquena-hermes
66851eac56
docs(changelog): redistribute [Unreleased] backlog into per-version blocks (v0.51.693–792) (#5329)
The [Unreleased] section had accumulated 116 shipped feature/fix bullets spanning
100 releases (v0.51.693 → v0.51.792) — the release process bumped the version + tag
but never MOVED each PR's bullet out of [Unreleased] into a dated version block (it
stopped creating per-version blocks after v0.51.692). Marquee features (/moa, the
appearance skins, custom TTS engine, theme/skin registration, OIDC login, …) all sat
orphaned in [Unreleased], which is why the Discord announcement cron kept re-listing
the same items every run.

This moves every bullet into a dated version block reconstructed from its shipping
git tag (PR-number → first-containing-tag → tag commit date), grouped under the
original Added/Changed/Fixed subsections, and empties [Unreleased] to a
self-documenting placeholder. No bullet lost (116/116 redistributed, verified), no
new duplicate headers introduced.

Docs-only, no code change. Pairs with a release-process fix so this can't recur.

Co-authored-by: nesquena-hermes <nesquena-hermes@users.noreply.github.com>
2026-07-01 00:58:21 -07:00
nesquena-hermes
97b5979fd8 docs(changelog): keep active-parent delegate children stably visible (#5306/#5305) 2026-07-01 07:05:37 +00:00
nesquena-hermes
38ca286acc docs(changelog): honor busy input mode on first send (#5170) 2026-07-01 06:54:46 +00:00
nesquena-hermes
f942b712ad docs(changelog): gate reasoning_content replay for provider-facing history (#5024) 2026-07-01 06:50:23 +00:00
nesquena-hermes
6095f639ba docs(changelog): native OIDC login for WebUI (#5012) 2026-07-01 06:45:55 +00:00
nesquena-hermes
578e70c2bc docs(changelog): gate embedded-terminal endpoints to local origins (#5268) 2026-07-01 06:41:41 +00:00
nesquena-hermes
0533871ef5 docs(changelog): docker rsync .playwright exclude (#5316) 2026-07-01 06:35:55 +00:00
nesquena-hermes
948e8bfc67 docs(changelog): composer footer control reordering (#5075) 2026-07-01 06:23:51 +00:00
nesquena-hermes
7298d91dec docs(changelog): prune orphan zero-message sidebar sessions (#4988) 2026-07-01 00:20:13 +00:00
nesquena-hermes
1dfdf6a2c1 docs(changelog): extension skin base scheme (#5271) 2026-07-01 00:09:37 +00:00
nesquena-hermes
39a3a6e703 docs(changelog): expand zhCN localization (#5279) 2026-07-01 00:04:24 +00:00
nesquena-hermes
c80311a5db docs(changelog): SSE-recovery follow-intent sticky guard (#5217) 2026-06-30 23:35:00 +00:00
nesquena-hermes
740a3a693e docs(changelog): deep-link ?q= composer prefill, converged (#4969) 2026-06-30 23:08:16 +00:00
nesquena-hermes
a616163523 docs(changelog): default-Kanban dispatch fix (#5289) + PWA new-chat hydration defer (#5287) 2026-06-30 22:45:35 +00:00
nesquena-hermes
ec5f9715a1 docs(changelog): two opt-in neon skins (#4738) 2026-06-30 22:22:14 +00:00
nesquena-hermes
a20d42893d docs(changelog): opt-in Shift+Enter send-key mode (#5005) 2026-06-30 21:52:20 +00:00
nesquena-hermes
512824dcc3 docs(changelog): configurable provider budget + %-used (#5120) 2026-06-30 21:34:35 +00:00
nesquena-hermes
34f4a72256 docs(changelog): opt-in per-project new-conversation shortcuts (#5002) 2026-06-30 20:56:49 +00:00
nesquena-hermes
a103775e42 docs(changelog): OpenAI-compatible TTS backend, SSRF-hardened (#5079) 2026-06-30 20:39:51 +00:00
nesquena-hermes
93d31ebad5 docs(changelog): Kanban modal skills/max_runtime/parents (#4881) 2026-06-30 19:51:22 +00:00
nesquena-hermes
c4b4d874ac docs(changelog): Mermaid toolbar controls in chat (#4871) 2026-06-30 19:27:47 +00:00
nesquena-hermes
66714f04e8 docs(changelog): mobile titlebar prioritize session title (#4574) 2026-06-30 19:11:32 +00:00
nesquena-hermes
ea92608e69 docs(changelog): mobile touch targets + approval layout (#5019) 2026-06-30 18:55:07 +00:00
nesquena-hermes
049b98ad01 docs(changelog): priority-queue batch pq1 (#5168 #5211) 2026-06-30 18:06:34 +00:00
nesquena-hermes
f07b1315ca docs(changelog): wave-5 (#5161) 2026-06-30 17:25:36 +00:00
nesquena-hermes
ab5a757ffe docs(changelog): wave-4 batch (#5248 #5207) 2026-06-30 17:14:12 +00:00
nesquena-hermes
67a789d9af docs(changelog): wave-3 batch (#5260 #4957) 2026-06-30 17:06:31 +00:00
nesquena-hermes
5370623743 docs(changelog): wave-2 batch (#5266 #5264 #5253 #5244) 2026-06-30 16:36:43 +00:00
nesquena-hermes
3a2f5cdedb docs(changelog): wave-1 batch (#5276 #5274 #5272 #5256 #5254 #5257) 2026-06-30 16:21:26 +00:00
nesquena-hermes
73ac59ebed docs(changelog): continue /goal after gateway turns (#5251, #5092) 2026-06-30 05:12:20 +00:00