70933 Commits
Author SHA1 Message Date
0e0432e76e fix(gateway): keep xdg-open stderr truncation surrogate-safe (#111323)
* fix(gateway): keep xdg-open stderr truncation surrogate-safe

* test(gateway): pin xdg-open diagnostic cap

Assert the exact diagnostic content and UTF-16 code-unit length at the surrogate-safe boundary.\n\nCo-authored-by: zenglingbiao <zeng.lingbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 09:58:44 -07:00
996312da9f fix(media): input_image base64 without media_type is forced to image/png even when bytes sniff as another valid image type (#111276)
* fix(media): prefer sniffed image MIME over hardcoded default when input_image media_type is absent

* test(media): cover sniffed MIME precedence

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 09:55:56 -07:00
Peter SteinbergerandGitHub a876451d8b fix(qa): avoid touching operator state during private QA runs (#111446)
* fix(qa): isolate commands from operator state

* fix(qa): isolate runner discovery from operator state

* fix(qa): keep discovery scope internal
2026-07-19 09:52:21 -07:00
Peter SteinbergerandGitHub 197c4f5a04 feat: generic session discussion seam with Control UI panel (#111337)
* feat: add session discussion panel seam

* fix: keep discussion iframe cookie-capable and changelog release-owned

* test: cover cookie-capable discussion iframe sandbox

* fix: stretch discussion panel host so the embed fills the rail

* fix: keep provider failures retryable and probe discussion availability before showing the action

* fix: block same-origin discussion embeds, show action on catalog sessions, close stale panel on reconnect

* fix: scope discussion probes and panel callbacks to the issuing connection

* fix: dedupe in-flight discussion probes per session

* fix: retry superseded discussion probes and key-scope panel results

* fix: regenerate Swift protocol models and extend advertised-method expectations

* style: format chat-pane-header

* fix: regenerate Kotlin protocol models and date discussion methods in the 2026.7 train

* chore: restore release-owned changelog to main state

* chore: keep changelog untouched relative to merge-base
2026-07-19 09:47:47 -07:00
Peter SteinbergerandGitHub 7aedca21b2 test(release): align built-in timing proofs (#111483) 2026-07-19 09:42:16 -07:00
a70f7702a9 fix(agents): keep web search error serialization surrogate-safe (#111327)
* fix(agents): keep web search error serialization surrogate-safe

* test(agents): pin web search truncation prefix

Preserve the pre-existing provider_error fallback while proving the exact UTF-16-safe retained prefix.\n\nCo-authored-by: zenglingbiao <zeng.lingbiao@xydigit.com>

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 09:39:04 -07:00
269099585a fix(discord): activity widgets recover from stalled gateway responses (#111380)
* fix(discord): bound Activity gateway requests

* test(discord): tighten Activity shell harness

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 09:32:29 -07:00
b15718f8d3 fix: warn before retrying timed-out exec commands (#111390)
* fix: warn before retrying timed-out exec commands

* fix(exec): cover detached approval timeout followups

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 09:31:40 -07:00
mushuiyu886andGitHub a626330a3b fix(deepinfra): model list fails when HTTP proxy is required (#111428) 2026-07-19 09:30:12 -07:00
6c9b31e4d5 fix(ai): honor Retry-After when retry-after-ms is unparseable (#111353)
* fix(ai): honor Retry-After when retry-after-ms is unparseable

The ChatGPT Responses retry path returned as soon as `retry-after-ms` was
present, so a malformed or empty value discarded a valid `Retry-After`
header sent alongside it and the client fell back to blind exponential
backoff. The sibling parser in `provider-transport-fetch.ts` treats the
two headers as ordered preferences and falls through on a parse failure;
this aligns the Responses path with that contract.

* test(ai): deduplicate retry header coverage

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 09:26:47 -07:00
VectorPeakGitHubchatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>Peter Steinberger
fe9e018045 fix(tavily): reject blank extract URLs (#111333)
* fix(tavily): reject blank extract URLs

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>

* fix(tavily): normalize tool string arrays

Co-authored-by: VectorPeak <73048950+VectorPeak@users.noreply.github.com>

---------

Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-19 09:18:33 -07:00
Peter SteinbergerandGitHub 359859d343 fix(gateway): keep first outbound TLS off the main event loop on macOS (system-CA/trustd) (#111473) 2026-07-19 09:01:09 -07:00
Peter SteinbergerandGitHub 87fbc19fe3 fix: complete lint toolchain reuse in worktrees (#111467)
* fix(scripts): complete worktree lint toolchain

* fix(scripts): prepare complete lint pipeline
2026-07-19 08:58:43 -07:00
Peter SteinbergerandGitHub f8e35afecc feat: avatar upload UI, self-service profiles, server-side avatar route (#111421)
* feat: avatar upload UI, self-service profiles, server-side avatar proxy

* refactor(ui): make resolveAvatar synchronous so avatar updates render immediately

resolveAvatar no longer does async work (gravatar moved server-side), so
the until()-deferred render left the identity chip img stale after
updateSelfUser. Rendering synchronously reuses the img element and
reflects avatarUrl changes on the next render.

* fix(gateway): bound avatar Gravatar lookup to one timeout budget

Linked-email Gravatar lookups ran sequentially, each with its own 5s
timeout, so an upstream outage stalled the held connection for
5s x linked-email-count. Resolve them concurrently and pick the first
hit in email order, keeping primary-email precedence while capping the
request to a single timeout budget.

* fix(gateway): cap per-profile Gravatar fan-out to bound sockets and memory

A profile with many linked emails would fan out one concurrent fetch per
email with no bound, each able to buffer up to MAX_GRAVATAR_BYTES before
the cache budget applies. Cap the lookups to the first 8 primary-ordered
emails so a single avatar request holds a bounded number of sockets and
transient bytes.

* test: reconcile avatar tests with server-side gravatar model after merge

main landed a client-side Gravatar path (browser computes the gravatar.com
URL); this branch resolves avatars through the same-origin gateway route,
which is the only approach that works under the Control UI CSP (img-src
'self'). Update the identity-section, app-sidebar footer chip, and
profile-page e2e expectations to assert the canonical /api/users/<id>/avatar
route (gateway serves the Gravatar fallback behind it) instead of a
CSP-blocked direct gravatar.com image.

* test(gateway): fix fetchImpl mock param type for check-test-types

The Gravatar mock typed its param as (url: string), narrower than the
fetchImpl signature (URL | RequestInfo); function-param contravariance
made it unassignable under tsgo:test. Widen to the fetch input type and
extract the URL via a small helper that avoids no-base-to-string on a
Request.

* fix(gateway): short-circuit Gravatar lookups and version presence avatar URL

Two autoreview findings on the avatar path:

- Privacy: the concurrent Promise.all fan-out queried every linked email's
  hash against Gravatar even when the primary already had one, exposing
  secondary work/personal addresses. Resolve sequentially with short-circuit
  so a later hash is disclosed only after the earlier email is a definite
  miss, under one shared request deadline that still bounds total latency.

- Staleness: presence published an unversioned /api/users/<id>/avatar, so a
  reconnecting viewer's <img> kept the stale cached image after an upload.
  Carry the profile revision as ?v=<updatedAt> so a changed avatar refetches.
2026-07-19 08:52:01 -07:00
Peter SteinbergerandGitHub 1ef99e6dfb feat(agents): authoritative write diffs end to end (#111456)
* feat(agents): authoritative write diffs end to end

The write tool now reports what actually happened: no-op (changed:false),
created files (created:true with a bounded numbered diff), and overwrites
(created:false with a real old-to-new diff when the old content is
readable text within byte, line, and edit-distance budgets — unknown
removals are never fabricated). The gateway history projection forwards
the changed/created flags, the web and iOS write rows prefer the
authoritative diff and suppress the +N -0 stat when creation is not
proven, and the iOS transcript cache persists one bounded apply_patch
envelope so patch diffs survive cold opens.

* chore(i18n): sync native inventory
2026-07-19 08:48:26 -07:00
Peter SteinbergerandGitHub 218c8a5496 test(signal): make status reaction timing deterministic (#111477) 2026-07-19 08:43:10 -07:00
Peter SteinbergerandGitHub ca3a1873a6 fix(test): make broad shard execution deterministic (#111416)
* fix(test): harden broad shard execution

* test: allow broad-profile contention

* style(telegram): remove redundant chat id cast

* style(test): preserve setup test spacing
2026-07-19 08:39:16 -07:00
Peter SteinbergerandGitHub 8c7f09a3c4 feat(system-agent): durable rolling transcript with openclaw.chat.history (#111440)
* feat(system-agent): durable rolling transcript with openclaw.chat.history

* chore(ui): scanner-safe auth root in custodian session ownership key

* fix(system-agent): durable reset boundary for transcript seeding

* fix(ui): ownership-aware custodian session rotation with capability gating

* fix(ui): bounded history load and reconnect-safe transcript refresh

* fix(ui): keep unknown-outcome warning and event nudges across transport transitions

* fix(ui): flag-backed unknown-outcome warning independent of retry state

* fix(ui): armed ownership boundaries and abandon-before-rotate ordering

* chore(ui): localize the server-side sensitive mask in durable history

* fix(ui): repair rebase-dropped import and mock arity

* chore: gate fixes — void history handler, module-local transcript internals

* refactor(gateway): leaf history-turn contract to keep the module graph acyclic

* chore(gateway): stamp openclaw.chat.history with its introduction train

* test(gateway): record openclaw.chat.history in the 2026.7 train pin
2026-07-19 08:37:00 -07:00
metaforismoandGitHub a53461b2b1 fix(ios): render Markdown lists and thematic breaks (#111223) 2026-07-19 11:24:30 -04:00
Peter SteinbergerandGitHub 223235044a fix(cli): exit cleanly on subcommand-group --help (lazy register handle leak) (#111433)
Lazy command-group registration must import the real command tree to render complete help. On macOS with NODE_USE_SYSTEM_CA=1, those imports start Node's system CA loader worker; natural shutdown can block in CleanupCachedRootCertificates while joining LoadSystemCACertificates.

Request the existing stream-flushed one-shot exit immediately after successful Commander help parsing, covering both CommanderError and normal-return plugin help without affecting leaf command execution.
2026-07-19 08:10:56 -07:00
Peter SteinbergerandGitHub 356bec6f5d fix(usage): price usage rows with the owning agent's model registry (#111389)
* fix: scope usage pricing by agent

* fix(usage): satisfy pricing check gates
2026-07-19 07:57:50 -07:00
Peter SteinbergerandGitHub 1f507162ee fix(ci): validate sticky importer restores (#111444) 2026-07-19 07:57:46 -07:00
Peter SteinbergerandGitHub 31423de908 fix(channels): preserve ingress shutdown and named-account setup (#111449)
* fix(channels): repair plugin prerelease regressions

* chore: leave release notes to release automation

* fix(channels): update plugin SDK API baseline
2026-07-19 07:57:37 -07:00
Dallin RomneyandGitHub 6dc6d5efee fix(qa): wait for active config revision after restart (#111073) 2026-07-19 07:46:32 -07:00
Peter SteinbergerandGitHub adf02e8de4 refactor(plugin-sdk): retire global provider publication (#111426)
* refactor(plugin-sdk): retire global provider publication

* docs: refresh SDK migration map
2026-07-19 07:44:11 -07:00
Peter SteinbergerandGitHub 783a5d21cf refactor(config): purge numeric tuning knobs behind built-in defaults (#111382) 2026-07-19 07:35:45 -07:00
Peter SteinbergerandGitHub ec01949d86 feat(ui): gravatar fallback in shared avatar primitive (#111418)
* feat(ui): gravatar fallback in shared avatar primitive

* fix(ui): expire gravatar negative cache instead of page-lifetime poisoning

* docs(ui): name gravatar retry tradeoff at the negative cache

* fix(ui): scope avatar failures to current viewer
2026-07-19 07:12:11 -07:00
Peter SteinbergerandGitHub e71ddb5c70 fix(onboard): reject unknown auth choices (#111409) 2026-07-19 07:09:37 -07:00
Peter SteinbergerandGitHub d96a5e2c9e fix(system-agent): rebind verified model routes (#111431) 2026-07-19 07:07:44 -07:00
xingzhouandGitHub b4a206fc41 fix(gmail): prevent duplicate watch renewals during stalls (#108974) 2026-07-19 22:05:04 +08:00
Peter SteinbergerandGitHub 3a85143d97 fix(qa): align ask-user protocol shape (#111429) 2026-07-19 07:03:47 -07:00
Peter SteinbergerandGitHub da534dc506 fix(ios): harden Talk voice-session lifecycle from review (#111424)
- Close+clear the adopted logical voice session when a config/provider change
  invalidates a realtime prefetch (a live call is preserved); prevents the
  gateway rejecting a stale voiceSessionId resume under a new provider.
- Retry talk.client.close (0/500/2000ms) before forgetting the session, matching
  the web client, so a transient close does not orphan it until the 6h sweep.
- Surface exhausted transcript-persist failures through the session delegate so a
  dropped affirmation transcript no longer silently blocks spoken confirmation.
- Localize the "Confirmation needed" status through the presentation switches;
  add its native locale translations.
2026-07-19 07:01:28 -07:00
xingzhouandGitHub 7ea4e6701e fix(export): prevent broken emoji in HTML tool call previews (#104054) 2026-07-19 22:00:31 +08:00
Peter SteinbergerandGitHub c42ceb8770 test(gateway): await complete trajectory export instructions (#111427) 2026-07-19 06:59:28 -07:00
Peter SteinbergerandGitHub 4d8462afdb test(sessions): isolate store pruning integration test (#111414) 2026-07-19 06:59:22 -07:00
Peter SteinbergerandGitHub 5ae1f7f0f5 fix(agents): reuse configless prepared runtime (#111423) 2026-07-19 06:56:19 -07:00
Peter Steinberger d9c9eeb8cd fix(ci): resolve manual protocol baseline 2026-07-19 14:53:32 +01:00
Peter SteinbergerandGitHub d9465c941e fix(gateway): constrain proxy device auto-approval roles (#111394) 2026-07-19 06:52:15 -07:00
Peter SteinbergerandGitHub d3f2c5ad81 fix(agents): handle deadline race in native hook relay (#111413) 2026-07-19 06:50:31 -07:00
Peter SteinbergerandGitHub ccea4ea440 fix(models): support nested policy wildcards (#111350) 2026-07-19 06:47:42 -07:00
Peter SteinbergerandGitHub 29ef6f8637 fix(scripts): resolve remaining repo tools through the worktree-aware helper (#111417)
Follow-up to #111393: run-tsgo, check-tsgo-core-boundary, profile-tsgo,
and the format-docs oxfmt shim still resolved node_modules/.bin from the
current checkout only, so dependency-less linked worktrees died with
ENOENT before oxlint's boundary prep could run. All four now use
resolveRepoToolBinPath, completing local lint/typecheck tooling for
linked worktrees.
2026-07-19 06:47:32 -07:00
Peter SteinbergerandGitHub d0f37bd843 fix(qa): preserve paginated bus events (#111410) 2026-07-19 06:34:35 -07:00
Peter SteinbergerandGitHub 4e008cd713 feat(ios): adopt Talk voice sessions (#111369)
* feat(ios): adopt Talk voice sessions

* docs(agents): fix unrelated red-main breakage in the landing PR

* chore(i18n): translate Talk voice-session strings across native locales
2026-07-19 06:28:18 -07:00
Peter SteinbergerandGitHub 0cc182844a fix(ui): refresh agent roster on config changes (#111395) 2026-07-19 06:23:46 -07:00
Peter SteinbergerandGitHub be831088e9 fix: local lint works in dependency-less worktrees (#111393)
* fix(scripts): resolve worktree oxlint toolchain

* fix(scripts): declare worktree tool resolver
2026-07-19 06:23:36 -07:00
Peter SteinbergerandGitHub a5323301e9 fix(swarm): live agents.run fan-outs launch collectors (#111379)
* fix(swarm): preserve host identity for collector launches

* test(swarm): type the in-process gateway dispatcher

* chore: drop changelog entry — release generation owns CHANGELOG

* test(swarm): satisfy promise executor lint
2026-07-19 06:08:30 -07:00
Peter SteinbergerandGitHub 8d2e616483 fix(gateway): preserve explicit approval ids for validation (#111388) 2026-07-19 06:06:50 -07:00
Peter Steinberger 2a6fd77c08 fix(net-policy): restore ipaddr typing compatibility
Repair main CI by preserving newer ipaddr range labels across merged declarations and narrowing CIDR match operands by address family.
2026-07-19 05:51:18 -07:00
431482ca3e docs(agents): require reading ClawSweeper rank-up moves before landing PRs (#111385)
Co-authored-by: Molty <molty@openclaw.ai>
2026-07-19 05:37:44 -07:00
Peter SteinbergerandGitHub 6a8f16a69e chore(pr): reuse green hosted CI from patch-identical pre-rebase heads (#111335)
* chore(pr): reuse green hosted CI from patch-identical pre-rebase heads (24h window)

* fix(pr): type-safe fixtures and lint cleanup for hosted-CI reuse tests
2026-07-19 05:34:48 -07:00