Commit Graph

64484 Commits

Author SHA1 Message Date
Peter Steinberger
1256aa0a47 refactor(macos): lock and unify PortGuardian tunnel record persistence so concurrent app instances cannot lose orphan records (#100601)
* refactor(macos): single locked write path and per-instance ownership for PortGuardian tunnel records

* chore(i18n): sync native app string inventory for PortGuardian refactor

* chore(i18n): sync native app string inventory for PortGuardian refactor
2026-07-06 07:43:45 +01:00
haruai
ead92d7078 fix: stop reconnecting on protocol mismatch (#98414)
* fix: stop reconnecting on protocol mismatch

* fix(ui): stop protocol mismatch reconnects

* test(ui): assert protocol mismatch recovery copy

* test(ui): count gateway reconnect attempts

* test(gateway): keep detail-less reconnect case typed

* test(gateway): keep pairing retry fixture typed

---------

Co-authored-by: haruaiclone-droid <281899875+haruaiclone-droid@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 07:43:33 +01:00
Peter Steinberger
5d9cec16f3 fix(maint): reuse recent hosted gates after rebase (#100663)
* fix(maint): reuse recent hosted gates after rebase

* fix(maint): preserve whitespace in gate fingerprints
2026-07-06 07:43:03 +01:00
Peter Steinberger
6e71b0bf30 fix(ui): reopen web terminals without stale content (#100665) 2026-07-06 07:42:38 +01:00
Peter Steinberger
2830b3ef38 fix(browser): diagnose empty WSL2 Chrome replies (#100590)
* fix(browser): diagnose Windows CDP listener mismatch

Base the repair on #93481 while matching Chromium's IPv4-first, IPv6-fallback listener contract and keeping CDP exposure loopback-scoped.

Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>

* style(docs): format browser troubleshooting table

* docs: refresh browser troubleshooting map

* fix(browser): diagnose reset CDP replies

* docs: refresh browser troubleshooting map

---------

Co-authored-by: ZengWen-DT <ceng.wen@xydigit.com>
2026-07-06 07:42:02 +01:00
Peter Steinberger
5713f1bec1 fix(ios): chat snaps back to bottom when scrolling to top via status-bar tap (#100502)
* fix(ios): stop chat snapping back to bottom after system scroll-to-top

* chore(i18n): sync native inventory after chat scroll fix
2026-07-06 07:41:35 +01:00
mushuiyu886
806397f0d9 Treat already-compacted CLI compaction as no-op (#99136) 2026-07-06 06:34:05 +00:00
Vincent Koc
b16269a0c5 docs(changelog): remove direct main fix entry 2026-07-06 08:33:36 +02:00
Wynne668
6378d5efcc fix(feishu): strip internal tool-trace banners from outbound text (#98705)
Part of #90684

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-06 06:33:16 +00:00
wm0018
4029f1c07e fix(message): thread --limit through to CLI formatter and surface provider pagination hints (#99089) 2026-07-06 06:32:59 +00:00
solodmd
1ec42c9acc fix(voyage): close response body stream when batch output JSONL parsing throws (#98840)
The batch output file download path creates a readline interface over a
Readable.fromWeb() response body stream. If JSON.parse throws on a malformed
JSONL line, the for-await loop exits via exception but the readline interface
and underlying Readable stream were never explicitly closed or destroyed,
leaving the HTTP response body stream dangling.

Extract the stream reading into , a testable helper
that wraps the iteration in a try-finally so both reader.close() and
inputStream.destroy() are always called, matching the pattern established in
#98493 for the same class of leak.
2026-07-06 06:32:50 +00:00
Peter Steinberger
20e6983bed fix(gateway): avoid default provider auth startup prewarm (#100667)
* fix(gateway): avoid default provider auth startup prewarm

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>

* docs(changelog): credit provider auth startup fix

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 07:32:13 +01:00
Vincent Koc
6801d34d9c test(release): allow tool-only live turn without transcript 2026-07-05 23:30:43 -07:00
Vincent Koc
c8ddcd116c fix(cli): align root command descriptions (#100670)
Co-authored-by: AmirF194 <amirfathi@fastinfer.org>
2026-07-05 23:29:40 -07:00
Peter Steinberger
ef269f2689 improve(ui): declutter the Cron Jobs page into compact scannable rows (#100646) 2026-07-06 07:29:02 +01:00
NianJiu
e5a605424e fix android camera clip release logs (#99484)
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
2026-07-06 07:26:51 +01:00
SunnyShu
d6dad9d9d5 fix(agents): detect bundled and legacy providers in model-not-found hint (#100120)
* [AI] fix(agents): detect legacy openai-codex provider in model-not-found hint

In buildMissingProviderModelRegistrationHint, add an early-return check
for the legacy openai-codex alias (via normalizeProviderId). Instead
of suggesting a models.providers[] config entry that the config
validator rejects without baseUrl, the hint now points operators to
run openclaw doctor --fix for migration or check provider auth.

Fixes #100066

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

* fix(agents): cover legacy Codex provider config hint

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-07-06 06:21:49 +00:00
Peter Steinberger
133ca4b469 feat(skills): diagnose skill_workshop hidden by tool policy (#100654)
* feat(skills): diagnose skill_workshop hidden by tool policy (#87570)

Workshop can be enabled and auto-capturing while tools.profile hides the
skill_workshop tool; every inspection surface looked healthy. plugins
inspect and openclaw doctor now name the excluding policy layer (global/
agent/provider profile, allowlist, denylist) and the exact alsoAllow
grant to add, via a shared resolveSkillWorkshopToolPolicyAvailability
helper that /learn's guard now reuses instead of composing policy
itself. Diagnosis only; no policy behavior change.

* ci: retrigger
2026-07-06 07:21:08 +01:00
Ben.Li
eda99cb8df feat(android): reconnect gateway when validated network returns (#100347)
* feat(android): reconnect gateway when validated network returns

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(android): dedupe validated network reconnects

* fix(android): wake gateway reconnect backoff safely

* fix(android): close network monitor startup race

* chore(android): refresh native i18n inventory

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 07:20:39 +01:00
Sebastien Tardif
0d6a1dcb53 fix(install): trap SIGINT so Ctrl+C exits cleanly during upgrade doctor (#76386)
* style: restore exec approval e2e formatting

* fix(install): trap SIGINT so Ctrl+C exits cleanly during upgrade doctor

Three changes to fix the install script's Ctrl+C handling:

1. Add INT/TERM signal traps that clean up temp files and exit with
   the correct signal exit codes (130 for SIGINT, 143 for SIGTERM).

2. Preserve signal exit codes (>128) through run_quiet_step so the
   doctor path can distinguish user cancellation from normal errors.
   Non-signal failures still return 1, preserving existing caller
   semantics for all other installer steps.

3. Fix guardCancel in onboard-helpers.ts: exit(0) changed to exit(1)
   so Clack prompt cancellation (Escape/Ctrl+C) is treated as failure,
   not success. This prevents the installer from continuing with plugin
   updates after the user explicitly cancelled.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* fix(install): abort dashboard launch on doctor cancellation

When a user cancels the interactive upgrade-doctor prompt (Clack
cancellation exits 1, SIGINT exits 130), clear should_open_dashboard
so the installer does not launch a dead dashboard after an incomplete
upgrade.

Also propagate non-zero exit from run_doctor() so the non-interactive
upgrade path correctly skips dashboard launch on failure.

* fix: guard every run_doctor caller and add focused tests

The existing-config path called run_doctor without checking its return
value, so a failed or cancelled doctor would still launch the dashboard.
Now both run_doctor call sites guard the return value with if-then.

Adds focused tests verifying: every run_doctor caller is guarded,
dashboard flag is cleared on doctor failure, signal exit codes
propagate through run_quiet_step, and SIGINT (exit 130) triggers
abort_install_int.

* retrigger proof check

* fix: exit 130 on Clack cancellation so installer treats it as SIGINT

guardCancel now exits with 130 (SIGINT convention) instead of 1. When
the user presses Ctrl+C at an interactive doctor prompt, the installer
sees doctor_exit=130 and calls abort_install_int, aborting cleanly
instead of continuing after exit 1.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* fix: narrow exit 130 to doctor-prompter path only

Revert guardCancel to exit 0 by default (matching main) and pass
exit code 130 only from doctor-prompter where the installer needs
to distinguish user cancellation from normal failures.

This preserves the existing cancellation behavior for configure,
wizard, gateway, and daemon prompts while keeping the SIGINT
convention for the installer's doctor subprocess.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

---------

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:19:44 +00:00
Peter Steinberger
98ca8c945e fix(ui): stop repeating tool names in expanded activity (#100606)
* fix(ui): stop repeating tool names in expanded activity

* fix(ui): stop repeating tool names in expanded activity
2026-07-06 07:17:23 +01:00
Peter Steinberger
2559c92a25 perf(test): reuse unit-fast discovery analysis 2026-07-06 02:15:32 -04:00
github-actions[bot]
d83ee4c44f chore(i18n): refresh native locales 2026-07-06 06:12:22 +00:00
github-actions[bot]
241c761d00 chore(ui): refresh control ui locales 2026-07-06 06:01:14 +00:00
Vincent Koc
7b6b39e0f8 fix(ci): keep full Anthropic Docker proof advisory 2026-07-05 23:01:01 -07:00
Peter Steinberger
f9bf5f5897 fix(android): keep stale PTT from restarting capture (#100552)
* fix(android): serialize background PTT lifecycle

Follow-up hardening for #99840 after the initial fix landed in #100483.

Co-authored-by: xialonglee <li.xialong@xydigit.com>

* docs(changelog): note Android PTT lifecycle hardening

* fix(android): order PTT ownership transitions

* test(android): opt in to coroutine scheduler API

* fix(android): serialize voice capture ownership

* test(android): drive PTT ordering with test dispatcher

* test(android): isolate PTT ordering preferences

* test(android): control PTT invoke dispatchers

* test(android): isolate PTT coroutine dispatchers

* test(android): use current Robolectric resolver API

* test(android): register speech service without deprecated APIs

* test(android): control stale PTT cleanup dispatch

* test(android): isolate voice mode reassertion

* fix(android): clean voice capture on permission loss

* fix(android): invalidate PTT before cancel wait

* test(android): preserve starts queued after cancel

* fix(android): keep one-shot PTT retries idempotent

---------

Co-authored-by: xialonglee <li.xialong@xydigit.com>
2026-07-06 06:51:46 +01:00
Peter Steinberger
62d957634c fix(agents): cap effective compaction reserve (#100621)
* fix(agents): cap effective compaction reserve

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>

* docs(changelog): link small-context compaction fix

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 06:49:44 +01:00
qingminlong
ae4a1e236f fix(pdf): reject fractional page selections (#99399)
* fix(pdf): reject fractional page selections

* chore: refresh pdf fractional page checks

* chore: refresh failed checkout checks

* test(pdf): prove fractional pages fail at tool boundary

* test(pdf): cover mixed fractional page ranges

* fix(pdf): validate page selections before loading

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:46:32 +01:00
heichl_xydigit
00f5df24e5 fix(webchat): keep context indicator visible with stale token data (#89772)
* fix(webchat): keep context indicator visible with stale token data

The context usage indicator was disappearing after sending a message because
totalTokensFresh was set to false during the run, even though we had valid
token count data from before the message was sent.

Changes:
- Modified getContextNoticeViewModel to show the indicator even when
  totalTokensFresh is false, as long as totalTokens is non-zero
- Added isStale flag to indicate when token data is not fresh
- Applied subtle visual styling for stale data (lighter colors, 5% opacity)
- Added "(updating)" suffix to the percentage text and title when stale
- Updated tests to verify the new behavior

Fixes #89662

* test(ui): cover stale context indicator behavior

* docs(changelog): note Control UI fix

---------

Co-authored-by: 黑承亮0668000844 <bladin@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:44:41 +01:00
Ben.Li
b3ba030707 fix(ui): show cron job model selection (#95341)
* fix(ui): show cron job model selection

* fix(ui): scope quick-create cron model selection

* test(ui): cover cron model quick create

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:43:40 +01:00
cxbAsDev
924f93eee0 fix(update-check): wrap malformed npm view JSON parse in try/catch (#100338)
* fix(update-check): wrap malformed npm view JSON parse in try/catch

* proof(update-check): use real fake-npm executable in proof script

* test(update-check): focus malformed JSON coverage

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:43:11 +01:00
pick-cat
ea99b96ddd fix(ui): preserve live tool stream order (#93184)
* fix(ui): preserve live tool stream order

* chore: trigger CI

* refactor(ui): preserve causal tool stream ordering

* docs(changelog): note Control UI fix

* test(ui): use current tool event contract

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:43:05 +01:00
WhatsSkiLL
b52c22f3da fix(android): tighten Voice tab box sizing (#100491)
Co-authored-by: IWhatsskill <284122573+IWhatsskill@users.noreply.github.com>
2026-07-06 06:42:31 +01:00
Wynne668
7e81f15961 fix: keep heredoc exec bodies out of command summaries (#99379) 2026-07-06 05:41:29 +00:00
Peter Steinberger
dd972b8bf7 fix: replies fail when memory flush is exhausted (#100618)
* fix(reply): recover from memory flush exhaustion

Co-authored-by: 忻役 <xinyi@mininglamp.com>

Co-authored-by: Jerry-Xin <jerryxin0@gmail.com>

* test(reply): remove unused memory flush result

---------

Co-authored-by: Jerry-Xin <jerryxin0@gmail.com>
2026-07-06 06:41:16 +01:00
krissding
e183d665ee fix(infra): add NaN guard for unparseable timestamp in session-cost-usage (#99420)
new Date(parsed.timestamp).getTime() can return NaN for unparseable
strings. Without a guard, NaN silently propagates into downstream
usage/cost calculations and corrupts billing data.

Add Number.isNaN(timestamp) check, falling back to 0 (same default
as the path when no timestamp key is present).

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-06 05:41:07 +00:00
ooiuuii
f7f1be276a Harden macOS SQLite WAL checkpoints (#99067) 2026-07-06 05:40:58 +00:00
Masato Hoshino
09b5cdc17f improve(doctor): warn when cron jobs keep failing consecutive runs (#99606)
* improve(doctor): warn when cron jobs keep failing consecutive runs

* improve(doctor): message restart-interrupted runs in the chronic cron failure advisory
2026-07-06 05:40:55 +00:00
pick-cat
7c9c2ef0c3 fix(infra): enforce maxBytes in body-less HTTP error snippet path (#99340)
* fix(infra): enforce maxBytes in body-less HTTP error snippet path

* chore: rebase to trigger CI after boundaries check fix

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

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-06 05:40:52 +00:00
xingzhou
a13acacd3c fix(discord): keep command previews emoji-safe (#99539) 2026-07-06 05:40:39 +00:00
cxbAsDev
5dbad1102f fix(sessions): log warning when parseJsonlEntries skips malformed JSONL lines (#98669)
* fix(sessions): log warning when parseJsonlEntries skips malformed lines

* fix(sessions): also warn in buildSessionInfo for malformed JSONL lines

* fix(sessions): warn in parseSessionEntries for malformed JSONL lines

* test(sessions): add warning regression tests for parseSessionEntries

* test(sessions): add parseJsonlEntries warning regression test

Add test verifying parseJsonlEntries logs warning for malformed JSONL
lines via loadEntriesFromFile, covering the second of three instrumented
session JSONL readers.

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

* test(sessions): update parseSessionEntries warning expectations after rebase

* style(sessions): remove unnecessary type assertion in test

* test(sessions): add buildSessionInfo warning regression tests via SessionManager.list

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-06 05:40:21 +00:00
cxbAsDev
437b177b7d fix(agents): suppress unhandled stdout/stderr stream errors in waitForChildProcess (#100522)
* fix(agents): suppress unhandled stdout/stderr stream errors in waitForChildProcess

* proof(agents): add real behavior proof script for child-process stream error catch

* test(agents): drop synthetic child-process proof wrapper

* proof(agents): replace wrapper with real child-process stream error proof

* style: apply oxfmt to changed files

* test(agents): drop synthetic child-process proof wrapper

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-05 22:35:15 -07:00
cxbAsDev
b6e4cd6bf4 fix(gmail-watcher): catch renewal interval errors (#100342)
* fix(gmail-watcher): catch renewal interval errors

* fix(gmail-ops): catch foreground renewal interval errors; add failing regression test

* proof(gmail-watcher): rewrite proof with real fake-gog subprocess for before/after

* fix(proof): make gmail-watcher foreground proof child exit reliably

* fix(proof): kill fake gog serve child and check spawnSync error in renewal proof

* test(gmail): narrow renewal rejection coverage

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-05 22:34:14 -07:00
Peter Steinberger
89f911f322 refactor(ui): consolidate sidebar navigation contract (#100612)
* fix(ui): restore sidebar navigation contract

* refactor(ui): remove duplicate sidebar navigation model
2026-07-06 06:30:57 +01:00
lin-hongkuan
aca316ee16 fix(anthropic): normalize tuple tool schemas for Opus 4.8 (#100492)
* fix(anthropic): normalize tuple tool schemas

* fix(anthropic): preserve schema instance values

* test(anthropic): cover Opus tuple schemas live

---------

Co-authored-by: lin-hongkuan <lin-hongkuan@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-05 22:28:37 -07:00
Vincent Koc
1f36539ab0 test(release): declare CLI live fixture agent 2026-07-05 22:27:46 -07:00
Marvinthebored
cbcd6a102c fix(clickclack): reply to a top-level message in-channel, not as a new thread (#100582)
* fix(clickclack): reply to a top-level message in-channel, not as a new thread

sendClickClackText routed any replyToId to createThreadReply, and the inbound
handler stamps replyToId = <triggering message id> on every reply. As a result
every reply to a top-level channel message opened its own thread, so the main
channel timeline showed nothing and the chat was effectively unusable.

Route a bare replyToId to the main channel as a quote-reply (quoted_message_id)
instead — matching the reply-to affordance of the Discord/Slack/Telegram
channels — and reserve threads for genuine thread context (an explicit threadId
or a thread-kind target). DM replies likewise quote-reply in the same
conversation. quoted_message_id is omitted when there is no reply context, so
plain sends are unchanged.

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

* test(clickclack): cover quote payload typing

---------

Co-authored-by: Marvinthebored <marvinthebored@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-05 22:27:27 -07:00
Voscko
d924ddc428 feat(android): show cron job details (#95107)
* feat(android): add cron job detail view

* fix(android): harden cron job detail loading

* chore(android): refresh native i18n inventory

* test(plugins): register workboard typed hook

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:25:37 +01:00
Peter Steinberger
06fbd84d2b test(plugins): register Workboard typed hook contract (#100611) 2026-07-05 22:13:45 -07:00
Peter Steinberger
b18af41f52 perf(gateway): skip redundant startup policy loads 2026-07-06 01:10:00 -04:00