Commit Graph

71181 Commits

Author SHA1 Message Date
Aaron Eden 2cd4e5a8be fix: prevent empty Telegram sends for cron summaries (#104111)
* fix: prevent empty cron Telegram summary sends

* fix: move Telegram cron fallback normalization to adapter

* test: pin plugin SDK surface budget for cron fallback

* test: refresh plugin SDK API baseline

* fix(telegram): preserve cron fallback batch semantics

---------

Co-authored-by: Ayaan Zaidi <hi@obviy.us>
2026-07-22 03:27:06 +05:30
Gio Della-Libera 138d2a5627 Add grouped Claw schema and read-only add plan (#101328)
* Add grouped Claw schema and read-only add plan

* test(claws): cover grouped schema and preview

* docs(claws): document experimental preview

* fix(claws): harden preview consent

* fix(claws): satisfy tool filter lint

* fix(claws): bind plans to validated sources
2026-07-21 14:50:36 -07:00
Peter Steinberger b36342ee6f feat(android): chat rewind/fork actions and branch switcher with branch-safe outbox (#112284) 2026-07-21 14:31:47 -07:00
Peter Steinberger 4541c27f30 fix(browser): regenerate stale copilot runtime bundle (#112379) 2026-07-21 14:28:56 -07:00
Jason (Json) c4911a2c77 improve(ui): simplify coding agent session headers (#112354)
* improve: simplify coding session catalog headers

* improve: simplify coding session catalog headers
2026-07-21 15:27:49 -06:00
pash-openai b0341b8693 Allow Codex plugin discovery enough startup time (#112418) 2026-07-21 14:22:23 -07:00
Peter Steinberger d04519e158 refactor(agents): split transcript image redaction helpers (#112337) 2026-07-21 14:18:26 -07:00
Jason (Json) 35e058711d fix(macos): reuse gateway with path advisory (#112381) 2026-07-21 15:17:47 -06:00
Peter Steinberger bd03b4d658 fix(i18n): regenerate native locale artifacts after Android inventory drift 2026-07-21 14:15:31 -07:00
Vincent Koc 5b2a084048 fix(i18n): refresh iOS location menu inventory 2026-07-22 05:11:45 +08:00
Vincent Koc 6c9446c5c1 fix(deps): refresh fast-uri plugin shrinkwraps 2026-07-22 05:11:45 +08:00
Vincent Koc 1be9db038f fix(deps): update fast-uri past advisory 2026-07-22 05:11:45 +08:00
Vincent Koc b7e17855b9 fix(diagnostics-otel): update OpenTelemetry runtime 2026-07-22 05:11:45 +08:00
Mark 7a0ae5070a fix(goals): route completion wakes to live session (#104265)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 13:58:16 -07:00
Masato Hoshino 59640bad26 improve(agents): skip whole-history deep clone on every turn when no context hook is registered (#99542)
* perf(agents): skip per-turn context deep clone when no context handler is registered

* perf(agents): avoid duplicate context handler scan

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 12:42:20 -07:00
lzyyzznl e1ec51b1a4 fix(qqbot): preserve group announce routes (#98053)
Persist qualified QQBot group and guild routes so session announcements return to the originating conversation without letting direct-message turns overwrite the shared route.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: lzyyzznl <lzyyzznl@users.noreply.github.com>
2026-07-21 12:15:24 -07:00
Kate Stahnke 4400f4ca91 fix(cron): hint after disable about list filtering disabled jobs (#78139)
* fix(cron): hint after disable about list filtering disabled jobs by default

* fix(cron): use !params.enabled in disable-hint guard for oxlint compliance

* docs(cron): clarify disabled jobs in list output

* fix(cron): keep disable hint interactive

* test(cron): use exported store snapshot helper

* test(cron): create disable-list regression job via service

* docs(cron): defer list default contract wording

* test(cron): tighten disable list coverage

Co-authored-by: Kate Stahnke <35552+kate@users.noreply.github.com>

* docs(cron): document enabled-only list default

Co-authored-by: Kate Stahnke <35552+kate@users.noreply.github.com>

---------

Co-authored-by: Kate <35552+kate@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 12:04:15 -07:00
joshavant a69ebf3067 fix(ios): keep snapshot results outside upload tree 2026-07-21 13:44:11 -05:00
joshavant b3cdb49aca test(ios): stabilize appearance screenshot 2026-07-21 13:44:11 -05:00
joshavant 12515ad182 fix(ios): harden App Store release flow 2026-07-21 13:44:11 -05:00
TUARAN 3c32f327a4 fix(anthropic): normalize unsupported inline images (#102537)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 11:31:24 -07:00
Santiago c4f1661f70 docs(skills): allow model-usage with Linux codexbar (#87986)
* docs(skills): support CodexBar CLI on Linux

Enable the existing model-usage skill on Linux when the supported CodexBar CLI is present, and document the official Homebrew, AUR, and release-tarball install paths.

Co-authored-by: Santiago <shbernal.01@gmail.com>

* docs(skills): link CodexBar Linux packages

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 11:04:46 -07:00
Peter Steinberger 8f31892b55 feat(apps): native session branch switcher with branch-safe durable outbox (#112056)
Branch menu (list/switch) for macOS+iOS shared chat via sessions.branches.*;
rewind/fork/switch gated on run activity and pending outbox work through a
durable session-mutation lease; outbox rows carry branch-epoch ownership with
local-only flush checks, atomic confirm/park transitions, attempt-versioned
delivery callbacks, fresh retry identity for possibly-accepted rows, and
epoch-guarded branch evidence; 21-locale native translations for new strings.
2026-07-21 10:59:44 -07:00
cxbAsDev f0793b7e60 fix(cli): clarify oversized config mutation file errors (#110593)
* fix(cli): bound batch file read with size cap and user-friendly error message

* chore: retrigger CI after flaky ACP test failure

* fix(cli): clarify config mutation file limits

Co-authored-by: 陈宪彪0668000387 <chen.xianbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 10:53:37 -07:00
mushuiyu886 e3a1c64d7b fix(kilocode): exclude image models from chat catalog (#111239)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 10:52:42 -07:00
Yiğit ERDOĞAN 1096b74ab7 fix(browser): retire durable tab rows whose browser never returns (#111307)
* fix(browser): retire durable tab rows whose browser never returns

Durable cleanup defers whenever ownership cannot be proven, so a browser
that never comes back at the same cdpUrl leaves its rows behind forever:
each sweep re-claims them, fails the identity lookup, warns, and defers
again. Nothing in the subsystem removes a row by age.

The `browser.session-tabs` namespace is opened with a 5000-row cap and
`reject-new`, so once those rows accumulate to the cap, tracking a new tab
throws PLUGIN_STATE_LIMIT_EXCEEDED. That propagates into the compensation
path in browser-tool-session-tabs.ts, which closes the tab the user just
opened and rethrows -- every `browser open` on that profile then opens a
tab, closes it again, and errors, with no self-healing path.

Bound the retry: when a close attempt reports the target unavailable and
the tab has been unused for longer than the retire window, drop the row
instead of deferring again. A browser returning after that long almost
always carries a fresh instance fingerprint, which retires the row through
the ownership-mismatch path anyway.

closeTrackedBrowserTabsForSessions now accepts `now` like the sweep does,
so lifecycle cleanup can be exercised on a coherent clock.

* refactor(browser): split session tab cleanup claim and test harness

check-lint failed on max-lines: session-tab-registry.ts was at 699 of its
700-line budget and the durable registry test at 982 of 1000, so the retire
branch and its regression test pushed both over.

Extract the cleanup claim bookkeeping (claim, ownership match, delete) into
session-tab-cleanup-claim.ts, and the durable registry test shapes into
session-tab-registry.sqlite.test-helpers.ts, matching the existing
*.test-helpers.ts convention in this directory. No behavior change.

* test(browser): protect unreachable retirement races

Co-authored-by: Yigtwxx <yigiterdogan023@gmail.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 10:10:28 -07:00
Harjoth Khara 13348cad1a fix(doctor): migrate MCP flags in included config (#103970)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 10:06:19 -07:00
qingminlong f79d7a3636 fix(system-agent): reject non-decimal wizard option numbers (#108140)
* fix(system-agent): reject non-decimal wizard option numbers

* style(system-agent): format wizard choice regression

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 10:04:58 -07:00
Max Reith 40c2d27924 fix(config): allow historyLimit: 0 in GroupChatSchema (#65359)
GroupChatSchema used .positive() which rejects 0, while all other
historyLimit schemas use .min(0). This caused a silent config reload
failure when setting messages.groupChat.historyLimit to 0.

Change .positive() to .min(0) and add test coverage.

Fixes https://github.com/openclaw/openclaw/issues/65305
2026-07-21 09:54:31 -07:00
chenyangjun-xy fd2e326275 fix(clawhub): use fatal UTF-8 decoding for all ClawHub HTTP responses (#111164)
* fix(clawhub): use fatal UTF-8 decoding for all ClawHub HTTP responses

Replace forgiving TextDecoder() with TextDecoder(utf-8, { fatal: true })
in three functions that decode ClawHub HTTP response bodies:
- parseClawHubJsonBody (JSON API responses)
- fetchClawHubSkillCard (skill card markdown)
- fetchClawHubPromotionsFeed (promotions feed, etag-cached)

Invalid UTF-8 bytes now throw TypeError immediately instead of silently
substituting U+FFFD, preventing corrupted payloads from being parsed,
cached, or rendered.

* fix(clawhub): extract decodeClawHubResponseBody helper with fatal UTF-8 decoding

Replace three inline TextDecoder() calls with a single exported
decodeClawHubResponseBody helper that uses fatal: true, so malformed
UTF-8 bytes throw TypeError instead of silently substituting U+FFFD.

Add focused test coverage for the helper: valid UTF-8, ASCII,
empty buffer, and invalid 0xFF byte at start, middle, and end positions.

* fix(clawhub): remove unused export of decodeClawHubResponseBody

Make decodeClawHubResponseBody internal since it is only used within
clawhub.ts. Remove the standalone test for this thin TextDecoder wrapper;
its behavior is covered by consumers (parseClawHubJsonBody, etc.).

* fix(clawhub): reject malformed UTF-8 responses

Co-authored-by: chenyangjun-xy <chenyangjun@xydigit.com>

* test(clawhub): verify failed refresh cache persistence

Co-authored-by: chenyangjun-xy <chenyangjun@xydigit.com>

* test(clawhub): use typed malformed response buffer

Co-authored-by: chenyangjun-xy <chenyangjun@xydigit.com>

---------

Co-authored-by: chenyangjun-xy <chenyangjun@xydigit.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:46:48 -07:00
pick-cat fc52627ac1 fix(qa-lab): reject hex/exponent Telegram SUT uid env values (#107626)
* fix(qa-lab): reject hex/exponent Telegram SUT uid env values

* test(qa-lab): add direct unit tests for parseSutId strict int parsing

Export parseSutId and add 15 direct unit tests covering hex/exponent/fraction/
empty/whitespace/zero/negative rejection and valid decimal acceptance across
UID, GID, and CLEANUP_TIMEOUT_MS keys. The 3 existing integration tests
already prove the full CLI chain rejects malformed UIDs before gateway startup.

Mutation check: reverting to permissive Number() parsing causes 6 tests to
fail (4 unit + 2 integration).

Co-Authored-By: nebulacoder-v8.0 <noreply@zte.com.cn>

* test(qa-lab): cover GID and cleanup-timeout CLI reject-before-gateway

* fix(qa-lab): drop stale live-scenario mocks from SUT uid tests

* style(qa-lab): oxfmt import order in telegram cli.runtime

* test(qa-lab): streamline strict SUT integer coverage

---------

Co-authored-by: nebulacoder-v8.0 <noreply@zte.com.cn>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:42:22 -07:00
mushuiyu886 53f13f0510 fix(chutes): discover models when HTTP proxy is required (#111266)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:38:36 -07:00
lee-xydt ffff420f49 fix(config): reject gateway.port values outside the 1–65535 TCP range (#109875)
* fix(config): reject gateway.port values outside the 1–65535 TCP range

Tighten the gateway.port schema to 1–65535 and add a Doctor
migration that removes out-of-range port values from existing
configs, so previously loadable configs with port 65536+ do not
fail startup after the schema change.

Fixes #109293

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(doctor): repair gateway port before origin seeding

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:26:41 -07:00
mikasa a8a6e2a828 fix(process): bound Windows exec timeout cleanup (#104234)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:26:04 -07:00
mushuiyu886 9c621b799a fix(vercel-ai-gateway): discover models when HTTP proxy is required (#111209)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:22:00 -07:00
lzyyzznl 8d6fbdcf78 fix: tighten toolSearch limit from Type.Number to Type.Integer (#105567)
* fix: tighten toolSearch limit from Type.Number to Type.Integer

toolSearch.limit uses Type.Number() but represents a result count which
is inherently an integer. Tighten to Type.Integer() to reject float values
at the schema level, preventing LLM intent mismatch.

Reference: qingminglong PR #102481 (same pattern)

* fix(agents): add minimum:1 constraint and regression tests for toolSearch limit

- Add minimum: 1 to limit schema (rejects zero/negative at schema layer)
- Add focused regression test: tool-search.limit-schema.test.ts
  (7 cases: valid int, min boundary, large int, float rejection,
   zero rejection, negative rejection, optional omission)

* fix(agents): update toolSearch limit test to validate production schema

- test now imports actual createToolSearchTools + TOOL_SEARCH_RAW_TOOL_NAME
- validates against the real tool_search parameters schema, not a standalone copy
- adds missing required query validation test case (8 total)

* fix(agents): remove unused variable in toolSearch limit-schema test

* fix(agents): add execution-boundary tests for toolSearch limit

Add runtime execution boundary coverage for the limit-schema tightening,
validating that readSearchArgs -> readLimit rejects float/zero/negative
values at the execution layer. This covers the provider-normalization
path where TypeBox schema constraints may be stripped.

* test(agents): streamline tool search limit coverage

* test(agents): avoid tool search fixture shadowing

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 09:13:46 -07:00
RickLin 328fa5b964 fix(gateway): actively relaunch launchd restarts (#104637)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:58:18 -07:00
Alix-007 cdf69d9b8f fix(tls): bound self-signed certificate generation (#109139)
* fix(tls): bound self-signed certificate generation

* fix(tls): stage generated certificate material

* docs(changelog): note gateway TLS generation hardening

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(tls): make generated pair publication recoverable

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* test(tls): narrow recovery directory fixture

* fix(tls): harden atomic certificate publication

* chore: drop PR changelog edit

Co-authored-by: Alix-007 <li.long15@xydigit.com>

* fix(tls): degrade atomic publication failures

Keep self-signed certificate generation bounded and staged, but fall back to exclusive best-effort writes when hard-link publication is unavailable. Emit a typed gateway TLS degradation warning and preserve startup availability on supported non-atomic filesystems.\n\nCo-authored-by: Alix-007 <li.long15@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:57:21 -07:00
TUARAN 3a5b2764f8 fix(tailscale): retry status json after serve startup (#91553)
* fix(tailscale): restrict status retries

* test(tailscale): cover retry eligibility

* refactor(tailscale): add status retry helper

* refactor(tailscale): split status retry helper

* fix(tailscale): scope status retry to serve startup

Co-authored-by: TUARAN <729922845@qq.com>

* fix(tailscale): recognize app service startup errors

Co-authored-by: TUARAN <729922845@qq.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:43:56 -07:00
mushuiyu886 f9ede1e39a fix(web-fetch): case-distinct URLs return the wrong cached page (#111281)
* fix(web-fetch): keep case-distinct URLs from sharing cached responses

* fix(web-fetch): canonicalize fetch cache URLs

Co-authored-by: 杨浩宇0668001029 <yang.haoyu@xydigit.com>

* test(gateway): stabilize startup responsiveness guard

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:41:55 -07:00
Peter Steinberger 26165bbe80 fix(ios): smooth sidebar drags and remove background seams (#112299)
* fix(ios): polish sidebar drawer interaction

* fix(ios): latch sidebar drag direction
2026-07-21 08:40:30 -07:00
RickLin 60c9b49dfd fix(transcript): keep pagination cursors out of secret masking on resume (#105039)
* fix(transcript): keep pagination cursors out of secret masking on resume

Persisted transcripts masked any `*_token` tool-call argument to `***`
via the generic secret-key heuristic, including pagination cursors like
`page_token`/`next_page_token`. On resume the model replays the mask as a
real cursor and the platform silently pages from the start, returning
wrong data with no error (#104992). Exempt only unambiguous page cursors
in the transcript redaction path (the `page` marker rules out credentials);
value-pattern redaction still runs so an embedded real secret is masked,
and logs keep redacting these keys. Genuine credential args stay masked.

Refs #104992

* fix(transcript): keep cursor redaction tests type-safe

* refactor(transcript): trim cursor redaction path

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:35:15 -07:00
mushuiyu886 46632e9e3f fix(acp): correlate exec approvals by tool call (#101037)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:26:43 -07:00
Yzx a65ad9a3fd fix(agents): keep native bridge tool caps local (#103751)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:23:25 -07:00
冯基魁 c1e17f5a99 fix(doctor): preserve install policy config (#103808)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:19:36 -07:00
Peter Steinberger 5e7cb225e4 fix(mobile): load pinned and base-path Control UI pages (#112175)
* fix(mobile): harden Control UI webviews

* refactor(mobile): keep native inventory stable

* docs(android): clarify shared pinned trust

* fix(ios): preserve encoded Control UI base paths
2026-07-21 08:19:07 -07:00
Wynne668 0dea07bfdb fix(qqbot): reject blank client secret env fallback (#109815)
* fix(qqbot): reject blank client secret env fallback

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

* test(qqbot): format fallback regression

* fix(qqbot): normalize logout env token

* style(qqbot): format env fallback changes

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:17:40 -07:00
ZOOWH b16c6c75ce fix(github-copilot): redact embedding API errors (#109177)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:16:02 -07:00
mushuiyu886 a97d97f95b fix(opencode-go): expose DeepSeek V4 max thinking (#99643)
Preserve existing lower-level high effort while making xhigh/max available before runtime activation.

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-21 08:12:46 -07:00
moguangyu5-design b1deaf8dd9 fix(config): inherit provider token defaults (#105807)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: moguangyu5-design <moguangyu5-design@users.noreply.github.com>
2026-07-21 08:09:16 -07:00